@dungle-scrubs/harness-cli-normalizer 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/README.md +144 -7
  2. package/dist/cli/args.d.ts +74 -0
  3. package/dist/cli/args.d.ts.map +1 -0
  4. package/dist/cli/args.js +339 -0
  5. package/dist/cli/args.js.map +1 -0
  6. package/dist/cli/check.d.ts +2 -0
  7. package/dist/cli/check.d.ts.map +1 -0
  8. package/dist/cli/check.js +110 -0
  9. package/dist/cli/check.js.map +1 -0
  10. package/dist/cli/exit-codes.d.ts +7 -0
  11. package/dist/cli/exit-codes.d.ts.map +1 -0
  12. package/dist/cli/exit-codes.js +11 -0
  13. package/dist/cli/exit-codes.js.map +1 -0
  14. package/dist/cli/help.d.ts +7 -0
  15. package/dist/cli/help.d.ts.map +1 -0
  16. package/dist/cli/help.js +110 -0
  17. package/dist/cli/help.js.map +1 -0
  18. package/dist/cli/index.d.ts +4 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +170 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/dist/cli/inspect.d.ts +3 -0
  23. package/dist/cli/inspect.d.ts.map +1 -0
  24. package/dist/cli/inspect.js +170 -0
  25. package/dist/cli/inspect.js.map +1 -0
  26. package/dist/cli/ls.d.ts +2 -0
  27. package/dist/cli/ls.d.ts.map +1 -0
  28. package/dist/cli/ls.js +10 -0
  29. package/dist/cli/ls.js.map +1 -0
  30. package/dist/cli/render.d.ts +8 -0
  31. package/dist/cli/render.d.ts.map +1 -0
  32. package/dist/cli/render.js +55 -0
  33. package/dist/cli/render.js.map +1 -0
  34. package/dist/cli/resolve-harness.d.ts +4 -0
  35. package/dist/cli/resolve-harness.d.ts.map +1 -0
  36. package/dist/cli/resolve-harness.js +31 -0
  37. package/dist/cli/resolve-harness.js.map +1 -0
  38. package/dist/cli/run.d.ts +2 -0
  39. package/dist/cli/run.d.ts.map +1 -0
  40. package/dist/cli/run.js +280 -0
  41. package/dist/cli/run.js.map +1 -0
  42. package/dist/cli/session.d.ts +2 -0
  43. package/dist/cli/session.d.ts.map +1 -0
  44. package/dist/cli/session.js +128 -0
  45. package/dist/cli/session.js.map +1 -0
  46. package/dist/cli/version.d.ts +2 -0
  47. package/dist/cli/version.d.ts.map +1 -0
  48. package/dist/cli/version.js +34 -0
  49. package/dist/cli/version.js.map +1 -0
  50. package/dist/cli.js +2 -0
  51. package/dist/execution/decode.d.ts.map +1 -1
  52. package/dist/execution/decode.js +32 -0
  53. package/dist/execution/decode.js.map +1 -1
  54. package/dist/execution/deps.d.ts +7 -1
  55. package/dist/execution/deps.d.ts.map +1 -1
  56. package/dist/execution/events.d.ts +6 -2
  57. package/dist/execution/events.d.ts.map +1 -1
  58. package/dist/execution/events.js.map +1 -1
  59. package/dist/execution/failure.d.ts +45 -0
  60. package/dist/execution/failure.d.ts.map +1 -0
  61. package/dist/execution/failure.js +121 -0
  62. package/dist/execution/failure.js.map +1 -0
  63. package/dist/execution/node-deps.d.ts.map +1 -1
  64. package/dist/execution/node-deps.js +19 -0
  65. package/dist/execution/node-deps.js.map +1 -1
  66. package/dist/execution/stream-turn.d.ts +2 -0
  67. package/dist/execution/stream-turn.d.ts.map +1 -1
  68. package/dist/execution/stream-turn.js +181 -16
  69. package/dist/execution/stream-turn.js.map +1 -1
  70. package/dist/interpretation/argv.d.ts +16 -4
  71. package/dist/interpretation/argv.d.ts.map +1 -1
  72. package/dist/interpretation/argv.js +68 -19
  73. package/dist/interpretation/argv.js.map +1 -1
  74. package/dist/interpretation/dimensions.d.ts +0 -2
  75. package/dist/interpretation/dimensions.d.ts.map +1 -1
  76. package/dist/interpretation/dimensions.js +0 -2
  77. package/dist/interpretation/dimensions.js.map +1 -1
  78. package/dist/interpretation/limits.d.ts +10 -1
  79. package/dist/interpretation/limits.d.ts.map +1 -1
  80. package/dist/interpretation/limits.js +84 -5
  81. package/dist/interpretation/limits.js.map +1 -1
  82. package/dist/interpretation/refusal.d.ts +31 -0
  83. package/dist/interpretation/refusal.d.ts.map +1 -0
  84. package/dist/interpretation/refusal.js +87 -0
  85. package/dist/interpretation/refusal.js.map +1 -0
  86. package/dist/interpretation/turn-options.d.ts +18 -0
  87. package/dist/interpretation/turn-options.d.ts.map +1 -0
  88. package/dist/interpretation/turn-options.js +417 -0
  89. package/dist/interpretation/turn-options.js.map +1 -0
  90. package/dist/interpretation/vocabulary.d.ts +5 -0
  91. package/dist/interpretation/vocabulary.d.ts.map +1 -1
  92. package/dist/interpretation/vocabulary.js +1 -1
  93. package/dist/interpretation/vocabulary.js.map +1 -1
  94. package/dist/knowledge/claude-code.d.ts +13 -1
  95. package/dist/knowledge/claude-code.d.ts.map +1 -1
  96. package/dist/knowledge/claude-code.js +35 -13
  97. package/dist/knowledge/claude-code.js.map +1 -1
  98. package/dist/knowledge/codex.d.ts.map +1 -1
  99. package/dist/knowledge/codex.js +25 -14
  100. package/dist/knowledge/codex.js.map +1 -1
  101. package/dist/knowledge/descriptor.d.ts +118 -14
  102. package/dist/knowledge/descriptor.d.ts.map +1 -1
  103. package/dist/knowledge/descriptor.js +58 -0
  104. package/dist/knowledge/descriptor.js.map +1 -1
  105. package/dist/knowledge/matchers.d.ts +3 -3
  106. package/dist/knowledge/matchers.d.ts.map +1 -1
  107. package/dist/knowledge/matchers.js +19 -6
  108. package/dist/knowledge/matchers.js.map +1 -1
  109. package/dist/knowledge/muse.d.ts +2 -2
  110. package/dist/knowledge/muse.d.ts.map +1 -1
  111. package/dist/knowledge/muse.js +22 -6
  112. package/dist/knowledge/muse.js.map +1 -1
  113. package/dist/knowledge/overrides.d.ts +7 -0
  114. package/dist/knowledge/overrides.d.ts.map +1 -1
  115. package/dist/knowledge/overrides.js +76 -0
  116. package/dist/knowledge/overrides.js.map +1 -1
  117. package/dist/knowledge/pi.d.ts.map +1 -1
  118. package/dist/knowledge/pi.js +25 -3
  119. package/dist/knowledge/pi.js.map +1 -1
  120. package/package.json +5 -2
  121. package/src/cli/args.ts +381 -0
  122. package/src/cli/check.ts +136 -0
  123. package/src/cli/exit-codes.ts +13 -0
  124. package/src/cli/help.ts +114 -0
  125. package/src/cli/index.ts +177 -0
  126. package/src/cli/inspect.ts +174 -0
  127. package/src/cli/ls.ts +14 -0
  128. package/src/cli/render.ts +62 -0
  129. package/src/cli/resolve-harness.ts +33 -0
  130. package/src/cli/run.ts +280 -0
  131. package/src/cli/session.ts +137 -0
  132. package/src/cli/version.ts +32 -0
  133. package/src/execution/decode.ts +32 -0
  134. package/src/execution/deps.ts +7 -1
  135. package/src/execution/events.ts +9 -2
  136. package/src/execution/failure.ts +159 -0
  137. package/src/execution/node-deps.ts +17 -0
  138. package/src/execution/stream-turn.ts +189 -17
  139. package/src/interpretation/argv.ts +85 -27
  140. package/src/interpretation/dimensions.ts +0 -6
  141. package/src/interpretation/limits.ts +97 -6
  142. package/src/interpretation/refusal.ts +116 -0
  143. package/src/interpretation/turn-options.ts +424 -0
  144. package/src/interpretation/vocabulary.ts +1 -1
  145. package/src/knowledge/claude-code.ts +35 -13
  146. package/src/knowledge/codex.ts +25 -14
  147. package/src/knowledge/descriptor.ts +138 -12
  148. package/src/knowledge/matchers.ts +22 -9
  149. package/src/knowledge/muse.ts +22 -6
  150. package/src/knowledge/overrides.ts +97 -0
  151. package/src/knowledge/pi.ts +25 -3
@@ -0,0 +1,110 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { versionStatus } from "../interpretation/versions.js";
3
+ import { defaultDescriptors } from "../knowledge/overrides.js";
4
+ const npmLatest = async (pkg) => {
5
+ try {
6
+ const res = await fetch(`https://registry.npmjs.org/${pkg}`, {
7
+ headers: { accept: "application/vnd.npm.install-v1+json" },
8
+ signal: AbortSignal.timeout(10_000),
9
+ });
10
+ if (!res.ok)
11
+ return null;
12
+ const body = (await res.json());
13
+ const latest = body["dist-tags"]?.latest;
14
+ return typeof latest === "string" ? latest : null;
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ };
20
+ const installedVersion = (bin) => {
21
+ try {
22
+ const out = execFileSync(bin, ["--version"], { encoding: "utf8", timeout: 10_000 });
23
+ const match = out.match(/\d+\.\d+\.\d+(?:[.+-][0-9A-Za-z.-]+)?/);
24
+ return match ? match[0] : null;
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ };
30
+ const resolveLatest = async (h) => {
31
+ if (h.versionSource.kind === "npm") {
32
+ return {
33
+ latest: await npmLatest(h.versionSource.package),
34
+ source: `npm:${h.versionSource.package}`,
35
+ };
36
+ }
37
+ return { latest: installedVersion(h.bin), source: `installed:${h.bin}` };
38
+ };
39
+ export const check = async (rawArgs) => {
40
+ const wantJson = rawArgs.includes("--json");
41
+ const wantHelp = rawArgs.includes("--help") || rawArgs.includes("-h");
42
+ if (wantHelp) {
43
+ const { CHECK_HELP } = await import("./help.js");
44
+ process.stdout.write(CHECK_HELP);
45
+ return;
46
+ }
47
+ const descriptors = Object.values(defaultDescriptors()).filter((d) => d !== undefined);
48
+ const rows = await Promise.all(descriptors.map(async (h) => {
49
+ const { latest, source } = await resolveLatest(h);
50
+ return {
51
+ harness: h.name,
52
+ bin: h.bin,
53
+ verifiedAgainst: h.verifiedAgainst,
54
+ latest,
55
+ source,
56
+ status: versionStatus(h.verifiedAgainst, latest),
57
+ };
58
+ }));
59
+ const behind = rows.filter((r) => r.status === "behind");
60
+ const unknown = rows.filter((r) => r.status === "unknown");
61
+ if (wantJson) {
62
+ process.stdout.write(`${JSON.stringify({ checkedAt: new Date().toISOString(), rows, behind: behind.map((r) => r.harness) }, null, 2)}\n`);
63
+ }
64
+ else {
65
+ const mark = (s) => s === "ok" ? "✓ ok" : s === "behind" ? "⬆ NEW" : s === "ahead" ? "? ahead" : "– unknown";
66
+ process.stdout.write(`\n${"harness".padEnd(9)}${"verified".padEnd(12)}${"latest".padEnd(12)}status\n`);
67
+ for (const r of rows) {
68
+ process.stdout.write(`${r.harness.padEnd(9)}${r.verifiedAgainst.padEnd(12)}${(r.latest ?? "?").padEnd(12)}${mark(r.status)}\n`);
69
+ }
70
+ if (behind.length > 0) {
71
+ process.stdout.write(`\n${behind.length} harness(es) behind: ${behind.map((r) => `${r.harness} ${r.verifiedAgainst}→${r.latest}`).join(", ")}\n`);
72
+ process.stdout.write("Run the local capability tripwires (smoke:seven) against the new version, then file an issue + bump verifiedAgainst.\n");
73
+ }
74
+ else if (unknown.length > 0) {
75
+ process.stdout.write(`\n${unknown.length} harness(es) unknown (network or missing bin)\n`);
76
+ }
77
+ else {
78
+ process.stdout.write("\nall descriptors current with their published versions.\n");
79
+ }
80
+ }
81
+ // Exit logic: behind => 1, unknown (network failure) => 1 with partial results, else 0
82
+ // But we must not exit 1 for unknown if behind already counts? We'll handle:
83
+ if (behind.length > 0) {
84
+ process.exitCode = 1;
85
+ }
86
+ else if (unknown.length > 0 && rows.some((r) => r.latest === null)) {
87
+ // network failure at least one
88
+ // Per spec: network failure prints warning and exits 1 with partial results
89
+ // We'll check if any latest is null and that we attempted npm fetch (could be network)
90
+ // Simpler: if unknown and not all ok, exit 1
91
+ // But spec says check should reuse versions.ts and not crash; exit 1 with partial results
92
+ // We'll exit 1 if any harness has unknown and at least one npm source failed - but we can't distinguish installed missing vs network.
93
+ // For now, exit 1 if unknown.length >0 and at least one behind==0? Actually spec says network failure => exit 1.
94
+ // We'll exit 1 if unknown includes npm harnesses (they shouldn't be unknown without network).
95
+ const npmUnknown = rows.filter((r) => r.source.startsWith("npm:") && r.status === "unknown");
96
+ if (npmUnknown.length > 0)
97
+ process.exitCode = 1;
98
+ else if (behind.length === 0 && unknown.length > 0) {
99
+ // installed unknown (muse missing) is not necessarily failure? But spec says network failure case is 1.
100
+ // For installed missing, we treat as unknown but not failure - keep 0 to not break CI where muse not installed.
101
+ // However spec says check prints partial results and exits 1 on network failure.
102
+ // We'll only exit 1 for npmUnknown, otherwise 0.
103
+ process.exitCode = 0;
104
+ }
105
+ }
106
+ else {
107
+ process.exitCode = 0;
108
+ }
109
+ };
110
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/cli/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ExitCause } from "../execution/events.js";
2
+ export declare const EXIT_CLEAN = 0;
3
+ export declare const EXIT_REFUSAL = 2;
4
+ export declare const EXIT_FAILURE = 1;
5
+ export declare const exitCodeForCause: (cause: ExitCause) => number;
6
+ export declare const exitCodeForRefusal: () => number;
7
+ //# sourceMappingURL=exit-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/cli/exit-codes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,YAAY,IAAI,CAAC;AAE9B,eAAO,MAAM,gBAAgB,UAAW,SAAS,KAAG,MAInD,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,MAAsB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export const EXIT_CLEAN = 0;
2
+ export const EXIT_REFUSAL = 2;
3
+ export const EXIT_FAILURE = 1;
4
+ export const exitCodeForCause = (cause) => {
5
+ if (cause === "clean")
6
+ return EXIT_CLEAN;
7
+ // All non-clean causes are failures that should be exit 1, except refusal is already handled separately
8
+ return EXIT_FAILURE;
9
+ };
10
+ export const exitCodeForRefusal = () => EXIT_REFUSAL;
11
+ //# sourceMappingURL=exit-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/cli/exit-codes.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAC5B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAE9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAgB,EAAU,EAAE;IAC3D,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,UAAU,CAAC;IACzC,wGAAwG;IACxG,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAW,EAAE,CAAC,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const TOP_LEVEL_HELP = "hcn - One stable interface to four coding-agent CLIs\n\nUsage: hcn <command> [options] [prompt]\n\nCommands:\n run <harness> [prompt] One-shot headless turn (streamTurn)\n session <harness> Interactive session (openSession, Claude-only)\n inspect <harness> Descriptor / argv / capability inspection (no spawn)\n ls List harnesses with verifiedAgainst versions\n check Drift check (published version vs verifiedAgainst)\n\nOptions:\n -h, --help Show help\n -V, --version Show version\n\nRun 'hcn <command> --help' for command-specific help.\n";
2
+ export declare const RUN_HELP = "hcn run - One-shot headless turn\n\nUsage: hcn run <harness> [prompt] [options]\n\nArguments:\n <harness> claude | codex | pi | muse\n [prompt] Prompt text (positional). Must not start with '-'.\n Use --prompt or --prompt-file for leading '-' or multi-line.\n\nOptions:\n --prompt <text> Prompt text (alternative to positional)\n --prompt-file <path|-> Read prompt from file, or stdin when '-'\n --model <id> Model id (validated per harness)\n --effort <value> Effort level (validated per harness/model)\n --sandbox <value> Sandbox mode (codex only)\n --provider <value> Provider (pi only)\n --tools <a,b> Tool grants (claude only, comma-separated)\n --autonomy Enable autonomy flag (claude/codex/muse)\n --no-autonomy Disable autonomy\n --write Enable write (muse)\n --no-write Disable write\n --shell Enable shell (muse)\n --no-shell Disable shell\n --max-steps <n> Max steps (muse, 1-10000)\n --no-tools Disable tools discovery facet\n --no-instruction-files Disable instructionFiles discovery facet\n --no-extensions Disable extensions discovery facet\n --no-skills Disable skills discovery facet\n --cwd <path> Working directory for spawn\n --env KEY=VAL Environment (repeatable; KEY= deletes)\n --resume <uuid> Resume session id (UUID)\n --json NDJSON HarnessEvent to stdout\n -h, --help Show help\n -V, --version Show version\n";
3
+ export declare const SESSION_HELP = "hcn session - Interactive session (Claude-only)\n\nUsage: hcn session <harness> [options]\n\nArguments:\n <harness> Must be 'claude' (other harnesses have no sessionMode)\n\nOptions:\n --model <id> Model for the session\n --session-id <uuid> Session id (UUID, else random)\n --cwd <path> Working directory\n --help Show help\n --version Show version\n";
4
+ export declare const INSPECT_HELP = "hcn inspect - Descriptor / argv inspection\n\nUsage: hcn inspect <harness> [options]\n\nArguments:\n <harness> claude | codex | pi | muse\n\nOptions:\n --argv Preview argv that would be spawned\n --prompt <text> Prompt for argv preview\n --prompt-file <path|-> Read prompt from file\n --model <id> Model\n --effort <value> Effort\n --sandbox <value> Sandbox\n --provider <value> Provider\n --tools <a,b> Tools\n --autonomy / --no-autonomy\n --write / --no-write\n --shell / --no-shell\n --max-steps <n>\n --no-tools, --no-instruction-files, --no-extensions, --no-skills\n --cwd <path>\n --env KEY=VAL\n --resume <uuid>\n -h, --help Show help\n";
5
+ export declare const LS_HELP = "hcn ls - List harnesses\n\nUsage: hcn ls\n\nPrints each harness name with its verifiedAgainst version and versionSource.\n";
6
+ export declare const CHECK_HELP = "hcn check - Drift check\n\nUsage: hcn check [--json]\n\nCompares each harness's verifiedAgainst against the latest published version.\nExits 0 when no drift, 1 when drift found, 1 on network failure with partial results.\n\nOptions:\n --json Machine-readable output\n -h, --help Show help\n";
7
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,koBAgB1B,CAAC;AAEF,eAAO,MAAM,QAAQ,irDAkCpB,CAAC;AAEF,eAAO,MAAM,YAAY,6bAaxB,CAAC;AAEF,eAAO,MAAM,YAAY,0wBAyBxB,CAAC;AAEF,eAAO,MAAM,OAAO,+HAKnB,CAAC;AAEF,eAAO,MAAM,UAAU,2UAUtB,CAAC"}
@@ -0,0 +1,110 @@
1
+ export const TOP_LEVEL_HELP = `hcn - One stable interface to four coding-agent CLIs
2
+
3
+ Usage: hcn <command> [options] [prompt]
4
+
5
+ Commands:
6
+ run <harness> [prompt] One-shot headless turn (streamTurn)
7
+ session <harness> Interactive session (openSession, Claude-only)
8
+ inspect <harness> Descriptor / argv / capability inspection (no spawn)
9
+ ls List harnesses with verifiedAgainst versions
10
+ check Drift check (published version vs verifiedAgainst)
11
+
12
+ Options:
13
+ -h, --help Show help
14
+ -V, --version Show version
15
+
16
+ Run 'hcn <command> --help' for command-specific help.
17
+ `;
18
+ export const RUN_HELP = `hcn run - One-shot headless turn
19
+
20
+ Usage: hcn run <harness> [prompt] [options]
21
+
22
+ Arguments:
23
+ <harness> claude | codex | pi | muse
24
+ [prompt] Prompt text (positional). Must not start with '-'.
25
+ Use --prompt or --prompt-file for leading '-' or multi-line.
26
+
27
+ Options:
28
+ --prompt <text> Prompt text (alternative to positional)
29
+ --prompt-file <path|-> Read prompt from file, or stdin when '-'
30
+ --model <id> Model id (validated per harness)
31
+ --effort <value> Effort level (validated per harness/model)
32
+ --sandbox <value> Sandbox mode (codex only)
33
+ --provider <value> Provider (pi only)
34
+ --tools <a,b> Tool grants (claude only, comma-separated)
35
+ --autonomy Enable autonomy flag (claude/codex/muse)
36
+ --no-autonomy Disable autonomy
37
+ --write Enable write (muse)
38
+ --no-write Disable write
39
+ --shell Enable shell (muse)
40
+ --no-shell Disable shell
41
+ --max-steps <n> Max steps (muse, 1-10000)
42
+ --no-tools Disable tools discovery facet
43
+ --no-instruction-files Disable instructionFiles discovery facet
44
+ --no-extensions Disable extensions discovery facet
45
+ --no-skills Disable skills discovery facet
46
+ --cwd <path> Working directory for spawn
47
+ --env KEY=VAL Environment (repeatable; KEY= deletes)
48
+ --resume <uuid> Resume session id (UUID)
49
+ --json NDJSON HarnessEvent to stdout
50
+ -h, --help Show help
51
+ -V, --version Show version
52
+ `;
53
+ export const SESSION_HELP = `hcn session - Interactive session (Claude-only)
54
+
55
+ Usage: hcn session <harness> [options]
56
+
57
+ Arguments:
58
+ <harness> Must be 'claude' (other harnesses have no sessionMode)
59
+
60
+ Options:
61
+ --model <id> Model for the session
62
+ --session-id <uuid> Session id (UUID, else random)
63
+ --cwd <path> Working directory
64
+ --help Show help
65
+ --version Show version
66
+ `;
67
+ export const INSPECT_HELP = `hcn inspect - Descriptor / argv inspection
68
+
69
+ Usage: hcn inspect <harness> [options]
70
+
71
+ Arguments:
72
+ <harness> claude | codex | pi | muse
73
+
74
+ Options:
75
+ --argv Preview argv that would be spawned
76
+ --prompt <text> Prompt for argv preview
77
+ --prompt-file <path|-> Read prompt from file
78
+ --model <id> Model
79
+ --effort <value> Effort
80
+ --sandbox <value> Sandbox
81
+ --provider <value> Provider
82
+ --tools <a,b> Tools
83
+ --autonomy / --no-autonomy
84
+ --write / --no-write
85
+ --shell / --no-shell
86
+ --max-steps <n>
87
+ --no-tools, --no-instruction-files, --no-extensions, --no-skills
88
+ --cwd <path>
89
+ --env KEY=VAL
90
+ --resume <uuid>
91
+ -h, --help Show help
92
+ `;
93
+ export const LS_HELP = `hcn ls - List harnesses
94
+
95
+ Usage: hcn ls
96
+
97
+ Prints each harness name with its verifiedAgainst version and versionSource.
98
+ `;
99
+ export const CHECK_HELP = `hcn check - Drift check
100
+
101
+ Usage: hcn check [--json]
102
+
103
+ Compares each harness's verifiedAgainst against the latest published version.
104
+ Exits 0 when no drift, 1 when drift found, 1 on network failure with partial results.
105
+
106
+ Options:
107
+ --json Machine-readable output
108
+ -h, --help Show help
109
+ `;
110
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;CAgB7B,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCvB,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;CAa3B,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyB3B,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG;;;;;CAKtB,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;CAUzB,CAAC"}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ export declare const failUnknownHarness: (name: string) => never;
3
+ export declare const dispatch: (raw: string[]) => Promise<void>;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAwBA,eAAO,MAAM,kBAAkB,SAAU,MAAM,KAAG,KAQjD,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAe,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CAyH1D,CAAC"}
@@ -0,0 +1,170 @@
1
+ #!/usr/bin/env node
2
+ import { TOP_LEVEL_HELP } from "./help.js";
3
+ import { getVersion } from "./version.js";
4
+ const SUPPORTED = ["claude", "codex", "pi", "muse"];
5
+ // Prevent EPIPE crashes when piped to head/grep -q (e.g., hcn ls | head, hcn run --json | head)
6
+ process.stdout.on("error", (err) => {
7
+ const code = err.code;
8
+ if (code === "EPIPE")
9
+ process.exit(0);
10
+ });
11
+ process.stderr.on("error", (err) => {
12
+ const code = err.code;
13
+ if (code === "EPIPE")
14
+ process.exit(0);
15
+ });
16
+ const printVersion = () => {
17
+ process.stdout.write(`${getVersion()}\n`);
18
+ };
19
+ const printTopHelp = () => {
20
+ process.stdout.write(TOP_LEVEL_HELP);
21
+ };
22
+ export const failUnknownHarness = (name) => {
23
+ process.stderr.write(`unknown harness ${JSON.stringify(name)}; supported: ${SUPPORTED.join(", ")}\n`);
24
+ process.stderr.write(`supported: ${SUPPORTED.join(", ")}\n`);
25
+ process.exitCode = 2;
26
+ // Use process.exit to ensure exit code is set even if async
27
+ process.exit(2);
28
+ };
29
+ export const dispatch = async (raw) => {
30
+ // Shared dispatch for programmatic use (tests) - mirrors main but takes argv slice
31
+ // Global --help / --version without command
32
+ if (raw.length === 0 || raw[0] === "--help" || raw[0] === "-h") {
33
+ if (raw.includes("--version") || raw.includes("-V")) {
34
+ printVersion();
35
+ return;
36
+ }
37
+ printTopHelp();
38
+ return;
39
+ }
40
+ if (raw[0] === "--version" || raw[0] === "-V") {
41
+ printVersion();
42
+ return;
43
+ }
44
+ const cmd = raw[0];
45
+ switch (cmd) {
46
+ case "ls": {
47
+ if (raw.includes("--help") || raw.includes("-h")) {
48
+ const { LS_HELP } = await import("./help.js");
49
+ process.stdout.write(LS_HELP);
50
+ return;
51
+ }
52
+ if (raw.includes("--version") || raw.includes("-V")) {
53
+ printVersion();
54
+ return;
55
+ }
56
+ if (raw.length > 1) {
57
+ const extra = raw.slice(1);
58
+ const hasUnknown = extra.some((a) => a.startsWith("-"));
59
+ if (hasUnknown) {
60
+ process.stderr.write(`unknown flag for ls: ${extra.join(" ")}\n`);
61
+ process.exitCode = 2;
62
+ return;
63
+ }
64
+ }
65
+ const { ls } = await import("./ls.js");
66
+ ls();
67
+ return;
68
+ }
69
+ case "check": {
70
+ const { check } = await import("./check.js");
71
+ await check(raw.slice(1));
72
+ return;
73
+ }
74
+ case "inspect": {
75
+ if (raw.slice(1).includes("--help") || raw.slice(1).includes("-h")) {
76
+ const { INSPECT_HELP } = await import("./help.js");
77
+ process.stdout.write(INSPECT_HELP);
78
+ return;
79
+ }
80
+ const harness = raw[1];
81
+ if (!harness || harness.startsWith("-")) {
82
+ process.stderr.write(`inspect requires <harness>; supported: ${SUPPORTED.join(", ")}\n`);
83
+ process.exitCode = 2;
84
+ return;
85
+ }
86
+ if (!SUPPORTED.includes(harness))
87
+ failUnknownHarness(harness);
88
+ const { inspect } = await import("./inspect.js");
89
+ await inspect(harness, raw.slice(2));
90
+ return;
91
+ }
92
+ case "run": {
93
+ if (raw.slice(1).includes("--help") || raw.slice(1).includes("-h")) {
94
+ const { RUN_HELP } = await import("./help.js");
95
+ process.stdout.write(RUN_HELP);
96
+ return;
97
+ }
98
+ if (raw.slice(1).includes("--version") || raw.slice(1).includes("-V")) {
99
+ printVersion();
100
+ return;
101
+ }
102
+ const harness = raw[1];
103
+ if (!harness || harness.startsWith("-")) {
104
+ process.stderr.write(`run requires <harness>; supported: ${SUPPORTED.join(", ")}\n`);
105
+ process.exitCode = 2;
106
+ return;
107
+ }
108
+ if (!SUPPORTED.includes(harness))
109
+ failUnknownHarness(harness);
110
+ const { run } = await import("./run.js");
111
+ await run(harness, raw.slice(2));
112
+ return;
113
+ }
114
+ case "session": {
115
+ if (raw.slice(1).includes("--help") || raw.slice(1).includes("-h")) {
116
+ const { SESSION_HELP } = await import("./help.js");
117
+ process.stdout.write(SESSION_HELP);
118
+ return;
119
+ }
120
+ const harness = raw[1];
121
+ if (!harness || harness.startsWith("-")) {
122
+ process.stderr.write(`session requires <harness>; supported: ${SUPPORTED.join(", ")}\n`);
123
+ process.exitCode = 2;
124
+ return;
125
+ }
126
+ if (!SUPPORTED.includes(harness))
127
+ failUnknownHarness(harness);
128
+ const { session } = await import("./session.js");
129
+ await session(harness, raw.slice(2));
130
+ return;
131
+ }
132
+ case "help":
133
+ case "--help":
134
+ case "-h": {
135
+ printTopHelp();
136
+ return;
137
+ }
138
+ default: {
139
+ if (SUPPORTED.includes(cmd)) {
140
+ process.stderr.write(`missing command; did you mean 'hcn run ${cmd} <prompt>'?\n`);
141
+ process.stderr.write(TOP_LEVEL_HELP);
142
+ process.exitCode = 2;
143
+ return;
144
+ }
145
+ process.stderr.write(`unknown command ${JSON.stringify(cmd)}\n`);
146
+ process.stderr.write(TOP_LEVEL_HELP);
147
+ process.exitCode = 2;
148
+ return;
149
+ }
150
+ }
151
+ };
152
+ const main = async () => {
153
+ await dispatch(process.argv.slice(2));
154
+ };
155
+ const shouldAutoRun = (() => {
156
+ const entry = process.argv[1] ?? "";
157
+ return (entry.endsWith("cli.js") || entry.endsWith("cli/index.js") || entry.endsWith("src/cli/index.ts"));
158
+ })();
159
+ if (shouldAutoRun) {
160
+ main().catch((err) => {
161
+ const message = err instanceof Error ? err.message : String(err);
162
+ process.stderr.write(`fatal: ${message}\n`);
163
+ if (err instanceof Error && err.stack)
164
+ process.stderr.write(`${err.stack}\n`);
165
+ process.exitCode = 1;
166
+ if (process.exitCode === 0)
167
+ process.exitCode = 1;
168
+ });
169
+ }
170
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const inspect: (harnessName: string, rawArgs: string[]) => Promise<void>;
2
+ export declare const inspectCommand: typeof inspect;
3
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../src/cli/inspect.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,OAAO,gBAAuB,MAAM,WAAW,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CAqKlF,CAAC;AAEF,eAAO,MAAM,cAAc,gBAAU,CAAC"}
@@ -0,0 +1,170 @@
1
+ import { redactArgv } from "../execution/stream-turn.js";
2
+ import { buildLaunchArgv } from "../interpretation/argv.js";
3
+ import { ArgvRefusalError } from "../interpretation/refusal.js";
4
+ import { parseTurnOptions, resolvePromptAsync } from "./args.js";
5
+ import { resolveHarness } from "./resolve-harness.js";
6
+ export const inspect = async (harnessName, rawArgs) => {
7
+ const h = resolveHarness(harnessName);
8
+ // Check for --help
9
+ if (rawArgs.includes("--help") || rawArgs.includes("-h")) {
10
+ const { INSPECT_HELP } = await import("./help.js");
11
+ process.stdout.write(INSPECT_HELP);
12
+ return;
13
+ }
14
+ // Check for positional prompt injection before parse (only when --argv and no explicit prompt)
15
+ const { parseCommonFlags, detectPositionalPromptInjection } = await import("./args.js");
16
+ if (rawArgs.includes("--argv")) {
17
+ const injection = detectPositionalPromptInjection(rawArgs.filter((a) => a !== "--argv"));
18
+ if (injection) {
19
+ const err = new ArgvRefusalError({
20
+ issue: "prompt-flag-injection",
21
+ harness: h.name,
22
+ supported: ["prompt must not start with '-'"],
23
+ detail: `it would be parsed as a flag by ${h.bin}`,
24
+ });
25
+ process.stderr.write(`${err.message}\n`);
26
+ process.stderr.write(`supported: prompt must not start with '-'\n`);
27
+ process.exitCode = 2;
28
+ return;
29
+ }
30
+ }
31
+ // Parse flags for inspect
32
+ let parsed;
33
+ try {
34
+ parsed = parseCommonFlags(rawArgs);
35
+ }
36
+ catch (err) {
37
+ const message = err instanceof Error ? err.message : String(err);
38
+ process.stderr.write(`unknown flag: ${message}\n`);
39
+ process.stderr.write(`Run 'hcn inspect --help' for usage.\n`);
40
+ process.exitCode = 2;
41
+ return;
42
+ }
43
+ const values = parsed.values;
44
+ const wantArgv = values.argv === true;
45
+ if (!wantArgv) {
46
+ // Pure descriptor dump
47
+ const out = {
48
+ name: h.name,
49
+ bin: h.bin,
50
+ verifiedAgainst: h.verifiedAgainst,
51
+ versionSource: h.versionSource,
52
+ launch: {
53
+ baseFlags: h.launch.baseFlags,
54
+ subcommands: h.launch.subcommands,
55
+ streamFlags: h.launch.streamFlags,
56
+ promptStyle: h.launch.promptStyle,
57
+ toolsFlag: h.launch.toolsFlag,
58
+ idFlag: h.launch.idFlag,
59
+ },
60
+ resume: h.resume,
61
+ sessionMode: h.sessionMode,
62
+ vocabulary: {
63
+ models: h.vocabulary.models,
64
+ aliases: h.vocabulary.aliases,
65
+ efforts: h.vocabulary.efforts,
66
+ effortsByModel: h.vocabulary.effortsByModel,
67
+ extensible: h.vocabulary.extensible,
68
+ modelFlag: h.vocabulary.modelFlag,
69
+ },
70
+ turnOptions: h.turnOptions,
71
+ };
72
+ process.stdout.write(`${JSON.stringify(out, null, 2)}\n`);
73
+ return;
74
+ }
75
+ // --argv preview path: need prompt + turn options
76
+ const positional = parsed.positionals;
77
+ // positional[0] would be harness already consumed, but we passed rawArgs without harness - check: caller passes remaining after harness
78
+ // So positionals are potential prompt positional if not using --prompt
79
+ const positionalPrompt = positional.length > 0 ? positional[0] : undefined;
80
+ if (positional.length > 1) {
81
+ process.stderr.write(`too many positionals for inspect --argv\n`);
82
+ process.exitCode = 2;
83
+ return;
84
+ }
85
+ let prompt;
86
+ let promptSource;
87
+ try {
88
+ const resolved = await resolvePromptAsync({
89
+ positionalPrompt,
90
+ promptFlag: values.prompt,
91
+ promptFile: values["prompt-file"],
92
+ });
93
+ prompt = resolved.prompt;
94
+ promptSource = resolved.source;
95
+ }
96
+ catch (err) {
97
+ if (err instanceof ArgvRefusalError) {
98
+ process.stderr.write(`${err.message}\n`);
99
+ if (err.supported.length)
100
+ process.stderr.write(`supported: ${err.supported.join(", ")}\n`);
101
+ process.exitCode = 2;
102
+ return;
103
+ }
104
+ throw err;
105
+ }
106
+ // Build TurnOptions from flags
107
+ let turnOpts;
108
+ try {
109
+ turnOpts = parseTurnOptions(values);
110
+ }
111
+ catch (err) {
112
+ if (err instanceof ArgvRefusalError) {
113
+ process.stderr.write(`${err.message}\n`);
114
+ if (err.supported.length)
115
+ process.stderr.write(`supported: ${err.supported.join(", ")}\n`);
116
+ process.exitCode = 2;
117
+ return;
118
+ }
119
+ throw err;
120
+ }
121
+ const fullOpts = {
122
+ ...turnOpts,
123
+ prompt,
124
+ ...(promptSource !== "positional" ? { __explicitPrompt: true } : {}),
125
+ };
126
+ let argv;
127
+ try {
128
+ argv = buildLaunchArgv(h, fullOpts);
129
+ }
130
+ catch (err) {
131
+ if (err instanceof ArgvRefusalError) {
132
+ process.stderr.write(`${err.message}\n`);
133
+ if (err.supported.length)
134
+ process.stderr.write(`supported: ${err.supported.join(", ")}\n`);
135
+ process.exitCode = 2;
136
+ return;
137
+ }
138
+ throw err;
139
+ }
140
+ // Redact prompt for display, but keep structure
141
+ const redacted = redactArgv(argv, prompt);
142
+ // Also handle --resume case: need to use buildResumeArgv if resume present
143
+ if (values.resume !== undefined || values["session-id"] !== undefined) {
144
+ // For inspect --argv with --resume, show resume argv
145
+ const { buildResumeArgv } = await import("../interpretation/argv.js");
146
+ const resumeId = String(values.resume ?? values["session-id"]);
147
+ try {
148
+ const resumeOpts = { ...fullOpts, sessionId: resumeId };
149
+ const resumeArgv = buildResumeArgv(h, resumeOpts);
150
+ const redactedResume = redactArgv(resumeArgv, prompt);
151
+ process.stdout.write(`${JSON.stringify(redactedResume)}\n`);
152
+ process.stderr.write(`argv: ${redactedResume.join(" ")}\n`);
153
+ return;
154
+ }
155
+ catch (err) {
156
+ if (err instanceof ArgvRefusalError) {
157
+ process.stderr.write(`${err.message}\n`);
158
+ if (err.supported.length)
159
+ process.stderr.write(`supported: ${err.supported.join(", ")}\n`);
160
+ process.exitCode = 2;
161
+ return;
162
+ }
163
+ throw err;
164
+ }
165
+ }
166
+ process.stdout.write(`${JSON.stringify(redacted)}\n`);
167
+ process.stderr.write(`argv: ${redacted.join(" ")}\n`);
168
+ };
169
+ export const inspectCommand = inspect;
170
+ //# sourceMappingURL=inspect.js.map