@pourkit/cli 0.0.0-next-20260529095319
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +7877 -0
- package/dist/cli.js.map +1 -0
- package/dist/e2e/run-live-e2e.js +5581 -0
- package/dist/e2e/run-live-e2e.js.map +1 -0
- package/dist/issues/close-issues-on-merge.js +842 -0
- package/dist/issues/close-issues-on-merge.js.map +1 -0
- package/dist/issues/unblock.js +685 -0
- package/dist/issues/unblock.js.map +1 -0
- package/package.json +33 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../common/logger/src/index.ts","../shared/common.ts","../cli.ts","../shared/config.ts","../shared/cleanup.ts","../shared/worktree-run-state.ts","../commands/issue-run.ts","../pr/templates.ts","../shared/run-context.ts","../shared/prompt-guidance.ts","../commands/base-refresh.ts","../commands/conflict-resolution.ts","../conflicts/conflict-resolution-artifact.ts","../commands/pr-description-agent.ts","../pr/pr-description.ts","../pr/pr-description-context.ts","../pr/pr-body.ts","../issues/target-green.ts","../issues/merge-coordinator.ts","../commands/review.ts","../pr/review-verdict.ts","../issues/issue-transitions.ts","../issues/stacked-issue.ts","../commands/issue.ts","../commands/queue.ts","../issues/select-issue.ts","../issues/blocked-issue.ts","../commands/queue-run.ts","../commands/pr-create.ts","../pr/pr-policy.ts","../pr/pr-workflow.ts","../commands/pr-merge.ts","../commands/init.ts","../providers/github-client.ts","../providers/github-provider.ts","../providers/github-pr-provider.ts","../execution/sandcastle-execution.ts","../execution/execution-provider.ts","../execution/sandbox-image-build.ts","../execution/sandbox-image.ts","../execution/sandcastle-existing-worktree.ts","../execution/sandbox-options.ts"],"sourcesContent":["import { createWriteStream } from \"node:fs\";\nimport { mkdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { styleText } from \"node:util\";\n\nexport interface PourkitLogger {\n line(msg: string): void;\n raw(msg: string): void;\n step(step: string, msg: string): void;\n status(status: string): void;\n kv(key: string, value: string): void;\n close(): Promise<void>;\n}\n\nexport function createLogger(name: string, filePath?: string): PourkitLogger {\n let fileStream: import(\"fs\").WriteStream | undefined;\n\n if (filePath) {\n mkdirSync(path.dirname(filePath), { recursive: true });\n fileStream = createWriteStream(filePath, { flags: \"a\" });\n }\n\n const write = (terminal: string, plain = terminal) => {\n process.stdout.write(`${terminal}\\n`);\n if (fileStream) {\n fileStream.write(`${plain}\\n`);\n }\n };\n\n return {\n line(msg: string) {\n const ts = timestamp();\n write(`${ts.terminal} ${msg}`, `${ts.plain} ${msg}`);\n },\n\n raw(msg: string) {\n write(msg);\n },\n\n step(step: string, msg: string) {\n const ts = timestamp();\n write(\n `${ts.terminal} ${formatStep(step)} ${formatStepMessage(step, msg)}`,\n `${ts.plain} [${step}] ${msg}`\n );\n },\n\n status(status: string) {\n const ts = timestamp();\n write(\n `${ts.terminal} ${color([\"bold\", \"cyan\"], \"POURKIT\")} ${color(\"cyan\", status)}`,\n `${ts.plain} POURKIT ${status}`\n );\n },\n\n kv(key: string, value: string) {\n const ts = timestamp();\n write(\n `${ts.terminal} ${color(\"dim\", key)}=${formatValue(key, value)}`,\n `${ts.plain} ${key}=${value}`\n );\n },\n\n async close() {\n await new Promise<void>((resolve) => {\n if (!fileStream) {\n resolve();\n return;\n }\n\n const timer = setTimeout(() => {\n if (!fileStream.destroyed) {\n fileStream.destroy();\n }\n resolve();\n }, 2000);\n\n fileStream.end(() => {\n clearTimeout(timer);\n resolve();\n });\n });\n },\n };\n}\n\nfunction timestamp() {\n const now = new Date();\n const time = now.toTimeString().slice(0, 8);\n const ms = String(now.getMilliseconds()).padStart(3, \"0\");\n const plain = `${time}.${ms}`;\n return { terminal: color(\"dim\", plain), plain };\n}\n\nfunction formatStep(step: string) {\n return color(stepStyle(step), `[${step}]`);\n}\n\nfunction formatStepMessage(step: string, msg: string) {\n if (step === \"error\") {\n return color(\"red\", msg);\n }\n if (step === \"warn\") {\n return color(\"yellow\", msg);\n }\n return msg;\n}\n\nfunction formatValue(key: string, value: string) {\n if (/SUCCESS|CREATED|COMMITS/.test(key)) {\n return color(\"green\", value);\n }\n if (/BRANCH|PATH|FILE|URL/.test(key)) {\n return color(\"cyan\", value);\n }\n return color(\"bold\", value);\n}\n\nfunction stepStyle(step: string): Parameters<typeof styleText>[0] {\n switch (step) {\n case \"sandcastle\":\n return [\"bold\", \"cyan\"];\n case \"git\":\n return [\"bold\", \"magenta\"];\n case \"review\":\n case \"reviewer\":\n return [\"bold\", \"blue\"];\n case \"cleanup\":\n return [\"bold\", \"yellow\"];\n case \"error\":\n return [\"bold\", \"red\"];\n case \"warn\":\n return [\"bold\", \"yellow\"];\n case \"info\":\n return \"cyan\";\n default:\n return \"green\";\n }\n}\n\nfunction color(format: Parameters<typeof styleText>[0], text: string) {\n if (process.env.NO_COLOR) {\n return text;\n }\n\n try {\n return styleText(format, text);\n } catch {\n return text;\n }\n}\n","import { mkdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { execFile, spawnSync } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { type PourkitLogger, createLogger } from \"@pourkit/logger\";\n\nconst execFileAsync = promisify(execFile);\n\ntype RunResult = {\n code: number;\n stdout: string;\n stderr: string;\n};\n\nexport type { PourkitLogger };\nexport { createLogger };\n\nexport async function ensureDir(dir: string) {\n await mkdir(dir, { recursive: true });\n}\n\nexport function repoRoot(explicitRoot = process.env.POURKIT_ROOT) {\n if (explicitRoot?.trim()) {\n const root = explicitRoot.trim();\n\n const insideResult = spawnSync(\n \"git\",\n [\"-C\", root, \"rev-parse\", \"--is-inside-work-tree\"],\n { encoding: \"utf8\" }\n );\n\n if (insideResult.status !== 0 || insideResult.stdout.trim() !== \"true\") {\n throw new Error(\n `POURKIT_ROOT is not a valid Git worktree: ${root}\\n${insideResult.stderr || insideResult.stdout}`\n );\n }\n\n const topLevelResult = spawnSync(\n \"git\",\n [\"-C\", root, \"rev-parse\", \"--show-toplevel\"],\n { encoding: \"utf8\" }\n );\n\n if (topLevelResult.status !== 0) {\n throw new Error(\n `Failed to validate POURKIT_ROOT as a Git worktree: ${root}\\n${topLevelResult.stderr || topLevelResult.stdout}`\n );\n }\n\n return topLevelResult.stdout.trim();\n }\n\n const result = spawnSync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n encoding: \"utf8\",\n });\n\n if (result.status !== 0) {\n throw new Error(\n `Failed to resolve repo root: ${result.stderr || result.stdout}`\n );\n }\n\n return result.stdout.trim();\n}\n\nexport function repoRelative(root: string, ...segments: string[]) {\n return path.join(root, ...segments);\n}\n\nexport function slugify(value: string) {\n const slug = value\n .toLowerCase()\n .replace(/[^a-z0-9]/g, \"-\")\n .replace(/--+/g, \"-\")\n .replace(/^-+/, \"\")\n .replace(/-+$/, \"\")\n .slice(0, 50);\n\n return slug || \"issue\";\n}\n\nfunction formatCommand(command: string, args: string[]) {\n return [command, ...args]\n .map((part) => {\n if (/^[A-Za-z0-9_\\/.=:,@+-]+$/.test(part)) {\n return part;\n }\n\n return `'${part.replace(/'/g, \"'\\\\''\")}'`;\n })\n .join(\" \");\n}\n\nexport function readMaybeEnvInt(value: string | undefined, fallback: number) {\n const parsed = Number(value ?? fallback);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nexport async function execCapture(\n command: string,\n args: string[],\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n logger?: PourkitLogger;\n label?: string;\n } = {}\n) {\n if (options.logger && options.label) {\n options.logger.step(\n options.label,\n `running ${formatCommand(command, args)}`\n );\n }\n\n let stdout = \"\";\n let stderr = \"\";\n let code = 0;\n\n try {\n const result = await execFileAsync(command, args, {\n cwd: options.cwd,\n env: options.env,\n encoding: \"utf8\",\n maxBuffer: 20 * 1024 * 1024,\n });\n\n stdout =\n typeof result.stdout === \"string\"\n ? result.stdout\n : String(result.stdout ?? \"\");\n stderr =\n typeof result.stderr === \"string\"\n ? result.stderr\n : String(result.stderr ?? \"\");\n } catch (error) {\n const err = error as NodeJS.ErrnoException & {\n stdout?: string;\n stderr?: string;\n code?: number | string;\n };\n stdout = typeof err.stdout === \"string\" ? err.stdout : \"\";\n stderr = typeof err.stderr === \"string\" ? err.stderr : \"\";\n code = typeof err.code === \"number\" ? err.code : 1;\n }\n\n if (code !== 0) {\n throw new Error(\n [\n `command failed: ${formatCommand(command, args)}`,\n `exit code: ${code}`,\n stdout ? `stdout:\\n${stdout}` : \"\",\n stderr ? `stderr:\\n${stderr}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\")\n );\n }\n\n return { code, stdout, stderr } satisfies RunResult;\n}\n\nexport async function execJson<T>(\n command: string,\n args: string[],\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n logger?: PourkitLogger;\n label?: string;\n } = {}\n) {\n const result = await execCapture(command, args, options);\n return JSON.parse(result.stdout) as T;\n}\n\nexport function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nconst TRANSIENT_GH_ERROR =\n /HTTP (502|503|504)\\b|Could not close the issue|GraphQL:.*closeIssue/;\n\nexport async function execCaptureWithRetry(\n command: string,\n args: string[],\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n logger?: PourkitLogger;\n label?: string;\n retries?: number;\n backoffMs?: number;\n } = {}\n) {\n const retries = options.retries ?? 3;\n const backoffMs = options.backoffMs ?? 2000;\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n return await execCapture(command, args, options);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n if (!TRANSIENT_GH_ERROR.test(lastError.message)) {\n throw lastError;\n }\n if (options.logger) {\n options.logger.step(\n options.label ?? command,\n `transient failure (attempt ${attempt}/${retries}), retrying`\n );\n }\n if (attempt < retries) {\n await sleep(backoffMs * Math.pow(2, attempt - 1));\n }\n }\n }\n\n throw lastError!;\n}\n\nexport async function execJsonWithRetry<T>(\n command: string,\n args: string[],\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n logger?: PourkitLogger;\n label?: string;\n retries?: number;\n backoffMs?: number;\n } = {}\n) {\n const result = await execCaptureWithRetry(command, args, options);\n return JSON.parse(result.stdout) as T;\n}\n\nexport const TYPE_LABELS = [\n \"type:bugfix\",\n \"type:infra\",\n \"type:feature\",\n \"type:polish\",\n \"type:refactor\",\n] as const;\n\n/**\n * Parse `git worktree list --porcelain` output and find the worktree\n * path for a given branch.\n *\n * Returns null if no worktree is registered for that branch.\n */\nexport function parseWorktreeListPorcelain(\n text: string,\n branch: string\n): string | null {\n const entries = text.trim().split(\"\\n\\n\");\n for (const entry of entries) {\n const lines = entry.trim().split(\"\\n\");\n let path = \"\";\n let entryBranch = \"\";\n for (const line of lines) {\n if (line.startsWith(\"worktree \")) {\n path = line.slice(\"worktree \".length);\n } else if (line.startsWith(\"branch refs/heads/\")) {\n entryBranch = line.slice(\"branch refs/heads/\".length);\n }\n }\n if (entryBranch === branch && path) {\n return path;\n }\n }\n return null;\n}\n","import path from \"node:path\";\nimport { realpathSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport { Command, Option, CommanderError } from \"commander\";\nimport { loadRepoConfig, resolveTarget } from \"./shared/config\";\nimport { cleanupRepository } from \"./shared/cleanup\";\nimport { runIssueCommand } from \"./commands/issue\";\nimport { runQueueCommand } from \"./commands/queue-run\";\nimport { runPrCreateCommand } from \"./commands/pr-create\";\nimport { runPrMergeCommand } from \"./commands/pr-merge\";\nimport type { InitCliOptions } from \"./commands/init\";\nimport { runInitCommand } from \"./commands/init\";\nimport { GitHubIssueProvider } from \"./providers/github-provider\";\nimport { GitHubPRProvider } from \"./providers/github-pr-provider\";\nimport { requireGitHubClient } from \"./providers/github-client\";\nimport { createLogger, execCapture, repoRoot } from \"./shared/common\";\nimport { SandcastleExecutionProvider } from \"./execution/sandcastle-execution\";\n\nfunction normalizePrdRef(ref: string): string {\n const normalized = ref.trim().toUpperCase();\n if (!/^PRD-\\d+$/.test(normalized)) {\n throw new Error(\n `Invalid PRD ref \"${ref}\". Expected format: PRD-<number> (e.g., PRD-021)`\n );\n }\n return normalized;\n}\n\nfunction buildPrCreateArgs(options: {\n target: string;\n title: string;\n base?: string;\n head?: string;\n body?: string;\n bodyFile?: string;\n issues: string[];\n}): string[] {\n const args = [\"--target\", options.target, \"--title\", options.title];\n\n if (options.base) {\n args.push(\"--base\", options.base);\n }\n\n if (options.head) {\n args.push(\"--head\", options.head);\n }\n\n if (options.body !== undefined) {\n args.push(\"--body\", options.body);\n }\n\n if (options.bodyFile !== undefined) {\n args.push(\"--body-file\", options.bodyFile);\n }\n\n for (const issue of options.issues) {\n args.push(\"--issue\", issue);\n }\n\n return args;\n}\n\nfunction buildPrMergeArgs(options: {\n prNumber: string;\n target?: string;\n method?: string;\n wait?: boolean;\n targetGreen?: boolean;\n}): string[] {\n const args = [options.prNumber];\n\n if (options.target) {\n args.push(\"--target\", options.target);\n }\n\n if (options.method) {\n args.push(\"--method\", options.method);\n }\n\n if (options.wait === false) {\n args.push(\"--no-wait\");\n }\n\n if (options.targetGreen === false) {\n args.push(\"--no-target-green\");\n }\n\n return args;\n}\n\nconst DEVELOPMENT_VERSION = \"0.0.0-development\";\n\nfunction isReleaseVersion(value: string | undefined): value is string {\n return (\n typeof value === \"string\" &&\n /^v\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$/.test(value)\n );\n}\n\nfunction isPackageVersion(value: string | undefined): value is string {\n return (\n typeof value === \"string\" &&\n /^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$/.test(value)\n );\n}\n\nasync function handleError(\n logger: {\n step: (level: string, message: string) => void;\n close: () => Promise<void>;\n },\n error: unknown\n): Promise<never> {\n const msg = error instanceof Error ? error.message : String(error);\n logger.step(\"error\", msg);\n await logger.close();\n console.error(`Error: ${msg}`);\n process.exit(1);\n}\n\nexport function createCliProgram(version: string): Command {\n const program = new Command();\n\n program\n .name(\"pourkit\")\n .version(version)\n .exitOverride()\n .description(\"AI-driven issue-to-PR workflow for GitHub repositories.\");\n\n program\n .command(\"issue\")\n .argument(\"<number>\", \"issue number\")\n .requiredOption(\"--target <name>\", \"target name\")\n .option(\"--force\", \"bypass issue gates\")\n .option(\n \"--reset-worktree\",\n \"delete local issue worktree and branch before starting\"\n )\n .option(\"--cwd <path>\", \"target repository directory\")\n .action(\n async (\n issueNumberRaw: string,\n options: {\n target: string;\n force?: boolean;\n resetWorktree?: boolean;\n cwd?: string;\n }\n ) => {\n const issueNumber = Number.parseInt(issueNumberRaw, 10);\n if (Number.isNaN(issueNumber)) {\n console.error(`Invalid issue number: ${issueNumberRaw}`);\n process.exit(1);\n }\n\n const targetRepoRoot = options.cwd ? repoRoot(options.cwd) : repoRoot();\n const config = await loadRepoConfig(targetRepoRoot);\n const logPath = path.join(\n targetRepoRoot,\n \".pourkit\",\n \"logs\",\n `issue-${issueNumber}.log`\n );\n const logger = createLogger(\"pourkit\", logPath);\n const client = await requireGitHubClient({ cwd: targetRepoRoot });\n const issueProvider = new GitHubIssueProvider(client, {\n readyForAgentLabel: config.labels.readyForAgent,\n issueListLimit: config.checks.issueListLimit,\n });\n const prProvider = new GitHubPRProvider(client, logger);\n const executionProvider = new SandcastleExecutionProvider();\n\n try {\n await cleanupRepository({\n repoRoot: targetRepoRoot,\n config,\n issueProvider,\n prProvider,\n logger,\n });\n } catch (err) {\n logger.step(\"warn\", `Cleanup failed: ${err}`);\n }\n\n try {\n const result = await runIssueCommand({\n issueNumber,\n targetName: options.target,\n config,\n issueProvider,\n prProvider,\n executionProvider,\n force: options.force ?? false,\n resetWorktree: options.resetWorktree ?? false,\n logger,\n repoRoot: targetRepoRoot,\n });\n\n logger.raw(\"Issue completed successfully:\");\n logger.raw(` Branch: ${result.branchName}`);\n if (result.noOp) {\n logger.raw(\" Status: no-op (closed without PR)\");\n } else {\n logger.raw(` PR Title: ${result.prTitle}`);\n logger.raw(` PR Number: ${result.prNumber}`);\n logger.raw(` PR URL: ${result.prUrl}`);\n }\n logger.raw(` Target: ${result.target.name}`);\n await logger.close();\n } catch (error) {\n await handleError(logger, error);\n }\n }\n );\n\n program\n .command(\"queue-run\")\n .requiredOption(\"--target <name>\", \"target name\")\n .option(\"--force\", \"bypass issue gates\")\n .option(\"--loop\", \"process runnable issues until the queue is drained\")\n .option(\"--cwd <path>\", \"target repository directory\")\n .option(\"--prd <ref>\", \"limit queue selection to child issues under a PRD\")\n .action(\n async (options: {\n target: string;\n force?: boolean;\n loop?: boolean;\n cwd?: string;\n prd?: string;\n }) => {\n const prdRef = options.prd ? normalizePrdRef(options.prd) : undefined;\n const targetRepoRoot = options.cwd ? repoRoot(options.cwd) : repoRoot();\n const config = await loadRepoConfig(targetRepoRoot);\n const logPath = path.join(\n targetRepoRoot,\n \".pourkit\",\n \"logs\",\n \"queue-run.log\"\n );\n const logger = createLogger(\"pourkit\", logPath);\n const client = await requireGitHubClient({ cwd: targetRepoRoot });\n const issueProvider = new GitHubIssueProvider(client, {\n readyForAgentLabel: config.labels.readyForAgent,\n blockedLabel: config.labels.blocked,\n issueListLimit: config.checks.issueListLimit,\n });\n const prProvider = new GitHubPRProvider(client, logger);\n const executionProvider = new SandcastleExecutionProvider();\n\n try {\n await cleanupRepository({\n repoRoot: targetRepoRoot,\n config,\n issueProvider,\n prProvider,\n logger,\n });\n } catch (err) {\n logger.step(\"warn\", `Cleanup failed: ${err}`);\n }\n\n try {\n const target = resolveTarget(config, options.target);\n const outcome = await runQueueCommand({\n targetName: options.target,\n config,\n issueProvider,\n prProvider,\n executionProvider,\n force: options.force ?? false,\n loop: options.loop ?? target.queue?.loop ?? false,\n logger,\n repoRoot: targetRepoRoot,\n prdRef,\n });\n\n if (outcome.selected === null) {\n if (outcome.code === \"drained\") {\n logger.step(\"info\", outcome.reason);\n await logger.close();\n return;\n }\n logger.step(\"warn\", outcome.reason);\n await logger.close();\n if (outcome.code === \"no-candidates\") {\n console.error(`No candidate issues: ${outcome.reason}`);\n } else {\n console.error(`No runnable issue: ${outcome.reason}`);\n }\n process.exit(1);\n }\n\n await logger.close();\n } catch (error) {\n await handleError(logger, error);\n }\n }\n );\n\n program\n .command(\"init\")\n .description(\"Initialize .pourkit layout in a target repo\")\n .option(\"--dry-run\", \"print the init plan without applying changes\")\n .option(\"--json\", \"output machine-readable JSON plan\")\n .option(\"--from-local <path>\", \"local source repo to copy artifacts from\")\n .option(\"--cwd <path>\", \"target repository directory\")\n .addOption(\n new Option(\n \"--docs-migration <mode>\",\n \"docs migration mode: copy, move, skip\"\n ).choices([\"copy\", \"move\", \"skip\"])\n )\n .option(\"--yes\", \"auto-confirm init plan\")\n .addOption(\n new Option(\n \"--agent-file <mode>\",\n \"agent file mode: both, agents, claude, skip\"\n ).choices([\"both\", \"agents\", \"claude\", \"skip\"])\n )\n .option(\n \"--legacy-skills\",\n \"migrate legacy .opencode/skills to .agents/skills\"\n )\n .addOption(\n new Option(\n \"--package-manager <name>\",\n \"package manager (override detection)\"\n ).choices([\"npm\", \"pnpm\", \"yarn\", \"bun\"])\n )\n .option(\"--no-git-check\", \"skip Git repository validation\")\n .option(\"--skip-install\", \"skip dependency installation (future use)\")\n .action(\n async (\n options: {\n dryRun?: boolean;\n json?: boolean;\n fromLocal?: string;\n cwd?: string;\n docsMigration?: string;\n yes?: boolean;\n agentFile?: string;\n legacySkills?: boolean;\n packageManager?: string;\n noGitCheck?: boolean;\n gitCheck?: boolean;\n skipInstall?: boolean;\n },\n _command: Command\n ) => {\n const initOptions: InitCliOptions = {\n cwd: options.cwd,\n fromLocal: options.fromLocal,\n dryRun: options.dryRun,\n json: options.json,\n yes: options.yes,\n docsMigration: options.docsMigration as\n | \"copy\"\n | \"move\"\n | \"skip\"\n | undefined,\n agentFile: options.agentFile as\n | \"both\"\n | \"agents\"\n | \"claude\"\n | \"skip\"\n | undefined,\n legacySkills: options.legacySkills,\n packageManager: options.packageManager as\n | \"npm\"\n | \"pnpm\"\n | \"yarn\"\n | \"bun\"\n | undefined,\n noGitCheck: options.gitCheck === false ? true : undefined,\n skipInstall: options.skipInstall,\n };\n\n await runInitCommand(initOptions);\n }\n );\n\n const pr = program.command(\"pr\").description(\"Pull request commands\");\n\n pr.command(\"create\")\n .requiredOption(\"--target <name>\", \"target name\")\n .requiredOption(\"--title <title>\", \"PR title\")\n .option(\"--base <base>\", \"base branch\")\n .option(\"--head <branch>\", \"head branch\")\n .option(\"--body <body>\", \"PR body\")\n .option(\"--body-file <path>\", \"file to read PR body from\")\n .option(\n \"--issue <number>\",\n \"issue number to link\",\n (value: string, previous: string[]) => {\n previous.push(value);\n return previous;\n },\n [] as string[]\n )\n .option(\"--cwd <path>\", \"target repository directory\")\n .action(\n async (options: {\n target: string;\n title: string;\n base?: string;\n head?: string;\n body?: string;\n bodyFile?: string;\n issue: string[];\n cwd?: string;\n }) => {\n const targetRepoRoot = options.cwd ? repoRoot(options.cwd) : repoRoot();\n const config = await loadRepoConfig(targetRepoRoot);\n const logPath = path.join(\n targetRepoRoot,\n \".pourkit\",\n \"logs\",\n \"pr-create.log\"\n );\n const logger = createLogger(\"pourkit\", logPath);\n const client = await requireGitHubClient({ cwd: targetRepoRoot });\n const prProvider = new GitHubPRProvider(client, logger);\n\n try {\n const result = await runPrCreateCommand(\n buildPrCreateArgs({\n target: options.target,\n title: options.title,\n base: options.base,\n head: options.head,\n body: options.body,\n bodyFile: options.bodyFile,\n issues: options.issue,\n }),\n logger,\n prProvider,\n config,\n targetRepoRoot\n );\n\n logger.raw(\"PR created successfully:\");\n logger.raw(` Title: ${result.options.title}`);\n logger.raw(` Head: ${result.currentBranch}`);\n logger.raw(` Base: ${result.baseBranch}`);\n logger.raw(` PR Number: ${result.prNumber}`);\n logger.raw(` PR URL: ${result.prUrl}`);\n await logger.close();\n } catch (error) {\n await handleError(logger, error);\n }\n }\n );\n\n pr.command(\"merge\")\n .argument(\"<number>\", \"pull request number\")\n .option(\"--target <name>\", \"target name used to validate PR base branch\")\n .addOption(\n new Option(\"--method <method>\", \"merge method\")\n .choices([\"merge\", \"squash\", \"rebase\"])\n .default(\"squash\")\n )\n .option(\"--no-wait\", \"merge immediately without waiting for PR checks\")\n .option(\n \"--no-target-green\",\n \"skip waiting for the target branch to be green after merge\"\n )\n .option(\"--cwd <path>\", \"target repository directory\")\n .action(\n async (\n prNumber: string,\n options: {\n target?: string;\n method?: string;\n wait?: boolean;\n targetGreen?: boolean;\n cwd?: string;\n }\n ) => {\n const targetRepoRoot = options.cwd ? repoRoot(options.cwd) : repoRoot();\n const config = await loadRepoConfig(targetRepoRoot);\n const logPath = path.join(\n targetRepoRoot,\n \".pourkit\",\n \"logs\",\n \"pr-merge.log\"\n );\n const logger = createLogger(\"pourkit\", logPath);\n const client = await requireGitHubClient({ cwd: targetRepoRoot });\n const prProvider = new GitHubPRProvider(client, logger);\n\n try {\n const result = await runPrMergeCommand(\n buildPrMergeArgs({\n prNumber,\n target: options.target,\n method: options.method,\n wait: options.wait,\n targetGreen: options.targetGreen,\n }),\n logger,\n prProvider,\n config\n );\n\n logger.raw(\"PR merged successfully:\");\n logger.raw(` Title: ${result.prTitle}`);\n logger.raw(` Base: ${result.baseBranch}`);\n logger.raw(` Method: ${result.options.method}`);\n logger.raw(` PR Number: ${result.prNumber}`);\n logger.raw(` PR URL: ${result.prUrl}`);\n await logger.close();\n } catch (error) {\n await handleError(logger, error);\n }\n }\n );\n\n return program;\n}\n\nexport async function resolveCliVersion(): Promise<string> {\n if (isPackageVersion(process.env.POURKIT_CLI_VERSION)) {\n return process.env.POURKIT_CLI_VERSION;\n }\n\n if (isReleaseVersion(process.env.POURKIT_CLI_VERSION)) {\n return process.env.POURKIT_CLI_VERSION;\n }\n\n try {\n const root = repoRoot();\n const { stdout } = await execCapture(\n \"git\",\n [\n \"tag\",\n \"--list\",\n \"v[0-9]*\",\n \"--sort=-version:refname\",\n \"--merged\",\n \"HEAD\",\n ],\n { cwd: root }\n );\n const validTag = stdout\n .trim()\n .split(\"\\n\")\n .filter((t) => t.length > 0)\n .find((t) => isReleaseVersion(t));\n if (validTag) {\n return validTag;\n }\n } catch {\n return DEVELOPMENT_VERSION;\n }\n\n return DEVELOPMENT_VERSION;\n}\n\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\n const version = await resolveCliVersion();\n const program = createCliProgram(version);\n\n if (argv.length === 0) {\n program.outputHelp();\n process.exitCode = 1;\n return;\n }\n\n await program.parseAsync(argv, { from: \"user\" });\n}\n\nif (\n process.argv[1] &&\n pathToFileURL(realpathSync(process.argv[1])).href === import.meta.url\n) {\n main().catch((error) => {\n if (error instanceof CommanderError) {\n if (error.exitCode === 0) return;\n process.exitCode = error.exitCode;\n return;\n }\n console.error(\n `Fatal: ${error instanceof Error ? error.message : String(error)}`\n );\n process.exit(1);\n });\n}\n","import { join } from \"node:path\";\nimport { z } from \"zod\";\n\nexport interface CleanupConfig {\n enabled: boolean;\n worktreeRetentionDays: number;\n logRetentionDays: number;\n}\n\nexport interface PourkitConfig {\n targets: Target[];\n labels: LabelsConfig;\n sandbox: SandboxConfig;\n checks: ChecksConfig;\n cleanup: CleanupConfig;\n}\n\nexport interface PourkitConfigInput {\n targets: TargetInput[];\n labels: LabelsConfig;\n sandbox: SandboxConfig;\n checks: ChecksConfigInput;\n cleanup?: Partial<CleanupConfig>;\n}\n\nexport interface StageAgentConfig {\n agent: string;\n model: string;\n promptTemplate: string;\n}\n\nexport interface ConflictResolutionConfigInput extends StageAgentConfig {\n maxAttempts: number;\n}\n\nexport interface ConflictResolutionConfig extends StageAgentConfig {\n maxAttempts: number;\n}\n\nexport interface ReviewerConfig extends StageAgentConfig {\n criteria: string[];\n includeReviewHistory?: boolean;\n /** @deprecated Use strategy.review.passWithNotesRefactorAttempts. */\n passWithNotesRefactorAttempts?: number;\n}\n\nexport interface BuilderConfig extends StageAgentConfig {}\n\nexport interface QueueConfig {\n loop?: boolean;\n}\n\nexport interface ChecksConfigInput {\n requiredLabels: string[];\n allowedAuthors: string[];\n checksFoundTimeoutSeconds?: number;\n checksCompletionTimeoutSeconds?: number;\n pollIntervalSeconds?: number;\n issueListLimit?: number;\n}\n\nexport interface TargetInput {\n name: string;\n baseBranch?: string;\n branchTemplate?: string;\n setupCommands?: VerificationCommandInput[];\n autoMerge?: boolean;\n queue?: QueueConfig;\n strategy: ReviewRefactorLoopStrategyInput;\n}\n\nexport interface Target {\n name: string;\n baseBranch: string;\n branchTemplate: string;\n setupCommands?: VerificationCommand[];\n autoMerge?: boolean;\n queue?: QueueConfig;\n strategy: ReviewRefactorLoopStrategy;\n}\n\nexport type ResolvedTarget = Target;\n\nexport type TargetStrategy = ReviewRefactorLoopStrategy;\n\nexport interface ReviewRefactorLoopStrategyInput {\n type: \"review-refactor-loop\";\n implement: {\n builder: StageAgentConfig;\n };\n conflictResolution?: ConflictResolutionConfigInput;\n review: {\n reviewer: ReviewerConfig;\n refactor: StageAgentConfig;\n maxIterations: number;\n passWithNotesRefactorAttempts?: number;\n };\n verify?: VerifyConfigInput;\n finalize: {\n prDescriptionAgent: StageAgentConfig;\n maxAttempts: number;\n };\n}\n\nexport interface ReviewRefactorLoopStrategy {\n type: \"review-refactor-loop\";\n implement: {\n builder: StageAgentConfig;\n };\n conflictResolution?: ConflictResolutionConfig;\n review: {\n reviewer: ReviewerConfig;\n refactor: StageAgentConfig;\n maxIterations: number;\n passWithNotesRefactorAttempts: number;\n };\n verify?: VerifyConfig;\n finalize: {\n prDescriptionAgent: StageAgentConfig;\n maxAttempts: number;\n };\n}\n\nexport interface VerifyConfig {\n commands: VerificationCommand[];\n}\n\nexport interface VerifyConfigInput {\n commands?: VerificationCommandInput[];\n}\n\nexport interface LabelsConfig {\n readyForAgent: string;\n agentInProgress: string;\n blocked: string;\n prOpenAwaitingMerge: string;\n readyForHuman: string;\n needsTriage: string;\n}\n\nexport interface SandboxConfig {\n provider: string;\n copyToWorktree?: string[];\n mounts?: SandboxMountConfig[];\n env?: Record<string, string>;\n idleTimeoutSeconds?: number;\n forceRebuild?: boolean;\n}\n\nexport interface SandboxMountConfig {\n hostPath: string;\n sandboxPath: string;\n readonly?: boolean;\n}\n\nexport interface VerificationCommand {\n command: string;\n label: string;\n}\n\nexport interface VerificationCommandInput {\n command: string;\n label?: string;\n}\n\nexport interface ChecksConfig {\n requiredLabels: string[];\n allowedAuthors: string[];\n checksFoundTimeoutSeconds: number;\n checksCompletionTimeoutSeconds: number;\n pollIntervalSeconds: number;\n issueListLimit: number;\n}\n\nexport interface IssueData {\n number: number;\n title: string;\n body: string;\n state: \"open\" | \"closed\";\n labels: string[];\n comments: string[];\n createdAt?: Date;\n}\n\n// ---- Zod schemas ----\n\nconst NonEmptyString = z.string().trim().min(1);\n\nconst StageAgentConfigSchema = z\n .object({\n agent: NonEmptyString,\n model: NonEmptyString,\n promptTemplate: NonEmptyString,\n })\n .strict();\n\nconst ReviewerConfigSchema = z\n .object({\n agent: NonEmptyString,\n model: NonEmptyString,\n promptTemplate: NonEmptyString,\n criteria: z.array(NonEmptyString),\n includeReviewHistory: z.boolean().optional(),\n passWithNotesRefactorAttempts: z.number().int().nonnegative().optional(),\n })\n .strict();\n\nconst VerificationCommandSchema = z\n .object({\n command: z.string().nullable().optional(),\n label: z.string().optional(),\n })\n .strict()\n .refine((d) => d.command && d.command.trim() !== \"\", {\n message: \"must have a non-empty command\",\n })\n .transform((d) => ({\n command: d.command!,\n label: d.label && d.label.trim() !== \"\" ? d.label : undefined,\n }));\n\nconst QueueConfigSchema = z\n .object({\n loop: z.boolean().optional(),\n })\n .strict();\n\nconst ReviewRefactorLoopStrategySchema = z\n .object({\n type: z.literal(\"review-refactor-loop\"),\n implement: z\n .object({\n builder: StageAgentConfigSchema,\n })\n .strict(),\n conflictResolution: z\n .object({\n agent: NonEmptyString,\n model: NonEmptyString,\n promptTemplate: NonEmptyString,\n maxAttempts: z.number().int().positive(),\n })\n .strict()\n .optional(),\n review: z\n .object({\n reviewer: ReviewerConfigSchema,\n refactor: StageAgentConfigSchema,\n maxIterations: z.number().int().positive(),\n passWithNotesRefactorAttempts: z\n .number()\n .int()\n .nonnegative()\n .default(2),\n })\n .strict(),\n verify: z\n .object({\n commands: z.preprocess(\n (v) => (Array.isArray(v) ? v : []),\n z.array(VerificationCommandSchema).refine((arr) => arr.length > 0, {\n message: \"must contain at least one command\",\n })\n ),\n })\n .strict()\n .optional(),\n finalize: z\n .object({\n prDescriptionAgent: StageAgentConfigSchema,\n maxAttempts: z.number().int().positive(),\n })\n .strict(),\n })\n .strict();\n\nconst TargetSchema = z\n .object({\n name: NonEmptyString,\n baseBranch: z.preprocess(\n (v) => (typeof v === \"string\" && v.length > 0 ? v : undefined),\n NonEmptyString.default(\"main\")\n ),\n branchTemplate: z\n .string()\n .default(\"pourkit/{{issue.number}}/{{issue.slug}}\"),\n setupCommands: z.preprocess(\n (v) => (Array.isArray(v) ? v : undefined),\n z.array(VerificationCommandSchema).default([])\n ),\n autoMerge: z.preprocess(\n (v) => (typeof v === \"boolean\" ? v : undefined),\n z.boolean().default(true)\n ),\n queue: QueueConfigSchema.optional(),\n strategy: ReviewRefactorLoopStrategySchema,\n })\n .strict();\n\nconst LabelsSchema = z\n .object({\n readyForAgent: NonEmptyString,\n agentInProgress: NonEmptyString,\n blocked: NonEmptyString,\n prOpenAwaitingMerge: NonEmptyString,\n readyForHuman: NonEmptyString,\n needsTriage: NonEmptyString.optional().default(\"needs-triage\"),\n })\n .strict();\n\nconst SandboxMountSchema = z\n .object({\n hostPath: NonEmptyString,\n sandboxPath: NonEmptyString,\n readonly: z.boolean().default(false),\n })\n .strict();\n\nconst SandboxSchema = z\n .object({\n provider: NonEmptyString,\n copyToWorktree: z.array(NonEmptyString).optional(),\n mounts: z.array(SandboxMountSchema).optional(),\n env: z.record(z.string()).optional(),\n idleTimeoutSeconds: z.preprocess((v) => {\n if (v === undefined) return undefined;\n if (typeof v === \"number\" && Number.isFinite(v) && v > 0) return v;\n return v;\n }, z.number().int().positive().optional()),\n })\n .strict();\n\nconst ChecksSchema = z\n .object({\n requiredLabels: z.array(NonEmptyString),\n allowedAuthors: z.array(NonEmptyString),\n checksFoundTimeoutSeconds: z.number().int().positive().optional(),\n checksCompletionTimeoutSeconds: z.number().int().positive().optional(),\n pollIntervalSeconds: z.number().int().positive().optional(),\n issueListLimit: z.number().int().positive().optional(),\n })\n .strict();\n\nconst CleanupConfigSchema = z\n .object({\n enabled: z.boolean().default(true),\n worktreeRetentionDays: z.number().int().positive().default(14),\n logRetentionDays: z.number().int().positive().default(30),\n })\n .strict();\n\nconst PourkitConfigSchema = z\n .object({\n targets: z.array(TargetSchema).min(1),\n labels: LabelsSchema,\n sandbox: SandboxSchema,\n checks: ChecksSchema,\n cleanup: CleanupConfigSchema.optional(),\n })\n .strict();\n\n// ---- Removed field preflight ----\n\nconst removedFieldReplacements: Record<string, string> = {\n \"config.implementor\": \"targets[].strategy.implement.builder\",\n \"config.reviewer\": \"targets[].strategy.review.reviewer\",\n \"config.refactorer\": \"targets[].strategy.review.refactor\",\n \"config.finalizer\": \"targets[].strategy.finalize.prDescriptionAgent\",\n \"config.maxReviewIterations\": \"targets[].strategy.review.maxIterations\",\n \"config.builder\": \"targets[].strategy.implement.builder\",\n \"targets[].verificationCommands\": \"targets[].strategy.verify.commands\",\n \"targets[].implementor\": \"targets[].strategy.implement.builder\",\n \"targets[].reviewer\": \"targets[].strategy.review.reviewer\",\n \"targets[].refactorer\": \"targets[].strategy.review.refactor\",\n \"targets[].finalizer\": \"targets[].strategy.finalize.prDescriptionAgent\",\n \"targets[].maxReviewIterations\": \"targets[].strategy.review.maxIterations\",\n \"checks.timeoutSeconds\": \"checks.checksCompletionTimeoutSeconds\",\n};\n\nfunction checkRemovedFields(raw: Record<string, unknown>): void {\n const topLevelKeys = [\n \"implementor\",\n \"reviewer\",\n \"refactorer\",\n \"finalizer\",\n \"maxReviewIterations\",\n \"builder\",\n ];\n for (const key of topLevelKeys) {\n if (key in raw) {\n throw new Error(\n `config.${key} has been removed; use ${removedFieldReplacements[`config.${key}`]}`\n );\n }\n }\n\n const targetLevelKeys = [\n \"verificationCommands\",\n \"implementor\",\n \"reviewer\",\n \"refactorer\",\n \"finalizer\",\n \"maxReviewIterations\",\n ];\n if (Array.isArray(raw.targets)) {\n for (let i = 0; i < raw.targets.length; i++) {\n const t = raw.targets[i];\n if (t && typeof t === \"object\") {\n const target = t as Record<string, unknown>;\n for (const key of targetLevelKeys) {\n if (key in target) {\n throw new Error(\n `targets[${i}].${key} has been removed; use ${removedFieldReplacements[`targets[].${key}`]}`\n );\n }\n }\n }\n }\n }\n\n if (raw.checks && typeof raw.checks === \"object\") {\n const checks = raw.checks as Record<string, unknown>;\n if (\"timeoutSeconds\" in checks) {\n throw new Error(\n \"checks.timeoutSeconds has been removed; use checks.checksCompletionTimeoutSeconds\"\n );\n }\n }\n}\n\n// ---- Zod error formatting ----\n\nfunction formatZodPath(path: (string | number)[]): string {\n if (path.length === 0) return \"\";\n let result = \"\";\n for (const segment of path) {\n if (typeof segment === \"number\") {\n result += `[${segment}]`;\n } else {\n result += result ? `.${segment}` : segment;\n }\n }\n return result;\n}\n\nfunction formatFirstZodError(err: z.ZodError): string {\n const issue = err.issues[0];\n const path = formatZodPath(issue.path);\n\n if (\n path === \"targets\" &&\n (issue.code === \"too_small\" || issue.code === \"invalid_type\")\n ) {\n return \"Config must have at least one target\";\n }\n\n if (\n issue.path.length >= 3 &&\n issue.path[0] === \"targets\" &&\n typeof issue.path[1] === \"number\" &&\n issue.path[2] === \"name\" &&\n issue.code === z.ZodIssueCode.too_small\n ) {\n return `Target[${issue.path[1]}] must have a non-empty name`;\n }\n\n switch (issue.code) {\n case z.ZodIssueCode.invalid_type: {\n if (issue.expected === \"object\") {\n return path ? `${path} must be an object` : \"Config must be an object\";\n }\n if (issue.expected === \"integer\") {\n return `${path} must be an integer`;\n }\n if (issue.expected === \"string\") {\n return `${path} must be a string`;\n }\n if (issue.expected === \"number\") {\n return `${path} must be a number`;\n }\n return issue.message;\n }\n case z.ZodIssueCode.too_small:\n if (issue.type === \"string\" && issue.minimum === 1) {\n return `${path} must be a non-empty string`;\n }\n if (issue.type === \"array\" && issue.minimum === 1) {\n return `${path} must not be empty`;\n }\n if (issue.type === \"number\") {\n return `${path} must be a positive number`;\n }\n return issue.message;\n case z.ZodIssueCode.invalid_literal:\n return `${path} must be ${issue.expected}`;\n case z.ZodIssueCode.unrecognized_keys:\n const keyPath = path ? `${path}.${issue.keys[0]}` : issue.keys[0];\n return `${keyPath} is not supported`;\n case z.ZodIssueCode.custom:\n return path ? `${path} ${issue.message}` : issue.message;\n default:\n return issue.message;\n }\n}\n\n// ---- Config parsing ----\n\nexport function parseConfig(raw: unknown): PourkitConfig {\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"Config must be an object\");\n }\n\n const config = raw as Record<string, unknown>;\n\n if (!Array.isArray(config.targets) || config.targets.length === 0) {\n throw new Error(\"Config must have at least one target\");\n }\n\n checkRemovedFields(config);\n\n const rawTargets = config.targets as Record<string, unknown>[];\n for (let i = 0; i < rawTargets.length; i++) {\n const t = rawTargets[i];\n if (t === null || typeof t !== \"object\") {\n throw new Error(`targets[${i}] must be an object`);\n }\n assertKnownKeys(t, `targets[${i}]`, [\n \"name\",\n \"baseBranch\",\n \"branchTemplate\",\n \"setupCommands\",\n \"autoMerge\",\n \"queue\",\n \"strategy\",\n ]);\n }\n\n if (config.sandbox && typeof config.sandbox === \"object\") {\n assertKnownKeys(config.sandbox as Record<string, unknown>, \"sandbox\", [\n \"provider\",\n \"copyToWorktree\",\n \"mounts\",\n \"env\",\n \"idleTimeoutSeconds\",\n ]);\n }\n\n const result = PourkitConfigSchema.safeParse(raw);\n if (!result.success) {\n throw new Error(formatFirstZodError(result.error));\n }\n\n const data = result.data;\n\n const targets: Target[] = data.targets.map((t) => {\n const setupCommands = t.setupCommands?.map((cmd, i) => ({\n command: cmd.command,\n label: cmd.label ?? `check-${i}`,\n }));\n const verifyCommands = t.strategy.verify?.commands?.map((cmd, i) => ({\n command: cmd.command,\n label: cmd.label ?? `check-${i}`,\n }));\n return {\n name: t.name,\n baseBranch: t.baseBranch,\n branchTemplate: t.branchTemplate,\n setupCommands,\n autoMerge: t.autoMerge,\n queue: t.queue,\n strategy: {\n type: \"review-refactor-loop\" as const,\n implement: { builder: t.strategy.implement.builder },\n ...(t.strategy.conflictResolution\n ? {\n conflictResolution: {\n agent: t.strategy.conflictResolution.agent,\n model: t.strategy.conflictResolution.model,\n promptTemplate: t.strategy.conflictResolution.promptTemplate,\n maxAttempts: t.strategy.conflictResolution.maxAttempts,\n },\n }\n : {}),\n review: {\n reviewer: t.strategy.review.reviewer,\n refactor: t.strategy.review.refactor,\n maxIterations: t.strategy.review.maxIterations,\n passWithNotesRefactorAttempts:\n t.strategy.review.passWithNotesRefactorAttempts,\n },\n ...(t.strategy.verify ? { verify: { commands: verifyCommands! } } : {}),\n finalize: {\n prDescriptionAgent: t.strategy.finalize.prDescriptionAgent,\n maxAttempts: t.strategy.finalize.maxAttempts,\n },\n },\n };\n });\n\n return {\n targets,\n labels: data.labels,\n sandbox: {\n provider: data.sandbox.provider,\n copyToWorktree: data.sandbox.copyToWorktree,\n mounts: data.sandbox.mounts,\n env: data.sandbox.env,\n idleTimeoutSeconds: data.sandbox.idleTimeoutSeconds,\n },\n checks: {\n requiredLabels: data.checks.requiredLabels,\n allowedAuthors: data.checks.allowedAuthors,\n checksFoundTimeoutSeconds: data.checks.checksFoundTimeoutSeconds ?? 60,\n checksCompletionTimeoutSeconds:\n data.checks.checksCompletionTimeoutSeconds ?? 30 * 60,\n pollIntervalSeconds: data.checks.pollIntervalSeconds ?? 15,\n issueListLimit: data.checks.issueListLimit ?? 50,\n },\n cleanup: {\n enabled: data.cleanup?.enabled ?? true,\n worktreeRetentionDays: data.cleanup?.worktreeRetentionDays ?? 14,\n logRetentionDays: data.cleanup?.logRetentionDays ?? 30,\n },\n };\n}\n\n// ---- Key validation helpers (used before Zod for matching error format) ----\n\nfunction assertKnownKeys(\n value: Record<string, unknown>,\n path: string,\n knownKeys: string[]\n) {\n for (const key of Object.keys(value)) {\n if (!knownKeys.includes(key)) {\n throw new Error(`${path}.${key} is not supported`);\n }\n }\n}\n\n// ---- Public API ----\n\nexport function definePourkitConfig(\n config: PourkitConfigInput\n): PourkitConfigInput {\n return config;\n}\n\nexport function getVerificationCommands(target: Target): VerificationCommand[] {\n return target.strategy.verify?.commands ?? [];\n}\n\nexport async function loadRepoConfig(\n repoRoot: string,\n configFileName = \"pourkit.config.ts\"\n): Promise<PourkitConfig> {\n const { existsSync } = await import(\"node:fs\");\n const { readFile, writeFile, rm } = await import(\"node:fs/promises\");\n const { tmpdir } = await import(\"node:os\");\n const { join: pjoin, basename } = await import(\"node:path\");\n const { pathToFileURL } = await import(\"node:url\");\n const { build } = await import(\"esbuild\");\n\n const configPath = pjoin(repoRoot, configFileName);\n\n if (!existsSync(configPath)) {\n throw new Error(\n `No config file found at ${configPath}. Create a ${configFileName} that exports a default PourkitConfig.`\n );\n }\n\n const tmpFile = pjoin(\n tmpdir(),\n `pourkit-config-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.mjs`\n );\n\n try {\n await build({\n entryPoints: [configPath],\n bundle: true,\n write: false,\n platform: \"node\",\n format: \"esm\",\n external: [\"node:*\"],\n }).then(async (result) => {\n const output = result.outputFiles[0].text;\n await writeFile(tmpFile, output, \"utf-8\");\n });\n\n const imported = await import(pathToFileURL(tmpFile).href);\n const raw = imported.default;\n\n if (raw === undefined) {\n throw new Error(\"pourkit.config.ts must have a default export\");\n }\n\n return parseConfig(raw);\n } finally {\n try {\n await rm(tmpFile, { force: true });\n } catch {\n // ignore cleanup errors\n }\n }\n}\n\nexport async function loadConfig(configPath: string): Promise<PourkitConfig> {\n const { readFile } = await import(\"node:fs/promises\");\n const { pathToFileURL } = await import(\"node:url\");\n const ext = configPath.split(\".\").pop()?.toLowerCase();\n\n if (ext === \"json\") {\n const raw = await readFile(configPath, \"utf-8\");\n return parseConfig(JSON.parse(raw));\n }\n\n if (ext === \"mjs\" || ext === \"js\") {\n const imported = await import(pathToFileURL(configPath).href);\n const raw = imported.default ?? imported;\n return parseConfig(raw);\n }\n\n throw new Error(`Unsupported config format: ${ext}. Use .json, .mjs, or .js`);\n}\n\nexport function resolvePromptTemplatePath(\n repoRoot: string,\n promptTemplate: string\n): string {\n if (promptTemplate.includes(\"/\")) {\n return join(repoRoot, promptTemplate);\n }\n return join(repoRoot, \".pourkit\", \"prompts\", promptTemplate);\n}\n\nexport function resolveTarget(\n config: PourkitConfig,\n explicitTarget?: string\n): ResolvedTarget {\n if (config.targets.length === 0) {\n throw new Error(\"No targets configured\");\n }\n\n if (config.targets.length === 1) {\n const target = config.targets[0];\n if (explicitTarget && target.name !== explicitTarget) {\n throw new Error(\n `Target \"${explicitTarget}\" not found. Available: ${target.name}`\n );\n }\n return target;\n }\n\n if (!explicitTarget) {\n throw new Error(\n `Multiple targets configured: ${config.targets.map((t) => t.name).join(\", \")}. Use --target to select one.`\n );\n }\n\n const found = config.targets.find((t) => t.name === explicitTarget);\n if (!found) {\n throw new Error(\n `Target \"${explicitTarget}\" not found. Available: ${config.targets.map((t) => t.name).join(\", \")}`\n );\n }\n\n return found;\n}\n","import { execCapture } from \"./common\";\nimport { readWorktreeRunState } from \"./worktree-run-state\";\nimport type { PourkitConfig } from \"./config\";\nimport type { IssueProvider } from \"../providers/issue-provider\";\nimport type { PRProvider } from \"../providers/pr-provider\";\nimport type { PourkitLogger } from \"./common\";\nimport { join } from \"node:path\";\n\ninterface WorktreeEntry {\n path: string;\n branch?: string;\n}\n\ninterface CleanupCandidate {\n path: string;\n branch?: string;\n}\n\ninterface CleanupOptions {\n repoRoot: string;\n config: PourkitConfig;\n issueProvider: IssueProvider;\n prProvider: PRProvider;\n logger: PourkitLogger;\n}\n\nexport function parseWorktreeListPorcelain(text: string): WorktreeEntry[] {\n const entries = text.trim().split(\"\\n\\n\");\n return entries\n .map((entry) => {\n const lines = entry.trim().split(\"\\n\");\n let path = \"\";\n let branch = \"\";\n for (const line of lines) {\n if (line.startsWith(\"worktree \")) {\n path = line.slice(\"worktree \".length);\n } else if (line.startsWith(\"branch refs/heads/\")) {\n branch = line.slice(\"branch refs/heads/\".length);\n }\n }\n return { path, branch: branch || undefined };\n })\n .filter((e) => e.path);\n}\n\nexport async function listCleanupCandidates(\n repoRoot: string,\n retentionDays: number\n): Promise<CleanupCandidate[]> {\n const { stdout } = await execCapture(\n \"git\",\n [\"worktree\", \"list\", \"--porcelain\"],\n { cwd: repoRoot }\n );\n const entries = parseWorktreeListPorcelain(stdout);\n const now = Date.now();\n const retentionMs = retentionDays * 24 * 60 * 60 * 1000;\n const candidates: CleanupCandidate[] = [];\n\n for (const entry of entries) {\n if (!entry.branch) continue;\n\n const state = readWorktreeRunState(entry.path);\n if (!state) continue;\n\n const isCompleted = state.pr?.merged === true;\n if (!isCompleted) continue;\n\n const updatedAt = new Date(state.updatedAt).getTime();\n if (now - updatedAt < retentionMs) continue;\n\n candidates.push({ path: entry.path, branch: entry.branch });\n }\n\n return candidates;\n}\n\nexport async function removeStaleWorktree(\n candidate: CleanupCandidate,\n repoRoot: string,\n logger: PourkitLogger\n): Promise<void> {\n logger.step(\"cleanup\", `Removing stale worktree at ${candidate.path}`);\n await execCapture(\"git\", [\"worktree\", \"remove\", candidate.path], {\n cwd: repoRoot,\n });\n if (candidate.branch) {\n try {\n await execCapture(\"git\", [\"branch\", \"-d\", candidate.branch], {\n cwd: repoRoot,\n });\n } catch {\n // Branch not merged yet - leave it\n }\n }\n}\n\nexport async function removeExpiredFiles(\n dirPath: string,\n retentionDays: number\n): Promise<void> {\n const { readdir, stat, unlink, access } = await import(\"node:fs/promises\");\n\n let entries: string[];\n try {\n entries = await readdir(dirPath);\n } catch {\n return;\n }\n\n const now = Date.now();\n const retentionMs = retentionDays * 24 * 60 * 60 * 1000;\n\n for (const entry of entries) {\n const entryPath = join(dirPath, entry);\n try {\n const stats = await stat(entryPath);\n if (stats.isFile() && now - stats.mtimeMs > retentionMs) {\n await access(entryPath, 4); // R_OK — skip if not readable\n await unlink(entryPath);\n }\n } catch {\n // skip unreadable files\n }\n }\n}\n\nexport async function removeExpiredPromptDumps(\n worktreePaths: string[],\n retentionDays: number\n): Promise<void> {\n for (const wtPath of worktreePaths) {\n await removeExpiredFiles(\n join(wtPath, \".pourkit\", \".tmp\", \"prompts\"),\n retentionDays\n );\n }\n}\n\nexport async function cleanupRepository(\n options: CleanupOptions\n): Promise<void> {\n const { repoRoot, config, logger } = options;\n if (!config.cleanup?.enabled) return;\n\n try {\n const retentionDays = config.cleanup.worktreeRetentionDays ?? 14;\n const candidates = await listCleanupCandidates(repoRoot, retentionDays);\n for (const candidate of candidates) {\n try {\n await removeStaleWorktree(candidate, repoRoot, logger);\n } catch (err) {\n logger.step(\n \"warn\",\n `Failed to remove stale worktree ${candidate.path}: ${err}`\n );\n }\n }\n\n const logRetentionDays = config.cleanup.logRetentionDays ?? 30;\n await removeExpiredFiles(\n join(repoRoot, \".pourkit\", \"logs\"),\n logRetentionDays\n );\n\n const { stdout: wtStdout } = await execCapture(\n \"git\",\n [\"worktree\", \"list\", \"--porcelain\"],\n { cwd: repoRoot }\n );\n const worktreePaths = parseWorktreeListPorcelain(wtStdout).map(\n (e) => e.path\n );\n await removeExpiredPromptDumps(worktreePaths, logRetentionDays);\n } catch (err) {\n logger.step(\"warn\", `Cleanup failed: ${err}`);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\n\nexport const WORKTREE_RUN_STATE_PATH = \".pourkit/state.json\";\n\nexport type WorktreeRunStage =\n | \"builder\"\n | \"verification\"\n | \"review\"\n | \"refactor\"\n | \"finalizer\"\n | \"finalCommit\"\n | \"pr\"\n | \"baseRefresh\"\n | \"conflictResolution\";\n\nexport interface WorktreeRunState {\n issueNumber: number;\n targetName: string;\n branchName: string;\n baseBranch: string;\n createdAt: string;\n updatedAt: string;\n completedStages: {\n builder?: boolean;\n initialVerification?: boolean;\n };\n review: {\n lifetimeIterations: number;\n lastVerdict?:\n | \"PASS\"\n | \"PASS_WITH_NOTES\"\n | \"NEEDS_REFACTOR\"\n | \"FAIL\"\n | \"NEEDS_HUMAN\";\n lastArtifactPath?: string;\n refactorArtifactPaths?: string[];\n refactorCompletedForLastReview?: boolean;\n exhaustedPreviousRun?: boolean;\n };\n finalizer?: {\n completed: boolean;\n artifactPath?: string;\n title?: string;\n body?: string;\n };\n finalCommit?: {\n completed: boolean;\n sha?: string;\n };\n pr?: {\n created: boolean;\n number?: number;\n url?: string;\n merged?: boolean;\n };\n lastFailure?: {\n stage: WorktreeRunStage;\n message: string;\n };\n}\n\nexport function readWorktreeRunState(\n worktreePath: string\n): WorktreeRunState | null {\n const statePath = join(worktreePath, WORKTREE_RUN_STATE_PATH);\n if (!existsSync(statePath)) {\n return null;\n }\n try {\n const raw = JSON.parse(readFileSync(statePath, \"utf-8\"));\n if (isValidWorktreeRunState(raw)) {\n return raw;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction isValidWorktreeRunState(raw: unknown): raw is WorktreeRunState {\n if (typeof raw !== \"object\" || raw === null) return false;\n const obj = raw as Record<string, unknown>;\n if (typeof obj.completedStages !== \"object\" || obj.completedStages === null)\n return false;\n if (typeof obj.review !== \"object\" || obj.review === null) return false;\n const review = obj.review as Record<string, unknown>;\n if (typeof review.lifetimeIterations !== \"number\") return false;\n return true;\n}\n\nexport function writeWorktreeRunState(\n worktreePath: string,\n state: WorktreeRunState\n): void {\n const statePath = join(worktreePath, WORKTREE_RUN_STATE_PATH);\n mkdirSync(dirname(statePath), { recursive: true });\n writeFileSync(statePath, JSON.stringify(state, null, 2), \"utf-8\");\n}\n\nexport function updateWorktreeRunState(\n worktreePath: string,\n update: Partial<WorktreeRunState>\n): void {\n const existing =\n readWorktreeRunState(worktreePath) ?? ({} as WorktreeRunState);\n const merged: WorktreeRunState = {\n ...existing,\n ...update,\n updatedAt: new Date().toISOString(),\n completedStages: {\n ...existing.completedStages,\n ...(update.completedStages ?? {}),\n },\n review: {\n ...existing.review,\n ...(update.review ?? {}),\n },\n finalizer:\n update.finalizer !== undefined\n ? { ...existing.finalizer, ...update.finalizer }\n : existing.finalizer,\n finalCommit:\n update.finalCommit !== undefined\n ? { ...existing.finalCommit, ...update.finalCommit }\n : existing.finalCommit,\n pr:\n update.pr !== undefined ? { ...existing.pr, ...update.pr } : existing.pr,\n };\n writeWorktreeRunState(worktreePath, merged);\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type {\n PourkitConfig,\n IssueData,\n ResolvedTarget,\n} from \"../shared/config\";\nimport { resolvePromptTemplatePath, resolveTarget } from \"../shared/config\";\nimport { renderBranchName } from \"../pr/templates\";\nimport type { IssueProvider } from \"../providers/issue-provider\";\nimport type { PRProvider } from \"../providers/pr-provider\";\nimport type {\n ExecutionProvider,\n ExecutionResult,\n} from \"../execution/execution-provider\";\nimport {\n execCapture,\n readMaybeEnvInt,\n parseWorktreeListPorcelain,\n type PourkitLogger,\n} from \"../shared/common\";\nimport {\n buildRunContextArtifact,\n RUN_CONTEXT_PATH_IN_WORKTREE,\n STAGE_SECTIONS,\n} from \"../shared/run-context\";\nimport { appendProtectedWorkGuidance } from \"../shared/prompt-guidance\";\nimport {\n readWorktreeRunState,\n writeWorktreeRunState,\n updateWorktreeRunState,\n type WorktreeRunState,\n} from \"../shared/worktree-run-state\";\nimport {\n refreshStaleIssueBranch,\n invalidateAfterBaseRefresh,\n} from \"./base-refresh\";\nimport { runConflictResolutionLoop } from \"./conflict-resolution\";\nimport { runFinalizerAgent } from \"./pr-description-agent\";\nimport { ensureClosingRefs } from \"../pr/pr-body\";\nimport {\n ensureConventionalPrTitle,\n parsePrDescription,\n} from \"../pr/pr-description\";\nimport { runMergeCoordinator } from \"../issues/merge-coordinator\";\nimport { waitForBranchChecks } from \"../issues/target-green\";\nimport {\n runReviewWithRefactorLoop,\n type ReviewLoopResult,\n type RunReviewLoopOptions,\n} from \"./review\";\nimport {\n createIssueTransitions,\n type IssueTransitionsContract,\n} from \"../issues/issue-transitions\";\nimport { parseStackedIssue } from \"../issues/stacked-issue\";\nconst EXECUTION_TIMEOUT_MS =\n readMaybeEnvInt(process.env.POURKIT_TIMEOUT_SECONDS, 30 * 60) * 1000;\n\nexport type IssueWorktreeResolution =\n | {\n mode: \"new\";\n branchName: string;\n baseRef: string;\n worktreePath?: undefined;\n }\n | {\n mode: \"existing-worktree\";\n branchName: string;\n baseRef: string;\n worktreePath: string;\n }\n | {\n mode: \"existing-branch\";\n branchName: string;\n baseRef: string;\n worktreePath: string;\n };\n\nexport interface StartIssueRunOptions {\n issueNumber: number;\n targetName?: string;\n config: PourkitConfig;\n issueProvider: IssueProvider;\n prProvider: PRProvider;\n executionProvider: ExecutionProvider;\n force: boolean;\n resetWorktree?: boolean;\n logger: PourkitLogger;\n repoRoot: string;\n}\n\nexport interface IssueGates {\n isOpen: boolean;\n isReadyForAgent: boolean;\n isNotBlocked: boolean;\n isNotInProgress: boolean;\n}\n\nexport interface IssueGateResult {\n allowed: boolean;\n gates: IssueGates;\n reason?: string;\n}\n\nexport function checkIssueGates(\n issue: IssueData,\n config: PourkitConfig,\n force: boolean\n): IssueGateResult {\n const gates: IssueGates = {\n isOpen: issue.state === \"open\",\n isReadyForAgent: issue.labels.includes(config.labels.readyForAgent),\n isNotBlocked: !issue.labels.includes(config.labels.blocked),\n isNotInProgress: !issue.labels.includes(config.labels.agentInProgress),\n };\n\n if (force) {\n return { allowed: true, gates };\n }\n\n const failed: string[] = [];\n\n if (!gates.isOpen) {\n failed.push(`issue ${issue.number} is not open`);\n }\n\n if (!gates.isReadyForAgent) {\n failed.push(\n `issue ${issue.number} is not labeled ${config.labels.readyForAgent}`\n );\n }\n\n if (!gates.isNotBlocked) {\n failed.push(`issue ${issue.number} is labeled ${config.labels.blocked}`);\n }\n\n if (!gates.isNotInProgress) {\n failed.push(\n `issue ${issue.number} is already labeled ${config.labels.agentInProgress}`\n );\n }\n\n if (failed.length > 0) {\n return {\n allowed: false,\n gates,\n reason: failed.join(\"; \"),\n };\n }\n\n return { allowed: true, gates };\n}\n\nexport interface IssueRunStartResult {\n issue: IssueData;\n target: ResolvedTarget;\n branchName: string;\n worktreeState: WorktreeRunState | null;\n executionResult: ExecutionResult;\n}\n\nexport interface RunIssueResult {\n branchName: string;\n target: ResolvedTarget;\n issue: IssueData;\n prNumber?: number;\n prUrl?: string;\n prTitle?: string;\n prBody?: string;\n noOp: boolean;\n}\n\nexport interface CompleteIssueRunOptions extends StartIssueRunOptions {\n startResult: IssueRunStartResult;\n reviewArtifactPath?: string;\n}\n\nexport interface FailIssueRunOptions {\n issueProvider: IssueProvider;\n issueNumber: number;\n config: PourkitConfig;\n logger: PourkitLogger;\n error: Error | string;\n}\n\nexport async function startIssueRun(\n options: StartIssueRunOptions\n): Promise<IssueRunStartResult> {\n const {\n issueNumber,\n targetName,\n config,\n issueProvider,\n prProvider,\n executionProvider,\n force,\n logger,\n } = options;\n const ROOT = options.repoRoot;\n\n const issue = await issueProvider.fetchIssue(issueNumber);\n\n const gateResult = checkIssueGates(issue, config, force);\n if (!gateResult.allowed) {\n throw new Error(`Issue gates failed: ${gateResult.reason}`);\n }\n\n const target = resolveTarget(config, targetName);\n const branchName = renderBranchName(target.branchTemplate, issue);\n const strategy = target.strategy;\n\n if (options.resetWorktree) {\n const existingPr = await prProvider.getPr(branchName);\n if (existingPr && existingPr.state === \"OPEN\") {\n throw new Error(\n `Cannot reset worktree: open PR #${existingPr.number} exists for branch ${branchName}. Close the PR first or omit --reset-worktree.`\n );\n }\n await resetLocalBranchState(ROOT, branchName, logger);\n await syncTargetBranch(ROOT, target.baseBranch, logger);\n }\n\n const prompt = loadBuilderPrompt(\n ROOT,\n strategy.implement.builder.promptTemplate\n );\n\n const resolution = await resolveIssueWorktree(\n ROOT,\n branchName,\n target.baseBranch,\n logger\n );\n\n const worktreeState = resolution.worktreePath\n ? readWorktreeRunState(resolution.worktreePath)\n : null;\n\n if (resolution.mode !== \"new\") {\n const existingPr = await prProvider.getPr(branchName);\n\n const refreshResult = await refreshStaleIssueBranch({\n worktreePath: resolution.worktreePath!,\n baseBranch: target.baseBranch,\n localGitBaseRef: resolution.baseRef,\n logger,\n prNumber: existingPr?.number,\n prState: existingPr?.state,\n });\n if (refreshResult.status === \"refreshed\") {\n if (worktreeState?.completedStages.builder) {\n const invalidatedState = invalidateAfterBaseRefresh(worktreeState);\n writeWorktreeRunState(resolution.worktreePath!, invalidatedState);\n }\n } else if (refreshResult.status === \"conflicted\") {\n if (strategy.conflictResolution && resolution.worktreePath) {\n const crLoopResult = await runConflictResolutionLoop({\n executionProvider,\n config,\n target,\n issue,\n branchName,\n worktreePath: resolution.worktreePath,\n repoRoot: ROOT,\n initialConflictedPaths: refreshResult.conflictedPaths,\n maxAttempts: strategy.conflictResolution.maxAttempts,\n logger,\n });\n\n if (crLoopResult.status === \"completed\") {\n if (strategy.verify?.commands) {\n for (const cmd of strategy.verify.commands) {\n await execCapture(\"bash\", [\"-lc\", cmd.command], {\n cwd: resolution.worktreePath,\n logger,\n label: `verify ${cmd.label}`,\n });\n }\n }\n if (worktreeState?.completedStages.builder) {\n const invalidatedState = invalidateAfterBaseRefresh(worktreeState);\n writeWorktreeRunState(resolution.worktreePath, invalidatedState);\n }\n } else {\n const failureMessage =\n crLoopResult.status === \"ambiguous\"\n ? `Conflict resolution ambiguous: ${crLoopResult.message}`\n : crLoopResult.status === \"exhausted\"\n ? `Conflict resolution maxAttempts (${strategy.conflictResolution.maxAttempts}) exhausted: ${crLoopResult.message}`\n : `Conflict resolution failed: ${crLoopResult.message}`;\n const failureStage = \"conflictResolution\" as const;\n\n if (worktreeState) {\n updateWorktreeRunState(resolution.worktreePath, {\n lastFailure: {\n stage: failureStage,\n message: failureMessage,\n },\n });\n } else {\n writeWorktreeRunState(resolution.worktreePath, {\n issueNumber,\n targetName: target.name,\n branchName,\n baseBranch: target.baseBranch,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n completedStages: {},\n review: { lifetimeIterations: 0 },\n lastFailure: {\n stage: failureStage,\n message: failureMessage,\n },\n });\n }\n\n await transitionIssueToFailureState(\n issueProvider,\n issueNumber,\n config,\n failureMessage,\n logger\n );\n throw new Error(failureMessage);\n }\n } else {\n if (resolution.worktreePath) {\n if (worktreeState) {\n updateWorktreeRunState(resolution.worktreePath, {\n lastFailure: {\n stage: \"baseRefresh\",\n message: `Base refresh conflict detected. Handing off to human: ${refreshResult.message}`,\n },\n });\n } else {\n writeWorktreeRunState(resolution.worktreePath, {\n issueNumber,\n targetName: target.name,\n branchName,\n baseBranch: target.baseBranch,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n completedStages: {},\n review: { lifetimeIterations: 0 },\n lastFailure: {\n stage: \"baseRefresh\",\n message: `Base refresh conflict detected. Handing off to human: ${refreshResult.message}`,\n },\n });\n }\n }\n await transitionIssueToFailureState(\n issueProvider,\n issueNumber,\n config,\n `Base refresh conflicted: ${refreshResult.message}. Worktree preserved at ${resolution.worktreePath}.`,\n logger\n );\n throw new Error(`Base refresh conflicted: ${refreshResult.message}`);\n }\n } else if (refreshResult.status === \"refused-published-history\") {\n throw new Error(\n `Cannot auto-refresh published history: PR #${refreshResult.prNumber} (${refreshResult.prState}) exists for branch ${branchName}`\n );\n }\n }\n\n const runContextArtifact = buildRunContextArtifact({\n issue,\n target,\n branchName,\n reviewerCriteria: strategy.review.reviewer.criteria,\n sections: STAGE_SECTIONS.builder,\n });\n\n await issueProvider.addLabels(issueNumber, [config.labels.agentInProgress]);\n await issueProvider.removeLabel(issueNumber, config.labels.readyForAgent);\n\n let executionResult: ExecutionResult;\n\n const shouldRunBuilder =\n resolution.mode === \"new\"\n ? true\n : worktreeState === null || !worktreeState.completedStages.builder;\n\n if (shouldRunBuilder) {\n executionResult = await executionProvider.execute({\n stage: \"builder\",\n agent: strategy.implement.builder.agent,\n model: strategy.implement.builder.model,\n prompt,\n target,\n repoRoot: ROOT,\n branchName,\n ...(resolution.mode === \"new\" ? { baseRef: resolution.baseRef } : {}),\n sandbox: config.sandbox,\n autoApprove: true,\n timeoutMs: EXECUTION_TIMEOUT_MS,\n ...(resolution.worktreePath\n ? { worktreePath: resolution.worktreePath }\n : {}),\n artifacts: [runContextArtifact],\n logger,\n });\n\n if (!executionResult.success) {\n throw new Error(`Sandcastle failed: ${executionResult.error}`);\n }\n } else {\n executionResult = {\n success: true,\n branch: branchName,\n worktreePath: resolution.worktreePath!,\n commits: [],\n logPath: null,\n };\n }\n\n if (executionResult.worktreePath) {\n if (worktreeState) {\n updateWorktreeRunState(executionResult.worktreePath, {\n completedStages: { builder: true },\n });\n } else {\n writeWorktreeRunState(executionResult.worktreePath, {\n issueNumber,\n targetName: target.name,\n branchName,\n baseBranch: target.baseBranch,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n completedStages: { builder: true },\n review: { lifetimeIterations: 0 },\n });\n }\n }\n\n const finalWorktreeState = executionResult.worktreePath\n ? readWorktreeRunState(executionResult.worktreePath)\n : worktreeState;\n\n return {\n issue,\n target,\n branchName,\n worktreeState: finalWorktreeState,\n executionResult,\n };\n}\n\nexport async function advanceIssueRunReview(\n options: RunReviewLoopOptions\n): Promise<ReviewLoopResult> {\n const accumulatedRefactorPaths: string[] = [];\n\n const reviewResult = await runReviewWithRefactorLoop({\n ...options,\n onRefactorProgress: async (progress) => {\n if (progress.refactorArtifactPath) {\n accumulatedRefactorPaths.push(progress.refactorArtifactPath);\n }\n updateWorktreeRunState(options.worktreePath, {\n review: {\n lifetimeIterations: progress.lifetimeIterations,\n lastVerdict: progress.lastVerdict,\n lastArtifactPath: progress.lastArtifactPath,\n refactorCompletedForLastReview: true,\n },\n });\n },\n });\n\n updateWorktreeRunState(options.worktreePath, {\n review: {\n lifetimeIterations: reviewResult.lifetimeIterations,\n lastVerdict: reviewResult.verdict,\n lastArtifactPath: reviewResult.artifactPath,\n refactorCompletedForLastReview:\n reviewResult.refactorCompletedForLastReview,\n exhaustedPreviousRun:\n reviewResult.exhaustedMaxIterations ||\n reviewResult.verdict === \"FAIL\" ||\n undefined,\n refactorArtifactPaths:\n accumulatedRefactorPaths.length > 0\n ? accumulatedRefactorPaths\n : undefined,\n },\n });\n\n return reviewResult;\n}\n\nexport async function completeIssueRun(\n options: CompleteIssueRunOptions\n): Promise<RunIssueResult> {\n const {\n issueNumber,\n config,\n issueProvider,\n prProvider,\n executionProvider,\n logger,\n startResult,\n reviewArtifactPath,\n } = options;\n const ROOT = options.repoRoot;\n const { issue, target, branchName, worktreeState, executionResult } =\n startResult;\n const checkWaitOptions = {\n checksFoundTimeoutMs: config.checks.checksFoundTimeoutSeconds * 1000,\n checksCompletionTimeoutMs:\n config.checks.checksCompletionTimeoutSeconds * 1000,\n pollIntervalMs: config.checks.pollIntervalSeconds * 1000,\n };\n\n let mergeCompleted = false;\n\n try {\n if (\n executionResult.worktreePath &&\n !worktreeState?.finalCommit?.completed &&\n !worktreeState?.pr?.created &&\n !(await hasWorktreeChanges(\n executionResult.worktreePath,\n `origin/${target.baseBranch}`,\n logger\n ))\n ) {\n logger.step(\n \"info\",\n \"No worktree changes detected after review - closing issue\"\n );\n await closeNoOpIssue(issueProvider, issueNumber, config, logger);\n return {\n branchName,\n target,\n issue,\n noOp: true,\n };\n }\n\n let prTitle = issue.title;\n let prBody: string | undefined;\n let finalizerResult:\n | Awaited<ReturnType<typeof runFinalizerAgent>>\n | undefined;\n\n const finalizerFromState = worktreeState?.finalizer?.completed\n ? worktreeState.finalizer\n : null;\n if (finalizerFromState) {\n if (finalizerFromState.title && finalizerFromState.body) {\n prTitle = finalizerFromState.title;\n prBody = finalizerFromState.body;\n } else if (finalizerFromState.artifactPath) {\n if (!existsSync(finalizerFromState.artifactPath)) {\n throw new Error(\n `Finalizer artifact missing at ${finalizerFromState.artifactPath}`\n );\n }\n const artifactContent = readFileSync(\n finalizerFromState.artifactPath,\n \"utf-8\"\n );\n const parsed = parsePrDescription(artifactContent);\n prTitle = parsed.title;\n prBody = parsed.body;\n } else {\n throw new Error(\n \"Finalizer state is incomplete: missing title, body, and artifactPath\"\n );\n }\n } else {\n finalizerResult = await runFinalizerAgent({\n executionProvider,\n config,\n target,\n issue,\n builderBranch: branchName,\n worktreePath: executionResult.worktreePath,\n reviewArtifactPath,\n repoRoot: ROOT,\n logger,\n });\n prTitle = finalizerResult.title;\n prBody = finalizerResult.body;\n }\n\n prTitle = ensureConventionalPrTitle(\n prTitle,\n executionResult.commits.join(\"\\n\")\n );\n\n const finalBody = ensureClosingRefs(\n prBody ?? `Closes #${issue.number}`,\n issue.number\n );\n\n if (!finalizerFromState && executionResult.worktreePath) {\n updateWorktreeRunState(executionResult.worktreePath, {\n finalizer: {\n completed: true,\n artifactPath: finalizerResult!.artifactPath,\n title: prTitle,\n body: prBody,\n },\n });\n }\n\n const finalCommitFromState = worktreeState?.finalCommit?.completed;\n if (!finalCommitFromState) {\n await finalizeWorktreeCommit({\n worktreePath: executionResult.worktreePath,\n baseRef: `origin/${target.baseBranch}`,\n title: prTitle,\n body: finalBody,\n logger,\n });\n\n if (executionResult.worktreePath) {\n const revParse = await execCapture(\"git\", [\"rev-parse\", \"HEAD\"], {\n cwd: executionResult.worktreePath,\n logger,\n label: \"git rev-parse HEAD\",\n });\n updateWorktreeRunState(executionResult.worktreePath, {\n finalCommit: {\n completed: true,\n sha: revParse.stdout.trim(),\n },\n });\n }\n }\n\n let pr: Awaited<ReturnType<PRProvider[\"createPr\"]>>;\n\n if (worktreeState?.pr?.merged) {\n mergeCompleted = true;\n pr = {\n number: worktreeState.pr.number!,\n nodeId: \"\",\n url: worktreeState.pr.url!,\n title: prTitle,\n body: finalBody,\n headRefName: branchName,\n baseRefName: target.baseBranch,\n state: \"MERGED\",\n headRefOid: worktreeState.finalCommit?.sha ?? \"\",\n };\n } else {\n const prFromState =\n worktreeState?.pr?.created || finalCommitFromState\n ? await prProvider.getPr(branchName)\n : null;\n\n if (prFromState && prFromState.state === \"OPEN\") {\n pr = prFromState;\n } else {\n await execCapture(\"git\", [\"push\", \"-u\", \"origin\", branchName], {\n cwd: executionResult.worktreePath,\n logger,\n label: \"git push\",\n });\n\n pr = await prProvider.createPr({\n title: prTitle,\n body: finalBody,\n head: branchName,\n base: target.baseBranch,\n });\n\n if (executionResult.worktreePath) {\n updateWorktreeRunState(executionResult.worktreePath, {\n pr: {\n created: true,\n number: pr.number,\n url: pr.url,\n },\n });\n }\n }\n\n if (target.autoMerge === false) {\n await prProvider.waitForPrChecks(pr.number, checkWaitOptions);\n const transitions = makeIssueTransitions(issueProvider, config);\n await transitions.moveToReadyForHuman(issueNumber);\n return {\n branchName,\n target,\n issue,\n prNumber: pr.number,\n prUrl: pr.url,\n prTitle,\n prBody: finalBody,\n noOp: false,\n };\n }\n\n await issueProvider.addLabels(issueNumber, [\n config.labels.prOpenAwaitingMerge,\n ]);\n const coordinatorResult = await runMergeCoordinator({\n prProvider,\n logger,\n prNumber: pr.number,\n targetBranch: target.baseBranch,\n matchHeadCommit: pr.headRefOid,\n checkWaitOptions,\n autoMerge: true,\n pr,\n });\n\n if (coordinatorResult.stage === \"merge\") {\n throw coordinatorResult.error;\n }\n\n if (coordinatorResult.stage === \"target-green\") {\n try {\n await issueProvider.removeLabel(\n issueNumber,\n config.labels.prOpenAwaitingMerge\n );\n } catch (labelError) {\n logger.step(\n \"warn\",\n `Failed to remove ${config.labels.prOpenAwaitingMerge} label (cleanup): ${labelError instanceof Error ? labelError.message : String(labelError)}`\n );\n }\n throw coordinatorResult.error;\n }\n\n mergeCompleted = true;\n\n if (executionResult.worktreePath) {\n updateWorktreeRunState(executionResult.worktreePath, {\n pr: { merged: true, created: true },\n });\n }\n }\n\n if (worktreeState?.pr?.merged) {\n await waitForBranchChecks(prProvider, logger, {\n branchName: target.baseBranch,\n checksFoundTimeoutMs: checkWaitOptions.checksFoundTimeoutMs,\n checksCompletionTimeoutMs: checkWaitOptions.checksCompletionTimeoutMs,\n pollIntervalMs: checkWaitOptions.pollIntervalMs,\n });\n }\n\n await issueProvider.removeLabel(issueNumber, config.labels.agentInProgress);\n await issueProvider.removeLabel(\n issueNumber,\n config.labels.prOpenAwaitingMerge\n );\n\n let childCloseSucceeded = false;\n try {\n await issueProvider.closeIssue(issueNumber);\n childCloseSucceeded = true;\n } catch (error) {\n logger.step(\n \"warn\",\n `Issue #${issueNumber} could not be closed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (childCloseSucceeded) {\n await maybeCloseParentAfterChildCompletion(\n issueProvider,\n issueNumber,\n logger\n );\n }\n\n return {\n branchName,\n target,\n issue,\n prNumber: pr.number,\n prUrl: pr.url,\n prTitle,\n prBody: finalBody,\n noOp: false,\n };\n } catch (error) {\n if (mergeCompleted) {\n try {\n await issueProvider.removeLabel(\n issueNumber,\n config.labels.prOpenAwaitingMerge\n );\n } catch {\n // Ignore cleanup errors when removing label after merge\n }\n }\n throw error;\n }\n}\n\nexport async function failIssueRun(\n options: FailIssueRunOptions\n): Promise<void> {\n const { issueProvider, issueNumber, config, logger, error } = options;\n await transitionIssueToFailureState(\n issueProvider,\n issueNumber,\n config,\n typeof error === \"string\" ? error : error.message,\n logger\n );\n}\n\nexport interface HumanHandoffOptions {\n issueProvider: IssueProvider;\n issueNumber: number;\n config: PourkitConfig;\n logger: PourkitLogger;\n reviewResult: ReviewLoopResult;\n}\n\nexport async function transitionIssueToHumanHandoff(\n options: HumanHandoffOptions\n): Promise<void> {\n const { issueProvider, issueNumber, config, logger, reviewResult } = options;\n\n const transitions = makeIssueTransitions(issueProvider, config);\n await transitions.moveToReadyForHuman(issueNumber);\n\n const summary = extractHumanHandoffSummary(reviewResult.output);\n const refactorDir = getRefactorArtifactDir(reviewResult.artifactPath);\n\n const comment = [\n \"Pourkit stopped the review/refactor loop because human input is needed.\",\n \"\",\n summary,\n \"\",\n \"Artifacts:\",\n `- Review: ${reviewResult.artifactPath}`,\n `- Refactors: ${refactorDir}`,\n ].join(\"\\n\");\n\n await issueProvider.commentIssue(issueNumber, comment);\n\n logger.step(\"info\", `Issue ${issueNumber} transitioned to human handoff`);\n}\n\nfunction extractHumanHandoffSummary(artifactContent: string): string {\n const lines = artifactContent.split(\"\\n\");\n let inSummary = false;\n const summaryLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith(\"## Human Handoff Summary\")) {\n inSummary = true;\n continue;\n }\n if (inSummary) {\n if (line.startsWith(\"## \")) {\n break;\n }\n summaryLines.push(line);\n }\n }\n return (\n summaryLines.join(\"\\n\").trim() || \"(No Human Handoff Summary provided)\"\n );\n}\n\nfunction getRefactorArtifactDir(artifactPath: string): string {\n return artifactPath\n .replace(/\\/reviewers\\//, \"/refactors/\")\n .replace(/\\/[^/]+$/, \"\");\n}\n\nasync function finalizeWorktreeCommit(options: {\n worktreePath: string;\n baseRef: string;\n title: string;\n body: string;\n logger: PourkitLogger;\n}) {\n const { worktreePath, baseRef, title, body, logger } = options;\n\n await syncRemoteBaseRef(worktreePath, baseRef, logger);\n\n try {\n await execCapture(\"git\", [\"merge-base\", \"--is-ancestor\", baseRef, \"HEAD\"], {\n cwd: worktreePath,\n logger,\n label: \"git merge-base --is-ancestor\",\n });\n } catch {\n throw new Error(\n `Cannot finalize stale worktree: ${baseRef} is not an ancestor of HEAD. Refresh the branch onto the latest target base before creating the final commit.`\n );\n }\n\n await execCapture(\"git\", [\"reset\", \"--soft\", baseRef], {\n cwd: worktreePath,\n logger,\n label: \"git reset\",\n });\n\n await execCapture(\"git\", [\"add\", \"-A\"], {\n cwd: worktreePath,\n logger,\n label: \"git add\",\n });\n\n await execCapture(\"git\", [\"commit\", \"--no-verify\", \"-m\", title, \"-m\", body], {\n cwd: worktreePath,\n logger,\n label: \"git commit\",\n });\n}\n\nasync function syncRemoteBaseRef(\n worktreePath: string,\n baseRef: string,\n logger: PourkitLogger\n) {\n const remoteBase = parseRemoteBaseRef(baseRef);\n if (!remoteBase) {\n return;\n }\n\n await execCapture(\"git\", [\"fetch\", remoteBase.remote, remoteBase.branch], {\n cwd: worktreePath,\n logger,\n label: \"git fetch target\",\n });\n}\n\nfunction parseRemoteBaseRef(baseRef: string): {\n remote: string;\n branch: string;\n} | null {\n const [remote, ...branchParts] = baseRef.split(\"/\");\n const branch = branchParts.join(\"/\");\n if (!remote || !branch) {\n return null;\n }\n return { remote, branch };\n}\n\nfunction makeIssueTransitions(\n provider: IssueProvider,\n config: PourkitConfig\n): IssueTransitionsContract {\n return createIssueTransitions(\n {\n fetchIssue: provider.fetchIssue.bind(provider),\n addLabels: provider.addLabels.bind(provider),\n removeLabel: provider.removeLabel.bind(provider),\n closeIssue: provider.closeIssue.bind(provider),\n },\n {\n blocked: config.labels.blocked,\n readyForAgent: config.labels.readyForAgent,\n needsTriage: config.labels.needsTriage,\n agentInProgress: config.labels.agentInProgress,\n readyForHuman: config.labels.readyForHuman,\n prOpenAwaitingMerge: config.labels.prOpenAwaitingMerge,\n }\n );\n}\n\nasync function transitionIssueToFailureState(\n provider: IssueProvider,\n issueNumber: number,\n config: PourkitConfig,\n errorMessage: string,\n logger: PourkitLogger\n) {\n const transitions = makeIssueTransitions(provider, config);\n await transitions.moveToReadyForHuman(issueNumber);\n\n logger.step(\n \"error\",\n `Issue ${issueNumber} transitioned to ${config.labels.readyForHuman}: ${errorMessage}`\n );\n}\n\nasync function hasWorktreeChanges(\n worktreePath: string,\n baseRef: string,\n logger: PourkitLogger\n): Promise<boolean> {\n const diffResult = await execCapture(\n \"git\",\n [\"diff\", \"--name-only\", baseRef, \"--\"],\n {\n cwd: worktreePath,\n logger,\n label: \"git diff --name-only\",\n }\n );\n if (diffResult.stdout.trim().length > 0) {\n return true;\n }\n\n const statusResult = await execCapture(\n \"git\",\n [\"status\", \"--porcelain\", \"--untracked-files=all\"],\n {\n cwd: worktreePath,\n logger,\n label: \"git status --porcelain\",\n }\n );\n return statusResult.stdout.trim().length > 0;\n}\n\nasync function closeNoOpIssue(\n provider: IssueProvider,\n issueNumber: number,\n config: PourkitConfig,\n logger: PourkitLogger\n): Promise<void> {\n const transitions = makeIssueTransitions(provider, config);\n\n let closeSucceeded = false;\n try {\n await transitions.closeCompleted(issueNumber);\n closeSucceeded = true;\n logger.step(\"info\", `Issue #${issueNumber} closed (no changes required)`);\n } catch (error) {\n logger.step(\n \"warn\",\n `Issue #${issueNumber} could not be closed: ${error instanceof Error ? error.message : String(error)}`\n );\n logger.step(\n \"info\",\n `Issue #${issueNumber} completed with no changes required`\n );\n }\n\n if (closeSucceeded) {\n await maybeCloseParentAfterChildCompletion(provider, issueNumber, logger);\n }\n}\n\nasync function maybeCloseParentAfterChildCompletion(\n provider: IssueProvider,\n issueNumber: number,\n logger: PourkitLogger\n): Promise<void> {\n try {\n const issue = await provider.fetchIssue(issueNumber);\n const parsed = parseStackedIssue(issue.title, issue.body);\n if (!parsed.parentRef) return;\n if (parsed.warnings.length > 0) return;\n\n const parent = await provider.resolveIssueByCanonicalRef(parsed.parentRef);\n if (!parent) return;\n if (parent.state !== \"open\") return;\n\n const siblings = await provider.listRelatedIssues(parsed.parentRef);\n const openSiblings = siblings.filter(\n (s) => s.number !== issueNumber && s.state === \"open\"\n );\n if (openSiblings.length > 0) return;\n\n await provider.closeIssue(parent.number);\n logger.step(\n \"info\",\n `Parent PRD #${parent.number} closed (last child completed)`\n );\n } catch (error) {\n logger.step(\n \"warn\",\n `Parent completion check failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function resetLocalBranchState(\n root: string,\n branchName: string,\n logger: PourkitLogger\n): Promise<void> {\n const worktreeList = await execCapture(\n \"git\",\n [\"worktree\", \"list\", \"--porcelain\"],\n { cwd: root, logger, label: \"git worktree list\" }\n );\n\n const existingWorktreePath = resolveRegisteredIssueWorktreePath(\n worktreeList.stdout,\n root,\n branchName\n );\n\n if (existingWorktreePath) {\n logger.step(\"git\", `removing existing worktree: ${existingWorktreePath}`);\n await execCapture(\n \"git\",\n [\"worktree\", \"remove\", \"--force\", existingWorktreePath],\n {\n cwd: root,\n logger,\n label: \"git worktree remove\",\n }\n );\n }\n\n let branchExists = false;\n try {\n await execCapture(\n \"git\",\n [\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${branchName}`],\n { cwd: root, logger, label: \"git branch exists\" }\n );\n branchExists = true;\n } catch {\n // No local branch to delete.\n }\n\n if (branchExists) {\n logger.step(\"git\", `deleting local branch: ${branchName}`);\n await execCapture(\"git\", [\"branch\", \"-D\", branchName], {\n cwd: root,\n logger,\n label: \"git branch -D\",\n });\n }\n}\n\nasync function resolveIssueWorktree(\n root: string,\n branchName: string,\n baseBranch: string,\n logger: PourkitLogger\n): Promise<IssueWorktreeResolution> {\n const worktreeList = await execCapture(\n \"git\",\n [\"worktree\", \"list\", \"--porcelain\"],\n {\n cwd: root,\n logger,\n label: \"git worktree list\",\n }\n );\n\n const existingWorktreePath = resolveRegisteredIssueWorktreePath(\n worktreeList.stdout,\n root,\n branchName\n );\n\n if (existingWorktreePath) {\n const baseRef = await syncTargetBranch(root, baseBranch, logger);\n return {\n mode: \"existing-worktree\",\n branchName,\n baseRef,\n worktreePath: existingWorktreePath,\n };\n }\n\n let branchExists = false;\n try {\n await execCapture(\n \"git\",\n [\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${branchName}`],\n {\n cwd: root,\n logger,\n label: \"git branch exists\",\n }\n );\n branchExists = true;\n } catch {\n // No local branch to resume from.\n }\n\n if (branchExists) {\n const worktreePath = issueWorktreePath(root, branchName);\n await execCapture(\"git\", [\"worktree\", \"add\", worktreePath, branchName], {\n cwd: root,\n logger,\n label: \"git worktree add\",\n });\n const baseRef = await syncTargetBranch(root, baseBranch, logger);\n return {\n mode: \"existing-branch\",\n branchName,\n baseRef,\n worktreePath,\n };\n }\n\n const baseRef = await syncTargetBranch(root, baseBranch, logger);\n return { mode: \"new\", branchName, baseRef };\n}\n\nfunction issueWorktreePath(root: string, branchName: string): string {\n return join(root, \".sandcastle\", \"worktrees\", branchName.replace(/\\//g, \"-\"));\n}\n\nfunction resolveRegisteredIssueWorktreePath(\n worktreeListPorcelain: string,\n root: string,\n branchName: string\n): string | null {\n const branchWorktreePath = parseWorktreeListPorcelain(\n worktreeListPorcelain,\n branchName\n );\n if (branchWorktreePath) return branchWorktreePath;\n\n const expectedWorktreePath = issueWorktreePath(root, branchName);\n const entries = worktreeListPorcelain.trim().split(\"\\n\\n\");\n for (const entry of entries) {\n if (\n entry\n .trim()\n .split(\"\\n\")\n .some((line) => line === `worktree ${expectedWorktreePath}`)\n ) {\n return expectedWorktreePath;\n }\n }\n\n return null;\n}\n\nasync function syncTargetBranch(\n root: string,\n baseBranch: string,\n logger: PourkitLogger\n): Promise<string> {\n logger.step(\"git\", `syncing target branch: ${baseBranch}`);\n await execCapture(\"git\", [\"fetch\", \"origin\", baseBranch], {\n cwd: root,\n logger,\n label: \"git fetch target\",\n });\n return `origin/${baseBranch}`;\n}\n\nfunction loadBuilderPrompt(repoRoot: string, promptTemplate: string): string {\n const promptPath = resolvePromptTemplatePath(repoRoot, promptTemplate);\n const promptBody = existsSync(promptPath)\n ? readFileSync(promptPath, \"utf-8\")\n : promptTemplate;\n\n return appendProtectedWorkGuidance(`${promptBody}\n\n## Shared Run Context\n\nRead the selected issue requirements, comments, branch context, validation commands, and artifact paths from: ${RUN_CONTEXT_PATH_IN_WORKTREE}`);\n}\n","import type { IssueData } from \"../shared/config\";\nimport { slugify } from \"../shared/common\";\n\nexport function renderBranchName(template: string, issue: IssueData): string {\n return renderTemplate(template, issue);\n}\n\nfunction renderTemplate(template: string, issue: IssueData): string {\n const issueSlug = slugify(issue.title);\n\n return template\n .replace(/\\{\\{issue\\.number\\}\\}/g, String(issue.number))\n .replace(/\\{\\{issue\\.title\\}\\}/g, issue.title)\n .replace(/\\{\\{issue\\.body\\}\\}/g, issue.body)\n .replace(/\\{\\{issue\\.slug\\}\\}/g, issueSlug)\n .replace(/\\{\\{issue\\.state\\}\\}/g, issue.state);\n}\n","import type { PourkitStage } from \"../execution/execution-provider\";\nimport { getVerificationCommands, type IssueData, type Target } from \"./config\";\n\nexport const RUN_CONTEXT_PATH_IN_WORKTREE = \".pourkit/.tmp/run-context.md\";\n\nexport type RunContextSection =\n | \"issue\"\n | \"comments\"\n | \"branch\"\n | \"verification-commands\"\n | \"review-criteria\"\n | \"artifacts\";\n\nexport const ALL_RUN_CONTEXT_SECTIONS: RunContextSection[] = [\n \"issue\",\n \"comments\",\n \"branch\",\n \"verification-commands\",\n \"review-criteria\",\n \"artifacts\",\n];\n\nexport const STAGE_SECTIONS: Record<PourkitStage, RunContextSection[]> = {\n builder: [\n \"issue\",\n \"comments\",\n \"branch\",\n \"verification-commands\",\n \"artifacts\",\n ],\n reviewer: [\n \"issue\",\n \"comments\",\n \"branch\",\n \"verification-commands\",\n \"review-criteria\",\n \"artifacts\",\n ],\n refactor: [\n \"issue\",\n \"comments\",\n \"branch\",\n \"verification-commands\",\n \"review-criteria\",\n \"artifacts\",\n ],\n finalizer: [\n \"issue\",\n \"comments\",\n \"branch\",\n \"verification-commands\",\n \"review-criteria\",\n \"artifacts\",\n ],\n conflictResolution: [\n \"issue\",\n \"comments\",\n \"branch\",\n \"verification-commands\",\n \"artifacts\",\n ],\n};\n\nexport interface RunContextOptions {\n issue: IssueData;\n target: Target;\n branchName: string;\n reviewerCriteria?: string[];\n sections?: RunContextSection[];\n}\n\nexport interface ExecutionArtifact {\n path: string;\n content: string;\n}\n\nexport function buildRunContextArtifact(\n options: RunContextOptions\n): ExecutionArtifact {\n return {\n path: RUN_CONTEXT_PATH_IN_WORKTREE,\n content: buildRunContextMarkdown(options),\n };\n}\n\nexport function buildRunContextMarkdown(options: RunContextOptions): string {\n const {\n issue,\n target,\n branchName,\n reviewerCriteria = [],\n sections = ALL_RUN_CONTEXT_SECTIONS,\n } = options;\n\n const parts: string[] = [\"# Pourkit Run Context\", \"\"];\n\n if (sections.includes(\"issue\")) {\n parts.push(\n \"## Issue\",\n \"\",\n `- Number: #${issue.number}`,\n `- Title: ${issue.title}`,\n \"\",\n \"### Body\",\n \"\",\n issue.body.trim() || \"(empty issue body)\",\n \"\"\n );\n }\n\n if (sections.includes(\"comments\")) {\n parts.push(\"## Comments\", \"\");\n\n if (issue.comments.length === 0) {\n parts.push(\"(none)\", \"\");\n } else {\n parts.push(\n ...issue.comments.flatMap((comment, index) => [\n `### Comment ${index + 1}`,\n \"\",\n comment.trim() || \"(empty comment)\",\n \"\",\n ])\n );\n }\n }\n\n if (sections.includes(\"branch\")) {\n parts.push(\n \"## Branch\",\n \"\",\n `- Base: ${target.baseBranch}`,\n `- Working Branch: ${branchName}`,\n \"\"\n );\n }\n\n if (sections.includes(\"verification-commands\")) {\n parts.push(\n ...renderCommandList(\n getVerificationCommands(target),\n \"Verification Commands\"\n )\n );\n }\n\n if (sections.includes(\"review-criteria\")) {\n parts.push(...renderCriteria(reviewerCriteria));\n }\n\n if (sections.includes(\"artifacts\")) {\n parts.push(\n \"## Artifacts\",\n \"\",\n \"- Shared run context: `.pourkit/.tmp/run-context.md`\",\n \"- Reviewer outputs dir: `.pourkit/.tmp/reviewers/`\",\n \"- Refactor outputs dir: `.pourkit/.tmp/refactors/`\",\n \"- Finalizer output: `.pourkit/.tmp/finalizer/agent-output.md`\",\n \"\"\n );\n }\n\n return parts.join(\"\\n\");\n}\n\nfunction renderCommandList(\n commands: ReturnType<typeof getVerificationCommands>,\n heading: string\n) {\n if (commands.length === 0) {\n return [`## ${heading}`, \"\", \"(none)\", \"\"];\n }\n\n return [\n `## ${heading}`,\n \"\",\n \"Run these commands from the repository root exactly as written. Do not substitute equivalent scripts from nested package.json files.\",\n \"\",\n ...commands.map((command) => `- ${command.label}: \\`${command.command}\\``),\n \"\",\n ];\n}\n\nfunction renderCriteria(criteria: string[]) {\n if (criteria.length === 0) {\n return [];\n }\n\n return [\n \"## Review Criteria\",\n \"\",\n ...criteria.map((criterion) => `- ${criterion}`),\n \"\",\n ];\n}\n","const PROTECTED_WORK_RULE =\n \"Do **not** revert, delete, or substantially strip already-landed protected sibling/base work unless the issue explicitly requires those files.\";\n\nexport function appendProtectedWorkGuidance(promptBody: string): string {\n return `${promptBody}\n\n## Hard Rule\n\n- ${PROTECTED_WORK_RULE}`;\n}\n","import { execCapture, type PourkitLogger } from \"../shared/common\";\nimport type { WorktreeRunState } from \"../shared/worktree-run-state\";\n\nexport type BaseRefreshResult =\n | { status: \"skipped-current\" }\n | { status: \"refreshed\" }\n | { status: \"conflicted\"; message: string; conflictedPaths: string[] }\n | {\n status: \"refused-published-history\";\n prNumber: number;\n prState: \"OPEN\" | \"CLOSED\" | \"MERGED\";\n };\n\nexport interface RefreshStaleIssueBranchOptions {\n worktreePath: string;\n baseBranch: string;\n localGitBaseRef: string;\n logger: PourkitLogger;\n prNumber?: number;\n prState?: \"OPEN\" | \"CLOSED\" | \"MERGED\";\n}\n\nexport async function isIssueBranchStale(\n worktreePath: string,\n baseBranch: string,\n logger: PourkitLogger\n): Promise<boolean> {\n try {\n await execCapture(\n \"git\",\n [\"merge-base\", \"--is-ancestor\", baseBranch, \"HEAD\"],\n {\n cwd: worktreePath,\n logger,\n label: \"git merge-base --is-ancestor\",\n }\n );\n return false;\n } catch {\n return true;\n }\n}\n\nexport async function refreshStaleIssueBranch(\n options: RefreshStaleIssueBranchOptions\n): Promise<BaseRefreshResult> {\n const {\n worktreePath,\n baseBranch,\n localGitBaseRef,\n logger,\n prNumber,\n prState,\n } = options;\n\n const stale = await isIssueBranchStale(worktreePath, localGitBaseRef, logger);\n if (!stale) {\n return { status: \"skipped-current\" };\n }\n\n if (prNumber !== undefined && prState !== undefined) {\n return {\n status: \"refused-published-history\",\n prNumber,\n prState,\n };\n }\n\n try {\n await execCapture(\"git\", [\"rebase\", \"--autostash\", localGitBaseRef], {\n cwd: worktreePath,\n logger,\n label: \"git rebase --autostash\",\n });\n return { status: \"refreshed\" };\n } catch (error) {\n let conflictedPaths: string[] = [];\n try {\n const statusResult = await execCapture(\"git\", [\"status\", \"--porcelain\"], {\n cwd: worktreePath,\n logger,\n label: \"git status\",\n });\n conflictedPaths = statusResult.stdout\n .split(\"\\n\")\n .filter((line) => /^(AA|DD|UU|AU|UA|DU|UD)\\s/.test(line))\n .map((line) => line.slice(3).trim())\n .filter(Boolean);\n } catch {\n // Not critical; leave empty if we can't read status\n }\n return {\n status: \"conflicted\",\n message: error instanceof Error ? error.message : String(error),\n conflictedPaths,\n };\n }\n}\n\nexport function invalidateAfterBaseRefresh(\n state: WorktreeRunState\n): WorktreeRunState {\n return {\n issueNumber: state.issueNumber,\n targetName: state.targetName,\n branchName: state.branchName,\n baseBranch: state.baseBranch,\n createdAt: state.createdAt,\n updatedAt: new Date().toISOString(),\n completedStages: {\n builder: state.completedStages.builder,\n },\n review: {\n lifetimeIterations: 0,\n },\n };\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { PourkitConfig, IssueData, Target } from \"../shared/config\";\nimport { resolvePromptTemplatePath } from \"../shared/config\";\nimport type { ExecutionProvider } from \"../execution/execution-provider\";\nimport { execCapture, type PourkitLogger } from \"../shared/common\";\nimport {\n buildRunContextArtifact,\n RUN_CONTEXT_PATH_IN_WORKTREE,\n STAGE_SECTIONS,\n} from \"../shared/run-context\";\nimport {\n ConflictResolutionArtifactProtocolError,\n parseConflictResolutionArtifact,\n} from \"../conflicts/conflict-resolution-artifact\";\n\nexport type ConflictResolutionRunResult =\n | { status: \"resolved\"; artifactPath: string; files: string[] }\n | { status: \"ambiguous\"; artifactPath: string; message: string }\n | { status: \"failed\"; artifactPath?: string; message: string };\n\nexport interface RunConflictResolutionOnceOptions {\n executionProvider: ExecutionProvider;\n config: PourkitConfig;\n target: Target;\n issue: IssueData;\n branchName: string;\n worktreePath: string;\n repoRoot: string;\n conflictedPaths: string[];\n attempt: number;\n logger: PourkitLogger;\n}\n\nfunction loadConflictResolutionPrompt(\n repoRoot: string,\n promptTemplate: string,\n artifactPath: string\n): string {\n const promptPath = resolvePromptTemplatePath(repoRoot, promptTemplate);\n const promptBody = existsSync(promptPath)\n ? readFileSync(promptPath, \"utf-8\")\n : promptTemplate;\n\n return `${promptBody}\n\n## Shared Run Context\n\nRead the selected issue requirements, comments, branch context, verification commands, and artifact paths from: ${RUN_CONTEXT_PATH_IN_WORKTREE}\n\n## Output\n\nWrite your resolution to: ${artifactPath}\n\nDo not provide a separate chat response. The runner only reads the file above.`;\n}\n\nexport async function runConflictResolutionOnce(\n options: RunConflictResolutionOnceOptions\n): Promise<ConflictResolutionRunResult> {\n const {\n executionProvider,\n config,\n target,\n issue,\n branchName,\n worktreePath,\n repoRoot,\n conflictedPaths,\n attempt,\n logger,\n } = options;\n\n const strategyCr = target.strategy.conflictResolution;\n if (!strategyCr) {\n return { status: \"failed\", message: \"No conflictResolution configured\" };\n }\n\n const artifactPath = `.pourkit/.tmp/conflict-resolution/attempt-${attempt}.md`;\n\n const prompt = loadConflictResolutionPrompt(\n repoRoot,\n strategyCr.promptTemplate,\n artifactPath\n );\n\n const runContextArtifact = buildRunContextArtifact({\n issue,\n target,\n branchName,\n sections: STAGE_SECTIONS.conflictResolution,\n });\n\n const executionResult = await executionProvider.execute({\n stage: \"conflictResolution\",\n agent: strategyCr.agent,\n model: strategyCr.model,\n prompt,\n target,\n repoRoot,\n branchName,\n sandbox: config.sandbox,\n autoApprove: true,\n worktreePath,\n artifactPath,\n artifacts: [runContextArtifact],\n logger,\n });\n\n if (!executionResult.success) {\n return {\n status: \"failed\",\n message:\n executionResult.error ?? \"Conflict resolution agent execution failed\",\n };\n }\n\n const fullArtifactPath = join(worktreePath, artifactPath);\n if (!existsSync(fullArtifactPath)) {\n return {\n status: \"failed\",\n artifactPath,\n message: \"Conflict resolution agent completed but did not write artifact\",\n };\n }\n\n let artifactContent: string;\n try {\n artifactContent = readFileSync(fullArtifactPath, \"utf-8\");\n } catch (error) {\n return {\n status: \"failed\",\n artifactPath,\n message: `Failed to read conflict resolution artifact: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n\n let parsed;\n try {\n parsed = parseConflictResolutionArtifact(artifactContent);\n } catch (error) {\n if (error instanceof ConflictResolutionArtifactProtocolError) {\n return {\n status: \"failed\",\n artifactPath,\n message: `Invalid conflict resolution artifact: ${error.message}`,\n };\n }\n throw error;\n }\n\n if (parsed.status === \"ambiguous\") {\n return {\n status: \"ambiguous\",\n artifactPath,\n message: parsed.summary,\n };\n }\n\n return {\n status: \"resolved\",\n artifactPath,\n files: parsed.files,\n };\n}\n\nconst CONFLICT_MARKER_PATTERN = /<<<<<<<|=======|>>>>>>>/m;\n\nexport async function hasUnresolvedConflictMarkers(\n worktreePath: string,\n files: string[]\n): Promise<boolean> {\n for (const file of files) {\n const filePath = join(worktreePath, file);\n try {\n const content = readFileSync(filePath, \"utf-8\");\n if (CONFLICT_MARKER_PATTERN.test(content)) {\n return true;\n }\n } catch {\n // File not found or unreadable — skip\n }\n }\n return false;\n}\n\nexport type ConflictResolutionLoopResult =\n | { status: \"completed\"; attempts: number }\n | { status: \"ambiguous\"; attempts: number; message: string }\n | { status: \"failed\"; attempts: number; message: string }\n | { status: \"exhausted\"; attempts: number; message: string };\n\nexport async function runConflictResolutionLoop(\n options: Omit<\n RunConflictResolutionOnceOptions,\n \"conflictedPaths\" | \"attempt\"\n > & {\n maxAttempts: number;\n initialConflictedPaths: string[];\n }\n): Promise<ConflictResolutionLoopResult> {\n const { worktreePath, maxAttempts, logger, initialConflictedPaths } = options;\n let attempt = 0;\n let conflictedPaths = initialConflictedPaths;\n\n while (attempt < maxAttempts && conflictedPaths.length > 0) {\n attempt++;\n\n const crResult = await runConflictResolutionOnce({\n ...options,\n conflictedPaths,\n attempt,\n });\n\n if (crResult.status !== \"resolved\") {\n const message =\n crResult.status === \"ambiguous\"\n ? crResult.message\n : (crResult.message ?? \"Conflict resolution agent execution failed\");\n return { status: crResult.status, attempts: attempt, message };\n }\n\n const markersRemain = await hasUnresolvedConflictMarkers(\n worktreePath,\n conflictedPaths\n );\n if (markersRemain) {\n return {\n status: \"ambiguous\",\n attempts: attempt,\n message:\n \"Conflict resolution agent resolved artifact but conflict markers remain in files\",\n };\n }\n\n await execCapture(\"git\", [\"add\", ...conflictedPaths], {\n cwd: worktreePath,\n logger,\n label: \"git add conflicted paths\",\n });\n\n try {\n await execCapture(\"git\", [\"rebase\", \"--continue\"], {\n cwd: worktreePath,\n logger,\n label: \"git rebase --continue\",\n });\n conflictedPaths = [];\n } catch (error) {\n const statusResult = await execCapture(\"git\", [\"status\", \"--porcelain\"], {\n cwd: worktreePath,\n logger,\n label: \"git status\",\n });\n conflictedPaths = statusResult.stdout\n .split(\"\\n\")\n .filter((line) => /^(AA|DD|UU|AU|UA|DU|UD)\\s/.test(line))\n .map((line) => line.slice(3).trim())\n .filter(Boolean);\n\n if (conflictedPaths.length === 0) {\n const rebaseErrorMessage =\n error instanceof Error ? error.message : String(error);\n return {\n status: \"failed\",\n attempts: attempt,\n message: `git rebase --continue failed with no remaining conflicts: ${rebaseErrorMessage}`,\n };\n }\n }\n }\n\n if (conflictedPaths.length > 0) {\n return {\n status: \"exhausted\",\n attempts: attempt,\n message: `Conflict resolution maxAttempts (${maxAttempts}) exhausted with remaining conflicts`,\n };\n }\n\n return { status: \"completed\", attempts: attempt };\n}\n","export type ConflictResolutionArtifactStatus = \"resolved\" | \"ambiguous\";\n\nexport interface ConflictResolutionVerificationRow {\n command: string;\n result: string;\n notes: string;\n}\n\nexport interface ConflictResolutionArtifact {\n status: ConflictResolutionArtifactStatus;\n summary: string;\n files: string[];\n verification?: ConflictResolutionVerificationRow[];\n raw: string;\n}\n\nexport class ConflictResolutionArtifactProtocolError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConflictResolutionArtifactProtocolError\";\n }\n}\n\nconst VALID_STATUSES: ConflictResolutionArtifactStatus[] = [\n \"resolved\",\n \"ambiguous\",\n];\n\nconst SECTION_HEADING_PATTERN = /^## (Status|Summary|Files|Verification)\\s*$/gm;\n\ninterface SectionMatch {\n heading: \"Status\" | \"Summary\" | \"Files\" | \"Verification\";\n startIndex: number;\n endIndex: number;\n}\n\nfunction extractSections(output: string): SectionMatch[] {\n const sections: SectionMatch[] = [];\n let match: RegExpExecArray | null;\n const re = new RegExp(SECTION_HEADING_PATTERN);\n while ((match = re.exec(output)) !== null) {\n const heading = match[1] as \"Status\" | \"Summary\" | \"Files\" | \"Verification\";\n sections.push({\n heading,\n startIndex: match.index,\n endIndex: match.index + match[0].length,\n });\n }\n return sections;\n}\n\nfunction contentAfter(\n output: string,\n sections: SectionMatch[],\n section: SectionMatch\n): string {\n const index = sections.indexOf(section);\n const nextSection = sections[index + 1];\n const start = section.endIndex;\n const end = nextSection?.startIndex ?? output.length;\n return output.slice(start, end).trim();\n}\n\nfunction extractMarker(output: string): string | null {\n const matches = output.matchAll(\n /<conflict-resolution>\\s*(resolved|ambiguous)\\s*<\\/conflict-resolution>/g\n );\n const results = Array.from(matches);\n if (results.length > 1) {\n throw new ConflictResolutionArtifactProtocolError(\n \"Duplicate <conflict-resolution>...</conflict-resolution> markers\"\n );\n }\n return results.length === 1 ? results[0][1] : null;\n}\n\nfunction parseFileList(filesContent: string): string[] {\n return filesContent\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.startsWith(\"- \"))\n .map((line) => {\n const rest = line.slice(2).trim();\n const codeMatch = rest.match(/^`([^`]+)`/);\n return codeMatch ? codeMatch[1] : rest;\n });\n}\n\nfunction parseVerificationTable(\n content: string\n): ConflictResolutionVerificationRow[] {\n const lines = content\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean);\n const tableLines = lines.filter((l) => l.startsWith(\"|\") && l.endsWith(\"|\"));\n\n // index 0 = heading row, index 1 = separator row, index 2+ = data rows\n const dataRows = tableLines.slice(2);\n\n return dataRows.map((row) => {\n const cells = row\n .split(\"|\")\n .slice(1, -1)\n .map((c) => c.trim());\n return {\n command: cells[0] ?? \"\",\n result: cells[1] ?? \"\",\n notes: cells[2] ?? \"\",\n };\n });\n}\n\nexport function parseConflictResolutionArtifact(\n output: string\n): ConflictResolutionArtifact {\n if (!output.trim()) {\n throw new ConflictResolutionArtifactProtocolError(\n \"Empty conflict resolution artifact output\"\n );\n }\n\n const sections = extractSections(output);\n\n const statusSections = sections.filter((s) => s.heading === \"Status\");\n const summarySections = sections.filter((s) => s.heading === \"Summary\");\n const filesSections = sections.filter((s) => s.heading === \"Files\");\n\n if (statusSections.length > 1) {\n throw new ConflictResolutionArtifactProtocolError(\n 'Duplicate \"## Status\" sections'\n );\n }\n if (summarySections.length > 1) {\n throw new ConflictResolutionArtifactProtocolError(\n 'Duplicate \"## Summary\" sections'\n );\n }\n if (filesSections.length > 1) {\n throw new ConflictResolutionArtifactProtocolError(\n 'Duplicate \"## Files\" sections'\n );\n }\n\n const verificationSections = sections.filter(\n (s) => s.heading === \"Verification\"\n );\n\n const statusSection = statusSections[0];\n const summarySection = summarySections[0];\n const filesSection = filesSections[0];\n\n if (!statusSection) {\n throw new ConflictResolutionArtifactProtocolError(\n 'Missing required section \"## Status\"'\n );\n }\n if (!summarySection) {\n throw new ConflictResolutionArtifactProtocolError(\n 'Missing required section \"## Summary\"'\n );\n }\n if (!filesSection) {\n throw new ConflictResolutionArtifactProtocolError(\n 'Missing required section \"## Files\"'\n );\n }\n\n const statusRaw = contentAfter(output, sections, statusSection);\n const summary = contentAfter(output, sections, summarySection);\n const filesContent = contentAfter(output, sections, filesSection);\n\n if (!statusRaw) {\n throw new ConflictResolutionArtifactProtocolError(\n '\"## Status\" section is empty'\n );\n }\n if (!summary) {\n throw new ConflictResolutionArtifactProtocolError(\n '\"## Summary\" section is empty'\n );\n }\n\n if (!VALID_STATUSES.includes(statusRaw as ConflictResolutionArtifactStatus)) {\n throw new ConflictResolutionArtifactProtocolError(\n `Unsupported status \"${statusRaw}\". Allowed statuses: ${VALID_STATUSES.join(\", \")}`\n );\n }\n\n const markerStatus = extractMarker(output);\n if (!markerStatus) {\n throw new ConflictResolutionArtifactProtocolError(\n \"Missing <conflict-resolution>...</conflict-resolution> marker\"\n );\n }\n\n if (markerStatus !== statusRaw) {\n throw new ConflictResolutionArtifactProtocolError(\n `Conflict resolution status \"${statusRaw}\" does not match marker \"${markerStatus}\"`\n );\n }\n\n let verification: ConflictResolutionVerificationRow[] | undefined;\n if (verificationSections.length > 0) {\n const verificationContent = contentAfter(\n output,\n sections,\n verificationSections[0]\n );\n verification = parseVerificationTable(verificationContent);\n }\n\n return {\n status: statusRaw as ConflictResolutionArtifactStatus,\n summary,\n files: parseFileList(filesContent),\n verification,\n raw: output,\n };\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport type { IssueData, PourkitConfig, Target } from \"../shared/config\";\nimport { resolvePromptTemplatePath } from \"../shared/config\";\nimport type { ExecutionProvider } from \"../execution/execution-provider\";\nimport {\n ensureConventionalPrTitle,\n parsePrDescription,\n PrDescriptionProtocolError,\n} from \"../pr/pr-description\";\nimport {\n collectFinalizerContext,\n buildFinalizerPrompt,\n} from \"../pr/pr-description-context\";\nimport type { PourkitLogger } from \"../shared/common\";\nimport { buildRunContextArtifact, STAGE_SECTIONS } from \"../shared/run-context\";\n\nexport interface RunFinalizerOptions {\n executionProvider: ExecutionProvider;\n config: PourkitConfig;\n target: Target;\n issue: IssueData;\n builderBranch: string;\n worktreePath: string;\n reviewArtifactPath?: string;\n repoRoot: string;\n logger: PourkitLogger;\n}\n\nexport interface RunFinalizerResult {\n title: string;\n body: string;\n artifactPath: string;\n}\n\nexport async function runFinalizerAgent(\n options: RunFinalizerOptions\n): Promise<RunFinalizerResult> {\n const {\n executionProvider,\n config,\n target,\n issue,\n builderBranch,\n worktreePath,\n reviewArtifactPath,\n repoRoot,\n logger,\n } = options;\n\n const strategy = target.strategy;\n const finalizer = strategy.finalize.prDescriptionAgent;\n\n const context = await collectFinalizerContext({\n targetBase: target.baseBranch,\n branchName: builderBranch,\n worktreePath,\n reviewArtifactPath,\n logger,\n });\n\n const resolvedPrompt = loadFinalizerPrompt(\n repoRoot,\n finalizer.promptTemplate\n );\n\n const prompt = buildFinalizerPrompt(context, resolvedPrompt);\n\n const artifactPathInWorktree = join(\n \".pourkit\",\n \".tmp\",\n \"finalizer\",\n \"agent-output.md\"\n );\n const artifactPath = join(worktreePath, artifactPathInWorktree);\n\n prepareArtifactPath(artifactPath);\n\n let output = \"\";\n let parsed: ReturnType<typeof parsePrDescription> | undefined;\n let lastValidationError: Error | undefined;\n\n for (let attempt = 1; attempt <= strategy.finalize.maxAttempts; attempt++) {\n logger.step(\n \"info\",\n `Running finalizer agent (${attempt}/${strategy.finalize.maxAttempts})`\n );\n\n const executionResult = await executionProvider.execute({\n stage: \"finalizer\",\n agent: finalizer.agent,\n model: finalizer.model,\n prompt,\n target,\n repoRoot,\n branchName: builderBranch,\n sandbox: config.sandbox,\n autoApprove: true,\n artifactPath: artifactPathInWorktree,\n worktreePath,\n artifacts: [\n buildRunContextArtifact({\n issue,\n target,\n branchName: builderBranch,\n reviewerCriteria: strategy.review.reviewer.criteria,\n sections: STAGE_SECTIONS.finalizer,\n }),\n ],\n logger,\n });\n\n if (!executionResult.success) {\n throw new Error(\n `Finalizer agent execution failed: ${executionResult.error}`\n );\n }\n\n try {\n output = readAgentOutput(artifactPath);\n parsed = parsePrDescription(output);\n lastValidationError = undefined;\n break;\n } catch (error) {\n lastValidationError =\n error instanceof PrDescriptionProtocolError\n ? new Error(`Finalizer protocol error: ${error.message}`)\n : error instanceof Error\n ? error\n : new Error(String(error));\n if (attempt === strategy.finalize.maxAttempts) {\n break;\n }\n prepareArtifactPath(artifactPath);\n }\n }\n\n if (!parsed) {\n throw lastValidationError ?? new Error(\"Finalizer validation failed\");\n }\n\n await persistGeneratedArtifact(worktreePath, output);\n const title = ensureConventionalPrTitle(parsed.title, context.commits);\n\n logger.step(\"info\", \"Finalizer output generated successfully\");\n\n return {\n title,\n body: parsed.body,\n artifactPath,\n };\n}\n\nfunction loadFinalizerPrompt(repoRoot: string, promptTemplate: string): string {\n const promptPath = resolvePromptTemplatePath(repoRoot, promptTemplate);\n if (existsSync(promptPath)) {\n return readFileSync(promptPath, \"utf-8\");\n }\n return promptTemplate;\n}\n\nfunction prepareArtifactPath(artifactPath: string) {\n mkdirSync(dirname(artifactPath), { recursive: true });\n if (existsSync(artifactPath)) {\n rmSync(artifactPath);\n }\n}\n\nfunction readAgentOutput(artifactPath: string): string {\n if (!existsSync(artifactPath)) {\n throw new Error(\n `Finalizer agent did not produce output at ${artifactPath}`\n );\n }\n const output = readFileSync(artifactPath, \"utf-8\");\n if (!output.trim()) {\n throw new Error(`Finalizer agent produced empty output at ${artifactPath}`);\n }\n return output;\n}\n\nasync function persistGeneratedArtifact(worktreePath: string, output: string) {\n try {\n const dir = join(worktreePath, \".pourkit\", \".tmp\", \"finalizer\");\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, \"generated.md\"), output, \"utf-8\");\n } catch {\n // Do not fail pipeline on artifact write errors\n }\n}\n","export interface PrDescription {\n title: string;\n body: string;\n}\n\nconst CONVENTIONAL_TITLE_PATTERN =\n /^(feat|fix|perf|refactor|docs|test|chore|ci|build)(\\([^)]+\\))?!?:\\s+\\S/;\n\nexport class PrDescriptionProtocolError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PrDescriptionProtocolError\";\n }\n}\n\nconst SECTION_HEADING_PATTERN = /^## (PR Title|PR Body)\\s*$/gm;\n\ninterface SectionMatch {\n heading: \"PR Title\" | \"PR Body\";\n startIndex: number;\n endIndex: number;\n}\n\nfunction extractSections(output: string): SectionMatch[] {\n const sections: SectionMatch[] = [];\n let match: RegExpExecArray | null;\n\n const re = new RegExp(SECTION_HEADING_PATTERN);\n while ((match = re.exec(output)) !== null) {\n const heading = match[1] as \"PR Title\" | \"PR Body\";\n sections.push({\n heading,\n startIndex: match.index,\n endIndex: match.index + match[0].length,\n });\n }\n\n return sections;\n}\n\nfunction contentAfter(\n output: string,\n sections: SectionMatch[],\n section: SectionMatch\n): string {\n const index = sections.indexOf(section);\n const nextSection = sections[index + 1];\n const start = section.endIndex;\n const end = nextSection?.startIndex ?? output.length;\n return output.slice(start, end).trim();\n}\n\nexport function parsePrDescription(output: string): PrDescription {\n const sections = extractSections(output);\n\n const titleSections = sections.filter((s) => s.heading === \"PR Title\");\n const bodySections = sections.filter((s) => s.heading === \"PR Body\");\n\n if (titleSections.length === 0) {\n throw new PrDescriptionProtocolError(\n 'Missing required section \"## PR Title\"'\n );\n }\n if (titleSections.length > 1) {\n throw new PrDescriptionProtocolError(\n `Duplicate \"## PR Title\" sections found (${titleSections.length})`\n );\n }\n if (bodySections.length === 0) {\n throw new PrDescriptionProtocolError(\n 'Missing required section \"## PR Body\"'\n );\n }\n if (bodySections.length > 1) {\n throw new PrDescriptionProtocolError(\n `Duplicate \"## PR Body\" sections found (${bodySections.length})`\n );\n }\n\n const title = contentAfter(output, sections, titleSections[0]);\n const body = contentAfter(output, sections, bodySections[0]);\n\n if (title.length === 0) {\n throw new PrDescriptionProtocolError('\"## PR Title\" section is empty');\n }\n if (body.length === 0) {\n throw new PrDescriptionProtocolError('\"## PR Body\" section is empty');\n }\n\n return { title, body };\n}\n\nexport function ensureConventionalPrTitle(\n title: string,\n commitSummaries: string\n): string {\n const trimmedTitle = title.trim();\n const normalizedTitle =\n trimmedTitle.match(/^`([^`]+)`$/)?.[1] ?? trimmedTitle;\n if (CONVENTIONAL_TITLE_PATTERN.test(normalizedTitle)) {\n return normalizedTitle;\n }\n\n const inferredType = inferConventionalType(commitSummaries) ?? \"chore\";\n return `${inferredType}: ${normalizedTitle}`;\n}\n\nfunction inferConventionalType(commitSummaries: string): string | null {\n for (const line of commitSummaries.split(\"\\n\")) {\n const subject = line.trim().replace(/^[0-9a-f]+\\s+/, \"\");\n const match = subject.match(CONVENTIONAL_TITLE_PATTERN);\n if (match) {\n return match[1];\n }\n }\n\n return null;\n}\n","import { join } from \"path\";\nimport { readFile } from \"node:fs/promises\";\nimport { execCapture, type PourkitLogger } from \"../shared/common\";\nimport { RUN_CONTEXT_PATH_IN_WORKTREE } from \"../shared/run-context\";\n\nexport interface FinalizerContext {\n commits: string;\n reviewArtifact: string;\n targetBase: string;\n branchName: string;\n}\n\nexport interface CollectContextOptions {\n targetBase: string;\n branchName: string;\n worktreePath: string;\n reviewArtifactPath?: string;\n logger: PourkitLogger;\n}\n\nexport async function collectFinalizerContext(\n options: CollectContextOptions\n): Promise<FinalizerContext> {\n const { targetBase, branchName, worktreePath, reviewArtifactPath, logger } =\n options;\n\n const commits = await collectCommitRange(\n targetBase,\n branchName,\n worktreePath,\n logger\n );\n const reviewArtifact = reviewArtifactPath\n ? await readReviewArtifact(reviewArtifactPath)\n : \"(no review artifact provided)\";\n\n return {\n commits,\n reviewArtifact,\n targetBase,\n branchName,\n };\n}\n\nasync function collectCommitRange(\n targetBase: string,\n branchName: string,\n worktreePath: string,\n logger: PourkitLogger\n): Promise<string> {\n const result = await execCapture(\n \"git\",\n [\n \"log\",\n `${remoteTargetBase(targetBase)}..${branchName}`,\n \"--oneline\",\n \"--no-decorate\",\n ],\n { cwd: worktreePath, logger, label: \"git log\" }\n );\n\n const commits = result.stdout.trim();\n if (!commits) {\n logger.step(\n \"warn\",\n `No commits found between ${targetBase} and ${branchName}, proceeding with empty commit range`\n );\n }\n return commits;\n}\n\nfunction remoteTargetBase(targetBase: string): string {\n return targetBase.includes(\"/\") ? targetBase : `origin/${targetBase}`;\n}\n\nasync function readReviewArtifact(artifactPath: string): Promise<string> {\n let content: string;\n try {\n content = await readFile(artifactPath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(\n `Review artifact not found at ${artifactPath}. Ensure the review stage completed before running finalizer generation.`\n );\n }\n throw error;\n }\n\n if (!content.trim()) {\n throw new Error(\n `Review artifact at ${artifactPath} is empty. Ensure the review stage produced output before running finalizer generation.`\n );\n }\n\n return content;\n}\n\nexport function buildFinalizerPrompt(\n context: FinalizerContext,\n promptTemplate: string\n): string {\n const artifactPathInWorktree = join(\n \".pourkit\",\n \".tmp\",\n \"finalizer\",\n \"agent-output.md\"\n );\n\n return `${promptTemplate}\n\n## Shared Run Context\n\nRead the selected issue requirements, branch context, validation commands, and artifact paths from: ${RUN_CONTEXT_PATH_IN_WORKTREE}\n\n## Branch Context\n\n**Target Base**: ${context.targetBase}\n**Branch**: ${context.branchName}\n\n## Commits\n\n${context.commits || \"(no commits in range)\"}\n\n## Review Artifact\n\n${context.reviewArtifact}\n\n## Output\n\nGenerate a PR title and body that accurately summarize the changes for this issue.\nFormat your output with \"## PR Title\" and \"## PR Body\" sections.\n\nInside \"## PR Body\", use the following canonical structure:\n\n## Summary\n\n- Why this branch exists.\n- What outcome this branch delivers.\n\n## Changes\n\n- Final net change 1.\n- Final net change 2.\n\nRules:\n- Use bullet points only inside both inner sections (no prose paragraphs or commit lists).\n- Use final-state wording (describe what the code does after this PR, not what changed during development).\n- Do not include commit chronology or a list of commit messages.\n- Closing policy: For Issue-backed runs, publish exactly one closing reference for the current Issue (e.g. \"Closes #123\"). Never close parent PRDs, sibling Issues, or unrelated Issues. Omit the closing footer when no Issue is attached.\n\nWrite your finalizer output to: ${artifactPathInWorktree}`;\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport const DEFAULT_MANUAL_PR_BODY = `## Summary\n\n- Summarize why this branch exists.\n\n## Changes\n\n- Summarize the final net change in this branch.`;\n\nexport interface PrBodyOptions {\n body?: string;\n bodyFile?: string;\n issue?: number;\n}\n\nexport interface PrBodyInput {\n defaultBody: string;\n options: PrBodyOptions;\n}\n\nexport async function buildPrBody(input: PrBodyInput): Promise<string> {\n const { defaultBody, options } = input;\n\n let bodyText = await resolveBodyText(defaultBody, options);\n\n bodyText = appendClosingRef(bodyText, options.issue);\n\n return bodyText;\n}\n\nexport function ensureClosingRefs(body: string, issue?: number): string {\n const stripped = stripClosingRefs(body || \"\");\n if (issue === undefined) {\n return stripped;\n }\n if (!stripped) {\n return `Closes #${issue}`;\n }\n return `${stripped}\\n\\nCloses #${issue}`;\n}\n\nfunction stripClosingRefs(body: string): string {\n // Strip whole lines that consist of an optional bullet prefix plus a closing-keyword issue ref\n const linePattern =\n /^[ \\t]*[-*+]\\s+(?:close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved)\\s*:?\\s*#\\d+\\s*$/gim;\n let result = body.replace(linePattern, \"\");\n\n // Strip remaining inline closing refs\n const inlinePattern =\n /(?:close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved)\\s*:?\\s*#\\d+/gi;\n result = result.replace(inlinePattern, \"\").trimEnd();\n\n return result;\n}\n\nasync function resolveBodyText(\n defaultBody: string,\n options: PrBodyOptions\n): Promise<string> {\n if (options.body && options.bodyFile) {\n throw new Error(\"--body and --body-file cannot be used together\");\n }\n\n if (options.body !== undefined) {\n return options.body;\n }\n\n if (options.bodyFile !== undefined) {\n return await readFile(options.bodyFile, \"utf-8\");\n }\n\n return defaultBody;\n}\n\nfunction appendClosingRef(body: string, issue?: number): string {\n if (issue === undefined) {\n return body;\n }\n\n const existingRefs = extractClosingRefs(body);\n\n if (existingRefs.has(issue)) {\n return body;\n }\n\n return `${body}\\n\\nCloses #${issue}`;\n}\n\nfunction extractClosingRefs(body: string): Set<number> {\n const refs = new Set<number>();\n const pattern =\n /(?:close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved)\\s*:?\\s*#(\\d+)/gi;\n let match;\n\n while ((match = pattern.exec(body)) !== null) {\n refs.add(parseInt(match[1], 10));\n }\n\n return refs;\n}\n","import type { PRProvider } from \"../providers/pr-provider\";\nimport { sleep } from \"../shared/common\";\nimport type { PourkitLogger } from \"../shared/common\";\n\nconst RED_CHECK_CONCLUSIONS = new Set([\n \"FAILURE\",\n \"CANCELLED\",\n \"TIMED_OUT\",\n \"STARTUP_FAILURE\",\n \"ACTION_REQUIRED\",\n \"STALE\",\n]);\n\nexport interface WaitForBranchChecksOptions {\n branchName: string;\n checksFoundTimeoutMs?: number;\n checksCompletionTimeoutMs?: number;\n pollIntervalMs?: number;\n stableHeadMs?: number;\n}\n\nexport async function waitForBranchChecks(\n prProvider: PRProvider,\n logger: PourkitLogger,\n options: WaitForBranchChecksOptions\n): Promise<void> {\n const checksFoundTimeoutMs = options.checksFoundTimeoutMs ?? 60 * 1000;\n const checksCompletionTimeoutMs =\n options.checksCompletionTimeoutMs ?? 5 * 60 * 1000;\n const pollIntervalMs = options.pollIntervalMs ?? 15 * 1000;\n const stableHeadMs = options.stableHeadMs ?? pollIntervalMs;\n\n let lastHeadSha = \"\";\n let headStableSince = 0;\n let checksFoundDeadline = 0;\n let checksCompletionDeadline = 0;\n let checksDiscovered = false;\n\n logger.step(\"wait\", `waiting for ${options.branchName} to be green`);\n\n while (true) {\n const observedAt = Date.now();\n const status = await prProvider.getBranchStatus(options.branchName);\n\n if (status.headSha !== lastHeadSha) {\n logger.step(\n \"info\",\n `branch head changed to ${status.headSha.substring(0, 7)}`\n );\n lastHeadSha = status.headSha;\n headStableSince = observedAt;\n if (checksFoundDeadline === 0) {\n checksFoundDeadline = observedAt + checksFoundTimeoutMs;\n }\n checksCompletionDeadline = 0;\n checksDiscovered = false;\n }\n\n if (status.checks.length > 0 && !checksDiscovered) {\n checksDiscovered = true;\n checksCompletionDeadline = observedAt + checksCompletionTimeoutMs;\n logger.step(\"info\", `Checks: ${formatChecks(status.checks)}`);\n }\n\n if (status.state === \"red\") {\n const failedChecks = status.checks\n .filter(\n (c) =>\n c.conclusion !== null && RED_CHECK_CONCLUSIONS.has(c.conclusion)\n )\n .map((c) => c.name)\n .join(\", \");\n throw new Error(\n `Target branch ${options.branchName} is red: ${failedChecks}`\n );\n }\n\n if (status.state === \"green\") {\n const stableForMs = observedAt - headStableSince;\n if (stableForMs < stableHeadMs) {\n logger.step(\n \"info\",\n `target branch is green; waiting for stable head (${stableForMs}/${stableHeadMs}ms)`\n );\n await sleep(pollIntervalMs);\n continue;\n }\n\n logger.step(\"success\", `target branch ${options.branchName} is green`);\n return;\n }\n\n const stableForMs = observedAt - headStableSince;\n if (!checksDiscovered && status.checks.length === 0) {\n if (observedAt >= checksFoundDeadline) {\n if (stableForMs >= stableHeadMs) {\n logger.step(\n \"success\",\n `target branch ${options.branchName} has no checks`\n );\n return;\n }\n\n throw new Error(\n `Timeout waiting for ${options.branchName} to be green`\n );\n }\n\n logger.step(\n \"info\",\n `target branch has no checks yet, waiting... (${secondsRemaining(checksFoundDeadline, observedAt)}s remaining)`\n );\n await sleep(pollIntervalMs);\n continue;\n }\n\n if (checksDiscovered) {\n if (observedAt >= checksCompletionDeadline) {\n throw new Error(\n `Timeout waiting for ${options.branchName} to be green`\n );\n }\n\n logger.step(\n \"info\",\n `target branch is ${status.state}, waiting... (${secondsRemaining(checksCompletionDeadline, observedAt)}s remaining)`\n );\n await sleep(pollIntervalMs);\n continue;\n }\n\n logger.step(\n \"info\",\n `target branch is ${status.state}, waiting... (${secondsRemaining(checksFoundDeadline, observedAt)}s remaining)`\n );\n await sleep(pollIntervalMs);\n }\n}\n\nfunction formatChecks(\n checks: { name: string; conclusion: string | null; status: string | null }[]\n) {\n return checks\n .map((check) => `${check.name}=${check.conclusion ?? check.status}`)\n .join(\", \");\n}\n\nfunction secondsRemaining(deadline: number, observedAt: number) {\n return Math.max(0, Math.ceil((deadline - observedAt) / 1000));\n}\n","import type {\n MergePrOptions,\n PRProvider,\n PullRequest,\n WaitForPrChecksOptions,\n} from \"../providers/pr-provider\";\nimport type { PourkitLogger } from \"../shared/common\";\nimport { waitForBranchChecks } from \"./target-green\";\n\nexport interface MergeCoordinatorOptions {\n prProvider: PRProvider;\n logger: PourkitLogger;\n prNumber: number;\n targetBranch: string;\n matchHeadCommit: string;\n checkWaitOptions: WaitForPrChecksOptions;\n autoMerge?: boolean;\n pr?: PullRequest;\n method?: MergePrOptions[\"method\"];\n waitForTargetGreen?: boolean;\n}\n\nexport type MergeCoordinatorResult =\n | { stage: \"completed\"; merged: true }\n | { stage: \"merge\"; merged: false; error: Error }\n | { stage: \"target-green\"; merged: true; error: Error };\n\nexport async function runMergeCoordinator(\n options: MergeCoordinatorOptions\n): Promise<MergeCoordinatorResult> {\n const {\n prProvider,\n logger,\n prNumber,\n targetBranch,\n matchHeadCommit,\n checkWaitOptions,\n } = options;\n const method = options.method ?? \"squash\";\n const waitForTargetGreen = options.waitForTargetGreen ?? true;\n\n try {\n await prProvider.waitForPrChecks(prNumber, checkWaitOptions);\n } catch (error) {\n return {\n stage: \"merge\" as const,\n merged: false as const,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n\n try {\n await prProvider.mergePr(prNumber, {\n method,\n matchHeadCommit,\n });\n } catch (error) {\n return {\n stage: \"merge\" as const,\n merged: false as const,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n\n if (waitForTargetGreen) {\n try {\n await waitForBranchChecks(prProvider, logger, {\n branchName: targetBranch,\n checksFoundTimeoutMs: checkWaitOptions.checksFoundTimeoutMs,\n checksCompletionTimeoutMs: checkWaitOptions.checksCompletionTimeoutMs,\n pollIntervalMs: checkWaitOptions.pollIntervalMs,\n });\n } catch (error) {\n return {\n stage: \"target-green\" as const,\n merged: true as const,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n return { stage: \"completed\" as const, merged: true as const };\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n rmSync,\n writeFileSync,\n} from \"fs\";\nimport { dirname, join } from \"path\";\nimport {\n type IssueData,\n type PourkitConfig,\n type Target,\n resolvePromptTemplatePath,\n} from \"../shared/config\";\nimport type { ExecutionProvider } from \"../execution/execution-provider\";\nimport {\n parseReviewVerdict,\n type ReviewVerdict,\n ReviewVerdictProtocolError,\n} from \"../pr/review-verdict\";\nimport { type PourkitLogger } from \"../shared/common\";\nimport {\n RUN_CONTEXT_PATH_IN_WORKTREE,\n buildRunContextArtifact,\n STAGE_SECTIONS,\n} from \"../shared/run-context\";\nimport { appendProtectedWorkGuidance } from \"../shared/prompt-guidance\";\n\nexport interface ReviewResult {\n verdict: ReviewVerdict;\n output: string;\n artifactPath: string;\n}\n\nexport interface RunReviewOptions {\n executionProvider: ExecutionProvider;\n config: PourkitConfig;\n target: Target;\n issue: IssueData;\n builderBranch: string;\n worktreePath: string;\n repoRoot: string;\n logger: PourkitLogger;\n iteration?: number;\n reviewHistory?: string[];\n priorRefactorArtifacts?: string;\n humanHandoffResolved?: boolean;\n priorReviewerArtifacts?: string;\n}\n\nexport class ReviewArtifactValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ReviewArtifactValidationError\";\n }\n}\n\nexport class RefactorArtifactValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RefactorArtifactValidationError\";\n }\n}\n\nconst ALLOWED_REFACTOR_CLASSIFICATIONS = [\n \"accepted\",\n \"rejected\",\n \"deferred\",\n \"blocked\",\n];\n\nfunction normalizeRefactorClassification(raw: string): string {\n const match = raw.match(/^`(accepted|rejected|deferred|blocked)`$/);\n return match?.[1] ?? raw;\n}\n\nexport function extractLatestFindingIds(\n reviewOutput: string,\n iteration: number\n): string[] {\n const findingsSection =\n reviewOutput.split(\"## Findings\")[1]?.split(\"##\")[0] ?? \"\";\n const currentIterationIdRegex = new RegExp(`^R${iteration}\\\\.F\\\\d+$`);\n const ids: string[] = [];\n\n const rows = findingsSection.split(\"\\n\");\n let isHeaderRow = true;\n for (const row of rows) {\n const trimmed = row.trim();\n if (!trimmed.startsWith(\"|\")) continue;\n if (/^\\|[\\s-:|]+$/.test(trimmed)) {\n isHeaderRow = false;\n continue;\n }\n if (isHeaderRow) {\n isHeaderRow = false;\n continue;\n }\n const cells = trimmed\n .split(\"|\")\n .map((c) => c.trim())\n .filter((c) => c !== \"\");\n if (cells.length === 0) continue;\n if (cells[0].toLowerCase() === \"none\" || cells[0].toLowerCase() === \"n/a\")\n continue;\n if (currentIterationIdRegex.test(cells[0])) {\n ids.push(cells[0]);\n }\n }\n\n return ids;\n}\n\nexport function validateRefactorArtifact(\n artifactPath: string,\n findingIds: string[]\n): void {\n if (!existsSync(artifactPath)) {\n throw new RefactorArtifactValidationError(\n `Refactor artifact missing at ${artifactPath}`\n );\n }\n\n const content = readFileSync(artifactPath, \"utf-8\");\n\n if (!content.trim()) {\n throw new RefactorArtifactValidationError(\"Refactor artifact is empty\");\n }\n\n const requiredSections = [\n \"## Finding Responses\",\n \"## Verification\",\n \"## Open Blockers\",\n ];\n for (const section of requiredSections) {\n const sectionRegex = new RegExp(`^${section}\\\\s*$`, \"m\");\n if (!sectionRegex.test(content)) {\n throw new RefactorArtifactValidationError(\n `Refactor artifact missing required section: ${section}`\n );\n }\n }\n\n if (findingIds.length === 0) return;\n\n const findingResponsesSection =\n content.split(\"## Finding Responses\")[1]?.split(\"##\")[0] ?? \"\";\n\n for (const findingId of findingIds) {\n const rows = findingResponsesSection.split(\"\\n\");\n let found = false;\n for (const row of rows) {\n const trimmed = row.trim();\n if (!trimmed.startsWith(\"|\")) continue;\n if (/^\\|[\\s-:|]+$/.test(trimmed)) continue;\n\n const cells = trimmed\n .split(\"|\")\n .map((c) => c.trim())\n .filter((c) => c !== \"\");\n if (cells.length < 2) continue;\n\n if (cells[0] === findingId) {\n const classification = normalizeRefactorClassification(cells[1]);\n if (!ALLOWED_REFACTOR_CLASSIFICATIONS.includes(classification)) {\n throw new RefactorArtifactValidationError(\n `Invalid classification for finding ${findingId}: \"${cells[1]}\". Allowed: ${ALLOWED_REFACTOR_CLASSIFICATIONS.join(\", \")}`\n );\n }\n found = true;\n break;\n }\n }\n\n if (!found) {\n throw new RefactorArtifactValidationError(\n `Refactor artifact missing response for finding: ${findingId}`\n );\n }\n }\n}\n\nexport function validateReviewArtifact(\n output: string,\n verdict: ReviewVerdict,\n iteration: number,\n priorRefactorArtifactsProvided: boolean = false\n): void {\n if (!output.includes(\"## Findings\")) {\n throw new ReviewArtifactValidationError(\n \"Reviewer output must include a ## Findings section\"\n );\n }\n\n const findingsSection = output.split(\"## Findings\")[1]?.split(\"##\")[0] ?? \"\";\n\n if (!findingsSection.trim()) {\n throw new ReviewArtifactValidationError(\n \"Findings section must contain a table with ID and Supersedes columns\"\n );\n }\n\n const hasIdColumn = /^\\|?\\s*ID\\s+\\|/m.test(findingsSection);\n if (!hasIdColumn) {\n throw new ReviewArtifactValidationError(\n \"Findings table must include an ID column\"\n );\n }\n\n const hasSupersedesColumn = /^\\|?\\s*ID\\s+\\|\\s*Supersedes\\s+\\|/m.test(\n findingsSection\n );\n if (!hasSupersedesColumn) {\n throw new ReviewArtifactValidationError(\n \"Findings table must include a Supersedes column\"\n );\n }\n\n const findingIdRegex = /^R\\d+\\.F\\d+$/;\n const currentIterationIdRegex = new RegExp(`^R${iteration}\\\\.F\\\\d+$`);\n const supersedesIdRegex = /^R\\d+\\.F\\d+$/;\n const rows = findingsSection.split(\"\\n\");\n let isHeaderRow = true;\n for (const row of rows) {\n const trimmed = row.trim();\n if (!trimmed.startsWith(\"|\")) continue;\n if (/^\\|[\\s-:|]+$/.test(trimmed)) {\n isHeaderRow = false;\n continue;\n }\n if (isHeaderRow) {\n isHeaderRow = false;\n continue;\n }\n const cells = trimmed\n .split(\"|\")\n .map((c) => c.trim())\n .filter((c) => c !== \"\");\n if (cells.length === 0) continue;\n if (cells[0].toLowerCase() === \"none\" || cells[0].toLowerCase() === \"n/a\")\n continue;\n const idCell = cells[0];\n if (!currentIterationIdRegex.test(idCell)) {\n throw new ReviewArtifactValidationError(\n `Finding ID must match R${iteration}.F{number} format for iteration ${iteration}`\n );\n }\n const supersedesCell = cells[1];\n if (\n supersedesCell !== \"-\" &&\n supersedesCell !== \"n/a\" &&\n !supersedesIdRegex.test(supersedesCell)\n ) {\n throw new ReviewArtifactValidationError(\n `Supersedes must be a hyphen for new findings or a valid finding ID, got: ${supersedesCell}`\n );\n }\n }\n\n if (verdict === \"NEEDS_HUMAN\") {\n if (!output.includes(\"## Human Handoff Summary\")) {\n throw new ReviewArtifactValidationError(\n \"NEEDS_HUMAN verdict requires a Human Handoff Summary section\"\n );\n }\n if (!output.includes(\"## Human Handoff Reason\")) {\n throw new ReviewArtifactValidationError(\n \"NEEDS_HUMAN verdict requires a Human Handoff Reason section\"\n );\n }\n }\n\n if (priorRefactorArtifactsProvided) {\n if (!output.includes(\"## Prior Refactor Response Assessment\")) {\n throw new ReviewArtifactValidationError(\n \"Prior Refactor Artifacts were provided but the review is missing a ## Prior Refactor Response Assessment section\"\n );\n }\n }\n}\n\nexport async function runReviewCommand(\n options: RunReviewOptions\n): Promise<ReviewResult> {\n const {\n executionProvider,\n config,\n target,\n issue,\n builderBranch,\n worktreePath,\n repoRoot,\n logger,\n iteration,\n reviewHistory,\n priorRefactorArtifacts,\n humanHandoffResolved,\n priorReviewerArtifacts,\n } = options;\n\n const reviewer = target.strategy.review.reviewer;\n if (!reviewer) {\n throw new Error(\"No reviewer config found\");\n }\n\n const artifactPathInWorktree = join(\n \".pourkit\",\n \".tmp\",\n \"reviewers\",\n `iteration-${iteration ?? 1}.md`\n );\n const artifactPath = join(worktreePath, artifactPathInWorktree);\n\n prepareReviewArtifactPath(artifactPath);\n\n const prompt = buildReviewerPrompt(\n repoRoot,\n reviewer.promptTemplate,\n reviewer.criteria,\n artifactPathInWorktree,\n iteration ?? 1,\n reviewHistory,\n priorRefactorArtifacts,\n humanHandoffResolved,\n priorReviewerArtifacts\n );\n\n logger.step(\"info\", \"Running reviewer\");\n\n const executionResult = await executionProvider.execute({\n stage: \"reviewer\",\n iteration,\n agent: reviewer.agent,\n model: reviewer.model,\n prompt,\n target,\n repoRoot,\n branchName: builderBranch,\n sandbox: config.sandbox,\n autoApprove: true,\n artifactPath: artifactPathInWorktree,\n worktreePath,\n artifacts: [\n buildRunContextArtifact({\n issue,\n target,\n branchName: builderBranch,\n reviewerCriteria: reviewer.criteria,\n sections: STAGE_SECTIONS.reviewer,\n }),\n ],\n logger,\n });\n\n if (!executionResult.success) {\n throw new Error(`Reviewer execution failed: ${executionResult.error}`);\n }\n\n const output = readReviewArtifact(artifactPath, executionResult.logPath);\n\n let verdict: ReviewVerdict;\n\n try {\n verdict = parseReviewVerdict(output);\n } catch (error) {\n if (error instanceof ReviewVerdictProtocolError) {\n throw new Error(`Review protocol error: ${error.message}`);\n }\n throw error;\n }\n\n logger.step(\"info\", `Review verdict: ${verdict}`);\n\n validateReviewArtifact(\n output,\n verdict,\n iteration ?? 1,\n !!priorRefactorArtifacts\n );\n\n return { verdict, output, artifactPath };\n}\n\nfunction buildReviewerPrompt(\n repoRoot: string,\n promptTemplate: string,\n criteria: string[],\n artifactPathInWorktree: string,\n iteration: number,\n reviewHistory: string[] = [],\n priorRefactorArtifacts?: string,\n humanHandoffResolved?: boolean,\n priorReviewerArtifacts?: string\n): string {\n const criteriaBlock = renderReviewCriteria(repoRoot, criteria);\n const { content: renderedTemplate, hasCriteriaPlaceholder } =\n loadReviewerPromptTemplate(repoRoot, promptTemplate, criteriaBlock);\n const priorRefactorBlock = priorRefactorArtifacts\n ? `${priorRefactorArtifacts}`\n : \"\";\n const priorReviewerBlock = priorReviewerArtifacts\n ? `${priorReviewerArtifacts}`\n : \"\";\n const humanHandoffBoundary = humanHandoffResolved\n ? `## Human-Resolved Handoff Boundary\n\nA prior review emitted \\`NEEDS_HUMAN\\` and stopped the agent loop. The issue has since been moved back to \\`ready-for-agent\\`.\n\nBefore carrying forward old blockers, inspect newer issue comments and the current worktree. Treat prior Reviewer and Refactor Artifacts as historical context, not active findings unless they still apply.\n\n`\n : \"\";\n return `${renderedTemplate}\n\n## Shared Run Context\n\nRead the selected issue requirements, branch context, validation commands, and artifact paths from: ${RUN_CONTEXT_PATH_IN_WORKTREE}\n\n${\n hasCriteriaPlaceholder\n ? \"\"\n : `## Review Criteria\n\n${criteriaBlock}\n\n`\n}${humanHandoffBoundary}${priorReviewerBlock}${renderReviewHistory(reviewHistory)}${priorRefactorBlock}## Output\n\nWrite your review to: ${artifactPathInWorktree}\n\nDo not provide a separate chat response. The runner only reads the file above.\n\nEnd the file with exactly one wrapped verdict token: <verdict>PASS</verdict>, <verdict>PASS_WITH_NOTES</verdict>, <verdict>NEEDS_REFACTOR</verdict>, <verdict>FAIL</verdict>, or <verdict>NEEDS_HUMAN</verdict>. The verdict token must appear exactly once in the output.\n\nFindings must include an ID column with values in the format R${iteration}.F{findingNumber} (e.g., R${iteration}.F1, R${iteration}.F2) and a Supersedes column referencing the finding ID being superseded (or a hyphen for new findings).\n\nWhen verdict is NEEDS_HUMAN, include Human Handoff Summary and Human Handoff Reason sections before the final verdict token.`;\n}\n\nfunction renderReviewHistory(reviewHistory: string[]): string {\n if (reviewHistory.length === 0) {\n return \"\";\n }\n\n return `## Review History\n\n${reviewHistory\n .map((entry, index) => `### Iteration ${index + 1}\\n\\n${entry.trimEnd()}`)\n .join(\"\\n\\n\")}\n\n`;\n}\n\nexport function renderPriorRefactorArtifacts(\n worktreePath: string,\n currentIteration: number\n): string {\n const refactorsDir = join(worktreePath, \".pourkit\", \".tmp\", \"refactors\");\n\n if (!existsSync(refactorsDir)) {\n return \"\";\n }\n\n const files = readdirSync(refactorsDir);\n const iterationFiles: { num: number; content: string }[] = [];\n\n for (const file of files) {\n const match = file.match(/^iteration-(\\d+)\\.md$/);\n if (match) {\n const num = parseInt(match[1], 10);\n if (num < currentIteration) {\n const filePath = join(refactorsDir, file);\n try {\n const content = readFileSync(filePath, \"utf-8\");\n if (content.trim()) {\n iterationFiles.push({ num, content });\n }\n } catch {\n // Skip unreadable files\n }\n }\n }\n }\n\n if (iterationFiles.length === 0) {\n return \"\";\n }\n\n iterationFiles.sort((a, b) => a.num - b.num);\n\n const iterationsBlocks = iterationFiles\n .map((f) => `### Refactor Iteration ${f.num}\\n\\n${f.content.trimEnd()}`)\n .join(\"\\n\\n\");\n\n return `## Prior Refactor Artifacts\n\nTreat these as conversational context, not source of truth. Inspect the current code independently.\n\n${iterationsBlocks}\n\n`;\n}\n\nfunction renderPriorReviewerArtifacts(\n worktreePath: string,\n currentIteration: number\n): string {\n const reviewersDir = join(worktreePath, \".pourkit\", \".tmp\", \"reviewers\");\n\n if (!existsSync(reviewersDir)) {\n return \"\";\n }\n\n const files = readdirSync(reviewersDir);\n const iterationFiles: { num: number; content: string }[] = [];\n\n for (const file of files) {\n const match = file.match(/^iteration-(\\d+)\\.md$/);\n if (match) {\n const num = parseInt(match[1], 10);\n if (num < currentIteration) {\n const filePath = join(reviewersDir, file);\n try {\n const content = readFileSync(filePath, \"utf-8\");\n if (content.trim()) {\n iterationFiles.push({ num, content });\n }\n } catch {\n // Skip unreadable files\n }\n }\n }\n }\n\n if (iterationFiles.length === 0) {\n return \"\";\n }\n\n iterationFiles.sort((a, b) => a.num - b.num);\n\n const iterationsBlocks = iterationFiles\n .map((f) => `### Reviewer Iteration ${f.num}\\n\\n${f.content.trimEnd()}`)\n .join(\"\\n\\n\");\n\n return `## Prior Reviewer Artifacts\n\nA prior review was resolved by a human. These artifacts are historical context from before the handoff. Treat them as background, not active findings.\n\n${iterationsBlocks}\n\n`;\n}\n\nfunction loadReviewerPromptTemplate(\n repoRoot: string,\n promptTemplate: string,\n criteriaBlock: string\n): { content: string; hasCriteriaPlaceholder: boolean } {\n const promptTemplatePath = resolvePromptTemplatePath(\n repoRoot,\n promptTemplate\n );\n const promptBody = existsSync(promptTemplatePath)\n ? readFileSync(promptTemplatePath, \"utf-8\")\n : promptTemplate;\n const hasCriteriaPlaceholder = promptBody.includes(\"{{REVIEW_CRITERIA}}\");\n\n return {\n content: promptBody.replace(/\\{\\{REVIEW_CRITERIA\\}\\}/g, criteriaBlock),\n hasCriteriaPlaceholder,\n };\n}\n\nfunction renderReviewCriteria(repoRoot: string, criteria: string[]): string {\n return criteria\n .map((criterion) => {\n const snippetPath = join(\n repoRoot,\n \".pourkit\",\n \"prompts\",\n `reviewer-${criterion}.snippet.md`\n );\n\n if (existsSync(snippetPath)) {\n return readFileSync(snippetPath, \"utf-8\").trimEnd();\n }\n\n return `- ${criterion}`;\n })\n .join(\"\\n\\n\");\n}\n\nfunction prepareReviewArtifactPath(artifactPath: string) {\n mkdirSync(dirname(artifactPath), { recursive: true });\n if (existsSync(artifactPath)) {\n rmSync(artifactPath);\n }\n}\n\nfunction recoverReviewOutputFromLog(logPath: string): string | null {\n if (!existsSync(logPath)) {\n return null;\n }\n\n const logContent = readFileSync(logPath, \"utf-8\");\n const startIndex = logContent.indexOf(\"## Findings\");\n\n if (startIndex === -1) {\n return null;\n }\n\n const verdictMatch = logContent\n .slice(startIndex)\n .match(\n /<verdict>(PASS|PASS_WITH_NOTES|NEEDS_REFACTOR|FAIL|NEEDS_HUMAN)<\\/verdict>/\n );\n\n if (!verdictMatch || verdictMatch.index === undefined) {\n return null;\n }\n\n const recoveredOutput = logContent\n .slice(startIndex, startIndex + verdictMatch.index + verdictMatch[0].length)\n .trim();\n\n return recoveredOutput.length > 0 ? recoveredOutput : null;\n}\n\nfunction readReviewArtifact(\n artifactPath: string,\n logPath?: string | null\n): string {\n if (existsSync(artifactPath)) {\n const output = readFileSync(artifactPath, \"utf-8\");\n if (output.trim()) {\n return output;\n }\n }\n\n const recoveredOutput = logPath ? recoverReviewOutputFromLog(logPath) : null;\n\n if (recoveredOutput) {\n writeFileSync(artifactPath, recoveredOutput, \"utf-8\");\n return recoveredOutput;\n }\n\n if (!existsSync(artifactPath)) {\n throw new Error(`Reviewer did not produce output at ${artifactPath}`);\n }\n\n throw new Error(`Reviewer produced empty output at ${artifactPath}`);\n}\n\nexport type ReviewLoopVerdict =\n | \"PASS\"\n | \"PASS_WITH_NOTES\"\n | \"FAIL\"\n | \"NEEDS_HUMAN\";\n\nexport interface ReviewLoopResult {\n verdict: ReviewLoopVerdict;\n output: string;\n artifactPath: string;\n iterations: number;\n exhaustedMaxIterations: boolean;\n lifetimeIterations: number;\n refactorCompletedForLastReview: boolean;\n refactorArtifactPaths?: string[];\n}\n\nexport interface RunReviewLoopOptions {\n executionProvider: ExecutionProvider;\n config: PourkitConfig;\n target: Target;\n issue: IssueData;\n builderBranch: string;\n worktreePath: string;\n repoRoot: string;\n logger: PourkitLogger;\n startingLifetimeIteration?: number;\n humanHandoffResolved?: boolean;\n onRefactorProgress?: (progress: {\n lifetimeIterations: number;\n lastVerdict: ReviewVerdict;\n lastArtifactPath: string;\n refactorArtifactPath?: string;\n }) => void | Promise<void>;\n}\n\nexport async function runReviewWithRefactorLoop(\n options: RunReviewLoopOptions\n): Promise<ReviewLoopResult> {\n const {\n executionProvider,\n config,\n target,\n issue,\n builderBranch,\n worktreePath,\n repoRoot,\n logger,\n startingLifetimeIteration = 0,\n humanHandoffResolved,\n } = options;\n\n const strategy = target.strategy;\n const reviewer = strategy.review.reviewer;\n if (!reviewer) {\n throw new Error(\"No reviewer config found\");\n }\n const refactorer = strategy.review.refactor;\n if (!refactorer) {\n throw new Error(\"No refactorer config found\");\n }\n const maxIterations = strategy.review.maxIterations;\n const passWithNotesRefactorAttempts =\n strategy.review.passWithNotesRefactorAttempts;\n let resolvedStartingIteration = startingLifetimeIteration;\n {\n const reviewersDir = join(worktreePath, \".pourkit\", \".tmp\", \"reviewers\");\n try {\n const files = readdirSync(reviewersDir);\n let maxExistingIteration = 0;\n for (const file of files) {\n const match = file.match(/^iteration-(\\d+)\\.md$/);\n if (match) {\n const num = parseInt(match[1], 10);\n if (num > maxExistingIteration) {\n maxExistingIteration = num;\n }\n }\n }\n if (maxExistingIteration > resolvedStartingIteration) {\n resolvedStartingIteration = maxExistingIteration;\n }\n } catch {\n // Directory may not exist yet\n }\n }\n\n const accumulatedRefactorPaths: string[] = [];\n let iteration = 0;\n let lastResult: ReviewResult | null = null;\n const reviewHistory: string[] = [];\n let passWithNotesRefactorAttemptsRemaining = passWithNotesRefactorAttempts;\n const priorReviewerArtifacts = humanHandoffResolved\n ? renderPriorReviewerArtifacts(\n worktreePath,\n resolvedStartingIteration + 1\n ) || undefined\n : undefined;\n\n while (iteration < maxIterations) {\n iteration++;\n const lifetimeIteration = resolvedStartingIteration + iteration;\n logger.step(\"info\", `Review iteration ${lifetimeIteration}`);\n\n const priorRefactorArtifacts = renderPriorRefactorArtifacts(\n worktreePath,\n lifetimeIteration\n );\n\n const reviewResult = await runReviewCommand({\n executionProvider,\n config,\n target,\n issue,\n builderBranch,\n worktreePath,\n repoRoot,\n logger,\n iteration: lifetimeIteration,\n priorRefactorArtifacts: priorRefactorArtifacts || undefined,\n humanHandoffResolved,\n priorReviewerArtifacts,\n reviewHistory:\n reviewer.includeReviewHistory && reviewHistory.length > 0\n ? [...reviewHistory]\n : undefined,\n });\n\n lastResult = reviewResult;\n reviewHistory.push(reviewResult.output);\n\n await persistIterationArtifact(\n worktreePath,\n reviewResult.output,\n lifetimeIteration\n );\n\n if (reviewResult.verdict === \"PASS\") {\n return {\n verdict: reviewResult.verdict,\n output: reviewResult.output,\n artifactPath: reviewResult.artifactPath,\n iterations: iteration,\n lifetimeIterations: lifetimeIteration,\n exhaustedMaxIterations: false,\n refactorCompletedForLastReview: false,\n refactorArtifactPaths:\n accumulatedRefactorPaths.length > 0\n ? accumulatedRefactorPaths\n : undefined,\n };\n }\n\n if (\n reviewResult.verdict === \"PASS_WITH_NOTES\" &&\n passWithNotesRefactorAttemptsRemaining === 0\n ) {\n logger.step(\n \"info\",\n \"PASS_WITH_NOTES refactor attempts exhausted, treating as PASS\"\n );\n return {\n verdict: \"PASS\",\n output: reviewResult.output,\n artifactPath: reviewResult.artifactPath,\n iterations: iteration,\n lifetimeIterations: lifetimeIteration,\n exhaustedMaxIterations: false,\n refactorCompletedForLastReview: false,\n refactorArtifactPaths:\n accumulatedRefactorPaths.length > 0\n ? accumulatedRefactorPaths\n : undefined,\n };\n }\n\n if (reviewResult.verdict === \"PASS_WITH_NOTES\") {\n passWithNotesRefactorAttemptsRemaining--;\n logger.step(\n \"info\",\n `PASS_WITH_NOTES refactor attempts remaining: ${passWithNotesRefactorAttemptsRemaining}`\n );\n }\n\n if (reviewResult.verdict === \"NEEDS_HUMAN\") {\n logger.step(\"info\", \"NEEDS_HUMAN verdict, stopping review loop\");\n return {\n verdict: \"NEEDS_HUMAN\",\n output: reviewResult.output,\n artifactPath: reviewResult.artifactPath,\n iterations: iteration,\n lifetimeIterations: lifetimeIteration,\n exhaustedMaxIterations: false,\n refactorCompletedForLastReview: false,\n refactorArtifactPaths:\n accumulatedRefactorPaths.length > 0\n ? accumulatedRefactorPaths\n : undefined,\n };\n }\n\n if (\n reviewResult.verdict === \"NEEDS_REFACTOR\" ||\n reviewResult.verdict === \"PASS_WITH_NOTES\" ||\n reviewResult.verdict === \"FAIL\"\n ) {\n logger.step(\"info\", \"Running refactor agent\");\n const refactorArtifactPathInWorktree = join(\n \".pourkit\",\n \".tmp\",\n \"refactors\",\n `iteration-${lifetimeIteration}.md`\n );\n\n const refactorPrompt = buildRefactorPrompt(\n repoRoot,\n refactorer.promptTemplate,\n reviewResult.output,\n refactorArtifactPathInWorktree\n );\n\n const refactorResult = await executionProvider.execute({\n stage: \"refactor\",\n iteration: lifetimeIteration,\n agent: refactorer.agent,\n model: refactorer.model,\n prompt: refactorPrompt,\n target,\n repoRoot,\n branchName: builderBranch,\n sandbox: config.sandbox,\n autoApprove: true,\n artifactPath: refactorArtifactPathInWorktree,\n worktreePath,\n artifacts: [\n buildRunContextArtifact({\n issue,\n target,\n branchName: builderBranch,\n reviewerCriteria: reviewer.criteria,\n sections: STAGE_SECTIONS.refactor,\n }),\n ],\n logger,\n });\n\n if (!refactorResult.success) {\n logger.step(\n \"warn\",\n \"Refactor execution failed, transitioning to ready-for-human\"\n );\n return {\n verdict: \"FAIL\",\n output: reviewResult.output,\n artifactPath: reviewResult.artifactPath,\n iterations: iteration,\n lifetimeIterations: resolvedStartingIteration + iteration,\n exhaustedMaxIterations: false,\n refactorCompletedForLastReview: false,\n refactorArtifactPaths:\n accumulatedRefactorPaths.length > 0\n ? accumulatedRefactorPaths\n : undefined,\n };\n }\n\n const latestFindingIds = extractLatestFindingIds(\n reviewResult.output,\n lifetimeIteration\n );\n const refactorArtifactPath = join(\n worktreePath,\n refactorArtifactPathInWorktree\n );\n try {\n validateRefactorArtifact(refactorArtifactPath, latestFindingIds);\n } catch (error) {\n if (error instanceof RefactorArtifactValidationError) {\n logger.step(\n \"warn\",\n `Refactor artifact validation failed: ${error.message}`\n );\n return {\n verdict: \"FAIL\",\n output: reviewResult.output,\n artifactPath: reviewResult.artifactPath,\n iterations: iteration,\n lifetimeIterations: resolvedStartingIteration + iteration,\n exhaustedMaxIterations: false,\n refactorCompletedForLastReview: false,\n refactorArtifactPaths:\n accumulatedRefactorPaths.length > 0\n ? accumulatedRefactorPaths\n : undefined,\n };\n }\n throw error;\n }\n\n accumulatedRefactorPaths.push(refactorArtifactPath);\n if (options.onRefactorProgress) {\n await options.onRefactorProgress({\n lifetimeIterations: resolvedStartingIteration + iteration,\n lastVerdict: reviewResult.verdict,\n lastArtifactPath: reviewResult.artifactPath,\n refactorArtifactPath,\n });\n }\n }\n }\n\n logger.step(\"warn\", `Max review iterations (${maxIterations}) exhausted`);\n\n return {\n verdict: \"FAIL\",\n output: lastResult?.output ?? \"\",\n artifactPath: lastResult?.artifactPath ?? \"\",\n iterations: iteration,\n lifetimeIterations: resolvedStartingIteration + iteration,\n exhaustedMaxIterations: true,\n refactorCompletedForLastReview: true,\n refactorArtifactPaths:\n accumulatedRefactorPaths.length > 0\n ? accumulatedRefactorPaths\n : undefined,\n };\n}\n\nasync function writeArtifact(\n worktreePath: string,\n filename: string,\n output: string\n) {\n try {\n const dir = join(worktreePath, \".pourkit\", \".tmp\", \"reviewers\");\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, filename), output, \"utf-8\");\n } catch {\n // Do not fail pipeline on artifact write errors\n }\n}\n\nasync function persistIterationArtifact(\n worktreePath: string,\n output: string,\n iteration: number\n) {\n await writeArtifact(worktreePath, `iteration-${iteration}.md`, output);\n}\n\nfunction buildRefactorPrompt(\n repoRoot: string,\n promptTemplate: string,\n latestReview: string,\n artifactPathInWorktree: string\n): string {\n const promptTemplatePath = resolvePromptTemplatePath(\n repoRoot,\n promptTemplate\n );\n const promptBody = existsSync(promptTemplatePath)\n ? readFileSync(promptTemplatePath, \"utf-8\")\n : promptTemplate;\n\n return appendProtectedWorkGuidance(`${promptBody}\n\n## Shared Run Context\n\nRead the selected issue requirements, branch context, validation commands, and artifact paths from: ${RUN_CONTEXT_PATH_IN_WORKTREE}\n\n## Latest Review\n\n${latestReview.trimEnd()}\n\n## Output\n\nWrite your refactor artifact to: ${artifactPathInWorktree}\n\nWhen you are done, finish with <promise>COMPLETE</promise>.`);\n}\n","export type ReviewVerdict =\n | \"PASS\"\n | \"PASS_WITH_NOTES\"\n | \"NEEDS_REFACTOR\"\n | \"FAIL\"\n | \"NEEDS_HUMAN\";\n\nconst VALID_VERDICTS: ReviewVerdict[] = [\n \"PASS\",\n \"PASS_WITH_NOTES\",\n \"NEEDS_REFACTOR\",\n \"FAIL\",\n \"NEEDS_HUMAN\",\n];\n\nexport class ReviewVerdictProtocolError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ReviewVerdictProtocolError\";\n }\n}\n\nexport function parseReviewVerdict(output: string): ReviewVerdict {\n const verdictRegex =\n /^\\s*<verdict>\\s*(PASS|PASS_WITH_NOTES|NEEDS_REFACTOR|FAIL|NEEDS_HUMAN)\\s*<\\/verdict>\\s*$/gm;\n const matches = Array.from(output.matchAll(verdictRegex));\n\n if (!matches || matches.length === 0) {\n throw new ReviewVerdictProtocolError(\n \"No <verdict>...</verdict> token found in reviewer output\"\n );\n }\n\n if (matches.length > 1) {\n throw new ReviewVerdictProtocolError(\n \"Multiple <verdict>...</verdict> tokens found in reviewer output\"\n );\n }\n\n const verdict = matches[0][1];\n if (!verdict) {\n throw new ReviewVerdictProtocolError(\n \"Malformed <verdict>...</verdict> token in reviewer output\"\n );\n }\n\n return verdict as ReviewVerdict;\n}\n","export interface IssueTransitionLabels {\n blocked: string;\n readyForAgent: string;\n needsTriage: string;\n agentInProgress: string;\n readyForHuman: string;\n prOpenAwaitingMerge: string;\n}\n\nexport interface IssueTransitionsContract {\n removeBlocked(issueNumber: number): Promise<void>;\n addReadyForAgent(issueNumber: number): Promise<void>;\n moveToNeedsTriage(issueNumber: number): Promise<void>;\n moveToReadyForHuman(issueNumber: number): Promise<void>;\n closeCompleted(issueNumber: number): Promise<void>;\n}\n\nexport interface IssueTransitionDeps {\n fetchIssue(issueNumber: number): Promise<{ labels: string[] }>;\n addLabels(issueNumber: number, labels: string[]): Promise<void>;\n removeLabel(issueNumber: number, label: string): Promise<void>;\n closeIssue?(issueNumber: number): Promise<void>;\n updateLabels?(\n issueNumber: number,\n removes: string[],\n adds: string[]\n ): Promise<void>;\n}\n\nexport function createIssueTransitions(\n deps: IssueTransitionDeps,\n labels: IssueTransitionLabels\n): IssueTransitionsContract {\n return {\n async removeBlocked(issueNumber: number): Promise<void> {\n await deps.removeLabel(issueNumber, labels.blocked);\n },\n async addReadyForAgent(issueNumber: number): Promise<void> {\n const issue = await deps.fetchIssue(issueNumber);\n if (!issue.labels.includes(labels.readyForAgent)) {\n await deps.addLabels(issueNumber, [labels.readyForAgent]);\n }\n },\n async moveToNeedsTriage(issueNumber: number): Promise<void> {\n if (deps.updateLabels) {\n await deps.updateLabels(\n issueNumber,\n [labels.blocked, labels.readyForAgent],\n [labels.needsTriage]\n );\n } else {\n await deps.removeLabel(issueNumber, labels.blocked);\n const issue = await deps.fetchIssue(issueNumber);\n if (issue.labels.includes(labels.readyForAgent)) {\n await deps.removeLabel(issueNumber, labels.readyForAgent);\n }\n await deps.addLabels(issueNumber, [labels.needsTriage]);\n }\n },\n async moveToReadyForHuman(issueNumber: number): Promise<void> {\n try {\n await deps.removeLabel(issueNumber, labels.agentInProgress);\n } catch {\n // Ignore - label may not exist\n }\n try {\n await deps.removeLabel(issueNumber, labels.readyForAgent);\n } catch {\n // Ignore - label may not exist\n }\n await deps.addLabels(issueNumber, [labels.readyForHuman]);\n },\n async closeCompleted(issueNumber: number): Promise<void> {\n try {\n await deps.removeLabel(issueNumber, labels.agentInProgress);\n } catch {\n // Ignore - label may not exist\n }\n try {\n await deps.removeLabel(issueNumber, labels.prOpenAwaitingMerge);\n } catch {\n // Ignore - label may not exist\n }\n if (!deps.closeIssue) {\n throw new Error(\"closeIssue is required for closeCompleted\");\n }\n await deps.closeIssue(issueNumber);\n },\n };\n}\n","const BODY_PARENT_SECTION_REGEX = /## Parent\\s*\\n([\\s\\S]*?)(?=\\n## |$)/i;\nconst AFFECTED_CODE_PATHS_SECTION_REGEX =\n /## Affected code paths\\s*\\n([\\s\\S]*?)(?=\\n## |$)/i;\nconst PRD_REF_REGEX = /\\b(PRD-\\d+)\\b/i;\nconst CHILD_TITLE_REGEX = /^\\s*(PRD-\\d+)\\s*\\/\\s*I-\\d+\\b/i;\n\nexport type ParsedStackedIssue = {\n parentRef?: string;\n parentSource?: \"body\" | \"title\";\n bodyParentRef?: string;\n titleParentRef?: string;\n affectedCodePaths: string[];\n isChildIssue: boolean;\n siblingGroupingKey?: string;\n warnings: string[];\n};\n\nexport function parseStackedIssue(\n title: string,\n body: string | null\n): ParsedStackedIssue {\n const bodyParentRef = parseParentRefFromBody(body);\n const titleParentRef = parseParentRefFromTitle(title);\n const warnings: string[] = [];\n\n if (bodyParentRef && titleParentRef && bodyParentRef !== titleParentRef) {\n warnings.push(\n `Parent mismatch: body references ${bodyParentRef} but title references ${titleParentRef}`\n );\n }\n\n const parentRef = bodyParentRef ?? titleParentRef;\n const parentSource = bodyParentRef\n ? \"body\"\n : titleParentRef\n ? \"title\"\n : undefined;\n\n return {\n parentRef,\n parentSource,\n bodyParentRef,\n titleParentRef,\n affectedCodePaths: parseAffectedCodePaths(body),\n isChildIssue: Boolean(bodyParentRef ?? titleParentRef),\n siblingGroupingKey: parentRef,\n warnings,\n };\n}\n\nexport function parseParentRefFromBody(\n body: string | null\n): string | undefined {\n if (!body) return undefined;\n\n const section = body.match(BODY_PARENT_SECTION_REGEX)?.[1];\n if (!section) return undefined;\n\n return normalizeParentRef(section.match(PRD_REF_REGEX)?.[1]);\n}\n\nexport function parseParentRefFromTitle(title: string): string | undefined {\n return normalizeParentRef(title.match(CHILD_TITLE_REGEX)?.[1]);\n}\n\nexport function parseAffectedCodePaths(body: string | null): string[] {\n if (!body) return [];\n\n const section = body.match(AFFECTED_CODE_PATHS_SECTION_REGEX)?.[1];\n if (!section) return [];\n\n const paths = new Set<string>();\n\n for (const rawLine of section.split(\"\\n\")) {\n const line = rawLine.trim();\n\n if (!line.startsWith(\"-\")) continue;\n\n if (/^-\\s+(Class\\/Module|Functions\\/Methods|New):/i.test(line)) {\n continue;\n }\n\n const inlineCodePath = line.match(/`([^`]+)`/)?.[1]?.trim();\n if (inlineCodePath) {\n paths.add(inlineCodePath);\n continue;\n }\n\n const plainPath = line.replace(/^-\\s+/, \"\").trim();\n if (looksLikeRepoPath(plainPath)) {\n paths.add(plainPath);\n }\n }\n\n return Array.from(paths);\n}\n\nfunction normalizeParentRef(ref: string | undefined): string | undefined {\n return ref?.trim().toUpperCase();\n}\n\nfunction looksLikeRepoPath(value: string): boolean {\n return /[./][A-Za-z0-9_-]/.test(value) && !value.includes(\":\");\n}\n","import type { PourkitConfig } from \"../shared/config\";\nimport type { IssueProvider } from \"../providers/issue-provider\";\nimport type { PRProvider } from \"../providers/pr-provider\";\nimport type {\n ExecutionProvider,\n ExecutionSession,\n} from \"../execution/execution-provider\";\nimport type { PourkitLogger } from \"../shared/common\";\nimport {\n startIssueRun,\n advanceIssueRunReview,\n completeIssueRun,\n failIssueRun,\n transitionIssueToHumanHandoff,\n type IssueRunStartResult,\n type RunIssueResult,\n} from \"./issue-run\";\n\nclass HumanHandoffStop extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"HumanHandoffStop\";\n }\n}\n\nexport interface RunIssueOptions {\n issueNumber: number;\n targetName?: string;\n config: PourkitConfig;\n issueProvider: IssueProvider;\n prProvider: PRProvider;\n executionProvider: ExecutionProvider;\n force: boolean;\n resetWorktree?: boolean;\n logger: PourkitLogger;\n repoRoot: string;\n}\n\nexport type { RunIssueResult };\n\nexport async function runIssueCommand(\n options: RunIssueOptions\n): Promise<RunIssueResult> {\n const {\n issueNumber,\n config,\n issueProvider,\n prProvider,\n executionProvider,\n logger,\n } = options;\n\n const ROOT = options.repoRoot;\n\n let executionSession: ExecutionSession | undefined;\n\n try {\n executionSession = await executionProvider.createSession?.();\n const runOptions = executionSession\n ? { ...options, executionProvider: executionSession }\n : options;\n\n const startResult: IssueRunStartResult = await startIssueRun(runOptions);\n const { issue, target, branchName, worktreeState, executionResult } =\n startResult;\n\n let reviewArtifactPath: string | undefined;\n\n const reviewAlreadyPassed =\n worktreeState?.review.lastVerdict &&\n [\"PASS\", \"PASS_WITH_NOTES\"].includes(worktreeState.review.lastVerdict) &&\n !worktreeState.review.exhaustedPreviousRun;\n\n if (reviewAlreadyPassed) {\n reviewArtifactPath = worktreeState.review.lastArtifactPath;\n } else {\n const lifetimeIterationsFromState =\n worktreeState?.review.lifetimeIterations ?? 0;\n const humanHandoffResolved =\n worktreeState?.review.lastVerdict === \"NEEDS_HUMAN\";\n const reviewResult = await advanceIssueRunReview({\n executionProvider: runOptions.executionProvider,\n config,\n target,\n issue,\n builderBranch: branchName,\n worktreePath: executionResult.worktreePath,\n repoRoot: ROOT,\n logger,\n startingLifetimeIteration: lifetimeIterationsFromState,\n humanHandoffResolved,\n });\n\n if (reviewResult.exhaustedMaxIterations) {\n throw new Error(\n `Max review iterations (${reviewResult.iterations}) exhausted`\n );\n }\n\n if (reviewResult.verdict === \"FAIL\") {\n throw new Error(`Review failed with FAIL verdict`);\n }\n\n if (reviewResult.verdict === \"NEEDS_HUMAN\") {\n await transitionIssueToHumanHandoff({\n issueProvider,\n issueNumber,\n config,\n logger,\n reviewResult,\n });\n throw new HumanHandoffStop(\n `Review requires human handoff: NEEDS_HUMAN verdict`\n );\n }\n\n reviewArtifactPath = reviewResult.artifactPath;\n }\n\n return await completeIssueRun({\n ...runOptions,\n startResult,\n reviewArtifactPath,\n });\n } catch (error) {\n if (!(error instanceof HumanHandoffStop)) {\n await failIssueRun({\n issueProvider,\n issueNumber,\n config,\n logger,\n error: error instanceof Error ? error : String(error),\n });\n }\n throw error;\n } finally {\n await executionSession?.close();\n }\n}\n","import type { PourkitConfig, IssueData } from \"../shared/config\";\nimport type { IssueProvider } from \"../providers/issue-provider\";\nimport type { PRProvider } from \"../providers/pr-provider\";\nimport type { ExecutionProvider } from \"../execution/execution-provider\";\nimport { TYPE_LABELS } from \"../shared/common\";\nimport { selectIssue, type CandidateIssue } from \"../issues/select-issue\";\nimport type { PourkitLogger } from \"../shared/common\";\nimport { parseStackedIssue } from \"../issues/stacked-issue\";\nimport { runIssueCommand, type RunIssueResult } from \"./issue\";\nimport { createIssueTransitions } from \"../issues/issue-transitions\";\nimport {\n reconcileBlockedIssues,\n type ReconcileDependencies,\n} from \"../issues/blocked-issue\";\n\nexport interface QueueSelectionOptions {\n config: PourkitConfig;\n issueProvider: IssueProvider;\n logger: PourkitLogger;\n prdRef?: string;\n}\n\nexport type QueueSelectionOutcome =\n | { ok: true; issue: IssueData }\n | { ok: false; reason: string; code: \"no-candidates\" | \"no-runnable\" };\n\nfunction issueDataToCandidate(issue: IssueData): CandidateIssue {\n return {\n number: issue.number,\n title: issue.title,\n labels: issue.labels,\n createdAt: issue.createdAt\n ? issue.createdAt.toISOString()\n : new Date(0).toISOString(),\n };\n}\n\nexport async function selectNextQueueIssue(\n options: QueueSelectionOptions\n): Promise<QueueSelectionOutcome> {\n const { config, issueProvider, logger, prdRef } = options;\n\n logger.step(\"info\", \"Loading candidate issues from provider\");\n\n const candidates = await issueProvider.listCandidates();\n\n if (candidates.length === 0) {\n logger.step(\"warn\", \"No candidate issues found\");\n return {\n ok: false,\n reason: \"No candidate issues found.\",\n code: \"no-candidates\",\n };\n }\n\n logger.raw(`Found ${candidates.length} candidate(s):`);\n for (const c of candidates) {\n logger.raw(` #${c.number}: ${c.title} [${c.labels.join(\", \")}]`);\n }\n\n const scopedCandidates = prdRef\n ? candidates.filter((issue) => {\n const parsed = parseStackedIssue(issue.title, issue.body);\n for (const warning of parsed.warnings) {\n logger.raw(` #${issue.number}: ${warning}`);\n }\n if (!parsed.parentRef) {\n logger.raw(\n ` #${issue.number}: no parent found, excluding from PRD scope`\n );\n return false;\n }\n const matches = parsed.parentRef === prdRef;\n if (!matches) {\n logger.raw(\n ` #${issue.number}: parent ${parsed.parentRef} does not match ${prdRef}`\n );\n }\n return matches;\n })\n : candidates;\n\n if (prdRef) {\n logger.step(\n \"info\",\n `PRD-scoped selection: ${scopedCandidates.length} of ${candidates.length} candidate(s) match ${prdRef}`\n );\n }\n\n if (prdRef && scopedCandidates.length === 0) {\n logger.step(\"warn\", `No candidate issues found for ${prdRef}.`);\n return {\n ok: false,\n reason: `No candidate issues found for ${prdRef}.`,\n code: \"no-candidates\",\n };\n }\n\n const candidateIssues: CandidateIssue[] =\n scopedCandidates.map(issueDataToCandidate);\n const selection = selectIssue(candidateIssues, {\n blockedLabel: config.labels.blocked,\n agentInProgressLabel: config.labels.agentInProgress,\n });\n\n if (!selection.ok) {\n logger.step(\"warn\", `No runnable issue: ${selection.reason}`);\n return { ok: false, reason: selection.reason, code: \"no-runnable\" };\n }\n\n const selected = candidates.find((c) => c.number === selection.issue.number);\n if (!selected) {\n throw new Error(\n `Selected issue #${selection.issue.number} not found in candidate list`\n );\n }\n\n logger.step(\"info\", `Selected issue #${selected.number}: ${selected.title}`);\n return { ok: true, issue: selected };\n}\n\nexport interface QueueRunOptions {\n targetName?: string;\n config: PourkitConfig;\n issueProvider: IssueProvider;\n prProvider: PRProvider;\n executionProvider: ExecutionProvider;\n force: boolean;\n logger: PourkitLogger;\n repoRoot: string;\n prdRef?: string;\n}\n\nexport interface RunQueueResult {\n selected: IssueData;\n runResult: RunIssueResult;\n}\n\nexport interface QueueEmptyResult {\n selected: null;\n reason: string;\n code: \"no-candidates\" | \"no-runnable\";\n}\n\nexport interface RunQueueLoopResult {\n drained: true;\n processedCount: number;\n results: RunQueueResult[];\n selected: null;\n reason: string;\n code: \"drained\";\n}\n\nfunction makeReconcileDeps(options: QueueRunOptions): ReconcileDependencies {\n const transitions = createIssueTransitions(\n {\n fetchIssue: async (issueNumber: number) => {\n const issue = await options.issueProvider.fetchIssue(issueNumber);\n return { labels: issue.labels };\n },\n addLabels: options.issueProvider.addLabels.bind(options.issueProvider),\n removeLabel: options.issueProvider.removeLabel.bind(\n options.issueProvider\n ),\n },\n {\n blocked: options.config.labels.blocked,\n readyForAgent: options.config.labels.readyForAgent,\n needsTriage: options.config.labels.needsTriage,\n agentInProgress: options.config.labels.agentInProgress,\n readyForHuman: options.config.labels.readyForHuman,\n prOpenAwaitingMerge: options.config.labels.prOpenAwaitingMerge,\n }\n );\n\n return {\n getIssueState: async (issueNumber: number) => {\n const issue = await options.issueProvider.fetchIssue(issueNumber);\n return issue.state === \"closed\" ? \"CLOSED\" : \"OPEN\";\n },\n transitions,\n typeLabels: TYPE_LABELS,\n readyLabel: options.config.labels.readyForAgent,\n };\n}\n\nasync function reconcileBlocked(options: QueueRunOptions): Promise<void> {\n const blocked = await options.issueProvider.listBlockedIssues();\n if (blocked.length > 0) {\n options.logger.step(\n \"info\",\n `Reconciling ${blocked.length} blocked issue(s)`\n );\n await reconcileBlockedIssues(blocked, makeReconcileDeps(options));\n }\n}\n\nasync function runOneQueueIssue(\n options: QueueRunOptions\n): Promise<RunQueueResult | QueueEmptyResult> {\n const {\n targetName,\n config,\n issueProvider,\n prProvider,\n executionProvider,\n force,\n logger,\n repoRoot,\n prdRef,\n } = options;\n\n const outcome = await selectNextQueueIssue({\n config,\n issueProvider,\n logger,\n prdRef,\n });\n\n if (!outcome.ok) {\n return { selected: null, reason: outcome.reason, code: outcome.code };\n }\n\n const { issue: selected } = outcome;\n\n const runResult = await runIssueCommand({\n issueNumber: selected.number,\n targetName,\n config,\n issueProvider,\n prProvider,\n executionProvider,\n force,\n logger,\n repoRoot,\n });\n\n logger.raw(\"Issue completed successfully:\");\n logger.raw(` Branch: ${runResult.branchName}`);\n if (runResult.noOp) {\n logger.raw(\" Status: no-op (closed without PR)\");\n } else {\n logger.raw(` PR Title: ${runResult.prTitle}`);\n logger.raw(` PR Number: ${runResult.prNumber}`);\n logger.raw(` PR URL: ${runResult.prUrl}`);\n }\n logger.raw(` Target: ${runResult.target.name}`);\n\n return { selected, runResult };\n}\n\nexport async function runQueue(\n options: QueueRunOptions\n): Promise<RunQueueResult | QueueEmptyResult> {\n return runOneQueueIssue(options);\n}\n\nexport async function runQueueLoop(\n options: QueueRunOptions\n): Promise<RunQueueLoopResult> {\n const results: RunQueueResult[] = [];\n while (true) {\n await reconcileBlocked(options);\n\n const outcome = await runOneQueueIssue(options);\n if (outcome.selected === null) {\n return {\n drained: true,\n processedCount: results.length,\n results,\n selected: null,\n reason: \"Queue drained.\",\n code: \"drained\" as const,\n };\n }\n results.push(outcome);\n\n const processedIssue = await options.issueProvider.fetchIssue(\n outcome.selected.number\n );\n if (processedIssue.state === \"closed\") {\n await reconcileBlocked(options);\n }\n }\n}\n","import { TYPE_LABELS } from \"../shared/common\";\n\nexport type TypeLabel = (typeof TYPE_LABELS)[number];\n\nconst TYPE_PRIORITY: Record<TypeLabel, number> = {\n \"type:bugfix\": 1,\n \"type:infra\": 2,\n \"type:feature\": 3,\n \"type:polish\": 4,\n \"type:refactor\": 5,\n};\n\nexport type CandidateIssue = {\n number: number;\n title: string;\n labels: string[];\n createdAt: string;\n};\n\nexport type SelectionResult =\n | { ok: true; issue: CandidateIssue }\n | { ok: false; reason: string };\n\nexport interface SelectIssueOptions {\n blockedLabel?: string;\n agentInProgressLabel?: string;\n}\n\nexport function selectIssue(\n candidates: CandidateIssue[],\n options: SelectIssueOptions = {}\n): SelectionResult {\n const blockedLabel = options.blockedLabel ?? \"blocked\";\n const agentInProgressLabel =\n options.agentInProgressLabel ?? \"agent-in-progress\";\n\n if (candidates.length === 0) {\n return { ok: false, reason: \"No candidate issues provided.\" };\n }\n\n const unblocked = candidates.filter(\n (issue) => !issue.labels.includes(blockedLabel)\n );\n\n if (unblocked.length === 0) {\n return { ok: false, reason: \"All candidate issues are blocked.\" };\n }\n\n const valid: Array<{ issue: CandidateIssue; priority: number }> = [];\n const rejected: string[] = [];\n\n for (const issue of unblocked) {\n if (issue.labels.includes(agentInProgressLabel)) {\n rejected.push(\n `Issue #${issue.number} is labeled ${agentInProgressLabel}.`\n );\n continue;\n }\n\n const typeLabels = issue.labels.filter((l): l is TypeLabel =>\n (TYPE_LABELS as readonly string[]).includes(l)\n );\n\n if (typeLabels.length !== 1) {\n rejected.push(\n `Issue #${issue.number} has ${typeLabels.length} type label(s); expected exactly one.`\n );\n continue;\n }\n\n valid.push({ issue, priority: TYPE_PRIORITY[typeLabels[0]] });\n }\n\n if (valid.length === 0) {\n return {\n ok: false,\n reason: \"No runnable issues: \" + rejected.join(\" \"),\n };\n }\n\n valid.sort((a, b) => {\n if (a.priority !== b.priority) return a.priority - b.priority;\n const ageCmp = a.issue.createdAt.localeCompare(b.issue.createdAt);\n if (ageCmp !== 0) return ageCmp;\n return a.issue.number - b.issue.number;\n });\n\n return { ok: true, issue: valid[0].issue };\n}\n","export type BlockedIssue = {\n number: number;\n body: string | null;\n labels?: Array<{ name: string }>;\n};\n\nimport type { IssueTransitionsContract } from \"./issue-transitions\";\n\nexport type ReconcileDependencies = {\n getIssueState: (issueNumber: number) => Promise<string>;\n transitions: IssueTransitionsContract;\n typeLabels: readonly string[];\n readyLabel: string;\n};\n\nexport type ReconcileResult = \"still-blocked\" | \"unblocked\" | \"needs-triage\";\n\nexport type ReconcileBlockedIssuesResult = {\n issueNumber: number;\n result: ReconcileResult;\n};\n\nexport function parseBlockedBy(body: string | null): number[] {\n if (!body) return [];\n\n const bm = body.match(/## Blocked by\\s*\\n([\\s\\S]*?)(?=\\n## |$)/i);\n if (!bm) return [];\n\n const refs: number[] = [];\n const re = /#(\\d+)/g;\n let m;\n while ((m = re.exec(bm[1])) !== null) {\n refs.push(Number(m[1]));\n }\n return refs;\n}\n\nexport async function reconcileBlockedIssue(\n issue: BlockedIssue,\n deps: ReconcileDependencies\n): Promise<ReconcileResult> {\n const blockers = parseBlockedBy(issue.body);\n\n if (blockers.length === 0) {\n await deps.transitions.moveToNeedsTriage(issue.number);\n return \"needs-triage\";\n }\n\n const stillBlocked = await anyBlockerStillOpen(blockers, deps.getIssueState);\n if (stillBlocked) {\n return \"still-blocked\";\n }\n\n const labels = issue.labels ?? [];\n const typeLabels = labels.filter((l) => deps.typeLabels.includes(l.name));\n\n if (typeLabels.length === 1) {\n await deps.transitions.removeBlocked(issue.number);\n const alreadyReady = labels.some((l) => l.name === deps.readyLabel);\n if (!alreadyReady) {\n await deps.transitions.addReadyForAgent(issue.number);\n }\n return \"unblocked\";\n }\n\n await deps.transitions.moveToNeedsTriage(issue.number);\n return \"needs-triage\";\n}\n\nexport async function reconcileBlockedIssues(\n issues: BlockedIssue[],\n deps: ReconcileDependencies\n): Promise<ReconcileBlockedIssuesResult[]> {\n const results: ReconcileBlockedIssuesResult[] = [];\n\n for (const issue of issues) {\n const result = await reconcileBlockedIssue(issue, deps);\n results.push({ issueNumber: issue.number, result });\n }\n\n return results;\n}\n\nasync function anyBlockerStillOpen(\n refs: number[],\n getIssueState: (issueNumber: number) => Promise<string>\n): Promise<boolean> {\n for (const ref of refs) {\n const state = await getIssueState(ref);\n if (state !== \"CLOSED\") {\n return true;\n }\n }\n\n return false;\n}\n","import type { PourkitConfig, IssueData } from \"../shared/config\";\nimport type { IssueProvider } from \"../providers/issue-provider\";\nimport type { PRProvider } from \"../providers/pr-provider\";\nimport type { ExecutionProvider } from \"../execution/execution-provider\";\nimport {\n runQueue,\n runQueueLoop,\n type QueueRunOptions,\n type RunQueueResult,\n type QueueEmptyResult,\n type RunQueueLoopResult,\n} from \"./queue\";\nimport type { PourkitLogger } from \"../shared/common\";\n\nexport interface RunQueueOptions {\n targetName?: string;\n config: PourkitConfig;\n issueProvider: IssueProvider;\n prProvider: PRProvider;\n executionProvider: ExecutionProvider;\n force: boolean;\n loop: boolean;\n logger: PourkitLogger;\n repoRoot: string;\n prdRef?: string;\n}\n\nexport type RunQueueOutcome =\n | RunQueueResult\n | QueueEmptyResult\n | RunQueueLoopResult;\n\nexport async function runQueueCommand(\n options: RunQueueOptions\n): Promise<RunQueueOutcome> {\n const queueOptions: QueueRunOptions = {\n targetName: options.targetName,\n config: options.config,\n issueProvider: options.issueProvider,\n prProvider: options.prProvider,\n executionProvider: options.executionProvider,\n force: options.force,\n logger: options.logger,\n repoRoot: options.repoRoot,\n prdRef: options.prdRef,\n };\n\n if (!options.loop) {\n return runQueue(queueOptions);\n }\n\n return runQueueLoop(queueOptions);\n}\n","import {\n resolveTarget,\n type PourkitConfig,\n type Target,\n} from \"../shared/config\";\nimport {\n buildPrBody,\n DEFAULT_MANUAL_PR_BODY,\n type PrBodyOptions,\n} from \"../pr/pr-body\";\nimport { createLogger } from \"../shared/common\";\nimport { runPrWorkflow } from \"../pr/pr-workflow\";\nimport type { PRProvider } from \"../providers/pr-provider\";\n\nexport interface PrCreateOptions {\n target: string;\n title: string;\n base?: string;\n head?: string;\n body?: string;\n bodyFile?: string;\n issue?: number;\n}\n\nexport interface PrCreateResult {\n config: PourkitConfig;\n target: Target;\n options: PrCreateOptions;\n renderedBody: string;\n baseBranch: string;\n currentBranch: string;\n prNumber: number;\n prUrl: string;\n}\n\nfunction isFlag(value: string): boolean {\n return value.startsWith(\"--\");\n}\n\nfunction requireFlagValue(flag: string, value: string | undefined): string {\n if (!value || isFlag(value)) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n}\n\nexport function parsePrCreateArgs(args: string[]): {\n options: PrCreateOptions;\n remaining: string[];\n} {\n let target: string | undefined;\n let title: string | undefined;\n let base: string | undefined;\n let head: string | undefined;\n let body: string | undefined;\n let bodyFile: string | undefined;\n let issue: number | undefined;\n const remaining: string[] = [];\n\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n\n if (arg === \"--target\") {\n target = requireFlagValue(\"--target\", args[i + 1]);\n i += 2;\n } else if (arg === \"--title\") {\n title = requireFlagValue(\"--title\", args[i + 1]);\n i += 2;\n } else if (arg === \"--base\") {\n base = requireFlagValue(\"--base\", args[i + 1]);\n i += 2;\n } else if (arg === \"--head\") {\n head = requireFlagValue(\"--head\", args[i + 1]);\n i += 2;\n } else if (arg === \"--body\") {\n body = requireFlagValue(\"--body\", args[i + 1]);\n i += 2;\n } else if (arg === \"--body-file\") {\n bodyFile = requireFlagValue(\"--body-file\", args[i + 1]);\n i += 2;\n } else if (arg === \"--issue\") {\n const raw = requireFlagValue(\"--issue\", args[i + 1]);\n if (!/^\\d+$/.test(raw)) {\n throw new Error(`Invalid issue number: ${raw}`);\n }\n if (issue !== undefined) {\n throw new Error(\"at most one --issue is allowed\");\n }\n issue = parseInt(raw, 10);\n i += 2;\n } else {\n remaining.push(arg);\n i++;\n }\n }\n\n return {\n options: {\n target: target!,\n title: title!,\n base,\n head,\n body,\n bodyFile,\n issue,\n },\n remaining,\n };\n}\n\nexport function validatePrCreateOptions(options: PrCreateOptions): void {\n const errors: string[] = [];\n\n if (!options.target) {\n errors.push(\"--target is required\");\n }\n\n if (!options.title) {\n errors.push(\"--title is required\");\n }\n\n if (options.body && options.bodyFile) {\n errors.push(\"--body and --body-file cannot be used together\");\n }\n\n if (options.head !== undefined && options.head.trim() === \"\") {\n errors.push(\"--head must be a non-empty string\");\n }\n\n if (errors.length > 0) {\n throw new Error(errors.join(\"; \"));\n }\n}\n\nexport async function runPrCreateCommand(\n args: string[],\n logger?: ReturnType<typeof createLogger>,\n prProvider?: PRProvider,\n config?: PourkitConfig,\n repoRoot?: string\n): Promise<PrCreateResult> {\n const { options, remaining } = parsePrCreateArgs(args);\n\n if (remaining.length > 0) {\n throw new Error(`Unsupported arguments: ${remaining.join(\" \")}`);\n }\n\n validatePrCreateOptions(options);\n\n if (!config) {\n throw new Error(\"Config is required\");\n }\n\n const target = resolveTarget(config, options.target);\n\n const ownLogger = logger ?? createLogger(\"pr-create\");\n\n try {\n const prBodyOptions: PrBodyOptions = {\n body: options.body,\n bodyFile: options.bodyFile,\n issue: options.issue,\n };\n\n const renderedBody = await buildPrBody({\n defaultBody: DEFAULT_MANUAL_PR_BODY,\n options: prBodyOptions,\n });\n\n if (!prProvider) {\n throw new Error(\"PR provider is required to create a pull request\");\n }\n\n const workflowResult = await runPrWorkflow({\n target,\n explicitBase: options.base,\n explicitHead: options.head,\n logger: ownLogger,\n title: options.title,\n body: renderedBody,\n prProvider,\n repoRoot: repoRoot ?? \"\",\n });\n\n return {\n config,\n target,\n options,\n renderedBody,\n baseBranch: workflowResult.baseBranch,\n currentBranch: workflowResult.currentBranch,\n prNumber: workflowResult.prNumber,\n prUrl: workflowResult.prUrl,\n };\n } finally {\n if (!logger) {\n await ownLogger.close();\n }\n }\n}\n","import { execCapture, repoRoot, type PourkitLogger } from \"../shared/common\";\nimport type { Target } from \"../shared/config\";\n\nexport interface PrPolicyOptions {\n target: Target;\n explicitBase?: string;\n explicitHead?: string;\n logger: PourkitLogger;\n repoRoot: string;\n}\n\nexport interface PrPolicyResult {\n baseBranch: string;\n currentBranch: string;\n root: string;\n}\n\nconst DISPOSABLE_TARGET_BRANCH = /^pourkit-e2e-target\\//;\nconst DISPOSABLE_AGENT_BRANCH = /^pourkit\\/\\d+\\/e2e-test-issue-/;\n\nexport async function inferBaseBranch(\n explicitBase: string | undefined,\n target: Target\n): Promise<string> {\n if (explicitBase) {\n return normalizeBaseBranch(explicitBase);\n }\n\n return normalizeBaseBranch(target.baseBranch);\n}\n\nfunction normalizeBaseBranch(base: string): string {\n return base;\n}\n\nexport async function getCurrentBranch(cwd?: string): Promise<string> {\n const result = await execCapture(\n \"git\",\n [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"],\n {\n cwd,\n }\n );\n\n const branch = result.stdout.trim();\n\n if (branch === \"HEAD\" || branch === \"\") {\n throw new Error(\"Cannot determine current branch (detached HEAD or empty)\");\n }\n\n return branch;\n}\n\nexport function validatePrHead(head: string, base: string): void {\n if (DISPOSABLE_TARGET_BRANCH.test(head)) {\n throw new Error(\n \"Refusing to create PR from disposable E2E target branch. Switch to a proper topic branch or pass --head.\"\n );\n }\n\n if (\n DISPOSABLE_AGENT_BRANCH.test(head) &&\n !base.startsWith(\"pourkit-e2e-target/\")\n ) {\n throw new Error(\n \"Refusing to create PR from disposable E2E agent branch targeting a normal base. Switch to a proper topic branch or pass --head.\"\n );\n }\n}\n\nasync function assertRemoteBranchExists(\n branch: string,\n cwd?: string\n): Promise<void> {\n const root = cwd ?? repoRoot();\n\n try {\n await execCapture(\n \"git\",\n [\"ls-remote\", \"--exit-code\", \"--heads\", \"origin\", branch],\n {\n cwd: root,\n }\n );\n } catch (error) {\n throw new Error(\n `Explicit head branch \"${branch}\" must exist on origin: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport async function runPrPolicy(\n options: PrPolicyOptions\n): Promise<PrPolicyResult> {\n const { target, explicitBase, explicitHead, logger } = options;\n\n const baseBranch = await inferBaseBranch(explicitBase, target);\n logger.step(\"policy\", `base branch: ${baseBranch}`);\n\n const root = options.repoRoot;\n\n if (explicitHead !== undefined) {\n const headBranch = explicitHead.trim();\n\n if (headBranch === \"\") {\n throw new Error(\"Explicit head branch must be a non-empty string\");\n }\n\n if (headBranch === baseBranch) {\n throw new Error(\n `Explicit head branch \"${headBranch}\" cannot match base branch \"${baseBranch}\"`\n );\n }\n\n logger.step(\"policy\", `explicit head branch: ${headBranch}`);\n await assertRemoteBranchExists(headBranch, root);\n\n return { baseBranch, currentBranch: headBranch, root };\n }\n\n const currentBranch = await getCurrentBranch(root);\n logger.step(\"policy\", `current branch: ${currentBranch}`);\n\n return { baseBranch, currentBranch, root };\n}\n","import type { PourkitLogger } from \"../shared/common\";\nimport type { Target } from \"../shared/config\";\nimport { runPrPolicy, validatePrHead, type PrPolicyResult } from \"./pr-policy\";\nimport type { PRProvider } from \"../providers/pr-provider\";\n\nexport interface PrWorkflowOptions {\n target: Target;\n explicitBase?: string;\n explicitHead?: string;\n logger: PourkitLogger;\n title: string;\n body: string;\n prProvider: PRProvider;\n repoRoot: string;\n}\n\nexport interface PrWorkflowResult extends PrPolicyResult {\n prNumber: number;\n prUrl: string;\n}\n\nexport async function runPrWorkflow(\n options: PrWorkflowOptions\n): Promise<PrWorkflowResult> {\n const {\n target,\n explicitBase,\n explicitHead,\n logger,\n title,\n body,\n prProvider,\n } = options;\n\n const policyResult = await runPrPolicy({\n target,\n explicitBase,\n explicitHead,\n logger,\n repoRoot: options.repoRoot,\n });\n\n validatePrHead(policyResult.currentBranch, policyResult.baseBranch);\n\n const pr = await prProvider.createPr({\n title,\n body,\n head: policyResult.currentBranch,\n base: policyResult.baseBranch,\n });\n\n return {\n ...policyResult,\n prNumber: pr.number,\n prUrl: pr.url,\n };\n}\n","import {\n resolveTarget,\n type PourkitConfig,\n type Target,\n} from \"../shared/config\";\nimport { createLogger } from \"../shared/common\";\nimport type {\n MergePrOptions,\n PRProvider,\n PullRequest,\n} from \"../providers/pr-provider\";\nimport { runMergeCoordinator } from \"../issues/merge-coordinator\";\n\ntype MergeMethod = NonNullable<MergePrOptions[\"method\"]>;\n\nexport interface PrMergeOptions {\n prNumber: number;\n target?: string;\n method: MergeMethod;\n wait: boolean;\n targetGreen: boolean;\n}\n\nexport interface PrMergeResult {\n config: PourkitConfig;\n target?: Target;\n options: PrMergeOptions;\n prNumber: number;\n prUrl: string;\n prTitle: string;\n baseBranch: string;\n merged: boolean;\n}\n\nexport type PrMergeProvider = PRProvider & {\n getPrByNumber(prNumber: number): Promise<PullRequest | null>;\n};\n\nfunction isFlag(value: string): boolean {\n return value.startsWith(\"--\");\n}\n\nfunction requireFlagValue(flag: string, value: string | undefined): string {\n if (!value || isFlag(value)) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n}\n\nfunction parsePrNumber(raw: string | undefined): number {\n if (!raw || isFlag(raw) || !/^\\d+$/.test(raw)) {\n throw new Error(\"PR number is required\");\n }\n\n const prNumber = parseInt(raw, 10);\n if (prNumber <= 0) {\n throw new Error(`Invalid PR number: ${raw}`);\n }\n\n return prNumber;\n}\n\nexport function parsePrMergeArgs(args: string[]): {\n options: PrMergeOptions;\n remaining: string[];\n} {\n const prNumber = parsePrNumber(args[0]);\n let target: string | undefined;\n let method: MergeMethod = \"squash\";\n let wait = true;\n let targetGreen = true;\n const remaining: string[] = [];\n\n let i = 1;\n while (i < args.length) {\n const arg = args[i];\n\n if (arg === \"--target\") {\n target = requireFlagValue(\"--target\", args[i + 1]);\n i += 2;\n } else if (arg === \"--method\") {\n const raw = requireFlagValue(\"--method\", args[i + 1]);\n if (raw !== \"merge\" && raw !== \"squash\" && raw !== \"rebase\") {\n throw new Error(`Invalid merge method: ${raw}`);\n }\n method = raw;\n i += 2;\n } else if (arg === \"--no-wait\") {\n wait = false;\n i += 1;\n } else if (arg === \"--no-target-green\") {\n targetGreen = false;\n i += 1;\n } else {\n remaining.push(arg);\n i += 1;\n }\n }\n\n return {\n options: {\n prNumber,\n target,\n method,\n wait,\n targetGreen,\n },\n remaining,\n };\n}\n\nexport function validatePrMergeOptions(options: PrMergeOptions): void {\n const errors: string[] = [];\n\n if (!Number.isInteger(options.prNumber) || options.prNumber <= 0) {\n errors.push(\"PR number must be a positive integer\");\n }\n\n if (options.target !== undefined && options.target.trim() === \"\") {\n errors.push(\"--target must be a non-empty string\");\n }\n\n if (![\"merge\", \"squash\", \"rebase\"].includes(options.method)) {\n errors.push(`Invalid merge method: ${options.method}`);\n }\n\n if (errors.length > 0) {\n throw new Error(errors.join(\"; \"));\n }\n}\n\nexport async function runPrMergeCommand(\n args: string[],\n logger?: ReturnType<typeof createLogger>,\n prProvider?: PrMergeProvider,\n config?: PourkitConfig\n): Promise<PrMergeResult> {\n const { options, remaining } = parsePrMergeArgs(args);\n\n if (remaining.length > 0) {\n throw new Error(`Unsupported arguments: ${remaining.join(\" \")}`);\n }\n\n validatePrMergeOptions(options);\n\n if (!config) {\n throw new Error(\"Config is required\");\n }\n\n if (!prProvider) {\n throw new Error(\"PR provider is required to merge a pull request\");\n }\n\n const ownLogger = logger ?? createLogger(\"pr-merge\");\n\n try {\n const pr = await prProvider.getPrByNumber(options.prNumber);\n if (!pr) {\n throw new Error(`Pull request #${options.prNumber} was not found`);\n }\n\n if (pr.state !== \"OPEN\") {\n throw new Error(`Pull request #${options.prNumber} is ${pr.state}`);\n }\n\n const target = options.target\n ? resolveTarget(config, options.target)\n : undefined;\n if (target && target.baseBranch !== pr.baseRefName) {\n throw new Error(\n `Pull request #${pr.number} targets ${pr.baseRefName}, not ${target.baseBranch}`\n );\n }\n\n const checkWaitOptions = {\n checksFoundTimeoutMs: config.checks.checksFoundTimeoutSeconds * 1000,\n checksCompletionTimeoutMs:\n config.checks.checksCompletionTimeoutSeconds * 1000,\n pollIntervalMs: config.checks.pollIntervalSeconds * 1000,\n };\n\n if (!options.wait) {\n await prProvider.mergePr(pr.number, {\n method: options.method,\n matchHeadCommit: pr.headRefOid,\n });\n } else {\n const coordinatorResult = await runMergeCoordinator({\n prProvider,\n logger: ownLogger,\n prNumber: pr.number,\n targetBranch: pr.baseRefName,\n matchHeadCommit: pr.headRefOid,\n checkWaitOptions,\n method: options.method,\n waitForTargetGreen: options.targetGreen,\n });\n\n if (coordinatorResult.stage !== \"completed\") {\n throw coordinatorResult.error;\n }\n }\n\n return {\n config,\n target,\n options,\n prNumber: pr.number,\n prUrl: pr.url,\n prTitle: pr.title,\n baseBranch: pr.baseRefName,\n merged: true,\n };\n } finally {\n if (!logger) {\n await ownLogger.close();\n }\n }\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport {\n copyFile,\n mkdir,\n readFile,\n readdir,\n rename,\n writeFile,\n} from \"node:fs/promises\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { confirm, isCancel, log, select, text } from \"@clack/prompts\";\nimport type { GitHubClient } from \"../providers/github-client\";\nimport { tryCreateGitHubClient } from \"../providers/github-client\";\n\nconst execFileAsync = promisify(execFile);\n\nexport const NO_TOKEN_LABEL_PROVISIONING_WARNING =\n \"Skipped GitHub label provisioning because no GitHub token was provided.\";\n\nexport const ALLOWED_VERIFICATION_SCRIPTS = [\n \"typecheck\",\n \"lint\",\n \"test\",\n \"test:agent\",\n \"build\",\n \"check\",\n \"prettier:check\",\n] as const;\n\nexport type InitOperationKind =\n | \"create\"\n | \"update\"\n | \"copy\"\n | \"move\"\n | \"skip\"\n | \"warn\"\n | \"install\"\n | \"provision-label\";\n\nexport type InitOwnership = \"managed\" | \"project-owned\" | \"copied-customizable\";\n\nexport interface InitOperation {\n kind: InitOperationKind;\n path?: string;\n sourcePath?: string;\n ownership?: InitOwnership;\n reason: string;\n requiresConfirmation: boolean;\n destructive: boolean;\n conflict?: string;\n content?: string;\n checksum?: string;\n labelName?: string;\n labelColor?: string;\n labelDescription?: string;\n command?: string;\n label?: string;\n}\n\nexport interface InitPlan {\n targetRoot: string;\n sourceRoot: string;\n operations: InitOperation[];\n warnings: string[];\n hasLabelConflicts?: boolean;\n}\n\nexport interface LocalSourceMetadata {\n versionSource: \"local-git\" | \"local-path\";\n sourceDirty: boolean;\n branch: string;\n sha: string;\n releaseChannel: string;\n latestTag: string | null;\n}\n\nexport type DocsMigrationMode = \"copy\" | \"move\" | \"skip\";\nexport type AgentFileMode = \"agents\" | \"claude\" | \"both\" | \"skip\";\n\nexport interface InitConflictPolicy {\n docsMigration: DocsMigrationMode;\n agentFile: AgentFileMode;\n yes: boolean;\n}\n\nexport interface InitCliOptions {\n cwd?: string;\n fromLocal?: string;\n dryRun?: boolean;\n json?: boolean;\n yes?: boolean;\n agentFile?: AgentFileMode;\n docsMigration?: DocsMigrationMode;\n packageManager?: \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n noGitCheck?: boolean;\n skipInstall?: boolean;\n legacySkills?: boolean;\n}\n\nexport interface RunnerLabelsConfig {\n readyForAgent: string;\n agentInProgress: string;\n blocked: string;\n prOpenAwaitingMerge: string;\n readyForHuman: string;\n}\n\nexport const DEFAULT_RUNNER_LABELS: RunnerLabelsConfig = {\n readyForAgent: \"ready-for-agent\",\n agentInProgress: \"agent-in-progress\",\n blocked: \"blocked\",\n prOpenAwaitingMerge: \"pr-open-awaiting-merge\",\n readyForHuman: \"ready-for-human\",\n};\n\nexport interface CanonicalLabelDefinition {\n role: string;\n name: string;\n color: string;\n description: string;\n runnerManaged: boolean;\n}\n\nexport type LabelConflictPolicy =\n | \"keep-existing\"\n | \"update-to-pourkit\"\n | \"skip-metadata-changes\";\n\nconst CANONICAL_LABEL_METADATA: Array<{\n role: string;\n color: string;\n description: string;\n runnerManaged: boolean;\n}> = [\n {\n role: \"ready-for-agent\",\n color: \"#1D76DB\",\n description: \"Fully specified, ready for an AFK agent\",\n runnerManaged: true,\n },\n {\n role: \"agent-in-progress\",\n color: \"#5319E7\",\n description: \"Agent is actively working on this issue\",\n runnerManaged: true,\n },\n {\n role: \"blocked\",\n color: \"#B60205\",\n description: \"Has unresolved dependencies\",\n runnerManaged: true,\n },\n {\n role: \"pr-open-awaiting-merge\",\n color: \"#0E8A16\",\n description: \"PR is open and awaiting merge\",\n runnerManaged: true,\n },\n {\n role: \"ready-for-human\",\n color: \"#006B75\",\n description: \"Requires human implementation\",\n runnerManaged: true,\n },\n {\n role: \"needs-triage\",\n color: \"#E99695\",\n description: \"Maintainer needs to evaluate this issue\",\n runnerManaged: false,\n },\n {\n role: \"needs-info\",\n color: \"#F9D0C4\",\n description: \"Waiting on reporter for more information\",\n runnerManaged: false,\n },\n {\n role: \"wontfix\",\n color: \"#FFFFFF\",\n description: \"Will not be actioned\",\n runnerManaged: false,\n },\n {\n role: \"type:bugfix\",\n color: \"#D73A4A\",\n description: \"Priority label — bugfix (1)\",\n runnerManaged: false,\n },\n {\n role: \"type:infra\",\n color: \"#0E8A16\",\n description: \"Priority label — infrastructure (2)\",\n runnerManaged: false,\n },\n {\n role: \"type:feature\",\n color: \"#1D76DB\",\n description: \"Priority label — feature (3)\",\n runnerManaged: false,\n },\n {\n role: \"type:polish\",\n color: \"#5319E7\",\n description: \"Priority label — polish (4)\",\n runnerManaged: false,\n },\n {\n role: \"type:refactor\",\n color: \"#F9D0C4\",\n description: \"Priority label — refactor (5)\",\n runnerManaged: false,\n },\n];\n\nconst ROLE_TO_METADATA = new Map(\n CANONICAL_LABEL_METADATA.map((m) => [m.role, m])\n);\n\nconst ROLE_TO_LABEL_KEY: Record<string, keyof RunnerLabelsConfig> = {\n \"ready-for-agent\": \"readyForAgent\",\n \"agent-in-progress\": \"agentInProgress\",\n blocked: \"blocked\",\n \"pr-open-awaiting-merge\": \"prOpenAwaitingMerge\",\n \"ready-for-human\": \"readyForHuman\",\n};\n\nexport function resolveCanonicalLabels(\n runnerLabels: RunnerLabelsConfig\n): CanonicalLabelDefinition[] {\n return CANONICAL_LABEL_METADATA.map((meta) => {\n const name = meta.runnerManaged\n ? runnerLabels[ROLE_TO_LABEL_KEY[meta.role]]\n : meta.role;\n return { ...meta, name };\n });\n}\n\nexport interface PlanOptions {\n targetRoot: string;\n sourceRoot?: string;\n conflictPolicy?: InitConflictPolicy;\n legacySkills?: boolean;\n packageManager?: string;\n noGitCheck?: boolean;\n skipInstall?: boolean;\n labels?: RunnerLabelsConfig;\n labelConflictPolicy?: LabelConflictPolicy;\n githubClient?: GitHubClient;\n}\n\nexport interface GeneratedConfigOptions {\n targetRoot: string;\n sourceRoot: string;\n packageManager: \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n baseBranch: string;\n verificationCommands: Array<{ label: string; command: string }>;\n hasPackageJson?: boolean;\n labels?: RunnerLabelsConfig;\n}\n\nexport function inferVerificationCommands(\n scripts: Record<string, string>,\n pm: string\n): Array<{ label: string; command: string }> {\n const pmPrefix =\n pm === \"npm\"\n ? \"npm run\"\n : pm === \"pnpm\"\n ? \"pnpm run\"\n : pm === \"yarn\"\n ? \"yarn\"\n : pm === \"bun\"\n ? \"bun run\"\n : \"npm run\";\n const allowlist: readonly string[] = ALLOWED_VERIFICATION_SCRIPTS;\n const matched = allowlist.filter((s) => s in scripts);\n const commands: Array<{ label: string; command: string }> = [];\n for (const script of matched) {\n if (script === \"test\" && matched.includes(\"test:agent\")) continue;\n commands.push({ label: script, command: `${pmPrefix} ${script}` });\n }\n return commands;\n}\n\nexport function generateConfigTemplate(\n options: GeneratedConfigOptions\n): string {\n const {\n sourceRoot,\n targetRoot,\n packageManager,\n baseBranch,\n verificationCommands,\n hasPackageJson = true,\n labels: maybeLabels,\n } = options;\n const labels = maybeLabels ?? DEFAULT_RUNNER_LABELS;\n const relPath = path.relative(targetRoot, sourceRoot).replace(/\\\\/g, \"/\");\n const importPath = relPath || \".\";\n const setupCommand = `${packageManager} install`;\n\n let setupSection: string;\n if (hasPackageJson) {\n setupSection = [\n \" setupCommands: [\",\n ` { command: \"${setupCommand}\", label: \"install\" },`,\n \" ],\",\n ].join(\"\\n\");\n } else {\n setupSection = \"\";\n }\n\n let verifySection: string;\n if (verificationCommands.length > 0) {\n const cmdLines = verificationCommands\n .map((vc) => ` { command: \"${vc.command}\", label: \"${vc.label}\" }`)\n .join(\",\\n\");\n verifySection = [\n \" verify: {\",\n \" commands: [\",\n cmdLines,\n \" ],\",\n \" },\",\n ].join(\"\\n\");\n } else {\n verifySection = [\n \" // verify: {\",\n \" // commands: [\",\n \" // No matching scripts found in package.json.\",\n \" // ],\",\n \" // },\",\n ].join(\"\\n\");\n }\n\n return `import { definePourkitConfig } from \"${importPath}/pourkit/shared/config\";\nimport type { PourkitConfig } from \"${importPath}/pourkit/shared/config\";\n\nexport default definePourkitConfig({\n targets: [\n {\n name: \"default\",\n baseBranch: \"${baseBranch}\",\n branchTemplate: \"pourkit/{{issue.number}}/{{issue.slug}}\",\n autoMerge: false,\n${setupSection}\n strategy: {\n type: \"review-refactor-loop\",\n implement: {\n builder: {\n agent: \"pourkit-builder\",\n model: \"opencode-go/deepseek-v4-flash\",\n promptTemplate: \".pourkit/prompts/builder.prompt.md\",\n },\n },\n review: {\n reviewer: {\n agent: \"pourkit-reviewer\",\n model: \"opencode-go/deepseek-v4-pro\",\n promptTemplate: \".pourkit/prompts/reviewer.prompt.md\",\n criteria: [\"correctness\", \"scope\", \"tests\", \"quality\"],\n },\n refactor: {\n agent: \"pourkit-refactor\",\n model: \"opencode-go/qwen3.6-plus\",\n promptTemplate: \".pourkit/prompts/refactor.prompt.md\",\n },\n maxIterations: 3,\n passWithNotesRefactorAttempts: 2,\n },\n${verifySection}\n finalize: {\n prDescriptionAgent: {\n agent: \"pourkit-pr-description\",\n model: \"opencode-go/deepseek-v4-flash\",\n promptTemplate: \".pourkit/prompts/pr-description.prompt.md\",\n },\n maxAttempts: 2,\n },\n },\n },\n ],\n labels: {\n readyForAgent: ${JSON.stringify(labels.readyForAgent)},\n agentInProgress: ${JSON.stringify(labels.agentInProgress)},\n blocked: ${JSON.stringify(labels.blocked)},\n prOpenAwaitingMerge: ${JSON.stringify(labels.prOpenAwaitingMerge)},\n readyForHuman: ${JSON.stringify(labels.readyForHuman)},\n },\n sandbox: {\n provider: \"docker\",\n copyToWorktree: [\"node_modules\"],\n mounts: [\n {\n hostPath: \"~/.local/share/opencode\",\n sandboxPath: \"/home/agent/.local/share/opencode\",\n readonly: false,\n },\n {\n hostPath: \"~/.config/opencode\",\n sandboxPath: \"/home/agent/.config/opencode\",\n readonly: true,\n },\n ],\n env: {\n HOME: \"/home/agent\",\n XDG_DATA_HOME: \"/home/agent/.local/share\",\n XDG_CONFIG_HOME: \"/home/agent/.config\",\n XDG_STATE_HOME: \"/home/agent/.local/state\",\n XDG_CACHE_HOME: \"/home/agent/.cache\",\n },\n idleTimeoutSeconds: 300,\n },\n checks: {\n requiredLabels: [],\n allowedAuthors: [],\n checksFoundTimeoutSeconds: 60,\n checksCompletionTimeoutSeconds: 1800,\n pollIntervalSeconds: 15,\n issueListLimit: 50,\n },\n});\n`;\n}\n\nfunction generateOpenCodeConfig(\n existingConfig: Record<string, unknown> = {}\n): string {\n const { $schema, ...rest } = existingConfig;\n const existingAgents =\n typeof rest.agent === \"object\" &&\n rest.agent !== null &&\n !Array.isArray(rest.agent)\n ? rest.agent\n : {};\n return (\n JSON.stringify(\n {\n $schema:\n typeof $schema === \"string\"\n ? $schema\n : \"https://opencode.ai/config.json\",\n ...rest,\n agent: {\n ...DEFAULT_OPENCODE_AGENTS,\n ...existingAgents,\n },\n },\n null,\n 2\n ) + \"\\n\"\n );\n}\n\nconst DEFAULT_OPENCODE_AGENTS = {\n \"pourkit-builder\": {\n mode: \"primary\",\n description: \"Implements Pourkit issues as the Builder role.\",\n permission: {\n task: {\n \"*\": \"deny\",\n \"advisory-analyzer\": \"allow\",\n },\n },\n },\n \"pourkit-reviewer\": {\n mode: \"primary\",\n description: \"Produces authoritative Pourkit Reviewer artifacts.\",\n permission: {\n task: \"deny\",\n },\n },\n \"pourkit-refactor\": {\n mode: \"primary\",\n description: \"Addresses Pourkit Reviewer findings as the Refactor role.\",\n permission: {\n task: {\n \"*\": \"deny\",\n \"advisory-analyzer\": \"allow\",\n },\n },\n },\n \"pourkit-pr-description\": {\n mode: \"primary\",\n description: \"Writes Pourkit PR description artifacts.\",\n permission: {\n task: \"deny\",\n },\n },\n \"advisory-analyzer\": {\n mode: \"subagent\",\n hidden: true,\n description:\n \"Provides bounded advisory analysis for Pourkit Builder and Refactor only.\",\n prompt: \"{file:.pourkit/prompts/advisory-analyzer.prompt.md}\",\n permission: {\n read: \"allow\",\n glob: \"allow\",\n grep: \"allow\",\n list: \"allow\",\n edit: \"deny\",\n bash: \"deny\",\n task: \"deny\",\n },\n },\n} as const;\n\nexport function generateTriageLabelsDoc(labels: RunnerLabelsConfig): string {\n return `# Triage Labels\n\nThe skills speak in terms of five canonical triage roles. This file maps those roles to the actual label strings used in this repo's issue tracker.\n\n| Label in mattpocock/skills | Label in our tracker | Meaning |\n| -------------------------- | -------------------- | ---------------------------------------- |\n| \\`needs-triage\\` | \\`needs-triage\\` | Maintainer needs to evaluate this issue |\n| \\`needs-info\\` | \\`needs-info\\` | Waiting on reporter for more information |\n| \\`ready-for-agent\\` | \\`${labels.readyForAgent}\\` | Fully specified, ready for an AFK agent |\n| \\`agent-in-progress\\` | \\`${labels.agentInProgress}\\` | Agent is actively working on this issue |\n| \\`ready-for-human\\` | \\`${labels.readyForHuman}\\` | Requires human implementation |\n| \\`wontfix\\` | \\`wontfix\\` | Will not be actioned |\n| \\`blocked\\` | \\`${labels.blocked}\\` | Has unresolved dependencies |\n| \\`pr-open-awaiting-merge\\` | \\`${labels.prOpenAwaitingMerge}\\` | PR is open and awaiting merge |\n| \\`type:bugfix\\` | \\`type:bugfix\\` | Priority label — bugfix (1) |\n| \\`type:infra\\` | \\`type:infra\\` | Priority label — infrastructure (2) |\n| \\`type:feature\\` | \\`type:feature\\` | Priority label — feature (3) |\n| \\`type:polish\\` | \\`type:polish\\` | Priority label — polish (4) |\n| \\`type:refactor\\` | \\`type:refactor\\` | Priority label — refactor (5) |\n\n## Label semantics for Pourkit\n\n- \\`${labels.readyForAgent}\\` without \\`${labels.blocked}\\`: Pourkit may pick this issue.\n- \\`${labels.readyForAgent}\\` with \\`${labels.blocked}\\`: Pourkit skips this issue during normal selection (dependencies unresolved).\n- \\`${labels.agentInProgress}\\`: Set when an agent checks out an issue for implementation. Prevents other agents from picking it up.\n- \\`${labels.prOpenAwaitingMerge}\\`: Set when a pull request is open and awaiting merge. The issue remains in this state until the PR is merged.\n- In queue loop mode, Pourkit may reconcile blocked labels before selecting runnable work — a blocked issue remains blocked until its dependencies are resolved.\n- AFK-track issues must carry exactly one \\`type:*\\` label. Pourkit rejects issues missing one or carrying more than one.\n\nWhen a skill mentions a role (e.g. \"apply the AFK-ready triage label\"), use the corresponding label string from this table.\n\nEdit the right-hand column to match whatever vocabulary you actually use.\n`;\n}\n\nexport function generateContextScaffold(): string {\n return `# Project Context\n\n<Describe the project's purpose, architecture, and goals here.>\n\n## Language\n\n**Term**: Definition\n_Avoid_: Alternative terms\n\n## Relationships\n\n<Document how key concepts relate to each other.>\n\n## Example Dialogue\n\n> **User:** Question about the project\n> **Expert:** Response explaining relevant concepts\n\n## Flagged Ambiguities\n\n- <Document ambiguous terms and their resolution here.>\n`;\n}\n\nexport async function generateManagedAgentInstructions(options: {\n sourceRoot: string;\n}): Promise<string> {\n const sourcePath = path.join(options.sourceRoot, \"AGENTS.md\");\n try {\n return await readFile(sourcePath, \"utf-8\");\n } catch {\n return `## Agent Skills\n\nAll repo-specific skills live in \\`.agents/skills/\\`. Load them by name when the task matches (e.g. \\`work-on-issue\\`, \\`diagnose\\`, \\`security-review\\`, \\`grill-with-docs\\`, \\`tdd\\`).\n\n## Codebase exploration\n\nUse \\`fd\\` for file discovery, \\`rg\\` for text search, and direct file reads for focused context.\n\nFollow the project's domain docs and conventions documented in \\`.pourkit/docs/agents/*\\`.\n`;\n }\n}\n\nexport function generateGitignoreBlock(): string {\n const lines = [\n \".pourkit/logs/\",\n \".pourkit/.tmp/\",\n \".pourkit/state.json\",\n \".sandcastle/worktrees/\",\n \".sandcastle/logs/\",\n ];\n return lines.join(\"\\n\") + \"\\n\";\n}\n\nasync function walkDir(dir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await walkDir(full)));\n } else {\n files.push(full);\n }\n }\n return files;\n}\n\nasync function computeFileChecksum(filePath: string): Promise<string> {\n const content = await readFile(filePath);\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction lockfileExists(root: string, name: string): boolean {\n return existsSync(path.join(root, name));\n}\n\nexport function detectPackageManager(root: string): string | null {\n if (lockfileExists(root, \"pnpm-lock.yaml\")) return \"pnpm\";\n if (lockfileExists(root, \"yarn.lock\")) return \"yarn\";\n if (lockfileExists(root, \"bun.lock\")) return \"bun\";\n if (lockfileExists(root, \"package-lock.json\")) return \"npm\";\n return null;\n}\n\nasync function execGit(\n args: string[],\n cwd: string\n): Promise<{ stdout: string; stderr: string }> {\n const result = await execFileAsync(\"git\", args, {\n cwd,\n encoding: \"utf8\",\n });\n return { stdout: result.stdout ?? \"\", stderr: result.stderr ?? \"\" };\n}\n\nexport async function discoverLocalSource(\n sourcePath: string\n): Promise<LocalSourceMetadata> {\n const branch = (\n await execGit([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], sourcePath)\n ).stdout.trim();\n const sha = (await execGit([\"rev-parse\", \"HEAD\"], sourcePath)).stdout.trim();\n const dirtyOutput = (\n await execGit([\"status\", \"--porcelain\"], sourcePath)\n ).stdout.trim();\n const sourceDirty = dirtyOutput.length > 0;\n\n const releaseChannel =\n branch === \"main\" || branch === \"master\" ? \"stable\" : \"development\";\n\n let latestTag: string | null = null;\n try {\n const tagResult = await execGit(\n [\"describe\", \"--tags\", \"--abbrev=0\", \"--match\", \"v*\"],\n sourcePath\n );\n latestTag = tagResult.stdout.trim() || null;\n } catch {\n latestTag = null;\n }\n\n return {\n versionSource: \"local-git\",\n sourceDirty,\n branch,\n sha,\n releaseChannel,\n latestTag,\n };\n}\n\nasync function discoverReadme(root: string): Promise<string | null> {\n for (const name of [\"README.md\", \"readme.md\"]) {\n const p = path.join(root, name);\n if (existsSync(p)) {\n return p;\n }\n }\n return null;\n}\n\nasync function discoverAgentFiles(root: string): Promise<string[]> {\n const files: string[] = [];\n for (const name of [\"AGENTS.md\", \"CLAUDE.md\"]) {\n const p = path.join(root, name);\n if (existsSync(p)) {\n files.push(p);\n }\n }\n return files;\n}\n\nasync function discoverMerlleState(root: string): Promise<string | null> {\n const p = path.join(root, \".pourkit\", \"state.json\");\n return existsSync(p) ? p : null;\n}\n\nasync function discoverAgentSkills(root: string): Promise<string[]> {\n const dirs = [\n path.join(root, \".agents\", \"skills\"),\n path.join(root, \".opencode\", \"skills\"),\n ];\n const found: string[] = [];\n for (const d of dirs) {\n if (existsSync(d)) {\n found.push(d);\n }\n }\n return found;\n}\n\nasync function discoverRootDomainDocs(root: string): Promise<string[]> {\n const docs: string[] = [];\n for (const name of [\"CONTEXT.md\", \"CONTEXT-MAP.md\"]) {\n const p = path.join(root, name);\n if (existsSync(p)) {\n docs.push(p);\n }\n }\n const adrDir = path.join(root, \"docs\", \"adr\");\n if (existsSync(adrDir)) {\n const entries = await readdir(adrDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".md\")) {\n docs.push(path.join(adrDir, entry.name));\n }\n }\n }\n return docs;\n}\n\nasync function isGitRepo(root: string): Promise<boolean> {\n try {\n await execGit([\"rev-parse\", \"--is-inside-work-tree\"], root);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function hasGitHubRemote(root: string): Promise<boolean> {\n try {\n const { stdout } = await execGit([\"remote\", \"-v\"], root);\n return stdout.includes(\"github.com\");\n } catch {\n return false;\n }\n}\n\nasync function checkExistingLabelConflicts(\n client: GitHubClient | undefined,\n canonicalLabels: CanonicalLabelDefinition[]\n): Promise<boolean> {\n if (!client) return true;\n try {\n const { data } = await client.octokit.rest.issues.listLabelsForRepo({\n owner: client.owner,\n repo: client.repo,\n per_page: 200,\n });\n const existingMap = new Map(data.map((l) => [l.name, l]));\n for (const cl of canonicalLabels) {\n const existing = existingMap.get(cl.name);\n if (!existing) continue;\n const canonicalColor = cl.color.replace(/^#/, \"\").toLowerCase();\n const existingColor = existing.color.replace(/^#/, \"\").toLowerCase();\n if (\n existingColor !== canonicalColor ||\n existing.description !== cl.description\n ) {\n return true;\n }\n }\n return false;\n } catch {\n return true;\n }\n}\n\nexport async function planInit(options: PlanOptions): Promise<InitPlan> {\n const { targetRoot, sourceRoot } = options;\n const operations: InitOperation[] = [];\n const warnings: string[] = [];\n let hasLabelConflicts = false;\n\n let managedAgentContent: string | undefined;\n if (sourceRoot) {\n managedAgentContent = await generateManagedAgentInstructions({\n sourceRoot,\n });\n }\n\n const pm = options.packageManager ?? detectPackageManager(targetRoot);\n if (pm) {\n operations.push({\n kind: \"skip\",\n reason: `Package manager: ${pm}`,\n requiresConfirmation: false,\n destructive: false,\n });\n } else {\n warnings.push(\"No package manager lockfile detected\");\n operations.push({\n kind: \"warn\",\n reason: \"No package manager lockfile detected\",\n destructive: false,\n requiresConfirmation: false,\n });\n }\n\n const readme = await discoverReadme(targetRoot);\n if (!readme) {\n warnings.push(\"No README.md found at target root\");\n operations.push({\n kind: \"warn\",\n reason: \"No README.md found at target root\",\n destructive: false,\n requiresConfirmation: false,\n });\n }\n\n const agentFiles = await discoverAgentFiles(targetRoot);\n if (agentFiles.length > 0) {\n for (const f of agentFiles) {\n if (sourceRoot) {\n const agentFileMode = options.conflictPolicy?.agentFile ?? \"both\";\n const basename = path.basename(f);\n if (\n agentFileMode === \"skip\" ||\n (agentFileMode === \"agents\" && basename !== \"AGENTS.md\") ||\n (agentFileMode === \"claude\" && basename !== \"CLAUDE.md\")\n ) {\n operations.push({\n kind: \"skip\",\n path: f,\n ownership: \"project-owned\",\n reason: `Existing agent file skipped per policy: ${basename}`,\n requiresConfirmation: false,\n destructive: false,\n });\n continue;\n }\n operations.push({\n kind: \"update\",\n path: f,\n ownership: \"managed\",\n reason: `Update existing ${basename} with Pourkit managed block`,\n requiresConfirmation: false,\n destructive: false,\n content: managedAgentContent!,\n });\n } else {\n operations.push({\n kind: \"skip\",\n path: f,\n ownership: \"project-owned\",\n reason: `Existing agent file: ${path.basename(f)}`,\n requiresConfirmation: false,\n destructive: false,\n });\n }\n }\n }\n\n const merlleState = await discoverMerlleState(targetRoot);\n if (merlleState) {\n operations.push({\n kind: \"skip\",\n path: merlleState,\n ownership: \"managed\",\n reason: \"Existing .pourkit/state.json\",\n requiresConfirmation: false,\n destructive: false,\n });\n }\n\n const skills = await discoverAgentSkills(targetRoot);\n for (const s of skills) {\n if (s.includes(\".opencode\") && options.legacySkills) {\n const skillFiles = await walkDir(s);\n for (const file of skillFiles) {\n const relPath = path.relative(s, file);\n const destPath = path.join(targetRoot, \".agents\", \"skills\", relPath);\n if (!existsSync(destPath)) {\n operations.push({\n kind: \"copy\",\n sourcePath: file,\n path: destPath,\n ownership: \"project-owned\",\n reason: `Migrate legacy skill: ${path.join(\".opencode/skills\", relPath)}`,\n requiresConfirmation: false,\n destructive: false,\n });\n }\n }\n } else {\n const label = s.includes(\".agents\")\n ? \".agents/skills\"\n : \".opencode/skills\";\n operations.push({\n kind: \"skip\",\n path: s,\n reason: `Existing skill directory: ${label}`,\n requiresConfirmation: false,\n destructive: false,\n });\n }\n }\n\n const isTargetGit = options.noGitCheck ? false : await isGitRepo(targetRoot);\n if (isTargetGit) {\n const hasRemote = await hasGitHubRemote(targetRoot);\n if (!hasRemote) {\n warnings.push(\"No GitHub remote configured for target repository\");\n operations.push({\n kind: \"warn\",\n reason: \"No GitHub remote configured for target repository\",\n destructive: false,\n requiresConfirmation: false,\n });\n } else {\n const labels = options.labels ?? DEFAULT_RUNNER_LABELS;\n const canonicalLabels = resolveCanonicalLabels(labels);\n for (const cl of canonicalLabels) {\n operations.push({\n kind: \"provision-label\",\n reason: `Provision label: ${cl.name}`,\n requiresConfirmation: false,\n destructive: false,\n labelName: cl.name,\n labelColor: cl.color,\n labelDescription: cl.description,\n });\n }\n hasLabelConflicts = await checkExistingLabelConflicts(\n options.githubClient,\n canonicalLabels\n );\n }\n } else {\n warnings.push(\"Target is not a Git repository\");\n operations.push({\n kind: \"warn\",\n reason: \"Target is not a Git repository\",\n destructive: false,\n requiresConfirmation: false,\n });\n }\n\n if (sourceRoot) {\n if (!existsSync(sourceRoot) || !statSync(sourceRoot).isDirectory()) {\n warnings.push(\n `--from-local path does not exist or is not a directory: ${sourceRoot}`\n );\n operations.push({\n kind: \"warn\",\n reason: `--from-local path does not exist or is not a directory: ${sourceRoot}`,\n destructive: false,\n requiresConfirmation: false,\n });\n } else {\n let sourceMeta: LocalSourceMetadata;\n try {\n sourceMeta = await discoverLocalSource(sourceRoot);\n } catch {\n sourceMeta = {\n versionSource: \"local-path\",\n sourceDirty: false,\n branch: \"unknown\",\n sha: \"0000000\",\n releaseChannel: \"unknown\",\n latestTag: null,\n };\n warnings.push(\n \"Source is not a Git repository; version metadata unavailable\"\n );\n operations.push({\n kind: \"warn\",\n reason:\n \"Source is not a Git repository; version metadata unavailable\",\n destructive: false,\n requiresConfirmation: false,\n });\n }\n\n if (sourceMeta.sourceDirty) {\n warnings.push(\"Local source has uncommitted changes\");\n operations.push({\n kind: \"warn\",\n reason: \"Local source has uncommitted changes\",\n destructive: false,\n requiresConfirmation: false,\n });\n }\n\n const plannedSkillDests = new Set<string>();\n for (const op of operations) {\n if (op.kind === \"copy\" && op.path?.includes(\".agents/skills\")) {\n plannedSkillDests.add(op.path);\n }\n }\n\n const srcSkills = await discoverAgentSkills(sourceRoot);\n for (const s of srcSkills) {\n const isOpenCode = s.includes(\".opencode\");\n if (isOpenCode && !options.legacySkills) {\n operations.push({\n kind: \"skip\",\n reason:\n \"Legacy .opencode/skills in source not copied; use --legacy-skills to migrate\",\n requiresConfirmation: false,\n destructive: false,\n });\n continue;\n }\n const targetDirName = \".agents/skills\";\n const targetPath = path.join(targetRoot, targetDirName);\n const skillFiles = await walkDir(s);\n for (const file of skillFiles) {\n const relPath = path.relative(s, file);\n const destPath = path.join(targetPath, relPath);\n if (plannedSkillDests.has(destPath)) {\n operations.push({\n kind: \"skip\",\n path: destPath,\n ownership: \"project-owned\",\n reason: `Skill destination conflict, skipping source copy: ${path.join(targetDirName, relPath)}`,\n requiresConfirmation: false,\n destructive: false,\n conflict: \"destination already planned\",\n });\n continue;\n }\n const checksum = await computeFileChecksum(file);\n operations.push({\n kind: \"copy\",\n sourcePath: file,\n path: destPath,\n ownership: \"copied-customizable\",\n reason: `Copy skill: ${path.join(targetDirName, relPath)}`,\n requiresConfirmation: false,\n destructive: false,\n checksum,\n });\n }\n }\n\n const srcReadme = await discoverReadme(sourceRoot);\n if (srcReadme && !readme) {\n operations.push({\n kind: \"copy\",\n sourcePath: srcReadme,\n path: path.join(targetRoot, \"README.md\"),\n ownership: \"project-owned\",\n reason: \"Copy README.md from source\",\n requiresConfirmation: false,\n destructive: false,\n });\n }\n\n // --- Root domain docs migration ---\n const docsMigration = options.conflictPolicy?.docsMigration ?? \"copy\";\n const rootDocs = await discoverRootDomainDocs(targetRoot);\n const merleDestPaths = new Set<string>();\n for (const docPath of rootDocs) {\n const relPath = path.relative(targetRoot, docPath);\n const destPath = path.join(targetRoot, \".pourkit\", relPath);\n merleDestPaths.add(destPath);\n if (docsMigration === \"skip\") {\n operations.push({\n kind: \"skip\",\n path: docPath,\n ownership: \"project-owned\",\n reason: `Root domain doc skipped by policy: ${relPath}`,\n requiresConfirmation: false,\n destructive: false,\n });\n } else if (existsSync(destPath)) {\n operations.push({\n kind: \"skip\",\n path: destPath,\n ownership: \"project-owned\",\n reason: `Destination exists, skipping root domain doc: ${relPath}`,\n requiresConfirmation: false,\n destructive: false,\n conflict: \"destination already exists\",\n });\n } else if (docsMigration === \"move\" && options.conflictPolicy?.yes) {\n operations.push({\n kind: \"move\",\n sourcePath: docPath,\n path: destPath,\n ownership: \"project-owned\",\n reason: `Move root domain doc: ${relPath}`,\n requiresConfirmation: false,\n destructive: true,\n });\n } else {\n // copy by default (fallback for move-without-yes or explicit copy)\n operations.push({\n kind: \"copy\",\n sourcePath: docPath,\n path: destPath,\n ownership: \"project-owned\",\n reason: `Copy root domain doc: ${relPath}`,\n requiresConfirmation: false,\n destructive: false,\n });\n }\n }\n\n // --- Fresh-repo bootstrap assets ---\n\n let packageScripts: Record<string, string> = {};\n let hasPackageJson = true;\n try {\n const pkgContent = await readFile(\n path.join(targetRoot, \"package.json\"),\n \"utf-8\"\n );\n const pkg = JSON.parse(pkgContent);\n if (pkg.scripts && typeof pkg.scripts === \"object\") {\n packageScripts = pkg.scripts;\n }\n } catch {\n hasPackageJson = false;\n }\n\n let baseBranch = \"main\";\n if (isTargetGit) {\n try {\n const { stdout } = await execGit(\n [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"],\n targetRoot\n );\n baseBranch = stdout.trim() || \"main\";\n } catch {\n // fallback\n }\n }\n\n // 1. CONTEXT.md scaffold\n const contextPath = path.join(targetRoot, \".pourkit\", \"CONTEXT.md\");\n if (!existsSync(contextPath) && !merleDestPaths.has(contextPath)) {\n operations.push({\n kind: \"create\",\n path: contextPath,\n ownership: \"managed\",\n reason: \"Init CONTEXT.md scaffold\",\n requiresConfirmation: false,\n destructive: false,\n content: generateContextScaffold(),\n });\n }\n\n // 2. ADR .gitkeep\n const adrGitkeep = path.join(\n targetRoot,\n \".pourkit\",\n \"docs\",\n \"adr\",\n \".gitkeep\"\n );\n if (!existsSync(adrGitkeep)) {\n operations.push({\n kind: \"create\",\n path: adrGitkeep,\n ownership: \"managed\",\n reason: \"Init ADR directory placeholder\",\n requiresConfirmation: false,\n destructive: false,\n });\n }\n\n // 3. .pourkit/docs/agents/ from source\n const srcDocAgents = path.join(sourceRoot, \".pourkit\", \"docs\", \"agents\");\n const tgtDocAgents = path.join(targetRoot, \".pourkit\", \"docs\", \"agents\");\n if (existsSync(srcDocAgents) && !existsSync(tgtDocAgents)) {\n const docFiles = await walkDir(srcDocAgents);\n for (const file of docFiles) {\n const relPath = path.relative(srcDocAgents, file);\n if (relPath === \"triage-labels.md\") {\n operations.push({\n kind: \"create\",\n path: path.join(tgtDocAgents, relPath),\n ownership: \"managed\",\n reason: \"Init triage labels doc\",\n requiresConfirmation: false,\n destructive: false,\n content: generateTriageLabelsDoc(\n options.labels ?? DEFAULT_RUNNER_LABELS\n ),\n });\n continue;\n }\n const checksum = await computeFileChecksum(file);\n operations.push({\n kind: \"copy\",\n sourcePath: file,\n path: path.join(tgtDocAgents, relPath),\n ownership: \"managed\",\n reason: `Copy agent doc: ${relPath}`,\n requiresConfirmation: false,\n destructive: false,\n checksum,\n });\n }\n }\n\n // 4. .pourkit/prompts/ from source\n const srcPrompts = path.join(sourceRoot, \".pourkit\", \"prompts\");\n const tgtPrompts = path.join(targetRoot, \".pourkit\", \"prompts\");\n if (existsSync(srcPrompts) && !existsSync(tgtPrompts)) {\n const promptFiles = await walkDir(srcPrompts);\n for (const file of promptFiles) {\n const relPath = path.relative(srcPrompts, file);\n const checksum = await computeFileChecksum(file);\n operations.push({\n kind: \"copy\",\n sourcePath: file,\n path: path.join(tgtPrompts, relPath),\n ownership: \"managed\",\n reason: `Copy prompt: ${relPath}`,\n requiresConfirmation: false,\n destructive: false,\n checksum,\n });\n }\n }\n\n // 5. Sandcastle Dockerfile from source\n const srcSandboxDockerfile = path.join(\n sourceRoot,\n \".sandcastle\",\n \"Dockerfile\"\n );\n const tgtSandboxDockerfile = path.join(\n targetRoot,\n \".sandcastle\",\n \"Dockerfile\"\n );\n if (existsSync(tgtSandboxDockerfile)) {\n operations.push({\n kind: \"skip\",\n path: tgtSandboxDockerfile,\n ownership: \"project-owned\",\n reason: \"Existing .sandcastle/Dockerfile (project-owned)\",\n requiresConfirmation: false,\n destructive: false,\n });\n } else if (existsSync(srcSandboxDockerfile)) {\n const checksum = await computeFileChecksum(srcSandboxDockerfile);\n operations.push({\n kind: \"copy\",\n sourcePath: srcSandboxDockerfile,\n path: tgtSandboxDockerfile,\n ownership: \"managed\",\n reason: \"Copy default Sandcastle Dockerfile\",\n requiresConfirmation: false,\n destructive: false,\n checksum,\n });\n }\n\n // 6. pourkit.config.ts template\n const configTsPath = path.join(targetRoot, \"pourkit.config.ts\");\n if (!existsSync(configTsPath)) {\n const verifyCommands = inferVerificationCommands(\n packageScripts,\n pm || \"npm\"\n );\n const configContent = generateConfigTemplate({\n targetRoot,\n sourceRoot,\n packageManager:\n (pm as GeneratedConfigOptions[\"packageManager\"]) || \"npm\",\n baseBranch,\n verificationCommands: verifyCommands,\n hasPackageJson,\n labels: options.labels,\n });\n operations.push({\n kind: \"create\",\n path: configTsPath,\n ownership: \"managed\",\n reason: \"Init pourkit.config.ts template\",\n requiresConfirmation: false,\n destructive: false,\n content: configContent,\n });\n } else {\n operations.push({\n kind: \"skip\",\n path: configTsPath,\n ownership: \"project-owned\",\n reason: \"Existing pourkit.config.ts (project-owned)\",\n requiresConfirmation: false,\n destructive: false,\n });\n }\n\n // 7. Agent file managed blocks\n const agentFileMode = options.conflictPolicy?.agentFile ?? \"both\";\n\n const hasExistingAgents = operations.some(\n (op) =>\n (op.kind === \"skip\" || op.kind === \"update\") &&\n op.path?.endsWith(\"AGENTS.md\")\n );\n if (\n (agentFileMode === \"agents\" || agentFileMode === \"both\") &&\n !hasExistingAgents &&\n !existsSync(path.join(targetRoot, \"AGENTS.md\"))\n ) {\n operations.push({\n kind: \"create\",\n path: path.join(targetRoot, \"AGENTS.md\"),\n ownership: \"managed\",\n reason: \"Init AGENTS.md with Pourkit managed block\",\n requiresConfirmation: false,\n destructive: false,\n content: `${MANAGED_BLOCK_BEGIN}\\n${managedAgentContent!}${MANAGED_BLOCK_END}\\n`,\n });\n }\n\n const hasExistingClaude = operations.some(\n (op) =>\n (op.kind === \"skip\" || op.kind === \"update\") &&\n op.path?.endsWith(\"CLAUDE.md\")\n );\n if (\n (agentFileMode === \"claude\" || agentFileMode === \"both\") &&\n !hasExistingClaude &&\n !existsSync(path.join(targetRoot, \"CLAUDE.md\"))\n ) {\n operations.push({\n kind: \"create\",\n path: path.join(targetRoot, \"CLAUDE.md\"),\n ownership: \"managed\",\n reason: \"Init CLAUDE.md with Pourkit managed block\",\n requiresConfirmation: false,\n destructive: false,\n content: `${MANAGED_BLOCK_BEGIN}\\n${managedAgentContent!}${MANAGED_BLOCK_END}\\n`,\n });\n }\n\n // 8. .gitignore managed block\n const gitignoreTarget = path.join(targetRoot, \".gitignore\");\n const gitignoreContent = generateGitignoreBlock();\n if (!existsSync(gitignoreTarget)) {\n operations.push({\n kind: \"create\",\n path: gitignoreTarget,\n ownership: \"managed\",\n reason: \"Init .gitignore with Pourkit entries\",\n requiresConfirmation: false,\n destructive: false,\n content: `${MANAGED_BLOCK_BEGIN}\\n${gitignoreContent}${MANAGED_BLOCK_END}\\n`,\n });\n } else {\n operations.push({\n kind: \"update\",\n path: gitignoreTarget,\n ownership: \"managed\",\n reason: \"Update .gitignore with Pourkit managed block\",\n requiresConfirmation: false,\n destructive: false,\n content: gitignoreContent,\n });\n }\n\n // 9. opencode.json config\n const openCodePath = path.join(targetRoot, \"opencode.json\");\n if (!existsSync(openCodePath)) {\n operations.push({\n kind: \"create\",\n path: openCodePath,\n ownership: \"managed\",\n reason: \"Init opencode.json config\",\n requiresConfirmation: false,\n destructive: false,\n content: generateOpenCodeConfig(),\n });\n } else {\n try {\n const existingContent = await readFile(openCodePath, \"utf-8\");\n const existingConfig = JSON.parse(existingContent);\n\n if (\n typeof existingConfig !== \"object\" ||\n existingConfig === null ||\n Array.isArray(existingConfig)\n ) {\n warnings.push(\n \"Existing opencode.json is not a valid config object; skipping\"\n );\n operations.push({\n kind: \"warn\",\n path: openCodePath,\n reason:\n \"Existing opencode.json is not a valid config object; skipping\",\n requiresConfirmation: false,\n destructive: false,\n });\n } else if (typeof existingConfig.$schema === \"string\") {\n operations.push({\n kind: \"skip\",\n path: openCodePath,\n ownership: \"project-owned\",\n reason: \"Existing opencode.json config\",\n requiresConfirmation: false,\n destructive: false,\n });\n } else {\n operations.push({\n kind: \"create\",\n path: openCodePath,\n ownership: \"managed\",\n reason: \"Update opencode.json with schema\",\n requiresConfirmation: false,\n destructive: true,\n content: generateOpenCodeConfig(existingConfig),\n });\n }\n } catch {\n warnings.push(\"Existing opencode.json is malformed; skipping\");\n operations.push({\n kind: \"warn\",\n path: openCodePath,\n reason: \"Existing opencode.json is malformed; skipping\",\n requiresConfirmation: false,\n destructive: false,\n });\n }\n }\n\n // 10. .pourkit/manifest.json written last by writeManifest\n const manifestPath = path.join(targetRoot, \".pourkit\", \"manifest.json\");\n if (existsSync(manifestPath)) {\n operations.push({\n kind: \"skip\",\n path: manifestPath,\n ownership: \"managed\",\n reason: \"Existing .pourkit/manifest.json\",\n requiresConfirmation: false,\n destructive: false,\n conflict: \"already exists\",\n });\n }\n\n const sourceLabel =\n sourceMeta.versionSource === \"local-git\"\n ? `Init from local source (${sourceMeta.branch}@${sourceMeta.sha.slice(0, 7)})`\n : \"Init from local source (non-Git)\";\n operations.push({\n kind: \"copy\",\n sourcePath: sourceRoot,\n path: targetRoot,\n ownership: \"managed\",\n reason: sourceLabel,\n requiresConfirmation: true,\n destructive: false,\n });\n }\n } else {\n warnings.push(\"No --from-local source provided\");\n operations.push({\n kind: \"warn\",\n reason: \"No --from-local source provided\",\n destructive: false,\n requiresConfirmation: false,\n });\n }\n\n return {\n targetRoot,\n sourceRoot: sourceRoot ?? \"\",\n operations,\n warnings,\n hasLabelConflicts,\n };\n}\n\nconst GROUP_LABELS: Record<InitOperationKind, string> = {\n create: \"Create\",\n update: \"Update\",\n copy: \"Copy\",\n move: \"Move\",\n skip: \"Skip\",\n warn: \"Warn\",\n install: \"Install\",\n \"provision-label\": \"Labels\",\n};\n\nconst GROUP_ORDER: InitOperationKind[] = [\n \"create\",\n \"update\",\n \"copy\",\n \"move\",\n \"provision-label\",\n \"skip\",\n \"warn\",\n \"install\",\n];\n\nexport function renderInitPlan(plan: InitPlan): string {\n const lines: string[] = [];\n lines.push(`Init Plan for ${plan.targetRoot}`);\n const fromSource = plan.sourceRoot ? ` (from ${plan.sourceRoot})` : \"\";\n if (fromSource) {\n lines[0] += fromSource;\n }\n lines.push(\"\");\n\n for (const kind of GROUP_ORDER) {\n const group = plan.operations.filter((op) => op.kind === kind);\n if (group.length === 0) continue;\n lines.push(` ${GROUP_LABELS[kind]}:`);\n for (const op of group) {\n const parts: string[] = [];\n if (op.path) parts.push(op.path);\n if (op.sourcePath) parts.push(`<- ${op.sourcePath}`);\n parts.push(`(${op.reason})`);\n lines.push(` - ${parts.join(\" \")}`);\n }\n }\n\n if (plan.warnings.length > 0) {\n lines.push(\"\");\n lines.push(\" Warnings:\");\n for (const w of plan.warnings) {\n lines.push(` ! ${w}`);\n }\n }\n\n lines.push(\"\");\n lines.push(\n `${plan.operations.length} operation(s), ${plan.warnings.length} warning(s)`\n );\n return lines.join(\"\\n\");\n}\n\nexport function renderInitPlanJson(plan: InitPlan): string {\n return JSON.stringify(plan, null, 2);\n}\n\nfunction normalizeLabelInput(\n result: string | symbol,\n defaultLabel: string\n): string {\n if (typeof result === \"string\") {\n const trimmed = result.trim();\n if (trimmed.length > 0) return trimmed;\n }\n return defaultLabel;\n}\n\nexport async function promptForInitChoices(\n plan: InitPlan,\n current: {\n docsMigration?: DocsMigrationMode;\n agentFile?: AgentFileMode;\n packageManager?: string;\n legacySkills?: boolean;\n noGitCheck?: boolean;\n labels?: RunnerLabelsConfig;\n }\n): Promise<{\n docsMigration: DocsMigrationMode;\n agentFile: AgentFileMode;\n packageManager?: string;\n legacySkills: boolean;\n noGitCheck: boolean;\n labels: RunnerLabelsConfig;\n cancelled: boolean;\n}> {\n let docsMigration = current.docsMigration;\n let agentFile = current.agentFile;\n let packageManager = current.packageManager;\n let legacySkills = current.legacySkills ?? false;\n let noGitCheck = current.noGitCheck ?? false;\n const labels = current.labels\n ? { ...current.labels }\n : { ...DEFAULT_RUNNER_LABELS };\n\n if (\n !packageManager &&\n plan.warnings.some((w) => w.toLowerCase().includes(\"lockfile\"))\n ) {\n const result = await select({\n message:\n \"No package manager lockfile detected. Which package manager are you using?\",\n options: [\n { value: \"npm\", label: \"npm\" },\n { value: \"pnpm\", label: \"pnpm\" },\n { value: \"yarn\", label: \"yarn\" },\n { value: \"bun\", label: \"bun\" },\n ],\n });\n if (isCancel(result)) {\n return {\n docsMigration: docsMigration ?? \"copy\",\n agentFile: agentFile ?? \"both\",\n packageManager,\n legacySkills,\n noGitCheck,\n labels,\n cancelled: true,\n };\n }\n packageManager = result as string;\n }\n\n if (\n !docsMigration &&\n plan.operations.some(\n (op) =>\n op.sourcePath &&\n op.path?.includes(\".pourkit\") &&\n (op.path?.endsWith(\"CONTEXT.md\") ||\n op.path?.endsWith(\"CONTEXT-MAP.md\") ||\n op.path?.includes(\"docs/adr\"))\n )\n ) {\n const result = await select({\n message:\n \"How should existing domain documentation be migrated to .pourkit/?\",\n options: [\n { value: \"copy\", label: \"Copy to .pourkit/ (safe default)\" },\n { value: \"skip\", label: \"Skip migration\" },\n ],\n });\n if (isCancel(result)) {\n return {\n docsMigration: docsMigration ?? \"copy\",\n agentFile: agentFile ?? \"both\",\n packageManager,\n legacySkills,\n noGitCheck,\n labels,\n cancelled: true,\n };\n }\n docsMigration = result as DocsMigrationMode;\n }\n\n if (\n !agentFile &&\n plan.operations.some(\n (op) => op.path?.endsWith(\"AGENTS.md\") || op.path?.endsWith(\"CLAUDE.md\")\n )\n ) {\n const result = await select({\n message: \"Which agent files should Pourkit manage?\",\n options: [\n { value: \"both\", label: \"Both AGENTS.md and CLAUDE.md\" },\n { value: \"agents\", label: \"AGENTS.md only\" },\n { value: \"claude\", label: \"CLAUDE.md only\" },\n { value: \"skip\", label: \"Skip agent file management\" },\n ],\n });\n if (isCancel(result)) {\n return {\n docsMigration: docsMigration ?? \"copy\",\n agentFile: agentFile ?? \"both\",\n packageManager,\n legacySkills,\n noGitCheck,\n labels,\n cancelled: true,\n };\n }\n agentFile = result as AgentFileMode;\n }\n\n // --- Runner label configuration ---\n const readyForAgentResult = await text({\n message: \"Label name for issues ready for agent pick-up?\",\n placeholder: DEFAULT_RUNNER_LABELS.readyForAgent,\n });\n if (isCancel(readyForAgentResult)) {\n return {\n docsMigration: docsMigration ?? \"copy\",\n agentFile: agentFile ?? \"both\",\n packageManager,\n legacySkills,\n noGitCheck,\n labels,\n cancelled: true,\n };\n }\n labels.readyForAgent = normalizeLabelInput(\n readyForAgentResult,\n DEFAULT_RUNNER_LABELS.readyForAgent\n );\n\n const agentInProgressResult = await text({\n message: \"Label name for issues currently being worked on by an agent?\",\n placeholder: DEFAULT_RUNNER_LABELS.agentInProgress,\n });\n if (isCancel(agentInProgressResult)) {\n return {\n docsMigration: docsMigration ?? \"copy\",\n agentFile: agentFile ?? \"both\",\n packageManager,\n legacySkills,\n noGitCheck,\n labels,\n cancelled: true,\n };\n }\n labels.agentInProgress = normalizeLabelInput(\n agentInProgressResult,\n DEFAULT_RUNNER_LABELS.agentInProgress\n );\n\n const blockedResult = await text({\n message: \"Label name for issues blocked by dependencies?\",\n placeholder: DEFAULT_RUNNER_LABELS.blocked,\n });\n if (isCancel(blockedResult)) {\n return {\n docsMigration: docsMigration ?? \"copy\",\n agentFile: agentFile ?? \"both\",\n packageManager,\n legacySkills,\n noGitCheck,\n labels,\n cancelled: true,\n };\n }\n labels.blocked = normalizeLabelInput(\n blockedResult,\n DEFAULT_RUNNER_LABELS.blocked\n );\n\n const prOpenAwaitingMergeResult = await text({\n message: \"Label name for PRs awaiting merge?\",\n placeholder: DEFAULT_RUNNER_LABELS.prOpenAwaitingMerge,\n });\n if (isCancel(prOpenAwaitingMergeResult)) {\n return {\n docsMigration: docsMigration ?? \"copy\",\n agentFile: agentFile ?? \"both\",\n packageManager,\n legacySkills,\n noGitCheck,\n labels,\n cancelled: true,\n };\n }\n labels.prOpenAwaitingMerge = normalizeLabelInput(\n prOpenAwaitingMergeResult,\n DEFAULT_RUNNER_LABELS.prOpenAwaitingMerge\n );\n\n const readyForHumanResult = await text({\n message: \"Label name for issues requiring human implementation?\",\n placeholder: DEFAULT_RUNNER_LABELS.readyForHuman,\n });\n if (isCancel(readyForHumanResult)) {\n return {\n docsMigration: docsMigration ?? \"copy\",\n agentFile: agentFile ?? \"both\",\n packageManager,\n legacySkills,\n noGitCheck,\n labels,\n cancelled: true,\n };\n }\n labels.readyForHuman = normalizeLabelInput(\n readyForHumanResult,\n DEFAULT_RUNNER_LABELS.readyForHuman\n );\n\n if (plan.warnings.some((w) => w.toLowerCase().includes(\"uncommitted\"))) {\n log.warn(\n \"Local source has uncommitted changes — proceeding with dirty state.\"\n );\n }\n\n if (\n plan.warnings.some((w) => w.toLowerCase().includes(\"not a git\")) &&\n !noGitCheck\n ) {\n const result = await confirm({\n message:\n \"Target is not a Git repository. Continue without Git integration?\",\n initialValue: false,\n });\n if (isCancel(result) || !result) {\n return {\n docsMigration: docsMigration ?? \"copy\",\n agentFile: agentFile ?? \"both\",\n packageManager,\n legacySkills,\n noGitCheck,\n labels,\n cancelled: true,\n };\n }\n noGitCheck = true;\n }\n\n return {\n docsMigration: docsMigration ?? \"copy\",\n agentFile: agentFile ?? \"both\",\n packageManager,\n legacySkills,\n noGitCheck,\n labels,\n cancelled: false,\n };\n}\n\nasync function writeFileAtomic(\n filePath: string,\n content: string\n): Promise<void> {\n const tmpPath = `${filePath}.tmp.${randomUUID()}`;\n await writeFile(tmpPath, content, \"utf-8\");\n await rename(tmpPath, filePath);\n}\n\nconst MANAGED_BLOCK_BEGIN = \"<!-- BEGIN POURKIT MANAGED BLOCK -->\";\nconst MANAGED_BLOCK_END = \"<!-- END POURKIT MANAGED BLOCK -->\";\n\nasync function updateManagedBlock(\n filePath: string,\n content: string\n): Promise<void> {\n const blockContent = `${MANAGED_BLOCK_BEGIN}\\n${content}${MANAGED_BLOCK_END}\\n`;\n\n if (!existsSync(filePath)) {\n const dir = path.dirname(filePath);\n await mkdir(dir, { recursive: true });\n await writeFileAtomic(filePath, blockContent);\n return;\n }\n\n const existing = await readFile(filePath, \"utf-8\");\n const beginIdx = existing.indexOf(MANAGED_BLOCK_BEGIN);\n const endIdx = existing.indexOf(MANAGED_BLOCK_END);\n\n if (beginIdx !== -1 && endIdx !== -1 && endIdx > beginIdx) {\n const before = existing.slice(0, beginIdx);\n const after = existing.slice(endIdx + MANAGED_BLOCK_END.length);\n await writeFileAtomic(filePath, before + blockContent + after);\n } else {\n const suffix = existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n await writeFileAtomic(filePath, existing + suffix + blockContent + \"\\n\");\n }\n}\n\nexport interface ApplyResult {\n applied: number;\n skipped: number;\n errors: string[];\n warnings: string[];\n}\n\nexport interface InitManifest {\n schemaVersion: 1;\n initializedAt: string;\n pourkit: {\n versionSource: \"local-git\";\n releaseVersion: string | null;\n releaseChannel: string;\n sourceBranch: string;\n sourceGitSha: string;\n sourceDirty: boolean;\n sourcePath: string;\n };\n agentFiles: string[];\n packageManager: string | null;\n assets: Record<string, { ownership: InitOwnership; sha256: string }>;\n}\n\nexport async function writeManifest(\n plan: InitPlan,\n sourceMeta: LocalSourceMetadata,\n agentFiles: string[],\n packageManager: string | null\n): Promise<InitManifest> {\n const manifestDir = path.join(plan.targetRoot, \".pourkit\");\n const manifestPath = path.join(manifestDir, \"manifest.json\");\n\n const assets: Record<string, { ownership: InitOwnership; sha256: string }> =\n {};\n for (const op of plan.operations) {\n if (!op.path) continue;\n if (\n op.kind !== \"create\" &&\n op.kind !== \"copy\" &&\n op.kind !== \"update\" &&\n op.kind !== \"move\"\n )\n continue;\n if (op.requiresConfirmation) continue;\n const relPath = path.relative(plan.targetRoot, op.path);\n if (relPath === \".pourkit/manifest.json\") continue;\n if (existsSync(op.path)) {\n const sha256 = await computeFileChecksum(op.path);\n assets[relPath] = {\n ownership: op.ownership || \"managed\",\n sha256,\n };\n }\n }\n\n const manifest: InitManifest = {\n schemaVersion: 1,\n initializedAt: new Date().toISOString(),\n pourkit: {\n versionSource: \"local-git\",\n releaseVersion: sourceMeta.latestTag,\n releaseChannel: sourceMeta.releaseChannel,\n sourceBranch: sourceMeta.branch,\n sourceGitSha: sourceMeta.sha,\n sourceDirty: sourceMeta.sourceDirty,\n sourcePath: plan.sourceRoot,\n },\n agentFiles,\n packageManager,\n assets,\n };\n\n await mkdir(manifestDir, { recursive: true });\n await writeFileAtomic(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n\n return manifest;\n}\n\nexport type ExecCommand = (\n command: string,\n args: string[],\n options?: { cwd?: string }\n) => Promise<{ stdout: string; stderr: string }>;\n\nexport async function applyInitPlan(\n plan: InitPlan,\n options?: {\n labelConflictPolicy?: LabelConflictPolicy;\n execCommand?: ExecCommand;\n githubClient?: GitHubClient;\n }\n): Promise<ApplyResult> {\n let applied = 0;\n let skipped = 0;\n const errors: string[] = [];\n const warnings: string[] = [];\n\n for (const op of plan.operations) {\n if (op.requiresConfirmation) {\n skipped++;\n continue;\n }\n try {\n switch (op.kind) {\n case \"create\": {\n if (!op.path) {\n skipped++;\n continue;\n }\n if (existsSync(op.path) && !op.destructive) {\n skipped++;\n continue;\n }\n const dir = path.dirname(op.path);\n await mkdir(dir, { recursive: true });\n await writeFileAtomic(op.path, op.content ?? \"\");\n applied++;\n break;\n }\n case \"copy\": {\n if (!op.path || !op.sourcePath) {\n skipped++;\n continue;\n }\n if (existsSync(op.path)) {\n skipped++;\n continue;\n }\n const srcStat = statSync(op.sourcePath);\n if (srcStat.isDirectory()) {\n skipped++;\n } else {\n const dir = path.dirname(op.path);\n await mkdir(dir, { recursive: true });\n await copyFile(op.sourcePath, op.path);\n applied++;\n }\n break;\n }\n case \"update\": {\n if (!op.path) {\n skipped++;\n continue;\n }\n await updateManagedBlock(op.path, op.content ?? \"\");\n applied++;\n break;\n }\n case \"move\": {\n if (!op.path || !op.sourcePath) {\n skipped++;\n continue;\n }\n if (existsSync(op.path)) {\n skipped++;\n continue;\n }\n const dir = path.dirname(op.path);\n await mkdir(dir, { recursive: true });\n await rename(op.sourcePath, op.path);\n applied++;\n break;\n }\n case \"provision-label\": {\n if (!op.labelName) {\n skipped++;\n continue;\n }\n const client = options?.githubClient;\n if (!client) {\n warnings.push(NO_TOKEN_LABEL_PROVISIONING_WARNING);\n skipped++;\n continue;\n }\n const policy =\n options?.labelConflictPolicy ?? \"skip-metadata-changes\";\n const labelColor = (op.labelColor ?? \"\").replace(/^#/, \"\");\n try {\n await client.octokit.rest.issues.createLabel({\n owner: client.owner,\n repo: client.repo,\n name: op.labelName,\n color: labelColor,\n description: op.labelDescription ?? \"\",\n });\n applied++;\n } catch {\n if (policy === \"update-to-pourkit\") {\n try {\n await client.octokit.rest.issues.updateLabel({\n owner: client.owner,\n repo: client.repo,\n name: op.labelName,\n color: labelColor,\n description: op.labelDescription ?? \"\",\n });\n warnings.push(\n `Updated existing label metadata: ${op.labelName}`\n );\n applied++;\n } catch (editErr) {\n warnings.push(\n `Failed to update label metadata for ${op.labelName}: ${editErr instanceof Error ? editErr.message : String(editErr)}`\n );\n skipped++;\n }\n } else if (policy === \"keep-existing\") {\n warnings.push(\n `Label already exists, keeping existing metadata: ${op.labelName}`\n );\n skipped++;\n } else {\n warnings.push(\n `Label creation skipped for ${op.labelName}: already exists (policy: skip-metadata-changes)`\n );\n skipped++;\n }\n }\n break;\n }\n case \"skip\":\n case \"warn\":\n case \"install\":\n skipped++;\n break;\n }\n } catch (e) {\n errors.push(\n `Failed to apply ${op.kind} ${op.path ?? \"\"}: ${e instanceof Error ? e.message : String(e)}`\n );\n }\n }\n\n return { applied, skipped, errors, warnings };\n}\n\nexport interface ApplyInitFromSourceOptions {\n targetRoot: string;\n fromLocal: string;\n dryRun?: boolean;\n conflictPolicy?: InitConflictPolicy;\n legacySkills?: boolean;\n packageManager?: string;\n noGitCheck?: boolean;\n skipInstall?: boolean;\n labels?: RunnerLabelsConfig;\n labelConflictPolicy?: LabelConflictPolicy;\n}\n\nexport interface ApplyInitFromSourceResult {\n applied: number;\n skipped: number;\n errors: string[];\n warnings: string[];\n manifestWritten: boolean;\n}\n\nexport async function applyInitFromSource(\n options: ApplyInitFromSourceOptions\n): Promise<ApplyInitFromSourceResult> {\n const {\n targetRoot,\n fromLocal,\n dryRun = false,\n conflictPolicy,\n legacySkills,\n packageManager,\n noGitCheck,\n skipInstall,\n labelConflictPolicy,\n } = options;\n\n const ghClientResult = await tryCreateGitHubClient({ cwd: targetRoot });\n const githubClient = ghClientResult.ok ? ghClientResult.client : undefined;\n\n const plan = await planInit({\n targetRoot,\n sourceRoot: fromLocal,\n conflictPolicy,\n legacySkills,\n packageManager,\n noGitCheck,\n skipInstall,\n labels: options.labels,\n labelConflictPolicy,\n githubClient,\n });\n\n if (dryRun) {\n return {\n applied: 0,\n skipped: 0,\n errors: [],\n warnings: [],\n manifestWritten: false,\n };\n }\n\n let sourceMeta: LocalSourceMetadata;\n try {\n sourceMeta = await discoverLocalSource(fromLocal);\n } catch {\n sourceMeta = {\n versionSource: \"local-path\",\n sourceDirty: false,\n branch: \"unknown\",\n sha: \"0000000\",\n releaseChannel: \"unknown\",\n latestTag: null,\n };\n }\n\n const result = await applyInitPlan(plan, {\n labelConflictPolicy,\n githubClient,\n });\n\n let manifestWritten = false;\n if (result.errors.length === 0) {\n const manifestSkipped = plan.operations.some(\n (op) =>\n op.kind === \"skip\" &&\n op.path === path.join(targetRoot, \".pourkit\", \"manifest.json\")\n );\n if (!manifestSkipped) {\n const agentFiles: string[] = [];\n for (const name of [\"AGENTS.md\", \"CLAUDE.md\"]) {\n if (existsSync(path.join(targetRoot, name))) {\n agentFiles.push(path.join(targetRoot, name));\n }\n }\n const pm = detectPackageManager(targetRoot);\n await writeManifest(plan, sourceMeta, agentFiles, pm);\n manifestWritten = true;\n }\n }\n\n return { ...result, manifestWritten };\n}\n\nexport async function runInitCommand(options: InitCliOptions): Promise<void> {\n const targetRoot = options.cwd ?? process.cwd();\n const isInteractive = process.stdin.isTTY && !options.yes;\n\n if (options.json && !options.dryRun) {\n console.error(\"Error: --json is only supported with --dry-run.\");\n process.exit(1);\n }\n\n if (options.docsMigration === \"move\" && !options.yes) {\n throw new Error(\"--docs-migration move requires --yes.\");\n }\n\n if (!isInteractive && !options.yes && !options.dryRun) {\n const missing: string[] = [];\n if (!options.fromLocal) missing.push(\"--from-local\");\n if (!options.docsMigration) missing.push(\"--docs-migration\");\n if (!options.agentFile) missing.push(\"--agent-file\");\n if (!options.packageManager) {\n const pm = detectPackageManager(targetRoot);\n if (!pm) missing.push(\"--package-manager\");\n }\n if (options.docsMigration === \"move\" && !options.yes) {\n missing.push(\"--yes (required for --docs-migration move)\");\n }\n if (missing.length > 0) {\n throw new Error(`Missing required init options: ${missing.join(\", \")}`);\n }\n }\n\n let promptLabels: RunnerLabelsConfig | undefined;\n\n if (isInteractive) {\n const discoveryPlan = await planInit({\n targetRoot,\n sourceRoot: options.fromLocal,\n conflictPolicy: options.fromLocal\n ? {\n docsMigration: options.docsMigration ?? \"copy\",\n agentFile: options.agentFile ?? \"both\",\n yes: false,\n }\n : undefined,\n legacySkills: options.legacySkills,\n packageManager: options.packageManager,\n noGitCheck: options.noGitCheck,\n skipInstall: options.skipInstall,\n });\n\n const promptResult = await promptForInitChoices(discoveryPlan, {\n docsMigration: options.docsMigration,\n agentFile: options.agentFile,\n packageManager: options.packageManager,\n legacySkills: options.legacySkills,\n noGitCheck: options.noGitCheck,\n });\n\n if (promptResult.cancelled) {\n log.info(\"Init cancelled.\");\n return;\n }\n\n options = {\n ...options,\n docsMigration: options.docsMigration ?? promptResult.docsMigration,\n agentFile: options.agentFile ?? promptResult.agentFile,\n packageManager:\n options.packageManager ??\n (promptResult.packageManager as\n | \"npm\"\n | \"pnpm\"\n | \"yarn\"\n | \"bun\"\n | undefined),\n legacySkills: options.legacySkills ?? promptResult.legacySkills,\n noGitCheck: options.noGitCheck ?? promptResult.noGitCheck,\n };\n promptLabels = promptResult.labels;\n }\n\n const conflictPolicy = options.fromLocal\n ? {\n docsMigration: options.docsMigration ?? (\"copy\" as DocsMigrationMode),\n agentFile: options.agentFile ?? (\"both\" as AgentFileMode),\n yes: options.yes ?? false,\n }\n : undefined;\n\n const planLabels = isInteractive\n ? (promptLabels ?? DEFAULT_RUNNER_LABELS)\n : DEFAULT_RUNNER_LABELS;\n\n const plan = await planInit({\n targetRoot,\n sourceRoot: options.fromLocal,\n conflictPolicy,\n legacySkills: options.legacySkills,\n packageManager: options.packageManager,\n noGitCheck: options.noGitCheck,\n skipInstall: options.skipInstall,\n labels: planLabels,\n });\n\n let planLabelConflictPolicy: LabelConflictPolicy = \"skip-metadata-changes\";\n if (isInteractive && plan.hasLabelConflicts) {\n const conflictResult = await select({\n message:\n \"How should existing GitHub label metadata conflicts be handled?\",\n options: [\n {\n value: \"skip-metadata-changes\",\n label: \"Skip metadata changes (safe default)\",\n },\n {\n value: \"keep-existing\",\n label: \"Keep existing label metadata\",\n },\n {\n value: \"update-to-pourkit\",\n label: \"Update to Pourkit metadata\",\n },\n ],\n });\n if (isCancel(conflictResult)) {\n log.info(\"Init cancelled.\");\n return;\n }\n planLabelConflictPolicy = conflictResult as LabelConflictPolicy;\n }\n\n if (options.json) {\n console.log(renderInitPlanJson(plan));\n } else {\n console.log(renderInitPlan(plan));\n }\n\n if (plan.warnings.length > 0 && !options.json) {\n console.error(\n `\\n${plan.warnings.length} warning(s) — review above before applying.`\n );\n }\n\n if (options.dryRun) {\n if (!options.json) {\n console.log(\"\\nDry-run — no files were written.\");\n }\n return;\n }\n\n if (!options.fromLocal) {\n console.error(\n \"\\nError: --from-local <path> is required to apply the init plan.\"\n );\n process.exit(1);\n }\n\n const result = await applyInitFromSource({\n targetRoot,\n fromLocal: options.fromLocal,\n conflictPolicy,\n legacySkills: options.legacySkills,\n packageManager: options.packageManager,\n noGitCheck: options.noGitCheck,\n skipInstall: options.skipInstall,\n labels: planLabels,\n labelConflictPolicy: planLabelConflictPolicy,\n });\n\n if (result.errors.length > 0) {\n for (const err of result.errors) {\n console.error(` ERROR: ${err}`);\n }\n console.error(\n `\\nInit apply failed with ${result.errors.length} error(s). No manifest written.`\n );\n process.exit(1);\n }\n\n if (result.warnings.length > 0) {\n for (const w of result.warnings) {\n console.warn(` WARN: ${w}`);\n }\n }\n\n console.log(\n `\\nInit applied: ${result.applied} operations applied, ${result.skipped} skipped.`\n );\n if (!options.json) {\n if (result.manifestWritten) {\n console.log(`Manifest written: .pourkit/manifest.json`);\n } else {\n console.log(`Existing manifest preserved.`);\n }\n }\n}\n","import { Octokit } from \"octokit\";\n\nexport interface GitHubClient {\n octokit: Octokit;\n owner: string;\n repo: string;\n}\n\nexport interface GitHubClientOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n repository?: string;\n}\n\nconst REMOTE_PATTERN = /github\\.com[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/;\n\nexport function resolveGitHubToken(env: NodeJS.ProcessEnv): string {\n const token = env.POURKIT_GITHUB_TOKEN ?? env.GH_TOKEN ?? env.GITHUB_TOKEN;\n if (!token) {\n throw new Error(\n \"GitHub token is required. Set POURKIT_GITHUB_TOKEN, GH_TOKEN, or GITHUB_TOKEN.\"\n );\n }\n return token;\n}\n\nexport async function resolveGitHubRepository(\n options?: GitHubClientOptions\n): Promise<{ owner: string; repo: string }> {\n if (options?.repository) {\n const parts = options.repository.split(\"/\");\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n throw new Error(\n `Invalid repository format: \"${options.repository}\". Expected \"owner/repo\".`\n );\n }\n return { owner: parts[0], repo: parts[1] };\n }\n\n const env = options?.env ?? process.env;\n const envRepo = env.GITHUB_REPOSITORY;\n if (envRepo) {\n const parts = envRepo.split(\"/\");\n if (parts.length === 2 && parts[0] && parts[1]) {\n return { owner: parts[0], repo: parts[1] };\n }\n throw new Error(\n `Invalid repository format: \"${envRepo}\". Expected \"owner/repo\".`\n );\n }\n\n const { execCapture } = await import(\"../shared/common\");\n const cwd = options?.cwd;\n try {\n const result = await execCapture(\"git\", [\"remote\", \"get-url\", \"origin\"], {\n cwd,\n });\n const remote = result.stdout.trim();\n const match = remote.match(REMOTE_PATTERN);\n if (match) {\n return { owner: match[1], repo: match[2] };\n }\n } catch {\n // fall through to error\n }\n\n throw new Error(\n \"Could not resolve GitHub repository. Set GITHUB_REPOSITORY env var or ensure a valid 'origin' remote exists.\"\n );\n}\n\nexport async function requireGitHubClient(\n options?: GitHubClientOptions\n): Promise<GitHubClient> {\n const env = options?.env ?? process.env;\n const token = resolveGitHubToken(env);\n const repo = await resolveGitHubRepository(options);\n\n const octokit = new Octokit({ auth: token });\n\n return { octokit, ...repo };\n}\n\nexport async function tryCreateGitHubClient(\n options?: GitHubClientOptions\n): Promise<\n | { ok: true; client: GitHubClient }\n | {\n ok: false;\n reason: \"missing-token\" | \"missing-repository\" | \"invalid-repository\";\n message: string;\n }\n> {\n const env = options?.env ?? process.env;\n\n let token: string;\n try {\n token = resolveGitHubToken(env);\n } catch {\n return {\n ok: false,\n reason: \"missing-token\",\n message: \"GitHub token is not configured.\",\n };\n }\n\n let repo: { owner: string; repo: string };\n try {\n repo = await resolveGitHubRepository(options);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n if (message.includes(\"Invalid repository format\")) {\n return { ok: false, reason: \"invalid-repository\", message };\n }\n return { ok: false, reason: \"missing-repository\", message };\n }\n\n const octokit = new Octokit({ auth: token });\n\n return { ok: true, client: { octokit, ...repo } };\n}\n","import type { IssueData } from \"../shared/config\";\nimport { parseStackedIssue } from \"../issues/stacked-issue\";\nimport type { BlockedIssue } from \"../issues/blocked-issue\";\nimport type { IssueProvider } from \"./issue-provider\";\nimport type { GitHubClient } from \"./github-client\";\n\nexport class GitHubIssueProvider implements IssueProvider {\n private readonly client: GitHubClient;\n private readonly readyForAgentLabel: string;\n private readonly blockedLabel: string;\n private readonly issueListLimit: number;\n\n constructor(\n client: GitHubClient,\n options?: {\n readyForAgentLabel?: string;\n blockedLabel?: string;\n issueListLimit?: number;\n }\n ) {\n this.client = client;\n this.readyForAgentLabel = options?.readyForAgentLabel ?? \"ready-for-agent\";\n this.blockedLabel = options?.blockedLabel ?? \"blocked\";\n this.issueListLimit = options?.issueListLimit ?? 50;\n }\n\n async fetchIssue(number: number): Promise<IssueData> {\n const { data } = await this.client.octokit.rest.issues.get({\n owner: this.client.owner,\n repo: this.client.repo,\n issue_number: number,\n });\n\n const commentsData = await this.client.octokit.paginate(\n this.client.octokit.rest.issues.listComments,\n {\n owner: this.client.owner,\n repo: this.client.repo,\n issue_number: number,\n }\n );\n\n return {\n number: data.number,\n title: data.title,\n body: data.body ?? \"\",\n state: data.state as \"open\" | \"closed\",\n labels: data.labels.map((l) =>\n typeof l === \"string\" ? l : (l.name ?? \"\")\n ),\n comments: commentsData.map((c) => c.body ?? \"\"),\n };\n }\n\n async addLabels(issueNumber: number, labels: string[]): Promise<void> {\n if (labels.length === 0) return;\n await this.client.octokit.rest.issues.addLabels({\n owner: this.client.owner,\n repo: this.client.repo,\n issue_number: issueNumber,\n labels,\n });\n }\n\n async removeLabel(issueNumber: number, label: string): Promise<void> {\n await this.client.octokit.rest.issues.removeLabel({\n owner: this.client.owner,\n repo: this.client.repo,\n issue_number: issueNumber,\n name: label,\n });\n }\n\n async closeIssue(issueNumber: number): Promise<void> {\n const { data } = await this.client.octokit.rest.issues.get({\n owner: this.client.owner,\n repo: this.client.repo,\n issue_number: issueNumber,\n });\n if (data.pull_request) return;\n\n const maxRetries = 3;\n const backoffMs = 2000;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n await this.client.octokit.rest.issues.update({\n owner: this.client.owner,\n repo: this.client.repo,\n issue_number: issueNumber,\n state: \"closed\",\n state_reason: \"completed\",\n });\n return;\n } catch (error) {\n const isTransient =\n error instanceof Error && /HTTP (502|503|504)\\b/.test(error.message);\n const isOctokitTransient =\n typeof error === \"object\" &&\n error !== null &&\n \"status\" in error &&\n (error.status === 502 ||\n error.status === 503 ||\n error.status === 504);\n if ((!isTransient && !isOctokitTransient) || attempt === maxRetries) {\n throw error;\n }\n await new Promise((r) =>\n setTimeout(r, backoffMs * Math.pow(2, attempt - 1))\n );\n }\n }\n }\n\n async commentIssue(issueNumber: number, body: string): Promise<void> {\n await this.client.octokit.rest.issues.createComment({\n owner: this.client.owner,\n repo: this.client.repo,\n issue_number: issueNumber,\n body,\n });\n }\n\n async getComments(issueNumber: number): Promise<string[]> {\n const data = await this.client.octokit.paginate(\n this.client.octokit.rest.issues.listComments,\n {\n owner: this.client.owner,\n repo: this.client.repo,\n issue_number: issueNumber,\n }\n );\n return data.map((comment) => comment.body ?? \"\");\n }\n\n async listCandidates(): Promise<IssueData[]> {\n const data = await this.client.octokit.paginate(\n this.client.octokit.rest.issues.listForRepo,\n {\n owner: this.client.owner,\n repo: this.client.repo,\n state: \"open\",\n labels: this.readyForAgentLabel,\n per_page: 100,\n }\n );\n\n return data\n .filter((issue) => !issue.pull_request)\n .map((issue) => mapRawIssue(issue))\n .slice(0, this.issueListLimit);\n }\n\n async listBlockedIssues(): Promise<BlockedIssue[]> {\n const data = await this.client.octokit.paginate(\n this.client.octokit.rest.issues.listForRepo,\n {\n owner: this.client.owner,\n repo: this.client.repo,\n state: \"open\",\n labels: this.blockedLabel,\n per_page: 100,\n }\n );\n\n return data\n .filter((issue) => !issue.pull_request)\n .map((issue) => ({\n number: issue.number,\n body: issue.body ?? null,\n labels: issue.labels.map((l) => ({\n name: typeof l === \"string\" ? l : (l.name ?? \"\"),\n })),\n }))\n .slice(0, this.issueListLimit);\n }\n\n async listRelatedIssues(parentRef: string): Promise<IssueData[]> {\n const data = await this.client.octokit.paginate(\n this.client.octokit.rest.issues.listForRepo,\n {\n owner: this.client.owner,\n repo: this.client.repo,\n state: \"all\",\n per_page: 100,\n }\n );\n\n return data\n .filter((issue) => !issue.pull_request)\n .map((issue) => mapRawIssue(issue))\n .slice(0, this.issueListLimit)\n .filter(\n (issue) =>\n parseStackedIssue(issue.title, issue.body).parentRef === parentRef\n );\n }\n\n async resolveIssueByCanonicalRef(ref: string): Promise<IssueData | null> {\n const canonical = ref.trim().toUpperCase();\n const data = await this.client.octokit.paginate(\n this.client.octokit.rest.issues.listForRepo,\n {\n owner: this.client.owner,\n repo: this.client.repo,\n state: \"all\",\n per_page: 100,\n }\n );\n\n const match = data\n .filter((issue) => !issue.pull_request)\n .slice(0, this.issueListLimit)\n .find((issue) => issue.title.toUpperCase().startsWith(`${canonical}:`));\n if (!match) return null;\n return mapRawIssue(match);\n }\n}\n\nfunction mapRawIssue(issue: {\n number: number;\n title: string;\n body?: string | null;\n state: string;\n labels: Array<{ name?: string | null } | string>;\n created_at?: string | null;\n}): IssueData {\n return {\n number: issue.number,\n title: issue.title,\n body: issue.body ?? \"\",\n state: issue.state.toLowerCase() as \"open\" | \"closed\",\n labels: issue.labels.map((l) =>\n typeof l === \"string\" ? l : (l.name ?? \"\")\n ),\n comments: [],\n createdAt: new Date(issue.created_at ?? \"\"),\n };\n}\n","import type {\n PRProvider,\n PullRequest,\n CreatePrOptions,\n CheckStatus,\n EnableAutoMergeOptions,\n MergePrOptions,\n WaitForPrChecksOptions,\n BranchStatus,\n} from \"./pr-provider\";\nimport { sleep } from \"../shared/common\";\nimport type { PourkitLogger } from \"../shared/common\";\nimport type { GitHubClient } from \"./github-client\";\n\nconst TERMINAL_FAILURE_STATES = new Set([\n \"FAILURE\",\n \"CANCELLED\",\n \"TIMED_OUT\",\n \"STARTUP_FAILURE\",\n \"ACTION_REQUIRED\",\n \"STALE\",\n]);\n\nconst GREEN_CHECK_CONCLUSIONS = new Set([\"SUCCESS\", \"NEUTRAL\", \"SKIPPED\"]);\n\nexport class GitHubPRProvider implements PRProvider {\n private client: GitHubClient;\n private logger: PourkitLogger;\n\n constructor(client: GitHubClient, logger: PourkitLogger) {\n this.client = client;\n this.logger = logger;\n }\n\n async createPr(options: CreatePrOptions): Promise<PullRequest> {\n this.logger.step(\"pr\", `creating PR \"${options.title}\"`);\n\n const { data } = await this.client.octokit.rest.pulls.create({\n owner: this.client.owner,\n repo: this.client.repo,\n title: options.title,\n body: options.body,\n head: options.head,\n base: options.base,\n });\n\n const pr = mapOctokitPr(data);\n\n this.logger.kv(\"PR_NUMBER\", String(pr.number));\n this.logger.kv(\"PR_URL\", pr.url);\n\n return pr;\n }\n\n async getPr(branchName: string): Promise<PullRequest | null> {\n try {\n const { data } = await this.client.octokit.rest.pulls.list({\n owner: this.client.owner,\n repo: this.client.repo,\n head: `${this.client.owner}:${branchName}`,\n state: \"all\",\n per_page: 1,\n });\n\n if (data.length === 0) {\n return null;\n }\n\n return mapOctokitPr(data[0]);\n } catch {\n return null;\n }\n }\n\n async getPrByNumber(prNumber: number): Promise<PullRequest | null> {\n try {\n const { data } = await this.client.octokit.rest.pulls.get({\n owner: this.client.owner,\n repo: this.client.repo,\n pull_number: prNumber,\n });\n\n return mapOctokitPr(data);\n } catch {\n return null;\n }\n }\n\n async getCheckStatus(prNumber: number): Promise<CheckStatus[]> {\n try {\n const { data: pr } = await this.client.octokit.rest.pulls.get({\n owner: this.client.owner,\n repo: this.client.repo,\n pull_number: prNumber,\n });\n\n const headSha = pr.head.sha;\n\n const [checkRuns, combinedStatusResponse] = await Promise.all([\n this.client.octokit.paginate(\n this.client.octokit.rest.checks.listForRef,\n {\n owner: this.client.owner,\n repo: this.client.repo,\n ref: headSha,\n }\n ),\n this.client.octokit.rest.repos.getCombinedStatusForRef({\n owner: this.client.owner,\n repo: this.client.repo,\n ref: headSha,\n }),\n ]);\n\n const checks: CheckStatus[] = [];\n\n for (const run of checkRuns) {\n checks.push({\n name: run.name,\n conclusion: mapCheckConclusion(run.conclusion),\n status: mapCheckRunStatus(run.status),\n });\n }\n\n for (const status of combinedStatusResponse.data.statuses) {\n checks.push(\n mapCommitStatus({ context: status.context, state: status.state })\n );\n }\n\n return checks;\n } catch (error) {\n this.logger.step(\n \"warn\",\n `Failed to get check status for PR #${prNumber}: ${error instanceof Error ? error.message : String(error)}`\n );\n return [];\n }\n }\n\n async enableAutoMerge(\n pr: PullRequest,\n options?: EnableAutoMergeOptions\n ): Promise<void> {\n const method = (options?.method ?? \"squash\").toUpperCase();\n\n await this.client.octokit.graphql(\n `mutation enablePullRequestAutoMerge(\n $pullRequestId: ID!\n $mergeMethod: PullRequestMergeMethod\n $expectedHeadOid: GitObjectID\n ) {\n enablePullRequestAutoMerge(input: {\n pullRequestId: $pullRequestId\n mergeMethod: $mergeMethod\n expectedHeadOid: $expectedHeadOid\n }) {\n pullRequest {\n id\n number\n }\n }\n }`,\n {\n pullRequestId: pr.nodeId,\n mergeMethod: method,\n expectedHeadOid: options?.expectedHeadOid,\n }\n );\n }\n\n async mergePr(prNumber: number, options?: MergePrOptions): Promise<void> {\n const method = options?.method ?? \"squash\";\n this.logger.step(\"pr\", `merging PR #${prNumber} with ${method} merge`);\n\n await this.client.octokit.rest.pulls.merge({\n owner: this.client.owner,\n repo: this.client.repo,\n pull_number: prNumber,\n merge_method: method,\n sha: options?.matchHeadCommit,\n });\n }\n\n async waitForPrChecks(\n prNumber: number,\n options?: WaitForPrChecksOptions\n ): Promise<CheckStatus[]> {\n const checksFoundTimeoutMs = options?.checksFoundTimeoutMs ?? 60 * 1000;\n const checksCompletionTimeoutMs =\n options?.checksCompletionTimeoutMs ?? 30 * 60 * 1000;\n const pollIntervalMs = options?.pollIntervalMs ?? 15 * 1000;\n const requiredChecks = options?.requiredChecks ?? [];\n\n const discoveredDeadline = Date.now() + checksFoundTimeoutMs;\n let completionDeadline = 0;\n let checksDiscovered = false;\n this.logger.step(\"pr\", `waiting for checks on PR #${prNumber}`);\n\n while (true) {\n const observedAt = Date.now();\n const checks = await this.getCheckStatus(prNumber);\n\n if (!hasRequiredChecks(checks, requiredChecks)) {\n if (Date.now() >= discoveredDeadline) {\n if (requiredChecks.length === 0) {\n this.logger.step(\n \"info\",\n \"No checks appeared within grace period, treating as passed\"\n );\n return [];\n }\n\n throw new Error(\n `Timeout waiting for required checks on PR #${prNumber}: ${requiredChecks.join(\", \")}`\n );\n }\n\n this.logger.step(\n \"info\",\n requiredChecks.length === 0\n ? `No checks found, waiting... (${secondsRemaining(discoveredDeadline, observedAt)}s remaining)`\n : `Waiting for required checks to appear: ${requiredChecks.join(\", \")} (${secondsRemaining(discoveredDeadline, observedAt)}s remaining)`\n );\n await sleep(pollIntervalMs);\n continue;\n }\n\n const filteredChecks = filterChecks(checks, requiredChecks);\n\n if (!checksDiscovered) {\n checksDiscovered = true;\n completionDeadline = observedAt + checksCompletionTimeoutMs;\n }\n\n this.logger.step(\"info\", `Checks: ${formatChecks(filteredChecks)}`);\n\n const evaluation = evaluateChecks(filteredChecks);\n if (evaluation.complete && evaluation.failed.length === 0) {\n this.logger.step(\"success\", \"All checks passed\");\n return checks;\n }\n\n if (evaluation.complete) {\n throw new Error(`Checks failed: ${formatChecks(evaluation.failed)}`);\n }\n\n if (Date.now() >= completionDeadline) {\n throw new Error(`Timeout waiting for checks on PR #${prNumber}`);\n }\n\n this.logger.step(\n \"info\",\n `Checks still pending, waiting... (${secondsRemaining(completionDeadline, observedAt)}s remaining)`\n );\n await sleep(pollIntervalMs);\n }\n }\n\n async getBranchStatus(branchName: string): Promise<BranchStatus> {\n this.logger.step(\"pr\", `getting branch status for ${branchName}`);\n\n try {\n const targetStatus = await this.getTargetBranchStatus(branchName);\n\n let state: BranchStatus[\"state\"] = \"pending\";\n\n if (targetStatus.checks.length > 0) {\n const hasFailure = targetStatus.checks.some(\n (check) =>\n check.conclusion !== null &&\n TERMINAL_FAILURE_STATES.has(check.conclusion)\n );\n const allComplete = targetStatus.checks.every(\n (check) => check.status === \"COMPLETED\"\n );\n const allGreen = targetStatus.checks.every(\n (check) =>\n check.conclusion !== null &&\n GREEN_CHECK_CONCLUSIONS.has(check.conclusion)\n );\n\n if (hasFailure) {\n state = \"red\";\n } else if (allComplete && allGreen) {\n state = \"green\";\n }\n }\n\n return {\n headSha: targetStatus.headSha,\n state,\n checks: targetStatus.checks,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to get branch status for ${branchName}: ${message}`\n );\n }\n }\n\n private async getTargetBranchStatus(\n branchName: string\n ): Promise<{ branchName: string; headSha: string; checks: CheckStatus[] }> {\n const { data: branch } = await this.client.octokit.rest.repos.getBranch({\n owner: this.client.owner,\n repo: this.client.repo,\n branch: branchName,\n });\n\n const headSha = branch.commit.sha;\n\n const [checkRuns, combinedStatusResponse] = await Promise.all([\n this.client.octokit.paginate(this.client.octokit.rest.checks.listForRef, {\n owner: this.client.owner,\n repo: this.client.repo,\n ref: headSha,\n }),\n this.client.octokit.rest.repos.getCombinedStatusForRef({\n owner: this.client.owner,\n repo: this.client.repo,\n ref: headSha,\n }),\n ]);\n\n return {\n branchName,\n headSha,\n checks: [\n ...checkRuns.map((check) => ({\n name: check.name,\n status: mapCheckRunStatus(check.status),\n conclusion: mapCheckConclusion(check.conclusion),\n })),\n ...combinedStatusResponse.data.statuses.map((status) =>\n mapCommitStatus(status)\n ),\n ],\n };\n }\n}\n\nfunction mapOctokitPr(data: {\n number: number;\n node_id: string;\n html_url: string;\n title: string;\n body: string | null;\n head: { ref: string; sha: string };\n base: { ref: string };\n state: string;\n merged?: boolean;\n draft?: boolean;\n}): PullRequest {\n return {\n number: data.number,\n nodeId: data.node_id,\n url: data.html_url,\n title: data.title,\n body: data.body ?? \"\",\n headRefName: data.head.ref,\n baseRefName: data.base.ref,\n state:\n data.state === \"closed\" ? (data.merged ? \"MERGED\" : \"CLOSED\") : \"OPEN\",\n headRefOid: data.head.sha,\n };\n}\n\nfunction mapCheckRunStatus(status: string): CheckStatus[\"status\"] {\n const normalized = status.toUpperCase();\n\n if (\n normalized === \"QUEUED\" ||\n normalized === \"IN_PROGRESS\" ||\n normalized === \"COMPLETED\" ||\n normalized === \"WAITING\" ||\n normalized === \"PENDING\" ||\n normalized === \"REQUESTED\"\n ) {\n return normalized as CheckStatus[\"status\"];\n }\n\n return null;\n}\n\nfunction mapCheckConclusion(\n conclusion: string | null\n): CheckStatus[\"conclusion\"] {\n const normalized = conclusion?.toUpperCase();\n\n if (\n normalized === \"SUCCESS\" ||\n normalized === \"FAILURE\" ||\n normalized === \"NEUTRAL\" ||\n normalized === \"SKIPPED\" ||\n normalized === \"STALE\" ||\n normalized === \"STARTUP_FAILURE\" ||\n normalized === \"CANCELLED\" ||\n normalized === \"TIMED_OUT\" ||\n normalized === \"ACTION_REQUIRED\"\n ) {\n return normalized as CheckStatus[\"conclusion\"];\n }\n\n return null;\n}\n\nfunction mapCommitStatus(status: {\n context: string;\n state: string;\n}): CheckStatus {\n const normalized = status.state.toUpperCase();\n\n if (normalized === \"SUCCESS\") {\n return { name: status.context, status: \"COMPLETED\", conclusion: \"SUCCESS\" };\n }\n\n if (normalized === \"PENDING\") {\n return { name: status.context, status: \"PENDING\", conclusion: null };\n }\n\n return { name: status.context, status: \"COMPLETED\", conclusion: \"FAILURE\" };\n}\n\nfunction filterChecks(checks: CheckStatus[], requiredChecks: string[]) {\n return requiredChecks.length > 0\n ? checks.filter((check) => requiredChecks.includes(check.name))\n : checks;\n}\n\nfunction hasRequiredChecks(checks: CheckStatus[], requiredChecks: string[]) {\n return requiredChecks.length === 0\n ? checks.length > 0\n : requiredChecks.every((name) =>\n checks.some((check) => check.name === name)\n );\n}\n\nfunction secondsRemaining(deadline: number, observedAt: number) {\n return Math.max(0, Math.ceil((deadline - observedAt) / 1000));\n}\n\nfunction evaluateChecks(checks: CheckStatus[]) {\n const failed = checks.filter(\n (check) =>\n check.status === \"COMPLETED\" &&\n check.conclusion !== null &&\n !isSuccessfulConclusion(check.conclusion)\n );\n\n return {\n complete: checks.every((check) => check.status === \"COMPLETED\"),\n failed,\n };\n}\n\nfunction isSuccessfulConclusion(\n conclusion: NonNullable<CheckStatus[\"conclusion\"]>\n) {\n return (\n conclusion === \"SUCCESS\" ||\n conclusion === \"NEUTRAL\" ||\n conclusion === \"SKIPPED\"\n );\n}\n\nfunction formatChecks(checks: CheckStatus[]) {\n return checks\n .map((check) => `${check.name}=${check.conclusion ?? check.status}`)\n .join(\", \");\n}\n","import { mkdirSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { createWorktree, opencode } from \"@ai-hero/sandcastle\";\nimport type { AgentStreamEvent } from \"@ai-hero/sandcastle\";\nimport { docker } from \"@ai-hero/sandcastle/sandboxes/docker\";\nimport type {\n ExecutionProvider,\n ExecutionProviderOptions,\n ExecutionResult,\n ExecutionSession,\n} from \"./execution-provider\";\nimport { writeExecutionArtifacts } from \"./execution-provider\";\nimport { ensureSandboxImageBuilt } from \"./sandbox-image-build\";\nimport { createSandboxFromExistingWorktree } from \"./sandcastle-existing-worktree\";\nimport { buildSandboxOptions } from \"./sandbox-options\";\n\nexport class SandcastleExecutionProvider implements ExecutionProvider {\n async createSession(): Promise<ExecutionSession> {\n return new SandcastleExecutionSession();\n }\n\n async execute(options: ExecutionProviderOptions): Promise<ExecutionResult> {\n const session = await this.createSession();\n try {\n return await session.execute(options);\n } finally {\n await session.close();\n }\n }\n}\n\nclass SandcastleExecutionSession implements ExecutionSession {\n private sandboxHandle: SandcastleSandboxHandle | null = null;\n private worktreeHandle: SandcastleWorktreeHandle | null = null;\n\n async close(): Promise<void> {\n try {\n await this.sandboxHandle?.close?.();\n } finally {\n this.sandboxHandle = null;\n }\n }\n\n async execute(options: ExecutionProviderOptions): Promise<ExecutionResult> {\n const {\n stage,\n iteration,\n agent,\n model,\n prompt,\n target,\n repoRoot,\n branchName,\n worktreePath,\n baseRef,\n sandbox,\n autoApprove = false,\n timeoutMs,\n artifacts = [],\n logger,\n } = options;\n\n const stageLabel =\n iteration !== undefined ? `${stage}:${iteration}` : stage;\n logger.step(\n \"sandcastle\",\n `[${stageLabel}] running agent \"${agent}\" with model \"${model}\"`\n );\n\n try {\n const env: Record<string, string> = {};\n if (autoApprove) {\n env.OPENCODE_AUTO_APPROVE = \"true\";\n }\n\n const logPath = `${repoRoot}/.pourkit/logs/${sanitizeBranch(branchName)}-${Date.now()}.log`;\n\n await ensureSandboxImageBuilt(repoRoot, { force: sandbox.forceRebuild });\n\n try {\n savePromptToFile(repoRoot, stage, iteration, prompt);\n } catch {\n // Best-effort prompt saving; do not break execution\n }\n\n const agentProvider = opencode(model, { env, agent });\n const sandboxOptions = buildSandboxOptions(repoRoot, sandbox);\n const sandboxProvider = resolveSandboxProvider(sandbox.provider, docker);\n const activeSandbox = await this.getOrCreateSandbox({\n repoRoot,\n branchName,\n baseBranch: baseRef ?? target.baseBranch,\n worktreePath,\n sandboxProvider: sandboxProvider(sandboxOptions),\n setupCommands: target.setupCommands ?? [],\n copyToWorktree: sandbox.copyToWorktree ?? [],\n });\n\n await writeExecutionArtifacts(activeSandbox.worktreePath, artifacts);\n\n const result = await activeSandbox.run({\n agent: agentProvider,\n prompt,\n maxIterations: 1,\n name: stageLabel,\n logging: {\n type: \"file\",\n path: logPath,\n onAgentStreamEvent: (event: AgentStreamEvent) => {\n if (event.type === \"text\") {\n logger.raw(event.message);\n } else if (event.type === \"toolCall\") {\n logger.raw(`${event.name}(${event.formattedArgs})`);\n }\n },\n },\n completionSignal: \"<promise>COMPLETE</promise>\",\n ...(timeoutMs ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n ...(sandboxOptions.idleTimeoutSeconds\n ? { idleTimeoutSeconds: sandboxOptions.idleTimeoutSeconds }\n : {}),\n });\n\n const commits = result.commits.map((c) => c.sha);\n const resultBranch = result.branch ?? activeSandbox.branch ?? branchName;\n\n logger.kv(\"SANDBOX_SUCCESS\", \"true\");\n logger.kv(\"COMMITS_CREATED\", String(commits.length));\n logger.kv(\"WORKTREE_BRANCH\", resultBranch);\n if (result.logFilePath) {\n logger.kv(\"LOG_FILE\", result.logFilePath);\n }\n\n return {\n success: true,\n branch: resultBranch,\n worktreePath: activeSandbox.worktreePath,\n commits,\n logPath,\n };\n } catch (error) {\n logger.step(\n \"error\",\n `Sandcastle failed: ${error instanceof Error ? error.message : String(error)}`\n );\n return {\n success: false,\n branch: \"\",\n worktreePath: \"\",\n commits: [],\n logPath: null,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n private async getOrCreateSandbox(options: {\n repoRoot: string;\n branchName: string;\n baseBranch: string;\n worktreePath?: string;\n sandboxProvider: unknown;\n setupCommands: Array<{ command: string }>;\n copyToWorktree: string[];\n }): Promise<SandcastleSandboxHandle> {\n if (this.sandboxHandle) {\n return this.sandboxHandle;\n }\n\n const hooks = {\n sandbox: {\n onSandboxReady: options.setupCommands.map((command) => ({\n command: command.command,\n })),\n },\n };\n\n if (options.worktreePath) {\n this.sandboxHandle = (await createSandboxFromExistingWorktree({\n branch: options.branchName,\n hostRepoDir: options.repoRoot,\n worktreePath: options.worktreePath,\n sandbox: options.sandboxProvider,\n ...(options.copyToWorktree.length > 0\n ? { copyToWorktree: options.copyToWorktree }\n : {}),\n hooks,\n } as never)) as SandcastleSandboxHandle;\n return this.sandboxHandle;\n }\n\n this.worktreeHandle = (await createWorktree({\n cwd: options.repoRoot,\n branchStrategy: {\n type: \"branch\",\n branch: options.branchName,\n baseBranch: options.baseBranch,\n },\n ...(options.copyToWorktree.length > 0\n ? { copyToWorktree: options.copyToWorktree }\n : {}),\n } as never)) as SandcastleWorktreeHandle;\n\n this.sandboxHandle = await this.worktreeHandle.createSandbox({\n sandbox: options.sandboxProvider,\n ...(options.copyToWorktree.length > 0\n ? { copyToWorktree: options.copyToWorktree }\n : {}),\n hooks,\n });\n\n return this.sandboxHandle;\n }\n}\n\ninterface SandcastleWorktreeHandle {\n branch: string;\n worktreePath: string;\n createSandbox(options: unknown): Promise<SandcastleSandboxHandle>;\n}\n\ninterface SandcastleSandboxHandle {\n branch: string;\n worktreePath: string;\n run(options: unknown): Promise<{\n branch?: string;\n commits: Array<{ sha: string }>;\n logFilePath?: string;\n }>;\n close?(): Promise<unknown>;\n}\n\nfunction resolveSandboxProvider(\n provider: string,\n dockerFactory: (typeof import(\"@ai-hero/sandcastle/sandboxes/docker\"))[\"docker\"]\n) {\n if (provider === \"docker\") {\n return dockerFactory;\n }\n\n throw new Error(`Unsupported sandbox provider: ${provider}`);\n}\n\nfunction sanitizeBranch(branchName: string) {\n return branchName.replace(/[^A-Za-z0-9._-]/g, \"-\");\n}\n\nfunction savePromptToFile(\n repoRoot: string,\n stage: string,\n iteration: number | undefined,\n prompt: string\n): void {\n const promptsDir = join(repoRoot, \".pourkit\", \".tmp\", \"prompts\");\n mkdirSync(promptsDir, { recursive: true });\n\n const timestamp = Date.now();\n const iterationSuffix =\n iteration !== undefined ? `-iteration-${iteration}` : \"\";\n const filename = `${stage}${iterationSuffix}-${timestamp}.md`;\n const filePath = join(promptsDir, filename);\n\n writeFileSync(filePath, prompt, \"utf-8\");\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"path\";\nimport { ensureDir, execCapture, type PourkitLogger } from \"../shared/common\";\nimport type {\n SandboxConfig,\n Target,\n VerificationCommand,\n} from \"../shared/config\";\nimport type { ExecutionArtifact } from \"../shared/run-context\";\n\nexport interface ExecutionResult {\n success: boolean;\n branch: string;\n worktreePath: string;\n commits: string[];\n logPath: string | null;\n error?: string;\n}\n\nexport type PourkitStage =\n | \"builder\"\n | \"reviewer\"\n | \"refactor\"\n | \"finalizer\"\n | \"conflictResolution\";\n\nexport interface ExecutionProviderOptions {\n stage: PourkitStage;\n iteration?: number;\n artifactPath?: string;\n worktreePath?: string;\n agent: string;\n model: string;\n prompt: string;\n target: Target;\n repoRoot: string;\n branchName: string;\n baseRef?: string;\n sandbox: SandboxConfig;\n autoApprove?: boolean;\n timeoutMs?: number;\n artifacts?: ExecutionArtifact[];\n logger: PourkitLogger;\n}\n\nexport interface ExecutionProvider {\n execute(options: ExecutionProviderOptions): Promise<ExecutionResult>;\n createSession?(): Promise<ExecutionSession>;\n}\n\nexport interface ExecutionSession extends ExecutionProvider {\n close(): Promise<void>;\n}\n\nexport async function runSetupCommands(\n commands: VerificationCommand[],\n worktreePath: string,\n logger: PourkitLogger\n) {\n for (const command of commands) {\n await execCapture(\"bash\", [\"-lc\", command.command], {\n cwd: worktreePath,\n logger,\n label: command.label,\n });\n }\n}\n\nexport async function writeExecutionArtifacts(\n worktreePath: string,\n artifacts: ExecutionArtifact[]\n) {\n for (const artifact of artifacts) {\n const filePath = join(worktreePath, artifact.path);\n await ensureDir(dirname(filePath));\n await writeFile(filePath, artifact.content, \"utf-8\");\n }\n}\n\nexport class FakeExecutionProvider implements ExecutionProvider {\n private _result: ExecutionResult;\n lastOptions: ExecutionProviderOptions | null = null;\n calls: ExecutionProviderOptions[] = [];\n\n constructor(result: ExecutionResult) {\n this._result = result;\n }\n\n async execute(_options: ExecutionProviderOptions): Promise<ExecutionResult> {\n this.lastOptions = _options;\n this.calls.push(_options);\n if (_options.artifactPath && _options.worktreePath) {\n const artifactPath = join(_options.worktreePath, _options.artifactPath);\n await ensureDir(dirname(artifactPath));\n if (_options.stage === \"reviewer\") {\n await writeFile(\n artifactPath,\n [\n \"## Findings\",\n \"\",\n \"| ID | Supersedes | Severity | File/Line | Issue | Recommendation |\",\n \"|----|------------|----------|-----------|-------|----------------|\",\n \"| none | n/a | n/a | n/a | No findings. | n/a |\",\n \"\",\n \"<verdict>PASS</verdict>\",\n ].join(\"\\n\"),\n \"utf-8\"\n );\n }\n if (_options.stage === \"finalizer\") {\n await writeFile(\n artifactPath,\n \"## PR Title\\n\\nfix: Test issue\\n\\n## PR Body\\n\\nCloses #42\",\n \"utf-8\"\n );\n }\n }\n return this._result;\n }\n\n get result(): ExecutionResult {\n return this._result;\n }\n\n set result(value: ExecutionResult) {\n this._result = value;\n }\n}\n","import path from \"node:path\";\n\nimport { execCapture } from \"../shared/common\";\nimport { sandboxImageName } from \"./sandbox-image\";\n\nexport async function ensureSandboxImageBuilt(\n repoRoot: string,\n options?: { force?: boolean }\n) {\n const imageName = sandboxImageName(repoRoot);\n const dockerfilePath = path.join(repoRoot, \".sandcastle\", \"Dockerfile\");\n\n if (!options?.force) {\n try {\n await execCapture(\"docker\", [\"image\", \"inspect\", imageName]);\n return;\n } catch {\n // image missing, fall through to build\n }\n }\n\n const buildArgs = [\"build\", \"-t\", imageName, \"-f\", dockerfilePath];\n if (options?.force) {\n buildArgs.push(\"--pull\", \"--no-cache\");\n }\n buildArgs.push(repoRoot);\n\n await execCapture(\"docker\", buildArgs);\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nexport function sandboxImageName(repoRoot: string): string {\n const dirName = path.basename(repoRoot.replace(/[\\\\/]+$/, \"\")) || \"local\";\n const sanitized = dirName.toLowerCase().replace(/[^a-z0-9_.-]/g, \"-\");\n const baseName = sanitized || \"local\";\n const dockerfilePath = path.join(repoRoot, \".sandcastle\", \"Dockerfile\");\n\n if (!existsSync(dockerfilePath)) {\n return `sandcastle:${baseName}`;\n }\n\n const fingerprint = createHash(\"sha256\")\n .update(readFileSync(dockerfilePath))\n .digest(\"hex\")\n .slice(0, 8);\n\n return `sandcastle:${baseName}-${fingerprint}`;\n}\n","interface CreateSandboxFromExistingWorktreeOptions {\n branch: string;\n worktreePath: string;\n hostRepoDir: string;\n sandbox: unknown;\n hooks?: unknown;\n copyToWorktree?: string[];\n}\n\ntype CreateSandboxFromWorktree = (\n options: CreateSandboxFromExistingWorktreeOptions\n) => Promise<unknown>;\n\n/**\n * Sandcastle exposes this path through Worktree.createSandbox(), but Pourkit only\n * has a preserved worktree path when resuming an interrupted issue run.\n */\nexport async function createSandboxFromExistingWorktree(\n options: CreateSandboxFromExistingWorktreeOptions\n): Promise<unknown> {\n const sandcastleEntryUrl = import.meta.resolve(\"@ai-hero/sandcastle\");\n const createSandboxUrl = new URL(\"./createSandbox.js\", sandcastleEntryUrl);\n const sandcastleCreateSandbox = (await import(createSandboxUrl.href)) as {\n createSandboxFromWorktree: CreateSandboxFromWorktree;\n };\n\n return sandcastleCreateSandbox.createSandboxFromWorktree(options);\n}\n","import type { SandboxConfig, SandboxMountConfig } from \"../shared/config\";\nimport { sandboxImageName } from \"./sandbox-image\";\n\nexport interface SandcastleSandboxOptions {\n imageName: string;\n mounts?: SandboxConfig[\"mounts\"];\n env?: SandboxConfig[\"env\"];\n idleTimeoutSeconds?: number;\n}\n\nexport function buildSandboxOptions(\n repoRoot: string,\n sandbox: SandboxConfig\n): SandcastleSandboxOptions {\n const mounts: SandboxConfig[\"mounts\"] = [];\n if (sandbox.mounts !== undefined) {\n mounts.push(...sandbox.mounts);\n }\n\n return {\n imageName: sandboxImageName(repoRoot),\n ...(mounts.length > 0 ? { mounts } : {}),\n ...(sandbox.env !== undefined ? { env: sandbox.env } : {}),\n ...(sandbox.idleTimeoutSeconds !== undefined\n ? { idleTimeoutSeconds: sandbox.idleTimeoutSeconds }\n : {}),\n };\n}\n"],"mappings":"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","names":["text","path","text","path","path","repoRoot","existsSync","readFile","writeFile","pathToFileURL","repoRoot","mkdirSync","join","join","parseWorktreeListPorcelain","text","path","repoRoot","readdir","existsSync","readFileSync","join","existsSync","readFileSync","join","repoRoot","existsSync","readFileSync","join","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","SECTION_HEADING_PATTERN","extractSections","contentAfter","join","join","repoRoot","join","existsSync","readFileSync","mkdirSync","dirname","writeFileSync","readFile","stableForMs","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","dirname","join","existsSync","readFileSync","repoRoot","join","readReviewArtifact","mkdirSync","dirname","rmSync","writeFileSync","existsSync","readFileSync","baseRef","join","repoRoot","repoRoot","repoRoot","isFlag","requireFlagValue","existsSync","mkdir","readFile","path","execFile","promisify","execCapture","execFileAsync","promisify","execFile","path","readFile","existsSync","mkdir","secondsRemaining","formatChecks","mkdirSync","writeFileSync","join","writeFile","dirname","join","join","dirname","writeFile","path","createHash","existsSync","readFileSync","path","repoRoot","repoRoot","path","repoRoot","repoRoot","join","mkdirSync","timestamp","writeFileSync","path"]}
|