@open330/oac 2026.3.2 → 2026.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -4
- package/dist/{chunk-PYSJFMKA.js → chunk-GII2GWGO.js} +75 -20
- package/dist/chunk-GII2GWGO.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +8 -8
- package/dist/chunk-PYSJFMKA.js.map +0 -1
package/README.md
CHANGED
|
@@ -299,7 +299,7 @@ All packages are published under the `@open330` scope on npm:
|
|
|
299
299
|
| CLI | Commander.js, chalk, ora, cli-table3 |
|
|
300
300
|
| Git | simple-git, git worktrees for isolation |
|
|
301
301
|
| GitHub | @octokit/rest |
|
|
302
|
-
| AI Agents | Claude Code, Codex CLI (pluggable via `AgentProvider`
|
|
302
|
+
| AI Agents | Claude Code (`claude-code`), Codex CLI (`codex`) — pluggable via `AgentProvider` |
|
|
303
303
|
| Dashboard | Fastify + embedded SPA with SSE streaming |
|
|
304
304
|
| Quality | Vitest, Biome |
|
|
305
305
|
|
|
@@ -378,7 +378,7 @@ You run `oac run`
|
|
|
378
378
|
| Agent | Status | Provider ID |
|
|
379
379
|
|-------|--------|-------------|
|
|
380
380
|
| [Claude Code](https://claude.ai/code) | Supported | `claude-code` |
|
|
381
|
-
| [Codex CLI](https://github.com/openai/codex) |
|
|
381
|
+
| [Codex CLI](https://github.com/openai/codex) | Supported | `codex` |
|
|
382
382
|
| [OpenCode](https://github.com/opencode-ai/opencode) | Planned | `opencode` |
|
|
383
383
|
| Custom | Implement `AgentProvider` interface | any string |
|
|
384
384
|
|
|
@@ -402,8 +402,9 @@ export class MyAgentAdapter implements AgentProvider {
|
|
|
402
402
|
|
|
403
403
|
## Roadmap
|
|
404
404
|
|
|
405
|
-
- [x] **2026.2.17** — Core engine, CLI, 5 scanners,
|
|
406
|
-
- [
|
|
405
|
+
- [x] **2026.2.17** — Core engine, CLI, 5 scanners, parallel execution, dashboard, npm publish
|
|
406
|
+
- [x] **2026.3.x** — Claude Code + Codex CLI adapters (both supported)
|
|
407
|
+
- [ ] **Next** — OpenCode adapter, multi-agent routing (run multiple agents simultaneously)
|
|
407
408
|
- [ ] **Future** — Linear/Jira webhooks, plugin system, sparse checkout for monorepos
|
|
408
409
|
|
|
409
410
|
---
|
|
@@ -13,7 +13,7 @@ function createDoctorCommand() {
|
|
|
13
13
|
const globalOptions = getGlobalOptions(cmd);
|
|
14
14
|
const ui = createUi(globalOptions);
|
|
15
15
|
const checks = await runDoctorChecks();
|
|
16
|
-
const allPassed = checks.every((check) => check.status
|
|
16
|
+
const allPassed = checks.every((check) => check.status !== "fail");
|
|
17
17
|
if (globalOptions.json) {
|
|
18
18
|
console.log(
|
|
19
19
|
JSON.stringify(
|
|
@@ -70,7 +70,7 @@ async function runDoctorChecks() {
|
|
|
70
70
|
const codexResult = await runCommand("codex", ["--version"]);
|
|
71
71
|
const codexVersion = extractVersion(codexResult.stdout) ?? "--";
|
|
72
72
|
checks.push({
|
|
73
|
-
id: "codex
|
|
73
|
+
id: "codex",
|
|
74
74
|
name: "Codex CLI",
|
|
75
75
|
requirement: "installed",
|
|
76
76
|
value: codexVersion,
|
|
@@ -92,12 +92,14 @@ async function checkGithubAuth() {
|
|
|
92
92
|
}
|
|
93
93
|
const authResult = await runCommand("gh", ["auth", "status"]);
|
|
94
94
|
if (authResult.ok) {
|
|
95
|
+
const hasRepoScope = authResult.stdout.includes("repo");
|
|
95
96
|
return {
|
|
96
97
|
id: "github-auth",
|
|
97
98
|
name: "GitHub auth",
|
|
98
99
|
requirement: "gh auth status or GITHUB_TOKEN",
|
|
99
100
|
value: "gh auth status",
|
|
100
|
-
status: "pass"
|
|
101
|
+
status: hasRepoScope ? "pass" : "warn",
|
|
102
|
+
message: hasRepoScope ? void 0 : "Missing 'repo' scope \u2014 private repos won't work. Run: gh auth refresh -s repo"
|
|
101
103
|
};
|
|
102
104
|
}
|
|
103
105
|
return {
|
|
@@ -127,8 +129,10 @@ function renderDoctorOutput(ui, checks, allPassed) {
|
|
|
127
129
|
console.log("Checking environment...");
|
|
128
130
|
console.log("");
|
|
129
131
|
for (const check of checks) {
|
|
130
|
-
const
|
|
131
|
-
const
|
|
132
|
+
const iconMap = { pass: ui.green("[OK]"), warn: ui.yellow("[!]"), fail: ui.red("[X]") };
|
|
133
|
+
const statusMap = { pass: ui.green("PASS"), warn: ui.yellow("WARN"), fail: ui.red("FAIL") };
|
|
134
|
+
const icon = iconMap[check.status];
|
|
135
|
+
const status = statusMap[check.status];
|
|
132
136
|
const name = check.name.padEnd(12, " ");
|
|
133
137
|
const requirement = check.requirement.padEnd(30, " ");
|
|
134
138
|
const value = check.value.padEnd(14, " ");
|
|
@@ -136,6 +140,9 @@ function renderDoctorOutput(ui, checks, allPassed) {
|
|
|
136
140
|
if (check.status === "fail" && check.message) {
|
|
137
141
|
console.log(` ${ui.red(check.message)}`);
|
|
138
142
|
}
|
|
143
|
+
if (check.status === "warn" && check.message) {
|
|
144
|
+
console.log(` ${ui.yellow(check.message)}`);
|
|
145
|
+
}
|
|
139
146
|
}
|
|
140
147
|
console.log("");
|
|
141
148
|
if (allPassed) {
|
|
@@ -260,8 +267,8 @@ function createInitCommand() {
|
|
|
260
267
|
message: "Select AI provider(s):",
|
|
261
268
|
choices: [
|
|
262
269
|
{ name: "Claude Code", value: "claude-code", checked: true },
|
|
263
|
-
{ name: "Codex CLI", value: "codex
|
|
264
|
-
{ name: "OpenCode", value: "opencode" }
|
|
270
|
+
{ name: "Codex CLI", value: "codex" },
|
|
271
|
+
{ name: "OpenCode (coming soon)", value: "opencode", disabled: true }
|
|
265
272
|
],
|
|
266
273
|
validate: (value) => value.length > 0 ? true : "Select at least one provider to continue."
|
|
267
274
|
});
|
|
@@ -784,6 +791,21 @@ function ensureGitHubAuth() {
|
|
|
784
791
|
}
|
|
785
792
|
return void 0;
|
|
786
793
|
}
|
|
794
|
+
function checkGitHubScopes(required = ["repo"]) {
|
|
795
|
+
try {
|
|
796
|
+
const output = execFileSync("gh", ["auth", "status"], {
|
|
797
|
+
timeout: 5e3,
|
|
798
|
+
encoding: "utf-8",
|
|
799
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
800
|
+
});
|
|
801
|
+
const scopeMatch = output.match(/Token scopes:\s*'([^']+)'/);
|
|
802
|
+
if (!scopeMatch) return [];
|
|
803
|
+
const scopes = scopeMatch[1].split(",").map((s) => s.trim().replace(/^'|'$/g, ""));
|
|
804
|
+
return required.filter((r) => !scopes.includes(r));
|
|
805
|
+
} catch {
|
|
806
|
+
return [];
|
|
807
|
+
}
|
|
808
|
+
}
|
|
787
809
|
|
|
788
810
|
// src/commands/plan.ts
|
|
789
811
|
import chalk3, { Chalk as Chalk3 } from "chalk";
|
|
@@ -1089,6 +1111,7 @@ import {
|
|
|
1089
1111
|
rankTasks as rankTasks2
|
|
1090
1112
|
} from "@open330/oac-discovery";
|
|
1091
1113
|
import {
|
|
1114
|
+
ClaudeCodeAdapter,
|
|
1092
1115
|
CodexAdapter,
|
|
1093
1116
|
createSandbox,
|
|
1094
1117
|
executeTask as workerExecuteTask
|
|
@@ -1125,9 +1148,28 @@ function createRunCommand() {
|
|
|
1125
1148
|
if (!ghToken && !outputJson) {
|
|
1126
1149
|
console.log(
|
|
1127
1150
|
ui.yellow(
|
|
1128
|
-
"[oac] Warning: GitHub auth not detected. Run `gh auth login` first
|
|
1151
|
+
"[oac] Warning: GitHub auth not detected. Run `gh auth login` first."
|
|
1152
|
+
)
|
|
1153
|
+
);
|
|
1154
|
+
console.log(
|
|
1155
|
+
ui.yellow(
|
|
1156
|
+
"[oac] For private repos, ensure the 'repo' scope: gh auth refresh -s repo"
|
|
1129
1157
|
)
|
|
1130
1158
|
);
|
|
1159
|
+
} else if (ghToken && !outputJson) {
|
|
1160
|
+
const missingScopes = checkGitHubScopes(["repo"]);
|
|
1161
|
+
if (missingScopes.length > 0) {
|
|
1162
|
+
console.log(
|
|
1163
|
+
ui.yellow(
|
|
1164
|
+
`[oac] Warning: GitHub token missing scope(s): ${missingScopes.join(", ")}. Private repos may fail.`
|
|
1165
|
+
)
|
|
1166
|
+
);
|
|
1167
|
+
console.log(
|
|
1168
|
+
ui.yellow(
|
|
1169
|
+
"[oac] Fix with: gh auth refresh -s repo"
|
|
1170
|
+
)
|
|
1171
|
+
);
|
|
1172
|
+
}
|
|
1131
1173
|
}
|
|
1132
1174
|
if (!outputJson) {
|
|
1133
1175
|
console.log(
|
|
@@ -1219,18 +1261,17 @@ function createRunCommand() {
|
|
|
1219
1261
|
}
|
|
1220
1262
|
return;
|
|
1221
1263
|
}
|
|
1222
|
-
const
|
|
1223
|
-
const codexAvailability = await codexAdapter.checkAvailability();
|
|
1224
|
-
const useRealExecution = providerId.includes("codex") && codexAvailability.available;
|
|
1264
|
+
const { adapter, useRealExecution } = await resolveAdapter(providerId);
|
|
1225
1265
|
if (!outputJson && globalOptions.verbose) {
|
|
1226
|
-
if (useRealExecution) {
|
|
1266
|
+
if (useRealExecution && adapter) {
|
|
1267
|
+
const avail = await adapter.checkAvailability();
|
|
1227
1268
|
console.log(
|
|
1228
1269
|
ui.green(
|
|
1229
|
-
`[oac] Using
|
|
1270
|
+
`[oac] Using ${adapter.name} v${avail.version ?? "unknown"} for execution.`
|
|
1230
1271
|
)
|
|
1231
1272
|
);
|
|
1232
1273
|
} else {
|
|
1233
|
-
console.log(ui.yellow("[oac]
|
|
1274
|
+
console.log(ui.yellow("[oac] No agent CLI available. Using simulated execution."));
|
|
1234
1275
|
}
|
|
1235
1276
|
}
|
|
1236
1277
|
const executionSpinner = createSpinner2(
|
|
@@ -1244,11 +1285,11 @@ function createRunCommand() {
|
|
|
1244
1285
|
async (entry) => {
|
|
1245
1286
|
let execution;
|
|
1246
1287
|
let sandbox;
|
|
1247
|
-
if (useRealExecution) {
|
|
1248
|
-
const result = await
|
|
1288
|
+
if (useRealExecution && adapter) {
|
|
1289
|
+
const result = await executeWithAgent({
|
|
1249
1290
|
task: entry.task,
|
|
1250
1291
|
estimate: entry.estimate,
|
|
1251
|
-
|
|
1292
|
+
adapter,
|
|
1252
1293
|
repoPath: resolvedRepo.localPath,
|
|
1253
1294
|
baseBranch: resolvedRepo.meta.defaultBranch,
|
|
1254
1295
|
timeoutSeconds
|
|
@@ -1447,6 +1488,20 @@ function resolveRepoInput2(repoOption, config) {
|
|
|
1447
1488
|
}
|
|
1448
1489
|
throw new Error("No repository specified. Use --repo or configure repos in oac.config.ts.");
|
|
1449
1490
|
}
|
|
1491
|
+
async function resolveAdapter(providerId) {
|
|
1492
|
+
const normalizedId = providerId === "codex-cli" ? "codex" : providerId;
|
|
1493
|
+
const adapters = {
|
|
1494
|
+
codex: () => new CodexAdapter(),
|
|
1495
|
+
"claude-code": () => new ClaudeCodeAdapter()
|
|
1496
|
+
};
|
|
1497
|
+
const factory = adapters[normalizedId];
|
|
1498
|
+
if (!factory) {
|
|
1499
|
+
return { adapter: null, useRealExecution: false };
|
|
1500
|
+
}
|
|
1501
|
+
const adapter = factory();
|
|
1502
|
+
const availability = await adapter.checkAvailability();
|
|
1503
|
+
return { adapter: availability.available ? adapter : null, useRealExecution: availability.available };
|
|
1504
|
+
}
|
|
1450
1505
|
function resolveProviderId2(providerOption, config) {
|
|
1451
1506
|
const fromFlag = providerOption?.trim();
|
|
1452
1507
|
if (fromFlag) {
|
|
@@ -1516,7 +1571,7 @@ async function estimateTaskMap2(tasks, providerId) {
|
|
|
1516
1571
|
);
|
|
1517
1572
|
return new Map(entries);
|
|
1518
1573
|
}
|
|
1519
|
-
async function
|
|
1574
|
+
async function executeWithAgent(input2) {
|
|
1520
1575
|
const startedAt = Date.now();
|
|
1521
1576
|
const taskSlug = input2.task.id.replace(/[^a-zA-Z0-9-]/g, "-").replace(/-+/g, "-").slice(0, 30);
|
|
1522
1577
|
const branchName = `oac/${Date.now()}-${taskSlug}`;
|
|
@@ -1528,7 +1583,7 @@ async function executeWithCodex(input2) {
|
|
|
1528
1583
|
cleanup: sandbox.cleanup
|
|
1529
1584
|
};
|
|
1530
1585
|
try {
|
|
1531
|
-
const result = await workerExecuteTask(input2.
|
|
1586
|
+
const result = await workerExecuteTask(input2.adapter, input2.task, sandbox, eventBus, {
|
|
1532
1587
|
tokenBudget: input2.estimate.totalEstimatedTokens,
|
|
1533
1588
|
timeoutMs: input2.timeoutSeconds * 1e3
|
|
1534
1589
|
});
|
|
@@ -2282,4 +2337,4 @@ export {
|
|
|
2282
2337
|
createCliProgram,
|
|
2283
2338
|
runCli
|
|
2284
2339
|
};
|
|
2285
|
-
//# sourceMappingURL=chunk-
|
|
2340
|
+
//# sourceMappingURL=chunk-GII2GWGO.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 if (process.env.GITHUB_TOKEN) return process.env.GITHUB_TOKEN;\n if (process.env.GH_TOKEN) return process.env.GH_TOKEN;\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 */\nexport function checkGitHubScopes(required: string[] = [\"repo\"]): string[] {\n try {\n const output = execFileSync(\"gh\", [\"auth\", \"status\"], {\n timeout: 5_000,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const scopeMatch = output.match(/Token scopes:\\s*'([^']+)'/);\n if (!scopeMatch) return [];\n\n const scopes = scopeMatch[1].split(\",\").map((s) => s.trim().replace(/^'|'$/g, \"\"));\n return required.filter((r) => !scopes.includes(r));\n } catch {\n return [];\n }\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { type OacConfig, loadConfig } from \"@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 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\";\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 scannerSelection = selectScannersFromConfig(config);\n\n const runStartedAt = Date.now();\n const runId = randomUUID();\n\n // Pre-flight: ensure GitHub auth is available before any API calls\n const ghToken = ensureGitHubAuth();\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(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 if (config?.discovery.scanners.todo !== false) {\n enabled.push(\"todo\");\n }\n\n // Always include github-issues scanner when GITHUB_TOKEN is available\n if (process.env.GITHUB_TOKEN) {\n enabled.push(\"github-issues\");\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 if (scannerName === \"lint\") return new LintScanner();\n if (scannerName === \"github-issues\") return new GitHubIssuesScanner();\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 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 ScanCommandOptions {\n repo?: string;\n scanners?: string;\n minPriority: number;\n format: string;\n}\n\ntype OutputFormat = \"table\" | \"json\";\ntype SupportedScanner = \"lint\" | \"todo\";\n\nconst SUPPORTED_SCANNERS: SupportedScanner[] = [\"lint\", \"todo\"];\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 scannerSelection = selectScanners(options.scanners, config);\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 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\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): {\n enabled: SupportedScanner[];\n unknown: string[];\n scanner: CompositeScanner;\n} {\n const requested = scannerOption\n ? parseCsv(scannerOption)\n : (scannersFromConfig(config) ?? [...SUPPORTED_SCANNERS]);\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\") {\n enabled.push(normalized);\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 name === \"lint\" ? new LintScanner() : new TodoScanner(),\n );\n\n return {\n enabled: uniqueEnabled,\n unknown,\n scanner: new CompositeScanner(scannerInstances),\n };\n}\n\nfunction scannersFromConfig(config: OacConfig | null): 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\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","LintScanner","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","TodoScanner","CompositeScanner","readFile","resolve","Command","getGlobalOptions","isFileNotFoundError","isRecord","readFile","Command"]}
|
package/dist/cli.js
CHANGED
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open330/oac",
|
|
3
|
-
"version": "2026.3.
|
|
3
|
+
"version": "2026.3.3",
|
|
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-
|
|
41
|
-
"@open330/oac-
|
|
42
|
-
"@open330/oac-
|
|
43
|
-
"@open330/oac-discovery": "2026.3.
|
|
44
|
-
"@open330/oac-
|
|
45
|
-
"@open330/oac-completion": "2026.3.
|
|
46
|
-
"@open330/oac-tracking": "2026.3.
|
|
40
|
+
"@open330/oac-core": "2026.3.3",
|
|
41
|
+
"@open330/oac-budget": "2026.3.3",
|
|
42
|
+
"@open330/oac-repo": "2026.3.3",
|
|
43
|
+
"@open330/oac-discovery": "2026.3.3",
|
|
44
|
+
"@open330/oac-execution": "2026.3.3",
|
|
45
|
+
"@open330/oac-completion": "2026.3.3",
|
|
46
|
+
"@open330/oac-tracking": "2026.3.3"
|
|
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\" | \"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 === \"pass\");\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-cli\",\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 return {\n id: \"github-auth\",\n name: \"GitHub auth\",\n requirement: \"gh auth status or GITHUB_TOKEN\",\n value: \"gh auth status\",\n status: \"pass\",\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 icon = check.status === \"pass\" ? ui.green(\"[OK]\") : ui.red(\"[X]\");\n const status = check.status === \"pass\" ? ui.green(\"PASS\") : ui.red(\"FAIL\");\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 }\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-cli\" | \"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-cli\" },\n { name: \"OpenCode\", value: \"opencode\" },\n ],\n validate: (value) => (value.length > 0 ? true : \"Select at least one provider to continue.\"),\n });\n\n const budgetInput = await input({\n message: \"Monthly token budget:\",\n default: \"100000\",\n validate: (value) => {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return \"Enter a positive integer.\";\n }\n\n return true;\n },\n });\n\n const firstRepoInput = await input({\n message: \"Add your first repo (owner/repo or GitHub URL):\",\n validate: (value) => {\n if (isValidRepoInput(value)) {\n return true;\n }\n\n return \"Enter a valid GitHub repo like owner/repo.\";\n },\n });\n\n const repo = normalizeRepoInput(firstRepoInput);\n const budgetTokens = Number.parseInt(budgetInput, 10);\n const provider = selectedProviders[0] ?? \"claude-code\";\n\n const configPath = resolve(process.cwd(), \"oac.config.ts\");\n const trackingDirectory = resolve(process.cwd(), \".oac\");\n\n if (await pathExists(configPath)) {\n const shouldOverwrite = await confirm({\n message: \"oac.config.ts already exists. Overwrite it?\",\n default: false,\n });\n\n if (!shouldOverwrite) {\n if (globalOptions.json) {\n console.log(\n JSON.stringify(\n {\n cancelled: true,\n reason: \"oac.config.ts exists and overwrite was declined\",\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log(ui.yellow(\"Initialization cancelled.\"));\n return;\n }\n }\n\n const configContent = buildConfigFile({\n provider,\n providers: selectedProviders,\n budgetTokens,\n repo,\n });\n\n await writeFile(configPath, configContent, \"utf8\");\n await mkdir(trackingDirectory, { recursive: true });\n\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 if (process.env.GITHUB_TOKEN) return process.env.GITHUB_TOKEN;\n if (process.env.GH_TOKEN) return process.env.GH_TOKEN;\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","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 TodoScanner,\n rankTasks,\n} from \"@open330/oac-discovery\";\nimport {\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 { 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\";\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 scannerSelection = selectScannersFromConfig(config);\n\n const runStartedAt = Date.now();\n const runId = randomUUID();\n\n // Pre-flight: ensure GitHub auth is available before any API calls\n const ghToken = ensureGitHubAuth();\n if (!ghToken && !outputJson) {\n console.log(\n ui.yellow(\n \"[oac] Warning: GitHub auth not detected. Run `gh auth login` first to enable PR creation.\",\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 codexAdapter = new CodexAdapter();\n const codexAvailability = await codexAdapter.checkAvailability();\n const useRealExecution = providerId.includes(\"codex\") && codexAvailability.available;\n\n if (!outputJson && globalOptions.verbose) {\n if (useRealExecution) {\n console.log(\n ui.green(\n `[oac] Using Codex CLI v${codexAvailability.version ?? \"unknown\"} for execution.`,\n ),\n );\n } else {\n console.log(ui.yellow(\"[oac] Codex CLI not 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) {\n const result = await executeWithCodex({\n task: entry.task,\n estimate: entry.estimate,\n codexAdapter,\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\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(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 if (config?.discovery.scanners.todo !== false) {\n enabled.push(\"todo\");\n }\n\n // Always include github-issues scanner when GITHUB_TOKEN is available\n if (process.env.GITHUB_TOKEN) {\n enabled.push(\"github-issues\");\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 if (scannerName === \"lint\") return new LintScanner();\n if (scannerName === \"github-issues\") return new GitHubIssuesScanner();\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 executeWithCodex(input: {\n task: Task;\n estimate: TokenEstimate;\n codexAdapter: CodexAdapter;\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.codexAdapter, input.task, sandbox, eventBus, {\n tokenBudget: input.estimate.totalEstimatedTokens,\n timeoutMs: input.timeoutSeconds * 1_000,\n });\n\n // Codex 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 Codex 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 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 ScanCommandOptions {\n repo?: string;\n scanners?: string;\n minPriority: number;\n format: string;\n}\n\ntype OutputFormat = \"table\" | \"json\";\ntype SupportedScanner = \"lint\" | \"todo\";\n\nconst SUPPORTED_SCANNERS: SupportedScanner[] = [\"lint\", \"todo\"];\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 scannerSelection = selectScanners(options.scanners, config);\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 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\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): {\n enabled: SupportedScanner[];\n unknown: string[];\n scanner: CompositeScanner;\n} {\n const requested = scannerOption\n ? parseCsv(scannerOption)\n : (scannersFromConfig(config) ?? [...SUPPORTED_SCANNERS]);\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\") {\n enabled.push(normalized);\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 name === \"lint\" ? new LintScanner() : new TodoScanner(),\n );\n\n return {\n enabled: uniqueEnabled,\n unknown,\n scanner: new CompositeScanner(scannerInstances),\n };\n}\n\nfunction scannersFromConfig(config: OacConfig | null): 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\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","LintScanner","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","TodoScanner","CompositeScanner","readFile","resolve","Command","getGlobalOptions","isFileNotFoundError","isRecord","readFile","Command"]}
|