@open330/oac 2026.3.5 → 2026.3.6

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.
@@ -1669,21 +1669,35 @@ async function createPullRequest(input2) {
1669
1669
  env: ghEnv
1670
1670
  });
1671
1671
  const prTitle = `[OAC] ${input2.task.title}`;
1672
- const prBody = [
1672
+ const prBodyLines = [
1673
1673
  "## Summary",
1674
1674
  "",
1675
1675
  input2.task.description || `Automated contribution for task "${input2.task.title}".`,
1676
- "",
1676
+ ""
1677
+ ];
1678
+ if (input2.task.linkedIssue) {
1679
+ prBodyLines.push(
1680
+ `Closes #${input2.task.linkedIssue.number}`,
1681
+ ""
1682
+ );
1683
+ }
1684
+ prBodyLines.push(
1677
1685
  "## Context",
1678
1686
  "",
1679
1687
  `- **Task source:** ${input2.task.source}`,
1680
1688
  `- **Complexity:** ${input2.task.complexity}`,
1681
1689
  `- **Tokens used:** ${input2.execution.totalTokensUsed}`,
1682
- `- **Files changed:** ${input2.execution.filesChanged.length}`,
1690
+ `- **Files changed:** ${input2.execution.filesChanged.length}`
1691
+ );
1692
+ if (input2.task.linkedIssue) {
1693
+ prBodyLines.push(`- **Resolves:** #${input2.task.linkedIssue.number}`);
1694
+ }
1695
+ prBodyLines.push(
1683
1696
  "",
1684
1697
  "---",
1685
1698
  "*This PR was automatically generated by [OAC](https://github.com/Open330/open-agent-contribution).*"
1686
- ].join("\n");
1699
+ );
1700
+ const prBody = prBodyLines.join("\n");
1687
1701
  const ghResult = await execa(
1688
1702
  "gh",
1689
1703
  [
@@ -2374,4 +2388,4 @@ export {
2374
2388
  createCliProgram,
2375
2389
  runCli
2376
2390
  };
2377
- //# sourceMappingURL=chunk-WC2NAMI3.js.map
2391
+ //# sourceMappingURL=chunk-Z7KEQPGV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/doctor.ts","../src/commands/init.ts","../src/commands/leaderboard.ts","../src/commands/log.ts","../src/commands/plan.ts","../src/github-auth.ts","../src/config-loader.ts","../src/commands/run.ts","../src/commands/scan.ts","../src/commands/status.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { Command } from \"commander\";\n\nimport { createDoctorCommand } from \"./commands/doctor.js\";\nimport { createInitCommand } from \"./commands/init.js\";\nimport { createLeaderboardCommand } from \"./commands/leaderboard.js\";\nimport { createLogCommand } from \"./commands/log.js\";\nimport { createPlanCommand } from \"./commands/plan.js\";\nimport { createRunCommand } from \"./commands/run.js\";\nimport { createScanCommand } from \"./commands/scan.js\";\nimport { createStatusCommand } from \"./commands/status.js\";\n\nexport interface GlobalCliOptions {\n config?: string;\n verbose?: boolean;\n json?: boolean;\n color?: boolean;\n}\n\nasync function readCliVersion(): Promise<string> {\n try {\n const packageJsonPath = new URL(\"../package.json\", import.meta.url);\n const packageJsonRaw = await readFile(packageJsonPath, \"utf8\");\n const packageJson = JSON.parse(packageJsonRaw) as { version?: unknown };\n\n if (typeof packageJson.version === \"string\" && packageJson.version.length > 0) {\n return packageJson.version;\n }\n } catch {\n // Fall back to a safe default when package metadata is unavailable.\n }\n\n return \"0.0.0\";\n}\n\nfunction registerCommands(program: Command): void {\n program.addCommand(createInitCommand());\n program.addCommand(createDoctorCommand());\n program.addCommand(createScanCommand());\n program.addCommand(createPlanCommand());\n program.addCommand(createRunCommand());\n program.addCommand(createLogCommand());\n program.addCommand(createLeaderboardCommand());\n program.addCommand(createStatusCommand());\n}\n\nexport async function createCliProgram(): Promise<Command> {\n const version = await readCliVersion();\n\n const program = new Command();\n program\n .name(\"oac\")\n .description(\"Open Agent Contribution CLI\")\n .version(version)\n .option(\"--config <path>\", \"Config file path\", \"oac.config.ts\")\n .option(\"--verbose\", \"Enable verbose logging\", false)\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .option(\"--no-color\", \"Disable ANSI colors\");\n\n registerCommands(program);\n\n return program;\n}\n\nexport async function runCli(argv: readonly string[] = process.argv): Promise<void> {\n const program = await createCliProgram();\n await program.parseAsync([...argv]);\n}\n","import { spawn } from \"node:child_process\";\n\nimport chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport { Command } from \"commander\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ntype DoctorStatus = \"pass\" | \"warn\" | \"fail\";\n\ninterface DoctorCheck {\n id: string;\n name: string;\n requirement: string;\n value: string;\n status: DoctorStatus;\n message?: string;\n}\n\ninterface CommandResult {\n ok: boolean;\n exitCode: number | null;\n stdout: string;\n stderr: string;\n errorCode?: string;\n errorMessage?: string;\n}\n\nconst MINIMUM_NODE_VERSION = \"24.0.0\";\n\nexport function createDoctorCommand(): Command {\n const command = new Command(\"doctor\");\n\n command.description(\"Check local environment readiness\").action(async (_options, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n\n const checks = await runDoctorChecks();\n const allPassed = checks.every((check) => check.status !== \"fail\");\n\n if (globalOptions.json) {\n console.log(\n JSON.stringify(\n {\n checks,\n allPassed,\n },\n null,\n 2,\n ),\n );\n } else {\n renderDoctorOutput(ui, checks, allPassed);\n }\n\n if (!allPassed) {\n process.exitCode = 1;\n }\n });\n\n return command;\n}\n\nasync function runDoctorChecks(): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = [];\n\n const nodeVersion = process.versions.node;\n checks.push({\n id: \"node\",\n name: \"Node.js\",\n requirement: `>= ${MINIMUM_NODE_VERSION}`,\n value: `v${nodeVersion}`,\n status: isVersionAtLeast(nodeVersion, MINIMUM_NODE_VERSION) ? \"pass\" : \"fail\",\n message: `Node.js ${MINIMUM_NODE_VERSION}+ is required.`,\n });\n\n const gitResult = await runCommand(\"git\", [\"--version\"]);\n const gitVersion = extractVersion(gitResult.stdout) ?? \"--\";\n checks.push({\n id: \"git\",\n name: \"git\",\n requirement: \"installed\",\n value: gitVersion,\n status: gitResult.ok ? \"pass\" : \"fail\",\n message: gitResult.ok ? undefined : explainCommandFailure(\"git\", gitResult),\n });\n\n const githubAuthCheck = await checkGithubAuth();\n checks.push(githubAuthCheck);\n\n const claudeResult = await runCommand(\"claude\", [\"--version\"]);\n const claudeVersion = extractVersion(claudeResult.stdout) ?? \"--\";\n checks.push({\n id: \"claude-cli\",\n name: \"Claude CLI\",\n requirement: \"installed\",\n value: claudeVersion,\n status: claudeResult.ok ? \"pass\" : \"fail\",\n message: claudeResult.ok ? undefined : explainCommandFailure(\"claude\", claudeResult),\n });\n\n const codexResult = await runCommand(\"codex\", [\"--version\"]);\n const codexVersion = extractVersion(codexResult.stdout) ?? \"--\";\n checks.push({\n id: \"codex\",\n name: \"Codex CLI\",\n requirement: \"installed\",\n value: codexVersion,\n status: codexResult.ok ? \"pass\" : \"fail\",\n message: codexResult.ok ? undefined : explainCommandFailure(\"codex\", codexResult),\n });\n\n return checks;\n}\n\nasync function checkGithubAuth(): Promise<DoctorCheck> {\n const envToken = process.env.GITHUB_TOKEN?.trim();\n if (envToken) {\n return {\n id: \"github-auth\",\n name: \"GitHub auth\",\n requirement: \"gh auth status or GITHUB_TOKEN\",\n value: `env:${maskToken(envToken)}`,\n status: \"pass\",\n };\n }\n\n const authResult = await runCommand(\"gh\", [\"auth\", \"status\"]);\n if (authResult.ok) {\n const hasRepoScope = authResult.stdout.includes(\"repo\");\n return {\n id: \"github-auth\",\n name: \"GitHub auth\",\n requirement: \"gh auth status or GITHUB_TOKEN\",\n value: \"gh auth status\",\n status: hasRepoScope ? \"pass\" : \"warn\",\n message: hasRepoScope\n ? undefined\n : \"Missing 'repo' scope — private repos won't work. Run: gh auth refresh -s repo\",\n };\n }\n\n return {\n id: \"github-auth\",\n name: \"GitHub auth\",\n requirement: \"gh auth status or GITHUB_TOKEN\",\n value: \"--\",\n status: \"fail\",\n message: \"No GitHub authentication detected. Set GITHUB_TOKEN or run `gh auth login`.\",\n };\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction renderDoctorOutput(ui: ChalkInstance, checks: DoctorCheck[], allPassed: boolean): void {\n console.log(\"Checking environment...\");\n console.log(\"\");\n\n for (const check of checks) {\n const iconMap = { pass: ui.green(\"[OK]\"), warn: ui.yellow(\"[!]\"), fail: ui.red(\"[X]\") };\n const statusMap = { pass: ui.green(\"PASS\"), warn: ui.yellow(\"WARN\"), fail: ui.red(\"FAIL\") };\n const icon = iconMap[check.status];\n const status = statusMap[check.status];\n\n const name = check.name.padEnd(12, \" \");\n const requirement = check.requirement.padEnd(30, \" \");\n const value = check.value.padEnd(14, \" \");\n\n console.log(` ${icon} ${name} ${requirement} ${value} ${status}`);\n\n if (check.status === \"fail\" && check.message) {\n console.log(` ${ui.red(check.message)}`);\n }\n if (check.status === \"warn\" && check.message) {\n console.log(` ${ui.yellow(check.message)}`);\n }\n }\n\n console.log(\"\");\n if (allPassed) {\n console.log(ui.green(\"All checks passed.\"));\n } else {\n console.log(ui.red(\"Some checks failed.\"));\n }\n}\n\nfunction extractVersion(output: string): string | undefined {\n const match = output.match(/v?(\\d+\\.\\d+\\.\\d+)/i);\n if (!match) {\n return undefined;\n }\n\n return `v${match[1]}`;\n}\n\nfunction explainCommandFailure(commandName: string, result: CommandResult): string {\n if (result.errorCode === \"ENOENT\") {\n return `${commandName} is not installed or not in PATH.`;\n }\n\n if (result.errorMessage) {\n return result.errorMessage;\n }\n\n if (result.stderr.trim().length > 0) {\n return result.stderr.trim();\n }\n\n return `${commandName} exited with code ${String(result.exitCode)}.`;\n}\n\nfunction maskToken(token: string): string {\n if (token.length <= 8) {\n return `${token.slice(0, 2)}****`;\n }\n\n return `${token.slice(0, 4)}****${token.slice(-2)}`;\n}\n\nfunction isVersionAtLeast(version: string, minimum: string): boolean {\n const current = version.split(\".\").map((part) => Number.parseInt(part, 10));\n const required = minimum.split(\".\").map((part) => Number.parseInt(part, 10));\n const length = Math.max(current.length, required.length);\n\n for (let index = 0; index < length; index += 1) {\n const currentPart = current[index] ?? 0;\n const requiredPart = required[index] ?? 0;\n\n if (currentPart > requiredPart) {\n return true;\n }\n\n if (currentPart < requiredPart) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction runCommand(command: string, args: string[]): Promise<CommandResult> {\n return new Promise((resolvePromise) => {\n const child = spawn(command, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let resolved = false;\n\n child.stdout?.setEncoding(\"utf8\");\n child.stderr?.setEncoding(\"utf8\");\n\n child.stdout?.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n\n child.stderr?.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n\n child.once(\"error\", (error) => {\n if (resolved) {\n return;\n }\n\n resolved = true;\n const errorWithCode = error as NodeJS.ErrnoException;\n resolvePromise({\n ok: false,\n exitCode: null,\n stdout,\n stderr,\n errorCode: errorWithCode.code,\n errorMessage: error.message,\n });\n });\n\n child.once(\"close\", (exitCode) => {\n if (resolved) {\n return;\n }\n\n resolved = true;\n resolvePromise({\n ok: exitCode === 0,\n exitCode,\n stdout,\n stderr,\n });\n });\n });\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport { access, mkdir, writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { checkbox, confirm, input } from \"@inquirer/prompts\";\nimport chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport { Command } from \"commander\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ntype ProviderId = \"claude-code\" | \"codex\" | \"opencode\";\n\ninterface InitSummary {\n configPath: string;\n trackingDirectory: string;\n provider: ProviderId;\n providers: ProviderId[];\n budgetTokens: number;\n repo: string;\n}\n\nconst OAC_LOGO = [\n \" ___ _ ___\",\n \" / _ \\\\ /_\\\\ / __|\",\n \"| (_) / _ \\\\ (__\",\n \" \\\\___/_/ \\\\_\\\\___|\",\n].join(\"\\n\");\n\nconst OWNER_REPO_PATTERN = /^[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+(?:\\.git)?$/;\n\nexport function createInitCommand(): Command {\n const command = new Command(\"init\");\n\n command.description(\"Initialize OAC in the current directory\").action(async (_options, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n\n if (!globalOptions.json) {\n console.log(ui.blue(OAC_LOGO));\n console.log(ui.bold(\"Welcome to Open Agent Contribution.\"));\n console.log(\"\");\n }\n\n const selectedProviders = await checkbox<ProviderId>({\n message: \"Select AI provider(s):\",\n choices: [\n { name: \"Claude Code\", value: \"claude-code\", checked: true },\n { name: \"Codex CLI\", value: \"codex\" },\n { name: \"OpenCode (coming soon)\", value: \"opencode\", disabled: true },\n ],\n validate: (value) => (value.length > 0 ? true : \"Select at least one provider to continue.\"),\n });\n\n const budgetInput = await input({\n message: \"Monthly token budget:\",\n default: \"100000\",\n validate: (value) => {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return \"Enter a positive integer.\";\n }\n\n return true;\n },\n });\n\n const firstRepoInput = await input({\n message: \"Add your first repo (owner/repo or GitHub URL):\",\n validate: (value) => {\n if (isValidRepoInput(value)) {\n return true;\n }\n\n return \"Enter a valid GitHub repo like owner/repo.\";\n },\n });\n\n const repo = normalizeRepoInput(firstRepoInput);\n const budgetTokens = Number.parseInt(budgetInput, 10);\n const provider = selectedProviders[0] ?? \"claude-code\";\n\n const configPath = resolve(process.cwd(), \"oac.config.ts\");\n const trackingDirectory = resolve(process.cwd(), \".oac\");\n\n if (await pathExists(configPath)) {\n const shouldOverwrite = await confirm({\n message: \"oac.config.ts already exists. Overwrite it?\",\n default: false,\n });\n\n if (!shouldOverwrite) {\n if (globalOptions.json) {\n console.log(\n JSON.stringify(\n {\n cancelled: true,\n reason: \"oac.config.ts exists and overwrite was declined\",\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log(ui.yellow(\"Initialization cancelled.\"));\n return;\n }\n }\n\n const configContent = buildConfigFile({\n provider,\n providers: selectedProviders,\n budgetTokens,\n repo,\n });\n\n await writeFile(configPath, configContent, \"utf8\");\n await mkdir(trackingDirectory, { recursive: true });\n\n const summary: InitSummary = {\n configPath,\n trackingDirectory,\n provider,\n providers: selectedProviders,\n budgetTokens,\n repo,\n };\n\n if (globalOptions.json) {\n console.log(JSON.stringify(summary, null, 2));\n return;\n }\n\n console.log(ui.green(\"Created: oac.config.ts\"));\n console.log(ui.green(\"Created: .oac/\"));\n console.log(\"\");\n console.log(\"Run `oac doctor` to verify or `oac scan` to discover tasks.\");\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction buildConfigFile(input: {\n provider: ProviderId;\n providers: ProviderId[];\n budgetTokens: number;\n repo: string;\n}): string {\n const enabledProviders = input.providers.map((provider) => `'${provider}'`).join(\", \");\n\n return `export default {\n repos: ['${input.repo}'],\n provider: {\n id: '${input.provider}',\n options: {\n enabledProviders: [${enabledProviders}],\n },\n },\n budget: {\n totalTokens: ${input.budgetTokens},\n },\n};\n`;\n}\n\nfunction normalizeRepoInput(input: string): string {\n const trimmed = input.trim();\n if (OWNER_REPO_PATTERN.test(trimmed)) {\n return stripGitSuffix(trimmed);\n }\n\n const normalizedUrlInput = trimmed.startsWith(\"github.com/\") ? `https://${trimmed}` : trimmed;\n\n try {\n const url = new URL(normalizedUrlInput);\n if (url.hostname !== \"github.com\") {\n return trimmed;\n }\n\n const segments = url.pathname.split(\"/\").filter(Boolean);\n if (segments.length < 2) {\n return trimmed;\n }\n\n const owner = segments[0];\n const repo = stripGitSuffix(segments[1] ?? \"\");\n if (!owner || !repo) {\n return trimmed;\n }\n\n return `${owner}/${repo}`;\n } catch {\n return trimmed;\n }\n}\n\nfunction stripGitSuffix(value: string): string {\n return value.endsWith(\".git\") ? value.slice(0, -4) : value;\n}\n\nfunction isValidRepoInput(input: string): boolean {\n const normalized = normalizeRepoInput(input);\n return OWNER_REPO_PATTERN.test(normalized);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path, fsConstants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import type { Dirent } from \"node:fs\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { type ContributionLog, contributionLogSchema } from \"@open330/oac-tracking\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ninterface LeaderboardCommandOptions {\n limit: number;\n sort: string;\n}\n\ninterface LeaderboardEntry {\n githubUsername: string;\n totalRuns: number;\n totalTasksCompleted: number;\n totalTokensDonated: number;\n totalPRsCreated: number;\n totalPRsMerged: number;\n}\n\ntype SortField = \"runs\" | \"tasks\" | \"tokens\" | \"prs\";\n\nexport function createLeaderboardCommand(): Command {\n const command = new Command(\"leaderboard\");\n\n command\n .description(\"Show contribution rankings\")\n .option(\"--limit <number>\", \"Max entries to show\", parseInteger, 10)\n .option(\"--sort <field>\", \"Sort by: runs, tasks, tokens, prs\", \"tasks\")\n .action(async (options: LeaderboardCommandOptions, cmd) => {\n if (options.limit <= 0) {\n throw new Error(\"--limit must be a positive integer.\");\n }\n\n const globalOptions = getGlobalOptions(cmd);\n const sortField = normalizeSortField(options.sort);\n const entries = await loadLeaderboardEntries(process.cwd());\n const sortedEntries = sortEntries(entries, sortField).slice(0, options.limit);\n\n if (globalOptions.json) {\n console.log(\n JSON.stringify(\n {\n total: sortedEntries.length,\n sort: sortField,\n entries: sortedEntries,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (sortedEntries.length === 0) {\n console.log(\"No leaderboard data found.\");\n return;\n }\n\n const table = new Table({\n head: [\"Rank\", \"User\", \"Tasks\", \"Tokens Used\", \"PRs Created\", \"PRs Merged\"],\n });\n\n for (let index = 0; index < sortedEntries.length; index += 1) {\n const entry = sortedEntries[index];\n table.push([\n String(index + 1),\n entry.githubUsername,\n String(entry.totalTasksCompleted),\n formatInteger(entry.totalTokensDonated),\n String(entry.totalPRsCreated),\n String(entry.totalPRsMerged),\n ]);\n }\n\n console.log(table.toString());\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nasync function loadLeaderboardEntries(repoPath: string): Promise<LeaderboardEntry[]> {\n const leaderboardPath = resolve(repoPath, \".oac\", \"leaderboard.json\");\n\n try {\n const leaderboardRaw = await readFile(leaderboardPath, \"utf8\");\n const leaderboardPayload = JSON.parse(leaderboardRaw) as unknown;\n return parseStoredLeaderboardEntries(leaderboardPayload);\n } catch (error) {\n if (!isFileNotFoundError(error)) {\n throw error;\n }\n }\n\n const logs = await readContributionLogs(repoPath);\n return buildEntriesFromLogs(logs);\n}\n\nfunction parseStoredLeaderboardEntries(payload: unknown): LeaderboardEntry[] {\n if (!isRecord(payload)) {\n return [];\n }\n\n const entries = payload.entries;\n if (!Array.isArray(entries)) {\n return [];\n }\n\n const parsedEntries: LeaderboardEntry[] = [];\n\n for (const entry of entries) {\n if (!isRecord(entry)) {\n continue;\n }\n\n const githubUsername = entry.githubUsername;\n const totalRuns = entry.totalRuns;\n const totalTasksCompleted = entry.totalTasksCompleted;\n const totalTokensDonated = entry.totalTokensDonated;\n const totalPRsCreated = entry.totalPRsCreated;\n const totalPRsMerged = entry.totalPRsMerged;\n\n if (\n typeof githubUsername !== \"string\" ||\n typeof totalRuns !== \"number\" ||\n typeof totalTasksCompleted !== \"number\" ||\n typeof totalTokensDonated !== \"number\" ||\n typeof totalPRsCreated !== \"number\" ||\n typeof totalPRsMerged !== \"number\"\n ) {\n continue;\n }\n\n parsedEntries.push({\n githubUsername,\n totalRuns,\n totalTasksCompleted,\n totalTokensDonated,\n totalPRsCreated,\n totalPRsMerged,\n });\n }\n\n return parsedEntries;\n}\n\nasync function readContributionLogs(repoPath: string): Promise<ContributionLog[]> {\n const contributionsPath = resolve(repoPath, \".oac\", \"contributions\");\n\n let entries: Dirent[];\n try {\n entries = await readdir(contributionsPath, { withFileTypes: true, encoding: \"utf8\" });\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return [];\n }\n\n throw error;\n }\n\n const fileNames = entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map((entry) => entry.name)\n .sort((a, b) => a.localeCompare(b));\n\n const logs = await Promise.all(\n fileNames.map(async (fileName): Promise<ContributionLog | null> => {\n const filePath = resolve(contributionsPath, fileName);\n\n try {\n const content = await readFile(filePath, \"utf8\");\n const payload = JSON.parse(content) as unknown;\n const parsed = contributionLogSchema.safeParse(payload);\n return parsed.success ? parsed.data : null;\n } catch {\n return null;\n }\n }),\n );\n\n return logs.filter((log): log is ContributionLog => log !== null);\n}\n\nfunction buildEntriesFromLogs(logs: ContributionLog[]): LeaderboardEntry[] {\n const byUser = new Map<string, LeaderboardEntry>();\n\n for (const log of logs) {\n const username = log.contributor.githubUsername;\n const existing = byUser.get(username) ?? {\n githubUsername: username,\n totalRuns: 0,\n totalTasksCompleted: 0,\n totalTokensDonated: 0,\n totalPRsCreated: 0,\n totalPRsMerged: 0,\n };\n\n existing.totalRuns += 1;\n existing.totalTasksCompleted += log.tasks.filter((task) => task.status !== \"failed\").length;\n existing.totalTokensDonated += log.budget.totalTokensUsed;\n existing.totalPRsCreated += log.tasks.filter((task) => Boolean(task.pr)).length;\n existing.totalPRsMerged += log.tasks.filter((task) => task.pr?.status === \"merged\").length;\n\n byUser.set(username, existing);\n }\n\n return Array.from(byUser.values());\n}\n\nfunction sortEntries(entries: LeaderboardEntry[], field: SortField): LeaderboardEntry[] {\n return [...entries].sort((a, b) => {\n const first = sortValue(b, field) - sortValue(a, field);\n if (first !== 0) {\n return first;\n }\n\n if (b.totalTasksCompleted !== a.totalTasksCompleted) {\n return b.totalTasksCompleted - a.totalTasksCompleted;\n }\n\n if (b.totalRuns !== a.totalRuns) {\n return b.totalRuns - a.totalRuns;\n }\n\n return a.githubUsername.localeCompare(b.githubUsername);\n });\n}\n\nfunction normalizeSortField(value: string): SortField {\n const normalized = value.trim().toLowerCase();\n if (\n normalized === \"runs\" ||\n normalized === \"tasks\" ||\n normalized === \"tokens\" ||\n normalized === \"prs\"\n ) {\n return normalized;\n }\n\n throw new Error(`Unsupported --sort value \"${value}\". Use runs, tasks, tokens, or prs.`);\n}\n\nfunction sortValue(entry: LeaderboardEntry, field: SortField): number {\n if (field === \"runs\") {\n return entry.totalRuns;\n }\n if (field === \"tasks\") {\n return entry.totalTasksCompleted;\n }\n if (field === \"tokens\") {\n return entry.totalTokensDonated;\n }\n return entry.totalPRsCreated;\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n if (!isRecord(error)) {\n return false;\n }\n\n return error.code === \"ENOENT\";\n}\n","import type { Dirent } from \"node:fs\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { type ContributionLog, contributionLogSchema } from \"@open330/oac-tracking\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ninterface LogCommandOptions {\n limit: number;\n repo?: string;\n source?: string;\n since?: string;\n}\n\nexport function createLogCommand(): Command {\n const command = new Command(\"log\");\n\n command\n .description(\"View contribution history\")\n .option(\"--limit <number>\", \"Max entries to show\", parseInteger, 20)\n .option(\"--repo <name>\", \"Filter by repo name\")\n .option(\"--source <type>\", \"Filter by task source\")\n .option(\"--since <date>\", \"Filter contributions after date (ISO string)\")\n .action(async (options: LogCommandOptions, cmd) => {\n if (options.limit <= 0) {\n throw new Error(\"--limit must be a positive integer.\");\n }\n\n const globalOptions = getGlobalOptions(cmd);\n const sinceDate = parseSinceDate(options.since);\n const repoFilter = options.repo?.trim();\n const sourceFilter = options.source?.trim().toLowerCase();\n\n const logs = await readContributionLogs(process.cwd());\n const filteredLogs = logs\n .filter((log) => (repoFilter ? log.repo.fullName === repoFilter : true))\n .filter((log) =>\n sourceFilter ? log.tasks.some((task) => task.source === sourceFilter) : true,\n )\n .filter((log) => (sinceDate ? Date.parse(log.timestamp) >= sinceDate.getTime() : true))\n .sort((a, b) => Date.parse(b.timestamp) - Date.parse(a.timestamp))\n .slice(0, options.limit);\n\n if (globalOptions.json) {\n console.log(\n JSON.stringify(\n {\n total: filteredLogs.length,\n entries: filteredLogs,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (filteredLogs.length === 0) {\n console.log(\"No contribution logs found.\");\n return;\n }\n\n const table = new Table({\n head: [\"Date\", \"Repo\", \"Tasks\", \"Tokens\", \"PRs\", \"Source\"],\n });\n\n for (const log of filteredLogs) {\n table.push([\n formatDate(log.timestamp),\n log.repo.fullName,\n String(log.tasks.length),\n formatInteger(log.budget.totalTokensUsed),\n String(log.tasks.filter((task) => Boolean(task.pr)).length),\n summarizeSources(log),\n ]);\n }\n\n console.log(table.toString());\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nasync function readContributionLogs(repoPath: string): Promise<ContributionLog[]> {\n const contributionsPath = resolve(repoPath, \".oac\", \"contributions\");\n\n let entries: Dirent[];\n try {\n entries = await readdir(contributionsPath, { withFileTypes: true, encoding: \"utf8\" });\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return [];\n }\n\n throw error;\n }\n\n const files = entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map((entry) => entry.name)\n .sort((a, b) => a.localeCompare(b));\n\n const logs = await Promise.all(\n files.map(async (fileName): Promise<ContributionLog | null> => {\n const filePath = resolve(contributionsPath, fileName);\n\n try {\n const content = await readFile(filePath, \"utf8\");\n const payload = JSON.parse(content) as unknown;\n const parsed = contributionLogSchema.safeParse(payload);\n return parsed.success ? parsed.data : null;\n } catch {\n return null;\n }\n }),\n );\n\n return logs.filter((log): log is ContributionLog => log !== null);\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nfunction parseSinceDate(value: string | undefined): Date | null {\n if (!value) {\n return null;\n }\n\n const parsed = Date.parse(value);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Invalid --since value \"${value}\". Expected an ISO date string.`);\n }\n\n return new Date(parsed);\n}\n\nfunction summarizeSources(log: ContributionLog): string {\n const uniqueSources = [...new Set(log.tasks.map((task) => task.source))].sort((a, b) =>\n a.localeCompare(b),\n );\n\n if (uniqueSources.length === 0) {\n return \"-\";\n }\n\n return uniqueSources.join(\", \");\n}\n\nfunction formatDate(timestamp: string): string {\n const date = new Date(timestamp);\n if (Number.isNaN(date.getTime())) {\n return timestamp;\n }\n\n return date.toISOString();\n}\n\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) {\n return false;\n }\n\n const code = (error as { code?: unknown }).code;\n return code === \"ENOENT\";\n}\n","import { buildExecutionPlan, estimateTokens } from \"@open330/oac-budget\";\nimport type { OacConfig, Task } from \"@open330/oac-core\";\nimport {\n CompositeScanner,\n LintScanner,\n type Scanner,\n TodoScanner,\n rankTasks,\n} from \"@open330/oac-discovery\";\nimport { cloneRepo, resolveRepo } from \"@open330/oac-repo\";\nimport { ensureGitHubAuth } from \"../github-auth.js\";\nimport chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\nimport ora, { type Ora } from \"ora\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\nimport { loadOptionalConfigFile } from \"../config-loader.js\";\n\ninterface PlanCommandOptions {\n repo?: string;\n tokens?: number;\n provider?: string;\n}\n\ntype SupportedScanner = \"lint\" | \"todo\";\n\nexport function createPlanCommand(): Command {\n const command = new Command(\"plan\");\n\n command\n .description(\"Build an execution plan from discovered tasks\")\n .option(\"--repo <owner/repo>\", \"Target repository (owner/repo or GitHub URL)\")\n .option(\"--tokens <number>\", \"Token budget for planning\", parseInteger)\n .option(\"--provider <id>\", \"Agent provider id\")\n .action(async (options: PlanCommandOptions, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n const outputJson = globalOptions.json;\n\n const config = await loadOptionalConfig(globalOptions.config, globalOptions.verbose, ui);\n const repoInput = resolveRepoInput(options.repo, config);\n const providerId = resolveProviderId(options.provider, config);\n const totalBudget = resolveBudget(options.tokens, config);\n const minPriority = config?.discovery.minPriority ?? 20;\n\n const scannerSelection = selectScannersFromConfig(config);\n\n ensureGitHubAuth();\n\n const resolveSpinner = createSpinner(outputJson, \"Resolving repository...\");\n const resolvedRepo = await resolveRepo(repoInput);\n resolveSpinner?.succeed(`Resolved ${resolvedRepo.fullName}`);\n\n const cloneSpinner = createSpinner(outputJson, \"Preparing local clone...\");\n await cloneRepo(resolvedRepo);\n cloneSpinner?.succeed(`Repository ready at ${resolvedRepo.localPath}`);\n\n const scanSpinner = createSpinner(\n outputJson,\n `Running scanners: ${scannerSelection.enabled.join(\", \")}`,\n );\n const scannedTasks = await scannerSelection.scanner.scan(resolvedRepo.localPath, {\n exclude: config?.discovery.exclude,\n maxTasks: config?.discovery.maxTasks,\n repo: resolvedRepo,\n });\n scanSpinner?.succeed(`Discovered ${scannedTasks.length} raw task(s)`);\n\n const rankedTasks = rankTasks(scannedTasks).filter((task) => task.priority >= minPriority);\n\n const estimateSpinner = createSpinner(\n outputJson,\n `Estimating tokens for ${rankedTasks.length} task(s)...`,\n );\n const estimates = await estimateTaskMap(rankedTasks, providerId);\n estimateSpinner?.succeed(\"Token estimation completed\");\n\n const plan = buildExecutionPlan(rankedTasks, estimates, totalBudget);\n\n if (outputJson) {\n console.log(\n JSON.stringify(\n {\n repo: resolvedRepo.fullName,\n provider: providerId,\n budget: totalBudget,\n tasksDiscovered: rankedTasks.length,\n plan,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n renderPlan(ui, {\n repo: resolvedRepo.fullName,\n provider: providerId,\n budget: totalBudget,\n plan,\n });\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction createSpinner(enabled: boolean, text: string): Ora | null {\n if (enabled) {\n return null;\n }\n\n return ora({ text, color: \"blue\" }).start();\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nasync function loadOptionalConfig(\n configPath: string,\n verbose: boolean,\n ui: ChalkInstance,\n): Promise<OacConfig | null> {\n return loadOptionalConfigFile(configPath, {\n onWarning: verbose\n ? (message) => {\n console.warn(ui.yellow(`[oac] ${message}`));\n }\n : undefined,\n });\n}\n\nfunction resolveRepoInput(repoOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = repoOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n const firstConfiguredRepo = config?.repos[0];\n if (typeof firstConfiguredRepo === \"string\") {\n return firstConfiguredRepo;\n }\n\n if (\n firstConfiguredRepo &&\n typeof firstConfiguredRepo === \"object\" &&\n \"name\" in firstConfiguredRepo &&\n typeof firstConfiguredRepo.name === \"string\"\n ) {\n return firstConfiguredRepo.name;\n }\n\n throw new Error(\"No repository specified. Use --repo or configure repos in oac.config.ts.\");\n}\n\nfunction resolveProviderId(providerOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = providerOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n return config?.provider.id ?? \"claude-code\";\n}\n\nfunction resolveBudget(tokensOption: number | undefined, config: OacConfig | null): number {\n const budget = tokensOption ?? config?.budget.totalTokens ?? 100_000;\n if (!Number.isFinite(budget) || budget <= 0) {\n throw new Error(\"Token budget must be a positive number.\");\n }\n\n return Math.floor(budget);\n}\n\nfunction selectScannersFromConfig(config: OacConfig | null): {\n enabled: SupportedScanner[];\n scanner: CompositeScanner;\n} {\n const enabled: SupportedScanner[] = [];\n\n if (config?.discovery.scanners.lint !== false) {\n enabled.push(\"lint\");\n }\n\n if (config?.discovery.scanners.todo !== false) {\n enabled.push(\"todo\");\n }\n\n if (enabled.length === 0) {\n enabled.push(\"lint\", \"todo\");\n }\n\n const uniqueEnabled = [...new Set(enabled)];\n const scannerInstances: Scanner[] = uniqueEnabled.map((scannerName) =>\n scannerName === \"lint\" ? new LintScanner() : new TodoScanner(),\n );\n\n return {\n enabled: uniqueEnabled,\n scanner: new CompositeScanner(scannerInstances),\n };\n}\n\nasync function estimateTaskMap(\n tasks: Task[],\n providerId: string,\n): Promise<Map<string, Awaited<ReturnType<typeof estimateTokens>>>> {\n const entries = await Promise.all(\n tasks.map(async (task) => {\n const estimate = await estimateTokens(task, providerId);\n return [task.id, estimate] as const;\n }),\n );\n\n return new Map(entries);\n}\n\nfunction renderPlan(\n ui: ChalkInstance,\n data: {\n repo: string;\n provider: string;\n budget: number;\n plan: ReturnType<typeof buildExecutionPlan>;\n },\n): void {\n const table = new Table({\n head: [\"#\", \"Task\", \"Est. Tokens\", \"Cumulative\", \"Confidence\"],\n });\n\n for (let index = 0; index < data.plan.selectedTasks.length; index += 1) {\n const entry = data.plan.selectedTasks[index];\n table.push([\n String(index + 1),\n truncate(entry.task.title, 56),\n formatInteger(entry.estimate.totalEstimatedTokens),\n formatInteger(entry.cumulativeBudgetUsed),\n entry.estimate.confidence.toFixed(2),\n ]);\n }\n\n console.log(ui.bold(`Execution Plan for ${data.repo}`));\n console.log(`Provider: ${data.provider}`);\n console.log(\"\");\n\n if (data.plan.selectedTasks.length > 0) {\n console.log(table.toString());\n console.log(\"\");\n } else {\n console.log(ui.yellow(\"No tasks selected for execution.\"));\n console.log(\"\");\n }\n\n const effectiveBudget = data.plan.totalBudget - data.plan.reserveTokens;\n const budgetUsed =\n data.plan.selectedTasks[data.plan.selectedTasks.length - 1]?.cumulativeBudgetUsed ?? 0;\n\n console.log(\n `Budget used: ${formatInteger(budgetUsed)} / ${formatInteger(effectiveBudget)} (effective)`,\n );\n console.log(`Reserve: ${formatInteger(data.plan.reserveTokens)} (10%)`);\n console.log(`Remaining: ${formatInteger(data.plan.remainingTokens)}`);\n\n if (data.plan.deferredTasks.length > 0) {\n console.log(\"\");\n console.log(ui.yellow(`Deferred (${data.plan.deferredTasks.length}):`));\n for (const deferred of data.plan.deferredTasks) {\n const reason = deferred.reason.replaceAll(\"_\", \" \");\n console.log(\n ` - ${truncate(deferred.task.title, 72)} (${formatInteger(\n deferred.estimate.totalEstimatedTokens,\n )} tokens, ${reason})`,\n );\n }\n }\n}\n\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n","import { execFileSync } from \"node:child_process\";\n\n/**\n * Ensures GITHUB_TOKEN is set in process.env for Octokit API calls.\n * Tries: GITHUB_TOKEN → GH_TOKEN → `gh auth token`.\n * Call this before any GitHub API usage (resolveRepo, etc.).\n */\nexport function ensureGitHubAuth(): string | undefined {\n const githubToken = process.env.GITHUB_TOKEN?.trim();\n if (githubToken) {\n process.env.GITHUB_TOKEN = githubToken;\n return githubToken;\n }\n\n const ghToken = process.env.GH_TOKEN?.trim();\n if (ghToken) {\n process.env.GITHUB_TOKEN = ghToken;\n return ghToken;\n }\n\n try {\n const token = execFileSync(\"gh\", [\"auth\", \"token\"], {\n timeout: 5_000,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n\n if (token.length > 0) {\n process.env.GITHUB_TOKEN = token;\n return token;\n }\n } catch {\n // gh not installed or not authenticated\n }\n\n return undefined;\n}\n\n/**\n * Checks whether the current gh auth has the required scopes.\n * Returns missing scopes or empty array if all present.\n *\n * Note: `gh auth status` outputs scope info to stderr, so we\n * redirect stderr to stdout to capture it.\n */\nexport function checkGitHubScopes(required: string[] = [\"repo\"]): string[] {\n try {\n // gh auth status prints token info to stderr\n const output = execFileSync(\"gh\", [\"auth\", \"status\"], {\n timeout: 5_000,\n encoding: \"utf-8\",\n // Merge stderr into stdout so we can read scope info\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n // Try stdout first, then if empty try running with shell redirect\n let combined = output;\n if (!combined.includes(\"Token scopes\")) {\n // gh auth status writes to stderr — use shell to capture both\n try {\n combined = execFileSync(\"sh\", [\"-c\", \"gh auth status 2>&1\"], {\n timeout: 5_000,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n return [];\n }\n }\n\n // Match: Token scopes: 'admin:org', 'gist', 'repo', 'workflow'\n const scopeLine = combined.match(/Token scopes:\\s*(.+)/);\n if (!scopeLine) return [];\n\n const scopes = scopeLine[1]\n .split(\",\")\n .map((s) => s.trim().replace(/^'|'$/g, \"\"));\n return required.filter((r) => !scopes.includes(r));\n } catch {\n return [];\n }\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { type OacConfig, loadConfig } from \"@open330/oac-core\";\n\nconst LEGACY_DEFINE_CONFIG_IMPORT = /@(?:open330\\/oac-core|oac\\/core)/;\nconst LEGACY_DEFINE_CONFIG_IMPORT_LINE =\n /^\\s*import\\s*\\{\\s*defineConfig\\s*\\}\\s*from\\s*[\"']@(?:open330\\/oac-core|oac\\/core)[\"'];\\s*$/m;\nconst LEGACY_DEFINE_CONFIG_EXPORT = /export\\s+default\\s+defineConfig\\s*\\(/;\n\nexport interface ConfigLoaderOptions {\n cwd?: string;\n onWarning?: (message: string) => void;\n}\n\nexport async function loadOptionalConfigFile(\n configPath: string,\n options: ConfigLoaderOptions = {},\n): Promise<OacConfig | null> {\n const absolutePath = resolve(options.cwd ?? process.cwd(), configPath);\n if (!(await pathExists(absolutePath))) {\n return null;\n }\n\n try {\n const candidate = await importConfigCandidate(absolutePath);\n return loadConfig(candidate);\n } catch (error) {\n options.onWarning?.(\n `Failed to load config at ${configPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return null;\n }\n}\n\nasync function importConfigCandidate(absolutePath: string): Promise<unknown> {\n try {\n return await importCandidate(`${pathToFileURL(absolutePath).href}?t=${Date.now()}`);\n } catch (error) {\n const fallbackCandidate = await importLegacyDefineConfigCandidate(absolutePath, error);\n if (fallbackCandidate !== null) {\n return fallbackCandidate;\n }\n\n throw error;\n }\n}\n\nasync function importLegacyDefineConfigCandidate(\n absolutePath: string,\n error: unknown,\n): Promise<unknown | null> {\n if (!shouldTryLegacyDefineConfigFallback(error)) {\n return null;\n }\n\n const source = await readFile(absolutePath, \"utf8\");\n const transformed = transformLegacyDefineConfigSource(source);\n if (transformed === null) {\n return null;\n }\n\n const encodedSource = Buffer.from(transformed, \"utf8\").toString(\"base64\");\n return await importCandidate(`data:text/javascript;base64,${encodedSource}`);\n}\n\nfunction shouldTryLegacyDefineConfigFallback(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return LEGACY_DEFINE_CONFIG_IMPORT.test(error.message);\n}\n\nfunction transformLegacyDefineConfigSource(source: string): string | null {\n if (!LEGACY_DEFINE_CONFIG_IMPORT_LINE.test(source)) {\n return null;\n }\n\n if (!LEGACY_DEFINE_CONFIG_EXPORT.test(source)) {\n return null;\n }\n\n return source\n .replace(LEGACY_DEFINE_CONFIG_IMPORT_LINE, \"\")\n .replace(LEGACY_DEFINE_CONFIG_EXPORT, \"export default (\");\n}\n\nasync function importCandidate(moduleSpecifier: string): Promise<unknown> {\n const imported = await import(moduleSpecifier);\n return imported.default ?? imported.config ?? imported;\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path, fsConstants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport { buildExecutionPlan, estimateTokens } from \"@open330/oac-budget\";\nimport {\n type OacConfig,\n type Task,\n type TokenEstimate,\n UNLIMITED_BUDGET,\n createEventBus,\n} from \"@open330/oac-core\";\nimport {\n CompositeScanner,\n GitHubIssuesScanner,\n LintScanner,\n type Scanner,\n TestGapScanner,\n TodoScanner,\n rankTasks,\n} from \"@open330/oac-discovery\";\nimport {\n type AgentProvider,\n ClaudeCodeAdapter,\n CodexAdapter,\n createSandbox,\n executeTask as workerExecuteTask,\n} from \"@open330/oac-execution\";\nimport { cloneRepo, resolveRepo } from \"@open330/oac-repo\";\nimport { type ContributionLog, writeContributionLog } from \"@open330/oac-tracking\";\nimport chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\nimport { execa } from \"execa\";\nimport ora, { type Ora } from \"ora\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\nimport { loadOptionalConfigFile } from \"../config-loader.js\";\nimport { checkGitHubScopes, ensureGitHubAuth } from \"../github-auth.js\";\n\ninterface RunCommandOptions {\n repo?: string;\n tokens?: number;\n provider?: string;\n concurrency?: number;\n dryRun?: boolean;\n mode?: string;\n maxTasks?: number;\n timeout?: number;\n source?: string;\n}\n\ninterface SandboxInfo {\n branchName: string;\n sandboxPath: string;\n cleanup: () => Promise<void>;\n}\n\ntype RunMode = \"new-pr\" | \"update-pr\" | \"direct-commit\";\ntype SupportedScanner = \"lint\" | \"todo\" | \"github-issues\" | \"test-gap\";\ntype CompletionStatus = \"success\" | \"partial\" | \"failed\";\n\ninterface ExecutionOutcome {\n success: boolean;\n exitCode: number;\n totalTokensUsed: number;\n filesChanged: string[];\n duration: number;\n error?: string;\n}\n\ninterface TaskRunResult {\n task: Task;\n estimate: TokenEstimate;\n execution: ExecutionOutcome;\n sandbox?: SandboxInfo;\n pr?: {\n number: number;\n url: string;\n status: \"open\" | \"merged\" | \"closed\";\n };\n}\n\ninterface RunSummaryOutput {\n runId: string;\n repo: string;\n provider: string;\n dryRun: boolean;\n selectedTasks: number;\n deferredTasks: number;\n tasksCompleted: number;\n tasksFailed: number;\n prsCreated: number;\n tokensUsed: number;\n tokensBudgeted: number;\n logPath?: string;\n}\n\nconst DEFAULT_TIMEOUT_SECONDS = 300;\nconst DEFAULT_CONCURRENCY = 2;\n\nexport function createRunCommand(): Command {\n const command = new Command(\"run\");\n\n command\n .description(\"Run the full OAC pipeline\")\n .option(\"--repo <owner/repo>\", \"Target repository (owner/repo or GitHub URL)\")\n .option(\"--tokens <value>\", 'Token budget (number or \"unlimited\")', parseTokens)\n .option(\"--provider <id>\", \"Agent provider id\")\n .option(\"--concurrency <number>\", \"Maximum parallel task executions\", parseInteger)\n .option(\"--dry-run\", \"Show plan without executing tasks\", false)\n .option(\"--mode <mode>\", \"Execution mode: new-pr|update-pr|direct-commit\")\n .option(\"--max-tasks <number>\", \"Maximum number of discovered tasks to consider\", parseInteger)\n .option(\"--timeout <seconds>\", \"Per-task timeout in seconds\", parseInteger)\n .option(\"--source <source>\", \"Filter tasks by source: lint, todo, github-issue, test-gap\")\n .action(async (options: RunCommandOptions, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n const outputJson = globalOptions.json;\n\n validateRunOptions(options);\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 mode = resolveMode(options.mode, config);\n const concurrency = resolveConcurrency(options.concurrency, config);\n const timeoutSeconds = resolveTimeout(options.timeout, config);\n const minPriority = config?.discovery.minPriority ?? 20;\n const maxTasks = options.maxTasks ?? undefined;\n const ghToken = ensureGitHubAuth();\n const scannerSelection = selectScannersFromConfig(config, Boolean(ghToken));\n\n const runStartedAt = Date.now();\n const runId = randomUUID();\n\n // Pre-flight: ensure GitHub auth is available before any API calls\n if (!ghToken && !outputJson) {\n console.log(\n ui.yellow(\n \"[oac] Warning: GitHub auth not detected. Run `gh auth login` first.\",\n ),\n );\n console.log(\n ui.yellow(\n \"[oac] For private repos, ensure the 'repo' scope: gh auth refresh -s repo\",\n ),\n );\n } else if (ghToken && !outputJson) {\n const missingScopes = checkGitHubScopes([\"repo\"]);\n if (missingScopes.length > 0) {\n console.log(\n ui.yellow(\n `[oac] Warning: GitHub token missing scope(s): ${missingScopes.join(\", \")}. Private repos may fail.`,\n ),\n );\n console.log(\n ui.yellow(\n \"[oac] Fix with: gh auth refresh -s repo\",\n ),\n );\n }\n }\n\n if (!outputJson) {\n console.log(\n ui.blue(\n `Starting OAC run (budget: ${formatBudgetDisplay(totalBudget)} tokens, concurrency: ${concurrency})`,\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 const scannedTasks = await scannerSelection.scanner.scan(resolvedRepo.localPath, {\n exclude: config?.discovery.exclude,\n maxTasks: config?.discovery.maxTasks,\n repo: resolvedRepo,\n });\n scanSpinner?.succeed(`Discovered ${scannedTasks.length} raw task(s)`);\n\n let candidateTasks = rankTasks(scannedTasks).filter((task) => task.priority >= minPriority);\n if (options.source) {\n candidateTasks = candidateTasks.filter((task) => task.source === options.source);\n }\n if (typeof maxTasks === \"number\") {\n candidateTasks = candidateTasks.slice(0, maxTasks);\n }\n\n if (candidateTasks.length === 0) {\n const emptySummary: RunSummaryOutput = {\n runId,\n repo: resolvedRepo.fullName,\n provider: providerId,\n dryRun: Boolean(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 (outputJson) {\n console.log(JSON.stringify({ summary: emptySummary, plan: null }, null, 2));\n } else {\n console.log(ui.yellow(\"No tasks discovered for execution.\"));\n }\n return;\n }\n\n const estimateSpinner = createSpinner(\n outputJson,\n `Estimating tokens for ${candidateTasks.length} task(s)...`,\n );\n const estimates = await estimateTaskMap(candidateTasks, providerId);\n estimateSpinner?.succeed(\"Token estimation completed\");\n\n const plan = buildExecutionPlan(candidateTasks, estimates, totalBudget);\n\n if (options.dryRun) {\n const dryRunSummary: RunSummaryOutput = {\n runId,\n repo: resolvedRepo.fullName,\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 (outputJson) {\n console.log(\n JSON.stringify(\n {\n summary: dryRunSummary,\n plan,\n },\n null,\n 2,\n ),\n );\n } else {\n renderSelectedPlanTable(ui, plan, totalBudget);\n console.log(\"\");\n console.log(ui.blue(\"Dry run complete. No tasks were executed.\"));\n }\n\n return;\n }\n\n const { adapter, useRealExecution } = await resolveAdapter(providerId);\n\n if (!outputJson && globalOptions.verbose) {\n if (useRealExecution && adapter) {\n const avail = await adapter.checkAvailability();\n console.log(\n ui.green(\n `[oac] Using ${adapter.name} v${avail.version ?? \"unknown\"} for execution.`,\n ),\n );\n } else {\n console.log(ui.yellow(\"[oac] No agent CLI available. Using simulated execution.\"));\n }\n }\n\n const executionSpinner = createSpinner(\n outputJson,\n `Executing ${plan.selectedTasks.length} planned task(s)...`,\n );\n\n let completedCount = 0;\n const executedTasks = await runWithConcurrency(\n plan.selectedTasks,\n concurrency,\n async (entry): Promise<TaskRunResult> => {\n let execution: ExecutionOutcome;\n let sandbox: SandboxInfo | undefined;\n\n if (useRealExecution && adapter) {\n const result = await executeWithAgent({\n task: entry.task,\n estimate: entry.estimate,\n adapter,\n repoPath: resolvedRepo.localPath,\n baseBranch: resolvedRepo.meta.defaultBranch,\n timeoutSeconds,\n });\n execution = result.execution;\n sandbox = result.sandbox;\n } else {\n execution = await simulateExecution(entry.task, entry.estimate);\n }\n\n completedCount += 1;\n if (executionSpinner) {\n executionSpinner.text = `Executing tasks... (${completedCount}/${plan.selectedTasks.length})`;\n }\n\n return {\n task: entry.task,\n estimate: entry.estimate,\n execution,\n sandbox,\n };\n },\n );\n\n executionSpinner?.succeed(\"Execution stage finished\");\n\n const completionSpinner = createSpinner(outputJson, \"Completing task outputs...\");\n const completedTasks = await runWithConcurrency(\n executedTasks,\n concurrency,\n async (result): Promise<TaskRunResult> => {\n if (mode === \"direct-commit\") {\n return result;\n }\n\n if (!result.execution.success) {\n return result;\n }\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 if (!pr) {\n return result;\n }\n\n return {\n ...result,\n pr,\n };\n },\n );\n completionSpinner?.succeed(\"Completion stage finished\");\n\n const tasksCompleted = completedTasks.filter((task) => task.execution.success).length;\n const tasksFailed = completedTasks.length - tasksCompleted;\n const prsCreated = completedTasks.filter((task) => Boolean(task.pr)).length;\n const tokensUsed = completedTasks.reduce(\n (sum, task) => sum + task.execution.totalTokensUsed,\n 0,\n );\n\n const runDurationSeconds = (Date.now() - runStartedAt) / 1000;\n const contributionLog = buildContributionLog({\n 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(outputJson, \"Writing contribution log...\");\n let logPath: string | undefined;\n try {\n logPath = await writeContributionLog(contributionLog, resolvedRepo.localPath);\n trackingSpinner?.succeed(`Contribution log written: ${logPath}`);\n } catch (error) {\n trackingSpinner?.fail(\"Failed to write contribution log\");\n if (globalOptions.verbose && !outputJson) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(ui.yellow(`[oac] Tracking failed: ${message}`));\n }\n }\n\n const summary: RunSummaryOutput = {\n 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,\n };\n\n if (outputJson) {\n console.log(\n JSON.stringify(\n {\n summary,\n plan,\n tasks: completedTasks,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n renderTaskResults(ui, completedTasks);\n console.log(\"\");\n console.log(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 (logPath) {\n console.log(` Log: ${logPath}`);\n }\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction createSpinner(enabled: boolean, text: string): Ora | null {\n if (enabled) {\n return null;\n }\n\n return ora({ text, color: \"blue\" }).start();\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nfunction parseTokens(value: string): number {\n if (value.toLowerCase() === \"unlimited\") {\n return UNLIMITED_BUDGET;\n }\n return parseInteger(value);\n}\n\nfunction formatBudgetDisplay(budget: number): string {\n if (budget >= UNLIMITED_BUDGET) {\n return \"unlimited\";\n }\n return formatInteger(budget);\n}\n\nfunction validateRunOptions(options: RunCommandOptions): void {\n if (typeof options.concurrency === \"number\" && options.concurrency <= 0) {\n throw new Error(\"--concurrency must be greater than zero.\");\n }\n\n if (typeof options.timeout === \"number\" && options.timeout <= 0) {\n throw new Error(\"--timeout must be greater than zero.\");\n }\n\n if (typeof options.maxTasks === \"number\" && options.maxTasks <= 0) {\n throw new Error(\"--max-tasks must be greater than zero when provided.\");\n }\n}\n\nasync function loadOptionalConfig(\n configPath: string,\n verbose: boolean,\n ui: ChalkInstance,\n): Promise<OacConfig | null> {\n return loadOptionalConfigFile(configPath, {\n onWarning: verbose\n ? (message) => {\n console.warn(ui.yellow(`[oac] ${message}`));\n }\n : undefined,\n });\n}\n\nfunction resolveRepoInput(repoOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = repoOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n const firstConfiguredRepo = config?.repos[0];\n if (typeof firstConfiguredRepo === \"string\") {\n return firstConfiguredRepo;\n }\n\n if (\n firstConfiguredRepo &&\n typeof firstConfiguredRepo === \"object\" &&\n \"name\" in firstConfiguredRepo &&\n typeof firstConfiguredRepo.name === \"string\"\n ) {\n return firstConfiguredRepo.name;\n }\n\n throw new Error(\"No repository specified. Use --repo or configure repos in oac.config.ts.\");\n}\n\nasync function resolveAdapter(\n providerId: string,\n): Promise<{ adapter: AgentProvider | null; useRealExecution: boolean }> {\n // Normalize legacy ID\n const normalizedId = providerId === \"codex-cli\" ? \"codex\" : providerId;\n\n const adapters: Record<string, () => AgentProvider> = {\n codex: () => new CodexAdapter(),\n \"claude-code\": () => new ClaudeCodeAdapter(),\n };\n\n const factory = adapters[normalizedId];\n if (!factory) {\n return { adapter: null, useRealExecution: false };\n }\n\n const adapter = factory();\n const availability = await adapter.checkAvailability();\n return { adapter: availability.available ? adapter : null, useRealExecution: availability.available };\n}\n\nfunction resolveProviderId(providerOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = providerOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n return config?.provider.id ?? \"claude-code\";\n}\n\nfunction resolveBudget(tokensOption: number | undefined, config: OacConfig | null): number {\n const budget = tokensOption ?? config?.budget.totalTokens ?? 100_000;\n if (!Number.isFinite(budget) || budget <= 0) {\n throw new Error(\"Token budget must be a positive number.\");\n }\n\n return Math.floor(budget);\n}\n\nfunction resolveMode(modeOption: string | undefined, config: OacConfig | null): RunMode {\n const candidate = (modeOption ?? config?.execution.mode ?? \"new-pr\").trim();\n if (candidate === \"new-pr\" || candidate === \"update-pr\" || candidate === \"direct-commit\") {\n return candidate;\n }\n\n throw new Error(`Invalid --mode value \"${candidate}\".`);\n}\n\nfunction resolveConcurrency(\n concurrencyOption: number | undefined,\n config: OacConfig | null,\n): number {\n const configuredConcurrency =\n typeof concurrencyOption === \"number\"\n ? concurrencyOption\n : (config?.execution.concurrency ?? DEFAULT_CONCURRENCY);\n\n if (!Number.isFinite(configuredConcurrency) || configuredConcurrency <= 0) {\n throw new Error(\"Concurrency must be a positive integer.\");\n }\n\n return Math.floor(configuredConcurrency);\n}\n\nfunction resolveTimeout(timeoutOption: number | undefined, config: OacConfig | null): number {\n const configuredTimeout =\n typeof timeoutOption === \"number\"\n ? timeoutOption\n : (config?.execution.taskTimeout ?? DEFAULT_TIMEOUT_SECONDS);\n\n if (!Number.isFinite(configuredTimeout) || configuredTimeout <= 0) {\n throw new Error(\"Timeout must be a positive integer.\");\n }\n\n return Math.floor(configuredTimeout);\n}\n\nfunction selectScannersFromConfig(\n config: OacConfig | null,\n hasGitHubAuth: boolean,\n): {\n enabled: SupportedScanner[];\n scanner: CompositeScanner;\n} {\n const enabled: SupportedScanner[] = [];\n\n if (config?.discovery.scanners.lint !== false) {\n enabled.push(\"lint\");\n }\n if (config?.discovery.scanners.todo !== false) {\n enabled.push(\"todo\");\n }\n\n // Always include test-gap for autonomous code analysis\n enabled.push(\"test-gap\");\n\n // Include GitHub issues scanner when a GitHub token is available.\n if (hasGitHubAuth) {\n enabled.push(\"github-issues\");\n }\n\n if (enabled.length === 0) {\n enabled.push(\"lint\", \"todo\", \"test-gap\");\n }\n\n const uniqueEnabled = [...new Set(enabled)];\n const scannerInstances: Scanner[] = uniqueEnabled.map((scannerName) => {\n if (scannerName === \"lint\") return new LintScanner();\n if (scannerName === \"github-issues\") return new GitHubIssuesScanner();\n if (scannerName === \"test-gap\") return new TestGapScanner();\n return new TodoScanner();\n });\n\n return {\n enabled: uniqueEnabled,\n scanner: new CompositeScanner(scannerInstances),\n };\n}\n\nasync function estimateTaskMap(\n tasks: Task[],\n providerId: string,\n): Promise<Map<string, TokenEstimate>> {\n const entries = await Promise.all(\n tasks.map(async (task) => {\n const estimate = await estimateTokens(task, providerId);\n return [task.id, estimate] as const;\n }),\n );\n\n return new Map(entries);\n}\n\nasync function executeWithAgent(input: {\n task: Task;\n estimate: TokenEstimate;\n adapter: AgentProvider;\n repoPath: string;\n baseBranch: string;\n timeoutSeconds: number;\n}): Promise<{ execution: ExecutionOutcome; sandbox: SandboxInfo }> {\n const startedAt = Date.now();\n const taskSlug = input.task.id\n .replace(/[^a-zA-Z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .slice(0, 30);\n const branchName = `oac/${Date.now()}-${taskSlug}`;\n\n const sandbox = await createSandbox(input.repoPath, branchName, input.baseBranch);\n const eventBus = createEventBus();\n const sandboxInfo: SandboxInfo = {\n branchName,\n sandboxPath: sandbox.path,\n cleanup: sandbox.cleanup,\n };\n\n try {\n const result = await workerExecuteTask(input.adapter, input.task, sandbox, eventBus, {\n tokenBudget: input.estimate.totalEstimatedTokens,\n timeoutMs: input.timeoutSeconds * 1_000,\n });\n\n // Agent may edit files without committing — stage and commit any changes\n const commitResult = await commitSandboxChanges(sandbox.path, input.task);\n\n const filesChanged =\n commitResult.filesChanged.length > 0\n ? commitResult.filesChanged\n : result.filesChanged.length > 0\n ? result.filesChanged\n : [];\n\n return {\n execution: {\n success: result.success || commitResult.hasChanges,\n exitCode: result.exitCode,\n totalTokensUsed: result.totalTokensUsed,\n filesChanged,\n duration: result.duration > 0 ? result.duration / 1_000 : (Date.now() - startedAt) / 1_000,\n error: result.error,\n },\n sandbox: sandboxInfo,\n };\n } catch (error) {\n // Even on error, check if agent left uncommitted changes\n const commitResult = await commitSandboxChanges(sandbox.path, input.task);\n if (commitResult.hasChanges) {\n return {\n execution: {\n success: true,\n exitCode: 0,\n totalTokensUsed: 0,\n filesChanged: commitResult.filesChanged,\n duration: (Date.now() - startedAt) / 1_000,\n },\n sandbox: sandboxInfo,\n };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return {\n execution: {\n success: false,\n exitCode: 1,\n totalTokensUsed: 0,\n filesChanged: [],\n duration: (Date.now() - startedAt) / 1_000,\n error: message,\n },\n sandbox: sandboxInfo,\n };\n }\n}\n\n\nasync function createPullRequest(input: {\n task: Task;\n execution: ExecutionOutcome;\n sandbox?: SandboxInfo;\n repoFullName: string;\n baseBranch: string;\n ghToken?: string;\n}): Promise<\n | {\n number: number;\n url: string;\n status: \"open\" | \"merged\" | \"closed\";\n }\n | undefined\n> {\n if (!input.sandbox) {\n return undefined;\n }\n\n const { branchName, sandboxPath } = input.sandbox;\n const [owner, repo] = input.repoFullName.split(\"/\");\n\n try {\n // Build env with explicit GitHub token to avoid interactive device flow\n const ghEnv: Record<string, string> = { ...process.env } as Record<string, string>;\n if (input.ghToken) {\n ghEnv.GH_TOKEN = input.ghToken;\n ghEnv.GITHUB_TOKEN = input.ghToken;\n }\n\n // Push the branch from the sandbox worktree\n await execa(\"git\", [\"push\", \"--set-upstream\", \"origin\", branchName], {\n cwd: sandboxPath,\n env: ghEnv,\n });\n\n // Create PR using gh CLI\n const prTitle = `[OAC] ${input.task.title}`;\n const prBodyLines = [\n \"## Summary\",\n \"\",\n input.task.description || `Automated contribution for task \"${input.task.title}\".`,\n \"\",\n ];\n\n // Auto-resolve: link PR to GitHub issue so it closes on merge\n if (input.task.linkedIssue) {\n prBodyLines.push(\n `Closes #${input.task.linkedIssue.number}`,\n \"\",\n );\n }\n\n prBodyLines.push(\n \"## Context\",\n \"\",\n `- **Task source:** ${input.task.source}`,\n `- **Complexity:** ${input.task.complexity}`,\n `- **Tokens used:** ${input.execution.totalTokensUsed}`,\n `- **Files changed:** ${input.execution.filesChanged.length}`,\n );\n\n if (input.task.linkedIssue) {\n prBodyLines.push(`- **Resolves:** #${input.task.linkedIssue.number}`);\n }\n\n prBodyLines.push(\n \"\",\n \"---\",\n \"*This PR was automatically generated by [OAC](https://github.com/Open330/open-agent-contribution).*\",\n );\n\n const prBody = prBodyLines.join(\"\\n\");\n\n const ghResult = await execa(\n \"gh\",\n [\n \"pr\",\n \"create\",\n \"--repo\",\n input.repoFullName,\n \"--title\",\n prTitle,\n \"--body\",\n prBody,\n \"--head\",\n branchName,\n \"--base\",\n input.baseBranch,\n ],\n { cwd: sandboxPath, env: ghEnv },\n );\n\n // Parse PR URL from gh output\n const prUrl = ghResult.stdout.trim();\n const prNumberMatch = prUrl.match(/\\/pull\\/(\\d+)/);\n const prNumber = prNumberMatch ? Number.parseInt(prNumberMatch[1], 10) : 0;\n\n return {\n number: prNumber,\n url: prUrl,\n status: \"open\",\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`[oac] PR creation failed: ${message}`);\n return undefined;\n }\n}\n\nasync function simulateExecution(task: Task, estimate: TokenEstimate): Promise<ExecutionOutcome> {\n const start = Date.now();\n const delayMs = Math.min(1_500, Math.max(150, Math.round(estimate.totalEstimatedTokens / 40)));\n await sleep(delayMs);\n\n return {\n success: true,\n exitCode: 0,\n totalTokensUsed: Math.max(1, Math.round(estimate.totalEstimatedTokens * 0.9)),\n filesChanged:\n task.targetFiles.length > 0\n ? task.targetFiles.slice(0, Math.min(task.targetFiles.length, 4))\n : [],\n duration: (Date.now() - start) / 1_000,\n };\n}\n\nasync function commitSandboxChanges(\n sandboxPath: string,\n task: Task,\n): Promise<{ hasChanges: boolean; filesChanged: string[] }> {\n try {\n // Check for any uncommitted changes (staged + unstaged + untracked)\n const statusResult = await execa(\"git\", [\"status\", \"--porcelain\"], { cwd: sandboxPath });\n if (!statusResult.stdout.trim()) {\n return { hasChanges: false, filesChanged: [] };\n }\n\n await execa(\"git\", [\"add\", \"-A\"], { cwd: sandboxPath });\n await execa(\n \"git\",\n [\"commit\", \"-m\", `[OAC] ${task.title}\\n\\nAutomated contribution by OAC using Codex CLI.`],\n { cwd: sandboxPath },\n );\n\n // Get the list of changed files from the commit\n const diffResult = await execa(\"git\", [\"diff\", \"--name-only\", \"HEAD~1\", \"HEAD\"], {\n cwd: sandboxPath,\n });\n const changedFiles = diffResult.stdout.trim().split(\"\\n\").filter(Boolean);\n\n return { hasChanges: true, filesChanged: changedFiles };\n } catch {\n return { hasChanges: false, filesChanged: [] };\n }\n}\n\nfunction buildContributionLog(input: {\n runId: string;\n repoFullName: string;\n repoHeadSha: string;\n defaultBranch: string;\n repoOwner: string;\n providerId: string;\n totalBudget: number;\n runDurationSeconds: number;\n discoveredTasks: number;\n taskResults: TaskRunResult[];\n}): ContributionLog {\n const timestamp = new Date().toISOString();\n const contributor = resolveGithubUsername(input.repoOwner);\n\n const contributionTasks = input.taskResults.map((result) => ({\n taskId: result.task.id,\n title: result.task.title,\n source: result.task.source,\n complexity: result.task.complexity,\n status: deriveTaskStatus(result.execution),\n tokensUsed: Math.max(0, Math.floor(result.execution.totalTokensUsed)),\n duration: Math.max(0, result.execution.duration),\n filesChanged: result.execution.filesChanged,\n pr: result.pr,\n linkedIssue: result.task.linkedIssue\n ? {\n number: result.task.linkedIssue.number,\n url: result.task.linkedIssue.url,\n }\n : undefined,\n error: result.execution.error,\n }));\n\n const tasksSucceeded = contributionTasks.filter((task) => task.status !== \"failed\").length;\n const tasksFailed = contributionTasks.length - tasksSucceeded;\n const totalTokensUsed = contributionTasks.reduce((sum, task) => sum + task.tokensUsed, 0);\n const totalFilesChanged = contributionTasks.reduce(\n (sum, task) => sum + task.filesChanged.length,\n 0,\n );\n\n return {\n version: \"1.0\",\n runId: input.runId,\n timestamp,\n contributor: {\n githubUsername: contributor,\n email: process.env.GIT_AUTHOR_EMAIL ?? undefined,\n },\n repo: {\n fullName: input.repoFullName,\n headSha: input.repoHeadSha,\n defaultBranch: input.defaultBranch,\n },\n budget: {\n provider: input.providerId,\n totalTokensBudgeted: input.totalBudget,\n totalTokensUsed,\n },\n tasks: contributionTasks,\n metrics: {\n tasksDiscovered: input.discoveredTasks,\n tasksAttempted: contributionTasks.length,\n tasksSucceeded,\n tasksFailed,\n totalDuration: Math.max(0, input.runDurationSeconds),\n totalFilesChanged,\n totalLinesAdded: 0,\n totalLinesRemoved: 0,\n },\n };\n}\n\nfunction deriveTaskStatus(execution: ExecutionOutcome): CompletionStatus {\n if (execution.success) {\n return \"success\";\n }\n\n if (execution.filesChanged.length > 0) {\n return \"partial\";\n }\n\n return \"failed\";\n}\n\nfunction resolveGithubUsername(fallback: string): string {\n const candidates = [\n process.env.GITHUB_USER,\n process.env.GITHUB_USERNAME,\n process.env.USER,\n process.env.LOGNAME,\n fallback,\n \"oac-user\",\n ];\n\n for (const candidate of candidates) {\n const normalized = sanitizeGithubUsername(candidate ?? \"\");\n if (normalized) {\n return normalized;\n }\n }\n\n return \"oac-user\";\n}\n\nfunction sanitizeGithubUsername(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n const cleaned = trimmed\n .replace(/[^A-Za-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n if (cleaned.length === 0 || cleaned.length > 39) {\n return null;\n }\n\n if (!/^(?!-)[A-Za-z0-9-]+(?<!-)$/.test(cleaned)) {\n return null;\n }\n\n return cleaned;\n}\n\nfunction renderSelectedPlanTable(\n ui: ChalkInstance,\n plan: ReturnType<typeof buildExecutionPlan>,\n budget: number,\n): void {\n const table = new Table({\n head: [\"#\", \"Task\", \"Est. Tokens\", \"Cumulative\", \"Confidence\"],\n });\n\n for (let index = 0; index < plan.selectedTasks.length; index += 1) {\n const entry = plan.selectedTasks[index];\n table.push([\n String(index + 1),\n truncate(entry.task.title, 56),\n formatInteger(entry.estimate.totalEstimatedTokens),\n formatInteger(entry.cumulativeBudgetUsed),\n entry.estimate.confidence.toFixed(2),\n ]);\n }\n\n if (plan.selectedTasks.length > 0) {\n console.log(table.toString());\n } else {\n console.log(ui.yellow(\"No tasks selected for execution.\"));\n }\n\n console.log(\"\");\n console.log(\n `Budget used: ${formatInteger(\n plan.selectedTasks[plan.selectedTasks.length - 1]?.cumulativeBudgetUsed ?? 0,\n )} / ${formatBudgetDisplay(budget - plan.reserveTokens)} (effective)`,\n );\n console.log(`Reserve: ${formatBudgetDisplay(plan.reserveTokens)} (10%)`);\n console.log(`Remaining: ${formatBudgetDisplay(plan.remainingTokens)}`);\n\n if (plan.deferredTasks.length > 0) {\n console.log(\"\");\n console.log(ui.yellow(`Deferred (${plan.deferredTasks.length}):`));\n for (const deferred of plan.deferredTasks) {\n console.log(\n ` - ${truncate(deferred.task.title, 72)} (${formatInteger(\n deferred.estimate.totalEstimatedTokens,\n )} tokens, ${deferred.reason.replaceAll(\"_\", \" \")})`,\n );\n }\n }\n}\n\nfunction renderTaskResults(ui: ChalkInstance, taskResults: TaskRunResult[]): void {\n for (let index = 0; index < taskResults.length; index += 1) {\n const result = taskResults[index];\n const icon = result.execution.success ? ui.green(\"[OK]\") : ui.red(\"[X]\");\n const status = result.execution.success ? ui.green(\"SUCCESS\") : ui.red(\"FAILED\");\n\n console.log(`${icon} [${index + 1}/${taskResults.length}] ${result.task.title}`);\n console.log(\n ` ${status} | tokens ${formatInteger(result.execution.totalTokensUsed)} | duration ${formatDuration(\n result.execution.duration,\n )}`,\n );\n if (result.pr) {\n console.log(` PR #${result.pr.number}: ${result.pr.url}`);\n }\n if (result.execution.error) {\n console.log(` Error: ${result.execution.error}`);\n }\n }\n}\n\nasync function runWithConcurrency<T, R>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n if (items.length === 0) {\n return [];\n }\n\n const results: R[] = new Array(items.length);\n let nextIndex = 0;\n\n const runWorker = async (): Promise<void> => {\n while (true) {\n const currentIndex = nextIndex;\n nextIndex += 1;\n if (currentIndex >= items.length) {\n return;\n }\n\n results[currentIndex] = await worker(items[currentIndex], currentIndex);\n }\n };\n\n const workerCount = Math.min(concurrency, items.length);\n await Promise.all(Array.from({ length: workerCount }, () => runWorker()));\n\n return results;\n}\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n return await new Promise((resolvePromise, rejectPromise) => {\n const timeout = setTimeout(() => {\n rejectPromise(new Error(`Timed out after ${Math.round(timeoutMs / 1000)}s`));\n }, timeoutMs);\n\n promise.then(\n (value) => {\n clearTimeout(timeout);\n resolvePromise(value);\n },\n (error) => {\n clearTimeout(timeout);\n rejectPromise(error);\n },\n );\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolvePromise) => {\n setTimeout(resolvePromise, ms);\n });\n}\n\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) {\n return \"0s\";\n }\n\n if (seconds < 60) {\n return `${seconds.toFixed(1)}s`;\n }\n\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = Math.round(seconds % 60);\n return `${minutes}m ${remainingSeconds}s`;\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n","import type { OacConfig } from \"@open330/oac-core\";\nimport {\n CompositeScanner,\n GitHubIssuesScanner,\n LintScanner,\n type Scanner,\n TestGapScanner,\n TodoScanner,\n rankTasks,\n} from \"@open330/oac-discovery\";\nimport { cloneRepo, resolveRepo } from \"@open330/oac-repo\";\nimport { ensureGitHubAuth } from \"../github-auth.js\";\nimport chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\nimport ora, { type Ora } from \"ora\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\nimport { loadOptionalConfigFile } from \"../config-loader.js\";\n\ninterface ScanCommandOptions {\n repo?: string;\n scanners?: string;\n minPriority: number;\n format: string;\n}\n\ntype OutputFormat = \"table\" | \"json\";\ntype SupportedScanner = \"lint\" | \"todo\" | \"github-issues\" | \"test-gap\";\n\nconst SUPPORTED_SCANNERS: SupportedScanner[] = [\"lint\", \"todo\", \"github-issues\", \"test-gap\"];\n\nexport function createScanCommand(): Command {\n const command = new Command(\"scan\");\n\n command\n .description(\"Discover tasks in a repository\")\n .option(\"--repo <owner/repo>\", \"Target repository (owner/repo or GitHub URL)\")\n .option(\"--scanners <names>\", \"Comma-separated scanner filter (lint,todo)\")\n .option(\"--min-priority <number>\", \"Minimum priority threshold (0-100)\", parseInteger, 20)\n .option(\"--format <format>\", \"Output format: table|json\", \"table\")\n .action(async (options: ScanCommandOptions, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n\n const outputFormat = normalizeOutputFormat(options.format);\n const outputJson = globalOptions.json || outputFormat === \"json\";\n\n if (options.minPriority < 0 || options.minPriority > 100) {\n throw new Error(\"--min-priority must be between 0 and 100.\");\n }\n\n const config = await loadOptionalConfig(globalOptions.config, globalOptions.verbose, ui);\n const repoInput = resolveRepoInput(options.repo, config);\n const ghToken = ensureGitHubAuth();\n const scannerSelection = selectScanners(options.scanners, config, Boolean(ghToken));\n\n if (!outputJson && scannerSelection.unknown.length > 0) {\n console.log(\n ui.yellow(\n `Ignoring unsupported scanner(s): ${scannerSelection.unknown.join(\", \")}. Supported scanners: ${SUPPORTED_SCANNERS.join(\", \")}.`,\n ),\n );\n }\n\n const resolveSpinner = createSpinner(outputJson, \"Resolving repository...\");\n const resolvedRepo = await resolveRepo(repoInput);\n resolveSpinner?.succeed(`Resolved ${resolvedRepo.fullName}`);\n\n const cloneSpinner = createSpinner(outputJson, \"Preparing local clone...\");\n await cloneRepo(resolvedRepo);\n cloneSpinner?.succeed(`Repository ready at ${resolvedRepo.localPath}`);\n\n const scanSpinner = createSpinner(\n outputJson,\n `Running scanners: ${scannerSelection.enabled.join(\", \")}`,\n );\n\n const scannedTasks = await scannerSelection.scanner.scan(resolvedRepo.localPath, {\n exclude: config?.discovery.exclude,\n maxTasks: config?.discovery.maxTasks,\n repo: resolvedRepo,\n });\n\n scanSpinner?.succeed(`Scanned ${resolvedRepo.fullName}`);\n\n const rankedTasks = rankTasks(scannedTasks).filter(\n (task) => task.priority >= options.minPriority,\n );\n\n if (outputJson) {\n console.log(\n JSON.stringify(\n {\n repo: resolvedRepo.fullName,\n scanners: scannerSelection.enabled,\n minPriority: options.minPriority,\n totalTasks: rankedTasks.length,\n tasks: rankedTasks,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (rankedTasks.length === 0) {\n console.log(ui.yellow(\"No tasks discovered for the selected criteria.\"));\n return;\n }\n\n const table = new Table({\n head: [\"ID\", \"Title\", \"Source\", \"Priority\", \"Complexity\"],\n });\n\n for (const task of rankedTasks) {\n table.push([\n task.id,\n truncate(task.title, 60),\n task.source,\n String(task.priority),\n task.complexity,\n ]);\n }\n\n console.log(table.toString());\n console.log(\"\");\n console.log(\n ui.blue(\n `Found ${rankedTasks.length} task(s). Use \\`oac plan --repo ${resolvedRepo.fullName} --tokens <n>\\` to build an execution plan.`,\n ),\n );\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction createSpinner(enabled: boolean, text: string): Ora | null {\n if (enabled) {\n return null;\n }\n\n return ora({ text, color: \"blue\" }).start();\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nfunction normalizeOutputFormat(value: string): OutputFormat {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"table\" || normalized === \"json\") {\n return normalized;\n }\n\n throw new Error(`Unsupported --format value \"${value}\". Use \"table\" or \"json\".`);\n}\n\nasync function loadOptionalConfig(\n configPath: string,\n verbose: boolean,\n ui: ChalkInstance,\n): Promise<OacConfig | null> {\n return loadOptionalConfigFile(configPath, {\n onWarning: verbose\n ? (message) => {\n console.warn(ui.yellow(`[oac] ${message}`));\n }\n : undefined,\n });\n}\n\nfunction resolveRepoInput(repoOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = repoOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n const firstConfiguredRepo = config?.repos[0];\n if (typeof firstConfiguredRepo === \"string\") {\n return firstConfiguredRepo;\n }\n\n if (\n firstConfiguredRepo &&\n typeof firstConfiguredRepo === \"object\" &&\n \"name\" in firstConfiguredRepo &&\n typeof firstConfiguredRepo.name === \"string\"\n ) {\n return firstConfiguredRepo.name;\n }\n\n throw new Error(\"No repository specified. Use --repo or configure repos in oac.config.ts.\");\n}\n\nfunction selectScanners(\n scannerOption: string | undefined,\n config: OacConfig | null,\n hasGitHubAuth = false,\n): {\n enabled: SupportedScanner[];\n unknown: string[];\n scanner: CompositeScanner;\n} {\n const defaultScanners: SupportedScanner[] = [\"lint\", \"todo\", \"test-gap\"];\n if (hasGitHubAuth) {\n defaultScanners.push(\"github-issues\");\n }\n const requested = scannerOption\n ? parseCsv(scannerOption)\n : (scannersFromConfig(config, hasGitHubAuth) ?? defaultScanners);\n\n const enabled: SupportedScanner[] = [];\n const unknown: string[] = [];\n\n for (const scannerName of requested) {\n const normalized = scannerName.toLowerCase();\n if (normalized === \"lint\" || normalized === \"todo\" || normalized === \"github-issues\" || normalized === \"test-gap\") {\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(config: OacConfig | null, hasGitHubAuth = false): SupportedScanner[] | null {\n if (!config) {\n return null;\n }\n\n const configured: SupportedScanner[] = [];\n if (config.discovery.scanners.lint) {\n configured.push(\"lint\");\n }\n if (config.discovery.scanners.todo) {\n configured.push(\"todo\");\n }\n // Always include test-gap for autonomous discovery\n configured.push(\"test-gap\");\n if (hasGitHubAuth) {\n configured.push(\"github-issues\");\n }\n\n if (configured.length === 0) {\n return null;\n }\n\n return configured;\n}\n\nfunction parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { Command } from \"commander\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ninterface StatusCommandOptions {\n watch?: boolean;\n}\n\ninterface RunStatus {\n runId: string;\n startedAt: string;\n agent: string;\n tasks: RunStatusTask[];\n}\n\ninterface RunStatusTask {\n taskId: string;\n title: string;\n status: \"pending\" | \"running\" | \"completed\" | \"failed\";\n startedAt?: string;\n completedAt?: string;\n error?: string;\n}\n\nconst WATCH_INTERVAL_MS = 2_000;\n\nexport function createStatusCommand(): Command {\n const command = new Command(\"status\");\n\n command\n .description(\"Show current job status\")\n .option(\"--watch\", \"Poll every 2 seconds\", false)\n .action(async (options: StatusCommandOptions, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n\n const render = async (): Promise<void> => {\n const status = await readRunStatus(process.cwd());\n renderStatusOutput(status, globalOptions.json);\n };\n\n await render();\n\n if (!options.watch) {\n return;\n }\n\n setInterval(() => {\n console.clear();\n void render().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n });\n }, WATCH_INTERVAL_MS);\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nasync function readRunStatus(repoPath: string): Promise<RunStatus | null> {\n const statusPath = resolve(repoPath, \".oac\", \"status.json\");\n\n try {\n const raw = await readFile(statusPath, \"utf8\");\n const payload = JSON.parse(raw) as unknown;\n return parseRunStatus(payload);\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return null;\n }\n\n throw error;\n }\n}\n\nfunction parseRunStatus(payload: unknown): RunStatus {\n if (!isRecord(payload)) {\n throw new Error(\"Invalid .oac/status.json format.\");\n }\n\n const runId = payload.runId;\n const startedAt = payload.startedAt;\n const agent = payload.agent;\n const tasks = payload.tasks;\n\n if (\n typeof runId !== \"string\" ||\n typeof startedAt !== \"string\" ||\n typeof agent !== \"string\" ||\n !Array.isArray(tasks)\n ) {\n throw new Error(\"Invalid .oac/status.json format.\");\n }\n\n return {\n runId,\n startedAt,\n agent,\n tasks: tasks.map((task, index) => parseRunStatusTask(task, index)),\n };\n}\n\nfunction parseRunStatusTask(task: unknown, index: number): RunStatusTask {\n if (!isRecord(task)) {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n const taskId = task.taskId;\n const title = task.title;\n const status = task.status;\n const startedAt = task.startedAt;\n const completedAt = task.completedAt;\n const error = task.error;\n\n if (\n typeof taskId !== \"string\" ||\n typeof title !== \"string\" ||\n (status !== \"pending\" && status !== \"running\" && status !== \"completed\" && status !== \"failed\")\n ) {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n if (startedAt !== undefined && typeof startedAt !== \"string\") {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n if (completedAt !== undefined && typeof completedAt !== \"string\") {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n if (error !== undefined && typeof error !== \"string\") {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n return {\n taskId,\n title,\n status,\n startedAt,\n completedAt,\n error,\n };\n}\n\nfunction renderStatusOutput(status: RunStatus | null, outputJson: boolean): void {\n if (outputJson) {\n if (!status) {\n console.log(\n JSON.stringify(\n {\n active: false,\n message: \"No active runs\",\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log(\n JSON.stringify(\n {\n active: true,\n status,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (!status) {\n console.log(\"No active runs\");\n return;\n }\n\n const runningTasks = status.tasks.filter((task) => task.status === \"running\");\n const completedTasks = status.tasks.filter((task) => task.status === \"completed\");\n const failedTasks = status.tasks.filter((task) => task.status === \"failed\");\n\n console.log(`Run ID: ${status.runId}`);\n console.log(`Start Time: ${status.startedAt}`);\n console.log(`Agent: ${status.agent}`);\n console.log(\n `Tasks In Progress (${String(runningTasks.length)}): ${formatTaskList(runningTasks)}`,\n );\n console.log(\n `Completed Tasks (${String(completedTasks.length)}): ${formatTaskList(completedTasks)}`,\n );\n\n if (failedTasks.length === 0) {\n console.log(\"Errors: none\");\n return;\n }\n\n console.log(`Errors (${String(failedTasks.length)}):`);\n for (const task of failedTasks) {\n console.log(`- ${task.taskId}: ${task.error ?? \"Unknown error\"}`);\n }\n}\n\nfunction formatTaskList(tasks: RunStatusTask[]): string {\n if (tasks.length === 0) {\n return \"-\";\n }\n\n return tasks.map((task) => `${task.taskId} (${task.title})`).join(\", \");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n if (!isRecord(error)) {\n return false;\n }\n\n return error.code === \"ENOENT\";\n}\n"],"mappings":"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","names":["readFile","Command","chalk","Chalk","Command","getGlobalOptions","createUi","input","resolve","Command","getGlobalOptions","readFile","readdir","resolve","contributionLogSchema","Table","Command","parseInteger","getGlobalOptions","readContributionLogs","formatInteger","isFileNotFoundError","chalk","Chalk","Table","Command","fsConstants","access","readFile","resolve","pathExists","Command","parseInteger","getGlobalOptions","createUi","Chalk","chalk","Table","formatInteger","buildExecutionPlan","estimateTokens","CompositeScanner","LintScanner","TodoScanner","rankTasks","cloneRepo","resolveRepo","chalk","Chalk","Table","Command","ora","Command","parseInteger","getGlobalOptions","createUi","loadOptionalConfig","resolveRepoInput","resolveProviderId","resolveBudget","selectScannersFromConfig","createSpinner","resolveRepo","cloneRepo","rankTasks","estimateTaskMap","buildExecutionPlan","formatInteger","Chalk","chalk","ora","LintScanner","TodoScanner","CompositeScanner","estimateTokens","input","Table","truncate","formatInteger","truncate","CompositeScanner","GitHubIssuesScanner","LintScanner","TestGapScanner","TodoScanner","rankTasks","cloneRepo","resolveRepo","chalk","Chalk","Table","Command","ora","Command","parseInteger","getGlobalOptions","createUi","loadOptionalConfig","resolveRepoInput","createSpinner","resolveRepo","cloneRepo","rankTasks","Table","truncate","Chalk","chalk","ora","LintScanner","GitHubIssuesScanner","TestGapScanner","TodoScanner","CompositeScanner","readFile","resolve","Command","getGlobalOptions","isFileNotFoundError","isRecord","readFile","Command"]}
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createCliProgram,
3
3
  runCli
4
- } from "./chunk-WC2NAMI3.js";
4
+ } from "./chunk-Z7KEQPGV.js";
5
5
  export {
6
6
  createCliProgram,
7
7
  runCli
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runCli
4
- } from "./chunk-WC2NAMI3.js";
4
+ } from "./chunk-Z7KEQPGV.js";
5
5
 
6
6
  // src/index.ts
7
7
  runCli().catch((error) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open330/oac",
3
- "version": "2026.3.5",
3
+ "version": "2026.3.6",
4
4
  "description": "CLI for Open Agent Contribution - automate open source contributions with AI agents",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -37,13 +37,13 @@
37
37
  "commander": "^13.1.0",
38
38
  "execa": "^9.5.2",
39
39
  "ora": "^8.1.1",
40
- "@open330/oac-core": "2026.3.5",
41
- "@open330/oac-discovery": "2026.3.5",
42
- "@open330/oac-repo": "2026.3.5",
43
- "@open330/oac-budget": "2026.3.5",
44
- "@open330/oac-completion": "2026.3.5",
45
- "@open330/oac-execution": "2026.3.5",
46
- "@open330/oac-tracking": "2026.3.5"
40
+ "@open330/oac-repo": "2026.3.6",
41
+ "@open330/oac-discovery": "2026.3.6",
42
+ "@open330/oac-core": "2026.3.6",
43
+ "@open330/oac-budget": "2026.3.6",
44
+ "@open330/oac-execution": "2026.3.6",
45
+ "@open330/oac-completion": "2026.3.6",
46
+ "@open330/oac-tracking": "2026.3.6"
47
47
  },
48
48
  "devDependencies": {
49
49
  "tsup": "^8.3.6",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/doctor.ts","../src/commands/init.ts","../src/commands/leaderboard.ts","../src/commands/log.ts","../src/commands/plan.ts","../src/github-auth.ts","../src/config-loader.ts","../src/commands/run.ts","../src/commands/scan.ts","../src/commands/status.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { Command } from \"commander\";\n\nimport { createDoctorCommand } from \"./commands/doctor.js\";\nimport { createInitCommand } from \"./commands/init.js\";\nimport { createLeaderboardCommand } from \"./commands/leaderboard.js\";\nimport { createLogCommand } from \"./commands/log.js\";\nimport { createPlanCommand } from \"./commands/plan.js\";\nimport { createRunCommand } from \"./commands/run.js\";\nimport { createScanCommand } from \"./commands/scan.js\";\nimport { createStatusCommand } from \"./commands/status.js\";\n\nexport interface GlobalCliOptions {\n config?: string;\n verbose?: boolean;\n json?: boolean;\n color?: boolean;\n}\n\nasync function readCliVersion(): Promise<string> {\n try {\n const packageJsonPath = new URL(\"../package.json\", import.meta.url);\n const packageJsonRaw = await readFile(packageJsonPath, \"utf8\");\n const packageJson = JSON.parse(packageJsonRaw) as { version?: unknown };\n\n if (typeof packageJson.version === \"string\" && packageJson.version.length > 0) {\n return packageJson.version;\n }\n } catch {\n // Fall back to a safe default when package metadata is unavailable.\n }\n\n return \"0.0.0\";\n}\n\nfunction registerCommands(program: Command): void {\n program.addCommand(createInitCommand());\n program.addCommand(createDoctorCommand());\n program.addCommand(createScanCommand());\n program.addCommand(createPlanCommand());\n program.addCommand(createRunCommand());\n program.addCommand(createLogCommand());\n program.addCommand(createLeaderboardCommand());\n program.addCommand(createStatusCommand());\n}\n\nexport async function createCliProgram(): Promise<Command> {\n const version = await readCliVersion();\n\n const program = new Command();\n program\n .name(\"oac\")\n .description(\"Open Agent Contribution CLI\")\n .version(version)\n .option(\"--config <path>\", \"Config file path\", \"oac.config.ts\")\n .option(\"--verbose\", \"Enable verbose logging\", false)\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .option(\"--no-color\", \"Disable ANSI colors\");\n\n registerCommands(program);\n\n return program;\n}\n\nexport async function runCli(argv: readonly string[] = process.argv): Promise<void> {\n const program = await createCliProgram();\n await program.parseAsync([...argv]);\n}\n","import { spawn } from \"node:child_process\";\n\nimport chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport { Command } from \"commander\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ntype DoctorStatus = \"pass\" | \"warn\" | \"fail\";\n\ninterface DoctorCheck {\n id: string;\n name: string;\n requirement: string;\n value: string;\n status: DoctorStatus;\n message?: string;\n}\n\ninterface CommandResult {\n ok: boolean;\n exitCode: number | null;\n stdout: string;\n stderr: string;\n errorCode?: string;\n errorMessage?: string;\n}\n\nconst MINIMUM_NODE_VERSION = \"24.0.0\";\n\nexport function createDoctorCommand(): Command {\n const command = new Command(\"doctor\");\n\n command.description(\"Check local environment readiness\").action(async (_options, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n\n const checks = await runDoctorChecks();\n const allPassed = checks.every((check) => check.status !== \"fail\");\n\n if (globalOptions.json) {\n console.log(\n JSON.stringify(\n {\n checks,\n allPassed,\n },\n null,\n 2,\n ),\n );\n } else {\n renderDoctorOutput(ui, checks, allPassed);\n }\n\n if (!allPassed) {\n process.exitCode = 1;\n }\n });\n\n return command;\n}\n\nasync function runDoctorChecks(): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = [];\n\n const nodeVersion = process.versions.node;\n checks.push({\n id: \"node\",\n name: \"Node.js\",\n requirement: `>= ${MINIMUM_NODE_VERSION}`,\n value: `v${nodeVersion}`,\n status: isVersionAtLeast(nodeVersion, MINIMUM_NODE_VERSION) ? \"pass\" : \"fail\",\n message: `Node.js ${MINIMUM_NODE_VERSION}+ is required.`,\n });\n\n const gitResult = await runCommand(\"git\", [\"--version\"]);\n const gitVersion = extractVersion(gitResult.stdout) ?? \"--\";\n checks.push({\n id: \"git\",\n name: \"git\",\n requirement: \"installed\",\n value: gitVersion,\n status: gitResult.ok ? \"pass\" : \"fail\",\n message: gitResult.ok ? undefined : explainCommandFailure(\"git\", gitResult),\n });\n\n const githubAuthCheck = await checkGithubAuth();\n checks.push(githubAuthCheck);\n\n const claudeResult = await runCommand(\"claude\", [\"--version\"]);\n const claudeVersion = extractVersion(claudeResult.stdout) ?? \"--\";\n checks.push({\n id: \"claude-cli\",\n name: \"Claude CLI\",\n requirement: \"installed\",\n value: claudeVersion,\n status: claudeResult.ok ? \"pass\" : \"fail\",\n message: claudeResult.ok ? undefined : explainCommandFailure(\"claude\", claudeResult),\n });\n\n const codexResult = await runCommand(\"codex\", [\"--version\"]);\n const codexVersion = extractVersion(codexResult.stdout) ?? \"--\";\n checks.push({\n id: \"codex\",\n name: \"Codex CLI\",\n requirement: \"installed\",\n value: codexVersion,\n status: codexResult.ok ? \"pass\" : \"fail\",\n message: codexResult.ok ? undefined : explainCommandFailure(\"codex\", codexResult),\n });\n\n return checks;\n}\n\nasync function checkGithubAuth(): Promise<DoctorCheck> {\n const envToken = process.env.GITHUB_TOKEN?.trim();\n if (envToken) {\n return {\n id: \"github-auth\",\n name: \"GitHub auth\",\n requirement: \"gh auth status or GITHUB_TOKEN\",\n value: `env:${maskToken(envToken)}`,\n status: \"pass\",\n };\n }\n\n const authResult = await runCommand(\"gh\", [\"auth\", \"status\"]);\n if (authResult.ok) {\n const hasRepoScope = authResult.stdout.includes(\"repo\");\n return {\n id: \"github-auth\",\n name: \"GitHub auth\",\n requirement: \"gh auth status or GITHUB_TOKEN\",\n value: \"gh auth status\",\n status: hasRepoScope ? \"pass\" : \"warn\",\n message: hasRepoScope\n ? undefined\n : \"Missing 'repo' scope — private repos won't work. Run: gh auth refresh -s repo\",\n };\n }\n\n return {\n id: \"github-auth\",\n name: \"GitHub auth\",\n requirement: \"gh auth status or GITHUB_TOKEN\",\n value: \"--\",\n status: \"fail\",\n message: \"No GitHub authentication detected. Set GITHUB_TOKEN or run `gh auth login`.\",\n };\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction renderDoctorOutput(ui: ChalkInstance, checks: DoctorCheck[], allPassed: boolean): void {\n console.log(\"Checking environment...\");\n console.log(\"\");\n\n for (const check of checks) {\n const iconMap = { pass: ui.green(\"[OK]\"), warn: ui.yellow(\"[!]\"), fail: ui.red(\"[X]\") };\n const statusMap = { pass: ui.green(\"PASS\"), warn: ui.yellow(\"WARN\"), fail: ui.red(\"FAIL\") };\n const icon = iconMap[check.status];\n const status = statusMap[check.status];\n\n const name = check.name.padEnd(12, \" \");\n const requirement = check.requirement.padEnd(30, \" \");\n const value = check.value.padEnd(14, \" \");\n\n console.log(` ${icon} ${name} ${requirement} ${value} ${status}`);\n\n if (check.status === \"fail\" && check.message) {\n console.log(` ${ui.red(check.message)}`);\n }\n if (check.status === \"warn\" && check.message) {\n console.log(` ${ui.yellow(check.message)}`);\n }\n }\n\n console.log(\"\");\n if (allPassed) {\n console.log(ui.green(\"All checks passed.\"));\n } else {\n console.log(ui.red(\"Some checks failed.\"));\n }\n}\n\nfunction extractVersion(output: string): string | undefined {\n const match = output.match(/v?(\\d+\\.\\d+\\.\\d+)/i);\n if (!match) {\n return undefined;\n }\n\n return `v${match[1]}`;\n}\n\nfunction explainCommandFailure(commandName: string, result: CommandResult): string {\n if (result.errorCode === \"ENOENT\") {\n return `${commandName} is not installed or not in PATH.`;\n }\n\n if (result.errorMessage) {\n return result.errorMessage;\n }\n\n if (result.stderr.trim().length > 0) {\n return result.stderr.trim();\n }\n\n return `${commandName} exited with code ${String(result.exitCode)}.`;\n}\n\nfunction maskToken(token: string): string {\n if (token.length <= 8) {\n return `${token.slice(0, 2)}****`;\n }\n\n return `${token.slice(0, 4)}****${token.slice(-2)}`;\n}\n\nfunction isVersionAtLeast(version: string, minimum: string): boolean {\n const current = version.split(\".\").map((part) => Number.parseInt(part, 10));\n const required = minimum.split(\".\").map((part) => Number.parseInt(part, 10));\n const length = Math.max(current.length, required.length);\n\n for (let index = 0; index < length; index += 1) {\n const currentPart = current[index] ?? 0;\n const requiredPart = required[index] ?? 0;\n\n if (currentPart > requiredPart) {\n return true;\n }\n\n if (currentPart < requiredPart) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction runCommand(command: string, args: string[]): Promise<CommandResult> {\n return new Promise((resolvePromise) => {\n const child = spawn(command, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let resolved = false;\n\n child.stdout?.setEncoding(\"utf8\");\n child.stderr?.setEncoding(\"utf8\");\n\n child.stdout?.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n\n child.stderr?.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n\n child.once(\"error\", (error) => {\n if (resolved) {\n return;\n }\n\n resolved = true;\n const errorWithCode = error as NodeJS.ErrnoException;\n resolvePromise({\n ok: false,\n exitCode: null,\n stdout,\n stderr,\n errorCode: errorWithCode.code,\n errorMessage: error.message,\n });\n });\n\n child.once(\"close\", (exitCode) => {\n if (resolved) {\n return;\n }\n\n resolved = true;\n resolvePromise({\n ok: exitCode === 0,\n exitCode,\n stdout,\n stderr,\n });\n });\n });\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport { access, mkdir, writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { checkbox, confirm, input } from \"@inquirer/prompts\";\nimport chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport { Command } from \"commander\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ntype ProviderId = \"claude-code\" | \"codex\" | \"opencode\";\n\ninterface InitSummary {\n configPath: string;\n trackingDirectory: string;\n provider: ProviderId;\n providers: ProviderId[];\n budgetTokens: number;\n repo: string;\n}\n\nconst OAC_LOGO = [\n \" ___ _ ___\",\n \" / _ \\\\ /_\\\\ / __|\",\n \"| (_) / _ \\\\ (__\",\n \" \\\\___/_/ \\\\_\\\\___|\",\n].join(\"\\n\");\n\nconst OWNER_REPO_PATTERN = /^[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+(?:\\.git)?$/;\n\nexport function createInitCommand(): Command {\n const command = new Command(\"init\");\n\n command.description(\"Initialize OAC in the current directory\").action(async (_options, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n\n if (!globalOptions.json) {\n console.log(ui.blue(OAC_LOGO));\n console.log(ui.bold(\"Welcome to Open Agent Contribution.\"));\n console.log(\"\");\n }\n\n const selectedProviders = await checkbox<ProviderId>({\n message: \"Select AI provider(s):\",\n choices: [\n { name: \"Claude Code\", value: \"claude-code\", checked: true },\n { name: \"Codex CLI\", value: \"codex\" },\n { name: \"OpenCode (coming soon)\", value: \"opencode\", disabled: true },\n ],\n validate: (value) => (value.length > 0 ? true : \"Select at least one provider to continue.\"),\n });\n\n const budgetInput = await input({\n message: \"Monthly token budget:\",\n default: \"100000\",\n validate: (value) => {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return \"Enter a positive integer.\";\n }\n\n return true;\n },\n });\n\n const firstRepoInput = await input({\n message: \"Add your first repo (owner/repo or GitHub URL):\",\n validate: (value) => {\n if (isValidRepoInput(value)) {\n return true;\n }\n\n return \"Enter a valid GitHub repo like owner/repo.\";\n },\n });\n\n const repo = normalizeRepoInput(firstRepoInput);\n const budgetTokens = Number.parseInt(budgetInput, 10);\n const provider = selectedProviders[0] ?? \"claude-code\";\n\n const configPath = resolve(process.cwd(), \"oac.config.ts\");\n const trackingDirectory = resolve(process.cwd(), \".oac\");\n\n if (await pathExists(configPath)) {\n const shouldOverwrite = await confirm({\n message: \"oac.config.ts already exists. Overwrite it?\",\n default: false,\n });\n\n if (!shouldOverwrite) {\n if (globalOptions.json) {\n console.log(\n JSON.stringify(\n {\n cancelled: true,\n reason: \"oac.config.ts exists and overwrite was declined\",\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log(ui.yellow(\"Initialization cancelled.\"));\n return;\n }\n }\n\n const configContent = buildConfigFile({\n provider,\n providers: selectedProviders,\n budgetTokens,\n repo,\n });\n\n await writeFile(configPath, configContent, \"utf8\");\n await mkdir(trackingDirectory, { recursive: true });\n\n const summary: InitSummary = {\n configPath,\n trackingDirectory,\n provider,\n providers: selectedProviders,\n budgetTokens,\n repo,\n };\n\n if (globalOptions.json) {\n console.log(JSON.stringify(summary, null, 2));\n return;\n }\n\n console.log(ui.green(\"Created: oac.config.ts\"));\n console.log(ui.green(\"Created: .oac/\"));\n console.log(\"\");\n console.log(\"Run `oac doctor` to verify or `oac scan` to discover tasks.\");\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction buildConfigFile(input: {\n provider: ProviderId;\n providers: ProviderId[];\n budgetTokens: number;\n repo: string;\n}): string {\n const enabledProviders = input.providers.map((provider) => `'${provider}'`).join(\", \");\n\n return `export default {\n repos: ['${input.repo}'],\n provider: {\n id: '${input.provider}',\n options: {\n enabledProviders: [${enabledProviders}],\n },\n },\n budget: {\n totalTokens: ${input.budgetTokens},\n },\n};\n`;\n}\n\nfunction normalizeRepoInput(input: string): string {\n const trimmed = input.trim();\n if (OWNER_REPO_PATTERN.test(trimmed)) {\n return stripGitSuffix(trimmed);\n }\n\n const normalizedUrlInput = trimmed.startsWith(\"github.com/\") ? `https://${trimmed}` : trimmed;\n\n try {\n const url = new URL(normalizedUrlInput);\n if (url.hostname !== \"github.com\") {\n return trimmed;\n }\n\n const segments = url.pathname.split(\"/\").filter(Boolean);\n if (segments.length < 2) {\n return trimmed;\n }\n\n const owner = segments[0];\n const repo = stripGitSuffix(segments[1] ?? \"\");\n if (!owner || !repo) {\n return trimmed;\n }\n\n return `${owner}/${repo}`;\n } catch {\n return trimmed;\n }\n}\n\nfunction stripGitSuffix(value: string): string {\n return value.endsWith(\".git\") ? value.slice(0, -4) : value;\n}\n\nfunction isValidRepoInput(input: string): boolean {\n const normalized = normalizeRepoInput(input);\n return OWNER_REPO_PATTERN.test(normalized);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path, fsConstants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import type { Dirent } from \"node:fs\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { type ContributionLog, contributionLogSchema } from \"@open330/oac-tracking\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ninterface LeaderboardCommandOptions {\n limit: number;\n sort: string;\n}\n\ninterface LeaderboardEntry {\n githubUsername: string;\n totalRuns: number;\n totalTasksCompleted: number;\n totalTokensDonated: number;\n totalPRsCreated: number;\n totalPRsMerged: number;\n}\n\ntype SortField = \"runs\" | \"tasks\" | \"tokens\" | \"prs\";\n\nexport function createLeaderboardCommand(): Command {\n const command = new Command(\"leaderboard\");\n\n command\n .description(\"Show contribution rankings\")\n .option(\"--limit <number>\", \"Max entries to show\", parseInteger, 10)\n .option(\"--sort <field>\", \"Sort by: runs, tasks, tokens, prs\", \"tasks\")\n .action(async (options: LeaderboardCommandOptions, cmd) => {\n if (options.limit <= 0) {\n throw new Error(\"--limit must be a positive integer.\");\n }\n\n const globalOptions = getGlobalOptions(cmd);\n const sortField = normalizeSortField(options.sort);\n const entries = await loadLeaderboardEntries(process.cwd());\n const sortedEntries = sortEntries(entries, sortField).slice(0, options.limit);\n\n if (globalOptions.json) {\n console.log(\n JSON.stringify(\n {\n total: sortedEntries.length,\n sort: sortField,\n entries: sortedEntries,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (sortedEntries.length === 0) {\n console.log(\"No leaderboard data found.\");\n return;\n }\n\n const table = new Table({\n head: [\"Rank\", \"User\", \"Tasks\", \"Tokens Used\", \"PRs Created\", \"PRs Merged\"],\n });\n\n for (let index = 0; index < sortedEntries.length; index += 1) {\n const entry = sortedEntries[index];\n table.push([\n String(index + 1),\n entry.githubUsername,\n String(entry.totalTasksCompleted),\n formatInteger(entry.totalTokensDonated),\n String(entry.totalPRsCreated),\n String(entry.totalPRsMerged),\n ]);\n }\n\n console.log(table.toString());\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nasync function loadLeaderboardEntries(repoPath: string): Promise<LeaderboardEntry[]> {\n const leaderboardPath = resolve(repoPath, \".oac\", \"leaderboard.json\");\n\n try {\n const leaderboardRaw = await readFile(leaderboardPath, \"utf8\");\n const leaderboardPayload = JSON.parse(leaderboardRaw) as unknown;\n return parseStoredLeaderboardEntries(leaderboardPayload);\n } catch (error) {\n if (!isFileNotFoundError(error)) {\n throw error;\n }\n }\n\n const logs = await readContributionLogs(repoPath);\n return buildEntriesFromLogs(logs);\n}\n\nfunction parseStoredLeaderboardEntries(payload: unknown): LeaderboardEntry[] {\n if (!isRecord(payload)) {\n return [];\n }\n\n const entries = payload.entries;\n if (!Array.isArray(entries)) {\n return [];\n }\n\n const parsedEntries: LeaderboardEntry[] = [];\n\n for (const entry of entries) {\n if (!isRecord(entry)) {\n continue;\n }\n\n const githubUsername = entry.githubUsername;\n const totalRuns = entry.totalRuns;\n const totalTasksCompleted = entry.totalTasksCompleted;\n const totalTokensDonated = entry.totalTokensDonated;\n const totalPRsCreated = entry.totalPRsCreated;\n const totalPRsMerged = entry.totalPRsMerged;\n\n if (\n typeof githubUsername !== \"string\" ||\n typeof totalRuns !== \"number\" ||\n typeof totalTasksCompleted !== \"number\" ||\n typeof totalTokensDonated !== \"number\" ||\n typeof totalPRsCreated !== \"number\" ||\n typeof totalPRsMerged !== \"number\"\n ) {\n continue;\n }\n\n parsedEntries.push({\n githubUsername,\n totalRuns,\n totalTasksCompleted,\n totalTokensDonated,\n totalPRsCreated,\n totalPRsMerged,\n });\n }\n\n return parsedEntries;\n}\n\nasync function readContributionLogs(repoPath: string): Promise<ContributionLog[]> {\n const contributionsPath = resolve(repoPath, \".oac\", \"contributions\");\n\n let entries: Dirent[];\n try {\n entries = await readdir(contributionsPath, { withFileTypes: true, encoding: \"utf8\" });\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return [];\n }\n\n throw error;\n }\n\n const fileNames = entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map((entry) => entry.name)\n .sort((a, b) => a.localeCompare(b));\n\n const logs = await Promise.all(\n fileNames.map(async (fileName): Promise<ContributionLog | null> => {\n const filePath = resolve(contributionsPath, fileName);\n\n try {\n const content = await readFile(filePath, \"utf8\");\n const payload = JSON.parse(content) as unknown;\n const parsed = contributionLogSchema.safeParse(payload);\n return parsed.success ? parsed.data : null;\n } catch {\n return null;\n }\n }),\n );\n\n return logs.filter((log): log is ContributionLog => log !== null);\n}\n\nfunction buildEntriesFromLogs(logs: ContributionLog[]): LeaderboardEntry[] {\n const byUser = new Map<string, LeaderboardEntry>();\n\n for (const log of logs) {\n const username = log.contributor.githubUsername;\n const existing = byUser.get(username) ?? {\n githubUsername: username,\n totalRuns: 0,\n totalTasksCompleted: 0,\n totalTokensDonated: 0,\n totalPRsCreated: 0,\n totalPRsMerged: 0,\n };\n\n existing.totalRuns += 1;\n existing.totalTasksCompleted += log.tasks.filter((task) => task.status !== \"failed\").length;\n existing.totalTokensDonated += log.budget.totalTokensUsed;\n existing.totalPRsCreated += log.tasks.filter((task) => Boolean(task.pr)).length;\n existing.totalPRsMerged += log.tasks.filter((task) => task.pr?.status === \"merged\").length;\n\n byUser.set(username, existing);\n }\n\n return Array.from(byUser.values());\n}\n\nfunction sortEntries(entries: LeaderboardEntry[], field: SortField): LeaderboardEntry[] {\n return [...entries].sort((a, b) => {\n const first = sortValue(b, field) - sortValue(a, field);\n if (first !== 0) {\n return first;\n }\n\n if (b.totalTasksCompleted !== a.totalTasksCompleted) {\n return b.totalTasksCompleted - a.totalTasksCompleted;\n }\n\n if (b.totalRuns !== a.totalRuns) {\n return b.totalRuns - a.totalRuns;\n }\n\n return a.githubUsername.localeCompare(b.githubUsername);\n });\n}\n\nfunction normalizeSortField(value: string): SortField {\n const normalized = value.trim().toLowerCase();\n if (\n normalized === \"runs\" ||\n normalized === \"tasks\" ||\n normalized === \"tokens\" ||\n normalized === \"prs\"\n ) {\n return normalized;\n }\n\n throw new Error(`Unsupported --sort value \"${value}\". Use runs, tasks, tokens, or prs.`);\n}\n\nfunction sortValue(entry: LeaderboardEntry, field: SortField): number {\n if (field === \"runs\") {\n return entry.totalRuns;\n }\n if (field === \"tasks\") {\n return entry.totalTasksCompleted;\n }\n if (field === \"tokens\") {\n return entry.totalTokensDonated;\n }\n return entry.totalPRsCreated;\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n if (!isRecord(error)) {\n return false;\n }\n\n return error.code === \"ENOENT\";\n}\n","import type { Dirent } from \"node:fs\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { type ContributionLog, contributionLogSchema } from \"@open330/oac-tracking\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ninterface LogCommandOptions {\n limit: number;\n repo?: string;\n source?: string;\n since?: string;\n}\n\nexport function createLogCommand(): Command {\n const command = new Command(\"log\");\n\n command\n .description(\"View contribution history\")\n .option(\"--limit <number>\", \"Max entries to show\", parseInteger, 20)\n .option(\"--repo <name>\", \"Filter by repo name\")\n .option(\"--source <type>\", \"Filter by task source\")\n .option(\"--since <date>\", \"Filter contributions after date (ISO string)\")\n .action(async (options: LogCommandOptions, cmd) => {\n if (options.limit <= 0) {\n throw new Error(\"--limit must be a positive integer.\");\n }\n\n const globalOptions = getGlobalOptions(cmd);\n const sinceDate = parseSinceDate(options.since);\n const repoFilter = options.repo?.trim();\n const sourceFilter = options.source?.trim().toLowerCase();\n\n const logs = await readContributionLogs(process.cwd());\n const filteredLogs = logs\n .filter((log) => (repoFilter ? log.repo.fullName === repoFilter : true))\n .filter((log) =>\n sourceFilter ? log.tasks.some((task) => task.source === sourceFilter) : true,\n )\n .filter((log) => (sinceDate ? Date.parse(log.timestamp) >= sinceDate.getTime() : true))\n .sort((a, b) => Date.parse(b.timestamp) - Date.parse(a.timestamp))\n .slice(0, options.limit);\n\n if (globalOptions.json) {\n console.log(\n JSON.stringify(\n {\n total: filteredLogs.length,\n entries: filteredLogs,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (filteredLogs.length === 0) {\n console.log(\"No contribution logs found.\");\n return;\n }\n\n const table = new Table({\n head: [\"Date\", \"Repo\", \"Tasks\", \"Tokens\", \"PRs\", \"Source\"],\n });\n\n for (const log of filteredLogs) {\n table.push([\n formatDate(log.timestamp),\n log.repo.fullName,\n String(log.tasks.length),\n formatInteger(log.budget.totalTokensUsed),\n String(log.tasks.filter((task) => Boolean(task.pr)).length),\n summarizeSources(log),\n ]);\n }\n\n console.log(table.toString());\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nasync function readContributionLogs(repoPath: string): Promise<ContributionLog[]> {\n const contributionsPath = resolve(repoPath, \".oac\", \"contributions\");\n\n let entries: Dirent[];\n try {\n entries = await readdir(contributionsPath, { withFileTypes: true, encoding: \"utf8\" });\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return [];\n }\n\n throw error;\n }\n\n const files = entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map((entry) => entry.name)\n .sort((a, b) => a.localeCompare(b));\n\n const logs = await Promise.all(\n files.map(async (fileName): Promise<ContributionLog | null> => {\n const filePath = resolve(contributionsPath, fileName);\n\n try {\n const content = await readFile(filePath, \"utf8\");\n const payload = JSON.parse(content) as unknown;\n const parsed = contributionLogSchema.safeParse(payload);\n return parsed.success ? parsed.data : null;\n } catch {\n return null;\n }\n }),\n );\n\n return logs.filter((log): log is ContributionLog => log !== null);\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nfunction parseSinceDate(value: string | undefined): Date | null {\n if (!value) {\n return null;\n }\n\n const parsed = Date.parse(value);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Invalid --since value \"${value}\". Expected an ISO date string.`);\n }\n\n return new Date(parsed);\n}\n\nfunction summarizeSources(log: ContributionLog): string {\n const uniqueSources = [...new Set(log.tasks.map((task) => task.source))].sort((a, b) =>\n a.localeCompare(b),\n );\n\n if (uniqueSources.length === 0) {\n return \"-\";\n }\n\n return uniqueSources.join(\", \");\n}\n\nfunction formatDate(timestamp: string): string {\n const date = new Date(timestamp);\n if (Number.isNaN(date.getTime())) {\n return timestamp;\n }\n\n return date.toISOString();\n}\n\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) {\n return false;\n }\n\n const code = (error as { code?: unknown }).code;\n return code === \"ENOENT\";\n}\n","import { buildExecutionPlan, estimateTokens } from \"@open330/oac-budget\";\nimport type { OacConfig, Task } from \"@open330/oac-core\";\nimport {\n CompositeScanner,\n LintScanner,\n type Scanner,\n TodoScanner,\n rankTasks,\n} from \"@open330/oac-discovery\";\nimport { cloneRepo, resolveRepo } from \"@open330/oac-repo\";\nimport { ensureGitHubAuth } from \"../github-auth.js\";\nimport chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\nimport ora, { type Ora } from \"ora\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\nimport { loadOptionalConfigFile } from \"../config-loader.js\";\n\ninterface PlanCommandOptions {\n repo?: string;\n tokens?: number;\n provider?: string;\n}\n\ntype SupportedScanner = \"lint\" | \"todo\";\n\nexport function createPlanCommand(): Command {\n const command = new Command(\"plan\");\n\n command\n .description(\"Build an execution plan from discovered tasks\")\n .option(\"--repo <owner/repo>\", \"Target repository (owner/repo or GitHub URL)\")\n .option(\"--tokens <number>\", \"Token budget for planning\", parseInteger)\n .option(\"--provider <id>\", \"Agent provider id\")\n .action(async (options: PlanCommandOptions, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n const outputJson = globalOptions.json;\n\n const config = await loadOptionalConfig(globalOptions.config, globalOptions.verbose, ui);\n const repoInput = resolveRepoInput(options.repo, config);\n const providerId = resolveProviderId(options.provider, config);\n const totalBudget = resolveBudget(options.tokens, config);\n const minPriority = config?.discovery.minPriority ?? 20;\n\n const scannerSelection = selectScannersFromConfig(config);\n\n ensureGitHubAuth();\n\n const resolveSpinner = createSpinner(outputJson, \"Resolving repository...\");\n const resolvedRepo = await resolveRepo(repoInput);\n resolveSpinner?.succeed(`Resolved ${resolvedRepo.fullName}`);\n\n const cloneSpinner = createSpinner(outputJson, \"Preparing local clone...\");\n await cloneRepo(resolvedRepo);\n cloneSpinner?.succeed(`Repository ready at ${resolvedRepo.localPath}`);\n\n const scanSpinner = createSpinner(\n outputJson,\n `Running scanners: ${scannerSelection.enabled.join(\", \")}`,\n );\n const scannedTasks = await scannerSelection.scanner.scan(resolvedRepo.localPath, {\n exclude: config?.discovery.exclude,\n maxTasks: config?.discovery.maxTasks,\n repo: resolvedRepo,\n });\n scanSpinner?.succeed(`Discovered ${scannedTasks.length} raw task(s)`);\n\n const rankedTasks = rankTasks(scannedTasks).filter((task) => task.priority >= minPriority);\n\n const estimateSpinner = createSpinner(\n outputJson,\n `Estimating tokens for ${rankedTasks.length} task(s)...`,\n );\n const estimates = await estimateTaskMap(rankedTasks, providerId);\n estimateSpinner?.succeed(\"Token estimation completed\");\n\n const plan = buildExecutionPlan(rankedTasks, estimates, totalBudget);\n\n if (outputJson) {\n console.log(\n JSON.stringify(\n {\n repo: resolvedRepo.fullName,\n provider: providerId,\n budget: totalBudget,\n tasksDiscovered: rankedTasks.length,\n plan,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n renderPlan(ui, {\n repo: resolvedRepo.fullName,\n provider: providerId,\n budget: totalBudget,\n plan,\n });\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction createSpinner(enabled: boolean, text: string): Ora | null {\n if (enabled) {\n return null;\n }\n\n return ora({ text, color: \"blue\" }).start();\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nasync function loadOptionalConfig(\n configPath: string,\n verbose: boolean,\n ui: ChalkInstance,\n): Promise<OacConfig | null> {\n return loadOptionalConfigFile(configPath, {\n onWarning: verbose\n ? (message) => {\n console.warn(ui.yellow(`[oac] ${message}`));\n }\n : undefined,\n });\n}\n\nfunction resolveRepoInput(repoOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = repoOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n const firstConfiguredRepo = config?.repos[0];\n if (typeof firstConfiguredRepo === \"string\") {\n return firstConfiguredRepo;\n }\n\n if (\n firstConfiguredRepo &&\n typeof firstConfiguredRepo === \"object\" &&\n \"name\" in firstConfiguredRepo &&\n typeof firstConfiguredRepo.name === \"string\"\n ) {\n return firstConfiguredRepo.name;\n }\n\n throw new Error(\"No repository specified. Use --repo or configure repos in oac.config.ts.\");\n}\n\nfunction resolveProviderId(providerOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = providerOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n return config?.provider.id ?? \"claude-code\";\n}\n\nfunction resolveBudget(tokensOption: number | undefined, config: OacConfig | null): number {\n const budget = tokensOption ?? config?.budget.totalTokens ?? 100_000;\n if (!Number.isFinite(budget) || budget <= 0) {\n throw new Error(\"Token budget must be a positive number.\");\n }\n\n return Math.floor(budget);\n}\n\nfunction selectScannersFromConfig(config: OacConfig | null): {\n enabled: SupportedScanner[];\n scanner: CompositeScanner;\n} {\n const enabled: SupportedScanner[] = [];\n\n if (config?.discovery.scanners.lint !== false) {\n enabled.push(\"lint\");\n }\n\n if (config?.discovery.scanners.todo !== false) {\n enabled.push(\"todo\");\n }\n\n if (enabled.length === 0) {\n enabled.push(\"lint\", \"todo\");\n }\n\n const uniqueEnabled = [...new Set(enabled)];\n const scannerInstances: Scanner[] = uniqueEnabled.map((scannerName) =>\n scannerName === \"lint\" ? new LintScanner() : new TodoScanner(),\n );\n\n return {\n enabled: uniqueEnabled,\n scanner: new CompositeScanner(scannerInstances),\n };\n}\n\nasync function estimateTaskMap(\n tasks: Task[],\n providerId: string,\n): Promise<Map<string, Awaited<ReturnType<typeof estimateTokens>>>> {\n const entries = await Promise.all(\n tasks.map(async (task) => {\n const estimate = await estimateTokens(task, providerId);\n return [task.id, estimate] as const;\n }),\n );\n\n return new Map(entries);\n}\n\nfunction renderPlan(\n ui: ChalkInstance,\n data: {\n repo: string;\n provider: string;\n budget: number;\n plan: ReturnType<typeof buildExecutionPlan>;\n },\n): void {\n const table = new Table({\n head: [\"#\", \"Task\", \"Est. Tokens\", \"Cumulative\", \"Confidence\"],\n });\n\n for (let index = 0; index < data.plan.selectedTasks.length; index += 1) {\n const entry = data.plan.selectedTasks[index];\n table.push([\n String(index + 1),\n truncate(entry.task.title, 56),\n formatInteger(entry.estimate.totalEstimatedTokens),\n formatInteger(entry.cumulativeBudgetUsed),\n entry.estimate.confidence.toFixed(2),\n ]);\n }\n\n console.log(ui.bold(`Execution Plan for ${data.repo}`));\n console.log(`Provider: ${data.provider}`);\n console.log(\"\");\n\n if (data.plan.selectedTasks.length > 0) {\n console.log(table.toString());\n console.log(\"\");\n } else {\n console.log(ui.yellow(\"No tasks selected for execution.\"));\n console.log(\"\");\n }\n\n const effectiveBudget = data.plan.totalBudget - data.plan.reserveTokens;\n const budgetUsed =\n data.plan.selectedTasks[data.plan.selectedTasks.length - 1]?.cumulativeBudgetUsed ?? 0;\n\n console.log(\n `Budget used: ${formatInteger(budgetUsed)} / ${formatInteger(effectiveBudget)} (effective)`,\n );\n console.log(`Reserve: ${formatInteger(data.plan.reserveTokens)} (10%)`);\n console.log(`Remaining: ${formatInteger(data.plan.remainingTokens)}`);\n\n if (data.plan.deferredTasks.length > 0) {\n console.log(\"\");\n console.log(ui.yellow(`Deferred (${data.plan.deferredTasks.length}):`));\n for (const deferred of data.plan.deferredTasks) {\n const reason = deferred.reason.replaceAll(\"_\", \" \");\n console.log(\n ` - ${truncate(deferred.task.title, 72)} (${formatInteger(\n deferred.estimate.totalEstimatedTokens,\n )} tokens, ${reason})`,\n );\n }\n }\n}\n\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n","import { execFileSync } from \"node:child_process\";\n\n/**\n * Ensures GITHUB_TOKEN is set in process.env for Octokit API calls.\n * Tries: GITHUB_TOKEN → GH_TOKEN → `gh auth token`.\n * Call this before any GitHub API usage (resolveRepo, etc.).\n */\nexport function ensureGitHubAuth(): string | undefined {\n const githubToken = process.env.GITHUB_TOKEN?.trim();\n if (githubToken) {\n process.env.GITHUB_TOKEN = githubToken;\n return githubToken;\n }\n\n const ghToken = process.env.GH_TOKEN?.trim();\n if (ghToken) {\n process.env.GITHUB_TOKEN = ghToken;\n return ghToken;\n }\n\n try {\n const token = execFileSync(\"gh\", [\"auth\", \"token\"], {\n timeout: 5_000,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n\n if (token.length > 0) {\n process.env.GITHUB_TOKEN = token;\n return token;\n }\n } catch {\n // gh not installed or not authenticated\n }\n\n return undefined;\n}\n\n/**\n * Checks whether the current gh auth has the required scopes.\n * Returns missing scopes or empty array if all present.\n *\n * Note: `gh auth status` outputs scope info to stderr, so we\n * redirect stderr to stdout to capture it.\n */\nexport function checkGitHubScopes(required: string[] = [\"repo\"]): string[] {\n try {\n // gh auth status prints token info to stderr\n const output = execFileSync(\"gh\", [\"auth\", \"status\"], {\n timeout: 5_000,\n encoding: \"utf-8\",\n // Merge stderr into stdout so we can read scope info\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n // Try stdout first, then if empty try running with shell redirect\n let combined = output;\n if (!combined.includes(\"Token scopes\")) {\n // gh auth status writes to stderr — use shell to capture both\n try {\n combined = execFileSync(\"sh\", [\"-c\", \"gh auth status 2>&1\"], {\n timeout: 5_000,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n return [];\n }\n }\n\n // Match: Token scopes: 'admin:org', 'gist', 'repo', 'workflow'\n const scopeLine = combined.match(/Token scopes:\\s*(.+)/);\n if (!scopeLine) return [];\n\n const scopes = scopeLine[1]\n .split(\",\")\n .map((s) => s.trim().replace(/^'|'$/g, \"\"));\n return required.filter((r) => !scopes.includes(r));\n } catch {\n return [];\n }\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { type OacConfig, loadConfig } from \"@open330/oac-core\";\n\nconst LEGACY_DEFINE_CONFIG_IMPORT = /@(?:open330\\/oac-core|oac\\/core)/;\nconst LEGACY_DEFINE_CONFIG_IMPORT_LINE =\n /^\\s*import\\s*\\{\\s*defineConfig\\s*\\}\\s*from\\s*[\"']@(?:open330\\/oac-core|oac\\/core)[\"'];\\s*$/m;\nconst LEGACY_DEFINE_CONFIG_EXPORT = /export\\s+default\\s+defineConfig\\s*\\(/;\n\nexport interface ConfigLoaderOptions {\n cwd?: string;\n onWarning?: (message: string) => void;\n}\n\nexport async function loadOptionalConfigFile(\n configPath: string,\n options: ConfigLoaderOptions = {},\n): Promise<OacConfig | null> {\n const absolutePath = resolve(options.cwd ?? process.cwd(), configPath);\n if (!(await pathExists(absolutePath))) {\n return null;\n }\n\n try {\n const candidate = await importConfigCandidate(absolutePath);\n return loadConfig(candidate);\n } catch (error) {\n options.onWarning?.(\n `Failed to load config at ${configPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return null;\n }\n}\n\nasync function importConfigCandidate(absolutePath: string): Promise<unknown> {\n try {\n return await importCandidate(`${pathToFileURL(absolutePath).href}?t=${Date.now()}`);\n } catch (error) {\n const fallbackCandidate = await importLegacyDefineConfigCandidate(absolutePath, error);\n if (fallbackCandidate !== null) {\n return fallbackCandidate;\n }\n\n throw error;\n }\n}\n\nasync function importLegacyDefineConfigCandidate(\n absolutePath: string,\n error: unknown,\n): Promise<unknown | null> {\n if (!shouldTryLegacyDefineConfigFallback(error)) {\n return null;\n }\n\n const source = await readFile(absolutePath, \"utf8\");\n const transformed = transformLegacyDefineConfigSource(source);\n if (transformed === null) {\n return null;\n }\n\n const encodedSource = Buffer.from(transformed, \"utf8\").toString(\"base64\");\n return await importCandidate(`data:text/javascript;base64,${encodedSource}`);\n}\n\nfunction shouldTryLegacyDefineConfigFallback(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return LEGACY_DEFINE_CONFIG_IMPORT.test(error.message);\n}\n\nfunction transformLegacyDefineConfigSource(source: string): string | null {\n if (!LEGACY_DEFINE_CONFIG_IMPORT_LINE.test(source)) {\n return null;\n }\n\n if (!LEGACY_DEFINE_CONFIG_EXPORT.test(source)) {\n return null;\n }\n\n return source\n .replace(LEGACY_DEFINE_CONFIG_IMPORT_LINE, \"\")\n .replace(LEGACY_DEFINE_CONFIG_EXPORT, \"export default (\");\n}\n\nasync function importCandidate(moduleSpecifier: string): Promise<unknown> {\n const imported = await import(moduleSpecifier);\n return imported.default ?? imported.config ?? imported;\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path, fsConstants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport { buildExecutionPlan, estimateTokens } from \"@open330/oac-budget\";\nimport {\n type OacConfig,\n type Task,\n type TokenEstimate,\n UNLIMITED_BUDGET,\n createEventBus,\n} from \"@open330/oac-core\";\nimport {\n CompositeScanner,\n GitHubIssuesScanner,\n LintScanner,\n type Scanner,\n TestGapScanner,\n TodoScanner,\n rankTasks,\n} from \"@open330/oac-discovery\";\nimport {\n type AgentProvider,\n ClaudeCodeAdapter,\n CodexAdapter,\n createSandbox,\n executeTask as workerExecuteTask,\n} from \"@open330/oac-execution\";\nimport { cloneRepo, resolveRepo } from \"@open330/oac-repo\";\nimport { type ContributionLog, writeContributionLog } from \"@open330/oac-tracking\";\nimport chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\nimport { execa } from \"execa\";\nimport ora, { type Ora } from \"ora\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\nimport { loadOptionalConfigFile } from \"../config-loader.js\";\nimport { checkGitHubScopes, ensureGitHubAuth } from \"../github-auth.js\";\n\ninterface RunCommandOptions {\n repo?: string;\n tokens?: number;\n provider?: string;\n concurrency?: number;\n dryRun?: boolean;\n mode?: string;\n maxTasks?: number;\n timeout?: number;\n source?: string;\n}\n\ninterface SandboxInfo {\n branchName: string;\n sandboxPath: string;\n cleanup: () => Promise<void>;\n}\n\ntype RunMode = \"new-pr\" | \"update-pr\" | \"direct-commit\";\ntype SupportedScanner = \"lint\" | \"todo\" | \"github-issues\" | \"test-gap\";\ntype CompletionStatus = \"success\" | \"partial\" | \"failed\";\n\ninterface ExecutionOutcome {\n success: boolean;\n exitCode: number;\n totalTokensUsed: number;\n filesChanged: string[];\n duration: number;\n error?: string;\n}\n\ninterface TaskRunResult {\n task: Task;\n estimate: TokenEstimate;\n execution: ExecutionOutcome;\n sandbox?: SandboxInfo;\n pr?: {\n number: number;\n url: string;\n status: \"open\" | \"merged\" | \"closed\";\n };\n}\n\ninterface RunSummaryOutput {\n runId: string;\n repo: string;\n provider: string;\n dryRun: boolean;\n selectedTasks: number;\n deferredTasks: number;\n tasksCompleted: number;\n tasksFailed: number;\n prsCreated: number;\n tokensUsed: number;\n tokensBudgeted: number;\n logPath?: string;\n}\n\nconst DEFAULT_TIMEOUT_SECONDS = 300;\nconst DEFAULT_CONCURRENCY = 2;\n\nexport function createRunCommand(): Command {\n const command = new Command(\"run\");\n\n command\n .description(\"Run the full OAC pipeline\")\n .option(\"--repo <owner/repo>\", \"Target repository (owner/repo or GitHub URL)\")\n .option(\"--tokens <value>\", 'Token budget (number or \"unlimited\")', parseTokens)\n .option(\"--provider <id>\", \"Agent provider id\")\n .option(\"--concurrency <number>\", \"Maximum parallel task executions\", parseInteger)\n .option(\"--dry-run\", \"Show plan without executing tasks\", false)\n .option(\"--mode <mode>\", \"Execution mode: new-pr|update-pr|direct-commit\")\n .option(\"--max-tasks <number>\", \"Maximum number of discovered tasks to consider\", parseInteger)\n .option(\"--timeout <seconds>\", \"Per-task timeout in seconds\", parseInteger)\n .option(\"--source <source>\", \"Filter tasks by source: lint, todo, github-issue, test-gap\")\n .action(async (options: RunCommandOptions, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n const outputJson = globalOptions.json;\n\n validateRunOptions(options);\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 mode = resolveMode(options.mode, config);\n const concurrency = resolveConcurrency(options.concurrency, config);\n const timeoutSeconds = resolveTimeout(options.timeout, config);\n const minPriority = config?.discovery.minPriority ?? 20;\n const maxTasks = options.maxTasks ?? undefined;\n const ghToken = ensureGitHubAuth();\n const scannerSelection = selectScannersFromConfig(config, Boolean(ghToken));\n\n const runStartedAt = Date.now();\n const runId = randomUUID();\n\n // Pre-flight: ensure GitHub auth is available before any API calls\n if (!ghToken && !outputJson) {\n console.log(\n ui.yellow(\n \"[oac] Warning: GitHub auth not detected. Run `gh auth login` first.\",\n ),\n );\n console.log(\n ui.yellow(\n \"[oac] For private repos, ensure the 'repo' scope: gh auth refresh -s repo\",\n ),\n );\n } else if (ghToken && !outputJson) {\n const missingScopes = checkGitHubScopes([\"repo\"]);\n if (missingScopes.length > 0) {\n console.log(\n ui.yellow(\n `[oac] Warning: GitHub token missing scope(s): ${missingScopes.join(\", \")}. Private repos may fail.`,\n ),\n );\n console.log(\n ui.yellow(\n \"[oac] Fix with: gh auth refresh -s repo\",\n ),\n );\n }\n }\n\n if (!outputJson) {\n console.log(\n ui.blue(\n `Starting OAC run (budget: ${formatBudgetDisplay(totalBudget)} tokens, concurrency: ${concurrency})`,\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 const scannedTasks = await scannerSelection.scanner.scan(resolvedRepo.localPath, {\n exclude: config?.discovery.exclude,\n maxTasks: config?.discovery.maxTasks,\n repo: resolvedRepo,\n });\n scanSpinner?.succeed(`Discovered ${scannedTasks.length} raw task(s)`);\n\n let candidateTasks = rankTasks(scannedTasks).filter((task) => task.priority >= minPriority);\n if (options.source) {\n candidateTasks = candidateTasks.filter((task) => task.source === options.source);\n }\n if (typeof maxTasks === \"number\") {\n candidateTasks = candidateTasks.slice(0, maxTasks);\n }\n\n if (candidateTasks.length === 0) {\n const emptySummary: RunSummaryOutput = {\n runId,\n repo: resolvedRepo.fullName,\n provider: providerId,\n dryRun: Boolean(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 (outputJson) {\n console.log(JSON.stringify({ summary: emptySummary, plan: null }, null, 2));\n } else {\n console.log(ui.yellow(\"No tasks discovered for execution.\"));\n }\n return;\n }\n\n const estimateSpinner = createSpinner(\n outputJson,\n `Estimating tokens for ${candidateTasks.length} task(s)...`,\n );\n const estimates = await estimateTaskMap(candidateTasks, providerId);\n estimateSpinner?.succeed(\"Token estimation completed\");\n\n const plan = buildExecutionPlan(candidateTasks, estimates, totalBudget);\n\n if (options.dryRun) {\n const dryRunSummary: RunSummaryOutput = {\n runId,\n repo: resolvedRepo.fullName,\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 (outputJson) {\n console.log(\n JSON.stringify(\n {\n summary: dryRunSummary,\n plan,\n },\n null,\n 2,\n ),\n );\n } else {\n renderSelectedPlanTable(ui, plan, totalBudget);\n console.log(\"\");\n console.log(ui.blue(\"Dry run complete. No tasks were executed.\"));\n }\n\n return;\n }\n\n const { adapter, useRealExecution } = await resolveAdapter(providerId);\n\n if (!outputJson && globalOptions.verbose) {\n if (useRealExecution && adapter) {\n const avail = await adapter.checkAvailability();\n console.log(\n ui.green(\n `[oac] Using ${adapter.name} v${avail.version ?? \"unknown\"} for execution.`,\n ),\n );\n } else {\n console.log(ui.yellow(\"[oac] No agent CLI available. Using simulated execution.\"));\n }\n }\n\n const executionSpinner = createSpinner(\n outputJson,\n `Executing ${plan.selectedTasks.length} planned task(s)...`,\n );\n\n let completedCount = 0;\n const executedTasks = await runWithConcurrency(\n plan.selectedTasks,\n concurrency,\n async (entry): Promise<TaskRunResult> => {\n let execution: ExecutionOutcome;\n let sandbox: SandboxInfo | undefined;\n\n if (useRealExecution && adapter) {\n const result = await executeWithAgent({\n task: entry.task,\n estimate: entry.estimate,\n adapter,\n repoPath: resolvedRepo.localPath,\n baseBranch: resolvedRepo.meta.defaultBranch,\n timeoutSeconds,\n });\n execution = result.execution;\n sandbox = result.sandbox;\n } else {\n execution = await simulateExecution(entry.task, entry.estimate);\n }\n\n completedCount += 1;\n if (executionSpinner) {\n executionSpinner.text = `Executing tasks... (${completedCount}/${plan.selectedTasks.length})`;\n }\n\n return {\n task: entry.task,\n estimate: entry.estimate,\n execution,\n sandbox,\n };\n },\n );\n\n executionSpinner?.succeed(\"Execution stage finished\");\n\n const completionSpinner = createSpinner(outputJson, \"Completing task outputs...\");\n const completedTasks = await runWithConcurrency(\n executedTasks,\n concurrency,\n async (result): Promise<TaskRunResult> => {\n if (mode === \"direct-commit\") {\n return result;\n }\n\n if (!result.execution.success) {\n return result;\n }\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 if (!pr) {\n return result;\n }\n\n return {\n ...result,\n pr,\n };\n },\n );\n completionSpinner?.succeed(\"Completion stage finished\");\n\n const tasksCompleted = completedTasks.filter((task) => task.execution.success).length;\n const tasksFailed = completedTasks.length - tasksCompleted;\n const prsCreated = completedTasks.filter((task) => Boolean(task.pr)).length;\n const tokensUsed = completedTasks.reduce(\n (sum, task) => sum + task.execution.totalTokensUsed,\n 0,\n );\n\n const runDurationSeconds = (Date.now() - runStartedAt) / 1000;\n const contributionLog = buildContributionLog({\n 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(outputJson, \"Writing contribution log...\");\n let logPath: string | undefined;\n try {\n logPath = await writeContributionLog(contributionLog, resolvedRepo.localPath);\n trackingSpinner?.succeed(`Contribution log written: ${logPath}`);\n } catch (error) {\n trackingSpinner?.fail(\"Failed to write contribution log\");\n if (globalOptions.verbose && !outputJson) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(ui.yellow(`[oac] Tracking failed: ${message}`));\n }\n }\n\n const summary: RunSummaryOutput = {\n 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,\n };\n\n if (outputJson) {\n console.log(\n JSON.stringify(\n {\n summary,\n plan,\n tasks: completedTasks,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n renderTaskResults(ui, completedTasks);\n console.log(\"\");\n console.log(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 (logPath) {\n console.log(` Log: ${logPath}`);\n }\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction createSpinner(enabled: boolean, text: string): Ora | null {\n if (enabled) {\n return null;\n }\n\n return ora({ text, color: \"blue\" }).start();\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nfunction parseTokens(value: string): number {\n if (value.toLowerCase() === \"unlimited\") {\n return UNLIMITED_BUDGET;\n }\n return parseInteger(value);\n}\n\nfunction formatBudgetDisplay(budget: number): string {\n if (budget >= UNLIMITED_BUDGET) {\n return \"unlimited\";\n }\n return formatInteger(budget);\n}\n\nfunction validateRunOptions(options: RunCommandOptions): void {\n if (typeof options.concurrency === \"number\" && options.concurrency <= 0) {\n throw new Error(\"--concurrency must be greater than zero.\");\n }\n\n if (typeof options.timeout === \"number\" && options.timeout <= 0) {\n throw new Error(\"--timeout must be greater than zero.\");\n }\n\n if (typeof options.maxTasks === \"number\" && options.maxTasks <= 0) {\n throw new Error(\"--max-tasks must be greater than zero when provided.\");\n }\n}\n\nasync function loadOptionalConfig(\n configPath: string,\n verbose: boolean,\n ui: ChalkInstance,\n): Promise<OacConfig | null> {\n return loadOptionalConfigFile(configPath, {\n onWarning: verbose\n ? (message) => {\n console.warn(ui.yellow(`[oac] ${message}`));\n }\n : undefined,\n });\n}\n\nfunction resolveRepoInput(repoOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = repoOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n const firstConfiguredRepo = config?.repos[0];\n if (typeof firstConfiguredRepo === \"string\") {\n return firstConfiguredRepo;\n }\n\n if (\n firstConfiguredRepo &&\n typeof firstConfiguredRepo === \"object\" &&\n \"name\" in firstConfiguredRepo &&\n typeof firstConfiguredRepo.name === \"string\"\n ) {\n return firstConfiguredRepo.name;\n }\n\n throw new Error(\"No repository specified. Use --repo or configure repos in oac.config.ts.\");\n}\n\nasync function resolveAdapter(\n providerId: string,\n): Promise<{ adapter: AgentProvider | null; useRealExecution: boolean }> {\n // Normalize legacy ID\n const normalizedId = providerId === \"codex-cli\" ? \"codex\" : providerId;\n\n const adapters: Record<string, () => AgentProvider> = {\n codex: () => new CodexAdapter(),\n \"claude-code\": () => new ClaudeCodeAdapter(),\n };\n\n const factory = adapters[normalizedId];\n if (!factory) {\n return { adapter: null, useRealExecution: false };\n }\n\n const adapter = factory();\n const availability = await adapter.checkAvailability();\n return { adapter: availability.available ? adapter : null, useRealExecution: availability.available };\n}\n\nfunction resolveProviderId(providerOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = providerOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n return config?.provider.id ?? \"claude-code\";\n}\n\nfunction resolveBudget(tokensOption: number | undefined, config: OacConfig | null): number {\n const budget = tokensOption ?? config?.budget.totalTokens ?? 100_000;\n if (!Number.isFinite(budget) || budget <= 0) {\n throw new Error(\"Token budget must be a positive number.\");\n }\n\n return Math.floor(budget);\n}\n\nfunction resolveMode(modeOption: string | undefined, config: OacConfig | null): RunMode {\n const candidate = (modeOption ?? config?.execution.mode ?? \"new-pr\").trim();\n if (candidate === \"new-pr\" || candidate === \"update-pr\" || candidate === \"direct-commit\") {\n return candidate;\n }\n\n throw new Error(`Invalid --mode value \"${candidate}\".`);\n}\n\nfunction resolveConcurrency(\n concurrencyOption: number | undefined,\n config: OacConfig | null,\n): number {\n const configuredConcurrency =\n typeof concurrencyOption === \"number\"\n ? concurrencyOption\n : (config?.execution.concurrency ?? DEFAULT_CONCURRENCY);\n\n if (!Number.isFinite(configuredConcurrency) || configuredConcurrency <= 0) {\n throw new Error(\"Concurrency must be a positive integer.\");\n }\n\n return Math.floor(configuredConcurrency);\n}\n\nfunction resolveTimeout(timeoutOption: number | undefined, config: OacConfig | null): number {\n const configuredTimeout =\n typeof timeoutOption === \"number\"\n ? timeoutOption\n : (config?.execution.taskTimeout ?? DEFAULT_TIMEOUT_SECONDS);\n\n if (!Number.isFinite(configuredTimeout) || configuredTimeout <= 0) {\n throw new Error(\"Timeout must be a positive integer.\");\n }\n\n return Math.floor(configuredTimeout);\n}\n\nfunction selectScannersFromConfig(\n config: OacConfig | null,\n hasGitHubAuth: boolean,\n): {\n enabled: SupportedScanner[];\n scanner: CompositeScanner;\n} {\n const enabled: SupportedScanner[] = [];\n\n if (config?.discovery.scanners.lint !== false) {\n enabled.push(\"lint\");\n }\n if (config?.discovery.scanners.todo !== false) {\n enabled.push(\"todo\");\n }\n\n // Always include test-gap for autonomous code analysis\n enabled.push(\"test-gap\");\n\n // Include GitHub issues scanner when a GitHub token is available.\n if (hasGitHubAuth) {\n enabled.push(\"github-issues\");\n }\n\n if (enabled.length === 0) {\n enabled.push(\"lint\", \"todo\", \"test-gap\");\n }\n\n const uniqueEnabled = [...new Set(enabled)];\n const scannerInstances: Scanner[] = uniqueEnabled.map((scannerName) => {\n if (scannerName === \"lint\") return new LintScanner();\n if (scannerName === \"github-issues\") return new GitHubIssuesScanner();\n if (scannerName === \"test-gap\") return new TestGapScanner();\n return new TodoScanner();\n });\n\n return {\n enabled: uniqueEnabled,\n scanner: new CompositeScanner(scannerInstances),\n };\n}\n\nasync function estimateTaskMap(\n tasks: Task[],\n providerId: string,\n): Promise<Map<string, TokenEstimate>> {\n const entries = await Promise.all(\n tasks.map(async (task) => {\n const estimate = await estimateTokens(task, providerId);\n return [task.id, estimate] as const;\n }),\n );\n\n return new Map(entries);\n}\n\nasync function executeWithAgent(input: {\n task: Task;\n estimate: TokenEstimate;\n adapter: AgentProvider;\n repoPath: string;\n baseBranch: string;\n timeoutSeconds: number;\n}): Promise<{ execution: ExecutionOutcome; sandbox: SandboxInfo }> {\n const startedAt = Date.now();\n const taskSlug = input.task.id\n .replace(/[^a-zA-Z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .slice(0, 30);\n const branchName = `oac/${Date.now()}-${taskSlug}`;\n\n const sandbox = await createSandbox(input.repoPath, branchName, input.baseBranch);\n const eventBus = createEventBus();\n const sandboxInfo: SandboxInfo = {\n branchName,\n sandboxPath: sandbox.path,\n cleanup: sandbox.cleanup,\n };\n\n try {\n const result = await workerExecuteTask(input.adapter, input.task, sandbox, eventBus, {\n tokenBudget: input.estimate.totalEstimatedTokens,\n timeoutMs: input.timeoutSeconds * 1_000,\n });\n\n // Agent may edit files without committing — stage and commit any changes\n const commitResult = await commitSandboxChanges(sandbox.path, input.task);\n\n const filesChanged =\n commitResult.filesChanged.length > 0\n ? commitResult.filesChanged\n : result.filesChanged.length > 0\n ? result.filesChanged\n : [];\n\n return {\n execution: {\n success: result.success || commitResult.hasChanges,\n exitCode: result.exitCode,\n totalTokensUsed: result.totalTokensUsed,\n filesChanged,\n duration: result.duration > 0 ? result.duration / 1_000 : (Date.now() - startedAt) / 1_000,\n error: result.error,\n },\n sandbox: sandboxInfo,\n };\n } catch (error) {\n // Even on error, check if agent left uncommitted changes\n const commitResult = await commitSandboxChanges(sandbox.path, input.task);\n if (commitResult.hasChanges) {\n return {\n execution: {\n success: true,\n exitCode: 0,\n totalTokensUsed: 0,\n filesChanged: commitResult.filesChanged,\n duration: (Date.now() - startedAt) / 1_000,\n },\n sandbox: sandboxInfo,\n };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return {\n execution: {\n success: false,\n exitCode: 1,\n totalTokensUsed: 0,\n filesChanged: [],\n duration: (Date.now() - startedAt) / 1_000,\n error: message,\n },\n sandbox: sandboxInfo,\n };\n }\n}\n\n\nasync function createPullRequest(input: {\n task: Task;\n execution: ExecutionOutcome;\n sandbox?: SandboxInfo;\n repoFullName: string;\n baseBranch: string;\n ghToken?: string;\n}): Promise<\n | {\n number: number;\n url: string;\n status: \"open\" | \"merged\" | \"closed\";\n }\n | undefined\n> {\n if (!input.sandbox) {\n return undefined;\n }\n\n const { branchName, sandboxPath } = input.sandbox;\n const [owner, repo] = input.repoFullName.split(\"/\");\n\n try {\n // Build env with explicit GitHub token to avoid interactive device flow\n const ghEnv: Record<string, string> = { ...process.env } as Record<string, string>;\n if (input.ghToken) {\n ghEnv.GH_TOKEN = input.ghToken;\n ghEnv.GITHUB_TOKEN = input.ghToken;\n }\n\n // Push the branch from the sandbox worktree\n await execa(\"git\", [\"push\", \"--set-upstream\", \"origin\", branchName], {\n cwd: sandboxPath,\n env: ghEnv,\n });\n\n // Create PR using gh CLI\n const prTitle = `[OAC] ${input.task.title}`;\n const prBody = [\n \"## Summary\",\n \"\",\n input.task.description || `Automated contribution for task \"${input.task.title}\".`,\n \"\",\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 \"*This PR was automatically generated by [OAC](https://github.com/Open330/open-agent-contribution).*\",\n ].join(\"\\n\");\n\n const ghResult = await execa(\n \"gh\",\n [\n \"pr\",\n \"create\",\n \"--repo\",\n input.repoFullName,\n \"--title\",\n prTitle,\n \"--body\",\n prBody,\n \"--head\",\n branchName,\n \"--base\",\n input.baseBranch,\n ],\n { cwd: sandboxPath, env: ghEnv },\n );\n\n // Parse PR URL from gh output\n const prUrl = ghResult.stdout.trim();\n const prNumberMatch = prUrl.match(/\\/pull\\/(\\d+)/);\n const prNumber = prNumberMatch ? Number.parseInt(prNumberMatch[1], 10) : 0;\n\n return {\n number: prNumber,\n url: prUrl,\n status: \"open\",\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`[oac] PR creation failed: ${message}`);\n return undefined;\n }\n}\n\nasync function simulateExecution(task: Task, estimate: TokenEstimate): Promise<ExecutionOutcome> {\n const start = Date.now();\n const delayMs = Math.min(1_500, Math.max(150, Math.round(estimate.totalEstimatedTokens / 40)));\n await sleep(delayMs);\n\n return {\n success: true,\n exitCode: 0,\n totalTokensUsed: Math.max(1, Math.round(estimate.totalEstimatedTokens * 0.9)),\n filesChanged:\n task.targetFiles.length > 0\n ? task.targetFiles.slice(0, Math.min(task.targetFiles.length, 4))\n : [],\n duration: (Date.now() - start) / 1_000,\n };\n}\n\nasync function commitSandboxChanges(\n sandboxPath: string,\n task: Task,\n): Promise<{ hasChanges: boolean; filesChanged: string[] }> {\n try {\n // Check for any uncommitted changes (staged + unstaged + untracked)\n const statusResult = await execa(\"git\", [\"status\", \"--porcelain\"], { cwd: sandboxPath });\n if (!statusResult.stdout.trim()) {\n return { hasChanges: false, filesChanged: [] };\n }\n\n await execa(\"git\", [\"add\", \"-A\"], { cwd: sandboxPath });\n await execa(\n \"git\",\n [\"commit\", \"-m\", `[OAC] ${task.title}\\n\\nAutomated contribution by OAC using Codex CLI.`],\n { cwd: sandboxPath },\n );\n\n // Get the list of changed files from the commit\n const diffResult = await execa(\"git\", [\"diff\", \"--name-only\", \"HEAD~1\", \"HEAD\"], {\n cwd: sandboxPath,\n });\n const changedFiles = diffResult.stdout.trim().split(\"\\n\").filter(Boolean);\n\n return { hasChanges: true, filesChanged: changedFiles };\n } catch {\n return { hasChanges: false, filesChanged: [] };\n }\n}\n\nfunction buildContributionLog(input: {\n runId: string;\n repoFullName: string;\n repoHeadSha: string;\n defaultBranch: string;\n repoOwner: string;\n providerId: string;\n totalBudget: number;\n runDurationSeconds: number;\n discoveredTasks: number;\n taskResults: TaskRunResult[];\n}): ContributionLog {\n const timestamp = new Date().toISOString();\n const contributor = resolveGithubUsername(input.repoOwner);\n\n const contributionTasks = input.taskResults.map((result) => ({\n taskId: result.task.id,\n title: result.task.title,\n source: result.task.source,\n complexity: result.task.complexity,\n status: deriveTaskStatus(result.execution),\n tokensUsed: Math.max(0, Math.floor(result.execution.totalTokensUsed)),\n duration: Math.max(0, result.execution.duration),\n filesChanged: result.execution.filesChanged,\n pr: result.pr,\n linkedIssue: result.task.linkedIssue\n ? {\n number: result.task.linkedIssue.number,\n url: result.task.linkedIssue.url,\n }\n : undefined,\n error: result.execution.error,\n }));\n\n const tasksSucceeded = contributionTasks.filter((task) => task.status !== \"failed\").length;\n const tasksFailed = contributionTasks.length - tasksSucceeded;\n const totalTokensUsed = contributionTasks.reduce((sum, task) => sum + task.tokensUsed, 0);\n const totalFilesChanged = contributionTasks.reduce(\n (sum, task) => sum + task.filesChanged.length,\n 0,\n );\n\n return {\n version: \"1.0\",\n runId: input.runId,\n timestamp,\n contributor: {\n githubUsername: contributor,\n email: process.env.GIT_AUTHOR_EMAIL ?? undefined,\n },\n repo: {\n fullName: input.repoFullName,\n headSha: input.repoHeadSha,\n defaultBranch: input.defaultBranch,\n },\n budget: {\n provider: input.providerId,\n totalTokensBudgeted: input.totalBudget,\n totalTokensUsed,\n },\n tasks: contributionTasks,\n metrics: {\n tasksDiscovered: input.discoveredTasks,\n tasksAttempted: contributionTasks.length,\n tasksSucceeded,\n tasksFailed,\n totalDuration: Math.max(0, input.runDurationSeconds),\n totalFilesChanged,\n totalLinesAdded: 0,\n totalLinesRemoved: 0,\n },\n };\n}\n\nfunction deriveTaskStatus(execution: ExecutionOutcome): CompletionStatus {\n if (execution.success) {\n return \"success\";\n }\n\n if (execution.filesChanged.length > 0) {\n return \"partial\";\n }\n\n return \"failed\";\n}\n\nfunction resolveGithubUsername(fallback: string): string {\n const candidates = [\n process.env.GITHUB_USER,\n process.env.GITHUB_USERNAME,\n process.env.USER,\n process.env.LOGNAME,\n fallback,\n \"oac-user\",\n ];\n\n for (const candidate of candidates) {\n const normalized = sanitizeGithubUsername(candidate ?? \"\");\n if (normalized) {\n return normalized;\n }\n }\n\n return \"oac-user\";\n}\n\nfunction sanitizeGithubUsername(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n const cleaned = trimmed\n .replace(/[^A-Za-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n if (cleaned.length === 0 || cleaned.length > 39) {\n return null;\n }\n\n if (!/^(?!-)[A-Za-z0-9-]+(?<!-)$/.test(cleaned)) {\n return null;\n }\n\n return cleaned;\n}\n\nfunction renderSelectedPlanTable(\n ui: ChalkInstance,\n plan: ReturnType<typeof buildExecutionPlan>,\n budget: number,\n): void {\n const table = new Table({\n head: [\"#\", \"Task\", \"Est. Tokens\", \"Cumulative\", \"Confidence\"],\n });\n\n for (let index = 0; index < plan.selectedTasks.length; index += 1) {\n const entry = plan.selectedTasks[index];\n table.push([\n String(index + 1),\n truncate(entry.task.title, 56),\n formatInteger(entry.estimate.totalEstimatedTokens),\n formatInteger(entry.cumulativeBudgetUsed),\n entry.estimate.confidence.toFixed(2),\n ]);\n }\n\n if (plan.selectedTasks.length > 0) {\n console.log(table.toString());\n } else {\n console.log(ui.yellow(\"No tasks selected for execution.\"));\n }\n\n console.log(\"\");\n console.log(\n `Budget used: ${formatInteger(\n plan.selectedTasks[plan.selectedTasks.length - 1]?.cumulativeBudgetUsed ?? 0,\n )} / ${formatBudgetDisplay(budget - plan.reserveTokens)} (effective)`,\n );\n console.log(`Reserve: ${formatBudgetDisplay(plan.reserveTokens)} (10%)`);\n console.log(`Remaining: ${formatBudgetDisplay(plan.remainingTokens)}`);\n\n if (plan.deferredTasks.length > 0) {\n console.log(\"\");\n console.log(ui.yellow(`Deferred (${plan.deferredTasks.length}):`));\n for (const deferred of plan.deferredTasks) {\n console.log(\n ` - ${truncate(deferred.task.title, 72)} (${formatInteger(\n deferred.estimate.totalEstimatedTokens,\n )} tokens, ${deferred.reason.replaceAll(\"_\", \" \")})`,\n );\n }\n }\n}\n\nfunction renderTaskResults(ui: ChalkInstance, taskResults: TaskRunResult[]): void {\n for (let index = 0; index < taskResults.length; index += 1) {\n const result = taskResults[index];\n const icon = result.execution.success ? ui.green(\"[OK]\") : ui.red(\"[X]\");\n const status = result.execution.success ? ui.green(\"SUCCESS\") : ui.red(\"FAILED\");\n\n console.log(`${icon} [${index + 1}/${taskResults.length}] ${result.task.title}`);\n console.log(\n ` ${status} | tokens ${formatInteger(result.execution.totalTokensUsed)} | duration ${formatDuration(\n result.execution.duration,\n )}`,\n );\n if (result.pr) {\n console.log(` PR #${result.pr.number}: ${result.pr.url}`);\n }\n if (result.execution.error) {\n console.log(` Error: ${result.execution.error}`);\n }\n }\n}\n\nasync function runWithConcurrency<T, R>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n if (items.length === 0) {\n return [];\n }\n\n const results: R[] = new Array(items.length);\n let nextIndex = 0;\n\n const runWorker = async (): Promise<void> => {\n while (true) {\n const currentIndex = nextIndex;\n nextIndex += 1;\n if (currentIndex >= items.length) {\n return;\n }\n\n results[currentIndex] = await worker(items[currentIndex], currentIndex);\n }\n };\n\n const workerCount = Math.min(concurrency, items.length);\n await Promise.all(Array.from({ length: workerCount }, () => runWorker()));\n\n return results;\n}\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n return await new Promise((resolvePromise, rejectPromise) => {\n const timeout = setTimeout(() => {\n rejectPromise(new Error(`Timed out after ${Math.round(timeoutMs / 1000)}s`));\n }, timeoutMs);\n\n promise.then(\n (value) => {\n clearTimeout(timeout);\n resolvePromise(value);\n },\n (error) => {\n clearTimeout(timeout);\n rejectPromise(error);\n },\n );\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolvePromise) => {\n setTimeout(resolvePromise, ms);\n });\n}\n\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) {\n return \"0s\";\n }\n\n if (seconds < 60) {\n return `${seconds.toFixed(1)}s`;\n }\n\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = Math.round(seconds % 60);\n return `${minutes}m ${remainingSeconds}s`;\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n","import type { OacConfig } from \"@open330/oac-core\";\nimport {\n CompositeScanner,\n GitHubIssuesScanner,\n LintScanner,\n type Scanner,\n TestGapScanner,\n TodoScanner,\n rankTasks,\n} from \"@open330/oac-discovery\";\nimport { cloneRepo, resolveRepo } from \"@open330/oac-repo\";\nimport { ensureGitHubAuth } from \"../github-auth.js\";\nimport chalk, { Chalk, type ChalkInstance } from \"chalk\";\nimport Table from \"cli-table3\";\nimport { Command } from \"commander\";\nimport ora, { type Ora } from \"ora\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\nimport { loadOptionalConfigFile } from \"../config-loader.js\";\n\ninterface ScanCommandOptions {\n repo?: string;\n scanners?: string;\n minPriority: number;\n format: string;\n}\n\ntype OutputFormat = \"table\" | \"json\";\ntype SupportedScanner = \"lint\" | \"todo\" | \"github-issues\" | \"test-gap\";\n\nconst SUPPORTED_SCANNERS: SupportedScanner[] = [\"lint\", \"todo\", \"github-issues\", \"test-gap\"];\n\nexport function createScanCommand(): Command {\n const command = new Command(\"scan\");\n\n command\n .description(\"Discover tasks in a repository\")\n .option(\"--repo <owner/repo>\", \"Target repository (owner/repo or GitHub URL)\")\n .option(\"--scanners <names>\", \"Comma-separated scanner filter (lint,todo)\")\n .option(\"--min-priority <number>\", \"Minimum priority threshold (0-100)\", parseInteger, 20)\n .option(\"--format <format>\", \"Output format: table|json\", \"table\")\n .action(async (options: ScanCommandOptions, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n const ui = createUi(globalOptions);\n\n const outputFormat = normalizeOutputFormat(options.format);\n const outputJson = globalOptions.json || outputFormat === \"json\";\n\n if (options.minPriority < 0 || options.minPriority > 100) {\n throw new Error(\"--min-priority must be between 0 and 100.\");\n }\n\n const config = await loadOptionalConfig(globalOptions.config, globalOptions.verbose, ui);\n const repoInput = resolveRepoInput(options.repo, config);\n const ghToken = ensureGitHubAuth();\n const scannerSelection = selectScanners(options.scanners, config, Boolean(ghToken));\n\n if (!outputJson && scannerSelection.unknown.length > 0) {\n console.log(\n ui.yellow(\n `Ignoring unsupported scanner(s): ${scannerSelection.unknown.join(\", \")}. Supported scanners: ${SUPPORTED_SCANNERS.join(\", \")}.`,\n ),\n );\n }\n\n const resolveSpinner = createSpinner(outputJson, \"Resolving repository...\");\n const resolvedRepo = await resolveRepo(repoInput);\n resolveSpinner?.succeed(`Resolved ${resolvedRepo.fullName}`);\n\n const cloneSpinner = createSpinner(outputJson, \"Preparing local clone...\");\n await cloneRepo(resolvedRepo);\n cloneSpinner?.succeed(`Repository ready at ${resolvedRepo.localPath}`);\n\n const scanSpinner = createSpinner(\n outputJson,\n `Running scanners: ${scannerSelection.enabled.join(\", \")}`,\n );\n\n const scannedTasks = await scannerSelection.scanner.scan(resolvedRepo.localPath, {\n exclude: config?.discovery.exclude,\n maxTasks: config?.discovery.maxTasks,\n repo: resolvedRepo,\n });\n\n scanSpinner?.succeed(`Scanned ${resolvedRepo.fullName}`);\n\n const rankedTasks = rankTasks(scannedTasks).filter(\n (task) => task.priority >= options.minPriority,\n );\n\n if (outputJson) {\n console.log(\n JSON.stringify(\n {\n repo: resolvedRepo.fullName,\n scanners: scannerSelection.enabled,\n minPriority: options.minPriority,\n totalTasks: rankedTasks.length,\n tasks: rankedTasks,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (rankedTasks.length === 0) {\n console.log(ui.yellow(\"No tasks discovered for the selected criteria.\"));\n return;\n }\n\n const table = new Table({\n head: [\"ID\", \"Title\", \"Source\", \"Priority\", \"Complexity\"],\n });\n\n for (const task of rankedTasks) {\n table.push([\n task.id,\n truncate(task.title, 60),\n task.source,\n String(task.priority),\n task.complexity,\n ]);\n }\n\n console.log(table.toString());\n console.log(\"\");\n console.log(\n ui.blue(\n `Found ${rankedTasks.length} task(s). Use \\`oac plan --repo ${resolvedRepo.fullName} --tokens <n>\\` to build an execution plan.`,\n ),\n );\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nfunction createUi(options: Required<GlobalCliOptions>): ChalkInstance {\n const noColorEnv = Object.prototype.hasOwnProperty.call(process.env, \"NO_COLOR\");\n const colorEnabled = options.color && !noColorEnv;\n\n return new Chalk({ level: colorEnabled ? chalk.level : 0 });\n}\n\nfunction createSpinner(enabled: boolean, text: string): Ora | null {\n if (enabled) {\n return null;\n }\n\n return ora({ text, color: \"blue\" }).start();\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Expected an integer but received \"${value}\".`);\n }\n\n return parsed;\n}\n\nfunction normalizeOutputFormat(value: string): OutputFormat {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"table\" || normalized === \"json\") {\n return normalized;\n }\n\n throw new Error(`Unsupported --format value \"${value}\". Use \"table\" or \"json\".`);\n}\n\nasync function loadOptionalConfig(\n configPath: string,\n verbose: boolean,\n ui: ChalkInstance,\n): Promise<OacConfig | null> {\n return loadOptionalConfigFile(configPath, {\n onWarning: verbose\n ? (message) => {\n console.warn(ui.yellow(`[oac] ${message}`));\n }\n : undefined,\n });\n}\n\nfunction resolveRepoInput(repoOption: string | undefined, config: OacConfig | null): string {\n const fromFlag = repoOption?.trim();\n if (fromFlag) {\n return fromFlag;\n }\n\n const firstConfiguredRepo = config?.repos[0];\n if (typeof firstConfiguredRepo === \"string\") {\n return firstConfiguredRepo;\n }\n\n if (\n firstConfiguredRepo &&\n typeof firstConfiguredRepo === \"object\" &&\n \"name\" in firstConfiguredRepo &&\n typeof firstConfiguredRepo.name === \"string\"\n ) {\n return firstConfiguredRepo.name;\n }\n\n throw new Error(\"No repository specified. Use --repo or configure repos in oac.config.ts.\");\n}\n\nfunction selectScanners(\n scannerOption: string | undefined,\n config: OacConfig | null,\n hasGitHubAuth = false,\n): {\n enabled: SupportedScanner[];\n unknown: string[];\n scanner: CompositeScanner;\n} {\n const defaultScanners: SupportedScanner[] = [\"lint\", \"todo\", \"test-gap\"];\n if (hasGitHubAuth) {\n defaultScanners.push(\"github-issues\");\n }\n const requested = scannerOption\n ? parseCsv(scannerOption)\n : (scannersFromConfig(config, hasGitHubAuth) ?? defaultScanners);\n\n const enabled: SupportedScanner[] = [];\n const unknown: string[] = [];\n\n for (const scannerName of requested) {\n const normalized = scannerName.toLowerCase();\n if (normalized === \"lint\" || normalized === \"todo\" || normalized === \"github-issues\" || normalized === \"test-gap\") {\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(config: OacConfig | null, hasGitHubAuth = false): SupportedScanner[] | null {\n if (!config) {\n return null;\n }\n\n const configured: SupportedScanner[] = [];\n if (config.discovery.scanners.lint) {\n configured.push(\"lint\");\n }\n if (config.discovery.scanners.todo) {\n configured.push(\"todo\");\n }\n // Always include test-gap for autonomous discovery\n configured.push(\"test-gap\");\n if (hasGitHubAuth) {\n configured.push(\"github-issues\");\n }\n\n if (configured.length === 0) {\n return null;\n }\n\n return configured;\n}\n\nfunction parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { Command } from \"commander\";\n\nimport type { GlobalCliOptions } from \"../cli.js\";\n\ninterface StatusCommandOptions {\n watch?: boolean;\n}\n\ninterface RunStatus {\n runId: string;\n startedAt: string;\n agent: string;\n tasks: RunStatusTask[];\n}\n\ninterface RunStatusTask {\n taskId: string;\n title: string;\n status: \"pending\" | \"running\" | \"completed\" | \"failed\";\n startedAt?: string;\n completedAt?: string;\n error?: string;\n}\n\nconst WATCH_INTERVAL_MS = 2_000;\n\nexport function createStatusCommand(): Command {\n const command = new Command(\"status\");\n\n command\n .description(\"Show current job status\")\n .option(\"--watch\", \"Poll every 2 seconds\", false)\n .action(async (options: StatusCommandOptions, cmd) => {\n const globalOptions = getGlobalOptions(cmd);\n\n const render = async (): Promise<void> => {\n const status = await readRunStatus(process.cwd());\n renderStatusOutput(status, globalOptions.json);\n };\n\n await render();\n\n if (!options.watch) {\n return;\n }\n\n setInterval(() => {\n console.clear();\n void render().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n });\n }, WATCH_INTERVAL_MS);\n });\n\n return command;\n}\n\nfunction getGlobalOptions(command: Command): Required<GlobalCliOptions> {\n const options = command.optsWithGlobals<GlobalCliOptions>();\n\n return {\n config: options.config ?? \"oac.config.ts\",\n verbose: options.verbose === true,\n json: options.json === true,\n color: options.color !== false,\n };\n}\n\nasync function readRunStatus(repoPath: string): Promise<RunStatus | null> {\n const statusPath = resolve(repoPath, \".oac\", \"status.json\");\n\n try {\n const raw = await readFile(statusPath, \"utf8\");\n const payload = JSON.parse(raw) as unknown;\n return parseRunStatus(payload);\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return null;\n }\n\n throw error;\n }\n}\n\nfunction parseRunStatus(payload: unknown): RunStatus {\n if (!isRecord(payload)) {\n throw new Error(\"Invalid .oac/status.json format.\");\n }\n\n const runId = payload.runId;\n const startedAt = payload.startedAt;\n const agent = payload.agent;\n const tasks = payload.tasks;\n\n if (\n typeof runId !== \"string\" ||\n typeof startedAt !== \"string\" ||\n typeof agent !== \"string\" ||\n !Array.isArray(tasks)\n ) {\n throw new Error(\"Invalid .oac/status.json format.\");\n }\n\n return {\n runId,\n startedAt,\n agent,\n tasks: tasks.map((task, index) => parseRunStatusTask(task, index)),\n };\n}\n\nfunction parseRunStatusTask(task: unknown, index: number): RunStatusTask {\n if (!isRecord(task)) {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n const taskId = task.taskId;\n const title = task.title;\n const status = task.status;\n const startedAt = task.startedAt;\n const completedAt = task.completedAt;\n const error = task.error;\n\n if (\n typeof taskId !== \"string\" ||\n typeof title !== \"string\" ||\n (status !== \"pending\" && status !== \"running\" && status !== \"completed\" && status !== \"failed\")\n ) {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n if (startedAt !== undefined && typeof startedAt !== \"string\") {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n if (completedAt !== undefined && typeof completedAt !== \"string\") {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n if (error !== undefined && typeof error !== \"string\") {\n throw new Error(`Invalid task at index ${String(index)} in .oac/status.json.`);\n }\n\n return {\n taskId,\n title,\n status,\n startedAt,\n completedAt,\n error,\n };\n}\n\nfunction renderStatusOutput(status: RunStatus | null, outputJson: boolean): void {\n if (outputJson) {\n if (!status) {\n console.log(\n JSON.stringify(\n {\n active: false,\n message: \"No active runs\",\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log(\n JSON.stringify(\n {\n active: true,\n status,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (!status) {\n console.log(\"No active runs\");\n return;\n }\n\n const runningTasks = status.tasks.filter((task) => task.status === \"running\");\n const completedTasks = status.tasks.filter((task) => task.status === \"completed\");\n const failedTasks = status.tasks.filter((task) => task.status === \"failed\");\n\n console.log(`Run ID: ${status.runId}`);\n console.log(`Start Time: ${status.startedAt}`);\n console.log(`Agent: ${status.agent}`);\n console.log(\n `Tasks In Progress (${String(runningTasks.length)}): ${formatTaskList(runningTasks)}`,\n );\n console.log(\n `Completed Tasks (${String(completedTasks.length)}): ${formatTaskList(completedTasks)}`,\n );\n\n if (failedTasks.length === 0) {\n console.log(\"Errors: none\");\n return;\n }\n\n console.log(`Errors (${String(failedTasks.length)}):`);\n for (const task of failedTasks) {\n console.log(`- ${task.taskId}: ${task.error ?? \"Unknown error\"}`);\n }\n}\n\nfunction formatTaskList(tasks: RunStatusTask[]): string {\n if (tasks.length === 0) {\n return \"-\";\n }\n\n return tasks.map((task) => `${task.taskId} (${task.title})`).join(\", \");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n if (!isRecord(error)) {\n return false;\n }\n\n return error.code === \"ENOENT\";\n}\n"],"mappings":"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","names":["readFile","Command","chalk","Chalk","Command","getGlobalOptions","createUi","input","resolve","Command","getGlobalOptions","readFile","readdir","resolve","contributionLogSchema","Table","Command","parseInteger","getGlobalOptions","readContributionLogs","formatInteger","isFileNotFoundError","chalk","Chalk","Table","Command","fsConstants","access","readFile","resolve","pathExists","Command","parseInteger","getGlobalOptions","createUi","Chalk","chalk","Table","formatInteger","buildExecutionPlan","estimateTokens","CompositeScanner","LintScanner","TodoScanner","rankTasks","cloneRepo","resolveRepo","chalk","Chalk","Table","Command","ora","Command","parseInteger","getGlobalOptions","createUi","loadOptionalConfig","resolveRepoInput","resolveProviderId","resolveBudget","selectScannersFromConfig","createSpinner","resolveRepo","cloneRepo","rankTasks","estimateTaskMap","buildExecutionPlan","formatInteger","Chalk","chalk","ora","LintScanner","TodoScanner","CompositeScanner","estimateTokens","input","Table","truncate","formatInteger","truncate","CompositeScanner","GitHubIssuesScanner","LintScanner","TestGapScanner","TodoScanner","rankTasks","cloneRepo","resolveRepo","chalk","Chalk","Table","Command","ora","Command","parseInteger","getGlobalOptions","createUi","loadOptionalConfig","resolveRepoInput","createSpinner","resolveRepo","cloneRepo","rankTasks","Table","truncate","Chalk","chalk","ora","LintScanner","GitHubIssuesScanner","TestGapScanner","TodoScanner","CompositeScanner","readFile","resolve","Command","getGlobalOptions","isFileNotFoundError","isRecord","readFile","Command"]}