@mmerterden/multi-agent-pipeline 20.36.0 → 20.37.1
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 +37 -0
- package/docs/facts.json +2 -2
- package/docs/features.md +1 -1
- package/docs/recovery-guide.md +1 -1
- package/install/catalog-history.json +1 -1
- package/manifest.json +225 -148
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/SKILL.md +33 -154
- package/pipeline/commands/multi-agent/analysis/SKILL.md +14 -68
- package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +5 -8
- package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +38 -109
- package/pipeline/commands/multi-agent/channels/SKILL.md +38 -167
- package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +37 -144
- package/pipeline/commands/multi-agent/design-check/SKILL.md +27 -131
- package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +22 -48
- package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +37 -180
- package/pipeline/commands/multi-agent/jira/SKILL.md +16 -46
- package/pipeline/commands/multi-agent/manual-test/SKILL.md +12 -7
- package/pipeline/commands/multi-agent/refactor/SKILL.md +23 -184
- package/pipeline/commands/multi-agent/resume/SKILL.md +30 -136
- package/pipeline/commands/multi-agent/review/SKILL.md +24 -199
- package/pipeline/commands/multi-agent/setup/SKILL.md +25 -181
- package/pipeline/commands/multi-agent/stack/SKILL.md +9 -53
- package/pipeline/commands/multi-agent/status/SKILL.md +13 -2
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +27 -226
- package/pipeline/commands/multi-agent/sync/SKILL.md +35 -164
- package/pipeline/commands/multi-agent/test-gen/SKILL.md +2 -4
- package/pipeline/commands/multi-agent/update/SKILL.md +18 -60
- package/pipeline/contract/CHANGELOG.md +9 -0
- package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
- package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
- package/pipeline/contract/fixtures/error-unsigned.json +1 -1
- package/pipeline/contract/fixtures/runs-awaiting-question.json +1 -1
- package/pipeline/contract/fixtures/runs-empty.json +1 -1
- package/pipeline/contract/fixtures/runs-failed.json +1 -1
- package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +1 -1
- package/pipeline/contract/fixtures/runs-pr-opened.json +1 -1
- package/pipeline/contract/fixtures/runs-running.json +1 -1
- package/pipeline/contract/manifest.json +5 -5
- package/pipeline/contract/types/index.d.ts +3 -2
- package/pipeline/multi-agent-refs/audit-guide.md +20 -0
- package/pipeline/multi-agent-refs/autopilot-on/details.md +148 -0
- package/pipeline/multi-agent-refs/channels/generator.md +14 -0
- package/pipeline/multi-agent-refs/channels/preview.md +13 -0
- package/pipeline/multi-agent-refs/channels/reference.md +46 -0
- package/pipeline/multi-agent-refs/complaint-analysis/phases.md +159 -0
- package/pipeline/multi-agent-refs/design-check/export.md +1 -0
- package/pipeline/multi-agent-refs/design-check/init-inventory.md +1 -1
- package/pipeline/multi-agent-refs/design-check/scope-and-ledger.md +64 -0
- package/pipeline/multi-agent-refs/features/analysis-command-notes.md +53 -0
- package/pipeline/multi-agent-refs/features/commit-multi-repo.md +63 -0
- package/pipeline/multi-agent-refs/features/dev-multi-repo.md +51 -0
- package/pipeline/multi-agent-refs/features/test-gap.md +40 -0
- package/pipeline/multi-agent-refs/features/worktree-finalize.md +1 -1
- package/pipeline/multi-agent-refs/garbage-collect/phases.md +60 -0
- package/pipeline/multi-agent-refs/ios-coding-standard/plan.md +71 -0
- package/pipeline/multi-agent-refs/ios-coding-standard/resolve-and-scan.md +135 -0
- package/pipeline/multi-agent-refs/jira/picker-detail.md +71 -0
- package/pipeline/multi-agent-refs/orchestrator/copilot-pipeline.md +88 -0
- package/pipeline/multi-agent-refs/orchestrator/dispatcher.md +96 -1
- package/pipeline/multi-agent-refs/orchestrator/phase-3-user-test.md +12 -9
- package/pipeline/multi-agent-refs/phases/phase-1-plan.md +4 -4
- package/pipeline/multi-agent-refs/phases/phase-2-dev.md +8 -47
- package/pipeline/multi-agent-refs/phases/phase-3-review.md +21 -65
- package/pipeline/multi-agent-refs/phases/phase-4-commit.md +9 -59
- package/pipeline/multi-agent-refs/phases/phase-5-report.md +0 -31
- package/pipeline/multi-agent-refs/refactor/sweep.md +190 -0
- package/pipeline/multi-agent-refs/resume/details.md +115 -2
- package/pipeline/multi-agent-refs/review/inputs.md +33 -1
- package/pipeline/multi-agent-refs/review/module-guides.md +9 -1
- package/pipeline/multi-agent-refs/review/panel.md +75 -0
- package/pipeline/multi-agent-refs/review/valven.md +5 -1
- package/pipeline/multi-agent-refs/rules.md +1 -1
- package/pipeline/multi-agent-refs/setup/hooks-and-plugins.md +4 -0
- package/pipeline/multi-agent-refs/setup/token-save-flow.md +13 -0
- package/pipeline/multi-agent-refs/stack/background.md +72 -0
- package/pipeline/multi-agent-refs/store-ready/gates.md +139 -0
- package/pipeline/multi-agent-refs/store-ready/report.md +40 -2
- package/pipeline/multi-agent-refs/sync/office.md +10 -0
- package/pipeline/multi-agent-refs/sync/overview.md +61 -0
- package/pipeline/multi-agent-refs/sync/repo.md +91 -0
- package/pipeline/multi-agent-refs/update/details.md +83 -0
- package/pipeline/office/index.html +6 -3
- package/pipeline/office/toolkit.json +1 -1
- package/pipeline/rules/figma-pipeline.md +6 -3
- package/pipeline/schemas/prefs.schema.json +1 -1
- package/pipeline/schemas/runs-index.schema.json +2 -1
- package/pipeline/scripts/_memory-policy.mjs +27 -5
- package/pipeline/scripts/checkpoint-fold.sh +59 -0
- package/pipeline/scripts/contract-server.mjs +1 -1
- package/pipeline/scripts/gate-ledger.mjs +1 -1
- package/pipeline/scripts/office-control.mjs +41 -15
- package/pipeline/scripts/offload-ref.sh +1 -1
- package/pipeline/scripts/rework-rulings.mjs +5 -3
- package/pipeline/scripts/runs-index.mjs +34 -7
- package/pipeline/scripts/scope-check-gate.mjs +15 -2
- package/pipeline/scripts/status-overview.mjs +401 -0
- package/pipeline/scripts/user-test-handoff.sh +203 -0
- package/pipeline/scripts/validate-planning.mjs +5 -3
- package/pipeline/scripts/validate-triage.mjs +2 -1
- package/pipeline/scripts/write-state.mjs +13 -4
- package/pipeline/skills/.skill-manifest.json +64 -64
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +7 -70
- package/pipeline/skills/shared/core/apple-archive-compliance/references/examples.md +67 -0
- package/pipeline/skills/shared/core/apple-archive-compliance/references/version-history.md +8 -0
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +10 -72
- package/pipeline/skills/shared/core/google-play-compliance/references/examples.md +69 -0
- package/pipeline/skills/shared/core/google-play-compliance/references/notes.md +7 -0
- package/pipeline/skills/shared/core/google-play-compliance/references/version-history.md +5 -0
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +39 -262
- package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +35 -73
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +37 -337
- package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +27 -122
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +8 -340
- package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +37 -180
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +12 -7
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +23 -184
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +14 -82
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +25 -277
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +13 -2
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +73 -217
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +11 -162
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-code.md +257 -0
- package/pipeline/skills/shared/external/android-architecture/SKILL.md +7 -58
- package/pipeline/skills/shared/external/android-architecture/references/code-examples.md +68 -0
- package/pipeline/skills/shared/external/app-intents/SKILL.md +3 -45
- package/pipeline/skills/shared/external/app-intents/references/code-examples.md +54 -0
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +5 -81
- package/pipeline/skills/shared/external/app-store-optimization/references/engagement-and-localization.md +96 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +6 -112
- package/pipeline/skills/shared/external/app-store-review/references/monetization-and-submission.md +138 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +10 -117
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models-code.md +186 -0
- package/pipeline/skills/shared/external/authentication/SKILL.md +3 -50
- package/pipeline/skills/shared/external/authentication/references/code-examples.md +59 -0
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +3 -84
- package/pipeline/skills/shared/external/callkit-voip/references/code-examples.md +93 -0
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +7 -263
- package/pipeline/skills/shared/external/ci-cd-pipelines/references/pipeline-examples.md +281 -0
- package/pipeline/skills/shared/external/clean-code/SKILL.md +8 -41
- package/pipeline/skills/shared/external/clean-code/references/code-examples.md +56 -0
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +8 -146
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-code.md +214 -0
- package/pipeline/skills/shared/external/compose-components/SKILL.md +6 -80
- package/pipeline/skills/shared/external/compose-components/references/code-examples.md +89 -0
- package/pipeline/skills/shared/external/compose-navigation/SKILL.md +5 -64
- package/pipeline/skills/shared/external/compose-navigation/references/code-examples.md +70 -0
- package/pipeline/skills/shared/external/core-data/SKILL.md +9 -157
- package/pipeline/skills/shared/external/core-data/references/core-data-code.md +221 -0
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +3 -89
- package/pipeline/skills/shared/external/core-nfc/references/code-examples.md +98 -0
- package/pipeline/skills/shared/external/coreml/SKILL.md +17 -133
- package/pipeline/skills/shared/external/coreml/references/coreml-code.md +208 -0
- package/pipeline/skills/shared/external/css-modern/SKILL.md +8 -131
- package/pipeline/skills/shared/external/css-modern/references/code-examples.md +142 -0
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +6 -103
- package/pipeline/skills/shared/external/database-patterns/references/orm-examples.md +112 -0
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +7 -48
- package/pipeline/skills/shared/external/html-semantic/references/code-examples.md +54 -0
- package/pipeline/skills/shared/external/humanizer/SKILL.md +6 -19
- package/pipeline/skills/shared/external/humanizer/references/voice.md +24 -0
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +13 -170
- package/pipeline/skills/shared/external/ios-accessibility/references/assistive-tech-review.md +224 -0
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +2 -24
- package/pipeline/skills/shared/external/ios-localization/references/code-examples.md +30 -0
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +3 -58
- package/pipeline/skills/shared/external/ios-networking/references/code-examples.md +67 -0
- package/pipeline/skills/shared/external/ios-security/SKILL.md +4 -64
- package/pipeline/skills/shared/external/ios-security/references/code-examples.md +74 -0
- package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -90
- package/pipeline/skills/shared/external/live-activities/references/code-examples.md +108 -0
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +9 -23
- package/pipeline/skills/shared/external/localization-reuse-map/references/project-settings.md +22 -0
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +5 -95
- package/pipeline/skills/shared/external/mapkit-location/references/code-examples.md +117 -0
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +7 -106
- package/pipeline/skills/shared/external/nextjs-app-router/references/app-router-examples.md +124 -0
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -31
- package/pipeline/skills/shared/external/permissionkit/references/code-examples.md +37 -0
- package/pipeline/skills/shared/external/play-store-review/SKILL.md +6 -74
- package/pipeline/skills/shared/external/play-store-review/references/signing-and-policies.md +83 -0
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +8 -125
- package/pipeline/skills/shared/external/push-notifications/references/notification-code.md +176 -0
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +7 -158
- package/pipeline/skills/shared/external/python-patterns/references/python-examples.md +176 -0
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +7 -157
- package/pipeline/skills/shared/external/rest-api-design/references/api-examples.md +175 -0
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +11 -230
- package/pipeline/skills/shared/external/swift-architecture/references/pattern-examples.md +295 -0
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +17 -149
- package/pipeline/skills/shared/external/swift-codable/references/codable-recipes.md +207 -0
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +12 -99
- package/pipeline/skills/shared/external/swift-concurrency/references/code-examples.md +100 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/swift-6-2-additions.md +18 -0
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +9 -78
- package/pipeline/skills/shared/external/swift-formatstyle/references/formatstyle-examples.md +113 -0
- package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -56
- package/pipeline/skills/shared/external/swift-language/references/code-examples.md +65 -0
- package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +1 -0
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +6 -122
- package/pipeline/skills/shared/external/swiftdata/references/code-examples.md +140 -0
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +12 -139
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/interop-code.md +198 -0
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +9 -81
- package/pipeline/skills/shared/external/tailwind-css/references/code-examples.md +91 -0
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +7 -207
- package/pipeline/skills/shared/external/testing-backend/references/testing-examples.md +225 -0
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +8 -89
- package/pipeline/skills/shared/external/typescript-patterns/references/code-examples.md +100 -0
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -20
- package/pipeline/skills/shared/external/vision-framework/references/code-examples.md +26 -0
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +7 -169
- package/pipeline/skills/shared/external/vue-composition/references/vue-examples.md +187 -0
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +7 -174
- package/pipeline/skills/shared/external/web-accessibility/references/a11y-examples.md +192 -0
- package/pipeline/skills/shared/external/web-performance/SKILL.md +8 -66
- package/pipeline/skills/shared/external/web-performance/references/code-examples.md +77 -0
- package/pipeline/skills/shared/external/web-testing/SKILL.md +11 -186
- package/pipeline/skills/shared/external/web-testing/references/testing-examples.md +213 -0
- /package/pipeline/skills/shared/external/localization-reuse-map/{reference → references}/format-and-output.md +0 -0
- /package/pipeline/skills/shared/external/localization-reuse-map/{reference → references}/publish-and-snapshot.md +0 -0
- /package/pipeline/skills/shared/external/localization-reuse-map/{reference → references}/sources-and-recipes.md +0 -0
|
@@ -15,46 +15,11 @@ allowed-tools: Bash, Read, Edit, Write, AskUserQuestion
|
|
|
15
15
|
|
|
16
16
|
Stack skills ship as plugins in the `{owner}/multi-agent-plugins` marketplace. Selecting a stack = **enabling the matching plugin(s)** in the current repo's `.claude/settings.json` `enabledPlugins`. Two toolkits are stack-independent and always enabled alongside the stack plugin(s): `ai-common-toolkit` (accessibility audit, humanizer, Firebase) and `ai-analyst-toolkit` (GitHub and package-registry evidence, community signal for analysis work).
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Claude Code reads stack skills only from the enabled plugins; Copilot CLI and Codex CLI get a local copy filtered at install time (step 5). Host details, usage examples, a preview snippet and why the map is derived: `$HOME/.claude/multi-agent-refs/stack/background.md`. Read it when the user asks what an argument enables or how selection works.
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
## Stack -> plugin map
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
/multi-agent:stack # no arg → native multi-select picker (current state pre-noted)
|
|
26
|
-
/multi-agent:stack ios # SwiftUI toolkit + common
|
|
27
|
-
/multi-agent:stack ios backend # any combination, space-separated
|
|
28
|
-
/multi-agent:stack android # Compose toolkit + common
|
|
29
|
-
/multi-agent:stack mobile # alias: ios + android + common
|
|
30
|
-
/multi-agent:stack backend # Python / Node spec-driven toolkit + common
|
|
31
|
-
/multi-agent:stack web # React / TSX toolkit + common (alias: frontend)
|
|
32
|
-
/multi-agent:stack fullstack # alias: web + backend + common
|
|
33
|
-
/multi-agent:stack all # all four stack toolkits + common
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Stack → plugin map
|
|
37
|
-
|
|
38
|
-
Derived, not listed. `pluginsForStacks()` in `scripts/_stack-routing.mjs` owns
|
|
39
|
-
it, and this file deliberately carries no copy: the mapping was written out by
|
|
40
|
-
hand in four places, and every copy is a chance to get the one asymmetry wrong -
|
|
41
|
-
the detector says `web`, the marketplace ships `ai-frontend-toolkit`.
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
node -e 'import(process.env.HOME+"/.claude/scripts/_stack-routing.mjs").then(m=>{
|
|
45
|
-
const st=process.argv.slice(1).flatMap(a=>m.expandStackArg(a));
|
|
46
|
-
if(!st.length){console.error("Unknown stack. One of: "+m.KNOWN_STACKS.join(" ")+" mobile fullstack all");process.exit(1);}
|
|
47
|
-
const r=m.pluginsForStacks(st);
|
|
48
|
-
if(r.dropped.length) console.error("not in the marketplace, dropped: "+r.dropped.join(" "));
|
|
49
|
-
console.log(r.plugins.join(" "));
|
|
50
|
-
})' "$@"
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
`ai-common-toolkit` and `ai-analyst-toolkit` are in every answer, including the
|
|
54
|
-
empty one: neither is stack-specific. Multiple args union their sets, and the
|
|
55
|
-
aliases (`frontend`, `mobile`, `fullstack`, `all`) expand in the module so
|
|
56
|
-
`/multi-agent:stack mobile` cannot mean one thing here and another in the
|
|
57
|
-
installer.
|
|
22
|
+
Derived, not listed: `pluginsForStacks()` in `scripts/_stack-routing.mjs` owns it (aliases `frontend`, `mobile`, `fullstack`, `all` expand there too). Never write the map out by hand. `ai-common-toolkit` and `ai-analyst-toolkit` are in every answer.
|
|
58
23
|
|
|
59
24
|
## Behaviour
|
|
60
25
|
|
|
@@ -70,8 +35,8 @@ installer.
|
|
|
70
35
|
- every stack toolkit **not** in the union is set to `false` (leave non-`@multi-agent-plugins` entries untouched)
|
|
71
36
|
- `ai-common-toolkit@multi-agent-plugins` and `ai-analyst-toolkit@multi-agent-plugins` are always `true`
|
|
72
37
|
- **legacy-key cleanup**: delete any `ai-*-engineering-toolkit@multi-agent-plugins` keys - those plugin names were retired by the `ai-<stack>-toolkit` rename and a stale `true` there enables a plugin that no longer exists in the marketplace
|
|
73
|
-
- **Apple's Xcode skills**: when `~/.claude/xcode-apple-marketplace` exists
|
|
74
|
-
4. **Unknown arg** → show the
|
|
38
|
+
- **Apple's Xcode skills**: when `~/.claude/xcode-apple-marketplace` exists, set `xcode-integration@xcode-apple` to `true` if `ios` is in the selection and `false` otherwise. Without that directory leave the key absent
|
|
39
|
+
4. **Unknown arg** → show the known stacks; do not guess.
|
|
75
40
|
5. **Copilot/Codex refresh offer.** Their local skill copies are filtered to the enabled stacks at install time, so after a change ask (single `AskUserQuestion`, not silent): "Refresh Copilot/Codex local copies now?" - Yes runs `node <pipelineRepo>/install.js --copilot --codex`, No leaves them stale with a one-line warning naming the command to run later. Skip this question entirely when neither `~/.copilot` nor `~/.codex` exists.
|
|
76
41
|
|
|
77
42
|
## Implementation
|
|
@@ -92,10 +57,7 @@ if [ "$#" -eq 0 ]; then
|
|
|
92
57
|
exit 0
|
|
93
58
|
fi
|
|
94
59
|
|
|
95
|
-
# resolve every arg and derive the ON set
|
|
96
|
-
# The marketplace suffix is appended INSIDE node: `$ON` is a single string, and
|
|
97
|
-
# re-splitting it in the shell to suffix each name is the zsh word-splitting trap
|
|
98
|
-
# (`printf %s@x $ON` suffixes the whole string, not each word).
|
|
60
|
+
# resolve every arg and derive the ON set; the suffix is appended inside node
|
|
99
61
|
ON=$(MP="$MP" node -e 'import(process.env.HOME+"/.claude/scripts/_stack-routing.mjs").then(m=>{
|
|
100
62
|
const st=process.argv.slice(1).flatMap(a=>m.expandStackArg(a));
|
|
101
63
|
if(!st.length){console.error("Unknown stack. One of: "+m.KNOWN_STACKS.join(" ")+" mobile fullstack all");process.exit(1);}
|
|
@@ -105,19 +67,14 @@ ON=$(MP="$MP" node -e 'import(process.env.HOME+"/.claude/scripts/_stack-routing.
|
|
|
105
67
|
})' "$@") || exit 1
|
|
106
68
|
```
|
|
107
69
|
|
|
108
|
-
Then write it with the one writer of these rules
|
|
109
|
-
`POST /v1/stack` calls the same script):
|
|
70
|
+
Then write it with the one writer of these rules:
|
|
110
71
|
|
|
111
72
|
```bash
|
|
112
73
|
node "$HOME/.claude/scripts/stack-toggle.mjs" set --repo "$PWD" "$@" --json
|
|
113
74
|
```
|
|
114
75
|
|
|
115
|
-
`stack-toggle.mjs` applies the write rules above
|
|
116
|
-
stack
|
|
117
|
-
`true`, retired `ai-*-engineering-toolkit` keys deleted, `xcode-integration@xcode-apple`
|
|
118
|
-
following `ios` when the Apple marketplace is linked, every other key kept),
|
|
119
|
-
writes the file atomically and prints the resulting `enabledPlugins`. It refuses
|
|
120
|
-
an empty selection and an unknown stack (exit 1) and never hand-edits the JSON.
|
|
76
|
+
`stack-toggle.mjs` applies the write rules above atomically and refuses an
|
|
77
|
+
empty selection and an unknown stack (exit 1). Never hand-edit the JSON.
|
|
121
78
|
`stack-toggle.mjs status --repo "$PWD" --json` is the read for status mode.
|
|
122
79
|
Then print the resulting `enabledPlugins` block and run step 5 (Copilot/Codex refresh offer).
|
|
123
80
|
|
|
@@ -126,4 +83,3 @@ Then print the resulting `enabledPlugins` block and run step 5 (Copilot/Codex re
|
|
|
126
83
|
- Enablement is per-repo and declarative - commit `.claude/settings.json` so teammates get the same stack.
|
|
127
84
|
- Restart the conversation (or reload the window) for Claude Code to pick up newly enabled plugins.
|
|
128
85
|
- Pipeline Phase 1 stack detection is independent (it reads project files); `stack` only sets which plugin skill set is active.
|
|
129
|
-
- The old `stack-swap.sh` skill-dir swap has been removed; stack selection is entirely plugin enablement.
|
|
@@ -19,10 +19,20 @@ Show every active and completed task as a table.
|
|
|
19
19
|
question:
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
node "$HOME/.claude/scripts/
|
|
23
|
-
node "$HOME/.claude/scripts/
|
|
22
|
+
node "$HOME/.claude/scripts/status-overview.mjs" # live sessions, tokens, accounts, runs
|
|
23
|
+
node "$HOME/.claude/scripts/status-overview.mjs" --json # the same document
|
|
24
|
+
node "$HOME/.claude/scripts/runs-index.mjs" [--all] # the full run table
|
|
24
25
|
```
|
|
25
26
|
|
|
27
|
+
`status-overview.mjs` answers "what is happening right now": each live
|
|
28
|
+
Claude Code session with the run it drives and its token spend (subagents
|
|
29
|
+
included), the tokens of the last 24 hours, the github.com accounts gh holds
|
|
30
|
+
with the active one marked, the git author, and which logical credentials
|
|
31
|
+
from `keychainMapping` are registered. It reads credential names only and
|
|
32
|
+
never a value; never run `credential-store.sh get` to "check" one. Show its
|
|
33
|
+
sections as they come, then the run table below. Token figures are list-price
|
|
34
|
+
estimates, not a bill.
|
|
35
|
+
|
|
26
36
|
`runs-index.mjs` resolves through `lib/run-paths.sh` / `scripts/_run-paths.mjs`,
|
|
27
37
|
so it sees both directory layouts (`<project>/<id>/` and the flat `<id>/`),
|
|
28
38
|
the salvaged `artifacts/` copy Phase 4 leaves behind, and every spelling of a
|
|
@@ -49,6 +59,7 @@ Show every active and completed task as a table.
|
|
|
49
59
|
| `stopped` - Stopped mid-development | anything else past phase 0 | `resume #N` or `kill #N` |
|
|
50
60
|
| `question` - Left at a question | phase 0, nothing pending | `garbage-collect --abandoned` - nothing was built |
|
|
51
61
|
| `unknown` - Status not recorded | no `status` field | say so; offer nothing |
|
|
62
|
+
| `done` - Finished | `status` is `complete`, `completed`, `done`, `abandoned` or `cancelled`, checked first | nothing; the table folds it into a count unless `--all` |
|
|
52
63
|
|
|
53
64
|
A run with no `status` is **not** placed in an actionable group. Unknown is
|
|
54
65
|
not a finding, and calling it dead is the same false claim in the other
|
|
@@ -11,17 +11,7 @@ allowed-tools: Agent, Bash, Read, Write, Edit, Glob, Grep, TaskCreate, TaskUpdat
|
|
|
11
11
|
|
|
12
12
|
# /multi-agent:store-ready - pre-submission validation, iOS + Android
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
back after you do.
|
|
16
|
-
|
|
17
|
-
**Local-only.** No commits, no push, no PR, no channels unless you ask at the end.
|
|
18
|
-
A worktree, when needed, only archives without touching your working tree.
|
|
19
|
-
|
|
20
|
-
**It never ships.** iOS runs `--validate-app`, never `--upload-app`. Android
|
|
21
|
-
never commits a Play edit: when Google Play is onboarded, Gate 2 uploads the
|
|
22
|
-
bundle into a throwaway edit that is validated and deleted, and only after the
|
|
23
|
-
user approves that plan. A validation run must not be able to ship a build by
|
|
24
|
-
accident.
|
|
14
|
+
**Local-only**: no commits, push, PR or channels unless asked at the end; a worktree only archives. **It never ships**: iOS runs `--validate-app`, never `--upload-app`; Android uploads only into a throwaway Play edit, after approval, and never commits it.
|
|
25
15
|
|
|
26
16
|
**Input**: $ARGUMENTS
|
|
27
17
|
|
|
@@ -31,252 +21,63 @@ accident.
|
|
|
31
21
|
- The Play throwaway edit is deleted whether validation passes or fails.
|
|
32
22
|
- Gate 3 reads source, not the binary: a policy finding cites `file:line` in the repo the package was built from.
|
|
33
23
|
|
|
34
|
-
##
|
|
35
|
-
|
|
36
|
-
Each gate sees what the others cannot, so no single one is "the check". The
|
|
37
|
-
failure modes are the same on both platforms: a malformed package, a package the
|
|
38
|
-
store refuses, a policy a human enforces.
|
|
39
|
-
|
|
40
|
-
| Gate | Sees | Blind to |
|
|
41
|
-
|---|---|---|
|
|
42
|
-
| **1. Static** | package structure, manifests, signing, declared APIs and SDKs | anything depending on the store account |
|
|
43
|
-
| **2. Authoritative** | what the store's own validator says about this exact binary | written policy - no validator reads it |
|
|
44
|
-
| **3. Policy** | consent flows, deletion paths, purchase routing, disclosures | anything not visible in source |
|
|
45
|
-
|
|
46
|
-
### Gate matrix
|
|
47
|
-
|
|
48
|
-
| Gate | iOS | Android |
|
|
49
|
-
|---|---|---|
|
|
50
|
-
| 1 Static | `ios_app_store_audit({archive_path, rules: "all"})` - 18 rules with real ITMS codes. Needs an `.xcarchive`. Reference: `apple-archive-compliance` skill | `android_apk_audit` plus the `google-play-compliance` skill's 21 rules: `bundletool validate` + manifest dump, `aapt2 dump badging`, `apksigner verify`, ABI / native scan. Needs an `.aab` (an `.apk` narrows it, see Step 3) |
|
|
51
|
-
| 2 Authoritative | `ios_testflight_validate({ipa_path, platform: "ios", <credentials>})` → `xcrun altool --validate-app`, plus `store_asc_next_build_number` for whether the build number is already used. Needs an `.ipa` + credentials | With `google_play` onboarded: `store_play_validate_bundle({package_name, bundle_path})` - Google validates the `.aab` in a throwaway Publishing API edit that is then deleted, never committed. Without it, Play's check exists only server-side and nothing local reproduces it, so this gate reports `SKIPPED (no local Play validator)` with the reason `Google Play not onboarded`. Do not substitute `bundletool validate` - that is Gate 1 |
|
|
52
|
-
| 3 Policy | `ai-ios-toolkit:app-store-review` skill vs repo source | `ai-android-toolkit:play-store-review` skill vs repo source |
|
|
53
|
-
|
|
54
|
-
Gate 2's asymmetry is reported, not smoothed over. On iOS it is the only gate that
|
|
55
|
-
catches a version+build pair already used. On Android it runs only with Google Play
|
|
56
|
-
onboarded and the throwaway-edit upload approved; without both, an Android run
|
|
57
|
-
clears at most 2 of 3 gates and never prints `passed`.
|
|
24
|
+
## Three gates per platform
|
|
58
25
|
|
|
59
|
-
|
|
60
|
-
older server they are absent, and each branch below that uses one falls back to
|
|
61
|
-
the behaviour it has without the credential.
|
|
26
|
+
1 Static, 2 Authoritative (the store's validator), 3 Policy (repo source). Read `$HOME/.claude/multi-agent-refs/store-ready/gates.md` before Step 0: the gate matrix, Gate 2's asymmetry, input flags, the `store_*` toolkit version.
|
|
62
27
|
|
|
63
28
|
## Step 0 - parse input, detect platform
|
|
64
29
|
|
|
65
|
-
|
|
66
|
-
|---|---|
|
|
67
|
-
| (empty) | ask which repo (Step 1) |
|
|
68
|
-
| `my-app` or a path | that repo |
|
|
69
|
-
| `--archive=<path>` | iOS, build supplied; all three gates can run |
|
|
70
|
-
| `--ipa=<path>` | iOS, build supplied; Gate 1 reports `SKIPPED (needs .xcarchive)` |
|
|
71
|
-
| `--aab=<path>` | Android, build supplied; Gate 1 + 3 run |
|
|
72
|
-
| `--apk=<path>` | Android; Gate 1 runs the subset that does not need a bundle, and says which rules it could not apply |
|
|
73
|
-
| `--skip-sweep` | skip Step A, when no simulator / emulator is available or only the package matters |
|
|
74
|
-
| `--resume` | continue the last run from its state file |
|
|
75
|
-
|
|
76
|
-
Platform detection when no build flag is given:
|
|
77
|
-
|
|
78
|
-
```
|
|
79
|
-
cwd or repo contains .xcodeproj / .xcworkspace / Package.swift -> iOS
|
|
80
|
-
cwd or repo contains build.gradle / build.gradle.kts -> Android
|
|
81
|
-
both -> ask which
|
|
82
|
-
neither -> halt: "store-ready needs an iOS or Android project"
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
State lives at `$HOME/.claude/logs/multi-agent/<task_id>/agent-state.json` with
|
|
86
|
-
`taskId = SR-<repo>-<yyyymmddHHMM>`. Register phases with the tracker
|
|
87
|
-
(`$HOME/.claude/multi-agent-refs/tracker-contract.md`) so `:resume` and `:status`
|
|
88
|
-
work like any other run.
|
|
30
|
+
Flags: `gates.md` "Input". Without a build flag: `.xcodeproj` / `.xcworkspace` / `Package.swift` -> iOS; `build.gradle` / `build.gradle.kts` -> Android; both -> ask; neither -> halt with "store-ready needs an iOS or Android project".
|
|
89
31
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
Use `AskUserQuestion` for every step - never a numbered text menu. Questions and
|
|
93
|
-
descriptions render in `prefs.global.outputLanguage`; `label` and `header` stay
|
|
94
|
-
English, per `$HOME/.claude/multi-agent-refs/picker-contract.md`. Print the
|
|
95
|
-
`Step <i>/<n>: <what this decides>` breadcrumb for each.
|
|
96
|
-
|
|
97
|
-
1. **Repo** - from `prefs.projects` matching the detected platform. A single match
|
|
98
|
-
auto-resolves (say so in the breadcrumb, do not silently skip the step).
|
|
99
|
-
2. **Branch** - the branch to validate. Run `git fetch --prune` first, capturing
|
|
100
|
-
**stderr**. **If the fetch fails, do not silently fall back to a cached ref**, and
|
|
101
|
-
**classify before naming a cause** (credential / network / wrong remote), printing
|
|
102
|
-
the observed stderr line next to the classification. A credential failure never
|
|
103
|
-
gets the cached-ref fallback. Then offer the current branch, the default branch,
|
|
104
|
-
and any `release/*` / `tkdevelop/*` heads.
|
|
105
|
-
Full procedure: `$HOME/.claude/multi-agent-refs/store-ready/preflight.md`. Read it for the fetch-failure table.
|
|
106
|
-
3. **Mode** - how the build is obtained:
|
|
107
|
-
- `Supply a build` (Mode B, default) - fastest, no signing needed in-run.
|
|
108
|
-
- `Build from this branch` (Mode A) - iOS needs a distribution certificate and
|
|
109
|
-
profile in the keychain; Android needs the release signing config. Takes as
|
|
110
|
-
long as a real release build.
|
|
111
|
-
|
|
112
|
-
## Step 2 - pre-flight, before anything expensive
|
|
113
|
-
|
|
114
|
-
Report every line; a missing prerequisite is a halt, not a warning.
|
|
32
|
+
State `$HOME/.claude/logs/multi-agent/<task_id>/agent-state.json`, `taskId = SR-<repo>-<yyyymmddHHMM>`, tracker per `$HOME/.claude/multi-agent-refs/tracker-contract.md`.
|
|
115
33
|
|
|
116
|
-
|
|
117
|
-
**state which tier is active in the report**: tier 1 ASC API key (`store_status`
|
|
118
|
-
reports `appStoreConnect.configured`), tier 2 Apple ID + app-specific password,
|
|
119
|
-
tier 3 neither, where **Gate 2 reports `SKIPPED`, and the run says so in the verdict
|
|
120
|
-
line**. Multi-provider accounts need `--provider-public-id`; ask when it is not in prefs.
|
|
34
|
+
## Step 1 - pickers (native, always)
|
|
121
35
|
|
|
122
|
-
|
|
36
|
+
`AskUserQuestion` for every step, never a numbered text menu, per `$HOME/.claude/multi-agent-refs/picker-contract.md`.
|
|
123
37
|
|
|
124
|
-
|
|
38
|
+
1. **Repo** from `prefs.projects` matching the detected platform; a single match auto-resolves and the breadcrumb says so.
|
|
39
|
+
2. **Branch.** `git fetch --prune`, capturing stderr. **If the fetch fails, do not silently fall back to a cached ref**; **classify before naming a cause** (credential / network / wrong remote) beside the stderr line; a credential failure never gets the cached ref. Fetch-failure table: `$HOME/.claude/multi-agent-refs/store-ready/preflight.md`.
|
|
40
|
+
3. **Mode**: `Supply a build` (Mode B, default) or `Build from this branch` (Mode A, needs release signing).
|
|
125
41
|
|
|
126
|
-
|
|
127
|
-
`googlePlay.configured`:
|
|
42
|
+
## Step 2 - pre-flight, before anything expensive
|
|
128
43
|
|
|
129
|
-
|
|
130
|
-
|---|---|
|
|
131
|
-
| `googlePlay.configured: true` and `MULTI_AGENT_UNATTENDED` unset | runs `store_play_validate_bundle`, after the user approves the upload (Step 5) |
|
|
132
|
-
| `googlePlay.configured: true` and `MULTI_AGENT_UNATTENDED=1` | `SKIPPED (no local Play validator)`, reason: the toolkit refuses the upload in an unattended run |
|
|
133
|
-
| not configured, or no `store_status` tool | `SKIPPED (no local Play validator)`, reason: `Google Play not onboarded` (`/multi-agent:setup` Step 3d) |
|
|
44
|
+
Report every line; a missing prerequisite is a halt, not a warning. iOS: `altool` + `xcodebuild`, then credentials, **stating which tier is active**; tier 3 means **Gate 2 reports `SKIPPED`** and the verdict line says so. Android: `bundletool`, `aapt2`, `apksigner`. Read `store-ready/preflight.md` for Step 2.
|
|
134
45
|
|
|
135
|
-
|
|
46
|
+
Android Gate 2 from `store_status` (`googlePlay.configured`), and say which:
|
|
47
|
+
- configured, attended: runs `store_play_validate_bundle` after approval (Step 5);
|
|
48
|
+
- configured, `MULTI_AGENT_UNATTENDED=1`: `SKIPPED (no local Play validator)`, the toolkit refuses the upload unattended;
|
|
49
|
+
- not configured or no tool: `SKIPPED (no local Play validator)`, reason `Google Play not onboarded`.
|
|
136
50
|
|
|
137
|
-
Credentials come from `/multi-agent:setup`; never prompt for a secret value in
|
|
138
|
-
chat.
|
|
51
|
+
Credentials come from `/multi-agent:setup`; never prompt for a secret value in chat.
|
|
139
52
|
|
|
140
53
|
## Step A - running-app sweep (unless `--skip-sweep`)
|
|
141
54
|
|
|
142
|
-
|
|
143
|
-
and still ship an unreadable screen, so the sweep stays part of store readiness
|
|
144
|
-
rather than being a separate errand.
|
|
145
|
-
|
|
146
|
-
Requires a booted simulator / emulator. When none is available, report
|
|
147
|
-
`Sweep: SKIPPED (no booted device)` and continue to the gates - never halt the
|
|
148
|
-
package validation for it, and never silently omit the line.
|
|
149
|
-
|
|
150
|
-
Delegate to the UI Bug Hunter flow (`$HOME/.claude/commands/sim-test.md`) for the
|
|
151
|
-
mechanics, running the light + dark + large-text passes over every screen. Merge
|
|
152
|
-
its findings into the single report at Step 7, severity-grouped alongside the gate
|
|
153
|
-
findings.
|
|
55
|
+
No booted device: `Sweep: SKIPPED (no booted device)`, continue, never omit the line. Else run `$HOME/.claude/commands/sim-test.md` light + dark + large-text over every screen; findings go into Step 7.
|
|
154
56
|
|
|
155
57
|
## Step 3 - obtain the build
|
|
156
58
|
|
|
157
|
-
|
|
158
|
-
`$HOME/.claude/multi-agent-refs/store-ready/build.md`. Read it for Step 3. Rules that hold either way:
|
|
159
|
-
|
|
160
|
-
- **iOS `.ipa` only** → **Gate 1 is `SKIPPED (needs .xcarchive)`**; never present a
|
|
161
|
-
two-gate run as a full pass. An Android `.apk` **lists the rules it could not apply**.
|
|
162
|
-
- Never validate an artifact whose provenance you did not state; print which one you picked.
|
|
163
|
-
- Mode A worktree at `{projectRoot}/.worktrees/{taskId}`, **never under `$HOME`**, never
|
|
164
|
-
a direct checkout of the main working tree.
|
|
165
|
-
- iOS archives with `destination: "generic/platform=iOS"`. Android with no release
|
|
166
|
-
signing config halts; never audit a debug artifact.
|
|
167
|
-
- Leave `allow_provisioning_updates` off unless the user asks.
|
|
168
|
-
- A failed build or export halts with the parsed errors.
|
|
59
|
+
Read `$HOME/.claude/multi-agent-refs/store-ready/build.md` for Step 3. Always: an `.ipa` alone makes **Gate 1 `SKIPPED (needs .xcarchive)`**; an `.apk` **lists the rules it could not apply**; state provenance; Mode A worktree **never under `$HOME`**; never audit a debug artifact; a failed build halts.
|
|
169
60
|
|
|
170
61
|
## Step 4 - Gate 1, static package audit
|
|
171
62
|
|
|
172
|
-
|
|
173
|
-
`apple-archive-compliance` skill. The direct-package fallback runs only when the
|
|
174
|
-
tool is genuinely absent, and the report says which path ran. An archive with no
|
|
175
|
-
dSYM (`<archive>/dSYMs/*.dSYM` count zero) is a blocking `[SYMBOLS]` finding.
|
|
176
|
-
- **Android**: `android_apk_audit` plus the `google-play-compliance` skill's 21 rules.
|
|
177
|
-
A `minifyEnabled true` module whose build produced no `mapping.txt` is a blocking
|
|
178
|
-
`[SYMBOLS]` finding.
|
|
179
|
-
|
|
180
|
-
Full procedure: `$HOME/.claude/multi-agent-refs/store-ready/gate-1-static.md`. Read it for Gate 1.
|
|
181
|
-
|
|
182
|
-
`error` findings are blocking; `warning` is advisory. Group by severity and keep
|
|
183
|
-
each finding's ITMS / Play policy code - Gate 2 may return the same code on iOS,
|
|
184
|
-
and seeing it in both places tells the user it is real rather than a heuristic.
|
|
63
|
+
iOS `ios_app_store_audit({archive_path, rules: "all"})` per `apple-archive-compliance`; no dSYM is a blocking `[SYMBOLS]` finding. Android `android_apk_audit` plus the `google-play-compliance` 21 rules; a minified module with no `mapping.txt` is blocking `[SYMBOLS]`. Read `store-ready/gate-1-static.md` for Gate 1. `error` blocks, `warning` advises; keep every ITMS / Play code.
|
|
185
64
|
|
|
186
65
|
## Step 5 - Gate 2, the store's own validation
|
|
187
66
|
|
|
188
|
-
|
|
189
|
-
Render the verdict exactly as returned:
|
|
190
|
-
|
|
191
|
-
- `PASS` - Apple accepted the binary for delivery.
|
|
192
|
-
- `FAIL` - list each issue with its ITMS code, the mapped guideline, and the hint.
|
|
193
|
-
- `SKIPPED` - print the reason. **Never render this as a pass.**
|
|
194
|
-
|
|
195
|
-
Gate 2 is the only gate that catches a build number already used - so when it
|
|
196
|
-
fails on that, say so plainly and name the next free build number.
|
|
197
|
-
|
|
198
|
-
**Build number** (App Store Connect onboarded, `store_status` reports
|
|
199
|
-
`appStoreConnect.configured`): find the app with `store_asc_apps` by the archive's
|
|
200
|
-
bundle id, then `store_asc_next_build_number({app_id, version: <CFBundleShortVersionString>})`.
|
|
201
|
-
Report the archive's `CFBundleVersion` as `already used` (not above the highest
|
|
202
|
-
uploaded one, with the suggested next) or `free`. Read-only; it never changes the
|
|
203
|
-
project. Without the credential, skip this line and say why.
|
|
204
|
-
|
|
205
|
-
**Android**, by the state resolved in Step 2:
|
|
206
|
-
|
|
207
|
-
- **Google Play onboarded, attended run.** Call
|
|
208
|
-
`store_play_validate_bundle({package_name: <applicationId>, bundle_path: <.aab>})`
|
|
209
|
-
without `confirm`. It returns the plan only: it would open an edit, upload the
|
|
210
|
-
bundle, validate the edit, then delete it, committing nothing and changing no
|
|
211
|
-
track. Show that plan to the user and ask (picker, `question` / `description` in
|
|
212
|
-
`outputLanguage`, `header` `Play check`, labels `Validate on Play` / `Skip`).
|
|
213
|
-
Only on **Validate on Play**, call it again with `confirm: true`. Render the
|
|
214
|
-
verdict from `valid`: `true` → `PASS`, `false` → `FAIL` with the returned
|
|
215
|
-
`error`. On **Skip**, report `SKIPPED (no local Play validator)` with the reason
|
|
216
|
-
`user declined the upload`.
|
|
217
|
-
- **Otherwise** (unattended, or not onboarded) do not call the tool: report
|
|
218
|
-
`SKIPPED (no local Play validator)` with the reason from the Step 2 table.
|
|
219
|
-
|
|
220
|
-
`bundletool validate` is Gate 1 in every case; reporting it here would fake a
|
|
221
|
-
cleared gate.
|
|
222
|
-
|
|
223
|
-
Google does not document whether an upload into a discarded edit reserves its
|
|
224
|
-
`versionCode`; fastlane's `validate_only` runs the same sequence as a pre-release
|
|
225
|
-
check. If the real upload is later refused as "already used", raise `versionCode`.
|
|
67
|
+
iOS: `ios_testflight_validate({ipa_path, platform: "ios", <credential args>})`, verdict exactly as returned; `SKIPPED` is **never rendered as a pass**. With App Store Connect onboarded, check the build number via `store_asc_apps` + `store_asc_next_build_number` (read-only).
|
|
226
68
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
Load the platform's review skill and review the repo against it. This is the gate
|
|
230
|
-
that catches what a human reviewer rejects, so it reads source, not the binary.
|
|
69
|
+
Android, attended and onboarded: call `store_play_validate_bundle` without `confirm` for the plan, show it, ask (`header` `Play check`, labels `Validate on Play` / `Skip`); only on **Validate on Play** call again with `confirm: true`. Skip reports `SKIPPED (no local Play validator)`, reason `user declined the upload`. Otherwise do not call it. `bundletool validate` is Gate 1, never reported here. Verdict rendering and build-number detail: `gates.md` "Gate 2".
|
|
231
70
|
|
|
232
|
-
|
|
233
|
-
Both cover a `Crash symbolication` row (dSYM upload step / `mapping.txt` upload).
|
|
234
|
-
Full procedure: `$HOME/.claude/multi-agent-refs/store-ready/gate-3-policy.md`. Read it for Gate 3 (the per-platform area tables).
|
|
71
|
+
## Step 6 - Gate 3, policy review
|
|
235
72
|
|
|
236
|
-
|
|
237
|
-
it. `not-applicable` needs a reason - an unexamined area is not a pass.
|
|
73
|
+
iOS `ai-ios-toolkit:app-store-review`, Android `ai-android-toolkit:play-store-review`, against repo source, `Crash symbolication` row included (`store-ready/gate-3-policy.md`). Each area is `pass` / `fail` / `not-applicable` with evidence; `not-applicable` needs a reason.
|
|
238
74
|
|
|
239
75
|
## Step 7 - report
|
|
240
76
|
|
|
241
|
-
Write
|
|
242
|
-
a summary: verdict line, per-gate status, Blocking / Advisory / Not run / Open
|
|
243
|
-
questions, and the `Before rollout` block (phased rollout, `Halt thresholds`,
|
|
244
|
-
rollback / forward-fix owner, forward-fix plan).
|
|
245
|
-
Full procedure: `$HOME/.claude/multi-agent-refs/store-ready/report.md`. Read it for Step 7 (the report layout).
|
|
246
|
-
|
|
247
|
-
Rules for the report:
|
|
248
|
-
|
|
249
|
-
- A skipped gate is never folded into the pass count. The verdict line states the
|
|
250
|
-
skip. An Android run whose Gate 2 did not run therefore reads
|
|
251
|
-
`2 of 3 gates cleared, 1 skipped` at best.
|
|
252
|
-
- Every blocking finding carries a file path or a store code. A finding the user
|
|
253
|
-
cannot act on is noise.
|
|
254
|
-
- The `Before rollout` block is filled by a human, never inferred. When it is
|
|
255
|
-
left unfilled the verdict line gains the suffix `, rollout plan missing`.
|
|
256
|
-
- Humanize via `--lang en` by default (`promptLanguage` is locked to `"en"`); pass
|
|
257
|
-
`--lang=tr` explicitly to opt into Turkish.
|
|
258
|
-
- No AI or assistant attribution anywhere, per
|
|
259
|
-
`$HOME/.claude/rules/git-conventions.md`.
|
|
260
|
-
- Real newlines, no HTML entities, per
|
|
261
|
-
`$HOME/.claude/multi-agent-refs/rules.md "External System Outputs"`.
|
|
77
|
+
Write `~/StoreChecks/<platform>-<repo>-<branch>-<timestamp>/report.md`; read `store-ready/report.md` for the layout and rules. A skipped gate is never in the pass count (`2 of 3 gates cleared, 1 skipped` at best); `Before rollout` (`Halt thresholds`, rollback / forward-fix owner) is human-filled, never inferred; no AI attribution.
|
|
262
78
|
|
|
263
79
|
## Step 8 - offer the next action, do not take it
|
|
264
80
|
|
|
265
|
-
Print
|
|
266
|
-
|
|
267
|
-
- the exact upload command for when the gates are clear, so uploading stays an
|
|
268
|
-
explicit human act:
|
|
269
|
-
- iOS: `xcrun altool --upload-app ...`
|
|
270
|
-
- Android: the Play Console upload, or the `gradle publish` task the project
|
|
271
|
-
declares - never run it
|
|
272
|
-
- `/multi-agent:store-ready --resume` to re-run after fixes
|
|
273
|
-
- `/multi-agent:channels` to land the findings in Jira / Confluence / Wiki / PR
|
|
274
|
-
- the enabled stack plugin's `fix-bug` skill (`ai-ios-toolkit:fix-bug` or the stack equivalent) when Gate 3 produced code-level findings
|
|
275
|
-
|
|
276
|
-
Never upload a build for release, never commit a Play edit, never bump the build number, never commit.
|
|
277
|
-
|
|
278
|
-
## Related surfaces
|
|
81
|
+
Print and stop the `store-ready/report.md` "Next actions" (upload stays a human act). Never upload a build for release, never commit a Play edit, never bump the build number, never commit.
|
|
279
82
|
|
|
280
|
-
`/multi-agent:testflight-validation`
|
|
281
|
-
iOS-only name keeps working; it resolves here with the platform pinned to iOS.
|
|
282
|
-
`/multi-agent:test "store-ready"` also resolves here. There is one implementation.
|
|
83
|
+
`/multi-agent:testflight-validation` (iOS-pinned) and `/multi-agent:test "store-ready"` resolve here.
|