@gh-symphony/cli 0.0.20 → 0.0.22

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.
Files changed (40) hide show
  1. package/README.md +66 -2
  2. package/dist/chunk-2TSM3INR.js +1085 -0
  3. package/dist/chunk-2UW7NQLX.js +684 -0
  4. package/dist/{chunk-MVRF7BES.js → chunk-36KYEDEO.js} +10 -1
  5. package/dist/{chunk-TILHWBP6.js → chunk-C67H3OUL.js} +239 -36
  6. package/dist/{chunk-C7G7RJ4G.js → chunk-DDL4BWSL.js} +1 -1
  7. package/dist/{chunk-XN5ABWZ6.js → chunk-DFLXHNYQ.js} +26 -30
  8. package/dist/{chunk-EKKT5USP.js → chunk-E7HYEEZD.js} +487 -133
  9. package/dist/chunk-EEQQWTXS.js +3257 -0
  10. package/dist/chunk-GDE6FYN4.js +26 -0
  11. package/dist/{chunk-Y6TYJMNT.js → chunk-GSX2FV3M.js} +10 -16
  12. package/dist/{chunk-RN2PACNV.js → chunk-HMLBBZNY.js} +731 -75
  13. package/dist/{chunk-5NV3LSAJ.js → chunk-IWFX2FMA.js} +5 -1
  14. package/dist/{chunk-HZVDTAPS.js → chunk-PUDXVBSN.js} +1549 -1458
  15. package/dist/{chunk-ROGRTUFI.js → chunk-QIRE2VXS.js} +14 -3
  16. package/dist/{chunk-3AWF54PI.js → chunk-ZHOKYUO3.js} +394 -42
  17. package/dist/{config-cmd-DNXNL26Z.js → config-cmd-Z3A7V6NC.js} +1 -1
  18. package/dist/{doctor-IYHCFXOZ.js → doctor-EJUMPBMW.js} +105 -40
  19. package/dist/index.js +112 -24
  20. package/dist/{init-KZT6YNOH.js → init-54HMKNYI.js} +8 -3
  21. package/dist/{logs-6JKKYDGJ.js → logs-GTZ4U5JE.js} +2 -2
  22. package/dist/project-RMYMZSFV.js +25 -0
  23. package/dist/{recover-5KQI7WH5.js → recover-LTLKMTRX.js} +7 -5
  24. package/dist/repo-WI7GF6XQ.js +749 -0
  25. package/dist/{run-ETC5UTRA.js → run-IHN3ZL35.js} +21 -7
  26. package/dist/{setup-VWB7RZUQ.js → setup-TZJSM3QV.js} +53 -14
  27. package/dist/start-RTAHQMR2.js +19 -0
  28. package/dist/status-F4D52OVK.js +12 -0
  29. package/dist/stop-MDKMJPVR.js +10 -0
  30. package/dist/{upgrade-3YNF3VKY.js → upgrade-O33S2SJK.js} +2 -2
  31. package/dist/{version-NUBTTOG7.js → version-CW54Q7BK.js} +1 -1
  32. package/dist/worker-entry.js +848 -693
  33. package/dist/{workflow-TBIFY5MO.js → workflow-L3KT6HB7.js} +177 -11
  34. package/package.json +4 -2
  35. package/dist/chunk-M3IFVLQS.js +0 -1155
  36. package/dist/project-UUVHS3ZR.js +0 -22
  37. package/dist/repo-HDDE7OUI.js +0 -321
  38. package/dist/start-ENFLZUI6.js +0 -16
  39. package/dist/status-QSCFVGRQ.js +0 -11
  40. package/dist/stop-7MFCBQVW.js +0 -9
@@ -1,7 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- parseWorkflowMarkdown
4
- } from "./chunk-M3IFVLQS.js";
5
2
  import {
6
3
  GitHubApiError,
7
4
  REQUIRED_GH_SCOPES,
@@ -15,14 +12,21 @@ import {
15
12
  runGhAuthLogin,
16
13
  runGhAuthRefresh,
17
14
  validateGitHubToken
18
- } from "./chunk-TILHWBP6.js";
15
+ } from "./chunk-C67H3OUL.js";
16
+ import {
17
+ isClaudeRuntimeCommand,
18
+ parseWorkflowMarkdown,
19
+ resolveClaudeCommandBinary,
20
+ resolveRuntimeCommandBinary,
21
+ runClaudePreflight
22
+ } from "./chunk-EEQQWTXS.js";
19
23
  import {
20
24
  resolveRuntimeRoot
21
- } from "./chunk-5NV3LSAJ.js";
25
+ } from "./chunk-IWFX2FMA.js";
22
26
  import {
23
27
  inspectManagedProjectSelection
24
- } from "./chunk-C7G7RJ4G.js";
25
- import "./chunk-ROGRTUFI.js";
28
+ } from "./chunk-DDL4BWSL.js";
29
+ import "./chunk-QIRE2VXS.js";
26
30
 
27
31
  // src/commands/doctor.ts
28
32
  import { constants } from "fs";
@@ -55,7 +59,8 @@ var DEFAULT_DEPENDENCIES = {
55
59
  stdinIsTTY: process.stdin.isTTY === true,
56
60
  stdoutIsTTY: process.stdout.isTTY === true,
57
61
  execPath: process.execPath,
58
- cliArgv: [...process.argv]
62
+ cliArgv: [...process.argv],
63
+ fetchImpl: fetch
59
64
  };
60
65
  var MINIMUM_NODE_MAJOR = 24;
61
66
  var MINIMUM_NODE_VERSION = `v${MINIMUM_NODE_MAJOR}.0.0`;
@@ -98,6 +103,17 @@ function failCheck(id, title, summary, remediation, details) {
98
103
  details
99
104
  };
100
105
  }
106
+ function warnCheck(id, title, summary, remediation, details) {
107
+ return {
108
+ id,
109
+ title,
110
+ status: "warn",
111
+ required: true,
112
+ summary,
113
+ remediation,
114
+ details
115
+ };
116
+ }
101
117
  function formatAuthSource(source) {
102
118
  return source === "env" ? "GITHUB_GRAPHQL_TOKEN" : "gh CLI";
103
119
  }
@@ -233,31 +249,27 @@ async function commandExistsOnPath(binary, deps) {
233
249
  }
234
250
  return false;
235
251
  }
236
- function extractCommandBinary(command) {
237
- const trimmed = command.trim();
238
- if (!trimmed) {
239
- return null;
252
+ function toDoctorClaudeCheck(check) {
253
+ const id = check.id;
254
+ if (check.status === "pass") {
255
+ return passCheck(id, check.title, check.summary, check.details);
240
256
  }
241
- const tokens = trimmed.match(/"[^"]*"|'[^']*'|\S+/g) ?? [];
242
- if (tokens.length === 0) {
243
- return null;
244
- }
245
- const shell = stripQuotes(tokens[0]);
246
- if ((shell === "bash" || shell === "sh" || shell === "zsh" || shell === "fish") && tokens.length >= 3) {
247
- const flagIndex = tokens.findIndex((token) => {
248
- const value = stripQuotes(token);
249
- return value === "-c" || value === "-lc";
250
- });
251
- if (flagIndex >= 0 && flagIndex + 1 < tokens.length) {
252
- const nested = stripQuotes(tokens[flagIndex + 1]);
253
- const nestedTokens = nested.match(/"[^"]*"|'[^']*'|\S+/g) ?? [];
254
- return nestedTokens.length > 0 ? stripQuotes(nestedTokens[0]) : shell;
255
- }
257
+ if (check.status === "warn") {
258
+ return warnCheck(
259
+ id,
260
+ check.title,
261
+ check.summary,
262
+ check.remediation,
263
+ check.details
264
+ );
256
265
  }
257
- return shell;
258
- }
259
- function stripQuotes(value) {
260
- return value.replace(/^['"]|['"]$/g, "");
266
+ return failCheck(
267
+ id,
268
+ check.title,
269
+ check.summary,
270
+ check.remediation ?? "Fix the Claude runtime readiness check.",
271
+ check.details
272
+ );
261
273
  }
262
274
  function parseMajorNodeVersion(version) {
263
275
  const matched = version.match(/^v?(\d+)(?:\.\d+)?(?:\.\d+)?$/);
@@ -276,7 +288,10 @@ async function checkGitInstallation(deps) {
276
288
  encoding: "utf8",
277
289
  stdio: ["pipe", "pipe", "pipe"]
278
290
  }).toString().trim();
279
- return version ? { installed: true, version } : { installed: false, error: "git --version returned an empty response." };
291
+ return version ? { installed: true, version } : {
292
+ installed: false,
293
+ error: "git --version returned an empty response."
294
+ };
280
295
  } catch (error) {
281
296
  return {
282
297
  installed: false,
@@ -387,7 +402,11 @@ Usage: gh-symphony doctor [--project-id <project-id>] [--fix]`
387
402
  const ghInstalled = deps.checkGhInstalled();
388
403
  if (ghInstalled) {
389
404
  checks.push(
390
- passCheck("gh_installation", "gh CLI installation", "gh CLI is installed.")
405
+ passCheck(
406
+ "gh_installation",
407
+ "gh CLI installation",
408
+ "gh CLI is installed."
409
+ )
391
410
  );
392
411
  } else if (envToken) {
393
412
  checks.push(
@@ -664,7 +683,7 @@ Usage: gh-symphony doctor [--project-id <project-id>] [--fix]`
664
683
  );
665
684
  }
666
685
  if (workflow.status === "pass") {
667
- const binary = extractCommandBinary(workflow.command);
686
+ const binary = resolveRuntimeCommandBinary(workflow.command);
668
687
  if (binary && await commandExistsOnPath(binary, deps)) {
669
688
  checks.push(
670
689
  passCheck(
@@ -685,6 +704,24 @@ Usage: gh-symphony doctor [--project-id <project-id>] [--fix]`
685
704
  )
686
705
  );
687
706
  }
707
+ if (isClaudeRuntimeCommand(workflow.command)) {
708
+ const claudePreflight = await runClaudePreflight(
709
+ {
710
+ cwd: process.cwd(),
711
+ env: process.env,
712
+ command: resolveClaudeCommandBinary(workflow.command) ?? void 0,
713
+ includeGhAuth: false
714
+ },
715
+ {
716
+ execFileSync: deps.execFileSync,
717
+ readFile: deps.readFile,
718
+ access: deps.access,
719
+ fetchImpl: deps.fetchImpl,
720
+ platform: deps.platform
721
+ }
722
+ );
723
+ checks.push(...claudePreflight.checks.map(toDoctorClaudeCheck));
724
+ }
688
725
  } else {
689
726
  checks.push(
690
727
  failCheck(
@@ -697,7 +734,7 @@ Usage: gh-symphony doctor [--project-id <project-id>] [--fix]`
697
734
  );
698
735
  }
699
736
  return {
700
- ok: checks.every((check) => check.status === "pass"),
737
+ ok: checks.every((check) => check.status !== "fail"),
701
738
  checkedAt: (/* @__PURE__ */ new Date()).toISOString(),
702
739
  configDir: options.configDir,
703
740
  projectId: resolvedProjectId,
@@ -749,9 +786,13 @@ function runCliRemediation(title, checkId, args, deps, options, interactive, det
749
786
  details
750
787
  );
751
788
  }
752
- const result = deps.spawnSync(deps.execPath, [cliEntry, "--config", options.configDir, ...args], {
753
- stdio: "inherit"
754
- });
789
+ const result = deps.spawnSync(
790
+ deps.execPath,
791
+ [cliEntry, "--config", options.configDir, ...args],
792
+ {
793
+ stdio: "inherit"
794
+ }
795
+ );
755
796
  if ((result.status ?? 1) === 0) {
756
797
  return remediationStep(
757
798
  `remediate_${checkId}`,
@@ -1007,7 +1048,15 @@ async function runDoctorFixes(report, deps, options) {
1007
1048
  const reason = typeof check.details?.reason === "string" ? check.details.reason : null;
1008
1049
  const title = reason === "missing" ? "Repository workflow initialization" : "Repository workflow regeneration";
1009
1050
  steps.push(
1010
- runCliRemediation(title, check.id, ["init"], deps, options, interactive, check.details)
1051
+ runCliRemediation(
1052
+ title,
1053
+ check.id,
1054
+ ["init"],
1055
+ deps,
1056
+ options,
1057
+ interactive,
1058
+ check.details
1059
+ )
1011
1060
  );
1012
1061
  break;
1013
1062
  }
@@ -1037,6 +1086,21 @@ async function runDoctorFixes(report, deps, options) {
1037
1086
  );
1038
1087
  break;
1039
1088
  }
1089
+ case "claude_binary":
1090
+ case "anthropic_api_key":
1091
+ case "claude_mcp_config":
1092
+ steps.push(
1093
+ remediationStep(
1094
+ `remediate_${check.id}`,
1095
+ check.id,
1096
+ check.title,
1097
+ "manual",
1098
+ check.remediation ?? "Fix the Claude runtime readiness check.",
1099
+ void 0,
1100
+ check.details
1101
+ )
1102
+ );
1103
+ break;
1040
1104
  }
1041
1105
  }
1042
1106
  return steps;
@@ -1060,7 +1124,8 @@ function renderTextReport(report) {
1060
1124
  lines.push("");
1061
1125
  }
1062
1126
  for (const check of report.checks) {
1063
- lines.push(`${check.status === "pass" ? "PASS" : "FAIL"} ${check.title}`);
1127
+ const statusLabel = check.status === "pass" ? "PASS" : check.status === "warn" ? "WARN" : "FAIL";
1128
+ lines.push(`${statusLabel} ${check.title}`);
1064
1129
  lines.push(` ${check.summary}`);
1065
1130
  if (check.remediation) {
1066
1131
  lines.push(` Fix: ${check.remediation}`);
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  resolveConfigDir
4
- } from "./chunk-ROGRTUFI.js";
4
+ } from "./chunk-QIRE2VXS.js";
5
5
 
6
6
  // src/index.ts
7
7
  import { realpathSync } from "fs";
@@ -278,21 +278,21 @@ ${bashFunction}complete -F _gh_symphony_completion gh-symphony
278
278
 
279
279
  // src/index.ts
280
280
  var COMMANDS = {
281
- workflow: () => import("./workflow-TBIFY5MO.js"),
282
- init: () => import("./init-KZT6YNOH.js"),
283
- setup: () => import("./setup-VWB7RZUQ.js"),
284
- doctor: () => import("./doctor-IYHCFXOZ.js"),
285
- upgrade: () => import("./upgrade-3YNF3VKY.js"),
286
- start: () => import("./start-ENFLZUI6.js"),
287
- stop: () => import("./stop-7MFCBQVW.js"),
288
- status: () => import("./status-QSCFVGRQ.js"),
289
- run: () => import("./run-ETC5UTRA.js"),
290
- recover: () => import("./recover-5KQI7WH5.js"),
291
- logs: () => import("./logs-6JKKYDGJ.js"),
292
- project: () => import("./project-UUVHS3ZR.js"),
293
- repo: () => import("./repo-HDDE7OUI.js"),
294
- config: () => import("./config-cmd-DNXNL26Z.js"),
295
- version: () => import("./version-NUBTTOG7.js")
281
+ workflow: () => import("./workflow-L3KT6HB7.js"),
282
+ init: () => import("./init-54HMKNYI.js"),
283
+ setup: () => import("./setup-TZJSM3QV.js"),
284
+ doctor: () => import("./doctor-EJUMPBMW.js"),
285
+ upgrade: () => import("./upgrade-O33S2SJK.js"),
286
+ start: () => import("./start-RTAHQMR2.js"),
287
+ stop: () => import("./stop-MDKMJPVR.js"),
288
+ status: () => import("./status-F4D52OVK.js"),
289
+ run: () => import("./run-IHN3ZL35.js"),
290
+ recover: () => import("./recover-LTLKMTRX.js"),
291
+ logs: () => import("./logs-GTZ4U5JE.js"),
292
+ project: () => import("./project-RMYMZSFV.js"),
293
+ repo: () => import("./repo-WI7GF6XQ.js"),
294
+ config: () => import("./config-cmd-Z3A7V6NC.js"),
295
+ version: () => import("./version-CW54Q7BK.js")
296
296
  };
297
297
  function addGlobalOptions(command) {
298
298
  return command.option("--config <dir>", "Config directory").addOption(new Option("--config-dir <dir>").hideHelp()).option("-v, --verbose", "Enable verbose output").option("--json", "Output in JSON format").option("--no-color", "Disable color output");
@@ -356,7 +356,10 @@ function createProgram() {
356
356
  new Command().name("gh-symphony").description("AI Coding Agent Orchestrator").exitOverride().helpOption("-h, --help", "Show help").addHelpCommand("help [command]", "Show help for command").showHelpAfterError("(run with --help for usage)").option("-V, --version", "Show version")
357
357
  );
358
358
  addGlobalOptions(
359
- program.command("init", { hidden: true }).description("Alias for 'gh-symphony workflow init'").option("--non-interactive", "Run without prompts").option("--project <id>", "GitHub Project ID or URL").option("--output <path>", "Write WORKFLOW.md to a custom path").option("--skip-skills", "Skip runtime skill generation").option("--skip-context", "Skip .gh-symphony/context.yaml generation").option("--dry-run", "Preview generated files without writing them").allowExcessArguments(false)
359
+ program.command("init", { hidden: true }).description("Alias for 'gh-symphony workflow init'").option("--non-interactive", "Run without prompts").option("--project <id>", "GitHub Project ID or URL").option("--output <path>", "Write WORKFLOW.md to a custom path").option(
360
+ "--runtime <kind>",
361
+ "Runtime preset: codex-app-server or claude-print"
362
+ ).option("--skip-skills", "Skip runtime skill generation").option("--skip-context", "Skip .gh-symphony/context.yaml generation").option("--dry-run", "Preview generated files without writing them").allowExcessArguments(false)
360
363
  ).action(async function() {
361
364
  markInvoked();
362
365
  const values = this.optsWithGlobals();
@@ -364,6 +367,7 @@ function createProgram() {
364
367
  pushOption(args, "--non-interactive", values.nonInteractive);
365
368
  pushOption(args, "--project", values.project);
366
369
  pushOption(args, "--output", values.output);
370
+ pushOption(args, "--runtime", values.runtime);
367
371
  pushOption(args, "--skip-skills", values.skipSkills);
368
372
  pushOption(args, "--skip-context", values.skipContext);
369
373
  pushOption(args, "--dry-run", values.dryRun);
@@ -381,7 +385,10 @@ function createProgram() {
381
385
  );
382
386
  });
383
387
  addGlobalOptions(
384
- workflow.command("init").description("Generate WORKFLOW.md and workflow support files").option("--non-interactive", "Run without prompts").option("--project <id>", "GitHub Project ID or URL").option("--output <path>", "Write WORKFLOW.md to a custom path").option("--skip-skills", "Skip runtime skill generation").option("--skip-context", "Skip .gh-symphony/context.yaml generation").option("--dry-run", "Preview generated files without writing them").allowExcessArguments(false)
388
+ workflow.command("init").description("Generate WORKFLOW.md and workflow support files").option("--non-interactive", "Run without prompts").option("--project <id>", "GitHub Project ID or URL").option("--output <path>", "Write WORKFLOW.md to a custom path").option(
389
+ "--runtime <kind>",
390
+ "Runtime preset: codex-app-server or claude-print"
391
+ ).option("--skip-skills", "Skip runtime skill generation").option("--skip-context", "Skip .gh-symphony/context.yaml generation").option("--dry-run", "Preview generated files without writing them").allowExcessArguments(false)
385
392
  ).action(async function() {
386
393
  markInvoked();
387
394
  const values = this.optsWithGlobals();
@@ -389,6 +396,7 @@ function createProgram() {
389
396
  pushOption(args, "--non-interactive", values.nonInteractive);
390
397
  pushOption(args, "--project", values.project);
391
398
  pushOption(args, "--output", values.output);
399
+ pushOption(args, "--runtime", values.runtime);
392
400
  pushOption(args, "--skip-skills", values.skipSkills);
393
401
  pushOption(args, "--skip-context", values.skipContext);
394
402
  pushOption(args, "--dry-run", values.dryRun);
@@ -404,12 +412,14 @@ function createProgram() {
404
412
  await invokeHandler("workflow", args, values);
405
413
  });
406
414
  addGlobalOptions(
407
- workflow.command("preview").description("Render the final worker prompt from a sample issue").option("--file <path>", "Read a custom WORKFLOW.md path").option("--sample <json>", "Read sample issue JSON from a file").option("--attempt <n>", "Render as retry attempt n").allowExcessArguments(false)
415
+ workflow.command("preview").description("Render the final worker prompt from a sample or live issue").option("--file <path>", "Read a custom WORKFLOW.md path").option("--issue <owner/repo#number>", "Load a live GitHub Project issue").option("--project-id <projectId>", "Managed project identifier").addOption(new Option("--project <projectId>").hideHelp()).option("--sample <json>", "Read sample issue JSON from a file").option("--attempt <n>", "Render as retry attempt n").allowExcessArguments(false)
408
416
  ).action(async function() {
409
417
  markInvoked();
410
418
  const values = this.optsWithGlobals();
411
419
  const args = ["preview"];
412
420
  pushOption(args, "--file", values.file);
421
+ pushOption(args, "--issue", values.issue);
422
+ pushOption(args, "--project-id", resolveProjectId(values));
413
423
  pushOption(args, "--sample", values.sample);
414
424
  pushOption(args, "--attempt", values.attempt);
415
425
  await invokeHandler("workflow", args, values);
@@ -430,7 +440,10 @@ function createProgram() {
430
440
  await invokeHandler("setup", args, values);
431
441
  });
432
442
  addGlobalOptions(
433
- program.command("doctor").description("Run diagnostics and optional first-run remediation").option("--project-id <projectId>", "Project identifier").option("--fix", "Apply safe remediation steps and print manual follow-ups").addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
443
+ program.command("doctor").description("Run diagnostics and optional first-run remediation").option("--project-id <projectId>", "Project identifier").option(
444
+ "--fix",
445
+ "Apply safe remediation steps and print manual follow-ups"
446
+ ).addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
434
447
  ).action(async function() {
435
448
  markInvoked();
436
449
  const values = this.optsWithGlobals();
@@ -446,7 +459,13 @@ function createProgram() {
446
459
  await invokeHandler("upgrade", [], this.optsWithGlobals());
447
460
  });
448
461
  addGlobalOptions(
449
- program.command("start").description("Start the orchestrator").option("-d, --daemon", "Start in daemon mode").option("--once", "Run a single orchestration tick and exit").option("--http [port]", "Expose dashboard and refresh endpoints over HTTP").option("--log-level <level>", "Orchestrator lifecycle log level").option("--project-id <projectId>", "Project identifier").addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
462
+ program.command("start").description("Start the orchestrator").option("-d, --daemon", "Start in daemon mode").option("--once", "Run a single orchestration tick and exit").option(
463
+ "--http [port]",
464
+ "Expose dashboard and refresh endpoints over HTTP"
465
+ ).option(
466
+ "--web [port]",
467
+ "Expose the control plane web dashboard and API over HTTP"
468
+ ).option("--log-level <level>", "Orchestrator lifecycle log level").addOption(new Option("--project-id <projectId>").hideHelp()).addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
450
469
  ).action(async function() {
451
470
  markInvoked();
452
471
  const values = this.optsWithGlobals();
@@ -455,11 +474,12 @@ function createProgram() {
455
474
  pushOption(args, "--daemon", values.daemon);
456
475
  pushOption(args, "--once", values.once);
457
476
  pushOption(args, "--http", values.http);
477
+ pushOption(args, "--web", values.web);
458
478
  pushOption(args, "--log-level", values.logLevel);
459
479
  await invokeHandler("start", args, values);
460
480
  });
461
481
  addGlobalOptions(
462
- program.command("stop").description("Stop the background orchestrator").option("--force", "Force stop with SIGKILL").option("--project-id <projectId>", "Project identifier").addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
482
+ program.command("stop").description("Stop the background orchestrator").option("--force", "Force stop with SIGKILL").addOption(new Option("--project-id <projectId>").hideHelp()).addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
463
483
  ).action(async function() {
464
484
  markInvoked();
465
485
  const values = this.optsWithGlobals();
@@ -469,7 +489,7 @@ function createProgram() {
469
489
  await invokeHandler("stop", args, values);
470
490
  });
471
491
  addGlobalOptions(
472
- program.command("status").description("Show orchestrator status").option("-w, --watch", "Watch status continuously").option("--project-id <projectId>", "Project identifier").addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
492
+ program.command("status").description("Show orchestrator status").option("-w, --watch", "Watch status continuously").addOption(new Option("--project-id <projectId>").hideHelp()).addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
473
493
  ).action(async function() {
474
494
  markInvoked();
475
495
  const values = this.optsWithGlobals();
@@ -549,7 +569,13 @@ function createProgram() {
549
569
  );
550
570
  });
551
571
  addGlobalOptions(
552
- project.command("start").description("Start a specific project").option("-d, --daemon", "Start in daemon mode").option("--once", "Run a single orchestration tick and exit").option("--http [port]", "Expose dashboard and refresh endpoints over HTTP").option("--log-level <level>", "Orchestrator lifecycle log level").option("--project-id <projectId>", "Project identifier").addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
572
+ project.command("start").description("Start a specific project").option("-d, --daemon", "Start in daemon mode").option("--once", "Run a single orchestration tick and exit").option(
573
+ "--http [port]",
574
+ "Expose dashboard and refresh endpoints over HTTP"
575
+ ).option(
576
+ "--web [port]",
577
+ "Expose the control plane web dashboard and API over HTTP"
578
+ ).option("--log-level <level>", "Orchestrator lifecycle log level").option("--project-id <projectId>", "Project identifier").addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
553
579
  ).action(async function() {
554
580
  markInvoked();
555
581
  const values = this.optsWithGlobals();
@@ -558,6 +584,7 @@ function createProgram() {
558
584
  pushOption(args, "--daemon", values.daemon);
559
585
  pushOption(args, "--once", values.once);
560
586
  pushOption(args, "--http", values.http);
587
+ pushOption(args, "--web", values.web);
561
588
  pushOption(args, "--log-level", values.logLevel);
562
589
  await invokeHandler("project", args, values);
563
590
  });
@@ -591,6 +618,16 @@ function createProgram() {
591
618
  pushOption(args, "--watch", values.watch);
592
619
  await invokeHandler("project", args, values);
593
620
  });
621
+ addGlobalOptions(
622
+ project.command("explain").description("Explain why a project issue is not dispatching").argument("<issue>", "Issue identifier, for example owner/repo#123").option("--project-id <projectId>", "Project identifier").option("--workflow <path>", "Path to the WORKFLOW.md file to evaluate").addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
623
+ ).action(async function(issue) {
624
+ markInvoked();
625
+ const values = this.optsWithGlobals();
626
+ const args = ["explain", issue];
627
+ pushOption(args, "--project-id", resolveProjectId(values));
628
+ pushOption(args, "--workflow", values.workflow);
629
+ await invokeHandler("project", args, values);
630
+ });
594
631
  const repo = addGlobalOptions(
595
632
  program.command("repo").description("Manage repositories in the active project")
596
633
  );
@@ -608,6 +645,57 @@ function createProgram() {
608
645
  this.optsWithGlobals()
609
646
  );
610
647
  });
648
+ addGlobalOptions(
649
+ repo.command("init").description("Initialize gh-symphony for the current repository").option("--repo-dir <path>", "Repository directory").option("--workflow-file <path>", "Use a custom WORKFLOW.md path").addOption(new Option("--project-id <projectId>").hideHelp()).addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
650
+ ).action(async function() {
651
+ markInvoked();
652
+ const values = this.optsWithGlobals();
653
+ const args = ["init"];
654
+ pushOption(args, "--repo-dir", values.repoDir);
655
+ pushOption(args, "--workflow-file", values.workflowFile);
656
+ pushOption(args, "--project-id", resolveProjectId(values));
657
+ await invokeHandler("repo", args, values);
658
+ });
659
+ addGlobalOptions(
660
+ repo.command("start").description("Start the orchestrator for the current repository").option("-d, --daemon", "Start in daemon mode").option("--once", "Run a single orchestration tick and exit").option(
661
+ "--http [port]",
662
+ "Expose dashboard and refresh endpoints over HTTP"
663
+ ).option(
664
+ "--web [port]",
665
+ "Expose the control plane web dashboard and API over HTTP"
666
+ ).option("--log-level <level>", "Orchestrator lifecycle log level").addOption(new Option("--project-id <projectId>").hideHelp()).addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
667
+ ).action(async function() {
668
+ markInvoked();
669
+ const values = this.optsWithGlobals();
670
+ const args = ["start"];
671
+ pushOption(args, "--project-id", resolveProjectId(values));
672
+ pushOption(args, "--daemon", values.daemon);
673
+ pushOption(args, "--once", values.once);
674
+ pushOption(args, "--http", values.http);
675
+ pushOption(args, "--web", values.web);
676
+ pushOption(args, "--log-level", values.logLevel);
677
+ await invokeHandler("repo", args, values);
678
+ });
679
+ addGlobalOptions(
680
+ repo.command("status").description("Show current repository orchestrator status").option("-w, --watch", "Watch status continuously").addOption(new Option("--project-id <projectId>").hideHelp()).addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
681
+ ).action(async function() {
682
+ markInvoked();
683
+ const values = this.optsWithGlobals();
684
+ const args = ["status"];
685
+ pushOption(args, "--project-id", resolveProjectId(values));
686
+ pushOption(args, "--watch", values.watch);
687
+ await invokeHandler("repo", args, values);
688
+ });
689
+ addGlobalOptions(
690
+ repo.command("stop").description("Stop the current repository background orchestrator").option("--force", "Force stop with SIGKILL").addOption(new Option("--project-id <projectId>").hideHelp()).addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
691
+ ).action(async function() {
692
+ markInvoked();
693
+ const values = this.optsWithGlobals();
694
+ const args = ["stop"];
695
+ pushOption(args, "--project-id", resolveProjectId(values));
696
+ pushOption(args, "--force", values.force);
697
+ await invokeHandler("repo", args, values);
698
+ });
611
699
  addGlobalOptions(
612
700
  repo.command("add").description("Add a repository").argument("<owner/name>", "Repository spec").allowExcessArguments(false)
613
701
  ).action(async function(repoSpec) {
@@ -9,13 +9,16 @@ import {
9
9
  planWorkflowArtifacts,
10
10
  promptStateMappings,
11
11
  renderDryRunPreview,
12
+ resolvePriorityField,
12
13
  resolveStatusField,
14
+ warnIfProjectDiscoveryPartial,
13
15
  writeConfig,
14
16
  writeEcosystem,
15
17
  writeWorkflowPlan
16
- } from "./chunk-RN2PACNV.js";
17
- import "./chunk-TILHWBP6.js";
18
- import "./chunk-ROGRTUFI.js";
18
+ } from "./chunk-HMLBBZNY.js";
19
+ import "./chunk-C67H3OUL.js";
20
+ import "./chunk-EEQQWTXS.js";
21
+ import "./chunk-QIRE2VXS.js";
19
22
  export {
20
23
  abortIfCancelled,
21
24
  buildAutomaticStateMappings,
@@ -26,7 +29,9 @@ export {
26
29
  planWorkflowArtifacts,
27
30
  promptStateMappings,
28
31
  renderDryRunPreview,
32
+ resolvePriorityField,
29
33
  resolveStatusField,
34
+ warnIfProjectDiscoveryPartial,
30
35
  writeConfig,
31
36
  writeEcosystem,
32
37
  writeWorkflowPlan
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  handleMissingManagedProjectConfig,
4
4
  resolveManagedProjectConfig
5
- } from "./chunk-C7G7RJ4G.js";
5
+ } from "./chunk-DDL4BWSL.js";
6
6
  import {
7
7
  orchestratorLogPath
8
- } from "./chunk-ROGRTUFI.js";
8
+ } from "./chunk-QIRE2VXS.js";
9
9
 
10
10
  // src/commands/logs.ts
11
11
  import { readFile, readdir, stat } from "fs/promises";
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ project_default,
4
+ promptProjectRegistrationOptions,
5
+ renderProjectRegistrationSummary
6
+ } from "./chunk-ZHOKYUO3.js";
7
+ import "./chunk-HMLBBZNY.js";
8
+ import "./chunk-E7HYEEZD.js";
9
+ import "./chunk-PUDXVBSN.js";
10
+ import "./chunk-2UW7NQLX.js";
11
+ import "./chunk-2TSM3INR.js";
12
+ import "./chunk-C67H3OUL.js";
13
+ import "./chunk-EEQQWTXS.js";
14
+ import "./chunk-DFLXHNYQ.js";
15
+ import "./chunk-36KYEDEO.js";
16
+ import "./chunk-IWFX2FMA.js";
17
+ import "./chunk-GSX2FV3M.js";
18
+ import "./chunk-GDE6FYN4.js";
19
+ import "./chunk-DDL4BWSL.js";
20
+ import "./chunk-QIRE2VXS.js";
21
+ export {
22
+ project_default as default,
23
+ promptProjectRegistrationOptions,
24
+ renderProjectRegistrationSummary
25
+ };
@@ -1,16 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runCli
4
- } from "./chunk-HZVDTAPS.js";
5
- import "./chunk-M3IFVLQS.js";
4
+ } from "./chunk-PUDXVBSN.js";
5
+ import "./chunk-2UW7NQLX.js";
6
+ import "./chunk-2TSM3INR.js";
7
+ import "./chunk-EEQQWTXS.js";
6
8
  import {
7
9
  resolveRuntimeRoot
8
- } from "./chunk-5NV3LSAJ.js";
10
+ } from "./chunk-IWFX2FMA.js";
9
11
  import {
10
12
  handleMissingManagedProjectConfig,
11
13
  resolveManagedProjectConfig
12
- } from "./chunk-C7G7RJ4G.js";
13
- import "./chunk-ROGRTUFI.js";
14
+ } from "./chunk-DDL4BWSL.js";
15
+ import "./chunk-QIRE2VXS.js";
14
16
 
15
17
  // src/commands/recover.ts
16
18
  import { readFile, readdir } from "fs/promises";