@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.
- package/README.md +66 -2
- package/dist/chunk-2TSM3INR.js +1085 -0
- package/dist/chunk-2UW7NQLX.js +684 -0
- package/dist/{chunk-MVRF7BES.js → chunk-36KYEDEO.js} +10 -1
- package/dist/{chunk-TILHWBP6.js → chunk-C67H3OUL.js} +239 -36
- package/dist/{chunk-C7G7RJ4G.js → chunk-DDL4BWSL.js} +1 -1
- package/dist/{chunk-XN5ABWZ6.js → chunk-DFLXHNYQ.js} +26 -30
- package/dist/{chunk-EKKT5USP.js → chunk-E7HYEEZD.js} +487 -133
- package/dist/chunk-EEQQWTXS.js +3257 -0
- package/dist/chunk-GDE6FYN4.js +26 -0
- package/dist/{chunk-Y6TYJMNT.js → chunk-GSX2FV3M.js} +10 -16
- package/dist/{chunk-RN2PACNV.js → chunk-HMLBBZNY.js} +731 -75
- package/dist/{chunk-5NV3LSAJ.js → chunk-IWFX2FMA.js} +5 -1
- package/dist/{chunk-HZVDTAPS.js → chunk-PUDXVBSN.js} +1549 -1458
- package/dist/{chunk-ROGRTUFI.js → chunk-QIRE2VXS.js} +14 -3
- package/dist/{chunk-3AWF54PI.js → chunk-ZHOKYUO3.js} +394 -42
- package/dist/{config-cmd-DNXNL26Z.js → config-cmd-Z3A7V6NC.js} +1 -1
- package/dist/{doctor-IYHCFXOZ.js → doctor-EJUMPBMW.js} +105 -40
- package/dist/index.js +112 -24
- package/dist/{init-KZT6YNOH.js → init-54HMKNYI.js} +8 -3
- package/dist/{logs-6JKKYDGJ.js → logs-GTZ4U5JE.js} +2 -2
- package/dist/project-RMYMZSFV.js +25 -0
- package/dist/{recover-5KQI7WH5.js → recover-LTLKMTRX.js} +7 -5
- package/dist/repo-WI7GF6XQ.js +749 -0
- package/dist/{run-ETC5UTRA.js → run-IHN3ZL35.js} +21 -7
- package/dist/{setup-VWB7RZUQ.js → setup-TZJSM3QV.js} +53 -14
- package/dist/start-RTAHQMR2.js +19 -0
- package/dist/status-F4D52OVK.js +12 -0
- package/dist/stop-MDKMJPVR.js +10 -0
- package/dist/{upgrade-3YNF3VKY.js → upgrade-O33S2SJK.js} +2 -2
- package/dist/{version-NUBTTOG7.js → version-CW54Q7BK.js} +1 -1
- package/dist/worker-entry.js +848 -693
- package/dist/{workflow-TBIFY5MO.js → workflow-L3KT6HB7.js} +177 -11
- package/package.json +4 -2
- package/dist/chunk-M3IFVLQS.js +0 -1155
- package/dist/project-UUVHS3ZR.js +0 -22
- package/dist/repo-HDDE7OUI.js +0 -321
- package/dist/start-ENFLZUI6.js +0 -16
- package/dist/status-QSCFVGRQ.js +0 -11
- 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-
|
|
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-
|
|
25
|
+
} from "./chunk-IWFX2FMA.js";
|
|
22
26
|
import {
|
|
23
27
|
inspectManagedProjectSelection
|
|
24
|
-
} from "./chunk-
|
|
25
|
-
import "./chunk-
|
|
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
|
|
237
|
-
const
|
|
238
|
-
if (
|
|
239
|
-
return
|
|
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
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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 } : {
|
|
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(
|
|
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 =
|
|
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
|
|
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(
|
|
753
|
-
|
|
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(
|
|
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
|
-
|
|
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-
|
|
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-
|
|
282
|
-
init: () => import("./init-
|
|
283
|
-
setup: () => import("./setup-
|
|
284
|
-
doctor: () => import("./doctor-
|
|
285
|
-
upgrade: () => import("./upgrade-
|
|
286
|
-
start: () => import("./start-
|
|
287
|
-
stop: () => import("./stop-
|
|
288
|
-
status: () => import("./status-
|
|
289
|
-
run: () => import("./run-
|
|
290
|
-
recover: () => import("./recover-
|
|
291
|
-
logs: () => import("./logs-
|
|
292
|
-
project: () => import("./project-
|
|
293
|
-
repo: () => import("./repo-
|
|
294
|
-
config: () => import("./config-cmd-
|
|
295
|
-
version: () => import("./version-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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").
|
|
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").
|
|
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(
|
|
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-
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
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-
|
|
5
|
+
} from "./chunk-DDL4BWSL.js";
|
|
6
6
|
import {
|
|
7
7
|
orchestratorLogPath
|
|
8
|
-
} from "./chunk-
|
|
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-
|
|
5
|
-
import "./chunk-
|
|
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-
|
|
10
|
+
} from "./chunk-IWFX2FMA.js";
|
|
9
11
|
import {
|
|
10
12
|
handleMissingManagedProjectConfig,
|
|
11
13
|
resolveManagedProjectConfig
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
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";
|