@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../common/logger/src/index.ts","../../shared/common.ts","../../e2e/run-live-e2e.ts","../../commands/issue-run.ts","../../shared/config.ts","../../pr/templates.ts","../../shared/run-context.ts","../../shared/prompt-guidance.ts","../../shared/worktree-run-state.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","../../providers/github-provider.ts","../../providers/github-pr-provider.ts","../../providers/github-client.ts","../../execution/deterministic-agent.ts","../../execution/sandbox-image-build.ts","../../execution/sandbox-image.ts","../../execution/sandbox-options.ts","../../execution/execution-provider.ts","../../e2e/profile.ts","../../e2e/live/harness.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 { existsSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport { mkdir, readFile, readdir, rm, writeFile } from \"node:fs/promises\";\nimport { runIssueCommand } from \"../commands/issue\";\nimport {\n createLogger,\n execCapture,\n execJson,\n parseWorktreeListPorcelain,\n repoRoot,\n type PourkitLogger,\n} from \"../shared/common\";\nimport {\n getVerificationCommands as getTargetVerificationCommands,\n loadRepoConfig,\n resolveTarget,\n type PourkitConfig,\n} from \"../shared/config\";\nimport { renderBranchName } from \"../pr/templates\";\nimport { GitHubIssueProvider } from \"../providers/github-provider\";\nimport { GitHubPRProvider } from \"../providers/github-pr-provider\";\nimport {\n requireGitHubClient,\n type GitHubClient,\n} from \"../providers/github-client\";\nimport type { PullRequest } from \"../providers/pr-provider\";\nimport { DeterministicExecutionProvider } from \"../execution/deterministic-agent\";\nimport {\n getVerificationCommands,\n composeFailureWithProfile,\n type E2EVerificationProfile,\n} from \"./profile\";\nimport { waitForBranchChecks } from \"../issues/target-green\";\nimport {\n cleanupResources as harnessCleanupResources,\n createE2EIssue as harnessCreateE2EIssue,\n createLiveTargetBranch as harnessCreateLiveTargetBranch,\n fetchIssueLabels,\n persistResources as harnessPersistResources,\n recoverStaleRuns as harnessRecoverStaleRuns,\n runCleanupOnly as harnessRunCleanupOnly,\n} from \"./live/harness\";\n\nexport interface E2EOptions {\n keep: boolean;\n fail: boolean;\n fullCheck: boolean;\n cleanupOnly: boolean;\n targetName?: string;\n}\n\ninterface E2EResources {\n targetBranch?: string;\n issueNumber?: number;\n issueUrl?: string;\n agentBranch?: string;\n prNumber?: number;\n prUrl?: string;\n}\n\ninterface E2EStateFile extends E2EResources {\n runId: string;\n}\n\nconst E2E_STATE_DIR = path.join(\".pourkit\", \".tmp\", \"e2e-runs\");\n\nexport function parseArgs(): E2EOptions {\n const args = process.argv.slice(2);\n let keep = false;\n let fail = false;\n let fullCheck = false;\n let cleanupOnly = false;\n let targetName: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--keep\") {\n keep = true;\n } else if (arg === \"--fail\") {\n fail = true;\n } else if (arg === \"--full-check\") {\n fullCheck = true;\n } else if (arg === \"--cleanup-only\") {\n cleanupOnly = true;\n } else if (arg === \"--target\" && args[i + 1]) {\n targetName = args[i + 1];\n i++;\n }\n }\n\n return { keep, fail, fullCheck, cleanupOnly, targetName };\n}\n\nexport function resolveProfile(fullCheck: boolean): E2EVerificationProfile {\n return fullCheck ? \"full-check\" : \"fast\";\n}\n\nexport function isExecutedAsScript(\n currentUrl = import.meta.url,\n entryPoint = process.argv[1]\n): boolean {\n if (!entryPoint) {\n return false;\n }\n\n return currentUrl === pathToFileURL(path.resolve(entryPoint)).href;\n}\n\nexport function resolveE2EConfigFile(root: string): string {\n const explicitConfig = process.env.POURKIT_CONFIG_FILE?.trim();\n if (explicitConfig) {\n return explicitConfig;\n }\n\n if (existsSync(path.join(root, \"pourkit.config.ts\"))) {\n return \"pourkit.config.ts\";\n }\n\n return \"pourkit.config.example.ts\";\n}\n\nfunction generateRunId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction stateFilePath(root: string, runId: string): string {\n return path.join(root, E2E_STATE_DIR, `${runId}.json`);\n}\n\nasync function persistResources(\n root: string,\n runId: string,\n resources: E2EResources\n): Promise<void> {\n const filePath = stateFilePath(root, runId);\n await mkdir(path.dirname(filePath), { recursive: true });\n const state: E2EStateFile = { runId, ...resources };\n await writeFile(filePath, `${JSON.stringify(state, null, 2)}\\n`, \"utf-8\");\n}\n\nasync function localBranchExists(branchName: string): Promise<boolean> {\n try {\n await execCapture(\"git\", [\n \"show-ref\",\n \"--verify\",\n \"--quiet\",\n `refs/heads/${branchName}`,\n ]);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function remoteBranchExists(branchName: string): Promise<boolean> {\n const result = await execCapture(\"git\", [\n \"ls-remote\",\n \"--heads\",\n \"origin\",\n branchName,\n ]);\n return result.stdout.trim().length > 0;\n}\n\nasync function removeWorktreeForBranch(\n branchName: string,\n logger: PourkitLogger\n): Promise<boolean> {\n try {\n const result = await execCapture(\"git\", [\n \"worktree\",\n \"list\",\n \"--porcelain\",\n ]);\n const worktreePath = parseWorktreeListPorcelain(result.stdout, branchName);\n\n if (!worktreePath) {\n return true;\n }\n\n logger.step(\"cleanup\", `Removing worktree for branch: ${branchName}...`);\n await execCapture(\"git\", [\"worktree\", \"remove\", \"--force\", worktreePath]);\n return true;\n } catch (error) {\n logger.step(\n \"warn\",\n `Failed to remove worktree for branch: ${error instanceof Error ? error.message : String(error)}`\n );\n return false;\n }\n}\n\nasync function deleteLocalBranch(\n branchName: string,\n logger: PourkitLogger\n): Promise<boolean> {\n if (!(await localBranchExists(branchName))) {\n return true;\n }\n\n if (!(await removeWorktreeForBranch(branchName, logger))) {\n return false;\n }\n\n try {\n logger.step(\"cleanup\", `Deleting local branch: ${branchName}...`);\n await execCapture(\"git\", [\"branch\", \"-D\", branchName]);\n return true;\n } catch (error) {\n logger.step(\n \"warn\",\n `Failed to delete local branch: ${error instanceof Error ? error.message : String(error)}`\n );\n return false;\n }\n}\n\nasync function deleteRemoteBranch(\n branchName: string,\n logger: PourkitLogger\n): Promise<boolean> {\n if (!(await remoteBranchExists(branchName))) {\n return true;\n }\n\n try {\n logger.step(\"cleanup\", `Deleting remote branch: ${branchName}...`);\n await execCapture(\"git\", [\"push\", \"origin\", \"--delete\", branchName]);\n return true;\n } catch (error) {\n logger.step(\n \"warn\",\n `Failed to delete remote branch: ${error instanceof Error ? error.message : String(error)}`\n );\n return false;\n }\n}\n\nasync function recoverStaleRuns(\n root: string,\n logger: PourkitLogger\n): Promise<void> {\n const dir = path.join(root, E2E_STATE_DIR);\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".json\")) continue;\n\n const filePath = path.join(dir, entry.name);\n try {\n const raw = await readFile(filePath, \"utf-8\");\n const state = JSON.parse(raw) as E2EStateFile;\n let cleanupSucceeded = true;\n\n if (state.agentBranch) {\n cleanupSucceeded =\n (await deleteLocalBranch(state.agentBranch, logger)) &&\n cleanupSucceeded;\n cleanupSucceeded =\n (await deleteRemoteBranch(state.agentBranch, logger)) &&\n cleanupSucceeded;\n }\n\n if (state.targetBranch) {\n cleanupSucceeded =\n (await deleteLocalBranch(state.targetBranch, logger)) &&\n cleanupSucceeded;\n cleanupSucceeded =\n (await deleteRemoteBranch(state.targetBranch, logger)) &&\n cleanupSucceeded;\n }\n\n if (cleanupSucceeded) {\n await rm(filePath, { force: true });\n } else {\n logger.step(\n \"warn\",\n `Preserving stale E2E state ${entry.name} for cleanup retry`\n );\n }\n } catch (error) {\n logger.step(\n \"warn\",\n `Failed to recover stale E2E state ${entry.name}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n logger.step(\n \"warn\",\n `Failed to scan stale E2E state: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n}\n\nexport function makeE2EConfig(\n baseConfig: PourkitConfig,\n targetName: string | undefined,\n targetBranch: string,\n profile: E2EVerificationProfile\n): PourkitConfig {\n const resolvedTargetName = targetName ?? \"e2e\";\n const target = resolveTarget(baseConfig, resolvedTargetName);\n const strategy = target.strategy;\n const verificationCommands = getVerificationCommands(\n getTargetVerificationCommands(target),\n profile\n );\n\n return {\n ...baseConfig,\n targets: [\n {\n ...target,\n baseBranch: targetBranch,\n strategy: {\n ...strategy,\n verify: { commands: verificationCommands },\n },\n },\n ],\n };\n}\n\nasync function cleanup(\n resources: E2EResources,\n root: string,\n runId: string,\n keep: boolean,\n logger: PourkitLogger,\n client: GitHubClient\n): Promise<void> {\n if (keep) {\n logger.line(\"--keep flag set, preserving E2E resources:\");\n if (resources.issueNumber)\n logger.line(` Issue: #${resources.issueNumber}`);\n if (resources.issueUrl) logger.line(` Issue URL: ${resources.issueUrl}`);\n if (resources.targetBranch)\n logger.line(` Target branch: ${resources.targetBranch}`);\n if (resources.agentBranch)\n logger.line(` Agent branch: ${resources.agentBranch}`);\n if (resources.prNumber)\n logger.line(` PR: #${resources.prNumber} (${resources.prUrl})`);\n return;\n }\n\n logger.line(\"Cleaning up E2E resources...\");\n let cleanupSucceeded = true;\n\n if (resources.prNumber) {\n try {\n const { data } = await client.octokit.rest.pulls.get({\n owner: client.owner,\n repo: client.repo,\n pull_number: resources.prNumber,\n });\n if (data.merged) {\n logger.step(\n \"cleanup\",\n `PR #${resources.prNumber} is merged, skipping close`\n );\n } else {\n logger.step(\"cleanup\", `Closing PR #${resources.prNumber}...`);\n await client.octokit.rest.pulls.update({\n owner: client.owner,\n repo: client.repo,\n pull_number: resources.prNumber,\n state: \"closed\",\n });\n }\n } catch (error) {\n logger.step(\n \"warn\",\n `Failed to close PR: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n if (resources.issueNumber) {\n try {\n logger.step(\"cleanup\", `Closing issue #${resources.issueNumber}...`);\n await client.octokit.rest.issues.update({\n owner: client.owner,\n repo: client.repo,\n issue_number: resources.issueNumber,\n state: \"closed\",\n state_reason: \"completed\",\n });\n } catch (error) {\n logger.step(\n \"warn\",\n `Failed to close issue: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n if (resources.agentBranch) {\n cleanupSucceeded =\n (await deleteLocalBranch(resources.agentBranch, logger)) &&\n cleanupSucceeded;\n cleanupSucceeded =\n (await deleteRemoteBranch(resources.agentBranch, logger)) &&\n cleanupSucceeded;\n }\n\n if (resources.targetBranch) {\n cleanupSucceeded =\n (await deleteLocalBranch(resources.targetBranch, logger)) &&\n cleanupSucceeded;\n cleanupSucceeded =\n (await deleteRemoteBranch(resources.targetBranch, logger)) &&\n cleanupSucceeded;\n }\n\n if (cleanupSucceeded) {\n await rm(stateFilePath(root, runId), { force: true });\n } else {\n logger.step(\"warn\", \"Preserving E2E state for retry after cleanup failure\");\n }\n\n logger.line(\"Cleanup complete.\");\n}\n\nasync function verifyAssertions(\n pr: PullRequest,\n issueNumber: number,\n targetBranch: string,\n expectedHead: string,\n expectedTitle: string,\n logger: PourkitLogger,\n client: GitHubClient\n): Promise<void> {\n logger.raw(\"\\n=== Running Assertions ===\\n\");\n\n const errors: string[] = [];\n\n if (pr.baseRefName !== targetBranch) {\n errors.push(`PR base is \"${pr.baseRefName}\", expected \"${targetBranch}\"`);\n } else {\n logger.raw(`[✓] PR base is target branch: ${targetBranch}`);\n }\n\n if (pr.headRefName !== expectedHead) {\n errors.push(`PR head is \"${pr.headRefName}\", expected \"${expectedHead}\"`);\n } else {\n logger.raw(`[✓] PR head is agent branch: ${expectedHead}`);\n }\n\n if (pr.title !== expectedTitle) {\n errors.push(`PR title is \"${pr.title}\", expected \"${expectedTitle}\"`);\n } else {\n logger.raw(`[✓] PR title matches template`);\n }\n\n if (\n pr.body !== undefined &&\n !new RegExp(`[Cc]loses\\\\s*#${issueNumber}`).test(pr.body)\n ) {\n errors.push(`PR body does not contain \"Closes #${issueNumber}\"`);\n } else {\n logger.raw(`[✓] PR body contains \"Closes #${issueNumber}\"`);\n }\n\n try {\n await execCapture(\"git\", [\"fetch\", \"origin\", pr.headRefName]);\n const countResult = await execCapture(\"git\", [\n \"rev-list\",\n \"--count\",\n `origin/${pr.headRefName}`,\n ]);\n const commitCount = Number(countResult.stdout.trim());\n if (!Number.isFinite(commitCount) || commitCount <= 0) {\n errors.push(`No commits found on the agent branch ${pr.headRefName}`);\n } else {\n logger.raw(`[✓] Commits exist on agent branch: ${commitCount} commit(s)`);\n }\n } catch (error) {\n errors.push(\n `Failed to verify commits: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n try {\n const labelNames = await fetchIssueLabels(issueNumber, client);\n\n if (labelNames.includes(\"pr-open-awaiting-merge\")) {\n errors.push(\n `Issue #${issueNumber} still has \"pr-open-awaiting-merge\" label after merge. Labels: ${labelNames.join(\", \")}`\n );\n } else {\n logger.raw(`[✓] Issue no longer has \"pr-open-awaiting-merge\"`);\n }\n\n if (labelNames.includes(\"ready-for-agent\")) {\n errors.push(\n `Issue #${issueNumber} still has \"ready-for-agent\" label. Labels: ${labelNames.join(\", \")}`\n );\n } else {\n logger.raw(`[✓] Issue no longer has \"ready-for-agent\"`);\n }\n\n if (labelNames.includes(\"agent-in-progress\")) {\n errors.push(\n `Issue #${issueNumber} still has \"agent-in-progress\" label. Labels: ${labelNames.join(\", \")}`\n );\n } else {\n logger.raw(`[✓] Issue no longer has \"agent-in-progress\"`);\n }\n\n if (pr.state !== \"MERGED\") {\n errors.push(`PR state is \"${pr.state}\", expected \"MERGED\"`);\n } else {\n logger.raw(`[✓] PR is merged`);\n }\n } catch (error) {\n errors.push(\n `Failed to verify issue labels: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (errors.length > 0) {\n logger.raw(\"\\n=== Assertion Failures ===\\n\");\n for (const error of errors) {\n logger.raw(`[✗] ${error}`);\n }\n throw new Error(`${errors.length} assertion(s) failed`);\n }\n\n logger.raw(\"\\n=== All Assertions Passed ===\\n\");\n}\n\nasync function verifyFailureAssertions(\n issueNumber: number,\n logger: PourkitLogger,\n client: GitHubClient\n): Promise<void> {\n logger.raw(\"\\n=== Running Failure Assertions ===\\n\");\n\n const errors: string[] = [];\n\n try {\n const labelNames = await fetchIssueLabels(issueNumber, client);\n\n if (!labelNames.includes(\"ready-for-human\")) {\n errors.push(\n `Issue #${issueNumber} does not have \"ready-for-human\" label. Labels: ${labelNames.join(\", \")}`\n );\n } else {\n logger.raw(`[✓] Issue has \"ready-for-human\" label`);\n }\n\n if (labelNames.includes(\"agent-in-progress\")) {\n errors.push(\n `Issue #${issueNumber} still has \"agent-in-progress\" label. Labels: ${labelNames.join(\", \")}`\n );\n } else {\n logger.raw(`[✓] Issue no longer has \"agent-in-progress\"`);\n }\n } catch (error) {\n errors.push(\n `Failed to verify issue labels: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (errors.length > 0) {\n logger.raw(\"\\n=== Assertion Failures ===\\n\");\n for (const error of errors) {\n logger.raw(`[✗] ${error}`);\n }\n throw new Error(`${errors.length} assertion(s) failed`);\n }\n\n logger.raw(\"\\n=== All Failure Assertions Passed ===\\n\");\n}\n\nexport function makeFailureE2EConfig(\n baseConfig: PourkitConfig,\n targetName: string | undefined,\n targetBranch: string,\n profile: E2EVerificationProfile\n): PourkitConfig {\n const resolvedTargetName = targetName ?? \"e2e\";\n const target = resolveTarget(baseConfig, resolvedTargetName);\n const strategy = target.strategy;\n const verificationCommands = composeFailureWithProfile(\n getTargetVerificationCommands(target),\n profile\n );\n\n return {\n ...baseConfig,\n targets: [\n {\n ...target,\n baseBranch: targetBranch,\n strategy: {\n ...strategy,\n verify: { commands: verificationCommands },\n },\n },\n ],\n };\n}\n\nasync function runCleanupOnly(\n root: string,\n logger: PourkitLogger\n): Promise<void> {\n logger.line(\"Running cleanup-only mode: deleting stale e2e branches...\");\n\n const result = await execCapture(\"git\", [\"ls-remote\", \"--heads\", \"origin\"]);\n const lines = result.stdout\n .split(\"\\n\")\n .filter((line) => line.trim().length > 0);\n\n const e2eBranchPattern =\n /refs\\/heads\\/(pourkit-e2e-target\\/|pourkit\\/\\d+\\/(e2e-test-issue-|test-live-e2e-))/;\n const branchesToDelete = lines\n .map((line) => {\n const parts = line.split(/\\s+/);\n return parts[1];\n })\n .filter((ref) => e2eBranchPattern.test(ref))\n .map((ref) => ref.replace(\"refs/heads/\", \"\"));\n\n let deletedCount = 0;\n let failedCount = 0;\n\n for (const branch of branchesToDelete) {\n const localOk = await deleteLocalBranch(branch, logger);\n const remoteOk = await deleteRemoteBranch(branch, logger);\n if (localOk && remoteOk) {\n deletedCount++;\n } else {\n failedCount++;\n }\n }\n\n const stateDir = path.join(root, E2E_STATE_DIR);\n try {\n const entries = await readdir(stateDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".json\")) continue;\n const filePath = path.join(stateDir, entry.name);\n await rm(filePath, { force: true });\n logger.step(\"cleanup\", `Removed state file: ${entry.name}`);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n logger.step(\n \"warn\",\n `Failed to scan state directory: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n logger.line(\n `Cleanup-only complete: ${deletedCount} branch(es) deleted, ${failedCount} failure(s)`\n );\n}\n\nasync function runE2E(): Promise<void> {\n const options = parseArgs();\n const runId = generateRunId();\n const root = repoRoot();\n const logPath = path.join(root, \"pourkit\", \"logs\", `e2e-${runId}.log`);\n const logger = createLogger(\"e2e\", logPath);\n const client = await requireGitHubClient({ cwd: root });\n\n logger.line(`Starting E2E test run: ${runId}`);\n logger.line(`Keep resources: ${options.keep}`);\n logger.line(`Failure mode: ${options.fail}`);\n logger.line(`Verification profile: ${resolveProfile(options.fullCheck)}`);\n\n if (options.cleanupOnly) {\n await harnessRunCleanupOnly(root, logger, client);\n await logger.close();\n return;\n }\n\n await harnessRecoverStaleRuns(root, logger);\n\n if (options.fail) {\n await runFailureE2E(options, runId, root, logger);\n } else {\n await runSuccessE2E(options, runId, root, logger, client);\n }\n}\n\nasync function runSuccessE2E(\n options: E2EOptions,\n runId: string,\n root: string,\n logger: PourkitLogger,\n client: GitHubClient\n): Promise<void> {\n const issueProvider = new GitHubIssueProvider(client);\n const executionProvider = new DeterministicExecutionProvider();\n const prProvider = new GitHubPRProvider(client, logger);\n\n const resources: E2EResources = {};\n\n try {\n const targetBranch = await harnessCreateLiveTargetBranch(runId, logger);\n resources.targetBranch = targetBranch;\n if (!options.keep) {\n await harnessPersistResources(root, runId, resources);\n }\n\n const createdIssue = await harnessCreateE2EIssue(\n runId,\n targetBranch,\n logger,\n client\n );\n resources.issueNumber = createdIssue.number;\n resources.issueUrl = createdIssue.url;\n if (!options.keep) {\n await harnessPersistResources(root, runId, resources);\n }\n\n const baseConfig = await loadRepoConfig(root, resolveE2EConfigFile(root));\n const profile = resolveProfile(options.fullCheck);\n const config = makeE2EConfig(\n baseConfig,\n options.targetName,\n targetBranch,\n profile\n );\n const expectedIssue = await issueProvider.fetchIssue(createdIssue.number);\n const expectedTarget = resolveTarget(config, options.targetName);\n resources.agentBranch = renderBranchName(\n expectedTarget.branchTemplate,\n expectedIssue\n );\n if (!options.keep) {\n await harnessPersistResources(root, runId, resources);\n }\n\n logger.raw(`\\nRunning issue command for #${createdIssue.number}...\\n`);\n\n const result = await runIssueCommand({\n issueNumber: createdIssue.number,\n targetName: options.targetName,\n config,\n issueProvider,\n prProvider,\n executionProvider,\n force: false,\n logger,\n repoRoot: root,\n });\n\n resources.agentBranch = result.branchName;\n resources.prNumber = result.prNumber;\n resources.prUrl = result.prUrl;\n if (!options.keep) {\n await harnessPersistResources(root, runId, resources);\n }\n\n logger.raw(`\\nIssue command completed:`);\n logger.raw(` Issue: #${createdIssue.number}`);\n logger.raw(` Branch: ${result.branchName}`);\n logger.raw(` PR: #${result.prNumber} (${result.prUrl})`);\n\n if (!result.prNumber) {\n throw new Error(\"Issue command did not return a PR number\");\n }\n\n const pr = await execJson<PullRequest>(\"gh\", [\n \"pr\",\n \"view\",\n String(result.prNumber),\n \"--json\",\n \"number,nodeId,url,title,body,headRefName,baseRefName,state,headRefOid\",\n ]);\n\n await verifyAssertions(\n pr,\n createdIssue.number,\n targetBranch,\n result.branchName,\n result.prTitle ?? result.issue.title,\n logger,\n client\n );\n\n logger.raw(\"\\n=== Verifying Merge and Target-Green ===\\n\");\n\n if (pr.state !== \"MERGED\") {\n throw new Error(\n `PR #${result.prNumber} was not merged after issue command (state: ${pr.state})`\n );\n }\n logger.raw(`[✓] PR #${result.prNumber} is merged`);\n\n await waitForBranchChecks(prProvider, logger, {\n branchName: targetBranch,\n checksFoundTimeoutMs: config.checks.checksFoundTimeoutSeconds * 1000,\n checksCompletionTimeoutMs:\n config.checks.checksCompletionTimeoutSeconds * 1000,\n pollIntervalMs: config.checks.pollIntervalSeconds * 1000,\n });\n logger.raw(`[✓] Target branch ${targetBranch} is green after merge`);\n\n logger.raw(\"\\n=== E2E Test Passed ===\\n\");\n } catch (error) {\n logger.step(\n \"error\",\n `E2E test failed: ${error instanceof Error ? error.message : String(error)}`\n );\n throw error;\n } finally {\n await harnessCleanupResources(\n resources,\n root,\n runId,\n options.keep,\n logger,\n client\n );\n await logger.close();\n }\n}\n\nasync function runFailureE2E(\n options: E2EOptions,\n runId: string,\n root: string,\n logger: PourkitLogger\n): Promise<void> {\n const client = await requireGitHubClient({ cwd: root });\n const issueProvider = new GitHubIssueProvider(client);\n const executionProvider = new DeterministicExecutionProvider();\n const prProvider = new GitHubPRProvider(client, logger);\n\n const resources: E2EResources = {};\n\n try {\n const targetBranch = await harnessCreateLiveTargetBranch(runId, logger);\n resources.targetBranch = targetBranch;\n if (!options.keep) {\n await harnessPersistResources(root, runId, resources);\n }\n\n const createdIssue = await harnessCreateE2EIssue(\n runId,\n targetBranch,\n logger,\n client\n );\n resources.issueNumber = createdIssue.number;\n resources.issueUrl = createdIssue.url;\n if (!options.keep) {\n await harnessPersistResources(root, runId, resources);\n }\n\n const baseConfig = await loadRepoConfig(root, resolveE2EConfigFile(root));\n const profile = resolveProfile(options.fullCheck);\n const config = makeFailureE2EConfig(\n baseConfig,\n options.targetName,\n targetBranch,\n profile\n );\n const expectedIssue = await issueProvider.fetchIssue(createdIssue.number);\n const expectedTarget = resolveTarget(config, options.targetName);\n resources.agentBranch = renderBranchName(\n expectedTarget.branchTemplate,\n expectedIssue\n );\n if (!options.keep) {\n await harnessPersistResources(root, runId, resources);\n }\n\n logger.raw(\n `\\nRunning issue command for #${createdIssue.number} (failure mode)...\\n`\n );\n\n await runIssueCommand({\n issueNumber: createdIssue.number,\n targetName: options.targetName,\n config,\n issueProvider,\n prProvider,\n executionProvider,\n force: false,\n logger,\n repoRoot: root,\n });\n\n if (!options.keep) {\n await harnessPersistResources(root, runId, resources);\n }\n\n throw new Error(\"Expected runIssueCommand to throw in failure mode\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message === \"Expected runIssueCommand to throw in failure mode\") {\n throw error;\n }\n\n logger.raw(`\\nIssue command failed as expected: ${message}`);\n\n await verifyFailureAssertions(resources.issueNumber ?? 0, logger, client);\n\n logger.raw(\"\\n=== E2E Failure Test Passed ===\\n\");\n } finally {\n await cleanup(resources, root, runId, options.keep, logger, client);\n await logger.close();\n }\n}\n\nif (isExecutedAsScript()) {\n runE2E().catch((error) => {\n const msg = `Fatal: ${error instanceof Error ? error.message : String(error)}`;\n console.error(msg);\n process.exit(1);\n });\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 { 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 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 { 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 { 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 { 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 { 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 {\n AgentProvider,\n AgentCommandOptions,\n PrintCommand,\n} from \"@ai-hero/sandcastle\";\nimport { createWorktree, run } from \"@ai-hero/sandcastle\";\nimport { docker } from \"@ai-hero/sandcastle/sandboxes/docker\";\nimport { ensureSandboxImageBuilt } from \"./sandbox-image-build\";\nimport { buildSandboxOptions } from \"./sandbox-options\";\n\ntype DeterministicParsedStreamEvent =\n | {\n type: \"text\";\n text: string;\n }\n | {\n type: \"result\";\n result: string;\n }\n | {\n type: \"tool_call\";\n name: string;\n args: string;\n }\n | {\n type: \"session_id\";\n sessionId: string;\n };\nimport type {\n ExecutionProvider,\n ExecutionProviderOptions,\n ExecutionResult,\n} from \"./execution-provider\";\nimport { writeExecutionArtifacts } from \"./execution-provider\";\n\nexport interface DeterministicAgentOptions {\n env?: Record<string, string>;\n}\n\nexport class DeterministicAgentProvider implements AgentProvider {\n readonly name = \"deterministic-agent\";\n readonly env: Record<string, string>;\n readonly captureSessions = false;\n\n constructor(options?: DeterministicAgentOptions) {\n this.env = options?.env ?? {};\n }\n\n buildPrintCommand(_options: AgentCommandOptions): PrintCommand {\n return {\n command: \"bash pourkit/execution/deterministic-agent.sh\",\n };\n }\n\n parseStreamLine(line: string): DeterministicParsedStreamEvent[] {\n const events: DeterministicParsedStreamEvent[] = [];\n\n if (line.includes(\"<promise>COMPLETE</promise>\")) {\n events.push({\n type: \"text\",\n text: line,\n });\n events.push({\n type: \"result\",\n result: \"COMPLETE\",\n });\n } else if (line.trim().length > 0) {\n events.push({\n type: \"text\",\n text: line,\n });\n }\n\n return events;\n }\n}\n\nfunction resolveSandboxProvider(provider: string) {\n if (provider === \"docker\") {\n return docker;\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\nexport class DeterministicExecutionProvider implements ExecutionProvider {\n lastResult: ExecutionResult | null = null;\n lastOptions: ExecutionProviderOptions | null = null;\n\n async execute(options: ExecutionProviderOptions): Promise<ExecutionResult> {\n this.lastOptions = options;\n const {\n stage,\n iteration,\n repoRoot: root,\n branchName,\n worktreePath,\n sandbox,\n timeoutMs,\n artifacts = [],\n logger,\n } = options;\n\n const stageLabel =\n iteration !== undefined ? `${stage}:${iteration}` : stage;\n logger.step(\n \"deterministic\",\n `[${stageLabel}] running deterministic agent (no LLM tokens)`\n );\n\n try {\n const logPath = `${root}/.pourkit/logs/${sanitizeBranch(branchName)}-deterministic-${Date.now()}.log`;\n\n await ensureSandboxImageBuilt(root, { force: sandbox.forceRebuild });\n\n const env: Record<string, string> = {\n POURKIT_STAGE: stage,\n POURKIT_BRANCH_NAME: branchName,\n };\n if (options.artifactPath) {\n env.POURKIT_ARTIFACT_PATH = options.artifactPath;\n }\n if (iteration !== undefined) {\n env.POURKIT_REVIEW_ITERATION = String(iteration);\n }\n\n const agent = new DeterministicAgentProvider({ env });\n\n const sandboxOptions = buildSandboxOptions(root, sandbox);\n const sandboxProvider = resolveSandboxProvider(sandbox.provider);\n let createdWorktreePath: string | undefined;\n const result = worktreePath\n ? await (async () => {\n await writeExecutionArtifacts(worktreePath, artifacts);\n return run({\n agent,\n sandbox: sandboxProvider(sandboxOptions),\n cwd: worktreePath,\n branchStrategy: { type: \"head\" },\n prompt: options.prompt,\n maxIterations: 1,\n logging: {\n type: \"file\",\n path: logPath,\n },\n completionSignal: \"<promise>COMPLETE</promise>\",\n ...(timeoutMs ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\n })()\n : await (async () => {\n const worktree = await createWorktree({\n cwd: root,\n branchStrategy: {\n type: \"branch\",\n branch: branchName,\n baseBranch: options.target.baseBranch,\n },\n });\n createdWorktreePath = worktree.worktreePath;\n await writeExecutionArtifacts(worktree.worktreePath, artifacts);\n return worktree.run({\n agent,\n sandbox: sandboxProvider(sandboxOptions),\n prompt: options.prompt,\n maxIterations: 1,\n logging: {\n type: \"file\",\n path: logPath,\n },\n completionSignal: \"<promise>COMPLETE</promise>\",\n ...(timeoutMs ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\n })();\n\n const commits = result.commits.map((c) => c.sha);\n\n logger.kv(\"SANDBOX_SUCCESS\", \"true\");\n logger.kv(\"COMMITS_CREATED\", String(commits.length));\n logger.kv(\"WORKTREE_BRANCH\", result.branch);\n if (result.logFilePath) {\n logger.kv(\"LOG_FILE\", result.logFilePath);\n }\n\n const artifactOnlyStage = stage === \"reviewer\" || stage === \"finalizer\";\n\n if (commits.length === 0 && !artifactOnlyStage) {\n this.lastResult = {\n success: false,\n branch: result.branch,\n worktreePath: worktreePath ?? createdWorktreePath ?? \"\",\n commits: [],\n logPath,\n error: \"Deterministic agent returned zero commits\",\n };\n return this.lastResult;\n }\n\n this.lastResult = {\n success: true,\n branch: result.branch,\n worktreePath: worktreePath ?? createdWorktreePath ?? \"\",\n commits,\n logPath,\n };\n return this.lastResult;\n } catch (error) {\n logger.step(\n \"error\",\n `Deterministic execution failed: ${error instanceof Error ? error.message : String(error)}`\n );\n this.lastResult = {\n success: false,\n branch: \"\",\n worktreePath: \"\",\n commits: [],\n logPath: null,\n error: error instanceof Error ? error.message : String(error),\n };\n return this.lastResult;\n }\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","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","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 type { VerificationCommand } from \"../shared/config\";\n\nexport type E2EVerificationProfile = \"fast\" | \"full-check\" | \"failure\";\n\nexport function getVerificationCommands(\n baseCommands: VerificationCommand[],\n profile: E2EVerificationProfile\n): VerificationCommand[] {\n if (profile === \"failure\") {\n return [{ command: \"exit 1\", label: \"fail-e2e\" }];\n }\n if (profile === \"full-check\") {\n return [\n { command: \"npm run prettier:check\", label: \"prettier:check\" },\n { command: \"npm run typecheck\", label: \"typecheck\" },\n { command: \"npm run test\", label: \"tests\" },\n { command: \"npm run build\", label: \"build\" },\n ];\n }\n return baseCommands;\n}\n\nexport function composeFailureWithProfile(\n baseCommands: VerificationCommand[],\n profile: E2EVerificationProfile\n): VerificationCommand[] {\n const commands = getVerificationCommands(baseCommands, profile);\n return [{ command: \"exit 1\", label: \"fail-e2e\" }, ...commands];\n}\n","import path from \"node:path\";\nimport {\n access,\n mkdir,\n readFile,\n readdir,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport type {\n ExecutionProvider,\n ExecutionProviderOptions,\n ExecutionResult,\n} from \"../../execution/execution-provider\";\nimport type {\n BranchStatus,\n CheckStatus,\n EnableAutoMergeOptions,\n MergePrOptions,\n PRProvider,\n PullRequest,\n WaitForPrChecksOptions,\n} from \"../../providers/pr-provider\";\nimport {\n execCapture,\n parseWorktreeListPorcelain,\n type PourkitLogger,\n} from \"../../shared/common\";\nimport type { GitHubClient } from \"../../providers/github-client\";\n\nexport interface E2EResources {\n targetBranch?: string;\n issueNumber?: number;\n issueUrl?: string;\n agentBranch?: string;\n prNumber?: number;\n prUrl?: string;\n}\n\ntype ReviewVerdict = \"PASS\" | \"PASS_WITH_NOTES\" | \"NEEDS_REFACTOR\" | \"FAIL\";\n\nexport interface LabelAssertionOptions {\n present?: string[];\n absent?: string[];\n}\n\nexport interface ExecutionFailureInjection {\n error?: string;\n throwMessage?: string;\n}\n\nexport interface ReviewerInjection extends ExecutionFailureInjection {\n verdicts?: ReviewVerdict[];\n invalidProtocol?: boolean;\n}\n\nexport interface RefactorInjection extends ExecutionFailureInjection {\n failIterations?: number[];\n commits?: string[];\n}\n\nexport interface FinalizerInjection extends ExecutionFailureInjection {\n invalidProtocol?: boolean;\n title?: string;\n body?: string;\n}\n\nexport interface ScenarioExecutionInjections {\n builder?: ExecutionFailureInjection;\n reviewer?: ReviewerInjection;\n refactor?: RefactorInjection;\n finalizer?: FinalizerInjection;\n}\n\nexport interface ScenarioPrInjections {\n branchStatuses?: BranchStatus[];\n waitForChecksDelayMs?: number;\n waitForChecksError?: string;\n waitForChecksResult?: CheckStatus[];\n requireWaitForChecksBeforeMerge?: boolean;\n expectLabelBeforeMerge?: {\n issueNumber: number;\n label: string;\n };\n}\n\nfunction makeSyntheticExecutionResult(\n options: ExecutionProviderOptions,\n success: boolean,\n commits: string[] = [],\n error?: string\n): ExecutionResult {\n return {\n success,\n branch: options.branchName,\n worktreePath: options.worktreePath ?? \"\",\n commits,\n logPath: null,\n ...(error ? { error } : {}),\n };\n}\n\nasync function maybeThrowInjectedFailure(\n injection: ExecutionFailureInjection | undefined\n): Promise<void> {\n if (injection?.throwMessage) {\n throw new Error(injection.throwMessage);\n }\n}\n\nasync function writeScenarioArtifact(\n worktreePath: string,\n artifactPath: string,\n content: string\n): Promise<void> {\n const filePath = path.join(worktreePath, artifactPath);\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, content, \"utf-8\");\n}\n\nexport class ScenarioExecutionProvider implements ExecutionProvider {\n readonly stageCalls: string[] = [];\n readonly reviewIterations: number[] = [];\n readonly refactorIterations: number[] = [];\n\n constructor(\n private readonly baseProvider: ExecutionProvider,\n readonly injections: ScenarioExecutionInjections = {}\n ) {}\n\n resetRunTracking(): void {\n this.stageCalls.length = 0;\n this.reviewIterations.length = 0;\n this.refactorIterations.length = 0;\n }\n\n async execute(options: ExecutionProviderOptions): Promise<ExecutionResult> {\n this.stageCalls.push(options.stage);\n\n if (options.stage === \"builder\") {\n await maybeThrowInjectedFailure(this.injections.builder);\n if (this.injections.builder?.error) {\n return makeSyntheticExecutionResult(\n options,\n false,\n [],\n this.injections.builder.error\n );\n }\n return this.baseProvider.execute(options);\n }\n\n if (options.stage === \"reviewer\") {\n await maybeThrowInjectedFailure(this.injections.reviewer);\n if (this.injections.reviewer?.error) {\n return makeSyntheticExecutionResult(\n options,\n false,\n [],\n this.injections.reviewer.error\n );\n }\n\n this.reviewIterations.push(options.iteration ?? 1);\n const verdicts = this.injections.reviewer?.verdicts ?? [\"PASS\"];\n const verdict =\n verdicts[\n Math.min(this.reviewIterations.length - 1, verdicts.length - 1)\n ];\n const artifactPath =\n options.artifactPath ?? \".pourkit/.tmp/reviewers/iteration-1.md\";\n const content = this.injections.reviewer?.invalidProtocol\n ? \"invalid reviewer artifact\"\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>${verdict}</verdict>`,\n ].join(\"\\n\");\n\n await writeScenarioArtifact(\n options.worktreePath ?? \"\",\n artifactPath,\n content\n );\n return makeSyntheticExecutionResult(options, true);\n }\n\n if (options.stage === \"refactor\") {\n await maybeThrowInjectedFailure(this.injections.refactor);\n this.refactorIterations.push(options.iteration ?? 1);\n if (\n this.injections.refactor?.error &&\n this.injections.refactor.failIterations?.includes(\n options.iteration ?? 1\n )\n ) {\n return makeSyntheticExecutionResult(\n options,\n false,\n [],\n this.injections.refactor.error\n );\n }\n\n return makeSyntheticExecutionResult(\n options,\n true,\n this.injections.refactor?.commits ?? [\n `synthetic-refactor-${options.iteration ?? 1}`,\n ]\n );\n }\n\n await maybeThrowInjectedFailure(this.injections.finalizer);\n if (this.injections.finalizer?.error) {\n return makeSyntheticExecutionResult(\n options,\n false,\n [],\n this.injections.finalizer.error\n );\n }\n\n const artifactPath =\n options.artifactPath ?? \".pourkit/.tmp/finalizer/agent-output.md\";\n const title = this.injections.finalizer?.title ?? \"Generated PR Title\";\n const body = this.injections.finalizer?.body ?? \"Generated PR body content\";\n const content = this.injections.finalizer?.invalidProtocol\n ? \"invalid finalizer artifact\"\n : `## PR Title\\n\\n${title}\\n\\n## PR Body\\n\\n${body}`;\n\n await writeScenarioArtifact(\n options.worktreePath ?? \"\",\n artifactPath,\n content\n );\n return makeSyntheticExecutionResult(options, true);\n }\n}\n\nexport class ScenarioPrProvider implements PRProvider {\n waitForPrChecksCalls = 0;\n mergeCalls = 0;\n branchStatusCalls = 0;\n\n constructor(\n private readonly baseProvider: PRProvider,\n private readonly client: GitHubClient,\n private readonly injections: ScenarioPrInjections = {}\n ) {}\n\n setExpectedLabelBeforeMerge(issueNumber: number, label: string): void {\n this.injections.expectLabelBeforeMerge = { issueNumber, label };\n }\n\n createPr(options: {\n title: string;\n body: string;\n head: string;\n base: string;\n }): Promise<PullRequest> {\n return this.baseProvider.createPr(options);\n }\n\n getPr(branchName: string): Promise<PullRequest | null> {\n return this.baseProvider.getPr(branchName);\n }\n\n getCheckStatus(prNumber: number): Promise<CheckStatus[]> {\n return this.baseProvider.getCheckStatus(prNumber);\n }\n\n async enableAutoMerge(\n _pr: PullRequest,\n _options?: EnableAutoMergeOptions\n ): Promise<void> {\n return this.baseProvider.enableAutoMerge(_pr, _options);\n }\n\n async mergePr(prNumber: number, options?: MergePrOptions): Promise<void> {\n this.mergeCalls++;\n if (\n this.injections.requireWaitForChecksBeforeMerge &&\n this.waitForPrChecksCalls === 0\n ) {\n throw new Error(\"mergePr called before waitForPrChecks\");\n }\n\n if (this.injections.expectLabelBeforeMerge) {\n await assertIssueLabels(\n this.injections.expectLabelBeforeMerge.issueNumber,\n {\n present: [this.injections.expectLabelBeforeMerge.label],\n },\n this.client\n );\n }\n\n await this.baseProvider.mergePr(prNumber, options);\n }\n\n async waitForPrChecks(\n prNumber: number,\n options?: WaitForPrChecksOptions\n ): Promise<CheckStatus[]> {\n this.waitForPrChecksCalls++;\n\n if (this.injections.waitForChecksDelayMs) {\n await new Promise((resolve) =>\n setTimeout(resolve, this.injections.waitForChecksDelayMs)\n );\n }\n\n if (this.injections.waitForChecksError) {\n throw new Error(this.injections.waitForChecksError);\n }\n\n if (this.injections.waitForChecksResult) {\n return this.injections.waitForChecksResult;\n }\n\n return this.baseProvider.waitForPrChecks(prNumber, options);\n }\n\n async getBranchStatus(branchName: string): Promise<BranchStatus> {\n this.branchStatusCalls++;\n const statuses = this.injections.branchStatuses;\n if (statuses && statuses.length > 0) {\n return statuses[\n Math.min(this.branchStatusCalls - 1, statuses.length - 1)\n ];\n }\n return this.baseProvider.getBranchStatus(branchName);\n }\n}\n\ninterface E2EStateFile extends E2EResources {\n runId: string;\n}\n\nexport const E2E_STATE_DIR = path.join(\".pourkit\", \".tmp\", \"e2e-runs\");\n\nexport function stateFilePath(root: string, runId: string): string {\n return path.join(root, E2E_STATE_DIR, `${runId}.json`);\n}\n\nexport async function persistResources(\n root: string,\n runId: string,\n resources: E2EResources\n): Promise<void> {\n const filePath = stateFilePath(root, runId);\n await mkdir(path.dirname(filePath), { recursive: true });\n const state: E2EStateFile = { runId, ...resources };\n await writeFile(filePath, `${JSON.stringify(state, null, 2)}\\n`, \"utf-8\");\n}\n\nexport async function localBranchExists(branchName: string): Promise<boolean> {\n try {\n await execCapture(\"git\", [\n \"show-ref\",\n \"--verify\",\n \"--quiet\",\n `refs/heads/${branchName}`,\n ]);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function removeWorktreeForBranch(\n branchName: string,\n logger: PourkitLogger\n): Promise<boolean> {\n try {\n const result = await execCapture(\"git\", [\n \"worktree\",\n \"list\",\n \"--porcelain\",\n ]);\n const worktreePath = parseWorktreeListPorcelain(result.stdout, branchName);\n\n if (!worktreePath) {\n return true;\n }\n\n logger.step(\"cleanup\", `Removing worktree for branch: ${branchName}...`);\n await execCapture(\"git\", [\"worktree\", \"remove\", \"--force\", worktreePath]);\n return true;\n } catch (error) {\n logger.step(\n \"warn\",\n `Failed to remove worktree for branch: ${error instanceof Error ? error.message : String(error)}`\n );\n return false;\n }\n}\n\nexport async function worktreeExistsForBranch(\n branchName: string\n): Promise<boolean> {\n try {\n const result = await execCapture(\"git\", [\n \"worktree\",\n \"list\",\n \"--porcelain\",\n ]);\n const worktreePath = parseWorktreeListPorcelain(result.stdout, branchName);\n return worktreePath !== null;\n } catch {\n return false;\n }\n}\n\nexport async function worktreePathForBranch(\n branchName: string\n): Promise<string | null> {\n try {\n const result = await execCapture(\"git\", [\n \"worktree\",\n \"list\",\n \"--porcelain\",\n ]);\n return parseWorktreeListPorcelain(result.stdout, branchName);\n } catch {\n return null;\n }\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function deleteLocalBranch(\n branchName: string,\n logger: PourkitLogger\n): Promise<boolean> {\n if (!(await localBranchExists(branchName))) {\n return true;\n }\n\n if (!(await removeWorktreeForBranch(branchName, logger))) {\n return false;\n }\n\n try {\n logger.step(\"cleanup\", `Deleting local branch: ${branchName}...`);\n await execCapture(\"git\", [\"branch\", \"-D\", branchName]);\n return true;\n } catch (error) {\n logger.step(\n \"warn\",\n `Failed to delete local branch: ${error instanceof Error ? error.message : String(error)}`\n );\n return false;\n }\n}\n\nasync function deleteRemoteBranch(\n branchName: string,\n logger: PourkitLogger\n): Promise<boolean> {\n if (!(await remoteBranchExists(branchName))) {\n return true;\n }\n\n try {\n logger.step(\"cleanup\", `Deleting remote branch: ${branchName}...`);\n await execCapture(\"git\", [\"push\", \"origin\", \"--delete\", branchName]);\n return true;\n } catch (error) {\n logger.step(\n \"warn\",\n `Failed to delete remote branch: ${error instanceof Error ? error.message : String(error)}`\n );\n return false;\n }\n}\n\nexport async function createE2EIssue(\n runId: string,\n targetBranch: string,\n logger: PourkitLogger,\n client: GitHubClient,\n title = `E2E Test Issue ${runId}`\n): Promise<{ number: number; url: string }> {\n const body = [\n `This is an automatically created E2E test issue for run ${runId}.`,\n \"\",\n `Target branch: ${targetBranch}`,\n \"\",\n \"This issue should be processed by the deterministic agent and cleaned up after the test completes.\",\n ].join(\"\\n\");\n\n logger.step(\"issue\", `Creating GitHub issue: \"${title}\"`);\n\n const { data } = await client.octokit.rest.issues.create({\n owner: client.owner,\n repo: client.repo,\n title,\n body,\n labels: [\"ready-for-agent\", \"type:infra\", \"pourkit-e2e\"],\n });\n\n logger.line(`Created issue #${data.number}`);\n return { number: data.number, url: data.html_url };\n}\n\nexport async function createLiveTargetBranch(\n runId: string,\n logger: PourkitLogger\n): Promise<string> {\n const targetBranch = `pourkit-e2e-target/${runId}`;\n logger.step(\"git\", `Creating target branch: ${targetBranch}`);\n await execCapture(\"git\", [\"branch\", \"--force\", targetBranch, \"origin/e2e\"]);\n await execCapture(\"git\", [\n \"push\",\n \"--no-verify\",\n \"-u\",\n \"origin\",\n targetBranch,\n ]);\n return targetBranch;\n}\n\nexport async function fetchIssueLabels(\n issueNumber: number,\n client: GitHubClient\n): Promise<string[]> {\n const { data } = await client.octokit.rest.issues.get({\n owner: client.owner,\n repo: client.repo,\n issue_number: issueNumber,\n });\n\n return data.labels.map((l) => (typeof l === \"string\" ? l : (l.name ?? \"\")));\n}\n\nexport async function assertIssueLabels(\n issueNumber: number,\n options: LabelAssertionOptions,\n client: GitHubClient\n): Promise<void> {\n const labels = await fetchIssueLabels(issueNumber, client);\n const missing = (options.present ?? []).filter(\n (label) => !labels.includes(label)\n );\n const unexpected = (options.absent ?? []).filter((label) =>\n labels.includes(label)\n );\n\n if (missing.length === 0 && unexpected.length === 0) {\n return;\n }\n\n const messages: string[] = [];\n if (missing.length > 0) {\n messages.push(`missing labels: ${missing.join(\", \")}`);\n }\n if (unexpected.length > 0) {\n messages.push(`unexpected labels: ${unexpected.join(\", \")}`);\n }\n\n throw new Error(\n `Issue #${issueNumber} label assertion failed (${messages.join(\"; \")}). Current labels: ${labels.join(\", \")}`\n );\n}\n\nexport async function lookupPrByBranch(\n branchName: string,\n client: GitHubClient\n): Promise<PullRequest | null> {\n const { data } = await client.octokit.rest.pulls.list({\n owner: client.owner,\n repo: client.repo,\n head: `${client.owner}:${branchName}`,\n state: \"all\",\n per_page: 1,\n });\n\n if (data.length === 0) return null;\n\n const pr = data[0];\n return {\n number: pr.number,\n nodeId: pr.node_id,\n url: pr.html_url,\n title: pr.title,\n body: pr.body ?? \"\",\n headRefName: pr.head.ref,\n baseRefName: pr.base.ref,\n state:\n pr.state === \"closed\" ? (pr.merged_at ? \"MERGED\" : \"CLOSED\") : \"OPEN\",\n headRefOid: pr.head.sha,\n };\n}\n\nexport async function remoteBranchExists(branchName: string): Promise<boolean> {\n const result = await execCapture(\"git\", [\n \"ls-remote\",\n \"--heads\",\n \"origin\",\n branchName,\n ]);\n return result.stdout.trim().length > 0;\n}\n\nexport async function countRemoteBranchCommits(\n branchName: string\n): Promise<number> {\n await execCapture(\"git\", [\"fetch\", \"origin\", branchName]);\n const result = await execCapture(\"git\", [\n \"rev-list\",\n \"--count\",\n `origin/${branchName}`,\n ]);\n return Number(result.stdout.trim());\n}\n\nexport async function getTargetBranchStatus(\n prProvider: PRProvider,\n targetBranch: string\n): Promise<BranchStatus> {\n return prProvider.getBranchStatus(targetBranch);\n}\n\nasync function recoverStateFile(\n filePath: string,\n logger: PourkitLogger\n): Promise<boolean> {\n try {\n const raw = await readFile(filePath, \"utf-8\");\n const state = JSON.parse(raw) as E2EStateFile;\n let cleanupSucceeded = true;\n\n if (state.agentBranch) {\n cleanupSucceeded =\n (await deleteLocalBranch(state.agentBranch, logger)) &&\n cleanupSucceeded;\n cleanupSucceeded =\n (await deleteRemoteBranch(state.agentBranch, logger)) &&\n cleanupSucceeded;\n }\n\n if (state.targetBranch) {\n cleanupSucceeded =\n (await deleteLocalBranch(state.targetBranch, logger)) &&\n cleanupSucceeded;\n cleanupSucceeded =\n (await deleteRemoteBranch(state.targetBranch, logger)) &&\n cleanupSucceeded;\n }\n\n if (cleanupSucceeded) {\n await rm(filePath, { force: true });\n return true;\n }\n\n logger.step(\n \"warn\",\n `Preserving stale E2E state ${path.basename(filePath)} for cleanup retry`\n );\n return false;\n } catch (error) {\n logger.step(\n \"warn\",\n `Failed to recover stale E2E state ${path.basename(filePath)}: ${error instanceof Error ? error.message : String(error)}`\n );\n return false;\n }\n}\n\nexport async function recoverStaleRuns(\n root: string,\n logger: PourkitLogger\n): Promise<void> {\n const dir = path.join(root, E2E_STATE_DIR);\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".json\")) continue;\n await recoverStateFile(path.join(dir, entry.name), logger);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n logger.step(\n \"warn\",\n `Failed to scan stale E2E state: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n}\n\nexport async function cleanupResources(\n resources: E2EResources,\n root: string,\n runId: string,\n keep: boolean,\n logger: PourkitLogger,\n client: GitHubClient\n): Promise<void> {\n if (keep) {\n logger.line(\"--keep flag set, preserving E2E resources:\");\n if (resources.issueNumber)\n logger.line(` Issue: #${resources.issueNumber}`);\n if (resources.issueUrl) logger.line(` Issue URL: ${resources.issueUrl}`);\n if (resources.targetBranch)\n logger.line(` Target branch: ${resources.targetBranch}`);\n if (resources.agentBranch)\n logger.line(` Agent branch: ${resources.agentBranch}`);\n if (resources.prNumber)\n logger.line(` PR: #${resources.prNumber} (${resources.prUrl})`);\n return;\n }\n\n logger.line(\"Cleaning up E2E resources...\");\n let cleanupSucceeded = true;\n\n if (resources.prNumber) {\n try {\n const { data } = await client.octokit.rest.pulls.get({\n owner: client.owner,\n repo: client.repo,\n pull_number: resources.prNumber,\n });\n if (data.merged) {\n logger.step(\n \"cleanup\",\n `PR #${resources.prNumber} is merged, skipping close`\n );\n } else {\n logger.step(\"cleanup\", `Closing PR #${resources.prNumber}...`);\n await client.octokit.rest.pulls.update({\n owner: client.owner,\n repo: client.repo,\n pull_number: resources.prNumber,\n state: \"closed\",\n });\n }\n } catch (error) {\n logger.step(\n \"warn\",\n `Failed to close PR: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n if (resources.issueNumber) {\n try {\n logger.step(\"cleanup\", `Closing issue #${resources.issueNumber}...`);\n await client.octokit.rest.issues.update({\n owner: client.owner,\n repo: client.repo,\n issue_number: resources.issueNumber,\n state: \"closed\",\n state_reason: \"completed\",\n });\n } catch (error) {\n logger.step(\n \"warn\",\n `Failed to close issue: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n if (resources.agentBranch) {\n cleanupSucceeded =\n (await deleteLocalBranch(resources.agentBranch, logger)) &&\n cleanupSucceeded;\n cleanupSucceeded =\n (await deleteRemoteBranch(resources.agentBranch, logger)) &&\n cleanupSucceeded;\n }\n\n if (resources.targetBranch) {\n cleanupSucceeded =\n (await deleteLocalBranch(resources.targetBranch, logger)) &&\n cleanupSucceeded;\n cleanupSucceeded =\n (await deleteRemoteBranch(resources.targetBranch, logger)) &&\n cleanupSucceeded;\n }\n\n if (cleanupSucceeded) {\n await rm(stateFilePath(root, runId), { force: true });\n } else {\n logger.step(\"warn\", \"Preserving E2E state for retry after cleanup failure\");\n }\n\n logger.line(\"Cleanup complete.\");\n}\n\nexport interface QueueLoopCleanupIssue {\n issueNumber: number;\n agentBranch?: string;\n prNumber?: number;\n}\n\nexport interface QueueLoopCleanupResources {\n targetBranch: string;\n issues: QueueLoopCleanupIssue[];\n}\n\nexport async function cleanupQueueLoopResources(\n resources: QueueLoopCleanupResources,\n root: string,\n runId: string,\n logger: PourkitLogger,\n client: GitHubClient\n): Promise<string[]> {\n const errors: string[] = [];\n\n logger.line(\"Cleaning up Queue Loop E2E resources...\");\n\n for (const issue of resources.issues) {\n let prNumber = issue.prNumber;\n\n if (!prNumber && issue.agentBranch) {\n try {\n const pr = await lookupPrByBranch(issue.agentBranch, client);\n if (pr) {\n prNumber = pr.number;\n }\n } catch {}\n }\n\n if (prNumber) {\n try {\n const { data } = await client.octokit.rest.pulls.get({\n owner: client.owner,\n repo: client.repo,\n pull_number: prNumber,\n });\n if (!data.merged) {\n logger.step(\"cleanup\", `Closing PR #${prNumber}...`);\n await client.octokit.rest.pulls.update({\n owner: client.owner,\n repo: client.repo,\n pull_number: prNumber,\n state: \"closed\",\n });\n }\n } catch (error) {\n errors.push(`Failed to close PR #${prNumber}`);\n logger.step(\n \"warn\",\n `Failed to close PR #${prNumber}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n\n for (const issue of resources.issues) {\n try {\n logger.step(\"cleanup\", `Closing issue #${issue.issueNumber}...`);\n await client.octokit.rest.issues.update({\n owner: client.owner,\n repo: client.repo,\n issue_number: issue.issueNumber,\n state: \"closed\",\n state_reason: \"completed\",\n });\n } catch (error) {\n errors.push(`Failed to close issue #${issue.issueNumber}`);\n logger.step(\n \"warn\",\n `Failed to close issue #${issue.issueNumber}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n for (const issue of resources.issues) {\n if (issue.agentBranch) {\n if (!(await deleteLocalBranch(issue.agentBranch, logger))) {\n errors.push(`Failed to delete local branch ${issue.agentBranch}`);\n }\n if (!(await deleteRemoteBranch(issue.agentBranch, logger))) {\n errors.push(`Failed to delete remote branch ${issue.agentBranch}`);\n }\n }\n }\n\n if (!(await deleteLocalBranch(resources.targetBranch, logger))) {\n errors.push(\n `Failed to delete local target branch ${resources.targetBranch}`\n );\n }\n if (!(await deleteRemoteBranch(resources.targetBranch, logger))) {\n errors.push(\n `Failed to delete remote target branch ${resources.targetBranch}`\n );\n }\n\n try {\n await rm(stateFilePath(root, runId), { force: true });\n } catch (error) {\n errors.push(\"Failed to remove state file\");\n }\n\n logger.line(\"Queue Loop cleanup complete.\");\n return errors;\n}\n\nexport async function runCleanupOnly(\n root: string,\n logger: PourkitLogger,\n client: GitHubClient\n): Promise<void> {\n logger.line(\"Running cleanup-only mode: deleting stale e2e branches...\");\n\n const result = await execCapture(\"git\", [\"ls-remote\", \"--heads\", \"origin\"]);\n const lines = result.stdout\n .split(\"\\n\")\n .filter((line) => line.trim().length > 0);\n\n const e2eBranchPattern =\n /refs\\/heads\\/(pourkit-e2e-target\\/|pourkit\\/\\d+\\/(e2e-test-issue-|test-live-e2e-))/;\n const branchesToDelete = lines\n .map((line) => {\n const parts = line.split(/\\s+/);\n return parts[1];\n })\n .filter((ref) => e2eBranchPattern.test(ref))\n .map((ref) => ref.replace(\"refs/heads/\", \"\"));\n\n let deletedCount = 0;\n let failedCount = 0;\n\n for (const branch of branchesToDelete) {\n const localOk = await deleteLocalBranch(branch, logger);\n const remoteOk = await deleteRemoteBranch(branch, logger);\n if (localOk && remoteOk) {\n deletedCount++;\n } else {\n failedCount++;\n }\n }\n\n const issueLabel = \"pourkit-e2e\";\n let closedIssueCount = 0;\n let failedIssueCount = 0;\n\n const openIssues = await client.octokit.paginate(\n client.octokit.rest.issues.listForRepo,\n {\n owner: client.owner,\n repo: client.repo,\n state: \"open\",\n labels: issueLabel,\n per_page: 100,\n }\n );\n\n const issues = openIssues.filter((issue) => !issue.pull_request);\n\n for (const issue of issues) {\n try {\n logger.step(\"cleanup\", `Closing e2e issue #${issue.number}...`);\n await client.octokit.rest.issues.update({\n owner: client.owner,\n repo: client.repo,\n issue_number: issue.number,\n state: \"closed\",\n state_reason: \"completed\",\n });\n closedIssueCount++;\n } catch (error) {\n failedIssueCount++;\n logger.step(\n \"warn\",\n `Failed to close e2e issue #${issue.number}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n const stateDir = path.join(root, E2E_STATE_DIR);\n try {\n const entries = await readdir(stateDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".json\")) continue;\n const filePath = path.join(stateDir, entry.name);\n await rm(filePath, { force: true });\n logger.step(\"cleanup\", `Removed state file: ${entry.name}`);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n logger.step(\n \"warn\",\n `Failed to scan state directory: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n logger.line(\n `Cleanup-only complete: ${deletedCount} branch(es) deleted, ${closedIssueCount} issue(s) closed, ${failedCount + failedIssueCount} failure(s)`\n );\n}\n"],"mappings":"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","names":["path","path","existsSync","mkdir","readFile","readdir","rm","writeFile","existsSync","readFileSync","join","path","repoRoot","existsSync","readFile","writeFile","rm","pathToFileURL","repoRoot","mkdirSync","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","run","secondsRemaining","formatChecks","execCapture","path","existsSync","readFileSync","path","repoRoot","repoRoot","path","repoRoot","dirname","join","join","dirname","getVerificationCommands","path","mkdir","readFile","writeFile","path","mkdir","writeFile","readFile","path","path","E2E_STATE_DIR","path","existsSync","stateFilePath","localBranchExists","remoteBranchExists","removeWorktreeForBranch","deleteLocalBranch","deleteRemoteBranch","getVerificationCommands","deleteLocalBranch","deleteRemoteBranch","rm","stateFilePath","path"]}
|