@dungle-scrubs/harness-cli-normalizer 0.1.3 → 0.3.1

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 (154) hide show
  1. package/README.md +156 -13
  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 +6 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +186 -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 +3 -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 +5 -1
  67. package/dist/execution/stream-turn.d.ts.map +1 -1
  68. package/dist/execution/stream-turn.js +188 -24
  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/store.js +1 -1
  87. package/dist/interpretation/turn-options.d.ts +18 -0
  88. package/dist/interpretation/turn-options.d.ts.map +1 -0
  89. package/dist/interpretation/turn-options.js +417 -0
  90. package/dist/interpretation/turn-options.js.map +1 -0
  91. package/dist/interpretation/vocabulary.d.ts +5 -0
  92. package/dist/interpretation/vocabulary.d.ts.map +1 -1
  93. package/dist/interpretation/vocabulary.js +1 -1
  94. package/dist/interpretation/vocabulary.js.map +1 -1
  95. package/dist/knowledge/claude-code.d.ts +13 -1
  96. package/dist/knowledge/claude-code.d.ts.map +1 -1
  97. package/dist/knowledge/claude-code.js +35 -13
  98. package/dist/knowledge/claude-code.js.map +1 -1
  99. package/dist/knowledge/codex.d.ts.map +1 -1
  100. package/dist/knowledge/codex.js +25 -14
  101. package/dist/knowledge/codex.js.map +1 -1
  102. package/dist/knowledge/descriptor.d.ts +118 -14
  103. package/dist/knowledge/descriptor.d.ts.map +1 -1
  104. package/dist/knowledge/descriptor.js +58 -0
  105. package/dist/knowledge/descriptor.js.map +1 -1
  106. package/dist/knowledge/matchers.d.ts +3 -3
  107. package/dist/knowledge/matchers.d.ts.map +1 -1
  108. package/dist/knowledge/matchers.js +19 -6
  109. package/dist/knowledge/matchers.js.map +1 -1
  110. package/dist/knowledge/muse.d.ts +2 -2
  111. package/dist/knowledge/muse.d.ts.map +1 -1
  112. package/dist/knowledge/muse.js +25 -6
  113. package/dist/knowledge/muse.js.map +1 -1
  114. package/dist/knowledge/overrides.d.ts +7 -0
  115. package/dist/knowledge/overrides.d.ts.map +1 -1
  116. package/dist/knowledge/overrides.js +76 -0
  117. package/dist/knowledge/overrides.js.map +1 -1
  118. package/dist/knowledge/pi.d.ts +1 -1
  119. package/dist/knowledge/pi.d.ts.map +1 -1
  120. package/dist/knowledge/pi.js +33 -9
  121. package/dist/knowledge/pi.js.map +1 -1
  122. package/package.json +5 -2
  123. package/src/cli/args.ts +381 -0
  124. package/src/cli/check.ts +136 -0
  125. package/src/cli/exit-codes.ts +13 -0
  126. package/src/cli/help.ts +114 -0
  127. package/src/cli/index.ts +190 -0
  128. package/src/cli/inspect.ts +174 -0
  129. package/src/cli/ls.ts +14 -0
  130. package/src/cli/render.ts +62 -0
  131. package/src/cli/resolve-harness.ts +33 -0
  132. package/src/cli/run.ts +280 -0
  133. package/src/cli/session.ts +137 -0
  134. package/src/cli/version.ts +32 -0
  135. package/src/execution/decode.ts +32 -0
  136. package/src/execution/deps.ts +7 -1
  137. package/src/execution/events.ts +9 -2
  138. package/src/execution/failure.ts +159 -0
  139. package/src/execution/node-deps.ts +17 -0
  140. package/src/execution/stream-turn.ts +192 -21
  141. package/src/interpretation/argv.ts +85 -27
  142. package/src/interpretation/dimensions.ts +0 -6
  143. package/src/interpretation/limits.ts +97 -6
  144. package/src/interpretation/refusal.ts +116 -0
  145. package/src/interpretation/store.ts +1 -1
  146. package/src/interpretation/turn-options.ts +424 -0
  147. package/src/interpretation/vocabulary.ts +1 -1
  148. package/src/knowledge/claude-code.ts +35 -13
  149. package/src/knowledge/codex.ts +25 -14
  150. package/src/knowledge/descriptor.ts +138 -12
  151. package/src/knowledge/matchers.ts +22 -9
  152. package/src/knowledge/muse.ts +25 -6
  153. package/src/knowledge/overrides.ts +97 -0
  154. package/src/knowledge/pi.ts +33 -9
package/README.md CHANGED
@@ -1,12 +1,11 @@
1
1
  # harness-cli-normalizer
2
2
 
3
- One stable interface to four coding-agent CLIs that survives their updates.
3
+ One stable interface to four coding-agent CLIs.
4
4
 
5
5
  [![CI](https://github.com/dungle-scrubs/harness-cli-normalizer/actions/workflows/ci.yml/badge.svg)](https://github.com/dungle-scrubs/harness-cli-normalizer/actions/workflows/ci.yml) [![npm](https://img.shields.io/npm/v/@dungle-scrubs/harness-cli-normalizer.svg)](https://www.npmjs.com/package/@dungle-scrubs/harness-cli-normalizer) [![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
6
6
 
7
- harness-cli-normalizer describes each of four coding-agent CLIs (Claude Code, Codex, pi, and Muse) as pure data and normalizes their headless output into a single `HarnessEvent` stream. You write one consumer against that surface instead of a bespoke spawn-and-parse path for each agent. A separate execution layer drives any of them as a child process and emits the events. Today most teams hold these agents together by hand, one parser per CLI, and redo the work whenever an agent ships a new version.
8
-
9
- You reach for this when you are building on top of more than one coding agent: an orchestrator, an observer, a benchmark rig, or a way to switch which agent does a job. Each descriptor is pinned to the CLI version its facts were verified against, and a weekly check flags when a harness has shipped ahead of its descriptor. You learn drift is possible from a check, not from a crash.
7
+ <!-- D-001 -->
8
+ harness-cli-normalizer describes Claude Code, Codex, pi, and Muse as pure data and normalizes their headless output to a single `HarnessEvent` stream. You build one consumer against that stream instead of a separate spawn-and-parse path per CLI - the execution layer spawns the harness and emits the events. Use it for multi-agent work like an orchestrator, observer, benchmark rig, or to swap agents. Descriptors are pinned to their verified CLI version and a weekly check flags when a harness has moved ahead (npm harnesses via registry; `muse` via local `muse --version`, skipped in CI where not installed - see Version-pinning and drift).
10
9
 
11
10
  ```bash
12
11
  pnpm add @dungle-scrubs/harness-cli-normalizer
@@ -23,7 +22,75 @@ pnpm add @dungle-scrubs/harness-cli-normalizer
23
22
  The repository uses pnpm and Bun for development and its dual-runtime test lane. Consumers do not
24
23
  need either one unless their application runs on Bun.
25
24
 
26
- ## Use it
25
+ ## CLI
26
+
27
+ The package ships a `hcn` binary for shell and CI use. This is the primary interface - use it for one-off turns, sessions, and inspection without writing TypeScript. Install it with your package manager or run it ad-hoc with `npx`:
28
+
29
+ ```bash
30
+ pnpm add @dungle-scrubs/harness-cli-normalizer
31
+ npx hcn --help
32
+ npm install -g @dungle-scrubs/harness-cli-normalizer # global
33
+ ```
34
+
35
+ One-shot turn:
36
+
37
+ ```bash
38
+ hcn run claude "explain a monad in one sentence"
39
+ hcn run codex "what is 2+2" --model gpt-5.6-sol
40
+ hcn run pi "name three primes" --provider zai/glm-5.2
41
+ hcn run muse "say hi" --no-write
42
+ ```
43
+
44
+ Piped JSON for programmatic use:
45
+
46
+ ```bash
47
+ hcn run claude "say hi" --json | jq .
48
+ hcn run claude "hi" --json | head -n 5 # abandonment-safe, no hanging handles
49
+ ```
50
+
51
+ Session (Claude-only):
52
+
53
+ ```bash
54
+ hcn session claude
55
+ hcn session claude --model opus --session-id 550e8400-e29b-41d4-a716-446655440000
56
+ ```
57
+
58
+ Inspection and drift (no spawn):
59
+
60
+ ```bash
61
+ hcn ls
62
+ hcn inspect claude
63
+ hcn inspect claude --argv --prompt "hi" --effort high
64
+ hcn check
65
+ hcn check --json
66
+ ```
67
+
68
+ Flag table (maps to `TurnOptions` / `TurnRunOptions`):
69
+
70
+ | CLI flag | TurnOptions field | Notes |
71
+ |---|---|---|
72
+ | `--prompt <text>` | `prompt` | Alternative to positional; mutual exclusion |
73
+ | `--prompt-file <path\|->` | `prompt` | Reads UTF-8 file or stdin (`-`) |
74
+ | `--model <id>` | `model` | Validated via `validateModel` |
75
+ | `--effort <value>` | `effort` | Validated via `validateEffort` |
76
+ | `--sandbox <value>` | `sandbox` | Codex only |
77
+ | `--provider <value>` | `provider` | pi only |
78
+ | `--tools <a,b>` | `tools` | Claude only, comma-separated |
79
+ | `--autonomy` / `--no-autonomy` | `autonomy` | |
80
+ | `--write` / `--no-write` | `write` | Muse |
81
+ | `--shell` / `--no-shell` | `shell` | Muse |
82
+ | `--max-steps <n>` | `maxSteps` | Muse, 1-10000 |
83
+ | `--no-tools, --no-instruction-files, --no-extensions, --no-skills` | `discovery` | |
84
+ | `--cwd <path>` | `cwd` | Working directory |
85
+ | `--env KEY=VAL` | `env` | Repeatable; `KEY=` deletes |
86
+ | `--resume <uuid>` | `resume` | Resume session |
87
+ | `--json` | output mode | NDJSON `HarnessEvent` to stdout |
88
+
89
+ For development, `bun run demo claude "hi"` remains as a live-rendering alternative.
90
+
91
+ ## TypeScript library
92
+
93
+ If you need the library, the same `hcn` commands are available as a typed `HarnessEvent` stream. Prefer the CLI above unless you are building an orchestrator, observer, or benchmark rig that must consume events in-process.
27
94
 
28
95
  One-shot headless turn, the simplest path:
29
96
 
@@ -44,10 +111,10 @@ for await (const event of streamTurn(
44
111
  }
45
112
  ```
46
113
 
47
- Swap `claudeCode` for `codexCli`, `piCli`, or `museCode` and the consumer code does not change. The
114
+ Swap `claudeCode` for `codexCli`, `piCli`, or `museCode` and the consumer code does not change for one-shot turns (`streamTurn`). The
48
115
  three layers are also available as `@dungle-scrubs/harness-cli-normalizer/knowledge`,
49
116
  `@dungle-scrubs/harness-cli-normalizer/interpretation`, and
50
- `@dungle-scrubs/harness-cli-normalizer/execution` for narrower imports.
117
+ `@dungle-scrubs/harness-cli-normalizer/execution` for narrower imports. Persistent multi-turn sessions (`openSession`, `sessionMode`) are Claude-only - the other three harnesses have `sessionMode: null` and `openSession`/`hcn session` refuse with `no-session-mode`.
51
118
 
52
119
  To watch the normalized stream render live against a real harness:
53
120
 
@@ -59,7 +126,7 @@ bun run demo muse "say hi"
59
126
  bun run demo --chat claude # interactive session (claude only)
60
127
  ```
61
128
 
62
- For a multi-turn session you drive yourself, `openSession` returns a handle whose `turns` you iterate and whose `send()` you call between turns. See `scripts/demo.ts` for the working pattern.
129
+ For a persistent multi-turn session (Claude-only), `openSession` returns a handle whose `turns` you iterate and whose `send()` you call between turns. Other harnesses do not support this mode. See `scripts/demo.ts` for the working pattern.
63
130
 
64
131
  ## Concepts
65
132
 
@@ -77,14 +144,90 @@ knowledge (pure data) -> interpretation (pure functions) -> execution (child pro
77
144
 
78
145
  ### Version-pinning and drift
79
146
 
80
- Every descriptor carries a `verifiedAgainst` version, the anchor for all of its facts. A weekly CI job compares each harness's published version to its descriptor and opens a tracking issue when one has moved ahead. Trust a descriptor only at its pinned version, and bump `verifiedAgainst` only after re-running the capability checks locally.
147
+ Every descriptor carries a `verifiedAgainst` version, the anchor for all of its facts. A weekly CI job compares each harness's published version to its descriptor and opens a tracking issue when one has moved ahead. Trust a descriptor only at its pinned version, and bump `verifiedAgainst` only after re-running the capability checks locally (`bun run smoke:seven`) and re-capturing fixtures.
148
+
149
+ For the three npm harnesses (Claude Code, Codex, pi) the check queries the registry and is credential-free. Muse ships as an installed shell script (`versionSource: { kind: "installed" }`), so there is no registry to poll - `hcn check` falls back to `muse --version` locally and is skipped in CI where the binary is absent. A quarter of the matrix is therefore exempt from automated drift detection, and a stale Muse descriptor will not surface until a manual re-verification.
150
+
151
+ Four harnesses are hand-verified by one maintainer. Claude Code alone ships more often than the pin is bumped, and the weekly issue only tells you the descriptor is stale - it does not re-capture the fixtures. Treat `verifiedAgainst` bumps as manual work, and expect Claude + Codex to carry most of the usage while pi and Muse double the verification surface for a smaller slice of value.
152
+
153
+ ## Turn options
154
+
155
+ Every `streamTurn` call can now shape the turn per-call without touching the descriptor:
156
+
157
+ ```ts
158
+ await streamTurn(claudeCode, {
159
+ prompt: "explain a monad",
160
+ effort: "high", // --effort (claude), -c model_reasoning_effort (codex), --thinking (pi), --reasoning-effort (muse)
161
+ provider: "zai/glm-5.2", // --provider (pi only)
162
+ discovery: { tools: false, instructionFiles: false, extensions: false, skills: false }, // -nt/-nc/-ne/-ns (pi) or --setting-sources project (claude)
163
+ write: false, // --disable-write (muse)
164
+ shell: false, // --disable-shell (muse)
165
+ maxSteps: 50, // --max-model-steps (muse)
166
+ sandbox: "read-only", // --sandbox (codex, launch only)
167
+ }, deps);
168
+ ```
169
+
170
+ Support matrix (anything not marked refuses with a typed `ArgvRefusalError` naming what the harness does support):
171
+
172
+ | Option | claude | codex | pi | muse |
173
+ | --- | --- | --- | --- | --- |
174
+ | `effort` | `--effort` | `-c model_reasoning_effort=` | `--thinking` | `--reasoning-effort` |
175
+ | `sandbox` | - | `--sandbox` (launch only) | - | - |
176
+ | `provider` | - | - | `--provider` | - |
177
+ | `discovery.tools` | - | - | `-nt` | - |
178
+ | `discovery.instructionFiles` | - | - | `-nc` | - |
179
+ | `discovery.extensions` | `--setting-sources project` | - | `-ne` | - |
180
+ | `discovery.skills` | `--setting-sources project` | - | `-ns` | - |
181
+ | `write` | - | - | - | `--disable-write` |
182
+ | `shell` | - | - | - | `--disable-shell` |
183
+ | `maxSteps` | - | - | - | `--max-model-steps` |
184
+ | `tools` | `--allowedTools` | - | - | - |
185
+
186
+ Per-call `env` is merged over the parent environment (`""` deletes) and never appears in logs:
187
+
188
+ ```ts
189
+ streamTurn(harness, { prompt, env: { FOO: "bar", OLD: "" } }, deps);
190
+ ```
191
+
192
+ ## Failure taxonomy
193
+
194
+ Every failure - provider, work, transport, or refusal - arrives as a typed `failure` event and reduces to one self-sufficient summary on `done`:
195
+
196
+ ```ts
197
+ type FailureClass = "rate-limit" | "usage-limit" | "quota" | "auth" | "budget" | "task" | "transport" | "rejected";
198
+ interface FailureSummary { class: FailureClass; retryable: boolean; message: string; code?: LimitCode; authKind?: AuthFailureKind; resetsAt?: number; issue?: RefusalIssue; option?: TurnOptionKey; facet?: DiscoveryFacet; supported?: readonly string[]; }
199
+ type HarnessEvent = ... | ({ kind: "failure" } & FailureSummary) | { kind: "done"; exitCode: number | null; cause: ExitCause; failure?: FailureSummary };
200
+ type ExitCause = "clean" | "limit" | "crash" | "stall" | "killed" | "failed";
201
+ ```
202
+
203
+ The canonical consumer check, identical for a deterministic router and an agent:
204
+
205
+ ```ts
206
+ if (done.failure) {
207
+ if (done.failure.retryable) descendFallbackChain(done.failure);
208
+ else pivot(done.failure); // rejected -> change options; budget -> raise cap; task -> surface
209
+ }
210
+ ```
211
+
212
+ `retryable` is `false` for `task`, `budget`, `rejected` and `true` for the rest. `rejected` is non-retryable across the whole model chain because the remedy is different options or a different harness.
213
+
214
+ ## Refusals
215
+
216
+ An unexpressible option throws `ArgvRefusalError` from the builders and is also delivered as `failure class=rejected` + `done cause=failed` from `streamTurn` (which never throws out of its first `next()`):
217
+
218
+ ```ts
219
+ class ArgvRefusalError extends Error { issue: RefusalIssue; harness: HarnessName; option?: TurnOptionKey; facet?: DiscoveryFacet; supported: readonly string[]; }
220
+ type RefusalIssue = "unsupported-option" | "unsupported-option-facet" | "unsupported-on-resume" | "invalid-option-value" | "unknown-effort" | "unknown-model" | "invalid-env" | "invalid-tool-grant" | "prompt-flag-injection" | "no-autonomy-mode" | "no-session-mode";
221
+ ```
222
+
223
+ Every refusal names an alternative in `supported` and `message`, not only a negation.
81
224
 
82
225
  ## Reference
83
226
 
84
227
  - Descriptors live in `src/knowledge/` (`claude-code.ts`, `codex.ts`, `pi.ts`, `muse.ts`), with shared types in `descriptor.ts`.
85
- - The normalized event surface is `HarnessEvent` in `src/execution/events.ts`: `identity`, `token`, `message`, `progress`, `tool`, `context`, `limit`, `error`, `done`.
86
- - Narrow or override a descriptor's facts with `parseOverrides` (`src/knowledge/overrides.ts`). An override a harness cannot satisfy throws `OverrideRefusalError` instead of producing a broken argv.
87
- - `DROPPABLE_KINDS` (`token`, `progress`, `context`) marks events safe to drop when you only need the full messages.
228
+ - The normalized event surface is `HarnessEvent` in `src/execution/events.ts`: `identity`, `token`, `message`, `progress`, `tool`, `context`, `limit`, `error`, `failure`, `done` (with `done.failure`).
229
+ - Narrow or override a descriptor's facts with `parseOverrides` (`src/knowledge/overrides.ts`). An override a harness cannot satisfy throws `OverrideRefusalError` instead of producing a broken argv. `limitMatchers`/`authMatchers` are now serializable `{pattern, flags, code/kind}` objects so they can be overridden from JSON; bad patterns are refused at load with file and harness named.
230
+ - `DROPPABLE_KINDS` (`token`, `progress`, `context`) marks events safe to drop when you only need the full messages. `failure` is never droppable.
88
231
 
89
232
  ## Contributing
90
233
 
@@ -92,7 +235,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md). The short version: run `pnpm check` befo
92
235
 
93
236
  ## Status
94
237
 
95
- Pre-1.0. Four harnesses are described (Claude Code, Codex, pi, Muse). Drift detection runs weekly in CI; re-verifying a descriptor's capability claims against a new CLI version is a local, manual step (`bun run smoke:seven`), not CI. Authentication and usage-limit signals are parsed from each harness's stream, but this library never holds or ships credentials; each harness authenticates under the end user's own session.
238
+ Pre-1.0. Four harnesses are described (Claude Code, Codex, pi, Muse). One-shot turns (`streamTurn`) are normalized across all four; persistent sessions (`openSession` / `sessionMode`) are Claude-only - other harnesses return `no-session-mode`. Drift detection runs weekly in CI for the three npm harnesses; Muse is `installed` and only checked locally via `muse --version`. Re-verifying a descriptor's capability claims against a new CLI version is a local, manual step (`bun run smoke:seven`) plus fixture re-capture, not CI. Authentication and usage-limit signals are parsed from each harness's stream, but this library never holds or ships credentials; each harness authenticates under the end user's own session.
96
239
 
97
240
  ## Prior art
98
241
 
@@ -0,0 +1,74 @@
1
+ import { parseArgs } from "node:util";
2
+ import type { TurnOptions } from "../interpretation/argv.js";
3
+ export type ParsedPromptSource = {
4
+ kind: "positional";
5
+ prompt: string;
6
+ } | {
7
+ kind: "prompt-flag";
8
+ prompt: string;
9
+ } | {
10
+ kind: "prompt-file";
11
+ prompt: string;
12
+ } | {
13
+ kind: "none";
14
+ };
15
+ export interface CliTurnOptions extends TurnOptions {
16
+ }
17
+ export interface CliRunOptions extends CliTurnOptions {
18
+ readonly cwd?: string;
19
+ readonly env?: Record<string, string>;
20
+ readonly resume?: string;
21
+ readonly json?: boolean;
22
+ }
23
+ export interface ParseCommonResult {
24
+ prompt: string | undefined;
25
+ promptSource: ParsedPromptSource["kind"];
26
+ turnOptions: TurnOptions;
27
+ runOptions: {
28
+ cwd?: string;
29
+ env?: Record<string, string>;
30
+ resume?: string;
31
+ };
32
+ }
33
+ /**
34
+ * Parse --env KEY=VAL entries into env record. "" value means delete.
35
+ */
36
+ export declare const parseEnvEntries: (entries: string[] | string | undefined) => Record<string, string> | undefined;
37
+ export declare const resolvePrompt: (args: {
38
+ positionalPrompt?: string;
39
+ promptFlag?: string;
40
+ promptFile?: string;
41
+ }) => {
42
+ prompt: string;
43
+ source: ParsedPromptSource["kind"];
44
+ };
45
+ export declare const resolvePromptAsync: (args: {
46
+ positionalPrompt?: string;
47
+ promptFlag?: string;
48
+ promptFile?: string;
49
+ }) => Promise<{
50
+ prompt: string;
51
+ source: ParsedPromptSource["kind"];
52
+ }>;
53
+ /**
54
+ * Build TurnOptions from parsed flag values. Shared between run and inspect --argv.
55
+ */
56
+ export declare const parseTurnOptions: (values: Record<string, unknown>) => TurnOptions;
57
+ export declare const parseRunExtra: (values: Record<string, unknown>) => {
58
+ cwd?: string;
59
+ env?: Record<string, string>;
60
+ resume?: string;
61
+ };
62
+ export interface CommonParseConfig {
63
+ allowPrompt: boolean;
64
+ allowPromptFile: boolean;
65
+ }
66
+ export declare const detectPositionalPromptInjection: (argv: string[]) => string | null;
67
+ /**
68
+ * Wrapper around node:util parseArgs for the common flag table.
69
+ * Throws with exit code 2 on unknown flag.
70
+ */
71
+ export declare const parseCommonFlags: (argv: string[], opts?: {
72
+ strict?: boolean;
73
+ }) => ReturnType<typeof parseArgs>;
74
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAoB,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG/E,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,MAAM,WAAW,cAAe,SAAQ,WAAW;CAElD;AAED,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,YAAY,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACzC,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7E;AASD;;GAEG;AACH,eAAO,MAAM,eAAe,YACjB,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,KACrC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SA4B3B,CAAC;AAEF,eAAO,MAAM,aAAa,SAAU;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,KAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAA;CAkCvD,CAAC;AAEF,eAAO,MAAM,kBAAkB,SAAgB;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,KAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAA;CAAE,CAiCjE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,WAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,WAyDlE,CAAC;AAEF,eAAO,MAAM,aAAa,WAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAW/D,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAgDD,eAAO,MAAM,+BAA+B,SAAU,MAAM,EAAE,KAAG,MAAM,GAAG,IAmCzE,CAAC;AAwBF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,SACrB,MAAM,EAAE,SACR;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,KACzB,UAAU,CAAC,OAAO,SAAS,CAoC7B,CAAC"}
@@ -0,0 +1,339 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { parseArgs } from "node:util";
3
+ import { ArgvRefusalError } from "../interpretation/refusal.js";
4
+ const _DISCOVERY_FLAGS = {
5
+ tools: "no-tools",
6
+ instructionFiles: "no-instruction-files",
7
+ extensions: "no-extensions",
8
+ skills: "no-skills",
9
+ };
10
+ /**
11
+ * Parse --env KEY=VAL entries into env record. "" value means delete.
12
+ */
13
+ export const parseEnvEntries = (entries) => {
14
+ if (entries === undefined)
15
+ return undefined;
16
+ const list = Array.isArray(entries) ? entries : [entries];
17
+ if (list.length === 0)
18
+ return undefined;
19
+ const env = {};
20
+ for (const entry of list) {
21
+ const eq = entry.indexOf("=");
22
+ if (eq === -1) {
23
+ throw new ArgvRefusalError({
24
+ issue: "invalid-env",
25
+ harness: "claude",
26
+ supported: ["KEY=VAL"],
27
+ detail: entry,
28
+ });
29
+ }
30
+ const key = entry.slice(0, eq);
31
+ const value = entry.slice(eq + 1);
32
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key) || value.includes("\0") || key.includes("\0")) {
33
+ throw new ArgvRefusalError({
34
+ issue: "invalid-env",
35
+ harness: "claude",
36
+ supported: ["keys must match ^[A-Za-z_][A-Za-z0-9_]*$ and contain no NUL"],
37
+ detail: entry,
38
+ });
39
+ }
40
+ env[key] = value;
41
+ }
42
+ return env;
43
+ };
44
+ export const resolvePrompt = (args) => {
45
+ const hasPositional = args.positionalPrompt !== undefined && args.positionalPrompt !== "";
46
+ const hasPrompt = args.promptFlag !== undefined;
47
+ const hasFile = args.promptFile !== undefined;
48
+ const count = Number(hasPositional) + Number(hasPrompt) + Number(hasFile);
49
+ if (count === 0) {
50
+ throw new ArgvRefusalError({
51
+ issue: "invalid-option-value",
52
+ harness: "claude",
53
+ supported: ["provide prompt via positional, --prompt, or --prompt-file"],
54
+ detail: "missing prompt",
55
+ });
56
+ }
57
+ if (count > 1) {
58
+ throw new ArgvRefusalError({
59
+ issue: "invalid-option-value",
60
+ harness: "claude",
61
+ supported: ["use one of positional, --prompt, or --prompt-file"],
62
+ detail: "mutual exclusion",
63
+ });
64
+ }
65
+ if (hasPositional)
66
+ return { prompt: args.positionalPrompt, source: "positional" };
67
+ if (hasPrompt)
68
+ return { prompt: args.promptFlag, source: "prompt-flag" };
69
+ // --prompt-file
70
+ const file = args.promptFile;
71
+ if (file === "-") {
72
+ // read from stdin sync - caller may provide content differently for async path.
73
+ // For sync path, read stdin fd 0.
74
+ const content = readFileSync(0, "utf8");
75
+ return { prompt: content, source: "prompt-file" };
76
+ }
77
+ const content = readFileSync(file, "utf8");
78
+ return { prompt: content, source: "prompt-file" };
79
+ };
80
+ export const resolvePromptAsync = async (args) => {
81
+ const hasPositional = args.positionalPrompt !== undefined && args.positionalPrompt !== "";
82
+ const hasPrompt = args.promptFlag !== undefined;
83
+ const hasFile = args.promptFile !== undefined;
84
+ const count = Number(hasPositional) + Number(hasPrompt) + Number(hasFile);
85
+ if (count === 0) {
86
+ throw new ArgvRefusalError({
87
+ issue: "invalid-option-value",
88
+ harness: "claude",
89
+ supported: ["provide prompt via positional, --prompt, or --prompt-file"],
90
+ detail: "missing prompt",
91
+ });
92
+ }
93
+ if (count > 1) {
94
+ throw new ArgvRefusalError({
95
+ issue: "invalid-option-value",
96
+ harness: "claude",
97
+ supported: ["use one of positional, --prompt, or --prompt-file"],
98
+ detail: "mutual exclusion",
99
+ });
100
+ }
101
+ if (hasPositional)
102
+ return { prompt: args.positionalPrompt, source: "positional" };
103
+ if (hasPrompt)
104
+ return { prompt: args.promptFlag, source: "prompt-flag" };
105
+ const file = args.promptFile;
106
+ if (file === "-") {
107
+ const chunks = [];
108
+ for await (const chunk of process.stdin)
109
+ chunks.push(chunk);
110
+ return { prompt: Buffer.concat(chunks).toString("utf8"), source: "prompt-file" };
111
+ }
112
+ const { readFile } = await import("node:fs/promises");
113
+ const content = await readFile(file, "utf8");
114
+ return { prompt: content, source: "prompt-file" };
115
+ };
116
+ /**
117
+ * Build TurnOptions from parsed flag values. Shared between run and inspect --argv.
118
+ */
119
+ export const parseTurnOptions = (values) => {
120
+ const opts = {};
121
+ if (values.model !== undefined)
122
+ opts.model = values.model;
123
+ if (values.effort !== undefined)
124
+ opts.effort = values.effort;
125
+ if (values.sandbox !== undefined)
126
+ opts.sandbox = values.sandbox;
127
+ if (values.provider !== undefined)
128
+ opts.provider = values.provider;
129
+ if (values.tools !== undefined) {
130
+ const raw = String(values.tools);
131
+ opts.tools = raw.length === 0 ? [] : raw.split(",").map((s) => s.trim());
132
+ }
133
+ if (values.autonomy === true)
134
+ opts.autonomy = true;
135
+ else if (values["no-autonomy"] === true)
136
+ opts.autonomy = false;
137
+ else if (values.autonomy === false)
138
+ opts.autonomy = false; // for completeness
139
+ if (values.write === true)
140
+ opts.write = true;
141
+ else if (values["no-write"] === true)
142
+ opts.write = false;
143
+ if (values.shell === true)
144
+ opts.shell = true;
145
+ else if (values["no-shell"] === true)
146
+ opts.shell = false;
147
+ if (values["max-steps"] !== undefined) {
148
+ const n = Number(values["max-steps"]);
149
+ if (!Number.isFinite(n)) {
150
+ throw new ArgvRefusalError({
151
+ issue: "invalid-option-value",
152
+ harness: "claude",
153
+ option: "maxSteps",
154
+ supported: ["integer 1-10000"],
155
+ detail: String(values["max-steps"]),
156
+ });
157
+ }
158
+ opts.maxSteps = n;
159
+ }
160
+ // discovery facets: --no-* means false, otherwise undefined (no-op)
161
+ const discovery = {};
162
+ let hasDiscovery = false;
163
+ if (values["no-tools"] === true) {
164
+ discovery.tools = false;
165
+ hasDiscovery = true;
166
+ }
167
+ if (values["no-instruction-files"] === true) {
168
+ discovery.instructionFiles = false;
169
+ hasDiscovery = true;
170
+ }
171
+ if (values["no-extensions"] === true) {
172
+ discovery.extensions = false;
173
+ hasDiscovery = true;
174
+ }
175
+ if (values["no-skills"] === true) {
176
+ discovery.skills = false;
177
+ hasDiscovery = true;
178
+ }
179
+ if (hasDiscovery)
180
+ opts.discovery = discovery;
181
+ // prompt will be set by caller after resolvePrompt
182
+ return opts;
183
+ };
184
+ export const parseRunExtra = (values) => {
185
+ const extra = {};
186
+ if (values.cwd !== undefined)
187
+ extra.cwd = String(values.cwd);
188
+ if (values.resume !== undefined)
189
+ extra.resume = String(values.resume);
190
+ if (values["session-id"] !== undefined)
191
+ extra.resume = String(values["session-id"]);
192
+ if (values.env !== undefined) {
193
+ // parseArgs with multiple:true gives string[] ; else string
194
+ const list = values.env;
195
+ extra.env = parseEnvEntries(list);
196
+ }
197
+ return extra;
198
+ };
199
+ const KNOWN_FLAGS = new Set([
200
+ "--prompt",
201
+ "--prompt-file",
202
+ "--model",
203
+ "--effort",
204
+ "--sandbox",
205
+ "--provider",
206
+ "--tools",
207
+ "--autonomy",
208
+ "--no-autonomy",
209
+ "--write",
210
+ "--no-write",
211
+ "--shell",
212
+ "--no-shell",
213
+ "--max-steps",
214
+ "--no-tools",
215
+ "--no-instruction-files",
216
+ "--no-extensions",
217
+ "--no-skills",
218
+ "--cwd",
219
+ "--env",
220
+ "--resume",
221
+ "--session-id",
222
+ "--json",
223
+ "--argv",
224
+ "--help",
225
+ "-h",
226
+ "--version",
227
+ "-V",
228
+ ]);
229
+ const FLAGS_WITH_VALUE = new Set([
230
+ "--prompt",
231
+ "--prompt-file",
232
+ "--model",
233
+ "--effort",
234
+ "--sandbox",
235
+ "--provider",
236
+ "--tools",
237
+ "--max-steps",
238
+ "--cwd",
239
+ "--env",
240
+ "--resume",
241
+ "--session-id",
242
+ ]);
243
+ export const detectPositionalPromptInjection = (argv) => {
244
+ const hasExplicitPrompt = argv.some((a) => a === "--prompt" ||
245
+ a.startsWith("--prompt=") ||
246
+ a === "--prompt-file" ||
247
+ a.startsWith("--prompt-file="));
248
+ if (hasExplicitPrompt)
249
+ return null;
250
+ let expectValue = false;
251
+ for (const token of argv) {
252
+ if (expectValue) {
253
+ expectValue = false;
254
+ continue;
255
+ }
256
+ if (FLAGS_WITH_VALUE.has(token)) {
257
+ expectValue = true;
258
+ continue;
259
+ }
260
+ if (token.startsWith("--") && token.includes("=")) {
261
+ continue;
262
+ }
263
+ if (KNOWN_FLAGS.has(token)) {
264
+ continue;
265
+ }
266
+ if (token === "--") {
267
+ continue;
268
+ }
269
+ // Only single-dash tokens are considered prompt injection candidates
270
+ // Double-dash unknown flags (e.g. --unknown) are handled as unknown flag errors by parseArgs
271
+ if (token.startsWith("-") && !token.startsWith("--")) {
272
+ return token;
273
+ }
274
+ }
275
+ return null;
276
+ };
277
+ const preprocessPromptArgs = (argv) => {
278
+ const out = [];
279
+ for (let i = 0; i < argv.length; i++) {
280
+ const token = argv[i];
281
+ if (token === "--prompt" && i + 1 < argv.length) {
282
+ const next = argv[i + 1];
283
+ // If next starts with '-' and isn't '--', convert to --prompt=-value form so parseArgs accepts it
284
+ if (next.startsWith("-") && next !== "--" && !next.startsWith("--prompt")) {
285
+ out.push(`--prompt=${next}`);
286
+ i++;
287
+ continue;
288
+ }
289
+ }
290
+ if (token.startsWith("--prompt=")) {
291
+ out.push(token);
292
+ continue;
293
+ }
294
+ out.push(token);
295
+ }
296
+ return out;
297
+ };
298
+ /**
299
+ * Wrapper around node:util parseArgs for the common flag table.
300
+ * Throws with exit code 2 on unknown flag.
301
+ */
302
+ export const parseCommonFlags = (argv, opts = {}) => {
303
+ const normalized = preprocessPromptArgs(argv);
304
+ const config = {
305
+ allowPositionals: true,
306
+ strict: opts.strict ?? true,
307
+ options: {
308
+ prompt: { type: "string" },
309
+ "prompt-file": { type: "string" },
310
+ model: { type: "string" },
311
+ effort: { type: "string" },
312
+ sandbox: { type: "string" },
313
+ provider: { type: "string" },
314
+ tools: { type: "string" },
315
+ autonomy: { type: "boolean" },
316
+ "no-autonomy": { type: "boolean" },
317
+ write: { type: "boolean" },
318
+ "no-write": { type: "boolean" },
319
+ shell: { type: "boolean" },
320
+ "no-shell": { type: "boolean" },
321
+ "max-steps": { type: "string" },
322
+ "no-tools": { type: "boolean" },
323
+ "no-instruction-files": { type: "boolean" },
324
+ "no-extensions": { type: "boolean" },
325
+ "no-skills": { type: "boolean" },
326
+ cwd: { type: "string" },
327
+ env: { type: "string", multiple: true },
328
+ resume: { type: "string" },
329
+ "session-id": { type: "string" },
330
+ json: { type: "boolean" },
331
+ argv: { type: "boolean" },
332
+ help: { type: "boolean" },
333
+ version: { type: "boolean" },
334
+ },
335
+ };
336
+ // parseArgs throws on unknown flag when strict true - we let it bubble and caller maps to exit 2
337
+ return parseArgs({ ...config, args: normalized });
338
+ };
339
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const check: (rawArgs: string[]) => Promise<void>;
2
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/cli/check.ts"],"names":[],"mappings":"AAmDA,eAAO,MAAM,KAAK,YAAmB,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CAoF3D,CAAC"}