@open330/oac 2026.221.2 → 2026.222.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/cli.ts","../src/cli/commands/analyze.ts","../src/cli/github-auth.ts","../src/cli/helpers.ts","../src/cli/config-loader.ts","../src/cli/commands/completion.ts","../src/cli/commands/doctor.ts","../src/cli/commands/explain.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/index.ts","../src/cli/commands/run/pipeline.ts","../src/cli/commands/run/epic.ts","../src/cli/commands/run/pr.ts","../src/cli/commands/run/types.ts","../src/cli/commands/run/task.ts","../src/cli/commands/run/tracking.ts","../src/cli/commands/run/retry.ts","../src/cli/commands/scan.ts","../src/cli/commands/status.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nimport { createAnalyzeCommand } from \"./commands/analyze.js\";\nimport { createCompletionCommand } from \"./commands/completion.js\";\nimport { createDoctorCommand } from \"./commands/doctor.js\";\nimport { createExplainCommand } from \"./commands/explain.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/index.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 quiet?: 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 program.addCommand(createCompletionCommand());\n program.addCommand(createExplainCommand());\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(\"--quiet\", \"Suppress non-error output\", false)\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .option(\"--no-color\", \"Disable ANSI colors\");\n\n registerCommands(program);\n\n program.addHelpText(\n \"after\",\n \"\\nGetting Started:\\n $ oac init Set up your project configuration\\n $ oac doctor Verify your environment is ready\\n $ oac analyze Analyze codebase for contribution opportunities\\n $ oac run Run the full contribution pipeline\\n\\nDocumentation: https://github.com/Open330/open-agent-contribution\\n\",\n );\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 type { ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\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 { buildScanners } from \"../../discovery/index.js\";\nimport { cloneRepo, resolveRepo } from \"../../repo/index.js\";\nimport { ensureGitHubAuth } from \"../github-auth.js\";\n\nimport {\n createSpinner,\n createUi,\n getGlobalOptions,\n loadOptionalConfig,\n resolveRepoInput,\n truncate,\n} from \"../helpers.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(\"Deep codebase analysis — build module graph and group findings into epics\")\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 command.addHelpText(\n \"after\",\n `\\nAnalyze walks the source tree, builds a module dependency graph, runs all\nscanners, and groups findings into epics persisted to .oac/context/.\nFor a quick flat task list without persistence, use \\`oac scan\\`.\n\\`oac run\\` auto-analyzes by default — you only need this command to\ninspect or force-refresh the analysis independently.\n\nExamples:\n $ oac analyze --repo owner/repo\n $ oac analyze --repo owner/repo --force\n $ oac analyze --repo owner/repo --format json`,\n );\n\n return command;\n}\n\n// ── Helpers ───────────────────────────────────────────────────\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\nfunction buildScannerList(config: OacConfig | null, hasGitHubAuth: boolean) {\n return buildScanners(config, hasGitHubAuth).instances;\n}\n","import { execFileSync, spawnSync } 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 * Minimum required scopes:\n * - **repo** — read/write access to repository contents, issues, and PRs.\n * This single scope covers all OAC operations: cloning private repos,\n * creating branches, pushing commits, and opening pull requests.\n *\n * Note: `gh auth status` outputs scope info to stderr, so we use spawnSync\n * to capture both stdout and stderr without spawning a shell.\n */\nexport function checkGitHubScopes(required: string[] = [\"repo\"]): string[] {\n try {\n // gh auth status writes scope info to stderr, so we use spawnSync\n // to capture both stdout and stderr without spawning a shell.\n const result = spawnSync(\"gh\", [\"auth\", \"status\"], {\n timeout: 5_000,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const combined = `${result.stdout ?? \"\"}${result.stderr ?? \"\"}`;\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 chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport type { Command } from \"commander\";\nimport ora, { type Ora } from \"ora\";\nimport PQueue from \"p-queue\";\n\nimport { estimateTokens } from \"../budget/index.js\";\nimport type { OacConfig, Task, TokenEstimate } from \"../core/index.js\";\nexport type { GlobalCliOptions } from \"./cli.js\";\nimport type { GlobalCliOptions } from \"./cli.js\";\nimport { loadOptionalConfigFile } from \"./config-loader.js\";\n\n// ── Global options ──────────────────────────────────────────\n\nexport function 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 quiet: options.quiet === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\n// ── UI helpers ──────────────────────────────────────────────\n\nexport function 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\n/**\n * Creates a spinner when output is interactive (non-JSON / non-quiet).\n * Pass `true` to suppress the spinner (e.g. in JSON output or quiet mode).\n */\nexport function createSpinner(suppress: boolean, text: string): Ora | null {\n if (suppress) {\n return null;\n }\n\n return ora({ text, color: \"blue\" }).start();\n}\n\n// ── Parsing helpers ─────────────────────────────────────────\n\nexport function 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\n// ── Formatting helpers ──────────────────────────────────────\n\nexport function formatInteger(value: number): string {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nexport { truncate } from \"../core/utils.js\";\n\n// ── Config helpers ──────────────────────────────────────────\n\nexport async 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\nexport function 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(\n \"No repository specified.\\n\\n\" +\n \" Quick start: oac run --repo owner/repo\\n\" +\n \" With config: oac init (creates oac.config.ts, then just run `oac run`)\\n\",\n );\n}\n\nexport function resolveProviderId(\n providerOption: string | undefined,\n config: OacConfig | null,\n): string {\n const fromFlag = providerOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n return config?.provider.id ?? \"claude-code\";\n}\n\nexport function 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\n// ── Estimation helpers ──────────────────────────────────────\n\nexport async function estimateTaskMap(\n tasks: Task[],\n providerId: string,\n onProgress?: (completed: number, total: number) => void,\n): Promise<Map<string, TokenEstimate>> {\n let completed = 0;\n const total = tasks.length;\n const queue = new PQueue({ concurrency: 10 });\n\n const entries = await Promise.all(\n tasks.map(\n (task) =>\n queue.add(async () => {\n const estimate = await estimateTokens(task, providerId);\n completed += 1;\n onProgress?.(completed, total);\n return [task.id, estimate] as const;\n }) as Promise<readonly [string, TokenEstimate]>,\n ),\n );\n\n return new Map(entries);\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 DEFINE_CONFIG_IMPORT = /@(?:open330\\/oac(?:-core)?|oac\\/core)/;\nconst 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 // Node < 22.6: can't import .ts files directly → ERR_UNKNOWN_FILE_EXTENSION\n if ((error as NodeJS.ErrnoException).code === \"ERR_UNKNOWN_FILE_EXTENSION\") {\n return true;\n }\n\n // Node >= 22.6: strips types but can't resolve the @open330/oac package\n return DEFINE_CONFIG_IMPORT.test(error.message);\n}\n\nfunction transformLegacyDefineConfigSource(source: string): string | null {\n if (!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(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 { Command } from \"commander\";\n\nconst SUBCOMMANDS = [\n \"init\",\n \"analyze\",\n \"doctor\",\n \"scan\",\n \"plan\",\n \"run\",\n \"log\",\n \"leaderboard\",\n \"status\",\n \"completion\",\n];\n\nconst GLOBAL_OPTIONS = [\n \"--config\",\n \"--verbose\",\n \"--quiet\",\n \"--json\",\n \"--no-color\",\n \"--help\",\n \"--version\",\n];\n\nconst COMMAND_OPTIONS: Record<string, string[]> = {\n run: [\n \"--repo\",\n \"--tokens\",\n \"--provider\",\n \"--concurrency\",\n \"--dry-run\",\n \"--mode\",\n \"--max-tasks\",\n \"--timeout\",\n \"--source\",\n \"--retry-failed\",\n ],\n scan: [\"--repo\", \"--scanners\", \"--max-findings\"],\n analyze: [\"--repo\"],\n plan: [\"--repo\", \"--tokens\", \"--provider\", \"--max-tasks\"],\n log: [\"--limit\", \"--repo\", \"--source\", \"--since\"],\n leaderboard: [\"--limit\", \"--repo\", \"--format\"],\n status: [\"--watch\"],\n init: [],\n doctor: [],\n};\n\nfunction generateBash(): string {\n const cmds = SUBCOMMANDS.join(\" \");\n const global = GLOBAL_OPTIONS.join(\" \");\n const cases = Object.entries(COMMAND_OPTIONS)\n .map(([cmd, opts]) => {\n const all = [...opts, ...GLOBAL_OPTIONS].join(\" \");\n return ` ${cmd}) COMPREPLY=( $(compgen -W \"${all}\" -- \"$cur\") ) ;;`;\n })\n .join(\"\\n\");\n\n return `# bash completion for oac\n_oac_completions() {\n local cur prev cmds\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n cmds=\"${cmds}\"\n\n if [[ \\${COMP_CWORD} -eq 1 ]]; then\n COMPREPLY=( $(compgen -W \"$cmds ${global}\" -- \"$cur\") )\n return\n fi\n\n case \"\\${COMP_WORDS[1]}\" in\n${cases}\n *) COMPREPLY=( $(compgen -W \"${global}\" -- \"$cur\") ) ;;\n esac\n}\ncomplete -F _oac_completions oac`;\n}\n\nfunction generateZsh(): string {\n const cmds = SUBCOMMANDS.map((c) => `'${c}:${c} command'`).join(\" \");\n const cases = Object.entries(COMMAND_OPTIONS)\n .map(([cmd, opts]) => {\n const flags = [...opts, ...GLOBAL_OPTIONS].map((o) => `'${o}'`).join(\" \");\n return ` ${cmd}) _arguments ${flags} ;;`;\n })\n .join(\"\\n\");\n\n return `#compdef oac\n_oac() {\n local -a commands\n commands=(${cmds})\n\n _arguments '1:command:->cmds' '*::arg:->args'\n\n case \"$state\" in\n cmds) _describe 'command' commands ;;\n args)\n case \"\\${words[1]}\" in\n${cases}\n esac\n ;;\n esac\n}\n_oac \"$@\"`;\n}\n\nfunction generateFish(): string {\n const lines: string[] = [\"# fish completion for oac\"];\n for (const cmd of SUBCOMMANDS) {\n lines.push(`complete -c oac -n '__fish_use_subcommand' -a '${cmd}' -d '${cmd} command'`);\n }\n for (const opt of GLOBAL_OPTIONS) {\n const long = opt.replace(/^--/, \"\");\n lines.push(`complete -c oac -l '${long}'`);\n }\n for (const [cmd, opts] of Object.entries(COMMAND_OPTIONS)) {\n for (const opt of opts) {\n const long = opt.replace(/^--/, \"\");\n lines.push(`complete -c oac -n '__fish_seen_subcommand_from ${cmd}' -l '${long}'`);\n }\n }\n return lines.join(\"\\n\");\n}\n\ntype Shell = \"bash\" | \"zsh\" | \"fish\";\n\nexport function createCompletionCommand(): Command {\n const command = new Command(\"completion\");\n\n command\n .description(\"Generate shell completion scripts\")\n .argument(\"<shell>\", \"Shell type: bash, zsh, or fish\")\n .action((shell: string) => {\n const generators: Record<Shell, () => string> = {\n bash: generateBash,\n zsh: generateZsh,\n fish: generateFish,\n };\n const gen = generators[shell as Shell];\n if (!gen) {\n throw new Error(`Unsupported shell \"${shell}\". Supported: bash, zsh, fish`);\n }\n console.log(gen());\n });\n\n command.addHelpText(\n \"after\",\n `\\nExamples:\n $ oac completion bash >> ~/.bashrc\n $ oac completion zsh >> ~/.zshrc\n $ oac completion fish > ~/.config/fish/completions/oac.fish`,\n );\n\n return command;\n}\n","import type { ChalkInstance } from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { createUi, getGlobalOptions } from \"../helpers.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 command.addHelpText(\n \"after\",\n `\\nExamples:\n $ oac doctor`,\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 codexCheck = await checkCodexCli();\n checks.push(codexCheck);\n\n const opencodeResult = await runCommand(\"opencode\", [\"--version\"]);\n const opencodeVersion = extractVersion(opencodeResult.stdout) ?? \"--\";\n checks.push({\n id: \"opencode\",\n name: \"OpenCode CLI\",\n requirement: \"installed\",\n value: opencodeVersion,\n status: opencodeResult.ok ? \"pass\" : \"fail\",\n message: opencodeResult.ok ? undefined : explainCommandFailure(\"opencode\", opencodeResult),\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\n/**\n * Codex CLI v0.104+ is a native TUI binary. The Homebrew installation lacks\n * sibling helper binaries and hangs in headless mode. OAC invokes Codex via\n * `npx @openai/codex` which bundles everything needed. Check that path.\n */\nasync function checkCodexCli(): Promise<DoctorCheck> {\n // Preferred: check via npx which is how OAC actually invokes Codex\n const npxResult = await runCommand(\"npx\", [\"--yes\", \"@openai/codex\", \"--version\"]);\n if (npxResult.ok) {\n const version = extractVersion(npxResult.stdout) ?? \"--\";\n return {\n id: \"codex\",\n name: \"Codex CLI\",\n requirement: \"installed (npm)\",\n value: version,\n status: \"pass\",\n };\n }\n\n // npx failed — try bare codex as a secondary signal\n const codexResult = await runCommand(\"codex\", [\"--version\"]);\n if (codexResult.ok) {\n const version = extractVersion(codexResult.stdout) ?? \"--\";\n return {\n id: \"codex\",\n name: \"Codex CLI\",\n requirement: \"installed (npm)\",\n value: version,\n status: \"warn\",\n message:\n \"Codex binary found but npm package not available. \" +\n \"OAC requires the npm package: npm install -g @openai/codex\",\n };\n }\n\n return {\n id: \"codex\",\n name: \"Codex CLI\",\n requirement: \"installed (npm)\",\n value: \"--\",\n status: \"fail\",\n message: \"Codex CLI not found. Install via: npm install -g @openai/codex\",\n };\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\nasync function runCommand(command: string, args: string[]): Promise<CommandResult> {\n try {\n const { execa } = await import(\"execa\");\n const result = await execa(command, args, {\n reject: false,\n timeout: 10_000,\n stdin: \"ignore\",\n });\n return {\n ok: result.exitCode === 0,\n exitCode: result.exitCode ?? null,\n stdout: result.stdout,\n stderr: result.stderr,\n };\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n return {\n ok: false,\n exitCode: null,\n stdout: \"\",\n stderr: \"\",\n errorCode: nodeError.code,\n errorMessage: nodeError.message,\n };\n }\n}\n","import { resolve } from \"node:path\";\n\nimport { Command } from \"commander\";\n\nimport { loadBacklog, loadContext } from \"../../discovery/index.js\";\nimport { createUi, getGlobalOptions, loadOptionalConfig } from \"../helpers.js\";\n\nexport function createExplainCommand(): Command {\n const command = new Command(\"explain\");\n\n command\n .description(\"Explain why a task or epic was selected and what the agent would do\")\n .argument(\"<id>\", \"Task or epic ID (from scan / analyze / run --dry-run output)\")\n .action(async (id: string, _options, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n const config = await loadOptionalConfig(globalOptions.config, globalOptions.verbose, ui);\n const contextDir = config?.analyze?.contextDir;\n\n const repoPath = resolve(process.cwd());\n\n // Load persisted analysis results\n const [context, backlog] = await Promise.all([\n loadContext(repoPath, contextDir),\n loadBacklog(repoPath, contextDir),\n ]);\n\n if (!context && !backlog) {\n const message = \"No analysis context found. Run `oac analyze` first.\";\n if (globalOptions.json) {\n console.log(JSON.stringify({ error: message }, null, 2));\n } else {\n console.error(ui.red(message));\n }\n process.exitCode = 1;\n return;\n }\n\n // Search findings\n const finding = context?.qualityReport.findings.find(\n (f) => f.title === id || f.filePath === id,\n );\n\n // Search epics\n const epic = backlog?.epics.find(\n (e) => e.id === id || e.title.toLowerCase().includes(id.toLowerCase()),\n );\n\n if (!finding && !epic) {\n const message = `No task or epic matching \"${id}\" found in the analysis context.`;\n if (globalOptions.json) {\n console.log(JSON.stringify({ error: message, id }, null, 2));\n } else {\n console.error(ui.red(message));\n console.log(\"\");\n printAvailableIds(ui, context, backlog);\n }\n process.exitCode = 1;\n return;\n }\n\n if (globalOptions.json) {\n console.log(JSON.stringify({ finding: finding ?? null, epic: epic ?? null }, null, 2));\n return;\n }\n\n if (epic) {\n console.log(ui.bold(\"Epic\"));\n console.log(` ${ui.blue(\"ID:\")} ${epic.id}`);\n console.log(` ${ui.blue(\"Title:\")} ${epic.title}`);\n console.log(` ${ui.blue(\"Scope:\")} ${epic.scope}`);\n console.log(` ${ui.blue(\"Priority:\")} ${epic.priority}`);\n console.log(` ${ui.blue(\"Status:\")} ${epic.status}`);\n console.log(` ${ui.blue(\"Tasks:\")} ${epic.subtasks.length}`);\n console.log(\"\");\n console.log(ui.dim(\"Description:\"));\n console.log(` ${epic.description}`);\n if (epic.subtasks.length > 0) {\n console.log(\"\");\n console.log(ui.dim(\"Task IDs:\"));\n for (const subtask of epic.subtasks) {\n console.log(` - ${subtask.id}`);\n }\n }\n }\n\n if (finding) {\n if (epic) console.log(\"\");\n console.log(ui.bold(\"Finding\"));\n console.log(` ${ui.blue(\"Title:\")} ${finding.title}`);\n console.log(` ${ui.blue(\"Source:\")} ${finding.source.replace(/-/g, \" \")}`);\n console.log(` ${ui.blue(\"Scanner:\")} ${finding.scannerId}`);\n console.log(` ${ui.blue(\"Severity:\")} ${colorSeverity(ui, finding.severity)}`);\n console.log(` ${ui.blue(\"Complexity:\")} ${finding.complexity}`);\n console.log(` ${ui.blue(\"File:\")} ${finding.filePath}`);\n if (finding.module) {\n console.log(` ${ui.blue(\"Module:\")} ${finding.module}`);\n }\n if (finding.line) {\n console.log(` ${ui.blue(\"Line:\")} ${finding.line}`);\n }\n console.log(\"\");\n console.log(ui.dim(\"Description:\"));\n console.log(` ${finding.description}`);\n console.log(\"\");\n console.log(ui.dim(\"What the agent would do:\"));\n console.log(\" 1. Check out a clean branch for this task\");\n console.log(\n ` 2. Open ${finding.filePath}${finding.line ? ` at line ${finding.line}` : \"\"}`,\n );\n console.log(\" 3. Apply the fix described above\");\n console.log(\" 4. Run tests and linters to verify\");\n console.log(\" 5. Create a PR with the changes\");\n }\n });\n\n command.addHelpText(\n \"after\",\n `\\nExamples:\n $ oac explain \"Add tests for client.ts\"\n $ oac explain src/lib/client.ts`,\n );\n\n return command;\n}\n\nfunction colorSeverity(\n ui: import(\"chalk\").ChalkInstance,\n severity: \"info\" | \"warning\" | \"error\",\n): string {\n if (severity === \"error\") return ui.red(severity);\n if (severity === \"warning\") return ui.yellow(severity);\n return ui.green(severity);\n}\n\nfunction printAvailableIds(\n ui: import(\"chalk\").ChalkInstance,\n context: Awaited<ReturnType<typeof loadContext>>,\n backlog: Awaited<ReturnType<typeof loadBacklog>>,\n): void {\n const findings = context?.qualityReport.findings ?? [];\n const epics = backlog?.epics ?? [];\n\n if (findings.length > 0) {\n console.log(ui.dim(`Available findings (${findings.length}):`));\n for (const f of findings.slice(0, 8)) {\n console.log(` - ${f.title}`);\n }\n if (findings.length > 8) console.log(ui.dim(` ... and ${findings.length - 8} more`));\n }\n\n if (epics.length > 0) {\n console.log(ui.dim(`Available epics (${epics.length}):`));\n for (const e of epics.slice(0, 8)) {\n console.log(` - ${e.id}: ${e.title}`);\n }\n if (epics.length > 8) console.log(ui.dim(` ... and ${epics.length - 8} more`));\n }\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { checkbox, confirm, input } from \"@inquirer/prompts\";\nimport type { ChalkInstance } from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { type GlobalCliOptions, createUi, getGlobalOptions } from \"../helpers.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\n .description(\"Initialize OAC in the current directory\")\n .option(\"--minimal\", \"Generate a bare-bones config without the interactive wizard\")\n .option(\"--repo <owner/repo>\", \"Repository in owner/repo format (required with --minimal)\")\n .action(async (options: { minimal?: boolean; repo?: string }, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n\n if (options.minimal) {\n await runMinimalInit(options, globalOptions, ui);\n return;\n }\n\n await runInteractiveInit(globalOptions, ui);\n });\n\n command.addHelpText(\n \"after\",\n `\\nExamples:\n $ oac init Interactive wizard\n $ oac init --minimal --repo owner/repo Quick start with defaults`,\n );\n\n return command;\n}\n\nasync function runMinimalInit(\n options: { repo?: string },\n globalOptions: Required<GlobalCliOptions>,\n ui: ChalkInstance,\n): Promise<void> {\n const repoInput = options.repo?.trim();\n if (!repoInput || !isValidRepoInput(repoInput)) {\n const message = \"--repo is required with --minimal (e.g. --repo owner/repo)\";\n if (globalOptions.json) {\n console.log(JSON.stringify({ error: message }, null, 2));\n } else {\n console.error(ui.red(message));\n }\n process.exitCode = 1;\n return;\n }\n\n const repo = normalizeRepoInput(repoInput);\n const provider: ProviderId = \"claude-code\";\n const budgetTokens = 100_000;\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 message =\n \"oac.config.ts already exists. Remove it first or run `oac init` without --minimal.\";\n if (globalOptions.json) {\n console.log(JSON.stringify({ cancelled: true, reason: message }, null, 2));\n } else {\n console.log(ui.yellow(message));\n }\n return;\n }\n\n const configContent = buildConfigFile({\n provider,\n providers: [provider],\n budgetTokens,\n repo,\n });\n\n await writeFile(configPath, configContent, \"utf8\");\n await mkdir(trackingDirectory, { recursive: true });\n await ensureGitignoreEntry(process.cwd(), \".oac/\");\n\n const summary: InitSummary = {\n configPath,\n trackingDirectory,\n provider,\n providers: [provider],\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 run` to start the full pipeline, or `oac doctor` to verify setup.\");\n}\n\nasync function runInteractiveInit(\n globalOptions: Required<GlobalCliOptions>,\n ui: ChalkInstance,\n): Promise<void> {\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\", value: \"opencode\" },\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 await ensureGitignoreEntry(process.cwd(), \".oac/\");\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 run` to start the full pipeline, or `oac doctor` to verify setup.\");\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 `import { defineConfig } from \"@open330/oac\";\n\nexport default defineConfig({\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\n/**\n * Ensures a given entry (e.g. \".oac/\") exists in the project's .gitignore.\n * Creates the file if it doesn't exist; appends the entry if missing.\n */\nasync function ensureGitignoreEntry(dir: string, entry: string): Promise<void> {\n const gitignorePath = resolve(dir, \".gitignore\");\n let content = \"\";\n try {\n content = await readFile(gitignorePath, \"utf8\");\n } catch {\n // .gitignore doesn't exist yet — will be created\n }\n\n if (content.split(\"\\n\").some((line) => line.trim() === entry)) {\n return;\n }\n\n const separator = content.length > 0 && !content.endsWith(\"\\n\") ? \"\\n\" : \"\";\n await writeFile(gitignorePath, `${content}${separator}${entry}\\n`, \"utf8\");\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 { isRecord } from \"../../core/utils.js\";\nimport { type ContributionLog, contributionLogSchema } from \"../../tracking/index.js\";\n\nimport { formatInteger, getGlobalOptions, parseInteger } from \"../helpers.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 command.addHelpText(\n \"after\",\n `\\nExamples:\n $ oac leaderboard\n $ oac leaderboard --limit 20 --sort tokens`,\n );\n\n return command;\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 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 { formatInteger, getGlobalOptions, parseInteger } from \"../helpers.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 command.addHelpText(\n \"after\",\n `\\nExamples:\n $ oac log\n $ oac log --limit 10 --repo owner/repo\n $ oac log --source lint --since 2025-01-01`,\n );\n\n return command;\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 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 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 type { ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\nimport { buildExecutionPlan } from \"../../budget/index.js\";\nimport type { OacConfig } 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 {\n createSpinner,\n createUi,\n estimateTaskMap,\n formatInteger,\n getGlobalOptions,\n loadOptionalConfig,\n parseInteger,\n resolveBudget,\n resolveProviderId,\n resolveRepoInput,\n truncate,\n} from \"../helpers.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 issueLabels: config?.discovery.issueLabels,\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 command.addHelpText(\n \"after\",\n `\\nExamples:\n $ oac plan --repo owner/repo --tokens 100000\n $ oac plan --repo owner/repo --provider codex`,\n );\n\n return command;\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\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","import { Command } from \"commander\";\nimport { UNLIMITED_BUDGET } from \"../../../core/index.js\";\nimport { createUi, getGlobalOptions, parseInteger } from \"../../helpers.js\";\nimport { runPipeline, validateRunOptions } from \"./pipeline.js\";\nimport type { RunCommandOptions } from \"./types.js\";\n\nfunction parseTokens(value: string): number {\n if (value.toLowerCase() === \"unlimited\") {\n return UNLIMITED_BUDGET;\n }\n return parseInteger(value);\n}\n\nexport function createRunCommand(): Command {\n const command = new Command(\"run\");\n\n command\n .alias(\"r\")\n .description(\"Run the full OAC pipeline — analyze, plan, and execute in one command\")\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 .option(\"--retry-failed\", \"Re-run only failed tasks from the most recent run\", false)\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 command.addHelpText(\n \"after\",\n `\\nThis is the primary command. It auto-analyzes the codebase, groups findings\ninto epics, and executes them — no separate scan/analyze step required.\n\nIf no oac.config.ts exists, pass --repo to get started immediately:\n $ oac run --repo owner/repo\n\nExamples:\n $ oac run --repo owner/repo --tokens 50000\n $ oac run --repo owner/repo --provider codex --concurrency 4\n $ oac run --repo owner/repo --dry-run\n $ oac run --repo owner/repo --source lint --max-tasks 10\n $ oac run --repo owner/repo --retry-failed\n\nExit Codes:\n 0 All tasks/epics completed successfully (or dry-run)\n 1 Unexpected / unhandled error\n 2 Configuration or validation error (bad flags, missing repo)\n 3 All selected tasks/epics failed\n 4 Partial success — some tasks succeeded, others failed`,\n );\n\n return command;\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { OacConfig } from \"../../../core/index.js\";\nimport { cloneRepo, resolveRepo } from \"../../../repo/index.js\";\nimport { checkGitHubScopes, ensureGitHubAuth } from \"../../github-auth.js\";\nimport {\n type GlobalCliOptions,\n createSpinner,\n loadOptionalConfig,\n resolveBudget,\n resolveProviderId,\n resolveRepoInput,\n} from \"../../helpers.js\";\nimport { runEpicPipeline, tryLoadOrAnalyzeEpics } from \"./epic.js\";\nimport { runRetryPipeline } from \"./retry.js\";\nimport {\n discoverTasks,\n executePlan,\n printDryRunSummary,\n printEmptySummary,\n printFinalSummary,\n} from \"./task.js\";\nimport { writeTracking } from \"./tracking.js\";\nimport type { PipelineContext, RunCommandOptions, RunMode } from \"./types.js\";\nimport {\n ConfigError,\n DEFAULT_CONCURRENCY,\n DEFAULT_TIMEOUT_SECONDS,\n formatBudgetDisplay,\n resolveExitCode,\n} from \"./types.js\";\n\nexport async function runPipeline(\n options: RunCommandOptions,\n globalOptions: Required<GlobalCliOptions>,\n ui: import(\"chalk\").ChalkInstance,\n): Promise<void> {\n const ctx: PipelineContext = {\n options,\n globalOptions,\n ui,\n outputJson: globalOptions.json,\n suppressOutput: globalOptions.json || globalOptions.quiet,\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.suppressOutput, \"Resolving repository...\");\n const resolvedRepo = await resolveRepo(repoInput);\n resolveSpinner?.succeed(`Resolved ${resolvedRepo.fullName}`);\n\n const cloneSpinner = createSpinner(ctx.suppressOutput, \"Preparing local clone...\");\n await cloneRepo(resolvedRepo);\n cloneSpinner?.succeed(`Repository ready at ${resolvedRepo.localPath}`);\n\n // ── Retry-failed shortcut ──────────────────────────────────\n if (options.retryFailed) {\n const retryResults = await runRetryPipeline(ctx, {\n resolvedRepo,\n providerId,\n totalBudget,\n concurrency,\n timeoutSeconds,\n mode,\n ghToken,\n });\n process.exitCode = resolveExitCode(retryResults);\n return;\n }\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 const epicResults = 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 process.exitCode = resolveExitCode(epicResults);\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 process.exitCode = resolveExitCode(completedTasks);\n}\n\nfunction printGitHubAuthWarnings(ctx: PipelineContext, ghToken: string | undefined): void {\n if (ctx.suppressOutput) 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.suppressOutput) return;\n console.log(\n ctx.ui.blue(\n `Starting OAC run (budget: ${formatBudgetDisplay(totalBudget)} tokens, concurrency: ${concurrency})`,\n ),\n );\n}\n\nexport function validateRunOptions(options: RunCommandOptions): void {\n if (typeof options.concurrency === \"number\" && options.concurrency <= 0) {\n throw new ConfigError(\"--concurrency must be greater than zero.\");\n }\n\n if (typeof options.timeout === \"number\" && options.timeout <= 0) {\n throw new ConfigError(\"--timeout must be greater than zero.\");\n }\n\n if (typeof options.maxTasks === \"number\" && options.maxTasks <= 0) {\n throw new ConfigError(\"--max-tasks must be greater than zero when provided.\");\n }\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 ConfigError(`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 ConfigError(\"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 ConfigError(\"Timeout must be a positive integer.\");\n }\n\n return Math.floor(configuredTimeout);\n}\n","import type { ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport PQueue from \"p-queue\";\nimport { buildEpicExecutionPlan, estimateEpicTokens } from \"../../../budget/index.js\";\nimport type { Epic, OacConfig, TokenEstimate } from \"../../../core/index.js\";\nimport {\n analyzeCodebase,\n buildScanners,\n createBacklog,\n getPendingEpics,\n groupFindingsIntoEpics,\n isContextStale,\n loadBacklog,\n loadContext,\n persistBacklog,\n persistContext,\n updateBacklog,\n} from \"../../../discovery/index.js\";\nimport { epicAsTask } from \"../../../execution/index.js\";\nimport type { resolveRepo } from \"../../../repo/index.js\";\nimport { createSpinner, formatInteger, truncate } from \"../../helpers.js\";\nimport { createPullRequest } from \"./pr.js\";\nimport { executeWithAgent, resolveAdapter } from \"./task.js\";\nimport { writeTracking } from \"./tracking.js\";\nimport type { PipelineContext, RunMode, TaskRunResult } from \"./types.js\";\nimport { formatBudgetDisplay, formatDuration } from \"./types.js\";\n\nexport async 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.suppressOutput) {\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.suppressOutput, \"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.suppressOutput, \"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.suppressOutput, \"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\n/** @deprecated Use {@link buildScanners} from discovery/scanner-factory instead. */\nexport function buildScannerList(config: OacConfig | null, hasGitHubAuth: boolean) {\n return buildScanners(config, hasGitHubAuth).instances;\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: import(\"../../../execution/index.js\").AgentProvider;\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, resolvedRepo, providerId, timeoutSeconds, mode, ghToken } = params;\n const task = epicAsTask(entry.epic);\n const estimate = makeStubEstimate(task.id, providerId, entry.estimatedTokens);\n\n const result = await executeWithAgent({\n task,\n estimate,\n adapter,\n repoPath: resolvedRepo.localPath,\n baseBranch: resolvedRepo.meta.defaultBranch,\n timeoutSeconds,\n });\n const { execution, sandbox } = result;\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\nexport async 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<TaskRunResult[]> {\n const {\n epics,\n resolvedRepo,\n providerId,\n totalBudget,\n concurrency,\n timeoutSeconds,\n mode,\n ghToken,\n contextDir,\n } = params;\n\n // Estimate tokens for each epic\n const estimateSpinner = createSpinner(\n ctx.suppressOutput,\n `Estimating tokens for ${epics.length} epic(s)...`,\n );\n let estimatedCount = 0;\n for (const epic of epics) {\n if (epic.estimatedTokens === 0) {\n epic.estimatedTokens = await estimateEpicTokens(epic, providerId);\n }\n estimatedCount += 1;\n if (estimateSpinner) {\n const pct = Math.round((estimatedCount / epics.length) * 100);\n estimateSpinner.text = `Estimating epic tokens... (${estimatedCount}/${epics.length} — ${pct}%)`;\n }\n }\n estimateSpinner?.succeed(\"Epic token estimation completed\");\n\n const epicPlan = buildEpicExecutionPlan(epics, totalBudget);\n\n if (!ctx.suppressOutput) {\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 selected epics concurrently\n const { adapter } = await resolveAdapter(providerId);\n\n let epicCompletedCount = 0;\n const epicTotal = epicPlan.selectedEpics.length;\n const executionSpinner = createSpinner(ctx.suppressOutput, `Executing ${epicTotal} epic(s)...`);\n\n const epicQueue = new PQueue({ concurrency });\n const allTaskResults = await Promise.all(\n epicPlan.selectedEpics.map(\n (entry) =>\n epicQueue.add(async (): Promise<TaskRunResult> => {\n if (!ctx.suppressOutput) {\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 resolvedRepo,\n providerId,\n timeoutSeconds,\n mode,\n ghToken,\n });\n\n epicCompletedCount += 1;\n if (executionSpinner) {\n const pct = Math.round((epicCompletedCount / epicTotal) * 100);\n executionSpinner.text = `Executing epics... (${epicCompletedCount}/${epicTotal} — ${pct}%)`;\n }\n\n if (!ctx.suppressOutput) {\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 return result;\n }) as Promise<TaskRunResult>,\n ),\n );\n executionSpinner?.succeed(\"Epic execution finished\");\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 return allTaskResults;\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 // Surface failed epic details without requiring --verbose\n const failedEpics = results.filter((t) => !t.execution.success);\n if (failedEpics.length > 0) {\n console.log(\"\");\n console.log(ctx.ui.red(`Failed Epics (${failedEpics.length}):`));\n for (const t of failedEpics) {\n const reason = t.execution.error ? `: ${truncate(t.execution.error, 120)}` : \"\";\n console.log(` ${ctx.ui.red(\"✗\")} ${truncate(t.task.title, 60)}${reason}`);\n }\n }\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","import { execa } from \"execa\";\nimport type { Task } from \"../../../core/index.js\";\nimport type { ExecutionOutcome, SandboxInfo, TaskRunResult } from \"./types.js\";\nimport { PR_CREATION_TIMEOUT_MS } from \"./types.js\";\n\nconst GITHUB_API_BASE_URL = \"https://api.github.com\";\nconst OAC_PR_TITLE_PREFIX = \"[OAC]\";\n\nexport async function createPullRequest(input: {\n task: Task;\n execution: ExecutionOutcome;\n sandbox?: SandboxInfo;\n repoFullName: string;\n baseBranch: string;\n ghToken?: string;\n}): Promise<TaskRunResult[\"pr\"] | undefined> {\n if (!input.sandbox) {\n return undefined;\n }\n\n const { branchName, sandboxPath } = input.sandbox;\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 // Pre-PR guard: skip if another OAC instance already created a PR for this issue\n if (input.task.linkedIssue && input.ghToken) {\n const duplicate = await findExistingOacPR(\n input.repoFullName,\n input.task.linkedIssue.number,\n input.ghToken,\n );\n if (duplicate) {\n console.warn(\n `[oac] Skipping PR: existing OAC PR #${duplicate} already targets issue #${input.task.linkedIssue.number}`,\n );\n return undefined;\n }\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 timeout: PR_CREATION_TIMEOUT_MS,\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, timeout: PR_CREATION_TIMEOUT_MS },\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\n/**\n * Pre-PR guard: checks for an existing open OAC pull request targeting\n * the given issue number. Returns the PR number if found.\n */\nasync function findExistingOacPR(\n repoFullName: string,\n issueNumber: number,\n token: string,\n): Promise<number | undefined> {\n const url = `${GITHUB_API_BASE_URL}/repos/${repoFullName}/pulls?state=open&per_page=100&sort=updated&direction=desc`;\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: \"application/vnd.github.v3+json\",\n },\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!response.ok) {\n return undefined;\n }\n\n const pulls: unknown = await response.json();\n if (!Array.isArray(pulls)) {\n return undefined;\n }\n\n const issueRefPattern = /(?:Fixes|Closes|Resolves)\\s+#(\\d+)/gi;\n for (const pr of pulls) {\n if (!pr || typeof pr !== \"object\") continue;\n\n const record = pr as Record<string, unknown>;\n const title = typeof record.title === \"string\" ? record.title : \"\";\n if (!title.startsWith(OAC_PR_TITLE_PREFIX)) continue;\n\n const prNumber = typeof record.number === \"number\" ? record.number : undefined;\n const body = typeof record.body === \"string\" ? record.body : \"\";\n\n for (const match of body.matchAll(issueRefPattern)) {\n const num = Number.parseInt(match[1], 10);\n if (num === issueNumber) {\n return prNumber;\n }\n }\n }\n\n return undefined;\n } catch {\n // Guard failure should not block PR creation.\n return undefined;\n }\n}\n","import type { ChalkInstance } from \"chalk\";\nimport type { Task, TokenEstimate } from \"../../../core/index.js\";\nimport { UNLIMITED_BUDGET } from \"../../../core/index.js\";\nimport type { GlobalCliOptions } from \"../../helpers.js\";\nimport { formatInteger } from \"../../helpers.js\";\n\nexport interface 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 retryFailed?: boolean;\n}\n\nexport interface SandboxInfo {\n branchName: string;\n sandboxPath: string;\n cleanup: () => Promise<void>;\n}\n\nexport type RunMode = \"new-pr\" | \"update-pr\" | \"direct-commit\";\nexport type SupportedScanner = \"lint\" | \"todo\" | \"github-issues\" | \"test-gap\";\nexport type CompletionStatus = \"success\" | \"partial\" | \"failed\";\n\nexport interface ExecutionOutcome {\n success: boolean;\n exitCode: number;\n totalTokensUsed: number;\n filesChanged: string[];\n duration: number;\n error?: string;\n}\n\nexport interface 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\nexport interface 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\nexport const DEFAULT_TIMEOUT_SECONDS = 300;\nexport const DEFAULT_CONCURRENCY = 2;\n/** Timeout for git push / gh pr create operations (2 minutes). */\nexport const PR_CREATION_TIMEOUT_MS = 120_000;\n\n// ── Config / validation error ────────────────────────────────\n\n/** Thrown for configuration or validation problems so the CLI can set a distinct exit code. */\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigError\";\n }\n}\n\n// ── Exit codes ───────────────────────────────────────────────\n/** All tasks/epics completed successfully (or dry-run / nothing to do). */\nexport const EXIT_SUCCESS = 0;\n/** Unhandled / unexpected error. */\nexport const EXIT_GENERAL_ERROR = 1;\n/** Configuration or validation error (invalid flags, missing repo, bad config). */\nexport const EXIT_CONFIG_ERROR = 2;\n/** Every selected task/epic failed. */\nexport const EXIT_ALL_FAILED = 3;\n/** At least one task/epic succeeded but others failed. */\nexport const EXIT_PARTIAL_SUCCESS = 4;\n\n/**\n * Derive the appropriate exit code from a set of execution results.\n * Returns EXIT_SUCCESS when there are no results (dry-run, empty discovery).\n */\nexport function resolveExitCode(results: TaskRunResult[]): number {\n if (results.length === 0) return EXIT_SUCCESS;\n const succeeded = results.filter((r) => r.execution.success).length;\n if (succeeded === results.length) return EXIT_SUCCESS;\n if (succeeded === 0) return EXIT_ALL_FAILED;\n return EXIT_PARTIAL_SUCCESS;\n}\n\nexport interface PipelineContext {\n options: RunCommandOptions;\n globalOptions: Required<GlobalCliOptions>;\n ui: ChalkInstance;\n outputJson: boolean;\n /** True when interactive output should be suppressed (--json or --quiet). */\n suppressOutput: boolean;\n runId: string;\n runStartedAt: number;\n}\n\nexport function formatBudgetDisplay(budget: number): string {\n if (budget >= UNLIMITED_BUDGET) {\n return \"unlimited\";\n }\n return formatInteger(budget);\n}\n\nexport function 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","import type { ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { execa } from \"execa\";\nimport PQueue from \"p-queue\";\nimport { buildExecutionPlan } from \"../../../budget/index.js\";\nimport type { OacConfig, Task, TokenEstimate } from \"../../../core/index.js\";\nimport { createEventBus } from \"../../../core/index.js\";\nimport { type ScannerName, buildScanners, rankTasks } from \"../../../discovery/index.js\";\nimport {\n type AgentProvider,\n adapterRegistry,\n createSandbox,\n executeTask as workerExecuteTask,\n} from \"../../../execution/index.js\";\nimport type { resolveRepo } from \"../../../repo/index.js\";\nimport {\n createSpinner,\n estimateTaskMap,\n formatInteger,\n resolveBudget,\n resolveProviderId,\n truncate,\n} from \"../../helpers.js\";\nimport { createPullRequest } from \"./pr.js\";\nimport type {\n ExecutionOutcome,\n PipelineContext,\n RunCommandOptions,\n RunMode,\n RunSummaryOutput,\n SandboxInfo,\n TaskRunResult,\n} from \"./types.js\";\nimport { formatBudgetDisplay, formatDuration } from \"./types.js\";\n\nexport async 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.suppressOutput,\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 issueLabels: config?.discovery.issueLabels,\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.suppressOutput,\n `Estimating tokens for ${candidateTasks.length} task(s)...`,\n );\n const estimates =\n candidateTasks.length > 0\n ? await estimateTaskMap(\n candidateTasks,\n resolveProviderId(options.provider, config),\n (done, total) => {\n if (estimateSpinner) {\n const pct = Math.round((done / total) * 100);\n estimateSpinner.text = `Estimating tokens... (${done}/${total} — ${pct}%)`;\n }\n },\n )\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\nexport function 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\nexport function 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 renderDryRunDiff(ctx.ui, plan);\n console.log(ctx.ui.blue(\"Dry run complete. No tasks were executed.\"));\n }\n}\n\nfunction renderDryRunDiff(ui: ChalkInstance, plan: ReturnType<typeof buildExecutionPlan>): void {\n if (plan.selectedTasks.length === 0) return;\n\n console.log(ui.bold(\"Planned changes:\"));\n console.log(\"\");\n\n for (const entry of plan.selectedTasks) {\n const { task } = entry;\n const sourceLabel = task.source.replace(/-/g, \" \");\n const complexityColor =\n task.complexity === \"trivial\" || task.complexity === \"simple\"\n ? ui.green\n : task.complexity === \"moderate\"\n ? ui.yellow\n : ui.red;\n\n console.log(`${ui.green(\"+\")} ${ui.bold(task.title)}`);\n console.log(\n ` ${ui.dim(`source: ${sourceLabel} complexity: `)}${complexityColor(task.complexity)}`,\n );\n\n if (task.targetFiles.length > 0) {\n for (const file of task.targetFiles.slice(0, 5)) {\n console.log(` ${ui.yellow(\"~\")} ${file}`);\n }\n if (task.targetFiles.length > 5) {\n console.log(` ${ui.dim(` ... and ${task.targetFiles.length - 5} more files`)}`);\n }\n }\n\n if (task.description) {\n const preview =\n task.description.length > 120 ? `${task.description.slice(0, 117)}...` : task.description;\n console.log(` ${ui.dim(preview)}`);\n }\n console.log(\"\");\n }\n}\n\nexport async 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 } = await resolveAdapter(providerId);\n\n if (!ctx.suppressOutput && ctx.globalOptions.verbose) {\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 }\n\n const executionSpinner = createSpinner(\n ctx.suppressOutput,\n `Executing ${plan.selectedTasks.length} planned task(s)...`,\n );\n let completedCount = 0;\n\n const taskQueue = new PQueue({ concurrency });\n const executedTasks = await Promise.all(\n plan.selectedTasks.map(\n (entry) =>\n taskQueue.add(async (): Promise<TaskRunResult> => {\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 const { execution, sandbox } = result;\n\n completedCount += 1;\n if (executionSpinner) {\n const total = plan.selectedTasks.length;\n const pct = Math.round((completedCount / total) * 100);\n executionSpinner.text = `Executing tasks... (${completedCount}/${total} — ${pct}%)`;\n }\n\n return { task: entry.task, estimate: entry.estimate, execution, sandbox };\n }) as Promise<TaskRunResult>,\n ),\n );\n\n executionSpinner?.succeed(\"Execution stage finished\");\n\n const completionSpinner = createSpinner(ctx.suppressOutput, \"Completing task outputs...\");\n const completionQueue = new PQueue({ concurrency });\n const completedTasks = await Promise.all(\n executedTasks.map(\n (result) =>\n completionQueue.add(async (): 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 }) as Promise<TaskRunResult>,\n ),\n );\n completionSpinner?.succeed(\"Completion stage finished\");\n\n return completedTasks;\n}\n\nexport function 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 if (!ctx.globalOptions.quiet) {\n renderTaskResults(ctx.ui, completedTasks);\n }\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 // Surface failed task details without requiring --verbose\n const failedTasks = completedTasks.filter((t) => !t.execution.success);\n if (failedTasks.length > 0) {\n console.log(\"\");\n console.log(ctx.ui.red(`Failed Tasks (${failedTasks.length}):`));\n for (const t of failedTasks) {\n const reason = t.execution.error ? `: ${truncate(t.execution.error, 120)}` : \"\";\n console.log(` ${ctx.ui.red(\"✗\")} ${truncate(t.task.title, 60)}${reason}`);\n }\n }\n}\n\nexport function selectScannersFromConfig(config: OacConfig | null, hasGitHubAuth: boolean) {\n const { names, composite } = buildScanners(config, hasGitHubAuth);\n return { enabled: names, scanner: composite };\n}\n\nexport async 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 // Also detects changes the agent committed itself (e.g. Claude Code).\n const commitResult = await commitSandboxChanges(sandbox.path, input.task, input.baseBranch);\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, input.baseBranch);\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 commitSandboxChanges(\n sandboxPath: string,\n task: Task,\n baseBranch: string,\n): Promise<{ hasChanges: boolean; filesChanged: string[] }> {\n try {\n // Stage and commit any uncommitted changes (staged + unstaged + untracked)\n const statusResult = await execa(\"git\", [\"status\", \"--porcelain\"], { cwd: sandboxPath });\n if (statusResult.stdout.trim()) {\n await execa(\"git\", [\"add\", \"-A\"], { cwd: sandboxPath });\n await execa(\n \"git\",\n [\"commit\", \"-m\", `[OAC] ${task.title}\\n\\nAutomated contribution by OAC.`],\n { cwd: sandboxPath },\n );\n }\n\n // Detect ALL changes vs the base branch — covers both OAC-committed and\n // agent-committed changes (e.g. Claude Code with --dangerously-skip-permissions\n // can commit directly during execution).\n const diffResult = await execa(\n \"git\",\n [\"diff\", \"--name-only\", `origin/${baseBranch}`, \"HEAD\"],\n { cwd: sandboxPath },\n );\n const changedFiles = diffResult.stdout.trim().split(\"\\n\").filter(Boolean);\n\n return { hasChanges: changedFiles.length > 0, filesChanged: changedFiles };\n } catch {\n return { hasChanges: false, filesChanged: [] };\n }\n}\n\nexport async function resolveAdapter(providerId: string): Promise<{ adapter: AgentProvider }> {\n const normalizedId = adapterRegistry.resolveId(providerId);\n const factory = adapterRegistry.get(providerId);\n\n if (!factory) {\n const supported = adapterRegistry.registeredIds().join(\", \");\n throw new Error(\n `Unknown provider \"${providerId}\". Supported providers: ${supported}.\\nRun \\`oac doctor\\` to check your environment setup.`,\n );\n }\n\n const adapter = factory();\n const availability = await adapter.checkAvailability();\n if (!availability.available) {\n throw new Error(\n `Agent CLI \"${normalizedId}\" is not available: ${availability.error ?? \"unknown reason\"}.\\nInstall the ${normalizedId} CLI or switch providers.\\nRun \\`oac doctor\\` for setup instructions.`,\n );\n }\n\n return { adapter };\n}\n\nexport function 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\nexport function 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","import type { Task } from \"../../../core/index.js\";\nimport type { ContributionLog } from \"../../../tracking/index.js\";\nimport { writeContributionLog } from \"../../../tracking/index.js\";\nimport { createSpinner } from \"../../helpers.js\";\nimport type {\n CompletionStatus,\n ExecutionOutcome,\n PipelineContext,\n TaskRunResult,\n} from \"./types.js\";\n\nexport async function writeTracking(\n ctx: PipelineContext,\n params: {\n resolvedRepo: {\n localPath: string;\n fullName: string;\n git: { headSha: string };\n meta: { defaultBranch: string };\n owner: string;\n };\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.suppressOutput, \"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.suppressOutput) {\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\nexport function 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\nexport function 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\nexport function 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\nexport function 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","import { readFile, readdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { buildExecutionPlan } from \"../../../budget/index.js\";\nimport type { Task } from \"../../../core/index.js\";\nimport type { resolveRepo } from \"../../../repo/index.js\";\nimport {\n type ContributionLog,\n type ContributionTask,\n contributionLogSchema,\n} from \"../../../tracking/index.js\";\nimport { createSpinner, estimateTaskMap, formatInteger } from \"../../helpers.js\";\nimport { executePlan, printFinalSummary } from \"./task.js\";\nimport { writeTracking } from \"./tracking.js\";\nimport type { PipelineContext, RunMode, TaskRunResult } from \"./types.js\";\n\nasync function readMostRecentContributionLog(\n repoPath: string,\n): Promise<ContributionLog | undefined> {\n const contributionsPath = resolve(repoPath, \".oac\", \"contributions\");\n\n let entries: string[];\n try {\n const dirEntries = await readdir(contributionsPath, { withFileTypes: true, encoding: \"utf8\" });\n entries = dirEntries\n .filter((e) => e.isFile() && e.name.endsWith(\".json\"))\n .map((e) => e.name)\n .sort((a, b) => b.localeCompare(a)); // most recent first (filenames are timestamped)\n } catch {\n return undefined;\n }\n\n for (const fileName of entries) {\n try {\n const content = await readFile(resolve(contributionsPath, fileName), \"utf8\");\n const parsed = contributionLogSchema.safeParse(JSON.parse(content));\n if (parsed.success) return parsed.data;\n } catch {}\n }\n\n return undefined;\n}\n\nfunction taskFromContributionEntry(entry: ContributionTask): Task {\n return {\n id: entry.taskId,\n source: entry.source as Task[\"source\"],\n title: entry.title,\n description: `Retry of failed task: ${entry.title}`,\n targetFiles: entry.filesChanged,\n priority: 100, // high priority — user explicitly chose to retry\n complexity: entry.complexity as Task[\"complexity\"],\n executionMode: \"new-pr\",\n metadata: { retryOf: entry.taskId },\n discoveredAt: new Date().toISOString(),\n };\n}\n\nexport async function runRetryPipeline(\n ctx: PipelineContext,\n params: {\n resolvedRepo: Awaited<ReturnType<typeof resolveRepo>>;\n providerId: string;\n totalBudget: number;\n concurrency: number;\n timeoutSeconds: number;\n mode: RunMode;\n ghToken?: string;\n },\n): Promise<TaskRunResult[]> {\n const { resolvedRepo, providerId, totalBudget, concurrency, timeoutSeconds, mode, ghToken } =\n params;\n\n const retrySpinner = createSpinner(ctx.suppressOutput, \"Loading most recent contribution log...\");\n const log = await readMostRecentContributionLog(resolvedRepo.localPath);\n\n if (!log) {\n retrySpinner?.fail(\"No contribution logs found in .oac/contributions/\");\n if (!ctx.suppressOutput) {\n console.log(\n ctx.ui.yellow(\"[oac] Run the pipeline at least once before using --retry-failed.\"),\n );\n }\n return [];\n }\n\n const failedEntries = log.tasks.filter((t) => t.status === \"failed\");\n if (failedEntries.length === 0) {\n retrySpinner?.succeed(\"No failed tasks in the most recent run — nothing to retry.\");\n return [];\n }\n\n retrySpinner?.succeed(\n `Found ${failedEntries.length} failed task(s) from run ${log.runId.slice(0, 8)}`,\n );\n\n const retryTasks = failedEntries.map(taskFromContributionEntry);\n const estimates = await estimateTaskMap(retryTasks, providerId);\n const plan = buildExecutionPlan(retryTasks, estimates, totalBudget);\n\n if (plan.selectedTasks.length === 0) {\n if (!ctx.suppressOutput) {\n console.log(ctx.ui.yellow(\"[oac] No retry tasks could be selected within the budget.\"));\n }\n return [];\n }\n\n if (!ctx.suppressOutput) {\n console.log(\n ctx.ui.blue(\n `\\n[oac] Retrying ${plan.selectedTasks.length} failed task(s) (budget: ${formatInteger(totalBudget)} tokens)`,\n ),\n );\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: retryTasks,\n completedTasks,\n });\n\n printFinalSummary(ctx, {\n plan,\n resolvedRepo,\n providerId,\n totalBudget,\n completedTasks,\n });\n\n return completedTasks;\n}\n","import type { ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\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 {\n createSpinner,\n createUi,\n getGlobalOptions,\n loadOptionalConfig,\n parseInteger,\n resolveRepoInput,\n truncate,\n} from \"../helpers.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(\"Quick task discovery — list individual issues ranked by priority\")\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 issueLabels: config?.discovery.issueLabels,\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 command.addHelpText(\n \"after\",\n `\\nScan runs lightweight scanners and outputs a flat list of ranked tasks.\nFor deeper analysis that groups findings into epics, use \\`oac analyze\\`.\nTo run the full pipeline (analyze + execute), use \\`oac run\\`.\n\nExamples:\n $ oac scan --repo owner/repo\n $ oac scan --repo owner/repo --scanners lint,todo\n $ oac scan --repo owner/repo --min-priority 50 --format json`,\n );\n\n return command;\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\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 if (config.discovery.scanners.testGap) {\n configured.push(\"test-gap\");\n }\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","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { Command } from \"commander\";\n\nimport { isRecord } from \"../../core/utils.js\";\nimport { getGlobalOptions } from \"../helpers.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 const intervalId = 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 process.on(\"SIGINT\", () => {\n clearInterval(intervalId);\n console.log(\"\\nWatch mode stopped.\");\n process.exit(0);\n });\n });\n\n command.addHelpText(\n \"after\",\n `\\nExamples:\n $ oac status\n $ oac status --watch`,\n );\n\n return command;\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 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","Command","Command","Command","execa","resolve","Command","Command","resolve","fsConstants","access","readFile","resolve","Command","Command","resolve","pathExists","input","access","fsConstants","readFile","readFile","resolve","Table","Command","Command","Table","resolve","readFile","readFile","readdir","resolve","Table","Command","Command","readContributionLogs","Table","resolve","readdir","isFileNotFoundError","readFile","Table","Command","Command","Table","Command","Table","PQueue","input","Table","execa","PQueue","selectScannersFromConfig","PQueue","input","execa","Table","input","buildScannerList","PQueue","Table","readFile","readdir","resolve","resolve","readdir","readFile","Command","Table","Command","Command","normalizeOutputFormat","Table","readFile","resolve","Command","Command","resolve","readFile","isFileNotFoundError","Command"]}
@@ -55,4 +55,4 @@ export {
55
55
  truncate,
56
56
  isRecord
57
57
  };
58
- //# sourceMappingURL=chunk-6A37SKAJ.js.map
58
+ //# sourceMappingURL=chunk-JDFAJP45.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/memory.ts","../src/core/utils.ts"],"sourcesContent":["/**\n * Memory pressure monitoring utilities.\n *\n * Provides lightweight heap-usage checks that callers can use to\n * throttle work when the process is approaching memory limits.\n */\n\n/** Default threshold: pause work when heap usage exceeds 85% of the limit. */\nconst DEFAULT_PRESSURE_RATIO = 0.85;\n\nexport interface MemorySnapshot {\n heapUsedMB: number;\n heapTotalMB: number;\n rssUsedMB: number;\n /** Ratio of heapUsed / heapTotal (0–1). */\n heapPressure: number;\n /** True when heapPressure exceeds the configured threshold. */\n isUnderPressure: boolean;\n}\n\n/**\n * Take a snapshot of current memory usage.\n *\n * @param pressureRatio - Threshold ratio (0–1) above which `isUnderPressure`\n * is set to `true`. Defaults to 0.85.\n */\nexport function getMemorySnapshot(pressureRatio = DEFAULT_PRESSURE_RATIO): MemorySnapshot {\n const mem = process.memoryUsage();\n const heapUsedMB = mem.heapUsed / 1_048_576;\n const heapTotalMB = mem.heapTotal / 1_048_576;\n const rssUsedMB = mem.rss / 1_048_576;\n const heapPressure = mem.heapTotal > 0 ? mem.heapUsed / mem.heapTotal : 0;\n\n return {\n heapUsedMB: Math.round(heapUsedMB * 10) / 10,\n heapTotalMB: Math.round(heapTotalMB * 10) / 10,\n rssUsedMB: Math.round(rssUsedMB * 10) / 10,\n heapPressure: Math.round(heapPressure * 1000) / 1000,\n isUnderPressure: heapPressure >= pressureRatio,\n };\n}\n\n/**\n * Creates a monitor that periodically checks memory pressure and calls\n * `onPressure` when the threshold is exceeded. The monitor can be used\n * to pause a PQueue or reduce concurrency under load.\n *\n * Returns a `stop` function to clear the interval.\n */\nexport function createMemoryMonitor(options: {\n /** Polling interval in milliseconds (default: 5 000). */\n intervalMs?: number;\n /** Heap pressure ratio threshold (default: 0.85). */\n pressureRatio?: number;\n /** Called when heap pressure exceeds the threshold. */\n onPressure: (snapshot: MemorySnapshot) => void;\n /** Called when heap pressure drops back below the threshold. */\n onRelief?: (snapshot: MemorySnapshot) => void;\n}): { stop: () => void } {\n const intervalMs = options.intervalMs ?? 5_000;\n const pressureRatio = options.pressureRatio ?? DEFAULT_PRESSURE_RATIO;\n let wasPressured = false;\n\n const timer = setInterval(() => {\n const snapshot = getMemorySnapshot(pressureRatio);\n\n if (snapshot.isUnderPressure && !wasPressured) {\n wasPressured = true;\n options.onPressure(snapshot);\n } else if (!snapshot.isUnderPressure && wasPressured) {\n wasPressured = false;\n options.onRelief?.(snapshot);\n }\n }, intervalMs);\n\n // Unref so this doesn't keep the process alive\n if (typeof timer === \"object\" && \"unref\" in timer) {\n timer.unref();\n }\n\n return {\n stop() {\n clearInterval(timer);\n },\n };\n}\n\n","/**\n * Shared utility functions used across the codebase.\n */\n\n/**\n * Truncate a string to `maxLength`, appending an ellipsis when trimmed.\n * Defaults to the unicode ellipsis `\"…\"` (1 char). Pass `\"...\"` for the\n * three-dot ASCII variant.\n */\nexport function truncate(\n value: string,\n maxLength: number,\n ellipsis = \"…\",\n): string {\n if (value.length <= maxLength) {\n return value;\n }\n return `${value.slice(0, Math.max(0, maxLength - ellipsis.length))}${ellipsis}`;\n}\n\n/**\n * Type guard: returns `true` when `value` is a non-null object\n * (i.e.\\ a `Record<string, unknown>`).\n */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n"],"mappings":";AAQA,IAAM,yBAAyB;AAkBxB,SAAS,kBAAkB,gBAAgB,wBAAwC;AACxF,QAAM,MAAM,QAAQ,YAAY;AAChC,QAAM,aAAa,IAAI,WAAW;AAClC,QAAM,cAAc,IAAI,YAAY;AACpC,QAAM,YAAY,IAAI,MAAM;AAC5B,QAAM,eAAe,IAAI,YAAY,IAAI,IAAI,WAAW,IAAI,YAAY;AAExE,SAAO;AAAA,IACL,YAAY,KAAK,MAAM,aAAa,EAAE,IAAI;AAAA,IAC1C,aAAa,KAAK,MAAM,cAAc,EAAE,IAAI;AAAA,IAC5C,WAAW,KAAK,MAAM,YAAY,EAAE,IAAI;AAAA,IACxC,cAAc,KAAK,MAAM,eAAe,GAAI,IAAI;AAAA,IAChD,iBAAiB,gBAAgB;AAAA,EACnC;AACF;AASO,SAAS,oBAAoB,SASX;AACvB,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,MAAI,eAAe;AAEnB,QAAM,QAAQ,YAAY,MAAM;AAC9B,UAAM,WAAW,kBAAkB,aAAa;AAEhD,QAAI,SAAS,mBAAmB,CAAC,cAAc;AAC7C,qBAAe;AACf,cAAQ,WAAW,QAAQ;AAAA,IAC7B,WAAW,CAAC,SAAS,mBAAmB,cAAc;AACpD,qBAAe;AACf,cAAQ,WAAW,QAAQ;AAAA,IAC7B;AAAA,EACF,GAAG,UAAU;AAGb,MAAI,OAAO,UAAU,YAAY,WAAW,OAAO;AACjD,UAAM,MAAM;AAAA,EACd;AAEA,SAAO;AAAA,IACL,OAAO;AACL,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AACF;;;AC5EO,SAAS,SACd,OACA,WACA,WAAW,UACH;AACR,MAAI,MAAM,UAAU,WAAW;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,YAAY,SAAS,MAAM,CAAC,CAAC,GAAG,QAAQ;AAC/E;AAMO,SAAS,SAAS,OAAkD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;","names":[]}
1
+ {"version":3,"sources":["../src/core/memory.ts","../src/core/utils.ts"],"sourcesContent":["/**\n * Memory pressure monitoring utilities.\n *\n * Provides lightweight heap-usage checks that callers can use to\n * throttle work when the process is approaching memory limits.\n */\n\n/** Default threshold: pause work when heap usage exceeds 85% of the limit. */\nconst DEFAULT_PRESSURE_RATIO = 0.85;\n\nexport interface MemorySnapshot {\n heapUsedMB: number;\n heapTotalMB: number;\n rssUsedMB: number;\n /** Ratio of heapUsed / heapTotal (0–1). */\n heapPressure: number;\n /** True when heapPressure exceeds the configured threshold. */\n isUnderPressure: boolean;\n}\n\n/**\n * Take a snapshot of current memory usage.\n *\n * @param pressureRatio - Threshold ratio (0–1) above which `isUnderPressure`\n * is set to `true`. Defaults to 0.85.\n */\nexport function getMemorySnapshot(pressureRatio = DEFAULT_PRESSURE_RATIO): MemorySnapshot {\n const mem = process.memoryUsage();\n const heapUsedMB = mem.heapUsed / 1_048_576;\n const heapTotalMB = mem.heapTotal / 1_048_576;\n const rssUsedMB = mem.rss / 1_048_576;\n const heapPressure = mem.heapTotal > 0 ? mem.heapUsed / mem.heapTotal : 0;\n\n return {\n heapUsedMB: Math.round(heapUsedMB * 10) / 10,\n heapTotalMB: Math.round(heapTotalMB * 10) / 10,\n rssUsedMB: Math.round(rssUsedMB * 10) / 10,\n heapPressure: Math.round(heapPressure * 1000) / 1000,\n isUnderPressure: heapPressure >= pressureRatio,\n };\n}\n\n/**\n * Creates a monitor that periodically checks memory pressure and calls\n * `onPressure` when the threshold is exceeded. The monitor can be used\n * to pause a PQueue or reduce concurrency under load.\n *\n * Returns a `stop` function to clear the interval.\n */\nexport function createMemoryMonitor(options: {\n /** Polling interval in milliseconds (default: 5 000). */\n intervalMs?: number;\n /** Heap pressure ratio threshold (default: 0.85). */\n pressureRatio?: number;\n /** Called when heap pressure exceeds the threshold. */\n onPressure: (snapshot: MemorySnapshot) => void;\n /** Called when heap pressure drops back below the threshold. */\n onRelief?: (snapshot: MemorySnapshot) => void;\n}): { stop: () => void } {\n const intervalMs = options.intervalMs ?? 5_000;\n const pressureRatio = options.pressureRatio ?? DEFAULT_PRESSURE_RATIO;\n let wasPressured = false;\n\n const timer = setInterval(() => {\n const snapshot = getMemorySnapshot(pressureRatio);\n\n if (snapshot.isUnderPressure && !wasPressured) {\n wasPressured = true;\n options.onPressure(snapshot);\n } else if (!snapshot.isUnderPressure && wasPressured) {\n wasPressured = false;\n options.onRelief?.(snapshot);\n }\n }, intervalMs);\n\n // Unref so this doesn't keep the process alive\n if (typeof timer === \"object\" && \"unref\" in timer) {\n timer.unref();\n }\n\n return {\n stop() {\n clearInterval(timer);\n },\n };\n}\n","/**\n * Shared utility functions used across the codebase.\n */\n\n/**\n * Truncate a string to `maxLength`, appending an ellipsis when trimmed.\n * Defaults to the unicode ellipsis `\"…\"` (1 char). Pass `\"...\"` for the\n * three-dot ASCII variant.\n */\nexport function truncate(value: string, maxLength: number, ellipsis = \"…\"): string {\n if (value.length <= maxLength) {\n return value;\n }\n return `${value.slice(0, Math.max(0, maxLength - ellipsis.length))}${ellipsis}`;\n}\n\n/**\n * Type guard: returns `true` when `value` is a non-null object\n * (i.e.\\ a `Record<string, unknown>`).\n */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":";AAQA,IAAM,yBAAyB;AAkBxB,SAAS,kBAAkB,gBAAgB,wBAAwC;AACxF,QAAM,MAAM,QAAQ,YAAY;AAChC,QAAM,aAAa,IAAI,WAAW;AAClC,QAAM,cAAc,IAAI,YAAY;AACpC,QAAM,YAAY,IAAI,MAAM;AAC5B,QAAM,eAAe,IAAI,YAAY,IAAI,IAAI,WAAW,IAAI,YAAY;AAExE,SAAO;AAAA,IACL,YAAY,KAAK,MAAM,aAAa,EAAE,IAAI;AAAA,IAC1C,aAAa,KAAK,MAAM,cAAc,EAAE,IAAI;AAAA,IAC5C,WAAW,KAAK,MAAM,YAAY,EAAE,IAAI;AAAA,IACxC,cAAc,KAAK,MAAM,eAAe,GAAI,IAAI;AAAA,IAChD,iBAAiB,gBAAgB;AAAA,EACnC;AACF;AASO,SAAS,oBAAoB,SASX;AACvB,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,MAAI,eAAe;AAEnB,QAAM,QAAQ,YAAY,MAAM;AAC9B,UAAM,WAAW,kBAAkB,aAAa;AAEhD,QAAI,SAAS,mBAAmB,CAAC,cAAc;AAC7C,qBAAe;AACf,cAAQ,WAAW,QAAQ;AAAA,IAC7B,WAAW,CAAC,SAAS,mBAAmB,cAAc;AACpD,qBAAe;AACf,cAAQ,WAAW,QAAQ;AAAA,IAC7B;AAAA,EACF,GAAG,UAAU;AAGb,MAAI,OAAO,UAAU,YAAY,WAAW,OAAO;AACjD,UAAM,MAAM;AAAA,EACd;AAEA,SAAO;AAAA,IACL,OAAO;AACL,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AACF;;;AC5EO,SAAS,SAAS,OAAe,WAAmB,WAAW,UAAa;AACjF,MAAI,MAAM,UAAU,WAAW;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,YAAY,SAAS,MAAM,CAAC,CAAC,GAAG,QAAQ;AAC/E;AAMO,SAAS,SAAS,OAAkD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;","names":[]}