@mmerterden/multi-agent-pipeline 14.1.1 → 14.2.2
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 +162 -0
- package/README.md +10 -6
- package/README.tr.md +143 -0
- package/docs/architecture.md +23 -8
- package/docs/ecosystem.md +237 -0
- package/install/_plugin-skills.mjs +16 -2
- package/install/codex.mjs +9 -4
- package/install/templates/copilot-instructions.md +12 -9
- package/package.json +1 -1
- package/pipeline/commands/deploy.md +4 -1
- package/pipeline/commands/multi-agent/SKILL.md +8 -5
- package/pipeline/commands/multi-agent/analysis/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/autopilot/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/channels/SKILL.md +15 -4
- package/pipeline/commands/multi-agent/create-jira/SKILL.md +4 -4
- package/pipeline/commands/multi-agent/dev/SKILL.md +10 -23
- package/pipeline/commands/multi-agent/dev-autopilot/SKILL.md +10 -2
- package/pipeline/commands/multi-agent/dev-local/SKILL.md +10 -24
- package/pipeline/commands/multi-agent/dev-local-autopilot/SKILL.md +10 -3
- package/pipeline/commands/multi-agent/help/SKILL.md +49 -11
- package/pipeline/commands/multi-agent/jira/SKILL.md +13 -2
- package/pipeline/commands/multi-agent/language/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/local/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/log/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/setup/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/ship/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +340 -0
- package/pipeline/commands/multi-agent/sync/SKILL.md +7 -6
- package/pipeline/commands/multi-agent/test/SKILL.md +18 -8
- package/pipeline/commands/multi-agent/test-accessibility/SKILL.md +33 -0
- package/pipeline/commands/multi-agent/test-dark-mode/SKILL.md +33 -0
- package/pipeline/commands/multi-agent/test-dynamic-type/SKILL.md +33 -0
- package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +41 -0
- package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +28 -201
- package/pipeline/commands/multi-agent/update/SKILL.md +1 -1
- package/pipeline/commands/sim-test.md +45 -36
- package/pipeline/lib/extract-conventions.sh +44 -15
- package/pipeline/lib/fetch-figma-annotations.sh +8 -1
- package/pipeline/lib/fetch-fortify.sh +23 -8
- package/pipeline/lib/figma-screenshot.sh +11 -1
- package/pipeline/lib/issue-fetcher.sh +76 -9
- package/pipeline/lib/md2confluence-v3.py +16 -2
- package/pipeline/lib/plan-todos.sh +5 -2
- package/pipeline/lib/post-pr-review.sh +8 -6
- package/pipeline/lib/shadow-git.sh +50 -9
- package/pipeline/lib/submodule-detector.sh +8 -1
- package/pipeline/multi-agent-refs/_input-parser.md +1 -1
- package/pipeline/multi-agent-refs/channels/confluence.md +3 -0
- package/pipeline/multi-agent-refs/channels/issue-comment.md +2 -2
- package/pipeline/multi-agent-refs/channels/jira.md +13 -2
- package/pipeline/multi-agent-refs/channels/pr-review-actions.md +1 -1
- package/pipeline/multi-agent-refs/channels/pr.md +20 -0
- package/pipeline/multi-agent-refs/channels/wiki.md +1 -1
- package/pipeline/multi-agent-refs/cross-cli-contract.md +6 -5
- package/pipeline/multi-agent-refs/features/worktree-finalize.md +1 -1
- package/pipeline/multi-agent-refs/generate-issue.md +2 -2
- package/pipeline/multi-agent-refs/issue-jira-triad.md +3 -3
- package/pipeline/multi-agent-refs/knowledge.md +1 -1
- package/pipeline/multi-agent-refs/payload-contracts.md +67 -0
- package/pipeline/multi-agent-refs/phases/modes.md +20 -0
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +2 -2
- package/pipeline/multi-agent-refs/phases/phase-6-commit.md +8 -40
- package/pipeline/multi-agent-refs/phases/phase-7-report.md +5 -3
- package/pipeline/multi-agent-refs/phases.md +6 -0
- package/pipeline/multi-agent-refs/rules.md +2 -0
- package/pipeline/schemas/prefs.schema.json +2 -2
- package/pipeline/scripts/audit-log-rotate.sh +10 -0
- package/pipeline/scripts/build-stack-plugins.mjs +8 -1
- package/pipeline/scripts/check-derived-drift.mjs +13 -1
- package/pipeline/scripts/diff-explain.mjs +41 -3
- package/pipeline/scripts/diff-risk-score.mjs +72 -8
- package/pipeline/scripts/gen-mode-dispatch.mjs +1 -1
- package/pipeline/scripts/learning-curve.mjs +8 -2
- package/pipeline/scripts/output-quality-check.sh +15 -4
- package/pipeline/scripts/phase-tracker.sh +21 -8
- package/pipeline/scripts/pre-commit-check.sh +69 -22
- package/pipeline/scripts/render-agent-log-cost.sh +8 -3
- package/pipeline/scripts/render-cost-summary.sh +42 -22
- package/pipeline/scripts/render-work-summary.sh +47 -13
- package/pipeline/scripts/review-scope.mjs +1 -1
- package/pipeline/scripts/run-aggregator.mjs +38 -14
- package/pipeline/scripts/smoke-schema-validation.sh +5 -1
- package/pipeline/scripts/test-gap-scan.mjs +45 -6
- package/pipeline/scripts/uninstall.mjs +39 -4
- package/pipeline/scripts/update-issue-progress.sh +12 -16
- package/pipeline/scripts/worktree-finalize.sh +23 -2
- package/pipeline/skills/.skills-index.json +58 -4
- package/pipeline/skills/shared/README.md +12 -7
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +13 -17
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -0
- package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +4 -17
- package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +8 -0
- package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +5 -18
- package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +8 -0
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +50 -12
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +4 -0
- package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +4 -0
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +18 -3
- package/pipeline/skills/shared/core/multi-agent-ship/SKILL.md +4 -0
- package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +50 -0
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +6 -5
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +18 -8
- package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +37 -0
- package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +37 -0
- package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +37 -0
- package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +44 -0
- package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +29 -101
- package/pipeline/skills/shared/external/firebase/SKILL.md +1 -1
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +302 -0
- package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +144 -0
- package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +156 -0
- package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +108 -0
- package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +175 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +865 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +335 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +344 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +130 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +264 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-key-shots.py +298 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +529 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +187 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +171 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +184 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/snapshot-resources.sh +26 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +173 -0
- package/pipeline/skills/skills-index.md +10 -4
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# Ecosystem: Pipeline × Marketplace Plugins × Dev-Toolkit MCP
|
|
2
|
+
|
|
3
|
+
This pipeline is not one repo. It's three, each owned separately, each versioned
|
|
4
|
+
separately, wired together at install time and at run time:
|
|
5
|
+
|
|
6
|
+
| Repo | What it owns | Ships as |
|
|
7
|
+
|---|---|---|
|
|
8
|
+
| **`multi-agent-pipeline`** (this repo) | Orchestration: the 8-phase flow, the 49 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
|
+
| **`multi-agent-plugins`** | Stack knowledge: per-platform component/lifecycle skills (iOS, Android, Frontend, Backend) + shared knowledge | Claude Code marketplace, 5 independently-versioned plugins |
|
|
10
|
+
| **`dev-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
|
+
|
|
12
|
+
None of the three depends on the others at the code level. They compose through two
|
|
13
|
+
narrow contracts: the **Skill tool** (pipeline → plugin, at Phase 3) and the **MCP
|
|
14
|
+
protocol** (pipeline skills → dev-toolkit, at Phase 5 / design-check / store-ready).
|
|
15
|
+
Either can be swapped or removed without touching the other two's source.
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
graph LR
|
|
19
|
+
subgraph PIPE ["multi-agent-pipeline (orchestrator)"]
|
|
20
|
+
direction TB
|
|
21
|
+
PHASES["8 phases · 49 commands"]
|
|
22
|
+
GATES["deterministic gates + review triage"]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
subgraph PLUG ["multi-agent-plugins (stack knowledge)"]
|
|
26
|
+
direction TB
|
|
27
|
+
IOSP["ai-ios-engineering-toolkit"]
|
|
28
|
+
ANDP["ai-android-engineering-toolkit"]
|
|
29
|
+
FEP["ai-frontend-engineering-toolkit"]
|
|
30
|
+
BEP["ai-backend-toolkit"]
|
|
31
|
+
COMP["ai-common-engineering-toolkit"]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
subgraph DTK ["dev-toolkit-mcp (device/browser hands)"]
|
|
35
|
+
direction TB
|
|
36
|
+
DEV["Device Control (58)"]
|
|
37
|
+
A11Y["Accessibility Audit (2)"]
|
|
38
|
+
STORE["Store Compliance (5)"]
|
|
39
|
+
WEB["Web Automation (8)"]
|
|
40
|
+
DESIGN["Design Audit (6)"]
|
|
41
|
+
AGENTDSL["Agent DSL (1)"]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
PHASES -->|"Phase 3: Skill tool<br/>taskType===component"| PLUG
|
|
45
|
+
PHASES -->|"Phase 5 / design-check /<br/>store-ready: MCP tool calls"| DTK
|
|
46
|
+
GATES -.->|"Phase 4 Security Auditor"| STORE
|
|
47
|
+
|
|
48
|
+
style PIPE fill:#ffd,stroke:#333
|
|
49
|
+
style PLUG fill:#dfd,stroke:#333
|
|
50
|
+
style DTK fill:#dff,stroke:#333
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 1. Authoring flow: one source of truth, five sync targets
|
|
56
|
+
|
|
57
|
+
`~/.claude/` on the maintainer's machine is authoritative. Everything else is a
|
|
58
|
+
derived, synced, or independently-shipped artifact. `/multi-agent:sync` is the one
|
|
59
|
+
command that walks all five targets in order, detects which are stale, and updates
|
|
60
|
+
only those:
|
|
61
|
+
|
|
62
|
+
```mermaid
|
|
63
|
+
graph TD
|
|
64
|
+
CC["Claude Code<br/>~/.claude/commands/multi-agent/<br/>(source of truth)"]
|
|
65
|
+
|
|
66
|
+
CC -->|"Step 2: copy + reformat<br/>49 sub-command skills"| COP["Copilot CLI<br/>~/.copilot/skills/"]
|
|
67
|
+
CC -->|"Step 2b: transform<br/>(install.js --codex)"| COD["Codex CLI<br/>1 router skill + 49 refs<br/>+ 8 agent TOML"]
|
|
68
|
+
CC -->|"Step 3: genericize<br/>(strip personal data)"| REPO["multi-agent-pipeline repo<br/>pipeline/"]
|
|
69
|
+
CC -->|"Step 4: version + feature sync"| WEB["Website<br/>projects.ts / i18n.tsx"]
|
|
70
|
+
|
|
71
|
+
REPO -->|"Step 3c: build-stack-plugins.mjs<br/>rebuilds knowledge/ from<br/>shared/external"| PLUGREPO["multi-agent-plugins repo<br/>(5 stack plugins)"]
|
|
72
|
+
|
|
73
|
+
DTK2["dev-toolkit-mcp repo<br/>(own codebase, own gates,<br/>NOT generated from Claude)"]
|
|
74
|
+
SYNC3D["Step 3d: detect movement →<br/>gate → commit → publish"]
|
|
75
|
+
CC -.->|"sync only SHIPS this,<br/>never authors it"| SYNC3D
|
|
76
|
+
SYNC3D -.-> DTK2
|
|
77
|
+
|
|
78
|
+
REPO -->|"npm publish"| NPM["GitHub Packages"]
|
|
79
|
+
WEB -->|"git push → auto-deploy"| VERCEL["Vercel"]
|
|
80
|
+
PLUGREPO -->|"git push"| MKT["Claude Code marketplace"]
|
|
81
|
+
DTK2 -->|"npm publish"| NPM2["GitHub Packages<br/>(private)"]
|
|
82
|
+
|
|
83
|
+
style CC fill:#f9f,stroke:#333
|
|
84
|
+
style DTK2 fill:#dff,stroke:#333,stroke-dasharray: 5 5
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Why `dev-toolkit-mcp` is drawn differently.** The other four targets are *derived*
|
|
88
|
+
from the Claude Code source — sync writes their content. `dev-toolkit-mcp` is not:
|
|
89
|
+
it's a separate codebase developed on its own schedule. Sync's Step 3d only
|
|
90
|
+
*detects* whether it moved (dirty tree, unpushed commits, untagged version), runs
|
|
91
|
+
**its own** gate suite, and ships it — commit, tag, `npm publish`. If the pipeline
|
|
92
|
+
needs a tool that toolkit doesn't have yet, that's a two-repo change: add the tool
|
|
93
|
+
in `dev-toolkit-mcp`, ship it, then bump the minimum version pin back in
|
|
94
|
+
`cross-cli-contract.md` (see §4).
|
|
95
|
+
|
|
96
|
+
**Also not generated: the plugins' own authored skills.** `build-stack-plugins.mjs`
|
|
97
|
+
only rebuilds each plugin's `knowledge/` folder from `pipeline/skills/shared/external/`.
|
|
98
|
+
The plugins' lifecycle skills — `create-component`, `evolve-component`,
|
|
99
|
+
`figma-utility`, `code-connect`, `branch-and-pr`, `fix-bug`, and the rest — are
|
|
100
|
+
hand-authored *inside* `multi-agent-plugins` and are never touched by sync.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 2. Plugin marketplace build: one authoring source, five versioned artifacts
|
|
105
|
+
|
|
106
|
+
```mermaid
|
|
107
|
+
graph TD
|
|
108
|
+
EXT["pipeline/skills/shared/external/<br/>150 skills — single authoring source<br/>(the pipeline's own phases read these too)"]
|
|
109
|
+
|
|
110
|
+
EXT -->|"cross-stack skills"| COMMONP["ai-common-engineering-toolkit<br/>10 skills · v0.2.3"]
|
|
111
|
+
EXT -->|"Apple/Xcode-only"| IOSP["ai-ios-engineering-toolkit<br/>145 skills · v0.6.0"]
|
|
112
|
+
EXT -->|"Android/Kotlin-only"| ANDP["ai-android-engineering-toolkit<br/>29 skills · v0.1.3"]
|
|
113
|
+
EXT -->|"backend-only"| BEP["ai-backend-toolkit<br/>32 skills · v0.1.4"]
|
|
114
|
+
EXT -->|"web/frontend-only"| FEP["ai-frontend-engineering-toolkit<br/>24 skills · v0.1.3"]
|
|
115
|
+
|
|
116
|
+
COMMONP --> BUMP{"skill set<br/>changed?"}
|
|
117
|
+
IOSP --> BUMP
|
|
118
|
+
ANDP --> BUMP
|
|
119
|
+
BEP --> BUMP
|
|
120
|
+
FEP --> BUMP
|
|
121
|
+
BUMP -->|yes| PATCH["bump that plugin's<br/>patch version"]
|
|
122
|
+
BUMP -->|no| SKIP["idempotent no-op"]
|
|
123
|
+
|
|
124
|
+
PATCH --> CONSUMER["/multi-agent:update<br/>→ claude marketplace update multi-agent-plugins"]
|
|
125
|
+
|
|
126
|
+
style EXT fill:#ffd,stroke:#333
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
A skill counted in more than one platform plugin (a cross-stack knowledge skill
|
|
130
|
+
plus, say, an iOS-specific one) is why the plugins' skill counts sum to more than
|
|
131
|
+
the 150-skill source: `ai-common` skills are vendored into every stack plugin's
|
|
132
|
+
`knowledge/`, not deduplicated across them. Versioning is per-plugin and
|
|
133
|
+
patch-only from this generator — a repo enabling only `ai-ios-engineering-toolkit`
|
|
134
|
+
never pulls an Android-only change.
|
|
135
|
+
|
|
136
|
+
**Consumption is pull, not push.** A consumer repo enables a stack plugin once
|
|
137
|
+
(`/multi-agent:stack ios`, writing the enabled-plugins list into
|
|
138
|
+
`.claude/settings.json`) and picks up new plugin versions only when it runs
|
|
139
|
+
`/multi-agent:update`, which calls `claude marketplace update multi-agent-plugins`.
|
|
140
|
+
Publishing a new plugin version does not retroactively change anything already
|
|
141
|
+
running in a consumer's session.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 3. Per-host delivery: the same three repos, three different shapes
|
|
146
|
+
|
|
147
|
+
The three repos land differently on each host, because each host's skill-loading
|
|
148
|
+
behavior is different (see `pipeline/multi-agent-refs/cross-cli-contract.md` for the
|
|
149
|
+
measurements behind this table):
|
|
150
|
+
|
|
151
|
+
| | Claude Code | Copilot CLI | Codex CLI |
|
|
152
|
+
|---|---|---|---|
|
|
153
|
+
| **Pipeline commands** | 49 slash-command skills, native | 49 skills, `multi-agent-{cmd}` naming, copied in | 1 router skill (`multi-agent`) + 49 command specs as reference files — Codex silently truncates its skills block past a few dozen entries, so sub-commands are not peer skills here |
|
|
154
|
+
| **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-engineering-toolkit-architecture`) |
|
|
155
|
+
| **Component dispatch (Phase 3)** | Marketplace plugin's `create-component`/`create-screen` skill via the Skill tool | No plugin loader — falls back to local frozen `figma-*` skill copies | Not part of the enforced parity axis; classification + state-shape must match, skill *inventory* does not |
|
|
156
|
+
| **dev-toolkit-mcp** | `claude mcp add dev-toolkit -- npx -y @mmerterden/dev-toolkit-mcp` | `copilot mcp add dev-toolkit -- npx -y @mmerterden/dev-toolkit-mcp` | `codex mcp add dev-toolkit -- npx -y @mmerterden/dev-toolkit-mcp` (skipped with a warning if `codex` isn't on `PATH`) |
|
|
157
|
+
|
|
158
|
+
`smoke-cross-cli-behavior.sh` and `smoke-codex-install.sh` gate the axes that **do**
|
|
159
|
+
have to match (phase labels, placeholder vocabulary, output schemas, command↔skill
|
|
160
|
+
parity count); the table above marks the axes that are allowed to diverge by design.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 4. Runtime: what actually happens during a task
|
|
165
|
+
|
|
166
|
+
Two independent hand-offs happen inside a single pipeline run, neither aware of the
|
|
167
|
+
other:
|
|
168
|
+
|
|
169
|
+
```mermaid
|
|
170
|
+
graph TD
|
|
171
|
+
START["Task running: Phase 3 (Dev)"]
|
|
172
|
+
START -->|"taskType !== component"| TDD["Standard TDD loop<br/>(pipeline's own code)"]
|
|
173
|
+
START -->|"taskType === component<br/>+ figmaUrl present"| VALIDATE["ai-ios-engineering-toolkit:figma-validate<br/>(registry, Code Connect, token compliance)"]
|
|
174
|
+
VALIDATE -->|pass| DISPATCH["Skill tool →<br/>create-component / create-screen<br/>/ evolve-component (dual-name fallback)"]
|
|
175
|
+
VALIDATE -->|fail| HALT1["halt Phase 3, surface why"]
|
|
176
|
+
DISPATCH --> REPORT1["plugin returns build/test status →<br/>dispatch layer writes state.phases['3'].subphases[]"]
|
|
177
|
+
|
|
178
|
+
REPORT1 --> P4["Phase 4: Review"]
|
|
179
|
+
P4 --> P5["Phase 5: Test"]
|
|
180
|
+
|
|
181
|
+
P5 -->|"UI bug hunt / manual-test /<br/>design-check / store-ready"| MCP["MCP tool call over stdio<br/>e.g. ios_xcodebuild, design_visual_compare,<br/>ios_app_store_audit"]
|
|
182
|
+
MCP --> DTKPROC["dev-toolkit-mcp process<br/>(npx @mmerterden/dev-toolkit-mcp)"]
|
|
183
|
+
DTKPROC -->|"result: screenshot / xcresult ID /<br/>18-rule audit verdict"| P5
|
|
184
|
+
|
|
185
|
+
style DISPATCH fill:#dfd,stroke:#333
|
|
186
|
+
style MCP fill:#dff,stroke:#333
|
|
187
|
+
style HALT1 fill:#fdd,stroke:#333
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Phase 3 → plugin** is a one-shot delegation: the plugin skill does its own
|
|
191
|
+
lifecycle (test → code → build → wiki) and reports back a coarse
|
|
192
|
+
`component-build` result; the pipeline does not re-implement any of that logic, and
|
|
193
|
+
a plugin failure counts against the pipeline's own retry cap (`retryCount === 3` →
|
|
194
|
+
hard stop, per `component-dispatch.md`).
|
|
195
|
+
|
|
196
|
+
**Phase 5 (and design-check / store-ready) → dev-toolkit** is a long-lived MCP
|
|
197
|
+
session, not a one-shot call: the same stdio server process answers many tool
|
|
198
|
+
calls across a phase (boot simulator once, then screenshot/tap/screenshot/tap...).
|
|
199
|
+
Several pipeline skills pin a **minimum toolkit version** for a specific tool —
|
|
200
|
+
e.g. `apple-archive-compliance` requires `ios_app_store_audit` from
|
|
201
|
+
`dev-toolkit-mcp ≥ v2.9.0` — enforced in `cross-cli-contract.md` and checked by
|
|
202
|
+
`/multi-agent:sync` Step 3d before any dev-toolkit release ships (a version bump
|
|
203
|
+
that drops or renames a tool a pipeline skill depends on is a **major** bump, by
|
|
204
|
+
that step's own contract).
|
|
205
|
+
|
|
206
|
+
### dev-toolkit-mcp's 80 tools, by category
|
|
207
|
+
|
|
208
|
+
| Category | Tools | Primary pipeline consumers |
|
|
209
|
+
|---|---|---|
|
|
210
|
+
| Device Control | 58 | `/multi-agent:test`, `test-dark-mode`, `test-accessibility`, `test-dynamic-type`, `test-screenshots`, `manual-test`, `design-check` |
|
|
211
|
+
| Accessibility Audit | 2 | `test-accessibility` |
|
|
212
|
+
| Store Compliance | 5 | `store-ready`, `testflight-validation`, `apple-archive-compliance` skill, Phase 4 Security Auditor |
|
|
213
|
+
| Web Automation | 8 | frontend-stack UI testing (via `test`) |
|
|
214
|
+
| Design Audit | 6 | `design-check` (mock-mode vs Figma conformance) |
|
|
215
|
+
| Autonomous Agent DSL | 1 | any skill that needs a scripted multi-step device flow in one round trip |
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## 5. Why the boundary is drawn where it is
|
|
220
|
+
|
|
221
|
+
- **Pipeline ↔ plugins boundary = Skill tool, one direction.** The pipeline
|
|
222
|
+
classifies (`taskType`, `componentScope`) and tracks state; it never reads or
|
|
223
|
+
writes plugin-internal files. This is why a corporate marketplace can ship a
|
|
224
|
+
same-named plugin (`ai-ios-engineering-toolkit:create-ui-component` vs the public
|
|
225
|
+
`create-component`) and dispatch still resolves correctly — the dual-name
|
|
226
|
+
fallback lives in the pipeline, the implementation stays entirely in whichever
|
|
227
|
+
plugin is enabled.
|
|
228
|
+
- **Pipeline ↔ dev-toolkit boundary = MCP protocol, versioned contract.** The
|
|
229
|
+
pipeline never shells out to `xcrun simctl` or `adb` directly; every device/browser
|
|
230
|
+
action is a declared MCP tool call with a minimum-version pin. That's what lets
|
|
231
|
+
`dev-toolkit-mcp` ship on its own release cadence (its own gates, its own
|
|
232
|
+
`npm publish`) without a pipeline release, as long as pinned tools keep their
|
|
233
|
+
contract.
|
|
234
|
+
- **Neither boundary is symmetric.** The pipeline depends on both other repos being
|
|
235
|
+
present *for specific task types* (component work, UI testing) but functions
|
|
236
|
+
without either — a non-component bugfix task never touches the plugin marketplace,
|
|
237
|
+
and a task with no UI-testing step never opens the MCP connection.
|
|
@@ -24,9 +24,12 @@
|
|
|
24
24
|
* @module install/_plugin-skills
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
import { existsSync, readFileSync, readdirSync, statSync } from "fs";
|
|
27
|
+
import { existsSync, readFileSync, readdirSync, statSync, writeFileSync } from "fs";
|
|
28
28
|
import { join } from "path";
|
|
29
29
|
|
|
30
|
+
/** Uninstall reads this to know exactly which delivered skill dirs are ours to remove. */
|
|
31
|
+
export const PLUGIN_SKILLS_MANIFEST = ".plugin-skills-manifest.json";
|
|
32
|
+
|
|
30
33
|
import { copyDir, countFiles, ensureDir, ensureRealDir, isDryRun, wipeDir } from "./_common.mjs";
|
|
31
34
|
|
|
32
35
|
/** Subtrees a plugin authors itself. `knowledge/` is generated, so it is excluded. */
|
|
@@ -254,7 +257,18 @@ export function installAuthoredPluginSkills(opts) {
|
|
|
254
257
|
`clone {owner}/multi-agent-plugins or enable them in Claude Code to deliver their skills`,
|
|
255
258
|
);
|
|
256
259
|
}
|
|
257
|
-
|
|
260
|
+
// Uninstall has no way to know which of ~100 flat skill dirs came from a
|
|
261
|
+
// plugin delivery pass rather than the pipeline's own PIPELINE_CORE_SKILL_DIRS
|
|
262
|
+
// allowlist - it silently left all of them behind. Persist exactly the names
|
|
263
|
+
// this pass delivered so uninstall can remove precisely those, nothing more.
|
|
264
|
+
if (!isDryRun()) {
|
|
265
|
+
try {
|
|
266
|
+
writeFileSync(join(dest, PLUGIN_SKILLS_MANIFEST), JSON.stringify([...delivered], null, 2) + "\n");
|
|
267
|
+
} catch {
|
|
268
|
+
/* best-effort - a missing manifest just means uninstall skips this cleanup */
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return { copied, collided, renamed, plugins, missing, selectionSource, deliveredNames: [...delivered] };
|
|
258
272
|
}
|
|
259
273
|
|
|
260
274
|
/**
|
package/install/codex.mjs
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* name + description into a single prompt block and silently drops entries once
|
|
11
11
|
* that block overflows - measured at install-design time, one 142-skill plugin
|
|
12
12
|
* surfaced only 75 of its skills AND evicted an unrelated user skill. So the
|
|
13
|
-
* pipeline contributes exactly one skill (`multi-agent`) and keeps its
|
|
13
|
+
* pipeline contributes exactly one skill (`multi-agent`) and keeps its
|
|
14
14
|
* sub-command specs as reference files that cost nothing until read. Converting
|
|
15
15
|
* them into peer skills would silently lose pipeline commands.
|
|
16
16
|
*
|
|
@@ -230,7 +230,12 @@ function installRouterSkill(pipelineSrc, skillsDir) {
|
|
|
230
230
|
const dest = join(skillsDir, "multi-agent");
|
|
231
231
|
ensureDir(dest);
|
|
232
232
|
writeFile(join(dest, "SKILL.md"), skill);
|
|
233
|
-
|
|
233
|
+
|
|
234
|
+
const commandsDir = join(pipelineSrc, "commands", "multi-agent");
|
|
235
|
+
const specCount = existsSync(commandsDir)
|
|
236
|
+
? readdirSync(commandsDir, { withFileTypes: true }).filter((e) => e.isDirectory()).length
|
|
237
|
+
: 0;
|
|
238
|
+
console.log(` -> 1 router skill written to ${dest} (${specCount} command specs stay as refs)`);
|
|
234
239
|
}
|
|
235
240
|
|
|
236
241
|
/**
|
|
@@ -279,10 +284,10 @@ function installRefs(pipelineSrc, dest) {
|
|
|
279
284
|
let count = 0;
|
|
280
285
|
if (existsSync(refsSrc)) count += copyTreeRewritten(refsSrc, dest);
|
|
281
286
|
|
|
282
|
-
// The
|
|
287
|
+
// The sub-command specs. Skip ONLY the top-level dispatcher SKILL.md -
|
|
283
288
|
// it already shipped as the router skill. The filter is on the path relative
|
|
284
289
|
// to the copy root, not the basename: every sub-command spec is itself named
|
|
285
|
-
// SKILL.md, so a basename filter would copy
|
|
290
|
+
// SKILL.md, so a basename filter would copy N empty directories and leave
|
|
286
291
|
// the orchestrator with nothing to read.
|
|
287
292
|
if (existsSync(commandsSrc)) {
|
|
288
293
|
count += copyTreeRewritten(commandsSrc, join(dest, "commands"), (rel) => rel !== "SKILL.md");
|
|
@@ -33,17 +33,20 @@
|
|
|
33
33
|
- **Fast + Local (multi-agent-dev-local)**: Dev on current branch - no worktree
|
|
34
34
|
- **Fastest + Local (multi-agent-dev-local-autopilot)**: Dev + autopilot, no worktree
|
|
35
35
|
|
|
36
|
-
##
|
|
36
|
+
## Language axes (en/tr)
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
only** - e.g. the Phase 6 pre-commit local-checkout test prompt, Plan Approval Gate
|
|
41
|
-
questions, multi-repo branch picker labels, and phase-banner.sh banners (when
|
|
42
|
-
PHASE_LANG env is unset, it auto-reads prefs).
|
|
38
|
+
Two prefs, two jobs - the full matrix lives in `multi-agent-refs/rules.md`
|
|
39
|
+
"Language Application" and that file wins on any disagreement:
|
|
43
40
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
- `prefs.global.promptLanguage` is **locked to `en`**: every LLM-facing prompt,
|
|
42
|
+
spec file and instruction stays English.
|
|
43
|
+
- `prefs.global.outputLanguage` (set via `/multi-agent:setup` or
|
|
44
|
+
`/multi-agent:language en|tr`) drives what humans read: interactive prompts,
|
|
45
|
+
phase banners, AND the external payload **bodies** - PR description, Jira
|
|
46
|
+
comment, Confluence/Wiki pages all render in it.
|
|
47
|
+
|
|
48
|
+
Always English regardless of either pref: commit messages, branch names, PR
|
|
49
|
+
titles, code identifiers, file paths, and `AskUserQuestion` label/header.
|
|
47
50
|
|
|
48
51
|
When writing TR prompts, use the same keyword/menu numbers as EN (e.g. `[1-4]`)
|
|
49
52
|
so the user's input pattern stays language-agnostic.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "14.
|
|
3
|
+
"version": "14.2.2",
|
|
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",
|
|
@@ -43,7 +43,10 @@ Run through the iOS deployment checklist before App Store submission.
|
|
|
43
43
|
### 6. Archive & Upload
|
|
44
44
|
|
|
45
45
|
- [ ] Archive with Release configuration
|
|
46
|
-
- [ ] Run
|
|
46
|
+
- [ ] Run pre-submission validation: `/multi-agent:store-ready --archive=<archive>` - three gates
|
|
47
|
+
(static audit, Apple's own `altool --validate-app`, guideline review vs source).
|
|
48
|
+
`/archive-guard <archive>` is the quick single-gate form when only the static
|
|
49
|
+
audit is wanted.
|
|
47
50
|
- [ ] Upload via Xcode Organizer or `xcrun altool`
|
|
48
51
|
- [ ] Verify in App Store Connect
|
|
49
52
|
|
|
@@ -12,7 +12,7 @@ Parse the user input and route to the correct sub-command.
|
|
|
12
12
|
|
|
13
13
|
**Input**: $ARGUMENTS
|
|
14
14
|
|
|
15
|
-
> **Language (read FIRST)**: Before any status output, read `prefs.global.outputLanguage` from `$HOME/.claude/multi-agent-preferences.json` and render every conversational line in it. `AskUserQuestion` and external
|
|
15
|
+
> **Language (read FIRST)**: Before any status output, read `prefs.global.outputLanguage` from `$HOME/.claude/multi-agent-preferences.json` and render every conversational line in it. `AskUserQuestion` `label`/`header` stay English, but its `question` and option `description`s render in `outputLanguage`; external payload bodies follow `outputLanguage` too (identifiers, commit messages, branch names stay English). Full contract: `$HOME/.claude/multi-agent-refs/rules.md` "Language Application".
|
|
16
16
|
|
|
17
17
|
## Canonical Invocation (per CLI)
|
|
18
18
|
|
|
@@ -72,7 +72,7 @@ Lib scripts (`~/.claude/lib/`):
|
|
|
72
72
|
| `log [id]` | Show task log |
|
|
73
73
|
| `resume [id]` | Resume paused task |
|
|
74
74
|
| `kill [id]` | Delete worktree (logs preserved). Confirm first |
|
|
75
|
-
| `clear-logs` |
|
|
75
|
+
| `clear-logs` | **Superseded - redirect, do not run.** Say so and route to `prune-logs`. It targeted `.worktrees/PROJ-*/agent-log.md`, a path nothing has written to since logs moved to `$HOME/.claude/logs/multi-agent/{project}/{task-id}/`; running it would report deleting nothing as success. |
|
|
76
76
|
| `purge` | Worktree + logs + counter - full reset (double confirm) |
|
|
77
77
|
| `review [#N\|repo#N\|PR-url\|branch]` | Parallel review of a PR or branch diff; with no input (interactive) lists open GitHub + Bitbucket PRs to multi-select. Posts per-finding inline comments + approve/needs-work on PRs. No worktree. |
|
|
78
78
|
| `review-jira [KEY\|url]` | Grade a Jira issue's readiness for the pipeline (scope / AC / repro / design / API / stack), then post the gaps as a Jira comment. Read-only on code. |
|
|
@@ -82,6 +82,8 @@ Lib scripts (`~/.claude/lib/`):
|
|
|
82
82
|
| `channels [PR-url\|#N\|Jira-url\|Jira-id] [--channels pr,jira,confluence,wiki] [--content normal,test,auto-diff,note] [--message "..."]` | Post task report to multi-select channels (PR description, Jira comment, Confluence page, Wiki pages) with multi-select content sources. Humanizer pass per-channel. Bitbucket PR updates use reviewer-preserving PUT. Phase 7 delegates to this command; also invocable post-hoc for fixes made outside the pipeline. No worktree. |
|
|
83
83
|
| `create-jira ["desc"] [figma-url] [swagger-url]` | Create a standards-compliant Jira issue: asks the type (**Task** / **Bug** / **Story**), mines the project's recent same-type issues for conventions (summary format, labels, priority, test-scenario style), detects the active sprint, drafts from a standard template with auto-sizing sections (Design Reference / API Contract / Screenshots appear only when their source is given), asks about unknown fields, then full draft preview + explicit approval before create. No worktree, no commits. |
|
|
84
84
|
| `test` or `test [args]` | UI Bug Hunter - screenshot + tap + analyze on booted simulator via MCP (read `$HOME/.claude/commands/sim-test.md`). `/multi-agent:test` also resolves here via the `commands/multi-agent/test/SKILL.md` delegate. |
|
|
85
|
+
| `test-dark-mode` · `test-accessibility` · `test-dynamic-type` · `test-screenshots [locale]` | Fixed-scenario aliases for the four parameterless / single-parameter `test` scenarios, so the tag autocompletes instead of having to be quoted. Each delegates to the same `sim-test.md` with its scenario pinned; behaviour is identical to the quoted form, which is not deprecated. |
|
|
86
|
+
| `store-ready [repo] [--archive=\|--ipa=\|--aab=\|--apk=] [--skip-sweep]` | Pre-submission store readiness for a built **package**, iOS and Android, local-only. Three symmetric gates per platform - static package audit, the store's own validator, policy review vs repo source - plus the running-app sweep as Step A. A skipped gate is never folded into the pass count, and an Android run clears at most 2 of 3 because Play's authoritative check is server-side only. Validates only, never uploads. `testflight-validation` is the iOS-pinned alias; `test "store-ready"` hands off here. |
|
|
85
87
|
| `manual-test [#id]` | Phase 5 standalone Manual Test - checks out the task branch, prints Xcode / SourceTree hints, waits for user verdict (`ok` / `fix: ...`). |
|
|
86
88
|
| `design-check [scope]` | Mock-mode vs Figma design audit (iOS / Android, local-only). Pick repo + module → mock-support feasibility gate (halts if unsupported) → **scenario inventory** (every launch arg / scenario case / scenario code / fixture / deep link becomes a countable target with file+line evidence) → scope resolve (empty = module, screen, `screen@variant`, target id, Figma URLs, `--resume`) → worktree Debug build + mock launch → drive EACH target by its own driver, capturing tap-reachable sub-states with it → per-variant pixel + px-spacing + typography + color compare → report (side-by-side + annotated overlay + stacked findings + fix prompt) exported to `~/DesignChecks/` as HTML + PDF (+ Confluence if enabled). **Coverage gate**: a target is audited or skipped with a concrete reason, else the run is reported INCOMPLETE with the missing ids. No commits, no CI. |
|
|
87
89
|
| `stack [ios\|android\|backend\|mobile\|all]` | Swap skills for next conversation. No arg = show current stack. |
|
|
@@ -113,7 +115,7 @@ This command uses lazy loading for token efficiency. Read the relevant sub-file
|
|
|
113
115
|
| `help` | `$HOME/.claude/commands/multi-agent/help/SKILL.md` |
|
|
114
116
|
| `channels` | `$HOME/.claude/commands/multi-agent/channels/SKILL.md` |
|
|
115
117
|
| `sync` | `$HOME/.claude/commands/multi-agent/sync/SKILL.md` |
|
|
116
|
-
| `clear-logs` | Handled inline -
|
|
118
|
+
| `clear-logs` | Handled inline - redirect to `prune-logs`, see the routing note |
|
|
117
119
|
| `review` | `$HOME/.claude/commands/multi-agent/review/SKILL.md` |
|
|
118
120
|
| `review-jira` | `$HOME/.claude/commands/multi-agent/review-jira/SKILL.md` (loads `$HOME/.claude/multi-agent-refs/readiness-review.md`) |
|
|
119
121
|
| `review-issue` | `$HOME/.claude/commands/multi-agent/review-issue/SKILL.md` (loads `$HOME/.claude/multi-agent-refs/readiness-review.md`) |
|
|
@@ -136,10 +138,11 @@ This command uses lazy loading for token efficiency. Read the relevant sub-file
|
|
|
136
138
|
| Token lookup needed | `$HOME/.claude/multi-agent-refs/keychain.md` |
|
|
137
139
|
| Audit tools (Phase 5/6) | `$HOME/.claude/multi-agent-refs/audit-guide.md` |
|
|
138
140
|
| `test` | `$HOME/.claude/commands/sim-test.md` (colon-form `/multi-agent:test` uses the delegate at `commands/multi-agent/test/SKILL.md`) |
|
|
141
|
+
| `test-dark-mode` · `test-accessibility` · `test-dynamic-type` · `test-screenshots` | `$HOME/.claude/commands/sim-test.md`, scenario pinned by the command name (delegates at `commands/multi-agent/test-*/SKILL.md`) |
|
|
139
142
|
| `manual-test` | `$HOME/.claude/commands/multi-agent/manual-test/SKILL.md` |
|
|
140
143
|
| `design-check` | `$HOME/.claude/commands/multi-agent/design-check/SKILL.md` |
|
|
141
144
|
|
|
142
|
-
**Modifier flags** (`--dev`, `--local`, `autopilot`) and **ops** (`status`, `log`, `resume`, `kill`, `
|
|
145
|
+
**Modifier flags** (`--dev`, `--local`, `autopilot`) and **ops** (`status`, `log`, `resume`, `kill`, `purge`, `review`) are parsed inline by this file - no separate spec files, they compose with the pipeline or do one-shot work.
|
|
143
146
|
|
|
144
147
|
**How**: After routing, `Read` the relevant file and follow its instructions. Only load what the current action needs.
|
|
145
148
|
|
|
@@ -204,7 +207,7 @@ When the user supplies an ID/URL/free-text:
|
|
|
204
207
|
2. **Pick account** - always asked (autopilot picks default)
|
|
205
208
|
3. **Fetch issue** - `lib/issue-fetcher.sh "$INPUT"` (Jira/GitHub fetch + maturity)
|
|
206
209
|
4. **Repo picker** - only for `gh-num` (e.g. `316`) when repo is ambiguous, multi-select
|
|
207
|
-
5. **Maturity check** - blocker halts (autopilot too), warning prompt/log
|
|
210
|
+
5. **Maturity check** - blocker halts (autopilot too), warning prompt/log. For a Jira input specifically, an empty own description with a non-empty parent surfaces as `description_empty_parent_available` (warning, not blocker) - ask the tailored parent-description question from `jira/SKILL.md`'s maturity section instead of the generic "Continue?" prompt.
|
|
208
211
|
6. **Dev context** - always runs, empty submit allowed
|
|
209
212
|
7. → Interactive Launcher → Phase 0
|
|
210
213
|
|
|
@@ -543,7 +543,7 @@ options:
|
|
|
543
543
|
|
|
544
544
|
Conditional follow-ups:
|
|
545
545
|
- If `Confluence` selected: ask `header="Parent page"`, free-text via Other for the parent page key or URL. One Confluence page per platform is created under this parent, each titled `<Feature> - <Platform>`.
|
|
546
|
-
- If `Jira` selected: if Step 5 Q4 produced Jira IDs, AskUserQuestion (single-select) to pick which one; otherwise ask via Other. Per Locked decision 9 + design choice "single description with platform separators", the chosen issue receives one combined description body holding all per-platform sections under
|
|
546
|
+
- If `Jira` selected: if Step 5 Q4 produced Jira IDs, AskUserQuestion (single-select) to pick which one; otherwise ask via Other. Per Locked decision 9 + design choice "single description with platform separators", the chosen issue receives one combined description body holding all per-platform sections under `h2. Platform: <X>` separators (wiki markup - the description field does not render Markdown; conversion happens at dispatch, see Phase 4).
|
|
547
547
|
|
|
548
548
|
Result: `state.analysisSpec.outputs.requested[]`.
|
|
549
549
|
|
|
@@ -565,7 +565,7 @@ Iterate `state.analysisSpec.outputs.requested`. For each target:
|
|
|
565
565
|
|--------|--------|
|
|
566
566
|
| Local | For each per-platform draft, `cp /tmp/analysis-<feature-slug>-<ts>/<feature>-<platform>.md` into `analysis/<feature>-<platform>.md` in the matching repo's working tree. When multiple repos exist for the same platform, the file is duplicated into each and the dispatch report lists every destination. **No commit.** |
|
|
567
567
|
| Confluence | Re-humanize each per-platform draft with `formal-stakeholder` tone. One Confluence page per platform under the chosen parent, titled `<Feature> - <Platform>`. Cross-link siblings inside each page via `<ac:link><ri:page ri:content-title="<Feature> - <OtherPlatform>"/></ac:link>`. Markdown -> storage XML via `$HOME/.claude/multi-agent-refs/channels/confluence.md`. Re-emit on existing pages uses PUT with version bump. |
|
|
568
|
-
| Jira | Re-humanize the combined body with `informal-technical` tone. Concatenate per-platform drafts under
|
|
568
|
+
| Jira | Re-humanize the combined body with `informal-technical` tone. Concatenate per-platform drafts under `h2. Platform: iOS`, `h2. Platform: Android`, `h2. Platform: Backend`, `h2. Platform: Frontend` separators (in the order platforms were selected), then run the whole body through the markdown → Jira wiki conversion table in `$HOME/.claude/multi-agent-refs/channels/jira.md` - the `description` field renders wiki markup, so raw `##`/`**`/backticks arrive as literal text. Write with `PUT /rest/api/2/issue/{key}` body `{"fields": {"description": <converted body>}}` (`channels/jira.md` documents only the comment POST; the description update is this PUT). Same rawfile + `--data-binary` transport rules. |
|
|
569
569
|
|
|
570
570
|
**Output capture**: fill `state.analysisSpec.outputs.localPaths[]` (one entry per per-platform-per-repo write), `outputs.confluencePageUrls[]` (one entry per platform), `outputs.jiraIssueKey` (single string).
|
|
571
571
|
|
|
@@ -8,7 +8,7 @@ argument-hint: '"task" - issue URL, Jira ID, free-text, or #id (for resume)'
|
|
|
8
8
|
|
|
9
9
|
**Input**: $ARGUMENTS
|
|
10
10
|
|
|
11
|
-
> **Language (read FIRST)**: Before any status output, read `prefs.global.outputLanguage` and render every conversational line in it. `AskUserQuestion` and external
|
|
11
|
+
> **Language (read FIRST)**: Before any status output, read `prefs.global.outputLanguage` and render every conversational line in it. `AskUserQuestion` `label`/`header` stay English, but its `question` and option `description`s render in `outputLanguage`; external payload bodies follow `outputLanguage` too (identifiers, commit messages, branch names stay English). Full contract: `$HOME/.claude/multi-agent-refs/rules.md` "Language Application".
|
|
12
12
|
|
|
13
13
|
Run the task end-to-end with no confirmations.
|
|
14
14
|
|
|
@@ -49,6 +49,10 @@ Run the task end-to-end with no confirmations.
|
|
|
49
49
|
2. **Set the autopilot flag** - write `"autopilot": true` to `agent-state.json`
|
|
50
50
|
3. **Launch the multi-agent pipeline** - every confirmation is skipped
|
|
51
51
|
4. **On error** - after 3 failed retries, pause and ask the user
|
|
52
|
+
## Required: outward-facing payload contracts
|
|
53
|
+
|
|
54
|
+
Before writing anything outward-facing - PR body, Jira comment, Confluence page, closing report - load `$HOME/.claude/multi-agent-refs/payload-contracts.md`. It names the canonical section set for each payload, the markup dialect per surface (PR body is Markdown, Jira is wiki markup - mixing them is a defect), and the token/duration numbers the closing report must carry. Improvising a payload shape from memory is the most common failure of the short modes.
|
|
55
|
+
|
|
52
56
|
## Required: Phase Tracker Contract
|
|
53
57
|
|
|
54
58
|
**The phase tracker is mandatory** - the agent cannot skip it. Full spec: [`$HOME/.claude/multi-agent-refs/tracker-contract.md`]($HOME/.claude/multi-agent-refs/tracker-contract.md).
|
|
@@ -72,7 +76,7 @@ bash $HOME/.claude/scripts/phase-tracker.sh update 0 in_progress
|
|
|
72
76
|
bash $HOME/.claude/scripts/phase-tracker.sh update <N> in_progress|completed|failed|skipped
|
|
73
77
|
|
|
74
78
|
# After every LLM call (every CLI):
|
|
75
|
-
bash $HOME/.claude/scripts/phase-tracker.sh tokens <N> <in> <out>
|
|
79
|
+
bash $HOME/.claude/scripts/phase-tracker.sh tokens <N> <in> <out> [cached]
|
|
76
80
|
```
|
|
77
81
|
|
|
78
82
|
### Visual channel - Claude Code (native TaskList widget, required)
|
|
@@ -138,7 +138,7 @@ Then 3b renders:
|
|
|
138
138
|
- "Teknik analiz" unselectable if no Phase 2 planning log AND no PR diff available. Reason: `"(no technical source - need Phase 2 plan or PR diff)"`.
|
|
139
139
|
- "Auto-diff" unselectable if no PR found. Reason: `"(no PR linked to this target)"`.
|
|
140
140
|
- "Manuel not" always available.
|
|
141
|
-
- "Cost özeti" unselectable if `phase-tracker.sh
|
|
141
|
+
- "Cost özeti" unselectable if `phase-tracker.sh cost total` prints `-` (no priced token tallies; there is no `status` action) AND no `otel-spans.jsonl` exists for the task. Reason: `"(no tracker data - set MULTI_AGENT_OTEL_SPANS=1 or enable token tracking)"`.
|
|
142
142
|
- "Yapılan iş özeti" unselectable if no `agent-state.json` exists for the task (post-hoc call with `--branch` + `--base-branch` flags restores partial availability). Reason: `"(no agent-state.json for {taskId})"`. **Auto-ticked** when Step 3a preview was shown - user can still uncheck before confirming the menu.
|
|
143
143
|
|
|
144
144
|
**Defaults (first run):** PR + Jira ticked, Confluence + Wiki unticked. Content: auto-diff if pipeline log missing; otherwise normal-analiz + test-senaryoları.
|
|
@@ -246,7 +246,7 @@ Emitted only when `reportContent.workSummary === true` and at least one of (`age
|
|
|
246
246
|
2. **Scope delivered** - Phase 2 `planTodos[]` / `tasks[]` rendered as `✅` (status=done) or `⏳` (anything else) rows. Task id + title shown; `(deferred - rationale)` appended if the task's `status` is `"deferred"`.
|
|
247
247
|
3. **Changed files** - `git -C $WORKTREE diff --numstat $baseBranch...HEAD`. Shows `` `path` (+add / -del) `` per row, capped at 20 with a `_... +N more files not shown_` footer when exceeded. Total adds/dels + file count in section header.
|
|
248
248
|
4. **Review outcome** - from `reviewConsensus` (pre-v6.1) or `phases["4"].triage`: `{accepted} accepted · {deferred} deferred · {rejected} rejected · approved={bool}`. Hidden entirely when all three buckets are empty (normal for `--dev` / `dev-autopilot` runs that skip Phase 4).
|
|
249
|
-
5. **Phase tick strip** - single line from `
|
|
249
|
+
5. **Phase tick strip** - single line from the tracker state (`render-work-summary.sh` resolves worktree/artifacts copies, then `$HOME/.claude/logs/multi-agent/{taskId}/tracker-state.json`): `0 Init ✅ · 1 Analysis ✅ · 2 Planning ✅ · 3 Dev ✅ · 4 Review ✅ · 5 Test ⏭ · 6 Commit ✅ · 7 Report ▶`. Marks: `✅` completed · `▶` in_progress · `❌` failed · `⏭` skipped · `·` pending.
|
|
250
250
|
|
|
251
251
|
**Output template:**
|
|
252
252
|
|
|
@@ -276,7 +276,7 @@ Emitted only when `reportContent.workSummary === true` and at least one of (`age
|
|
|
276
276
|
|
|
277
277
|
Emitted only when `reportContent.costSummary === true` and tracker data is available. Source of truth is `phase-tracker.sh`:
|
|
278
278
|
|
|
279
|
-
1. **Token tallies per phase** -
|
|
279
|
+
1. **Token tallies per phase** - `render-cost-summary.sh <taskId>` resolves the tracker JSON itself: worktree candidates (`.worktrees/{taskPath}/phase-tracker.json`) first, then the standard location `$HOME/.claude/logs/multi-agent/{taskId}/tracker-state.json` that `phase-tracker.sh` actually writes. Each phase row carries `{tokens_in, tokens_out}`.
|
|
280
280
|
2. **Fallback to OTel spans** - if tracker JSON has no token columns but `otel-spans.jsonl` exists (set `MULTI_AGENT_OTEL_SPANS=1` beforehand), aggregate `phase.tokens` spans by phase ID.
|
|
281
281
|
3. **USD estimate** - uses a static price table in `$HOME/.claude/scripts/cost-table.json` (model → $/Mtok_in, $/Mtok_out). Missing model → show ` - ` for USD, never block.
|
|
282
282
|
|
|
@@ -310,7 +310,18 @@ Skipped in exactly two cases:
|
|
|
310
310
|
| Autopilot (`state.autopilot === true` or `MULTI_AGENT_AUTOPILOT=1`) | Explicit consent for side-effect creation - posts directly with prefs/flag selections, zero interaction |
|
|
311
311
|
| `--dry-run` | Already prints without posting; a question would be redundant |
|
|
312
312
|
|
|
313
|
-
**Preview render** (one block per selected channel, final body after humanizer - shown in readable Markdown, channel-specific markup conversion happens after approval)
|
|
313
|
+
**Preview render** (one block per selected channel, final body after humanizer - shown in readable Markdown, channel-specific markup conversion happens after approval).
|
|
314
|
+
|
|
315
|
+
Conversion is per-channel and two of the four channels have none. Do not reach for "the" conversion table - there is no single one:
|
|
316
|
+
|
|
317
|
+
| Channel | Conversion after approval | Table |
|
|
318
|
+
|---|---|---|
|
|
319
|
+
| PR description | **none** - posted as Markdown, verbatim | GitHub / Bitbucket / GitLab all render Markdown; see `channels/pr.md` "Markup dialect" |
|
|
320
|
+
| GitHub issue comment | **none** - posted as Markdown, verbatim | - |
|
|
321
|
+
| Jira comment | markdown → Jira wiki markup | `channels/jira.md` "Wiki markup conversion" |
|
|
322
|
+
| Confluence page | markdown → storage format | `channels/confluence.md` "Body conversion" |
|
|
323
|
+
|
|
324
|
+
Applying the Jira table to the PR body is the recurring failure of this step: it is the only *text* markup table in the doc set, so it reads as the default. It is not. A PR body containing `h2.`, `{{code}}`, or `#`-numbered lists shipped raw wiki markup to a Markdown surface.
|
|
314
325
|
|
|
315
326
|
```
|
|
316
327
|
── PR description ({repoName} #{prNumber}, replace) ─────────
|
|
@@ -10,11 +10,11 @@ argument-hint: "[\"<free-text description>\"] [figma-url] [swagger-url] - all
|
|
|
10
10
|
|
|
11
11
|
Creates exactly one Jira issue, and only after explicit approval. The issue type (Task / Bug / Story) is asked at the start of every run. No branches, no commits, no worktrees, no pipeline chaining. The draft learns the target project's conventions from its recent same-type issues (summary format, labels, components, priority norms, test-scenario style) and offers active-sprint placement when a sprint is running.
|
|
12
12
|
|
|
13
|
-
> **Language**: instruction prose here is English. AskUserQuestion `question`/`description` and the issue content (summary + description) follow `prefs.global.outputLanguage
|
|
13
|
+
> **Language**: instruction prose here is English. AskUserQuestion `question`/`description` and the issue content (summary + description) follow `prefs.global.outputLanguage`, like every other user-facing payload body (`rules.md` matrix). `label`/`header` stay English.
|
|
14
14
|
|
|
15
15
|
## Issue types
|
|
16
16
|
|
|
17
|
-
Type is chosen at step [3/
|
|
17
|
+
Type is chosen at step [3/12] via AskUserQuestion (never inferred silently). Each type has a standard template baseline; sections auto-size (see `$HOME/.claude/multi-agent-refs/generate-issue.md` for the full A/C matrix and inclusion rules).
|
|
18
18
|
|
|
19
19
|
| Type | Always-present sections | Conditional sections (included only when their trigger is present) |
|
|
20
20
|
|---|---|---|
|
|
@@ -24,11 +24,11 @@ Type is chosen at step [3/11] via AskUserQuestion (never inferred silently). Eac
|
|
|
24
24
|
|
|
25
25
|
## Flow
|
|
26
26
|
|
|
27
|
-
Read `$HOME/.claude/multi-agent-refs/generate-issue.md` and execute the
|
|
27
|
+
Read `$HOME/.claude/multi-agent-refs/generate-issue.md` and execute the 12-step shared flow. Non-negotiables restated:
|
|
28
28
|
|
|
29
29
|
- Ask the user (AskUserQuestion) for the issue type first, then about every genuinely unknown field - component, epic, priority, labels, assignee, sprint vs backlog, required custom fields.
|
|
30
30
|
- A conditional section renders only when its trigger is present (Figma URL, pasted screenshot/log, Swagger URL/contract, real Notes content). No empty placeholder headings; content the user did not supply and mining could not derive is never invented.
|
|
31
|
-
- Step [
|
|
31
|
+
- Step [9/12] full preview + approval gate always runs. `Approve` / `Edit` (loop) / `Cancel`. No bypass exists.
|
|
32
32
|
|
|
33
33
|
## Error paths
|
|
34
34
|
|
|
@@ -13,7 +13,7 @@ description-tr: "Hızlı geliştirme modu: Init → Dev (Opus) → Review → Te
|
|
|
13
13
|
> 2. **`prefs.global.outputLanguage` is user-selectable** - applies to (a) every conversational line the agent writes back, and (b) every user-facing external payload: PR description body, Jira comment, Confluence body, Wiki body.
|
|
14
14
|
>
|
|
15
15
|
> Regardless of `outputLanguage`, these stay English (interop / convention):
|
|
16
|
-
> - `AskUserQuestion`
|
|
16
|
+
> - `AskUserQuestion` `label` + `header` only (UI contract) - the `question` and each option's `description` follow `outputLanguage`; a picker whose question is English on a Turkish run is a bug, not the contract
|
|
17
17
|
> - Commit message subject/body (git convention)
|
|
18
18
|
> - Branch names (`feature/`, `bugfix/`, ...)
|
|
19
19
|
> - Code identifiers, file paths, log lines
|
|
@@ -215,6 +215,14 @@ That is the whole list. Phase 0 (Init full picker), Phase 4 (Review), Phase 5 (U
|
|
|
215
215
|
| Phase 5 User Test | ✅ | ✅ (same) |
|
|
216
216
|
| Phase 7 channels (Jira / Confluence / PR / Wiki) | ✅ | ✅ (same) |
|
|
217
217
|
| Duration | ~10-15 min | ~7-10 min |
|
|
218
|
+
## Intake warnings (`--dev` family)
|
|
219
|
+
|
|
220
|
+
Two checks belong at the top of every `--dev` run and are specified once in `$HOME/.claude/multi-agent-refs/phases/modes.md` "Intake warnings shared by the whole `--dev` family": an analysis document supplied to a mode that skips Analysis and Planning, and a branch that already carries the work (which wants `/multi-agent:ship`, not a second Dev pass). Read that section rather than reasoning about it from scratch.
|
|
221
|
+
|
|
222
|
+
## Required: outward-facing payload contracts
|
|
223
|
+
|
|
224
|
+
Before writing anything outward-facing - PR body, Jira comment, Confluence page, closing report - load `$HOME/.claude/multi-agent-refs/payload-contracts.md`. It names the canonical section set for each payload, the markup dialect per surface (PR body is Markdown, Jira is wiki markup - mixing them is a defect), and the token/duration numbers the closing report must carry. Improvising a payload shape from memory is the most common failure of the short modes.
|
|
225
|
+
|
|
218
226
|
## Required: Phase Tracker Contract
|
|
219
227
|
|
|
220
228
|
**The phase tracker is mandatory** - the agent cannot skip it. Full spec: [`$HOME/.claude/multi-agent-refs/tracker-contract.md`]($HOME/.claude/multi-agent-refs/tracker-contract.md).
|
|
@@ -236,7 +244,7 @@ bash $HOME/.claude/scripts/phase-tracker.sh update 0 in_progress
|
|
|
236
244
|
bash $HOME/.claude/scripts/phase-tracker.sh update <N> in_progress|completed|failed|skipped
|
|
237
245
|
|
|
238
246
|
# After every LLM call (every CLI):
|
|
239
|
-
bash $HOME/.claude/scripts/phase-tracker.sh tokens <N> <in> <out>
|
|
247
|
+
bash $HOME/.claude/scripts/phase-tracker.sh tokens <N> <in> <out> [cached]
|
|
240
248
|
```
|
|
241
249
|
|
|
242
250
|
### Visual channel - Claude Code (native TaskList widget, required)
|
|
@@ -279,24 +287,3 @@ bash $HOME/.claude/scripts/phase-tracker.sh render
|
|
|
279
287
|
```
|
|
280
288
|
|
|
281
289
|
Do NOT call TaskCreate on these CLIs - the tool does not exist and the call fails.
|
|
282
|
-
|
|
283
|
-
## Analysis doc supplied to a fast mode (warn before starting)
|
|
284
|
-
|
|
285
|
-
The `--dev` family skips Phase 1 (Analysis) and Phase 2 (Planning) by design. So when
|
|
286
|
-
the input references an analysis document - a Confluence URL, a local analysis file,
|
|
287
|
-
or the user says "I ran analysis for this" - there is **no phase that turns it into a
|
|
288
|
-
plan**. The doc becomes raw context for one Dev pass, and work comes out ordered by
|
|
289
|
-
whatever the model read first: the bottom of the dependency chain lands, the screen
|
|
290
|
-
wiring does not.
|
|
291
|
-
|
|
292
|
-
Say so before starting, once, and offer the choice:
|
|
293
|
-
|
|
294
|
-
```
|
|
295
|
-
This mode skips Analysis and Planning, so the analysis document will not be turned
|
|
296
|
-
into a task breakdown. For analysis-driven screen work, /multi-agent or
|
|
297
|
-
/multi-agent:local run both phases.
|
|
298
|
-
1. Continue with --dev (doc as context only)
|
|
299
|
-
2. Switch to the full pipeline
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
Autopilot picks 1 and logs the warning rather than asking.
|