@mmerterden/multi-agent-pipeline 16.5.0 → 16.7.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 +46 -0
- package/README.md +4 -4
- package/README.tr.md +4 -4
- package/docs/architecture.md +2 -2
- package/docs/ecosystem.md +5 -5
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/analysis/SKILL.md +18 -5
- package/pipeline/commands/multi-agent/feedback/SKILL.md +51 -0
- package/pipeline/commands/multi-agent/review-analysis/SKILL.md +32 -0
- package/pipeline/commands/multi-agent/sync/SKILL.md +20 -18
- package/pipeline/commands/multi-agent/update/SKILL.md +1 -1
- package/pipeline/multi-agent-refs/analysis/intake.md +30 -1
- package/pipeline/multi-agent-refs/analysis/locked.md +11 -6
- package/pipeline/multi-agent-refs/analysis/render.md +20 -5
- package/pipeline/multi-agent-refs/analysis/review.md +86 -0
- package/pipeline/multi-agent-refs/analysis/synthesis.md +1 -1
- package/pipeline/multi-agent-refs/analysis-template-corporate.md +436 -0
- package/pipeline/multi-agent-refs/analysis-template.md +31 -13
- package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -7
- package/pipeline/multi-agent-refs/website-deploy.md +87 -0
- package/pipeline/schemas/analysis-spec.schema.json +21 -1
- package/pipeline/schemas/prefs.schema.json +41 -0
- package/pipeline/scripts/build-references.mjs +368 -0
- package/pipeline/scripts/feedback-send.mjs +181 -0
- package/pipeline/scripts/validate-analysis-doc.mjs +130 -9
- package/pipeline/scripts/website-deploy-commit.sh +102 -0
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +18 -2
- package/pipeline/skills/shared/core/multi-agent-feedback/SKILL.md +30 -0
- package/pipeline/skills/shared/core/multi-agent-review-analysis/SKILL.md +31 -0
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +18 -14
package/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,52 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
16
16
|
|
|
17
17
|
## [Unreleased]
|
|
18
18
|
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- **The website sync committed under whatever identity the run carried, and the site silently stopped updating.** Step 4 ran a bare `git commit`, so the commit took the active account's address. The deploy platform builds only a commit whose author is a contributor on the project; any other author is accepted by the push and then never built - the deployment is created, reports `readyState: BLOCKED` (rendered by the CLI as `UNKNOWN` with a 0ms build), and the live site keeps serving the previous version. v16.4.0 and v16.5.0 were both pushed that way, neither was ever built, and both syncs reported the website as done.
|
|
22
|
+
- **The commit is now made by `pipeline/scripts/website-deploy-commit.sh`, not by three lines of prose.** It reads the clone's own `user.name` / `user.email` and writes only on a mismatch (the website clone is usually already right, and overwriting it with the caller's identity is the defect), commits only when something is staged, reads the author back off the commit with `git log -1 --format=%ae` and halts before pushing on a mismatch - setting `git config` proves nothing, since an exported `GIT_AUTHOR_EMAIL` outranks it - then waits for a Ready production build instead of treating the push as the deploy. Exit codes separate the cases that need different responses: `1` wrong author and nothing pushed, `3` pushed but never built. The identity itself still resolves from `prefs.global.identities[]` routed by `platformIdentityRouting`, so no literal address enters a file that installs on every machine.
|
|
23
|
+
- **`multi-agent-refs/website-deploy.md`** carries the failure signature, the API call that names the reason the CLI hides, the empty-commit recovery that needs no history rewrite, and the live-site verification notes. The sync doc keeps three lines and a pointer, which is also what kept it inside its token ceiling.
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
|
|
27
|
+
- **`smoke-website-deploy-identity.sh` (20 assertions).** It runs the script against throwaway repos with real remotes rather than grepping the doc: the happy path lands and pushes, an exported `GIT_AUTHOR_EMAIL` halts with the commit still local, an unchanged tree makes no empty commit, a matching config is preserved while a wrong name is corrected, and missing or non-repository arguments exit 2. Wiring is asserted separately, since a correct script nothing calls is its own failure mode.
|
|
28
|
+
|
|
29
|
+
## [16.7.0] - 2026-08-25
|
|
30
|
+
|
|
31
|
+
Two commands: one that reviews the document instead of the diff, one that lets a user say something went wrong.
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
|
|
35
|
+
- **`/multi-agent:review-analysis`** reviews a written analysis the way `/multi-agent:review` reviews a diff. It resolves the document from a local path, a Confluence page or a Jira issue, runs the deterministic gates FIRST and reports their output verbatim (`validate-analysis-doc.mjs`, and `build-references.mjs --check` when a state JSON is available), then runs the parallel model review and triage. Findings cite `Locked <n>` where a rule applies, because "I would have written this differently" gives an author nothing to act on while "Locked 34: this Confluence page is in the evidence record but not in Section 21" gives them a fix and a reason; anything with no rule behind it is marked as judgement rather than dressed up as a violation. The verdict states what was NOT checked - without a state file the references coverage claim is exactly the one nobody can verify from the document alone. It never edits the reviewed document: that belongs to its author, and a reviewer who rewrites it has removed the choice to disagree. `/multi-agent:analysis-resolve` remains the command that folds answers back in.
|
|
36
|
+
- **`/multi-agent:feedback "<message>"`** sends one message to the maintainer. **Only the text the user types is sent** - plus the pipeline version, the host CLI and a timestamp, which a report is useless without. No logs, no repo names, no branch names, no file paths, no diffs. That limit is deliberate: this package installs from a public registry, so an automatic log attachment would take a corporate user's internal identifiers off their machine and into someone else's database. A person can paste the one line that matters; a script cannot know which line that is. The exact payload is printed before anything is sent and nothing leaves the machine without a confirmation, autopilot included - a message to a person is never fired unattended. Auth reuses the usage ingest token, so nothing new is onboarded; `usageLog.optOut` does not silence it, because telemetry is passive collection while this is a deliberate act, and silently dropping something somebody chose to send is worse than not offering the command. A send failure is reported rather than swallowed: the person is waiting to hear whether their message went.
|
|
37
|
+
|
|
38
|
+
### Changed
|
|
39
|
+
|
|
40
|
+
- **The analysis context-budget gate measures the refs the command declares, not a directory glob.** `multi-agent-refs/analysis/` also holds sibling-command refs - `resolve.md` belongs to `:analysis-resolve`, `review.md` to `:review-analysis` - and an analysis run loads neither, so the glob billed every run for files it never reads. The ceiling goes back to 145000 (from the 155000 v16.6.0 set): with the measurement corrected the real per-run cost is 139672, and that raise had been compensating for the glob rather than for anything the tree costs. A ceiling raised to fit a wrong number stops being a budget. Adding a ref to the analysis command now counts automatically; adding one for a sibling command does not.
|
|
41
|
+
- The command surface is 53. Both new commands carry their `shared/core` counterpart for Copilot and Codex, and the canonical inventory in `cross-cli-contract.md` and both sync skills lists them - `smoke-command-inventory.sh` fails on any of those going stale, and did, which is how the gap was found rather than shipped.
|
|
42
|
+
|
|
43
|
+
## [16.6.0] - 2026-08-25
|
|
44
|
+
|
|
45
|
+
Two analysis standards, one evidence record, and a references section that is built rather than remembered.
|
|
46
|
+
|
|
47
|
+
### Added
|
|
48
|
+
|
|
49
|
+
- **`/multi-agent:analysis` asks which standard the document follows** (Locked 32). Phase 0 Step 1b offers `global` - the 23-section development handoff, unchanged - and `corporate`, a requirements document whose spine is `IG -> UC -> FG`: business requirements, use cases with actor, precondition, main flow and step-bound alternative flows, functional requirements each beginning "Sistem,", service details, and three cross matrices that prove the chain closes. Part A is the requirement document, Part B is the technical analysis, Part C is the development analysis. Both profiles read the same `state.analysisSpec.evidence.*`: intake, fetching, repo evidence and convention extraction are shared, so the projections cannot drift into two products. One run emits one profile - rendering both would produce two documents about the same feature and leave the next reader to guess which is current.
|
|
50
|
+
- **`pipeline/multi-agent-refs/analysis-template-corporate.md`**, the corporate projection, plus the corporate backbone rule (Locked 33): Part A and the footer render even with zero evidence, carrying `N/A` when a section is genuinely out of scope and `EKLENECEK` when evidence is expected but missing. A requirements document has to let a reader tell "we considered hardware needs and there are none" from "nobody looked", which the global profile's omission rule deliberately cannot express. Every `EKLENECEK` owes a Risks and Open Questions row naming what is missing and who can answer it; one without a row fails the dispatch gate. Missing inputs never halt the run - the gap is written down and raised, not waited on.
|
|
51
|
+
- **The traceability matrix is cross-checked, not just required.** In the corporate profile every `IG`, `UC` and `FG` id defined in the document must appear in the matrix, and every id in the matrix must be defined somewhere else; both directions block dispatch. A matrix that merely exists is not the claim worth making, because every downstream reader trusts it instead of re-deriving the chain, and a requirement quietly missing from it is invisible exactly where it matters. The remaining consistency rules (an IG realised by a use case, an FG naming a source that exists, a cancelled requirement struck through everywhere) stay renderer obligations and are written as instructions rather than as guarantees.
|
|
52
|
+
- **`pipeline/scripts/build-references.mjs`** builds Section 21 from the evidence record instead of leaving it to the model (Locked 34). Each row carries a precision anchor - Figma node id, Confluence `pageId` plus page version, the commit sha a repo was read at, the Swagger spec version - because a reference with no anchor points at a moving target six weeks later. Each row carries an access cell, so a declared source that could not be fetched is listed as unreachable rather than dropped; a silently dropped source reads to the next person as a source that never existed. Statements the user made in conversation that no fetched source carries are recorded verbatim as free-text rows with the decision they settled. A coverage gate blocks dispatch when a consumed source is missing from the table and when a listed row has no evidence behind it: an invented reference is worse than an absent one, because a reader will follow it.
|
|
53
|
+
- **Two preference keys, declared in the schema rather than only in prose.** `global.analysisProfiles` narrows which standards the Step 1b picker offers (listing one auto-resolves the step), and `global.analysisProfile.corporate` carries the corporate profile's deployment bindings: `confluenceSpaceKey`, `confluenceParentPageId`, `titleFormat` and `titlePrefix`. A corporate analysis always lands in the same tree, so the Phase 3.5 destination prompt is skipped when all four are set and falls back to asking when any is missing. The names are deliberately generic, so no organisation's space, page or tooling names live in the repo, and the key set is closed - `global` is `additionalProperties: false`, so a documented-but-undeclared key would have failed `validate-prefs.mjs` for anyone who set it.
|
|
54
|
+
- **Stack selection is optional** (Locked 35). `No platform yet` is a real answer: evidence is still fetched, everything that does not need a target repository renders in full, and only the development layer plus the Pass B projection are skipped, with an open-question row recording why. The output is a single file at `~/Desktop/multiAgentAnalysis/<feature-name>/<feature>.md`: without a repo the usual repo-relative `analysis/` path has nothing to be relative to, and the current working directory is never written to, since for a repo-less run it is arbitrary and creating a folder wherever the command happened to be invoked is the kind of surprise that costs a tool its trust. Desktop rather than a hidden directory because the document is a deliverable meant to be opened and handed over, and `Analysis` because a folder named after the command that produced it is guessable; the Phase 3.5 picker shows the resolved path and takes an override. A requirements document is useful before anyone has decided which repository will hold the code, and refusing to produce one until that decision exists inverts the order the work actually happens in.
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
|
|
58
|
+
- **The context-budget gate measures what one analysis run pays, not what the tree weighs.** With two profile templates on disk and exactly one loaded per run, summing both would bill every run for a file it never reads - and would push the project toward deleting a template to satisfy a number that was measuring the wrong thing. The gate is now shared refs plus the largest template; the pinned ceiling moves 145000 -> 155000, and the current cost is 146139 bytes.
|
|
59
|
+
- `validate-analysis-doc.mjs` reads `profile` from the front-matter and applies the matching contract. Three global-profile checks - the Section 3 flow-chart warning, the bare `N/A` placeholder warning, and the missing-`BR-` warning - no longer fire on a corporate document, where Section 3 is Business Requirements, `N/A` is required behaviour, and the spine is `IG`/`UC`/`FG`. The Test Plan check matches on title rather than number, so it covers both profiles, and is waived only for the stack-optional render where the development layer is legitimately absent. `platform: none` is a known platform value.
|
|
60
|
+
|
|
61
|
+
### Fixed
|
|
62
|
+
|
|
63
|
+
- `analysis-template.md` cited the References-at-the-bottom rule as Locked 20; Locked 20 is the localization mode and the References rule is Locked 21.
|
|
64
|
+
|
|
19
65
|
## [16.5.0] - 2026-08-25
|
|
20
66
|
|
|
21
67
|
Staying current stops being something a user has to be told to do.
|
package/README.md
CHANGED
|
@@ -77,7 +77,7 @@ The discipline behind all of this - bounded loops, evidence gates, token-budgete
|
|
|
77
77
|
| Audit | `/multi-agent:design-check` | Mock-mode vs Figma conformance, local-only |
|
|
78
78
|
| Audit | `/multi-agent:testflight-validation` | Pre-submission gates for a TestFlight build: static archive audit → Apple's `altool --validate-app` → Review-Guidelines check. Validates only, never uploads |
|
|
79
79
|
|
|
80
|
-
Helpers: `setup`, `status`, `resume #N`, `kill #N`, `garbage-collect`, `prune-logs`, `purge`, `review`, `test`, `channels`, `stack`, `update`, `sync`, `refactor`, `jira`, `issue`, `analysis`, `create-jira`, `save`, `routines`, `forget`.
|
|
80
|
+
Helpers: `setup`, `status`, `resume #N`, `kill #N`, `garbage-collect`, `prune-logs`, `purge`, `review`, `test`, `channels`, `stack`, `update`, `sync`, `refactor`, `jira`, `issue`, `analysis`, `create-jira`, `save`, `routines`, `forget`. 53 commands in all - full list: `/multi-agent:help`.
|
|
81
81
|
|
|
82
82
|
## Stacks
|
|
83
83
|
|
|
@@ -91,13 +91,13 @@ This enables the matching plugin (+ the shared `ai-common` plugin) in the repo's
|
|
|
91
91
|
|
|
92
92
|
## Tool support
|
|
93
93
|
|
|
94
|
-
The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same
|
|
94
|
+
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.
|
|
95
95
|
|
|
96
96
|
| Tool | Flag | What it installs |
|
|
97
97
|
|---|---|---|
|
|
98
98
|
| Claude Code | `--claude` (default) | slash commands + skills + agents + `PreToolUse` secret-scan hook |
|
|
99
|
-
| Copilot CLI | `--copilot` | instructions +
|
|
100
|
-
| Codex CLI | `--codex` | one router skill +
|
|
99
|
+
| Copilot CLI | `--copilot` | instructions + 53 sub-command skills + scripts |
|
|
100
|
+
| Codex CLI | `--codex` | one router skill + 53 specs as refs + 8 agent TOML + `AGENTS.md` block + `codex mcp add` |
|
|
101
101
|
|
|
102
102
|
Filter skills by stack with `--platform=ios\|android\|all`.
|
|
103
103
|
|
package/README.tr.md
CHANGED
|
@@ -76,7 +76,7 @@ Bunun arkasındaki disiplin - sınırlı loop'lar, kanıt kapıları, token-büt
|
|
|
76
76
|
| Audit | `/multi-agent:design-check` | Mock-mode vs Figma uygunluğu, yalnızca lokal |
|
|
77
77
|
| Audit | `/multi-agent:testflight-validation` | TestFlight build için pre-submission kapıları: statik archive denetimi → Apple'ın `altool --validate-app`'i → Review-Guidelines kontrolü. Yalnızca doğrular, asla yüklemez |
|
|
78
78
|
|
|
79
|
-
Yardımcılar: `setup`, `status`, `resume #N`, `kill #N`, `garbage-collect`, `prune-logs`, `purge`, `review`, `test`, `channels`, `stack`, `update`, `sync`, `refactor`, `jira`, `issue`, `analysis`, `create-jira`, `save`, `routines`, `forget`. Toplam
|
|
79
|
+
Yardımcılar: `setup`, `status`, `resume #N`, `kill #N`, `garbage-collect`, `prune-logs`, `purge`, `review`, `test`, `channels`, `stack`, `update`, `sync`, `refactor`, `jira`, `issue`, `analysis`, `create-jira`, `save`, `routines`, `forget`. Toplam 53 komut - tam liste: `/multi-agent:help`.
|
|
80
80
|
|
|
81
81
|
## Stack'ler
|
|
82
82
|
|
|
@@ -90,13 +90,13 @@ Bu, ilgili plugin'i (+ ortak `ai-common` plugin'ini) repo'nun `.claude/settings.
|
|
|
90
90
|
|
|
91
91
|
## Araç desteği
|
|
92
92
|
|
|
93
|
-
Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çalışır - üçü de aynı `pipeline/` kaynağından kurulur ve aynı
|
|
93
|
+
Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çalışır - üçü de aynı `pipeline/` kaynağından kurulur ve aynı 53 komutu alır.
|
|
94
94
|
|
|
95
95
|
| Araç | Bayrak | Ne kurar |
|
|
96
96
|
|---|---|---|
|
|
97
97
|
| Claude Code | `--claude` (varsayılan) | slash komutları + skill'ler + agent'lar + `PreToolUse` secret-scan hook'u |
|
|
98
|
-
| Copilot CLI | `--copilot` | talimatlar +
|
|
99
|
-
| Codex CLI | `--codex` | bir router skill + ref olarak
|
|
98
|
+
| Copilot CLI | `--copilot` | talimatlar + 53 alt-komut skill'i + script'ler |
|
|
99
|
+
| Codex CLI | `--codex` | bir router skill + ref olarak 53 spec + 8 agent TOML + `AGENTS.md` bloğu + `codex mcp add` |
|
|
100
100
|
|
|
101
101
|
Skill'leri stack'e göre filtrele: `--platform=ios\|android\|all`.
|
|
102
102
|
|
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/>53 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 + 53 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 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 |
|
|
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 · 53 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/>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"]
|
|
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** | 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 |
|
|
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "16.
|
|
3
|
+
"version": "16.7.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",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Standalone feature-spec analysis. Platform-agnostic concept layer with repo-driven convention extraction (Phase 1c) and per-platform Pass B render
|
|
3
|
-
description-tr: "Bağımsız özellik-spesifikasyonu analizi. Repo'dan konvansiyon çıkarımıyla (Faz 1c) platform-bağımsız kavram katmanı ve platform başına Pass B render
|
|
2
|
+
description: "Standalone feature-spec analysis. Two profiles picked at intake: global (23-section development handoff, 8 of them in Lite mode) or corporate (IG/UC/FG requirements document with traceability matrices). Platform-agnostic concept layer with repo-driven convention extraction (Phase 1c) and per-platform Pass B render; stack selection is optional. Collects Figma / Swagger / Confluence / Jira / Standards (Confluence + Wiki + local file) / Firebase / repo inputs. Stops after emit - does not chain into a dev run. Use when a feature needs a written specification before any code."
|
|
3
|
+
description-tr: "Bağımsız özellik-spesifikasyonu analizi. Girişte iki profil: global (23 bölümlük geliştirme dokümanı, Lite modda 8'i) veya kurumsal (izlenebilirlik matrisleriyle IG/UC/FG gereksinim dokümanı). Repo'dan konvansiyon çıkarımıyla (Faz 1c) platform-bağımsız kavram katmanı ve platform başına Pass B render; stack seçimi opsiyonel. Figma / Swagger / Confluence / Jira / Standartlar (Confluence + Wiki + yerel dosya) / Firebase / repo girdilerini toplar. Çıktıyı üretince durur - dev koşusuna zincirlenmez."
|
|
4
4
|
argument-hint: "[\"<analysis-name>\"] [--lite | --full] [--no-cache] [--preview-conventions]"
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -18,7 +18,7 @@ This command is **independent** from the orchestrator's Phase 1 analysis (which
|
|
|
18
18
|
|
|
19
19
|
These decisions are settled. Do not surface them as `AskUserQuestion` items, do not re-derive them from context, do not invite the user to override mid-run. If the user explicitly wants one of them changed, treat that as a separate request and update this list.
|
|
20
20
|
|
|
21
|
-
The full list of
|
|
21
|
+
The full list of 35, with the category index, lives in `$HOME/.claude/multi-agent-refs/analysis/locked.md`. Read it before the run starts; it is the contract the whole flow is judged against. `/multi-agent:analysis-resolve` inherits the same list.
|
|
22
22
|
|
|
23
23
|
Cite a decision as `Locked <n> (<short label>)` so the category is inferable.
|
|
24
24
|
|
|
@@ -26,6 +26,19 @@ Cite a decision as `Locked <n> (<short label>)` so the category is inferable.
|
|
|
26
26
|
|
|
27
27
|
- `$ARGUMENTS` - optional analysis name (e.g. `"UserProfile"`). If empty, asked at Phase 0 Step 1. Stored internally as `state.analysisSpec.featureName` for backward compatibility.
|
|
28
28
|
|
|
29
|
+
## Profile
|
|
30
|
+
|
|
31
|
+
Phase 0 Step 1b asks which analysis standard the document follows (Locked 32), and the answer selects the template. Both profiles read the same evidence: intake, fetching, repo evidence and convention extraction are shared, so the two cannot drift into two products.
|
|
32
|
+
|
|
33
|
+
| Profile | Template | Shape |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `global` (default) | `analysis-template.md` | Development handoff, 23 sections. Business rules with Gherkin acceptance criteria, architecture plan, files to add, test plan. Zero-evidence sections drop (Locked 2). |
|
|
36
|
+
| `corporate` | `analysis-template-corporate.md` | Requirements document. `IG -> UC -> FG` spine with three traceability matrices, current and target state with impact analysis, then Technical Analysis and Development Analysis. The Part A backbone always renders, carrying `N/A` or `EKLENECEK` (Locked 33). |
|
|
37
|
+
|
|
38
|
+
One run emits one profile. A missing input never blocks either profile: the gap is written as `EKLENECEK` and raised as a Section 20 open question rather than halting the run.
|
|
39
|
+
|
|
40
|
+
**Stack is optional** (Locked 35). When no platform is selected the run still completes: everything that does not need a target repository renders in full, and only the development layer plus the Pass B projection are skipped, with a Section 20 row recording why. The output is a single file at `~/Desktop/multiAgentAnalysis/<feature-name>/<feature>.md` instead of one per repo: without a repo there is no working tree for the usual `analysis/` path to be relative to, and the current working directory is never written to. The Phase 3.5 picker shows the resolved path and accepts an override.
|
|
41
|
+
|
|
29
42
|
## Template
|
|
30
43
|
|
|
31
44
|
v3 template at `$HOME/.claude/multi-agent-refs/analysis-template.md`. Full mode renders up to 23 main sections + footer, minus any dropped by the omission table. The analysis doc is a development handoff, so low-signal sections are default-drop even in Full: **19 Alternatives** (render only for a real 2+-option architectural decision), **22 Glossary** (render only on request or >5 unfamiliar domain terms), and **18 Rollout** (compact checklist only, dropped when the pipeline's own commit/PR/rollout phase covers it). Lite mode renders 7 main sections (1 Summary, 2 Goals + Non-Goals, 4 User Stories, 9 API Contracts, 13 Architecture, 14 Files to Add, 21 References) plus optional 23 Changelog. Section omission rule (Locked 2): zero-evidence and default-drop sections omit entirely; numbering re-flows to stay sequential `1..N` over the rendered set.
|
|
@@ -38,7 +51,7 @@ The template is platform-agnostic (Locked 22). It speaks in concepts (state hold
|
|
|
38
51
|
|
|
39
52
|
### Phase 0 - Intake
|
|
40
53
|
|
|
41
|
-
Full picker chain: `$HOME/.claude/multi-agent-refs/analysis/intake.md`. Sequential `AskUserQuestion` steps filling `state.analysisSpec.*`: analysis name, account, platform multi-select, repos per platform, the six-question source batch (Figma / Swagger / Confluence / Jira / Standards / Firebase) and the two coverage opt-ins. Step narration is required - the chain length is known up front, so every step prints its breadcrumb.
|
|
54
|
+
Full picker chain: `$HOME/.claude/multi-agent-refs/analysis/intake.md`. Sequential `AskUserQuestion` steps filling `state.analysisSpec.*`: analysis name, analysis profile, account, platform multi-select, repos per platform, the six-question source batch (Figma / Swagger / Confluence / Jira / Standards / Firebase) and the two coverage opt-ins. Step narration is required - the chain length is known up front, so every step prints its breadcrumb.
|
|
42
55
|
|
|
43
56
|
### Phases 1, 1b, 1b.1, 1c - Evidence gathering
|
|
44
57
|
|
|
@@ -50,7 +63,7 @@ Full contract: `$HOME/.claude/multi-agent-refs/analysis/synthesis.md`. Pass A bu
|
|
|
50
63
|
|
|
51
64
|
### Phases 3, 3.5, 4, 5 - Render, publish, report
|
|
52
65
|
|
|
53
|
-
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
|
|
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.
|
|
54
67
|
|
|
55
68
|
### Resume contract
|
|
56
69
|
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Send one message to the maintainer: a bug, an idea or a question. Only the text you type is sent - no logs, no repo names, no paths. Shows the payload and asks before sending."
|
|
3
|
+
description-tr: "Bakımcıya tek mesaj gönderir: hata, fikir ya da soru. Yalnızca yazdığın metin gider - log yok, repo adı yok, yol yok. Göndermeden önce içeriği gösterip onay ister."
|
|
4
|
+
argument-hint: "\"<message>\" [bug | idea | question] - with no argument, you are asked for the text"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# multi-agent feedback - tell the maintainer
|
|
8
|
+
|
|
9
|
+
**Input**: $ARGUMENTS
|
|
10
|
+
|
|
11
|
+
One message, sent to the maintainer's admin panel. This exists because the alternative is a problem nobody hears about: a run goes wrong, the person shrugs and works around it, and the same defect is still there a month later.
|
|
12
|
+
|
|
13
|
+
## What is sent
|
|
14
|
+
|
|
15
|
+
**Only the text you type**, plus three fields the report is useless without:
|
|
16
|
+
|
|
17
|
+
| Field | Why |
|
|
18
|
+
|---|---|
|
|
19
|
+
| `text` | What you wrote. Verbatim, up to 4000 characters. |
|
|
20
|
+
| `kind` | `bug`, `idea` or `question`. |
|
|
21
|
+
| `v` | The installed pipeline version - a report against 16.4 and one against 16.6 are different reports. |
|
|
22
|
+
| `host` | Claude Code, Copilot CLI or Codex CLI - a bug that only reproduces on one host is a different bug. |
|
|
23
|
+
| `at` | When you sent it. |
|
|
24
|
+
|
|
25
|
+
**No logs are attached, ever.** Not the agent log, not the diff, not the repo name, not the branch, not a file path. That is a deliberate limit rather than an oversight: this package installs from a public registry, so an automatic log attachment would take a corporate user's internal identifiers off their machine and into someone else's database. You can paste the one line you think matters - a script cannot know which line that is, so it does not guess.
|
|
26
|
+
|
|
27
|
+
## Flow
|
|
28
|
+
|
|
29
|
+
1. Take the message from `$ARGUMENTS`. With no argument, ask for it (free text) and then ask the kind.
|
|
30
|
+
2. **Print the exact payload that will be sent**, as JSON, using the script's own dry run so what is shown is what goes:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
node "$HOME/.claude/scripts/feedback-send.mjs" --text "<message>" --kind <kind> --dry-run
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
3. **Ask for confirmation.** Nothing leaves the machine before a yes. This is an outward-facing action and the pipeline confirms those; showing the payload first is what makes the yes meaningful. Autopilot does not exempt this - a message to a person is never something to fire unattended.
|
|
37
|
+
4. Send:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
node "$HOME/.claude/scripts/feedback-send.mjs" --text "<message>" --kind <kind>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
5. Report the result plainly. A failure is surfaced, not swallowed: the person is waiting to hear whether their message went, and silence would leave them believing they had been heard.
|
|
44
|
+
|
|
45
|
+
## Auth and reachability
|
|
46
|
+
|
|
47
|
+
Reuses the usage ingest token (`prefs.global.keychainMapping.usage_ingest`), so nothing extra has to be onboarded - `/multi-agent:update` registers one on first run. With no token, the command says so and names the command that fixes it rather than failing quietly.
|
|
48
|
+
|
|
49
|
+
`usageLog.optOut` does **not** silence this. Telemetry is passive collection and opting out of it is a real choice; feedback is a deliberate act by the person typing the command, and dropping a message somebody chose to send would be worse than not offering the command at all.
|
|
50
|
+
|
|
51
|
+
The endpoint must be TLS. The token rides in a header, so plain http would put it on the wire in cleartext; only loopback is exempt, for local development.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Review a written analysis document instead of a diff: resolve it from a path, a Confluence page or a Jira issue, run the deterministic gates first, then a parallel model review. Findings cite the Locked rule they break. Never edits the document."
|
|
3
|
+
description-tr: "Diff yerine yazılmış analiz dokümanını review eder: yol, Confluence sayfası veya Jira issue'sundan getirir, önce deterministik geçitleri koşar, sonra paralel model review. Bulgular ihlal edilen Locked kuralını gösterir. Dokümanı düzenlemez."
|
|
4
|
+
argument-hint: "[path | Confluence URL | pageId | JIRA-KEY] [--state <state.json>] - optional; with no argument, pick from recent analyses"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# multi-agent review-analysis - analysis document review
|
|
8
|
+
|
|
9
|
+
**Input**: $ARGUMENTS
|
|
10
|
+
|
|
11
|
+
`/multi-agent:review` judges a diff. This judges the document that diff was supposed to come from, before anyone writes the code it describes. No worktree, no branch, no commit, and the reviewed document is never edited in place.
|
|
12
|
+
|
|
13
|
+
## Flow
|
|
14
|
+
|
|
15
|
+
Read `$HOME/.claude/multi-agent-refs/analysis/review.md` and execute it:
|
|
16
|
+
|
|
17
|
+
1. **Resolve** the document from a local path, a Confluence URL or `pageId`, or a Jira key. With no argument, offer the recent analyses from `~/Desktop/multiAgentAnalysis/` and from each selected repo's `analysis/`, newest first.
|
|
18
|
+
2. **Deterministic gates first**: `validate-analysis-doc.mjs` on the document, and `build-references.mjs --check` when the run's state JSON is available (`--state`, or a fresh analysis). Their output is reported verbatim, before any model reads the document. A finding a script already proves does not need an opinion.
|
|
19
|
+
3. **Parallel model review** against the rubric (buildability, evidence, spine, altitude, admitted gaps, contradiction), CLI-aware: 2 models on Claude Code, 3 on Copilot CLI.
|
|
20
|
+
4. **Fable triage** into Blocker / Important / Suggestion, dropping duplicates and anything the document answers elsewhere.
|
|
21
|
+
5. **Report**, naming the profile it judged against and, explicitly, what was NOT checked.
|
|
22
|
+
6. **Output** on request only: chat (default), Confluence comment, Jira comment, or a `-review.md` beside the document.
|
|
23
|
+
|
|
24
|
+
## Why it cites Locked decisions
|
|
25
|
+
|
|
26
|
+
The analysis flow already declares 35 Locked decisions and two deterministic validators. A reviewer that says "I would have written this differently" gives the author nothing to act on; one that says "Locked 34: the Confluence page is in the evidence record but not in Section 21" gives them a fix and a reason. Findings that map to no rule are still allowed, but they are marked as judgement, not dressed up as a violation.
|
|
27
|
+
|
|
28
|
+
## What it never does
|
|
29
|
+
|
|
30
|
+
- Edits the reviewed document. The document belongs to its author; a reviewer who rewrites it has removed the choice to disagree. `/multi-agent:analysis-resolve` is the command that folds answers back in.
|
|
31
|
+
- Touches a Jira description or a Confluence page body. Comments only.
|
|
32
|
+
- Chains into a dev run, creates a branch, or commits.
|
|
@@ -59,7 +59,7 @@ Run every step automatically:
|
|
|
59
59
|
```
|
|
60
60
|
Step 1: PLATFORM Detect macOS / Linux / Windows (Git Bash / WSL); export PLATFORM env
|
|
61
61
|
Step 1.5: DETECT Compare timestamps, find stale targets
|
|
62
|
-
Step 2: COPILOT Claude Code -> Copilot CLI (instructions +
|
|
62
|
+
Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 53 sub-command skills)
|
|
63
63
|
Step 2b: CODEX Claude Code -> Codex CLI (1 router skill + 51 specs as refs + 8 agent TOML)
|
|
64
64
|
Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub, bash -n on all sh)
|
|
65
65
|
Step 3c: PLUGINS pipeline shared/external -> multi-agent-plugins marketplace (rebuild knowledge/,
|
|
@@ -166,7 +166,7 @@ If nothing is stale → report "All targets up to date" and stop.
|
|
|
166
166
|
Unlike the Copilot step, this one does **not** hand-copy files. The Codex tree is a
|
|
167
167
|
*transform* of the Claude tree, not a mirror of it, and the transform is real work:
|
|
168
168
|
|
|
169
|
-
- the
|
|
169
|
+
- the 53 sub-command specs become reference files, because Codex silently truncates
|
|
170
170
|
its skills block (see `cross-cli-contract.md` 2.6 for the measurement)
|
|
171
171
|
- every `$HOME/.claude/...` reference to a CLI-owned tree is retargeted, with
|
|
172
172
|
`agents/<persona>.md` becoming `.toml` and the dispatcher becoming the router skill
|
|
@@ -242,10 +242,8 @@ node "$HOME/multi-agent-pipeline/pipeline/scripts/build-stack-plugins.mjs"
|
|
|
242
242
|
```bash
|
|
243
243
|
cd "$PLUGINS_REPO"
|
|
244
244
|
if ! git diff --quiet; then
|
|
245
|
-
# Identity
|
|
246
|
-
#
|
|
247
|
-
# ships to every installation, so a literal identity attributes a downstream user's
|
|
248
|
-
# plugins-repo commits to someone else and switches their gh account out from under them.
|
|
245
|
+
# Identity: routed for {owner} (platformIdentityRouting). Never a literal: this file
|
|
246
|
+
# installs everywhere and would misattribute a downstream user's commits.
|
|
249
247
|
git config user.name "{identity.name}"
|
|
250
248
|
git config user.email "{identity.email}"
|
|
251
249
|
git add -A
|
|
@@ -436,7 +434,7 @@ With `release`, or in autopilot, run the full ship path without asking. If the w
|
|
|
436
434
|
|
|
437
435
|
## Website Sync (Step 4)
|
|
438
436
|
|
|
439
|
-
Propagate
|
|
437
|
+
Propagate version, phase and model counts and feature descriptions to the website.
|
|
440
438
|
|
|
441
439
|
```bash
|
|
442
440
|
gh auth switch --user {owner}
|
|
@@ -451,9 +449,10 @@ cd "$WEBSITE_DIR" && git pull origin main
|
|
|
451
449
|
| `src/data/projects.ts` | Version number, tagline, description, feature list |
|
|
452
450
|
|
|
453
451
|
```bash
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
452
|
+
# A commit the platform does not recognise is pushed fine and never built, so the site
|
|
453
|
+
# keeps the old version. {identity} is the one routed to {owner}, not the run's own.
|
|
454
|
+
# Why, signature, recovery: `$HOME/.claude/multi-agent-refs/website-deploy.md`.
|
|
455
|
+
bash "$HOME/.claude/scripts/website-deploy-commit.sh" "{identity.name}" "{identity.email}" "{VERSION}" "$WEBSITE_DIR"
|
|
457
456
|
```
|
|
458
457
|
|
|
459
458
|
---
|
|
@@ -470,7 +469,7 @@ When invoked with the `release` argument:
|
|
|
470
469
|
5. Commit + TAG git commit + git tag v{VERSION}
|
|
471
470
|
6. PUSH git push --tags -> release.yml auto-publish
|
|
472
471
|
7. DEV-TOOLKIT Ship the companion MCP server if it moved (Step 3d gates, then publish)
|
|
473
|
-
8. WEBSITE Version + features -> {website-host}
|
|
472
|
+
8. WEBSITE Version + features -> {website-host} (maintainer identity, build verified Ready)
|
|
474
473
|
9. COPILOT Copilot CLI instructions + skills sync
|
|
475
474
|
9b. CODEX Codex CLI router skill + refs + agent TOML (node install.js --codex)
|
|
476
475
|
10. Report Summary: version, touched repos, deploy status
|
|
@@ -490,15 +489,18 @@ same 51 specs as reference files rather than as peer skills, via Step 2b - see
|
|
|
490
489
|
|-------------|-------------|
|
|
491
490
|
| `~/.claude/commands/multi-agent/{cmd}/SKILL.md` | `~/.copilot/skills/multi-agent-{cmd}/SKILL.md` |
|
|
492
491
|
|
|
493
|
-
**
|
|
492
|
+
**53 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
|
|
494
493
|
|
|
495
494
|
```
|
|
496
|
-
analysis, analysis-resolve, autopilot, build-optimize, channels,
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
495
|
+
analysis, analysis-resolve, autopilot, build-optimize, channels,
|
|
496
|
+
complaint-analysis, create-jira, design-check, dev, dev-autopilot, dev-local,
|
|
497
|
+
dev-local-autopilot, diff-explain, feedback, forget, garbage-collect, help,
|
|
498
|
+
ios-coding-standard, issue, jira, kill, language, local, local-autopilot,
|
|
499
|
+
log, manual-test, prune-logs, prune-prompts, purge, refactor, resume,
|
|
500
|
+
resume-local, review, review-analysis, review-issue, review-jira, routines,
|
|
501
|
+
save, scan, search, setup, stack, status, store-ready, sync, test,
|
|
502
|
+
test-accessibility, test-dark-mode, test-dynamic-type, test-screenshots,
|
|
503
|
+
testflight-validation, uninstall, update
|
|
502
504
|
```
|
|
503
505
|
|
|
504
506
|
**NOT synced**: `$HOME/.claude/multi-agent-refs/*` - lazy-load references, Claude Code specific
|
|
@@ -179,7 +179,7 @@ A git clone of the pipeline repo is a maintainer workspace, kept in sync by `/mu
|
|
|
179
179
|
```
|
|
180
180
|
Current: v15.6.0 Latest: v15.6.1
|
|
181
181
|
-> npm pack @{npm-scope}/multi-agent-pipeline@15.6.1
|
|
182
|
-
-> node install.js --all (
|
|
182
|
+
-> node install.js --all (53 commands, 245 scripts, 208 skills)
|
|
183
183
|
-> migrate-prefs.mjs (0 changes - already v2.6.0)
|
|
184
184
|
|
|
185
185
|
✓ Updated: v15.6.0 → v15.6.1
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
Sequential `AskUserQuestion` chain. Each answer is written to state under `state.analysisSpec.*`.
|
|
8
8
|
|
|
9
|
-
**Step narration (required, per `$HOME/.claude/multi-agent-refs/picker-contract.md`)**: the chain length is known up front - 1 analysis-name + 1 account + 1 platform + 1 repo-round per selected platform + 1 input-URL batch + 1 coverage-options batch (so a single-platform run is
|
|
9
|
+
**Step narration (required, per `$HOME/.claude/multi-agent-refs/picker-contract.md`)**: the chain length is known up front - 1 analysis-name + 1 profile + 1 account + 1 platform + 1 repo-round per selected platform + 1 input-URL batch + 1 coverage-options batch (so a single-platform run is 7 steps; account is skipped for local-only flows and the profile step auto-resolves when only one profile is available, either of which lowers the total). Before each step's `AskUserQuestion`, print the narrator line `<localized: "Step <i>/<n>: <what this step decides>">` in `outputLanguage`. Auto-resolved steps (single account, local-only) still print their breadcrumb with the resolution noted. This is what makes the picker show, step by step, what it is doing.
|
|
10
10
|
|
|
11
11
|
#### Step 0 - Language resolution (BLOCKING, runs before any picker)
|
|
12
12
|
|
|
@@ -17,6 +17,29 @@ Before emitting the first `AskUserQuestion`, read `prefs.global.outputLanguage`
|
|
|
17
17
|
If `$ARGUMENTS` is empty, ask via AskUserQuestion (single question, user types via Other).
|
|
18
18
|
Result: `state.analysisSpec.featureName` (state key kept for backward compatibility; user-facing label is "analysis name").
|
|
19
19
|
|
|
20
|
+
#### Step 1b - Analysis profile
|
|
21
|
+
|
|
22
|
+
Asked once, immediately after the analysis name and before anything is fetched, because the profile decides which template the whole run renders against (Locked 32). Never re-asked mid-run.
|
|
23
|
+
|
|
24
|
+
Read the available profiles from `prefs.global.analysisProfiles` (default `["global", "corporate"]`). When only one is available, auto-resolve and print the breadcrumb with the resolution noted rather than asking a question whose answer is already settled.
|
|
25
|
+
|
|
26
|
+
AskUserQuestion (single-select):
|
|
27
|
+
```
|
|
28
|
+
header: "Profile"
|
|
29
|
+
question: <localized: "Which analysis standard should this document follow?">
|
|
30
|
+
options:
|
|
31
|
+
- label: "Global"
|
|
32
|
+
description: <localized: "Development handoff, 23 sections. Business rules with Gherkin acceptance criteria, architecture plan, files to add, test plan. Sections with no evidence are dropped.">
|
|
33
|
+
- label: "Corporate"
|
|
34
|
+
description: <localized: "Requirements document. Business requirement to use case to functional requirement spine with three traceability matrices, current and target state with impact analysis, then technical analysis and development analysis. Backbone sections always render.">
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Result: `state.analysisSpec.profile` (`global` | `corporate`). Empty submit re-asks; an empty answer does not imply the default (`feedback_no-inferred-defaults-from-empty-answer`).
|
|
38
|
+
|
|
39
|
+
The profile changes nothing about intake, fetching, repo evidence or convention extraction - those are shared. It selects the template at Phase 3 and switches the omission rule for the corporate backbone (Locked 33).
|
|
40
|
+
|
|
41
|
+
**Corporate profile bindings.** Publication targets and house terminology are read from `prefs.global.analysisProfile.corporate` when present: `confluenceSpaceKey`, `confluenceParentPageId`, `titleFormat`, `titlePrefix`, `apiSpecCommand` and a `glossary` map. The key set is closed in `prefs.schema.json`, so a typo is caught by `validate-prefs.mjs` rather than silently ignored at emit time. They are deployment configuration, not part of the shipped template: an unconfigured corporate run still renders the full document and asks for the destination at Phase 3.5 like any other run.
|
|
42
|
+
|
|
20
43
|
#### Step 2 - Account picker
|
|
21
44
|
|
|
22
45
|
Reuse `_account-picker.md`. Skipped if the resolved flow is local-only.
|
|
@@ -38,9 +61,13 @@ options:
|
|
|
38
61
|
- label: "Android"
|
|
39
62
|
- label: "Backend"
|
|
40
63
|
- label: "Frontend"
|
|
64
|
+
- label: "No platform yet"
|
|
65
|
+
description: <localized: "Analysis and technical analysis only. The development analysis is skipped until a repo is chosen.">
|
|
41
66
|
```
|
|
42
67
|
Empty submit → re-ask. Result: `state.analysisSpec.platforms[]`.
|
|
43
68
|
|
|
69
|
+
**`No platform yet` is a real answer, not a cancel** (Locked 35). It leaves `platforms[]` empty, skips Step 4 entirely, and the run continues: evidence is still fetched from every declared source, and the document renders every layer that does not need a target repository. Only the development layer and the Pass B projection drop, and Section 20 records that they await a repo selection. Output is a single `analysis/<feature>.md` rather than one file per platform, since the per-platform split exists to carry per-platform projections and there are none.
|
|
70
|
+
|
|
44
71
|
**Platform coverage = provided platforms.** The analysis renders exactly one per-platform file (Locked 9) for each platform selected here and given a repo in Step 4: select iOS only -> a single iOS document; select iOS + Android -> one iOS and one Android document, each projected through that repo's own conventions (Phase 1c) and its own Code Connect index (Phase 1b.1, discovered from that repo's `*.figma.swift` / `*.figma.kt`). Do not analyze a platform the user did not select, and do not drop a selected platform that has a repo.
|
|
45
72
|
|
|
46
73
|
#### Step 4 - Repos (from Phase 0, not re-asked)
|
|
@@ -49,6 +76,8 @@ Repos come from the orchestrator's Step 2 project selection plus `_dev-context.m
|
|
|
49
76
|
|
|
50
77
|
Map `state.analysisSpec.repos[]` from the Phase 0 selection: one entry per repo with `platform` (its stack tag), `name`, `path`, `canPush`. If a selected platform has no repo, ask for that one platform only.
|
|
51
78
|
|
|
79
|
+
When `platforms[]` is empty (Step 3 resolved to `No platform yet`), skip Steps 4 and 4 (fallback) entirely and print the breadcrumb noting that repo selection is deferred.
|
|
80
|
+
|
|
52
81
|
#### Step 4 (fallback) - Repo multi-select per platform
|
|
53
82
|
|
|
54
83
|
For each selected platform, run one AskUserQuestion round. Reuse `_dev-context.md` logic:
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
# Locked decisions (
|
|
1
|
+
# Locked decisions (35)
|
|
2
2
|
|
|
3
|
-
> The
|
|
3
|
+
> The 35 Locked decisions of the analysis flow. Loaded by `/multi-agent:analysis`, by `/multi-agent:analysis-resolve` (which inherits them) and by pipeline Phase 1 when it runs the analysis engine. Numbering is canonical: cite as `Locked <n> (<short label>)`.
|
|
4
4
|
|
|
5
5
|
### Index by category (v9.1.0+)
|
|
6
6
|
|
|
7
|
-
Browse-friendly grouping of the
|
|
7
|
+
Browse-friendly grouping of the 35 Locked decisions. Numbering stays canonical (matches the list below); the index is read-only navigation.
|
|
8
8
|
|
|
9
9
|
| Category | Decisions | Concern |
|
|
10
10
|
|---|---|---|
|
|
11
|
-
| **A. Governance** | 1, 5, 6, 7, 10, 26, 27 | Run-level process rules: one feature per run, default output, auto-commit ban, punctuation policy, output picker timing, Pass B preview, evidence digest cache |
|
|
12
|
-
| **B. Citation and Evidence** | 3, 4, 8, 11, 24, 30 | Every fact in the doc traces back to a source: citation discipline, forward-looking spec, standards binding, repo-evidence reuse-first, Pass B footnote mandatory, analysis self-contained (pipeline-wide) |
|
|
13
|
-
| **C. Output Format and Structure** | 2, 9, 13, 14, 16, 17, 20, 21, 25 | How the document is laid out: section omission rule, per-platform output split, Gherkin user stories, Goals + Non-Goals paired, Files-to-Add tag, API response variants exhaustive, localization mode (ownership-aware), References at the bottom, Lite mode |
|
|
11
|
+
| **A. Governance** | 1, 5, 6, 7, 10, 26, 27, 32 | Run-level process rules: one feature per run, default output, auto-commit ban, punctuation policy, output picker timing, Pass B preview, evidence digest cache, analysis profile |
|
|
12
|
+
| **B. Citation and Evidence** | 3, 4, 8, 11, 24, 30, 34 | Every fact in the doc traces back to a source: citation discipline, forward-looking spec, standards binding, repo-evidence reuse-first, Pass B footnote mandatory, analysis self-contained (pipeline-wide), references built from the evidence record |
|
|
13
|
+
| **C. Output Format and Structure** | 2, 9, 13, 14, 16, 17, 20, 21, 25, 33, 35 | How the document is laid out: section omission rule, per-platform output split, Gherkin user stories, Goals + Non-Goals paired, Files-to-Add tag, API response variants exhaustive, localization mode (ownership-aware), References at the bottom, Lite mode, corporate backbone always renders, stack-optional render |
|
|
14
14
|
| **D. Design Source and Pipeline Architecture** | 12, 22, 23 | Where design comes from and how the pipeline renders: Figma 3-tier access (BLOCKING), platform-agnostic template + Pass B render, convention extraction (Phase 1c) |
|
|
15
15
|
| **E. UI, Variant, and Test Coverage** | 15, 18, 19, 28, 29, 31 | UI artefact rules: SVG default for new assets, screenshots embedded, all Figma variants drilled, SwiftUI Preview block (iOS), variant usage explicit, business-rule to acceptance-criterion to test traceability |
|
|
16
16
|
|
|
@@ -51,3 +51,8 @@ When citing a Locked decision in code or docs, prefer `Locked <n> (<short label>
|
|
|
51
51
|
29. **Variant usage explicit and bounded.** Section 6 inventory rows list which variants this feature consumes per component (concrete enum case + bool value). New Section 6.X (Variant Usage Matrix) catalogues the full variant axis vs. used subset with a rationale per excluded variant. Sections 13.6 (Preview) and 15.2 (Snapshot) cover only the used subset; expanding the variant set requires updating Section 6.X first.
|
|
52
52
|
30. **Analysis as self-contained design bridge - no MCP outside analysis phase (BLOCKING, pipeline-wide).** The analysis document is the sole design source for every downstream phase. After Phase 1 of `/multi-agent:analysis` produces `analysis/<feature>-<platform>.md`, Phase 2 Planning, Phase 3 Dev, Phase 4 Review, Phase 5 Test, Phase 6 Commit, and Phase 7 Report consume only the analysis document plus repo Code Connect mappings (`*.figma.swift` / `*.figma.kt`). Calling `mcp__claude_ai_Figma__*`, hitting `api.figma.com`, or fetching a `figma.com/design/...` URL during Phase 2+ is a violation. Applies to every mode that runs Phase 2+: `/multi-agent`, `/multi-agent:autopilot`, `/multi-agent:local`, `/multi-agent:local-autopilot`, at either depth. Hard requirement (v9.0.0): Phase 2 Pre-item and Phase 3 Pre-item (BLOCKING) abort the run when the analysis document is missing. Memory: `[[mcp-only-in-analysis]]`. Generic rule rationale and access matrix: see `$HOME/.claude/rules/figma-pipeline.md` "MUST: No MCP outside analysis phase".
|
|
53
53
|
31. **Business-rule to acceptance-criterion to test traceability (AI + human spine).** The analysis is a development handoff that both an AI implementer and a human reviewer must act on, so it is bound by one shared-ID vocabulary. Every business rule carries a stable id `BR-<slug>-NN` (Section 4.4). Each rule maps to at least one acceptance criterion written Given / When / Then (binary - two readers must not be able to disagree on pass/fail). Each acceptance criterion maps to unit-test scenarios in Section 15.1, one row per case across happy / boundary / error / empty-nil (enumerate at least the failure modes; agents hallucinate error handling when it is omitted). The same ids thread onward: Section 15.6 UI-test flows reference the `BR-` ids and use stable selectors (accessibilityIdentifier / testTag), Section 16 accessibility items reuse those identifiers, Section 11 analytics events cite their triggering rule or story, and Section 5/7 layout cells carry token + Figma node refs. Never invent copy or values (blank beats a guess; a missing source becomes a Section 20 Open Question). **Mode-aware gate:** in Full mode a business rule with no acceptance criterion, or an acceptance criterion with no Section 15.1 scenario, fails the dispatch gate. In **Lite mode Section 15 is not rendered**, so the rule-to-test half does not apply - Section 4.4 still lists each rule with its Given/When/Then acceptance criterion (the acceptance criterion is itself the testable statement), and the 15.1 mapping is deferred to whenever the feature is later analyzed in Full or implemented by a dev run. The rule-to-acceptance-criterion half always holds, in both modes.
|
|
54
|
+
|
|
55
|
+
32. **Analysis profile selected at intake.** `state.analysisSpec.profile` is `global` (default) or `corporate`, asked once at Phase 0 Step 1b and never re-asked mid-run. `global` renders `$HOME/.claude/multi-agent-refs/analysis-template.md` (23 sections, development handoff). `corporate` renders `$HOME/.claude/multi-agent-refs/analysis-template-corporate.md` (requirements document: `IG -> UC -> FG` spine, three traceability matrices, current-to-target state with impact analysis, then Technical Analysis and Development Analysis). **Both profiles read the same `state.analysisSpec.evidence.*`** - intake, fetching, repo evidence and convention extraction are shared and profile-independent; only the projection differs. This is what keeps the two templates from drifting into two products. One run emits one profile: rendering both from a single run would produce two documents describing the same feature, and the next reader would have to decide which one is current. When only one profile is available (`prefs.global.analysisProfiles` lists one, or the corporate profile has no binding configuration), the step auto-resolves and prints its breadcrumb with the resolution noted, per the picker contract.
|
|
56
|
+
33. **Corporate backbone always renders.** In the `corporate` profile the Locked 2 omission rule is replaced for Part A and the footer: those sections render even with zero evidence, carrying `N/A` when the section is genuinely out of scope for the feature and `EKLENECEK` when evidence is expected but missing. This is the point of a requirements document - a reader has to be able to tell "we considered hardware needs and there are none" from "nobody looked". Every `EKLENECEK` emits a matching Section 20 Risks and Open Questions row naming what is missing and who can answer it; an `EKLENECEK` with no such row fails the dispatch gate, because an unanswered question nobody owns is how a placeholder reaches production. **Missing inputs never block the run**: the corporate source practice of halting until every input arrives is deliberately not adopted - the document is produced with `EKLENECEK` in the gaps and the gaps are raised in Section 20. Part B follows the global omission table unchanged. In the `global` profile Locked 2 applies as written, with no placeholder of any kind.
|
|
57
|
+
34. **References are built from the evidence record, not written.** Section 21 is emitted by `$HOME/.claude/scripts/build-references.mjs` from `state.analysisSpec.evidence.*` in both profiles. Each row carries a precision anchor in its `Sürüm / Ref` column - Figma node id, Confluence `pageId` plus page version, the commit SHA a repo was read at, the Swagger spec version - because a reference with no anchor points at a moving target. Each row carries an `Erişim / Access` cell: a declared source that could not be fetched still gets a row reading `erişilemedi (<reason>)`, since a silently dropped source reads to the next person as a source that never existed. User statements from the conversation that no fetched source contains are recorded as `Serbest metin` rows, quoted verbatim, with the decision they settled. **Coverage gate**: every entry in `evidence.figma[]`, `confluence[]`, `jira[]`, `swagger[]`, `repo[]`, `standards[]`, `firebase[]`, `documents[]`, `outside[]`, `freeText[]` and every entry in `evidence.fetchErrors[]` must appear as a row, and every row must map to an evidence entry. A source that shaped the document but is missing from References fails the dispatch gate; so does an invented row with no evidence behind it.
|
|
58
|
+
35. **Stack-optional render.** Platform and repo selection are optional. When `state.analysisSpec.platforms[]` is empty, the run still completes: the analysis layers that do not need a target repository render in full - Part A and Part B in the corporate profile, Sections 1-12 and 16-17 in the global profile - and only the development layer is dropped (corporate Part C; global Sections 13, 14, 15) along with the Pass B projection, since there are no conventions to project onto. A Section 20 row records that the development analysis awaits a repo selection. One document is emitted rather than one per platform, because the per-platform split (Locked 9) exists to carry per-platform projections and there are none. It lands at `~/Desktop/multiAgentAnalysis/<feature-name>/<feature>.md`: the repo-relative `analysis/` path has nothing to be relative to without a repo, and the current working directory is never used, since for a repo-less run it is arbitrary. Desktop rather than a hidden directory because the document is a deliverable somebody is meant to open and hand over, and `multiAgentAnalysis` rather than a bare `Analysis` because a generic word collides with whatever else is on a desktop while the producer name groups every run this command ever writes. The Phase 3.5 picker shows the resolved path and takes an override through its Other input. A requirements document is useful before anyone has decided which repository will hold the code, and refusing to produce one until that decision exists inverts the order the work actually happens in.
|