@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/manifest.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@mmerterden/multi-agent-pipeline",
3
- "version": "20.10.0",
4
- "commit": "ffc4f8074972531eb3e882e932c29ff63f0ae845",
5
- "generatedAt": "2026-09-28T10:25:30.524Z",
3
+ "version": "20.11.0",
4
+ "commit": "5124f984fab4c9ec2413942e9e9d30020dd046d1",
5
+ "generatedAt": "2026-09-29T13:01:15.322Z",
6
6
  "algorithm": "sha256",
7
- "fileCount": 1227,
7
+ "fileCount": 1230,
8
8
  "files": {
9
- "CHANGELOG.md": "77f53924e2a1ba32035e9fa1690fc4ed95fefd6f84c318aedad0533d942a8e40",
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": "4cb62f5043b4010101e67069d0f99ee94d84e8f25c558c52f22628c63bc6b33e",
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": "fd545686999f2231b902eb2a614614b8e0b0b2812a94b236fdfa96cd01d31f5b",
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": "a410a59d303611c205a5c870cf63d7ed642e3fa74242fdda73d109bf886d66f6",
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": "974ee683523b29a6b9c426158c2a73d4f24c6521b934476a37b1d4b0df354b57",
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": "1edef50940b29a9b0d391270347e52032de91ead07e5c0c02bf047ea382425ab",
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": "6bd501bb8ec23a45a53337e383e4ed077e0aeb939580935b92ae8bb708e2e264",
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": "0fa95a4bb2c355b360bf0943e1d69f0319ded18d7af540f2a154f31101514558",
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": "adff81b265a9cf4f8c9135011686c12963cf5eeeafcb266be54456c803ffde38",
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": "4e4ff5f4ec03b017f4d1b8e6a0cb64cd86fbde063aee72d7589875c90567b019",
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": "8f775488ed846cc11470bfe5a4db1803f4145a16e12e8fa17a3f338380f096a7",
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": "34f9f79b8fcc0ac58dc45905ca8b285477f7604d10391ace1bbde0b249593fbf",
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": "6208a8125212e3ef44faf61236c5dd8ec3e8f71817fa477e8cd92415906a0759",
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": "b15b2de33b88e21ae01b8e09d9920abdc8e7e5767d61c158b271354b68e5ac6d",
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": "c327827b65c01cec5c73fdde0b4ad553daf157fb7786c4d0e97a335cfc687282",
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": "d903ffcf79e37175047e2b662d324ad7db67bd355297672e9383ba1a991ffcfb",
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": "8a2dd546e3712e6915d67729d84b89c0b98c76d48e02348d41773e4a182e7223",
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/skills/.skill-manifest.json": "449e794ee0d3e0661bd6143f0a2670955ae943b8caae53857a7614417771d1be",
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": "3d15929685bb84bcdd2fee621176b9c12686a2f5152bd46ed19b959d7e851cc0",
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": "d57769a5857c6ed06f1c2c9995da77901af14c5ae493c8ec8c454b977c5666e9",
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": "86838f9b922cdaebfebdc019aab7861e8e0d436620e43a715b3e3da1ddfc804b",
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.10.0",
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 uploads. `testflight-validation` is the iOS-pinned alias; `test "store-ready"` hands off here. |
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 uploads.
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 yüklemez.
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 four 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 rather than secrets and one holds a keychain ITEM NAME, yet all four go through the mapping layer so every credential is read the same way. Tiers, the role constraint that decides which to offer first, and the onboarding mechanics: Step 3b and `$HOME/.claude/multi-agent-refs/setup/app-store-connect.md`.
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
- Pipeline runs silently:
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 alongside the other missing credentials. The four `appstore_connect_*` entries, their non-secret handling (three hold identifiers / a keychain item name, not pasteable secrets), the API-key vs Apple-ID tier picker, and the verification probes live in `$HOME/.claude/multi-agent-refs/setup/app-store-connect.md`. Read that file when the user opts into App Store Connect onboarding; on Skip, nothing is written.
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
- # JSON file from clipboard (preferred - no file path leaks into history)
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 uploads. Use when a build is about to go to TestFlight or a Play track, or when a submission was rejected and the reason is not obvious."
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 yüklemez."
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 uploads.** iOS runs `--validate-app`, never `--upload-app`. Android
22
- never commits a Play edit. A validation run must not be able to ship a build by
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`. Needs an `.ipa` + credentials | **No client shipped.** Play's authoritative check exists only server-side, through a Publishing API draft edit that is validated and then abandoned. The pipeline has no tool for it, so this gate reports `SKIPPED (no local Play validator)` and the report says so. Do not substitute `bundletool validate` - that is Gate 1 |
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, so an Android run
51
- clears at most 2 of 3 gates and must never print `passed`.
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 + issuer id from the keychain via `prefs.global.keychainMapping`, `.p8` at `~/.appstoreconnect/private_keys/AuthKey_<keyId>.p8` | Gate 2 runs |
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
- There is no credential tier to resolve: Gate 2 has no local client, so it is
142
- `SKIPPED` by construction rather than by configuration. Say which of the two it is
143
- - a user who thinks a credential would unlock it will go looking for one.
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
- **Android**: report `SKIPPED (no local Play validator)` with one line on why: the
258
- authoritative check is a Play Publishing API draft edit, the pipeline ships no
259
- client for it, and no local tool substitutes. `bundletool validate` is Gate 1 and
260
- reporting it here would fake a cleared gate.
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 therefore reads `2 of 3 gates cleared, 1 skipped` at best.
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 (the .p8 itself is a file at ~/.appstoreconnect/private_keys/, never a mapping)" ;;
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