@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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../common/logger/src/index.ts","../../shared/common.ts","../../issues/close-issues-on-merge.ts","../../providers/github-client.ts","../../issues/blocked-issue.ts","../../issues/issue-transitions.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 { fileURLToPath } from \"node:url\";\n\nimport {\n createLogger,\n ensureDir,\n repoRelative,\n repoRoot,\n} from \"../shared/common\";\nimport { TYPE_LABELS } from \"../shared/common\";\nimport type { GitHubClient } from \"../providers/github-client\";\nimport { requireGitHubClient } from \"../providers/github-client\";\nimport {\n parseBlockedBy,\n reconcileBlockedIssues,\n type BlockedIssue,\n} from \"./blocked-issue\";\nimport {\n createIssueTransitions,\n type IssueTransitionDeps,\n} from \"./issue-transitions\";\n\ntype Issue = {\n number: number;\n id: number;\n state: string;\n pull_request?: unknown;\n title: string;\n body: string | null;\n};\n\ntype RunContext = {\n client: GitHubClient;\n prNumber: number;\n prTitle: string;\n prBody: string;\n};\n\nconst ROOT = repoRoot();\nprocess.chdir(ROOT);\n\nconst LOG_DIR = repoRelative(ROOT, \"pourkit\", \"logs\");\nconst RUN_ID = new Date().toISOString().replace(/[:.]/g, \"-\");\nconst LOG_PATH = repoRelative(\n ROOT,\n \"pourkit\",\n \"logs\",\n `close-issues-on-merge-${RUN_ID}.log`\n);\nconst logger = createLogger(\"close-issues-on-merge\", LOG_PATH);\nconst __filename = fileURLToPath(import.meta.url);\n\nasync function main() {\n try {\n await ensureDir(LOG_DIR);\n logger.status(\"starting\");\n const client = await requireGitHubClient();\n const context = readContext(client);\n logger.kv(\"POURKIT_PR_NUMBER\", String(context.prNumber));\n logger.kv(\"POURKIT_PR_TITLE\", context.prTitle);\n await closeIssuesOnMerge(context);\n logger.status(\"completed\");\n } catch (error) {\n logger.status(\"failed\");\n logger.line(\n error instanceof Error ? (error.stack ?? error.message) : String(error)\n );\n process.exitCode = 1;\n } finally {\n await logger.close();\n }\n}\n\nasync function closeIssuesOnMerge(context: RunContext) {\n const issueNumbers = parseClosingIssueNumbers(context.prBody);\n\n if (issueNumbers.length === 0) {\n logger.step(\n \"skip\",\n \"No issues referenced with closing keywords. Skipping.\"\n );\n return;\n }\n\n logger.kv(\"closing_issue_count\", String(issueNumbers.length));\n\n for (const issueNumber of issueNumbers) {\n try {\n await processIssue(context, issueNumber);\n } catch (error) {\n logger.step(\n \"error\",\n `Error processing issue #${issueNumber}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n}\n\nasync function processIssue(context: RunContext, issueNumber: number) {\n const issue = await getIssue(context, issueNumber);\n\n if (issue.pull_request) {\n logger.step(\n \"skip\",\n `#${issueNumber} is a pull request, not an issue. Skipping.`\n );\n return;\n }\n\n if (issue.state === \"open\") {\n await commentOnClosedIssue(context, issueNumber);\n await closeIssue(context, issueNumber);\n logger.step(\"close\", `Closed issue #${issueNumber}`);\n } else {\n logger.step(\"skip\", `Issue #${issueNumber} is already closed.`);\n }\n\n const blockedIssues = await listIssuesBlockedBy(context, issueNumber);\n\n if (blockedIssues.length === 0) {\n logger.step(\n \"skip\",\n `Issue #${issueNumber} was not blocking any other issues.`\n );\n return;\n }\n\n logger.step(\n \"unblock\",\n `Issue #${issueNumber} was blocking ${blockedIssues.length} issue(s).`\n );\n\n const getIssueState = async (blockedIssueNumber: number) => {\n const { data } = await context.client.octokit.rest.issues.get({\n owner: context.client.owner,\n repo: context.client.repo,\n issue_number: blockedIssueNumber,\n });\n return (data.state as string).toUpperCase();\n };\n\n const transitionDeps: IssueTransitionDeps = {\n fetchIssue: async (issueNumber) => {\n const { data } = await context.client.octokit.rest.issues.get({\n owner: context.client.owner,\n repo: context.client.repo,\n issue_number: issueNumber,\n });\n return {\n labels: data.labels.map((l) =>\n typeof l === \"string\" ? l : (l.name ?? \"\")\n ),\n };\n },\n addLabels: async (issueNumber, labels) => {\n await withRetryOnTransient(() =>\n context.client.octokit.rest.issues.addLabels({\n owner: context.client.owner,\n repo: context.client.repo,\n issue_number: issueNumber,\n labels,\n })\n );\n },\n removeLabel: async (issueNumber, label) => {\n try {\n await withRetryOnTransient(() =>\n context.client.octokit.rest.issues.removeLabel({\n owner: context.client.owner,\n repo: context.client.repo,\n issue_number: issueNumber,\n name: label,\n })\n );\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"status\" in error &&\n (error as { status: number }).status === 404\n ) {\n // Label may not exist\n } else {\n throw error;\n }\n }\n },\n updateLabels: async (issueNumber, removes, adds) => {\n for (const label of removes) {\n try {\n await withRetryOnTransient(() =>\n context.client.octokit.rest.issues.removeLabel({\n owner: context.client.owner,\n repo: context.client.repo,\n issue_number: issueNumber,\n name: label,\n })\n );\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"status\" in error &&\n (error as { status: number }).status === 404\n ) {\n // Label may not exist\n } else {\n throw error;\n }\n }\n }\n if (adds.length > 0) {\n await withRetryOnTransient(() =>\n context.client.octokit.rest.issues.addLabels({\n owner: context.client.owner,\n repo: context.client.repo,\n issue_number: issueNumber,\n labels: adds,\n })\n );\n }\n },\n };\n\n const transitions = createIssueTransitions(transitionDeps, {\n blocked: \"blocked\",\n readyForAgent: \"ready-for-agent\",\n needsTriage: \"needs-triage\",\n agentInProgress: \"agent-in-progress\",\n readyForHuman: \"ready-for-human\",\n prOpenAwaitingMerge: \"pr-open-awaiting-merge\",\n });\n\n for (const blockedIssue of blockedIssues) {\n try {\n const [reconcileEntry] = await reconcileBlockedIssues([blockedIssue], {\n getIssueState,\n transitions,\n typeLabels: TYPE_LABELS,\n readyLabel: \"ready-for-agent\",\n });\n\n if (reconcileEntry.result === \"still-blocked\") {\n logger.step(\n \"skip\",\n `Issue #${blockedIssue.number} is still blocked by another issue.`\n );\n continue;\n }\n\n try {\n await commentOnUnblockedIssue(\n context,\n blockedIssue.number,\n issueNumber\n );\n\n logger.step(\"unblocked\", `Unblocked issue #${blockedIssue.number}.`);\n } catch (error) {\n logger.step(\n \"error\",\n `Failed to unblock issue #${blockedIssue.number} from #${issueNumber}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n } catch (error) {\n logger.step(\n \"error\",\n `Failed to check blockers for issue #${blockedIssue.number}.`\n );\n }\n }\n}\n\nasync function getIssue(\n context: RunContext,\n issueNumber: number\n): Promise<Issue> {\n const { data } = await context.client.octokit.rest.issues.get({\n owner: context.client.owner,\n repo: context.client.repo,\n issue_number: issueNumber,\n });\n return {\n number: data.number,\n id: data.id,\n state: data.state,\n pull_request: data.pull_request,\n title: data.title,\n body: data.body ?? null,\n };\n}\n\nasync function closeIssue(context: RunContext, issueNumber: number) {\n const maxRetries = 3;\n const backoffMs = 2000;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n await context.client.octokit.rest.issues.update({\n owner: context.client.owner,\n repo: context.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 || error.status === 503 || 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\nasync function commentOnClosedIssue(context: RunContext, issueNumber: number) {\n await context.client.octokit.rest.issues.createComment({\n owner: context.client.owner,\n repo: context.client.repo,\n issue_number: issueNumber,\n body: `Closed automatically because PR #${context.prNumber} (${context.prTitle}) merged into \\`next\\`.`,\n });\n}\n\nasync function listIssuesBlockedBy(\n context: RunContext,\n blockingIssueNumber: number\n): Promise<BlockedIssue[]> {\n const { data } = await context.client.octokit.rest.issues.listForRepo({\n owner: context.client.owner,\n repo: context.client.repo,\n state: \"open\",\n labels: \"blocked\",\n per_page: 100,\n });\n\n const allIssues = 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: string | { name?: string | null }) => ({\n name: typeof l === \"string\" ? l : (l.name ?? \"\"),\n })),\n }));\n\n const matching: BlockedIssue[] = [];\n for (const issue of allIssues) {\n const blockers = parseBlockedBy(issue.body);\n if (blockers.includes(blockingIssueNumber)) {\n matching.push({\n number: issue.number,\n body: issue.body,\n labels: issue.labels,\n });\n }\n }\n return matching;\n}\n\nasync function commentOnUnblockedIssue(\n context: RunContext,\n blockedIssueNumber: number,\n issueNumber: number\n) {\n await context.client.octokit.rest.issues.createComment({\n owner: context.client.owner,\n repo: context.client.repo,\n issue_number: blockedIssueNumber,\n body: `Unblocked automatically because #${issueNumber} was closed by PR #${context.prNumber}.`,\n });\n}\n\nfunction readContext(client: GitHubClient): RunContext {\n const prNumber = Number(process.env.POURKIT_PR_NUMBER);\n const prTitle = process.env.POURKIT_PR_TITLE?.trim();\n const prBody = process.env.POURKIT_PR_BODY ?? \"\";\n\n if (!Number.isInteger(prNumber) || prNumber <= 0) {\n throw new Error(\"POURKIT_PR_NUMBER is required\");\n }\n\n if (!prTitle) {\n throw new Error(\"POURKIT_PR_TITLE is required\");\n }\n\n return { client, prNumber, prTitle, prBody };\n}\n\nexport function parseClosingIssueNumbers(body: string | null) {\n if (!body) return [];\n\n const regex =\n /(?:close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved)\\s*:?\\s*#(\\d+)/gi;\n const issueNumbers = new Set<number>();\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(body)) !== null) {\n issueNumbers.add(Number.parseInt(match[1], 10));\n }\n\n return [...issueNumbers];\n}\n\nasync function withRetryOnTransient<T>(\n fn: () => Promise<T>,\n maxAttempts: number = 2\n): Promise<T> {\n let lastError: unknown;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n const isTransient =\n (error instanceof Error &&\n /HTTP (502|503|504)\\b/.test(error.message)) ||\n (typeof error === \"object\" &&\n error !== null &&\n \"status\" in error &&\n ((error as { status: number }).status === 502 ||\n (error as { status: number }).status === 503 ||\n (error as { status: number }).status === 504));\n if (!isTransient || attempt === maxAttempts) {\n throw error;\n }\n await new Promise((r) => setTimeout(r, 2000 * Math.pow(2, attempt - 1)));\n }\n }\n throw lastError as Error;\n}\n\nif (process.argv[1] === __filename) {\n void main();\n}\n\nexport { main };\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","export type BlockedIssue = {\n number: number;\n body: string | null;\n labels?: Array<{ name: string }>;\n};\n\nimport type { IssueTransitionsContract } from \"./issue-transitions\";\n\nexport type ReconcileDependencies = {\n getIssueState: (issueNumber: number) => Promise<string>;\n transitions: IssueTransitionsContract;\n typeLabels: readonly string[];\n readyLabel: string;\n};\n\nexport type ReconcileResult = \"still-blocked\" | \"unblocked\" | \"needs-triage\";\n\nexport type ReconcileBlockedIssuesResult = {\n issueNumber: number;\n result: ReconcileResult;\n};\n\nexport function parseBlockedBy(body: string | null): number[] {\n if (!body) return [];\n\n const bm = body.match(/## Blocked by\\s*\\n([\\s\\S]*?)(?=\\n## |$)/i);\n if (!bm) return [];\n\n const refs: number[] = [];\n const re = /#(\\d+)/g;\n let m;\n while ((m = re.exec(bm[1])) !== null) {\n refs.push(Number(m[1]));\n }\n return refs;\n}\n\nexport async function reconcileBlockedIssue(\n issue: BlockedIssue,\n deps: ReconcileDependencies\n): Promise<ReconcileResult> {\n const blockers = parseBlockedBy(issue.body);\n\n if (blockers.length === 0) {\n await deps.transitions.moveToNeedsTriage(issue.number);\n return \"needs-triage\";\n }\n\n const stillBlocked = await anyBlockerStillOpen(blockers, deps.getIssueState);\n if (stillBlocked) {\n return \"still-blocked\";\n }\n\n const labels = issue.labels ?? [];\n const typeLabels = labels.filter((l) => deps.typeLabels.includes(l.name));\n\n if (typeLabels.length === 1) {\n await deps.transitions.removeBlocked(issue.number);\n const alreadyReady = labels.some((l) => l.name === deps.readyLabel);\n if (!alreadyReady) {\n await deps.transitions.addReadyForAgent(issue.number);\n }\n return \"unblocked\";\n }\n\n await deps.transitions.moveToNeedsTriage(issue.number);\n return \"needs-triage\";\n}\n\nexport async function reconcileBlockedIssues(\n issues: BlockedIssue[],\n deps: ReconcileDependencies\n): Promise<ReconcileBlockedIssuesResult[]> {\n const results: ReconcileBlockedIssuesResult[] = [];\n\n for (const issue of issues) {\n const result = await reconcileBlockedIssue(issue, deps);\n results.push({ issueNumber: issue.number, result });\n }\n\n return results;\n}\n\nasync function anyBlockerStillOpen(\n refs: number[],\n getIssueState: (issueNumber: number) => Promise<string>\n): Promise<boolean> {\n for (const ref of refs) {\n const state = await getIssueState(ref);\n if (state !== \"CLOSED\") {\n return true;\n }\n }\n\n return false;\n}\n","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"],"mappings":"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","names":["path","execCapture","issueNumber"]}