@gh-symphony/cli 0.0.22 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +72 -77
  2. package/dist/{chunk-HMLBBZNY.js → chunk-2YF7PQUC.js} +16 -71
  3. package/dist/{chunk-IWFX2FMA.js → chunk-6I753NYO.js} +4 -1
  4. package/dist/{chunk-2TSM3INR.js → chunk-HQ7A3C7K.js} +575 -12
  5. package/dist/{chunk-36KYEDEO.js → chunk-MVRF7BES.js} +1 -10
  6. package/dist/{workflow-L3KT6HB7.js → chunk-NESHTYXQ.js} +27 -19
  7. package/dist/{chunk-2UW7NQLX.js → chunk-PEZUBHWJ.js} +1 -1
  8. package/dist/chunk-PG332ZS4.js +238 -0
  9. package/dist/{chunk-EEQQWTXS.js → chunk-WCOIVNHH.js} +213 -82
  10. package/dist/{chunk-QIRE2VXS.js → chunk-WOVNN5NW.js} +16 -17
  11. package/dist/{chunk-C67H3OUL.js → chunk-Z3NZOPLZ.js} +0 -81
  12. package/dist/{config-cmd-Z3A7V6NC.js → config-cmd-2ADPUYWA.js} +1 -1
  13. package/dist/{doctor-EJUMPBMW.js → doctor-2AXHIEAP.js} +464 -40
  14. package/dist/index.js +340 -294
  15. package/dist/{chunk-PUDXVBSN.js → repo-SUXYT4OK.js} +6272 -2996
  16. package/dist/{setup-TZJSM3QV.js → setup-UBHOMXUG.js} +57 -92
  17. package/dist/{upgrade-O33S2SJK.js → upgrade-355SQJ5P.js} +2 -2
  18. package/dist/{version-CW54Q7BK.js → version-4ILSDZQH.js} +1 -1
  19. package/dist/worker-entry.js +10 -5
  20. package/dist/workflow-S6YSZPQT.js +22 -0
  21. package/package.json +4 -4
  22. package/dist/chunk-DDL4BWSL.js +0 -146
  23. package/dist/chunk-DFLXHNYQ.js +0 -482
  24. package/dist/chunk-E7HYEEZD.js +0 -1318
  25. package/dist/chunk-GDE6FYN4.js +0 -26
  26. package/dist/chunk-GSX2FV3M.js +0 -103
  27. package/dist/chunk-ZHOKYUO3.js +0 -1047
  28. package/dist/init-54HMKNYI.js +0 -38
  29. package/dist/logs-GTZ4U5JE.js +0 -188
  30. package/dist/project-RMYMZSFV.js +0 -25
  31. package/dist/recover-LTLKMTRX.js +0 -133
  32. package/dist/repo-WI7GF6XQ.js +0 -749
  33. package/dist/run-IHN3ZL35.js +0 -122
  34. package/dist/start-RTAHQMR2.js +0 -19
  35. package/dist/status-F4D52OVK.js +0 -12
  36. package/dist/stop-MDKMJPVR.js +0 -10
package/dist/index.js CHANGED
@@ -1,7 +1,13 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ bold,
4
+ cyan,
5
+ setNoColor,
6
+ yellow
7
+ } from "./chunk-MVRF7BES.js";
2
8
  import {
3
9
  resolveConfigDir
4
- } from "./chunk-QIRE2VXS.js";
10
+ } from "./chunk-WOVNN5NW.js";
5
11
 
6
12
  // src/index.ts
7
13
  import { realpathSync } from "fs";
@@ -19,13 +25,6 @@ var TOP_LEVEL_COMMANDS = [
19
25
  "setup",
20
26
  "doctor",
21
27
  "upgrade",
22
- "start",
23
- "stop",
24
- "status",
25
- "run",
26
- "recover",
27
- "logs",
28
- "project",
29
28
  "repo",
30
29
  "config",
31
30
  "completion",
@@ -58,70 +57,33 @@ var COMMAND_OPTIONS = {
58
57
  ...GLOBAL_OPTIONS
59
58
  ],
60
59
  "workflow:validate": ["--file", ...GLOBAL_OPTIONS],
61
- "workflow:preview": [
62
- "--file",
63
- "--sample",
64
- "--attempt",
65
- ...GLOBAL_OPTIONS
66
- ],
60
+ "workflow:preview": ["--file", "--sample", "--attempt", ...GLOBAL_OPTIONS],
67
61
  setup: [
68
62
  "--non-interactive",
69
- "--project",
70
- "--workspace-dir",
71
63
  "--assigned-only",
72
64
  "--output",
73
65
  "--skip-skills",
74
66
  "--skip-context",
75
67
  ...GLOBAL_OPTIONS
76
68
  ],
77
- doctor: ["--project-id", "--project", ...GLOBAL_OPTIONS],
78
- upgrade: [...GLOBAL_OPTIONS],
79
- start: ["--project-id", "--project", "--daemon", "-d", ...GLOBAL_OPTIONS],
80
- stop: ["--project-id", "--project", "--force", ...GLOBAL_OPTIONS],
81
- status: ["--project-id", "--project", "--watch", "-w", ...GLOBAL_OPTIONS],
82
- run: ["--project-id", "--project", "--watch", "-w", ...GLOBAL_OPTIONS],
83
- recover: ["--project-id", "--project", "--dry-run", ...GLOBAL_OPTIONS],
84
- logs: [
69
+ doctor: [
85
70
  "--project-id",
86
71
  "--project",
87
- "--follow",
88
- "-f",
72
+ "--fix",
73
+ "--smoke",
89
74
  "--issue",
90
- "--run",
91
- "--level",
92
- ...GLOBAL_OPTIONS
93
- ],
94
- project: ["add", "list", "remove", "start", "stop", "switch", "status"],
95
- "project:add": [
96
- "--non-interactive",
97
- "--project",
98
- "--workspace-dir",
99
- "--assigned-only",
100
- ...GLOBAL_OPTIONS
101
- ],
102
- "project:list": [...GLOBAL_OPTIONS],
103
- "project:remove": [...GLOBAL_OPTIONS],
104
- "project:start": [
105
- "--project-id",
106
- "--project",
107
- "--daemon",
108
- "-d",
109
75
  ...GLOBAL_OPTIONS
110
76
  ],
111
- "project:stop": ["--project-id", "--project", "--force", ...GLOBAL_OPTIONS],
112
- "project:switch": [...GLOBAL_OPTIONS],
113
- "project:status": [
114
- "--project-id",
115
- "--project",
116
- "--watch",
117
- "-w",
118
- ...GLOBAL_OPTIONS
119
- ],
120
- repo: ["list", "add", "remove", "sync"],
121
- "repo:list": [...GLOBAL_OPTIONS],
122
- "repo:add": [...GLOBAL_OPTIONS],
123
- "repo:remove": [...GLOBAL_OPTIONS],
124
- "repo:sync": ["--dry-run", "--prune", ...GLOBAL_OPTIONS],
77
+ upgrade: [...GLOBAL_OPTIONS],
78
+ repo: ["init", "start", "status", "stop", "run", "recover", "logs", "explain"],
79
+ "repo:init": ["--repo-dir", "--workflow-file", ...GLOBAL_OPTIONS],
80
+ "repo:start": ["--daemon", "-d", "--once", "--http", "--web", "--log-level", ...GLOBAL_OPTIONS],
81
+ "repo:status": ["--watch", "-w", ...GLOBAL_OPTIONS],
82
+ "repo:stop": ["--force", ...GLOBAL_OPTIONS],
83
+ "repo:run": ["--watch", ...GLOBAL_OPTIONS],
84
+ "repo:recover": ["--dry-run", ...GLOBAL_OPTIONS],
85
+ "repo:logs": ["--follow", "-f", "--issue", "--run", "--level", ...GLOBAL_OPTIONS],
86
+ "repo:explain": ["--json", "--workflow", ...GLOBAL_OPTIONS],
125
87
  config: ["show", "set", "edit"],
126
88
  "config:show": [...GLOBAL_OPTIONS],
127
89
  "config:set": [...GLOBAL_OPTIONS],
@@ -140,7 +102,7 @@ function renderBashCasePatterns() {
140
102
  return
141
103
  ;;`;
142
104
  }
143
- if (command === "workflow" || command === "project" || command === "repo" || command === "config") {
105
+ if (command === "workflow" || command === "repo" || command === "config") {
144
106
  return ` ${command})
145
107
  COMPREPLY=( $(compgen -W "${quoteWords(values)}" -- "$cur") )
146
108
  return
@@ -166,11 +128,6 @@ function renderFishLines() {
166
128
  `complete -c gh-symphony -f -n '__fish_use_subcommand' -a '${command}'`
167
129
  );
168
130
  }
169
- for (const subcommand of COMMAND_OPTIONS.project ?? []) {
170
- lines.push(
171
- `complete -c gh-symphony -f -n '__fish_seen_subcommand_from project' -a '${subcommand}'`
172
- );
173
- }
174
131
  for (const subcommand of COMMAND_OPTIONS.repo ?? []) {
175
132
  lines.push(
176
133
  `complete -c gh-symphony -f -n '__fish_seen_subcommand_from repo' -a '${subcommand}'`
@@ -255,7 +212,7 @@ _gh_symphony_completion() {
255
212
  return
256
213
  fi
257
214
 
258
- if [[ "\${path}" == "workflow" || "\${path}" == "project" || "\${path}" == "repo" || "\${path}" == "config" || "\${path}" == "completion" ]]; then
215
+ if [[ "\${path}" == "workflow" || "\${path}" == "repo" || "\${path}" == "config" || "\${path}" == "completion" ]]; then
259
216
  if [[ -n "\${GH_SYMPHONY_SUBCOMMAND}" ]]; then
260
217
  path="\${path}:\${GH_SYMPHONY_SUBCOMMAND}"
261
218
  fi
@@ -276,23 +233,194 @@ ${bashFunction}complete -F _gh_symphony_completion gh-symphony
276
233
  `;
277
234
  }
278
235
 
236
+ // src/commands/help.ts
237
+ var DESCRIPTION_COLUMN = 23;
238
+ var COMMAND_COLUMN_WIDTH = DESCRIPTION_COLUMN - 2;
239
+ var HELP_SECTIONS = [
240
+ {
241
+ title: "Setup",
242
+ entries: [
243
+ {
244
+ name: "setup",
245
+ description: "Run the one-command first-run setup flow"
246
+ },
247
+ {
248
+ name: "workflow init",
249
+ description: "Generate WORKFLOW.md and workflow support files"
250
+ },
251
+ {
252
+ name: "workflow validate",
253
+ description: "Strictly validate WORKFLOW.md"
254
+ },
255
+ {
256
+ name: "workflow preview",
257
+ description: "Render the worker prompt from a sample or live issue"
258
+ },
259
+ {
260
+ name: "doctor",
261
+ description: "Run diagnostics and optional remediation"
262
+ },
263
+ {
264
+ name: "config show",
265
+ description: "Show current configuration"
266
+ },
267
+ {
268
+ name: "config set",
269
+ description: "Set a configuration value"
270
+ },
271
+ {
272
+ name: "config edit",
273
+ description: "Open config in $EDITOR"
274
+ }
275
+ ]
276
+ },
277
+ {
278
+ title: "Orchestration (current repository)",
279
+ entries: [
280
+ {
281
+ name: "repo init",
282
+ description: "Initialize gh-symphony for the current repository"
283
+ },
284
+ {
285
+ name: "repo start",
286
+ description: "Start the orchestrator (foreground)"
287
+ },
288
+ {
289
+ name: "repo start --daemon",
290
+ description: "Start the orchestrator in the background"
291
+ },
292
+ {
293
+ name: "repo stop",
294
+ description: "Stop the background orchestrator"
295
+ },
296
+ {
297
+ name: "repo status",
298
+ description: "Show orchestrator status"
299
+ },
300
+ {
301
+ name: "repo run <issue>",
302
+ description: "Dispatch a single issue"
303
+ },
304
+ {
305
+ name: "repo recover",
306
+ description: "Recover stalled runs"
307
+ },
308
+ {
309
+ name: "repo logs",
310
+ description: "View orchestrator logs"
311
+ },
312
+ {
313
+ name: "repo explain <issue>",
314
+ description: "Explain why an issue is not dispatching"
315
+ }
316
+ ]
317
+ },
318
+ {
319
+ title: "Maintenance",
320
+ entries: [
321
+ {
322
+ name: "upgrade",
323
+ description: "Upgrade the CLI to the latest published version"
324
+ },
325
+ {
326
+ name: "completion <shell>",
327
+ description: "Print shell completion (bash/zsh/fish)"
328
+ },
329
+ {
330
+ name: "version",
331
+ description: "Show version"
332
+ },
333
+ {
334
+ name: "help [command]",
335
+ description: "Show help for a command"
336
+ }
337
+ ]
338
+ },
339
+ {
340
+ title: "Global Options",
341
+ entries: [
342
+ {
343
+ name: "--config <dir>",
344
+ description: [
345
+ "Config directory override (advanced; default uses initialized",
346
+ "cwd runtime, then ~/.gh-symphony)"
347
+ ]
348
+ },
349
+ {
350
+ name: "--verbose, -v",
351
+ description: "Verbose output"
352
+ },
353
+ {
354
+ name: "--json",
355
+ description: "JSON output"
356
+ },
357
+ {
358
+ name: "--no-color",
359
+ description: "Disable color output"
360
+ },
361
+ {
362
+ name: "--help, -h",
363
+ description: "Show help"
364
+ },
365
+ {
366
+ name: "--version, -V",
367
+ description: "Show version"
368
+ }
369
+ ]
370
+ }
371
+ ];
372
+ function sectionTitle(title, color) {
373
+ const label = `${title}:`;
374
+ return color ? yellow(bold(label)) : label;
375
+ }
376
+ function entryName(name, color) {
377
+ return color ? cyan(name) : name;
378
+ }
379
+ function renderEntry(entry, color) {
380
+ const descriptions = Array.isArray(entry.description) ? entry.description : [entry.description];
381
+ const lines = [
382
+ ` ${entryName(entry.name, color)}${" ".repeat(
383
+ Math.max(COMMAND_COLUMN_WIDTH - entry.name.length, 1)
384
+ )}${descriptions[0]}`
385
+ ];
386
+ for (const line of descriptions.slice(1)) {
387
+ lines.push(`${" ".repeat(DESCRIPTION_COLUMN)}${line}`);
388
+ }
389
+ return lines;
390
+ }
391
+ function renderHelp(options) {
392
+ const lines = ["gh-symphony \u2014 AI Coding Agent Orchestrator", ""];
393
+ for (const [index, section] of HELP_SECTIONS.entries()) {
394
+ if (index > 0) {
395
+ lines.push("");
396
+ }
397
+ lines.push(sectionTitle(section.title, options.color));
398
+ for (const entry of section.entries) {
399
+ lines.push(...renderEntry(entry, options.color));
400
+ }
401
+ }
402
+ return `${lines.join("\n")}
403
+ `;
404
+ }
405
+
406
+ // src/commands/removed-command.ts
407
+ function createRemovedCommandHandler(message) {
408
+ return async () => {
409
+ process.stderr.write(`${message}
410
+ `);
411
+ process.exitCode = 2;
412
+ };
413
+ }
414
+
279
415
  // src/index.ts
280
416
  var COMMANDS = {
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")
417
+ workflow: () => import("./workflow-S6YSZPQT.js"),
418
+ setup: () => import("./setup-UBHOMXUG.js"),
419
+ doctor: () => import("./doctor-2AXHIEAP.js"),
420
+ upgrade: () => import("./upgrade-355SQJ5P.js"),
421
+ repo: () => import("./repo-SUXYT4OK.js"),
422
+ config: () => import("./config-cmd-2ADPUYWA.js"),
423
+ version: () => import("./version-4ILSDZQH.js")
296
424
  };
297
425
  function addGlobalOptions(command) {
298
426
  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");
@@ -308,6 +436,7 @@ function resolveGlobalOptions(values) {
308
436
  if (options.noColor) {
309
437
  process.env.NO_COLOR = "1";
310
438
  }
439
+ setNoColor(options.noColor);
311
440
  return options;
312
441
  }
313
442
  function resolveProjectId(values) {
@@ -326,6 +455,9 @@ async function invokeHandler(key, args, values) {
326
455
  const module = await COMMANDS[key]();
327
456
  await module.default(args, resolveGlobalOptions(values));
328
457
  }
458
+ async function invokeRemovedCommand(message, values) {
459
+ await createRemovedCommandHandler(message)([], resolveGlobalOptions(values));
460
+ }
329
461
  function shellArgument(value) {
330
462
  if (value === "bash" || value === "zsh" || value === "fish") {
331
463
  return value;
@@ -345,8 +477,24 @@ function resolveVersionOptions(argv) {
345
477
  if (options.noColor) {
346
478
  process.env.NO_COLOR = "1";
347
479
  }
480
+ setNoColor(options.noColor);
348
481
  return options;
349
482
  }
483
+ function renderRootHelp(command) {
484
+ const values = command.optsWithGlobals();
485
+ const noColor = Boolean(values.noColor);
486
+ return renderHelp({ color: !noColor });
487
+ }
488
+ function registerRemovedCommand(program, commandSpec, message, markInvoked) {
489
+ const handler = createRemovedCommandHandler(message);
490
+ addGlobalOptions(
491
+ program.command(commandSpec, { hidden: true }).allowUnknownOption(true).allowExcessArguments(true)
492
+ ).action(async function() {
493
+ markInvoked();
494
+ const values = this.optsWithGlobals();
495
+ await handler([], resolveGlobalOptions(values));
496
+ });
497
+ }
350
498
  function createProgram() {
351
499
  let actionInvoked = false;
352
500
  const markInvoked = () => {
@@ -355,24 +503,13 @@ function createProgram() {
355
503
  const program = addGlobalOptions(
356
504
  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
505
  );
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(
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)
363
- ).action(async function() {
364
- markInvoked();
365
- const values = this.optsWithGlobals();
366
- const args = ["init"];
367
- pushOption(args, "--non-interactive", values.nonInteractive);
368
- pushOption(args, "--project", values.project);
369
- pushOption(args, "--output", values.output);
370
- pushOption(args, "--runtime", values.runtime);
371
- pushOption(args, "--skip-skills", values.skipSkills);
372
- pushOption(args, "--skip-context", values.skipContext);
373
- pushOption(args, "--dry-run", values.dryRun);
374
- await invokeHandler("workflow", args, values);
375
- });
506
+ program.helpInformation = () => renderRootHelp(program);
507
+ registerRemovedCommand(
508
+ program,
509
+ "init",
510
+ "Use 'gh-symphony workflow init'.",
511
+ markInvoked
512
+ );
376
513
  const workflow = addGlobalOptions(
377
514
  program.command("workflow").description("Manage WORKFLOW.md authoring")
378
515
  );
@@ -425,14 +562,12 @@ function createProgram() {
425
562
  await invokeHandler("workflow", args, values);
426
563
  });
427
564
  addGlobalOptions(
428
- program.command("setup").description("Run the one-command first-run setup flow").option("--non-interactive", "Run without prompts").option("--project <id>", "GitHub Project ID or URL").option("--workspace-dir <path>", "Workspace directory").option("--assigned-only", "Limit processing to assigned issues").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").allowExcessArguments(false)
565
+ program.command("setup").description("Run the one-command first-run setup flow").option("--non-interactive", "Run without prompts").option("--assigned-only", "Limit processing to assigned issues").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").allowExcessArguments(false)
429
566
  ).action(async function() {
430
567
  markInvoked();
431
568
  const values = this.optsWithGlobals();
432
569
  const args = [];
433
570
  pushOption(args, "--non-interactive", values.nonInteractive);
434
- pushOption(args, "--project", values.project);
435
- pushOption(args, "--workspace-dir", values.workspaceDir);
436
571
  pushOption(args, "--assigned-only", values.assignedOnly);
437
572
  pushOption(args, "--output", values.output);
438
573
  pushOption(args, "--skip-skills", values.skipSkills);
@@ -443,13 +578,18 @@ function createProgram() {
443
578
  program.command("doctor").description("Run diagnostics and optional first-run remediation").option("--project-id <projectId>", "Project identifier").option(
444
579
  "--fix",
445
580
  "Apply safe remediation steps and print manual follow-ups"
446
- ).addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
581
+ ).option(
582
+ "--smoke",
583
+ "Run a safe live issue readiness check without dispatching work"
584
+ ).option("--issue <owner/repo#number>", "Live issue to validate").addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
447
585
  ).action(async function() {
448
586
  markInvoked();
449
587
  const values = this.optsWithGlobals();
450
588
  const args = [];
451
589
  pushOption(args, "--project-id", resolveProjectId(values));
452
590
  pushOption(args, "--fix", values.fix);
591
+ pushOption(args, "--smoke", values.smoke);
592
+ pushOption(args, "--issue", values.issue);
453
593
  await invokeHandler("doctor", args, values);
454
594
  });
455
595
  addGlobalOptions(
@@ -458,202 +598,101 @@ function createProgram() {
458
598
  markInvoked();
459
599
  await invokeHandler("upgrade", [], this.optsWithGlobals());
460
600
  });
601
+ registerRemovedCommand(
602
+ program,
603
+ "start",
604
+ "Use 'gh-symphony repo start' from the target repository.",
605
+ markInvoked
606
+ );
607
+ registerRemovedCommand(
608
+ program,
609
+ "stop",
610
+ "Use 'gh-symphony repo stop'.",
611
+ markInvoked
612
+ );
613
+ registerRemovedCommand(
614
+ program,
615
+ "status",
616
+ "Use 'gh-symphony repo status'.",
617
+ markInvoked
618
+ );
619
+ registerRemovedCommand(
620
+ program,
621
+ "run",
622
+ "Use 'gh-symphony repo run <issue>'.",
623
+ markInvoked
624
+ );
625
+ registerRemovedCommand(
626
+ program,
627
+ "recover",
628
+ "Use 'gh-symphony repo recover'.",
629
+ markInvoked
630
+ );
631
+ registerRemovedCommand(
632
+ program,
633
+ "logs",
634
+ "Use 'gh-symphony repo logs'.",
635
+ markInvoked
636
+ );
461
637
  addGlobalOptions(
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)
469
- ).action(async function() {
470
- markInvoked();
471
- const values = this.optsWithGlobals();
472
- const args = [];
473
- pushOption(args, "--project-id", resolveProjectId(values));
474
- pushOption(args, "--daemon", values.daemon);
475
- pushOption(args, "--once", values.once);
476
- pushOption(args, "--http", values.http);
477
- pushOption(args, "--web", values.web);
478
- pushOption(args, "--log-level", values.logLevel);
479
- await invokeHandler("start", args, values);
480
- });
481
- addGlobalOptions(
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)
483
- ).action(async function() {
484
- markInvoked();
485
- const values = this.optsWithGlobals();
486
- const args = [];
487
- pushOption(args, "--project-id", resolveProjectId(values));
488
- pushOption(args, "--force", values.force);
489
- await invokeHandler("stop", args, values);
490
- });
491
- addGlobalOptions(
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)
493
- ).action(async function() {
494
- markInvoked();
495
- const values = this.optsWithGlobals();
496
- const args = [];
497
- pushOption(args, "--project-id", resolveProjectId(values));
498
- pushOption(args, "--watch", values.watch);
499
- await invokeHandler("status", args, values);
500
- });
501
- addGlobalOptions(
502
- program.command("run").description("Dispatch a single issue").argument("<issue>", "Issue identifier").option("--log-level <level>", "Orchestrator lifecycle log level").option("-w, --watch", "Watch status after dispatch").option("--project-id <projectId>", "Project identifier").addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
503
- ).action(async function(issue) {
504
- markInvoked();
505
- const values = this.optsWithGlobals();
506
- const args = [issue];
507
- pushOption(args, "--project-id", resolveProjectId(values));
508
- pushOption(args, "--log-level", values.logLevel);
509
- pushOption(args, "--watch", values.watch);
510
- await invokeHandler("run", args, values);
511
- });
512
- addGlobalOptions(
513
- program.command("recover").description("Recover stalled runs").option("--dry-run", "Show recoverable runs without recovering").option("--project-id <projectId>", "Project identifier").addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
514
- ).action(async function() {
515
- markInvoked();
516
- const values = this.optsWithGlobals();
517
- const args = [];
518
- pushOption(args, "--project-id", resolveProjectId(values));
519
- pushOption(args, "--dry-run", values.dryRun);
520
- await invokeHandler("recover", args, values);
521
- });
522
- addGlobalOptions(
523
- program.command("logs").description("View orchestrator logs").option("-f, --follow", "Follow new log lines").option("--issue <issue>", "Filter by issue identifier").option("--run <runId>", "Read events for a specific run").option("--level <level>", "Filter by log level").option("--project-id <projectId>", "Project identifier").addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
638
+ program.command("project").description("Removed project namespace").argument("[args...]", "Removed project command arguments").allowUnknownOption(true).allowExcessArguments(true)
524
639
  ).action(async function() {
525
640
  markInvoked();
526
- const values = this.optsWithGlobals();
527
- const args = [];
528
- pushOption(args, "--project-id", resolveProjectId(values));
529
- pushOption(args, "--follow", values.follow);
530
- pushOption(args, "--issue", values.issue);
531
- pushOption(args, "--run", values.run);
532
- pushOption(args, "--level", values.level);
533
- await invokeHandler("logs", args, values);
641
+ await createRemovedCommandHandler(
642
+ "The 'project' command was removed. The orchestrator is now per-repository. Run 'gh-symphony repo init' in the target repository."
643
+ )([], resolveGlobalOptions(this.optsWithGlobals()));
534
644
  });
535
- const project = addGlobalOptions(
536
- program.command("project").description("Manage configured projects")
645
+ const repo = addGlobalOptions(
646
+ program.command("repo").description("Manage the current repository runtime")
537
647
  );
538
- project.action(async function() {
539
- markInvoked();
540
- await invokeHandler("project", [], this.optsWithGlobals());
541
- });
542
- addGlobalOptions(
543
- project.command("add").description("Add a new project").option("--non-interactive", "Run without prompts").option("--project <id>", "GitHub Project ID").option("--workspace-dir <path>", "Workspace directory").option("--assigned-only", "Limit processing to assigned issues").allowExcessArguments(false)
544
- ).action(async function() {
648
+ repo.action(async function() {
545
649
  markInvoked();
546
- const values = this.optsWithGlobals();
547
- const args = [];
548
- pushOption(args, "--non-interactive", values.nonInteractive);
549
- pushOption(args, "--project", values.project);
550
- pushOption(args, "--workspace-dir", values.workspaceDir);
551
- pushOption(args, "--assigned-only", values.assignedOnly);
552
- await invokeHandler("project", ["add", ...args], values);
650
+ await invokeHandler("repo", [], this.optsWithGlobals());
553
651
  });
652
+ addGlobalOptions(repo.command("list").description("Removed")).action(
653
+ async function() {
654
+ markInvoked();
655
+ await invokeRemovedCommand(
656
+ "Removed. Repository identity is shown by 'repo status'.",
657
+ this.optsWithGlobals()
658
+ );
659
+ }
660
+ );
554
661
  addGlobalOptions(
555
- project.command("list").description("List configured projects")
662
+ repo.command("add").description("Removed").argument("[owner/name]", "Repository spec").allowExcessArguments(false)
556
663
  ).action(async function() {
557
664
  markInvoked();
558
- const values = this.optsWithGlobals();
559
- await invokeHandler("project", ["list"], values);
560
- });
561
- addGlobalOptions(
562
- project.command("remove").description("Remove a project").argument("<projectId>", "Project identifier").allowExcessArguments(false)
563
- ).action(async function(projectId) {
564
- markInvoked();
565
- await invokeHandler(
566
- "project",
567
- ["remove", projectId],
665
+ await invokeRemovedCommand(
666
+ "Removed. The orchestrator binds to the cwd repository via 'repo init'.",
568
667
  this.optsWithGlobals()
569
668
  );
570
669
  });
571
670
  addGlobalOptions(
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)
579
- ).action(async function() {
580
- markInvoked();
581
- const values = this.optsWithGlobals();
582
- const args = ["start"];
583
- pushOption(args, "--project-id", resolveProjectId(values));
584
- pushOption(args, "--daemon", values.daemon);
585
- pushOption(args, "--once", values.once);
586
- pushOption(args, "--http", values.http);
587
- pushOption(args, "--web", values.web);
588
- pushOption(args, "--log-level", values.logLevel);
589
- await invokeHandler("project", args, values);
590
- });
591
- addGlobalOptions(
592
- project.command("stop").description("Stop a specific project").option("--force", "Force stop with SIGKILL").option("--project-id <projectId>", "Project identifier").addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
671
+ repo.command("remove").description("Removed").argument("[owner/name]", "Repository spec").allowExcessArguments(false)
593
672
  ).action(async function() {
594
673
  markInvoked();
595
- const values = this.optsWithGlobals();
596
- const args = ["stop"];
597
- pushOption(args, "--project-id", resolveProjectId(values));
598
- pushOption(args, "--force", values.force);
599
- await invokeHandler("project", args, values);
600
- });
601
- addGlobalOptions(
602
- project.command("switch").description("Switch the active project")
603
- ).action(async function() {
604
- markInvoked();
605
- await invokeHandler(
606
- "project",
607
- ["switch"],
674
+ await invokeRemovedCommand(
675
+ "Removed. The orchestrator binds to the cwd repository via 'repo init'.",
608
676
  this.optsWithGlobals()
609
677
  );
610
678
  });
611
679
  addGlobalOptions(
612
- project.command("status").description("Show status for a specific project").option("-w, --watch", "Watch status continuously").option("--project-id <projectId>", "Project identifier").addOption(new Option("--project <projectId>").hideHelp()).allowExcessArguments(false)
613
- ).action(async function() {
614
- markInvoked();
615
- const values = this.optsWithGlobals();
616
- const args = ["status"];
617
- pushOption(args, "--project-id", resolveProjectId(values));
618
- pushOption(args, "--watch", values.watch);
619
- await invokeHandler("project", args, values);
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
- });
631
- const repo = addGlobalOptions(
632
- program.command("repo").description("Manage repositories in the active project")
633
- );
634
- repo.action(async function() {
635
- markInvoked();
636
- await invokeHandler("repo", [], this.optsWithGlobals());
637
- });
638
- addGlobalOptions(
639
- repo.command("list").description("List repositories")
680
+ repo.command("sync").description("Removed").allowExcessArguments(false)
640
681
  ).action(async function() {
641
682
  markInvoked();
642
- await invokeHandler(
643
- "repo",
644
- ["list"],
683
+ await invokeRemovedCommand(
684
+ "Removed. Single-repo model has no linked-repo set to sync.",
645
685
  this.optsWithGlobals()
646
686
  );
647
687
  });
648
688
  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)
689
+ 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").allowExcessArguments(false)
650
690
  ).action(async function() {
651
691
  markInvoked();
652
692
  const values = this.optsWithGlobals();
653
693
  const args = ["init"];
654
694
  pushOption(args, "--repo-dir", values.repoDir);
655
695
  pushOption(args, "--workflow-file", values.workflowFile);
656
- pushOption(args, "--project-id", resolveProjectId(values));
657
696
  await invokeHandler("repo", args, values);
658
697
  });
659
698
  addGlobalOptions(
@@ -663,12 +702,11 @@ function createProgram() {
663
702
  ).option(
664
703
  "--web [port]",
665
704
  "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)
705
+ ).option("--log-level <level>", "Orchestrator lifecycle log level").allowUnknownOption(true).allowExcessArguments(true)
667
706
  ).action(async function() {
668
707
  markInvoked();
669
708
  const values = this.optsWithGlobals();
670
- const args = ["start"];
671
- pushOption(args, "--project-id", resolveProjectId(values));
709
+ const args = ["start", ...this.args];
672
710
  pushOption(args, "--daemon", values.daemon);
673
711
  pushOption(args, "--once", values.once);
674
712
  pushOption(args, "--http", values.http);
@@ -677,53 +715,61 @@ function createProgram() {
677
715
  await invokeHandler("repo", args, values);
678
716
  });
679
717
  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)
718
+ repo.command("status").description("Show current repository orchestrator status").option("-w, --watch", "Watch status continuously").allowUnknownOption(true).allowExcessArguments(true)
681
719
  ).action(async function() {
682
720
  markInvoked();
683
721
  const values = this.optsWithGlobals();
684
- const args = ["status"];
685
- pushOption(args, "--project-id", resolveProjectId(values));
722
+ const args = ["status", ...this.args];
686
723
  pushOption(args, "--watch", values.watch);
687
724
  await invokeHandler("repo", args, values);
688
725
  });
689
726
  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)
727
+ repo.command("stop").description("Stop the current repository background orchestrator").option("--force", "Force stop with SIGKILL").allowUnknownOption(true).allowExcessArguments(true)
691
728
  ).action(async function() {
692
729
  markInvoked();
693
730
  const values = this.optsWithGlobals();
694
- const args = ["stop"];
695
- pushOption(args, "--project-id", resolveProjectId(values));
731
+ const args = ["stop", ...this.args];
696
732
  pushOption(args, "--force", values.force);
697
733
  await invokeHandler("repo", args, values);
698
734
  });
699
735
  addGlobalOptions(
700
- repo.command("add").description("Add a repository").argument("<owner/name>", "Repository spec").allowExcessArguments(false)
701
- ).action(async function(repoSpec) {
736
+ repo.command("run").description("Dispatch a single issue from the current repository").argument("[args...]", "Issue identifier and passthrough options").option("--log-level <level>", "Orchestrator lifecycle log level").option("-w, --watch", "Watch status after dispatch").allowUnknownOption(true).allowExcessArguments(true)
737
+ ).action(async function(passthrough) {
702
738
  markInvoked();
703
- await invokeHandler(
704
- "repo",
705
- ["add", repoSpec],
706
- this.optsWithGlobals()
707
- );
739
+ const values = this.optsWithGlobals();
740
+ const args = ["run", ...passthrough];
741
+ pushOption(args, "--log-level", values.logLevel);
742
+ pushOption(args, "--watch", values.watch);
743
+ await invokeHandler("repo", args, values);
708
744
  });
709
745
  addGlobalOptions(
710
- repo.command("remove").description("Remove a repository").argument("<owner/name>", "Repository spec").allowExcessArguments(false)
711
- ).action(async function(repoSpec) {
746
+ repo.command("recover").description("Recover stalled runs for the current repository").option("--dry-run", "Show recoverable runs without recovering").allowUnknownOption(true).allowExcessArguments(true)
747
+ ).action(async function() {
712
748
  markInvoked();
713
- await invokeHandler(
714
- "repo",
715
- ["remove", repoSpec],
716
- this.optsWithGlobals()
717
- );
749
+ const values = this.optsWithGlobals();
750
+ const args = ["recover", ...this.args];
751
+ pushOption(args, "--dry-run", values.dryRun);
752
+ await invokeHandler("repo", args, values);
718
753
  });
719
754
  addGlobalOptions(
720
- repo.command("sync").description("Sync repositories from the active GitHub Project").option("--dry-run", "Preview repository changes without writing config").option("--prune", "Remove local repositories that are no longer linked").allowExcessArguments(false)
755
+ repo.command("logs").description("View current repository orchestrator logs").option("-f, --follow", "Follow new log lines").option("--issue <issue>", "Filter by issue identifier").option("--run <runId>", "Read events for a specific run").option("--level <level>", "Filter by log level").allowUnknownOption(true).allowExcessArguments(true)
721
756
  ).action(async function() {
722
757
  markInvoked();
723
758
  const values = this.optsWithGlobals();
724
- const args = ["sync"];
725
- pushOption(args, "--dry-run", values.dryRun);
726
- pushOption(args, "--prune", values.prune);
759
+ const args = ["logs", ...this.args];
760
+ pushOption(args, "--follow", values.follow);
761
+ pushOption(args, "--issue", values.issue);
762
+ pushOption(args, "--run", values.run);
763
+ pushOption(args, "--level", values.level);
764
+ await invokeHandler("repo", args, values);
765
+ });
766
+ addGlobalOptions(
767
+ repo.command("explain").description("Explain why a repository issue is not dispatching").argument("[args...]", "Issue identifier and passthrough options").option("--workflow <path>", "Path to the WORKFLOW.md file to evaluate").allowUnknownOption(true).allowExcessArguments(true)
768
+ ).action(async function(passthrough) {
769
+ markInvoked();
770
+ const values = this.optsWithGlobals();
771
+ const args = ["explain", ...passthrough];
772
+ pushOption(args, "--workflow", values.workflow);
727
773
  await invokeHandler("repo", args, values);
728
774
  });
729
775
  const config = addGlobalOptions(