@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.
Files changed (67) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +9 -7
  3. package/README.tr.md +9 -7
  4. package/docs/adr/0001-three-model-triage.md +5 -0
  5. package/docs/adr/0010-own-code-graph.md +129 -0
  6. package/docs/adr/README.md +1 -0
  7. package/docs/architecture.md +2 -2
  8. package/docs/ecosystem.md +5 -5
  9. package/docs/features.md +26 -2
  10. package/package.json +1 -1
  11. package/pipeline/claude-md-template.md +1 -1
  12. package/pipeline/commands/multi-agent/SKILL.md +1 -1
  13. package/pipeline/commands/multi-agent/analysis/SKILL.md +1 -1
  14. package/pipeline/commands/multi-agent/graph/SKILL.md +105 -0
  15. package/pipeline/commands/multi-agent/help/SKILL.md +10 -10
  16. package/pipeline/commands/multi-agent/resume-local/SKILL.md +2 -2
  17. package/pipeline/commands/multi-agent/review/SKILL.md +3 -3
  18. package/pipeline/commands/multi-agent/review-analysis/SKILL.md +1 -1
  19. package/pipeline/commands/multi-agent/sync/SKILL.md +12 -12
  20. package/pipeline/commands/multi-agent/uninstall/SKILL.md +9 -7
  21. package/pipeline/lib/figma-screenshot.sh +107 -7
  22. package/pipeline/lib/md2confluence-v3.py +133 -25
  23. package/pipeline/multi-agent-refs/analysis/locked.md +4 -3
  24. package/pipeline/multi-agent-refs/analysis/render.md +44 -9
  25. package/pipeline/multi-agent-refs/analysis/review.md +17 -1
  26. package/pipeline/multi-agent-refs/analysis-template-corporate.md +14 -3
  27. package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -10
  28. package/pipeline/multi-agent-refs/features/code-graph.md +62 -0
  29. package/pipeline/multi-agent-refs/features/model-fallback.md +44 -2
  30. package/pipeline/multi-agent-refs/knowledge.md +7 -1
  31. package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -1
  32. package/pipeline/multi-agent-refs/phases/phase-1-analysis.md +5 -0
  33. package/pipeline/multi-agent-refs/phases/phase-4-review.md +9 -9
  34. package/pipeline/multi-agent-refs/phases/phase-7-report.md +2 -0
  35. package/pipeline/preferences-template.json +2 -0
  36. package/pipeline/schemas/analysis-spec.schema.json +2 -0
  37. package/pipeline/schemas/code-graph.schema.json +91 -0
  38. package/pipeline/schemas/prefs.schema.json +45 -0
  39. package/pipeline/schemas/reviewer-output.schema.json +1 -1
  40. package/pipeline/schemas/token-budget.json +2 -2
  41. package/pipeline/schemas/triage-output.schema.json +1 -1
  42. package/pipeline/scripts/_code-graph.mjs +518 -0
  43. package/pipeline/scripts/_path-match.mjs +87 -0
  44. package/pipeline/scripts/anonymize-findings.mjs +1 -1
  45. package/pipeline/scripts/code-graph-rules/android.json +130 -0
  46. package/pipeline/scripts/code-graph-rules/ios.json +95 -0
  47. package/pipeline/scripts/code-graph-rules/node.json +151 -0
  48. package/pipeline/scripts/code-graph-rules/python.json +91 -0
  49. package/pipeline/scripts/graph-affected.mjs +161 -0
  50. package/pipeline/scripts/graph-build.mjs +157 -0
  51. package/pipeline/scripts/graph-query.mjs +191 -0
  52. package/pipeline/scripts/graph-report.mjs +237 -0
  53. package/pipeline/scripts/smoke-cross-cli-behavior.sh +13 -10
  54. package/pipeline/scripts/test-gap-rules/ios.json +38 -10
  55. package/pipeline/scripts/test-gap-scan.mjs +2 -21
  56. package/pipeline/scripts/uninstall.mjs +11 -2
  57. package/pipeline/scripts/validate-analysis-doc.mjs +85 -23
  58. package/pipeline/scripts/validate-code-graph.mjs +174 -0
  59. package/pipeline/skills/.skills-index.json +14 -3
  60. package/pipeline/skills/shared/README.md +6 -5
  61. package/pipeline/skills/shared/core/multi-agent/SKILL.md +3 -3
  62. package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +106 -0
  63. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -2
  64. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +2 -2
  65. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +11 -11
  66. package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +4 -4
  67. 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 `![](f.png "width=320")` 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 2 models (Fable + Sonnet), Copilot CLI runs 3 (GPT-5.4 + Opus + Sonnet) - and a **Fable triage** keeps only actionable findings; blockers loop back to Phase 3.
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 53 sub-commands. `/multi-agent:help` renders the same catalog in your terminal, in your `outputLanguage`.
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 53 commands.
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 + 53 sub-command skills + scripts |
215
- | Codex CLI | `--codex` | one router skill + 53 specs as refs + 8 agent TOML + `AGENTS.md` block + `codex mcp add` |
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 2 reviewers
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 2 model çalıştırır (Fable + 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.
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 53 alt komut. `/multi-agent:help` aynı katalogu terminalde, `outputLanguage` ayarına göre gösterir.
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ı 53 komutu alır.
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 + 53 alt-komut skill'i + script'ler |
215
- | Codex CLI | `--codex` | bir router skill + ref olarak 53 spec + 8 agent TOML + `AGENTS.md` bloğu + `codex mcp add` |
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 2 reviewer çalıştırır
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.
@@ -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
 
@@ -117,7 +117,7 @@ graph TB
117
117
  end
118
118
 
119
119
  subgraph "Pipeline Specs"
120
- CMD[commands/<br/>53 command files]
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 + 53 refs)"]
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 53 slash commands, quality gates, review/triage, cross-CLI parity | npm package (`@mmerterden/multi-agent-pipeline`), installs itself onto Claude Code / Copilot CLI / Codex CLI |
8
+ | **`multi-agent-pipeline`** (this repo) | Orchestration: the 8-phase flow, the 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 · 53 commands"]
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/>53 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 + 53 refs<br/>+ 8 agent TOML"]
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** | 53 slash-command skills, native | 53 skills, `multi-agent-{cmd}` naming, copied in | 1 router skill (`multi-agent`) + 53 command specs as reference files - Codex silently truncates its skills block past a few dozen entries, so sub-commands are not peer skills here |
156
+ | **Pipeline commands** | 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 2 reviewers in parallel (Fable + Sonnet - GPT-5.4 is not available there); 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.
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.11.0",
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 (2 paralel)
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 2, Copilot CLI'da 3 model), commit, log"
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.