@mmerterden/multi-agent-pipeline 14.2.1 → 15.0.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 +118 -6
- package/README.md +20 -9
- package/README.tr.md +150 -0
- package/docs/FIGMA_PIPELINE.md +3 -3
- package/docs/adr/0006-skills-core-external-split.md +1 -1
- package/docs/adr/0009-claude-stack-skills-plugin-only.md +31 -0
- package/docs/adr/README.md +1 -0
- package/docs/architecture.md +24 -9
- package/docs/ecosystem.md +237 -0
- package/docs/features.md +5 -5
- package/index.js +2 -0
- package/install/_codex-agents.mjs +11 -2
- package/install/_common.mjs +65 -1
- package/install/_dev-only-files.mjs +0 -1
- package/install/_platform-filter.mjs +73 -7
- package/install/_plugin-skills.mjs +33 -8
- package/install/claude.mjs +144 -59
- package/install/codex.mjs +37 -7
- package/install/copilot.mjs +36 -11
- package/install/index.mjs +6 -2
- package/install/templates/codex-instructions.md +1 -1
- package/install/templates/copilot-instructions.md +15 -12
- package/package.json +1 -2
- package/pipeline/commands/multi-agent/SKILL.md +4 -2
- package/pipeline/commands/multi-agent/analysis/SKILL.md +5 -5
- package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/autopilot/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/build-optimize/SKILL.md +9 -9
- package/pipeline/commands/multi-agent/channels/SKILL.md +16 -5
- package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +186 -0
- 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/garbage-collect/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/help/SKILL.md +19 -4
- package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +2 -2
- 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/prune-prompts/SKILL.md +81 -0
- package/pipeline/commands/multi-agent/resume/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/{ship → resume-local}/SKILL.md +13 -9
- package/pipeline/commands/multi-agent/setup/SKILL.md +5 -5
- package/pipeline/commands/multi-agent/stack/SKILL.md +55 -43
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +3 -3
- package/pipeline/commands/multi-agent/sync/SKILL.md +18 -11
- package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/uninstall/SKILL.md +2 -0
- package/pipeline/commands/multi-agent/update/SKILL.md +1 -1
- 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 +77 -10
- package/pipeline/lib/md2confluence-v3.py +16 -2
- package/pipeline/lib/parse-complaints.sh +306 -0
- 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 +4 -4
- package/pipeline/multi-agent-refs/complaint-analysis-template.md +99 -0
- package/pipeline/multi-agent-refs/component-dispatch.md +6 -6
- package/pipeline/multi-agent-refs/cross-cli-contract.md +16 -16
- package/pipeline/multi-agent-refs/features/external-context-injection.md +1 -1
- package/pipeline/multi-agent-refs/features/stack-skill-routing.md +5 -5
- package/pipeline/multi-agent-refs/features/worktree-finalize.md +1 -1
- package/pipeline/multi-agent-refs/generate-issue.md +3 -3
- package/pipeline/multi-agent-refs/issue-jira-triad.md +3 -3
- 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-1-analysis.md +7 -7
- package/pipeline/multi-agent-refs/phases/phase-2-planning.md +5 -5
- package/pipeline/multi-agent-refs/phases/phase-3-dev.md +3 -3
- package/pipeline/multi-agent-refs/phases/phase-4-review.md +12 -12
- package/pipeline/multi-agent-refs/phases/phase-5-test.md +1 -1
- 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/multi-agent-refs/tracker-contract.md +1 -1
- package/pipeline/multi-agent-refs/wiki-capture.md +2 -2
- package/pipeline/preferences-template.json +13 -5
- package/pipeline/rules/figma-pipeline.md +2 -2
- package/pipeline/schemas/agent-state.schema.json +1 -1
- package/pipeline/schemas/complaint-analysis-spec.schema.json +216 -0
- package/pipeline/schemas/migrations/prefs-2.5.0-to-2.6.0.mjs +46 -0
- package/pipeline/schemas/prefs.schema.json +277 -67
- package/pipeline/schemas/token-budget.json +2 -2
- package/pipeline/scripts/_stack-routing.mjs +79 -0
- package/pipeline/scripts/audit-log-rotate.sh +14 -1
- package/pipeline/scripts/build-skills-index.mjs +11 -0
- package/pipeline/scripts/build-stack-plugins.mjs +35 -60
- package/pipeline/scripts/check-derived-drift.mjs +65 -29
- package/pipeline/scripts/diff-explain.mjs +41 -3
- package/pipeline/scripts/diff-risk-score.mjs +72 -8
- package/pipeline/scripts/gc-worktrees.sh +4 -1
- package/pipeline/scripts/gen-mode-dispatch.mjs +1 -1
- package/pipeline/scripts/gen-skills-index.mjs +1 -1
- package/pipeline/scripts/learning-curve.mjs +8 -2
- package/pipeline/scripts/match-skills.mjs +8 -2
- package/pipeline/scripts/migrate-prefs.mjs +28 -20
- package/pipeline/scripts/output-quality-check.sh +15 -4
- package/pipeline/scripts/phase-tracker.sh +33 -12
- package/pipeline/scripts/phase0-exit-gate.mjs +3 -2
- 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 +43 -14
- package/pipeline/scripts/scan-agent-config.sh +1 -1
- package/pipeline/scripts/skill-conformance.mjs +165 -30
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +1 -1
- package/pipeline/scripts/smoke-schema-validation.sh +5 -1
- package/pipeline/scripts/test-gap-rules/android.json +25 -0
- package/pipeline/scripts/test-gap-rules/ios.json +34 -0
- package/pipeline/scripts/test-gap-rules/node.json +29 -0
- package/pipeline/scripts/test-gap-rules/python.json +25 -0
- package/pipeline/scripts/test-gap-scan.mjs +45 -6
- package/pipeline/scripts/uninstall.mjs +196 -14
- package/pipeline/scripts/update-issue-progress.sh +12 -16
- package/pipeline/scripts/validate-complaint-doc.mjs +229 -0
- package/pipeline/scripts/validate-reviewer.mjs +9 -3
- package/pipeline/scripts/worktree-finalize.sh +23 -2
- package/pipeline/skills/.skill-manifest.json +156 -108
- package/pipeline/skills/.skills-index.json +459 -13
- package/pipeline/skills/shared/README.md +15 -11
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -0
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-complaint-analysis/SKILL.md +49 -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-ios-coding-standard/SKILL.md +2 -2
- 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-prune-prompts/SKILL.md +83 -0
- package/pipeline/skills/shared/core/{multi-agent-ship → multi-agent-resume-local}/SKILL.md +10 -6
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +79 -22
- package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +8 -8
- package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +1 -1
- package/pipeline/skills/shared/external/ios-coding-standard/modules/_TEMPLATE.yml +2 -2
- package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +368 -33
- package/pipeline/skills/shared/external/ios-coding-standard/references/swiftlint.draft.yml +1 -2
- package/pipeline/skills/shared/external/ios-coding-standard/scripts/check_structure.py +765 -0
- package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +75 -0
- package/pipeline/skills/shared/external/ios-module-structure/modules/_TEMPLATE.yml +131 -0
- package/pipeline/skills/shared/external/ios-module-structure/references/rules.yml +559 -0
- package/pipeline/skills/shared/external/ios-module-structure/scripts/check_structure.py +765 -0
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +302 -0
- package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +187 -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 +176 -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 +9 -5
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Complaint-Analysis Report Template
|
|
2
|
+
|
|
3
|
+
Master layout for the report `/multi-agent:complaint-analysis` renders at Phase 4 and dispatches at Phase 5. Single-language body: every heading and prose block is written in `outputLanguage` (`tr` or `en`); the TR / EN heading pairs below show both forms, render ONE. Verdict tokens, Graylog excerpts, and field names in routing entries stay English (SKILL Locked 9). The deterministic gate over an emitted instance is `scripts/validate-complaint-doc.mjs` - keep this file and that validator in sync.
|
|
4
|
+
|
|
5
|
+
Numbering is fixed 1..8. Section 4 (routing) is rendered only when at least one `core` verdict exists; numbering still re-flows sequentially when it is omitted (same omission style as the analysis template).
|
|
6
|
+
|
|
7
|
+
## YAML front-matter (required keys)
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
---
|
|
11
|
+
run_name: complaints-20260810
|
|
12
|
+
generated_at: <UTC ISO8601>
|
|
13
|
+
language: tr | en
|
|
14
|
+
complaint_count: <N>
|
|
15
|
+
repos: "<name>:<layer>, <name>:<layer>, ..."
|
|
16
|
+
verdict_counts: "client=<X> bff=<Y> core=<Z> insufficient=<W>"
|
|
17
|
+
graylog_degraded: true | false
|
|
18
|
+
---
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`run_name`, `generated_at`, `language`, `complaint_count`, `graylog_degraded` are validator-required; `repos` and `verdict_counts` are part of the template contract but advisory to the gate.
|
|
22
|
+
|
|
23
|
+
## 1. Özet / Summary
|
|
24
|
+
|
|
25
|
+
2-4 sentences: how many complaints, where they came from (source types only - never file contents), the verdict distribution, and whether Graylog was degraded for any of them. Follow with the count table:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
| Verdict | Count |
|
|
29
|
+
|---|---|
|
|
30
|
+
| client | X |
|
|
31
|
+
| bff | Y |
|
|
32
|
+
| core | Z |
|
|
33
|
+
| insufficient-evidence | W |
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Then the coverage table - every selected repo appears, including the ones that came back clean, so "only the client layer needed a fix" is visible at a glance:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
| Repo | Layer | Evidence hits | Verdicts attributed |
|
|
40
|
+
|---|---|---|---|
|
|
41
|
+
| <owner>/my-ios-app | ios | 3 | C-01 |
|
|
42
|
+
| <owner>/my-mobile-bff | mobile-bff | 0 | - (incelendi, temiz / checked, clean) |
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 2. Triage Tablosu / Triage Table
|
|
46
|
+
|
|
47
|
+
One row per complaint. Verdict tokens are the English enum: `client:ios`, `client:android`, `client:web`, `bff:mobile-bff`, `bff:web-bff`, `core`, `insufficient-evidence`. The validator requires every row carrying a `C-NN` id to contain one of these tokens.
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
| Id | Özet (redakte) | trx/conv | Verdict | Confidence | Routing |
|
|
51
|
+
|---|---|---|---|---|---|
|
|
52
|
+
| C-01 | <redacted excerpt <= 80 chars> | trx-9f3a | client:ios | high | - |
|
|
53
|
+
| C-02 | ... | conv-77aa | core | medium | payment-core |
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`Routing` column: the suspected core service for `core` rows, `-` otherwise.
|
|
57
|
+
|
|
58
|
+
## 3. Şikayet Detayları / Complaint Details
|
|
59
|
+
|
|
60
|
+
One `### C-NN` subsection per complaint:
|
|
61
|
+
|
|
62
|
+
- **Şikayet / Complaint**: the redacted text (full, not the excerpt).
|
|
63
|
+
- **Graylog**: status line (`ok: N messages` / `degraded: <reason>` / `skipped: user choice`), then up to 3 evidence lines, English, shape `timestamp source level message-excerpt`. Redact any PII the log itself carries before quoting.
|
|
64
|
+
- **Repo kanıtı / Repo evidence**: `file:line - signal (matchKind)` rows from the correlation phase; `-` when none.
|
|
65
|
+
- **Elenen katmanlar / Ruled out**: one line listing the repos/layers that were grepped for this complaint's signals and returned nothing (e.g. `mobile-bff, web-bff: sinyal yok`). This is what justifies a single-layer verdict.
|
|
66
|
+
- **Verdict + gerekçe / rationale**: the verdict token, confidence, and 1-3 sentences citing the evidence above (SKILL Locked 10: client/bff needs 1 Graylog + 1 repo citation; core needs the Graylog line naming the upstream).
|
|
67
|
+
- **Geliştirme planı / Fix plan** (client/bff only, SKILL Locked 13; validator-required for every client/bff verdict): 2-5 numbered steps grounded in the existing architecture - each step references a cited `file:line` or component, reuse-first, tests included. Never rendered for core / insufficient-evidence.
|
|
68
|
+
- **Dev prompt** (client/bff only): one fenced English block ready to paste into `/multi-agent:dev` or a Jira description - complaint summary, root cause, cited files, fix plan steps, acceptance check, and the `[C-NN]` id.
|
|
69
|
+
|
|
70
|
+
## 4. Core Yönlendirme Önerileri / Core Routing Recommendations
|
|
71
|
+
|
|
72
|
+
Rendered only when `core` verdicts exist. One `### C-NN` subsection per core verdict (the validator checks each core id appears here):
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
suspectedService: <Graylog source>
|
|
76
|
+
endpoint: <path or ->
|
|
77
|
+
errorCode: <code or ->
|
|
78
|
+
evidenceExcerpt: <short redacted EN excerpt>
|
|
79
|
+
suggestedQueue: <prefs.projects[*].routing.coreTeamLabel or ->
|
|
80
|
+
confidence: high | medium | low
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
No fix analysis, no code speculation about the core service (SKILL Locked 5). This block is what gets forwarded to the core team.
|
|
84
|
+
|
|
85
|
+
## 5. Açık Sorular / Open Questions
|
|
86
|
+
|
|
87
|
+
One bullet per `insufficient-evidence` verdict (what is missing: id, reproducible log, repo signal) plus any ambiguity worth a human decision (e.g. client-vs-bff attribution at low confidence).
|
|
88
|
+
|
|
89
|
+
## 6. Metodoloji / Methodology
|
|
90
|
+
|
|
91
|
+
Fixed short block: source types ingested, redaction applied (`parse-complaints.sh`), Graylog query window/limit actually used, repos + layers grepped, and a **degraded services** list (`graylog: <reason>` when any fetch degraded - a degraded payload is never silently dropped).
|
|
92
|
+
|
|
93
|
+
## 7. Referanslar / References
|
|
94
|
+
|
|
95
|
+
Input source names only - file basename + row count, Jira issue keys, Confluence page titles/URLs. Never inline the input contents. Then the repo list with layers.
|
|
96
|
+
|
|
97
|
+
## 8. (Footer)
|
|
98
|
+
|
|
99
|
+
One line: `Generated by /multi-agent:complaint-analysis - report only, no branches or commits.` (localized).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Component Dispatch (Phase 3 short-circuit)
|
|
2
2
|
|
|
3
|
-
> **TLDR** - When `taskType === "component"` (Figma URL in task description or instruction-driven figma workflow), multi-agent Phase 3 **does not run the TDD loop**. It delegates the entire phase to the enabled `ai-<platform>-
|
|
3
|
+
> **TLDR** - When `taskType === "component"` (Figma URL in task description or instruction-driven figma workflow), multi-agent Phase 3 **does not run the TDD loop**. It delegates the entire phase to the enabled `ai-<platform>-toolkit` **marketplace plugin's** component skill (`create-component`, falling back to `create-ui-component`) via the Skill tool. Implementation lives in the plugin; multi-agent's job is classification, dispatch, and state report. The pipeline no longer bundles its own `figma-to-component` orchestrator - component skills live in one place, the plugin marketplace.
|
|
4
4
|
|
|
5
5
|
This doc is referenced from `$HOME/.claude/multi-agent-refs/phases/phase-3-dev.md`. Keeping it separate lets `phase-3-dev.md` remain tight (it's already the largest phase doc) and gives the orchestrator-report contract a stable URL for both Claude-side and Copilot-side implementations.
|
|
6
6
|
|
|
@@ -37,8 +37,8 @@ run produced entities and a mapper but left the screen half-wired.
|
|
|
37
37
|
|
|
38
38
|
| `state.componentScope` | Meaning | iOS skill | Android skill |
|
|
39
39
|
|---|---|---|---|
|
|
40
|
-
| `screen` (default when the frame is a full screen, or the task names a screen) | Full clean-architecture vertical: Entity → Repository → Mapper → UseCase → LocalizedText → AnalyticsTracking → CoordinatorEvent → ViewModel → Scene → Preview, then verify | `ai-ios-
|
|
41
|
-
| `component` | One reusable UI component (Configuration / View / +Modifiers / Code Connect) | `ai-ios-
|
|
40
|
+
| `screen` (default when the frame is a full screen, or the task names a screen) | Full clean-architecture vertical: Entity → Repository → Mapper → UseCase → LocalizedText → AnalyticsTracking → CoordinatorEvent → ViewModel → Scene → Preview, then verify | `ai-ios-toolkit:create-screen` | `ai-android-toolkit:create-screen` |
|
|
41
|
+
| `component` | One reusable UI component (Configuration / View / +Modifiers / Code Connect) | `ai-ios-toolkit:create-component` (fallback `create-ui-component`) | `ai-android-toolkit:create-component` (fallback `create-ui-component`) |
|
|
42
42
|
| `evolve` | Change an existing component | `evolve-component` (fallback `evolve-ui-component`) | same |
|
|
43
43
|
|
|
44
44
|
```
|
|
@@ -52,7 +52,7 @@ a single atom is `component`. When it cannot be decided, ask - do not default
|
|
|
52
52
|
omits the wiring.
|
|
53
53
|
|
|
54
54
|
**Pre-implementation validation is not optional on iOS.** Before the create skill
|
|
55
|
-
runs, dispatch `ai-ios-
|
|
55
|
+
runs, dispatch `ai-ios-toolkit:figma-validate` for the frame. It checks
|
|
56
56
|
registry presence, Code Connect strategy, **design token compliance**, dependency
|
|
57
57
|
readiness, atomic scope and already-implemented status in about ten seconds. Those
|
|
58
58
|
are precisely the checks whose absence produced guessed spacing and an unpublished
|
|
@@ -60,7 +60,7 @@ Code Connect binding. A `figma-validate` failure halts the dispatch.
|
|
|
60
60
|
|
|
61
61
|
**Dual-name resolution.** The public (`multi-agent-plugins`) and a corporate/private marketplace named the same skill differently - `create-component` vs `create-ui-component`. Dispatch tries `create-component` first; if it is not available in the current repo, tries `create-ui-component`. (Same dual-name rule applies when `taskType` maps to evolve → `evolve-component`/`evolve-ui-component`, or fix → `fix-bug`.)
|
|
62
62
|
|
|
63
|
-
If **neither** resolves, the platform's `ai-<platform>-
|
|
63
|
+
If **neither** resolves, the platform's `ai-<platform>-toolkit` plugin is not enabled in this repo. **Halt with a user-visible error**: "component task requires the ai-<platform>-toolkit plugin enabled in this repo (`.claude/settings.local.json`)." Do not silently fall back to TDD - a component task ran through the bugfix path would produce wrong artefacts.
|
|
64
64
|
|
|
65
65
|
## Dispatch call
|
|
66
66
|
|
|
@@ -119,7 +119,7 @@ Phase 4 runs in `--dev` as it does in the full pipeline, and its reviewer count
|
|
|
119
119
|
|
|
120
120
|
Component dispatch is **no longer byte-identical across CLIs** and that is by design (see `cross-cli-contract.md` section 1.1):
|
|
121
121
|
|
|
122
|
-
- **Claude Code**: dispatches to the enabled `ai-<platform>-
|
|
122
|
+
- **Claude Code**: dispatches to the enabled `ai-<platform>-toolkit` marketplace plugin via the Skill tool (this doc).
|
|
123
123
|
- **Copilot CLI**: has no plugin loader; it continues to use its standalone `~/.copilot/skills/figma-*` skill copies (frozen fallback). Copilot's resolution + progress lines follow those local skills.
|
|
124
124
|
|
|
125
125
|
What still MUST match across CLIs: the `taskType === "component"` classification, the `state.phases["3"].subphases[]` shape the dispatch layer writes, and `--dev` elision semantics. Figma-skill *inventory* parity is no longer enforced. `smoke-cross-cli-behavior.sh` asserts only the classification + state-shape axis for components.
|
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
## 1. Command Inventory (
|
|
9
|
+
## 1. Command Inventory (51 commands)
|
|
10
10
|
|
|
11
11
|
```
|
|
12
|
-
analysis, analysis-resolve, autopilot, build-optimize, channels, create-jira, design-check, dev,
|
|
12
|
+
analysis, analysis-resolve, autopilot, build-optimize, channels, complaint-analysis, create-jira, design-check, dev,
|
|
13
13
|
dev-autopilot, dev-local, dev-local-autopilot, diff-explain, forget, garbage-collect,
|
|
14
14
|
help, ios-coding-standard, issue, jira, kill, language, local,
|
|
15
|
-
local-autopilot, log, manual-test, prune-logs, purge, refactor, resume, review, review-issue, review-jira,
|
|
16
|
-
routines, save, scan, search, setup,
|
|
15
|
+
local-autopilot, log, manual-test, prune-logs, prune-prompts, purge, refactor, resume, review, review-issue, review-jira,
|
|
16
|
+
routines, save, scan, search, setup, resume-local, stack, status, store-ready, sync, test, test-accessibility,
|
|
17
17
|
test-dark-mode, test-dynamic-type, test-screenshots, testflight-validation, uninstall, update
|
|
18
18
|
```
|
|
19
19
|
|
|
@@ -23,8 +23,8 @@ Categories:
|
|
|
23
23
|
- **Issue generator** (one-shot, no worktree, asks type Task/Bug/Story, hard approval gate before create): `create-jira`
|
|
24
24
|
- **Full 8-phase modes**: `autopilot`, `local`, `local-autopilot`
|
|
25
25
|
- **Fast modes** (Init -> Dev(Opus) -> Review -> Commit -> Report): `dev`, `dev-autopilot`, `dev-local`, `dev-local-autopilot`
|
|
26
|
-
- **Tail modes** (run the pipeline tail over already-done local work): `
|
|
27
|
-
- **Ops commands** (one-shot, no worktree): `status`, `log`, `kill`, `purge`, `uninstall`, `resume`, `review`, `review-jira`, `review-issue`, `analysis`, `analysis-resolve`, `build-optimize`, `channels`, `scan`, `search`, `diff-explain`, `garbage-collect`, `prune-logs`
|
|
26
|
+
- **Tail modes** (run the pipeline tail over already-done local work): `resume-local`
|
|
27
|
+
- **Ops commands** (one-shot, no worktree): `status`, `log`, `kill`, `purge`, `uninstall`, `resume`, `review`, `review-jira`, `review-issue`, `analysis`, `analysis-resolve`, `complaint-analysis`, `build-optimize`, `channels`, `scan`, `search`, `diff-explain`, `garbage-collect`, `prune-logs`, `prune-prompts`
|
|
28
28
|
- **Local audits** (worktree only to build; no commit, push, PR or channels): `design-check`, `testflight-validation`, `ios-coding-standard`. `testflight-validation` additionally never invokes `altool --upload-app` - a validation run must not be able to ship a build by accident.
|
|
29
29
|
- **Meta-ops**: `setup`, `sync`, `update`, `help`, `refactor`, `test`, `stack`, `manual-test`, `language`
|
|
30
30
|
- **Routines** (user-defined routine registry; the routines they create are local-only and never synced): `save`, `routines`, `forget`
|
|
@@ -33,7 +33,7 @@ Categories:
|
|
|
33
33
|
|
|
34
34
|
### 1.1 Figma / component work (plugin-based on Claude Code; NOT parity-enforced)
|
|
35
35
|
|
|
36
|
-
Component work is **no longer a bundled pipeline skill set**. Claude Code dispatches `taskType === "component"` to the enabled `ai-<platform>-
|
|
36
|
+
Component work is **no longer a bundled pipeline skill set**. Claude Code dispatches `taskType === "component"` to the enabled `ai-<platform>-toolkit` **marketplace plugin** (`create-component`, fallback `create-ui-component`) via the Skill tool - full contract in `$HOME/.claude/multi-agent-refs/component-dispatch.md`. The pipeline no longer ships `pipeline/skills/figma-ios|figma-android|figma-common`; the pipeline-unique component skills (iterate loops, performance harness, validate/review, commit, adapters, wiki) were absorbed into the `ai-ios-toolkit` plugin so component skills live in one place.
|
|
37
37
|
|
|
38
38
|
**How each host receives the plugin's skills.** Only Claude Code loads the marketplace
|
|
39
39
|
plugin natively. The other two are served by the installer, so all three end up with the
|
|
@@ -79,11 +79,11 @@ Two parallel shared/core skills under `pipeline/skills/shared/core/` wrap extern
|
|
|
79
79
|
| `apple-archive-compliance` | `pipeline/skills/shared/core/apple-archive-compliance/` | `ios_app_store_audit` MCP tool (in `@mmerterden/dev-toolkit-mcp` ≥ v2.9.0) | 18 (Apple ITMS + App Store Review Guidelines) |
|
|
80
80
|
| `google-play-compliance` | `pipeline/skills/shared/core/google-play-compliance/` | bundletool + aapt2 + apksigner | 21 (4 categories: Technical / Security / Privacy / Hygiene) |
|
|
81
81
|
|
|
82
|
-
Both skills are wired to 4 consumers: `/multi-agent:test "store-ready"` (primary), Phase 4 Security Auditor (`pipeline/agents/security-auditor.md`), `/multi-agent:review` + SKILL.md counterpart, `/multi-agent:channels` PR-body auto-augmentation. Contract enforced by `smoke-compliance-skills.sh
|
|
82
|
+
Both skills are wired to 4 consumers: `/multi-agent:test "store-ready"` (primary), Phase 4 Security Auditor (`pipeline/agents/security-auditor.md`), `/multi-agent:review` + SKILL.md counterpart, `/multi-agent:channels` PR-body auto-augmentation. Contract enforced by `smoke-compliance-skills.sh`.
|
|
83
83
|
|
|
84
84
|
### 1.3 Figma-skill routing from multi-agent (superseded)
|
|
85
85
|
|
|
86
|
-
Superseded by section 1.1: Claude Code resolves component dispatch to the marketplace plugin (dual-name `create-component`/`create-ui-component`; full contract in `$HOME/.claude/multi-agent-refs/component-dispatch.md`); Copilot CLI
|
|
86
|
+
Superseded by section 1.1: Claude Code resolves component dispatch to the marketplace plugin (dual-name `create-component`/`create-ui-component`; full contract in `$HOME/.claude/multi-agent-refs/component-dispatch.md`); Copilot CLI receives the enabled plugin's authored skills through `install/copilot.mjs` (section 1.1), not a standalone `figma-*` tree - the installer prunes those. No shared filesystem-path routing table or figma-skill frontmatter/inventory parity remains under enforcement.
|
|
87
87
|
|
|
88
88
|
---
|
|
89
89
|
|
|
@@ -164,10 +164,10 @@ skills took the block from 11 skills / 4,710 bytes to 83 skills / 22,111 bytes
|
|
|
164
164
|
only **75 of the 142** surfaced, **and an unrelated user-scope skill was evicted**.
|
|
165
165
|
Removing the plugin brought it back.
|
|
166
166
|
|
|
167
|
-
So shipping
|
|
167
|
+
So shipping every sub-command as a peer skill on Codex would silently lose
|
|
168
168
|
pipeline commands next to any stack toolkit, with no error anywhere. The pipeline
|
|
169
|
-
therefore contributes **exactly one** skill on Codex (`multi-agent`) and keeps
|
|
170
|
-
|
|
169
|
+
therefore contributes **exactly one** skill on Codex (`multi-agent`) and keeps every
|
|
170
|
+
sub-command spec as a reference file that costs nothing until read.
|
|
171
171
|
|
|
172
172
|
**Do not "fix" this by adding per-command skills on Codex.** The layout is
|
|
173
173
|
capability-derived, and `smoke-install-layout.sh` fails if the Codex skills tree
|
|
@@ -176,7 +176,7 @@ gains a second pipeline entry.
|
|
|
176
176
|
### Parity axis differs per host
|
|
177
177
|
|
|
178
178
|
Claude Code and Copilot CLI are compared on their **skill directory sets**. Codex is
|
|
179
|
-
compared on its **ref set**:
|
|
179
|
+
compared on its **ref set**: every command spec must exist under
|
|
180
180
|
`~/.codex/multi-agent-refs/commands/<cmd>/SKILL.md`, and
|
|
181
181
|
`smoke-codex-install.sh` asserts the count against the source tree. Comparing Codex
|
|
182
182
|
on skill directories would demand exactly the layout that breaks it.
|
|
@@ -312,9 +312,9 @@ For clipboard ops, callers still gate with `if command -v pbpaste >/dev/null; th
|
|
|
312
312
|
|
|
313
313
|
This contract is validated by:
|
|
314
314
|
|
|
315
|
-
- `smoke-cross-cli-behavior.sh` - asserts
|
|
316
|
-
- `smoke-commands-skills-parity.sh` (
|
|
317
|
-
- `smoke-compliance-skills.sh`
|
|
315
|
+
- `smoke-cross-cli-behavior.sh` - asserts every command behaves identically, pulls from Section 2 (placeholder vocab), Section 5 (argument parsing), Section 6 (output formats); also regression-locks the 8-persona agent deployment
|
|
316
|
+
- `smoke-commands-skills-parity.sh` (two assertions per command) - enforces colon-form command ↔ dash-form skill directory parity
|
|
317
|
+
- `smoke-compliance-skills.sh` - enforces store-compliance skill catalog + 4 consumer wiring
|
|
318
318
|
- `smoke-personal-data.sh` - extended in 0.5.5 to treat deprecated placeholders (`{github-username}`, `{your-website}`, `{website-repo}`) as leaks; adds `mmerterden` to public-handle blocklist for generic docs
|
|
319
319
|
- `pre-push-check.sh` - runs the cross-CLI + personal-data smoke tests before any push that touches `pipeline/skills/shared/core/` commands
|
|
320
320
|
- `sync.md` (Section 2 REPO step) - genericization lookup table MUST match Section 2 of this contract
|
|
@@ -22,7 +22,7 @@ One fetcher per type. Each fetcher emits a normalized JSON view that the analysi
|
|
|
22
22
|
|---|---|---|
|
|
23
23
|
| `crashlytics` | `~/.claude/lib/fetch-crashlytics.sh <url>` (already invoked in Phase 0 Step 1b.1 for the legacy `state.crashContext` field; Phase 1 reads that field directly) | `state.crashContext` |
|
|
24
24
|
| `fortify` | `~/.claude/lib/fetch-fortify.sh <url>` (already invoked in Phase 0 Step 1b.2 for the legacy `state.fortifyFinding` field; Phase 1 reads that field, Phase 4 reads the full payload for the security gate) | `state.fortifyFinding` |
|
|
25
|
-
| `graylog` | `~/.claude/lib/fetch-graylog.sh --trx <id>` / `--conv <id>` (already invoked in Phase 0 Step 1b.3 for the `state.graylogContext` field; Phase 1 reads that field directly). Diagnostic logs, **advisory only** - no Phase 4 gate, no generated task | `state.graylogContext` |
|
|
25
|
+
| `graylog` | `~/.claude/lib/fetch-graylog.sh --trx <id>` / `--conv <id>` (already invoked in Phase 0 Step 1b.3 for the `state.graylogContext` field; Phase 1 reads that field directly). Diagnostic logs, **advisory only** - no Phase 4 gate, no generated task. Exception: `/multi-agent:complaint-analysis` consumes Graylog as its **primary evidence** by design (its Locked 1); the advisory-only rule scopes to the dev pipeline | `state.graylogContext` |
|
|
26
26
|
| `swagger` | `~/.claude/lib/fetch-swagger.sh <url>` → endpoints[], request/response examples | `state.fetchedContext.swagger[]` |
|
|
27
27
|
| `confluence` | `~/.claude/lib/fetch-confluence.sh <url>` → page body, code blocks, extracted API contracts | `state.fetchedContext.confluence[]` |
|
|
28
28
|
| `figma` | no standalone fetcher - resolve via the Figma 3-tier chain (Tier 1 MCP tools, Tier 2 `~/.claude/lib/figma-screenshot.sh` + REST) when the task is a component; otherwise advisory only | `state.fetchedContext.figma[]` |
|
|
@@ -8,7 +8,7 @@ Phase 3 dispatched to the toolkit plugin for exactly one case, `taskType === "co
|
|
|
8
8
|
|
|
9
9
|
That is the dev-side half of the gap `features/skill-conformance.md` closes on the review side. Review now asks "was this built to the rules it was supposed to follow"; without this step, the answer for a non-component task was "there were no declared rules, because nobody chose any".
|
|
10
10
|
|
|
11
|
-
The fix is not a routing table in the pipeline. Each `ai-<platform>-
|
|
11
|
+
The fix is not a routing table in the pipeline. Each `ai-<platform>-toolkit` already ships one: an `index` skill whose description says *"Load this first when unsure which skill applies"*, holding a 30-plus row intent-to-skill map maintained alongside the skills it points at. A second copy in this repo would drift the moment the plugin shipped a new skill, and the pipeline's copy would be the stale one.
|
|
12
12
|
|
|
13
13
|
So the pipeline's job is to **ask**, not to know.
|
|
14
14
|
|
|
@@ -22,8 +22,8 @@ Platform comes from the same mapping component dispatch uses, so the two cannot
|
|
|
22
22
|
|
|
23
23
|
| `state.platform` / detected stack | Toolkit |
|
|
24
24
|
|---|---|
|
|
25
|
-
| ios, swift | `ai-ios-
|
|
26
|
-
| android, kotlin | `ai-android-
|
|
25
|
+
| ios, swift | `ai-ios-toolkit` |
|
|
26
|
+
| android, kotlin | `ai-android-toolkit` |
|
|
27
27
|
| anything else | no toolkit - step is a recorded no-op |
|
|
28
28
|
|
|
29
29
|
The toolkit is enabled per repo (`.claude/settings.local.json` / `~/.claude/settings.json` `enabledPlugins`). **Not enabled is not an error here**, unlike component dispatch: a backend or web repo legitimately has no toolkit, and halting would make the pipeline unusable outside mobile. Record the no-op and continue.
|
|
@@ -45,9 +45,9 @@ Emit one progress line per loaded skill per `progress-contract.md`, so the user
|
|
|
45
45
|
Append one `state.telemetry.skillCalls[]` entry per skill actually loaded:
|
|
46
46
|
|
|
47
47
|
```json
|
|
48
|
-
{"skill": "ai-ios-
|
|
48
|
+
{"skill": "ai-ios-toolkit:reference/architecture", "phase": 3,
|
|
49
49
|
"targetFiles": ["Domains/Checkin/Sources/CheckinScene.swift"],
|
|
50
|
-
"routedBy": "ai-ios-
|
|
50
|
+
"routedBy": "ai-ios-toolkit:index@0.13.0", "timestamp": "<ISO-8601>"}
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
`routedBy` names the index and version that chose it. That is the difference between "the model happened to read a skill" and "the toolkit said this skill governs this task".
|
|
@@ -51,7 +51,7 @@ This is why the removal is safe:
|
|
|
51
51
|
|---|---|---|
|
|
52
52
|
| Phase 7 triage-memory ingest | `triage-output.json` | `[ -f ]`-guarded, so it degrades **silently**: the triage corpus and learnings ledger stop being fed and no error appears |
|
|
53
53
|
| Phase 7 learnings-ledger distill | same file | same silent degradation |
|
|
54
|
-
| `render-work-summary.sh` | `agent-state.json`, `phase-tracker.json`
|
|
54
|
+
| `render-work-summary.sh` | `agent-state.json`, `phase-tracker.json` (falls back to `logs/multi-agent/<task>/tracker-state.json`, which survives removal) | loses the salvaged copies but keeps the tracker via the logs fallback |
|
|
55
55
|
| `:resume` | `agent-state.json` | cannot continue a Phase 7 pause |
|
|
56
56
|
| `:status`, `:log` | `agent-state.json` | the task becomes invisible |
|
|
57
57
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **TLDR** - Shared 12-step flow for `/multi-agent:create-jira`. Asks the issue type (Task / Bug / Story), mines the target project's existing same-type issues to learn team conventions, detects the active sprint, drafts a standards-compliant issue from a fixed standard template with auto-sizing sections, asks the user about every genuinely unknown field, renders a full preview, and creates the Jira issue only after explicit approval. Creates exactly one Jira issue per run - no branches, no commits, no worktrees.
|
|
4
4
|
|
|
5
|
-
Consumed by `
|
|
5
|
+
Consumed by `create-jira/SKILL.md`. This ref is never invoked directly.
|
|
6
6
|
|
|
7
7
|
## Hard rules (must not regress)
|
|
8
8
|
|
|
@@ -10,7 +10,7 @@ Consumed by `generate.md`. This ref is never invoked directly.
|
|
|
10
10
|
- **Never invent content.** Anything the user did not supply and mining could not derive stays an open question (step [8/12]) or is omitted entirely - never fabricated repro steps, environments, acceptance criteria, or test pass/fail results.
|
|
11
11
|
- **Standard template is the baseline.** The description structure comes from the type's standard template (see [7/12]), not from a mined heading set. Mining informs summary prefix, labels, components, priority norm, sprint placement, and test-scenario style - never replaces the standard section skeleton.
|
|
12
12
|
- **Auto-sizing.** A conditional section renders only when its trigger is present. No empty placeholder headings - if there is nothing to put in a conditional section, it does not appear.
|
|
13
|
-
- **Issue content language follows `prefs.global.outputLanguage`.** Summary and description are written in the user's output language
|
|
13
|
+
- **Issue content language follows `prefs.global.outputLanguage`.** Summary and description are written in the user's output language, like every other user-facing payload body (`rules.md` matrix). Code identifiers, file paths, and URLs stay verbatim. AskUserQuestion `question`/`description` also follow `outputLanguage`; `label`/`header` stay English.
|
|
14
14
|
- **UTF-8 verbatim POST path** (same as `$HOME/.claude/multi-agent-refs/channels/jira.md`): description body goes to a file, `jq -n --rawfile` builds the payload, `curl --data-binary @file` ships it. Never round-trip through `unicode_escape`/`latin-1`, never hand-roll a re-encoding helper. Jira wiki markup (`h3.` headings, `[text|url]` links), real newlines, no HTML entities.
|
|
15
15
|
- **Humanizer pass** on the description body after composition, before the preview render.
|
|
16
16
|
- **Read-only until approval.** Steps 1-9 perform only GET requests. The first write of any kind is the `POST /rest/api/2/issue` in step [10/12].
|
|
@@ -167,7 +167,7 @@ Write summary + description in `outputLanguage` from the type's **standard templ
|
|
|
167
167
|
- **Always-present** sections are filled from `FREE_TEXT` (+ mining for Test Scenarios style). If an always-present section has no user content and cannot be derived, it stays an explicit open question for step 8 - it is not fabricated.
|
|
168
168
|
- **Conditional** sections render only when their trigger fired (see the Standard templates table): Design Reference when `FIGMA_URL` set (`[Figma|{FIGMA_URL}]` + frame name + node id); API Contract when 6b produced a body; Screenshots when images were staged; Notes/Dependencies only with real content. Otherwise the heading is omitted entirely.
|
|
169
169
|
- Bug: logs / stack traces / device+OS mentions from `FREE_TEXT` map into Environment and Screenshots / Logs; anything underivable becomes a step-8 question.
|
|
170
|
-
- Run the humanizer skill on the description body.
|
|
170
|
+
- Run the `ai-common-toolkit:humanizer` skill on the description body.
|
|
171
171
|
- Write the final body to `/tmp/generate-issue-$$.txt` (UTF-8, real newlines) for the `--rawfile` POST.
|
|
172
172
|
|
|
173
173
|
### [8/12] Clarifying questions (only genuinely unknown fields)
|
|
@@ -42,7 +42,7 @@ Decision table:
|
|
|
42
42
|
2. Resolve Jira token via `keychainMapping.jira`. Token missing → run Token Save Flow from `setup.md` inline (clipboard-based; user can add now or skip). Skip → treat as `never` for this run.
|
|
43
43
|
3. Derive Jira fields from the GitHub issue:
|
|
44
44
|
- `summary` ← GitHub issue title (truncate to 255 chars).
|
|
45
|
-
- `description` ← GitHub issue body,
|
|
45
|
+
- `description` ← GitHub issue body run through the markdown → Jira wiki conversion table (`channels/jira.md`) - the body is GitHub Markdown (`###`, `- [ ]`, backticks) and Jira's description field renders wiki markup, so an unconverted body arrives as literal text under a correctly-rendered prefix. Prefix the converted body with the two lines `h3. From GitHub` and `[GH{issueNo}|{url}]`, then a blank line (real newlines in the payload file, never literal `\n`).
|
|
46
46
|
- `issueType` - infer from labels: `bug` → Bug, `enhancement` → Story, default Task.
|
|
47
47
|
- `project` - `figmaConfig.jira.projectKey`, or `prefs.global.defaultJiraKey`, or prompt (cached after first use).
|
|
48
48
|
- `priority` - derive from labels if present (`priority:high` → High, etc.); else leave unset (Jira default).
|
|
@@ -66,7 +66,7 @@ Flow:
|
|
|
66
66
|
|
|
67
67
|
1. Emit `→ posting wiki summary to Jira {jiraId}`.
|
|
68
68
|
2. Read the first N lines of the primary wiki markdown file (the component's overview page - one of `writtenPaths[0]`).
|
|
69
|
-
3. Render as Jira comment: title line (`h3. Component docs - {componentName}`) + an overview paragraph + a link to the full page (wiki URL, if the adapter returned `pushedRemote`).
|
|
69
|
+
3. Render as Jira comment: title line (`h3. Component docs - {componentName}`) + an overview paragraph + a link to the full page (wiki URL, if the adapter returned `pushedRemote`). The overview lines come from a Markdown file - convert them via the `channels/jira.md` table before POST, exactly like the title line already is.
|
|
70
70
|
4. **Run through the humanizer skill** - same policy as Step 4 Confluence: user-facing content must read naturally.
|
|
71
71
|
5. `POST {jira.baseUrl}/rest/api/2/issue/{jiraId}/comment`.
|
|
72
72
|
6. Log: `Phase 7: wiki summary posted to Jira {jiraId}`.
|
|
@@ -96,7 +96,7 @@ Rationale: autopilot is explicit consent for side-effect creation; muting Jira a
|
|
|
96
96
|
Both Claude Code and Copilot CLI implementations MUST:
|
|
97
97
|
|
|
98
98
|
- Resolve the `autoJiraFromGithubIssue` enum the same way.
|
|
99
|
-
- Derive Jira fields from GitHub issue metadata identically (title → summary, body → description
|
|
99
|
+
- Derive Jira fields from GitHub issue metadata identically (title → summary, body → description via the markdown → wiki conversion + `h3. From GitHub` prefix, label → issueType mapping).
|
|
100
100
|
- Patch the GitHub issue body with the `Jira: [KEY](url)` line after create.
|
|
101
101
|
- Treat failures as non-blocking with the same log shape.
|
|
102
102
|
- Run the humanizer skill on the wiki-summary Jira comment.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Canonical required-reading list for outward-facing payloads (PR body, Jira comment, closing report) plus the markup dialect per surface. Loaded by every mode that runs Phase 6 or Phase 7."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Outward-facing payload contracts
|
|
6
|
+
|
|
7
|
+
> Every mode that opens a PR, comments on a tracker, or closes out a run reads this file first. It does not restate the contracts - it names them, so no mode has to carry its own copy and drift from the others.
|
|
8
|
+
|
|
9
|
+
## Read before Phase 6
|
|
10
|
+
|
|
11
|
+
| Read | Before | Governs |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| [`channels/pr.md`]($HOME/.claude/multi-agent-refs/channels/pr.md) | assembling the PR body | fixed section set (`summary` → `changes` → `architecture` cond. → `verification` → `dependencies` cond. → `related`), Markdown-only rule, reviewer-preserving Bitbucket PUT payload |
|
|
14
|
+
| [`phases/phase-6-commit.md`]($HOME/.claude/multi-agent-refs/phases/phase-6-commit.md) | committing | commit convention, default-reviewer fetch, draft/ready prompt, push-must-succeed loop |
|
|
15
|
+
| [`rules.md`]($HOME/.claude/multi-agent-refs/rules.md) "External System Outputs" | any REST payload | real newlines, no HTML entities, no hand-rolled JSON, markup dialect per surface |
|
|
16
|
+
|
|
17
|
+
## Read before Phase 7
|
|
18
|
+
|
|
19
|
+
| Read | Before | Governs |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| [`channels/jira.md`]($HOME/.claude/multi-agent-refs/channels/jira.md) | posting the Jira comment | fixed section set incl. **Test Scenarios** (Given/When/Then, always present), markdown→wiki conversion table |
|
|
22
|
+
| [`channels/confluence.md`]($HOME/.claude/multi-agent-refs/channels/confluence.md) | writing a Confluence page | storage-format conversion, endpoint flavor |
|
|
23
|
+
| [`phases/phase-7-report.md`]($HOME/.claude/multi-agent-refs/phases/phase-7-report.md) | closing out | Timeline + Agent Activity + Cost Breakdown tables, missing-telemetry disclosure |
|
|
24
|
+
| [`tracker-contract.md`]($HOME/.claude/multi-agent-refs/tracker-contract.md) | every phase boundary | per-phase token narration, completion tile suffix |
|
|
25
|
+
|
|
26
|
+
## Markup dialect per surface
|
|
27
|
+
|
|
28
|
+
Language is not the only axis an external payload has. Every surface also has a markup dialect, and they are not interchangeable - the same body shipped to the wrong dialect renders as visible garbage, not as a slightly-off style.
|
|
29
|
+
|
|
30
|
+
| Surface | Dialect | Converter | Section set owned by |
|
|
31
|
+
|---|---|---|---|
|
|
32
|
+
| PR description (GitHub / Bitbucket / GitLab) | **Markdown**, no conversion | none - post the assembled markdown verbatim | `channels/pr.md` |
|
|
33
|
+
| GitHub issue body + comment | **Markdown**, no conversion | none | `channels/issue-comment.md` |
|
|
34
|
+
| Jira comment + issue description | **Jira wiki markup** | the table in `channels/jira.md`, applied by the model - no program exists | `channels/jira.md` |
|
|
35
|
+
| Confluence page body | **storage format** (XHTML) | `lib/md2confluence-v3.py` | `channels/confluence.md` |
|
|
36
|
+
| Wiki pages (`.md` files in a git repo) | **Markdown** | none | `channels/wiki.md` |
|
|
37
|
+
| Commit message | plain text | none | `rules/git-conventions.md` |
|
|
38
|
+
|
|
39
|
+
Assemble every body once in Markdown, then convert **only** on the branches that require it. The recurring defect is the reverse: the Jira wiki table is the only text-markup table in the doc set, so it reads like the default and gets applied to a PR body. In a Markdown target, `h2. Title` renders as literal text, `{{identifier}}` keeps its braces, `#` starts an H1 instead of a numbered list, and `*bold*` comes out italic. In a Jira target the mirror-image failure applies: `## Heading` and `**bold**` render literally.
|
|
40
|
+
|
|
41
|
+
A payload that is in the right language but the wrong dialect is a defect of the same severity as one that never posted. Both need a fix, not a follow-up ticket.
|
|
42
|
+
|
|
43
|
+
## Closing report (required)
|
|
44
|
+
|
|
45
|
+
The run ends with the phase tracker glyph block **and** the numbers behind it - per-phase duration and token spend, plus totals.
|
|
46
|
+
|
|
47
|
+
- Record spend as you go: `phase-tracker.sh tokens <N> <in> <out> [cached]` after **every** LLM call, including each Phase 4 reviewer subagent and each Phase 3 chunk. Counts are additive and nothing reconstructs them after the fact.
|
|
48
|
+
- Tag the model once per phase (`phase-tracker.sh model <N> <name>`) or the cost helper cannot price it and prints `-`.
|
|
49
|
+
- Durations come from the phase timestamps and survive a missed `tokens` call; token spend does not.
|
|
50
|
+
- If any phase has no token data, name those phases and say their cost is unavailable. Never print a report whose cost section is simply absent - the reader cannot tell "cheap run" from "nobody recorded it".
|
|
51
|
+
|
|
52
|
+
### Missing-telemetry disclosure (Phase 7, required)
|
|
53
|
+
|
|
54
|
+
Before composing the report, compute which phases carry no token data:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
STATE="$HOME/.claude/logs/multi-agent/$TASK_ID/tracker-state.json"
|
|
58
|
+
UNTRACKED=$(jq -r '[.phases[] | select((.tokens_in // 0) + (.tokens_out // 0) == 0) | .id] | join(", ")' "$STATE")
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Non-empty `UNTRACKED` → both the agent-log report and the closing chat summary carry one line in `outputLanguage` naming those phase ids as cost-unavailable. Durations come from the phase timestamps and are reported either way.
|
|
62
|
+
|
|
63
|
+
`smoke-tracker-tokens-invocation.sh` only lints that the phase docs *mention* `phase-tracker.sh tokens`. It cannot observe a run that read the doc and skipped the call, so this run-time disclosure is the only thing between a dropped `tokens` call and an invisible failure.
|
|
64
|
+
|
|
65
|
+
## Fast modes are not exempt
|
|
66
|
+
|
|
67
|
+
`--dev`, `--dev --local`, and the autopilot variants skip Analysis, Planning, and the interactive test gate. They run Phase 6 and Phase 7 **unchanged**. A short pipeline is not a licence for an improvised payload shape, a missing Test Scenarios section, or a report without numbers.
|
|
@@ -105,6 +105,26 @@ No separate task breakdown - the agent handles scope autonomously.
|
|
|
105
105
|
|
|
106
106
|
**Combinable with autopilot**: `--dev autopilot` = fastest path. Init -> Dev -> Review (auto-fix) -> auto-commit -> auto-PR -> Report (Phase 5 skipped). Zero user interaction (except build failures after 3 retries, and review findings that survive 3 rework cycles).
|
|
107
107
|
|
|
108
|
+
### Intake warnings shared by the whole `--dev` family
|
|
109
|
+
|
|
110
|
+
These apply to `--dev`, `--dev autopilot`, `--dev local`, and `--dev local autopilot` alike. A mode entry doc may not carry its own copy - it points here.
|
|
111
|
+
|
|
112
|
+
**An analysis document was supplied.** Because Phase 1 and Phase 2 are skipped, no phase turns that document into a task breakdown. The doc becomes raw context for one Dev pass, and work comes out ordered by whatever the model read first: the bottom of the dependency chain lands, the screen wiring does not.
|
|
113
|
+
|
|
114
|
+
Say so before starting, once, and offer the choice:
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
This mode skips Analysis and Planning, so the analysis document will not be turned
|
|
118
|
+
into a task breakdown. For analysis-driven screen work, /multi-agent or
|
|
119
|
+
/multi-agent:local run both phases.
|
|
120
|
+
1. Continue with --dev (doc as context only)
|
|
121
|
+
2. Switch to the full pipeline
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Autopilot picks 1 and logs the warning rather than asking.
|
|
125
|
+
|
|
126
|
+
**The branch already carries the work.** When the change was developed outside the pipeline, or by hand, the `--dev` family is the wrong entry point: it will try to develop again. `/multi-agent:resume-local` puts the existing diff through the same review, adds a build+test success gate, opens the PR, and posts the Jira technical-analysis + test-scenario comment - without re-developing. Offer it when the working tree or branch is already ahead of the base with the task's changes.
|
|
127
|
+
|
|
108
128
|
---
|
|
109
129
|
|
|
110
130
|
## Local Mode (`--local`)
|
|
@@ -35,7 +35,7 @@ Read preferences: `PREFS_FILE="$HOME/.claude/multi-agent-preferences.json"` (if
|
|
|
35
35
|
OUTPUT_LANG=$(jq -r '.global.outputLanguage // "en"' "$PREFS_FILE" 2>/dev/null || echo en)
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
From this point on,
|
|
38
|
+
From this point on, everything the user reads renders in `$OUTPUT_LANG`: conversational lines, `AskUserQuestion` `question`/`description`, and external payload bodies (PR/Jira/Confluence). English stays only on `label`/`header`, commit messages, branch names, PR titles, identifiers. Full matrix: `rules.md` "Language Application". Skipping this step is why a Turkish session gets an English wall of text - or an English picker.
|
|
39
39
|
|
|
40
40
|
**Model fallback date gate** (same step, once per run): read `prefs.global.modelFallback`. If `premiumTierUntil` is set and in the past, apply the date-gate trigger from `$HOME/.claude/multi-agent-refs/features/model-fallback.md` - `preferredModel` personas dispatch on `fallbackModel` for this run, with the one-line WARN. Dispatch-error and budget triggers in that contract apply per-dispatch later; nothing else to do here.
|
|
41
41
|
|
|
@@ -519,7 +519,7 @@ Persist: `"taskType": "component" | "bugfix" | "feature" | "refactor" | "chore"`
|
|
|
519
519
|
|
|
520
520
|
| Phase | Behavior change |
|
|
521
521
|
| ------- | -------------------------------------------------------------------------------------------------------- |
|
|
522
|
-
| Phase 3 | `component` → dispatch to the enabled `ai-<platform>-
|
|
522
|
+
| Phase 3 | `component` → dispatch to the enabled `ai-<platform>-toolkit` plugin's `create-component` skill (fallback `create-ui-component`); else standard TDD |
|
|
523
523
|
| Phase 4 | `bugfix` → test coverage; `component` → accessibility+tokens; `refactor` → behavior preservation |
|
|
524
524
|
| Phase 6 | `bugfix`/`hotfix` → `fix(...)` prefix; `feature`/`component` → `feat(...)`; `refactor` → `refactor(...)` |
|
|
525
525
|
| Phase 7 | `component` → includes SubPhase breakdown |
|
|
@@ -114,13 +114,13 @@ Detect the project's tech stack to load appropriate skills and tooling throughou
|
|
|
114
114
|
|
|
115
115
|
| Stack | Marker Files | Skills |
|
|
116
116
|
| -------------- | ----------------------------------------------- | ------------------------------------------------------------ |
|
|
117
|
-
| iOS/Swift | `.xcodeproj`, `Package.swift` |
|
|
118
|
-
| Android/Kotlin | `build.gradle`, `build.gradle.kts` | `android-jetpack-compose-expert`, `kotlin-coroutines-expert` |
|
|
119
|
-
| Python | `requirements.txt`, `pyproject.toml`, `Pipfile` | `fastapi-pro`, `api-patterns`
|
|
120
|
-
| Node.js | `package.json` | `nodejs-backend-patterns`, `api-patterns`
|
|
121
|
-
| Go | `go.mod` | `api-patterns`, `clean-code`
|
|
122
|
-
| Docker | `Dockerfile`, `docker-compose.yml` | `docker-expert`
|
|
123
|
-
| Monorepo | Multiple of above | `monorepo-architect`
|
|
117
|
+
| iOS/Swift | `.xcodeproj`, `Package.swift` | `ai-ios-toolkit:*` skills, `ai-ios-toolkit:swift-testing` |
|
|
118
|
+
| Android/Kotlin | `build.gradle`, `build.gradle.kts` | `ai-android-toolkit:android-jetpack-compose-expert`, `ai-android-toolkit:kotlin-coroutines-expert` |
|
|
119
|
+
| Python | `requirements.txt`, `pyproject.toml`, `Pipfile` | `ai-backend-toolkit:fastapi-pro`, `ai-backend-toolkit:api-patterns` |
|
|
120
|
+
| Node.js | `package.json` | `ai-backend-toolkit:nodejs-backend-patterns`, `ai-backend-toolkit:api-patterns` |
|
|
121
|
+
| Go | `go.mod` | `ai-backend-toolkit:api-patterns`, `ai-backend-toolkit:clean-code` |
|
|
122
|
+
| Docker | `Dockerfile`, `docker-compose.yml` | `ai-backend-toolkit:docker-expert` |
|
|
123
|
+
| Monorepo | Multiple of above | `ai-backend-toolkit:monorepo-architect` |
|
|
124
124
|
|
|
125
125
|
Store in `agent-state.json` → `"detectedStack": ["ios", "python", "docker"]`
|
|
126
126
|
|
|
@@ -97,11 +97,11 @@ Store approach in task metadata for Phase 3 agent.
|
|
|
97
97
|
|
|
98
98
|
Based on Phase 1 `detectedStack`, assign relevant skills:
|
|
99
99
|
|
|
100
|
-
- iOS tasks -> SwiftUI skills, iOS patterns
|
|
101
|
-
- Python tasks -> `fastapi-pro`, `api-patterns`
|
|
102
|
-
- Node tasks -> `nodejs-backend-patterns`
|
|
103
|
-
- Security-sensitive -> `api-security-best-practices`
|
|
104
|
-
- Multi-submodule -> `monorepo-architect`
|
|
100
|
+
- iOS tasks -> `ai-ios-toolkit:*` SwiftUI skills, iOS patterns
|
|
101
|
+
- Python tasks -> `ai-backend-toolkit:fastapi-pro`, `ai-backend-toolkit:api-patterns`
|
|
102
|
+
- Node tasks -> `ai-backend-toolkit:nodejs-backend-patterns`
|
|
103
|
+
- Security-sensitive -> `ai-backend-toolkit:api-security-best-practices`
|
|
104
|
+
- Multi-submodule -> `ai-backend-toolkit:monorepo-architect`
|
|
105
105
|
|
|
106
106
|
#### Output contract
|
|
107
107
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
### Phase 3: Dev (Sonnet)
|
|
2
2
|
|
|
3
|
-
> **TLDR** - Sonnet executes the plan task-by-task with TDD (red→green→refactor). Required: issue-tracker status moved to "In Progress" before any code, with a post-mutation verify step (re-reads the field, retries once on silent VALIDATION failures). Build verification after each task (up to 3 retries). Build-queue lock serializes concurrent xcodebuild. `--dev` mode uses Opus self-contained (no Phase 2 plan required). `taskType === component` **short-circuits the TDD path** and delegates the whole phase to the enabled `ai-<platform>-
|
|
3
|
+
> **TLDR** - Sonnet executes the plan task-by-task with TDD (red→green→refactor). Required: issue-tracker status moved to "In Progress" before any code, with a post-mutation verify step (re-reads the field, retries once on silent VALIDATION failures). Build verification after each task (up to 3 retries). Build-queue lock serializes concurrent xcodebuild. `--dev` mode uses Opus self-contained (no Phase 2 plan required). `taskType === component` **short-circuits the TDD path** and delegates the whole phase to the enabled `ai-<platform>-toolkit` marketplace plugin's component skill (`create-component`, fallback `create-ui-component`) - see next subsection.
|
|
4
4
|
|
|
5
5
|
## Phase 3 Pre-flight (BLOCKING, v9.0.0)
|
|
6
6
|
|
|
@@ -38,7 +38,7 @@ Pre-flight steps (run in order, abort on failure).
|
|
|
38
38
|
|
|
39
39
|
`targetFiles` is required - without it a skill applied to the wrong files still reads as "applied". Append at the moment of consultation, not at the end of the phase. Phase 4 Step 1.78 treats this as self-report only and resolves criteria independently; it is the one signal separating "applied to the wrong files" from "never opened".
|
|
40
40
|
|
|
41
|
-
9. **Stack skill routing (every `taskType`, when a stack toolkit plugin is enabled)**: ask the enabled `ai-<platform>-
|
|
41
|
+
9. **Stack skill routing (every `taskType`, when a stack toolkit plugin is enabled)**: ask the enabled `ai-<platform>-toolkit`'s own `index` skill which skills govern this task, load them BEFORE writing code, and record each into `state.telemetry.skillCalls[]` with `routedBy: "<toolkit>:index@<version>"`. The routing table stays in the plugin - a copy here would be the stale one. No toolkit, or none enabled, is a recorded no-op, not a halt. Contract: [`features/stack-skill-routing.md`]($HOME/.claude/multi-agent-refs/features/stack-skill-routing.md).
|
|
42
42
|
|
|
43
43
|
The analysis document is the SOLE design source in Phase 3. Variant choices, padding values, color tokens, copy strings, accessibility identifiers, and test method names all come from the rendered Pass B cells. If something is missing in the analysis doc, the fix is to re-run `/multi-agent:analysis`, not to fetch from Figma.
|
|
44
44
|
|
|
@@ -56,7 +56,7 @@ Phase 3 consumes the Phase 2 output object conforming to `$HOME/.claude/schemas/
|
|
|
56
56
|
|
|
57
57
|
#### Component tasks - delegated dispatch (taskType === "component")
|
|
58
58
|
|
|
59
|
-
When Phase 0 Step 7 classified the task as `component`, Phase 3 delegates the entire phase to the enabled `ai-<platform>-
|
|
59
|
+
When Phase 0 Step 7 classified the task as `component`, Phase 3 delegates the entire phase to the enabled `ai-<platform>-toolkit` marketplace plugin's component skill (`create-component`, fallback `create-ui-component`) via the Skill tool and does NOT run the TDD loop below. The dispatch layer passes the plugin skill the analysis Section 6 (Bileşen Envanteri) entry + Section 13.1 conventions for the named component as context. Because plugin skills do not write pipeline state, the **dispatch layer** (not the skill) owns `state.phases["3"].subphases[]`, recording a coarse component-build row - multi-agent's `phase-tracker` reads that array with no special case. Plugin resolution (dual-name), dispatch call, failure/resume, multi-repo, `--dev` elisions, and the intentional cross-CLI divergence live in `$HOME/.claude/multi-agent-refs/component-dispatch.md` - read it before editing component-task behaviour here. Phase 3 still owns: progress line `-> dispatching create-component <name>`, `retryCount` cap at 3, and fallthrough to the TDD path when dispatch prerequisites are missing (`taskType` absent OR the plugin is not enabled in this repo -> log anomaly, halt or run TDD per component-dispatch.md).
|
|
60
60
|
|
|
61
61
|
For non-component taskTypes (`bugfix`, `feature`, `refactor`, `chore`), continue with the standard TDD section below.
|
|
62
62
|
|