@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.
Files changed (129) hide show
  1. package/CHANGELOG.md +162 -0
  2. package/README.md +10 -6
  3. package/README.tr.md +143 -0
  4. package/docs/architecture.md +23 -8
  5. package/docs/ecosystem.md +237 -0
  6. package/install/_plugin-skills.mjs +16 -2
  7. package/install/codex.mjs +9 -4
  8. package/install/templates/copilot-instructions.md +12 -9
  9. package/package.json +1 -1
  10. package/pipeline/commands/deploy.md +4 -1
  11. package/pipeline/commands/multi-agent/SKILL.md +8 -5
  12. package/pipeline/commands/multi-agent/analysis/SKILL.md +2 -2
  13. package/pipeline/commands/multi-agent/autopilot/SKILL.md +6 -2
  14. package/pipeline/commands/multi-agent/channels/SKILL.md +15 -4
  15. package/pipeline/commands/multi-agent/create-jira/SKILL.md +4 -4
  16. package/pipeline/commands/multi-agent/dev/SKILL.md +10 -23
  17. package/pipeline/commands/multi-agent/dev-autopilot/SKILL.md +10 -2
  18. package/pipeline/commands/multi-agent/dev-local/SKILL.md +10 -24
  19. package/pipeline/commands/multi-agent/dev-local-autopilot/SKILL.md +10 -3
  20. package/pipeline/commands/multi-agent/help/SKILL.md +49 -11
  21. package/pipeline/commands/multi-agent/jira/SKILL.md +13 -2
  22. package/pipeline/commands/multi-agent/language/SKILL.md +1 -1
  23. package/pipeline/commands/multi-agent/local/SKILL.md +6 -2
  24. package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +6 -2
  25. package/pipeline/commands/multi-agent/log/SKILL.md +7 -1
  26. package/pipeline/commands/multi-agent/setup/SKILL.md +1 -1
  27. package/pipeline/commands/multi-agent/ship/SKILL.md +5 -1
  28. package/pipeline/commands/multi-agent/store-ready/SKILL.md +340 -0
  29. package/pipeline/commands/multi-agent/sync/SKILL.md +7 -6
  30. package/pipeline/commands/multi-agent/test/SKILL.md +18 -8
  31. package/pipeline/commands/multi-agent/test-accessibility/SKILL.md +33 -0
  32. package/pipeline/commands/multi-agent/test-dark-mode/SKILL.md +33 -0
  33. package/pipeline/commands/multi-agent/test-dynamic-type/SKILL.md +33 -0
  34. package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +41 -0
  35. package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +28 -201
  36. package/pipeline/commands/multi-agent/update/SKILL.md +1 -1
  37. package/pipeline/commands/sim-test.md +45 -36
  38. package/pipeline/lib/extract-conventions.sh +44 -15
  39. package/pipeline/lib/fetch-figma-annotations.sh +8 -1
  40. package/pipeline/lib/fetch-fortify.sh +23 -8
  41. package/pipeline/lib/figma-screenshot.sh +11 -1
  42. package/pipeline/lib/issue-fetcher.sh +76 -9
  43. package/pipeline/lib/md2confluence-v3.py +16 -2
  44. package/pipeline/lib/plan-todos.sh +5 -2
  45. package/pipeline/lib/post-pr-review.sh +8 -6
  46. package/pipeline/lib/shadow-git.sh +50 -9
  47. package/pipeline/lib/submodule-detector.sh +8 -1
  48. package/pipeline/multi-agent-refs/_input-parser.md +1 -1
  49. package/pipeline/multi-agent-refs/channels/confluence.md +3 -0
  50. package/pipeline/multi-agent-refs/channels/issue-comment.md +2 -2
  51. package/pipeline/multi-agent-refs/channels/jira.md +13 -2
  52. package/pipeline/multi-agent-refs/channels/pr-review-actions.md +1 -1
  53. package/pipeline/multi-agent-refs/channels/pr.md +20 -0
  54. package/pipeline/multi-agent-refs/channels/wiki.md +1 -1
  55. package/pipeline/multi-agent-refs/cross-cli-contract.md +6 -5
  56. package/pipeline/multi-agent-refs/features/worktree-finalize.md +1 -1
  57. package/pipeline/multi-agent-refs/generate-issue.md +2 -2
  58. package/pipeline/multi-agent-refs/issue-jira-triad.md +3 -3
  59. package/pipeline/multi-agent-refs/knowledge.md +1 -1
  60. package/pipeline/multi-agent-refs/payload-contracts.md +67 -0
  61. package/pipeline/multi-agent-refs/phases/modes.md +20 -0
  62. package/pipeline/multi-agent-refs/phases/phase-0-init.md +2 -2
  63. package/pipeline/multi-agent-refs/phases/phase-6-commit.md +8 -40
  64. package/pipeline/multi-agent-refs/phases/phase-7-report.md +5 -3
  65. package/pipeline/multi-agent-refs/phases.md +6 -0
  66. package/pipeline/multi-agent-refs/rules.md +2 -0
  67. package/pipeline/schemas/prefs.schema.json +2 -2
  68. package/pipeline/scripts/audit-log-rotate.sh +10 -0
  69. package/pipeline/scripts/build-stack-plugins.mjs +8 -1
  70. package/pipeline/scripts/check-derived-drift.mjs +13 -1
  71. package/pipeline/scripts/diff-explain.mjs +41 -3
  72. package/pipeline/scripts/diff-risk-score.mjs +72 -8
  73. package/pipeline/scripts/gen-mode-dispatch.mjs +1 -1
  74. package/pipeline/scripts/learning-curve.mjs +8 -2
  75. package/pipeline/scripts/output-quality-check.sh +15 -4
  76. package/pipeline/scripts/phase-tracker.sh +21 -8
  77. package/pipeline/scripts/pre-commit-check.sh +69 -22
  78. package/pipeline/scripts/render-agent-log-cost.sh +8 -3
  79. package/pipeline/scripts/render-cost-summary.sh +42 -22
  80. package/pipeline/scripts/render-work-summary.sh +47 -13
  81. package/pipeline/scripts/review-scope.mjs +1 -1
  82. package/pipeline/scripts/run-aggregator.mjs +38 -14
  83. package/pipeline/scripts/smoke-schema-validation.sh +5 -1
  84. package/pipeline/scripts/test-gap-scan.mjs +45 -6
  85. package/pipeline/scripts/uninstall.mjs +39 -4
  86. package/pipeline/scripts/update-issue-progress.sh +12 -16
  87. package/pipeline/scripts/worktree-finalize.sh +23 -2
  88. package/pipeline/skills/.skills-index.json +58 -4
  89. package/pipeline/skills/shared/README.md +12 -7
  90. package/pipeline/skills/shared/core/multi-agent/SKILL.md +13 -17
  91. package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -0
  92. package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +1 -1
  93. package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +4 -17
  94. package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +8 -0
  95. package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +5 -18
  96. package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +8 -0
  97. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +50 -12
  98. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +1 -1
  99. package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +4 -0
  100. package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +4 -0
  101. package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +18 -3
  102. package/pipeline/skills/shared/core/multi-agent-ship/SKILL.md +4 -0
  103. package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +50 -0
  104. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +6 -5
  105. package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +18 -8
  106. package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +37 -0
  107. package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +37 -0
  108. package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +37 -0
  109. package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +44 -0
  110. package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +29 -101
  111. package/pipeline/skills/shared/external/firebase/SKILL.md +1 -1
  112. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +302 -0
  113. package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +144 -0
  114. package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +156 -0
  115. package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +108 -0
  116. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +175 -0
  117. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +865 -0
  118. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +335 -0
  119. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +344 -0
  120. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +130 -0
  121. package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +264 -0
  122. package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-key-shots.py +298 -0
  123. package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +529 -0
  124. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +187 -0
  125. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +171 -0
  126. package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +184 -0
  127. package/pipeline/skills/shared/external/localization-reuse-map/scripts/snapshot-resources.sh +26 -0
  128. package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +173 -0
  129. package/pipeline/skills/skills-index.md +10 -4
@@ -94,7 +94,8 @@ Utility Commands (dash form on Copilot, colon form on Claude Code):
94
94
  /multi-agent:log [#id] Show task log
95
95
  /multi-agent:resume [#id] Resume a paused task
96
96
  /multi-agent:kill [#id] Delete worktree (logs preserved)
97
- /multi-agent:clear-logs Clean global log directory
97
+ /multi-agent:prune-logs Delete per-task logs (audit + metrics kept; dry-run first)
98
+ /multi-agent:garbage-collect Sweep leftover /tmp scratch + worktree residue (dry-run first)
98
99
  /multi-agent:purge Worktree + logs - full reset (double confirm)
99
100
  /multi-agent:channels Post multi-channel report (Jira/Confluence/Wiki/PR)
100
101
  /multi-agent:review Review a PR or branch diff; no URL -> pick open GitHub/Bitbucket PRs
@@ -104,6 +105,13 @@ Utility Commands (dash form on Copilot, colon form on Claude Code):
104
105
  /multi-agent:sync Sync ecosystem (Claude + Copilot + website)
105
106
  /multi-agent:setup Keychain tokens + Git identity + language onboarding
106
107
  /multi-agent:language [en|tr] Show or set prompt language
108
+ /multi-agent:store-ready [repo] [--archive=|--ipa=|--aab=|--apk=] Pre-submission store readiness,
109
+ iOS + Android, local-only. Three symmetric gates per platform: static package
110
+ audit, the store's own validator, policy review vs source. Plus the running-app
111
+ sweep. A skipped gate is never counted as a pass. Never uploads.
112
+ /multi-agent:testflight-validation [repo] [--ipa=|--archive=] iOS-pinned alias of :store-ready.
113
+ /multi-agent:ios-coding-standard [module] Audit an iOS module against the 99-rule coding-standard
114
+ registry -> remediation plan + onboarding summary -> hand off to dev.
107
115
 
108
116
  ------------------------------------------------------------
109
117
 
@@ -117,11 +125,22 @@ Interactive Launchers:
117
125
  UI Testing (standalone):
118
126
 
119
127
  /multi-agent:test Full simulator test (screenshot all screens)
120
- /multi-agent:test "dark mode" Dark mode bug test
121
- /multi-agent:test "accessibility" Accessibility audit
122
- /multi-agent:test "dynamic type" Large text size test
123
- /multi-agent:test "screenshot tr" App Store screenshots in Turkish
124
- /multi-agent:test "store-ready" App Store guideline pre-flight check
128
+
129
+ Fixed-scenario commands - no quoting, and they autocomplete off `test-`:
130
+
131
+ /multi-agent:test-dark-mode Dark mode bug test
132
+ /multi-agent:test-accessibility Accessibility audit
133
+ /multi-agent:test-dynamic-type Large text size test
134
+ /multi-agent:test-screenshots [tr] App Store screenshot set in a locale (default tr)
135
+
136
+ The scenario-tag form still works and is not deprecated - each command above is
137
+ an alias for it.
138
+
139
+ /multi-agent:test "dark mode" | "accessibility" | "dynamic type" | "screenshot <lang>"
140
+
141
+ `store-ready` is NOT a UI test: it validates a built package, on iOS and Android,
142
+ and lives at /multi-agent:store-ready. The old /multi-agent:test "store-ready"
143
+ tag still works and hands off there.
125
144
 
126
145
  Manual Test (Phase 5 standalone - Xcode hint flow):
127
146
 
@@ -243,7 +262,8 @@ Utility Komutları:
243
262
  /multi-agent:log [#id] Task log'unu göster
244
263
  /multi-agent:resume [#id] Duraklamış task'ı devam ettir
245
264
  /multi-agent:kill [#id] Worktree'yi sil (log'lar korunur)
246
- /multi-agent:clear-logs Global log dizinini temizle
265
+ /multi-agent:prune-logs Task bazlı log'ları sil (audit + metrics korunur; önce dry-run)
266
+ /multi-agent:garbage-collect /tmp artıkları + worktree residue süpür (önce dry-run)
247
267
  /multi-agent:purge Worktree + log'lar - tam reset (çift onay)
248
268
  /multi-agent:channels Multi-channel rapor gönder (Jira/Confluence/Wiki/PR)
249
269
  /multi-agent:review PR veya branch diff'ini review et; URL yoksa -> açık GitHub/Bitbucket PR seç
@@ -253,6 +273,13 @@ Utility Komutları:
253
273
  /multi-agent:sync Ekosistemi senkronize et
254
274
  /multi-agent:setup Keychain token + Git kimliği + dil onboarding
255
275
  /multi-agent:language [en|tr] Prompt dilini göster veya ayarla
276
+ /multi-agent:store-ready [repo] [--archive=|--ipa=|--aab=|--apk=] Yükleme öncesi store hazırlığı,
277
+ iOS + Android, yalnızca lokal. Platform başına 3 simetrik kapı: statik paket
278
+ denetimi, store'un kendi doğrulayıcısı, kaynağa karşı politika incelemesi.
279
+ Artı çalışan-app sweep'i. Atlanan kapı asla pass sayılmaz. Asla yüklemez.
280
+ /multi-agent:testflight-validation [repo] [--ipa=|--archive=] :store-ready'nin iOS'a sabitlenmiş alias'ı.
281
+ /multi-agent:ios-coding-standard [modül] Bir iOS modülünü 99 kurallık kodlama-standardı registry'sine
282
+ göre denetler -> düzeltme planı + onboarding özeti -> dev'e devreder.
256
283
 
257
284
  ------------------------------------------------------------
258
285
 
@@ -266,11 +293,22 @@ Utility Komutları:
266
293
  UI Testing (standalone):
267
294
 
268
295
  /multi-agent:test Tam simulator testi (tüm ekran screenshot'ları)
269
- /multi-agent:test "dark mode" Dark mode bug testi
270
- /multi-agent:test "accessibility" Erişilebilirlik denetimi
271
- /multi-agent:test "dynamic type" Büyük metin boyutu testi
272
- /multi-agent:test "screenshot tr" App Store screenshot (Türkçe locale)
273
- /multi-agent:test "store-ready" App Store guideline pre-flight
296
+
297
+ Sabit-senaryo komutları - tırnak gerekmez, `test-` ile autocomplete'e düşer:
298
+
299
+ /multi-agent:test-dark-mode Dark mode bug testi
300
+ /multi-agent:test-accessibility Erişilebilirlik denetimi
301
+ /multi-agent:test-dynamic-type Büyük metin boyutu testi
302
+ /multi-agent:test-screenshots [tr] Belirtilen dilde App Store screenshot seti (default tr)
303
+
304
+ Senaryo etiketli form çalışmaya devam eder, kaldırılmadı - yukarıdaki komutların
305
+ her biri onun alias'ı.
306
+
307
+ /multi-agent:test "dark mode" | "accessibility" | "dynamic type" | "screenshot <dil>"
308
+
309
+ `store-ready` bir UI testi DEĞİL: üretilmiş paketi doğrular, iOS + Android, ve
310
+ /multi-agent:store-ready altında. Eski /multi-agent:test "store-ready" etiketi
311
+ çalışmaya devam eder ve oraya devreder.
274
312
 
275
313
  Manuel Test (Phase 5 standalone - Xcode hint akışı):
276
314
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: multi-agent-language
3
3
  language: en
4
- description: "Toggle outputLanguage (assistant explanations). promptLanguage is fixed to English. External payloads stay English. Use when the assistant should explain itself in a different language."
4
+ description: "Toggle outputLanguage (assistant explanations, picker questions, PR/Jira/Confluence bodies). promptLanguage is fixed to English; commit messages, branch names and identifiers stay English. Use when the assistant should explain itself in a different language."
5
5
  user-invocable: true
6
6
  argument-hint: "[en|tr] - sets outputLanguage; omit for interactive picker; use 'output en|tr' for explicit form"
7
7
  ---
@@ -35,3 +35,7 @@ multi-agent-local "PROJ-12345" # Jira
35
35
  multi-agent-local "#42" # GitHub issue
36
36
  multi-agent-local "LoginView dark mode fix" # Free-text
37
37
  ```
38
+
39
+ ## Required: outward-facing payload contracts
40
+
41
+ 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.
@@ -51,3 +51,7 @@ multi-agent-local-autopilot "#3"
51
51
  ## Delegation
52
52
 
53
53
  The orchestrator skill (`multi-agent/SKILL.md`) takes the `--local` + `"autopilot": true` state flags together. Contract: `refs/phases/phase-0-init.md` Step 8 (local branch) + `refs/phases/phase-2-planning.md` Step 5 (gate skip) + Step 5c (safety classifier, v7.0.0+).
54
+
55
+ ## Required: outward-facing payload contracts
56
+
57
+ 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.
@@ -9,14 +9,29 @@ user-invocable: true
9
9
 
10
10
  Reset every multi-agent state. Nuclear option - requires double confirmation.
11
11
 
12
+ Backed by `$HOME/.copilot/scripts/purge.sh`, which is safe by default (dry-run,
13
+ deletes nothing until `--yes`), resolves every `rm` target strictly inside
14
+ `<repo>/.worktrees/`, and never touches the main worktree or main/master/develop.
15
+
16
+ Task log dirs are NOT purge territory - use `multi-agent-prune-logs`. The audit
17
+ trail and metrics corpus at the log root are always preserved.
18
+
12
19
  ## Steps
13
20
 
14
- 1. **Scan** - Find all worktrees:
21
+ 1. **Preview (dry-run)** - let the script enumerate; do not hand-roll a scan:
15
22
  ```bash
16
- find {repo}/.worktrees/ -name "agent-state.json" -maxdepth 2
23
+ bash $HOME/.copilot/scripts/purge.sh
17
24
  ```
25
+ Nothing to remove -> report "nothing to purge" and stop.
26
+
27
+ **Never discover worktrees by looking for `agent-state.json` inside them.** That
28
+ was this skill's scan until v14.2.1 and it finds nothing: state lives at
29
+ `$HOME/.claude/logs/multi-agent/{project}/{task-id}/`, not in the worktree, so
30
+ the marker is absent from every real worktree. The scan returned zero while live
31
+ worktrees sat on disk, and purge reported "nothing to purge" as success. The
32
+ script enumerates `<repo>/.worktrees/*/` directly, which is why it works.
18
33
 
19
- 2. **Show list**:
34
+ 2. **Show list** (the script prints it; this is the shape):
20
35
  ```
21
36
  ⚠️ WARNING: Will be deleted:
22
37
  - .worktrees/PROJ-133139/ (branch: feature/PROJ-133139-...)
@@ -45,3 +45,7 @@ multi-agent ship autopilot # no gate prompts: auto-fix, auto-PR, auto-c
45
45
  - Build+Test is the automated success gate (not the interactive device user-test - that is `multi-agent:manual-test`). If the repo has no tests, it reports "no tests present" - never fabricates results.
46
46
  - Commit/PR follows house rules: conventional message, `Ref: #N` (never Closes/Fixes), NO AI/bot attribution. PR opened only if one does not already exist.
47
47
  - Full phase contract lives in the Claude Code command `commands/multi-agent/ship/SKILL.md`; this skill is the Copilot-CLI counterpart.
48
+
49
+ ## Required: outward-facing payload contracts
50
+
51
+ 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.
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: multi-agent-store-ready
3
+ language: en
4
+ description: "Pre-submission store readiness for a built package, iOS and Android, local-only. Three symmetric gates per platform: a static package audit, the store's own authoritative validation, and a policy review against repo source. Separate verdict per gate, a skipped gate never counted as a pass. Validates only, never uploads. Use when a build is about to go to TestFlight or a Play track, or when a submission was rejected and the reason is not obvious."
5
+ user-invocable: true
6
+ argument-hint: "[repo] - empty = pick; repo name or path; --ipa= | --archive= | --aab= | --apk=; --skip-sweep; --resume"
7
+ ---
8
+
9
+ # multi-agent-store-ready - pre-submission validation, iOS + Android
10
+
11
+ Catch, before you upload, what App Store Connect or the Play Console would send
12
+ back after you do.
13
+
14
+ **Local-only.** No commits, no push, no PR. **It never uploads**: iOS runs
15
+ `--validate-app`, never `--upload-app`; Android never commits a Play edit.
16
+
17
+ **Input**: $ARGUMENTS
18
+
19
+ ## Dispatcher
20
+
21
+ The full flow - input parsing, pickers, pre-flight, the running-app sweep, the
22
+ three gates per platform, the report format and the next-action offer - lives in
23
+ one place. Read and follow:
24
+
25
+ ```
26
+ $HOME/.copilot/multi-agent/commands/store-ready.md
27
+ ```
28
+
29
+ (Equivalent on Claude Code: `$HOME/.claude/commands/multi-agent/store-ready/SKILL.md`.)
30
+
31
+ Do not re-derive the gate structure from this file; it is a summary, and the target
32
+ doc is the contract.
33
+
34
+ ## Gate matrix (summary - the target doc is authoritative)
35
+
36
+ | Gate | iOS | Android |
37
+ |---|---|---|
38
+ | 1 Static | `ios_app_store_audit` 18 rules, needs an `.xcarchive` | `android_apk_audit` + `google-play-compliance` 21 rules, needs an `.aab` |
39
+ | 2 Authoritative | `ios_testflight_validate` → `altool --validate-app`, needs credentials | `SKIPPED` - Play's authoritative check is server-side only and no client ships here |
40
+ | 3 Policy | `app-store-review` skill vs repo source | `play-store-review` skill vs repo source |
41
+
42
+ Gate 2's asymmetry is reported as an asymmetry. An Android run clears at most 2 of 3
43
+ gates and must never print `passed`. A skipped gate is never folded into the pass
44
+ count on either platform.
45
+
46
+ ## Related surfaces
47
+
48
+ `multi-agent-testflight-validation` is a thin alias onto this skill, kept so the
49
+ iOS-only name keeps working; it resolves here with the platform pinned to iOS.
50
+ `multi-agent-test "store-ready"` also resolves here. There is one implementation.
@@ -31,8 +31,8 @@ Run all steps automatically:
31
31
 
32
32
  ```
33
33
  Step 1: DETECT Compare timestamps, find stale targets
34
- Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 44 sub-command skills)
35
- Step 2b: CODEX Claude Code -> Codex CLI (1 router skill + 44 specs as refs + 8 agent TOML)
34
+ Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 49 sub-command skills)
35
+ Step 2b: CODEX Claude Code -> Codex CLI (1 router skill + 49 specs as refs + 8 agent TOML)
36
36
  Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub)
37
37
  Step 3d: DEV-TOOLKIT Companion MCP server -> detect movement, ship gates, commit + publish
38
38
  Step 4: WEBSITE Version + phase/model counts -> {website-host} (i18n + projects.ts)
@@ -98,7 +98,7 @@ If nothing is stale -> report "All targets up to date" and stop.
98
98
  ## Codex Sync (Step 2b)
99
99
 
100
100
  This step does **not** hand-copy files. The Codex tree is a *transform* of the Claude
101
- tree, not a mirror: the 43 sub-command specs become reference files (Codex silently
101
+ tree, not a mirror: the 49 sub-command specs become reference files (Codex silently
102
102
  truncates its skills block - see `cross-cli-contract.md` 2.6), every reference to a
103
103
  CLI-owned tree is retargeted (`agents/<persona>.md` becomes `.toml`, the dispatcher
104
104
  becomes the router skill), the 8 personas are regenerated as TOML with a model +
@@ -223,14 +223,15 @@ When invoked with the `release` argument:
223
223
  |-------------|-------------|
224
224
  | `~/.claude/commands/multi-agent/{cmd}.md` | `~/.copilot/skills/multi-agent-{cmd}/SKILL.md` |
225
225
 
226
- **44 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
226
+ **49 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
227
227
 
228
228
  ```
229
229
  analysis, analysis-resolve, autopilot, build-optimize, channels, create-jira, design-check, dev,
230
230
  dev-autopilot, dev-local, dev-local-autopilot, diff-explain, forget, garbage-collect,
231
231
  help, ios-coding-standard, issue, jira, kill, language, local,
232
232
  local-autopilot, log, manual-test, prune-logs, purge, refactor, resume, review, review-issue, review-jira,
233
- routines, save, scan, search, setup, ship, stack, status, sync, test, testflight-validation, uninstall, update
233
+ routines, save, scan, search, setup, ship, stack, status, store-ready, sync, test, test-accessibility,
234
+ test-dark-mode, test-dynamic-type, test-screenshots, testflight-validation, uninstall, update
234
235
  ```
235
236
 
236
237
  **NOT synced**: `refs/*` - Lazy-load references, Claude Code specific
@@ -26,14 +26,24 @@ Pass `$ARGUMENTS` through verbatim - the target doc picks the right test matri
26
26
 
27
27
  ## Quick reference
28
28
 
29
- | Invocation | What it does |
30
- |---|---|
31
- | `multi-agent-test` | Walk all screens, collect screenshot + UI tree, general report |
32
- | `multi-agent-test "dark mode"` | Light/dark comparison, contrast + color bugs |
33
- | `multi-agent-test "accessibility"` | VoiceOver label + tap target + contrast audit |
34
- | `multi-agent-test "dynamic type"` | XL-XXXL text-size layout check |
35
- | `multi-agent-test "screenshot tr"` | App Store screenshot set (Turkish locale) |
36
- | `multi-agent-test "store-ready"` | App Store guideline pre-flight check |
29
+ | Invocation | Fixed-scenario alias | What it does |
30
+ |---|---|---|
31
+ | `multi-agent-test` | - | Walk all screens, collect screenshot + UI tree, general report |
32
+ | `multi-agent-test "dark mode"` | `multi-agent-test-dark-mode` | Light/dark comparison, contrast + color bugs |
33
+ | `multi-agent-test "accessibility"` | `multi-agent-test-accessibility` | VoiceOver label + tap target + contrast audit |
34
+ | `multi-agent-test "dynamic type"` | `multi-agent-test-dynamic-type` | XL-XXXL text-size layout check |
35
+ | `multi-agent-test "screenshot <lang>"` | `multi-agent-test-screenshots [locale]` | App Store screenshot set in a locale (alias defaults to tr) |
36
+ | `multi-agent-test "store-ready" [path]` | hands off to `multi-agent-store-ready` | package validation, not a UI test |
37
+
38
+ Both columns are supported and neither is deprecated; the aliases exist so the
39
+ scenario list autocompletes off `test-` instead of having to be remembered.
40
+
41
+ `store-ready` is the odd one out: it validates a built **package** rather than a
42
+ running app, so it is not implemented here at all. `multi-agent-store-ready` owns
43
+ it on both platforms - three gates per platform, plus this file's sweep as its
44
+ Step A. `multi-agent-testflight-validation` is the iOS-pinned alias of that skill.
45
+ The quoted tag is kept as a hand-off so an existing invocation still lands
46
+ somewhere correct.
37
47
 
38
48
  ## Requirements
39
49
 
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: multi-agent-test-accessibility
3
+ language: en
4
+ description: "Accessibility audit on a booted simulator / emulator: VoiceOver labels, sub-44pt tap targets, contrast, traits. Alias pinning the accessibility scenario. Use when auditing a screen for assistive-technology support."
5
+ user-invocable: true
6
+ argument-hint: "(no arguments - the scenario is fixed)"
7
+ ---
8
+
9
+ # multi-agent-test-accessibility - Accessibility audit
10
+
11
+ Fixed-scenario alias. The implementation is the UI Bug Hunter flow; this skill only
12
+ pins the scenario so the tag does not have to be typed or quoted.
13
+
14
+ ## Dispatcher
15
+
16
+ Read and follow:
17
+
18
+ ```
19
+ $HOME/.copilot/multi-agent/sim-test.md
20
+ ```
21
+
22
+ (Equivalent on Claude Code: `$HOME/.claude/commands/sim-test.md`.)
23
+
24
+ Run it with **scenario = `accessibility`**. Ignore `$ARGUMENTS`; the scenario is fixed
25
+ by the skill name. Anything the user adds is context for the report, never a scenario
26
+ override - to run a different matrix they invoke that skill.
27
+
28
+ ## Equivalent
29
+
30
+ `multi-agent-test "accessibility"` - identical behaviour. Both forms are supported;
31
+ neither is deprecated.
32
+
33
+ ## Requirements
34
+
35
+ - **iOS**: Xcode + booted Simulator (`xcrun simctl list | grep Booted`)
36
+ - **Android**: Android SDK + running emulator or USB device (`adb devices`)
37
+ - **MCP**: `dev-toolkit` MCP server registered (tool names start with `mcp__dev-toolkit__*`)
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: multi-agent-test-dark-mode
3
+ language: en
4
+ description: "Dark mode UI test on a booted simulator / emulator: walk every screen light then dark, report contrast + colour bugs. Alias pinning the dark-mode scenario. Use when a dark-mode rendering bug is suspected."
5
+ user-invocable: true
6
+ argument-hint: "(no arguments - the scenario is fixed)"
7
+ ---
8
+
9
+ # multi-agent-test-dark-mode - Dark mode UI test
10
+
11
+ Fixed-scenario alias. The implementation is the UI Bug Hunter flow; this skill only
12
+ pins the scenario so the tag does not have to be typed or quoted.
13
+
14
+ ## Dispatcher
15
+
16
+ Read and follow:
17
+
18
+ ```
19
+ $HOME/.copilot/multi-agent/sim-test.md
20
+ ```
21
+
22
+ (Equivalent on Claude Code: `$HOME/.claude/commands/sim-test.md`.)
23
+
24
+ Run it with **scenario = `dark mode`**. Ignore `$ARGUMENTS`; the scenario is fixed by
25
+ the skill name. Anything the user adds is context for the report, never a scenario
26
+ override - to run a different matrix they invoke that skill.
27
+
28
+ ## Equivalent
29
+
30
+ `multi-agent-test "dark mode"` - identical behaviour. Both forms are supported;
31
+ neither is deprecated.
32
+
33
+ ## Requirements
34
+
35
+ - **iOS**: Xcode + booted Simulator (`xcrun simctl list | grep Booted`)
36
+ - **Android**: Android SDK + running emulator or USB device (`adb devices`)
37
+ - **MCP**: `dev-toolkit` MCP server registered (tool names start with `mcp__dev-toolkit__*`)
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: multi-agent-test-dynamic-type
3
+ language: en
4
+ description: "Dynamic Type layout test on a booted simulator / emulator: re-walk every screen at XL through accessibility-extra-large, report truncation and clipping. Alias pinning the dynamic-type scenario. Use when checking a layout survives large text."
5
+ user-invocable: true
6
+ argument-hint: "(no arguments - the scenario is fixed)"
7
+ ---
8
+
9
+ # multi-agent-test-dynamic-type - Dynamic Type layout test
10
+
11
+ Fixed-scenario alias. The implementation is the UI Bug Hunter flow; this skill only
12
+ pins the scenario so the tag does not have to be typed or quoted.
13
+
14
+ ## Dispatcher
15
+
16
+ Read and follow:
17
+
18
+ ```
19
+ $HOME/.copilot/multi-agent/sim-test.md
20
+ ```
21
+
22
+ (Equivalent on Claude Code: `$HOME/.claude/commands/sim-test.md`.)
23
+
24
+ Run it with **scenario = `dynamic type`**. Ignore `$ARGUMENTS`; the scenario is fixed
25
+ by the skill name. Anything the user adds is context for the report, never a scenario
26
+ override - to run a different matrix they invoke that skill.
27
+
28
+ ## Equivalent
29
+
30
+ `multi-agent-test "dynamic type"` - identical behaviour. Both forms are supported;
31
+ neither is deprecated.
32
+
33
+ ## Requirements
34
+
35
+ - **iOS**: Xcode + booted Simulator (`xcrun simctl list | grep Booted`)
36
+ - **Android**: Android SDK + running emulator or USB device (`adb devices`)
37
+ - **MCP**: `dev-toolkit` MCP server registered (tool names start with `mcp__dev-toolkit__*`)
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: multi-agent-test-screenshots
3
+ language: en
4
+ description: "App Store screenshot set from a booted simulator / emulator in a given locale, taken as an argument and defaulting to tr. Alias pinning the screenshot scenario. Use when generating store screenshots or checking a localised build renders."
5
+ user-invocable: true
6
+ argument-hint: "[locale] - empty = tr; e.g. tr | en | de | ar"
7
+ ---
8
+
9
+ # multi-agent-test-screenshots - Locale screenshot set
10
+
11
+ Fixed-scenario alias, **parameterised by locale**. The scenario is pinned; the language
12
+ is not, because one skill per language would put a parameter in a name.
13
+
14
+ ## Locale resolution
15
+
16
+ 1. `$ARGUMENTS` names a locale (`tr`, `en`, `de`, `ar`, ...) → use it.
17
+ 2. `$ARGUMENTS` empty → `tr`.
18
+ 3. `$ARGUMENTS` is something other than a locale → do not guess a language and do not
19
+ silently fall back. Ask which locale, rendered in `outputLanguage`.
20
+
21
+ ## Dispatcher
22
+
23
+ Read and follow:
24
+
25
+ ```
26
+ $HOME/.copilot/multi-agent/sim-test.md
27
+ ```
28
+
29
+ (Equivalent on Claude Code: `$HOME/.claude/commands/sim-test.md`.)
30
+
31
+ Run it with **scenario = `screenshot <locale>`**, substituting the locale resolved
32
+ above. That is the tag the target doc matches; passing a bare `screenshot` leaves the
33
+ language unset.
34
+
35
+ ## Equivalent
36
+
37
+ `multi-agent-test "screenshot tr"` - identical behaviour. Both forms are supported;
38
+ neither is deprecated.
39
+
40
+ ## Requirements
41
+
42
+ - **iOS**: Xcode + booted Simulator (`xcrun simctl list | grep Booted`)
43
+ - **Android**: Android SDK + running emulator or USB device (`adb devices`)
44
+ - **MCP**: `dev-toolkit` MCP server registered (tool names start with `mcp__dev-toolkit__*`)
@@ -1,120 +1,48 @@
1
1
  ---
2
2
  name: multi-agent-testflight-validation
3
3
  language: en
4
- description: "Pre-submission validation for a TestFlight / App Store build (iOS, local-only). Three gates: static archive audit, Apple's own `altool --validate-app`, and a Review-Guidelines check. ITMS codes are mapped to the rule each implies. Validates only, never uploads. Use when a build is about to go to TestFlight, or a submission was rejected and you need why."
4
+ description: "iOS-pinned alias of store-ready: same three gates on an iOS build, one implementation. Validates a TestFlight / App Store package, never uploads. Use when an iOS build is about to go to TestFlight, or a submission was rejected and you need why."
5
5
  user-invocable: true
6
6
  argument-hint: "[repo] - empty = pick from prefs; repo name or path; --ipa=<path>; --archive=<path>; --resume"
7
7
  ---
8
8
 
9
- # multi-agent-testflight-validation - pre-submission validation
9
+ # multi-agent-testflight-validation - iOS alias for store-ready
10
10
 
11
- Catch, before you upload, what App Store Connect would send back after you do.
11
+ This skill is an alias. The implementation it used to carry was merged into
12
+ `multi-agent-store-ready`, which runs the same three gates on iOS and adds the
13
+ Android side, so there is one flow to maintain instead of two that had already
14
+ started to drift.
12
15
 
13
- **Local-only**: no commits, no push, no PR, no channels. **It never uploads** - only
14
- `--validate-app` is ever invoked, never `--upload-app`.
16
+ The name is kept because it is the one people reach for when the target is
17
+ TestFlight, and removing a surface is a breaking change.
15
18
 
16
- ## Why three gates
19
+ ## Dispatcher
17
20
 
18
- Each sees something the others structurally cannot, so reporting one as "the check"
19
- is how a build passes locally and gets rejected anyway.
21
+ Read and follow:
20
22
 
21
- | Gate | Runs | Needs | Sees | Blind to |
22
- |---|---|---|---|---|
23
- | **1. Static** | `ios_app_store_audit` (18 rules) | `.xcarchive` | privacy manifest, required-reason API, Info.plist, signing, entitlements, embedded SDK, IPv6, debug leak | anything account-dependent |
24
- | **2. Authoritative** | `ios_testflight_validate` → `altool --validate-app` | `.ipa` + credentials | unregistered bundle ID, profile/app-record mismatch, **version+build already used**, entitlement not provisioned | the Review Guidelines |
25
- | **3. Guideline** | `app-store-review` skill + repo evidence | repo checkout | ATT, privacy policy, account deletion, IAP, purpose-string wording | anything not in source |
26
-
27
- Most "we passed validation and still got rejected" cases are Gate 3 findings:
28
- Apple's validator does not read the Review Guidelines.
29
-
30
- ## Flow
31
-
32
- **0. Input.** `(empty)` → ask · `my-ios-app`/path → that repo · `--ipa=<path>` →
33
- Mode B without Gate 1 · `--archive=<path>` → Mode B with all gates · `--resume`.
34
- State at `~/.claude/logs/multi-agent/<task_id>/agent-state.json`,
35
- `taskId = TFV-<repo>-<yyyymmddHHMM>`. Register phases with
36
- `bash ~/.copilot/scripts/phase-tracker.sh` and render with
37
- `phase-tracker.sh render` at every boundary.
38
-
39
- **1. Pickers.** Repo (iOS entries in `prefs.projects`; a single match auto-resolves,
40
- and the breadcrumb says so) → branch → mode. Print
41
- `Step <i>/<n>: <what this decides>` for each. On `git fetch` failure do **not**
42
- silently use a cached ref, and **classify the failure before naming a cause**:
43
- `could not read Password` / `Authentication failed` / `403` is a credential
44
- problem, not a network one, and a VPN cannot fix it; `Could not resolve host` /
45
- `Operation timed out` is the network. Show the stderr line verbatim next to your
46
- classification, then offer the remedy that matches it. Only the network case gets
47
- the continue-on-a-stale-ref option: for a credential failure, staleness is
48
- unrelated to what broke.
49
-
50
- **2. Pre-flight.** `xcrun --find altool` and `xcodebuild -version`; a missing
51
- prerequisite halts. Resolve credentials and name the active tier in the report:
52
- tier 1 ASC API key (key id + issuer id from the keychain via
53
- `prefs.global.keychainMapping`, `.p8` at
54
- `~/.appstoreconnect/private_keys/AuthKey_<keyId>.p8`), tier 2 Apple ID +
55
- app-specific password by keychain reference, tier 3 none → **Gate 2 is `SKIPPED`
56
- and the verdict line says so**. Credentials come from `/multi-agent:setup`; never
57
- prompt for a secret value in chat. Tier 2 needs no elevated App Store Connect
58
- role, which matters when API-key creation is not permitted on the account.
59
-
60
- **3. Obtain the build.**
61
- - Mode B `.xcarchive` → Gate 1 runs; export with `ios_export_ipa` to reach Gate 2.
62
- - Mode B `.ipa` only → **Gate 1 `SKIPPED (needs .xcarchive)`**. The static audit
63
- reads archive structure an `.ipa` does not carry. Do not present a two-gate run
64
- as a full pass.
65
- - Mode A → worktree at `{projectRoot}/{worktreeBasePath}/{taskId}` (**never under
66
- `$HOME`**) → `ios_xcodebuild({action: "archive", configuration: "Release",
67
- destination: "generic/platform=iOS"})` - the simulator default would produce a
68
- non-distributable archive - then `ios_export_ipa({method:
69
- "app-store-connect", team_id, ...})`. Leave `allow_provisioning_updates` off
70
- unless asked: it lets xcodebuild create or modify profiles in the developer
71
- account, which a validation run has no business doing.
72
-
73
- **4. Gate 1.** `ios_app_store_audit({archive_path, rules: "all"})`. `error` blocks,
74
- `warning` advises. Keep each ITMS code - Gate 2 may return the same one, and that
75
- agreement tells the user it is real.
76
-
77
- **5. Gate 2.** `ios_testflight_validate({ipa_path, platform: "ios", <creds>})`.
78
- Render the verdict as returned: `PASS` / `FAIL` (each issue with ITMS code, mapped
79
- guideline, hint) / `SKIPPED` (with the reason, **never as a pass**). This is the
80
- only gate that catches an already-used build number - the most common wasted
81
- upload - so when it fails on that, name the next free build number.
82
-
83
- **6. Gate 3.** Load `app-store-review` and check, with an evidence path each:
84
- purpose strings (present, specific, matching actual use) · `PrivacyInfo.xcprivacy`
85
- (exists, declares required-reason APIs, matches linked SDKs) · ATT before any
86
- tracking · in-app account deletion when accounts are created · privacy policy
87
- reachable · IAP through StoreKit with no external purchase path · Sign in with
88
- Apple alongside third-party social login. Mark `pass` / `fail` /
89
- `not-applicable`, and `not-applicable` needs a reason - an unexamined area is not
90
- a pass.
23
+ ```
24
+ $HOME/.copilot/multi-agent/commands/store-ready.md
25
+ ```
91
26
 
92
- **7. Report.** `~/TestFlightChecks/<repo>-<branch>-<timestamp>/report.md` plus a
93
- printed summary:
27
+ (Equivalent on Claude Code: `$HOME/.claude/commands/multi-agent/store-ready/SKILL.md`.)
94
28
 
95
- ```
96
- Verdict: <N> of 3 gates cleared[, <M> skipped]
97
- Build: <path> · <bundle id> <version> (<build>)
98
- Auth: tier <1|2|none> · <method>
29
+ Run it with **platform pinned to `ios`** and skip its platform-detection step. Pass
30
+ `$ARGUMENTS` through verbatim: `--ipa=`, `--archive=`, a repo name or path, and
31
+ `--resume` all mean exactly what they mean there.
99
32
 
100
- Gate 1 static audit PASS | FAIL (<n> blocking, <n> advisory) | SKIPPED (<reason>)
101
- Gate 2 Apple validation PASS | FAIL (<n> issues) | SKIPPED (<reason>)
102
- Gate 3 guideline review PASS | FAIL (<n> findings) | <n> not-applicable
33
+ `--aab=` / `--apk=` are Android inputs and are not valid here. If one is supplied,
34
+ do not silently switch platform - say the Android inputs belong to
35
+ `multi-agent-store-ready`, and stop.
103
36
 
104
- Blocking - fix before uploading
105
- [ITMS-90683] Info.plist: NSCameraUsageDescription missing
106
- guideline 5.1.1 Data Collection and Storage
107
- <hint> · <file:line>
37
+ ## What you get
108
38
 
109
- Not run
110
- Gate 1: needs an .xcarchive; only an .ipa was supplied
111
- ```
39
+ Unchanged from before the merge, on the iOS path:
112
40
 
113
- A skipped gate is never folded into the pass count. Every blocking finding carries
114
- a file path or an ITMS code. No AI or assistant attribution anywhere; real
115
- newlines, no HTML entities.
41
+ | Gate | What runs | Needs |
42
+ |---|---|---|
43
+ | **1. Static** | `ios_app_store_audit` (18 rules, real ITMS codes) | an `.xcarchive` |
44
+ | **2. Authoritative** | `ios_testflight_validate` → `altool --validate-app` | an `.ipa` + credentials |
45
+ | **3. Policy** | `app-store-review` skill vs repo source | repo checkout |
116
46
 
117
- **8. Offer, do not act.** Print the exact `xcrun altool --upload-app` command for
118
- when the gates are clear (uploading stays an explicit human act), plus
119
- `--resume` after fixes and `/multi-agent:fix-bug` for code-level Gate 3 findings.
120
- Never upload, never bump the build number, never commit.
47
+ A skipped gate is never folded into the pass count, and the run never uploads. The
48
+ report lands in `~/StoreChecks/ios-<repo>-<branch>-<timestamp>/report.md`.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: firebase
3
- description: "You're a developer who has shipped dozens of Firebase projects. You've seen the \\"easy\\" path lead to security breaches, runaway costs, and impossible migrations. You know Firebase is powerful, but you also know its sharp edges. Use when integrating or reviewing Firebase: auth, Firestore, functions, or its cost and scaling traps."
3
+ description: "You're a developer who has shipped dozens of Firebase projects. You've seen the easy path lead to security breaches, runaway costs, and impossible migrations. You know Firebase is powerful, but you also know its sharp edges. Use when integrating or reviewing Firebase: auth, Firestore, functions, or its cost and scaling traps."
4
4
  risk: unknown
5
5
  source: "vibeship-spawner-skills (Apache 2.0)"
6
6
  date_added: "2026-02-27"