@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.
- package/CHANGELOG.md +32 -0
- package/README.md +5 -4
- package/README.tr.md +5 -4
- package/docs/adr/0010-own-code-graph.md +6 -0
- package/docs/adr/0011-dormant-ci.md +87 -0
- package/docs/adr/README.md +1 -0
- package/docs/architecture.md +2 -2
- package/docs/ecosystem.md +5 -5
- package/install/_common.mjs +0 -1
- package/install/_dev-only-files.mjs +1 -0
- package/install/claude.mjs +14 -4
- package/install/index.mjs +8 -1
- package/package.json +6 -5
- package/pipeline/commands/multi-agent/help/SKILL.md +44 -39
- package/pipeline/commands/multi-agent/steer/SKILL.md +109 -0
- package/pipeline/commands/multi-agent/sync/SKILL.md +5 -7
- package/pipeline/multi-agent-refs/cross-cli-contract.md +4 -4
- package/pipeline/multi-agent-refs/phases/operations.md +23 -0
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +4 -0
- package/pipeline/multi-agent-refs/phases/phase-7-report.md +1 -1
- package/pipeline/multi-agent-refs/phases.md +38 -0
- package/pipeline/preferences-template.json +2 -10
- package/pipeline/rules/outside-the-pipeline.md +1 -1
- package/pipeline/schemas/agent-state.schema.json +35 -0
- package/pipeline/schemas/analysis-spec.schema.json +8 -2
- package/pipeline/schemas/conventions-output.schema.json +2 -13
- package/pipeline/scripts/build-references.mjs +22 -6
- package/pipeline/scripts/code-graph-rules/android.json +4 -21
- package/pipeline/scripts/code-graph-rules/go.json +4 -19
- package/pipeline/scripts/code-graph-rules/node.json +4 -21
- package/pipeline/scripts/feedback-send.mjs +3 -1
- package/pipeline/scripts/gate-linux.sh +62 -0
- package/pipeline/scripts/localize-commands.mjs +1 -2
- package/pipeline/scripts/pre-push-check.sh +6 -4
- package/pipeline/scripts/usage-report.mjs +16 -14
- package/pipeline/scripts/validate-analysis-doc.mjs +46 -27
- package/pipeline/scripts/validate-analysis.mjs +7 -1
- package/pipeline/scripts/validate-complaint-doc.mjs +24 -8
- package/pipeline/scripts/write-state.mjs +71 -12
- package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +111 -0
- 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
|
|
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
|
|
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 +
|
|
217
|
-
| Codex CLI | `--codex` | one router skill +
|
|
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
|
|
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ı
|
|
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 +
|
|
217
|
-
| Codex CLI | `--codex` | bir router skill + ref olarak
|
|
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.
|
package/docs/adr/README.md
CHANGED
|
@@ -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
|
|
package/docs/architecture.md
CHANGED
|
@@ -117,7 +117,7 @@ graph TB
|
|
|
117
117
|
end
|
|
118
118
|
|
|
119
119
|
subgraph "Pipeline Specs"
|
|
120
|
-
CMD[commands/<br/>
|
|
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 +
|
|
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
|
|
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 ·
|
|
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/>
|
|
68
|
-
CC -->|"Step 2b: transform<br/>(install.js --codex)"| COD["Codex CLI<br/>1 router skill +
|
|
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** |
|
|
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`) |
|
package/install/_common.mjs
CHANGED
|
@@ -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. */
|
package/install/claude.mjs
CHANGED
|
@@ -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({
|
|
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(
|
|
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(
|
|
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 = [
|
|
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.
|
|
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
|
-
|
|
151
|
-
|
|
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
|
|
206
|
-
|
|
207
|
-
/multi-agent:design-check Whole-module
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
/multi-agent:design-check
|
|
214
|
-
|
|
215
|
-
/
|
|
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
|
-
|
|
425
|
-
|
|
426
|
-
ai-<stack>-toolkit
|
|
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
|
|
492
|
+
Design Check (mock-mod vs Figma, yalnızca lokal):
|
|
481
493
|
|
|
482
|
-
/multi-agent:design-check Tüm modül
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
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...>
|
|
491
|
-
/multi-agent:design-check --resume
|
|
492
|
-
# KAPSAM GEÇİDİ: her hedef ya denetlenir ya da SOMUT
|
|
493
|
-
#
|
|
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
|
|