@mmerterden/multi-agent-pipeline 20.17.2 → 20.19.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 +19 -0
- package/docs/facts.json +2 -2
- package/install/_mcp-register.mjs +1 -1
- package/install/_xcode-skills.mjs +263 -0
- package/install/catalog-history.json +1 -1
- package/install/claude.mjs +23 -0
- package/install/codex.mjs +11 -0
- package/install/copilot.mjs +9 -0
- package/manifest.json +25 -22
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/stack/SKILL.md +2 -0
- package/pipeline/commands/multi-agent/update/SKILL.md +45 -18
- package/pipeline/lib/xcode-plugin.mjs +131 -0
- package/pipeline/multi-agent-refs/features/doctor.md +10 -0
- package/pipeline/scripts/README.md +1 -0
- package/pipeline/scripts/doctor.mjs +38 -0
- package/pipeline/scripts/release-notes.mjs +167 -0
- package/pipeline/scripts/uninstall.mjs +57 -1
- package/pipeline/skills/.skill-manifest.json +2 -2
- package/pipeline/skills/shared/external/ios-iphone-duo/SKILL.md +9 -0
- package/pipeline/skills/shared/external/ios-iphone-duo/evals/evals.json +15 -0
- package/pipeline/skills/shared/external/ios-iphone-duo/references/fixed-assumptions.md +59 -2
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-10-
|
|
3
|
+
"version": "20.19.0",
|
|
4
|
+
"commit": "6db35d97282cfe57fab9bb66a0da8bc6696aca99",
|
|
5
|
+
"generatedAt": "2026-10-09T11:19:00.589Z",
|
|
6
6
|
"algorithm": "sha256",
|
|
7
|
-
"fileCount":
|
|
7
|
+
"fileCount": 1357,
|
|
8
8
|
"files": {
|
|
9
|
-
"CHANGELOG.md": "
|
|
9
|
+
"CHANGELOG.md": "273977981d9581cd702e05f063930ef2cff624a76b687472cf0fef545e7adad3",
|
|
10
10
|
"LICENSE": "8d8c51aaf1e1538b180c69965fa038db71be86798cc3e26a143bebfefe16a43e",
|
|
11
11
|
"README.md": "1336cf131fdc0dbab1dd8b90fcd5614bd19d27b92b4f91ab99c3108d61cb51e1",
|
|
12
12
|
"README.tr.md": "7979b32e6c72aedc3a6affe85f33b2840e72f056a836e8546566d259b236ff29",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"docs/best-practices.md": "f8b75b0d38b5896a6a852bb30a1edddeb24dab8b5b7b1d9313290e1241c72024",
|
|
34
34
|
"docs/ecosystem.md": "d504124f421748744599f6974ec71d52664affc47740665651cca5ddc17d0c71",
|
|
35
35
|
"docs/engineering.md": "550528cd47c7d2c921729c68d0782a00ac8e77a4bdfec479f6749f9c3235d188",
|
|
36
|
-
"docs/facts.json": "
|
|
36
|
+
"docs/facts.json": "80256de517e282de9b5a6e135a270d45a0590ab77ef579fafd171d644ce917b0",
|
|
37
37
|
"docs/features.md": "87ae163280fe05b36ff9f664b1bf9d98b697cc498731d47298751b439fa7a35c",
|
|
38
38
|
"docs/performance.md": "bbf2f3922c25dcba0c1a9e69ef420e3871a729af5b35009a49b48a5d3c5cd151",
|
|
39
39
|
"docs/recovery-guide.md": "59a8f1b66b34cb9ff5507b3d54dac3b9915e184aa044d9c758d18cac818d510e",
|
|
@@ -46,15 +46,16 @@
|
|
|
46
46
|
"install/_copilot-instructions.mjs": "73e4b82b2af0f3e1669f772fa0788dac6b540c131e56d5fe38dcf29be85cc019",
|
|
47
47
|
"install/_dev-only-files.mjs": "3391819c5e779b9e6d5a330d4937509c591e4c35ac937d25bafd86b37ca95b73",
|
|
48
48
|
"install/_managed-block.mjs": "7328728a7c82744b66218034389fc295d1384311daa5415408afa94be14303d3",
|
|
49
|
-
"install/_mcp-register.mjs": "
|
|
49
|
+
"install/_mcp-register.mjs": "d5a53ba2c8c779cd02e62c845270c5a2dbe717ffe852d9672998e643744c70ce",
|
|
50
50
|
"install/_platform-filter.mjs": "1c66acc79da0da0c1aa5a57050989e84198c3153e6437ee03f1d3bacbb12ff2c",
|
|
51
51
|
"install/_plugin-skills.mjs": "2de429260472a7b60bfe800eabc111624fa5f82a175e283481b05e5349dad572",
|
|
52
52
|
"install/_telemetry.mjs": "5433d753f909beed2c8789272bba05e245482c472f83d3444f58000c4c9a634b",
|
|
53
53
|
"install/_unattended-profile.mjs": "e1ed82bde35d19105ee12c2a551eb778912b0e5c93ab227fd15c993098d98de0",
|
|
54
|
-
"install/
|
|
55
|
-
"install/
|
|
56
|
-
"install/
|
|
57
|
-
"install/
|
|
54
|
+
"install/_xcode-skills.mjs": "1a7e20f1e6743324b941c5d3ecac9f94c65fff1534ffd9c63b39cbea4f8d101a",
|
|
55
|
+
"install/catalog-history.json": "0d6a9cb4eb8d228e4bb5133910fa7b7a0a3d223195dfb6643a42f7d75afcd201",
|
|
56
|
+
"install/claude.mjs": "106ce353ebc19c8319d057ce342e1f989519510465c798399076b5f3d8727904",
|
|
57
|
+
"install/codex.mjs": "08925fe9f3ecdf509b37f01105652c847475d20fcde2db0d679b9a7d663ca145",
|
|
58
|
+
"install/copilot.mjs": "41dc394b8a3ae77cfd194ce0ca9bbcafce9bdce349f1f72eeb86569f993e15fe",
|
|
58
59
|
"install/index.mjs": "07ec26ecdd81cc983f146faf4b7095c98edce39c89a6fd83c24ce43229d2d9e7",
|
|
59
60
|
"install/templates/claude-hooks.json": "12d6bb0c3cd7d71b1d2029e2eb4370ca7b5ee55bd88f96b09c927d8119a87be7",
|
|
60
61
|
"install/templates/codex-instructions.md": "dd78eb9553e725c039380457245793a5fc748ae37ebf5ccfe11be5ed5b9a4025",
|
|
@@ -62,7 +63,7 @@
|
|
|
62
63
|
"install/templates/multi-agent-autopilot-awake.plist.template": "ddd25c76c56fcbb38a89de8e35637372d70ace993d6bc487a88ca9cfb702fe1f",
|
|
63
64
|
"install/templates/multi-agent-autopilot.plist.template": "122c8a61cd927edd99375d6e3da40f1d42bcceed5b6641785c8b28bb930bc77e",
|
|
64
65
|
"install/unattended-profile-legacy.json": "f52e86b998956f09ad306b1735a6c10b58580d7082d8a55665a4c6bb15c3aa1f",
|
|
65
|
-
"package.json": "
|
|
66
|
+
"package.json": "c45fc8e778927b72b074d2692f8fd895186b1adc1c752cfa2e18ff41c6822d49",
|
|
66
67
|
"pipeline/agents/android-architect.md": "11fb74543cb0ebcf9525ca6654fe95d53da7229e0bf4a1149b31fd9005abc453",
|
|
67
68
|
"pipeline/agents/backend-architect.md": "b02a606c301e4714131aed70ae6d16eeb77fbc819a001e2752cff2488d4246de",
|
|
68
69
|
"pipeline/agents/bulk-reader.md": "6597052cd7d205bac2b1c7633f5232fe1a40730664a913b8eb77efd5a786dc25",
|
|
@@ -129,7 +130,7 @@
|
|
|
129
130
|
"pipeline/commands/multi-agent/security-review/SKILL.md": "dfc2fad484c81169912062391f7ad97500ef113d95741902e5e18e7dd60b6da1",
|
|
130
131
|
"pipeline/commands/multi-agent/serve/SKILL.md": "e931219d8be258a155a692d23c2b275c2e7e0a761b3f0354c943e26d2ce7b035",
|
|
131
132
|
"pipeline/commands/multi-agent/setup/SKILL.md": "b6b4af9eac2ec9454dda08d960ab9ed559421e167f6726915b451e86fbb3f058",
|
|
132
|
-
"pipeline/commands/multi-agent/stack/SKILL.md": "
|
|
133
|
+
"pipeline/commands/multi-agent/stack/SKILL.md": "26ecb48b28b61250330edb26fdfd014e401992e4f1329c572766ba4e2dc6e35d",
|
|
133
134
|
"pipeline/commands/multi-agent/status/SKILL.md": "b08338841a5282f8ae2494751001aa31cbf4829146a58ed2c395b1c062b48443",
|
|
134
135
|
"pipeline/commands/multi-agent/steer/SKILL.md": "07e738c228ba328f717f86e97e7af207df090b16433e28e613d430c3ff0aee3e",
|
|
135
136
|
"pipeline/commands/multi-agent/store-ready/SKILL.md": "927181a7ea4890ea2ce3e8523c2f0563829e8827aa6ed92884b76a84521a378f",
|
|
@@ -141,7 +142,7 @@
|
|
|
141
142
|
"pipeline/commands/multi-agent/test/SKILL.md": "5a67be2b1ec0321e79f8b7f35be53676e349e55a4f8ca09a07f0de89dadac8c4",
|
|
142
143
|
"pipeline/commands/multi-agent/testflight-validation/SKILL.md": "38fa8d3d3c8340d025e100c53a70183cbad22665b7ddccbb6102c05986cce489",
|
|
143
144
|
"pipeline/commands/multi-agent/uninstall/SKILL.md": "b2124820a6e10cdd72be71df2183aad4f8bd8988ec90248c88599c1514f7d9ab",
|
|
144
|
-
"pipeline/commands/multi-agent/update/SKILL.md": "
|
|
145
|
+
"pipeline/commands/multi-agent/update/SKILL.md": "4b9ca40382eb2bd06f8b1a483d6232d1e9941d6e6288a21e83fa977482a1bae7",
|
|
145
146
|
"pipeline/commands/sim-test.md": "b09038b9511108c77fae5e0c11f8515b5c64eb8b63a77fe8c2ff5907ddd0313a",
|
|
146
147
|
"pipeline/contract/CHANGELOG.md": "0813f5737219bafad3eb4daf809b9754937fae8533e07caf3850e30b2685662b",
|
|
147
148
|
"pipeline/contract/README.md": "6239eb0877d70e70d63db74bae3499599b0425c80c71eceb6bb0a981523eaa89",
|
|
@@ -238,6 +239,7 @@
|
|
|
238
239
|
"pipeline/lib/user-facing.sh": "969038aa575a7075cbc8c2857b3e6bddfa5c8ea8a15811ad65c6660735539b76",
|
|
239
240
|
"pipeline/lib/vercel-deploy.sh": "50d3d8a0b2c60daf90365396f37337d89a60230a94e7bd4c89b19acf1849de99",
|
|
240
241
|
"pipeline/lib/workspace-trust.mjs": "baa33eb4bef709578c554fb6f1c5952d838a3fe154422e7e671ac485e49518dc",
|
|
242
|
+
"pipeline/lib/xcode-plugin.mjs": "79d1bef0ec5c7909f970ff8772c8422adbaf6217b6f72c44c531a124d1a12fd0",
|
|
241
243
|
"pipeline/multi-agent-refs/_account-picker.md": "42715ba746e1fc681a57436d72fc643e3f16de023f0409fee8782b013f7a144a",
|
|
242
244
|
"pipeline/multi-agent-refs/_dev-context.md": "4d0905cc537c7f8526d3c92cf09bb44d2ab50680470ee0baa2dd5c3b1d0565d5",
|
|
243
245
|
"pipeline/multi-agent-refs/_input-parser.md": "4cf222b1c4a405bd71521f5290f45408cc8a47913a0a39166c68210104e90cc5",
|
|
@@ -290,7 +292,7 @@
|
|
|
290
292
|
"pipeline/multi-agent-refs/features/cost-analysis.md": "42f1b90b41ef454f29ccfd3f93c959920f0e74cbca65e140695e9a30d6d90b87",
|
|
291
293
|
"pipeline/multi-agent-refs/features/design-conformance.md": "a88ca595827cafa0c87c2facfcf9190dac69485e0596e5c198c6fc1613880452",
|
|
292
294
|
"pipeline/multi-agent-refs/features/dev-critic.md": "08e01edef04b5ac216f8f43332126966d33da7b95625e47a8a6cd8ac105b263f",
|
|
293
|
-
"pipeline/multi-agent-refs/features/doctor.md": "
|
|
295
|
+
"pipeline/multi-agent-refs/features/doctor.md": "62ff75a085095b11818ffabb97bd76e62e58de6affd24f4eaf3d9f89f2fe1d66",
|
|
294
296
|
"pipeline/multi-agent-refs/features/exploratory-testing.md": "3ee81dc5d42068b09b6e31c7649ee57ff73e30480237c8c4a0571c78d996928d",
|
|
295
297
|
"pipeline/multi-agent-refs/features/external-context-injection.md": "fe0373f27c3e9aae660a55a3ba9a8163df329b4d95c727d6023b6b3afaf71d66",
|
|
296
298
|
"pipeline/multi-agent-refs/features/jira-context.md": "7d14802ed9ad1747e1a06dec26f22ff9e8959e03c47d7a018af45b8274aea47c",
|
|
@@ -481,7 +483,7 @@
|
|
|
481
483
|
"pipeline/schemas/unattended-profile.json": "05bc095b6328ff77b7bee8b008becf9aa20f1dabeab3b0fc174b97cad421e23b",
|
|
482
484
|
"pipeline/schemas/unattended-profile.schema.json": "a9c0979f0d0742826e410fdbfe1ae1c4a56b05b4e638eec42d4c276d6f48f701",
|
|
483
485
|
"pipeline/schemas/worktrees.schema.json": "4e15c413c00811814eee734d86734ad9e1d34a37737f7df641b389ce5d8d134b",
|
|
484
|
-
"pipeline/scripts/README.md": "
|
|
486
|
+
"pipeline/scripts/README.md": "4cdf7054cddbe5cdcb08460f68782f2347a26c8c343d8ef8418714464672b36c",
|
|
485
487
|
"pipeline/scripts/_autopilot-config.mjs": "0f42d2791f1d71c4aad5a0735ca56fef1ed27d275b72f99d8ca8f95fcb8aa83a",
|
|
486
488
|
"pipeline/scripts/_autopilot-ops.mjs": "5e84d628482434c8f09dc69601c73ab70e928af15c2f068d998d2f61bd692d1a",
|
|
487
489
|
"pipeline/scripts/_autopilot-outcomes.mjs": "5b2423814d979ed5c657473290083b296f7245d40507c866e7931b2771001236",
|
|
@@ -550,7 +552,7 @@
|
|
|
550
552
|
"pipeline/scripts/crush-json.mjs": "303382670f8f170c8c6710202853a2de2915625813cd157185f9be4e2b27258e",
|
|
551
553
|
"pipeline/scripts/diff-explain.mjs": "194d0635639607cb1af3de064453162e01c0d59dc0c2e187d21d45bae3bc559c",
|
|
552
554
|
"pipeline/scripts/diff-risk-score.mjs": "b3e8da42fea1258162e40f4eb7809074831339b7563874527f7e825f7aa795ca",
|
|
553
|
-
"pipeline/scripts/doctor.mjs": "
|
|
555
|
+
"pipeline/scripts/doctor.mjs": "a86a39b3eab13158166f44133c1fdc1fda3d4cc7ad0122f3dc47e3cfae2f5ad1",
|
|
554
556
|
"pipeline/scripts/estimate.mjs": "9847e412dd74ac19a5c3b84bed343f79d25f256022b2df98e3eb1296db45ed3a",
|
|
555
557
|
"pipeline/scripts/evidence-gate.mjs": "347a8d3fa1d17d996de345585c216bd7071f4c1d687999daf6e48881720ea5df",
|
|
556
558
|
"pipeline/scripts/explore-findings.mjs": "997cca3ef42a170ff51ee2c382263eff8653affd6bb675877b94b8bba782e717",
|
|
@@ -615,6 +617,7 @@
|
|
|
615
617
|
"pipeline/scripts/prune-logs.sh": "c5587b33104c7253e07be8cce8249b50014c52dfdf232de637811ffdd88e95e4",
|
|
616
618
|
"pipeline/scripts/purge.sh": "95c60b272ae47209893dba9b17528538592bb5636da47940a02734cd9b4f0ce5",
|
|
617
619
|
"pipeline/scripts/record-phase.mjs": "041dc262e54f38b66299f45c44db7918812e599a773f5a3dc78cfd09ab5e155e",
|
|
620
|
+
"pipeline/scripts/release-notes.mjs": "05430926cf679534978bcc79c160a6787aaf04831b8b8489d8bbc9fa343a14af",
|
|
618
621
|
"pipeline/scripts/render-agent-log-cost.sh": "6c58c1f5754ff5754485a0c1b66f4cd713575d2e8ebb1630aedf2f87fe34ef4d",
|
|
619
622
|
"pipeline/scripts/render-cost-summary.sh": "ce9647332ab9a3e518af98f52a6fc70baab9fd3c09ec5f9e85bae2d67078a5e3",
|
|
620
623
|
"pipeline/scripts/render-work-summary.sh": "ee4db04ebc145cc2fc7fa9a533d42b7da4da191710ef67c883502ca83b2aa67c",
|
|
@@ -660,7 +663,7 @@
|
|
|
660
663
|
"pipeline/scripts/triage-memory.mjs": "2d8541145f1749593ae5728fb4c9eb3001484edb5e4d37be473aeec34d1dbe7c",
|
|
661
664
|
"pipeline/scripts/ui-tree-dumper.swift": "a09e42ef069eafa08c05afd8333e05b754ef6a7d8b9687712039b0f2c9801273",
|
|
662
665
|
"pipeline/scripts/unattended_policy.py": "f1df6470c798bd7d4bc9f8338eaabf98bdcfab00198d98b7e2e654aab84b709c",
|
|
663
|
-
"pipeline/scripts/uninstall.mjs": "
|
|
666
|
+
"pipeline/scripts/uninstall.mjs": "ba11803733cf3bfcc966f0d4aa2cc5fbed000cb37a251005f067ce0289306233",
|
|
664
667
|
"pipeline/scripts/update-check.sh": "9c00647e7ca4249414b2e5af08f61705ab5bd2106b6f66ae8ebce8aa143dc957",
|
|
665
668
|
"pipeline/scripts/update-issue-progress.sh": "ccfef87743e91272e009e396ac07461d2784b2fa84a06c802a582526eeeb9ed9",
|
|
666
669
|
"pipeline/scripts/usage-identity.mjs": "1ea8ffb5a52aa5f98a7ea491f12af02d86f711666ac0cc37cac59c70e182aaf4",
|
|
@@ -688,7 +691,7 @@
|
|
|
688
691
|
"pipeline/scripts/worktrees.mjs": "90dfd09b70fffe9b56c331a4ae2692cc248f4898f4ee6aee4239ef0b20888a90",
|
|
689
692
|
"pipeline/scripts/write-state.mjs": "e1198bf970eace07d3eff22b394808a526e473df65d3d58aa2d5a12cfdac8b49",
|
|
690
693
|
"pipeline/scripts/write-store-config.mjs": "b994a061f6febb2ca3d396074d8b51d2c1c1f991d3072d321703380da3639a56",
|
|
691
|
-
"pipeline/skills/.skill-manifest.json": "
|
|
694
|
+
"pipeline/skills/.skill-manifest.json": "48f84aac9947e30a91e65ca97ff41b327b43af8b3643883f2a19e0169bfc89b9",
|
|
692
695
|
"pipeline/skills/.skills-index.json": "b2917fa44e273b939549f1c3ab3dd81c26ba8168772bc7644c9fa076116d8a4c",
|
|
693
696
|
"pipeline/skills/shared/README.md": "928fe4292be729c3b7d7d0898cade8be0dfa868f208e0c6d1fe7b2c6bd6223c5",
|
|
694
697
|
"pipeline/skills/shared/core/apple-archive-compliance/SKILL.md": "7239fef717ea45b79276bfcc2c3903acd57950b6e00dd6a2a66399c4b09cbd51",
|
|
@@ -958,11 +961,11 @@
|
|
|
958
961
|
"pipeline/skills/shared/external/ios-haptics/evals/trigger-eval.json": "f97a385ac2c72c0d76c48a5938186c9fdee419d2fbec2f64fc4c22098650daff",
|
|
959
962
|
"pipeline/skills/shared/external/ios-haptics/references/core-haptics.md": "04c8b2a276890b4090b824a214699eb599135a1c48506217b973ffb27100cf70",
|
|
960
963
|
"pipeline/skills/shared/external/ios-iphone-duo/NOTICE.md": "290de59e3d37adaef65f76533785a3c263b4a83776a44bbaa1e5e6244e33e69f",
|
|
961
|
-
"pipeline/skills/shared/external/ios-iphone-duo/SKILL.md": "
|
|
962
|
-
"pipeline/skills/shared/external/ios-iphone-duo/evals/evals.json": "
|
|
964
|
+
"pipeline/skills/shared/external/ios-iphone-duo/SKILL.md": "934df39d42cac41473d4c7605891c4b15aca2d185099c21b36a3c1abbbea8359",
|
|
965
|
+
"pipeline/skills/shared/external/ios-iphone-duo/evals/evals.json": "75fbe9fad13725fa9e2ff0456dc31a3211a4a9455bd31b2e8cc5871aee6c5eb5",
|
|
963
966
|
"pipeline/skills/shared/external/ios-iphone-duo/evals/trigger-eval.json": "30033fda1613982dd773a3bcf18d074b7ce7b4a02bc30bc08e7ed274a5732b4b",
|
|
964
967
|
"pipeline/skills/shared/external/ios-iphone-duo/references/api-map.md": "ec7d0b3dab323db1951c2b5319691f611466012b970823333a233e33c2a338d4",
|
|
965
|
-
"pipeline/skills/shared/external/ios-iphone-duo/references/fixed-assumptions.md": "
|
|
968
|
+
"pipeline/skills/shared/external/ios-iphone-duo/references/fixed-assumptions.md": "4a3e52a72b48851adc43ec702c4dbbc9d9d313a7b56409553406885b5606fdab",
|
|
966
969
|
"pipeline/skills/shared/external/ios-iphone-duo/references/poses-and-panes.md": "f06bd8689cf793c239125327f4ec74f234c49beda277467cdebc7366ff76909f",
|
|
967
970
|
"pipeline/skills/shared/external/ios-localization/SKILL.md": "3ee1a34bbf6c0b77e1e9f16cb7d8bc3d10f2ba7bf6d0b48e64126afcf9dbe2b6",
|
|
968
971
|
"pipeline/skills/shared/external/ios-localization/evals/evals.json": "f80b7a9d9a4a262c6df824ba8c4bf1a762d98d0a12501bead04e8cd6a016cc6e",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "20.
|
|
3
|
+
"version": "20.19.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",
|
|
@@ -70,6 +70,7 @@ installer.
|
|
|
70
70
|
- every stack toolkit **not** in the union is set to `false` (leave non-`@multi-agent-plugins` entries untouched)
|
|
71
71
|
- `ai-common-toolkit@multi-agent-plugins` and `ai-analyst-toolkit@multi-agent-plugins` are always `true`
|
|
72
72
|
- **legacy-key cleanup**: delete any `ai-*-engineering-toolkit@multi-agent-plugins` keys - those plugin names were retired by the `ai-<stack>-toolkit` rename and a stale `true` there enables a plugin that no longer exists in the marketplace
|
|
73
|
+
- **Apple's Xcode skills**: when `~/.claude/xcode-apple-marketplace` exists (the installer linked this Mac's Xcode 27.1+ plugin), set `xcode-integration@xcode-apple` to `true` if `ios` is in the selection and `false` otherwise. Apple's skills are the reference for iPhone Duo and window resizing, SwiftUI, App Intents and the accessibility audits, and they are the first route for those iOS tasks. Without that directory there is nothing to enable; leave the key absent
|
|
73
74
|
4. **Unknown arg** → show the table above; do not guess.
|
|
74
75
|
5. **Copilot/Codex refresh offer.** Their local skill copies are filtered to the enabled stacks at install time, so after a change ask (single `AskUserQuestion`, not silent): "Refresh Copilot/Codex local copies now?" - Yes runs `node <pipelineRepo>/install.js --copilot --codex`, No leaves them stale with a one-line warning naming the command to run later. Skip this question entirely when neither `~/.copilot` nor `~/.codex` exists.
|
|
75
76
|
|
|
@@ -109,6 +110,7 @@ After resolving `$ON`, edit `.claude/settings.json` (create `{ "enabledPlugins":
|
|
|
109
110
|
- every stack toolkit **not** in `$ON` is set to `false` (leave non-`@multi-agent-plugins` entries untouched),
|
|
110
111
|
- `ai-common-toolkit@multi-agent-plugins` and `ai-analyst-toolkit@multi-agent-plugins` are always `true`,
|
|
111
112
|
- every `ai-*-engineering-toolkit@multi-agent-plugins` key is **deleted** (retired names).
|
|
113
|
+
- `xcode-integration@xcode-apple` follows `ios` (`true` with it, `false` without), only when `~/.claude/xcode-apple-marketplace` exists.
|
|
112
114
|
|
|
113
115
|
Use the Read + Edit/Write tools (JSON must stay valid). Then print the resulting `enabledPlugins` block and run step 5 (Copilot/Codex refresh offer).
|
|
114
116
|
|
|
@@ -100,9 +100,13 @@ and every later block that needs them starts by sourcing it.
|
|
|
100
100
|
|
|
101
101
|
4b. **Update the stack plugins** (catalog refresh, then every installed plugin in its own scope):
|
|
102
102
|
```bash
|
|
103
|
-
|
|
103
|
+
REFRESH_LOG="${TMPDIR:-/tmp}/multi-agent-plugin-refresh.log"
|
|
104
|
+
bash "$HOME/.claude/scripts/plugin-refresh.sh" {owner} > "$REFRESH_LOG" 2>&1
|
|
105
|
+
rc=$?
|
|
106
|
+
cat "$REFRESH_LOG"
|
|
107
|
+
echo "plugin-refresh exit: $rc"
|
|
104
108
|
```
|
|
105
|
-
A non-zero exit means a step failed and the CLI's own error is already on screen. Report it to the user; do not retry silently.
|
|
109
|
+
A non-zero exit means a step failed and the CLI's own error is already on screen. Report it to the user; do not retry silently. The log feeds step 6, which tells the user what each updated plugin brought.
|
|
106
110
|
|
|
107
111
|
4c. **Prune retired adapter files** (Cursor / Antigravity / Copilot Chat were removed in v10.7.0 - the pipeline targets Claude Code, Copilot CLI and Codex CLI):
|
|
108
112
|
```bash
|
|
@@ -139,19 +143,41 @@ and every later block that needs them starts by sourcing it.
|
|
|
139
143
|
or an SSH key on the personal account (the "Personal account" step in
|
|
140
144
|
`$HOME/.claude/multi-agent-refs/features/usage-reporting.md`).
|
|
141
145
|
|
|
142
|
-
6. **
|
|
146
|
+
6. **Tell the user what the update brought.** Read the notes, then write the summary yourself:
|
|
143
147
|
```bash
|
|
144
148
|
. "${TMPDIR:-/tmp}/multi-agent-update.env" || { echo "Run step 1 first."; exit 1; }
|
|
145
149
|
NEW=$(tr -d '[:space:]' < "$HOME/.claude/.pipeline-version" 2>/dev/null)
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
"$
|
|
150
|
+
NOTES="$UPD_DIR/package/pipeline/scripts/release-notes.mjs"
|
|
151
|
+
[ -f "$NOTES" ] || NOTES="$HOME/.claude/scripts/release-notes.mjs"
|
|
152
|
+
LOG="$UPD_DIR/package/CHANGELOG.md"
|
|
153
|
+
[ -f "$LOG" ] || LOG=/nonexistent
|
|
154
|
+
node "$NOTES" --changelog "$LOG" --from "$CUR" --to "$NEW" \
|
|
155
|
+
--plugins-dir "$HOME/.claude/plugins/marketplaces/multi-agent-plugins/plugins" \
|
|
156
|
+
--plugin-refresh-log "${TMPDIR:-/tmp}/multi-agent-plugin-refresh.log"
|
|
153
157
|
```
|
|
154
158
|
|
|
159
|
+
The JSON holds every release between the old and the new version (not only
|
|
160
|
+
the last one) and, for each plugin the refresh moved, that plugin's releases.
|
|
161
|
+
Turn it into a short note in `outputLanguage`, written for the person using
|
|
162
|
+
the pipeline, not for its maintainers:
|
|
163
|
+
|
|
164
|
+
- First line: `✓ Updated: v<CUR> → v<NEW>`, then one line per updated plugin
|
|
165
|
+
(`ai-ios-toolkit 0.20.0 → 0.21.0`).
|
|
166
|
+
- Then up to four groups, each only when it has entries: **New** (added),
|
|
167
|
+
**Fixed**, **Changed**, **Removed** (Turkish: Yeni, Düzeltilen, Değişen,
|
|
168
|
+
Kaldırılan). Put security entries first under Fixed.
|
|
169
|
+
- One plain sentence per item about what the user notices or can now do.
|
|
170
|
+
Merge items that say the same thing; leave out internal-only entries
|
|
171
|
+
(smoke tests, CI, refactors, budgets, docs) unless they change what a user
|
|
172
|
+
sees. At most about eight items per group; when more were dropped, say how
|
|
173
|
+
many and that the full list is in the CHANGELOG.
|
|
174
|
+
- Use only what the JSON says. Never invent a feature or a fix, and never
|
|
175
|
+
guess why something changed.
|
|
176
|
+
- Last line, when anything needs action: what to do (restart Claude Code for
|
|
177
|
+
plugin changes, run a command a release asks for).
|
|
178
|
+
|
|
179
|
+
With empty notes and no plugin updates, print only the version line.
|
|
180
|
+
|
|
155
181
|
7. **Smoke test (optional)** - the release tarball ships exactly two smokes for this purpose:
|
|
156
182
|
```bash
|
|
157
183
|
. "${TMPDIR:-/tmp}/multi-agent-update.env" || { echo "Run step 1 first."; exit 1; }
|
|
@@ -165,18 +191,19 @@ and every later block that needs them starts by sourcing it.
|
|
|
165
191
|
## Output
|
|
166
192
|
|
|
167
193
|
```
|
|
168
|
-
Current: v15.6.0 Latest: v15.
|
|
169
|
-
-> npm pack @{npm-scope}/multi-agent-pipeline@15.
|
|
194
|
+
Current: v15.6.0 Latest: v15.7.0
|
|
195
|
+
-> npm pack @{npm-scope}/multi-agent-pipeline@15.7.0
|
|
170
196
|
-> node install.js --installed (Claude Code; no Copilot CLI or Codex CLI stamp, not installed)
|
|
171
197
|
-> migrate-prefs.mjs (0 changes - already v2.6.0)
|
|
172
198
|
|
|
173
|
-
✓ Updated: v15.6.0 → v15.
|
|
199
|
+
✓ Updated: v15.6.0 → v15.7.0
|
|
200
|
+
ai-ios-toolkit 0.19.0 → 0.20.0
|
|
174
201
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
-
|
|
179
|
-
|
|
202
|
+
New
|
|
203
|
+
- iOS design review: critiques a screen against the HIG from screenshots.
|
|
204
|
+
Fixed
|
|
205
|
+
- The usage report reads the tracker as it is written.
|
|
206
|
+
Restart Claude Code to load the updated plugins.
|
|
180
207
|
|
|
181
208
|
Verification:
|
|
182
209
|
schema-validation: 27/27 pass
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* xcode-plugin.mjs - where this Mac's Xcode keeps its agent plugin, and whether
|
|
3
|
+
* Claude Code's link to it is installed and at the installed Xcode build.
|
|
4
|
+
*
|
|
5
|
+
* Xcode 27.1 and later materialize `xcode-integration` (Apple's skills plus the
|
|
6
|
+
* Xcode MCP bridge) and print its path with `xcrun agent plugin path`. The
|
|
7
|
+
* installer links it (`install/_xcode-skills.mjs`), uninstall removes it, and
|
|
8
|
+
* doctor reads the same answers from here, so none of them can disagree about
|
|
9
|
+
* what "linked" or "current" means.
|
|
10
|
+
*
|
|
11
|
+
* `MULTI_AGENT_XCRUN` names another `xcrun`, for tests.
|
|
12
|
+
*
|
|
13
|
+
* @module pipeline/lib/xcode-plugin
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { execFileSync } from "node:child_process";
|
|
17
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
18
|
+
import { basename, dirname, join } from "node:path";
|
|
19
|
+
|
|
20
|
+
export const XCODE_MARKETPLACE = "xcode-apple";
|
|
21
|
+
export const XCODE_PLUGIN = "xcode-integration";
|
|
22
|
+
export const XCODE_PLUGIN_ID = `${XCODE_PLUGIN}@${XCODE_MARKETPLACE}`;
|
|
23
|
+
|
|
24
|
+
/** Claude Code's directory marketplace, relative to the home directory. */
|
|
25
|
+
export const CLAUDE_MARKETPLACE_DIR = join(".claude", "xcode-apple-marketplace");
|
|
26
|
+
|
|
27
|
+
/** The Xcode build the marketplace copy was taken from, inside that directory. */
|
|
28
|
+
export const BUILD_STAMP = ".xcode-build";
|
|
29
|
+
|
|
30
|
+
/** Copy hosts: which delivered skill dirs came from Xcode, for refresh and uninstall. */
|
|
31
|
+
export const XCODE_SKILLS_MANIFEST = ".xcode-skills-manifest.json";
|
|
32
|
+
|
|
33
|
+
export const defaultRun = (cmd, args) =>
|
|
34
|
+
execFileSync(cmd, args, { stdio: "pipe", timeout: 30_000 }).toString();
|
|
35
|
+
|
|
36
|
+
/** One answer per process and format: an install asks for it once per host. */
|
|
37
|
+
const cache = new Map();
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Where this Mac's Xcode materialized its plugin, and which build it came from.
|
|
41
|
+
* Null without developer tools, with an Xcode older than 27.1, or when `xcrun`
|
|
42
|
+
* fails.
|
|
43
|
+
*
|
|
44
|
+
* `xcode-select -p` is asked first because `/usr/bin/xcrun` on a Mac without
|
|
45
|
+
* developer tools opens the system's install-the-tools dialog instead of
|
|
46
|
+
* failing.
|
|
47
|
+
*
|
|
48
|
+
* @param {"claude"|"codex"} format
|
|
49
|
+
* @param {{run?: (cmd: string, args: string[]) => string, env?: object}} [opts]
|
|
50
|
+
* @returns {{path: string, build: string, skills: string[]}|null}
|
|
51
|
+
*/
|
|
52
|
+
export function resolveXcodePlugin(
|
|
53
|
+
format = "claude",
|
|
54
|
+
{ run = defaultRun, env = process.env } = {},
|
|
55
|
+
) {
|
|
56
|
+
const xcrun = env.MULTI_AGENT_XCRUN || "xcrun";
|
|
57
|
+
const cacheable = run === defaultRun;
|
|
58
|
+
const key = `${format}\0${xcrun}`;
|
|
59
|
+
if (cacheable && cache.has(key)) return cache.get(key);
|
|
60
|
+
const answer = resolveUncached(format, xcrun, run, env);
|
|
61
|
+
if (cacheable) cache.set(key, answer);
|
|
62
|
+
return answer;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function resolveUncached(format, xcrun, run, env) {
|
|
66
|
+
let out;
|
|
67
|
+
try {
|
|
68
|
+
if (!env.MULTI_AGENT_XCRUN) run("xcode-select", ["-p"]);
|
|
69
|
+
out = run(xcrun, ["agent", "plugin", "path", "--plugin-format", format]);
|
|
70
|
+
} catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const path = String(out || "")
|
|
74
|
+
.trim()
|
|
75
|
+
.split("\n")
|
|
76
|
+
.pop()
|
|
77
|
+
?.trim();
|
|
78
|
+
if (!path || !path.startsWith("/")) return null;
|
|
79
|
+
try {
|
|
80
|
+
const skillsDir = join(path, "skills");
|
|
81
|
+
const skills = readdirSync(skillsDir, { withFileTypes: true })
|
|
82
|
+
.filter((e) => e.isDirectory() && existsSync(join(skillsDir, e.name, "SKILL.md")))
|
|
83
|
+
.map((e) => e.name)
|
|
84
|
+
.sort();
|
|
85
|
+
return skills.length ? { path, build: basename(dirname(path)), skills } : null;
|
|
86
|
+
} catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** The Xcode build Claude Code's link was copied from, or null when not linked. */
|
|
92
|
+
export function claudeLinkedBuild(home) {
|
|
93
|
+
try {
|
|
94
|
+
return readFileSync(join(home, CLAUDE_MARKETPLACE_DIR, BUILD_STAMP), "utf8").trim() || null;
|
|
95
|
+
} catch {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Does Claude Code's own plugin registry list `xcode-integration@xcode-apple`. */
|
|
101
|
+
export function claudePluginInstalled(home) {
|
|
102
|
+
try {
|
|
103
|
+
const j = JSON.parse(
|
|
104
|
+
readFileSync(join(home, ".claude", "plugins", "installed_plugins.json"), "utf8"),
|
|
105
|
+
);
|
|
106
|
+
const entry = (j.plugins || j)[XCODE_PLUGIN_ID];
|
|
107
|
+
return Array.isArray(entry) ? entry.length > 0 : Boolean(entry);
|
|
108
|
+
} catch {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Is Apple's plugin available, and is Claude Code's link installed and at the
|
|
115
|
+
* installed build.
|
|
116
|
+
*
|
|
117
|
+
* @param {string} home
|
|
118
|
+
* @param {{run?: (cmd: string, args: string[]) => string, env?: object}} [opts]
|
|
119
|
+
*/
|
|
120
|
+
export function xcodeSkillsStatus(home, opts = {}) {
|
|
121
|
+
const plugin = resolveXcodePlugin("claude", opts);
|
|
122
|
+
const linked = claudeLinkedBuild(home);
|
|
123
|
+
return {
|
|
124
|
+
available: Boolean(plugin),
|
|
125
|
+
build: plugin?.build ?? null,
|
|
126
|
+
skills: plugin?.skills.length ?? 0,
|
|
127
|
+
claude: linked
|
|
128
|
+
? { build: linked, current: linked === plugin?.build, installed: claudePluginInstalled(home) }
|
|
129
|
+
: null,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
@@ -303,6 +303,16 @@ other outcome (`redirected`, `rejected`, `not-accepted`, `failed`, `skipped`),
|
|
|
303
303
|
with the status code or reason and the step that fixes it. The emitter runs
|
|
304
304
|
detached from phase-tracker with its output discarded, so this record is the
|
|
305
305
|
only surface on which a reporting path that stopped working shows up.
|
|
306
|
+
### xcode-skills
|
|
307
|
+
|
|
308
|
+
Is Apple's `xcode-integration` plugin, which Xcode 27.1 and later materialize
|
|
309
|
+
(`xcrun agent plugin path`), linked into Claude Code at the installed Xcode
|
|
310
|
+
build. SKIP when this Mac has no such plugin, because the pipeline's own iOS
|
|
311
|
+
skills then apply; INFO when it is available but not linked; WARN when the link
|
|
312
|
+
was copied from an older Xcode build than the one installed; OK otherwise. The
|
|
313
|
+
step is `/multi-agent:update`, which re-runs the installer's link. Apple's skills
|
|
314
|
+
are the reference for iPhone Duo and window resizing, SwiftUI, App Intents and
|
|
315
|
+
the accessibility audits, so a stale copy is a worse answer, never a failed run.
|
|
306
316
|
### unattended-contract
|
|
307
317
|
|
|
308
318
|
Is `multi-agent-refs/unattended-contract.md` installed. It is the only place
|
|
@@ -85,6 +85,7 @@ Shell scripts invoked during pipeline execution.
|
|
|
85
85
|
- `github-ssh-setup.sh` - first-run SSH key setup helper
|
|
86
86
|
- `update-check.sh` - cached registry read (`dist-tags.latest` + `dist-tags.required`); always exit 0
|
|
87
87
|
- `require-supported-version.sh` - turns the `force` signal into exit 3; fails open offline
|
|
88
|
+
- `release-notes.mjs` - every release between the installed and the new version, grouped by kind, plus each plugin the refresh moved; feeds the update summary
|
|
88
89
|
- `sync-parity-check.sh` - manual parity verification helper
|
|
89
90
|
|
|
90
91
|
## Node.js helpers (74 `.mjs` files)
|
|
@@ -60,6 +60,7 @@ import {
|
|
|
60
60
|
UNATTENDED_SETTINGS_FILE,
|
|
61
61
|
} from "../lib/unattended-settings-location.mjs";
|
|
62
62
|
import { prefsHosts, profileGaps } from "../lib/unattended-profile-check.mjs";
|
|
63
|
+
import { xcodeSkillsStatus } from "../lib/xcode-plugin.mjs";
|
|
63
64
|
|
|
64
65
|
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
65
66
|
const HOME = homedir();
|
|
@@ -103,6 +104,7 @@ const CHECK_IDS = [
|
|
|
103
104
|
"disk-space",
|
|
104
105
|
"worktree-residue",
|
|
105
106
|
"usage-report",
|
|
107
|
+
"xcode-skills",
|
|
106
108
|
];
|
|
107
109
|
|
|
108
110
|
// Only under `--profile server`. Kept in their own list so `--list-checks`
|
|
@@ -933,6 +935,41 @@ function checkUsageReport() {
|
|
|
933
935
|
);
|
|
934
936
|
}
|
|
935
937
|
|
|
938
|
+
// Apple's Xcode skills are the reference for iPhone Duo and window resizing,
|
|
939
|
+
// SwiftUI, App Intents and the accessibility audits, and Claude Code reads them
|
|
940
|
+
// from a copy the installer keeps at the installed Xcode build. A newer Xcode
|
|
941
|
+
// leaves that copy older than what the Mac offers, which degrades the answer
|
|
942
|
+
// rather than breaking a run, so it tops out at WARN.
|
|
943
|
+
function checkXcodeSkills() {
|
|
944
|
+
const s = xcodeSkillsStatus(HOME);
|
|
945
|
+
if (!s.available) {
|
|
946
|
+
skip(
|
|
947
|
+
"xcode-skills",
|
|
948
|
+
"no Xcode 27.1+ agent plugin on this Mac; the pipeline's own iOS skills apply",
|
|
949
|
+
);
|
|
950
|
+
return;
|
|
951
|
+
}
|
|
952
|
+
if (!s.claude || !s.claude.installed) {
|
|
953
|
+
report(
|
|
954
|
+
"xcode-skills",
|
|
955
|
+
"INFO",
|
|
956
|
+
`Apple's Xcode skills (${s.skills}, Xcode ${s.build}) are not linked into Claude Code`,
|
|
957
|
+
"run /multi-agent:update, or node install.js --claude from the pipeline checkout",
|
|
958
|
+
);
|
|
959
|
+
return;
|
|
960
|
+
}
|
|
961
|
+
if (!s.claude.current) {
|
|
962
|
+
report(
|
|
963
|
+
"xcode-skills",
|
|
964
|
+
"WARN",
|
|
965
|
+
`Apple's Xcode skills are linked from Xcode ${s.claude.build}, but this Mac now has ${s.build}`,
|
|
966
|
+
"run /multi-agent:update to refresh them from the installed Xcode",
|
|
967
|
+
);
|
|
968
|
+
return;
|
|
969
|
+
}
|
|
970
|
+
ok("xcode-skills");
|
|
971
|
+
}
|
|
972
|
+
|
|
936
973
|
function checkDiskSpace() {
|
|
937
974
|
let freeGb = null;
|
|
938
975
|
try {
|
|
@@ -1226,6 +1263,7 @@ function main() {
|
|
|
1226
1263
|
checkDiskSpace();
|
|
1227
1264
|
checkWorktreeResidue();
|
|
1228
1265
|
checkUsageReport();
|
|
1266
|
+
checkXcodeSkills();
|
|
1229
1267
|
if (PROFILE === "server") checkServerProfile(resolved);
|
|
1230
1268
|
|
|
1231
1269
|
const blocked = results.filter((r) => r.severity === "BLOCK");
|