@mmerterden/multi-agent-pipeline 20.10.0 → 20.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/docs/facts.json +5 -4
- package/install/catalog-history.json +1 -1
- package/manifest.json +28 -25
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/help/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/setup/SKILL.md +12 -13
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +63 -19
- package/pipeline/lib/credential-inventory.sh +3 -2
- package/pipeline/multi-agent-refs/features/doctor.md +17 -0
- package/pipeline/multi-agent-refs/keychain.md +2 -0
- package/pipeline/multi-agent-refs/outside-the-pipeline.md +1 -0
- package/pipeline/multi-agent-refs/setup/app-store-connect.md +106 -20
- package/pipeline/multi-agent-refs/setup/google-play.md +70 -0
- package/pipeline/preferences-template.json +3 -1
- package/pipeline/schemas/prefs.schema.json +9 -1
- package/pipeline/scripts/doctor.mjs +91 -1
- package/pipeline/scripts/pre-commit-check.sh +11 -2
- package/pipeline/scripts/probe-store-key.mjs +306 -0
- package/pipeline/scripts/write-store-config.mjs +293 -0
- package/pipeline/skills/.skill-manifest.json +4 -4
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +58 -6
- package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +11 -7
package/manifest.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "20.
|
|
4
|
-
"commit": "
|
|
5
|
-
"generatedAt": "2026-09-
|
|
3
|
+
"version": "20.11.0",
|
|
4
|
+
"commit": "5124f984fab4c9ec2413942e9e9d30020dd046d1",
|
|
5
|
+
"generatedAt": "2026-09-29T13:01:15.322Z",
|
|
6
6
|
"algorithm": "sha256",
|
|
7
|
-
"fileCount":
|
|
7
|
+
"fileCount": 1230,
|
|
8
8
|
"files": {
|
|
9
|
-
"CHANGELOG.md": "
|
|
9
|
+
"CHANGELOG.md": "c23b53aae6aa02d811dcb0a1698d36e23f5c19f77b10ea4677d62e28e1f56920",
|
|
10
10
|
"LICENSE": "8d8c51aaf1e1538b180c69965fa038db71be86798cc3e26a143bebfefe16a43e",
|
|
11
11
|
"README.md": "0613eebb0b38062bd94c44043595d1950b5c9b470874dd8e402c052fd20960cf",
|
|
12
12
|
"README.tr.md": "0c6b5e6943d6c3d3bf3a7ed99c705fb9a78d15d7722e6252f58404d3f6d3524d",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"docs/best-practices.md": "f8b75b0d38b5896a6a852bb30a1edddeb24dab8b5b7b1d9313290e1241c72024",
|
|
34
34
|
"docs/ecosystem.md": "e6c00f30e95b5e178f77bdfbefd686c8a4164f39c03865a89ab23465d1a37acf",
|
|
35
35
|
"docs/engineering.md": "550528cd47c7d2c921729c68d0782a00ac8e77a4bdfec479f6749f9c3235d188",
|
|
36
|
-
"docs/facts.json": "
|
|
36
|
+
"docs/facts.json": "ec1d8856d83f528813d5a3c5777c717753248fb287ae0427ba1b2f14c16d92fa",
|
|
37
37
|
"docs/features.md": "6c9f0efb00c683e6f611c440c87847b187f8b0eee59e9e812f3a241695bc2ae1",
|
|
38
38
|
"docs/performance.md": "bbf2f3922c25dcba0c1a9e69ef420e3871a729af5b35009a49b48a5d3c5cd151",
|
|
39
39
|
"docs/recovery-guide.md": "59a8f1b66b34cb9ff5507b3d54dac3b9915e184aa044d9c758d18cac818d510e",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"install/_plugin-skills.mjs": "bf287053133f940df0ca434cfc5ee522fd27e80dc7f7e60ccc963ecaabee047a",
|
|
52
52
|
"install/_telemetry.mjs": "5433d753f909beed2c8789272bba05e245482c472f83d3444f58000c4c9a634b",
|
|
53
53
|
"install/_unattended-profile.mjs": "e1ed82bde35d19105ee12c2a551eb778912b0e5c93ab227fd15c993098d98de0",
|
|
54
|
-
"install/catalog-history.json": "
|
|
54
|
+
"install/catalog-history.json": "3bc89ad70da08bfea483551fb3d38fab2219e7dffe16dd97c636c2a2e52dd532",
|
|
55
55
|
"install/claude.mjs": "c7b0a6eff15e967778e6ab8c463949c79dade05309878b03836f023da704fb3a",
|
|
56
56
|
"install/codex.mjs": "2c2238cd9dd2f95b4a50a505387e8e49ddc1513ae13998f05f1ed3e3a71b18e7",
|
|
57
57
|
"install/copilot.mjs": "300a74f17084d1a38f16428ca7477394c29e33cd755156e19b92e457999be234",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"install/templates/multi-agent-autopilot-awake.plist.template": "ddd25c76c56fcbb38a89de8e35637372d70ace993d6bc487a88ca9cfb702fe1f",
|
|
63
63
|
"install/templates/multi-agent-autopilot.plist.template": "122c8a61cd927edd99375d6e3da40f1d42bcceed5b6641785c8b28bb930bc77e",
|
|
64
64
|
"install/unattended-profile-legacy.json": "f52e86b998956f09ad306b1735a6c10b58580d7082d8a55665a4c6bb15c3aa1f",
|
|
65
|
-
"package.json": "
|
|
65
|
+
"package.json": "eb7cea544573dc7c026884f773d1c644de4eb5818c2c42ab787777d8ee0fd37d",
|
|
66
66
|
"pipeline/agents/android-architect.md": "11fb74543cb0ebcf9525ca6654fe95d53da7229e0bf4a1149b31fd9005abc453",
|
|
67
67
|
"pipeline/agents/backend-architect.md": "b02a606c301e4714131aed70ae6d16eeb77fbc819a001e2752cff2488d4246de",
|
|
68
68
|
"pipeline/agents/bulk-reader.md": "6597052cd7d205bac2b1c7633f5232fe1a40730664a913b8eb77efd5a786dc25",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"pipeline/commands/archive-guard.md": "16c5d3feaa91950402d62e66adc7fcf519a25d028a9303cb1e9c08af2765c04b",
|
|
78
78
|
"pipeline/commands/deploy.md": "d20f95f3b1d2357c8c92f3047e8fe11eadf539ff13cab9b54f072f0ad697242a",
|
|
79
79
|
"pipeline/commands/figma-to-swiftui.md": "cb198d279d36c6c34648ab9834433d00f81c9d427934cc1641c0e09f1878b0a6",
|
|
80
|
-
"pipeline/commands/multi-agent/SKILL.md": "
|
|
80
|
+
"pipeline/commands/multi-agent/SKILL.md": "ba1c37843adf8c3c23ca88245ae92a6456e605c674a401bfd889e0430eb529dc",
|
|
81
81
|
"pipeline/commands/multi-agent/analysis-jira/SKILL.md": "3b656d82f6d83599e34c871e66127caf3f8522eafd22c5527404c8f854e2e8f1",
|
|
82
82
|
"pipeline/commands/multi-agent/analysis-resolve/SKILL.md": "3c712e86d4b2e80d1ba51811ea32c8d5fa11291ab62c6dae944f9c19ddfd9868",
|
|
83
83
|
"pipeline/commands/multi-agent/analysis/SKILL.md": "a20662c5c3495bb3fe676e43a8d71ce3148886f2ace582496b094dec6d7aea78",
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
"pipeline/commands/multi-agent/forget/SKILL.md": "7a7e7480919cc732bee02aa8eb0d5051ed3908dede500df1f942085d1a01a8a1",
|
|
97
97
|
"pipeline/commands/multi-agent/garbage-collect/SKILL.md": "9f3c31a54c5dde24817bf249e514a0a1d4c86a82cd5c6a4909774e918bb8ce6c",
|
|
98
98
|
"pipeline/commands/multi-agent/graph/SKILL.md": "3a3dd8c6c5d8c865426111e8ec02af2eac21b6197acea1c63305914de5362c39",
|
|
99
|
-
"pipeline/commands/multi-agent/help/SKILL.md": "
|
|
99
|
+
"pipeline/commands/multi-agent/help/SKILL.md": "95fbe46f66b6c449498f560ded22ba5caa1192e42693e74017a37a8d691f8598",
|
|
100
100
|
"pipeline/commands/multi-agent/ios-coding-standard/SKILL.md": "436d00f345601b6b3fac369af48cf3c73109022cc4218e8df0625a6c62f1ae70",
|
|
101
101
|
"pipeline/commands/multi-agent/issue/SKILL.md": "9a7ca4c1cb107f91841922bfcc369d3ea5424772b1fe3e9855717e645954b16d",
|
|
102
102
|
"pipeline/commands/multi-agent/jira/SKILL.md": "3e67461c2fd6e3dbf45340b6ee1e12bae30ebf596e476d620d1582378af75dd1",
|
|
@@ -125,11 +125,11 @@
|
|
|
125
125
|
"pipeline/commands/multi-agent/search/SKILL.md": "231f0dd266907423cc45feeadc4170852dc6fd45239e0bee3ee4e08d4d0f5958",
|
|
126
126
|
"pipeline/commands/multi-agent/security-review/SKILL.md": "dfc2fad484c81169912062391f7ad97500ef113d95741902e5e18e7dd60b6da1",
|
|
127
127
|
"pipeline/commands/multi-agent/serve/SKILL.md": "88f6f0350cb0abcd2a4ed54c12f6cfb5bf4298909bff06891fede25888ae69ec",
|
|
128
|
-
"pipeline/commands/multi-agent/setup/SKILL.md": "
|
|
128
|
+
"pipeline/commands/multi-agent/setup/SKILL.md": "9ae2238c554e297849349948bb70df2222944a9b7292554c9174b97672a53aec",
|
|
129
129
|
"pipeline/commands/multi-agent/stack/SKILL.md": "6d64e96b9a2d41d25ff077afa84300172cac9bf9dd78ec1d9fbbaf45df34f5dd",
|
|
130
130
|
"pipeline/commands/multi-agent/status/SKILL.md": "a2ed316434aca49f692aafe11f95873822b9b955558a53f4f6a9667ee32a3659",
|
|
131
131
|
"pipeline/commands/multi-agent/steer/SKILL.md": "07e738c228ba328f717f86e97e7af207df090b16433e28e613d430c3ff0aee3e",
|
|
132
|
-
"pipeline/commands/multi-agent/store-ready/SKILL.md": "
|
|
132
|
+
"pipeline/commands/multi-agent/store-ready/SKILL.md": "746d04a4766cb6bd2a8b615ac43c4fed000302a4adc0bd2a9e51f92975bbb7ad",
|
|
133
133
|
"pipeline/commands/multi-agent/sync/SKILL.md": "17049e9ef98613825b0c4d074655477f033df460c9b760728c661f6c843a7276",
|
|
134
134
|
"pipeline/commands/multi-agent/test-accessibility/SKILL.md": "d62992541303a0776ca088d5f3d5475108fd3fba5e25af04efb3ea4bbbd1fe21",
|
|
135
135
|
"pipeline/commands/multi-agent/test-dark-mode/SKILL.md": "6bfe158c94f76fc6f4d06454978d0c5cad6ec00645ab48c1d1cee15ad93ae095",
|
|
@@ -172,7 +172,7 @@
|
|
|
172
172
|
"pipeline/lib/confusables.json": "64a31eba5d1f44c6177abf6d9dfddee671201336f76c0db71e96a0d49cb4fdaa",
|
|
173
173
|
"pipeline/lib/context-link-extractor.sh": "84a154dcabf57136be17199b21d02120d70cc0ca34e8f48fe24bdda74eddda1d",
|
|
174
174
|
"pipeline/lib/count-lib.sh": "7bafe152b0ffb9ca6fb9296b7ecaaef33deb9410286b3579fefbb37796044f79",
|
|
175
|
-
"pipeline/lib/credential-inventory.sh": "
|
|
175
|
+
"pipeline/lib/credential-inventory.sh": "a32b4caecd8534c30a4f037941f3e558317fad83bd3205ceb69831074c9c3de4",
|
|
176
176
|
"pipeline/lib/credential-store-resolver.sh": "62d16fae85f02739c925bd62911d8594518ea1fe7224ac30ec8dc2dedcca7dc9",
|
|
177
177
|
"pipeline/lib/credential-store.sh": "88b09c60fd024e347c0de08c27df372b8c6ef7a54a164d85bfa7c763e850c1d2",
|
|
178
178
|
"pipeline/lib/extract-conventions.sh": "b324b7883f7d3bb296be4ac30323673de5a701ccd9102de419ec02371c40a85c",
|
|
@@ -263,7 +263,7 @@
|
|
|
263
263
|
"pipeline/multi-agent-refs/features/cost-analysis.md": "42f1b90b41ef454f29ccfd3f93c959920f0e74cbca65e140695e9a30d6d90b87",
|
|
264
264
|
"pipeline/multi-agent-refs/features/design-conformance.md": "a88ca595827cafa0c87c2facfcf9190dac69485e0596e5c198c6fc1613880452",
|
|
265
265
|
"pipeline/multi-agent-refs/features/dev-critic.md": "08e01edef04b5ac216f8f43332126966d33da7b95625e47a8a6cd8ac105b263f",
|
|
266
|
-
"pipeline/multi-agent-refs/features/doctor.md": "
|
|
266
|
+
"pipeline/multi-agent-refs/features/doctor.md": "cf26e9fe4b51a47223ea0160c7c3c9c7ea177e70ec60c379271687e42fd4f594",
|
|
267
267
|
"pipeline/multi-agent-refs/features/external-context-injection.md": "fe0373f27c3e9aae660a55a3ba9a8163df329b4d95c727d6023b6b3afaf71d66",
|
|
268
268
|
"pipeline/multi-agent-refs/features/jira-context.md": "7d14802ed9ad1747e1a06dec26f22ff9e8959e03c47d7a018af45b8274aea47c",
|
|
269
269
|
"pipeline/multi-agent-refs/features/maturity-followup.md": "e663e5bcf0b3b4d4d2a67f4516dbb9fb12520dfbdedb47a9c5f57c13a9a0633e",
|
|
@@ -297,10 +297,10 @@
|
|
|
297
297
|
"pipeline/multi-agent-refs/features/worktree-finalize.md": "628f627b94927a9c4a5b0b261fed1f0ffa42d4155390d57b5e56566a26ed8193",
|
|
298
298
|
"pipeline/multi-agent-refs/generate-issue.md": "61e762456d2748525fbbea0ee5f9dde863d75d3bb9bbece14a36f6e3c9e82b3d",
|
|
299
299
|
"pipeline/multi-agent-refs/issue-jira-triad.md": "a12f4e3b75badf8a466e0c3531a5f0e12e44a1dd7799522fb03ff11068ce391d",
|
|
300
|
-
"pipeline/multi-agent-refs/keychain.md": "
|
|
300
|
+
"pipeline/multi-agent-refs/keychain.md": "d2c6a915595f25570dfc5c24ba1d86a133003af517fa348e077da4643664e43c",
|
|
301
301
|
"pipeline/multi-agent-refs/knowledge.md": "33f6a4cc0ced930d192f32e0f7b2adf785395562f9dedd82ce939306c3d7a0e5",
|
|
302
302
|
"pipeline/multi-agent-refs/multi-repo-integration-build.md": "ff4ad08d382d1d31f5c4f3c382cb340058bbe5cb1cffbfef520500cad7b9c05c",
|
|
303
|
-
"pipeline/multi-agent-refs/outside-the-pipeline.md": "
|
|
303
|
+
"pipeline/multi-agent-refs/outside-the-pipeline.md": "f62960921b2fbebd54914cec7503bfb5e3c3024f30fb3e0ead7e08e36a8139aa",
|
|
304
304
|
"pipeline/multi-agent-refs/payload-contracts.md": "77b10f1d616c20b96c8f83185f9b507c9764fdc69eae1795bff9127ecbc6f37e",
|
|
305
305
|
"pipeline/multi-agent-refs/phases.md": "730d598b27b8df4776adece9487f51e4835dbdb5a7d33c097e272f3360cbe844",
|
|
306
306
|
"pipeline/multi-agent-refs/phases/log-format.md": "62d51e57cca8445ab40f3c0dc29615e4b5c8e4743286bf9ef0173610e81397aa",
|
|
@@ -321,8 +321,9 @@
|
|
|
321
321
|
"pipeline/multi-agent-refs/refactor/toolkit-research.md": "1ef7f36345c5a7d2f6bb8529ef39e9e00865c6ca851aec942891bc2f8a57ea2b",
|
|
322
322
|
"pipeline/multi-agent-refs/research/engine.md": "6e812c2637f563a6fa53ade6690dcc69fa819450a74405eb138883dd19cef0b2",
|
|
323
323
|
"pipeline/multi-agent-refs/rules.md": "0b272d9ee2ba4a2fde28313f3084b8caa3d26f10e78d6099547a800e6c33534a",
|
|
324
|
-
"pipeline/multi-agent-refs/setup/app-store-connect.md": "
|
|
324
|
+
"pipeline/multi-agent-refs/setup/app-store-connect.md": "6230406b14615f7a412f95542c3c10ea8f4d2681d9a39f7910c9f5f8592184bd",
|
|
325
325
|
"pipeline/multi-agent-refs/setup/firebase.md": "a82031c67993762303a7ecd222e2574fbbf8d65dcc6b17e051a8dd53a9e31474",
|
|
326
|
+
"pipeline/multi-agent-refs/setup/google-play.md": "c60117fb8b13c709da93d379064aa0d56869bfde88fc5d5737996b7c1fc02ff7",
|
|
326
327
|
"pipeline/multi-agent-refs/setup/repo-discovery.md": "06944e7b7677d998b6d169fbf5bebcac08c0f5eab808f9f1f3e5b6b2dc6a1f55",
|
|
327
328
|
"pipeline/multi-agent-refs/swiftui-guide.md": "3f86cb3e2161389da5a466793dae570d854e35354490f58249b5defbaccb1375",
|
|
328
329
|
"pipeline/multi-agent-refs/threat-model.md": "3628881538b846f94decd78e389b34b473ba6f91b6e6dcf5c927d307ed264bea",
|
|
@@ -331,7 +332,7 @@
|
|
|
331
332
|
"pipeline/multi-agent-refs/web-guide.md": "714cba0d92fa45bf71fbff21bb2f09c88534ebf785b3a2ea96d18037e2e7f7f9",
|
|
332
333
|
"pipeline/multi-agent-refs/website-deploy.md": "ce819c8b1ef8e8ec3257611379aaf0ab4678e08e0b58bd88c936e98cb8ead609",
|
|
333
334
|
"pipeline/multi-agent-refs/wiki-capture.md": "bfd33cf097b966e61f80c9235d98c8139e4c9ede2e47c14b920a5b910cdc76d8",
|
|
334
|
-
"pipeline/preferences-template.json": "
|
|
335
|
+
"pipeline/preferences-template.json": "8c74c0fa9f182a6c474aa7d4d2cfe6d67635ec0917c847f19ddae3095e6af944",
|
|
335
336
|
"pipeline/rules/app-store-guidelines.md": "cdfa4f8a2e0e642460bb72517f9f430638d6f09eb4a37898747cb8d55df03405",
|
|
336
337
|
"pipeline/rules/code-review.md": "b18eec5cec31710fe76cdae6f03b53e7403d4f0406274691ab38a4771505a1c5",
|
|
337
338
|
"pipeline/rules/code-style.md": "cd7d8fa872d1d640d143a573a0bdeeb7a9095f62a4d69741a11b4f0cee9d5a48",
|
|
@@ -390,7 +391,7 @@
|
|
|
390
391
|
"pipeline/schemas/plan-todos.schema.json": "f1dcf8df338b29bbc1d874addd3408c0841a5f869c0b6075efd9242e3e8552d6",
|
|
391
392
|
"pipeline/schemas/planning-output.schema.json": "bc6eda32ecd435cf84d846078f9d38347f8f741f8a427cff15913dd6c380d4b8",
|
|
392
393
|
"pipeline/schemas/pr-request.schema.json": "ae75c4856349d62834802b1189af516bb6fb3d36646831b7ff2fa61d938afcd0",
|
|
393
|
-
"pipeline/schemas/prefs.schema.json": "
|
|
394
|
+
"pipeline/schemas/prefs.schema.json": "5cf90665e47381279202e15806ad19026c507c4876b4028de5c87bc6187845d2",
|
|
394
395
|
"pipeline/schemas/repo-profile.schema.json": "1a74ef8330da9a26a5a70955f6f9cbb20eda54a8615efaf86c7993d420a7f04e",
|
|
395
396
|
"pipeline/schemas/research-output.schema.json": "54e3ba1b04fdc20fbaa84333b943a8ab95d1395c7b0e0aedc67929184cb49523",
|
|
396
397
|
"pipeline/schemas/review-file-exclusions.json": "2e8c44b45d21d2c82fc95aa2bf76ad3fbf2d5c68180c7b2ebf89c4a926688d77",
|
|
@@ -480,7 +481,7 @@
|
|
|
480
481
|
"pipeline/scripts/crush-json.mjs": "303382670f8f170c8c6710202853a2de2915625813cd157185f9be4e2b27258e",
|
|
481
482
|
"pipeline/scripts/diff-explain.mjs": "194d0635639607cb1af3de064453162e01c0d59dc0c2e187d21d45bae3bc559c",
|
|
482
483
|
"pipeline/scripts/diff-risk-score.mjs": "b3e8da42fea1258162e40f4eb7809074831339b7563874527f7e825f7aa795ca",
|
|
483
|
-
"pipeline/scripts/doctor.mjs": "
|
|
484
|
+
"pipeline/scripts/doctor.mjs": "a832682b5afb5641fbae180aa9f1cf8a0678d8c8daded452b86b9d717e049b19",
|
|
484
485
|
"pipeline/scripts/evidence-gate.mjs": "347a8d3fa1d17d996de345585c216bd7071f4c1d687999daf6e48881720ea5df",
|
|
485
486
|
"pipeline/scripts/feedback-send.mjs": "d3ed66e9dacdfb4b5eacf1b244bf66752304fb4fcb144531441b458f3ab806be",
|
|
486
487
|
"pipeline/scripts/finding-fingerprint.mjs": "fa12ab10701db5d2bfff014e41d1cd4c0b2b772aee5fc69205de14b2761b0c83",
|
|
@@ -534,9 +535,10 @@
|
|
|
534
535
|
"pipeline/scripts/plan-critique-gate.mjs": "b139394e5f16d11e4997d0bb0b08529f439dbd7fad39781ef4c2475247d8fa97",
|
|
535
536
|
"pipeline/scripts/plugin-refresh.sh": "687a33199ad963616ab537e32210ec8c967e76ecc42f494ee8a1dc9fe947fc30",
|
|
536
537
|
"pipeline/scripts/pr-request.mjs": "e6f4ded2366c6599bb345b3011ecc771e13b8a1561afa4c9a50bca4edff17456",
|
|
537
|
-
"pipeline/scripts/pre-commit-check.sh": "
|
|
538
|
+
"pipeline/scripts/pre-commit-check.sh": "3692ef40b08968e15e8a4c7b873f1e9fd264f4809976cb616063782f2ef993b1",
|
|
538
539
|
"pipeline/scripts/pre-push-check.sh": "e449aff7f0336d7d624eff4c6221f56d8621ba9d010669601755e57fd4ee02c7",
|
|
539
540
|
"pipeline/scripts/probe-evidence-capability.sh": "ac74252eed6b773fdbc7ec475a63606925f1ba7b5e7c6f911329f46fd920eae7",
|
|
541
|
+
"pipeline/scripts/probe-store-key.mjs": "b46dfcf444c95d0bb61de36823314945dacaaacb8f35841d153dcfcde8e4df1a",
|
|
540
542
|
"pipeline/scripts/prune-logs.sh": "c5587b33104c7253e07be8cce8249b50014c52dfdf232de637811ffdd88e95e4",
|
|
541
543
|
"pipeline/scripts/purge.sh": "95c60b272ae47209893dba9b17528538592bb5636da47940a02734cd9b4f0ce5",
|
|
542
544
|
"pipeline/scripts/record-phase.mjs": "041dc262e54f38b66299f45c44db7918812e599a773f5a3dc78cfd09ab5e155e",
|
|
@@ -606,12 +608,13 @@
|
|
|
606
608
|
"pipeline/scripts/worktree-prepare.sh": "9391c828375b127f77c86e3c830dbbaf355a61464c6437319969f2f1eecc72b1",
|
|
607
609
|
"pipeline/scripts/worktrees.mjs": "90dfd09b70fffe9b56c331a4ae2692cc248f4898f4ee6aee4239ef0b20888a90",
|
|
608
610
|
"pipeline/scripts/write-state.mjs": "e1198bf970eace07d3eff22b394808a526e473df65d3d58aa2d5a12cfdac8b49",
|
|
609
|
-
"pipeline/
|
|
611
|
+
"pipeline/scripts/write-store-config.mjs": "b994a061f6febb2ca3d396074d8b51d2c1c1f991d3072d321703380da3639a56",
|
|
612
|
+
"pipeline/skills/.skill-manifest.json": "d387288c7de2f39f0b58a95eae996e30639b04187f3f7b3cbddaa97bab78034e",
|
|
610
613
|
"pipeline/skills/.skills-index.json": "042b1090f3e2ca310c6ce70d1bb304e8c7f96bd73133e504b95d83801608e470",
|
|
611
614
|
"pipeline/skills/shared/README.md": "a144fb39993470b6379d9660e0ee0371bdc858aee3d7c1b375cb6aba03d046db",
|
|
612
615
|
"pipeline/skills/shared/core/apple-archive-compliance/SKILL.md": "7239fef717ea45b79276bfcc2c3903acd57950b6e00dd6a2a66399c4b09cbd51",
|
|
613
616
|
"pipeline/skills/shared/core/apple-archive-compliance/references/rules.yml": "25129ce6d416242ac04c4032f7561e0c2761ab8bbadf08d9c9f49b573a663389",
|
|
614
|
-
"pipeline/skills/shared/core/google-play-compliance/SKILL.md": "
|
|
617
|
+
"pipeline/skills/shared/core/google-play-compliance/SKILL.md": "3089e8c5f99c1ec7c1358394c398335ccb5ebc20ca05d60d870127da4592de34",
|
|
615
618
|
"pipeline/skills/shared/core/google-play-compliance/references/rules.yml": "21fc058762e7341a8917442f1ab4dc50def59aa3145eea120c474b0d0de6a5c1",
|
|
616
619
|
"pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md": "8c5916a32156bc4c75f97cac1b57dbfe9e49f16027178128d12e50f6e326ae12",
|
|
617
620
|
"pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md": "9e405b0f7403c72b00a7ddf1e4b8518cfe37feb31d91d8e5ba70f0341efa5d0c",
|
|
@@ -660,11 +663,11 @@
|
|
|
660
663
|
"pipeline/skills/shared/core/multi-agent-search/SKILL.md": "5f5177cd28cbb13583441fb98402cfa251c78e69de693540584e9a1dcc7692cb",
|
|
661
664
|
"pipeline/skills/shared/core/multi-agent-security-review/SKILL.md": "3c483d5942f2c2b81c0537d4db0b36804c13cabd66fd7fae2972d07a8f239f69",
|
|
662
665
|
"pipeline/skills/shared/core/multi-agent-serve/SKILL.md": "01853f3a4726ef4374177fb0c3bd753520435fc7ccc263f3ef2399352cba8f04",
|
|
663
|
-
"pipeline/skills/shared/core/multi-agent-setup/SKILL.md": "
|
|
666
|
+
"pipeline/skills/shared/core/multi-agent-setup/SKILL.md": "f73388e0a64ba8a1606e3364441b078f3df6f7e99e589fb9bc8b93269a2733b2",
|
|
664
667
|
"pipeline/skills/shared/core/multi-agent-stack/SKILL.md": "ac964cd00dd6ed06512530489d867efbc51d7d7614265f9aa022679325d5defe",
|
|
665
668
|
"pipeline/skills/shared/core/multi-agent-status/SKILL.md": "444c3773b52e6786e40bc67c8833ea6aecadbcd4459b01127b4aff152157040a",
|
|
666
669
|
"pipeline/skills/shared/core/multi-agent-steer/SKILL.md": "20f332bd2fe2745da5341f8d8187211fc47c06b4b5f5031e217affee0282ddb5",
|
|
667
|
-
"pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md": "
|
|
670
|
+
"pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md": "514cb5b80f9584da035f6ac23681b42c765fdced25d704f8e36b6cc079b8093d",
|
|
668
671
|
"pipeline/skills/shared/core/multi-agent-sync/SKILL.md": "a56f1148343024ad53cbe4562c3fd00379ead33e189a0b370c09d6554e1b60b3",
|
|
669
672
|
"pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md": "78305bd6c591836badb903c18a6ac2e619fcec51a7a08589f8a1281c4fdd90ee",
|
|
670
673
|
"pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md": "f24c6c5ee9c8f7221527a9a809ca24ee86a2225a0bac48323449660af215c99f",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "20.
|
|
3
|
+
"version": "20.11.0",
|
|
4
4
|
"description": "6-phase AI development pipeline with full orchestration on Claude Code, Copilot CLI and Codex CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -86,7 +86,7 @@ Lib scripts (`~/.claude/lib/`):
|
|
|
86
86
|
| `create-jira ["desc"] [figma-url] [swagger-url]` | Create a standards-compliant Jira issue: asks the type (**Task** / **Bug** / **Story**), mines the project's recent same-type issues for conventions (summary format, labels, priority, test-scenario style), detects the active sprint, drafts from a standard template with auto-sizing sections (Design Reference / API Contract / Screenshots appear only when their source is given), asks about unknown fields, then full draft preview + explicit approval before create. No worktree, no commits. |
|
|
87
87
|
| `test` or `test [args]` | UI Bug Hunter - screenshot + tap + analyze on booted simulator via MCP (read `$HOME/.claude/commands/sim-test.md`). `/multi-agent:test` also resolves here via the `commands/multi-agent/test/SKILL.md` delegate. |
|
|
88
88
|
| `test-dark-mode` · `test-accessibility` · `test-dynamic-type` · `test-screenshots [locale]` | Fixed-scenario aliases for the four parameterless / single-parameter `test` scenarios, so the tag autocompletes instead of having to be quoted. Each delegates to the same `sim-test.md` with its scenario pinned; behaviour is identical to the quoted form, which is not deprecated. |
|
|
89
|
-
| `store-ready [repo] [--archive=\|--ipa=\|--aab=\|--apk=] [--skip-sweep]` | Pre-submission store readiness for a built **package**, iOS and Android, local-only. Three symmetric gates per platform - static package audit, the store's own validator, policy review vs repo source - plus the running-app sweep as Step A. A skipped gate is never folded into the pass count, and an Android run clears at most 2 of 3 because Play's authoritative check is server-side only. Validates only, never
|
|
89
|
+
| `store-ready [repo] [--archive=\|--ipa=\|--aab=\|--apk=] [--skip-sweep]` | Pre-submission store readiness for a built **package**, iOS and Android, local-only. Three symmetric gates per platform - static package audit, the store's own validator, policy review vs repo source - plus the running-app sweep as Step A. A skipped gate is never folded into the pass count, and an Android run clears at most 2 of 3 unless Google Play is onboarded, because Play's authoritative check is server-side only (with it, Gate 2 validates in a throwaway edit that is deleted). Validates only, never ships a build. `testflight-validation` is the iOS-pinned alias; `test "store-ready"` hands off here. |
|
|
90
90
|
| `manual-test [#id]` | Phase 5 standalone Manual Test - checks out the task branch, prints Xcode / SourceTree hints, waits for user verdict (`ok` / `fix: ...`). |
|
|
91
91
|
| `design-check [scope]` | Mock-mode vs Figma design audit (iOS / Android, local-only). Pick repo + module → mock-support feasibility gate (halts if unsupported) → **scenario inventory** (every launch arg / scenario case / scenario code / fixture / deep link becomes a countable target with file+line evidence) → scope resolve (empty = module, screen, `screen@variant`, target id, Figma URLs, `--resume`) → worktree Debug build + mock launch → drive EACH target by its own driver, capturing tap-reachable sub-states with it → per-variant pixel + px-spacing + typography + color compare → report (side-by-side + annotated overlay + stacked findings + fix prompt) exported to `~/DesignChecks/` as HTML + PDF (+ Confluence if enabled). **Coverage gate**: a target is audited or skipped with a concrete reason, else the run is reported INCOMPLETE with the missing ids. No commits, no CI. |
|
|
92
92
|
| `stack [ios\|android\|backend\|mobile\|all]` | Swap skills for next conversation. No arg = show current stack. |
|
|
@@ -136,7 +136,7 @@ Post-Hoc & Side-Channel:
|
|
|
136
136
|
/multi-agent:doctor Would a run work here? Layout, prefs, credentials, hooks; exit code is the verdict
|
|
137
137
|
/multi-agent:refactor Best practices + bug hunt + upstream drift + toolkit MCP research -> one plan, approval, dev + sync
|
|
138
138
|
/multi-agent:refactor backlog Decide the friction already recorded about the pipeline itself, nothing re-derived
|
|
139
|
-
/multi-agent:store-ready [repo] [flags] Pre-submission store readiness, iOS + Android, local-only; a skipped gate is never a pass; never
|
|
139
|
+
/multi-agent:store-ready [repo] [flags] Pre-submission store readiness, iOS + Android, local-only; a skipped gate is never a pass; never ships a build.
|
|
140
140
|
/multi-agent:testflight-validation [repo] [--ipa=|--archive=] iOS-pinned alias of :store-ready. Same three gates, one implementation.
|
|
141
141
|
/multi-agent:ios-coding-standard [module] Audit an iOS module against the 99-rule coding-standard registry -> remediation
|
|
142
142
|
plan + one-page onboarding summary -> hand off to /multi-agent. Read-only, never edits source.
|
|
@@ -409,7 +409,7 @@ Post-Hoc & Side-Channel:
|
|
|
409
409
|
/multi-agent:doctor Burada bir koşu çalışır mı? Yerleşim, prefs, kimlik bilgileri, hook'lar; çıkış kodu kararı verir
|
|
410
410
|
/multi-agent:refactor Uyarlanmış best-practice + bug avı + upstream-drift + multi-agent-toolkit MCP araştırması -> tek plan, onay, dev + sync
|
|
411
411
|
/multi-agent:refactor backlog Pipeline'ın kendisi hakkında kaydedilmiş sürtünmeyi karara bağlar, sıfırdan türetmez
|
|
412
|
-
/multi-agent:store-ready [repo] [flags] Yükleme öncesi store hazırlığı, iOS + Android, yalnızca lokal; atlanan kapı asla pass sayılmaz; asla
|
|
412
|
+
/multi-agent:store-ready [repo] [flags] Yükleme öncesi store hazırlığı, iOS + Android, yalnızca lokal; atlanan kapı asla pass sayılmaz; build'i asla yayına göndermez.
|
|
413
413
|
/multi-agent:testflight-validation [repo] [--ipa=|--archive=] :store-ready'nin iOS alias'ı. Aynı 3 kapı, tek implementasyon.
|
|
414
414
|
/multi-agent:ios-coding-standard [modül] Bir iOS modülünü 99 kurallık kodlama-standardı registry'sine göre denetler -> düzeltme
|
|
415
415
|
planı + tek sayfalık onboarding özeti -> /multi-agent'a devreder. Read-only, kaynağı hiç düzenlemez.
|
|
@@ -117,12 +117,14 @@ Standard key names - the ones to use when creating a NEW key - live in `$HOM
|
|
|
117
117
|
| `jenkins` | `jenkins` |
|
|
118
118
|
| `appstore_connect_key_id` | (`appstore` or `asc` or `app_store`) + (`key` or `keyid`) |
|
|
119
119
|
| `appstore_connect_issuer_id` | (`appstore` or `asc` or `app_store`) + `issuer` |
|
|
120
|
+
| `appstore_connect_private_key` | (`appstore` or `asc` or `app_store`) + (`private` or `p8`) |
|
|
120
121
|
| `appstore_connect_apple_id` | (`appstore` or `asc`) + (`apple` or `account` or `user`) |
|
|
121
122
|
| `appstore_connect_password_item` | (`appstore` or `asc` or `altool`) + (`password` or `app_specific`) |
|
|
123
|
+
| `google_play` | (`googleplay` or `google_play` or `play_console` or `play`) + (`service` or `account` or `access` or `json` or `console`), NOT `firebase` |
|
|
122
124
|
|
|
123
125
|
> Multi-agent setup onboards **both** Figma tokens because the pipeline's 3-tier Figma access chain (see `$HOME/.claude/rules/figma-pipeline.md`) uses them in priority order: Tier 1 = MCP (`figma_mcp`), Tier 2 = REST PAT (`figma`), Tier 3 = user screenshot fallback. Missing either token forces a downshift; missing both leaves Tier 3 as the only path. The Tier 2 logical key is `figma`, not `figma_pat`: `figma_pat` is the pre-v13.6 name that `migrate-prefs.mjs` consolidates away, and writing a new mapping under it means the next migration deletes it.
|
|
124
126
|
|
|
125
|
-
> The
|
|
127
|
+
> The five App Store Connect entries are **iOS-only and optional** - skipping them all reports Gate 2 of `/multi-agent:store-ready` as `SKIPPED`, never as a pass. Two hold identifiers, one an email, one a keychain ITEM NAME, and `appstore_connect_private_key` the `.p8` itself; all go through the mapping layer. `google_play` is the Android-only counterpart (Step 3d). Tiers and mechanics: Step 3b and `$HOME/.claude/multi-agent-refs/setup/app-store-connect.md`.
|
|
126
128
|
|
|
127
129
|
> The `firebase` entry is **optional and any-platform**. Discovery maps a stored service-account JSON like any other credential but cannot see what decides whether Crashlytics is readable: a fresh `firebase-adminsdk-*` account authenticates perfectly and holds no Crashlytics role. Step 3c measures the tier rather than assuming it.
|
|
128
130
|
|
|
@@ -278,6 +280,7 @@ The Step 2 discovery summary is never the end of setup. Immediately after showin
|
|
|
278
280
|
9. `firebase`
|
|
279
281
|
10. `jenkins`
|
|
280
282
|
11. App Store Connect block (Step 3b; only when the target repo is iOS)
|
|
283
|
+
12. Google Play block (Step 3d; only when the target repo is Android)
|
|
281
284
|
|
|
282
285
|
Loop rules:
|
|
283
286
|
|
|
@@ -355,11 +358,7 @@ For JSON file (Firebase) - same clipboard flow, JSON content never lands in ar
|
|
|
355
358
|
Press Enter when ready...
|
|
356
359
|
```
|
|
357
360
|
|
|
358
|
-
|
|
359
|
-
```bash
|
|
360
|
-
pbpaste | ~/.claude/lib/credential-store.sh set "<KEY_NAME>" -
|
|
361
|
-
pbcopy < /dev/null # clear clipboard
|
|
362
|
-
```
|
|
361
|
+
The pipeline then runs the same `pbpaste | ... set "<KEY_NAME>" -` and `pbcopy < /dev/null` as above. A key that arrives as a file (the App Store Connect `.p8`, the Google Play JSON) skips the clipboard: `set <key> - < <file>`.
|
|
363
362
|
|
|
364
363
|
**Firebase repeats per project.** Teams own several Firebase projects (legacy plus redesign, staging plus prod), each with its own key, and a crash URL from the second one used to fail the `project_id` check as if it were misconfigured. After each saved key, read `project_id` from the stored JSON (never ask) and offer another round: `Saved: <project_id>. Add another Firebase project? [y/N]`.
|
|
365
364
|
|
|
@@ -423,12 +422,16 @@ This builds `platformIdentityRouting` incrementally - no separate Step 7 neede
|
|
|
423
422
|
|
|
424
423
|
### Step 3b - App Store Connect onboarding (iOS only, optional)
|
|
425
424
|
|
|
426
|
-
Runs inside Step 3
|
|
425
|
+
Runs inside Step 3. Every part of the API key lives in the Keychain, the `.p8` included: ask for the `.p8` as a path, validate it BEFORE saving with `node "$HOME/.claude/scripts/probe-store-key.mjs" --asc ...` (exit 0 only), map `appstore_connect_private_key`, store it from the file with `credential-store.sh set appstore_connect_private_key - < <AuthKey_<keyId>.p8>`, run `node "$HOME/.claude/scripts/write-store-config.mjs"`, then offer (picker, default keep) to delete the file. `store_asc_*` and `ios_testflight_validate` then read the key from the Keychain. The five entries, the tier picker and the probes: `$HOME/.claude/multi-agent-refs/setup/app-store-connect.md`. On Skip, nothing is written.
|
|
427
426
|
|
|
428
427
|
### Step 3c - Firebase / Crashlytics onboarding (optional)
|
|
429
428
|
|
|
430
429
|
Runs inside Step 3. Measure first - `bash "$HOME/.claude/lib/fetch-crashlytics.sh" --probe` answers `tier-1-ready` / `tier-1-no-grant` / `malformed` / `unreachable` - then ask by that answer, never blind. Store the JSON as issued; never base64 it. Skip writes nothing. Then offer appId discovery: `bash "$HOME/.claude/scripts/firebase-app-discovery.sh" <repo> --json` reads the pairs the repo already carries, for `firebase.accounts[].apps[]` - it saves a round trip per run; skipping costs nothing. The picker, both tiers, the role-request wording and the v1alpha caveat: `$HOME/.claude/multi-agent-refs/setup/firebase.md`.
|
|
431
430
|
|
|
431
|
+
### Step 3d - Google Play onboarding (Android only, optional)
|
|
432
|
+
|
|
433
|
+
Runs inside Step 3, only when the target repo is Android. One entry, `google_play`: the service-account JSON the toolkit's `store_play_*` tools use, which lets `/multi-agent:store-ready` run Android Gate 2. Ask for the JSON's path, validate BEFORE saving with `node "$HOME/.claude/scripts/probe-store-key.mjs" --play --service-account <path>`, map `google_play`, then `credential-store.sh set google_play - < <path>` and `write-store-config.mjs`. Account prerequisites, the picker and the probe hints: `$HOME/.claude/multi-agent-refs/setup/google-play.md`. Skip writes nothing.
|
|
434
|
+
|
|
432
435
|
### Step 3.5 - Host Prompt (embedded in Token Save Flow)
|
|
433
436
|
|
|
434
437
|
**Not a standalone step** - runs inline at the end of the Token Save Flow whenever the saved token belongs to a **hosted service** (Jira, Confluence, Bitbucket, Fortify, Graylog) AND the host is not yet in `prefs.global.hosts`. Firebase tokens skip this step - Crashlytics is always on Google's fixed domains and `project_id` is embedded in the service-account JSON.
|
|
@@ -704,18 +707,14 @@ Standard key names are a convention for NEW tokens; discovery may find existing
|
|
|
704
707
|
All tokens go through `~/.claude/lib/credential-store.sh`, which auto-delegates to the deterministic Python helper (`~/.claude/scripts/keychain.py`). The Python path writes both `-l` (label) and `-s` (service) attributes so existing manually-added entries with either convention remain findable.
|
|
705
708
|
|
|
706
709
|
```bash
|
|
707
|
-
# PAT / API Key (from clipboard)
|
|
710
|
+
# PAT / API Key / JSON contents (from clipboard)
|
|
708
711
|
pbpaste | ~/.claude/lib/credential-store.sh set "<SERVICE_NAME>" -
|
|
709
712
|
pbcopy < /dev/null # clear clipboard
|
|
710
713
|
|
|
711
714
|
# Non-secret value typed inline (a secret on argv is visible to ps and lands in shell history)
|
|
712
715
|
~/.claude/lib/credential-store.sh set "<SERVICE_NAME>" "<VALUE>"
|
|
713
716
|
|
|
714
|
-
#
|
|
715
|
-
pbpaste | ~/.claude/lib/credential-store.sh set "<SERVICE_NAME>" -
|
|
716
|
-
pbcopy < /dev/null
|
|
717
|
-
|
|
718
|
-
# JSON file from disk (fallback when clipboard backend unavailable)
|
|
717
|
+
# Key file from disk (the .p8, the Google Play JSON; or when the clipboard is unavailable)
|
|
719
718
|
~/.claude/lib/credential-store.sh set "<SERVICE_NAME>" - < /path/to/file.json
|
|
720
719
|
|
|
721
720
|
# Read - a JSON value comes back exactly as it was stored, newlines included
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
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
|
|
3
|
-
description-tr: "Üretilmiş paketin yükleme öncesi store hazırlığı, iOS + Android, yalnızca lokal. Platform başına üç simetrik kapı: statik paket denetimi, store'un kendi doğrulayıcısı, ve kaynağa karşı politika incelemesi. Kapı başına ayrı verdict, atlanan kapı asla pass sayılmaz. Sadece doğrular, asla
|
|
2
|
+
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 ships a build. 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."
|
|
3
|
+
description-tr: "Üretilmiş paketin yükleme öncesi store hazırlığı, iOS + Android, yalnızca lokal. Platform başına üç simetrik kapı: statik paket denetimi, store'un kendi doğrulayıcısı, ve kaynağa karşı politika incelemesi. Kapı başına ayrı verdict, atlanan kapı asla pass sayılmaz. Sadece doğrular, build'i asla yayına göndermez."
|
|
4
4
|
argument-hint: "[repo] - empty = pick; repo name or path; --ipa= | --archive= | --aab= | --apk=; --skip-sweep; --resume"
|
|
5
5
|
parameters: [{"name":"repo","kind":"text"},{"name":"--ipa","kind":"path"},{"name":"--archive","kind":"path"},{"name":"--aab","kind":"path"},{"name":"--apk","kind":"path"},{"name":"--skip-sweep","kind":"flag"},{"name":"--resume","kind":"flag"}]
|
|
6
6
|
gui: form
|
|
7
7
|
destructive: false
|
|
8
8
|
confirm: none
|
|
9
|
-
allowed-tools: Agent, Bash, Read, Write, Edit, Glob, Grep, TaskCreate, TaskUpdate, AskUserQuestion, Skill, mcp__multi-agent-toolkit__ios_app_store_audit, mcp__multi-agent-toolkit__ios_export_ipa, mcp__multi-agent-toolkit__ios_testflight_validate, mcp__multi-agent-toolkit__ios_xcodebuild, mcp__multi-agent-toolkit__ios_xcresult, mcp__multi-agent-toolkit__android_apk_audit, mcp__multi-agent-toolkit__ios_screenshot, mcp__multi-agent-toolkit__ios_get_ui_tree, mcp__multi-agent-toolkit__ios_set_appearance, mcp__multi-agent-toolkit__ios_set_content_size, mcp__multi-agent-toolkit__android_screenshot, mcp__multi-agent-toolkit__android_get_ui_tree, mcp__multi-agent-toolkit__android_set_dark_mode, mcp__multi-agent-toolkit__android_set_font_scale
|
|
9
|
+
allowed-tools: Agent, Bash, Read, Write, Edit, Glob, Grep, TaskCreate, TaskUpdate, AskUserQuestion, Skill, mcp__multi-agent-toolkit__ios_app_store_audit, mcp__multi-agent-toolkit__ios_export_ipa, mcp__multi-agent-toolkit__ios_testflight_validate, mcp__multi-agent-toolkit__ios_xcodebuild, mcp__multi-agent-toolkit__ios_xcresult, mcp__multi-agent-toolkit__android_apk_audit, mcp__multi-agent-toolkit__store_status, mcp__multi-agent-toolkit__store_asc_apps, mcp__multi-agent-toolkit__store_asc_next_build_number, mcp__multi-agent-toolkit__store_play_validate_bundle, mcp__multi-agent-toolkit__ios_screenshot, mcp__multi-agent-toolkit__ios_get_ui_tree, mcp__multi-agent-toolkit__ios_set_appearance, mcp__multi-agent-toolkit__ios_set_content_size, mcp__multi-agent-toolkit__android_screenshot, mcp__multi-agent-toolkit__android_get_ui_tree, mcp__multi-agent-toolkit__android_set_dark_mode, mcp__multi-agent-toolkit__android_set_font_scale
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# /multi-agent:store-ready - pre-submission validation, iOS + Android
|
|
@@ -18,8 +18,10 @@ back after you do.
|
|
|
18
18
|
A worktree, when one is needed, exists only to archive without touching your
|
|
19
19
|
working tree.
|
|
20
20
|
|
|
21
|
-
**It never
|
|
22
|
-
never commits a Play edit
|
|
21
|
+
**It never ships.** iOS runs `--validate-app`, never `--upload-app`. Android
|
|
22
|
+
never commits a Play edit: when Google Play is onboarded, Gate 2 uploads the
|
|
23
|
+
bundle into a throwaway edit that is validated and deleted, and only after the
|
|
24
|
+
user approves that plan. A validation run must not be able to ship a build by
|
|
23
25
|
accident.
|
|
24
26
|
|
|
25
27
|
**Input**: $ARGUMENTS
|
|
@@ -42,13 +44,19 @@ a package the store itself refuses, and a policy a human enforces.
|
|
|
42
44
|
| Gate | iOS | Android |
|
|
43
45
|
|---|---|---|
|
|
44
46
|
| 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) |
|
|
45
|
-
| 2 Authoritative | `ios_testflight_validate({ipa_path, platform: "ios", <credentials>})` → `xcrun altool --validate-app
|
|
47
|
+
| 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 |
|
|
46
48
|
| 3 Policy | `ai-ios-toolkit:app-store-review` skill vs repo source | `ai-android-toolkit:play-store-review` skill vs repo source |
|
|
47
49
|
|
|
48
50
|
Gate 2's asymmetry is real and is reported as an asymmetry, not smoothed over. On
|
|
49
51
|
iOS it is the only gate that catches a version+build pair already used - the most
|
|
50
|
-
common wasted upload. On Android nothing local reproduces it
|
|
51
|
-
|
|
52
|
+
common wasted upload. On Android nothing local reproduces it: Gate 2 runs only when
|
|
53
|
+
Google Play is onboarded and the user approves the upload into a throwaway edit.
|
|
54
|
+
Without both, an Android run clears at most 2 of 3 gates and must never print
|
|
55
|
+
`passed`.
|
|
56
|
+
|
|
57
|
+
The `store_*` tools need `@mmerterden/multi-agent-toolkit-mcp` ≥ v3.17.0. On an
|
|
58
|
+
older server they are absent, and each branch below that uses one falls back to
|
|
59
|
+
the behaviour it has without the credential.
|
|
52
60
|
|
|
53
61
|
## Step 0 - parse input, detect platform
|
|
54
62
|
|
|
@@ -123,7 +131,7 @@ Then resolve credentials, and **state which tier is active in the report**:
|
|
|
123
131
|
|
|
124
132
|
| Tier | Source | Effect |
|
|
125
133
|
|---|---|---|
|
|
126
|
-
| 1 | ASC API key - key id
|
|
134
|
+
| 1 | ASC API key - key id, issuer id and `.p8` in the Keychain (`appstore_connect_key_id`, `appstore_connect_issuer_id`, `appstore_connect_private_key`), read by the toolkit through the store reference file. `store_status` reports it as `appStoreConnect.configured` | Gate 2 runs; call `ios_testflight_validate` with neither `api_key_id` nor `apple_id` so it uses that key |
|
|
127
135
|
| 2 | Apple ID + app-specific password, referenced as a keychain item | Gate 2 runs |
|
|
128
136
|
| 3 | neither | **Gate 2 reports `SKIPPED`, and the run says so in the verdict line** |
|
|
129
137
|
|
|
@@ -138,9 +146,17 @@ command -v aapt2 >/dev/null || echo "MISSING: aapt2 (Android SDK build-tool
|
|
|
138
146
|
command -v apksigner >/dev/null || echo "MISSING: apksigner (Android SDK build-tools)"
|
|
139
147
|
```
|
|
140
148
|
|
|
141
|
-
|
|
142
|
-
`
|
|
143
|
-
|
|
149
|
+
Then resolve whether Gate 2 can run. Call `store_status` (no probe) and read
|
|
150
|
+
`googlePlay.configured`:
|
|
151
|
+
|
|
152
|
+
| State | Gate 2 |
|
|
153
|
+
|---|---|
|
|
154
|
+
| `googlePlay.configured: true` and `MULTI_AGENT_UNATTENDED` unset | runs `store_play_validate_bundle`, after the user approves the upload (Step 5) |
|
|
155
|
+
| `googlePlay.configured: true` and `MULTI_AGENT_UNATTENDED=1` | `SKIPPED (no local Play validator)`, reason: the toolkit refuses the upload in an unattended run |
|
|
156
|
+
| not configured, or no `store_status` tool | `SKIPPED (no local Play validator)`, reason: `Google Play not onboarded` (`/multi-agent:setup` Step 3d) |
|
|
157
|
+
|
|
158
|
+
Say which one it is: a user without the credential will go looking for one, and
|
|
159
|
+
one with it needs to know why Gate 2 did not run.
|
|
144
160
|
|
|
145
161
|
Credentials come from `/multi-agent:setup`; never prompt for a secret value in
|
|
146
162
|
chat.
|
|
@@ -254,10 +270,34 @@ Render the verdict exactly as returned:
|
|
|
254
270
|
Gate 2 is the only gate that catches a build number already used - so when it
|
|
255
271
|
fails on that, say so plainly and name the next free build number.
|
|
256
272
|
|
|
257
|
-
**
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
273
|
+
**Build number** (App Store Connect onboarded, `store_status` reports
|
|
274
|
+
`appStoreConnect.configured`): find the app with `store_asc_apps` by the archive's
|
|
275
|
+
bundle id, then `store_asc_next_build_number({app_id, version: <CFBundleShortVersionString>})`.
|
|
276
|
+
Report the archive's `CFBundleVersion` as `already used` (not above the highest
|
|
277
|
+
uploaded one, with the suggested next) or `free`. Read-only; it never changes the
|
|
278
|
+
project. Without the credential, skip this line and say why.
|
|
279
|
+
|
|
280
|
+
**Android**, by the state resolved in Step 2:
|
|
281
|
+
|
|
282
|
+
- **Google Play onboarded, attended run.** Call
|
|
283
|
+
`store_play_validate_bundle({package_name: <applicationId>, bundle_path: <.aab>})`
|
|
284
|
+
without `confirm`. It returns the plan only: it would open an edit, upload the
|
|
285
|
+
bundle, validate the edit, then delete it, committing nothing and changing no
|
|
286
|
+
track. Show that plan to the user and ask (picker, `question` / `description` in
|
|
287
|
+
`outputLanguage`, `header` `Play check`, labels `Validate on Play` / `Skip`).
|
|
288
|
+
Only on **Validate on Play**, call it again with `confirm: true`. Render the
|
|
289
|
+
verdict from `valid`: `true` → `PASS`, `false` → `FAIL` with the returned
|
|
290
|
+
`error`. On **Skip**, report `SKIPPED (no local Play validator)` with the reason
|
|
291
|
+
`user declined the upload`.
|
|
292
|
+
- **Otherwise** (unattended, or not onboarded) do not call the tool: report
|
|
293
|
+
`SKIPPED (no local Play validator)` with the reason from the Step 2 table.
|
|
294
|
+
|
|
295
|
+
`bundletool validate` is Gate 1 in every case; reporting it here would fake a
|
|
296
|
+
cleared gate.
|
|
297
|
+
|
|
298
|
+
**Open question, not a fact:** whether an upload into a deleted edit consumes its
|
|
299
|
+
`versionCode` is not verified. After a Gate 2 run that uploaded, say so in the
|
|
300
|
+
report, so the user decides whether to re-use that `versionCode`.
|
|
261
301
|
|
|
262
302
|
## Step 6 - Gate 3, policy review
|
|
263
303
|
|
|
@@ -320,7 +360,10 @@ Advisory
|
|
|
320
360
|
...
|
|
321
361
|
|
|
322
362
|
Not run
|
|
323
|
-
Gate 2: no local Play validator - authoritative check is server-side only
|
|
363
|
+
Gate 2: no local Play validator - Google Play not onboarded; the authoritative check is server-side only
|
|
364
|
+
|
|
365
|
+
Open questions
|
|
366
|
+
Gate 2 (Android): whether the throwaway-edit upload consumed versionCode <n> is not verified
|
|
324
367
|
|
|
325
368
|
Before rollout (human inputs, not verified)
|
|
326
369
|
Phased rollout: <1% -> 10% -> 50% -> 100% | full>
|
|
@@ -332,7 +375,8 @@ Before rollout (human inputs, not verified)
|
|
|
332
375
|
Rules for the report:
|
|
333
376
|
|
|
334
377
|
- A skipped gate is never folded into the pass count. The verdict line states the
|
|
335
|
-
skip. An Android run
|
|
378
|
+
skip. An Android run whose Gate 2 did not run therefore reads
|
|
379
|
+
`2 of 3 gates cleared, 1 skipped` at best.
|
|
336
380
|
- Every blocking finding carries a file path or a store code. A finding the user
|
|
337
381
|
cannot act on is noise.
|
|
338
382
|
- The `Before rollout` block is filled by a human, never inferred. When it is
|
|
@@ -357,7 +401,7 @@ Print, and stop:
|
|
|
357
401
|
- `/multi-agent:channels` to land the findings in Jira / Confluence / Wiki / PR
|
|
358
402
|
- the enabled stack plugin's `fix-bug` skill (`ai-ios-toolkit:fix-bug` or the stack equivalent) when Gate 3 produced code-level findings
|
|
359
403
|
|
|
360
|
-
Never upload, never commit a Play edit, never bump the build number, never commit.
|
|
404
|
+
Never upload a build for release, never commit a Play edit, never bump the build number, never commit.
|
|
361
405
|
|
|
362
406
|
## Related surfaces
|
|
363
407
|
|
|
@@ -363,8 +363,9 @@ capability_of() {
|
|
|
363
363
|
jenkins) echo "read build results" ;;
|
|
364
364
|
npm) echo "publish to the npm registry" ;;
|
|
365
365
|
vercel) echo "deploy the website to Vercel and read its deployment status" ;;
|
|
366
|
-
appstore_connect_key_id|appstore_connect_issuer_id)
|
|
367
|
-
echo "validate an archive against App Store rules before submission
|
|
366
|
+
appstore_connect_key_id|appstore_connect_issuer_id|appstore_connect_private_key)
|
|
367
|
+
echo "validate an archive against App Store rules before submission and read App Store Connect through the toolkit's store_asc_* tools (key id, issuer id and .p8 together, via the store reference file)" ;;
|
|
368
|
+
google_play) echo "read Google Play apps, tracks, reviews and vitals and validate an .aab in a throwaway edit through the toolkit's store_play_* tools (via the store reference file)" ;;
|
|
368
369
|
appstore_connect_apple_id|appstore_connect_password_item)
|
|
369
370
|
echo "upload a build with an app-specific password (Tier 2 of the App Store Connect chain)" ;;
|
|
370
371
|
claude_oauth_token|claude_oauth_token_fallback)
|
|
@@ -188,6 +188,23 @@ re-onboard a token that was never the problem is the exact failure the keychain
|
|
|
188
188
|
rules warn about one layer up. **SKIP unless `--probe` is passed**, and the
|
|
189
189
|
skip is printed, because a network check is the user's decision to spend.
|
|
190
190
|
|
|
191
|
+
### store-reference
|
|
192
|
+
|
|
193
|
+
Whether the toolkit's store reference file (`~/.config/multi-agent-toolkit/store.json`,
|
|
194
|
+
or `MCP_TOOLKIT_STORE_CONFIG`) names the Keychain items that `keychainMapping`
|
|
195
|
+
holds for App Store Connect (`appstore_connect_key_id`, `appstore_connect_issuer_id`,
|
|
196
|
+
`appstore_connect_private_key`) and Google Play (`google_play`). The `store_*`
|
|
197
|
+
tools and `ios_testflight_validate` read the keys only through that file, so a
|
|
198
|
+
key that is in the Keychain but not in the file is invisible to them.
|
|
199
|
+
|
|
200
|
+
Asked through `write-store-config.mjs --check`, which checks each item's presence
|
|
201
|
+
with `credential-store.sh probe` and never reads a value. OK when none of the
|
|
202
|
+
four keys is mapped: nothing was claimed. WARN when the file is missing or stale,
|
|
203
|
+
with the single step `run node "$HOME/.claude/scripts/write-store-config.mjs"`.
|
|
204
|
+
INFO when a store is only partly onboarded (for example the key id and issuer id
|
|
205
|
+
mapped without the `.p8`), with setup as the step. SKIP when the writer is not
|
|
206
|
+
installed or the credential store does not answer.
|
|
207
|
+
|
|
191
208
|
### embedded-credentials
|
|
192
209
|
|
|
193
210
|
A token in a git remote URL or a tracked config file. BLOCK: this one leaks
|
|
@@ -163,6 +163,8 @@ The shell driver auto-delegates to `~/.claude/scripts/keychain.py` for determini
|
|
|
163
163
|
| `vercel` | Vercel deploys | `${USER}_Vercel_Access_Token` | Access Token | Vercel -> Account Settings -> Tokens. Read by `vercel-deploy.sh`; never passed on argv |
|
|
164
164
|
| `appstore_connect_key_id` | App Store Connect | `${USER}_AppStoreConnect_Key_Id` | Identifier, not a secret | App Store Connect -> Users and Access -> Integrations -> App Store Connect API |
|
|
165
165
|
| `appstore_connect_issuer_id` | App Store Connect | `${USER}_AppStoreConnect_Issuer_Id` | Identifier, not a secret | Same page as the key id; one issuer id per team |
|
|
166
|
+
| `appstore_connect_private_key` | App Store Connect | `${USER}_AppStoreConnect_Private_Key` | Full PEM text of `AuthKey_<keyId>.p8` | Same page as the key id; downloadable once. Stored from the file via stdin (`set appstore_connect_private_key - < AuthKey_<keyId>.p8`), probed first with `probe-store-key.mjs --asc` |
|
|
167
|
+
| `google_play` | Google Play | `${USER}_GooglePlay_Access_Json` | Service-account JSON, as issued | Play Console -> Setup -> API access; invite the account with app permissions and enable the Google Play Android Developer API and the Google Play Developer Reporting API. Probed first with `probe-store-key.mjs --play` |
|
|
166
168
|
| `appstore_connect_apple_id` | App Store Connect | `${USER}_AppStoreConnect_Apple_Id` | Email address | The Apple ID itself; no generation step |
|
|
167
169
|
| `appstore_connect_password_item` | App Store Connect | `${USER}_AppStoreConnect_Password_Item` | Keychain ITEM NAME, not a password | `xcrun altool --store-password-in-keychain-item`; map only the item NAME |
|
|
168
170
|
| - | Git Identity | Stored in preferences JSON | Not Keychain | Written to preferences by setup Step 4 |
|
|
@@ -104,6 +104,7 @@ another stack's toolkit in its place.
|
|
|
104
104
|
| `design_*` (`design_visual_compare`, `design_ui_geometry`, `design_report`, ...) | a built screen has to be compared against its design |
|
|
105
105
|
| `ios_app_store_audit` | a package is heading for review |
|
|
106
106
|
| `ios_testflight_validate` | validating a build before upload |
|
|
107
|
+
| `store_*` (`store_status`, `store_asc_*`, `store_play_*`, `store_search` / `store_call`) | a question about App Store Connect or Google Play data: builds and build numbers, reviews, subscriptions, tracks, vitals. Keys come from the Keychain via the store reference file `/multi-agent:setup` writes; `store_status` says which store resolves. Writes return a preview until `confirm: true` and are refused unattended |
|
|
107
108
|
|
|
108
109
|
Registered at user scope by the installer, and preserved by uninstall - the tools are
|
|
109
110
|
useful with no pipeline at all. If it is not registered the tools simply are not
|