@mmerterden/multi-agent-pipeline 16.14.0 → 16.16.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 (41) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +5 -4
  3. package/README.tr.md +5 -4
  4. package/docs/adr/0010-own-code-graph.md +6 -0
  5. package/docs/adr/0011-dormant-ci.md +87 -0
  6. package/docs/adr/README.md +1 -0
  7. package/docs/architecture.md +2 -2
  8. package/docs/ecosystem.md +5 -5
  9. package/install/_common.mjs +0 -1
  10. package/install/_dev-only-files.mjs +1 -0
  11. package/install/claude.mjs +14 -4
  12. package/install/index.mjs +8 -1
  13. package/package.json +6 -5
  14. package/pipeline/commands/multi-agent/help/SKILL.md +44 -39
  15. package/pipeline/commands/multi-agent/steer/SKILL.md +109 -0
  16. package/pipeline/commands/multi-agent/sync/SKILL.md +5 -7
  17. package/pipeline/multi-agent-refs/cross-cli-contract.md +4 -4
  18. package/pipeline/multi-agent-refs/phases/operations.md +23 -0
  19. package/pipeline/multi-agent-refs/phases/phase-0-init.md +4 -0
  20. package/pipeline/multi-agent-refs/phases/phase-7-report.md +1 -1
  21. package/pipeline/multi-agent-refs/phases.md +38 -0
  22. package/pipeline/preferences-template.json +2 -10
  23. package/pipeline/rules/outside-the-pipeline.md +1 -1
  24. package/pipeline/schemas/agent-state.schema.json +35 -0
  25. package/pipeline/schemas/analysis-spec.schema.json +8 -2
  26. package/pipeline/schemas/conventions-output.schema.json +2 -13
  27. package/pipeline/scripts/build-references.mjs +22 -6
  28. package/pipeline/scripts/code-graph-rules/android.json +4 -21
  29. package/pipeline/scripts/code-graph-rules/go.json +4 -19
  30. package/pipeline/scripts/code-graph-rules/node.json +4 -21
  31. package/pipeline/scripts/feedback-send.mjs +3 -1
  32. package/pipeline/scripts/gate-linux.sh +62 -0
  33. package/pipeline/scripts/localize-commands.mjs +1 -2
  34. package/pipeline/scripts/pre-push-check.sh +6 -4
  35. package/pipeline/scripts/usage-report.mjs +16 -14
  36. package/pipeline/scripts/validate-analysis-doc.mjs +46 -27
  37. package/pipeline/scripts/validate-analysis.mjs +7 -1
  38. package/pipeline/scripts/validate-complaint-doc.mjs +24 -8
  39. package/pipeline/scripts/write-state.mjs +71 -12
  40. package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +111 -0
  41. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +4 -4
package/CHANGELOG.md CHANGED
@@ -16,6 +16,38 @@ Internal file-layout changes that don't affect the slash-command surface are sti
16
16
 
17
17
  ## [Unreleased]
18
18
 
19
+ ## [16.16.0] - 2026-08-31
20
+
21
+ ### Added
22
+
23
+ - **`/multi-agent:steer #N "<instruction>"` corrects a run without stopping it.** `kill` deletes a task and `resume` picks a stopped one back up; neither helps while a phase is in flight, so a correction that arrived mid-run had nowhere to go and the run finished in the wrong direction. The command queues one instruction into `state.pendingSteer`, written through `write-state.mjs` rather than by editing a file the running task is also writing to, and the next phase reads it at entry, applies it, and marks it consumed with `appliedAt`/`appliedPhase` while keeping the record as a trace. Entry rather than mid-phase on purpose: a phase that changes target halfway discards the work it already did, which is the outcome the command exists to avoid. An instruction that contradicts an approved plan halts for the user instead of silently rewriting it. `smoke-steer.sh` walks the whole path - schema, writer, phase-entry contract, help and both READMEs - because a command whose only value is a phase reading the field back is exactly the shape that ships green and dead.
24
+ - **`state.rev`, a monotonic revision counter.** The advisory lock makes a single write atomic and nothing more; it does not cover the gap between a phase reading state and writing it back, and `steer` above puts a deliberate second writer inside that gap. A reader that keeps the `rev` it read can tell the record moved underneath it instead of silently dropping whatever landed in between. Every successful write bumps `rev`; the writer takes the higher of the on-disk value and the incoming patch, so a stale patch cannot walk the counter backwards. A record written before this has none - treat a missing `rev` as 0.
25
+ - **`npm run gate:linux`** runs the ci-lite job on a real Ubuntu image through `act`, covering the Linux leg and a clean `npm ci` that the macOS pre-push gate cannot answer. Deliberately not part of `npm run gate`: `act` is not installed everywhere, and a required gate that cannot run is the failure ADR-0011 exists to avoid.
26
+
27
+ ### Fixed
28
+
29
+ - **A live lock holder could lose its lock to the age rule.** `write-state.mjs` judged a lock stale when its holder PID was dead **or** the file was older than 30 seconds - age checked first, and returning on its own. So a writer that was demonstrably alive had its lock deleted the moment the file aged out, and the next writer overwrote the update behind it. Liveness now outranks age: an alive holder keeps its lock, `WRITE_STATE_LOCK_STALE_MS` applies only to a lock with no readable PID, and a new `WRITE_STATE_LOCK_ABANDON_MS` (default ten times that) is the last-resort ceiling for a recycled PID. No heartbeat: the writer holds the lock across one synchronous write, so there is no window for a timer to refresh anything, and a refreshed timestamp is weaker evidence than the liveness probe already gives.
30
+ - **Prettier was enforced nowhere, and `main` was failing it.** `format:check` was declared in `package.json`, wired into ci-lite, and ci-lite has not executed since 2026-07-02; `eslint-config-prettier` only disables conflicting rules, it does not check formatting. Twenty-five files were failing the project's own declared style. `format:check` now runs inside `npm test`, so the pre-push gate carries it, and a `.prettierignore` exempts two trees with reasons: git worktrees checked out inside the repo, and `pipeline/skills/shared/external/`, which stays byte-identical to upstream so a re-derivation diff remains readable.
31
+ - **The installed-tree leak sweep was running against a private copy of the pattern list, drifted to under half of it.** `smoke-install-leak-gate.sh` carried its own patterns under a comment saying it mirrored `smoke-personal-data.sh`. It did not: personal domains, the maintainer's name, one spelling of the machine username, corporate symbol prefixes and product literals were all missing, so the sweep that runs on every `npm test` was weaker than the one in ci-lite - which has not executed since 2026-07-02. The step now delegates to the file that owns the list, and ci-lite's inline copy of the same dance was replaced by a call to that smoke. Three shapes the private copy caught and the owner did not (a trailing-underscore username compound, the bare organisation name, an address with no local part) were added to the owner, so the union is preserved rather than traded away - and the first of them immediately caught a real leak that had been sitting in `docs/internal/`, which the narrower pattern could not match. That file is not in the published tarball, so nothing reached a user.
32
+
33
+ ### Changed
34
+
35
+ - **CI is dormant in the repository, not only in platform state.** `test.yml` and `ci-lite.yml` still declared `on: push` and `on: pull_request` while both had already been disabled from the Actions UI - true only for a fork, or for whoever re-enables one without reading further. Both trigger blocks are commented out with the reason beside them, `workflow_dispatch` stays live, and [ADR-0011](./docs/adr/0011-dormant-ci.md) records why, what stays unverified while they sleep (the `windows-test` job, a clean Linux runner, a clean `npm ci` from the lockfile) and the two-line wake-up. `CONTRIBUTING.md` now tells an outside contributor that no workflow will run on their PR and to paste the `npm run gate` output instead of waiting for a green tick.
36
+ - **The scorecard covers moderate advisories and registry signatures.** It measured high and critical only; `--audit-level=moderate` and `npm audit signatures` lived in ci-lite and stopped running with it. Both are scorecard metrics now, the moderate ceiling locked at the measured value of 0. An unreachable registry fails the signature metric rather than skipping it: a supply-chain check that reports green when it could not reach the registry is worse than no check.
37
+
38
+ ## [16.15.0] - 2026-08-30
39
+
40
+ ### Fixed
41
+
42
+ - **Usage reporting only ever reported runs that finished.** The reporter was called from Phase 7, and Phase 7 is the phase a run is least likely to reach: across the whole local log history, exactly one run got there. So the admin dashboard read zero of everything while the table held real rows, and the question it exists to answer - who is using this - had no answer. Phase 0's exit gate now reports the run as started, on the same upsert key, so Phase 7 replaces that row with the final state and nothing is double-counted. The read side of the same bug is fixed in the dashboard: its rollup folded only `terminal` rows, and an unfinished run was scored `fail`.
43
+
44
+
45
+ ### Changed
46
+
47
+ - **`/multi-agent:help` now covers the plugins and the toolkit MCP.** It named both in passing - a `refactor` line, a `sync` line, a `design-check` footnote - and never said what they are or how to call one. The catalog gained a Plugins & tools block in both languages: how a stack skill is invoked, which plugins are always on, and the MCP's 83 tools grouped by what they drive (device control, web, design comparison, store and accessibility audits), with the note that its registration survives uninstall. Paid for by compressing the `design-check` entry, which was restating its own contract in fifteen lines: 353 tokens reclaimed before a byte was added, so the file sits within its 8500 ceiling. The tool count that went in with it was wrong and is now absent: `rules/outside-the-pipeline.md` said 83 while the server serves 84, and the pipeline cannot check either number because it does not vendor the toolkit. Both places now say 80+, which stays true; the exact count lives in the toolkit's own README, where a gate boots the server and compares `tools/list` against it.
48
+
49
+ - **ADR-0010 now says where its numbers come from.** The coverage and token figures were published with no path to the harness that produced them, because the harness names a private codebase and cannot ship. It lives beside the graph it measured, under `~/.claude/knowledge/<project>/gate/`, and the ADR points at it: a number nobody can re-derive is an assertion, not a measurement.
50
+
19
51
  ## [16.14.0] - 2026-08-28
20
52
 
21
53
  ### Added
package/README.md CHANGED
@@ -89,7 +89,7 @@ Depth, autopilot and `--local` are the only knobs on the run itself; everything
89
89
 
90
90
  ## Commands
91
91
 
92
- `/multi-agent` plus 54 sub-commands. `/multi-agent:help` renders the same catalog in your terminal, in your `outputLanguage`.
92
+ `/multi-agent` plus 55 sub-commands. `/multi-agent:help` renders the same catalog in your terminal, in your `outputLanguage`.
93
93
 
94
94
  ### Pipeline entries
95
95
 
@@ -109,6 +109,7 @@ Depth, autopilot and `--local` are the only knobs on the run itself; everything
109
109
  | `/multi-agent:log [#N]` | Show a task's `agent-log.md` (most recent by default) |
110
110
  | `/multi-agent:resume [#N]` | Carry a stopped or failed task on from its last phase |
111
111
  | `/multi-agent:kill [#N]` | Stop a task, remove its worktree and branch |
112
+ | `/multi-agent:steer #N "<instruction>"` | Correct a running task without stopping it; applied at the next phase boundary |
112
113
  | `/multi-agent:search` | Ranked search across every task log; `--semantic` queries the triage corpus |
113
114
  | `/multi-agent:garbage-collect` | Sweep leftover scratch, orphan worktrees and offloaded payloads. Dry-run first |
114
115
  | `/multi-agent:prune-logs` | Delete per-task logs by age / project / task. Audit trail and metrics kept |
@@ -208,13 +209,13 @@ This enables the matching plugin (+ the shared `ai-common` plugin) in the repo's
208
209
 
209
210
  ## Tool support
210
211
 
211
- The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same 54 commands.
212
+ The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same 55 commands.
212
213
 
213
214
  | Tool | Flag | What it installs |
214
215
  |---|---|---|
215
216
  | Claude Code | `--claude` (default) | slash commands + skills + agents + `PreToolUse` secret-scan hook |
216
- | Copilot CLI | `--copilot` | instructions + 54 sub-command skills + scripts |
217
- | Codex CLI | `--codex` | one router skill + 54 specs as refs + 8 agent TOML + `AGENTS.md` block + `codex mcp add` |
217
+ | Copilot CLI | `--copilot` | instructions + 55 sub-command skills + scripts |
218
+ | Codex CLI | `--codex` | one router skill + 55 specs as refs + 8 agent TOML + `AGENTS.md` block + `codex mcp add` |
218
219
 
219
220
  Filter skills by stack with `--platform=ios\|android\|all`.
220
221
 
package/README.tr.md CHANGED
@@ -89,7 +89,7 @@ Koşunun kendisinde ayarlanabilen tek şey derinlik, autopilot ve `--local`; ger
89
89
 
90
90
  ## Komutlar
91
91
 
92
- `/multi-agent` ve 54 alt komut. `/multi-agent:help` aynı katalogu terminalde, `outputLanguage` ayarına göre gösterir.
92
+ `/multi-agent` ve 55 alt komut. `/multi-agent:help` aynı katalogu terminalde, `outputLanguage` ayarına göre gösterir.
93
93
 
94
94
  ### Pipeline girişleri
95
95
 
@@ -109,6 +109,7 @@ Koşunun kendisinde ayarlanabilen tek şey derinlik, autopilot ve `--local`; ger
109
109
  | `/multi-agent:log [#N]` | Görevin `agent-log.md` dosyası (varsayılan: en son görev) |
110
110
  | `/multi-agent:resume [#N]` | Durmuş ya da hata almış görevi kaldığı fazdan sürdürür |
111
111
  | `/multi-agent:kill [#N]` | Görevi durdurur, worktree'sini ve branch'ini siler |
112
+ | `/multi-agent:steer #N "<talimat>"` | Koşan bir görevi durdurmadan düzeltir; talimat bir sonraki faz sınırında uygulanır |
112
113
  | `/multi-agent:search` | Tüm görev loglarında sıralamalı arama; `--semantic` triyaj corpus'unu sorgular |
113
114
  | `/multi-agent:garbage-collect` | Artık scratch, sahipsiz worktree ve offload edilmiş payload'ları süpürür. Önce dry-run |
114
115
  | `/multi-agent:prune-logs` | Görev loglarını yaş / proje / görev filtresiyle siler. Denetim izi ve metrikler kalır |
@@ -208,13 +209,13 @@ Bu, ilgili plugin'i (+ ortak `ai-common` plugin'ini) repo'nun `.claude/settings.
208
209
 
209
210
  ## Araç desteği
210
211
 
211
- Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çalışır - üçü de aynı `pipeline/` kaynağından kurulur ve aynı 54 komutu alır.
212
+ Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çalışır - üçü de aynı `pipeline/` kaynağından kurulur ve aynı 55 komutu alır.
212
213
 
213
214
  | Araç | Bayrak | Ne kurar |
214
215
  |---|---|---|
215
216
  | Claude Code | `--claude` (varsayılan) | slash komutları + skill'ler + agent'lar + `PreToolUse` secret-scan hook'u |
216
- | Copilot CLI | `--copilot` | talimatlar + 54 alt-komut skill'i + script'ler |
217
- | Codex CLI | `--codex` | bir router skill + ref olarak 54 spec + 8 agent TOML + `AGENTS.md` bloğu + `codex mcp add` |
217
+ | Copilot CLI | `--copilot` | talimatlar + 55 alt-komut skill'i + script'ler |
218
+ | Codex CLI | `--codex` | bir router skill + ref olarak 55 spec + 8 agent TOML + `AGENTS.md` bloğu + `codex mcp add` |
218
219
 
219
220
  Skill'leri stack'e göre filtrele: `--platform=ios\|android\|all`.
220
221
 
@@ -96,6 +96,12 @@ domain words, the graph scored 63.3% against 32.0% at 10,937 tokens against
96
96
  24,983. The value is in narrowing an open-ended search, not in replacing a
97
97
  grep for a name you already know.
98
98
 
99
+ The harness, the ten graded questions and the raw per-question result live
100
+ beside the graph they measured, under `~/.claude/knowledge/<project>/gate/`.
101
+ They stay there rather than in this repo because they name the private
102
+ codebase's files and symbols, and a number nobody can re-derive is an assertion
103
+ rather than a measurement: `node run-gate.mjs` reproduces the table above.
104
+
99
105
  That measurement covers the context each strategy assembles, not the quality
100
106
  of an answer written from it. graphify's numbers measure the latter. The two
101
107
  are not directly comparable and this ADR does not claim they are.
@@ -0,0 +1,87 @@
1
+ # 11. CI stays in the repository but dormant; the pre-push gate is primary
2
+
3
+ **Status:** Accepted · 2026-08-31
4
+
5
+ ## Context
6
+
7
+ The repository carries four workflows. `test.yml` runs the full chain across a
8
+ macOS/Ubuntu matrix plus a separate `windows-test` job, `ci-lite.yml` runs a
9
+ single cheap Ubuntu job, `release.yml`
10
+ publishes on a version tag and `live-eval.yml` is a manual, budgeted evaluation.
11
+
12
+ None of the first three has executed since 2026-07-02. That day's last run took
13
+ 318 seconds and passed; every attempt after it - five, the last on 2026-07-25 -
14
+ finished in about four seconds with zero steps recorded, which is the shape of a
15
+ quota block rather than a test failure. All three were then disabled from the
16
+ Actions UI. That stopped the noise but moved the fact out of the repository:
17
+ the files still declared `on: push` and `on: pull_request`, so anyone reading
18
+ them, forking them, or re-enabling the workflow inherited a promise the project
19
+ does not keep.
20
+
21
+ Meanwhile the gate did not disappear. `pipeline/scripts/pre-push-check.sh` runs
22
+ the canonical `npm test` chain, stamps the exact tree it verified, and refuses
23
+ any push whose tree carries no stamp. It is installed as `.git/hooks/pre-push`.
24
+ So the question was never "is this code verified" but "verified where, and what
25
+ does that leave uncovered".
26
+
27
+ There is no plan to run this on a server in the near term. There is a possible
28
+ later direction (an issue-triggered run that starts development automatically),
29
+ which argues for keeping the workflow files rather than deleting them.
30
+
31
+ ## Decision
32
+
33
+ Keep every workflow file. Comment out the `push` and `pull_request` triggers in
34
+ `test.yml` and `ci-lite.yml`, leaving `workflow_dispatch` live, and state the
35
+ dormancy in the file header next to the triggers.
36
+
37
+ Treat `npm run gate` as the primary gate, not as a fallback, and close the parts
38
+ of the ci-lite job that had no local equivalent: `format:check` joins the `npm
39
+ test` chain, the install dry-run plus personal-data audit moves onto the
40
+ existing `smoke-install-leak-gate.sh` (which was already doing the same install
41
+ into a temp HOME, against a private copy of the pattern list that had drifted to
42
+ less than half of it), the scorecard gains the two dependency checks that lived
43
+ only in ci-lite - moderate advisories and `npm audit signatures` - and the Linux
44
+ leg is reachable as `npm run gate:linux` through `act`.
45
+
46
+ Waking CI is a two-line edit: uncomment the trigger blocks and re-enable the
47
+ workflow in the Actions UI. Nothing else in the files changes.
48
+
49
+ ## Consequences
50
+
51
+ A reader of the repository now sees what actually runs. A fork does not
52
+ inherit surprise runs that fail for a reason belonging to this account.
53
+
54
+ The local gate runs the canonical chain rather than a hand-picked subset: the
55
+ hook calls `npm test`, so a step added to that script is a step the hook runs.
56
+ `ci-lite.yml` still enumerates its steps one by one and can therefore drift
57
+ behind the script - which is a further reason the local gate, not the workflow,
58
+ is the one being trusted.
59
+
60
+ What stays unverified while the workflows sleep, stated rather than implied:
61
+
62
+ - Windows. `lib/credential-store.sh` has a Windows branch exercised only by
63
+ `test.yml`'s separate `windows-test` job (the matrix itself is Ubuntu and
64
+ macOS).
65
+ - A clean `npm ci` from the lockfile into an empty tree. The local gate runs
66
+ against an installed `node_modules` that has accumulated across months.
67
+ - Linux, unless someone actually runs `npm run gate:linux`. It is deliberately
68
+ not a required step: `act` is not installed everywhere, and a required gate
69
+ that cannot run is the failure this ADR exists to avoid.
70
+
71
+ `release.yml` keeps its tag trigger and stays disabled in the UI. Publishing is
72
+ done locally from a clean tag clone, so the tag flow is what a future wake-up
73
+ would want unchanged.
74
+
75
+ ## Alternatives
76
+
77
+ **Pay for Actions minutes.** Buys the matrix and the clean room. Rejected for
78
+ now: there is no server-side plan to justify a recurring cost, and the local
79
+ gate already covers everything except the three items listed above.
80
+
81
+ **Make this machine a self-hosted runner.** Free and real. Rejected: it covers
82
+ only macOS, disappears when the laptop is closed, and a self-hosted runner on a
83
+ public repository executes code from any fork's pull request.
84
+
85
+ **Delete the workflows.** Honest but lossy. The files encode which steps matter
86
+ and in what order, and the possible issue-triggered direction would have to
87
+ rebuild them from nothing.
@@ -20,6 +20,7 @@ Format: lightly adapted from [Michael Nygard's ADR template](https://cognitect.c
20
20
  | [0008](./0008-installer-modularization-and-secret-leak-defense.md) | Installer modularization + secret-leak defense | Accepted (amended v10.7.0: adapter module removed) |
21
21
  | [0009](./0009-claude-stack-skills-plugin-only.md) | Claude Code stack skills are plugin-only; local copy retired | Accepted (supersedes ADR-0006 install-destination clause) |
22
22
  | [0010](./0010-own-code-graph.md) | Own code graph, referenced from graphify, not forked | Accepted |
23
+ | [0011](./0011-dormant-ci.md) | CI dormant in-repo; pre-push gate is primary | Accepted |
23
24
 
24
25
  ## Writing a New ADR
25
26
 
@@ -117,7 +117,7 @@ graph TB
117
117
  end
118
118
 
119
119
  subgraph "Pipeline Specs"
120
- CMD[commands/<br/>54 command files]
120
+ CMD[commands/<br/>55 command files]
121
121
  AGT[agents/<br/>8 agent personas]
122
122
  RUL[rules/<br/>12 domain rules]
123
123
  PHS[multi-agent-refs/phases/<br/>phase specs + contracts]
@@ -170,7 +170,7 @@ revisions of this diagram - Codex CLI and the two independently-shipped repos
170
170
  graph TD
171
171
  CC["Claude Code<br/>(source of truth)"]
172
172
  COP["Copilot CLI<br/>(instructions + 51 skills)"]
173
- COD["Codex CLI<br/>(1 router skill + 54 refs)"]
173
+ COD["Codex CLI<br/>(1 router skill + 55 refs)"]
174
174
  REPO["Pipeline Repo<br/>(npm package)"]
175
175
  WEB["Website"]
176
176
  PLUGREPO["multi-agent-plugins<br/>(5 stack plugins, own repo)"]
package/docs/ecosystem.md CHANGED
@@ -5,7 +5,7 @@ separately, wired together at install time and at run time:
5
5
 
6
6
  | Repo | What it owns | Ships as |
7
7
  |---|---|---|
8
- | **`multi-agent-pipeline`** (this repo) | Orchestration: the 8-phase flow, the 54 slash commands, quality gates, review/triage, cross-CLI parity | npm package (`@mmerterden/multi-agent-pipeline`), installs itself onto Claude Code / Copilot CLI / Codex CLI |
8
+ | **`multi-agent-pipeline`** (this repo) | Orchestration: the 8-phase flow, the 55 slash commands, quality gates, review/triage, cross-CLI parity | npm package (`@mmerterden/multi-agent-pipeline`), installs itself onto Claude Code / Copilot CLI / Codex CLI |
9
9
  | **`multi-agent-plugins`** | Stack knowledge: per-platform component/lifecycle skills (iOS, Android, Frontend, Backend) + shared knowledge | Claude Code marketplace, 5 independently-versioned plugins |
10
10
  | **`multi-agent-toolkit-mcp`** | The pipeline's hands on devices and browsers: 80 MCP tools across 6 categories (simulator/emulator control, accessibility audit, store compliance, web automation, Figma-vs-mock design audit, an agent-DSL batch runner) | npm package, registered as a standard stdio MCP server on every host |
11
11
 
@@ -18,7 +18,7 @@ Either can be swapped or removed without touching the other two's source.
18
18
  graph LR
19
19
  subgraph PIPE ["multi-agent-pipeline (orchestrator)"]
20
20
  direction TB
21
- PHASES["8 phases · 54 commands"]
21
+ PHASES["8 phases · 55 commands"]
22
22
  GATES["deterministic gates + review triage"]
23
23
  end
24
24
 
@@ -64,8 +64,8 @@ only those:
64
64
  graph TD
65
65
  CC["Claude Code<br/>~/.claude/commands/multi-agent/<br/>(source of truth)"]
66
66
 
67
- CC -->|"Step 2: copy + reformat<br/>54 sub-command skills"| COP["Copilot CLI<br/>~/.copilot/skills/"]
68
- CC -->|"Step 2b: transform<br/>(install.js --codex)"| COD["Codex CLI<br/>1 router skill + 54 refs<br/>+ 8 agent TOML"]
67
+ CC -->|"Step 2: copy + reformat<br/>55 sub-command skills"| COP["Copilot CLI<br/>~/.copilot/skills/"]
68
+ CC -->|"Step 2b: transform<br/>(install.js --codex)"| COD["Codex CLI<br/>1 router skill + 55 refs<br/>+ 8 agent TOML"]
69
69
  CC -->|"Step 3: genericize<br/>(strip personal data)"| REPO["multi-agent-pipeline repo<br/>pipeline/"]
70
70
  CC -->|"Step 4: version + feature sync"| WEB["Website<br/>projects.ts / i18n.tsx"]
71
71
 
@@ -153,7 +153,7 @@ measurements behind this table):
153
153
 
154
154
  | | Claude Code | Copilot CLI | Codex CLI |
155
155
  |---|---|---|---|
156
- | **Pipeline commands** | 54 slash-command skills, native | 54 skills, `multi-agent-{cmd}` naming, copied in | 1 router skill (`multi-agent`) + 54 command specs as reference files - Codex silently truncates its skills block past a few dozen entries, so sub-commands are not peer skills here |
156
+ | **Pipeline commands** | 55 slash-command skills, native | 55 skills, `multi-agent-{cmd}` naming, copied in | 1 router skill (`multi-agent`) + 55 command specs as reference files - Codex silently truncates its skills block past a few dozen entries, so sub-commands are not peer skills here |
157
157
  | **Stack plugins** | Marketplace plugin, loaded natively, resolved by `.claude/settings.json` enabled-list | Enabled plugin's authored skills copied flat into `~/.copilot/skills/`; `knowledge/` **not** re-copied (already delivered via `shared/external`) | Copied as reference files under `~/.codex/multi-agent-refs/skills/`, plugin-prefixed on name clash (e.g. `architecture` → `ai-ios-toolkit-architecture`) |
158
158
  | **Component dispatch (Phase 3)** | Marketplace plugin's `create-component`/`create-screen` skill via the Skill tool | No plugin loader - the enabled stack plugin's authored skills (incl. `create-component`) are copied flat into `~/.copilot/skills/` at install time (the old frozen `figma-*` copies are pruned, they were never a fallback) | Not part of the enforced parity axis; classification + state-shape must match, skill *inventory* does not |
159
159
  | **multi-agent-toolkit-mcp** | `claude mcp add multi-agent-toolkit -- npx -y @mmerterden/multi-agent-toolkit-mcp` | `copilot mcp add multi-agent-toolkit -- npx -y @mmerterden/multi-agent-toolkit-mcp` | `codex mcp add multi-agent-toolkit -- npx -y @mmerterden/multi-agent-toolkit-mcp` (skipped with a warning if `codex` isn't on `PATH`) |
@@ -523,7 +523,6 @@ export function wipeDir(dir) {
523
523
  }
524
524
  }
525
525
 
526
-
527
526
  /**
528
527
  * @param {string} a
529
528
  * @param {string} b
@@ -64,6 +64,7 @@ const DEV_ONLY_TOOLING = Object.freeze([
64
64
  "validate-schemas.mjs", // validates the repo's own schema files, needs ajv
65
65
  "sync-parity-check.sh",
66
66
  "benchmark-phase-0.sh",
67
+ "gate-linux.sh", // drives .github/workflows/ci-lite.yml through act; no consumer has either
67
68
  ]);
68
69
 
69
70
  /** Eval harnesses (`eval-*.mjs`) read `pipeline/eval/**`, which never ships. */
@@ -97,7 +97,14 @@ export function installClaude(ctx) {
97
97
  installSchemas(pipelineSrc, CLAUDE_SCHEMAS, useSymlinks);
98
98
  installLib(pipelineSrc, CLAUDE_LIB, useSymlinks);
99
99
  runPreDeployScans(pipelineSrc);
100
- installSkills({ pipelineSrc, dest: CLAUDE_SKILLS, indexOnly, useSymlinks, platformFlag, pruneExternal });
100
+ installSkills({
101
+ pipelineSrc,
102
+ dest: CLAUDE_SKILLS,
103
+ indexOnly,
104
+ useSymlinks,
105
+ platformFlag,
106
+ pruneExternal,
107
+ });
101
108
  ensureClaudeMd(home, pipelineSrc);
102
109
  ensurePreferences(PREFS_PATH, pipelineSrc);
103
110
  configureSettings(home);
@@ -458,7 +465,9 @@ function installSkills(opts) {
458
465
  console.log(` -> pruned ${orphans} stale flat skill file(s) from an older layout`);
459
466
  }
460
467
 
461
- console.log(` -> ${claudeSkillCount} skill files installed to ${dest} (stack skills: marketplace plugins)`);
468
+ console.log(
469
+ ` -> ${claudeSkillCount} skill files installed to ${dest} (stack skills: marketplace plugins)`,
470
+ );
462
471
 
463
472
  // The shared skills README described the full local catalog; with the catalog
464
473
  // gone it would document skills that are not here. Drop it, including copies
@@ -604,7 +613,9 @@ function migratePreManifestExternalSkills(dest, externalSrc, opts) {
604
613
  );
605
614
  }
606
615
  if (flagged > 0) {
607
- console.log(` -> --prune-external: removed ${flagged} catalog-named skill dir(s) that had local differences`);
616
+ console.log(
617
+ ` -> --prune-external: removed ${flagged} catalog-named skill dir(s) that had local differences`,
618
+ );
608
619
  }
609
620
  if (leftover.length > 0) {
610
621
  console.log(
@@ -614,7 +625,6 @@ function migratePreManifestExternalSkills(dest, externalSrc, opts) {
614
625
  }
615
626
  }
616
627
 
617
-
618
628
  function ensureClaudeMd(home, pipelineSrc) {
619
629
  console.log(" [Claude Code] Checking CLAUDE.md template...");
620
630
  const CLAUDE_MD = join(home, ".claude", "CLAUDE.md");
package/install/index.mjs CHANGED
@@ -46,7 +46,14 @@ export async function runInstall(argv) {
46
46
  // `multi-agent-pipeline install --all` (via bin, argv[2]="install")
47
47
  const flags = argv.slice(2).filter((a) => a !== "install");
48
48
 
49
- const KNOWN_FLAGS = [...TOOL_FLAGS, "--all", "--link", "--index-only", "--dry-run", "--prune-external"];
49
+ const KNOWN_FLAGS = [
50
+ ...TOOL_FLAGS,
51
+ "--all",
52
+ "--link",
53
+ "--index-only",
54
+ "--dry-run",
55
+ "--prune-external",
56
+ ];
50
57
  const KNOWN_PREFIXES = ["--target=", "--platform="];
51
58
  const unknown = flags.filter(
52
59
  (f) =>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmerterden/multi-agent-pipeline",
3
- "version": "16.14.0",
3
+ "version": "16.16.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",
@@ -14,7 +14,7 @@
14
14
  },
15
15
  "scripts": {
16
16
  "start": "node index.js",
17
- "test": "node --test test/*.test.mjs && node pipeline/scripts/run-smokes.mjs && node pipeline/scripts/lint-skills.mjs && node pipeline/scripts/lint-mcp-refs.mjs && node pipeline/scripts/eval-triage.mjs && node pipeline/scripts/eval-golden-tasks.mjs && node pipeline/scripts/eval-intent.mjs && node pipeline/scripts/eval-recall.mjs && node pipeline/scripts/validate-schemas.mjs && node pipeline/scripts/validate-prefs.mjs && node pipeline/scripts/scorecard.mjs",
17
+ "test": "npm run format:check && node --test test/*.test.mjs && node pipeline/scripts/run-smokes.mjs && node pipeline/scripts/lint-skills.mjs && node pipeline/scripts/lint-mcp-refs.mjs && node pipeline/scripts/eval-triage.mjs && node pipeline/scripts/eval-golden-tasks.mjs && node pipeline/scripts/eval-intent.mjs && node pipeline/scripts/eval-recall.mjs && node pipeline/scripts/validate-schemas.mjs && node pipeline/scripts/validate-prefs.mjs && node pipeline/scripts/scorecard.mjs",
18
18
  "test:unit": "node --test test/*.test.mjs",
19
19
  "test:smoke": "node pipeline/scripts/run-smokes.mjs",
20
20
  "lint:skills": "node pipeline/scripts/lint-skills.mjs",
@@ -22,10 +22,11 @@
22
22
  "test:coverage": "c8 --clean --reporter=none node --test test/*.test.mjs && c8 --clean=false --check-coverage --reporter=text --reporter=lcov node pipeline/scripts/run-smokes.mjs",
23
23
  "lint": "eslint .",
24
24
  "lint:fix": "eslint . --fix",
25
- "format": "prettier --write \"**/*.{js,mjs,json,yml}\" --ignore-path .gitignore",
26
- "format:check": "prettier --check \"**/*.{js,mjs,json,yml}\" --ignore-path .gitignore",
25
+ "format": "prettier --write \"**/*.{js,mjs,json,yml}\" --ignore-path .gitignore --ignore-path .prettierignore",
26
+ "format:check": "prettier --check \"**/*.{js,mjs,json,yml}\" --ignore-path .gitignore --ignore-path .prettierignore",
27
27
  "scorecard": "node pipeline/scripts/scorecard.mjs",
28
- "gate": "bash pipeline/scripts/pre-push-check.sh --run"
28
+ "gate": "bash pipeline/scripts/pre-push-check.sh --run",
29
+ "gate:linux": "bash pipeline/scripts/gate-linux.sh"
29
30
  },
30
31
  "keywords": [
31
32
  "multi-agent",
@@ -108,6 +108,7 @@ Status & Resume:
108
108
  /multi-agent:log [#id] Show task log (defaults to most recent)
109
109
  /multi-agent:resume [#id] Resume a paused or failed task from where it stopped
110
110
  /multi-agent:kill [#id] Stop task + delete worktree (logs preserved)
111
+ /multi-agent:steer #id "..." Correct a running task without stopping it (applied at the next phase)
111
112
  /multi-agent:prune-logs Delete per-task project logs (audit + metrics kept; age/project/task filters, dry-run first)
112
113
  /multi-agent:prune-prompts Zero-base prompt review: measure always-on instruction footprint, propose keep/trial/delete per rule (report first, apply on approval)
113
114
  /multi-agent:garbage-collect Sweep leftover /tmp scratch from past runs (dry-run first)
@@ -147,8 +148,17 @@ Setup & Maintenance:
147
148
 
148
149
  ------------------------------------------------------------
149
150
 
150
- Stack plugin skills: call directly as ai-<stack>-toolkit:<skill>. Catalog:
151
- ai-<stack>-toolkit:help. Active plugins per repo: /multi-agent:stack.
151
+ Plugins & tools (called directly, no wrappers):
152
+
153
+ Stack plugins ai-<stack>-toolkit:<skill>, e.g. ai-ios-toolkit:create-component
154
+ Catalog: ai-<stack>-toolkit:help Enable per repo: /multi-agent:stack
155
+ common + analyst are always on; the rest follow the repo's stack.
156
+ Toolkit MCP multi-agent-toolkit - 80+ tools for a RUNNING app, no pipeline run needed:
157
+ ios_* / android_* (launch, tap, screenshot, ui tree, logs, crashes,
158
+ locale, dark mode), web_*, design_* (Design Check above), and the
159
+ audits (ios_app_store_audit, ios_testflight_validate, android_apk_audit,
160
+ *_accessibility_audit). Use them instead of guessing about on-screen
161
+ state. Its registration survives uninstall. Not registered = silent no-op.
152
162
 
153
163
  ------------------------------------------------------------
154
164
 
@@ -202,24 +212,17 @@ Manual Test (Phase 5 standalone - Xcode hint flow):
202
212
  /multi-agent:manual-test Checkout task branch, print Xcode/SourceTree hints,
203
213
  /multi-agent:manual-test #N wait for your "ok" / "fix: ..." verdict.
204
214
 
205
- Design Check (mock-mode vs Figma, local-only - powered by the toolkit MCP design_* tools):
206
-
207
- /multi-agent:design-check Whole-module design audit: pick repo+module, gate on mock support,
208
- enumerate every state driver (launch args, scenario cases, scenario codes,
209
- fixtures, deep links) into a countable target set, build Debug in a worktree,
210
- drive each target in mock mode via idb, compare each vs its Figma frame
211
- (padding/width/spacing/font/color/component/localization), and export a
212
- report (HTML+PDF, ~/DesignChecks).
213
- /multi-agent:design-check <screen> Scope to one screen's targets (e.g. boarding-pass).
214
- /multi-agent:design-check <screen@var> Scope to a single variant (e.g. boarding-pass@expired).
215
- /multi-agent:design-check <figma-url...> Scope to the frame(s) those URLs name.
216
- /multi-agent:design-check --resume Audit the unaudited remainder of the last run for this repo+module.
217
- # COVERAGE GATE: every target is either audited or skipped WITH a concrete reason. Anything else fails the
218
- # gate and the run is reported INCOMPLETE with the missing target ids - a partial audit never reads as clean.
219
- # "Requires a scenario / prefix / launch-arg" is not a reason; reaching those states is the run's job.
220
- # When a live screen has no confident Figma match, it SHOWS you the screenshot and asks for the node-id.
221
-
222
- Drives the toolkit design_* tools (+ ios_* / android_* device control).
215
+ Design Check (mock-mode vs Figma, local-only):
216
+
217
+ /multi-agent:design-check Whole-module audit: enumerate every state driver into a countable
218
+ target set, build Debug in a worktree, drive each in mock mode,
219
+ diff against its Figma frame, export HTML+PDF to ~/DesignChecks.
220
+ /multi-agent:design-check <screen> Scope to one screen (e.g. boarding-pass).
221
+ /multi-agent:design-check <screen@var> Scope to one variant (e.g. boarding-pass@expired).
222
+ /multi-agent:design-check <figma-url...> Scope to the frame(s) those URLs name.
223
+ /multi-agent:design-check --resume Audit what the last run for this repo+module left unaudited.
224
+ # COVERAGE GATE: every target is audited or skipped WITH a concrete reason; anything else reports
225
+ # INCOMPLETE with the missing ids. "Needs a scenario/launch-arg" is not a reason, reaching it is the job.
223
226
 
224
227
  ------------------------------------------------------------
225
228
 
@@ -382,6 +385,7 @@ Status & Resume:
382
385
  /multi-agent:log [#id] Task log'unu göster (varsayılan: en son task)
383
386
  /multi-agent:resume [#id] Duraklamış / hata almış task'ı kaldığı yerden devam ettir
384
387
  /multi-agent:kill [#id] Task'ı durdur + worktree'yi sil (log'lar korunur)
388
+ /multi-agent:steer #id "..." Koşan task'ı durdurmadan düzelt (sonraki fazda uygulanır)
385
389
  /multi-agent:prune-logs Task bazlı proje log'larını sil (audit + metrics korunur; yaş/proje/task filtresi, önce dry-run)
386
390
  /multi-agent:prune-prompts Sıfır-tabanlı prompt incelemesi: sürekli yüklü talimat yükünü ölç, kural başına tut/dene/sil öner (önce rapor, onayla uygula)
387
391
  /multi-agent:garbage-collect Geçmiş koşumların /tmp artıklarını süpür (önce dry-run)
@@ -421,9 +425,17 @@ Setup & Maintenance:
421
425
 
422
426
  ------------------------------------------------------------
423
427
 
424
- Stack plugin skill'leri: doğrudan ai-<stack>-toolkit:<skill> olarak çağrılır
425
- (örn. ai-ios-toolkit:create-component). Lokal kopya ve sarmalayıcı yok. Katalog:
426
- ai-<stack>-toolkit:help. Aktif plugin'ler repo bazında: /multi-agent:stack.
428
+ Plugin'ler ve tool'lar (doğrudan çağrılır, sarmalayıcı yok):
429
+
430
+ Stack plugin ai-<stack>-toolkit:<skill>, örn. ai-ios-toolkit:create-component
431
+ Katalog: ai-<stack>-toolkit:help Repo bazında aç: /multi-agent:stack
432
+ common + analyst hep açık; gerisi repo'nun stack'ini izler.
433
+ Toolkit MCP multi-agent-toolkit - ÇALIŞAN uygulama için 80+ tool, pipeline koşusu
434
+ gerektirmez: ios_* / android_* (başlat, tap, screenshot, ui ağacı, log,
435
+ crash, locale, koyu mod), web_*, design_* (yukarıdaki Design Check), ve
436
+ denetimler (ios_app_store_audit, ios_testflight_validate,
437
+ android_apk_audit, *_accessibility_audit). Ekrandaki durumu tahmin etmek
438
+ yerine bunları kullan. Kaydı uninstall'dan sağ çıkar. Kayıtlı değilse sessizce devre dışı.
427
439
 
428
440
  ------------------------------------------------------------
429
441
 
@@ -477,24 +489,17 @@ Manuel Test (Phase 5 standalone - Xcode hint akışı):
477
489
  /multi-agent:manual-test Task branch'ine checkout, Xcode/SourceTree hint basar,
478
490
  /multi-agent:manual-test #N "ok" / "fix: ..." yanıtını bekler.
479
491
 
480
- Design Check (mock-mod vs Figma, yalnızca lokal - multi-agent-toolkit-mcp design_* tool'larıyla):
492
+ Design Check (mock-mod vs Figma, yalnızca lokal):
481
493
 
482
- /multi-agent:design-check Tüm modül tasarım denetimi: repo+modül seç, mock desteğini geçitle,
483
- her state sürücüsünü (launch arg, senaryo case'leri, senaryo kodları,
484
- fixture'lar, deep link'ler) sayılabilir bir hedef kümesine çıkar,
485
- worktree'de Debug derle, her hedefi mock modda idb ile sür, her birini
486
- Figma frame'iyle karşılaştır (padding/genişlik/spacing/font/renk/
487
- component/localization), rapor çıkar (HTML+PDF, ~/DesignChecks).
488
- /multi-agent:design-check <ekran> Tek ekranın hedeflerine kapsa (örn. boarding-pass).
494
+ /multi-agent:design-check Tüm modül denetimi: her state sürücüsünü sayılabilir hedef kümesine
495
+ çıkar, worktree'de Debug derle, her hedefi mock modda sür, Figma
496
+ frame'iyle diff'le, HTML+PDF raporu ~/DesignChecks'e yaz.
497
+ /multi-agent:design-check <ekran> Tek ekrana kapsa (örn. boarding-pass).
489
498
  /multi-agent:design-check <ekran@varyant> Tek varyanta kapsa (örn. boarding-pass@expired).
490
- /multi-agent:design-check <figma-url...> URL'lerin işaret ettiği frame'lere kapsa.
491
- /multi-agent:design-check --resume Bu repo+modül için son koşunun denetlenmemiş kalanını denetle.
492
- # KAPSAM GEÇİDİ: her hedef ya denetlenir ya da SOMUT bir gerekçeyle atlanır. Başka her durum geçidi
493
- # düşürür ve koşu eksik hedef id'leriyle EKSİK raporlanır - kısmi denetim asla temiz görünmez.
494
- # "Senaryo / prefix / launch-arg gerektirir" gerekçe değildir; o state'lere ulaşmak koşunun işidir.
495
- # Canlı ekranın Figma karşılığı kesin bulunamazsa SANA screenshot'ı gösterip node-id sorar.
496
-
497
- multi-agent-toolkit-mcp design_* tool takımını sürer (+ ios_* / android_* cihaz kontrolü).
499
+ /multi-agent:design-check <figma-url...> URL'lerin işaret ettiği frame'lere kapsa.
500
+ /multi-agent:design-check --resume Son koşunun denetlenmemiş kalanını denetle.
501
+ # KAPSAM GEÇİDİ: her hedef ya denetlenir ya da SOMUT gerekçeyle atlanır; başka her durum eksik hedef
502
+ # id'leriyle EKSİK raporlanır. "Senaryo/launch-arg gerektirir" gerekçe değil, oraya ulaşmak koşunun işi.
498
503
 
499
504
  ------------------------------------------------------------
500
505