@mmerterden/multi-agent-pipeline 16.9.0 → 16.10.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.
package/CHANGELOG.md CHANGED
@@ -26,6 +26,23 @@ Internal file-layout changes that don't affect the slash-command surface are sti
26
26
 
27
27
  - **`smoke-website-deploy-identity.sh` (20 assertions).** It runs the script against throwaway repos with real remotes rather than grepping the doc: the happy path lands and pushes, an exported `GIT_AUTHOR_EMAIL` halts with the commit still local, an unchanged tree makes no empty commit, a matching config is preserved while a wrong name is corrected, and missing or non-repository arguments exit 2. Wiring is asserted separately, since a correct script nothing calls is its own failure mode.
28
28
 
29
+ ## [16.10.0] - 2026-08-26
30
+
31
+ Three debts the last few releases kept naming, closed.
32
+
33
+ ### Added
34
+
35
+ - **`smoke-help-sync.sh` pairs each command's own description with the line `/multi-agent:help` shows for it.** Three releases running shipped the same defect: 16.7.1 (two commands absent from help entirely), 16.8.1 (the analysis entry describing behaviour from two releases earlier), 16.9.0 (a telemetry block still saying "optional, opt-in" after the default flipped). Every other gate was green through all three, because none of them asked whether the sentence a user reads still matches what the command does. The gate hashes both sides and fails when one moved without the other. Its limit is written into the file: it cannot tell whether either text is *correct* - a maintainer who edits both to say something equally wrong still passes. What it forces is that the pair gets looked at together, which is exactly what did not happen those three times.
36
+
37
+ ### Changed
38
+
39
+ - **The telemetry self-registration path no longer needs `jq`.** It read preferences through `jq` behind a `command -v jq` guard, so a machine without jq silently never registered and never reported - which in the panel is indistinguishable from nobody using the pipeline. Reads now go through `node`, a declared engine (>=20.11), so the path cannot be skipped for a missing tool. Thirteen other shell helpers still use jq; the install now prints one note when it is absent, naming what degrades (cost summaries, the tracker's JSON reads, convention extraction, skill signing) instead of leaving each to fail quietly. Both READMEs gained a prerequisites section.
40
+ - **The phase-doc token budget has room again.** The token-telemetry instructions were repeated verbatim in four phase docs while the canonical text already lived in `progress-contract.md`; the phases now point at it. Total goes 57599 -> 57059 against a 57600 ceiling, so headroom moves from 1 token to 541. The ceiling was not raised - the space came back from text that had more than its share, the same rule 16.7.1 followed for `help`.
41
+
42
+ ### Fixed
43
+
44
+ - Six phase docs cited `progress-contract.md#token-telemetry-forwarding-v83`; the heading anchors as `#token-telemetry-forwarding`, so none of those links resolved.
45
+
29
46
  ## [16.9.0] - 2026-08-25
30
47
 
31
48
  ### Added
package/README.md CHANGED
@@ -14,6 +14,12 @@ Runs natively on Claude Code, Copilot CLI and Codex CLI. macOS / Linux / Windows
14
14
 
15
15
  📐 **[Architecture diagrams](./docs/architecture.md)** - the 8-phase flow, operating modes, review/triage, Figma subphases, component layout. **[Ecosystem diagram](./docs/ecosystem.md)** - how this repo, the `multi-agent-plugins` marketplace and `multi-agent-toolkit-mcp` compose.
16
16
 
17
+ ### Prerequisites
18
+
19
+ - **Node.js >= 20.11** - required; the pipeline's own tooling runs on it.
20
+ - **`jq`** - optional but recommended. Thirteen shell helpers reach for it and skip in silence without it: cost summaries, the phase tracker's JSON reads, convention extraction, skill signing. The install prints a note when it is missing.
21
+ - **`gh`** - for GitHub issue and PR work. Its built-in `--jq` is independent of the `jq` binary.
22
+
17
23
  ## Quick Start
18
24
 
19
25
  ```bash
package/README.tr.md CHANGED
@@ -14,6 +14,12 @@ Claude Code, Copilot CLI ve Codex CLI üzerinde native çalışır. macOS / Linu
14
14
 
15
15
  📐 **[Mimari diyagramları](./docs/architecture.md)** - 8 faz akışı, çalışma modları, review/triage, Figma subphase'leri, component yapısı. **[Ekosistem diyagramı](./docs/ecosystem.md)** - bu repo, `multi-agent-plugins` marketplace'i ve `multi-agent-toolkit-mcp`'nin nasıl bir araya geldiği.
16
16
 
17
+ ### Önkoşullar
18
+
19
+ - **Node.js >= 20.11** - zorunlu; pipeline'ın kendi araçları bunun üzerinde koşuyor.
20
+ - **`jq`** - opsiyonel ama önerilir. On üç kabuk yardımcısı ona başvuruyor ve yokken sessizce atlıyor: maliyet özetleri, faz izleyicisinin JSON okumaları, konvansiyon çıkarımı, skill imzalama. Kurulum, eksikse bir not basıyor.
21
+ - **`gh`** - GitHub issue ve PR işleri için. Kendi dahili `--jq`'su, `jq` ikilisinden bağımsız.
22
+
17
23
  ## Hızlı Başlangıç
18
24
 
19
25
  ```bash
package/install/index.mjs CHANGED
@@ -9,6 +9,7 @@
9
9
  */
10
10
 
11
11
  import { dirname } from "path";
12
+ import { execFileSync } from "node:child_process";
12
13
  import { fileURLToPath } from "url";
13
14
 
14
15
  import { readFileSync } from "fs";
@@ -144,6 +145,17 @@ export function writeVersionMarkers({ home, forClaude, forCopilot, forCodex }) {
144
145
  * @param {string[]} flags
145
146
  * @returns {"ios"|"android"|"all"}
146
147
  */
148
+ // Presence check only - never a hard requirement. The pipeline's own engine is
149
+ // node; jq is a convenience several shell helpers reached for.
150
+ function hasJq() {
151
+ try {
152
+ execFileSync("jq", ["--version"], { stdio: "ignore", timeout: 3000 });
153
+ return true;
154
+ } catch {
155
+ return false;
156
+ }
157
+ }
158
+
147
159
  function parsePlatformFlag(flags) {
148
160
  const raw = flags.find((f) => f.startsWith("--platform="));
149
161
  if (!raw) return "all";
@@ -203,6 +215,19 @@ function printSummary(opts) {
203
215
  " Skipped only when the host CLI is not on PATH - the command to run is printed above.",
204
216
  );
205
217
  console.log("");
218
+ // jq is not a declared engine and macOS did not always ship it, yet thirteen
219
+ // runtime paths guard on it and skip in silence when it is missing. Silence is
220
+ // the problem: a cost summary that never renders and a tracker that never
221
+ // updates look like bugs, not like an absent tool. Say it once, here, where
222
+ // somebody can act on it.
223
+ if (!hasJq()) {
224
+ console.log(" Note: jq was not found on PATH.");
225
+ console.log(" Everything installs and the pipeline runs, but a few shell");
226
+ console.log(" helpers degrade quietly without it: cost summaries, the phase");
227
+ console.log(" tracker's JSON reads, convention extraction and skill signing.");
228
+ console.log(" Install it (brew install jq / apt install jq) to get them back.");
229
+ console.log("");
230
+ }
206
231
  console.log(" Uninstall everything: npx @mmerterden/multi-agent-pipeline uninstall");
207
232
  console.log(" (Personal access tokens in keychain are preserved.)");
208
233
  console.log("");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmerterden/multi-agent-pipeline",
3
- "version": "16.9.0",
3
+ "version": "16.10.0",
4
4
  "description": "8-phase AI development pipeline with full orchestration on Claude Code, Copilot CLI and Codex CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -113,29 +113,34 @@ A git clone of the pipeline repo is a maintainer workspace, kept in sync by `/mu
113
113
  self-registration permanently; print the opt-out hint on first auto-enable.
114
114
  ```bash
115
115
  PREFS="$HOME/.claude/multi-agent-preferences.json"
116
- if [ -f "$PREFS" ] && command -v jq >/dev/null 2>&1; then
117
- ENABLED=$(jq -r '.global.usageLog.enabled // false' "$PREFS" 2>/dev/null)
118
- OPTOUT=$(jq -r '.global.usageLog.optOut // false' "$PREFS" 2>/dev/null)
116
+ # Reads go through node, not jq. node is a declared engine (>=20.11) so it
117
+ # is always there; jq is not, and gating this block on it meant a machine
118
+ # without jq silently never registered and never reported - which reads in
119
+ # the panel exactly like nobody using the pipeline.
120
+ if [ -f "$PREFS" ]; then
121
+ pref() { node -e 'const fs=require("fs");let v;try{v=process.argv[2].split(".").reduce((a,k)=>a?.[k],JSON.parse(fs.readFileSync(process.argv[1],"utf8")))}catch{};process.stdout.write(v==null?"":String(v))' "$PREFS" "$1" 2>/dev/null; }
122
+ ENABLED=$(pref global.usageLog.enabled)
123
+ OPTOUT=$(pref global.usageLog.optOut)
119
124
  if [ "$ENABLED" != "true" ] && [ "$OPTOUT" != "true" ]; then
120
125
  TOK="${MULTI_AGENT_USAGE_TOKEN:-}"
121
- [ -z "$TOK" ] && TOK=$(jq -r '.global.usageLog.token // empty' "$PREFS" 2>/dev/null)
126
+ [ -z "$TOK" ] && TOK=$(pref global.usageLog.token)
122
127
  if [ -z "$TOK" ]; then
123
- KNAME=$(jq -r '.global.keychainMapping.usage_ingest // empty' "$PREFS" 2>/dev/null)
128
+ KNAME=$(pref global.keychainMapping.usage_ingest)
124
129
  [ -n "$KNAME" ] && TOK=$(bash "$HOME/.claude/lib/credential-store.sh" get "$KNAME" 2>/dev/null)
125
130
  fi
126
131
  if [ -z "$TOK" ]; then
127
- EP=$(jq -r '.global.usageLog.endpoint // "https://mmerterden.vercel.app/api/usage/ingest"' "$PREFS" 2>/dev/null)
132
+ EP=$(pref global.usageLog.endpoint); [ -z "$EP" ] && EP="https://mmerterden.vercel.app/api/usage/ingest"
128
133
  REG_EP="${EP%/ingest}/register"
129
134
  # Telemetry identity is the GitHub account name, never the git
130
135
  # identity.name (which can carry a corporate title). username -> live
131
136
  # gh login -> OS user.
132
- RUSER=$(jq -r '.global.identities[0].username // empty' "$PREFS" 2>/dev/null)
137
+ RUSER=$(pref global.identities.0.username)
133
138
  [ -z "$RUSER" ] && RUSER=$(gh api user --jq .login 2>/dev/null || echo "")
134
139
  [ -z "$RUSER" ] && RUSER="$USER"
135
140
  RESP=$(curl -sSL -m 10 -X POST -H "Content-Type: application/json" \
136
141
  --data "{\"u\":\"$RUSER\",\"c\":\"$(hostname -s 2>/dev/null || echo unknown)\"}" \
137
142
  "$REG_EP" 2>/dev/null)
138
- TOK=$(printf '%s' "$RESP" | jq -r '.token // empty' 2>/dev/null)
143
+ TOK=$(printf '%s' "$RESP" | node -e 'let b="";process.stdin.on("data",d=>b+=d).on("end",()=>{try{process.stdout.write(String(JSON.parse(b).token||""))}catch{}})' 2>/dev/null)
139
144
  if [ -n "$TOK" ]; then
140
145
  printf '%s' "$TOK" | bash "$HOME/.claude/lib/credential-store.sh" set "${USER}_Usage_Ingest_Token" "$(cat)"
141
146
  node -e 'const fs=require("fs"),p=process.argv[1];const j=JSON.parse(fs.readFileSync(p,"utf8"));j.global=j.global||{};j.global.keychainMapping=j.global.keychainMapping||{};j.global.keychainMapping.usage_ingest=process.argv[2];fs.writeFileSync(p,JSON.stringify(j,null,2)+"\n");' "$PREFS" "${USER}_Usage_Ingest_Token"
@@ -215,7 +215,7 @@ LOG_METRIC_FORWARD_TO_TRACKER=1 $HOME/.claude/scripts/log-metric.sh "$TASK_ID" 1
215
215
  model=opus tokens_in=$IN tokens_out=$OUT duration_ms=$DUR
216
216
  ```
217
217
 
218
- Best-effort. See `$HOME/.claude/multi-agent-refs/progress-contract.md#token-telemetry-forwarding-v83` for the canonical contract.
218
+ Best-effort. See `$HOME/.claude/multi-agent-refs/progress-contract.md#token-telemetry-forwarding` for the canonical contract.
219
219
 
220
220
  #### Prior-Art Enrichment (advisory)
221
221
 
@@ -234,12 +234,9 @@ Treat hits as **context only** - they are past Phase 4 verdicts, not prescript
234
234
 
235
235
  ## Token telemetry - invoke after every LLM call
236
236
 
237
- After every LLM call in this phase (analysis, plan generation, code/diff write, review verdict, triage), invoke:
238
-
239
237
  ```bash
240
238
  bash $HOME/.claude/scripts/phase-tracker.sh tokens 1 <input_count> <output_count>
241
239
  ```
242
240
 
243
- The tracker accumulates the totals additively, so multiple calls in the same phase compound. The render output then shows live cost on the active phase tile (e.g. `Phase 1 Dev 2m 14s · 12.4k tok`). This satisfies the contract in `$HOME/.claude/multi-agent-refs/tracker-contract.md` and the `smoke-tracker-tokens-invocation.sh` enforcement gate. Skipping this call is the #1 cause of "I can't see how much it cost" complaints.
241
+ Contract and rationale: `progress-contract.md` -> Token telemetry forwarding.
244
242
 
245
- If you do not have access to the model's reported token counts, pass best-effort estimates derived from input length / output length - partial cost data is better than none.
@@ -327,18 +327,15 @@ LOG_METRIC_FORWARD_TO_TRACKER=1 $HOME/.claude/scripts/log-metric.sh "$TASK_ID" 2
327
327
  model=opus tokens_in=$IN tokens_out=$OUT duration_ms=$DUR iteration=$N
328
328
  ```
329
329
 
330
- Best-effort. See `$HOME/.claude/multi-agent-refs/progress-contract.md#token-telemetry-forwarding-v83`.
330
+ Best-effort. See `$HOME/.claude/multi-agent-refs/progress-contract.md#token-telemetry-forwarding`.
331
331
 
332
332
  ---
333
333
 
334
334
  ## Token telemetry - invoke after every LLM call
335
335
 
336
- After every LLM call in this phase (analysis, plan generation, code/diff write, review verdict, triage), invoke:
337
-
338
336
  ```bash
339
337
  bash $HOME/.claude/scripts/phase-tracker.sh tokens 2 <input_count> <output_count>
340
338
  ```
341
339
 
342
- The tracker accumulates the totals additively, so multiple calls in the same phase compound. The render output then shows live cost on the active phase tile (e.g. `Phase 2 Dev 2m 14s · 12.4k tok`). This satisfies the contract in `$HOME/.claude/multi-agent-refs/tracker-contract.md` and the `smoke-tracker-tokens-invocation.sh` enforcement gate. Skipping this call is the #1 cause of "I can't see how much it cost" complaints.
340
+ Contract and rationale: `progress-contract.md` -> Token telemetry forwarding.
343
341
 
344
- If you do not have access to the model's reported token counts, pass best-effort estimates derived from input length / output length - partial cost data is better than none.
@@ -345,21 +345,17 @@ LOG_METRIC_FORWARD_TO_TRACKER=1 $HOME/.claude/scripts/log-metric.sh "$TASK_ID" 3
345
345
  tokens_in=$IN tokens_out=$OUT duration_ms=$DUR
346
346
  ```
347
347
 
348
- Model resolves from the active mode: a Full run uses Sonnet, a Short run uses Opus. Best-effort. See `$HOME/.claude/multi-agent-refs/progress-contract.md#token-telemetry-forwarding-v83`.
348
+ Model resolves from the active mode: a Full run uses Sonnet, a Short run uses Opus. Best-effort. See `$HOME/.claude/multi-agent-refs/progress-contract.md#token-telemetry-forwarding`.
349
349
 
350
350
  ---
351
351
 
352
352
  ## Token telemetry - invoke after every LLM call
353
353
 
354
- After every LLM call in this phase (analysis, plan generation, code/diff write, review verdict, triage), invoke:
355
-
356
354
  ```bash
357
355
  bash $HOME/.claude/scripts/phase-tracker.sh tokens 3 <input_count> <output_count>
358
356
  ```
359
357
 
360
- The tracker accumulates the totals additively, so multiple calls in the same phase compound. The render output then shows live cost on the active phase tile (e.g. `Phase 3 Dev 2m 14s · 12.4k tok`). This satisfies the contract in `$HOME/.claude/multi-agent-refs/tracker-contract.md` and the `smoke-tracker-tokens-invocation.sh` enforcement gate. Skipping this call is the #1 cause of "I can't see how much it cost" complaints.
361
-
362
- If you do not have access to the model's reported token counts, pass best-effort estimates derived from input length / output length - partial cost data is better than none.
358
+ Contract and rationale: `progress-contract.md` -> Token telemetry forwarding.
363
359
 
364
360
 
365
361
  #### Generated trees are not yours to edit
@@ -565,7 +565,7 @@ bash "$M" "$TASK_ID" 4 review.completed raw_count=$RAW accepted=$ACC \
565
565
  deferred=$DEF rejected=$REJ approved=$APPROVED duration_ms=$DURATION
566
566
  ```
567
567
 
568
- `LOG_METRIC_FORWARD_TO_TRACKER=1` mirrors `tokens_in`/`tokens_out`/`model` into `phase-tracker.sh` (see `$HOME/.claude/multi-agent-refs/progress-contract.md#token-telemetry-forwarding-v83`). On non-zero validator exit (1/2/3), also emit `triage.edge_case` with cause. Omit `tokens_in`/`tokens_out` if unavailable. Best-effort - never fails the pipeline.
568
+ `LOG_METRIC_FORWARD_TO_TRACKER=1` mirrors `tokens_in`/`tokens_out`/`model` into `phase-tracker.sh` (see `$HOME/.claude/multi-agent-refs/progress-contract.md#token-telemetry-forwarding`). On non-zero validator exit (1/2/3), also emit `triage.edge_case` with cause. Omit `tokens_in`/`tokens_out` if unavailable. Best-effort - never fails the pipeline.
569
569
 
570
570
  ##### 3.5 Optional cross-check (single-point-of-failure mitigation)
571
571
 
@@ -630,12 +630,11 @@ Log: "Phase 4: Review - raw={N1+N2} accepted={Na} deferred={Nd} rejected={Nr}
630
630
 
631
631
  ## Token telemetry - invoke after every LLM call
632
632
 
633
- After every LLM call in this phase (analysis, plan generation, code/diff write, review verdict, triage), invoke:
634
-
635
633
  ```bash
636
634
  bash $HOME/.claude/scripts/phase-tracker.sh tokens 4 <input_count> <output_count> [cached_count]
637
635
  ```
638
636
 
639
637
  The optional 4th `cached_count` is the prompt-cache-read token count when the host reports it (Anthropic `cache_read_input_tokens`); it defaults to 0 and is priced at the cheaper `cacheReadPerMtok` rate in the Phase 7 cost ledger. The tracker accumulates the totals additively, so multiple calls in the same phase compound. The render output then shows live cost on the active phase tile (e.g. `Phase 4 Dev 2m 14s · 12.4k tok`). This satisfies the contract in `$HOME/.claude/multi-agent-refs/tracker-contract.md` and the `smoke-tracker-tokens-invocation.sh` enforcement gate. Skipping this call is the #1 cause of "I can't see how much it cost" complaints.
640
638
 
641
- If you do not have access to the model's reported token counts, pass best-effort estimates derived from input length / output length - partial cost data is better than none.
639
+ Contract and rationale: `progress-contract.md` -> Token telemetry forwarding.
640
+
@@ -158,4 +158,4 @@ LOG_METRIC_FORWARD_TO_TRACKER=1 $HOME/.claude/scripts/log-metric.sh "$TASK_ID" 5
158
158
  model=opus tokens_in=$IN tokens_out=$OUT duration_ms=$DUR
159
159
  ```
160
160
 
161
- If Phase 5 is purely user-driven (no sub-agent ran), no token forwarding is required and the cost block stays empty for this phase. Best-effort. See `$HOME/.claude/multi-agent-refs/progress-contract.md#token-telemetry-forwarding-v83`.
161
+ If Phase 5 is purely user-driven (no sub-agent ran), no token forwarding is required and the cost block stays empty for this phase. Best-effort. See `$HOME/.claude/multi-agent-refs/progress-contract.md#token-telemetry-forwarding`.
@@ -345,4 +345,4 @@ LOG_METRIC_FORWARD_TO_TRACKER=1 $HOME/.claude/scripts/log-metric.sh "$TASK_ID" 6
345
345
  model=<sonnet|opus> tokens_in=$IN tokens_out=$OUT duration_ms=$DUR
346
346
  ```
347
347
 
348
- Best-effort. See `$HOME/.claude/multi-agent-refs/progress-contract.md#token-telemetry-forwarding-v83`.
348
+ Best-effort. See `$HOME/.claude/multi-agent-refs/progress-contract.md#token-telemetry-forwarding`.