@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 +17 -0
- package/README.md +6 -0
- package/README.tr.md +6 -0
- package/install/index.mjs +25 -0
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/update/SKILL.md +13 -8
- package/pipeline/multi-agent-refs/phases/phase-1-analysis.md +2 -5
- package/pipeline/multi-agent-refs/phases/phase-2-planning.md +2 -5
- package/pipeline/multi-agent-refs/phases/phase-3-dev.md +2 -6
- package/pipeline/multi-agent-refs/phases/phase-4-review.md +3 -4
- package/pipeline/multi-agent-refs/phases/phase-5-test.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-6-commit.md +1 -1
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.
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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=$(
|
|
126
|
+
[ -z "$TOK" ] && TOK=$(pref global.usageLog.token)
|
|
122
127
|
if [ -z "$TOK" ]; then
|
|
123
|
-
KNAME=$(
|
|
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=$(
|
|
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=$(
|
|
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" |
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
348
|
+
Best-effort. See `$HOME/.claude/multi-agent-refs/progress-contract.md#token-telemetry-forwarding`.
|