@mmerterden/multi-agent-pipeline 14.1.1 → 14.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +162 -0
- package/README.md +10 -6
- package/README.tr.md +143 -0
- package/docs/architecture.md +23 -8
- package/docs/ecosystem.md +237 -0
- package/install/_plugin-skills.mjs +16 -2
- package/install/codex.mjs +9 -4
- package/install/templates/copilot-instructions.md +12 -9
- package/package.json +1 -1
- package/pipeline/commands/deploy.md +4 -1
- package/pipeline/commands/multi-agent/SKILL.md +8 -5
- package/pipeline/commands/multi-agent/analysis/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/autopilot/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/channels/SKILL.md +15 -4
- package/pipeline/commands/multi-agent/create-jira/SKILL.md +4 -4
- package/pipeline/commands/multi-agent/dev/SKILL.md +10 -23
- package/pipeline/commands/multi-agent/dev-autopilot/SKILL.md +10 -2
- package/pipeline/commands/multi-agent/dev-local/SKILL.md +10 -24
- package/pipeline/commands/multi-agent/dev-local-autopilot/SKILL.md +10 -3
- package/pipeline/commands/multi-agent/help/SKILL.md +49 -11
- package/pipeline/commands/multi-agent/jira/SKILL.md +13 -2
- package/pipeline/commands/multi-agent/language/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/local/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/log/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/setup/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/ship/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +340 -0
- package/pipeline/commands/multi-agent/sync/SKILL.md +7 -6
- package/pipeline/commands/multi-agent/test/SKILL.md +18 -8
- package/pipeline/commands/multi-agent/test-accessibility/SKILL.md +33 -0
- package/pipeline/commands/multi-agent/test-dark-mode/SKILL.md +33 -0
- package/pipeline/commands/multi-agent/test-dynamic-type/SKILL.md +33 -0
- package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +41 -0
- package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +28 -201
- package/pipeline/commands/multi-agent/update/SKILL.md +1 -1
- package/pipeline/commands/sim-test.md +45 -36
- package/pipeline/lib/extract-conventions.sh +44 -15
- package/pipeline/lib/fetch-figma-annotations.sh +8 -1
- package/pipeline/lib/fetch-fortify.sh +23 -8
- package/pipeline/lib/figma-screenshot.sh +11 -1
- package/pipeline/lib/issue-fetcher.sh +76 -9
- package/pipeline/lib/md2confluence-v3.py +16 -2
- package/pipeline/lib/plan-todos.sh +5 -2
- package/pipeline/lib/post-pr-review.sh +8 -6
- package/pipeline/lib/shadow-git.sh +50 -9
- package/pipeline/lib/submodule-detector.sh +8 -1
- package/pipeline/multi-agent-refs/_input-parser.md +1 -1
- package/pipeline/multi-agent-refs/channels/confluence.md +3 -0
- package/pipeline/multi-agent-refs/channels/issue-comment.md +2 -2
- package/pipeline/multi-agent-refs/channels/jira.md +13 -2
- package/pipeline/multi-agent-refs/channels/pr-review-actions.md +1 -1
- package/pipeline/multi-agent-refs/channels/pr.md +20 -0
- package/pipeline/multi-agent-refs/channels/wiki.md +1 -1
- package/pipeline/multi-agent-refs/cross-cli-contract.md +6 -5
- package/pipeline/multi-agent-refs/features/worktree-finalize.md +1 -1
- package/pipeline/multi-agent-refs/generate-issue.md +2 -2
- package/pipeline/multi-agent-refs/issue-jira-triad.md +3 -3
- package/pipeline/multi-agent-refs/knowledge.md +1 -1
- package/pipeline/multi-agent-refs/payload-contracts.md +67 -0
- package/pipeline/multi-agent-refs/phases/modes.md +20 -0
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +2 -2
- package/pipeline/multi-agent-refs/phases/phase-6-commit.md +8 -40
- package/pipeline/multi-agent-refs/phases/phase-7-report.md +5 -3
- package/pipeline/multi-agent-refs/phases.md +6 -0
- package/pipeline/multi-agent-refs/rules.md +2 -0
- package/pipeline/schemas/prefs.schema.json +2 -2
- package/pipeline/scripts/audit-log-rotate.sh +10 -0
- package/pipeline/scripts/build-stack-plugins.mjs +8 -1
- package/pipeline/scripts/check-derived-drift.mjs +13 -1
- package/pipeline/scripts/diff-explain.mjs +41 -3
- package/pipeline/scripts/diff-risk-score.mjs +72 -8
- package/pipeline/scripts/gen-mode-dispatch.mjs +1 -1
- package/pipeline/scripts/learning-curve.mjs +8 -2
- package/pipeline/scripts/output-quality-check.sh +15 -4
- package/pipeline/scripts/phase-tracker.sh +21 -8
- package/pipeline/scripts/pre-commit-check.sh +69 -22
- package/pipeline/scripts/render-agent-log-cost.sh +8 -3
- package/pipeline/scripts/render-cost-summary.sh +42 -22
- package/pipeline/scripts/render-work-summary.sh +47 -13
- package/pipeline/scripts/review-scope.mjs +1 -1
- package/pipeline/scripts/run-aggregator.mjs +38 -14
- package/pipeline/scripts/smoke-schema-validation.sh +5 -1
- package/pipeline/scripts/test-gap-scan.mjs +45 -6
- package/pipeline/scripts/uninstall.mjs +39 -4
- package/pipeline/scripts/update-issue-progress.sh +12 -16
- package/pipeline/scripts/worktree-finalize.sh +23 -2
- package/pipeline/skills/.skills-index.json +58 -4
- package/pipeline/skills/shared/README.md +12 -7
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +13 -17
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -0
- package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +4 -17
- package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +8 -0
- package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +5 -18
- package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +8 -0
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +50 -12
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +4 -0
- package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +4 -0
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +18 -3
- package/pipeline/skills/shared/core/multi-agent-ship/SKILL.md +4 -0
- package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +50 -0
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +6 -5
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +18 -8
- package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +37 -0
- package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +37 -0
- package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +37 -0
- package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +44 -0
- package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +29 -101
- package/pipeline/skills/shared/external/firebase/SKILL.md +1 -1
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +302 -0
- package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +144 -0
- package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +156 -0
- package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +108 -0
- package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +175 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +865 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +335 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +344 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +130 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +264 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-key-shots.py +298 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +529 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +187 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +171 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +184 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/snapshot-resources.sh +26 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +173 -0
- package/pipeline/skills/skills-index.md +10 -4
|
@@ -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:
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
/multi-agent:test
|
|
124
|
-
/multi-agent:test
|
|
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:
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
/multi-agent:test
|
|
273
|
-
/multi-agent:test
|
|
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
|
|
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. **
|
|
21
|
+
1. **Preview (dry-run)** - let the script enumerate; do not hand-roll a scan:
|
|
15
22
|
```bash
|
|
16
|
-
|
|
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 +
|
|
35
|
-
Step 2b: CODEX Claude Code -> Codex CLI (1 router skill +
|
|
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
|
|
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
|
-
**
|
|
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,
|
|
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
|
|
36
|
-
| `multi-agent-test "store-ready"` |
|
|
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: "
|
|
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 -
|
|
9
|
+
# multi-agent-testflight-validation - iOS alias for store-ready
|
|
10
10
|
|
|
11
|
-
|
|
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
|
-
|
|
14
|
-
|
|
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
|
-
##
|
|
19
|
+
## Dispatcher
|
|
17
20
|
|
|
18
|
-
|
|
19
|
-
is how a build passes locally and gets rejected anyway.
|
|
21
|
+
Read and follow:
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
93
|
-
printed summary:
|
|
27
|
+
(Equivalent on Claude Code: `$HOME/.claude/commands/multi-agent/store-ready/SKILL.md`.)
|
|
94
28
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
|
|
118
|
-
|
|
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
|
|
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"
|