@gh-symphony/cli 0.4.5 → 0.4.6

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 CHANGED
@@ -8,6 +8,9 @@ The following tools must be installed before using the CLI:
8
8
 
9
9
  - **[Node.js](https://nodejs.org/)** (v24+) with npm
10
10
  - **[Git](https://git-scm.com/)**
11
+ - At least one AI agent runtime on `PATH` before `gh-symphony repo start`:
12
+ - **[Codex CLI](https://developers.openai.com/codex/cli/)** (`codex`) - install from the official Codex CLI guide, then authenticate with `codex login`.
13
+ - **[Claude Code](https://code.claude.com/docs/en/quickstart)** (`claude`) - install from the official Claude Code quickstart, then authenticate with `ANTHROPIC_API_KEY` or a local Claude login for non-bare runs.
11
14
  - One GitHub auth source with required scopes (`repo`, `read:org`, `project`):
12
15
  - **[GitHub CLI (`gh`)](https://cli.github.com/)**:
13
16
  ```bash
@@ -106,7 +109,7 @@ Examples of generated validation guidance include `make test`, `just build`, `uv
106
109
 
107
110
  You can further customize the agent's behavior by editing `WORKFLOW.md` — this is the policy layer that controls what the agent does at each workflow phase.
108
111
 
109
- > Currently supported runtimes: **Codex**, **Claude Code**
112
+ > Currently supported runtimes: **[Codex CLI](https://developers.openai.com/codex/cli/)** and **[Claude Code](https://code.claude.com/docs/en/quickstart)**. The selected runtime command must be installed and authenticated before `gh-symphony repo start` can dispatch worker runs.
110
113
 
111
114
  ### Explicit Priority Mapping
112
115
 
@@ -16,7 +16,7 @@ import {
16
16
  formatClaudePreflightText,
17
17
  resolveClaudeCommandBinary,
18
18
  runClaudePreflight
19
- } from "./chunk-LJUEOVAQ.js";
19
+ } from "./chunk-RGCSM2KZ.js";
20
20
 
21
21
  // src/mapping/smart-defaults.ts
22
22
  var ROLE_PATTERNS = [
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-3IRPSPAF.js";
5
5
  import {
6
6
  parseWorkflowMarkdown
7
- } from "./chunk-LJUEOVAQ.js";
7
+ } from "./chunk-RGCSM2KZ.js";
8
8
  import {
9
9
  saveGlobalConfig,
10
10
  saveProjectConfig
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  workflow_init_default
4
- } from "./chunk-4ZHWEQQL.js";
4
+ } from "./chunk-DENDF6S6.js";
5
5
  import {
6
6
  fetchGithubProjectIssueByRepositoryAndNumber,
7
7
  inspectManagedProjectSelection,
8
8
  resolveTrackerAdapter
9
- } from "./chunk-HHBXGE23.js";
9
+ } from "./chunk-RMNLHTIK.js";
10
10
  import {
11
11
  GitHubApiError,
12
12
  createClient,
@@ -19,7 +19,7 @@ import {
19
19
  buildPromptVariables,
20
20
  parseWorkflowMarkdown,
21
21
  renderPrompt
22
- } from "./chunk-LJUEOVAQ.js";
22
+ } from "./chunk-RGCSM2KZ.js";
23
23
  import {
24
24
  loadActiveProjectConfig
25
25
  } from "./chunk-YZP5N5XP.js";
@@ -6619,6 +6619,7 @@ export {
6619
6619
  readJsonFile,
6620
6620
  safeReadDir,
6621
6621
  isFileMissing,
6622
+ formatEventMessage,
6622
6623
  parseRecentEvents,
6623
6624
  redactObservabilitySecrets,
6624
6625
  redactObservabilityDiagnosticsWithStats,
@@ -30,7 +30,7 @@ import {
30
30
  resolveWorkflowRuntimeTimeouts,
31
31
  safeReadDir,
32
32
  scheduleRetryAt
33
- } from "./chunk-LJUEOVAQ.js";
33
+ } from "./chunk-RGCSM2KZ.js";
34
34
  import {
35
35
  loadGlobalConfig,
36
36
  loadProjectConfig
@@ -10,7 +10,7 @@ import {
10
10
  resolveGitHubGraphQLToken,
11
11
  shouldReuseAgentCredentialCache,
12
12
  writeAgentCredentialCache
13
- } from "./chunk-LJUEOVAQ.js";
13
+ } from "./chunk-RGCSM2KZ.js";
14
14
 
15
15
  // ../runtime-codex/src/runtime.ts
16
16
  import { spawn } from "child_process";
@@ -5,14 +5,14 @@ import {
5
5
  parseIssueReference,
6
6
  readGitHubProjectBinding,
7
7
  renderIssueWorkflowPreview
8
- } from "./chunk-I3CZXKS5.js";
9
- import "./chunk-4ZHWEQQL.js";
8
+ } from "./chunk-FBJRJWE5.js";
9
+ import "./chunk-DENDF6S6.js";
10
10
  import {
11
11
  fetchGithubProjectIssueByRepositoryAndNumber,
12
12
  fetchGithubProjectIssues,
13
13
  inspectManagedProjectSelection
14
- } from "./chunk-HHBXGE23.js";
15
- import "./chunk-7KFCWMMW.js";
14
+ } from "./chunk-RMNLHTIK.js";
15
+ import "./chunk-XLDJTMW5.js";
16
16
  import {
17
17
  resolveRuntimeRoot
18
18
  } from "./chunk-3IRPSPAF.js";
@@ -40,7 +40,7 @@ import {
40
40
  resolveClaudeCommandBinary,
41
41
  resolveRuntimeCommandBinary,
42
42
  runClaudePreflight
43
- } from "./chunk-LJUEOVAQ.js";
43
+ } from "./chunk-RGCSM2KZ.js";
44
44
  import {
45
45
  configFilePath,
46
46
  orchestratorLogPath,
@@ -1886,10 +1886,18 @@ ${DOCTOR_USAGE}`);
1886
1886
  }
1887
1887
  function buildRuntimeInstallGuidance(binary, platform) {
1888
1888
  if (binary === "codex") {
1889
- return "Install Codex CLI using its official installation instructions and ensure 'codex' is on PATH.";
1889
+ return [
1890
+ "Install Codex CLI from https://developers.openai.com/codex/cli/",
1891
+ "and ensure 'codex' is on PATH.",
1892
+ "Then authenticate with 'codex login'."
1893
+ ].join(" ");
1890
1894
  }
1891
1895
  if (binary === "claude" || binary === "claude-code") {
1892
- return "Install Claude Code using its official installation instructions and ensure the runtime binary is on PATH.";
1896
+ return [
1897
+ "Install Claude Code from https://code.claude.com/docs/en/quickstart",
1898
+ "and ensure the runtime binary is on PATH.",
1899
+ "Then set ANTHROPIC_API_KEY or complete a local Claude login for non-bare runs."
1900
+ ].join(" ");
1893
1901
  }
1894
1902
  if (platform === "win32" && binary) {
1895
1903
  return `Install '${binary}' using its official installation instructions and ensure the directory containing '${binary}.exe' is on PATH.`;
package/dist/index.js CHANGED
@@ -417,13 +417,13 @@ function createRemovedCommandHandler(message) {
417
417
 
418
418
  // src/index.ts
419
419
  var COMMANDS = {
420
- workflow: () => import("./workflow-L5UEE7JH.js"),
421
- setup: () => import("./setup-DMYXHOCB.js"),
422
- doctor: () => import("./doctor-GHKE7TRO.js"),
423
- upgrade: () => import("./upgrade-UZAGYCRJ.js"),
424
- repo: () => import("./repo-V72OM7JL.js"),
420
+ workflow: () => import("./workflow-WG55ZIZ6.js"),
421
+ setup: () => import("./setup-IJMKV5YA.js"),
422
+ doctor: () => import("./doctor-YV5NV4HX.js"),
423
+ upgrade: () => import("./upgrade-TS42ZOSU.js"),
424
+ repo: () => import("./repo-LBNPFDDF.js"),
425
425
  config: () => import("./config-cmd-OIVIUKG7.js"),
426
- version: () => import("./version-UUVKCGQA.js")
426
+ version: () => import("./version-QXB4FBVW.js")
427
427
  };
428
428
  function addGlobalOptions(command) {
429
429
  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");
@@ -17,7 +17,7 @@ import {
17
17
  import {
18
18
  initRepoRuntime,
19
19
  parseRepoRuntimeFlags
20
- } from "./chunk-34YCGQD2.js";
20
+ } from "./chunk-EILO332E.js";
21
21
  import {
22
22
  OrchestratorService,
23
23
  acquireProjectLock,
@@ -33,8 +33,8 @@ import {
33
33
  resolveOrchestratorLogLevel,
34
34
  resolveTrackerAdapter,
35
35
  runCli
36
- } from "./chunk-HHBXGE23.js";
37
- import "./chunk-7KFCWMMW.js";
36
+ } from "./chunk-RMNLHTIK.js";
37
+ import "./chunk-XLDJTMW5.js";
38
38
  import {
39
39
  resolveRepoRuntimeRoot,
40
40
  resolveRuntimeRoot
@@ -52,13 +52,14 @@ import {
52
52
  import {
53
53
  WorkflowConfigStore,
54
54
  deriveIssueWorkspaceKeyFromIdentifier,
55
+ formatEventMessage,
55
56
  isFileMissing,
56
57
  isMatchingIssueRun,
57
58
  mapIssueOrchestrationStateToStatus,
58
59
  parseRecentEvents,
59
60
  readJsonFile,
60
61
  safeReadDir
61
- } from "./chunk-LJUEOVAQ.js";
62
+ } from "./chunk-RGCSM2KZ.js";
62
63
  import {
63
64
  daemonPidPath,
64
65
  httpStatusPath,
@@ -121,9 +122,11 @@ var handler = async (args, options) => {
121
122
  const lines = content.trim().split("\n").filter(Boolean);
122
123
  for (const line of lines) {
123
124
  const event = JSON.parse(line);
124
- if (parsed.projectId && event.projectId !== parsed.projectId) continue;
125
- if (parsed.level && event.level !== parsed.level) continue;
126
- if (parsed.issue && event.issueIdentifier !== parsed.issue) continue;
125
+ if (parsed.projectId && getProjectId(event) !== parsed.projectId)
126
+ continue;
127
+ if (parsed.level && getLevel(event) !== parsed.level) continue;
128
+ if (parsed.issue && getIssueIdentifier(event) !== parsed.issue)
129
+ continue;
127
130
  process.stdout.write(formatEvent(event) + "\n");
128
131
  }
129
132
  } catch {
@@ -177,6 +180,7 @@ var handler = async (args, options) => {
177
180
  }
178
181
  const runRoots = parsed.projectId ? [join(runtimeRoot, "projects", parsed.projectId, "runs")] : await listProjectRunRoots(runtimeRoot);
179
182
  let foundRuns = false;
183
+ const events = [];
180
184
  try {
181
185
  for (const runsDir of runRoots) {
182
186
  const entries = await safeReadDir2(runsDir);
@@ -191,11 +195,12 @@ var handler = async (args, options) => {
191
195
  const lines = content.trim().split("\n").filter(Boolean);
192
196
  for (const line of lines) {
193
197
  const event = JSON.parse(line);
194
- if (parsed.projectId && event.projectId !== parsed.projectId)
198
+ if (parsed.projectId && getProjectId(event) !== parsed.projectId)
199
+ continue;
200
+ if (parsed.level && getLevel(event) !== parsed.level) continue;
201
+ if (parsed.issue && getIssueIdentifier(event) !== parsed.issue)
195
202
  continue;
196
- if (parsed.level && event.level !== parsed.level) continue;
197
- if (parsed.issue && event.issueIdentifier !== parsed.issue) continue;
198
- process.stdout.write(formatEvent(event) + "\n");
203
+ events.push(event);
199
204
  }
200
205
  } catch {
201
206
  }
@@ -205,15 +210,33 @@ var handler = async (args, options) => {
205
210
  }
206
211
  if (!foundRuns) {
207
212
  process.stderr.write("No runs found. Start the orchestrator first.\n");
213
+ return;
214
+ }
215
+ events.sort(
216
+ (left, right) => String(left.at ?? "").localeCompare(String(right.at ?? ""))
217
+ );
218
+ for (const event of events) {
219
+ process.stdout.write(formatEvent(event) + "\n");
208
220
  }
209
221
  };
210
222
  var logs_default = handler;
211
223
  function formatEvent(event) {
212
224
  const at = event.at ?? "";
213
225
  const eventType = event.event ?? "unknown";
214
- const issue = event.issueIdentifier ?? "";
215
- const extra = event.error ? ` error=${event.error}` : "";
216
- return `[${at}] ${eventType} ${issue}${extra}`;
226
+ const issue = getIssueIdentifier(event);
227
+ const message = formatEventMessage(event);
228
+ const subject = issue ? ` ${issue}` : "";
229
+ const extra = message ? ` ${message}` : "";
230
+ return `[${at}] ${eventType}${subject}${extra}`;
231
+ }
232
+ function getProjectId(event) {
233
+ return typeof event.projectId === "string" ? event.projectId : void 0;
234
+ }
235
+ function getLevel(event) {
236
+ return typeof event.level === "string" ? event.level : void 0;
237
+ }
238
+ function getIssueIdentifier(event) {
239
+ return typeof event.issueIdentifier === "string" ? event.issueIdentifier : "";
217
240
  }
218
241
  async function listProjectRunRoots(runtimeRoot) {
219
242
  const roots = [join(runtimeRoot, "runs")];
@@ -16,10 +16,10 @@ import {
16
16
  warnDeprecatedSkipContext,
17
17
  writeEcosystem,
18
18
  writeWorkflowPlan
19
- } from "./chunk-4ZHWEQQL.js";
19
+ } from "./chunk-DENDF6S6.js";
20
20
  import {
21
21
  initRepoRuntime
22
- } from "./chunk-34YCGQD2.js";
22
+ } from "./chunk-EILO332E.js";
23
23
  import "./chunk-3IRPSPAF.js";
24
24
  import {
25
25
  GhAuthError,
@@ -33,7 +33,7 @@ import {
33
33
  listUserProjects,
34
34
  validateToken
35
35
  } from "./chunk-SMNIGNS3.js";
36
- import "./chunk-LJUEOVAQ.js";
36
+ import "./chunk-RGCSM2KZ.js";
37
37
  import "./chunk-YZP5N5XP.js";
38
38
 
39
39
  // src/commands/setup.ts
@@ -16,8 +16,8 @@ function execFileAsync(file, args, execFileImpl = execFileCallback) {
16
16
  });
17
17
  }
18
18
  function resolveCurrentCliVersion() {
19
- if ("0.4.5".length > 0) {
20
- return "0.4.5";
19
+ if ("0.4.6".length > 0) {
20
+ return "0.4.6";
21
21
  }
22
22
  const pkg = JSON.parse(
23
23
  readFileSync(new URL("../../package.json", import.meta.url), "utf8")
@@ -2,7 +2,7 @@
2
2
 
3
3
  // src/commands/version.ts
4
4
  var handler = async (_args, options) => {
5
- const version = "0.4.5";
5
+ const version = "0.4.6";
6
6
  if (options.json) {
7
7
  process.stdout.write(JSON.stringify({ version }) + "\n");
8
8
  } else {
@@ -6,7 +6,7 @@ import {
6
6
  normalizeCodexRuntimeEvents,
7
7
  prepareCodexRuntimePlan,
8
8
  resolveLocalRuntimeLaunchConfig
9
- } from "./chunk-7KFCWMMW.js";
9
+ } from "./chunk-XLDJTMW5.js";
10
10
  import {
11
11
  DEFAULT_AGENT_INPUT_REQUIRED_REASON,
12
12
  classifySessionExit,
@@ -17,7 +17,7 @@ import {
17
17
  resolveClaudeCommandBinary,
18
18
  resolveWorkflowRuntimeCommand,
19
19
  runClaudePreflight
20
- } from "./chunk-LJUEOVAQ.js";
20
+ } from "./chunk-RGCSM2KZ.js";
21
21
 
22
22
  // ../worker/src/index.ts
23
23
  import { spawn as spawn2 } from "child_process";
@@ -6,12 +6,12 @@ import {
6
6
  resetWorkflowCommandDependenciesForTest,
7
7
  setWorkflowCommandDependenciesForTest,
8
8
  workflow_default
9
- } from "./chunk-I3CZXKS5.js";
10
- import "./chunk-4ZHWEQQL.js";
11
- import "./chunk-HHBXGE23.js";
12
- import "./chunk-7KFCWMMW.js";
9
+ } from "./chunk-FBJRJWE5.js";
10
+ import "./chunk-DENDF6S6.js";
11
+ import "./chunk-RMNLHTIK.js";
12
+ import "./chunk-XLDJTMW5.js";
13
13
  import "./chunk-SMNIGNS3.js";
14
- import "./chunk-LJUEOVAQ.js";
14
+ import "./chunk-RGCSM2KZ.js";
15
15
  import "./chunk-YZP5N5XP.js";
16
16
  export {
17
17
  workflow_default as default,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gh-symphony/cli",
3
- "version": "0.4.5",
3
+ "version": "0.4.6",
4
4
  "license": "MIT",
5
5
  "author": "hojinzs",
6
6
  "description": "Interactive CLI for GitHub Symphony orchestration",
@@ -42,12 +42,12 @@
42
42
  "devDependencies": {
43
43
  "tsup": "^8.5.1",
44
44
  "@gh-symphony/core": "0.0.14",
45
- "@gh-symphony/control-plane": "0.0.15",
46
45
  "@gh-symphony/dashboard": "0.0.14",
47
46
  "@gh-symphony/orchestrator": "0.0.14",
48
- "@gh-symphony/runtime-claude": "0.0.14",
49
47
  "@gh-symphony/tracker-github": "0.0.14",
50
- "@gh-symphony/worker": "0.0.14"
48
+ "@gh-symphony/runtime-claude": "0.0.14",
49
+ "@gh-symphony/worker": "0.0.14",
50
+ "@gh-symphony/control-plane": "0.0.15"
51
51
  },
52
52
  "scripts": {
53
53
  "build": "tsup",