@mmerterden/multi-agent-pipeline 16.11.0 → 16.13.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 +49 -0
- package/README.md +9 -7
- package/README.tr.md +9 -7
- package/docs/adr/0001-three-model-triage.md +5 -0
- package/docs/adr/0010-own-code-graph.md +129 -0
- package/docs/adr/README.md +1 -0
- package/docs/architecture.md +2 -2
- package/docs/ecosystem.md +5 -5
- package/docs/features.md +26 -2
- package/package.json +1 -1
- package/pipeline/claude-md-template.md +1 -1
- package/pipeline/commands/multi-agent/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/analysis/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/graph/SKILL.md +105 -0
- package/pipeline/commands/multi-agent/help/SKILL.md +10 -10
- package/pipeline/commands/multi-agent/resume-local/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/review/SKILL.md +3 -3
- package/pipeline/commands/multi-agent/review-analysis/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/sync/SKILL.md +12 -12
- package/pipeline/commands/multi-agent/uninstall/SKILL.md +9 -7
- package/pipeline/lib/figma-screenshot.sh +107 -7
- package/pipeline/lib/md2confluence-v3.py +133 -25
- package/pipeline/multi-agent-refs/analysis/locked.md +4 -3
- package/pipeline/multi-agent-refs/analysis/render.md +44 -9
- package/pipeline/multi-agent-refs/analysis/review.md +17 -1
- package/pipeline/multi-agent-refs/analysis-template-corporate.md +14 -3
- package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -10
- package/pipeline/multi-agent-refs/features/code-graph.md +62 -0
- package/pipeline/multi-agent-refs/features/model-fallback.md +44 -2
- package/pipeline/multi-agent-refs/knowledge.md +7 -1
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-1-analysis.md +5 -0
- package/pipeline/multi-agent-refs/phases/phase-4-review.md +9 -9
- package/pipeline/multi-agent-refs/phases/phase-7-report.md +2 -0
- package/pipeline/preferences-template.json +2 -0
- package/pipeline/schemas/analysis-spec.schema.json +2 -0
- package/pipeline/schemas/code-graph.schema.json +91 -0
- package/pipeline/schemas/prefs.schema.json +45 -0
- package/pipeline/schemas/reviewer-output.schema.json +1 -1
- package/pipeline/schemas/token-budget.json +2 -2
- package/pipeline/schemas/triage-output.schema.json +1 -1
- package/pipeline/scripts/_code-graph.mjs +518 -0
- package/pipeline/scripts/_path-match.mjs +87 -0
- package/pipeline/scripts/anonymize-findings.mjs +1 -1
- package/pipeline/scripts/code-graph-rules/android.json +130 -0
- package/pipeline/scripts/code-graph-rules/ios.json +95 -0
- package/pipeline/scripts/code-graph-rules/node.json +151 -0
- package/pipeline/scripts/code-graph-rules/python.json +91 -0
- package/pipeline/scripts/graph-affected.mjs +161 -0
- package/pipeline/scripts/graph-build.mjs +157 -0
- package/pipeline/scripts/graph-query.mjs +191 -0
- package/pipeline/scripts/graph-report.mjs +237 -0
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +13 -10
- package/pipeline/scripts/test-gap-rules/ios.json +38 -10
- package/pipeline/scripts/test-gap-scan.mjs +2 -21
- package/pipeline/scripts/uninstall.mjs +11 -2
- package/pipeline/scripts/validate-analysis-doc.mjs +85 -23
- package/pipeline/scripts/validate-code-graph.mjs +174 -0
- package/pipeline/skills/.skills-index.json +14 -3
- package/pipeline/skills/shared/README.md +6 -5
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +3 -3
- package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +106 -0
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +11 -11
- package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +4 -4
- package/pipeline/skills/skills-index.md +4 -3
package/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,55 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
16
16
|
|
|
17
17
|
## [Unreleased]
|
|
18
18
|
|
|
19
|
+
## [16.13.0] - 2026-08-28
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- **`/multi-agent:graph` - a deterministic code graph, built without an LLM.** Phase 1 re-scanned the repo with grep and read on every task and defaulted to the "very thorough" tier on feature work; Phase 7 wrote `architecture.md` from one task's window and let it age for 90 days. Both wanted the same answer: where does this live, and what depends on it. `graph-build.mjs` extracts symbols, imports and references by regex over comment-stripped source into `~/.claude/knowledge/<project>/code-graph.json`; `graph-query.mjs` runs a token-budgeted traversal, `graph-affected.mjs` walks it backwards for impact, `graph-report.mjs` renders `GRAPH_REPORT.md`, and `validate-code-graph.mjs` fails a build whose edges point at missing nodes. Zero runtime dependencies, zero API cost, read-only on the repo. Design reference: `Graphify-Labs/graphify`; the reasoning, the trade and the numbers are in `docs/adr/0010-own-code-graph.md`.
|
|
24
|
+
- **Phase 1 Step 2.6 and Phase 7 graph refresh, behind `prefs.global.codeGraph.enabled` (default `false`).** When on, Phase 1 queries the graph and hands Explore a ranked starting set instead of a full scan, and Phase 7 rebuilds the graph after the branch changed code. Off, the pipeline behaves exactly as before. Measured on a 4,300-file Swift app at a fixed 30k retrieval budget: 80.4% coverage at 18,465 tokens against 66.0% at 24,555 for grep-and-read. The win is entirely in domain-word searches (63.3% vs 32.0% at under half the cost); when the task already names an exact type, `grep -lw` is still slightly better and slightly cheaper, and the command says so.
|
|
25
|
+
- **`_path-match.mjs`.** The glob matcher `test-gap-scan.mjs` carried inline is now shared with the graph engine, so the two cannot drift apart on what a repo excludes.
|
|
26
|
+
- **Code-graph rules for Android, Node and Python.** Four stacks now build: measured on a 4,229-file Kotlin app (25,234 nodes, 70,897 edges), this repo (126 sources) and a 43-file Python service, each validated and each hub list checked by hand rather than assumed correct. Two engine defects surfaced doing it, both of which iOS had been getting away with. Nesting was read from the pattern's match column, so `public final class Foo` counted as nested because the match starts at `class` seven columns in; it now reads the line's indentation. And the import pass read a fully stripped body, which blanks a JavaScript module specifier because the specifier IS a string literal - every import edge in that stack would have vanished with nothing to notice it. iOS was re-gated after both and scored identically (80.4% at 18,467 tokens).
|
|
27
|
+
- **A nested declaration is a node but never a reference target.** Kotlin sealed cases and Python inner classes are named after the concept they model - `Icon`, `Color`, `Success`, `Disabled` - and each is declared exactly once, so the ambiguity rule never caught them. Every Kotlin file that merely mentioned Compose's `Color` gained an edge to one app's nested case: 4,072 false edges out of 74,969, and four of the top eight architectural hubs were wrong. They stay findable by name through their `defines` edge.
|
|
28
|
+
- **`prefs.global.modelFallback.fableEnabled` (default `true`) - the fable rung as a switch, not only as a fallback.** Every other trigger in the fallback contract reacts to something going wrong; this one asserts up front that a rung is not in play, so there is no dispatch attempt and no error to recover from. `false` starts `ios/android/backend-architect`, `code-reviewer` and triage on `opus`. Claude Code only: Copilot CLI does not offer Fable 5, and on Codex CLI the `fable` rung means `gpt-5.6 @ xhigh`, a different vendor's model on a different account, which the switch deliberately leaves alone. Turning it off also collapses the Phase 4 Claude Code panel to two reviewers, because Reviewer 1 lands on the `opus` Reviewer 2 already holds and one model dispatched twice is not cross-model review; `consensus.reviewerCount` records `2`. Set `costBudget.priceAt` to `opus` alongside it, or the estimate keeps pricing at a rung nothing runs on and trips the ceiling early.
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
- **`derivedSkillSources` could not say which repo held the derived copies.** `localPath` reads as relative to the current repo, so both entries pointed at the UPSTREAM tree and stayed wrong through a plugin rename: the drift check was comparing a path that did not exist. Added `localRepo`, corrected both entries, and re-derived their skill lists from the tree instead of from memory.
|
|
33
|
+
- **Two `excludePathGlobs` shapes were silently inert.** A pattern with a wildcard and no `**` fell through to a literal `endsWith` / `includes` test against the pattern text, which can never be true: nothing ends with the characters `*.d.ts`. So `*.d.ts` in the node rules and `*.egg-info/` in the python rules excluded nothing, and generated typings and build residue reached every consumer of those rules, `test-gap-scan.mjs` included. Both shapes now translate to an anchored regex, and eight glob cases are pinned by the smoke.
|
|
34
|
+
- **`--all-data` left the knowledge base behind.** Full uninstall removed the log root and the per-repo memory root but never `~/.claude/knowledge/`, which holds `architecture.md`, `patterns.md`, `gotchas.md`, `decisions.md` and now `code-graph.json`. That is prose about a private codebase plus every symbol name in it, and it is the data a user most likely means by "remove everything". A default uninstall still keeps all of it, and memory written inside a repo (`$PROJECT_ROOT/.multi-agent/memory/`) is still never touched by either mode: it lives in the user's working tree and may be committed.
|
|
35
|
+
- **`modelFallback.floorModel` could not be set.** The fallback contract has documented it since the two-step ladder landed, but it was absent from `prefs.schema.json`, whose `modelFallback` object forbids extra keys - so a prefs file that followed the documented example failed validation. Declared, defaulted to `haiku`, and added to the template.
|
|
36
|
+
- **The consensus rule still claimed two reviewers on Claude Code.** v16.12.0 added the third reviewer and updated the matrix but not the `reviewerCount` line 300 lines below it. `smoke-cross-cli-behavior.sh` reads the matrix, so it never noticed. The line now says what it should have said all along: the count is the reviewers that actually dispatched, not the configured maximum.
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
## [16.12.0] - 2026-08-27
|
|
40
|
+
|
|
41
|
+
### Added
|
|
42
|
+
|
|
43
|
+
- **`/multi-agent:analysis` reviews the document before publishing it.** It had no review phase: the only pre-dispatch gate was a structural validator, so nothing ever read what was about to reach Confluence, and one real run published a channel it never searched for, an open question about a frame it never opened, and twenty-three unowned `EKLENECEK` markers. Phase 3.2 runs `phase-4-review.md` Step 0 (the analysis branch that already existed and nothing called) on the draft, before the destination is chosen. Reviewers are subagents holding `analysis/review.md`, never the context that wrote the document, because a context cannot notice a search it never thought to run. A blocking finding returns to synthesis with dispatch closed and never becomes an open question. Locked 36.
|
|
44
|
+
- **Phase 3.3 closes gaps instead of writing them down.** Reachable evidence is searched and never asked about, decisions the user owns are asked, and only external gaps enter the document as `AS-NN` rows with an owner. A gap with neither a `searched, not found` nor an `asked, external` stamp fails the dispatch gate. Autopilot runs both phases; only the asking degrades.
|
|
45
|
+
- **A third reviewer on Claude Code.** Opus fills the slot GPT-5.4 occupies on Copilot and Codex, so every host now runs three: Fable + Opus + Sonnet here. A finding two independent readers both miss is one triage has no chance to catch.
|
|
46
|
+
- **`figma-screenshot.sh --discover-sections`.** One `GET ?depth=3` lists every section whose name matches the feature, with a frame count and a channel guess, folding diacritics so `Elite` and `Elit` are the same word. A channel may no longer be called missing until this returns nothing, and the record must cite the scan (Locked 12). Verified against the file that caused the defect: it returns both the Desktop section and the mobileWeb sibling the run had declared absent.
|
|
47
|
+
- **Four validator gates**: `AS-NN` matched in both directions, `EKLENECEK` without an id, JSON inside a service-table cell, and Turkish diagram labels flattened to ASCII inside a mermaid fence, which the punctuation gate skips.
|
|
48
|
+
|
|
49
|
+
### Changed
|
|
50
|
+
|
|
51
|
+
- **"All variants drilled" now means read, not counted** (Locked 19). Visible `TEXT` layers inside each frame's own bounds are extracted, hidden layers and overflowing component boilerplate dropped. A frame can be called out of scope only by quoting its own text, and opening an open question about a frame nobody read fails the gate. One run logged a frame named `08 Payment` as ambiguous while its text spelled out the whole payment step.
|
|
52
|
+
- **Every frame-inventory row gets an embedded image** (Locked 18). The gallery is generated from the inventory rather than hand-picked; narrowing to a canonical subset for page weight is not a call the run makes alone. One run uploaded 34 attachments and embedded 14, and was reported as "frames not uploaded" - the files were there and invisible.
|
|
53
|
+
- **Embedded images carry a display width.** `md2confluence-v3.py --image-width` defaults to 720 with a per-image `` override; the attachment stays full resolution. A 2x phone export is 750x1624 and took two screen heights at natural size.
|
|
54
|
+
- **Service tables put payloads under the table, not in a cell.** `Request` and `Response` carry one of three states; JSON goes in a fenced block below, field notes in their own table. A whole-unknown contract is one line, not six `EKLENECEK` cells.
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
|
|
58
|
+
- **`md2confluence` re-upload logged one warning per attachment and lost nothing.** The already-exists path was keyed off HTTP 400, and this Confluence Server answers 500 for a duplicate filename, so the update path was unreachable. It looks before creating now; 400, 409 and 500 remain handled as the race they should always have been. `attachments_updated` is counted apart from `attachments_uploaded`, because "0 uploaded, 12 warnings" reads as data loss when nothing was lost.
|
|
59
|
+
- **The mermaid fallback lost every edge in any diagram whose nodes carry labels.** The pattern required the node id to sit next to the arrow, so `A[Basla] --> B` matched nothing - not just labelled branches, the whole flow. Both label syntaxes are captured now and the label is kept (`Evet -> Odeme Yap`), and the source ships beside the list so the diagram is recoverable.
|
|
60
|
+
|
|
61
|
+
### Internal
|
|
62
|
+
|
|
63
|
+
- **This release sets the `required` dist-tag.** An install older than 16.12.0 does not produce a worse analysis document, it produces one that has to be redone: no review before publishing, gaps recorded instead of closed, a channel called missing without the file ever being scanned, and frame filenames where the pictures belong. That is the criterion in the Supported Version Gate, so the tag is set rather than left off.
|
|
64
|
+
- The analysis ref ceiling moves 148000 -> 154000 across two raises in one session. Everything that could live outside the count already does: the scan in `figma-screenshot.sh`, the reviewer rubric in `analysis/review.md` which a subagent loads and the orchestrator does not, and all four new gates in `validate-analysis-doc.mjs`. The tree was measured for reclaimable duplication first and had none.
|
|
65
|
+
- `smoke-validate-analysis-doc.sh` replaces four section-number pairing assertions with the `AS-NN` contract in both directions.
|
|
66
|
+
|
|
67
|
+
|
|
19
68
|
## [16.11.0] - 2026-08-27
|
|
20
69
|
|
|
21
70
|
### Changed
|
package/README.md
CHANGED
|
@@ -62,11 +62,13 @@ One command runs 8 phases, with a gate between the risky ones:
|
|
|
62
62
|
- **1 · Analysis** - detect the stack, scan the codebase, map impact (Sonnet).
|
|
63
63
|
- **2 · Plan** - write a task breakdown and **stop for your approval** before touching code.
|
|
64
64
|
- **3 · Dev** - TDD: failing test → code → green, following the repo's style + the active stack skills.
|
|
65
|
-
- **4 · Review** - deterministic gates (build / lint / test / secret-scan) must pass first, then a **CLI-aware parallel review** - Claude Code runs
|
|
65
|
+
- **4 · Review** - deterministic gates (build / lint / test / secret-scan) must pass first, then a **CLI-aware parallel review** - Claude Code runs 3 models (Fable + Opus + Sonnet), Copilot CLI runs 3 (GPT-5.4 + Opus + Sonnet) - and a **Fable triage** keeps only actionable findings; blockers loop back to Phase 3.
|
|
66
66
|
- **5 · Test** - build + run the suite; success is required (no faked passes).
|
|
67
67
|
- **6 · Commit/PR** - conventional commit, push (must succeed), open a PR (`Ref: #N`, never auto-close).
|
|
68
68
|
- **7 · Report** - technical summary + a Jira comment with test scenarios, posted through the channels layer.
|
|
69
69
|
|
|
70
|
+
`/multi-agent:analysis` runs its own shorter chain and, since v16.12.0, reviews what it wrote before publishing it: the draft goes through the same three-reviewer set and triage as a code diff, a blocking finding returns it to synthesis with dispatch closed, and the gaps that survive are either searched, asked about, or recorded with an owner. It used to publish behind a structural validator alone.
|
|
71
|
+
|
|
70
72
|
Under the hood: each task runs in its own **git worktree** (or the current branch with `:local`), commits use the **git identity routed from the repo's origin URL**, and **multi-repo** tasks get per-repo worktrees plus an integration build. Tokens stay in the OS keychain; nothing is committed or logged. `/multi-agent:review` can also review an existing GitHub/Bitbucket PR - per-finding inline comments anchored to `file:line` + an explicit Approve / Needs-Work state.
|
|
71
73
|
|
|
72
74
|
The discipline behind all of this - bounded loops, evidence gates, token-budgeted phase docs, immutable tests, fresh-context handoffs - is catalogued in [docs/engineering.md](./docs/engineering.md). The full feature list lives in [docs/features.md](./docs/features.md). How this repo, the `multi-agent-plugins` marketplace, and the `multi-agent-toolkit-mcp` server compose at install time and at run time is diagrammed in [docs/ecosystem.md](./docs/ecosystem.md).
|
|
@@ -87,7 +89,7 @@ Depth, autopilot and `--local` are the only knobs on the run itself; everything
|
|
|
87
89
|
|
|
88
90
|
## Commands
|
|
89
91
|
|
|
90
|
-
`/multi-agent` plus
|
|
92
|
+
`/multi-agent` plus 54 sub-commands. `/multi-agent:help` renders the same catalog in your terminal, in your `outputLanguage`.
|
|
91
93
|
|
|
92
94
|
### Pipeline entries
|
|
93
95
|
|
|
@@ -206,13 +208,13 @@ This enables the matching plugin (+ the shared `ai-common` plugin) in the repo's
|
|
|
206
208
|
|
|
207
209
|
## Tool support
|
|
208
210
|
|
|
209
|
-
The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same
|
|
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.
|
|
210
212
|
|
|
211
213
|
| Tool | Flag | What it installs |
|
|
212
214
|
|---|---|---|
|
|
213
215
|
| Claude Code | `--claude` (default) | slash commands + skills + agents + `PreToolUse` secret-scan hook |
|
|
214
|
-
| Copilot CLI | `--copilot` | instructions +
|
|
215
|
-
| Codex CLI | `--codex` | one router skill +
|
|
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` |
|
|
216
218
|
|
|
217
219
|
Filter skills by stack with `--platform=ios\|android\|all`.
|
|
218
220
|
|
|
@@ -223,8 +225,8 @@ error. Measured on 0.145: installing one plugin that declares 142 skills surface
|
|
|
223
225
|
`multi-agent` router and keeps the sub-command specs as reference files that cost
|
|
224
226
|
nothing until read - same commands, same behaviour, a layout the host can actually hold.
|
|
225
227
|
|
|
226
|
-
Reviewer sets differ because the available models do: Claude Code runs
|
|
227
|
-
(Fable + Sonnet), Copilot CLI 3 (Opus + GPT-5.4 + Sonnet), Codex CLI 3 (gpt-5.6 at
|
|
228
|
+
Reviewer sets differ because the available models do: Claude Code runs 3 reviewers
|
|
229
|
+
(Fable + Opus + Sonnet), Copilot CLI 3 (Opus + GPT-5.4 + Sonnet), Codex CLI 3 (gpt-5.6 at
|
|
228
230
|
xhigh, gpt-5.4, gpt-5.6 at medium). Codex is single-vendor, so consensus among its three
|
|
229
231
|
is weaker evidence than the same consensus on a two-vendor host, and the triage note
|
|
230
232
|
says so.
|
package/README.tr.md
CHANGED
|
@@ -62,11 +62,13 @@ Tek komut 8 fazı çalıştırır, riskli olanlar arasında bir kapı ile:
|
|
|
62
62
|
- **1 · Analysis** - stack'i tespit et, codebase'i tara, etkiyi haritala (Sonnet).
|
|
63
63
|
- **2 · Plan** - bir görev kırılımı yaz ve koda dokunmadan önce **onayın için dur**.
|
|
64
64
|
- **3 · Dev** - TDD: başarısız test → kod → yeşil, repo'nun stiline + aktif stack skill'lerine uyarak.
|
|
65
|
-
- **4 · Review** - önce deterministik kapılar (build / lint / test / secret-scan) geçmeli, sonra bir **CLI-farkında paralel review** - Claude Code
|
|
65
|
+
- **4 · Review** - önce deterministik kapılar (build / lint / test / secret-scan) geçmeli, sonra bir **CLI-farkında paralel review** - Claude Code 3 model çalıştırır (Fable + Opus + Sonnet), Copilot CLI 3 (GPT-5.4 + Opus + Sonnet) - ve bir **Fable triage** sadece aksiyon alınabilir bulguları tutar; blocker'lar Phase 3'e geri döner.
|
|
66
66
|
- **5 · Test** - build + suite'i çalıştır; başarı zorunlu (sahte pass yok).
|
|
67
67
|
- **6 · Commit/PR** - conventional commit, push (başarılı olmalı), bir PR aç (`Ref: #N`, asla otomatik kapatma).
|
|
68
68
|
- **7 · Report** - teknik özet + test senaryolarıyla bir Jira yorumu, channels katmanından gönderilir.
|
|
69
69
|
|
|
70
|
+
`/multi-agent:analysis` kendi kısa zincirini koşar ve v16.12.0'dan beri yazdığını yayınlamadan önce review ediyor: taslak, bir kod diff'iyle aynı üç-reviewer setinden ve triyajdan geçiyor, bloklayıcı bulgu dokümanı sentez fazına geri gönderip dispatch'i kapatıyor, hayatta kalan boşluklar ya aranıyor ya sana soruluyor ya da sahibiyle birlikte kayda giriyor. Önceden yalnızca yapısal bir validator'ın arkasından yayınlıyordu.
|
|
71
|
+
|
|
70
72
|
Perde arkasında: her görev kendi **git worktree**'sinde çalışır (ya da `:local` ile mevcut branch'te), commit'ler **repo'nun origin URL'inden yönlendirilen git kimliğini** kullanır, ve **çoklu-repo** görevleri repo başına worktree artı bir integration build alır. Tokenlar OS keychain'de kalır; hiçbir şey commit edilmez ya da loglanmaz. `/multi-agent:review` mevcut bir GitHub/Bitbucket PR'ını da review edebilir - `file:line`'a bağlı bulgu-başına inline yorumlar + açık bir Approve / Needs-Work durumu.
|
|
71
73
|
|
|
72
74
|
Bunun arkasındaki disiplin - sınırlı loop'lar, kanıt kapıları, token-bütçeli faz dokümanları, değişmez testler, taze-context handoff'lar - [docs/engineering.md](./docs/engineering.md)'de kataloglanmıştır. Tam özellik listesi [docs/features.md](./docs/features.md)'te. Bu repo, `multi-agent-plugins` marketplace'i ve `multi-agent-toolkit-mcp` sunucusunun install zamanında ve run zamanında nasıl bir araya geldiği [docs/ecosystem.md](./docs/ecosystem.md)'de diyagramlanmıştır.
|
|
@@ -87,7 +89,7 @@ Koşunun kendisinde ayarlanabilen tek şey derinlik, autopilot ve `--local`; ger
|
|
|
87
89
|
|
|
88
90
|
## Komutlar
|
|
89
91
|
|
|
90
|
-
`/multi-agent` ve
|
|
92
|
+
`/multi-agent` ve 54 alt komut. `/multi-agent:help` aynı katalogu terminalde, `outputLanguage` ayarına göre gösterir.
|
|
91
93
|
|
|
92
94
|
### Pipeline girişleri
|
|
93
95
|
|
|
@@ -206,13 +208,13 @@ Bu, ilgili plugin'i (+ ortak `ai-common` plugin'ini) repo'nun `.claude/settings.
|
|
|
206
208
|
|
|
207
209
|
## Araç desteği
|
|
208
210
|
|
|
209
|
-
Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çalışır - üçü de aynı `pipeline/` kaynağından kurulur ve aynı
|
|
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.
|
|
210
212
|
|
|
211
213
|
| Araç | Bayrak | Ne kurar |
|
|
212
214
|
|---|---|---|
|
|
213
215
|
| Claude Code | `--claude` (varsayılan) | slash komutları + skill'ler + agent'lar + `PreToolUse` secret-scan hook'u |
|
|
214
|
-
| Copilot CLI | `--copilot` | talimatlar +
|
|
215
|
-
| Codex CLI | `--codex` | bir router skill + ref olarak
|
|
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` |
|
|
216
218
|
|
|
217
219
|
Skill'leri stack'e göre filtrele: `--platform=ios\|android\|all`.
|
|
218
220
|
|
|
@@ -224,8 +226,8 @@ pipeline tek bir `multi-agent` router gönderir ve alt-komut spec'lerini, okunan
|
|
|
224
226
|
hiçbir maliyeti olmayan referans dosyaları olarak tutar - aynı komutlar, aynı davranış,
|
|
225
227
|
host'un gerçekten tutabildiği bir düzen.
|
|
226
228
|
|
|
227
|
-
Reviewer setleri farklı çünkü mevcut modeller farklı: Claude Code
|
|
228
|
-
(Fable + Sonnet), Copilot CLI 3 (Opus + GPT-5.4 + Sonnet), Codex CLI 3 (xhigh'da
|
|
229
|
+
Reviewer setleri farklı çünkü mevcut modeller farklı: Claude Code 3 reviewer çalıştırır
|
|
230
|
+
(Fable + Opus + Sonnet), Copilot CLI 3 (Opus + GPT-5.4 + Sonnet), Codex CLI 3 (xhigh'da
|
|
229
231
|
gpt-5.6, gpt-5.4, medium'da gpt-5.6). Codex tek-vendor olduğu için üçü arasındaki
|
|
230
232
|
konsensüs, iki-vendor'lu bir host'taki aynı konsensüsten daha zayıf bir kanıttır ve
|
|
231
233
|
triage notu bunu belirtir.
|
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
**Status:** Accepted · 2025 · Amended 2026-04 (CLI-aware reviewer set) · Amended 2026-07 (v10.6.0: Fable 5 restored - Reviewer 1 and triage run on Fable on Claude Code; Copilot CLI pins Opus. "Opus" below reads as "the top tier of the day")
|
|
4
4
|
|
|
5
|
+
> **Superseded in part, v16.12.0.** The reviewer count is now 3 on every host: Opus
|
|
6
|
+
> fills the slot GPT-5.4 occupies on Copilot and Codex, so Claude Code runs
|
|
7
|
+
> Fable + Opus + Sonnet. The reasoning below about a 2-reviewer set on Claude Code
|
|
8
|
+
> is kept as the record of what was decided then, not as current behaviour.
|
|
9
|
+
|
|
5
10
|
## Context
|
|
6
11
|
|
|
7
12
|
Code review is the phase where the pipeline most commonly ships wrong work. A
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# 10. Our own code graph, not a forked one
|
|
2
|
+
|
|
3
|
+
**Status:** Accepted · 2026-08-28
|
|
4
|
+
|
|
5
|
+
## Context
|
|
6
|
+
|
|
7
|
+
Two parts of the pipeline were paying for the same missing capability.
|
|
8
|
+
|
|
9
|
+
Phase 1 dispatches parallel Explore agents that re-scan the repository with
|
|
10
|
+
grep and read on every task, and `phase-1-analysis.md` makes the "very
|
|
11
|
+
thorough" tier the default for feature, refactor and component work. Phase 7
|
|
12
|
+
writes `~/.claude/knowledge/<project>/architecture.md` with an LLM, from the
|
|
13
|
+
narrow window of whatever task happened to run, and the file is treated as
|
|
14
|
+
stale after 90 days.
|
|
15
|
+
|
|
16
|
+
Both want the same thing: a cheap, current answer to "where does this live"
|
|
17
|
+
and "what depends on this".
|
|
18
|
+
|
|
19
|
+
`Graphify-Labs/graphify` is a public reference that solved this and, unlike
|
|
20
|
+
most projects in the space, published numbers for it. Its `BENCHMARKS.md`
|
|
21
|
+
measures a fixed coding agent on ERPNext (~1M lines) over a graded question
|
|
22
|
+
set: key-fact coverage rises from 70.8% on a grep-and-read baseline to 82.0%
|
|
23
|
+
with a graph tool, at ~140K tokens per query, n=6. The baseline it beats is
|
|
24
|
+
our Phase 1.
|
|
25
|
+
|
|
26
|
+
The obvious move was to adopt it. Two things ruled that out. Its extraction
|
|
27
|
+
is built on tree-sitter, which is a native npm runtime dependency and
|
|
28
|
+
therefore forbidden by ADR-0004. And depending on an external repository for
|
|
29
|
+
a capability this central puts the pipeline's core behaviour outside our
|
|
30
|
+
control.
|
|
31
|
+
|
|
32
|
+
## Decision
|
|
33
|
+
|
|
34
|
+
Build the capability inside the pipeline, taking graphify as a design
|
|
35
|
+
reference and not as a code source.
|
|
36
|
+
|
|
37
|
+
Adopted from it: extraction is deterministic and LLM-free; the artifact is a
|
|
38
|
+
single `graph.json` of typed nodes and edges; hub ("god-node") ranking is the
|
|
39
|
+
highest-signal line of the report; queries are token-budgeted traversals
|
|
40
|
+
rather than neighbourhood dumps; reverse traversal answers impact; and the
|
|
41
|
+
measurement methodology is a graded question set against a grep-and-read
|
|
42
|
+
baseline with the same cost accounting on both arms.
|
|
43
|
+
|
|
44
|
+
Not adopted: tree-sitter (ADR-0004), LLM-named communities (the pipeline
|
|
45
|
+
already has model routing for that), an MCP server (we ship our own toolkit),
|
|
46
|
+
and its multi-platform installers and hooks.
|
|
47
|
+
|
|
48
|
+
The engine is `pipeline/scripts/_code-graph.mjs`, with per-stack rules in
|
|
49
|
+
`pipeline/scripts/code-graph-rules/<stack>.json`, five entry points
|
|
50
|
+
(`graph-build`, `graph-query`, `graph-affected`, `graph-report`,
|
|
51
|
+
`validate-code-graph`), a schema at `pipeline/schemas/code-graph.schema.json`,
|
|
52
|
+
and the `/multi-agent:graph` command. It is off by default behind
|
|
53
|
+
`prefs.global.codeGraph.enabled`.
|
|
54
|
+
|
|
55
|
+
## What we deliberately gave up
|
|
56
|
+
|
|
57
|
+
Regex over comment-stripped source is not a parser. Definitions and imports
|
|
58
|
+
survive that trade; call graphs and type resolution do not. Two further limits
|
|
59
|
+
follow from the same choice and are documented in the command rather than
|
|
60
|
+
hidden:
|
|
61
|
+
|
|
62
|
+
- A reference resolves only when a name maps to exactly one declaration. A
|
|
63
|
+
type declared in two files is dropped rather than fanned out to both, so
|
|
64
|
+
`affected` under-reports on duplicated names.
|
|
65
|
+
- Only type-like symbols are reference targets. An early build let functions
|
|
66
|
+
be targets and the hub list filled with `with`, `localized`, `size` and
|
|
67
|
+
`name`: a bare lowercase name matched across files is almost never a call to
|
|
68
|
+
that exact declaration. The same measurement was repeated per stack rather
|
|
69
|
+
than assumed: on this repo, including JavaScript functions put `ok` at degree
|
|
70
|
+
52 and `f` at 38.
|
|
71
|
+
- A nested declaration is a node but never a reference target. Sealed
|
|
72
|
+
hierarchies name their cases after the concept they model - `Icon`, `Color`,
|
|
73
|
+
`Success` - and each is declared exactly once, so the ambiguity rule does not
|
|
74
|
+
catch them. Before this rule, every Kotlin file that merely mentioned the
|
|
75
|
+
framework's `Color` gained an edge to one app's nested case: 4,072 false
|
|
76
|
+
edges out of 74,969.
|
|
77
|
+
|
|
78
|
+
## Measurement
|
|
79
|
+
|
|
80
|
+
Gated on a large private Swift app: 4,290 sources, 29,212 nodes, 54,626 edges,
|
|
81
|
+
built in 3.2s, validator clean. Build time is dominated by reading the tree, so
|
|
82
|
+
a repo whose files are not in the page cache costs more: the first build of the
|
|
83
|
+
4,229-file Kotlin app took 18.2s and every later one 2.4-3.4s. Ten graded questions, both arms capped at a
|
|
84
|
+
30,000-token retrieval budget, ground truth derived by grep and path match so
|
|
85
|
+
that the impact family is stacked against the graph on purpose.
|
|
86
|
+
|
|
87
|
+
| Arm | Coverage | Tokens/question |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| grep + read | 66.0% | 24,555 |
|
|
90
|
+
| code graph | 80.4% | 18,465 |
|
|
91
|
+
|
|
92
|
+
The aggregate passes the gate, but the split is the useful part. On questions
|
|
93
|
+
naming an exact type, `grep -lw` is the oracle: it scored 100% and the graph
|
|
94
|
+
was marginally worse and marginally more expensive. On questions phrased in
|
|
95
|
+
domain words, the graph scored 63.3% against 32.0% at 10,937 tokens against
|
|
96
|
+
24,983. The value is in narrowing an open-ended search, not in replacing a
|
|
97
|
+
grep for a name you already know.
|
|
98
|
+
|
|
99
|
+
That measurement covers the context each strategy assembles, not the quality
|
|
100
|
+
of an answer written from it. graphify's numbers measure the latter. The two
|
|
101
|
+
are not directly comparable and this ADR does not claim they are.
|
|
102
|
+
|
|
103
|
+
## Consequences
|
|
104
|
+
|
|
105
|
+
Positive:
|
|
106
|
+
|
|
107
|
+
- No new runtime dependency; ADR-0004 holds.
|
|
108
|
+
- Graph construction costs no API tokens, so Phase 7 can refresh it every run
|
|
109
|
+
instead of ageing an LLM-written file for 90 days.
|
|
110
|
+
- Staleness becomes a commit comparison rather than a date heuristic.
|
|
111
|
+
- Every stack after the first is one rules file. Bringing up Kotlin, Python
|
|
112
|
+
and JavaScript needed two engine changes, and both were engine defects that
|
|
113
|
+
iOS had been getting away with rather than stack requirements: nesting was
|
|
114
|
+
measured from the pattern's match column, so `public final class Foo` read as
|
|
115
|
+
nested, and the import pass read a fully stripped body, which blanks a
|
|
116
|
+
JavaScript module specifier because it is a string literal. iOS was re-gated
|
|
117
|
+
after both and scored identically.
|
|
118
|
+
|
|
119
|
+
Negative:
|
|
120
|
+
|
|
121
|
+
- Accuracy is bounded by regex extraction and will stay below what a parser
|
|
122
|
+
would give.
|
|
123
|
+
- Each supported stack carries a hand-written rules file that has to keep up
|
|
124
|
+
with its language.
|
|
125
|
+
- The symbol layer is thin on stacks whose exported unit is a function. On
|
|
126
|
+
Node the useful graph is the import graph between files, and the command
|
|
127
|
+
says so rather than implying a richness the stack does not have.
|
|
128
|
+
- A 4,300-file repo produces a ~22MB JSON file. It is read whole on every
|
|
129
|
+
query; that is fine at this scale and is not proven at ten times it.
|
package/docs/adr/README.md
CHANGED
|
@@ -19,6 +19,7 @@ Format: lightly adapted from [Michael Nygard's ADR template](https://cognitect.c
|
|
|
19
19
|
| [0007](./0007-multi-tool-adapter-framework.md) | Multi-tool adapter framework + token-preserving uninstall | Superseded by v10.7.0 (adapters removed; Claude Code + Copilot CLI only) |
|
|
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
|
+
| [0010](./0010-own-code-graph.md) | Own code graph, referenced from graphify, not forked | Accepted |
|
|
22
23
|
|
|
23
24
|
## Writing a New ADR
|
|
24
25
|
|
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/>54 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 + 54 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 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 |
|
|
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 · 54 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/>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"]
|
|
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** | 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 |
|
|
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/docs/features.md
CHANGED
|
@@ -12,7 +12,7 @@ Phase 1: Analysis Stack detection, codebase exploration (parallel Explore agent
|
|
|
12
12
|
Phase 2: Planning Task decomposition, architecture review, user approval
|
|
13
13
|
Phase 3: Dev TDD cycle: test → code → build (Sonnet)
|
|
14
14
|
Phase 4: Review Deterministic gates + parallel AI review + Fable triage
|
|
15
|
-
(Claude Code: Fable + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
|
|
15
|
+
(Claude Code: Fable + Opus + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
|
|
16
16
|
Phase 5: Test Optional manual testing + on-demand device audits
|
|
17
17
|
Phase 6: Commit Git commit, push, PR with default reviewers + draft/ready prompt
|
|
18
18
|
Phase 7: Report External: Jira comment · Wiki + Figma screenshots · Confluence
|
|
@@ -40,6 +40,14 @@ The install is not only useful while `/multi-agent` is running. `rules/outside-t
|
|
|
40
40
|
|
|
41
41
|
Uninstall preserves the whole layer - tokens, the reader that opens them, the mapping that names them, the MCP registration. It is 1.5 kB of always-loaded text; the detail lives in a ref that loads on demand, and a gate keeps both under a ceiling because every byte there is paid by every session.
|
|
42
42
|
|
|
43
|
+
### Code Graph (`/multi-agent:graph`, opt-in)
|
|
44
|
+
|
|
45
|
+
A deterministic, LLM-free map of what a repo declares and what refers to what, extracted by regex over comment-stripped source into `~/.claude/knowledge/<project>/code-graph.json`. Four stacks build today (Swift, Kotlin/Java, TypeScript/JavaScript, Python); each is one rules file, and the engine is the same for all of them. Zero runtime dependencies, zero API cost, read-only on the repo.
|
|
46
|
+
|
|
47
|
+
Phase 1 queries it to hand Explore a ranked starting file set instead of a full scan, and Phase 7 rebuilds it after the branch changed code - a rebuild is seconds, so staleness is a `baseCommit` comparison rather than a date heuristic. Off by default behind `prefs.global.codeGraph.enabled`; with it off the pipeline behaves exactly as before.
|
|
48
|
+
|
|
49
|
+
Measured on a 4,300-file Swift app against a grep-and-read baseline at the same 30,000-token retrieval budget: 80.4% key-fact coverage at 18,465 tokens against 66.0% at 24,555. The gain is entirely in searches phrased in domain words (63.3% against 32.0%, at under half the cost). When the task already names an exact type, `grep -lw` is still slightly better and slightly cheaper, and the command says so rather than overselling. Reasoning, trade and limits: `docs/adr/0010-own-code-graph.md`.
|
|
50
|
+
|
|
43
51
|
### Stack Auto-Detection
|
|
44
52
|
|
|
45
53
|
| Platform | Detection | Guide Loaded |
|
|
@@ -134,6 +142,22 @@ Cheap, objective checks run BEFORE any AI token is spent:
|
|
|
134
142
|
|
|
135
143
|
If any gate fails, fix first. Don't waste AI tokens reviewing broken code.
|
|
136
144
|
|
|
145
|
+
### Analysis Document Review (Phase 3.2 + 3.3)
|
|
146
|
+
|
|
147
|
+
`/multi-agent:analysis` published behind a structural validator alone until v16.12.0: nothing read the
|
|
148
|
+
document before it reached Confluence. Phase 3.2 now runs the same reviewer set and triage a code diff
|
|
149
|
+
gets, on the draft, before the destination is even chosen. Its first question is what the run skipped -
|
|
150
|
+
an input declared missing that nothing searched for, an open question about evidence nobody read, a gap
|
|
151
|
+
with no owner, a scope call made without asking. A blocking finding returns to synthesis with dispatch
|
|
152
|
+
closed; it never becomes an open question, because "the document is wrong" is not something to ask the
|
|
153
|
+
reader.
|
|
154
|
+
|
|
155
|
+
Phase 3.3 then sorts what is left: reachable evidence is searched (never asked about), decisions the
|
|
156
|
+
user owns are asked with `AskUserQuestion`, and only genuinely external gaps enter the document as
|
|
157
|
+
`AS-NN` rows with an owner. A gap carrying neither a `searched, not found` nor an `asked, external`
|
|
158
|
+
stamp fails the dispatch gate. Autopilot runs both phases; only the asking degrades, into rows stamped
|
|
159
|
+
`autopilot: could not ask`.
|
|
160
|
+
|
|
137
161
|
### CLI-Aware Parallel Review + Fable Triage (Phase 4 Steps 2-3)
|
|
138
162
|
|
|
139
163
|
| Reviewer | Model | Focus | Where it runs |
|
|
@@ -142,7 +166,7 @@ If any gate fails, fix first. Don't waste AI tokens reviewing broken code.
|
|
|
142
166
|
| Reviewer 2 | `gpt-5.4` | Edge cases, different perspective | **Copilot CLI only** |
|
|
143
167
|
| Reviewer 3 | `claude-sonnet-4-6` | Quality + correctness + naming | Both CLIs |
|
|
144
168
|
|
|
145
|
-
The reviewer set is **CLI-aware**: Claude Code dispatches
|
|
169
|
+
The reviewer set is **CLI-aware**: Claude Code dispatches 3 reviewers in parallel (Fable + Opus + Sonnet - Opus fills the slot GPT-5.4 takes elsewhere); Copilot CLI dispatches all 3. Each returns structured JSON for deterministic aggregation. Cross-model diversity catches blind spots that any single model family would miss.
|
|
146
170
|
|
|
147
171
|
**Fable Triage** (Phase 4 Step 3, Opus on Copilot CLI): Evaluates merged raw findings against task scope. Classifies each as `accepted` (fix now), `deferred` (out of scope, log for later), or `rejected` (false positive / noise). Only triage-accepted blocking items loop back to Phase 3.
|
|
148
172
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "16.
|
|
3
|
+
"version": "16.13.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",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
2. Planning (Opus) -> spec, task breakdown
|
|
18
18
|
3. Development (Sonnet) -> TDD, code, build
|
|
19
19
|
4. Review -> deterministic gates + parallel review + Fable triage
|
|
20
|
-
- Claude Code: Opus + Sonnet (
|
|
20
|
+
- Claude Code: Fable + Opus + Sonnet (3 paralel)
|
|
21
21
|
- Copilot CLI: GPT-5.4 + Opus + Sonnet (3 paralel)
|
|
22
22
|
- Codex CLI: gpt-5.6 (xhigh) + gpt-5.4 + gpt-5.6 (medium) (3 paralel)
|
|
23
23
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Task orchestrator - full pipeline via Jira ID + branch or GitHub Issue URL: analysis, plan, TDD development, parallel review + Fable triage (CLI-aware: 2-model on Claude Code, 3-model on Copilot CLI), commit, log. Use when given a Jira ID, a GitHub issue or a free-text task and the whole pipeline should run."
|
|
3
|
-
description-tr: "Görev orkestratörü - Jira ID + branch veya GitHub Issue URL ile tam pipeline: analiz, plan, TDD geliştirme, paralel review + Fable triyajı (CLI'ya göre: Claude Code'da
|
|
3
|
+
description-tr: "Görev orkestratörü - Jira ID + branch veya GitHub Issue URL ile tam pipeline: analiz, plan, TDD geliştirme, paralel review + Fable triyajı (CLI'ya göre: Claude Code'da 3, Copilot CLI'da 3 model), commit, log"
|
|
4
4
|
allowed-tools: Agent, Bash, Read, Write, Edit, Glob, Grep, TaskCreate, TaskUpdate, TaskList, TaskGet, AskUserQuestion, WebFetch, WebSearch, NotebookEdit, Skill
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -61,7 +61,7 @@ Full contract: `$HOME/.claude/multi-agent-refs/analysis/evidence.md`. Fetches ev
|
|
|
61
61
|
|
|
62
62
|
Full contract: `$HOME/.claude/multi-agent-refs/analysis/synthesis.md`. Pass A builds the platform-agnostic concept layer; Phase 2a previews the resolved conventions for approval (Locked 26); Pass B projects each concept onto the selected platform with a footnote per filled cell (Locked 24).
|
|
63
63
|
|
|
64
|
-
### Phases 3, 3.5, 4, 5 - Render, publish, report
|
|
64
|
+
### Phases 3, 3.2, 3.3, 3.5, 4, 5 - Render, review, publish, report
|
|
65
65
|
|
|
66
66
|
Full contract: `$HOME/.claude/multi-agent-refs/analysis/render.md`. Renders one markdown file per platform, runs the **required** `ai-common-toolkit:humanizer` pass, gates on `validate-analysis-doc.mjs` and on the `build-references.mjs --check` references coverage gate (Locked 34), asks for the output destination, dispatches to Local / Confluence / Jira (a Jira issue receives a comment unless the user explicitly asks for the description, which is never overwritten without a backup and a confirmation), then reports and stops. The humanizer pass and the validator are required in every mode; a document that skipped either is not shippable.
|
|
67
67
|
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Build and query this repo's code graph: a deterministic, LLM-free map of symbols, imports and references used to narrow Phase 1's Explore scope and to keep the knowledge base current. Read-only on code, costs no API tokens. Use when a task needs to know where something lives or what depends on it before reading files."
|
|
3
|
+
description-tr: "Bu repo'nun kod grafiğini kurar ve sorgular: sembolleri, import'ları ve referansları LLM'siz, deterministik biçimde haritalar. Faz 1'in Explore kapsamını daraltmak ve bilgi tabanını güncel tutmak için kullanılır. Kodda salt-okunur, API maliyeti yok."
|
|
4
|
+
argument-hint: "[build | refresh | ask \"<question>\" | affected \"<symbol>\" | report | status]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# multi-agent graph - code graph build and query
|
|
8
|
+
|
|
9
|
+
**Input**: $ARGUMENTS
|
|
10
|
+
|
|
11
|
+
A code graph is a map of what this repo declares and what refers to what, built by
|
|
12
|
+
regex over comment-stripped source. It exists so Phase 1 can narrow its Explore
|
|
13
|
+
fan-out and Phase 7 can refresh `~/.claude/knowledge/<project>/` without an LLM
|
|
14
|
+
pass. It answers "where does this live" and "what depends on this". It does not
|
|
15
|
+
answer "what calls this at runtime": call graphs and type resolution need a real
|
|
16
|
+
parser, which would be an npm runtime dependency, and ADR-0004 forbids one.
|
|
17
|
+
|
|
18
|
+
No worktree, no branch, no commit, no pipeline chaining.
|
|
19
|
+
|
|
20
|
+
## Sub-commands
|
|
21
|
+
|
|
22
|
+
| Input | Runs | Notes |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| `build` | `graph-build.mjs --root <repo> --stack <stack>` | Writes `~/.claude/knowledge/<project>/code-graph.json` |
|
|
25
|
+
| `refresh` | same as `build` | A full rebuild takes seconds, so there is no separate incremental path |
|
|
26
|
+
| `ask "<question>"` | `graph-query.mjs "<question>" --budget N` | Token-budgeted traversal; default budget 2000 |
|
|
27
|
+
| `affected "<symbol>"` | `graph-affected.mjs "<symbol>" --depth N` | Reverse traversal: the blast radius of a change |
|
|
28
|
+
| `report` | `graph-report.mjs` | Writes `GRAPH_REPORT.md` beside the graph |
|
|
29
|
+
| `status` | `graph-report.mjs --status` | One line: stack, scale, build time and whether `baseCommit` still matches HEAD. Never read the graph file yourself - it is 22MB on a large repo |
|
|
30
|
+
|
|
31
|
+
With no argument, run `status`, then offer `build` when no graph exists and
|
|
32
|
+
`refresh` when `baseCommit` differs from the current HEAD.
|
|
33
|
+
|
|
34
|
+
## Steps
|
|
35
|
+
|
|
36
|
+
1. **Resolve the repo.** `PROJECT_ROOT` is the current repo root unless the user
|
|
37
|
+
named another. Derive the graph path once and pass it to every call below:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
GRAPH_PATH="$HOME/.claude/knowledge/$(basename "$PROJECT_ROOT")/code-graph.json"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The query, affected and report scripts default that path from the CWD's
|
|
44
|
+
basename, which is not the same thing when the shell sits in a worktree or a
|
|
45
|
+
sub-package, so a defaulted path can point at a graph that was never built.
|
|
46
|
+
|
|
47
|
+
2. **Resolve the stack.** Read `state.detectedStack` when a run is in flight;
|
|
48
|
+
otherwise detect from project markers the way Phase 1 Step 2 does. Only stacks
|
|
49
|
+
with a file in `$HOME/.claude/scripts/code-graph-rules/` can be built. A stack with
|
|
50
|
+
no rule file is reported as unsupported, never guessed at.
|
|
51
|
+
|
|
52
|
+
3. **Run the sub-command.** Every script is read-only on the repo and writes only
|
|
53
|
+
under `~/.claude/knowledge/`:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
node $HOME/.claude/scripts/graph-build.mjs --root "$PROJECT_ROOT" --stack "$STACK" --out "$GRAPH_PATH"
|
|
57
|
+
node $HOME/.claude/scripts/graph-query.mjs "<question>" --graph "$GRAPH_PATH" --budget 2000
|
|
58
|
+
node $HOME/.claude/scripts/graph-affected.mjs "<symbol>" --graph "$GRAPH_PATH" --depth 2
|
|
59
|
+
node $HOME/.claude/scripts/graph-report.mjs --graph "$GRAPH_PATH"
|
|
60
|
+
node $HOME/.claude/scripts/graph-report.mjs --graph "$GRAPH_PATH" --status
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
4. **Validate after a build.** A graph that parses but whose edges point at
|
|
64
|
+
missing nodes yields silently truncated traversals, so the build is not
|
|
65
|
+
reported as successful until the validator agrees:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
node $HOME/.claude/scripts/validate-code-graph.mjs "$GRAPH_PATH"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
A non-zero exit fails CLOSED: report the validator's `errors[]` verbatim and
|
|
72
|
+
do not record the graph as usable.
|
|
73
|
+
|
|
74
|
+
5. **Report.** One line for a build (`files / nodes / edges / elapsed`), the
|
|
75
|
+
traversal output as-is for `ask` and `affected`, the report path for `report`.
|
|
76
|
+
|
|
77
|
+
## What the output is for
|
|
78
|
+
|
|
79
|
+
`ask` returns ranked nodes plus their neighbourhood within a token budget. Feed
|
|
80
|
+
it to an Explore agent as the starting file set rather than pasting it into a
|
|
81
|
+
final answer: it is a search result, not an explanation.
|
|
82
|
+
|
|
83
|
+
`affected` returns dependents, which is what `analysis.touchedAreas[]` wants.
|
|
84
|
+
|
|
85
|
+
## Limits worth stating when reporting
|
|
86
|
+
|
|
87
|
+
- References resolve only when a name maps to exactly one declaration. A type
|
|
88
|
+
declared in two files is ambiguous and is deliberately dropped, so `affected`
|
|
89
|
+
under-reports for duplicated names rather than fanning out to every candidate.
|
|
90
|
+
- Only type-like symbols are reference targets. Functions appear in the graph
|
|
91
|
+
through their declaring file, not as targets, because a bare lowercase name
|
|
92
|
+
matched across files is almost never a call to that exact declaration.
|
|
93
|
+
- Comments and string literals are stripped before extraction, so a name that
|
|
94
|
+
appears only in prose or in a string produces no edge.
|
|
95
|
+
- A nested declaration is a node but never a reference target. A Kotlin sealed
|
|
96
|
+
case or a Python inner class named `Icon` or `Color` is declared exactly once,
|
|
97
|
+
so the ambiguity rule above does not catch it, and every file that merely
|
|
98
|
+
mentions the framework type of that name would otherwise gain an edge to it.
|
|
99
|
+
- On stacks whose exported unit is a function (Node most of all) the symbol
|
|
100
|
+
layer is thin by design and the import graph between files carries the value.
|
|
101
|
+
Ask `affected "<file>.mjs"` there, not `affected "<functionName>"`.
|
|
102
|
+
- `affected` at `--depth 1` returns direct symbol references only. An import
|
|
103
|
+
whose module name matches a declaring file's basename reaches the symbol
|
|
104
|
+
through that file, so its importers appear at depth 2. Keep the default
|
|
105
|
+
depth of 2 unless direct references are what you actually want.
|