@open330/oac 2026.4.1 → 2026.4.2
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.
Potentially problematic release.
This version of @open330/oac might be problematic. Click here for more details.
- package/dist/budget/index.d.ts +29 -1
- package/dist/budget/index.js +5 -1
- package/dist/{chunk-ZPI2VQ7U.js → chunk-2JOG3M5O.js} +564 -3
- package/dist/chunk-2JOG3M5O.js.map +1 -0
- package/dist/{chunk-UL66HWYF.js → chunk-3X6AFC3O.js} +52 -2
- package/dist/chunk-3X6AFC3O.js.map +1 -0
- package/dist/{chunk-TGZ2TGDA.js → chunk-5TSIEP6T.js} +12 -2
- package/dist/chunk-5TSIEP6T.js.map +1 -0
- package/dist/{chunk-VLR2VYFW.js → chunk-CJAJ4MBO.js} +2 -2
- package/dist/chunk-CJAJ4MBO.js.map +1 -0
- package/dist/{chunk-SZUDHVBF.js → chunk-N5OWF3UW.js} +1048 -597
- package/dist/chunk-N5OWF3UW.js.map +1 -0
- package/dist/{chunk-NZEI4RPP.js → chunk-VJW7RNZI.js} +85 -35
- package/dist/chunk-VJW7RNZI.js.map +1 -0
- package/dist/cli/cli.js +6 -6
- package/dist/cli/index.js +6 -6
- package/dist/completion/index.d.ts +2 -2
- package/dist/completion/index.js +1 -1
- package/dist/completion/index.js.map +1 -1
- package/dist/core/index.d.ts +71 -3
- package/dist/core/index.js +3 -1
- package/dist/dashboard/index.js +5 -5
- package/dist/dashboard/index.js.map +1 -1
- package/dist/discovery/index.d.ts +156 -2
- package/dist/discovery/index.js +31 -3
- package/dist/{event-bus-CRLkpNo0.d.ts → event-bus-BQLadg9l.d.ts} +1 -1
- package/dist/execution/index.d.ts +12 -3
- package/dist/execution/index.js +6 -2
- package/dist/repo/index.js +1 -1
- package/dist/{types-cJZwCZZX.d.ts → types-DyP8GmxB.d.ts} +24 -1
- package/package.json +15 -17
- package/dist/chunk-NZEI4RPP.js.map +0 -1
- package/dist/chunk-SZUDHVBF.js.map +0 -1
- package/dist/chunk-TGZ2TGDA.js.map +0 -1
- package/dist/chunk-UL66HWYF.js.map +0 -1
- package/dist/chunk-VLR2VYFW.js.map +0 -1
- package/dist/chunk-ZPI2VQ7U.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/cli.ts","../src/cli/commands/analyze.ts","../src/cli/github-auth.ts","../src/cli/config-loader.ts","../src/cli/commands/doctor.ts","../src/cli/commands/init.ts","../src/cli/commands/leaderboard.ts","../src/cli/commands/log.ts","../src/cli/commands/plan.ts","../src/cli/commands/run.ts","../src/cli/commands/scan.ts","../src/cli/commands/status.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nimport { createAnalyzeCommand } from \"./commands/analyze.js\";\nimport { createDoctorCommand } from \"./commands/doctor.js\";\nimport { createInitCommand } from \"./commands/init.js\";\nimport { createLeaderboardCommand } from \"./commands/leaderboard.js\";\nimport { createLogCommand } from \"./commands/log.js\";\nimport { createPlanCommand } from \"./commands/plan.js\";\nimport { createRunCommand } from \"./commands/run.js\";\nimport { createScanCommand } from \"./commands/scan.js\";\nimport { createStatusCommand } from \"./commands/status.js\";\n\ndeclare const __OAC_VERSION__: string;\n\nexport interface GlobalCliOptions {\n config?: string;\n verbose?: boolean;\n json?: boolean;\n color?: boolean;\n}\n\nfunction registerCommands(program: Command): void {\n program.addCommand(createInitCommand());\n program.addCommand(createAnalyzeCommand());\n program.addCommand(createDoctorCommand());\n program.addCommand(createScanCommand());\n program.addCommand(createPlanCommand());\n program.addCommand(createRunCommand());\n program.addCommand(createLogCommand());\n program.addCommand(createLeaderboardCommand());\n program.addCommand(createStatusCommand());\n}\n\nexport async function createCliProgram(): Promise<Command> {\n const version = typeof __OAC_VERSION__ !== \"undefined\" ? __OAC_VERSION__ : \"0.0.0\";\n\n const program = new Command();\n program\n .name(\"oac\")\n .description(\"Open Agent Contribution CLI\")\n .version(version)\n .option(\"--config <path>\", \"Config file path\", \"oac.config.ts\")\n .option(\"--verbose\", \"Enable verbose logging\", false)\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .option(\"--no-color\", \"Disable ANSI colors\");\n\n registerCommands(program);\n\n return program;\n}\n\nexport async function runCli(argv: readonly string[] = process.argv): Promise<void> {\n const program = await createCliProgram();\n await program.parseAsync([...argv]);\n}\n","import chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\nimport ora, { type Ora } from \"ora\";\n\nimport type { OacConfig } from \"../../core/index.js\";\nimport { analyzeCodebase, persistContext } from \"../../discovery/analyzer.js\";\nimport { createBacklog, persistBacklog } from \"../../discovery/backlog.js\";\nimport { groupFindingsIntoEpics } from \"../../discovery/epic-grouper.js\";\nimport {\n CompositeScanner,\n GitHubIssuesScanner,\n LintScanner,\n type Scanner,\n TestGapScanner,\n TodoScanner,\n} from \"../../discovery/index.js\";\nimport { cloneRepo, resolveRepo } from \"../../repo/index.js\";\nimport { ensureGitHubAuth } from \"../github-auth.js\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\nimport { loadOptionalConfigFile } from \"../config-loader.js\";\n\ninterface AnalyzeCommandOptions {\n repo?: string;\n force?: boolean;\n format: string;\n}\n\ntype OutputFormat = \"table\" | \"json\";\n\nexport function createAnalyzeCommand(): Command {\n const command = new Command(\"analyze\");\n\n command\n .description(\"Analyze repository and build context for epic-based planning\")\n .option(\"--repo <owner/repo>\", \"Target repository (owner/repo or GitHub URL)\")\n .option(\"--force\", \"Force re-analysis even if context is fresh\", false)\n .option(\"--format <format>\", \"Output format: table|json\", \"table\")\n .action(async (options: AnalyzeCommandOptions, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n const outputJson = globalOptions.json || normalizeOutputFormat(options.format) === \"json\";\n\n const config = await loadOptionalConfig(globalOptions.config, globalOptions.verbose, ui);\n const repoInput = resolveRepoInput(options.repo, config);\n const ghToken = ensureGitHubAuth();\n\n // Resolve and clone repo\n const resolveSpinner = createSpinner(outputJson, \"Resolving repository...\");\n const resolvedRepo = await resolveRepo(repoInput);\n resolveSpinner?.succeed(`Resolved ${resolvedRepo.fullName}`);\n\n const cloneSpinner = createSpinner(outputJson, \"Preparing local clone...\");\n await cloneRepo(resolvedRepo);\n cloneSpinner?.succeed(`Repository ready at ${resolvedRepo.localPath}`);\n\n // Build scanner list\n const scanners = buildScannerList(config, Boolean(ghToken));\n\n // Analyze codebase\n const analyzeSpinner = createSpinner(outputJson, \"Analyzing codebase...\");\n const { codebaseMap, qualityReport } = await analyzeCodebase(resolvedRepo.localPath, {\n scanners,\n repoFullName: resolvedRepo.fullName,\n headSha: resolvedRepo.git.headSha,\n exclude: config?.discovery.exclude,\n });\n analyzeSpinner?.succeed(\n `Analyzed ${codebaseMap.modules.length} modules, ${codebaseMap.totalFiles} files, ${qualityReport.findings.length} findings`,\n );\n\n // Group into epics\n const groupSpinner = createSpinner(outputJson, \"Grouping findings into epics...\");\n const epics = groupFindingsIntoEpics(qualityReport.findings, { codebaseMap });\n groupSpinner?.succeed(`Created ${epics.length} epic(s)`);\n\n // Persist everything\n const contextDir = config?.analyze?.contextDir ?? \".oac/context\";\n const persistSpinner = createSpinner(outputJson, \"Persisting context...\");\n await persistContext(resolvedRepo.localPath, codebaseMap, qualityReport, contextDir);\n const backlog = createBacklog(resolvedRepo.fullName, resolvedRepo.git.headSha, epics);\n await persistBacklog(resolvedRepo.localPath, backlog, contextDir);\n persistSpinner?.succeed(`Context persisted to ${contextDir}/`);\n\n // Output\n if (outputJson) {\n console.log(\n JSON.stringify(\n {\n repo: resolvedRepo.fullName,\n modules: codebaseMap.modules.length,\n totalFiles: codebaseMap.totalFiles,\n totalLoc: codebaseMap.totalLoc,\n findings: qualityReport.summary,\n epics: epics.map((e) => ({\n id: e.id,\n title: e.title,\n scope: e.scope,\n subtasks: e.subtasks.length,\n priority: e.priority,\n status: e.status,\n })),\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (epics.length === 0) {\n console.log(ui.yellow(\"No epics created — the codebase looks clean.\"));\n return;\n }\n\n const table = new Table({\n head: [\"Epic\", \"Scope\", \"Subtasks\", \"Priority\", \"Status\"],\n });\n\n for (const epic of epics) {\n table.push([\n truncate(epic.title, 55),\n epic.scope,\n String(epic.subtasks.length),\n String(epic.priority),\n epic.status,\n ]);\n }\n\n console.log(table.toString());\n console.log(\"\");\n console.log(\n ui.blue(\n `${epics.length} epic(s) added to backlog. Use \\`oac run --repo ${resolvedRepo.fullName}\\` to execute.`,\n ),\n );\n });\n\n return command;\n}\n\n// ── Helpers ───────────────────────────────────────────────────\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction createSpinner(jsonMode: boolean, text: string): Ora | null {\n if (jsonMode) return null;\n return ora({ text, color: \"blue\" }).start();\n}\n\nfunction normalizeOutputFormat(value: string): OutputFormat {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"table\" || normalized === \"json\") return normalized;\n throw new Error(`Unsupported --format value \"${value}\". Use \"table\" or \"json\".`);\n}\n\nasync function loadOptionalConfig(\n configPath: string,\n verbose: boolean,\n ui: ChalkInstance,\n): Promise<OacConfig | null> {\n return loadOptionalConfigFile(configPath, {\n onWarning: verbose ? (message) => console.warn(ui.yellow(`[oac] ${message}`)) : undefined,\n });\n}\n\nfunction resolveRepoInput(repoOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = repoOption?.trim();\n if (fromFlag) return fromFlag;\n\n const firstConfiguredRepo = config?.repos[0];\n if (typeof firstConfiguredRepo === \"string\") return firstConfiguredRepo;\n if (\n firstConfiguredRepo &&\n typeof firstConfiguredRepo === \"object\" &&\n \"name\" in firstConfiguredRepo &&\n typeof firstConfiguredRepo.name === \"string\"\n ) {\n return firstConfiguredRepo.name;\n }\n\n throw new Error(\"No repository specified. Use --repo or configure repos in oac.config.ts.\");\n}\n\nfunction buildScannerList(config: OacConfig | null, hasGitHubAuth: boolean): Scanner[] {\n const scanners: Scanner[] = [];\n\n const lint = config?.discovery.scanners.lint ?? true;\n const todo = config?.discovery.scanners.todo ?? true;\n\n if (lint) scanners.push(new LintScanner());\n if (todo) scanners.push(new TodoScanner());\n scanners.push(new TestGapScanner());\n if (hasGitHubAuth) scanners.push(new GitHubIssuesScanner());\n\n return scanners;\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) return value;\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n","import { execFileSync } from \"node:child_process\";\n\n/**\n * Ensures GITHUB_TOKEN is set in process.env for Octokit API calls.\n * Tries: GITHUB_TOKEN → GH_TOKEN → `gh auth token`.\n * Call this before any GitHub API usage (resolveRepo, etc.).\n */\nexport function ensureGitHubAuth(): string | undefined {\n const githubToken = process.env.GITHUB_TOKEN?.trim();\n if (githubToken) {\n process.env.GITHUB_TOKEN = githubToken;\n return githubToken;\n }\n\n const ghToken = process.env.GH_TOKEN?.trim();\n if (ghToken) {\n process.env.GITHUB_TOKEN = ghToken;\n return ghToken;\n }\n\n try {\n const token = execFileSync(\"gh\", [\"auth\", \"token\"], {\n timeout: 5_000,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n\n if (token.length > 0) {\n process.env.GITHUB_TOKEN = token;\n return token;\n }\n } catch {\n // gh not installed or not authenticated\n }\n\n return undefined;\n}\n\n/**\n * Checks whether the current gh auth has the required scopes.\n * Returns missing scopes or empty array if all present.\n *\n * Note: `gh auth status` outputs scope info to stderr, so we\n * redirect stderr to stdout to capture it.\n */\nexport function checkGitHubScopes(required: string[] = [\"repo\"]): string[] {\n try {\n // gh auth status prints token info to stderr\n const output = execFileSync(\"gh\", [\"auth\", \"status\"], {\n timeout: 5_000,\n encoding: \"utf-8\",\n // Merge stderr into stdout so we can read scope info\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n // Try stdout first, then if empty try running with shell redirect\n let combined = output;\n if (!combined.includes(\"Token scopes\")) {\n // gh auth status writes to stderr — use shell to capture both\n try {\n combined = execFileSync(\"sh\", [\"-c\", \"gh auth status 2>&1\"], {\n timeout: 5_000,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n return [];\n }\n }\n\n // Match: Token scopes: 'admin:org', 'gist', 'repo', 'workflow'\n const scopeLine = combined.match(/Token scopes:\\s*(.+)/);\n if (!scopeLine) return [];\n\n const scopes = scopeLine[1].split(\",\").map((s) => s.trim().replace(/^'|'$/g, \"\"));\n return required.filter((r) => !scopes.includes(r));\n } catch {\n return [];\n }\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { type OacConfig, loadConfig } from \"../core/index.js\";\n\nconst LEGACY_DEFINE_CONFIG_IMPORT = /@(?:open330\\/oac-core|oac\\/core)/;\nconst LEGACY_DEFINE_CONFIG_IMPORT_LINE =\n /^\\s*import\\s*\\{\\s*defineConfig\\s*\\}\\s*from\\s*[\"']@(?:open330\\/oac-core|oac\\/core)[\"'];\\s*$/m;\nconst LEGACY_DEFINE_CONFIG_EXPORT = /export\\s+default\\s+defineConfig\\s*\\(/;\n\nexport interface ConfigLoaderOptions {\n cwd?: string;\n onWarning?: (message: string) => void;\n}\n\nexport async function loadOptionalConfigFile(\n configPath: string,\n options: ConfigLoaderOptions = {},\n): Promise<OacConfig | null> {\n const absolutePath = resolve(options.cwd ?? process.cwd(), configPath);\n if (!(await pathExists(absolutePath))) {\n return null;\n }\n\n try {\n const candidate = await importConfigCandidate(absolutePath);\n return loadConfig(candidate);\n } catch (error) {\n options.onWarning?.(\n `Failed to load config at ${configPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return null;\n }\n}\n\nasync function importConfigCandidate(absolutePath: string): Promise<unknown> {\n try {\n return await importCandidate(`${pathToFileURL(absolutePath).href}?t=${Date.now()}`);\n } catch (error) {\n const fallbackCandidate = await importLegacyDefineConfigCandidate(absolutePath, error);\n if (fallbackCandidate !== null) {\n return fallbackCandidate;\n }\n\n throw error;\n }\n}\n\nasync function importLegacyDefineConfigCandidate(\n absolutePath: string,\n error: unknown,\n): Promise<unknown | null> {\n if (!shouldTryLegacyDefineConfigFallback(error)) {\n return null;\n }\n\n const source = await readFile(absolutePath, \"utf8\");\n const transformed = transformLegacyDefineConfigSource(source);\n if (transformed === null) {\n return null;\n }\n\n const encodedSource = Buffer.from(transformed, \"utf8\").toString(\"base64\");\n return await importCandidate(`data:text/javascript;base64,${encodedSource}`);\n}\n\nfunction shouldTryLegacyDefineConfigFallback(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return LEGACY_DEFINE_CONFIG_IMPORT.test(error.message);\n}\n\nfunction transformLegacyDefineConfigSource(source: string): string | null {\n if (!LEGACY_DEFINE_CONFIG_IMPORT_LINE.test(source)) {\n return null;\n }\n\n if (!LEGACY_DEFINE_CONFIG_EXPORT.test(source)) {\n return null;\n }\n\n return source\n .replace(LEGACY_DEFINE_CONFIG_IMPORT_LINE, \"\")\n .replace(LEGACY_DEFINE_CONFIG_EXPORT, \"export default (\");\n}\n\nasync function importCandidate(moduleSpecifier: string): Promise<unknown> {\n const imported = await import(moduleSpecifier);\n return imported.default ?? imported.config ?? imported;\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path, fsConstants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import { spawn } from \"node:child_process\";\n\nimport chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport { Command } from \"commander\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ntype DoctorStatus = \"pass\" | \"warn\" | \"fail\";\n\ninterface DoctorCheck {\n id: string;\n name: string;\n requirement: string;\n value: string;\n status: DoctorStatus;\n message?: string;\n}\n\ninterface CommandResult {\n ok: boolean;\n exitCode: number | null;\n stdout: string;\n stderr: string;\n errorCode?: string;\n errorMessage?: string;\n}\n\nconst MINIMUM_NODE_VERSION = \"24.0.0\";\n\nexport function createDoctorCommand(): Command {\n const command = new Command(\"doctor\");\n\n command.description(\"Check local environment readiness\").action(async (_options, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n\n const checks = await runDoctorChecks();\n const allPassed = checks.every((check) => check.status !== \"fail\");\n\n if (globalOptions.json) {\n console.log(\n JSON.stringify(\n {\n checks,\n allPassed,\n },\n null,\n 2,\n ),\n );\n } else {\n renderDoctorOutput(ui, checks, allPassed);\n }\n\n if (!allPassed) {\n process.exitCode = 1;\n }\n });\n\n return command;\n}\n\nasync function runDoctorChecks(): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = [];\n\n const nodeVersion = process.versions.node;\n checks.push({\n id: \"node\",\n name: \"Node.js\",\n requirement: `>= ${MINIMUM_NODE_VERSION}`,\n value: `v${nodeVersion}`,\n status: isVersionAtLeast(nodeVersion, MINIMUM_NODE_VERSION) ? \"pass\" : \"fail\",\n message: `Node.js ${MINIMUM_NODE_VERSION}+ is required.`,\n });\n\n const gitResult = await runCommand(\"git\", [\"--version\"]);\n const gitVersion = extractVersion(gitResult.stdout) ?? \"--\";\n checks.push({\n id: \"git\",\n name: \"git\",\n requirement: \"installed\",\n value: gitVersion,\n status: gitResult.ok ? \"pass\" : \"fail\",\n message: gitResult.ok ? undefined : explainCommandFailure(\"git\", gitResult),\n });\n\n const githubAuthCheck = await checkGithubAuth();\n checks.push(githubAuthCheck);\n\n const claudeResult = await runCommand(\"claude\", [\"--version\"]);\n const claudeVersion = extractVersion(claudeResult.stdout) ?? \"--\";\n checks.push({\n id: \"claude-cli\",\n name: \"Claude CLI\",\n requirement: \"installed\",\n value: claudeVersion,\n status: claudeResult.ok ? \"pass\" : \"fail\",\n message: claudeResult.ok ? undefined : explainCommandFailure(\"claude\", claudeResult),\n });\n\n const codexResult = await runCommand(\"codex\", [\"--version\"]);\n const codexVersion = extractVersion(codexResult.stdout) ?? \"--\";\n checks.push({\n id: \"codex\",\n name: \"Codex CLI\",\n requirement: \"installed\",\n value: codexVersion,\n status: codexResult.ok ? \"pass\" : \"fail\",\n message: codexResult.ok ? undefined : explainCommandFailure(\"codex\", codexResult),\n });\n\n return checks;\n}\n\nasync function checkGithubAuth(): Promise<DoctorCheck> {\n const envToken = process.env.GITHUB_TOKEN?.trim();\n if (envToken) {\n return {\n id: \"github-auth\",\n name: \"GitHub auth\",\n requirement: \"gh auth status or GITHUB_TOKEN\",\n value: `env:${maskToken(envToken)}`,\n status: \"pass\",\n };\n }\n\n const authResult = await runCommand(\"gh\", [\"auth\", \"status\"]);\n if (authResult.ok) {\n const hasRepoScope = authResult.stdout.includes(\"repo\");\n return {\n id: \"github-auth\",\n name: \"GitHub auth\",\n requirement: \"gh auth status or GITHUB_TOKEN\",\n value: \"gh auth status\",\n status: hasRepoScope ? \"pass\" : \"warn\",\n message: hasRepoScope\n ? undefined\n : \"Missing 'repo' scope — private repos won't work. Run: gh auth refresh -s repo\",\n };\n }\n\n return {\n id: \"github-auth\",\n name: \"GitHub auth\",\n requirement: \"gh auth status or GITHUB_TOKEN\",\n value: \"--\",\n status: \"fail\",\n message: \"No GitHub authentication detected. Set GITHUB_TOKEN or run `gh auth login`.\",\n };\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction renderDoctorOutput(ui: ChalkInstance, checks: DoctorCheck[], allPassed: boolean): void {\n console.log(\"Checking environment...\");\n console.log(\"\");\n\n for (const check of checks) {\n const iconMap = { pass: ui.green(\"[OK]\"), warn: ui.yellow(\"[!]\"), fail: ui.red(\"[X]\") };\n const statusMap = { pass: ui.green(\"PASS\"), warn: ui.yellow(\"WARN\"), fail: ui.red(\"FAIL\") };\n const icon = iconMap[check.status];\n const status = statusMap[check.status];\n\n const name = check.name.padEnd(12, \" \");\n const requirement = check.requirement.padEnd(30, \" \");\n const value = check.value.padEnd(14, \" \");\n\n console.log(` ${icon} ${name} ${requirement} ${value} ${status}`);\n\n if (check.status === \"fail\" && check.message) {\n console.log(` ${ui.red(check.message)}`);\n }\n if (check.status === \"warn\" && check.message) {\n console.log(` ${ui.yellow(check.message)}`);\n }\n }\n\n console.log(\"\");\n if (allPassed) {\n console.log(ui.green(\"All checks passed.\"));\n } else {\n console.log(ui.red(\"Some checks failed.\"));\n }\n}\n\nfunction extractVersion(output: string): string | undefined {\n const match = output.match(/v?(\\d+\\.\\d+\\.\\d+)/i);\n if (!match) {\n return undefined;\n }\n\n return `v${match[1]}`;\n}\n\nfunction explainCommandFailure(commandName: string, result: CommandResult): string {\n if (result.errorCode === \"ENOENT\") {\n return `${commandName} is not installed or not in PATH.`;\n }\n\n if (result.errorMessage) {\n return result.errorMessage;\n }\n\n if (result.stderr.trim().length > 0) {\n return result.stderr.trim();\n }\n\n return `${commandName} exited with code ${String(result.exitCode)}.`;\n}\n\nfunction maskToken(token: string): string {\n if (token.length <= 8) {\n return `${token.slice(0, 2)}****`;\n }\n\n return `${token.slice(0, 4)}****${token.slice(-2)}`;\n}\n\nfunction isVersionAtLeast(version: string, minimum: string): boolean {\n const current = version.split(\".\").map((part) => Number.parseInt(part, 10));\n const required = minimum.split(\".\").map((part) => Number.parseInt(part, 10));\n const length = Math.max(current.length, required.length);\n\n for (let index = 0; index < length; index += 1) {\n const currentPart = current[index] ?? 0;\n const requiredPart = required[index] ?? 0;\n\n if (currentPart > requiredPart) {\n return true;\n }\n\n if (currentPart < requiredPart) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction runCommand(command: string, args: string[]): Promise<CommandResult> {\n return new Promise((resolvePromise) => {\n const child = spawn(command, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let resolved = false;\n\n child.stdout?.setEncoding(\"utf8\");\n child.stderr?.setEncoding(\"utf8\");\n\n child.stdout?.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n\n child.stderr?.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n\n child.once(\"error\", (error) => {\n if (resolved) {\n return;\n }\n\n resolved = true;\n const errorWithCode = error as NodeJS.ErrnoException;\n resolvePromise({\n ok: false,\n exitCode: null,\n stdout,\n stderr,\n errorCode: errorWithCode.code,\n errorMessage: error.message,\n });\n });\n\n child.once(\"close\", (exitCode) => {\n if (resolved) {\n return;\n }\n\n resolved = true;\n resolvePromise({\n ok: exitCode === 0,\n exitCode,\n stdout,\n stderr,\n });\n });\n });\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport { access, mkdir, writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { checkbox, confirm, input } from \"@inquirer/prompts\";\nimport chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport { Command } from \"commander\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ntype ProviderId = \"claude-code\" | \"codex\" | \"opencode\";\n\ninterface InitSummary {\n configPath: string;\n trackingDirectory: string;\n provider: ProviderId;\n providers: ProviderId[];\n budgetTokens: number;\n repo: string;\n}\n\nconst OAC_LOGO = [\n \" ___ _ ___\",\n \" / _ \\\\ /_\\\\ / __|\",\n \"| (_) / _ \\\\ (__\",\n \" \\\\___/_/ \\\\_\\\\___|\",\n].join(\"\\n\");\n\nconst OWNER_REPO_PATTERN = /^[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+(?:\\.git)?$/;\n\nexport function createInitCommand(): Command {\n const command = new Command(\"init\");\n\n command.description(\"Initialize OAC in the current directory\").action(async (_options, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n\n if (!globalOptions.json) {\n console.log(ui.blue(OAC_LOGO));\n console.log(ui.bold(\"Welcome to Open Agent Contribution.\"));\n console.log(\"\");\n }\n\n const selectedProviders = await checkbox<ProviderId>({\n message: \"Select AI provider(s):\",\n choices: [\n { name: \"Claude Code\", value: \"claude-code\", checked: true },\n { name: \"Codex CLI\", value: \"codex\" },\n { name: \"OpenCode (coming soon)\", value: \"opencode\", disabled: true },\n ],\n validate: (value) => (value.length > 0 ? true : \"Select at least one provider to continue.\"),\n });\n\n const budgetInput = await input({\n message: \"Monthly token budget:\",\n default: \"100000\",\n validate: (value) => {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return \"Enter a positive integer.\";\n }\n\n return true;\n },\n });\n\n const firstRepoInput = await input({\n message: \"Add your first repo (owner/repo or GitHub URL):\",\n validate: (value) => {\n if (isValidRepoInput(value)) {\n return true;\n }\n\n return \"Enter a valid GitHub repo like owner/repo.\";\n },\n });\n\n const repo = normalizeRepoInput(firstRepoInput);\n const budgetTokens = Number.parseInt(budgetInput, 10);\n const provider = selectedProviders[0] ?? \"claude-code\";\n\n const configPath = resolve(process.cwd(), \"oac.config.ts\");\n const trackingDirectory = resolve(process.cwd(), \".oac\");\n\n if (await pathExists(configPath)) {\n const shouldOverwrite = await confirm({\n message: \"oac.config.ts already exists. Overwrite it?\",\n default: false,\n });\n\n if (!shouldOverwrite) {\n if (globalOptions.json) {\n console.log(\n JSON.stringify(\n {\n cancelled: true,\n reason: \"oac.config.ts exists and overwrite was declined\",\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log(ui.yellow(\"Initialization cancelled.\"));\n return;\n }\n }\n\n const configContent = buildConfigFile({\n provider,\n providers: selectedProviders,\n budgetTokens,\n repo,\n });\n\n await writeFile(configPath, configContent, \"utf8\");\n await mkdir(trackingDirectory, { recursive: true });\n\n const summary: InitSummary = {\n configPath,\n trackingDirectory,\n provider,\n providers: selectedProviders,\n budgetTokens,\n repo,\n };\n\n if (globalOptions.json) {\n console.log(JSON.stringify(summary, null, 2));\n return;\n }\n\n console.log(ui.green(\"Created: oac.config.ts\"));\n console.log(ui.green(\"Created: .oac/\"));\n console.log(\"\");\n console.log(\"Run `oac doctor` to verify or `oac scan` to discover tasks.\");\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction buildConfigFile(input: {\n provider: ProviderId;\n providers: ProviderId[];\n budgetTokens: number;\n repo: string;\n}): string {\n const enabledProviders = input.providers.map((provider) => `'${provider}'`).join(\", \");\n\n return `export default {\n repos: ['${input.repo}'],\n provider: {\n id: '${input.provider}',\n options: {\n enabledProviders: [${enabledProviders}],\n },\n },\n budget: {\n totalTokens: ${input.budgetTokens},\n },\n};\n`;\n}\n\nfunction normalizeRepoInput(input: string): string {\n const trimmed = input.trim();\n if (OWNER_REPO_PATTERN.test(trimmed)) {\n return stripGitSuffix(trimmed);\n }\n\n const normalizedUrlInput = trimmed.startsWith(\"github.com/\") ? `https://${trimmed}` : trimmed;\n\n try {\n const url = new URL(normalizedUrlInput);\n if (url.hostname !== \"github.com\") {\n return trimmed;\n }\n\n const segments = url.pathname.split(\"/\").filter(Boolean);\n if (segments.length < 2) {\n return trimmed;\n }\n\n const owner = segments[0];\n const repo = stripGitSuffix(segments[1] ?? \"\");\n if (!owner || !repo) {\n return trimmed;\n }\n\n return `${owner}/${repo}`;\n } catch {\n return trimmed;\n }\n}\n\nfunction stripGitSuffix(value: string): string {\n return value.endsWith(\".git\") ? value.slice(0, -4) : value;\n}\n\nfunction isValidRepoInput(input: string): boolean {\n const normalized = normalizeRepoInput(input);\n return OWNER_REPO_PATTERN.test(normalized);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path, fsConstants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import type { Dirent } from \"node:fs\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\nimport { type ContributionLog, contributionLogSchema } from \"../../tracking/index.js\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ninterface LeaderboardCommandOptions {\n limit: number;\n sort: string;\n}\n\ninterface LeaderboardEntry {\n githubUsername: string;\n totalRuns: number;\n totalTasksCompleted: number;\n totalTokensDonated: number;\n totalPRsCreated: number;\n totalPRsMerged: number;\n}\n\ntype SortField = \"runs\" | \"tasks\" | \"tokens\" | \"prs\";\n\nexport function createLeaderboardCommand(): Command {\n const command = new Command(\"leaderboard\");\n\n command\n .description(\"Show contribution rankings\")\n .option(\"--limit <number>\", \"Max entries to show\", parseInteger, 10)\n .option(\"--sort <field>\", \"Sort by: runs, tasks, tokens, prs\", \"tasks\")\n .action(async (options: LeaderboardCommandOptions, cmd) => {\n if (options.limit <= 0) {\n throw new Error(\"--limit must be a positive integer.\");\n }\n\n const globalOptions = getGlobalOptions(cmd);\n const sortField = normalizeSortField(options.sort);\n const entries = await loadLeaderboardEntries(process.cwd());\n const sortedEntries = sortEntries(entries, sortField).slice(0, options.limit);\n\n if (globalOptions.json) {\n console.log(\n JSON.stringify(\n {\n total: sortedEntries.length,\n sort: sortField,\n entries: sortedEntries,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (sortedEntries.length === 0) {\n console.log(\"No leaderboard data found.\");\n return;\n }\n\n const table = new Table({\n head: [\"Rank\", \"User\", \"Tasks\", \"Tokens Used\", \"PRs Created\", \"PRs Merged\"],\n });\n\n for (let index = 0; index < sortedEntries.length; index += 1) {\n const entry = sortedEntries[index];\n table.push([\n String(index + 1),\n entry.githubUsername,\n String(entry.totalTasksCompleted),\n formatInteger(entry.totalTokensDonated),\n String(entry.totalPRsCreated),\n String(entry.totalPRsMerged),\n ]);\n }\n\n console.log(table.toString());\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nasync function loadLeaderboardEntries(repoPath: string): Promise<LeaderboardEntry[]> {\n const leaderboardPath = resolve(repoPath, \".oac\", \"leaderboard.json\");\n\n try {\n const leaderboardRaw = await readFile(leaderboardPath, \"utf8\");\n const leaderboardPayload = JSON.parse(leaderboardRaw) as unknown;\n return parseStoredLeaderboardEntries(leaderboardPayload);\n } catch (error) {\n if (!isFileNotFoundError(error)) {\n throw error;\n }\n }\n\n const logs = await readContributionLogs(repoPath);\n return buildEntriesFromLogs(logs);\n}\n\nfunction parseStoredLeaderboardEntries(payload: unknown): LeaderboardEntry[] {\n if (!isRecord(payload)) {\n return [];\n }\n\n const entries = payload.entries;\n if (!Array.isArray(entries)) {\n return [];\n }\n\n const parsedEntries: LeaderboardEntry[] = [];\n\n for (const entry of entries) {\n if (!isRecord(entry)) {\n continue;\n }\n\n const githubUsername = entry.githubUsername;\n const totalRuns = entry.totalRuns;\n const totalTasksCompleted = entry.totalTasksCompleted;\n const totalTokensDonated = entry.totalTokensDonated;\n const totalPRsCreated = entry.totalPRsCreated;\n const totalPRsMerged = entry.totalPRsMerged;\n\n if (\n typeof githubUsername !== \"string\" ||\n typeof totalRuns !== \"number\" ||\n typeof totalTasksCompleted !== \"number\" ||\n typeof totalTokensDonated !== \"number\" ||\n typeof totalPRsCreated !== \"number\" ||\n typeof totalPRsMerged !== \"number\"\n ) {\n continue;\n }\n\n parsedEntries.push({\n githubUsername,\n totalRuns,\n totalTasksCompleted,\n totalTokensDonated,\n totalPRsCreated,\n totalPRsMerged,\n });\n }\n\n return parsedEntries;\n}\n\nasync function readContributionLogs(repoPath: string): Promise<ContributionLog[]> {\n const contributionsPath = resolve(repoPath, \".oac\", \"contributions\");\n\n let entries: Dirent[];\n try {\n entries = await readdir(contributionsPath, { withFileTypes: true, encoding: \"utf8\" });\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return [];\n }\n\n throw error;\n }\n\n const fileNames = entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map((entry) => entry.name)\n .sort((a, b) => a.localeCompare(b));\n\n const logs = await Promise.all(\n fileNames.map(async (fileName): Promise<ContributionLog | null> => {\n const filePath = resolve(contributionsPath, fileName);\n\n try {\n const content = await readFile(filePath, \"utf8\");\n const payload = JSON.parse(content) as unknown;\n const parsed = contributionLogSchema.safeParse(payload);\n return parsed.success ? parsed.data : null;\n } catch {\n return null;\n }\n }),\n );\n\n return logs.filter((log): log is ContributionLog => log !== null);\n}\n\nfunction buildEntriesFromLogs(logs: ContributionLog[]): LeaderboardEntry[] {\n const byUser = new Map<string, LeaderboardEntry>();\n\n for (const log of logs) {\n const username = log.contributor.githubUsername;\n const existing = byUser.get(username) ?? {\n githubUsername: username,\n totalRuns: 0,\n totalTasksCompleted: 0,\n totalTokensDonated: 0,\n totalPRsCreated: 0,\n totalPRsMerged: 0,\n };\n\n existing.totalRuns += 1;\n existing.totalTasksCompleted += log.tasks.filter((task) => task.status !== \"failed\").length;\n existing.totalTokensDonated += log.budget.totalTokensUsed;\n existing.totalPRsCreated += log.tasks.filter((task) => Boolean(task.pr)).length;\n existing.totalPRsMerged += log.tasks.filter((task) => task.pr?.status === \"merged\").length;\n\n byUser.set(username, existing);\n }\n\n return Array.from(byUser.values());\n}\n\nfunction sortEntries(entries: LeaderboardEntry[], field: SortField): LeaderboardEntry[] {\n return [...entries].sort((a, b) => {\n const first = sortValue(b, field) - sortValue(a, field);\n if (first !== 0) {\n return first;\n }\n\n if (b.totalTasksCompleted !== a.totalTasksCompleted) {\n return b.totalTasksCompleted - a.totalTasksCompleted;\n }\n\n if (b.totalRuns !== a.totalRuns) {\n return b.totalRuns - a.totalRuns;\n }\n\n return a.githubUsername.localeCompare(b.githubUsername);\n });\n}\n\nfunction normalizeSortField(value: string): SortField {\n const normalized = value.trim().toLowerCase();\n if (\n normalized === \"runs\" ||\n normalized === \"tasks\" ||\n normalized === \"tokens\" ||\n normalized === \"prs\"\n ) {\n return normalized;\n }\n\n throw new Error(`Unsupported --sort value \"${value}\". Use runs, tasks, tokens, or prs.`);\n}\n\nfunction sortValue(entry: LeaderboardEntry, field: SortField): number {\n if (field === \"runs\") {\n return entry.totalRuns;\n }\n if (field === \"tasks\") {\n return entry.totalTasksCompleted;\n }\n if (field === \"tokens\") {\n return entry.totalTokensDonated;\n }\n return entry.totalPRsCreated;\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n if (!isRecord(error)) {\n return false;\n }\n\n return error.code === \"ENOENT\";\n}\n","import type { Dirent } from \"node:fs\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\nimport { type ContributionLog, contributionLogSchema } from \"../../tracking/index.js\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ninterface LogCommandOptions {\n limit: number;\n repo?: string;\n source?: string;\n since?: string;\n}\n\nexport function createLogCommand(): Command {\n const command = new Command(\"log\");\n\n command\n .description(\"View contribution history\")\n .option(\"--limit <number>\", \"Max entries to show\", parseInteger, 20)\n .option(\"--repo <name>\", \"Filter by repo name\")\n .option(\"--source <type>\", \"Filter by task source\")\n .option(\"--since <date>\", \"Filter contributions after date (ISO string)\")\n .action(async (options: LogCommandOptions, cmd) => {\n if (options.limit <= 0) {\n throw new Error(\"--limit must be a positive integer.\");\n }\n\n const globalOptions = getGlobalOptions(cmd);\n const sinceDate = parseSinceDate(options.since);\n const repoFilter = options.repo?.trim();\n const sourceFilter = options.source?.trim().toLowerCase();\n\n const logs = await readContributionLogs(process.cwd());\n const filteredLogs = logs\n .filter((log) => (repoFilter ? log.repo.fullName === repoFilter : true))\n .filter((log) =>\n sourceFilter ? log.tasks.some((task) => task.source === sourceFilter) : true,\n )\n .filter((log) => (sinceDate ? Date.parse(log.timestamp) >= sinceDate.getTime() : true))\n .sort((a, b) => Date.parse(b.timestamp) - Date.parse(a.timestamp))\n .slice(0, options.limit);\n\n if (globalOptions.json) {\n console.log(\n JSON.stringify(\n {\n total: filteredLogs.length,\n entries: filteredLogs,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (filteredLogs.length === 0) {\n console.log(\"No contribution logs found.\");\n return;\n }\n\n const table = new Table({\n head: [\"Date\", \"Repo\", \"Tasks\", \"Tokens\", \"PRs\", \"Source\"],\n });\n\n for (const log of filteredLogs) {\n table.push([\n formatDate(log.timestamp),\n log.repo.fullName,\n String(log.tasks.length),\n formatInteger(log.budget.totalTokensUsed),\n String(log.tasks.filter((task) => Boolean(task.pr)).length),\n summarizeSources(log),\n ]);\n }\n\n console.log(table.toString());\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nasync function readContributionLogs(repoPath: string): Promise<ContributionLog[]> {\n const contributionsPath = resolve(repoPath, \".oac\", \"contributions\");\n\n let entries: Dirent[];\n try {\n entries = await readdir(contributionsPath, { withFileTypes: true, encoding: \"utf8\" });\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return [];\n }\n\n throw error;\n }\n\n const files = entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map((entry) => entry.name)\n .sort((a, b) => a.localeCompare(b));\n\n const logs = await Promise.all(\n files.map(async (fileName): Promise<ContributionLog | null> => {\n const filePath = resolve(contributionsPath, fileName);\n\n try {\n const content = await readFile(filePath, \"utf8\");\n const payload = JSON.parse(content) as unknown;\n const parsed = contributionLogSchema.safeParse(payload);\n return parsed.success ? parsed.data : null;\n } catch {\n return null;\n }\n }),\n );\n\n return logs.filter((log): log is ContributionLog => log !== null);\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nfunction parseSinceDate(value: string | undefined): Date | null {\n if (!value) {\n return null;\n }\n\n const parsed = Date.parse(value);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Invalid --since value \"${value}\". Expected an ISO date string.`);\n }\n\n return new Date(parsed);\n}\n\nfunction summarizeSources(log: ContributionLog): string {\n const uniqueSources = [...new Set(log.tasks.map((task) => task.source))].sort((a, b) =>\n a.localeCompare(b),\n );\n\n if (uniqueSources.length === 0) {\n return \"-\";\n }\n\n return uniqueSources.join(\", \");\n}\n\nfunction formatDate(timestamp: string): string {\n const date = new Date(timestamp);\n if (Number.isNaN(date.getTime())) {\n return timestamp;\n }\n\n return date.toISOString();\n}\n\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) {\n return false;\n }\n\n const code = (error as { code?: unknown }).code;\n return code === \"ENOENT\";\n}\n","import chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\nimport ora, { type Ora } from \"ora\";\nimport { buildExecutionPlan, estimateTokens } from \"../../budget/index.js\";\nimport type { OacConfig, Task } from \"../../core/index.js\";\nimport {\n CompositeScanner,\n LintScanner,\n type Scanner,\n TodoScanner,\n rankTasks,\n} from \"../../discovery/index.js\";\nimport { cloneRepo, resolveRepo } from \"../../repo/index.js\";\nimport { ensureGitHubAuth } from \"../github-auth.js\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\nimport { loadOptionalConfigFile } from \"../config-loader.js\";\n\ninterface PlanCommandOptions {\n repo?: string;\n tokens?: number;\n provider?: string;\n}\n\ntype SupportedScanner = \"lint\" | \"todo\";\n\nexport function createPlanCommand(): Command {\n const command = new Command(\"plan\");\n\n command\n .description(\"Build an execution plan from discovered tasks\")\n .option(\"--repo <owner/repo>\", \"Target repository (owner/repo or GitHub URL)\")\n .option(\"--tokens <number>\", \"Token budget for planning\", parseInteger)\n .option(\"--provider <id>\", \"Agent provider id\")\n .action(async (options: PlanCommandOptions, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n const outputJson = globalOptions.json;\n\n const config = await loadOptionalConfig(globalOptions.config, globalOptions.verbose, ui);\n const repoInput = resolveRepoInput(options.repo, config);\n const providerId = resolveProviderId(options.provider, config);\n const totalBudget = resolveBudget(options.tokens, config);\n const minPriority = config?.discovery.minPriority ?? 20;\n\n const scannerSelection = selectScannersFromConfig(config);\n\n ensureGitHubAuth();\n\n const resolveSpinner = createSpinner(outputJson, \"Resolving repository...\");\n const resolvedRepo = await resolveRepo(repoInput);\n resolveSpinner?.succeed(`Resolved ${resolvedRepo.fullName}`);\n\n const cloneSpinner = createSpinner(outputJson, \"Preparing local clone...\");\n await cloneRepo(resolvedRepo);\n cloneSpinner?.succeed(`Repository ready at ${resolvedRepo.localPath}`);\n\n const scanSpinner = createSpinner(\n outputJson,\n `Running scanners: ${scannerSelection.enabled.join(\", \")}`,\n );\n const scannedTasks = await scannerSelection.scanner.scan(resolvedRepo.localPath, {\n exclude: config?.discovery.exclude,\n maxTasks: config?.discovery.maxTasks,\n repo: resolvedRepo,\n });\n scanSpinner?.succeed(`Discovered ${scannedTasks.length} raw task(s)`);\n\n const rankedTasks = rankTasks(scannedTasks).filter((task) => task.priority >= minPriority);\n\n const estimateSpinner = createSpinner(\n outputJson,\n `Estimating tokens for ${rankedTasks.length} task(s)...`,\n );\n const estimates = await estimateTaskMap(rankedTasks, providerId);\n estimateSpinner?.succeed(\"Token estimation completed\");\n\n const plan = buildExecutionPlan(rankedTasks, estimates, totalBudget);\n\n if (outputJson) {\n console.log(\n JSON.stringify(\n {\n repo: resolvedRepo.fullName,\n provider: providerId,\n budget: totalBudget,\n tasksDiscovered: rankedTasks.length,\n plan,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n renderPlan(ui, {\n repo: resolvedRepo.fullName,\n provider: providerId,\n budget: totalBudget,\n plan,\n });\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction createSpinner(enabled: boolean, text: string): Ora | null {\n if (enabled) {\n return null;\n }\n\n return ora({ text, color: \"blue\" }).start();\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nasync function loadOptionalConfig(\n configPath: string,\n verbose: boolean,\n ui: ChalkInstance,\n): Promise<OacConfig | null> {\n return loadOptionalConfigFile(configPath, {\n onWarning: verbose\n ? (message) => {\n console.warn(ui.yellow(`[oac] ${message}`));\n }\n : undefined,\n });\n}\n\nfunction resolveRepoInput(repoOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = repoOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n const firstConfiguredRepo = config?.repos[0];\n if (typeof firstConfiguredRepo === \"string\") {\n return firstConfiguredRepo;\n }\n\n if (\n firstConfiguredRepo &&\n typeof firstConfiguredRepo === \"object\" &&\n \"name\" in firstConfiguredRepo &&\n typeof firstConfiguredRepo.name === \"string\"\n ) {\n return firstConfiguredRepo.name;\n }\n\n throw new Error(\"No repository specified. Use --repo or configure repos in oac.config.ts.\");\n}\n\nfunction resolveProviderId(providerOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = providerOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n return config?.provider.id ?? \"claude-code\";\n}\n\nfunction resolveBudget(tokensOption: number | undefined, config: OacConfig | null): number {\n const budget = tokensOption ?? config?.budget.totalTokens ?? 100_000;\n if (!Number.isFinite(budget) || budget <= 0) {\n throw new Error(\"Token budget must be a positive number.\");\n }\n\n return Math.floor(budget);\n}\n\nfunction selectScannersFromConfig(config: OacConfig | null): {\n enabled: SupportedScanner[];\n scanner: CompositeScanner;\n} {\n const enabled: SupportedScanner[] = [];\n\n if (config?.discovery.scanners.lint !== false) {\n enabled.push(\"lint\");\n }\n\n if (config?.discovery.scanners.todo !== false) {\n enabled.push(\"todo\");\n }\n\n if (enabled.length === 0) {\n enabled.push(\"lint\", \"todo\");\n }\n\n const uniqueEnabled = [...new Set(enabled)];\n const scannerInstances: Scanner[] = uniqueEnabled.map((scannerName) =>\n scannerName === \"lint\" ? new LintScanner() : new TodoScanner(),\n );\n\n return {\n enabled: uniqueEnabled,\n scanner: new CompositeScanner(scannerInstances),\n };\n}\n\nasync function estimateTaskMap(\n tasks: Task[],\n providerId: string,\n): Promise<Map<string, Awaited<ReturnType<typeof estimateTokens>>>> {\n const entries = await Promise.all(\n tasks.map(async (task) => {\n const estimate = await estimateTokens(task, providerId);\n return [task.id, estimate] as const;\n }),\n );\n\n return new Map(entries);\n}\n\nfunction renderPlan(\n ui: ChalkInstance,\n data: {\n repo: string;\n provider: string;\n budget: number;\n plan: ReturnType<typeof buildExecutionPlan>;\n },\n): void {\n const table = new Table({\n head: [\"#\", \"Task\", \"Est. Tokens\", \"Cumulative\", \"Confidence\"],\n });\n\n for (let index = 0; index < data.plan.selectedTasks.length; index += 1) {\n const entry = data.plan.selectedTasks[index];\n table.push([\n String(index + 1),\n truncate(entry.task.title, 56),\n formatInteger(entry.estimate.totalEstimatedTokens),\n formatInteger(entry.cumulativeBudgetUsed),\n entry.estimate.confidence.toFixed(2),\n ]);\n }\n\n console.log(ui.bold(`Execution Plan for ${data.repo}`));\n console.log(`Provider: ${data.provider}`);\n console.log(\"\");\n\n if (data.plan.selectedTasks.length > 0) {\n console.log(table.toString());\n console.log(\"\");\n } else {\n console.log(ui.yellow(\"No tasks selected for execution.\"));\n console.log(\"\");\n }\n\n const effectiveBudget = data.plan.totalBudget - data.plan.reserveTokens;\n const budgetUsed =\n data.plan.selectedTasks[data.plan.selectedTasks.length - 1]?.cumulativeBudgetUsed ?? 0;\n\n console.log(\n `Budget used: ${formatInteger(budgetUsed)} / ${formatInteger(effectiveBudget)} (effective)`,\n );\n console.log(`Reserve: ${formatInteger(data.plan.reserveTokens)} (10%)`);\n console.log(`Remaining: ${formatInteger(data.plan.remainingTokens)}`);\n\n if (data.plan.deferredTasks.length > 0) {\n console.log(\"\");\n console.log(ui.yellow(`Deferred (${data.plan.deferredTasks.length}):`));\n for (const deferred of data.plan.deferredTasks) {\n const reason = deferred.reason.replaceAll(\"_\", \" \");\n console.log(\n ` - ${truncate(deferred.task.title, 72)} (${formatInteger(\n deferred.estimate.totalEstimatedTokens,\n )} tokens, ${reason})`,\n );\n }\n }\n}\n\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\nimport { execa } from \"execa\";\nimport ora, { type Ora } from \"ora\";\nimport {\n buildEpicExecutionPlan,\n buildExecutionPlan,\n estimateEpicTokens,\n estimateTokens,\n} from \"../../budget/index.js\";\nimport {\n type Epic,\n type OacConfig,\n type Task,\n type TokenEstimate,\n UNLIMITED_BUDGET,\n createEventBus,\n} from \"../../core/index.js\";\nimport {\n CompositeScanner,\n GitHubIssuesScanner,\n LintScanner,\n type Scanner,\n TestGapScanner,\n TodoScanner,\n analyzeCodebase,\n createBacklog,\n getPendingEpics,\n groupFindingsIntoEpics,\n isContextStale,\n loadBacklog,\n loadContext,\n persistBacklog,\n persistContext,\n rankTasks,\n updateBacklog,\n} from \"../../discovery/index.js\";\nimport {\n type AgentProvider,\n ClaudeCodeAdapter,\n CodexAdapter,\n createSandbox,\n epicAsTask,\n executeTask as workerExecuteTask,\n} from \"../../execution/index.js\";\nimport { cloneRepo, resolveRepo } from \"../../repo/index.js\";\nimport { type ContributionLog, writeContributionLog } from \"../../tracking/index.js\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\nimport { loadOptionalConfigFile } from \"../config-loader.js\";\nimport { checkGitHubScopes, ensureGitHubAuth } from \"../github-auth.js\";\n\ninterface RunCommandOptions {\n repo?: string;\n tokens?: number;\n provider?: string;\n concurrency?: number;\n dryRun?: boolean;\n mode?: string;\n maxTasks?: number;\n timeout?: number;\n source?: string;\n}\n\ninterface SandboxInfo {\n branchName: string;\n sandboxPath: string;\n cleanup: () => Promise<void>;\n}\n\ntype RunMode = \"new-pr\" | \"update-pr\" | \"direct-commit\";\ntype SupportedScanner = \"lint\" | \"todo\" | \"github-issues\" | \"test-gap\";\ntype CompletionStatus = \"success\" | \"partial\" | \"failed\";\n\ninterface ExecutionOutcome {\n success: boolean;\n exitCode: number;\n totalTokensUsed: number;\n filesChanged: string[];\n duration: number;\n error?: string;\n}\n\ninterface TaskRunResult {\n task: Task;\n estimate: TokenEstimate;\n execution: ExecutionOutcome;\n sandbox?: SandboxInfo;\n pr?: {\n number: number;\n url: string;\n status: \"open\" | \"merged\" | \"closed\";\n };\n}\n\ninterface RunSummaryOutput {\n runId: string;\n repo: string;\n provider: string;\n dryRun: boolean;\n selectedTasks: number;\n deferredTasks: number;\n tasksCompleted: number;\n tasksFailed: number;\n prsCreated: number;\n tokensUsed: number;\n tokensBudgeted: number;\n logPath?: string;\n}\n\nconst DEFAULT_TIMEOUT_SECONDS = 300;\nconst DEFAULT_CONCURRENCY = 2;\n\nexport function createRunCommand(): Command {\n const command = new Command(\"run\");\n\n command\n .description(\"Run the full OAC pipeline\")\n .option(\"--repo <owner/repo>\", \"Target repository (owner/repo or GitHub URL)\")\n .option(\"--tokens <value>\", 'Token budget (number or \"unlimited\")', parseTokens)\n .option(\"--provider <id>\", \"Agent provider id\")\n .option(\"--concurrency <number>\", \"Maximum parallel task executions\", parseInteger)\n .option(\"--dry-run\", \"Show plan without executing tasks\", false)\n .option(\"--mode <mode>\", \"Execution mode: new-pr|update-pr|direct-commit\")\n .option(\"--max-tasks <number>\", \"Maximum number of discovered tasks to consider\", parseInteger)\n .option(\"--timeout <seconds>\", \"Per-task timeout in seconds\", parseInteger)\n .option(\"--source <source>\", \"Filter tasks by source: lint, todo, github-issue, test-gap\")\n .action(async (options: RunCommandOptions, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n validateRunOptions(options);\n await runPipeline(options, globalOptions, ui);\n });\n\n return command;\n}\n\ninterface PipelineContext {\n options: RunCommandOptions;\n globalOptions: Required<GlobalCliOptions>;\n ui: ChalkInstance;\n outputJson: boolean;\n runId: string;\n runStartedAt: number;\n}\n\nasync function runPipeline(\n options: RunCommandOptions,\n globalOptions: Required<GlobalCliOptions>,\n ui: ChalkInstance,\n): Promise<void> {\n const ctx: PipelineContext = {\n options,\n globalOptions,\n ui,\n outputJson: globalOptions.json,\n runId: randomUUID(),\n runStartedAt: Date.now(),\n };\n\n const config = await loadOptionalConfig(globalOptions.config, globalOptions.verbose, ui);\n const providerId = resolveProviderId(options.provider, config);\n const totalBudget = resolveBudget(options.tokens, config);\n const mode = resolveMode(options.mode, config);\n const concurrency = resolveConcurrency(options.concurrency, config);\n const timeoutSeconds = resolveTimeout(options.timeout, config);\n const ghToken = ensureGitHubAuth();\n\n printGitHubAuthWarnings(ctx, ghToken);\n printRunHeader(ctx, totalBudget, concurrency);\n\n const repoInput = resolveRepoInput(options.repo, config);\n\n const resolveSpinner = createSpinner(ctx.outputJson, \"Resolving repository...\");\n const resolvedRepo = await resolveRepo(repoInput);\n resolveSpinner?.succeed(`Resolved ${resolvedRepo.fullName}`);\n\n const cloneSpinner = createSpinner(ctx.outputJson, \"Preparing local clone...\");\n await cloneRepo(resolvedRepo);\n cloneSpinner?.succeed(`Repository ready at ${resolvedRepo.localPath}`);\n\n // ── Try epic-based execution (auto-analyze if needed) ────\n const autoAnalyze = config?.analyze?.autoAnalyze ?? true;\n const contextDir = config?.analyze?.contextDir ?? \".oac/context\";\n const staleAfterMs = config?.analyze?.staleAfterMs ?? 86_400_000;\n\n const epics = await tryLoadOrAnalyzeEpics(ctx, {\n resolvedRepo,\n config,\n ghToken,\n autoAnalyze,\n contextDir,\n staleAfterMs,\n });\n\n if (epics && epics.length > 0) {\n // ── Epic-based execution path ──\n await runEpicPipeline(ctx, {\n epics,\n resolvedRepo,\n config,\n providerId,\n totalBudget,\n concurrency,\n timeoutSeconds,\n mode,\n ghToken,\n contextDir,\n });\n return;\n }\n\n // ── Fallback: task-based execution (existing behavior) ──\n const { candidateTasks, plan } = await discoverTasks(ctx, options, config, ghToken, resolvedRepo);\n\n if (candidateTasks.length === 0) {\n printEmptySummary(ctx, resolvedRepo.fullName, providerId, totalBudget);\n return;\n }\n\n if (options.dryRun) {\n printDryRunSummary(ctx, resolvedRepo.fullName, providerId, totalBudget, plan);\n return;\n }\n\n const completedTasks = await executePlan(ctx, {\n plan,\n providerId,\n resolvedRepo,\n concurrency,\n timeoutSeconds,\n mode,\n ghToken,\n });\n\n await writeTracking(ctx, {\n resolvedRepo,\n providerId,\n totalBudget,\n candidateTasks,\n completedTasks,\n });\n\n printFinalSummary(ctx, {\n plan,\n resolvedRepo,\n providerId,\n totalBudget,\n completedTasks,\n });\n}\n\nfunction printGitHubAuthWarnings(ctx: PipelineContext, ghToken: string | undefined): void {\n if (ctx.outputJson) return;\n\n if (!ghToken) {\n console.log(\n ctx.ui.yellow(\"[oac] Warning: GitHub auth not detected. Run `gh auth login` first.\"),\n );\n console.log(\n ctx.ui.yellow(\"[oac] For private repos, ensure the 'repo' scope: gh auth refresh -s repo\"),\n );\n } else {\n const missingScopes = checkGitHubScopes([\"repo\"]);\n if (missingScopes.length > 0) {\n console.log(\n ctx.ui.yellow(\n `[oac] Warning: GitHub token missing scope(s): ${missingScopes.join(\", \")}. Private repos may fail.`,\n ),\n );\n console.log(ctx.ui.yellow(\"[oac] Fix with: gh auth refresh -s repo\"));\n }\n }\n}\n\nfunction printRunHeader(ctx: PipelineContext, totalBudget: number, concurrency: number): void {\n if (ctx.outputJson) return;\n console.log(\n ctx.ui.blue(\n `Starting OAC run (budget: ${formatBudgetDisplay(totalBudget)} tokens, concurrency: ${concurrency})`,\n ),\n );\n}\n\n// ── Epic-based execution ────────────────────────────────────\n\nasync function tryLoadOrAnalyzeEpics(\n ctx: PipelineContext,\n params: {\n resolvedRepo: Awaited<ReturnType<typeof resolveRepo>>;\n config: OacConfig | null;\n ghToken: string | undefined;\n autoAnalyze: boolean;\n contextDir: string;\n staleAfterMs: number;\n },\n): Promise<Epic[] | null> {\n const { resolvedRepo, config, ghToken, contextDir, staleAfterMs } = params;\n\n // Try loading existing backlog first\n const existingBacklog = await loadBacklog(resolvedRepo.localPath, contextDir);\n if (existingBacklog) {\n const pending = getPendingEpics(existingBacklog);\n if (pending.length > 0) {\n // Verify context is not stale\n const context = await loadContext(resolvedRepo.localPath, contextDir);\n if (context && !isContextStale(context.codebaseMap, staleAfterMs)) {\n if (!ctx.outputJson) {\n console.log(ctx.ui.blue(`[oac] Loaded ${pending.length} pending epic(s) from backlog.`));\n }\n return pending;\n }\n }\n }\n\n // No fresh backlog — auto-analyze if enabled\n if (!params.autoAnalyze) {\n return null;\n }\n\n const analyzeSpinner = createSpinner(ctx.outputJson, \"Auto-analyzing codebase...\");\n\n const scanners = buildScannerList(config, Boolean(ghToken));\n const { codebaseMap, qualityReport } = await analyzeCodebase(resolvedRepo.localPath, {\n scanners,\n repoFullName: resolvedRepo.fullName,\n headSha: resolvedRepo.git.headSha,\n exclude: config?.discovery.exclude,\n });\n\n analyzeSpinner?.succeed(\n `Analyzed ${codebaseMap.modules.length} modules, ${codebaseMap.totalFiles} files, ${qualityReport.findings.length} findings`,\n );\n\n if (qualityReport.findings.length === 0) {\n return null;\n }\n\n const groupSpinner = createSpinner(ctx.outputJson, \"Grouping findings into epics...\");\n const epics = groupFindingsIntoEpics(qualityReport.findings, { codebaseMap });\n groupSpinner?.succeed(`Created ${epics.length} epic(s)`);\n\n // Persist context and backlog\n const persistSpinner = createSpinner(ctx.outputJson, \"Persisting context...\");\n await persistContext(resolvedRepo.localPath, codebaseMap, qualityReport, contextDir);\n const backlog = createBacklog(resolvedRepo.fullName, resolvedRepo.git.headSha, epics);\n await persistBacklog(resolvedRepo.localPath, backlog, contextDir);\n persistSpinner?.succeed(`Context persisted to ${contextDir}/`);\n\n return getPendingEpics(backlog);\n}\n\nfunction buildScannerList(config: OacConfig | null, hasGitHubAuth: boolean): Scanner[] {\n const scanners: Scanner[] = [];\n if (config?.discovery.scanners.lint !== false) scanners.push(new LintScanner());\n if (config?.discovery.scanners.todo !== false) scanners.push(new TodoScanner());\n scanners.push(new TestGapScanner());\n if (hasGitHubAuth) scanners.push(new GitHubIssuesScanner());\n return scanners;\n}\n\nfunction makeStubEstimate(taskId: string, providerId: string, tokens: number): TokenEstimate {\n return {\n taskId,\n providerId,\n contextTokens: 0,\n promptTokens: 0,\n expectedOutputTokens: 0,\n totalEstimatedTokens: tokens,\n confidence: 0.7,\n feasible: true,\n };\n}\n\nasync function executeEpicEntry(\n entry: { epic: Epic; estimatedTokens: number },\n params: {\n adapter: AgentProvider | null;\n useRealExecution: boolean;\n resolvedRepo: Awaited<ReturnType<typeof resolveRepo>>;\n providerId: string;\n timeoutSeconds: number;\n mode: RunMode;\n ghToken?: string;\n },\n): Promise<TaskRunResult> {\n const { adapter, useRealExecution, resolvedRepo, providerId, timeoutSeconds, mode, ghToken } =\n params;\n const task = epicAsTask(entry.epic);\n const estimate = makeStubEstimate(task.id, providerId, entry.estimatedTokens);\n\n let execution: ExecutionOutcome;\n let sandbox: SandboxInfo | undefined;\n\n if (useRealExecution && adapter) {\n const result = await executeWithAgent({\n task,\n estimate,\n adapter,\n repoPath: resolvedRepo.localPath,\n baseBranch: resolvedRepo.meta.defaultBranch,\n timeoutSeconds,\n });\n execution = result.execution;\n sandbox = result.sandbox;\n } else {\n execution = await simulateExecution(task, estimate);\n }\n\n let pr: TaskRunResult[\"pr\"];\n if (mode !== \"direct-commit\" && execution.success && sandbox) {\n pr =\n (await createPullRequest({\n task,\n execution,\n sandbox,\n repoFullName: resolvedRepo.fullName,\n baseBranch: resolvedRepo.meta.defaultBranch,\n ghToken,\n })) ?? undefined;\n }\n\n return { task, estimate, execution, sandbox, pr };\n}\n\nasync function runEpicPipeline(\n ctx: PipelineContext,\n params: {\n epics: Epic[];\n resolvedRepo: Awaited<ReturnType<typeof resolveRepo>>;\n config: OacConfig | null;\n providerId: string;\n totalBudget: number;\n concurrency: number;\n timeoutSeconds: number;\n mode: RunMode;\n ghToken?: string;\n contextDir: string;\n },\n): Promise<void> {\n const {\n epics,\n resolvedRepo,\n providerId,\n totalBudget,\n timeoutSeconds,\n mode,\n ghToken,\n contextDir,\n } = params;\n\n // Estimate tokens for each epic\n const estimateSpinner = createSpinner(\n ctx.outputJson,\n `Estimating tokens for ${epics.length} epic(s)...`,\n );\n for (const epic of epics) {\n if (epic.estimatedTokens === 0) {\n epic.estimatedTokens = await estimateEpicTokens(epic, providerId);\n }\n }\n estimateSpinner?.succeed(\"Epic token estimation completed\");\n\n const epicPlan = buildEpicExecutionPlan(epics, totalBudget);\n\n if (!ctx.outputJson) {\n console.log(\n ctx.ui.blue(\n `[oac] Selected ${epicPlan.selectedEpics.length} epic(s) for execution, ${epicPlan.deferredEpics.length} deferred.`,\n ),\n );\n }\n\n if (ctx.options.dryRun) {\n printEpicDryRun(ctx, epicPlan, totalBudget);\n return;\n }\n\n // Execute each selected epic\n const { adapter, useRealExecution } = await resolveAdapter(providerId);\n const allTaskResults: TaskRunResult[] = [];\n\n for (const entry of epicPlan.selectedEpics) {\n if (!ctx.outputJson) {\n console.log(\n ctx.ui.blue(\n `\\n[oac] Executing epic: ${entry.epic.title} (${entry.epic.subtasks.length} subtasks)`,\n ),\n );\n }\n\n const result = await executeEpicEntry(entry, {\n adapter,\n useRealExecution,\n resolvedRepo,\n providerId,\n timeoutSeconds,\n mode,\n ghToken,\n });\n allTaskResults.push(result);\n\n if (!ctx.outputJson) {\n const icon = result.execution.success ? ctx.ui.green(\"[OK]\") : ctx.ui.red(\"[X]\");\n console.log(`${icon} ${entry.epic.title}`);\n if (result.pr) console.log(` PR #${result.pr.number}: ${result.pr.url}`);\n }\n }\n\n // Update backlog with completed epics\n const completedIds = allTaskResults.filter((r) => r.execution.success).map((r) => r.task.id);\n const existingBacklog = await loadBacklog(resolvedRepo.localPath, contextDir);\n if (existingBacklog && completedIds.length > 0) {\n const updated = updateBacklog(existingBacklog, [], completedIds);\n await persistBacklog(resolvedRepo.localPath, updated, contextDir);\n }\n\n await writeTracking(ctx, {\n resolvedRepo,\n providerId,\n totalBudget,\n candidateTasks: allTaskResults.map((r) => r.task),\n completedTasks: allTaskResults,\n });\n\n printEpicSummary(ctx, epicPlan, allTaskResults, resolvedRepo.fullName, providerId, totalBudget);\n}\n\nfunction printEpicDryRun(\n ctx: PipelineContext,\n epicPlan: ReturnType<typeof buildEpicExecutionPlan>,\n totalBudget: number,\n): void {\n if (ctx.outputJson) {\n console.log(\n JSON.stringify(\n { summary: { runId: ctx.runId, dryRun: true, epics: epicPlan }, plan: epicPlan },\n null,\n 2,\n ),\n );\n } else {\n renderEpicPlanTable(ctx.ui, epicPlan, totalBudget);\n console.log(\"\");\n console.log(ctx.ui.blue(\"Dry run complete. No epics were executed.\"));\n }\n}\n\nfunction printEpicSummary(\n ctx: PipelineContext,\n epicPlan: ReturnType<typeof buildEpicExecutionPlan>,\n results: TaskRunResult[],\n repoName: string,\n providerId: string,\n totalBudget: number,\n): void {\n const completed = results.filter((t) => t.execution.success).length;\n const failed = results.length - completed;\n const prsCreated = results.filter((t) => Boolean(t.pr)).length;\n const tokensUsed = results.reduce((sum, t) => sum + t.execution.totalTokensUsed, 0);\n const duration = (Date.now() - ctx.runStartedAt) / 1000;\n\n if (ctx.outputJson) {\n console.log(\n JSON.stringify(\n {\n summary: {\n runId: ctx.runId,\n repo: repoName,\n provider: providerId,\n dryRun: false,\n selectedEpics: epicPlan.selectedEpics.length,\n deferredEpics: epicPlan.deferredEpics.length,\n epicsCompleted: completed,\n epicsFailed: failed,\n prsCreated,\n tokensUsed,\n tokensBudgeted: totalBudget,\n },\n epics: results,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log(\"\");\n console.log(ctx.ui.bold(\"Run Summary (Epic Mode)\"));\n console.log(` Epics completed: ${completed}/${results.length}`);\n console.log(` Epics failed: ${failed}`);\n console.log(` PRs created: ${prsCreated}`);\n console.log(\n ` Tokens used: ${formatInteger(tokensUsed)} / ${formatBudgetDisplay(totalBudget)}`,\n );\n console.log(` Duration: ${formatDuration(duration)}`);\n}\n\nfunction renderEpicPlanTable(\n ui: ChalkInstance,\n plan: ReturnType<typeof buildEpicExecutionPlan>,\n budget: number,\n): void {\n const table = new Table({\n head: [\"#\", \"Epic\", \"Scope\", \"Subtasks\", \"Est. Tokens\", \"Priority\"],\n });\n\n for (let i = 0; i < plan.selectedEpics.length; i++) {\n const entry = plan.selectedEpics[i];\n table.push([\n String(i + 1),\n truncate(entry.epic.title, 45),\n entry.epic.scope,\n String(entry.epic.subtasks.length),\n formatInteger(entry.estimatedTokens),\n String(entry.epic.priority),\n ]);\n }\n\n if (plan.selectedEpics.length > 0) {\n console.log(table.toString());\n } else {\n console.log(ui.yellow(\"No epics selected for execution.\"));\n }\n\n if (plan.deferredEpics.length > 0) {\n console.log(\"\");\n console.log(ui.yellow(`Deferred (${plan.deferredEpics.length}):`));\n for (const deferred of plan.deferredEpics) {\n console.log(\n ` - ${truncate(deferred.epic.title, 60)} (${formatInteger(deferred.estimatedTokens)} tokens)`,\n );\n }\n }\n}\n\n// ── Task-based execution (fallback) ────────────────────────\n\nasync function discoverTasks(\n ctx: PipelineContext,\n options: RunCommandOptions,\n config: OacConfig | null,\n ghToken: string | undefined,\n resolvedRepo: Awaited<ReturnType<typeof resolveRepo>>,\n) {\n const scannerSelection = selectScannersFromConfig(config, Boolean(ghToken));\n const minPriority = config?.discovery.minPriority ?? 20;\n const maxTasks = options.maxTasks ?? undefined;\n\n const scanSpinner = createSpinner(\n ctx.outputJson,\n `Running scanners: ${scannerSelection.enabled.join(\", \")}`,\n );\n const scannedTasks = await scannerSelection.scanner.scan(resolvedRepo.localPath, {\n exclude: config?.discovery.exclude,\n maxTasks: config?.discovery.maxTasks,\n repo: resolvedRepo,\n });\n scanSpinner?.succeed(`Discovered ${scannedTasks.length} raw task(s)`);\n\n let candidateTasks = rankTasks(scannedTasks).filter((task) => task.priority >= minPriority);\n if (options.source) {\n candidateTasks = candidateTasks.filter((task) => task.source === options.source);\n }\n if (typeof maxTasks === \"number\") {\n candidateTasks = candidateTasks.slice(0, maxTasks);\n }\n\n const estimateSpinner = createSpinner(\n ctx.outputJson,\n `Estimating tokens for ${candidateTasks.length} task(s)...`,\n );\n const estimates =\n candidateTasks.length > 0\n ? await estimateTaskMap(candidateTasks, resolveProviderId(options.provider, config))\n : new Map<string, TokenEstimate>();\n if (candidateTasks.length > 0) estimateSpinner?.succeed(\"Token estimation completed\");\n else estimateSpinner?.stop();\n\n const plan = buildExecutionPlan(candidateTasks, estimates, resolveBudget(options.tokens, config));\n\n return { ...resolvedRepo, candidateTasks, plan, fullName: resolvedRepo.fullName };\n}\n\nfunction printEmptySummary(\n ctx: PipelineContext,\n repoName: string,\n providerId: string,\n totalBudget: number,\n): void {\n const emptySummary: RunSummaryOutput = {\n runId: ctx.runId,\n repo: repoName,\n provider: providerId,\n dryRun: Boolean(ctx.options.dryRun),\n selectedTasks: 0,\n deferredTasks: 0,\n tasksCompleted: 0,\n tasksFailed: 0,\n prsCreated: 0,\n tokensUsed: 0,\n tokensBudgeted: totalBudget,\n };\n\n if (ctx.outputJson) {\n console.log(JSON.stringify({ summary: emptySummary, plan: null }, null, 2));\n } else {\n console.log(ctx.ui.yellow(\"No tasks discovered for execution.\"));\n }\n}\n\nfunction printDryRunSummary(\n ctx: PipelineContext,\n repoName: string,\n providerId: string,\n totalBudget: number,\n plan: ReturnType<typeof buildExecutionPlan>,\n): void {\n const dryRunSummary: RunSummaryOutput = {\n runId: ctx.runId,\n repo: repoName,\n provider: providerId,\n dryRun: true,\n selectedTasks: plan.selectedTasks.length,\n deferredTasks: plan.deferredTasks.length,\n tasksCompleted: 0,\n tasksFailed: 0,\n prsCreated: 0,\n tokensUsed: 0,\n tokensBudgeted: totalBudget,\n };\n\n if (ctx.outputJson) {\n console.log(JSON.stringify({ summary: dryRunSummary, plan }, null, 2));\n } else {\n renderSelectedPlanTable(ctx.ui, plan, totalBudget);\n console.log(\"\");\n console.log(ctx.ui.blue(\"Dry run complete. No tasks were executed.\"));\n }\n}\n\nasync function executePlan(\n ctx: PipelineContext,\n params: {\n plan: ReturnType<typeof buildExecutionPlan>;\n providerId: string;\n resolvedRepo: Awaited<ReturnType<typeof resolveRepo>>;\n concurrency: number;\n timeoutSeconds: number;\n mode: RunMode;\n ghToken?: string;\n },\n): Promise<TaskRunResult[]> {\n const { plan, providerId, resolvedRepo, concurrency, timeoutSeconds, mode, ghToken } = params;\n const { adapter, useRealExecution } = await resolveAdapter(providerId);\n\n if (!ctx.outputJson && ctx.globalOptions.verbose) {\n if (useRealExecution && adapter) {\n const avail = await adapter.checkAvailability();\n console.log(\n ctx.ui.green(`[oac] Using ${adapter.name} v${avail.version ?? \"unknown\"} for execution.`),\n );\n } else {\n console.log(ctx.ui.yellow(\"[oac] No agent CLI available. Using simulated execution.\"));\n }\n }\n\n const executionSpinner = createSpinner(\n ctx.outputJson,\n `Executing ${plan.selectedTasks.length} planned task(s)...`,\n );\n let completedCount = 0;\n\n const executedTasks = await runWithConcurrency(\n plan.selectedTasks,\n concurrency,\n async (entry): Promise<TaskRunResult> => {\n let execution: ExecutionOutcome;\n let sandbox: SandboxInfo | undefined;\n\n if (useRealExecution && adapter) {\n const result = await executeWithAgent({\n task: entry.task,\n estimate: entry.estimate,\n adapter,\n repoPath: resolvedRepo.localPath,\n baseBranch: resolvedRepo.meta.defaultBranch,\n timeoutSeconds,\n });\n execution = result.execution;\n sandbox = result.sandbox;\n } else {\n execution = await simulateExecution(entry.task, entry.estimate);\n }\n\n completedCount += 1;\n if (executionSpinner) {\n executionSpinner.text = `Executing tasks... (${completedCount}/${plan.selectedTasks.length})`;\n }\n\n return { task: entry.task, estimate: entry.estimate, execution, sandbox };\n },\n );\n\n executionSpinner?.succeed(\"Execution stage finished\");\n\n const completionSpinner = createSpinner(ctx.outputJson, \"Completing task outputs...\");\n const completedTasks = await runWithConcurrency(\n executedTasks,\n concurrency,\n async (result): Promise<TaskRunResult> => {\n if (mode === \"direct-commit\" || !result.execution.success) return result;\n\n const pr = await createPullRequest({\n task: result.task,\n execution: result.execution,\n sandbox: result.sandbox,\n repoFullName: resolvedRepo.fullName,\n baseBranch: resolvedRepo.meta.defaultBranch,\n ghToken,\n });\n\n return pr ? { ...result, pr } : result;\n },\n );\n completionSpinner?.succeed(\"Completion stage finished\");\n\n return completedTasks;\n}\n\nasync function writeTracking(\n ctx: PipelineContext,\n params: {\n resolvedRepo: Awaited<ReturnType<typeof resolveRepo>>;\n providerId: string;\n totalBudget: number;\n candidateTasks: Task[];\n completedTasks: TaskRunResult[];\n },\n): Promise<string | undefined> {\n const { resolvedRepo, providerId, totalBudget, candidateTasks, completedTasks } = params;\n const runDurationSeconds = (Date.now() - ctx.runStartedAt) / 1000;\n\n const contributionLog = buildContributionLog({\n runId: ctx.runId,\n repoFullName: resolvedRepo.fullName,\n repoHeadSha: resolvedRepo.git.headSha,\n defaultBranch: resolvedRepo.meta.defaultBranch,\n repoOwner: resolvedRepo.owner,\n providerId,\n totalBudget,\n runDurationSeconds,\n discoveredTasks: candidateTasks.length,\n taskResults: completedTasks,\n });\n\n const trackingSpinner = createSpinner(ctx.outputJson, \"Writing contribution log...\");\n try {\n const logPath = await writeContributionLog(contributionLog, resolvedRepo.localPath);\n trackingSpinner?.succeed(`Contribution log written: ${logPath}`);\n return logPath;\n } catch (error) {\n trackingSpinner?.fail(\"Failed to write contribution log\");\n if (ctx.globalOptions.verbose && !ctx.outputJson) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(ctx.ui.yellow(`[oac] Tracking failed: ${message}`));\n }\n return undefined;\n }\n}\n\nfunction printFinalSummary(\n ctx: PipelineContext,\n params: {\n plan: ReturnType<typeof buildExecutionPlan>;\n resolvedRepo: Awaited<ReturnType<typeof resolveRepo>>;\n providerId: string;\n totalBudget: number;\n completedTasks: TaskRunResult[];\n logPath?: string;\n },\n): void {\n const { plan, resolvedRepo, providerId, totalBudget, completedTasks } = params;\n const tasksCompleted = completedTasks.filter((t) => t.execution.success).length;\n const tasksFailed = completedTasks.length - tasksCompleted;\n const prsCreated = completedTasks.filter((t) => Boolean(t.pr)).length;\n const tokensUsed = completedTasks.reduce((sum, t) => sum + t.execution.totalTokensUsed, 0);\n const runDurationSeconds = (Date.now() - ctx.runStartedAt) / 1000;\n\n const summary: RunSummaryOutput = {\n runId: ctx.runId,\n repo: resolvedRepo.fullName,\n provider: providerId,\n dryRun: false,\n selectedTasks: plan.selectedTasks.length,\n deferredTasks: plan.deferredTasks.length,\n tasksCompleted,\n tasksFailed,\n prsCreated,\n tokensUsed,\n tokensBudgeted: totalBudget,\n logPath: params.logPath,\n };\n\n if (ctx.outputJson) {\n console.log(JSON.stringify({ summary, plan, tasks: completedTasks }, null, 2));\n return;\n }\n\n renderTaskResults(ctx.ui, completedTasks);\n console.log(\"\");\n console.log(ctx.ui.bold(\"Run Summary\"));\n console.log(` Tasks completed: ${tasksCompleted}/${completedTasks.length}`);\n console.log(` Tasks failed: ${tasksFailed}`);\n console.log(` PRs created: ${prsCreated}`);\n console.log(\n ` Tokens used: ${formatInteger(tokensUsed)} / ${formatBudgetDisplay(totalBudget)}`,\n );\n console.log(` Duration: ${formatDuration(runDurationSeconds)}`);\n if (params.logPath) {\n console.log(` Log: ${params.logPath}`);\n }\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction createSpinner(enabled: boolean, text: string): Ora | null {\n if (enabled) {\n return null;\n }\n\n return ora({ text, color: \"blue\" }).start();\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nfunction parseTokens(value: string): number {\n if (value.toLowerCase() === \"unlimited\") {\n return UNLIMITED_BUDGET;\n }\n return parseInteger(value);\n}\n\nfunction formatBudgetDisplay(budget: number): string {\n if (budget >= UNLIMITED_BUDGET) {\n return \"unlimited\";\n }\n return formatInteger(budget);\n}\n\nfunction validateRunOptions(options: RunCommandOptions): void {\n if (typeof options.concurrency === \"number\" && options.concurrency <= 0) {\n throw new Error(\"--concurrency must be greater than zero.\");\n }\n\n if (typeof options.timeout === \"number\" && options.timeout <= 0) {\n throw new Error(\"--timeout must be greater than zero.\");\n }\n\n if (typeof options.maxTasks === \"number\" && options.maxTasks <= 0) {\n throw new Error(\"--max-tasks must be greater than zero when provided.\");\n }\n}\n\nasync function loadOptionalConfig(\n configPath: string,\n verbose: boolean,\n ui: ChalkInstance,\n): Promise<OacConfig | null> {\n return loadOptionalConfigFile(configPath, {\n onWarning: verbose\n ? (message) => {\n console.warn(ui.yellow(`[oac] ${message}`));\n }\n : undefined,\n });\n}\n\nfunction resolveRepoInput(repoOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = repoOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n const firstConfiguredRepo = config?.repos[0];\n if (typeof firstConfiguredRepo === \"string\") {\n return firstConfiguredRepo;\n }\n\n if (\n firstConfiguredRepo &&\n typeof firstConfiguredRepo === \"object\" &&\n \"name\" in firstConfiguredRepo &&\n typeof firstConfiguredRepo.name === \"string\"\n ) {\n return firstConfiguredRepo.name;\n }\n\n throw new Error(\"No repository specified. Use --repo or configure repos in oac.config.ts.\");\n}\n\nasync function resolveAdapter(\n providerId: string,\n): Promise<{ adapter: AgentProvider | null; useRealExecution: boolean }> {\n // Normalize legacy ID\n const normalizedId = providerId === \"codex-cli\" ? \"codex\" : providerId;\n\n const adapters: Record<string, () => AgentProvider> = {\n codex: () => new CodexAdapter(),\n \"claude-code\": () => new ClaudeCodeAdapter(),\n };\n\n const factory = adapters[normalizedId];\n if (!factory) {\n return { adapter: null, useRealExecution: false };\n }\n\n const adapter = factory();\n const availability = await adapter.checkAvailability();\n return {\n adapter: availability.available ? adapter : null,\n useRealExecution: availability.available,\n };\n}\n\nfunction resolveProviderId(providerOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = providerOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n return config?.provider.id ?? \"claude-code\";\n}\n\nfunction resolveBudget(tokensOption: number | undefined, config: OacConfig | null): number {\n const budget = tokensOption ?? config?.budget.totalTokens ?? 100_000;\n if (!Number.isFinite(budget) || budget <= 0) {\n throw new Error(\"Token budget must be a positive number.\");\n }\n\n return Math.floor(budget);\n}\n\nfunction resolveMode(modeOption: string | undefined, config: OacConfig | null): RunMode {\n const candidate = (modeOption ?? config?.execution.mode ?? \"new-pr\").trim();\n if (candidate === \"new-pr\" || candidate === \"update-pr\" || candidate === \"direct-commit\") {\n return candidate;\n }\n\n throw new Error(`Invalid --mode value \"${candidate}\".`);\n}\n\nfunction resolveConcurrency(\n concurrencyOption: number | undefined,\n config: OacConfig | null,\n): number {\n const configuredConcurrency =\n typeof concurrencyOption === \"number\"\n ? concurrencyOption\n : (config?.execution.concurrency ?? DEFAULT_CONCURRENCY);\n\n if (!Number.isFinite(configuredConcurrency) || configuredConcurrency <= 0) {\n throw new Error(\"Concurrency must be a positive integer.\");\n }\n\n return Math.floor(configuredConcurrency);\n}\n\nfunction resolveTimeout(timeoutOption: number | undefined, config: OacConfig | null): number {\n const configuredTimeout =\n typeof timeoutOption === \"number\"\n ? timeoutOption\n : (config?.execution.taskTimeout ?? DEFAULT_TIMEOUT_SECONDS);\n\n if (!Number.isFinite(configuredTimeout) || configuredTimeout <= 0) {\n throw new Error(\"Timeout must be a positive integer.\");\n }\n\n return Math.floor(configuredTimeout);\n}\n\nfunction selectScannersFromConfig(\n config: OacConfig | null,\n hasGitHubAuth: boolean,\n): {\n enabled: SupportedScanner[];\n scanner: CompositeScanner;\n} {\n const enabled: SupportedScanner[] = [];\n\n if (config?.discovery.scanners.lint !== false) {\n enabled.push(\"lint\");\n }\n if (config?.discovery.scanners.todo !== false) {\n enabled.push(\"todo\");\n }\n\n // Always include test-gap for autonomous code analysis\n enabled.push(\"test-gap\");\n\n // Include GitHub issues scanner when a GitHub token is available.\n if (hasGitHubAuth) {\n enabled.push(\"github-issues\");\n }\n\n if (enabled.length === 0) {\n enabled.push(\"lint\", \"todo\", \"test-gap\");\n }\n\n const uniqueEnabled = [...new Set(enabled)];\n const scannerInstances: Scanner[] = uniqueEnabled.map((scannerName) => {\n if (scannerName === \"lint\") return new LintScanner();\n if (scannerName === \"github-issues\") return new GitHubIssuesScanner();\n if (scannerName === \"test-gap\") return new TestGapScanner();\n return new TodoScanner();\n });\n\n return {\n enabled: uniqueEnabled,\n scanner: new CompositeScanner(scannerInstances),\n };\n}\n\nasync function estimateTaskMap(\n tasks: Task[],\n providerId: string,\n): Promise<Map<string, TokenEstimate>> {\n const entries = await Promise.all(\n tasks.map(async (task) => {\n const estimate = await estimateTokens(task, providerId);\n return [task.id, estimate] as const;\n }),\n );\n\n return new Map(entries);\n}\n\nasync function executeWithAgent(input: {\n task: Task;\n estimate: TokenEstimate;\n adapter: AgentProvider;\n repoPath: string;\n baseBranch: string;\n timeoutSeconds: number;\n}): Promise<{ execution: ExecutionOutcome; sandbox: SandboxInfo }> {\n const startedAt = Date.now();\n const taskSlug = input.task.id\n .replace(/[^a-zA-Z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .slice(0, 30);\n const branchName = `oac/${Date.now()}-${taskSlug}`;\n\n const sandbox = await createSandbox(input.repoPath, branchName, input.baseBranch);\n const eventBus = createEventBus();\n const sandboxInfo: SandboxInfo = {\n branchName,\n sandboxPath: sandbox.path,\n cleanup: sandbox.cleanup,\n };\n\n try {\n const result = await workerExecuteTask(input.adapter, input.task, sandbox, eventBus, {\n tokenBudget: input.estimate.totalEstimatedTokens,\n timeoutMs: input.timeoutSeconds * 1_000,\n });\n\n // Agent may edit files without committing — stage and commit any changes\n const commitResult = await commitSandboxChanges(sandbox.path, input.task);\n\n const filesChanged =\n commitResult.filesChanged.length > 0\n ? commitResult.filesChanged\n : result.filesChanged.length > 0\n ? result.filesChanged\n : [];\n\n return {\n execution: {\n success: result.success || commitResult.hasChanges,\n exitCode: result.exitCode,\n totalTokensUsed: result.totalTokensUsed,\n filesChanged,\n duration: result.duration > 0 ? result.duration / 1_000 : (Date.now() - startedAt) / 1_000,\n error: result.error,\n },\n sandbox: sandboxInfo,\n };\n } catch (error) {\n // Even on error, check if agent left uncommitted changes\n const commitResult = await commitSandboxChanges(sandbox.path, input.task);\n if (commitResult.hasChanges) {\n return {\n execution: {\n success: true,\n exitCode: 0,\n totalTokensUsed: 0,\n filesChanged: commitResult.filesChanged,\n duration: (Date.now() - startedAt) / 1_000,\n },\n sandbox: sandboxInfo,\n };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return {\n execution: {\n success: false,\n exitCode: 1,\n totalTokensUsed: 0,\n filesChanged: [],\n duration: (Date.now() - startedAt) / 1_000,\n error: message,\n },\n sandbox: sandboxInfo,\n };\n }\n}\n\nasync function createPullRequest(input: {\n task: Task;\n execution: ExecutionOutcome;\n sandbox?: SandboxInfo;\n repoFullName: string;\n baseBranch: string;\n ghToken?: string;\n}): Promise<\n | {\n number: number;\n url: string;\n status: \"open\" | \"merged\" | \"closed\";\n }\n | undefined\n> {\n if (!input.sandbox) {\n return undefined;\n }\n\n const { branchName, sandboxPath } = input.sandbox;\n const [owner, repo] = input.repoFullName.split(\"/\");\n\n try {\n // Build env with explicit GitHub token to avoid interactive device flow\n const ghEnv: Record<string, string> = { ...process.env } as Record<string, string>;\n if (input.ghToken) {\n ghEnv.GH_TOKEN = input.ghToken;\n ghEnv.GITHUB_TOKEN = input.ghToken;\n }\n\n // Push the branch from the sandbox worktree\n await execa(\"git\", [\"push\", \"--set-upstream\", \"origin\", branchName], {\n cwd: sandboxPath,\n env: ghEnv,\n });\n\n // Create PR using gh CLI\n const prTitle = `[OAC] ${input.task.title}`;\n const prBodyLines = [\n \"## Summary\",\n \"\",\n input.task.description || `Automated contribution for task \"${input.task.title}\".`,\n \"\",\n ];\n\n // Auto-resolve: link PR to GitHub issue so it closes on merge\n if (input.task.linkedIssue) {\n prBodyLines.push(`Closes #${input.task.linkedIssue.number}`, \"\");\n }\n\n prBodyLines.push(\n \"## Context\",\n \"\",\n `- **Task source:** ${input.task.source}`,\n `- **Complexity:** ${input.task.complexity}`,\n `- **Tokens used:** ${input.execution.totalTokensUsed}`,\n `- **Files changed:** ${input.execution.filesChanged.length}`,\n );\n\n if (input.task.linkedIssue) {\n prBodyLines.push(`- **Resolves:** #${input.task.linkedIssue.number}`);\n }\n\n prBodyLines.push(\n \"\",\n \"---\",\n \"*This PR was automatically generated by [OAC](https://github.com/Open330/open-agent-contribution).*\",\n );\n\n const prBody = prBodyLines.join(\"\\n\");\n\n const ghResult = await execa(\n \"gh\",\n [\n \"pr\",\n \"create\",\n \"--repo\",\n input.repoFullName,\n \"--title\",\n prTitle,\n \"--body\",\n prBody,\n \"--head\",\n branchName,\n \"--base\",\n input.baseBranch,\n ],\n { cwd: sandboxPath, env: ghEnv },\n );\n\n // Parse PR URL from gh output\n const prUrl = ghResult.stdout.trim();\n const prNumberMatch = prUrl.match(/\\/pull\\/(\\d+)/);\n const prNumber = prNumberMatch ? Number.parseInt(prNumberMatch[1], 10) : 0;\n\n return {\n number: prNumber,\n url: prUrl,\n status: \"open\",\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`[oac] PR creation failed: ${message}`);\n return undefined;\n }\n}\n\nasync function simulateExecution(task: Task, estimate: TokenEstimate): Promise<ExecutionOutcome> {\n const start = Date.now();\n const delayMs = Math.min(1_500, Math.max(150, Math.round(estimate.totalEstimatedTokens / 40)));\n await sleep(delayMs);\n\n return {\n success: true,\n exitCode: 0,\n totalTokensUsed: Math.max(1, Math.round(estimate.totalEstimatedTokens * 0.9)),\n filesChanged:\n task.targetFiles.length > 0\n ? task.targetFiles.slice(0, Math.min(task.targetFiles.length, 4))\n : [],\n duration: (Date.now() - start) / 1_000,\n };\n}\n\nasync function commitSandboxChanges(\n sandboxPath: string,\n task: Task,\n): Promise<{ hasChanges: boolean; filesChanged: string[] }> {\n try {\n // Check for any uncommitted changes (staged + unstaged + untracked)\n const statusResult = await execa(\"git\", [\"status\", \"--porcelain\"], { cwd: sandboxPath });\n if (!statusResult.stdout.trim()) {\n return { hasChanges: false, filesChanged: [] };\n }\n\n await execa(\"git\", [\"add\", \"-A\"], { cwd: sandboxPath });\n await execa(\n \"git\",\n [\"commit\", \"-m\", `[OAC] ${task.title}\\n\\nAutomated contribution by OAC using Codex CLI.`],\n { cwd: sandboxPath },\n );\n\n // Get the list of changed files from the commit\n const diffResult = await execa(\"git\", [\"diff\", \"--name-only\", \"HEAD~1\", \"HEAD\"], {\n cwd: sandboxPath,\n });\n const changedFiles = diffResult.stdout.trim().split(\"\\n\").filter(Boolean);\n\n return { hasChanges: true, filesChanged: changedFiles };\n } catch {\n return { hasChanges: false, filesChanged: [] };\n }\n}\n\nfunction buildContributionLog(input: {\n runId: string;\n repoFullName: string;\n repoHeadSha: string;\n defaultBranch: string;\n repoOwner: string;\n providerId: string;\n totalBudget: number;\n runDurationSeconds: number;\n discoveredTasks: number;\n taskResults: TaskRunResult[];\n}): ContributionLog {\n const timestamp = new Date().toISOString();\n const contributor = resolveGithubUsername(input.repoOwner);\n\n const contributionTasks = input.taskResults.map((result) => ({\n taskId: result.task.id,\n title: result.task.title,\n source: result.task.source,\n complexity: result.task.complexity,\n status: deriveTaskStatus(result.execution),\n tokensUsed: Math.max(0, Math.floor(result.execution.totalTokensUsed)),\n duration: Math.max(0, result.execution.duration),\n filesChanged: result.execution.filesChanged,\n pr: result.pr,\n linkedIssue: result.task.linkedIssue\n ? {\n number: result.task.linkedIssue.number,\n url: result.task.linkedIssue.url,\n }\n : undefined,\n error: result.execution.error,\n }));\n\n const tasksSucceeded = contributionTasks.filter((task) => task.status !== \"failed\").length;\n const tasksFailed = contributionTasks.length - tasksSucceeded;\n const totalTokensUsed = contributionTasks.reduce((sum, task) => sum + task.tokensUsed, 0);\n const totalFilesChanged = contributionTasks.reduce(\n (sum, task) => sum + task.filesChanged.length,\n 0,\n );\n\n return {\n version: \"1.0\",\n runId: input.runId,\n timestamp,\n contributor: {\n githubUsername: contributor,\n email: process.env.GIT_AUTHOR_EMAIL ?? undefined,\n },\n repo: {\n fullName: input.repoFullName,\n headSha: input.repoHeadSha,\n defaultBranch: input.defaultBranch,\n },\n budget: {\n provider: input.providerId,\n totalTokensBudgeted: input.totalBudget,\n totalTokensUsed,\n },\n tasks: contributionTasks,\n metrics: {\n tasksDiscovered: input.discoveredTasks,\n tasksAttempted: contributionTasks.length,\n tasksSucceeded,\n tasksFailed,\n totalDuration: Math.max(0, input.runDurationSeconds),\n totalFilesChanged,\n totalLinesAdded: 0,\n totalLinesRemoved: 0,\n },\n };\n}\n\nfunction deriveTaskStatus(execution: ExecutionOutcome): CompletionStatus {\n if (execution.success) {\n return \"success\";\n }\n\n if (execution.filesChanged.length > 0) {\n return \"partial\";\n }\n\n return \"failed\";\n}\n\nfunction resolveGithubUsername(fallback: string): string {\n const candidates = [\n process.env.GITHUB_USER,\n process.env.GITHUB_USERNAME,\n process.env.USER,\n process.env.LOGNAME,\n fallback,\n \"oac-user\",\n ];\n\n for (const candidate of candidates) {\n const normalized = sanitizeGithubUsername(candidate ?? \"\");\n if (normalized) {\n return normalized;\n }\n }\n\n return \"oac-user\";\n}\n\nfunction sanitizeGithubUsername(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n const cleaned = trimmed\n .replace(/[^A-Za-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n if (cleaned.length === 0 || cleaned.length > 39) {\n return null;\n }\n\n if (!/^(?!-)[A-Za-z0-9-]+(?<!-)$/.test(cleaned)) {\n return null;\n }\n\n return cleaned;\n}\n\nfunction renderSelectedPlanTable(\n ui: ChalkInstance,\n plan: ReturnType<typeof buildExecutionPlan>,\n budget: number,\n): void {\n const table = new Table({\n head: [\"#\", \"Task\", \"Est. Tokens\", \"Cumulative\", \"Confidence\"],\n });\n\n for (let index = 0; index < plan.selectedTasks.length; index += 1) {\n const entry = plan.selectedTasks[index];\n table.push([\n String(index + 1),\n truncate(entry.task.title, 56),\n formatInteger(entry.estimate.totalEstimatedTokens),\n formatInteger(entry.cumulativeBudgetUsed),\n entry.estimate.confidence.toFixed(2),\n ]);\n }\n\n if (plan.selectedTasks.length > 0) {\n console.log(table.toString());\n } else {\n console.log(ui.yellow(\"No tasks selected for execution.\"));\n }\n\n console.log(\"\");\n console.log(\n `Budget used: ${formatInteger(\n plan.selectedTasks[plan.selectedTasks.length - 1]?.cumulativeBudgetUsed ?? 0,\n )} / ${formatBudgetDisplay(budget - plan.reserveTokens)} (effective)`,\n );\n console.log(`Reserve: ${formatBudgetDisplay(plan.reserveTokens)} (10%)`);\n console.log(`Remaining: ${formatBudgetDisplay(plan.remainingTokens)}`);\n\n if (plan.deferredTasks.length > 0) {\n console.log(\"\");\n console.log(ui.yellow(`Deferred (${plan.deferredTasks.length}):`));\n for (const deferred of plan.deferredTasks) {\n console.log(\n ` - ${truncate(deferred.task.title, 72)} (${formatInteger(\n deferred.estimate.totalEstimatedTokens,\n )} tokens, ${deferred.reason.replaceAll(\"_\", \" \")})`,\n );\n }\n }\n}\n\nfunction renderTaskResults(ui: ChalkInstance, taskResults: TaskRunResult[]): void {\n for (let index = 0; index < taskResults.length; index += 1) {\n const result = taskResults[index];\n const icon = result.execution.success ? ui.green(\"[OK]\") : ui.red(\"[X]\");\n const status = result.execution.success ? ui.green(\"SUCCESS\") : ui.red(\"FAILED\");\n\n console.log(`${icon} [${index + 1}/${taskResults.length}] ${result.task.title}`);\n console.log(\n ` ${status} | tokens ${formatInteger(result.execution.totalTokensUsed)} | duration ${formatDuration(\n result.execution.duration,\n )}`,\n );\n if (result.pr) {\n console.log(` PR #${result.pr.number}: ${result.pr.url}`);\n }\n if (result.execution.error) {\n console.log(` Error: ${result.execution.error}`);\n }\n }\n}\n\nasync function runWithConcurrency<T, R>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n if (items.length === 0) {\n return [];\n }\n\n const results: R[] = new Array(items.length);\n let nextIndex = 0;\n\n const runWorker = async (): Promise<void> => {\n while (true) {\n const currentIndex = nextIndex;\n nextIndex += 1;\n if (currentIndex >= items.length) {\n return;\n }\n\n results[currentIndex] = await worker(items[currentIndex], currentIndex);\n }\n };\n\n const workerCount = Math.min(concurrency, items.length);\n await Promise.all(Array.from({ length: workerCount }, () => runWorker()));\n\n return results;\n}\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n return await new Promise((resolvePromise, rejectPromise) => {\n const timeout = setTimeout(() => {\n rejectPromise(new Error(`Timed out after ${Math.round(timeoutMs / 1000)}s`));\n }, timeoutMs);\n\n promise.then(\n (value) => {\n clearTimeout(timeout);\n resolvePromise(value);\n },\n (error) => {\n clearTimeout(timeout);\n rejectPromise(error);\n },\n );\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolvePromise) => {\n setTimeout(resolvePromise, ms);\n });\n}\n\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) {\n return \"0s\";\n }\n\n if (seconds < 60) {\n return `${seconds.toFixed(1)}s`;\n }\n\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = Math.round(seconds % 60);\n return `${minutes}m ${remainingSeconds}s`;\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n","import chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\nimport ora, { type Ora } from \"ora\";\nimport type { OacConfig } from \"../../core/index.js\";\nimport {\n CompositeScanner,\n GitHubIssuesScanner,\n LintScanner,\n type Scanner,\n TestGapScanner,\n TodoScanner,\n rankTasks,\n} from \"../../discovery/index.js\";\nimport { cloneRepo, resolveRepo } from \"../../repo/index.js\";\nimport { ensureGitHubAuth } from \"../github-auth.js\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\nimport { loadOptionalConfigFile } from \"../config-loader.js\";\n\ninterface ScanCommandOptions {\n repo?: string;\n scanners?: string;\n minPriority: number;\n format: string;\n}\n\ntype OutputFormat = \"table\" | \"json\";\ntype SupportedScanner = \"lint\" | \"todo\" | \"github-issues\" | \"test-gap\";\n\nconst SUPPORTED_SCANNERS: SupportedScanner[] = [\"lint\", \"todo\", \"github-issues\", \"test-gap\"];\n\nexport function createScanCommand(): Command {\n const command = new Command(\"scan\");\n\n command\n .description(\"Discover tasks in a repository\")\n .option(\"--repo <owner/repo>\", \"Target repository (owner/repo or GitHub URL)\")\n .option(\"--scanners <names>\", \"Comma-separated scanner filter (lint,todo)\")\n .option(\"--min-priority <number>\", \"Minimum priority threshold (0-100)\", parseInteger, 20)\n .option(\"--format <format>\", \"Output format: table|json\", \"table\")\n .action(async (options: ScanCommandOptions, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n\n const outputFormat = normalizeOutputFormat(options.format);\n const outputJson = globalOptions.json || outputFormat === \"json\";\n\n if (options.minPriority < 0 || options.minPriority > 100) {\n throw new Error(\"--min-priority must be between 0 and 100.\");\n }\n\n const config = await loadOptionalConfig(globalOptions.config, globalOptions.verbose, ui);\n const repoInput = resolveRepoInput(options.repo, config);\n const ghToken = ensureGitHubAuth();\n const scannerSelection = selectScanners(options.scanners, config, Boolean(ghToken));\n\n if (!outputJson && scannerSelection.unknown.length > 0) {\n console.log(\n ui.yellow(\n `Ignoring unsupported scanner(s): ${scannerSelection.unknown.join(\", \")}. Supported scanners: ${SUPPORTED_SCANNERS.join(\", \")}.`,\n ),\n );\n }\n\n const resolveSpinner = createSpinner(outputJson, \"Resolving repository...\");\n const resolvedRepo = await resolveRepo(repoInput);\n resolveSpinner?.succeed(`Resolved ${resolvedRepo.fullName}`);\n\n const cloneSpinner = createSpinner(outputJson, \"Preparing local clone...\");\n await cloneRepo(resolvedRepo);\n cloneSpinner?.succeed(`Repository ready at ${resolvedRepo.localPath}`);\n\n const scanSpinner = createSpinner(\n outputJson,\n `Running scanners: ${scannerSelection.enabled.join(\", \")}`,\n );\n\n const scannedTasks = await scannerSelection.scanner.scan(resolvedRepo.localPath, {\n exclude: config?.discovery.exclude,\n maxTasks: config?.discovery.maxTasks,\n repo: resolvedRepo,\n });\n\n scanSpinner?.succeed(`Scanned ${resolvedRepo.fullName}`);\n\n const rankedTasks = rankTasks(scannedTasks).filter(\n (task) => task.priority >= options.minPriority,\n );\n\n if (outputJson) {\n console.log(\n JSON.stringify(\n {\n repo: resolvedRepo.fullName,\n scanners: scannerSelection.enabled,\n minPriority: options.minPriority,\n totalTasks: rankedTasks.length,\n tasks: rankedTasks,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (rankedTasks.length === 0) {\n console.log(ui.yellow(\"No tasks discovered for the selected criteria.\"));\n return;\n }\n\n const table = new Table({\n head: [\"ID\", \"Title\", \"Source\", \"Priority\", \"Complexity\"],\n });\n\n for (const task of rankedTasks) {\n table.push([\n task.id,\n truncate(task.title, 60),\n task.source,\n String(task.priority),\n task.complexity,\n ]);\n }\n\n console.log(table.toString());\n console.log(\"\");\n console.log(\n ui.blue(\n `Found ${rankedTasks.length} task(s). Use \\`oac plan --repo ${resolvedRepo.fullName} --tokens <n>\\` to build an execution plan.`,\n ),\n );\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction createSpinner(enabled: boolean, text: string): Ora | null {\n if (enabled) {\n return null;\n }\n\n return ora({ text, color: \"blue\" }).start();\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nfunction normalizeOutputFormat(value: string): OutputFormat {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"table\" || normalized === \"json\") {\n return normalized;\n }\n\n throw new Error(`Unsupported --format value \"${value}\". Use \"table\" or \"json\".`);\n}\n\nasync function loadOptionalConfig(\n configPath: string,\n verbose: boolean,\n ui: ChalkInstance,\n): Promise<OacConfig | null> {\n return loadOptionalConfigFile(configPath, {\n onWarning: verbose\n ? (message) => {\n console.warn(ui.yellow(`[oac] ${message}`));\n }\n : undefined,\n });\n}\n\nfunction resolveRepoInput(repoOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = repoOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n const firstConfiguredRepo = config?.repos[0];\n if (typeof firstConfiguredRepo === \"string\") {\n return firstConfiguredRepo;\n }\n\n if (\n firstConfiguredRepo &&\n typeof firstConfiguredRepo === \"object\" &&\n \"name\" in firstConfiguredRepo &&\n typeof firstConfiguredRepo.name === \"string\"\n ) {\n return firstConfiguredRepo.name;\n }\n\n throw new Error(\"No repository specified. Use --repo or configure repos in oac.config.ts.\");\n}\n\nfunction selectScanners(\n scannerOption: string | undefined,\n config: OacConfig | null,\n hasGitHubAuth = false,\n): {\n enabled: SupportedScanner[];\n unknown: string[];\n scanner: CompositeScanner;\n} {\n const defaultScanners: SupportedScanner[] = [\"lint\", \"todo\", \"test-gap\"];\n if (hasGitHubAuth) {\n defaultScanners.push(\"github-issues\");\n }\n const requested = scannerOption\n ? parseCsv(scannerOption)\n : (scannersFromConfig(config, hasGitHubAuth) ?? defaultScanners);\n\n const enabled: SupportedScanner[] = [];\n const unknown: string[] = [];\n\n for (const scannerName of requested) {\n const normalized = scannerName.toLowerCase();\n if (\n normalized === \"lint\" ||\n normalized === \"todo\" ||\n normalized === \"github-issues\" ||\n normalized === \"test-gap\"\n ) {\n enabled.push(normalized as SupportedScanner);\n } else {\n unknown.push(scannerName);\n }\n }\n\n const uniqueEnabled = [...new Set(enabled)];\n if (uniqueEnabled.length === 0) {\n throw new Error(\n `No supported scanners selected. Supported scanners: ${SUPPORTED_SCANNERS.join(\", \")}.`,\n );\n }\n\n const scannerInstances: Scanner[] = uniqueEnabled.map((name) => {\n if (name === \"lint\") return new LintScanner();\n if (name === \"github-issues\") return new GitHubIssuesScanner();\n if (name === \"test-gap\") return new TestGapScanner();\n return new TodoScanner();\n });\n\n return {\n enabled: uniqueEnabled,\n unknown,\n scanner: new CompositeScanner(scannerInstances),\n };\n}\n\nfunction scannersFromConfig(\n config: OacConfig | null,\n hasGitHubAuth = false,\n): SupportedScanner[] | null {\n if (!config) {\n return null;\n }\n\n const configured: SupportedScanner[] = [];\n if (config.discovery.scanners.lint) {\n configured.push(\"lint\");\n }\n if (config.discovery.scanners.todo) {\n configured.push(\"todo\");\n }\n // Always include test-gap for autonomous discovery\n configured.push(\"test-gap\");\n if (hasGitHubAuth) {\n configured.push(\"github-issues\");\n }\n\n if (configured.length === 0) {\n return null;\n }\n\n return configured;\n}\n\nfunction parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { Command } from \"commander\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ninterface StatusCommandOptions {\n watch?: boolean;\n}\n\ninterface RunStatus {\n runId: string;\n startedAt: string;\n agent: string;\n tasks: RunStatusTask[];\n}\n\ninterface RunStatusTask {\n taskId: string;\n title: string;\n status: \"pending\" | \"running\" | \"completed\" | \"failed\";\n startedAt?: string;\n completedAt?: string;\n error?: string;\n}\n\nconst WATCH_INTERVAL_MS = 2_000;\n\nexport function createStatusCommand(): Command {\n const command = new Command(\"status\");\n\n command\n .description(\"Show current job status\")\n .option(\"--watch\", \"Poll every 2 seconds\", false)\n .action(async (options: StatusCommandOptions, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n\n const render = async (): Promise<void> => {\n const status = await readRunStatus(process.cwd());\n renderStatusOutput(status, globalOptions.json);\n };\n\n await render();\n\n if (!options.watch) {\n return;\n }\n\n setInterval(() => {\n console.clear();\n void render().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n });\n }, WATCH_INTERVAL_MS);\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nasync function readRunStatus(repoPath: string): Promise<RunStatus | null> {\n const statusPath = resolve(repoPath, \".oac\", \"status.json\");\n\n try {\n const raw = await readFile(statusPath, \"utf8\");\n const payload = JSON.parse(raw) as unknown;\n return parseRunStatus(payload);\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return null;\n }\n\n throw error;\n }\n}\n\nfunction parseRunStatus(payload: unknown): RunStatus {\n if (!isRecord(payload)) {\n throw new Error(\"Invalid .oac/status.json format.\");\n }\n\n const runId = payload.runId;\n const startedAt = payload.startedAt;\n const agent = payload.agent;\n const tasks = payload.tasks;\n\n if (\n typeof runId !== \"string\" ||\n typeof startedAt !== \"string\" ||\n typeof agent !== \"string\" ||\n !Array.isArray(tasks)\n ) {\n throw new Error(\"Invalid .oac/status.json format.\");\n }\n\n return {\n runId,\n startedAt,\n agent,\n tasks: tasks.map((task, index) => parseRunStatusTask(task, index)),\n };\n}\n\nfunction parseRunStatusTask(task: unknown, index: number): RunStatusTask {\n if (!isRecord(task)) {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n const taskId = task.taskId;\n const title = task.title;\n const status = task.status;\n const startedAt = task.startedAt;\n const completedAt = task.completedAt;\n const error = task.error;\n\n if (\n typeof taskId !== \"string\" ||\n typeof title !== \"string\" ||\n (status !== \"pending\" && status !== \"running\" && status !== \"completed\" && status !== \"failed\")\n ) {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n if (startedAt !== undefined && typeof startedAt !== \"string\") {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n if (completedAt !== undefined && typeof completedAt !== \"string\") {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n if (error !== undefined && typeof error !== \"string\") {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n return {\n taskId,\n title,\n status,\n startedAt,\n completedAt,\n error,\n };\n}\n\nfunction renderStatusOutput(status: RunStatus | null, outputJson: boolean): void {\n if (outputJson) {\n if (!status) {\n console.log(\n JSON.stringify(\n {\n active: false,\n message: \"No active runs\",\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log(\n JSON.stringify(\n {\n active: true,\n status,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (!status) {\n console.log(\"No active runs\");\n return;\n }\n\n const runningTasks = status.tasks.filter((task) => task.status === \"running\");\n const completedTasks = status.tasks.filter((task) => task.status === \"completed\");\n const failedTasks = status.tasks.filter((task) => task.status === \"failed\");\n\n console.log(`Run ID: ${status.runId}`);\n console.log(`Start Time: ${status.startedAt}`);\n console.log(`Agent: ${status.agent}`);\n console.log(\n `Tasks In Progress (${String(runningTasks.length)}): ${formatTaskList(runningTasks)}`,\n );\n console.log(\n `Completed Tasks (${String(completedTasks.length)}): ${formatTaskList(completedTasks)}`,\n );\n\n if (failedTasks.length === 0) {\n console.log(\"Errors: none\");\n return;\n }\n\n console.log(`Errors (${String(failedTasks.length)}):`);\n for (const task of failedTasks) {\n console.log(`- ${task.taskId}: ${task.error ?? \"Unknown error\"}`);\n }\n}\n\nfunction formatTaskList(tasks: RunStatusTask[]): string {\n if (tasks.length === 0) {\n return \"-\";\n }\n\n return tasks.map((task) => `${task.taskId} (${task.title})`).join(\", \");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n if (!isRecord(error)) {\n return false;\n }\n\n return error.code === \"ENOENT\";\n}\n"],"mappings":"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","names":["Command","chalk","Chalk","Command","getGlobalOptions","createUi","fsConstants","access","resolve","chalk","Chalk","Command","getGlobalOptions","createUi","pathExists","input","readFile","resolve","Table","Command","Command","getGlobalOptions","Table","resolve","readFile","readFile","readdir","resolve","Table","Command","Command","parseInteger","getGlobalOptions","readContributionLogs","Table","formatInteger","resolve","readdir","isFileNotFoundError","readFile","chalk","Chalk","Table","Command","ora","Command","parseInteger","getGlobalOptions","createUi","loadOptionalConfig","resolveRepoInput","createSpinner","Chalk","chalk","ora","Table","truncate","formatInteger","chalk","Chalk","Table","Command","ora","Command","parseInteger","getGlobalOptions","createUi","loadOptionalConfig","resolveProviderId","resolveBudget","resolveRepoInput","createSpinner","buildScannerList","formatInteger","Table","truncate","selectScannersFromConfig","estimateTaskMap","Chalk","chalk","ora","input","formatInteger","truncate","chalk","Chalk","Table","Command","ora","Command","parseInteger","getGlobalOptions","createUi","normalizeOutputFormat","loadOptionalConfig","resolveRepoInput","createSpinner","Table","truncate","Chalk","chalk","ora","readFile","resolve","Command","getGlobalOptions","isFileNotFoundError","isRecord","Command"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
OacError,
|
|
3
3
|
executionError
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-5TSIEP6T.js";
|
|
5
5
|
|
|
6
6
|
// src/execution/agents/claude-code.adapter.ts
|
|
7
7
|
import { createInterface } from "readline";
|
|
@@ -832,6 +832,27 @@ var CodexAdapter = class {
|
|
|
832
832
|
}
|
|
833
833
|
);
|
|
834
834
|
this.runningExecutions.set(params.executionId, subprocess);
|
|
835
|
+
const processStdoutLine = (line) => {
|
|
836
|
+
const payload = parseJsonPayload2(line);
|
|
837
|
+
const tokenEvent = parseTokenEvent2(line, payload, tokenState);
|
|
838
|
+
if (tokenEvent?.type === "tokens") {
|
|
839
|
+
eventQueue.push(tokenEvent);
|
|
840
|
+
}
|
|
841
|
+
if (!payload) return;
|
|
842
|
+
const fileEvent = parseFileEditFromPayload2(payload);
|
|
843
|
+
if (fileEvent) {
|
|
844
|
+
filesChanged.add(fileEvent.path);
|
|
845
|
+
eventQueue.push(fileEvent);
|
|
846
|
+
}
|
|
847
|
+
const toolEvent = parseToolUseFromPayload(payload);
|
|
848
|
+
if (toolEvent) {
|
|
849
|
+
eventQueue.push(toolEvent);
|
|
850
|
+
}
|
|
851
|
+
const errorEvent = parseErrorFromPayload(payload);
|
|
852
|
+
if (errorEvent) {
|
|
853
|
+
eventQueue.push(errorEvent);
|
|
854
|
+
}
|
|
855
|
+
};
|
|
835
856
|
const consumeStream = async (stream, streamName) => {
|
|
836
857
|
if (!stream) {
|
|
837
858
|
return;
|
|
@@ -841,38 +862,11 @@ var CodexAdapter = class {
|
|
|
841
862
|
crlfDelay: Number.POSITIVE_INFINITY
|
|
842
863
|
});
|
|
843
864
|
for await (const line of lineReader) {
|
|
844
|
-
eventQueue.push({
|
|
845
|
-
type: "output",
|
|
846
|
-
content: line,
|
|
847
|
-
stream: streamName
|
|
848
|
-
});
|
|
865
|
+
eventQueue.push({ type: "output", content: line, stream: streamName });
|
|
849
866
|
if (streamName === "stdout") {
|
|
850
|
-
|
|
851
|
-
const tokenEvent = parseTokenEvent2(line, payload, tokenState);
|
|
852
|
-
if (tokenEvent?.type === "tokens") {
|
|
853
|
-
eventQueue.push(tokenEvent);
|
|
854
|
-
}
|
|
855
|
-
if (payload) {
|
|
856
|
-
const fileEvent = parseFileEditFromPayload2(payload);
|
|
857
|
-
if (fileEvent) {
|
|
858
|
-
filesChanged.add(fileEvent.path);
|
|
859
|
-
eventQueue.push(fileEvent);
|
|
860
|
-
}
|
|
861
|
-
const toolEvent = parseToolUseFromPayload(payload);
|
|
862
|
-
if (toolEvent) {
|
|
863
|
-
eventQueue.push(toolEvent);
|
|
864
|
-
}
|
|
865
|
-
const errorEvent = parseErrorFromPayload(payload);
|
|
866
|
-
if (errorEvent) {
|
|
867
|
-
eventQueue.push(errorEvent);
|
|
868
|
-
}
|
|
869
|
-
}
|
|
867
|
+
processStdoutLine(line);
|
|
870
868
|
} else if (/error|failed|exception/i.test(line)) {
|
|
871
|
-
eventQueue.push({
|
|
872
|
-
type: "error",
|
|
873
|
-
message: line.trim(),
|
|
874
|
-
recoverable: true
|
|
875
|
-
});
|
|
869
|
+
eventQueue.push({ type: "error", message: line.trim(), recoverable: true });
|
|
876
870
|
}
|
|
877
871
|
}
|
|
878
872
|
};
|
|
@@ -987,9 +981,12 @@ import { simpleGit } from "simple-git";
|
|
|
987
981
|
var worktreeLock = Promise.resolve();
|
|
988
982
|
function withWorktreeLock(fn) {
|
|
989
983
|
const next = worktreeLock.then(fn, fn);
|
|
990
|
-
worktreeLock = next.then(
|
|
991
|
-
|
|
992
|
-
|
|
984
|
+
worktreeLock = next.then(
|
|
985
|
+
() => {
|
|
986
|
+
},
|
|
987
|
+
() => {
|
|
988
|
+
}
|
|
989
|
+
);
|
|
993
990
|
return next;
|
|
994
991
|
}
|
|
995
992
|
function getWorktreePath(repoPath, branchName) {
|
|
@@ -1167,6 +1164,57 @@ async function executeTask(agent, task, sandbox, eventBus, options = {}) {
|
|
|
1167
1164
|
throw normalizeExecutionError(error, task, executionId);
|
|
1168
1165
|
}
|
|
1169
1166
|
}
|
|
1167
|
+
function buildEpicPrompt(epic) {
|
|
1168
|
+
const lines = [
|
|
1169
|
+
"You are implementing a coherent set of changes as a single epic.",
|
|
1170
|
+
`Epic: ${epic.title}`,
|
|
1171
|
+
`Scope: ${epic.scope} module`,
|
|
1172
|
+
"",
|
|
1173
|
+
"Description:",
|
|
1174
|
+
epic.description,
|
|
1175
|
+
"",
|
|
1176
|
+
`Subtasks (${epic.subtasks.length}):`
|
|
1177
|
+
];
|
|
1178
|
+
for (let i = 0; i < epic.subtasks.length; i++) {
|
|
1179
|
+
const task = epic.subtasks[i];
|
|
1180
|
+
const files = task.targetFiles.length > 0 ? ` [${task.targetFiles.join(", ")}]` : "";
|
|
1181
|
+
lines.push(` ${i + 1}. ${task.title}${files}`);
|
|
1182
|
+
if (task.description) {
|
|
1183
|
+
lines.push(` ${task.description}`);
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
if (epic.contextFiles.length > 0) {
|
|
1187
|
+
lines.push(
|
|
1188
|
+
"",
|
|
1189
|
+
"Context files to read for understanding:",
|
|
1190
|
+
...epic.contextFiles.map((f) => ` - ${f}`)
|
|
1191
|
+
);
|
|
1192
|
+
}
|
|
1193
|
+
lines.push(
|
|
1194
|
+
"",
|
|
1195
|
+
"Instructions:",
|
|
1196
|
+
"- Apply all changes in a single coherent commit.",
|
|
1197
|
+
"- Ensure the repository remains buildable after changes.",
|
|
1198
|
+
"- Address all subtasks listed above."
|
|
1199
|
+
);
|
|
1200
|
+
return lines.join("\n");
|
|
1201
|
+
}
|
|
1202
|
+
function epicAsTask(epic) {
|
|
1203
|
+
const allTargetFiles = [...new Set(epic.subtasks.flatMap((t) => t.targetFiles))];
|
|
1204
|
+
return {
|
|
1205
|
+
id: epic.id,
|
|
1206
|
+
source: epic.subtasks[0]?.source ?? "custom",
|
|
1207
|
+
title: epic.title,
|
|
1208
|
+
description: buildEpicPrompt(epic),
|
|
1209
|
+
targetFiles: allTargetFiles,
|
|
1210
|
+
priority: epic.priority,
|
|
1211
|
+
complexity: epic.subtasks.length >= 7 ? "complex" : epic.subtasks.length >= 4 ? "moderate" : "simple",
|
|
1212
|
+
executionMode: "new-pr",
|
|
1213
|
+
metadata: { epicId: epic.id, subtaskCount: epic.subtasks.length },
|
|
1214
|
+
discoveredAt: epic.createdAt,
|
|
1215
|
+
parentEpicId: void 0
|
|
1216
|
+
};
|
|
1217
|
+
}
|
|
1170
1218
|
|
|
1171
1219
|
// src/execution/engine.ts
|
|
1172
1220
|
import { randomUUID as randomUUID2 } from "crypto";
|
|
@@ -1493,7 +1541,9 @@ export {
|
|
|
1493
1541
|
CodexAdapter,
|
|
1494
1542
|
createSandbox,
|
|
1495
1543
|
executeTask,
|
|
1544
|
+
buildEpicPrompt,
|
|
1545
|
+
epicAsTask,
|
|
1496
1546
|
isTransientError,
|
|
1497
1547
|
ExecutionEngine
|
|
1498
1548
|
};
|
|
1499
|
-
//# sourceMappingURL=chunk-
|
|
1549
|
+
//# sourceMappingURL=chunk-VJW7RNZI.js.map
|