@mmerterden/multi-agent-pipeline 20.18.0 → 20.20.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 +25 -0
- package/README.md +1 -1
- package/README.tr.md +1 -1
- package/docs/ecosystem.md +13 -8
- package/docs/facts.json +6 -6
- package/docs/features.md +1 -1
- package/install/catalog-history.json +1 -1
- package/manifest.json +26 -25
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/update/SKILL.md +45 -18
- package/pipeline/multi-agent-refs/cross-cli-contract.md +4 -0
- package/pipeline/multi-agent-refs/features/exploratory-testing.md +7 -0
- package/pipeline/multi-agent-refs/features/external-context-injection.md +1 -1
- package/pipeline/multi-agent-refs/features/unattended-security.md +3 -2
- package/pipeline/multi-agent-refs/refactor/toolkit-research.md +3 -1
- package/pipeline/schemas/unattended-profile.json +1 -1
- package/pipeline/scripts/README.md +1 -0
- package/pipeline/scripts/release-notes.mjs +167 -0
- package/pipeline/scripts/unattended_policy.py +8 -0
- package/pipeline/skills/.skill-manifest.json +4 -4
- package/pipeline/skills/shared/external/e2e-testing/SKILL.md +39 -7
- package/pipeline/skills/shared/external/signal-community/SKILL.md +7 -1
- package/pipeline/skills/shared/external/web-testing/SKILL.md +57 -0
package/manifest.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "20.
|
|
4
|
-
"commit": "
|
|
5
|
-
"generatedAt": "2026-10-
|
|
3
|
+
"version": "20.20.0",
|
|
4
|
+
"commit": "3eaded72b1509c7426dcba713df56fd72a0a2698",
|
|
5
|
+
"generatedAt": "2026-10-11T23:40:41.943Z",
|
|
6
6
|
"algorithm": "sha256",
|
|
7
|
-
"fileCount":
|
|
7
|
+
"fileCount": 1357,
|
|
8
8
|
"files": {
|
|
9
|
-
"CHANGELOG.md": "
|
|
9
|
+
"CHANGELOG.md": "cf8a8131da43152e49483d7b7a9890a70f23e4df07c8c3e99f768ec632840e55",
|
|
10
10
|
"LICENSE": "8d8c51aaf1e1538b180c69965fa038db71be86798cc3e26a143bebfefe16a43e",
|
|
11
|
-
"README.md": "
|
|
12
|
-
"README.tr.md": "
|
|
11
|
+
"README.md": "a73f80dafda9ee106db1613bb359d56b02f53f9c3e16fb5691fef06719d2c2e9",
|
|
12
|
+
"README.tr.md": "7338743b34baa2128236775f8e11b7e7df486294e15f63268755e62d12e4fe4d",
|
|
13
13
|
"SECURITY.md": "0eb89553ddcfc56bfe9712315b55a6630ee2f579631aaeccd6ad24f8ac769a0b",
|
|
14
14
|
"docs/FIGMA_PIPELINE.md": "ea01f3ea5fef1a9cb316040a2d416fcf87dd4f2a14b5497aa00994a0b5dc7e6a",
|
|
15
15
|
"docs/adr/0001-three-model-triage.md": "79a6f1025469f607a5859add21854052d7433bc213f4aceee2e159b613eeb6a1",
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
"docs/adr/README.md": "6ff58bc97dde4f1d94df60e4e221396a46906682b429ef275fd813cd288956e1",
|
|
32
32
|
"docs/architecture.md": "04fe9630d51646962bc5b660b4c82a8a8199984dc14d993aaf5c147c4c8f6968",
|
|
33
33
|
"docs/best-practices.md": "f8b75b0d38b5896a6a852bb30a1edddeb24dab8b5b7b1d9313290e1241c72024",
|
|
34
|
-
"docs/ecosystem.md": "
|
|
34
|
+
"docs/ecosystem.md": "a1aa8134339f915749652814f4ee7291a37a926467fbb097109d5821f97aeeb8",
|
|
35
35
|
"docs/engineering.md": "550528cd47c7d2c921729c68d0782a00ac8e77a4bdfec479f6749f9c3235d188",
|
|
36
|
-
"docs/facts.json": "
|
|
37
|
-
"docs/features.md": "
|
|
36
|
+
"docs/facts.json": "3a12532eb8aab78df188985a05e593251ba248de79201ea6e5bba1ab696fbe8b",
|
|
37
|
+
"docs/features.md": "703435e309d1e37668c24bde3c2c0a7e4689a05d95449dcd394406fda1a19858",
|
|
38
38
|
"docs/performance.md": "bbf2f3922c25dcba0c1a9e69ef420e3871a729af5b35009a49b48a5d3c5cd151",
|
|
39
39
|
"docs/recovery-guide.md": "59a8f1b66b34cb9ff5507b3d54dac3b9915e184aa044d9c758d18cac818d510e",
|
|
40
40
|
"docs/server-readiness.md": "ea21eee6a08c6fc0f2d1da8058acd5a50c556cea486d3acfe48fc0b23f4581fc",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"install/_telemetry.mjs": "5433d753f909beed2c8789272bba05e245482c472f83d3444f58000c4c9a634b",
|
|
53
53
|
"install/_unattended-profile.mjs": "e1ed82bde35d19105ee12c2a551eb778912b0e5c93ab227fd15c993098d98de0",
|
|
54
54
|
"install/_xcode-skills.mjs": "1a7e20f1e6743324b941c5d3ecac9f94c65fff1534ffd9c63b39cbea4f8d101a",
|
|
55
|
-
"install/catalog-history.json": "
|
|
55
|
+
"install/catalog-history.json": "9f8bd5ce3b6d5d49faec993a50111b4942be2a9402c4a5c38ba7ff6bdfde3e48",
|
|
56
56
|
"install/claude.mjs": "106ce353ebc19c8319d057ce342e1f989519510465c798399076b5f3d8727904",
|
|
57
57
|
"install/codex.mjs": "08925fe9f3ecdf509b37f01105652c847475d20fcde2db0d679b9a7d663ca145",
|
|
58
58
|
"install/copilot.mjs": "41dc394b8a3ae77cfd194ce0ca9bbcafce9bdce349f1f72eeb86569f993e15fe",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"install/templates/multi-agent-autopilot-awake.plist.template": "ddd25c76c56fcbb38a89de8e35637372d70ace993d6bc487a88ca9cfb702fe1f",
|
|
64
64
|
"install/templates/multi-agent-autopilot.plist.template": "122c8a61cd927edd99375d6e3da40f1d42bcceed5b6641785c8b28bb930bc77e",
|
|
65
65
|
"install/unattended-profile-legacy.json": "f52e86b998956f09ad306b1735a6c10b58580d7082d8a55665a4c6bb15c3aa1f",
|
|
66
|
-
"package.json": "
|
|
66
|
+
"package.json": "6f50165ff1e18ae3f084464e171f7e710d106f37a96d77927b525509b5981de0",
|
|
67
67
|
"pipeline/agents/android-architect.md": "11fb74543cb0ebcf9525ca6654fe95d53da7229e0bf4a1149b31fd9005abc453",
|
|
68
68
|
"pipeline/agents/backend-architect.md": "b02a606c301e4714131aed70ae6d16eeb77fbc819a001e2752cff2488d4246de",
|
|
69
69
|
"pipeline/agents/bulk-reader.md": "6597052cd7d205bac2b1c7633f5232fe1a40730664a913b8eb77efd5a786dc25",
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
"pipeline/commands/multi-agent/test/SKILL.md": "5a67be2b1ec0321e79f8b7f35be53676e349e55a4f8ca09a07f0de89dadac8c4",
|
|
143
143
|
"pipeline/commands/multi-agent/testflight-validation/SKILL.md": "38fa8d3d3c8340d025e100c53a70183cbad22665b7ddccbb6102c05986cce489",
|
|
144
144
|
"pipeline/commands/multi-agent/uninstall/SKILL.md": "b2124820a6e10cdd72be71df2183aad4f8bd8988ec90248c88599c1514f7d9ab",
|
|
145
|
-
"pipeline/commands/multi-agent/update/SKILL.md": "
|
|
145
|
+
"pipeline/commands/multi-agent/update/SKILL.md": "4b9ca40382eb2bd06f8b1a483d6232d1e9941d6e6288a21e83fa977482a1bae7",
|
|
146
146
|
"pipeline/commands/sim-test.md": "b09038b9511108c77fae5e0c11f8515b5c64eb8b63a77fe8c2ff5907ddd0313a",
|
|
147
147
|
"pipeline/contract/CHANGELOG.md": "0813f5737219bafad3eb4daf809b9754937fae8533e07caf3850e30b2685662b",
|
|
148
148
|
"pipeline/contract/README.md": "6239eb0877d70e70d63db74bae3499599b0425c80c71eceb6bb0a981523eaa89",
|
|
@@ -271,7 +271,7 @@
|
|
|
271
271
|
"pipeline/multi-agent-refs/component-dispatch.md": "2ab9094aa716397e4840cd48f736c3f4fc3e7c4f9ccc5c7c7c52f9e8b0a28fb5",
|
|
272
272
|
"pipeline/multi-agent-refs/component-generation.md": "04fdb3fd0f1c129e1df8243184a3225cebd9c4f63511d6015eb356a92eda8891",
|
|
273
273
|
"pipeline/multi-agent-refs/conventions-defaults.md": "608a05ec6332fc19ee12c0418fbf25165f80e6c06cfee9efed7f27fab185d97d",
|
|
274
|
-
"pipeline/multi-agent-refs/cross-cli-contract.md": "
|
|
274
|
+
"pipeline/multi-agent-refs/cross-cli-contract.md": "d7f6dc9e0d589077150c807ca2def54f78f5aa717d266941f70458e6480069b2",
|
|
275
275
|
"pipeline/multi-agent-refs/design-check/build-launch.md": "0ac64d07ef7389e22f7443f79c70a0a4f8bb87dcff6dbc94c63e034febe194ea",
|
|
276
276
|
"pipeline/multi-agent-refs/design-check/compare.md": "2a0a89542a8bfefcfeaf1068dd91edb6947392f911f23e8b4857e4ace8fd15d7",
|
|
277
277
|
"pipeline/multi-agent-refs/design-check/drive-capture.md": "dee4cd6230a401bc9e9dc82fc08109803dd2630c872c5b77a43cf17db062b05f",
|
|
@@ -293,8 +293,8 @@
|
|
|
293
293
|
"pipeline/multi-agent-refs/features/design-conformance.md": "a88ca595827cafa0c87c2facfcf9190dac69485e0596e5c198c6fc1613880452",
|
|
294
294
|
"pipeline/multi-agent-refs/features/dev-critic.md": "08e01edef04b5ac216f8f43332126966d33da7b95625e47a8a6cd8ac105b263f",
|
|
295
295
|
"pipeline/multi-agent-refs/features/doctor.md": "62ff75a085095b11818ffabb97bd76e62e58de6affd24f4eaf3d9f89f2fe1d66",
|
|
296
|
-
"pipeline/multi-agent-refs/features/exploratory-testing.md": "
|
|
297
|
-
"pipeline/multi-agent-refs/features/external-context-injection.md": "
|
|
296
|
+
"pipeline/multi-agent-refs/features/exploratory-testing.md": "ac534fdb9e056b1a3782f9b9e38f0b8823f85e03cb85924513079179e318c45d",
|
|
297
|
+
"pipeline/multi-agent-refs/features/external-context-injection.md": "be9a0e904efd52535fa18a254567c9d0c3fc2ed12fcbc7a116f7879048303df6",
|
|
298
298
|
"pipeline/multi-agent-refs/features/jira-context.md": "7d14802ed9ad1747e1a06dec26f22ff9e8959e03c47d7a018af45b8274aea47c",
|
|
299
299
|
"pipeline/multi-agent-refs/features/maturity-followup.md": "e663e5bcf0b3b4d4d2a67f4516dbb9fb12520dfbdedb47a9c5f57c13a9a0633e",
|
|
300
300
|
"pipeline/multi-agent-refs/features/model-fallback.md": "e6b9635124f3557013dfbfa71d414a9d9abe9ddc89f2228a5496086c8e3b0c72",
|
|
@@ -318,7 +318,7 @@
|
|
|
318
318
|
"pipeline/multi-agent-refs/features/stack-adapters.md": "71e23385da872ceed35263f4838f154800aa2da55bb6688ccca74726b70a3ef5",
|
|
319
319
|
"pipeline/multi-agent-refs/features/stack-skill-routing.md": "1989f7f64be6c5ee0a42d8e9962aead7cd7472d795915ab953d89d9382f317e6",
|
|
320
320
|
"pipeline/multi-agent-refs/features/unattended-gates.md": "46b516cac81a4eacf5d58bc3b1613e2266c26f1559be8dac060d1dc6b7d7ca01",
|
|
321
|
-
"pipeline/multi-agent-refs/features/unattended-security.md": "
|
|
321
|
+
"pipeline/multi-agent-refs/features/unattended-security.md": "24235b0479342e4a9f0edb88d387619dd5f222ea82769b99acbc703392769005",
|
|
322
322
|
"pipeline/multi-agent-refs/features/url-enrichment.md": "72e01a799d9fa54b56c762ba404a9f9236adbbf98320e395a96f6b0f5917e76b",
|
|
323
323
|
"pipeline/multi-agent-refs/features/usage-reporting.md": "bd8643e804a70d86679e431368e2fff7a8fbe7b121837340e745b1dd221a428d",
|
|
324
324
|
"pipeline/multi-agent-refs/features/valven.md": "13b1fb8a3815330f6f970181506ac117e0d1c42761e5a83454edbd0b383ee1a7",
|
|
@@ -358,7 +358,7 @@
|
|
|
358
358
|
"pipeline/multi-agent-refs/refactor/drift.md": "4fd4144785c60fef18e0532035c33343eb01da884e36f89ef42bf89ed69171d3",
|
|
359
359
|
"pipeline/multi-agent-refs/refactor/observations.md": "7a63a7043bf1c42a78296ab082b1cace67fbcdf0078fec736fffd9af3147b6ce",
|
|
360
360
|
"pipeline/multi-agent-refs/refactor/run-errors.md": "4afc33fb591fabb2ec2bcbb74f0e5bae3645c6d507d756cf552ea45a4332bcd3",
|
|
361
|
-
"pipeline/multi-agent-refs/refactor/toolkit-research.md": "
|
|
361
|
+
"pipeline/multi-agent-refs/refactor/toolkit-research.md": "94e52343111fd113b0464a3d390861aa7f44d45879e06bdd9e83591d9dfe0d12",
|
|
362
362
|
"pipeline/multi-agent-refs/research/engine.md": "6e812c2637f563a6fa53ade6690dcc69fa819450a74405eb138883dd19cef0b2",
|
|
363
363
|
"pipeline/multi-agent-refs/rules.md": "0b272d9ee2ba4a2fde28313f3084b8caa3d26f10e78d6099547a800e6c33534a",
|
|
364
364
|
"pipeline/multi-agent-refs/setup/app-store-connect.md": "6230406b14615f7a412f95542c3c10ea8f4d2681d9a39f7910c9f5f8592184bd",
|
|
@@ -480,10 +480,10 @@
|
|
|
480
480
|
"pipeline/schemas/triage-output.schema.json": "60e329a22cea0f0ed9fa1e8e78f9b512ef283277346b08a194ad491e0bad0995",
|
|
481
481
|
"pipeline/schemas/unattended-policy.json": "64ca8d36c29766af2f9e94435f017650799ee62a8ad04c5d5cf802b75550073b",
|
|
482
482
|
"pipeline/schemas/unattended-policy.schema.json": "d1aab1b49541ca77c3ca5ee69158878b61ea47a5bfdfe06cd548c3315ffd09c4",
|
|
483
|
-
"pipeline/schemas/unattended-profile.json": "
|
|
483
|
+
"pipeline/schemas/unattended-profile.json": "25ca36388640a22b47b08f01f515b192ee4210eb820c85fd3d0485e0247afd8c",
|
|
484
484
|
"pipeline/schemas/unattended-profile.schema.json": "a9c0979f0d0742826e410fdbfe1ae1c4a56b05b4e638eec42d4c276d6f48f701",
|
|
485
485
|
"pipeline/schemas/worktrees.schema.json": "4e15c413c00811814eee734d86734ad9e1d34a37737f7df641b389ce5d8d134b",
|
|
486
|
-
"pipeline/scripts/README.md": "
|
|
486
|
+
"pipeline/scripts/README.md": "4cdf7054cddbe5cdcb08460f68782f2347a26c8c343d8ef8418714464672b36c",
|
|
487
487
|
"pipeline/scripts/_autopilot-config.mjs": "0f42d2791f1d71c4aad5a0735ca56fef1ed27d275b72f99d8ca8f95fcb8aa83a",
|
|
488
488
|
"pipeline/scripts/_autopilot-ops.mjs": "5e84d628482434c8f09dc69601c73ab70e928af15c2f068d998d2f61bd692d1a",
|
|
489
489
|
"pipeline/scripts/_autopilot-outcomes.mjs": "5b2423814d979ed5c657473290083b296f7245d40507c866e7931b2771001236",
|
|
@@ -617,6 +617,7 @@
|
|
|
617
617
|
"pipeline/scripts/prune-logs.sh": "c5587b33104c7253e07be8cce8249b50014c52dfdf232de637811ffdd88e95e4",
|
|
618
618
|
"pipeline/scripts/purge.sh": "95c60b272ae47209893dba9b17528538592bb5636da47940a02734cd9b4f0ce5",
|
|
619
619
|
"pipeline/scripts/record-phase.mjs": "041dc262e54f38b66299f45c44db7918812e599a773f5a3dc78cfd09ab5e155e",
|
|
620
|
+
"pipeline/scripts/release-notes.mjs": "05430926cf679534978bcc79c160a6787aaf04831b8b8489d8bbc9fa343a14af",
|
|
620
621
|
"pipeline/scripts/render-agent-log-cost.sh": "6c58c1f5754ff5754485a0c1b66f4cd713575d2e8ebb1630aedf2f87fe34ef4d",
|
|
621
622
|
"pipeline/scripts/render-cost-summary.sh": "ce9647332ab9a3e518af98f52a6fc70baab9fd3c09ec5f9e85bae2d67078a5e3",
|
|
622
623
|
"pipeline/scripts/render-work-summary.sh": "ee4db04ebc145cc2fc7fa9a533d42b7da4da191710ef67c883502ca83b2aa67c",
|
|
@@ -661,7 +662,7 @@
|
|
|
661
662
|
"pipeline/scripts/token-budget-report.mjs": "508bbc659df478c535c0ecdd3f8611372af8fef0b0932c7b19a247af2b2b9265",
|
|
662
663
|
"pipeline/scripts/triage-memory.mjs": "2d8541145f1749593ae5728fb4c9eb3001484edb5e4d37be473aeec34d1dbe7c",
|
|
663
664
|
"pipeline/scripts/ui-tree-dumper.swift": "a09e42ef069eafa08c05afd8333e05b754ef6a7d8b9687712039b0f2c9801273",
|
|
664
|
-
"pipeline/scripts/unattended_policy.py": "
|
|
665
|
+
"pipeline/scripts/unattended_policy.py": "e2ac82b4a969fdd230e3c3f390cb31cde1e2178c4caa57574ad63a3d786f8379",
|
|
665
666
|
"pipeline/scripts/uninstall.mjs": "ba11803733cf3bfcc966f0d4aa2cc5fbed000cb37a251005f067ce0289306233",
|
|
666
667
|
"pipeline/scripts/update-check.sh": "9c00647e7ca4249414b2e5af08f61705ab5bd2106b6f66ae8ebce8aa143dc957",
|
|
667
668
|
"pipeline/scripts/update-issue-progress.sh": "ccfef87743e91272e009e396ac07461d2784b2fa84a06c802a582526eeeb9ed9",
|
|
@@ -690,7 +691,7 @@
|
|
|
690
691
|
"pipeline/scripts/worktrees.mjs": "90dfd09b70fffe9b56c331a4ae2692cc248f4898f4ee6aee4239ef0b20888a90",
|
|
691
692
|
"pipeline/scripts/write-state.mjs": "e1198bf970eace07d3eff22b394808a526e473df65d3d58aa2d5a12cfdac8b49",
|
|
692
693
|
"pipeline/scripts/write-store-config.mjs": "b994a061f6febb2ca3d396074d8b51d2c1c1f991d3072d321703380da3639a56",
|
|
693
|
-
"pipeline/skills/.skill-manifest.json": "
|
|
694
|
+
"pipeline/skills/.skill-manifest.json": "93cf5b7a3d7011a6be1e1c7601892039775051ff34ad80dc172ea4c44c82fc20",
|
|
694
695
|
"pipeline/skills/.skills-index.json": "b2917fa44e273b939549f1c3ab3dd81c26ba8168772bc7644c9fa076116d8a4c",
|
|
695
696
|
"pipeline/skills/shared/README.md": "928fe4292be729c3b7d7d0898cade8be0dfa868f208e0c6d1fe7b2c6bd6223c5",
|
|
696
697
|
"pipeline/skills/shared/core/apple-archive-compliance/SKILL.md": "7239fef717ea45b79276bfcc2c3903acd57950b6e00dd6a2a66399c4b09cbd51",
|
|
@@ -883,7 +884,7 @@
|
|
|
883
884
|
"pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md": "84b0d44b6a11daaae8383c7662e71dd2cd56d92bf52bde7537385beb66eb418c",
|
|
884
885
|
"pipeline/skills/shared/external/docker-expert/SKILL.md": "b3db936caa89a2c249ae64896cfb4c0a72ac45064cc081d6f99c78efe6a1f9e9",
|
|
885
886
|
"pipeline/skills/shared/external/docker-expert/references/patterns.md": "1d2052123d6c1c0379f4ebf5d153d649ca22807b7c9c70b88b0dba9c249eecc6",
|
|
886
|
-
"pipeline/skills/shared/external/e2e-testing/SKILL.md": "
|
|
887
|
+
"pipeline/skills/shared/external/e2e-testing/SKILL.md": "6d5fa81328d8b4c8ccc8e273487b7f27e6100f7192b2b3bdd2387b333a119659",
|
|
887
888
|
"pipeline/skills/shared/external/e2e-testing/references/document-fixtures.md": "0a6939374affdf5f0ed40ed91ea28c66f23bac027a4431ac956baeb9de850c89",
|
|
888
889
|
"pipeline/skills/shared/external/energykit/SKILL.md": "a557acc6e324f4b841f411cfb0d9040094c8d2934aefe5cb4eecd5a2a6b0e402",
|
|
889
890
|
"pipeline/skills/shared/external/energykit/evals/evals.json": "e2adae145af422785b57c96dc5a0789d5d99fdba9b767d2a79397d67334ccefc",
|
|
@@ -1093,7 +1094,7 @@
|
|
|
1093
1094
|
"pipeline/skills/shared/external/shareplay-activities/SKILL.md": "63205693c5fbc9ec3b06e04a823deaa34c69e4fa01c0a1eb3419c2d1388c3e29",
|
|
1094
1095
|
"pipeline/skills/shared/external/shareplay-activities/evals/evals.json": "3305323af4c7b60ece654487aeb568772d9e7a7b3372ed145da4d65eb561d59a",
|
|
1095
1096
|
"pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md": "8f0ead5b253d0e79ad543718a56b15749848b6949684334f22203e3afbfb7ff3",
|
|
1096
|
-
"pipeline/skills/shared/external/signal-community/SKILL.md": "
|
|
1097
|
+
"pipeline/skills/shared/external/signal-community/SKILL.md": "66b584551428d9078c88ef5d1164c77a1985accaebdc373eb4bfcdd5e65ed0f1",
|
|
1097
1098
|
"pipeline/skills/shared/external/skill-creator/SKILL.md": "f80c5f74dc285240d0213a4e6e0c178a9f38142f0eb7d6956d7c89c061009b71",
|
|
1098
1099
|
"pipeline/skills/shared/external/skill-creator/audit.md": "65499fe230f872deff1611a1d54fd0ecc4a57dcb59a04fb59cce729155afd167",
|
|
1099
1100
|
"pipeline/skills/shared/external/skill-creator/checklist.md": "de558dc9b08ab8480e19a7eb1c3b3f880dcf08ba727ed20d782ea443f8fd403e",
|
|
@@ -1330,7 +1331,7 @@
|
|
|
1330
1331
|
"pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md": "81a54949c6abde31019100f85876c69488e5bf80deb77ddbc8504955a87a82a3",
|
|
1331
1332
|
"pipeline/skills/shared/external/web-accessibility/SKILL.md": "a1cd782292982a3c37fd8d1eedaae85f860886f492b2666b73735c6261025594",
|
|
1332
1333
|
"pipeline/skills/shared/external/web-performance/SKILL.md": "b9983bb39f9a65daad5aca4fb97c88ecbd7c0639b39023dc5c7c6784c4c1c868",
|
|
1333
|
-
"pipeline/skills/shared/external/web-testing/SKILL.md": "
|
|
1334
|
+
"pipeline/skills/shared/external/web-testing/SKILL.md": "28a088947d4c9ab216ae92131c42a700966d8b531047fa5a0af5bfa870376e11",
|
|
1334
1335
|
"pipeline/skills/shared/external/widgetkit/SKILL.md": "d4bce1c362e57616b252304414cfd01354586c7ed0be6c22f61efcc0980e26b0",
|
|
1335
1336
|
"pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md": "b04ca376ecc86ab17a9a6e86c081b6c7720cb6c614c091ec0ef1d41ba2d30a16",
|
|
1336
1337
|
"pipeline/skills/shared/external/xcode-build-benchmark/SKILL.md": "3554d7b310fadfb1afd48793d01f08d91e47a596af0001bd575b61e21e29c19f",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "20.
|
|
3
|
+
"version": "20.20.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",
|
|
@@ -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
|
|
@@ -111,6 +111,10 @@ it does not. Contracts: `features/exploratory-testing.md`,
|
|
|
111
111
|
| Secrets by reference | `secret_ref` on the type tools | ≥ v3.19.0 |
|
|
112
112
|
| Parallel web sessions, replay | `session` on the web tools; `save_as` / `replay` | ≥ v3.19.0 |
|
|
113
113
|
| Travel document fixtures | `document_generate`, `document_mrz_build` | ≥ v3.19.0 |
|
|
114
|
+
| ARIA assertions | `expect_aria` step, `web_assert_aria` | ≥ v3.20.0 |
|
|
115
|
+
| Web states and locators | `web_route`, `web_network_state`, `web_clock`, `web_dialog`, `web_upload`, `web_drag`, `web_hover`, `web_fill_form`, `web_find`, `web_generate_locator`, `web_trace`; `request_id` on `web_network`; `locator` on `web_click` / `web_type` | ≥ v3.20.0 |
|
|
116
|
+
| Document fetch and crawl | `web_scrape` (formats, cache, `change_tracking`), `url` / `sitemap` / `include_paths` / `llms_txt` on `web_crawl` and `web_map` | ≥ v3.20.0 |
|
|
117
|
+
| Research modes and threads | `mode`, `recency`, `domains`, `sources`, `thread_id` on `research_ask`; `arxiv` and `fetch_content` on `research_search` | ≥ v3.20.0 |
|
|
114
118
|
|
|
115
119
|
---
|
|
116
120
|
|
|
@@ -123,6 +123,13 @@ taps as before and say so in the report:
|
|
|
123
123
|
value; the value never enters the transcript, the run file or a finding.
|
|
124
124
|
- **Traces.** A failed `agent_run_steps` writes a `trace.md`; put its path in
|
|
125
125
|
the step's `trace` and in the finding's `evidence` as `kind: "trace"`.
|
|
126
|
+
- **States the happy path skips (web, ≥ v3.20.0).** Reach error, empty, slow
|
|
127
|
+
and offline states on purpose: `web_route` fulfills an endpoint with an error
|
|
128
|
+
status or an empty body, aborts it or delays it; `web_network_state` goes
|
|
129
|
+
offline; `web_clock` moves time for expiry and countdowns; `web_dialog`
|
|
130
|
+
answers a confirm before the click that opens it. Clear the routes when the
|
|
131
|
+
state is done. `expect_aria` checks a screen's structure against a template
|
|
132
|
+
without a judge.
|
|
126
133
|
- **Replay.** `save_as` stores a step sequence that reached a finding, and
|
|
127
134
|
`replay` runs it again. `REPLAY_DIVERGED` means the app no longer follows the
|
|
128
135
|
recorded path: an automation block, and a hint that the screen changed.
|
|
@@ -35,7 +35,7 @@ One fetcher per type. Each fetcher emits a normalized JSON view that the analysi
|
|
|
35
35
|
| `swagger` | `~/.claude/lib/fetch-swagger.sh <url>` → endpoints[], request/response examples | `state.fetchedContext.swagger[]` |
|
|
36
36
|
| `confluence` | `~/.claude/lib/fetch-confluence.sh <url>` → page body, code blocks, extracted API contracts | `state.fetchedContext.confluence[]` |
|
|
37
37
|
| `figma` | no standalone fetcher - resolve via the Figma 3-tier chain (Tier 1 MCP tools, Tier 2 `~/.claude/lib/figma-screenshot.sh` + REST) when the task is a component; otherwise advisory only | `state.fetchedContext.figma[]` |
|
|
38
|
-
| `generic-doc` | no automatic fetcher - surfaced as advisory
|
|
38
|
+
| `generic-doc` | no automatic fetcher - surfaced as advisory. When the URL turns out to be load-bearing, the agent reads it with the toolkit's `web_scrape` (`formats: ["markdown"]`; ≥ v3.20.0) when the server is registered, else with WebFetch. `web_scrape` returns main content as Markdown fenced as untrusted with prompt-injection flags, and serves a repeat from its cache | n/a (read into the prompt, not stored) |
|
|
39
39
|
|
|
40
40
|
## Exit code handling
|
|
41
41
|
|
|
@@ -231,9 +231,10 @@ allowed host is allowed; `corpDomain` is not used, because it is an email domain
|
|
|
231
231
|
and would allow every host under it. The host is parsed with
|
|
232
232
|
`urllib.parse.urlsplit`, so `http://evil.com#@github.com/` resolves to `evil.com`
|
|
233
233
|
and is refused. The same allowlist governs `WebFetch`, the toolkit's
|
|
234
|
-
`web_goto` / `web_crawl` (any URL argument), each step of `agent_run_steps`,
|
|
234
|
+
`web_goto` / `web_crawl` / `web_map` / `web_scrape` (any URL argument), each step of `agent_run_steps`,
|
|
235
235
|
and a web URL given to `ios_open_url` / `android_open_url`; `web_eval` is
|
|
236
|
-
refused outright because inline JavaScript can reach any host.
|
|
236
|
+
refused outright because inline JavaScript can reach any host. Every entry of a
|
|
237
|
+
`paths` list (`web_upload`) is held to the same path rules as a single path argument. Reads only: a request body or
|
|
237
238
|
upload - `-d`/`--data*`, `-F`/`--form`, `-T`/`--upload-file`, and their attached
|
|
238
239
|
and clustered short forms (`-d@file`, `-sd`, `-Tfile`) - is **refused outright**,
|
|
239
240
|
whatever the host, rather than allowed to an allowlisted one; a run has nothing
|
|
@@ -28,10 +28,12 @@ Loaded on demand by `/multi-agent:refactor` Step 0c. The SKILL.md carries the st
|
|
|
28
28
|
|---|------|---------------|-----------------|
|
|
29
29
|
| 1 | MCP protocol | spec revisions + `@modelcontextprotocol/sdk` releases | protocol features released since the pinned SDK range that the server does not use yet: tool annotations (`readOnlyHint` / `destructiveHint` / `idempotentHint` / `openWorldHint`), `outputSchema` + structured content, resource links in results, progress + cancellation, `tools/list_changed`, pagination, elicitation |
|
|
30
30
|
| 2 | Host clients | Claude Code / Copilot CLI / Cursor / Antigravity docs + release notes | per-tool description budget, tool-count ceilings, naming conventions, image and output size limits, permission / allowlist ergonomics |
|
|
31
|
-
| 3 | Peer servers | GitHub search on the same domain terms + `stars:>50` | tool surfaces we lack, conventions peers converged on, and what to discard as out of scope |
|
|
31
|
+
| 3 | Peer servers | GitHub search on the same domain terms + `stars:>50`; standing watchlist: `microsoft/playwright-mcp` (browser tool surface, capability groups), `firecrawl/firecrawl-mcp-server` (scrape / crawl / map / extract formats). Check each peer's license before reading code: AGPL or unlicensed means the idea only | tool surfaces we lack, conventions peers converged on, and what to discard as out of scope |
|
|
32
32
|
| 4 | Wrapped tooling | `xcrun simctl help`, `idb`, `adb`, `xcodebuild`, Playwright release notes, Apple ITMS + App Store Review Guidelines | deprecated flags still in use, new capabilities worth a tool, audit rules that changed |
|
|
33
33
|
| 5 | Field practice | X / Twitter, Reddit, MCP community threads | what server authors actually changed recently (transport choice, output-token diets, sandboxing, error shape) |
|
|
34
34
|
|
|
35
|
+
When the toolkit itself is registered, run the axes through it: `research_ask` with `mode: "pro"` (or `"deep"` for a whole axis) and `recency: "month"` for release-note questions, `research_search` with `provider: "arxiv"` for papers, `web_scrape` with `change_tracking` on a release-notes page to see what moved since the last refactor. WebSearch / WebFetch stay the fallback.
|
|
36
|
+
|
|
35
37
|
**Audit the toolkit against the findings** - run the checks, do not assume:
|
|
36
38
|
|
|
37
39
|
```bash
|
|
@@ -144,7 +144,7 @@
|
|
|
144
144
|
[
|
|
145
145
|
"MCP_TOOLKIT_URL_POLICY",
|
|
146
146
|
"strict",
|
|
147
|
-
"web_goto and
|
|
147
|
+
"web_goto, web_crawl, web_map and web_scrape refuse loopback, link-local and metadata addresses"
|
|
148
148
|
],
|
|
149
149
|
[
|
|
150
150
|
"MCP_TOOLKIT_INDEX_DENY",
|
|
@@ -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)
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* release-notes.mjs - what an update brought, grouped so the user can be told.
|
|
4
|
+
*
|
|
5
|
+
* `/multi-agent:update` runs this from the release it just unpacked, against that
|
|
6
|
+
* release's CHANGELOG: every version after the one that was installed, up to the
|
|
7
|
+
* one now installed, with its bullets grouped by kind (added, changed, fixed,
|
|
8
|
+
* removed, ...). A jump across many releases is reported whole, not cut at a line
|
|
9
|
+
* count. The same is done for each stack plugin the plugin refresh moved, read
|
|
10
|
+
* from that plugin's CHANGELOG in the marketplace checkout.
|
|
11
|
+
*
|
|
12
|
+
* The output is data for the update step, which summarizes it for the user in
|
|
13
|
+
* their language. It never fails an update: a missing or unreadable CHANGELOG is
|
|
14
|
+
* empty notes and exit 0.
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* release-notes.mjs --changelog <CHANGELOG.md> --from <old> --to <new>
|
|
18
|
+
* [--plugins-dir <marketplace>/plugins --plugin-refresh-log <file>]
|
|
19
|
+
*
|
|
20
|
+
* stdout: JSON `{ pipeline: Notes, plugins: [{ name, from, to, notes: Notes }] }`
|
|
21
|
+
* where Notes is `{ from, to, versions: [{ version, date, sections }], counts }`.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
25
|
+
import { join } from "node:path";
|
|
26
|
+
import { pathToFileURL } from "node:url";
|
|
27
|
+
|
|
28
|
+
import { runMain } from "../lib/fatal.mjs";
|
|
29
|
+
|
|
30
|
+
const RELEASE_RE = /^## \[(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)\](?:\s*-\s*(.+))?\s*$/;
|
|
31
|
+
const SECTION_RE = /^### (.+?)\s*$/;
|
|
32
|
+
|
|
33
|
+
function cmp(a, b) {
|
|
34
|
+
const [pa, qa = ""] = a.split("-");
|
|
35
|
+
const [pb, qb = ""] = b.split("-");
|
|
36
|
+
const x = pa.split(".").map(Number);
|
|
37
|
+
const y = pb.split(".").map(Number);
|
|
38
|
+
for (let i = 0; i < 3; i++) if (x[i] !== y[i]) return x[i] - y[i];
|
|
39
|
+
if (qa === qb) return 0;
|
|
40
|
+
if (!qa) return 1;
|
|
41
|
+
if (!qb) return -1;
|
|
42
|
+
return qa < qb ? -1 : 1;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Released versions in a Keep a Changelog file, newest first as written.
|
|
47
|
+
* `## [Unreleased]` is skipped; a bullet's wrapped lines are joined.
|
|
48
|
+
*
|
|
49
|
+
* @param {string} text
|
|
50
|
+
* @returns {{version: string, date: string|null, sections: Record<string, string[]>}[]}
|
|
51
|
+
*/
|
|
52
|
+
export function parseChangelog(text) {
|
|
53
|
+
const releases = [];
|
|
54
|
+
let release = null;
|
|
55
|
+
let section = null;
|
|
56
|
+
let bullet = null;
|
|
57
|
+
const flush = () => {
|
|
58
|
+
if (bullet !== null && release && section) release.sections[section].push(bullet.trim());
|
|
59
|
+
bullet = null;
|
|
60
|
+
};
|
|
61
|
+
for (const line of String(text || "").split("\n")) {
|
|
62
|
+
if (line.startsWith("## ")) {
|
|
63
|
+
flush();
|
|
64
|
+
const m = RELEASE_RE.exec(line);
|
|
65
|
+
release = m ? { version: m[1], date: m[2]?.trim() || null, sections: {} } : null;
|
|
66
|
+
if (release) releases.push(release);
|
|
67
|
+
section = null;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (!release) continue;
|
|
71
|
+
const s = SECTION_RE.exec(line);
|
|
72
|
+
if (s) {
|
|
73
|
+
flush();
|
|
74
|
+
section = s[1].toLowerCase();
|
|
75
|
+
release.sections[section] ||= [];
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (!section) continue;
|
|
79
|
+
if (/^[-*] /.test(line)) {
|
|
80
|
+
flush();
|
|
81
|
+
bullet = line.slice(2);
|
|
82
|
+
} else if (bullet !== null && /^\s+\S/.test(line)) {
|
|
83
|
+
bullet += " " + line.trim();
|
|
84
|
+
} else if (!line.trim()) {
|
|
85
|
+
flush();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
flush();
|
|
89
|
+
return releases;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Releases after `from` up to and including `to`, newest first, with a count of
|
|
94
|
+
* bullets per section across all of them.
|
|
95
|
+
*
|
|
96
|
+
* @param {string} text
|
|
97
|
+
* @param {{from: string, to: string}} range
|
|
98
|
+
*/
|
|
99
|
+
export function releaseNotes(text, { from, to }) {
|
|
100
|
+
const versions = parseChangelog(text)
|
|
101
|
+
.filter((r) => cmp(r.version, from) > 0 && cmp(r.version, to) <= 0)
|
|
102
|
+
.sort((a, b) => cmp(b.version, a.version));
|
|
103
|
+
const counts = {};
|
|
104
|
+
for (const v of versions) {
|
|
105
|
+
for (const [k, items] of Object.entries(v.sections))
|
|
106
|
+
counts[k] = (counts[k] || 0) + items.length;
|
|
107
|
+
}
|
|
108
|
+
return { from, to, versions, counts };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Plugins the refresh moved, from the CLI's own lines
|
|
113
|
+
* (`Plugin "<name>" updated from <a> to <b> for scope ...`). A plugin updated in
|
|
114
|
+
* several scopes is reported once, from the oldest version any of them had.
|
|
115
|
+
*
|
|
116
|
+
* @param {string} output
|
|
117
|
+
* @returns {{name: string, from: string, to: string}[]}
|
|
118
|
+
*/
|
|
119
|
+
export function pluginUpdates(output) {
|
|
120
|
+
const byName = new Map();
|
|
121
|
+
const re = /Plugin "([^"]+)" updated from (\S+) to (\S+)/g;
|
|
122
|
+
for (const m of String(output || "").matchAll(re)) {
|
|
123
|
+
const [, name, from, to] = m;
|
|
124
|
+
const seen = byName.get(name);
|
|
125
|
+
if (!seen) byName.set(name, { name, from, to });
|
|
126
|
+
else {
|
|
127
|
+
if (cmp(from, seen.from) < 0) seen.from = from;
|
|
128
|
+
if (cmp(to, seen.to) > 0) seen.to = to;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return [...byName.values()];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function read(path) {
|
|
135
|
+
try {
|
|
136
|
+
return existsSync(path) ? readFileSync(path, "utf8") : "";
|
|
137
|
+
} catch {
|
|
138
|
+
return "";
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function arg(argv, name) {
|
|
143
|
+
const i = argv.indexOf(name);
|
|
144
|
+
return i >= 0 ? argv[i + 1] : undefined;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export function main(argv = process.argv.slice(2)) {
|
|
148
|
+
const from = arg(argv, "--from") || "0.0.0";
|
|
149
|
+
const to = arg(argv, "--to") || from;
|
|
150
|
+
const pipeline = releaseNotes(read(arg(argv, "--changelog") || ""), { from, to });
|
|
151
|
+
|
|
152
|
+
const pluginsDir = arg(argv, "--plugins-dir");
|
|
153
|
+
const refreshLog = arg(argv, "--plugin-refresh-log");
|
|
154
|
+
const plugins = [];
|
|
155
|
+
if (pluginsDir && refreshLog) {
|
|
156
|
+
for (const u of pluginUpdates(read(refreshLog))) {
|
|
157
|
+
const notes = releaseNotes(read(join(pluginsDir, u.name, "CHANGELOG.md")), u);
|
|
158
|
+
plugins.push({ ...u, notes });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
process.stdout.write(JSON.stringify({ pipeline, plugins }, null, 2) + "\n");
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (import.meta.url === pathToFileURL(process.argv[1] || "").href) {
|
|
166
|
+
runMain("release-notes", () => main());
|
|
167
|
+
}
|
|
@@ -2627,6 +2627,14 @@ TOOLKIT_PATH_KEYS = ("path", "filename", "out_dir", "output", "output_path", "ou
|
|
|
2627
2627
|
|
|
2628
2628
|
def _toolkit_path_refusal(name, ti, policy, env, cwd):
|
|
2629
2629
|
for key, value in ti.items():
|
|
2630
|
+
if isinstance(value, list) and (key == "paths" or key.endswith("_paths")):
|
|
2631
|
+
for item in value:
|
|
2632
|
+
if not isinstance(item, str):
|
|
2633
|
+
return f"{name} {key}: an entry that is not a string cannot be checked"
|
|
2634
|
+
r = check_path(item, cwd, policy, env)
|
|
2635
|
+
if r:
|
|
2636
|
+
return f"{name} {key}: {r}"
|
|
2637
|
+
continue
|
|
2630
2638
|
if not isinstance(value, str) or not value:
|
|
2631
2639
|
continue
|
|
2632
2640
|
if key in TOOLKIT_PATH_KEYS or key.endswith("_path"):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-10-
|
|
3
|
+
"generatedAt": "2026-10-11T20:10:05Z",
|
|
4
4
|
"skillCount": 228,
|
|
5
5
|
"entries": [
|
|
6
6
|
{
|
|
@@ -457,7 +457,7 @@
|
|
|
457
457
|
},
|
|
458
458
|
{
|
|
459
459
|
"path": "shared/external/e2e-testing/SKILL.md",
|
|
460
|
-
"sha256": "
|
|
460
|
+
"sha256": "6d5fa81328d8b4c8ccc8e273487b7f27e6100f7192b2b3bdd2387b333a119659"
|
|
461
461
|
},
|
|
462
462
|
{
|
|
463
463
|
"path": "shared/external/energykit/SKILL.md",
|
|
@@ -713,7 +713,7 @@
|
|
|
713
713
|
},
|
|
714
714
|
{
|
|
715
715
|
"path": "shared/external/signal-community/SKILL.md",
|
|
716
|
-
"sha256": "
|
|
716
|
+
"sha256": "66b584551428d9078c88ef5d1164c77a1985accaebdc373eb4bfcdd5e65ed0f1"
|
|
717
717
|
},
|
|
718
718
|
{
|
|
719
719
|
"path": "shared/external/skill-creator/SKILL.md",
|
|
@@ -889,7 +889,7 @@
|
|
|
889
889
|
},
|
|
890
890
|
{
|
|
891
891
|
"path": "shared/external/web-testing/SKILL.md",
|
|
892
|
-
"sha256": "
|
|
892
|
+
"sha256": "28a088947d4c9ab216ae92131c42a700966d8b531047fa5a0af5bfa870376e11"
|
|
893
893
|
},
|
|
894
894
|
{
|
|
895
895
|
"path": "shared/external/widgetkit/SKILL.md",
|