@open330/oac 2026.2.17 → 2026.3.0

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.
@@ -1,5 +1,5 @@
1
1
  // src/cli.ts
2
- import { readFile as readFile4 } from "fs/promises";
2
+ import { readFile as readFile5 } from "fs/promises";
3
3
  import { Command as Command9 } from "commander";
4
4
 
5
5
  // src/commands/doctor.ts
@@ -356,9 +356,7 @@ function createUi2(options) {
356
356
  }
357
357
  function buildConfigFile(input2) {
358
358
  const enabledProviders = input2.providers.map((provider) => `'${provider}'`).join(", ");
359
- return `import { defineConfig } from '@open330/oac-core';
360
-
361
- export default defineConfig({
359
+ return `export default {
362
360
  repos: ['${input2.repo}'],
363
361
  provider: {
364
362
  id: '${input2.provider}',
@@ -369,7 +367,7 @@ export default defineConfig({
369
367
  budget: {
370
368
  totalTokens: ${input2.budgetTokens},
371
369
  },
372
- });
370
+ };
373
371
  `;
374
372
  }
375
373
  function normalizeRepoInput(input2) {
@@ -758,12 +756,7 @@ function isFileNotFoundError2(error) {
758
756
  }
759
757
 
760
758
  // src/commands/plan.ts
761
- import { constants as fsConstants2 } from "fs";
762
- import { access as access2 } from "fs/promises";
763
- import { resolve as resolve4 } from "path";
764
- import { pathToFileURL } from "url";
765
759
  import { buildExecutionPlan, estimateTokens } from "@open330/oac-budget";
766
- import { loadConfig } from "@open330/oac-core";
767
760
  import {
768
761
  CompositeScanner,
769
762
  LintScanner,
@@ -775,6 +768,83 @@ import chalk3, { Chalk as Chalk3 } from "chalk";
775
768
  import Table3 from "cli-table3";
776
769
  import { Command as Command5 } from "commander";
777
770
  import ora from "ora";
771
+
772
+ // src/config-loader.ts
773
+ import { constants as fsConstants2 } from "fs";
774
+ import { access as access2, readFile as readFile3 } from "fs/promises";
775
+ import { resolve as resolve4 } from "path";
776
+ import { pathToFileURL } from "url";
777
+ import { loadConfig } from "@open330/oac-core";
778
+ var LEGACY_DEFINE_CONFIG_IMPORT = /@(?:open330\/oac-core|oac\/core)/;
779
+ var LEGACY_DEFINE_CONFIG_IMPORT_LINE = /^\s*import\s*\{\s*defineConfig\s*\}\s*from\s*["']@(?:open330\/oac-core|oac\/core)["'];\s*$/m;
780
+ var LEGACY_DEFINE_CONFIG_EXPORT = /export\s+default\s+defineConfig\s*\(/;
781
+ async function loadOptionalConfigFile(configPath, options = {}) {
782
+ const absolutePath = resolve4(options.cwd ?? process.cwd(), configPath);
783
+ if (!await pathExists2(absolutePath)) {
784
+ return null;
785
+ }
786
+ try {
787
+ const candidate = await importConfigCandidate(absolutePath);
788
+ return loadConfig(candidate);
789
+ } catch (error) {
790
+ options.onWarning?.(
791
+ `Failed to load config at ${configPath}: ${error instanceof Error ? error.message : String(error)}`
792
+ );
793
+ return null;
794
+ }
795
+ }
796
+ async function importConfigCandidate(absolutePath) {
797
+ try {
798
+ return await importCandidate(`${pathToFileURL(absolutePath).href}?t=${Date.now()}`);
799
+ } catch (error) {
800
+ const fallbackCandidate = await importLegacyDefineConfigCandidate(absolutePath, error);
801
+ if (fallbackCandidate !== null) {
802
+ return fallbackCandidate;
803
+ }
804
+ throw error;
805
+ }
806
+ }
807
+ async function importLegacyDefineConfigCandidate(absolutePath, error) {
808
+ if (!shouldTryLegacyDefineConfigFallback(error)) {
809
+ return null;
810
+ }
811
+ const source = await readFile3(absolutePath, "utf8");
812
+ const transformed = transformLegacyDefineConfigSource(source);
813
+ if (transformed === null) {
814
+ return null;
815
+ }
816
+ const encodedSource = Buffer.from(transformed, "utf8").toString("base64");
817
+ return await importCandidate(`data:text/javascript;base64,${encodedSource}`);
818
+ }
819
+ function shouldTryLegacyDefineConfigFallback(error) {
820
+ if (!(error instanceof Error)) {
821
+ return false;
822
+ }
823
+ return LEGACY_DEFINE_CONFIG_IMPORT.test(error.message);
824
+ }
825
+ function transformLegacyDefineConfigSource(source) {
826
+ if (!LEGACY_DEFINE_CONFIG_IMPORT_LINE.test(source)) {
827
+ return null;
828
+ }
829
+ if (!LEGACY_DEFINE_CONFIG_EXPORT.test(source)) {
830
+ return null;
831
+ }
832
+ return source.replace(LEGACY_DEFINE_CONFIG_IMPORT_LINE, "").replace(LEGACY_DEFINE_CONFIG_EXPORT, "export default (");
833
+ }
834
+ async function importCandidate(moduleSpecifier) {
835
+ const imported = await import(moduleSpecifier);
836
+ return imported.default ?? imported.config ?? imported;
837
+ }
838
+ async function pathExists2(path) {
839
+ try {
840
+ await access2(path, fsConstants2.F_OK);
841
+ return true;
842
+ } catch {
843
+ return false;
844
+ }
845
+ }
846
+
847
+ // src/commands/plan.ts
778
848
  function createPlanCommand() {
779
849
  const command = new Command5("plan");
780
850
  command.description("Build an execution plan from discovered tasks").option("--repo <owner/repo>", "Target repository (owner/repo or GitHub URL)").option("--tokens <number>", "Token budget for planning", parseInteger3).option("--provider <id>", "Agent provider id").action(async (options, cmd) => {
@@ -864,21 +934,11 @@ function parseInteger3(value) {
864
934
  return parsed;
865
935
  }
866
936
  async function loadOptionalConfig(configPath, verbose, ui) {
867
- const absolutePath = resolve4(process.cwd(), configPath);
868
- if (!await pathExists2(absolutePath)) {
869
- return null;
870
- }
871
- try {
872
- const imported = await import(`${pathToFileURL(absolutePath).href}?t=${Date.now()}`);
873
- const candidate = imported.default ?? imported.config ?? imported;
874
- return loadConfig(candidate);
875
- } catch (error) {
876
- if (verbose) {
877
- const message = error instanceof Error ? error.message : String(error);
878
- console.warn(ui.yellow(`[oac] Failed to load config at ${configPath}: ${message}`));
879
- }
880
- return null;
881
- }
937
+ return loadOptionalConfigFile(configPath, {
938
+ onWarning: verbose ? (message) => {
939
+ console.warn(ui.yellow(`[oac] ${message}`));
940
+ } : void 0
941
+ });
882
942
  }
883
943
  function resolveRepoInput(repoOption, config) {
884
944
  const fromFlag = repoOption?.trim();
@@ -990,26 +1050,13 @@ function truncate(value, maxLength) {
990
1050
  }
991
1051
  return `${value.slice(0, Math.max(0, maxLength - 3))}...`;
992
1052
  }
993
- async function pathExists2(path) {
994
- try {
995
- await access2(path, fsConstants2.F_OK);
996
- return true;
997
- } catch {
998
- return false;
999
- }
1000
- }
1001
1053
 
1002
1054
  // src/commands/run.ts
1003
1055
  import { randomUUID } from "crypto";
1004
- import { constants as fsConstants3 } from "fs";
1005
- import { access as access3 } from "fs/promises";
1006
- import { resolve as resolve5 } from "path";
1007
- import { pathToFileURL as pathToFileURL2 } from "url";
1008
1056
  import { buildExecutionPlan as buildExecutionPlan2, estimateTokens as estimateTokens2 } from "@open330/oac-budget";
1009
1057
  import {
1010
1058
  UNLIMITED_BUDGET,
1011
- createEventBus,
1012
- loadConfig as loadConfig2
1059
+ createEventBus
1013
1060
  } from "@open330/oac-core";
1014
1061
  import {
1015
1062
  CompositeScanner as CompositeScanner2,
@@ -1064,6 +1111,7 @@ function createRunCommand() {
1064
1111
  const cloneSpinner = createSpinner2(outputJson, "Preparing local clone...");
1065
1112
  await cloneRepo2(resolvedRepo);
1066
1113
  cloneSpinner?.succeed(`Repository ready at ${resolvedRepo.localPath}`);
1114
+ const ghToken = await resolveGitHubToken(ui, outputJson);
1067
1115
  const scanSpinner = createSpinner2(
1068
1116
  outputJson,
1069
1117
  `Running scanners: ${scannerSelection.enabled.join(", ")}`
@@ -1209,7 +1257,8 @@ function createRunCommand() {
1209
1257
  execution: result.execution,
1210
1258
  sandbox: result.sandbox,
1211
1259
  repoFullName: resolvedRepo.fullName,
1212
- baseBranch: resolvedRepo.meta.defaultBranch
1260
+ baseBranch: resolvedRepo.meta.defaultBranch,
1261
+ ghToken
1213
1262
  });
1214
1263
  if (!pr) {
1215
1264
  return result;
@@ -1348,21 +1397,11 @@ function validateRunOptions(options) {
1348
1397
  }
1349
1398
  }
1350
1399
  async function loadOptionalConfig2(configPath, verbose, ui) {
1351
- const absolutePath = resolve5(process.cwd(), configPath);
1352
- if (!await pathExists3(absolutePath)) {
1353
- return null;
1354
- }
1355
- try {
1356
- const imported = await import(`${pathToFileURL2(absolutePath).href}?t=${Date.now()}`);
1357
- const candidate = imported.default ?? imported.config ?? imported;
1358
- return loadConfig2(candidate);
1359
- } catch (error) {
1360
- if (verbose) {
1361
- const message = error instanceof Error ? error.message : String(error);
1362
- console.warn(ui.yellow(`[oac] Failed to load config at ${configPath}: ${message}`));
1363
- }
1364
- return null;
1365
- }
1400
+ return loadOptionalConfigFile(configPath, {
1401
+ onWarning: verbose ? (message) => {
1402
+ console.warn(ui.yellow(`[oac] ${message}`));
1403
+ } : void 0
1404
+ });
1366
1405
  }
1367
1406
  function resolveRepoInput2(repoOption, config) {
1368
1407
  const fromFlag = repoOption?.trim();
@@ -1504,6 +1543,29 @@ async function executeWithCodex(input2) {
1504
1543
  };
1505
1544
  }
1506
1545
  }
1546
+ async function resolveGitHubToken(ui, outputJson) {
1547
+ if (process.env.GITHUB_TOKEN) {
1548
+ return process.env.GITHUB_TOKEN;
1549
+ }
1550
+ if (process.env.GH_TOKEN) {
1551
+ return process.env.GH_TOKEN;
1552
+ }
1553
+ try {
1554
+ const result = await execa("gh", ["auth", "token"], { reject: false, timeout: 5e3 });
1555
+ if (result.exitCode === 0 && result.stdout.trim().length > 0) {
1556
+ return result.stdout.trim();
1557
+ }
1558
+ } catch {
1559
+ }
1560
+ if (!outputJson) {
1561
+ console.log(
1562
+ ui.yellow(
1563
+ "[oac] Warning: GitHub auth not detected. Run `gh auth login` first to enable PR creation."
1564
+ )
1565
+ );
1566
+ }
1567
+ return void 0;
1568
+ }
1507
1569
  async function createPullRequest(input2) {
1508
1570
  if (!input2.sandbox) {
1509
1571
  return void 0;
@@ -1511,7 +1573,15 @@ async function createPullRequest(input2) {
1511
1573
  const { branchName, sandboxPath } = input2.sandbox;
1512
1574
  const [owner, repo] = input2.repoFullName.split("/");
1513
1575
  try {
1514
- await execa("git", ["push", "--set-upstream", "origin", branchName], { cwd: sandboxPath });
1576
+ const ghEnv = { ...process.env };
1577
+ if (input2.ghToken) {
1578
+ ghEnv.GH_TOKEN = input2.ghToken;
1579
+ ghEnv.GITHUB_TOKEN = input2.ghToken;
1580
+ }
1581
+ await execa("git", ["push", "--set-upstream", "origin", branchName], {
1582
+ cwd: sandboxPath,
1583
+ env: ghEnv
1584
+ });
1515
1585
  const prTitle = `[OAC] ${input2.task.title}`;
1516
1586
  const prBody = [
1517
1587
  "## Summary",
@@ -1544,7 +1614,7 @@ async function createPullRequest(input2) {
1544
1614
  "--base",
1545
1615
  input2.baseBranch
1546
1616
  ],
1547
- { cwd: sandboxPath }
1617
+ { cwd: sandboxPath, env: ghEnv }
1548
1618
  );
1549
1619
  const prUrl = ghResult.stdout.trim();
1550
1620
  const prNumberMatch = prUrl.match(/\/pull\/(\d+)/);
@@ -1795,21 +1865,8 @@ function truncate2(value, maxLength) {
1795
1865
  }
1796
1866
  return `${value.slice(0, Math.max(0, maxLength - 3))}...`;
1797
1867
  }
1798
- async function pathExists3(path) {
1799
- try {
1800
- await access3(path, fsConstants3.F_OK);
1801
- return true;
1802
- } catch {
1803
- return false;
1804
- }
1805
- }
1806
1868
 
1807
1869
  // src/commands/scan.ts
1808
- import { constants as fsConstants4 } from "fs";
1809
- import { access as access4 } from "fs/promises";
1810
- import { resolve as resolve6 } from "path";
1811
- import { pathToFileURL as pathToFileURL3 } from "url";
1812
- import { loadConfig as loadConfig3 } from "@open330/oac-core";
1813
1870
  import {
1814
1871
  CompositeScanner as CompositeScanner3,
1815
1872
  LintScanner as LintScanner3,
@@ -1938,21 +1995,11 @@ function normalizeOutputFormat(value) {
1938
1995
  throw new Error(`Unsupported --format value "${value}". Use "table" or "json".`);
1939
1996
  }
1940
1997
  async function loadOptionalConfig3(configPath, verbose, ui) {
1941
- const absolutePath = resolve6(process.cwd(), configPath);
1942
- if (!await pathExists4(absolutePath)) {
1943
- return null;
1944
- }
1945
- try {
1946
- const imported = await import(`${pathToFileURL3(absolutePath).href}?t=${Date.now()}`);
1947
- const candidate = imported.default ?? imported.config ?? imported;
1948
- return loadConfig3(candidate);
1949
- } catch (error) {
1950
- if (verbose) {
1951
- const message = error instanceof Error ? error.message : String(error);
1952
- console.warn(ui.yellow(`[oac] Failed to load config at ${configPath}: ${message}`));
1953
- }
1954
- return null;
1955
- }
1998
+ return loadOptionalConfigFile(configPath, {
1999
+ onWarning: verbose ? (message) => {
2000
+ console.warn(ui.yellow(`[oac] ${message}`));
2001
+ } : void 0
2002
+ });
1956
2003
  }
1957
2004
  function resolveRepoInput3(repoOption, config) {
1958
2005
  const fromFlag = repoOption?.trim();
@@ -2020,18 +2067,10 @@ function truncate3(value, maxLength) {
2020
2067
  }
2021
2068
  return `${value.slice(0, Math.max(0, maxLength - 3))}...`;
2022
2069
  }
2023
- async function pathExists4(path) {
2024
- try {
2025
- await access4(path, fsConstants4.F_OK);
2026
- return true;
2027
- } catch {
2028
- return false;
2029
- }
2030
- }
2031
2070
 
2032
2071
  // src/commands/status.ts
2033
- import { readFile as readFile3 } from "fs/promises";
2034
- import { resolve as resolve7 } from "path";
2072
+ import { readFile as readFile4 } from "fs/promises";
2073
+ import { resolve as resolve5 } from "path";
2035
2074
  import { Command as Command8 } from "commander";
2036
2075
  var WATCH_INTERVAL_MS = 2e3;
2037
2076
  function createStatusCommand() {
@@ -2067,9 +2106,9 @@ function getGlobalOptions8(command) {
2067
2106
  };
2068
2107
  }
2069
2108
  async function readRunStatus(repoPath) {
2070
- const statusPath = resolve7(repoPath, ".oac", "status.json");
2109
+ const statusPath = resolve5(repoPath, ".oac", "status.json");
2071
2110
  try {
2072
- const raw = await readFile3(statusPath, "utf8");
2111
+ const raw = await readFile4(statusPath, "utf8");
2073
2112
  const payload = JSON.parse(raw);
2074
2113
  return parseRunStatus(payload);
2075
2114
  } catch (error) {
@@ -2200,7 +2239,7 @@ function isFileNotFoundError3(error) {
2200
2239
  async function readCliVersion() {
2201
2240
  try {
2202
2241
  const packageJsonPath = new URL("../package.json", import.meta.url);
2203
- const packageJsonRaw = await readFile4(packageJsonPath, "utf8");
2242
+ const packageJsonRaw = await readFile5(packageJsonPath, "utf8");
2204
2243
  const packageJson = JSON.parse(packageJsonRaw);
2205
2244
  if (typeof packageJson.version === "string" && packageJson.version.length > 0) {
2206
2245
  return packageJson.version;
@@ -2235,4 +2274,4 @@ export {
2235
2274
  createCliProgram,
2236
2275
  runCli
2237
2276
  };
2238
- //# sourceMappingURL=chunk-UVK4T7KV.js.map
2277
+ //# sourceMappingURL=chunk-ETHH6TEY.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/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 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 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 { 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\";\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 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 // Pre-flight: ensure GitHub auth is available (avoids interactive device flow mid-run)\n const ghToken = await resolveGitHubToken(ui, outputJson);\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\nasync function resolveGitHubToken(\n ui: ReturnType<typeof createUi>,\n outputJson: boolean,\n): Promise<string | undefined> {\n // 1. Prefer explicit env var\n if (process.env.GITHUB_TOKEN) {\n return process.env.GITHUB_TOKEN;\n }\n if (process.env.GH_TOKEN) {\n return process.env.GH_TOKEN;\n }\n\n // 2. Try to extract from gh CLI (non-interactive)\n try {\n const result = await execa(\"gh\", [\"auth\", \"token\"], { reject: false, timeout: 5_000 });\n if (result.exitCode === 0 && result.stdout.trim().length > 0) {\n return result.stdout.trim();\n }\n } catch {\n // gh not available or not authenticated\n }\n\n // 3. Warn the user — don't block the run, but PR creation will fail\n if (!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 return undefined;\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 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 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
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createCliProgram,
3
3
  runCli
4
- } from "./chunk-UVK4T7KV.js";
4
+ } from "./chunk-ETHH6TEY.js";
5
5
  export {
6
6
  createCliProgram,
7
7
  runCli
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runCli
4
- } from "./chunk-UVK4T7KV.js";
4
+ } from "./chunk-ETHH6TEY.js";
5
5
 
6
6
  // src/index.ts
7
7
  runCli().catch((error) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open330/oac",
3
- "version": "2026.2.17",
3
+ "version": "2026.3.0",
4
4
  "description": "CLI for Open Agent Contribution - automate open source contributions with AI agents",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -36,13 +36,13 @@
36
36
  "commander": "^13.1.0",
37
37
  "execa": "^9.5.2",
38
38
  "ora": "^8.1.1",
39
- "@open330/oac-core": "2026.2.17",
40
- "@open330/oac-execution": "2026.2.17",
41
- "@open330/oac-discovery": "2026.2.17",
42
- "@open330/oac-tracking": "2026.2.17",
43
- "@open330/oac-repo": "2026.2.17",
44
- "@open330/oac-completion": "2026.2.17",
45
- "@open330/oac-budget": "2026.2.17"
39
+ "@open330/oac-core": "2026.3.0",
40
+ "@open330/oac-repo": "2026.3.0",
41
+ "@open330/oac-discovery": "2026.3.0",
42
+ "@open330/oac-budget": "2026.3.0",
43
+ "@open330/oac-execution": "2026.3.0",
44
+ "@open330/oac-completion": "2026.3.0",
45
+ "@open330/oac-tracking": "2026.3.0"
46
46
  },
47
47
  "devDependencies": {
48
48
  "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/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 `import { defineConfig } from '@open330/oac-core';\n\nexport default defineConfig({\n repos: ['${input.repo}'],\n provider: {\n id: '${input.provider}',\n options: {\n enabledProviders: [${enabledProviders}],\n },\n },\n budget: {\n totalTokens: ${input.budgetTokens},\n },\n});\n`;\n}\n\nfunction normalizeRepoInput(input: string): string {\n const trimmed = input.trim();\n if (OWNER_REPO_PATTERN.test(trimmed)) {\n return stripGitSuffix(trimmed);\n }\n\n const normalizedUrlInput = trimmed.startsWith(\"github.com/\") ? `https://${trimmed}` : trimmed;\n\n try {\n const url = new URL(normalizedUrlInput);\n if (url.hostname !== \"github.com\") {\n return trimmed;\n }\n\n const segments = url.pathname.split(\"/\").filter(Boolean);\n if (segments.length < 2) {\n return trimmed;\n }\n\n const owner = segments[0];\n const repo = stripGitSuffix(segments[1] ?? \"\");\n if (!owner || !repo) {\n return trimmed;\n }\n\n return `${owner}/${repo}`;\n } catch {\n return trimmed;\n }\n}\n\nfunction stripGitSuffix(value: string): string {\n return value.endsWith(\".git\") ? value.slice(0, -4) : value;\n}\n\nfunction isValidRepoInput(input: string): boolean {\n const normalized = normalizeRepoInput(input);\n return OWNER_REPO_PATTERN.test(normalized);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path, fsConstants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n","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 { constants as fsConstants } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { buildExecutionPlan, estimateTokens } from \"@open330/oac-budget\";\nimport { type OacConfig, type Task, loadConfig } 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 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\";\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 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 const absolutePath = resolve(process.cwd(), configPath);\n if (!(await pathExists(absolutePath))) {\n return null;\n }\n\n try {\n const imported = await import(`${pathToFileURL(absolutePath).href}?t=${Date.now()}`);\n const candidate = imported.default ?? imported.config ?? imported;\n return loadConfig(candidate);\n } catch (error) {\n if (verbose) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(ui.yellow(`[oac] Failed to load config at ${configPath}: ${message}`));\n }\n\n return null;\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\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\";\nimport { constants as fsConstants } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { buildExecutionPlan, estimateTokens } from \"@open330/oac-budget\";\nimport {\n type OacConfig,\n type Task,\n type TokenEstimate,\n UNLIMITED_BUDGET,\n createEventBus,\n loadConfig,\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\";\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\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 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 });\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 const absolutePath = resolve(process.cwd(), configPath);\n if (!(await pathExists(absolutePath))) {\n return null;\n }\n\n try {\n const imported = await import(`${pathToFileURL(absolutePath).href}?t=${Date.now()}`);\n const candidate = imported.default ?? imported.config ?? imported;\n return loadConfig(candidate);\n } catch (error) {\n if (verbose) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(ui.yellow(`[oac] Failed to load config at ${configPath}: ${message}`));\n }\n\n return null;\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\nasync function createPullRequest(input: {\n task: Task;\n execution: ExecutionOutcome;\n sandbox?: SandboxInfo;\n repoFullName: string;\n baseBranch: 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 // Push the branch from the sandbox worktree\n await execa(\"git\", [\"push\", \"--set-upstream\", \"origin\", branchName], { cwd: sandboxPath });\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 },\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\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\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 { constants as fsConstants } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { type OacConfig, loadConfig } 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 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\";\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 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 const absolutePath = resolve(process.cwd(), configPath);\n if (!(await pathExists(absolutePath))) {\n return null;\n }\n\n try {\n const imported = await import(`${pathToFileURL(absolutePath).href}?t=${Date.now()}`);\n const candidate = imported.default ?? imported.config ?? imported;\n return loadConfig(candidate);\n } catch (error) {\n if (verbose) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(ui.yellow(`[oac] Failed to load config at ${configPath}: ${message}`));\n }\n\n return null;\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\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 { 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","fsConstants","access","resolve","chalk","Chalk","Table","Command","parseInteger","getGlobalOptions","createUi","pathExists","formatInteger","fsConstants","access","resolve","pathToFileURL","buildExecutionPlan","estimateTokens","loadConfig","CompositeScanner","LintScanner","TodoScanner","rankTasks","cloneRepo","resolveRepo","chalk","Chalk","Table","Command","ora","parseInteger","getGlobalOptions","createUi","loadOptionalConfig","resolveRepoInput","resolveProviderId","resolveBudget","selectScannersFromConfig","createSpinner","estimateTaskMap","formatInteger","pathExists","input","truncate","formatInteger","truncate","pathExists","access","fsConstants","fsConstants","access","resolve","pathToFileURL","loadConfig","CompositeScanner","LintScanner","TodoScanner","rankTasks","cloneRepo","resolveRepo","chalk","Chalk","Table","Command","ora","parseInteger","getGlobalOptions","createUi","loadOptionalConfig","resolveRepoInput","createSpinner","truncate","pathExists","readFile","resolve","Command","getGlobalOptions","isFileNotFoundError","isRecord","readFile","Command"]}