@unbrained/pm-cli 2026.6.24 → 2026.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -0
- package/CHANGELOG.md +113 -1
- package/CONTRIBUTING.md +30 -0
- package/README.md +16 -3
- package/dist/cli/bootstrap-args.js +89 -79
- package/dist/cli/bootstrap-args.js.map +1 -1
- package/dist/cli/commander-usage.js +3 -3
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/aggregate.js +8 -7
- package/dist/cli/commands/aggregate.js.map +1 -1
- package/dist/cli/commands/calendar.js +63 -62
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/close.d.ts +2 -4
- package/dist/cli/commands/close.js +5 -17
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/completion.js +158 -9
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/config.d.ts +1 -1
- package/dist/cli/commands/config.js +2 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/context.d.ts +31 -4
- package/dist/cli/commands/context.js +33 -10
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/contracts.js +48 -8
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.d.ts +1 -6
- package/dist/cli/commands/create.js +491 -587
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/extension/bundled-catalog.js +59 -46
- package/dist/cli/commands/extension/bundled-catalog.js.map +1 -1
- package/dist/cli/commands/extension/describe.d.ts +15 -0
- package/dist/cli/commands/extension/describe.js +48 -2
- package/dist/cli/commands/extension/describe.js.map +1 -1
- package/dist/cli/commands/extension/doctor.js +129 -75
- package/dist/cli/commands/extension/doctor.js.map +1 -1
- package/dist/cli/commands/extension/install-sources.js +37 -7
- package/dist/cli/commands/extension/install-sources.js.map +1 -1
- package/dist/cli/commands/extension/managed-state.js +101 -57
- package/dist/cli/commands/extension/managed-state.js.map +1 -1
- package/dist/cli/commands/extension/scaffold.d.ts +38 -8
- package/dist/cli/commands/extension/scaffold.js +1956 -242
- package/dist/cli/commands/extension/scaffold.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +28 -3
- package/dist/cli/commands/extension.js +1181 -880
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/index.d.ts +3 -1
- package/dist/cli/commands/index.js +5 -3
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/item-filter-options.d.ts +63 -0
- package/dist/cli/commands/item-filter-options.js +10 -0
- package/dist/cli/commands/item-filter-options.js.map +1 -0
- package/dist/cli/commands/legacy-none-tokens.d.ts +14 -0
- package/dist/cli/commands/legacy-none-tokens.js +31 -2
- package/dist/cli/commands/legacy-none-tokens.js.map +1 -1
- package/dist/cli/commands/linked-artifacts.d.ts +7 -0
- package/dist/cli/commands/linked-artifacts.js +12 -2
- package/dist/cli/commands/linked-artifacts.js.map +1 -1
- package/dist/cli/commands/list-filter-shared.js +55 -48
- package/dist/cli/commands/list-filter-shared.js.map +1 -1
- package/dist/cli/commands/list.d.ts +16 -39
- package/dist/cli/commands/list.js +127 -118
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/next.d.ts +98 -0
- package/dist/cli/commands/next.js +304 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/profile.d.ts +208 -0
- package/dist/cli/commands/profile.js +418 -0
- package/dist/cli/commands/profile.js.map +1 -0
- package/dist/cli/commands/repeatable-metadata-parsers.js +12 -13
- package/dist/cli/commands/repeatable-metadata-parsers.js.map +1 -1
- package/dist/cli/commands/schema.d.ts +7 -0
- package/dist/cli/commands/schema.js +9 -3
- package/dist/cli/commands/schema.js.map +1 -1
- package/dist/cli/commands/search.d.ts +2 -39
- package/dist/cli/commands/search.js +196 -172
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/shared-unset-fields.d.ts +30 -0
- package/dist/cli/commands/shared-unset-fields.js +161 -0
- package/dist/cli/commands/shared-unset-fields.js.map +1 -0
- package/dist/cli/commands/stats.js +15 -3
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/test.js +115 -125
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update.d.ts +1 -6
- package/dist/cli/commands/update.js +37 -232
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.js +20 -5
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/extension-command-options.js +48 -21
- package/dist/cli/extension-command-options.js.map +1 -1
- package/dist/cli/help-content.js +26 -2
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/help-json-payload.js +3 -3
- package/dist/cli/help-json-payload.js.map +1 -1
- package/dist/cli/main.js +27 -12
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.js +42 -3
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.js +86 -2
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-setup.js +67 -6
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.d.ts +9 -1
- package/dist/cli/registration-helpers.js +149 -123
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli-bundle/chunks/activity-AW6XVFH6.js +16 -0
- package/dist/cli-bundle/chunks/{activity-N7RVTLBQ.js → activity-DBLQVIP6.js} +9 -11
- package/dist/cli-bundle/chunks/{aggregate-63NWNIBR.js → aggregate-JTEF4BP7.js} +17 -18
- package/dist/cli-bundle/chunks/aggregate-JTEF4BP7.js.map +1 -0
- package/dist/cli-bundle/chunks/{aggregate-YHCYX2EV.js → aggregate-SDF7DUOD.js} +16 -17
- package/dist/cli-bundle/chunks/aggregate-SDF7DUOD.js.map +7 -0
- package/dist/cli-bundle/chunks/{append-VLQQDHMJ.js → append-LOVPGVPT.js} +8 -10
- package/dist/cli-bundle/chunks/{append-VLQQDHMJ.js.map → append-LOVPGVPT.js.map} +1 -1
- package/dist/cli-bundle/chunks/{append-PUKREFV5.js → append-QCFJSDFL.js} +10 -12
- package/dist/cli-bundle/chunks/{append-PUKREFV5.js.map → append-QCFJSDFL.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-ABYCA5VX.js → chunk-22WKIL3H.js} +9 -11
- package/dist/cli-bundle/chunks/{chunk-ABYCA5VX.js.map → chunk-22WKIL3H.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-A66VYUOV.js → chunk-2466X6E4.js} +9 -11
- package/dist/cli-bundle/chunks/{chunk-A66VYUOV.js.map → chunk-2466X6E4.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-F32L4HR6.js → chunk-27BXPBAY.js} +3 -3
- package/dist/cli-bundle/chunks/{schema-QO5I4FBL.js → chunk-2D4HATP2.js} +136 -66
- package/dist/cli-bundle/chunks/chunk-2D4HATP2.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-J7I4C5ZB.js → chunk-3J6JRJ3I.js} +153 -125
- package/dist/cli-bundle/chunks/chunk-3J6JRJ3I.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-OHDQNKJB.js → chunk-3K2M5OYU.js} +106 -34
- package/dist/cli-bundle/chunks/chunk-3K2M5OYU.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-XVYKWZNL.js → chunk-3S2KT7NG.js} +127 -127
- package/dist/cli-bundle/chunks/chunk-3S2KT7NG.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-5BBEWX6C.js → chunk-3VGN2UWE.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-N5B6WZC5.js → chunk-3XZCOZ5J.js} +115 -123
- package/dist/cli-bundle/chunks/chunk-3XZCOZ5J.js.map +1 -0
- package/dist/cli-bundle/chunks/chunk-4A3BJ675.js +799 -0
- package/dist/cli-bundle/chunks/chunk-4A3BJ675.js.map +1 -0
- package/dist/cli-bundle/chunks/chunk-4BU75MF4.js +87 -0
- package/dist/cli-bundle/chunks/chunk-4BU75MF4.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-HZF5RLKX.js → chunk-4DSGXSBL.js} +5 -7
- package/dist/cli-bundle/chunks/{chunk-HZF5RLKX.js.map → chunk-4DSGXSBL.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-JV27C7OZ.js → chunk-4DUVCVLZ.js} +4 -6
- package/dist/cli-bundle/chunks/{chunk-JV27C7OZ.js.map → chunk-4DUVCVLZ.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-IAP5KYBQ.js → chunk-4XOIEKSD.js} +563 -506
- package/dist/cli-bundle/chunks/chunk-4XOIEKSD.js.map +1 -0
- package/dist/cli-bundle/chunks/{context-5LB7UGKE.js → chunk-55SNVXRQ.js} +79 -82
- package/dist/cli-bundle/chunks/chunk-55SNVXRQ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-BFFO3AIB.js → chunk-5CGRF3L5.js} +128 -128
- package/dist/cli-bundle/chunks/chunk-5CGRF3L5.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-JKL6HRMV.js → chunk-5QFDBI4F.js} +1260 -1046
- package/dist/cli-bundle/chunks/chunk-5QFDBI4F.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-LU36E6GU.js → chunk-64HNBBFQ.js} +8 -12
- package/dist/cli-bundle/chunks/{chunk-LU36E6GU.js.map → chunk-64HNBBFQ.js.map} +1 -1
- package/dist/cli-bundle/chunks/chunk-6AQZPVHQ.js +2444 -0
- package/dist/cli-bundle/chunks/chunk-6AQZPVHQ.js.map +1 -0
- package/dist/cli-bundle/chunks/chunk-7M2HAZEB.js +17 -0
- package/dist/cli-bundle/chunks/chunk-7M2HAZEB.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-VSAABFGQ.js → chunk-7R4QEMZZ.js} +1490 -734
- package/dist/cli-bundle/chunks/chunk-7R4QEMZZ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-M6TUBOGW.js → chunk-A7FPBAQS.js} +19 -12
- package/dist/cli-bundle/chunks/chunk-A7FPBAQS.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-GQYJEEFX.js → chunk-AVEE5EHK.js} +53 -54
- package/dist/cli-bundle/chunks/chunk-AVEE5EHK.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-FMWW2JDU.js → chunk-AXIDKKAT.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-TIM4OD74.js → chunk-BDTISOSD.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-C4C3EJCJ.js → chunk-BHO33VBQ.js} +509 -363
- package/dist/cli-bundle/chunks/chunk-BHO33VBQ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-6W3Y65PL.js → chunk-BZCEN4JA.js} +198 -177
- package/dist/cli-bundle/chunks/chunk-BZCEN4JA.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-RRP6D345.js → chunk-CF7RL6FR.js} +12 -16
- package/dist/cli-bundle/chunks/{chunk-RRP6D345.js.map → chunk-CF7RL6FR.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-HC2S36NB.js → chunk-CWFNTKQJ.js} +154 -126
- package/dist/cli-bundle/chunks/chunk-CWFNTKQJ.js.map +1 -0
- package/dist/cli-bundle/chunks/chunk-CZVISY5A.js +87 -0
- package/dist/cli-bundle/chunks/chunk-CZVISY5A.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-CZIFFMZI.js → chunk-DDPTYJIM.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-AYPQUFCX.js → chunk-EJUDVUYZ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-EOGBMLCE.js → chunk-EVMTBV6V.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-RAWA3Y7O.js → chunk-FFMQB7WR.js} +199 -178
- package/dist/cli-bundle/chunks/chunk-FFMQB7WR.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-CG3KP6I5.js → chunk-G7I7DEZA.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-MEXZ5XUM.js → chunk-GJ326ZKX.js} +53 -54
- package/dist/cli-bundle/chunks/chunk-GJ326ZKX.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-HPPFYYOV.js +119 -0
- package/dist/cli-bundle/chunks/chunk-HPPFYYOV.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-OF7V47P3.js → chunk-HXTQJXWT.js} +2172 -2146
- package/dist/cli-bundle/chunks/chunk-HXTQJXWT.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-F4BNR2IN.js → chunk-HYTGA6GI.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-2WCYE3IF.js → chunk-HZZEHPRG.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-IBMFIKVS.js +14 -0
- package/dist/cli-bundle/chunks/chunk-IBMFIKVS.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-YV2OSAMS.js → chunk-IJYK2T43.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-4XDGYFHL.js → chunk-IPYBJWTE.js} +10 -14
- package/dist/cli-bundle/chunks/{chunk-4XDGYFHL.js.map → chunk-IPYBJWTE.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-6EBNFQOR.js → chunk-IZBR4NRW.js} +10 -14
- package/dist/cli-bundle/chunks/{chunk-6EBNFQOR.js.map → chunk-IZBR4NRW.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-VFJYVXHL.js → chunk-JLM7BHI7.js} +7 -9
- package/dist/cli-bundle/chunks/{chunk-VFJYVXHL.js.map → chunk-JLM7BHI7.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-6EL7SW5C.js → chunk-JMP4E6D7.js} +114 -122
- package/dist/cli-bundle/chunks/chunk-JMP4E6D7.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-QOUOMPHO.js → chunk-JPECA746.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KJZOSF7J.js → chunk-JSU5P7VS.js} +100 -35
- package/dist/cli-bundle/chunks/chunk-JSU5P7VS.js.map +1 -0
- package/dist/cli-bundle/chunks/{context-55VEOYI3.js → chunk-JWXRETDF.js} +79 -82
- package/dist/cli-bundle/chunks/chunk-JWXRETDF.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-OQ2E64FH.js → chunk-KNPEF7QG.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-3BKH2CL3.js → chunk-L5OEFZQG.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-DTABLLVE.js → chunk-LB6TP6MC.js} +5 -7
- package/dist/cli-bundle/chunks/{chunk-DTABLLVE.js.map → chunk-LB6TP6MC.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-TSI32UEL.js → chunk-MAUKX7JC.js} +6 -8
- package/dist/cli-bundle/chunks/{chunk-TSI32UEL.js.map → chunk-MAUKX7JC.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-SMXSDY7J.js → chunk-MDPEOIGN.js} +2221 -2172
- package/dist/cli-bundle/chunks/chunk-MDPEOIGN.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-5S4ZGDB2.js → chunk-N74UMG5H.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-IXAZI443.js → chunk-NFDPYAIP.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-SKC4UTRP.js → chunk-NKZAN7BD.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-NOLPZMSV.js +116 -0
- package/dist/cli-bundle/chunks/chunk-NOLPZMSV.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-L7UXKP2I.js → chunk-NU2UEROZ.js} +1257 -1029
- package/dist/cli-bundle/chunks/chunk-NU2UEROZ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-HBAEFWX3.js → chunk-NUHHPVVS.js} +65 -335
- package/dist/cli-bundle/chunks/chunk-NUHHPVVS.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-JPJDP4VU.js → chunk-NWMZWYYB.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-MWMHZOZZ.js → chunk-OGXLACHC.js} +10 -14
- package/dist/cli-bundle/chunks/{chunk-MWMHZOZZ.js.map → chunk-OGXLACHC.js.map} +1 -1
- package/dist/cli-bundle/chunks/chunk-OKQ22KTH.js +379 -0
- package/dist/cli-bundle/chunks/chunk-OKQ22KTH.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KKX4Z2SE.js → chunk-OTUHB4HS.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-ZLWRPBOW.js → chunk-QCWF6IYD.js} +510 -364
- package/dist/cli-bundle/chunks/chunk-QCWF6IYD.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-PRVTGX64.js → chunk-RGEMWD6Q.js} +11 -23
- package/dist/cli-bundle/chunks/chunk-RGEMWD6Q.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-RH5ZBYFD.js +809 -0
- package/dist/cli-bundle/chunks/chunk-RH5ZBYFD.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-ALQKV6U7.js → chunk-RLDHZHQS.js} +12 -16
- package/dist/cli-bundle/chunks/{chunk-ALQKV6U7.js.map → chunk-RLDHZHQS.js.map} +1 -1
- package/dist/cli-bundle/chunks/{schema-C6QA367T.js → chunk-RMMQ74TG.js} +144 -67
- package/dist/cli-bundle/chunks/chunk-RMMQ74TG.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-EYPINTFR.js → chunk-RVUALSJF.js} +1516 -753
- package/dist/cli-bundle/chunks/chunk-RVUALSJF.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-SDR5J34Q.js +2468 -0
- package/dist/cli-bundle/chunks/chunk-SDR5J34Q.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-WB5BYQMF.js → chunk-SLMUGTK3.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-SUREE24M.js → chunk-TP5Q5ZD3.js} +12 -24
- package/dist/cli-bundle/chunks/chunk-TP5Q5ZD3.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-UACWNBL2.js → chunk-UYUYDGIB.js} +7 -9
- package/dist/cli-bundle/chunks/{chunk-UACWNBL2.js.map → chunk-UYUYDGIB.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-V4UYNSEM.js → chunk-UZIWVBE6.js} +6 -8
- package/dist/cli-bundle/chunks/{chunk-V4UYNSEM.js.map → chunk-UZIWVBE6.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-EWRSXOIZ.js → chunk-V3NOKJF2.js} +11 -13
- package/dist/cli-bundle/chunks/{chunk-EWRSXOIZ.js.map → chunk-V3NOKJF2.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-XXKV4UWE.js → chunk-VARHOHYV.js} +571 -507
- package/dist/cli-bundle/chunks/chunk-VARHOHYV.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-AEACLRVH.js → chunk-VICZWYGZ.js} +18 -11
- package/dist/cli-bundle/chunks/chunk-VICZWYGZ.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js +84 -0
- package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js.map +1 -0
- package/dist/cli-bundle/chunks/chunk-VZDBVEZR.js +382 -0
- package/dist/cli-bundle/chunks/chunk-VZDBVEZR.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-GDUMGZK3.js → chunk-W4ULYO7Z.js} +11 -13
- package/dist/cli-bundle/chunks/{chunk-GDUMGZK3.js.map → chunk-W4ULYO7Z.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-I6QMJ2XT.js → chunk-WYDHYJPO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ALKFCIIB.js → chunk-YITK2PJ6.js} +9 -11
- package/dist/cli-bundle/chunks/{chunk-ALKFCIIB.js.map → chunk-YITK2PJ6.js.map} +1 -1
- package/dist/cli-bundle/chunks/chunk-YJIEJRZB.js +84 -0
- package/dist/cli-bundle/chunks/chunk-YJIEJRZB.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-LNEDHJNQ.js → chunk-ZETXE4SE.js} +66 -329
- package/dist/cli-bundle/chunks/chunk-ZETXE4SE.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KIEAK7YE.js → chunk-ZRP4VG5U.js} +2 -2
- package/dist/cli-bundle/chunks/{claim-FZZZCAY6.js → claim-EMQLYPRW.js} +10 -12
- package/dist/cli-bundle/chunks/{claim-FZZZCAY6.js.map → claim-EMQLYPRW.js.map} +1 -1
- package/dist/cli-bundle/chunks/{claim-XK5QBZE3.js → claim-T3GCKV7C.js} +8 -10
- package/dist/cli-bundle/chunks/{claim-XK5QBZE3.js.map → claim-T3GCKV7C.js.map} +1 -1
- package/dist/cli-bundle/chunks/close-E6ZZGCJY.js +14 -0
- package/dist/cli-bundle/chunks/{close-QHMVWM7M.js → close-TQYAAFJP.js} +7 -8
- package/dist/cli-bundle/chunks/{close-many-OIXJE2JZ.js → close-many-BG5QQIDQ.js} +16 -18
- package/dist/cli-bundle/chunks/{close-many-OIXJE2JZ.js.map → close-many-BG5QQIDQ.js.map} +1 -1
- package/dist/cli-bundle/chunks/{close-many-SUU5BS2C.js → close-many-LDRVEQY2.js} +18 -20
- package/dist/cli-bundle/chunks/{close-many-SUU5BS2C.js.map → close-many-LDRVEQY2.js.map} +1 -1
- package/dist/cli-bundle/chunks/{comments-5YM62D75.js → comments-QCKR2YY2.js} +11 -13
- package/dist/cli-bundle/chunks/{comments-5YM62D75.js.map → comments-QCKR2YY2.js.map} +1 -1
- package/dist/cli-bundle/chunks/{comments-RH3IBIRH.js → comments-YUXJRZPQ.js} +9 -11
- package/dist/cli-bundle/chunks/{comments-RH3IBIRH.js.map → comments-YUXJRZPQ.js.map} +1 -1
- package/dist/cli-bundle/chunks/{config-NCNNWF6R.js → config-DMSU64QO.js} +18 -387
- package/dist/cli-bundle/chunks/config-DMSU64QO.js.map +7 -0
- package/dist/cli-bundle/chunks/{config-SW3U7XP2.js → config-QH2DICD6.js} +18 -380
- package/dist/cli-bundle/chunks/config-QH2DICD6.js.map +1 -0
- package/dist/cli-bundle/chunks/context-B6275WPX.js +46 -0
- package/dist/cli-bundle/chunks/context-OCZ3FJ4Z.js +42 -0
- package/dist/cli-bundle/chunks/{contracts-SY6PDFIK.js → contracts-HN7ABKLP.js} +72 -15
- package/dist/cli-bundle/chunks/contracts-HN7ABKLP.js.map +7 -0
- package/dist/cli-bundle/chunks/{contracts-JXFGBOYT.js → contracts-W4FZVVD6.js} +72 -15
- package/dist/cli-bundle/chunks/contracts-W4FZVVD6.js.map +1 -0
- package/dist/cli-bundle/chunks/{copy-N3GE6FYS.js → copy-BTJOSKKT.js} +7 -11
- package/dist/cli-bundle/chunks/{copy-N3GE6FYS.js.map → copy-BTJOSKKT.js.map} +1 -1
- package/dist/cli-bundle/chunks/{copy-IEDBJOOX.js → copy-DEM4DATS.js} +9 -13
- package/dist/cli-bundle/chunks/{copy-IEDBJOOX.js.map → copy-DEM4DATS.js.map} +1 -1
- package/dist/cli-bundle/chunks/create-OH3BDGBB.js +28 -0
- package/dist/cli-bundle/chunks/{create-O4VONGPG.js → create-RLRJMRTM.js} +12 -14
- package/dist/cli-bundle/chunks/{delete-LPEIF7RU.js → delete-BHK7VB2Z.js} +5 -7
- package/dist/cli-bundle/chunks/{delete-LPEIF7RU.js.map → delete-BHK7VB2Z.js.map} +1 -1
- package/dist/cli-bundle/chunks/{delete-724EQ6OS.js → delete-LSVHAB4Y.js} +7 -9
- package/dist/cli-bundle/chunks/{delete-724EQ6OS.js.map → delete-LSVHAB4Y.js.map} +1 -1
- package/dist/cli-bundle/chunks/{deps-RSBU4SIU.js → deps-4UDFJRUA.js} +8 -11
- package/dist/cli-bundle/chunks/{deps-RSBU4SIU.js.map → deps-4UDFJRUA.js.map} +1 -1
- package/dist/cli-bundle/chunks/{deps-T3Y6Y7RT.js → deps-XHYXWEPT.js} +6 -9
- package/dist/cli-bundle/chunks/{deps-T3Y6Y7RT.js.map → deps-XHYXWEPT.js.map} +1 -1
- package/dist/cli-bundle/chunks/{docs-IFS7HZPP.js → docs-26S44RXU.js} +8 -9
- package/dist/cli-bundle/chunks/{docs-IFS7HZPP.js.map → docs-26S44RXU.js.map} +1 -1
- package/dist/cli-bundle/chunks/{docs-75ZLCO3G.js → docs-GYZNVS26.js} +10 -11
- package/dist/cli-bundle/chunks/{docs-75ZLCO3G.js.map → docs-GYZNVS26.js.map} +1 -1
- package/dist/cli-bundle/chunks/{eval-L2KD7W3M.js → eval-PGRVIJQU.js} +12 -14
- package/dist/cli-bundle/chunks/{eval-L2KD7W3M.js.map → eval-PGRVIJQU.js.map} +1 -1
- package/dist/cli-bundle/chunks/{eval-QGR7JCQO.js → eval-UYF3ZPVO.js} +10 -12
- package/dist/cli-bundle/chunks/{eval-QGR7JCQO.js.map → eval-UYF3ZPVO.js.map} +1 -1
- package/dist/cli-bundle/chunks/{extension-YQF4CPIR.js → extension-CPSLJQVE.js} +12 -7
- package/dist/cli-bundle/chunks/{extension-3JYWJ5K2.js → extension-CXJ6RELI.js} +12 -7
- package/dist/cli-bundle/chunks/{files-EPEJMJHQ.js → files-MBNICQFM.js} +9 -11
- package/dist/cli-bundle/chunks/{files-EPEJMJHQ.js.map → files-MBNICQFM.js.map} +1 -1
- package/dist/cli-bundle/chunks/{files-5BQWDRDT.js → files-NQHEXUZD.js} +11 -13
- package/dist/cli-bundle/chunks/{files-5BQWDRDT.js.map → files-NQHEXUZD.js.map} +1 -1
- package/dist/cli-bundle/chunks/{focus-RWGKD76E.js → focus-DWYIG7GU.js} +10 -14
- package/dist/cli-bundle/chunks/{focus-RWGKD76E.js.map → focus-DWYIG7GU.js.map} +1 -1
- package/dist/cli-bundle/chunks/{focus-DQVJAPOE.js → focus-XZW5423D.js} +8 -12
- package/dist/cli-bundle/chunks/{focus-DQVJAPOE.js.map → focus-XZW5423D.js.map} +1 -1
- package/dist/cli-bundle/chunks/{gc-BEJMQT64.js → gc-7GQYOS2G.js} +3 -3
- package/dist/cli-bundle/chunks/{gc-JEFQDJPA.js → gc-LPVMKJQJ.js} +3 -3
- package/dist/cli-bundle/chunks/{get-LQG6PEVG.js → get-A7MAOHCU.js} +10 -13
- package/dist/cli-bundle/chunks/{get-LQG6PEVG.js.map → get-A7MAOHCU.js.map} +1 -1
- package/dist/cli-bundle/chunks/{get-WVN75H42.js → get-DSDEKJ3L.js} +12 -15
- package/dist/cli-bundle/chunks/{get-WVN75H42.js.map → get-DSDEKJ3L.js.map} +1 -1
- package/dist/cli-bundle/chunks/{health-JJJOY7DJ.js → health-3IPFLKXB.js} +17 -17
- package/dist/cli-bundle/chunks/{health-P67NZ6TT.js → health-GZXGBZ36.js} +17 -17
- package/dist/cli-bundle/chunks/{history-RUKPKNY7.js → history-NERDJNUB.js} +8 -10
- package/dist/cli-bundle/chunks/history-WSZHY3PN.js +18 -0
- package/dist/cli-bundle/chunks/{history-compact-NQ7VPRVT.js → history-compact-2WRZ2WK4.js} +11 -14
- package/dist/cli-bundle/chunks/{history-compact-NQ7VPRVT.js.map → history-compact-2WRZ2WK4.js.map} +1 -1
- package/dist/cli-bundle/chunks/{history-compact-ZAOWR7GD.js → history-compact-HR7BB4LR.js} +13 -16
- package/dist/cli-bundle/chunks/{history-compact-ZAOWR7GD.js.map → history-compact-HR7BB4LR.js.map} +1 -1
- package/dist/cli-bundle/chunks/history-redact-MP6CH7U5.js +19 -0
- package/dist/cli-bundle/chunks/{history-redact-YY4XYVEP.js → history-redact-O3NBCNWC.js} +9 -11
- package/dist/cli-bundle/chunks/{history-repair-EHL4ODQY.js → history-repair-LCMOS45X.js} +11 -14
- package/dist/cli-bundle/chunks/{history-repair-EHL4ODQY.js.map → history-repair-LCMOS45X.js.map} +1 -1
- package/dist/cli-bundle/chunks/{history-repair-YSQH6SY6.js → history-repair-XA3LC4GA.js} +13 -16
- package/dist/cli-bundle/chunks/{history-repair-YSQH6SY6.js.map → history-repair-XA3LC4GA.js.map} +1 -1
- package/dist/cli-bundle/chunks/{init-HBFGYS66.js → init-64XDLQJB.js} +12 -11
- package/dist/cli-bundle/chunks/init-PAX32BJA.js +22 -0
- package/dist/cli-bundle/chunks/{learnings-KFQO7GEZ.js → learnings-JR6MA5TI.js} +9 -11
- package/dist/cli-bundle/chunks/{learnings-KFQO7GEZ.js.map → learnings-JR6MA5TI.js.map} +1 -1
- package/dist/cli-bundle/chunks/{learnings-J555ZFPD.js → learnings-LPKCSJX7.js} +11 -13
- package/dist/cli-bundle/chunks/{learnings-J555ZFPD.js.map → learnings-LPKCSJX7.js.map} +1 -1
- package/dist/cli-bundle/chunks/{list-C7R33MD5.js → list-DNBJVO3E.js} +10 -10
- package/dist/cli-bundle/chunks/{list-DSN6UNFB.js → list-G5Y65VF6.js} +10 -10
- package/dist/cli-bundle/chunks/next-BCERKDUR.js +277 -0
- package/dist/cli-bundle/chunks/next-BCERKDUR.js.map +7 -0
- package/dist/cli-bundle/chunks/next-FYTQF6HG.js +274 -0
- package/dist/cli-bundle/chunks/next-FYTQF6HG.js.map +1 -0
- package/dist/cli-bundle/chunks/{notes-V4VNIQL4.js → notes-2BMU3VVQ.js} +9 -11
- package/dist/cli-bundle/chunks/{notes-V4VNIQL4.js.map → notes-2BMU3VVQ.js.map} +1 -1
- package/dist/cli-bundle/chunks/{notes-VYJFN2A3.js → notes-6KTGO2OJ.js} +11 -13
- package/dist/cli-bundle/chunks/{notes-VYJFN2A3.js.map → notes-6KTGO2OJ.js.map} +1 -1
- package/dist/cli-bundle/chunks/{plan-RBHQ5PO7.js → plan-4WXEQCTN.js} +15 -18
- package/dist/cli-bundle/chunks/{plan-RBHQ5PO7.js.map → plan-4WXEQCTN.js.map} +1 -1
- package/dist/cli-bundle/chunks/{plan-DHRSVSHR.js → plan-RKZHQVXR.js} +17 -20
- package/dist/cli-bundle/chunks/{plan-DHRSVSHR.js.map → plan-RKZHQVXR.js.map} +1 -1
- package/dist/cli-bundle/chunks/profile-4OMM32CD.js +1235 -0
- package/dist/cli-bundle/chunks/profile-4OMM32CD.js.map +7 -0
- package/dist/cli-bundle/chunks/profile-QLER5ENE.js +1197 -0
- package/dist/cli-bundle/chunks/profile-QLER5ENE.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-list-query-OM3E2KMY.js → register-list-query-7LV46VAU.js} +45 -21
- package/dist/cli-bundle/chunks/register-list-query-7LV46VAU.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-list-query-CCMHGZTF.js → register-list-query-SNG5PGA4.js} +44 -20
- package/dist/cli-bundle/chunks/register-list-query-SNG5PGA4.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-mutation-N3CDEGZU.js → register-mutation-ENNDUAZG.js} +106 -40
- package/dist/cli-bundle/chunks/register-mutation-ENNDUAZG.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-mutation-UXTTWL6N.js → register-mutation-KK7PHYYU.js} +105 -39
- package/dist/cli-bundle/chunks/register-mutation-KK7PHYYU.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-operations-UDIFMQKD.js → register-operations-C6OWLDSH.js} +32 -34
- package/dist/cli-bundle/chunks/{register-operations-UDIFMQKD.js.map → register-operations-C6OWLDSH.js.map} +1 -1
- package/dist/cli-bundle/chunks/{register-operations-R2FLOCRI.js → register-operations-HZ6XERQG.js} +30 -32
- package/dist/cli-bundle/chunks/{register-operations-R2FLOCRI.js.map → register-operations-HZ6XERQG.js.map} +1 -1
- package/dist/cli-bundle/chunks/{register-setup-G5LTSFYK.js → register-setup-P67EMBDJ.js} +68 -25
- package/dist/cli-bundle/chunks/register-setup-P67EMBDJ.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-setup-TWHKICM2.js → register-setup-ZKJ53RS7.js} +67 -24
- package/dist/cli-bundle/chunks/register-setup-ZKJ53RS7.js.map +7 -0
- package/dist/cli-bundle/chunks/{restore-LL2WLEDG.js → restore-4MHZFJ2E.js} +9 -11
- package/dist/cli-bundle/chunks/restore-YALDGTQR.js +17 -0
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-M4H2ZI64.js → scheduling-shortcuts-LB6DOLRL.js} +14 -16
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-M4H2ZI64.js.map → scheduling-shortcuts-LB6DOLRL.js.map} +1 -1
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-255GI3BU.js → scheduling-shortcuts-UTOYKLXQ.js} +12 -14
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-255GI3BU.js.map → scheduling-shortcuts-UTOYKLXQ.js.map} +1 -1
- package/dist/cli-bundle/chunks/schema-73HR2OJW.js +75 -0
- package/dist/cli-bundle/chunks/schema-U6LJKSIR.js +71 -0
- package/dist/cli-bundle/chunks/{search-2EI6EAXH.js → search-AXPXKZER.js} +10 -12
- package/dist/cli-bundle/chunks/{search-QBFBLQRO.js → search-KILGT37L.js} +10 -12
- package/dist/cli-bundle/chunks/{stats-TKC6CAKB.js → stats-PSYVVTNZ.js} +21 -13
- package/dist/cli-bundle/chunks/stats-PSYVVTNZ.js.map +1 -0
- package/dist/cli-bundle/chunks/{stats-TCW2SZQG.js → stats-W5KNVJWQ.js} +20 -12
- package/dist/cli-bundle/chunks/stats-W5KNVJWQ.js.map +7 -0
- package/dist/cli-bundle/chunks/{telemetry-BT2VSWU2.js → telemetry-BZUF6H7G.js} +4 -4
- package/dist/cli-bundle/chunks/{telemetry-LQ6FRTUT.js → telemetry-GAHHQTOS.js} +4 -4
- package/dist/cli-bundle/chunks/test-ACD52Z3S.js +35 -0
- package/dist/cli-bundle/chunks/test-ACD52Z3S.js.map +7 -0
- package/dist/cli-bundle/chunks/{test-NV2DRPUS.js → test-PWDIZ255.js} +15 -16
- package/dist/cli-bundle/chunks/test-PWDIZ255.js.map +1 -0
- package/dist/cli-bundle/chunks/{test-all-DZ76VTPQ.js → test-all-L2MDDUCA.js} +20 -22
- package/dist/cli-bundle/chunks/{test-all-DZ76VTPQ.js.map → test-all-L2MDDUCA.js.map} +1 -1
- package/dist/cli-bundle/chunks/{test-all-REW67LXT.js → test-all-RBZ6DLU2.js} +18 -20
- package/dist/cli-bundle/chunks/{test-all-REW67LXT.js.map → test-all-RBZ6DLU2.js.map} +1 -1
- package/dist/cli-bundle/chunks/{test-runs-PX73DMMI.js → test-runs-PLRAZEFW.js} +5 -6
- package/dist/cli-bundle/chunks/test-runs-PLRAZEFW.js.map +7 -0
- package/dist/cli-bundle/chunks/{test-runs-FQ5WNQLP.js → test-runs-UXIXPDKU.js} +6 -7
- package/dist/cli-bundle/chunks/test-runs-UXIXPDKU.js.map +1 -0
- package/dist/cli-bundle/chunks/update-AMRSOIWP.js +24 -0
- package/dist/cli-bundle/chunks/update-AMRSOIWP.js.map +7 -0
- package/dist/cli-bundle/chunks/update-KFX2SIAC.js +28 -0
- package/dist/cli-bundle/chunks/update-KFX2SIAC.js.map +1 -0
- package/dist/cli-bundle/chunks/{update-many-Q5ZEI64S.js → update-many-RNSBX2TA.js} +35 -36
- package/dist/cli-bundle/chunks/{update-many-Q5ZEI64S.js.map → update-many-RNSBX2TA.js.map} +1 -1
- package/dist/cli-bundle/chunks/{update-many-2ILP6E4Y.js → update-many-Z5GJS5LC.js} +33 -34
- package/dist/cli-bundle/chunks/{update-many-2ILP6E4Y.js.map → update-many-Z5GJS5LC.js.map} +1 -1
- package/dist/cli-bundle/chunks/{upgrade-FOZKQTQF.js → upgrade-BRL6KCOJ.js} +13 -8
- package/dist/cli-bundle/chunks/{upgrade-FOZKQTQF.js.map → upgrade-BRL6KCOJ.js.map} +1 -1
- package/dist/cli-bundle/chunks/{upgrade-DHL74PQH.js → upgrade-HAK6JG2O.js} +11 -6
- package/dist/cli-bundle/chunks/{upgrade-DHL74PQH.js.map → upgrade-HAK6JG2O.js.map} +1 -1
- package/dist/cli-bundle/chunks/{validate-HYZNIB6W.js → validate-MTUVL5VC.js} +38 -28
- package/dist/cli-bundle/chunks/validate-MTUVL5VC.js.map +7 -0
- package/dist/cli-bundle/chunks/{validate-54SYJ7QW.js → validate-X5W76YJL.js} +39 -29
- package/dist/cli-bundle/chunks/validate-X5W76YJL.js.map +1 -0
- package/dist/cli-bundle/main.js +95 -724
- package/dist/cli-bundle/main.js.map +4 -4
- package/dist/core/config/positional-value.d.ts +2 -0
- package/dist/core/config/positional-value.js +2 -2
- package/dist/core/config/positional-value.js.map +1 -1
- package/dist/core/extensions/activation-summary-markdown.d.ts +71 -0
- package/dist/core/extensions/activation-summary-markdown.js +151 -0
- package/dist/core/extensions/activation-summary-markdown.js.map +1 -0
- package/dist/core/extensions/activation-summary.d.ts +2 -0
- package/dist/core/extensions/activation-summary.js +3 -2
- package/dist/core/extensions/activation-summary.js.map +1 -1
- package/dist/core/extensions/capability-usage.d.ts +1 -1
- package/dist/core/extensions/capability-usage.js +4 -3
- package/dist/core/extensions/capability-usage.js.map +1 -1
- package/dist/core/extensions/extension-policy.d.ts +18 -3
- package/dist/core/extensions/extension-policy.js +116 -106
- package/dist/core/extensions/extension-policy.js.map +1 -1
- package/dist/core/extensions/extension-registries.js +3 -2
- package/dist/core/extensions/extension-registries.js.map +1 -1
- package/dist/core/extensions/extension-types.d.ts +21 -1
- package/dist/core/extensions/extension-types.js +3 -2
- package/dist/core/extensions/extension-types.js.map +1 -1
- package/dist/core/extensions/loader.js +439 -232
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/fs/fs-utils.js +27 -2
- package/dist/core/fs/fs-utils.js.map +1 -1
- package/dist/core/item/actionability.d.ts +57 -0
- package/dist/core/item/actionability.js +178 -0
- package/dist/core/item/actionability.js.map +1 -0
- package/dist/core/item/item-format.js +523 -410
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/type-registry.js +18 -45
- package/dist/core/item/type-registry.js.map +1 -1
- package/dist/core/profile/profile-describe.d.ts +64 -0
- package/dist/core/profile/profile-describe.js +83 -0
- package/dist/core/profile/profile-describe.js.map +1 -0
- package/dist/core/profile/profile-lint.d.ts +53 -0
- package/dist/core/profile/profile-lint.js +422 -0
- package/dist/core/profile/profile-lint.js.map +1 -0
- package/dist/core/profile/profile-plan.d.ts +145 -0
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-plan.js.map +1 -0
- package/dist/core/profile/profile-presets.d.ts +218 -0
- package/dist/core/profile/profile-presets.js +325 -0
- package/dist/core/profile/profile-presets.js.map +1 -0
- package/dist/core/schema/fields-file.js +25 -25
- package/dist/core/schema/fields-file.js.map +1 -1
- package/dist/core/schema/item-types-file.js +3 -3
- package/dist/core/schema/item-types-file.js.map +1 -1
- package/dist/core/schema/runtime-schema.js +4 -4
- package/dist/core/schema/runtime-schema.js.map +1 -1
- package/dist/core/schema/status-defs-file.js +3 -3
- package/dist/core/schema/status-defs-file.js.map +1 -1
- package/dist/core/shared/serialization.js +83 -62
- package/dist/core/shared/serialization.js.map +1 -1
- package/dist/core/store/item-store.d.ts +1 -0
- package/dist/core/store/item-store.js +16 -8
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/paths.js +4 -32
- package/dist/core/store/paths.js.map +1 -1
- package/dist/core/store/settings.js +14 -14
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/telemetry/observability.js +50 -54
- package/dist/core/telemetry/observability.js.map +1 -1
- package/dist/core/telemetry/runtime.js +11 -2
- package/dist/core/telemetry/runtime.js.map +1 -1
- package/dist/core/test/background-runs.js +3 -2
- package/dist/core/test/background-runs.js.map +1 -1
- package/dist/core/validate/linked-artifact-reference.d.ts +24 -0
- package/dist/core/validate/linked-artifact-reference.js +41 -0
- package/dist/core/validate/linked-artifact-reference.js.map +1 -0
- package/dist/mcp/server.js +540 -420
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-definitions.js +33 -2
- package/dist/mcp/tool-definitions.js.map +1 -1
- package/dist/sdk/cli-contracts/commander-types.d.ts +1 -0
- package/dist/sdk/cli-contracts/commander-types.js +15 -2
- package/dist/sdk/cli-contracts/commander-types.js.map +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +3 -3
- package/dist/sdk/cli-contracts/enum-contracts.js +6 -2
- package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/flag-contracts.d.ts +149 -0
- package/dist/sdk/cli-contracts/flag-contracts.js +1514 -0
- package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -0
- package/dist/sdk/cli-contracts/string-lists.d.ts +14 -0
- package/dist/sdk/cli-contracts/string-lists.js +20 -0
- package/dist/sdk/cli-contracts/string-lists.js.map +1 -0
- package/dist/sdk/cli-contracts/tool-option-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/tool-option-contracts.js +51 -109
- package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.d.ts +17 -0
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +54 -5
- package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-schema.d.ts +74 -0
- package/dist/sdk/cli-contracts/tool-schema.js +871 -0
- package/dist/sdk/cli-contracts/tool-schema.js.map +1 -0
- package/dist/sdk/cli-contracts.d.ts +13 -193
- package/dist/sdk/cli-contracts.js +5 -2277
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/compose.d.ts +11 -5
- package/dist/sdk/compose.js +240 -124
- package/dist/sdk/compose.js.map +1 -1
- package/dist/sdk/define.d.ts +14 -0
- package/dist/sdk/define.js +17 -2
- package/dist/sdk/define.js.map +1 -1
- package/dist/sdk/index.d.ts +14 -3
- package/dist/sdk/index.js +14 -3
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/testing.d.ts +82 -2
- package/dist/sdk/testing.js +74 -3
- package/dist/sdk/testing.js.map +1 -1
- package/docs/AGENT_GUIDE.md +2 -0
- package/docs/CLAUDE_CODE_PLUGIN.md +2 -2
- package/docs/COMMANDS.md +37 -0
- package/docs/EXTENSIONS.md +12 -13
- package/docs/RELEASING.md +8 -4
- package/docs/SDK.md +184 -17
- package/docs/TESTING.md +12 -0
- package/docs/examples/policy-restricted-extension/README.md +6 -0
- package/docs/examples/policy-restricted-extension/index.ts +40 -0
- package/docs/examples/policy-restricted-extension/manifest.json +2 -2
- package/docs/examples/starter-extension/README.md +14 -2
- package/docs/examples/starter-extension/{index.js → index.ts} +51 -6
- package/docs/examples/starter-extension/manifest.json +2 -2
- package/package.json +20 -7
- package/packages/pm-beads/extensions/beads/index.ts +3 -3
- package/packages/pm-beads/extensions/beads/manifest.json +2 -2
- package/packages/pm-beads/extensions/beads/runtime-loader.ts +19 -7
- package/packages/pm-beads/extensions/beads/runtime.ts +155 -37
- package/packages/pm-calendar/extensions/calendar/index.ts +3 -3
- package/packages/pm-calendar/extensions/calendar/manifest.json +2 -2
- package/packages/pm-calendar/extensions/calendar/runtime.ts +2 -2
- package/packages/pm-command-kit/extensions/command-kit/index.ts +1 -1
- package/packages/pm-command-kit/extensions/command-kit/manifest.json +2 -2
- package/packages/pm-governance-audit/extensions/governance-audit/index.ts +2 -2
- package/packages/pm-governance-audit/extensions/governance-audit/manifest.json +2 -2
- package/packages/pm-governance-audit/extensions/governance-audit/runtime.ts +1 -1
- package/packages/pm-guide-shell/extensions/guide-shell/index.ts +2 -2
- package/packages/pm-guide-shell/extensions/guide-shell/manifest.json +2 -2
- package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +1 -1
- package/packages/pm-kanban/README.md +97 -0
- package/packages/pm-kanban/extensions/kanban/index.ts +191 -0
- package/packages/pm-kanban/extensions/kanban/manifest.json +19 -0
- package/packages/pm-kanban/package.json +57 -0
- package/packages/pm-lifecycle-hooks/extensions/lifecycle-hooks/index.ts +1 -1
- package/packages/pm-lifecycle-hooks/extensions/lifecycle-hooks/manifest.json +2 -2
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.ts +2 -2
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/manifest.json +2 -2
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.ts +1 -1
- package/packages/pm-search-advanced/extensions/search-advanced/index.ts +2 -2
- package/packages/pm-search-advanced/extensions/search-advanced/manifest.json +2 -2
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +1 -1
- package/packages/pm-templates/extensions/templates/index.ts +2 -2
- package/packages/pm-templates/extensions/templates/manifest.json +2 -2
- package/packages/pm-templates/extensions/templates/runtime.ts +1 -1
- package/packages/pm-todos/extensions/todos/index.ts +3 -3
- package/packages/pm-todos/extensions/todos/manifest.json +2 -2
- package/packages/pm-todos/extensions/todos/runtime-loader.ts +19 -7
- package/packages/pm-todos/extensions/todos/runtime.ts +177 -43
- package/plugins/pm-claude/scripts/pm-mcp-server.mjs +2 -2
- package/plugins/pm-codex/scripts/pm-mcp-server.mjs +2 -2
- package/scripts/bundle-cli.mjs +1 -1
- package/dist/cli-bundle/chunks/activity-54TXGJ2T.js +0 -18
- package/dist/cli-bundle/chunks/aggregate-63NWNIBR.js.map +0 -1
- package/dist/cli-bundle/chunks/aggregate-YHCYX2EV.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-6EL7SW5C.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-6W3Y65PL.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-AEACLRVH.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-B74BP6IS.js +0 -78
- package/dist/cli-bundle/chunks/chunk-B74BP6IS.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-BFFO3AIB.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-C4C3EJCJ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-EYPINTFR.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-FBLT6WGK.js +0 -75
- package/dist/cli-bundle/chunks/chunk-FBLT6WGK.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-GQYJEEFX.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-HBAEFWX3.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-HC2S36NB.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-IAP5KYBQ.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-INPHFO33.js +0 -764
- package/dist/cli-bundle/chunks/chunk-INPHFO33.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-IOT6WRL5.js +0 -86
- package/dist/cli-bundle/chunks/chunk-IOT6WRL5.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ISEKN64V.js +0 -35
- package/dist/cli-bundle/chunks/chunk-ISEKN64V.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-J3NMWFIN.js +0 -115
- package/dist/cli-bundle/chunks/chunk-J3NMWFIN.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-J7I4C5ZB.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-JKL6HRMV.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-KJZOSF7J.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-L7UXKP2I.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-LNEDHJNQ.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-M6TUBOGW.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-MEXZ5XUM.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-N5B6WZC5.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-NJ73ALW2.js +0 -761
- package/dist/cli-bundle/chunks/chunk-NJ73ALW2.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-NVXGVEFD.js +0 -83
- package/dist/cli-bundle/chunks/chunk-NVXGVEFD.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-OF7V47P3.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-OHDQNKJB.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-PEL2NLQE.js +0 -118
- package/dist/cli-bundle/chunks/chunk-PEL2NLQE.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-PRVTGX64.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-RAWA3Y7O.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-SMXSDY7J.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-SUREE24M.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-TKPP4GOO.js +0 -654
- package/dist/cli-bundle/chunks/chunk-TKPP4GOO.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-VSAABFGQ.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js +0 -32
- package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-XVYKWZNL.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-XXKV4UWE.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ZLWRPBOW.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-ZV7IQ23N.js +0 -657
- package/dist/cli-bundle/chunks/chunk-ZV7IQ23N.js.map +0 -7
- package/dist/cli-bundle/chunks/close-JEBZXONN.js +0 -15
- package/dist/cli-bundle/chunks/config-NCNNWF6R.js.map +0 -7
- package/dist/cli-bundle/chunks/config-SW3U7XP2.js.map +0 -1
- package/dist/cli-bundle/chunks/context-55VEOYI3.js.map +0 -1
- package/dist/cli-bundle/chunks/context-5LB7UGKE.js.map +0 -7
- package/dist/cli-bundle/chunks/contracts-JXFGBOYT.js.map +0 -1
- package/dist/cli-bundle/chunks/contracts-SY6PDFIK.js.map +0 -7
- package/dist/cli-bundle/chunks/create-CLSCHGJJ.js +0 -30
- package/dist/cli-bundle/chunks/history-ALTM2RRP.js +0 -20
- package/dist/cli-bundle/chunks/history-redact-5YGLWUDH.js +0 -21
- package/dist/cli-bundle/chunks/init-C4CRHW22.js +0 -21
- package/dist/cli-bundle/chunks/register-list-query-CCMHGZTF.js.map +0 -7
- package/dist/cli-bundle/chunks/register-list-query-OM3E2KMY.js.map +0 -1
- package/dist/cli-bundle/chunks/register-mutation-N3CDEGZU.js.map +0 -1
- package/dist/cli-bundle/chunks/register-mutation-UXTTWL6N.js.map +0 -7
- package/dist/cli-bundle/chunks/register-setup-G5LTSFYK.js.map +0 -1
- package/dist/cli-bundle/chunks/register-setup-TWHKICM2.js.map +0 -7
- package/dist/cli-bundle/chunks/restore-LQHXBAY5.js +0 -19
- package/dist/cli-bundle/chunks/schema-C6QA367T.js.map +0 -7
- package/dist/cli-bundle/chunks/schema-QO5I4FBL.js.map +0 -1
- package/dist/cli-bundle/chunks/stats-TCW2SZQG.js.map +0 -7
- package/dist/cli-bundle/chunks/stats-TKC6CAKB.js.map +0 -1
- package/dist/cli-bundle/chunks/test-WA6RZGM2.js +0 -36
- package/dist/cli-bundle/chunks/test-runs-FQ5WNQLP.js.map +0 -1
- package/dist/cli-bundle/chunks/test-runs-PX73DMMI.js.map +0 -7
- package/dist/cli-bundle/chunks/update-BSKMQOYH.js +0 -28
- package/dist/cli-bundle/chunks/update-FIGYNQ2I.js +0 -24
- package/dist/cli-bundle/chunks/validate-54SYJ7QW.js.map +0 -1
- package/dist/cli-bundle/chunks/validate-HYZNIB6W.js.map +0 -7
- package/docs/examples/policy-restricted-extension/index.js +0 -21
- package/packages/pm-beads/extensions/beads/index.js +0 -64
- package/packages/pm-beads/extensions/beads/runtime-loader.js +0 -86
- package/packages/pm-beads/extensions/beads/runtime.js +0 -482
- package/packages/pm-calendar/extensions/calendar/index.js +0 -150
- package/packages/pm-calendar/extensions/calendar/runtime.js +0 -126
- package/packages/pm-command-kit/extensions/command-kit/index.js +0 -181
- package/packages/pm-governance-audit/extensions/governance-audit/index.js +0 -177
- package/packages/pm-governance-audit/extensions/governance-audit/runtime.js +0 -153
- package/packages/pm-guide-shell/extensions/guide-shell/index.js +0 -98
- package/packages/pm-guide-shell/extensions/guide-shell/runtime.js +0 -294
- package/packages/pm-lifecycle-hooks/extensions/lifecycle-hooks/index.js +0 -18
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.js +0 -124
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.js +0 -110
- package/packages/pm-search-advanced/extensions/search-advanced/index.js +0 -258
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +0 -361
- package/packages/pm-templates/extensions/templates/index.js +0 -132
- package/packages/pm-templates/extensions/templates/runtime.js +0 -35
- package/packages/pm-todos/extensions/todos/index.js +0 -81
- package/packages/pm-todos/extensions/todos/runtime-loader.js +0 -86
- package/packages/pm-todos/extensions/todos/runtime.js +0 -545
- /package/dist/cli-bundle/chunks/{activity-54TXGJ2T.js.map → activity-AW6XVFH6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{activity-N7RVTLBQ.js.map → activity-DBLQVIP6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-F32L4HR6.js.map → chunk-27BXPBAY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5BBEWX6C.js.map → chunk-3VGN2UWE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FMWW2JDU.js.map → chunk-AXIDKKAT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TIM4OD74.js.map → chunk-BDTISOSD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CZIFFMZI.js.map → chunk-DDPTYJIM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AYPQUFCX.js.map → chunk-EJUDVUYZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EOGBMLCE.js.map → chunk-EVMTBV6V.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CG3KP6I5.js.map → chunk-G7I7DEZA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-F4BNR2IN.js.map → chunk-HYTGA6GI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2WCYE3IF.js.map → chunk-HZZEHPRG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YV2OSAMS.js.map → chunk-IJYK2T43.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QOUOMPHO.js.map → chunk-JPECA746.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OQ2E64FH.js.map → chunk-KNPEF7QG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3BKH2CL3.js.map → chunk-L5OEFZQG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5S4ZGDB2.js.map → chunk-N74UMG5H.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IXAZI443.js.map → chunk-NFDPYAIP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SKC4UTRP.js.map → chunk-NKZAN7BD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JPJDP4VU.js.map → chunk-NWMZWYYB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KKX4Z2SE.js.map → chunk-OTUHB4HS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WB5BYQMF.js.map → chunk-SLMUGTK3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-I6QMJ2XT.js.map → chunk-WYDHYJPO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KIEAK7YE.js.map → chunk-ZRP4VG5U.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-JEBZXONN.js.map → close-E6ZZGCJY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-QHMVWM7M.js.map → close-TQYAAFJP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-O4VONGPG.js.map → context-B6275WPX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-CLSCHGJJ.js.map → context-OCZ3FJ4Z.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-YQF4CPIR.js.map → create-OH3BDGBB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-3JYWJ5K2.js.map → create-RLRJMRTM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-ALTM2RRP.js.map → extension-CPSLJQVE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-RUKPKNY7.js.map → extension-CXJ6RELI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-BEJMQT64.js.map → gc-7GQYOS2G.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-JEFQDJPA.js.map → gc-LPVMKJQJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{health-JJJOY7DJ.js.map → health-3IPFLKXB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{health-P67NZ6TT.js.map → health-GZXGBZ36.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-YY4XYVEP.js.map → history-NERDJNUB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-5YGLWUDH.js.map → history-WSZHY3PN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-C4CRHW22.js.map → history-redact-MP6CH7U5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-HBFGYS66.js.map → history-redact-O3NBCNWC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-C7R33MD5.js.map → init-64XDLQJB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-DSN6UNFB.js.map → init-PAX32BJA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-LL2WLEDG.js.map → list-DNBJVO3E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-LQHXBAY5.js.map → list-G5Y65VF6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-2EI6EAXH.js.map → restore-4MHZFJ2E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-QBFBLQRO.js.map → restore-YALDGTQR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-NV2DRPUS.js.map → schema-73HR2OJW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-WA6RZGM2.js.map → schema-U6LJKSIR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-BSKMQOYH.js.map → search-AXPXKZER.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-FIGYNQ2I.js.map → search-KILGT37L.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{telemetry-BT2VSWU2.js.map → telemetry-BZUF6H7G.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{telemetry-LQ6FRTUT.js.map → telemetry-GAHHQTOS.js.map} +0 -0
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Implements extension runtime contracts and governance for Loader.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
7
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c04aa899-5cba-5907-be3e-4db7c63b7f13")}catch(e){}}();
|
|
8
8
|
import fs from "node:fs/promises";
|
|
9
9
|
import path from "node:path";
|
|
10
10
|
import { pathToFileURL } from "node:url";
|
|
@@ -72,33 +72,151 @@ function parseManifestEngines(value) {
|
|
|
72
72
|
}
|
|
73
73
|
return Object.keys(engines).length > 0 ? engines : undefined;
|
|
74
74
|
}
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
/** Parse a required manifest string field, returning `null` when it is absent, non-string, or blank. */
|
|
76
|
+
function parseRequiredManifestString(candidate, field) {
|
|
77
|
+
const value = candidate[field];
|
|
78
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
77
79
|
return null;
|
|
78
80
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
+
return value.trim();
|
|
82
|
+
}
|
|
83
|
+
/** Parse an optional integer value (`undefined` when absent, `null` when present but not an integer). */
|
|
84
|
+
function parseOptionalIntegerValue(value) {
|
|
85
|
+
if (value === undefined || value === null) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
if (typeof value !== "number" || !Number.isInteger(value)) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
/** Parse an optional boolean value (`undefined` when absent, `null` when present but not a boolean). */
|
|
94
|
+
function parseOptionalBooleanValue(value) {
|
|
95
|
+
if (value === undefined || value === null) {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
if (typeof value !== "boolean") {
|
|
81
99
|
return null;
|
|
82
100
|
}
|
|
83
|
-
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
/** Parse the optional integer `priority`, defaulting to {@link DEFAULT_EXTENSION_PRIORITY} when absent and rejecting (`null`) a non-integer. */
|
|
104
|
+
function parseManifestPriority(candidate) {
|
|
105
|
+
const value = parseOptionalIntegerValue(candidate.priority);
|
|
106
|
+
return value === undefined ? DEFAULT_EXTENSION_PRIORITY : value;
|
|
107
|
+
}
|
|
108
|
+
/** Parse the optional `sandbox_profile`, rejecting (`null`) any value that does not round-trip through {@link normalizePolicySandboxProfile}. */
|
|
109
|
+
function parseManifestSandboxProfile(candidate) {
|
|
110
|
+
const value = candidate.sandbox_profile;
|
|
111
|
+
if (value === undefined || value === null) {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
if (typeof value !== "string") {
|
|
84
115
|
return null;
|
|
85
116
|
}
|
|
86
|
-
|
|
117
|
+
const normalizedProfile = normalizePolicySandboxProfile(value);
|
|
118
|
+
if (normalizedProfile !== value.trim().toLowerCase()) {
|
|
87
119
|
return null;
|
|
88
120
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
121
|
+
return normalizedProfile;
|
|
122
|
+
}
|
|
123
|
+
/** Return the trimmed string when `value` is a non-blank string, otherwise `undefined`. */
|
|
124
|
+
function optionalTrimmedString(value) {
|
|
125
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
126
|
+
}
|
|
127
|
+
/** Parse the optional `provenance` record (`undefined` absent, `null` malformed), keeping only the present trimmed string fields and a boolean `verified`. */
|
|
128
|
+
function parseManifestProvenance(value) {
|
|
129
|
+
if (value === undefined || value === null) {
|
|
130
|
+
return undefined;
|
|
95
131
|
}
|
|
96
|
-
|
|
97
|
-
if (
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
132
|
+
const provenanceRecord = asRecordLoose(value);
|
|
133
|
+
if (!provenanceRecord) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
const source = optionalTrimmedString(provenanceRecord.source);
|
|
137
|
+
const signature = optionalTrimmedString(provenanceRecord.signature);
|
|
138
|
+
const attestation = optionalTrimmedString(provenanceRecord.attestation);
|
|
139
|
+
const verified = provenanceRecord.verified === undefined || provenanceRecord.verified === null
|
|
140
|
+
? undefined
|
|
141
|
+
: typeof provenanceRecord.verified === "boolean"
|
|
142
|
+
? provenanceRecord.verified
|
|
143
|
+
: null;
|
|
144
|
+
if (verified === null) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
...(source ? { source } : {}),
|
|
149
|
+
...(signature ? { signature } : {}),
|
|
150
|
+
...(attestation ? { attestation } : {}),
|
|
151
|
+
...(typeof verified === "boolean" ? { verified } : {}),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/** Parse the optional `permissions` record (`undefined` absent, `null` malformed), keeping only the boolean grants that are present. */
|
|
155
|
+
function parseManifestPermissions(value) {
|
|
156
|
+
if (value === undefined || value === null) {
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
const permissionsRecord = asRecordLoose(value);
|
|
160
|
+
if (!permissionsRecord) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
const fsRead = parseOptionalBooleanValue(permissionsRecord.fs_read);
|
|
164
|
+
const fsWrite = parseOptionalBooleanValue(permissionsRecord.fs_write);
|
|
165
|
+
const network = parseOptionalBooleanValue(permissionsRecord.network);
|
|
166
|
+
const envRead = parseOptionalBooleanValue(permissionsRecord.env_read);
|
|
167
|
+
const envWrite = parseOptionalBooleanValue(permissionsRecord.env_write);
|
|
168
|
+
const processSpawn = parseOptionalBooleanValue(permissionsRecord.process_spawn);
|
|
169
|
+
if ([fsRead, fsWrite, network, envRead, envWrite, processSpawn].includes(null)) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
...(typeof fsRead === "boolean" ? { fs_read: fsRead } : {}),
|
|
174
|
+
...(typeof fsWrite === "boolean" ? { fs_write: fsWrite } : {}),
|
|
175
|
+
...(typeof network === "boolean" ? { network } : {}),
|
|
176
|
+
...(typeof envRead === "boolean" ? { env_read: envRead } : {}),
|
|
177
|
+
...(typeof envWrite === "boolean" ? { env_write: envWrite } : {}),
|
|
178
|
+
...(typeof processSpawn === "boolean" ? { process_spawn: processSpawn } : {}),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/** Parse the optional `capabilities` array, normalizing legacy aliases; returns empty lists when absent and `null` when the field is not a string array. */
|
|
182
|
+
function parseManifestCapabilities(value) {
|
|
183
|
+
if (value === undefined || value === null) {
|
|
184
|
+
return { capabilities: [], legacy_aliases: [] };
|
|
185
|
+
}
|
|
186
|
+
if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string")) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
const normalizedCapabilities = normalizeManifestCapabilities(value);
|
|
190
|
+
return { capabilities: normalizedCapabilities.capabilities, legacy_aliases: normalizedCapabilities.legacy_aliases };
|
|
191
|
+
}
|
|
192
|
+
/** Parse the optional `activation` block, returning the de-duplicated sorted `commands` set, `undefined` when no command activation is declared, and `null` when the block is malformed. */
|
|
193
|
+
function parseManifestActivation(value) {
|
|
194
|
+
if (value === undefined || value === null) {
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
const activationRecord = asRecordLoose(value);
|
|
198
|
+
if (!activationRecord) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
const rawCommands = activationRecord.commands;
|
|
202
|
+
if (rawCommands === undefined || rawCommands === null) {
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
if (!Array.isArray(rawCommands) || rawCommands.some((entry) => typeof entry !== "string")) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
const commands = [
|
|
209
|
+
...new Set(rawCommands
|
|
210
|
+
.map((entry) => normalizeCommandName(entry))
|
|
211
|
+
.filter((entry) => entry.length > 0)),
|
|
212
|
+
].sort((left, right) => left.localeCompare(right));
|
|
213
|
+
return commands.length > 0 ? { commands } : undefined;
|
|
214
|
+
}
|
|
215
|
+
/** Parse every optional manifest metadata field, returning `null` as soon as any one is malformed. */
|
|
216
|
+
function parseManifestMetadata(candidate) {
|
|
217
|
+
const manifestVersion = parseOptionalIntegerValue(candidate.manifest_version);
|
|
218
|
+
if (manifestVersion === null) {
|
|
219
|
+
return null;
|
|
102
220
|
}
|
|
103
221
|
const pmMinVersion = parseOptionalManifestString(candidate, "pm_min_version");
|
|
104
222
|
if (pmMinVersion === null) {
|
|
@@ -112,136 +230,85 @@ function parseManifest(raw) {
|
|
|
112
230
|
if (engines === null) {
|
|
113
231
|
return null;
|
|
114
232
|
}
|
|
115
|
-
|
|
116
|
-
if (
|
|
117
|
-
|
|
118
|
-
return null;
|
|
119
|
-
}
|
|
120
|
-
trusted = candidate.trusted;
|
|
233
|
+
const trusted = parseOptionalBooleanValue(candidate.trusted);
|
|
234
|
+
if (trusted === null) {
|
|
235
|
+
return null;
|
|
121
236
|
}
|
|
122
|
-
|
|
123
|
-
if (
|
|
124
|
-
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
127
|
-
const normalizedProfile = normalizePolicySandboxProfile(candidate.sandbox_profile);
|
|
128
|
-
if (normalizedProfile !== candidate.sandbox_profile.trim().toLowerCase()) {
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
sandboxProfile = normalizedProfile;
|
|
237
|
+
const sandboxProfile = parseManifestSandboxProfile(candidate);
|
|
238
|
+
if (sandboxProfile === null) {
|
|
239
|
+
return null;
|
|
132
240
|
}
|
|
133
|
-
|
|
134
|
-
if (
|
|
135
|
-
|
|
136
|
-
if (!provenanceRecord) {
|
|
137
|
-
return null;
|
|
138
|
-
}
|
|
139
|
-
const source = typeof provenanceRecord.source === "string" && provenanceRecord.source.trim().length > 0
|
|
140
|
-
? provenanceRecord.source.trim()
|
|
141
|
-
: undefined;
|
|
142
|
-
const signature = typeof provenanceRecord.signature === "string" && provenanceRecord.signature.trim().length > 0
|
|
143
|
-
? provenanceRecord.signature.trim()
|
|
144
|
-
: undefined;
|
|
145
|
-
const attestation = typeof provenanceRecord.attestation === "string" && provenanceRecord.attestation.trim().length > 0
|
|
146
|
-
? provenanceRecord.attestation.trim()
|
|
147
|
-
: undefined;
|
|
148
|
-
const verified = provenanceRecord.verified === undefined || provenanceRecord.verified === null
|
|
149
|
-
? undefined
|
|
150
|
-
: typeof provenanceRecord.verified === "boolean"
|
|
151
|
-
? provenanceRecord.verified
|
|
152
|
-
: null;
|
|
153
|
-
if (verified === null) {
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
provenance = {
|
|
157
|
-
...(source ? { source } : {}),
|
|
158
|
-
...(signature ? { signature } : {}),
|
|
159
|
-
...(attestation ? { attestation } : {}),
|
|
160
|
-
...(typeof verified === "boolean" ? { verified } : {}),
|
|
161
|
-
};
|
|
241
|
+
const provenance = parseManifestProvenance(candidate.provenance);
|
|
242
|
+
if (provenance === null) {
|
|
243
|
+
return null;
|
|
162
244
|
}
|
|
163
|
-
|
|
164
|
-
if (
|
|
165
|
-
|
|
166
|
-
if (!permissionsRecord) {
|
|
167
|
-
return null;
|
|
168
|
-
}
|
|
169
|
-
const parseOptionalBoolean = (value) => {
|
|
170
|
-
if (value === undefined || value === null) {
|
|
171
|
-
return undefined;
|
|
172
|
-
}
|
|
173
|
-
if (typeof value !== "boolean") {
|
|
174
|
-
return null;
|
|
175
|
-
}
|
|
176
|
-
return value;
|
|
177
|
-
};
|
|
178
|
-
const fsRead = parseOptionalBoolean(permissionsRecord.fs_read);
|
|
179
|
-
const fsWrite = parseOptionalBoolean(permissionsRecord.fs_write);
|
|
180
|
-
const network = parseOptionalBoolean(permissionsRecord.network);
|
|
181
|
-
const envRead = parseOptionalBoolean(permissionsRecord.env_read);
|
|
182
|
-
const envWrite = parseOptionalBoolean(permissionsRecord.env_write);
|
|
183
|
-
const processSpawn = parseOptionalBoolean(permissionsRecord.process_spawn);
|
|
184
|
-
if ([fsRead, fsWrite, network, envRead, envWrite, processSpawn].includes(null)) {
|
|
185
|
-
return null;
|
|
186
|
-
}
|
|
187
|
-
permissions = {
|
|
188
|
-
...(typeof fsRead === "boolean" ? { fs_read: fsRead } : {}),
|
|
189
|
-
...(typeof fsWrite === "boolean" ? { fs_write: fsWrite } : {}),
|
|
190
|
-
...(typeof network === "boolean" ? { network } : {}),
|
|
191
|
-
...(typeof envRead === "boolean" ? { env_read: envRead } : {}),
|
|
192
|
-
...(typeof envWrite === "boolean" ? { env_write: envWrite } : {}),
|
|
193
|
-
...(typeof processSpawn === "boolean" ? { process_spawn: processSpawn } : {}),
|
|
194
|
-
};
|
|
245
|
+
const permissions = parseManifestPermissions(candidate.permissions);
|
|
246
|
+
if (permissions === null) {
|
|
247
|
+
return null;
|
|
195
248
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
if (!Array.isArray(candidate.capabilities) || candidate.capabilities.some((value) => typeof value !== "string")) {
|
|
200
|
-
return null;
|
|
201
|
-
}
|
|
202
|
-
const normalizedCapabilities = normalizeManifestCapabilities(candidate.capabilities);
|
|
203
|
-
capabilities = normalizedCapabilities.capabilities;
|
|
204
|
-
legacyCapabilityAliases = normalizedCapabilities.legacy_aliases;
|
|
249
|
+
const capabilities = parseManifestCapabilities(candidate.capabilities);
|
|
250
|
+
if (capabilities === null) {
|
|
251
|
+
return null;
|
|
205
252
|
}
|
|
206
|
-
|
|
207
|
-
if (
|
|
208
|
-
|
|
209
|
-
if (!activationRecord) {
|
|
210
|
-
return null;
|
|
211
|
-
}
|
|
212
|
-
const rawCommands = activationRecord.commands;
|
|
213
|
-
if (rawCommands !== undefined && rawCommands !== null) {
|
|
214
|
-
if (!Array.isArray(rawCommands) || rawCommands.some((value) => typeof value !== "string")) {
|
|
215
|
-
return null;
|
|
216
|
-
}
|
|
217
|
-
const commands = [
|
|
218
|
-
...new Set(rawCommands
|
|
219
|
-
.map((value) => normalizeCommandName(value))
|
|
220
|
-
.filter((value) => value.length > 0)),
|
|
221
|
-
].sort((left, right) => left.localeCompare(right));
|
|
222
|
-
if (commands.length > 0) {
|
|
223
|
-
activation = {
|
|
224
|
-
commands,
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
}
|
|
253
|
+
const activation = parseManifestActivation(candidate.activation);
|
|
254
|
+
if (activation === null) {
|
|
255
|
+
return null;
|
|
228
256
|
}
|
|
229
257
|
return {
|
|
230
|
-
name: candidate.name.trim(),
|
|
231
|
-
version: candidate.version.trim(),
|
|
232
|
-
entry: candidate.entry.trim(),
|
|
233
|
-
priority,
|
|
234
258
|
manifest_version: manifestVersion,
|
|
235
259
|
pm_min_version: pmMinVersion,
|
|
236
260
|
pm_max_version: pmMaxVersion,
|
|
237
261
|
engines,
|
|
238
262
|
trusted,
|
|
239
|
-
provenance,
|
|
240
263
|
sandbox_profile: sandboxProfile,
|
|
264
|
+
provenance,
|
|
241
265
|
permissions,
|
|
266
|
+
capabilities: capabilities.capabilities,
|
|
267
|
+
legacy_capability_aliases: capabilities.legacy_aliases,
|
|
242
268
|
activation,
|
|
243
|
-
|
|
244
|
-
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function parseManifest(raw) {
|
|
272
|
+
if (typeof raw !== "object" || raw === null) {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
const candidate = raw;
|
|
276
|
+
const name = parseRequiredManifestString(candidate, "name");
|
|
277
|
+
if (name === null) {
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
const version = parseRequiredManifestString(candidate, "version");
|
|
281
|
+
if (version === null) {
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
const entry = parseRequiredManifestString(candidate, "entry");
|
|
285
|
+
if (entry === null) {
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
const priority = parseManifestPriority(candidate);
|
|
289
|
+
if (priority === null) {
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
const metadata = parseManifestMetadata(candidate);
|
|
293
|
+
if (metadata === null) {
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
name,
|
|
298
|
+
version,
|
|
299
|
+
entry,
|
|
300
|
+
priority,
|
|
301
|
+
manifest_version: metadata.manifest_version,
|
|
302
|
+
pm_min_version: metadata.pm_min_version,
|
|
303
|
+
pm_max_version: metadata.pm_max_version,
|
|
304
|
+
engines: metadata.engines,
|
|
305
|
+
trusted: metadata.trusted,
|
|
306
|
+
provenance: metadata.provenance,
|
|
307
|
+
sandbox_profile: metadata.sandbox_profile,
|
|
308
|
+
permissions: metadata.permissions,
|
|
309
|
+
activation: metadata.activation,
|
|
310
|
+
capabilities: metadata.capabilities,
|
|
311
|
+
legacy_capability_aliases: metadata.legacy_capability_aliases.length > 0 ? metadata.legacy_capability_aliases : undefined,
|
|
245
312
|
};
|
|
246
313
|
}
|
|
247
314
|
function shouldEnable(name, enabled, disabled) {
|
|
@@ -380,26 +447,61 @@ async function scanExtensionLayer(layer, extensionsRoot, enabled, disabled, pmMa
|
|
|
380
447
|
}
|
|
381
448
|
return { diagnostics, warnings, candidates };
|
|
382
449
|
}
|
|
450
|
+
/**
|
|
451
|
+
* Build the `warn`-status scan result for a directory whose manifest is missing
|
|
452
|
+
* or unparseable, carrying the supplied diagnostic warning and no candidate.
|
|
453
|
+
*/
|
|
454
|
+
function buildUnavailableExtensionScan(layer, directory, manifestPath, warning) {
|
|
455
|
+
return {
|
|
456
|
+
diagnostic: {
|
|
457
|
+
layer,
|
|
458
|
+
directory,
|
|
459
|
+
manifest_path: manifestPath,
|
|
460
|
+
name: null,
|
|
461
|
+
version: null,
|
|
462
|
+
entry: null,
|
|
463
|
+
priority: null,
|
|
464
|
+
entry_path: null,
|
|
465
|
+
enabled: null,
|
|
466
|
+
status: "warn",
|
|
467
|
+
},
|
|
468
|
+
warnings: [warning],
|
|
469
|
+
candidate: null,
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Collect the non-fatal load warnings for a parsed extension manifest, in
|
|
474
|
+
* detection order: legacy capability aliases, unknown capabilities, an entry
|
|
475
|
+
* outside or absent from the extension directory, then the pm version
|
|
476
|
+
* floor/ceiling incompatibility warnings.
|
|
477
|
+
*/
|
|
478
|
+
function collectScannedExtensionWarnings(layer, manifest, entryWithinDirectory, entryExists, pmVersionCompatibility, pmMaxVersionCompatibility) {
|
|
479
|
+
const extensionWarnings = [];
|
|
480
|
+
if (Array.isArray(manifest.legacy_capability_aliases) && manifest.legacy_capability_aliases.length > 0) {
|
|
481
|
+
extensionWarnings.push(formatLegacyExtensionCapabilityAliasWarning(layer, manifest.name, manifest.legacy_capability_aliases));
|
|
482
|
+
}
|
|
483
|
+
for (const capability of collectUnknownExtensionCapabilities(manifest.capabilities)) {
|
|
484
|
+
extensionWarnings.push(formatUnknownExtensionCapabilityWarning(layer, manifest.name, capability));
|
|
485
|
+
}
|
|
486
|
+
if (!entryWithinDirectory) {
|
|
487
|
+
extensionWarnings.push(`extension_entry_outside_extension:${layer}:${manifest.name}`);
|
|
488
|
+
}
|
|
489
|
+
else if (!entryExists) {
|
|
490
|
+
extensionWarnings.push(`extension_entry_missing:${layer}:${manifest.name}`);
|
|
491
|
+
}
|
|
492
|
+
if (pmVersionCompatibility.warning) {
|
|
493
|
+
extensionWarnings.push(pmVersionCompatibility.warning);
|
|
494
|
+
}
|
|
495
|
+
if (pmMaxVersionCompatibility.warning) {
|
|
496
|
+
extensionWarnings.push(pmMaxVersionCompatibility.warning);
|
|
497
|
+
}
|
|
498
|
+
return extensionWarnings;
|
|
499
|
+
}
|
|
383
500
|
async function scanExtensionDirectory(layer, extensionsRoot, directory, enabled, disabled, managedSourcePackages, pmMaxVersionExceededMode) {
|
|
384
501
|
const extensionDir = path.join(extensionsRoot, directory);
|
|
385
502
|
const manifestPath = path.join(extensionDir, "manifest.json");
|
|
386
503
|
if (!(await pathExists(manifestPath))) {
|
|
387
|
-
return {
|
|
388
|
-
diagnostic: {
|
|
389
|
-
layer,
|
|
390
|
-
directory,
|
|
391
|
-
manifest_path: manifestPath,
|
|
392
|
-
name: null,
|
|
393
|
-
version: null,
|
|
394
|
-
entry: null,
|
|
395
|
-
priority: null,
|
|
396
|
-
entry_path: null,
|
|
397
|
-
enabled: null,
|
|
398
|
-
status: "warn",
|
|
399
|
-
},
|
|
400
|
-
warnings: [`extension_manifest_missing:${layer}:${directory}`],
|
|
401
|
-
candidate: null,
|
|
402
|
-
};
|
|
504
|
+
return buildUnavailableExtensionScan(layer, directory, manifestPath, `extension_manifest_missing:${layer}:${directory}`);
|
|
403
505
|
}
|
|
404
506
|
let manifest = null;
|
|
405
507
|
try {
|
|
@@ -410,22 +512,7 @@ async function scanExtensionDirectory(layer, extensionsRoot, directory, enabled,
|
|
|
410
512
|
manifest = null;
|
|
411
513
|
}
|
|
412
514
|
if (!manifest) {
|
|
413
|
-
return {
|
|
414
|
-
diagnostic: {
|
|
415
|
-
layer,
|
|
416
|
-
directory,
|
|
417
|
-
manifest_path: manifestPath,
|
|
418
|
-
name: null,
|
|
419
|
-
version: null,
|
|
420
|
-
entry: null,
|
|
421
|
-
priority: null,
|
|
422
|
-
entry_path: null,
|
|
423
|
-
enabled: null,
|
|
424
|
-
status: "warn",
|
|
425
|
-
},
|
|
426
|
-
warnings: [`extension_manifest_invalid:${layer}:${directory}`],
|
|
427
|
-
candidate: null,
|
|
428
|
-
};
|
|
515
|
+
return buildUnavailableExtensionScan(layer, directory, manifestPath, `extension_manifest_invalid:${layer}:${directory}`);
|
|
429
516
|
}
|
|
430
517
|
const entryPath = path.resolve(extensionDir, manifest.entry);
|
|
431
518
|
const entryWithinDirectoryByPath = isPathWithinDirectory(extensionDir, entryPath);
|
|
@@ -434,27 +521,9 @@ async function scanExtensionDirectory(layer, extensionsRoot, directory, enabled,
|
|
|
434
521
|
? await isCanonicalPathWithinDirectory(extensionDir, entryPath)
|
|
435
522
|
: entryWithinDirectoryByPath;
|
|
436
523
|
const enabledForLoad = shouldEnable(manifest.name, enabled, disabled);
|
|
437
|
-
const extensionWarnings = [];
|
|
438
|
-
if (Array.isArray(manifest.legacy_capability_aliases) && manifest.legacy_capability_aliases.length > 0) {
|
|
439
|
-
extensionWarnings.push(formatLegacyExtensionCapabilityAliasWarning(layer, manifest.name, manifest.legacy_capability_aliases));
|
|
440
|
-
}
|
|
441
|
-
for (const capability of collectUnknownExtensionCapabilities(manifest.capabilities)) {
|
|
442
|
-
extensionWarnings.push(formatUnknownExtensionCapabilityWarning(layer, manifest.name, capability));
|
|
443
|
-
}
|
|
444
|
-
if (!entryWithinDirectory) {
|
|
445
|
-
extensionWarnings.push(`extension_entry_outside_extension:${layer}:${manifest.name}`);
|
|
446
|
-
}
|
|
447
|
-
else if (!entryExists) {
|
|
448
|
-
extensionWarnings.push(`extension_entry_missing:${layer}:${manifest.name}`);
|
|
449
|
-
}
|
|
450
524
|
const pmVersionCompatibility = await evaluatePmMinVersionCompatibility(layer, manifest);
|
|
451
|
-
if (pmVersionCompatibility.warning) {
|
|
452
|
-
extensionWarnings.push(pmVersionCompatibility.warning);
|
|
453
|
-
}
|
|
454
525
|
const pmMaxVersionCompatibility = await evaluatePmMaxVersionCompatibility(layer, manifest, pmMaxVersionExceededMode);
|
|
455
|
-
|
|
456
|
-
extensionWarnings.push(pmMaxVersionCompatibility.warning);
|
|
457
|
-
}
|
|
526
|
+
const extensionWarnings = collectScannedExtensionWarnings(layer, manifest, entryWithinDirectory, entryExists, pmVersionCompatibility, pmMaxVersionCompatibility);
|
|
458
527
|
const extensionReady = entryWithinDirectory &&
|
|
459
528
|
entryExists &&
|
|
460
529
|
pmVersionCompatibility.allowed &&
|
|
@@ -1178,6 +1247,115 @@ function validateMigrationDefinition(definition) {
|
|
|
1178
1247
|
throw new TypeError("registerMigration definition.run must be a function when provided");
|
|
1179
1248
|
}
|
|
1180
1249
|
}
|
|
1250
|
+
/**
|
|
1251
|
+
* The seven array-valued dimensions a {@link ProjectProfileDefinition} stages.
|
|
1252
|
+
* Each is "optional-by-emptiness": an omitted dimension normalizes to an empty
|
|
1253
|
+
* array so the profile planner can iterate every dimension unconditionally.
|
|
1254
|
+
*/
|
|
1255
|
+
const PROJECT_PROFILE_DIMENSIONS = [
|
|
1256
|
+
"types",
|
|
1257
|
+
"statuses",
|
|
1258
|
+
"fields",
|
|
1259
|
+
"workflows",
|
|
1260
|
+
"config",
|
|
1261
|
+
"templates",
|
|
1262
|
+
"packages",
|
|
1263
|
+
];
|
|
1264
|
+
/**
|
|
1265
|
+
* Validates the field shapes the profile planner, `pm profile show/apply/lint`,
|
|
1266
|
+
* and `describeProjectProfile` dereference without re-checking, so a structurally
|
|
1267
|
+
* well-formed but type-violating extension entry (e.g. a workflow whose `type` is
|
|
1268
|
+
* a number, or whose `allowed_transitions` is not an array) is rejected here
|
|
1269
|
+
* rather than crashing a downstream consumer. Dimensions whose consumers already
|
|
1270
|
+
* coerce or gracefully reject malformed values (statuses, fields, config) need no
|
|
1271
|
+
* shape check. The `entry` is an already-confirmed non-null object.
|
|
1272
|
+
*/
|
|
1273
|
+
function validateProjectProfileEntryShape(dimension, index, entry) {
|
|
1274
|
+
const at = `registerProfile profile.${dimension}[${index}]`;
|
|
1275
|
+
if (dimension === "types") {
|
|
1276
|
+
if (entry.name !== undefined && typeof entry.name !== "string") {
|
|
1277
|
+
throw new TypeError(`${at}.name must be a string when provided`);
|
|
1278
|
+
}
|
|
1279
|
+
return;
|
|
1280
|
+
}
|
|
1281
|
+
if (dimension === "workflows") {
|
|
1282
|
+
if (typeof entry.type !== "string") {
|
|
1283
|
+
throw new TypeError(`${at}.type must be a string`);
|
|
1284
|
+
}
|
|
1285
|
+
if (!Array.isArray(entry.allowed_transitions)) {
|
|
1286
|
+
throw new TypeError(`${at}.allowed_transitions must be an array`);
|
|
1287
|
+
}
|
|
1288
|
+
for (const [pairIndex, pair] of entry.allowed_transitions.entries()) {
|
|
1289
|
+
if (!Array.isArray(pair)) {
|
|
1290
|
+
throw new TypeError(`${at}.allowed_transitions[${pairIndex}] must be a [from, to] array`);
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
return;
|
|
1294
|
+
}
|
|
1295
|
+
if (dimension === "templates") {
|
|
1296
|
+
if (typeof entry.name !== "string") {
|
|
1297
|
+
throw new TypeError(`${at}.name must be a string`);
|
|
1298
|
+
}
|
|
1299
|
+
if (typeof entry.options !== "object" || entry.options === null || Array.isArray(entry.options)) {
|
|
1300
|
+
throw new TypeError(`${at}.options must be an object`);
|
|
1301
|
+
}
|
|
1302
|
+
return;
|
|
1303
|
+
}
|
|
1304
|
+
if (dimension === "packages") {
|
|
1305
|
+
if (typeof entry.spec !== "string") {
|
|
1306
|
+
throw new TypeError(`${at}.spec must be a string`);
|
|
1307
|
+
}
|
|
1308
|
+
}
|
|
1309
|
+
}
|
|
1310
|
+
function validateProjectProfileDefinition(profile) {
|
|
1311
|
+
const record = asRegistrationRecord("registerProfile profile", profile);
|
|
1312
|
+
assertNonEmptyString("registerProfile profile.name", record.name);
|
|
1313
|
+
assertNonEmptyString("registerProfile profile.title", record.title);
|
|
1314
|
+
if (record.summary !== undefined && typeof record.summary !== "string") {
|
|
1315
|
+
throw new TypeError("registerProfile profile.summary must be a string when provided");
|
|
1316
|
+
}
|
|
1317
|
+
for (const dimension of PROJECT_PROFILE_DIMENSIONS) {
|
|
1318
|
+
const value = record[dimension];
|
|
1319
|
+
if (value === undefined) {
|
|
1320
|
+
continue;
|
|
1321
|
+
}
|
|
1322
|
+
if (!Array.isArray(value)) {
|
|
1323
|
+
throw new TypeError(`registerProfile profile.${dimension} must be an array when provided`);
|
|
1324
|
+
}
|
|
1325
|
+
// Each dimension entry must be a non-null object: a primitive or null entry
|
|
1326
|
+
// (e.g. `statuses: [null]`, `types: [42]`) survives an array-only check but
|
|
1327
|
+
// crashes the profile planner and `pm profile show` when they read `entry.id`
|
|
1328
|
+
// / `entry.key` / `entry.type` later. Reject it at the registration boundary.
|
|
1329
|
+
for (const [index, entry] of value.entries()) {
|
|
1330
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
|
|
1331
|
+
throw new TypeError(`registerProfile profile.${dimension}[${index}] must be an object`);
|
|
1332
|
+
}
|
|
1333
|
+
// Beyond "is an object", validate the specific field shapes consumers
|
|
1334
|
+
// dereference so a type-violating entry can never crash the planner, the
|
|
1335
|
+
// `pm profile` surfaces, or describeProjectProfile downstream.
|
|
1336
|
+
validateProjectProfileEntryShape(dimension, index, entry);
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
}
|
|
1340
|
+
/**
|
|
1341
|
+
* Fills an already-validated profile snapshot's optional surfaces — an absent
|
|
1342
|
+
* `summary` becomes an empty string and every omitted dimension an empty array —
|
|
1343
|
+
* so the stored definition always has the full {@link ProjectProfileDefinition}
|
|
1344
|
+
* shape the profile planner and `pm profile` resolution rely on. It runs after
|
|
1345
|
+
* validation on the cloned snapshot, so it only ever supplies missing defaults
|
|
1346
|
+
* and never has to coerce an invalid type (those are already rejected).
|
|
1347
|
+
*/
|
|
1348
|
+
function applyProjectProfileDefaults(profile) {
|
|
1349
|
+
if (profile.summary === undefined) {
|
|
1350
|
+
profile.summary = "";
|
|
1351
|
+
}
|
|
1352
|
+
for (const dimension of PROJECT_PROFILE_DIMENSIONS) {
|
|
1353
|
+
if (profile[dimension] === undefined) {
|
|
1354
|
+
profile[dimension] = [];
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1357
|
+
return profile;
|
|
1358
|
+
}
|
|
1181
1359
|
function attachRuntimeDefinition(entry, runtimeDefinition) {
|
|
1182
1360
|
Object.defineProperty(entry, "runtime_definition", {
|
|
1183
1361
|
value: runtimeDefinition,
|
|
@@ -1265,69 +1443,70 @@ function createExtensionApi(extension, hooks, commands, parsers, preflight, serv
|
|
|
1265
1443
|
received: sanitizeRegistrationValue(received),
|
|
1266
1444
|
hint,
|
|
1267
1445
|
});
|
|
1268
|
-
const
|
|
1269
|
-
|
|
1270
|
-
if (
|
|
1271
|
-
|
|
1272
|
-
if (normalizedCommand.length === 0) {
|
|
1273
|
-
throw createRegistrationValidationError("registerCommand requires a non-empty command name", registerCommandTrace("override", commandOrDefinition, 'registerCommand("<command>", (context) => unknown)', commandOrDefinition, "Provide a non-empty command path as the first argument."));
|
|
1274
|
-
}
|
|
1275
|
-
if (typeof override !== "function") {
|
|
1276
|
-
const trace = registerCommandTrace("override", normalizedCommand, 'registerCommand("<command>", (context) => unknown)', { command: commandOrDefinition, override }, "Provide a function as the second registerCommand argument.");
|
|
1277
|
-
throw createRegistrationValidationError(`registerCommand requires an override function when command name is provided (command="${normalizedCommand}", registration_index=${trace.registration_index})`, trace);
|
|
1278
|
-
}
|
|
1279
|
-
if (!allowRegistration("commands.override", "registerCommand", "commands", { command: normalizedCommand })) {
|
|
1280
|
-
return;
|
|
1281
|
-
}
|
|
1282
|
-
commands.overrides.push({
|
|
1283
|
-
layer: extension.layer,
|
|
1284
|
-
name: extension.name,
|
|
1285
|
-
command: normalizedCommand,
|
|
1286
|
-
run: override,
|
|
1287
|
-
});
|
|
1288
|
-
return;
|
|
1289
|
-
}
|
|
1290
|
-
if (typeof commandOrDefinition !== "object" || commandOrDefinition === null) {
|
|
1291
|
-
throw createRegistrationValidationError("registerCommand requires a command definition object", registerCommandTrace("definition", undefined, "{ name: string; run: (context) => unknown; }", commandOrDefinition, "Use registerCommand({ name: \"command path\", run: (context) => ... })."));
|
|
1446
|
+
const registerCommandOverride = (command, override) => {
|
|
1447
|
+
const normalizedCommand = normalizeCommandName(command);
|
|
1448
|
+
if (normalizedCommand.length === 0) {
|
|
1449
|
+
throw createRegistrationValidationError("registerCommand requires a non-empty command name", registerCommandTrace("override", command, 'registerCommand("<command>", (context) => unknown)', command, "Provide a non-empty command path as the first argument."));
|
|
1292
1450
|
}
|
|
1293
|
-
if (typeof
|
|
1294
|
-
|
|
1451
|
+
if (typeof override !== "function") {
|
|
1452
|
+
const trace = registerCommandTrace("override", normalizedCommand, 'registerCommand("<command>", (context) => unknown)', { command, override }, "Provide a function as the second registerCommand argument.");
|
|
1453
|
+
throw createRegistrationValidationError(`registerCommand requires an override function when command name is provided (command="${normalizedCommand}", registration_index=${trace.registration_index})`, trace);
|
|
1295
1454
|
}
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
throw createRegistrationValidationError("registerCommand requires a non-empty command definition name", registerCommandTrace("definition", commandOrDefinition.name, "{ name: string; run: (context) => unknown; }", commandOrDefinition, "Ensure command definition.name contains a non-empty command path."));
|
|
1455
|
+
if (!allowRegistration("commands.override", "registerCommand", "commands", { command: normalizedCommand })) {
|
|
1456
|
+
return;
|
|
1299
1457
|
}
|
|
1300
|
-
|
|
1301
|
-
|
|
1458
|
+
commands.overrides.push({
|
|
1459
|
+
layer: extension.layer,
|
|
1460
|
+
name: extension.name,
|
|
1461
|
+
command: normalizedCommand,
|
|
1462
|
+
run: override,
|
|
1463
|
+
});
|
|
1464
|
+
};
|
|
1465
|
+
const resolveCommandDefinitionRunHandler = (definition, normalizedCommand) => {
|
|
1466
|
+
const runHandler = typeof definition.run === "function" ? definition.run : undefined;
|
|
1467
|
+
const legacyHandler = typeof definition.handler === "function" ? definition.handler : undefined;
|
|
1302
1468
|
if (!runHandler && legacyHandler) {
|
|
1303
1469
|
activationWarnings.push(`extension_command_definition_legacy_handler_alias:${extension.layer}:${extension.name}:${normalizedCommand}`);
|
|
1304
1470
|
}
|
|
1305
|
-
|
|
1471
|
+
return runHandler ?? legacyHandler;
|
|
1472
|
+
};
|
|
1473
|
+
const registerCommandDefinition = (definition) => {
|
|
1474
|
+
if (typeof definition !== "object" || definition === null) {
|
|
1475
|
+
throw createRegistrationValidationError("registerCommand requires a command definition object", registerCommandTrace("definition", undefined, "{ name: string; run: (context) => unknown; }", definition, "Use registerCommand({ name: \"command path\", run: (context) => ... })."));
|
|
1476
|
+
}
|
|
1477
|
+
if (typeof definition.name !== "string") {
|
|
1478
|
+
throw createRegistrationValidationError("registerCommand requires a command definition name", registerCommandTrace("definition", undefined, "{ name: string; run: (context) => unknown; }", definition, "Set command definition.name to a non-empty string command path."));
|
|
1479
|
+
}
|
|
1480
|
+
const normalizedCommand = normalizeCommandName(definition.name);
|
|
1481
|
+
if (normalizedCommand.length === 0) {
|
|
1482
|
+
throw createRegistrationValidationError("registerCommand requires a non-empty command definition name", registerCommandTrace("definition", definition.name, "{ name: string; run: (context) => unknown; }", definition, "Ensure command definition.name contains a non-empty command path."));
|
|
1483
|
+
}
|
|
1484
|
+
const resolvedHandler = resolveCommandDefinitionRunHandler(definition, normalizedCommand);
|
|
1306
1485
|
if (typeof resolvedHandler !== "function") {
|
|
1307
|
-
const trace = registerCommandTrace("definition", normalizedCommand, "{ name: string; run: (context) => unknown; }",
|
|
1486
|
+
const trace = registerCommandTrace("definition", normalizedCommand, "{ name: string; run: (context) => unknown; }", definition, "Define command definition.run as a function.");
|
|
1308
1487
|
throw createRegistrationValidationError(`registerCommand requires a command definition run handler (command="${normalizedCommand}", registration_index=${trace.registration_index})`, trace);
|
|
1309
1488
|
}
|
|
1310
1489
|
try {
|
|
1311
|
-
assertOptionalStringField("registerCommand definition.action",
|
|
1312
|
-
assertOptionalStringField("registerCommand definition.description",
|
|
1313
|
-
assertOptionalStringField("registerCommand definition.intent",
|
|
1314
|
-
const action = resolveCommandDefinitionAction(normalizedCommand,
|
|
1490
|
+
assertOptionalStringField("registerCommand definition.action", definition.action);
|
|
1491
|
+
assertOptionalStringField("registerCommand definition.description", definition.description);
|
|
1492
|
+
assertOptionalStringField("registerCommand definition.intent", definition.intent);
|
|
1493
|
+
const action = resolveCommandDefinitionAction(normalizedCommand, definition.action);
|
|
1315
1494
|
if (!allowRegistration("commands.handler", "registerCommand", "commands", { command: normalizedCommand, action })) {
|
|
1316
1495
|
return;
|
|
1317
1496
|
}
|
|
1318
|
-
const description =
|
|
1319
|
-
const intent =
|
|
1320
|
-
const examples = normalizeOptionalStringArrayField("registerCommand definition.examples",
|
|
1321
|
-
const failureHints = normalizeOptionalStringArrayField("registerCommand definition.failure_hints",
|
|
1322
|
-
const argumentsDefinition = normalizeCommandDefinitionArguments(
|
|
1323
|
-
if (
|
|
1497
|
+
const description = definition.description?.trim();
|
|
1498
|
+
const intent = definition.intent?.trim();
|
|
1499
|
+
const examples = normalizeOptionalStringArrayField("registerCommand definition.examples", definition.examples);
|
|
1500
|
+
const failureHints = normalizeOptionalStringArrayField("registerCommand definition.failure_hints", definition.failure_hints);
|
|
1501
|
+
const argumentsDefinition = normalizeCommandDefinitionArguments(definition.arguments);
|
|
1502
|
+
if (definition.flags !== undefined) {
|
|
1324
1503
|
assertExtensionCapability(extension, "schema", "registerCommand flags");
|
|
1325
|
-
validateFlagDefinitions(
|
|
1504
|
+
validateFlagDefinitions(definition.flags);
|
|
1326
1505
|
registrations.flags.push({
|
|
1327
1506
|
layer: extension.layer,
|
|
1328
1507
|
name: extension.name,
|
|
1329
1508
|
target_command: normalizedCommand,
|
|
1330
|
-
flags: normalizeRegistrationRecordList("registerCommand definition.flags",
|
|
1509
|
+
flags: normalizeRegistrationRecordList("registerCommand definition.flags", definition.flags),
|
|
1331
1510
|
});
|
|
1332
1511
|
}
|
|
1333
1512
|
const registration = {
|
|
@@ -1350,7 +1529,7 @@ function createExtensionApi(extension, hooks, commands, parsers, preflight, serv
|
|
|
1350
1529
|
}
|
|
1351
1530
|
catch (error) {
|
|
1352
1531
|
const reason = formatUnknownError(error);
|
|
1353
|
-
const trace = registerCommandTrace("definition", normalizedCommand, "{ name: string; run: (context) => unknown; action?: string; arguments?: object[]; flags?: object[]; }",
|
|
1532
|
+
const trace = registerCommandTrace("definition", normalizedCommand, "{ name: string; run: (context) => unknown; action?: string; arguments?: object[]; flags?: object[]; }", definition, "Use schema-style metadata (action/arguments/flags/examples/intent) with valid values.");
|
|
1354
1533
|
throw createRegistrationValidationError(`registerCommand definition metadata invalid (command="${normalizedCommand}", registration_index=${trace.registration_index}): ${reason}`, trace);
|
|
1355
1534
|
}
|
|
1356
1535
|
commands.handlers.push({
|
|
@@ -1360,6 +1539,14 @@ function createExtensionApi(extension, hooks, commands, parsers, preflight, serv
|
|
|
1360
1539
|
run: resolvedHandler,
|
|
1361
1540
|
});
|
|
1362
1541
|
};
|
|
1542
|
+
const registerCommand = (commandOrDefinition, override) => {
|
|
1543
|
+
assertExtensionCapability(extension, "commands", "registerCommand");
|
|
1544
|
+
if (typeof commandOrDefinition === "string") {
|
|
1545
|
+
registerCommandOverride(commandOrDefinition, override);
|
|
1546
|
+
return;
|
|
1547
|
+
}
|
|
1548
|
+
registerCommandDefinition(commandOrDefinition);
|
|
1549
|
+
};
|
|
1363
1550
|
const registerParser = (command, override) => {
|
|
1364
1551
|
assertExtensionCapability(extension, "parser", "registerParser");
|
|
1365
1552
|
if (!allowRegistration("parser.override", "registerParser", "parser")) {
|
|
@@ -1485,6 +1672,24 @@ function createExtensionApi(extension, hooks, commands, parsers, preflight, serv
|
|
|
1485
1672
|
definition: normalizeRegistrationRecord("registerMigration definition", definition),
|
|
1486
1673
|
}, runtimeDefinition));
|
|
1487
1674
|
};
|
|
1675
|
+
const registerProfile = (profile) => {
|
|
1676
|
+
assertExtensionCapability(extension, "schema", "registerProfile");
|
|
1677
|
+
if (!allowRegistration("schema.profiles", "registerProfile", "schema")) {
|
|
1678
|
+
return;
|
|
1679
|
+
}
|
|
1680
|
+
// Snapshot first, then validate and default the snapshot: cloning resolves
|
|
1681
|
+
// any getters once into plain data decoupled from the caller's object, so
|
|
1682
|
+
// validation and storage operate on the same value — a getter cannot present
|
|
1683
|
+
// one value to validation and another to the registry. Defaults are applied
|
|
1684
|
+
// only after validation, so an invalid type is rejected, not silently coerced.
|
|
1685
|
+
const snapshot = cloneRuntimeRegistrationValue(profile);
|
|
1686
|
+
validateProjectProfileDefinition(snapshot);
|
|
1687
|
+
registrations.profiles.push({
|
|
1688
|
+
layer: extension.layer,
|
|
1689
|
+
name: extension.name,
|
|
1690
|
+
profile: applyProjectProfileDefaults(snapshot),
|
|
1691
|
+
});
|
|
1692
|
+
};
|
|
1488
1693
|
const applyImportExportCommandMetadata = (method, commandPath, options) => {
|
|
1489
1694
|
if (options === undefined) {
|
|
1490
1695
|
return;
|
|
@@ -1689,6 +1894,7 @@ function createExtensionApi(extension, hooks, commands, parsers, preflight, serv
|
|
|
1689
1894
|
registerItemFields,
|
|
1690
1895
|
registerItemTypes,
|
|
1691
1896
|
registerMigration,
|
|
1897
|
+
registerProfile,
|
|
1692
1898
|
registerRenderer,
|
|
1693
1899
|
registerImporter,
|
|
1694
1900
|
registerExporter,
|
|
@@ -1714,6 +1920,7 @@ function getRegistrationCounts(registrations) {
|
|
|
1714
1920
|
item_fields: itemFieldCount,
|
|
1715
1921
|
item_types: itemTypeCount,
|
|
1716
1922
|
migrations: registrations.migrations.length,
|
|
1923
|
+
profiles: registrations.profiles.length,
|
|
1717
1924
|
importers: registrations.importers.length,
|
|
1718
1925
|
exporters: registrations.exporters.length,
|
|
1719
1926
|
search_providers: registrations.search_providers.length,
|
|
@@ -1934,4 +2141,4 @@ export const _testOnlyLoader = {
|
|
|
1934
2141
|
},
|
|
1935
2142
|
};
|
|
1936
2143
|
//# sourceMappingURL=loader.js.map
|
|
1937
|
-
//# debugId=
|
|
2144
|
+
//# debugId=c04aa899-5cba-5907-be3e-4db7c63b7f13
|