import { detectProjectResolution, type ProjectResolution } from "../project-resolution.js"; import type { Prompter } from "../prompter.js"; import { type SetupState } from "../state.js"; import type { SetupBox } from "../step.js"; import { linkProject, resolveProjectByNameOrId, unresolvedProject } from "../vercel-project.js"; /** Injected for tests; defaults to the real Vercel project helpers. */ export interface LinkProjectDeps { linkProject: typeof linkProject; detectProjectResolution: typeof detectProjectResolution; resolveProjectByNameOrId: typeof resolveProjectByNameOrId; unresolvedProject: typeof unresolvedProject; } export interface LinkProjectOptions { /** Streams link progress and command output. The box never prompts through it. */ prompter: Prompter; deps?: LinkProjectDeps; } /** * THE PROJECT BOX. Executes the resolved Vercel project plan after scaffolding, * once the project directory exists (so `vercel link` can write `.vercel/`). * The gather prompts for nothing: every decision was made up front by the * resolve-provisioning box, so `perform` owns all the work. * * The plan is authoritative. The box always re-links to the planned project so * a stale or mismatched `.vercel` link can never silently win over the choice * made up front. `vercel link --project X --yes` is an idempotent rewrite, so * re-runs stay safe. The resolution read back from `.vercel/project.json` lands * in `state.project`, which every later box reads. * * Named `linkVercelProject` because the setup island also exports the * `linkProject` executor helper this box drives. */ export declare function linkVercelProject(options: LinkProjectOptions): SetupBox;