@unbrained/pm-cli 2026.6.22 → 2026.6.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/dist/cli/commands/completion.js +5 -4
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/contracts.js +4 -3
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/extension/describe.d.ts +70 -0
- package/dist/cli/commands/extension/describe.js +76 -0
- package/dist/cli/commands/extension/describe.js.map +1 -0
- package/dist/cli/commands/extension/scaffold.js +183 -47
- package/dist/cli/commands/extension/scaffold.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +2 -1
- package/dist/cli/commands/extension.js +36 -4
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/help-content.js +6 -2
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/register-setup.js +10 -2
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli-bundle/chunks/activity-54TXGJ2T.js +18 -0
- package/dist/cli-bundle/chunks/{activity-DXS2XMQU.js → activity-N7RVTLBQ.js} +11 -11
- package/dist/cli-bundle/chunks/{aggregate-IHM4KMQ3.js → aggregate-63NWNIBR.js} +10 -10
- package/dist/cli-bundle/chunks/{aggregate-NMYDVQF7.js → aggregate-YHCYX2EV.js} +10 -10
- package/dist/cli-bundle/chunks/{append-3HY5G7ET.js → append-PUKREFV5.js} +8 -8
- package/dist/cli-bundle/chunks/{append-K54MDQYC.js → append-VLQQDHMJ.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-DU64SZUQ.js → chunk-2WCYE3IF.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NKZOJPXK.js → chunk-3BKH2CL3.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-7MALIV5H.js → chunk-4XDGYFHL.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-VB54F347.js → chunk-5BBEWX6C.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-DHBPJ7VG.js → chunk-5S4ZGDB2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-UKK2VTTH.js → chunk-6EBNFQOR.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-5SESR24H.js → chunk-6EL7SW5C.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-JLSC5NPC.js → chunk-6W3Y65PL.js} +10 -10
- package/dist/cli-bundle/chunks/{chunk-HYQV75IB.js → chunk-A66VYUOV.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-I367IDZP.js → chunk-ABYCA5VX.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-47HTJ6BU.js → chunk-AEACLRVH.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-MD7XKVWI.js → chunk-ALKFCIIB.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-B2KR24R4.js → chunk-ALQKV6U7.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-NIWY4V4Z.js → chunk-AYPQUFCX.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-AJXYOYJV.js → chunk-B74BP6IS.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-THKDPOS5.js → chunk-BFFO3AIB.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-CR7KFPAQ.js → chunk-C4C3EJCJ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-J2TSPY5L.js → chunk-CG3KP6I5.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-CWPBGUC7.js → chunk-CZIFFMZI.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-75VEYQJS.js → chunk-DTABLLVE.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-TIKJAXQW.js → chunk-EOGBMLCE.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-YATDFWYK.js → chunk-EWRSXOIZ.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-RZZMSY4P.js → chunk-EYPINTFR.js} +151 -98
- package/dist/cli-bundle/chunks/chunk-EYPINTFR.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-RPRFBXND.js → chunk-F32L4HR6.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-NVUATMTC.js → chunk-F4BNR2IN.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-Y4BZEND6.js → chunk-FBLT6WGK.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-PCH2JTEO.js → chunk-FMWW2JDU.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-WQDX7DVG.js → chunk-GDUMGZK3.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-KBTREGVO.js → chunk-GQYJEEFX.js} +8 -5
- package/dist/cli-bundle/chunks/{chunk-KBTREGVO.js.map → chunk-GQYJEEFX.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-FK6MV5F5.js → chunk-HBAEFWX3.js} +12 -12
- package/dist/cli-bundle/chunks/{chunk-6UPTNMVW.js → chunk-HC2S36NB.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-XKNF3VRJ.js → chunk-HZF5RLKX.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-4JXWVHMN.js → chunk-I6QMJ2XT.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-44O4JIN6.js → chunk-IAP5KYBQ.js} +13 -13
- package/dist/cli-bundle/chunks/{chunk-4YJA4LGU.js → chunk-INPHFO33.js} +160 -42
- package/dist/cli-bundle/chunks/chunk-INPHFO33.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-A7E4ZXG2.js → chunk-IOT6WRL5.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KRJJPDUO.js → chunk-IXAZI443.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-DMT4ODVN.js → chunk-J3NMWFIN.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-7PBGTIN3.js → chunk-J7I4C5ZB.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-7GCCDXXN.js → chunk-JKL6HRMV.js} +123 -8
- package/dist/cli-bundle/chunks/chunk-JKL6HRMV.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-CLLVBO3I.js → chunk-JPJDP4VU.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-PJS2J7Z4.js → chunk-JV27C7OZ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-K25UDYJ4.js → chunk-KIEAK7YE.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-GGAXE22C.js → chunk-KJZOSF7J.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-GXBSFKSX.js → chunk-KKX4Z2SE.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-D35LTIFR.js → chunk-L7UXKP2I.js} +110 -9
- package/dist/cli-bundle/chunks/chunk-L7UXKP2I.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-C5SWTISA.js → chunk-LNEDHJNQ.js} +12 -12
- package/dist/cli-bundle/chunks/{chunk-YRLLL5TY.js → chunk-LU36E6GU.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-I6XE47J2.js → chunk-M6TUBOGW.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-DBQUQ3AS.js → chunk-MEXZ5XUM.js} +7 -4
- package/dist/cli-bundle/chunks/{chunk-DBQUQ3AS.js.map → chunk-MEXZ5XUM.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-YJICYNAV.js → chunk-MWMHZOZZ.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-SFKQAVZA.js → chunk-N5B6WZC5.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-3GL6LTUL.js → chunk-NJ73ALW2.js} +161 -43
- package/dist/cli-bundle/chunks/chunk-NJ73ALW2.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-WBSYW3NT.js → chunk-NVXGVEFD.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-7MPTFYT3.js → chunk-OF7V47P3.js} +15 -4
- package/dist/cli-bundle/chunks/chunk-OF7V47P3.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-GNDHOR64.js → chunk-OHDQNKJB.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-2LEYMXI6.js → chunk-OQ2E64FH.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-25XZN3JD.js → chunk-PEL2NLQE.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-H6FNDCDI.js → chunk-PRVTGX64.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-TZQKEBKF.js → chunk-QOUOMPHO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-77VKGH4L.js → chunk-RAWA3Y7O.js} +10 -10
- package/dist/cli-bundle/chunks/{chunk-Y335KFHD.js → chunk-RRP6D345.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-4SDKF5BG.js → chunk-SKC4UTRP.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-TRUFOER3.js → chunk-SMXSDY7J.js} +15 -4
- package/dist/cli-bundle/chunks/chunk-SMXSDY7J.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-JY25IOEZ.js → chunk-SUREE24M.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-A25LOPRG.js → chunk-TIM4OD74.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KK4TQ3ZP.js → chunk-TKPP4GOO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-6FQHNHQQ.js → chunk-TSI32UEL.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-TJABI6PR.js → chunk-UACWNBL2.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-EVPVCE4R.js → chunk-V4UYNSEM.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-QQWEROGS.js → chunk-VFJYVXHL.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-KL5ELX2X.js → chunk-VSAABFGQ.js} +144 -98
- package/dist/cli-bundle/chunks/chunk-VSAABFGQ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-YQSWTVZF.js → chunk-WB5BYQMF.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-MNGAQB2E.js → chunk-XVYKWZNL.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-V4SM4UAL.js → chunk-XXKV4UWE.js} +13 -13
- package/dist/cli-bundle/chunks/{chunk-GU7YHKYP.js → chunk-YV2OSAMS.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-P7ZU73BO.js → chunk-ZLWRPBOW.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-3VLPDG3J.js → chunk-ZV7IQ23N.js} +2 -2
- package/dist/cli-bundle/chunks/{claim-MPXNVBZQ.js → claim-FZZZCAY6.js} +10 -10
- package/dist/cli-bundle/chunks/{claim-SKHJDLW6.js → claim-XK5QBZE3.js} +10 -10
- package/dist/cli-bundle/chunks/close-JEBZXONN.js +15 -0
- package/dist/cli-bundle/chunks/{close-4RKSL5L6.js → close-QHMVWM7M.js} +8 -8
- package/dist/cli-bundle/chunks/{close-many-SXODYBDP.js → close-many-OIXJE2JZ.js} +15 -15
- package/dist/cli-bundle/chunks/{close-many-AWTPXLHJ.js → close-many-SUU5BS2C.js} +15 -15
- package/dist/cli-bundle/chunks/{comments-YYW5P7AG.js → comments-5YM62D75.js} +10 -10
- package/dist/cli-bundle/chunks/{comments-OOH64LWW.js → comments-RH3IBIRH.js} +10 -10
- package/dist/cli-bundle/chunks/{config-3445MCQQ.js → config-NCNNWF6R.js} +8 -8
- package/dist/cli-bundle/chunks/{config-LCDMKRB2.js → config-SW3U7XP2.js} +8 -8
- package/dist/cli-bundle/chunks/{context-PJCURODY.js → context-55VEOYI3.js} +13 -13
- package/dist/cli-bundle/chunks/{context-DZMIBIVP.js → context-5LB7UGKE.js} +13 -13
- package/dist/cli-bundle/chunks/{contracts-MP2P3HL5.js → contracts-JXFGBOYT.js} +8 -6
- package/dist/cli-bundle/chunks/contracts-JXFGBOYT.js.map +1 -0
- package/dist/cli-bundle/chunks/{contracts-7YDFEJB3.js → contracts-SY6PDFIK.js} +7 -5
- package/dist/cli-bundle/chunks/contracts-SY6PDFIK.js.map +7 -0
- package/dist/cli-bundle/chunks/{copy-63IQQRRS.js → copy-IEDBJOOX.js} +7 -7
- package/dist/cli-bundle/chunks/{copy-TASIH2AZ.js → copy-N3GE6FYS.js} +7 -7
- package/dist/cli-bundle/chunks/create-CLSCHGJJ.js +30 -0
- package/dist/cli-bundle/chunks/{create-TGSB5GV4.js → create-O4VONGPG.js} +14 -14
- package/dist/cli-bundle/chunks/{delete-ARILQQLB.js → delete-724EQ6OS.js} +7 -7
- package/dist/cli-bundle/chunks/{delete-ZQKBZYNK.js → delete-LPEIF7RU.js} +7 -7
- package/dist/cli-bundle/chunks/{deps-MSHQR2GY.js → deps-RSBU4SIU.js} +7 -7
- package/dist/cli-bundle/chunks/{deps-NJFJIMQ5.js → deps-T3Y6Y7RT.js} +7 -7
- package/dist/cli-bundle/chunks/{docs-XK2UVUXX.js → docs-75ZLCO3G.js} +9 -9
- package/dist/cli-bundle/chunks/{docs-SS4UKYYA.js → docs-IFS7HZPP.js} +9 -9
- package/dist/cli-bundle/chunks/{eval-JOTG2YHU.js → eval-L2KD7W3M.js} +12 -12
- package/dist/cli-bundle/chunks/{eval-FVZGX5IZ.js → eval-QGR7JCQO.js} +12 -12
- package/dist/cli-bundle/chunks/{extension-OQPS27B4.js → extension-3JYWJ5K2.js} +6 -6
- package/dist/cli-bundle/chunks/{extension-NLMS47I4.js → extension-YQF4CPIR.js} +6 -6
- package/dist/cli-bundle/chunks/{files-Y2P6LN5A.js → files-5BQWDRDT.js} +9 -9
- package/dist/cli-bundle/chunks/{files-3EVJQZ2N.js → files-EPEJMJHQ.js} +9 -9
- package/dist/cli-bundle/chunks/{focus-D5ZUPTII.js → focus-DQVJAPOE.js} +8 -8
- package/dist/cli-bundle/chunks/{focus-ZPIFTY4R.js → focus-RWGKD76E.js} +8 -8
- package/dist/cli-bundle/chunks/{gc-LXXDY456.js → gc-BEJMQT64.js} +3 -3
- package/dist/cli-bundle/chunks/{gc-RNOEQHSX.js → gc-JEFQDJPA.js} +3 -3
- package/dist/cli-bundle/chunks/{get-W23G7MJX.js → get-LQG6PEVG.js} +11 -11
- package/dist/cli-bundle/chunks/{get-Q3SZGQHD.js → get-WVN75H42.js} +11 -11
- package/dist/cli-bundle/chunks/{health-UDDGJLPP.js → health-JJJOY7DJ.js} +14 -14
- package/dist/cli-bundle/chunks/{health-5LHSX365.js → health-P67NZ6TT.js} +14 -14
- package/dist/cli-bundle/chunks/history-ALTM2RRP.js +20 -0
- package/dist/cli-bundle/chunks/{history-6CZVFIUJ.js → history-RUKPKNY7.js} +10 -10
- package/dist/cli-bundle/chunks/{history-compact-VWUSQH6Z.js → history-compact-NQ7VPRVT.js} +12 -12
- package/dist/cli-bundle/chunks/{history-compact-M35PDQ4G.js → history-compact-ZAOWR7GD.js} +12 -12
- package/dist/cli-bundle/chunks/history-redact-5YGLWUDH.js +21 -0
- package/dist/cli-bundle/chunks/{history-redact-AJGARHT3.js → history-redact-YY4XYVEP.js} +11 -11
- package/dist/cli-bundle/chunks/{history-repair-YUAHIPIN.js → history-repair-EHL4ODQY.js} +12 -12
- package/dist/cli-bundle/chunks/{history-repair-5RDMF7K4.js → history-repair-YSQH6SY6.js} +12 -12
- package/dist/cli-bundle/chunks/init-C4CRHW22.js +21 -0
- package/dist/cli-bundle/chunks/{init-HASX3YNJ.js → init-HBFGYS66.js} +11 -11
- package/dist/cli-bundle/chunks/{learnings-JNGUIJDK.js → learnings-J555ZFPD.js} +10 -10
- package/dist/cli-bundle/chunks/{learnings-M4KA6MQE.js → learnings-KFQO7GEZ.js} +10 -10
- package/dist/cli-bundle/chunks/{list-6FMKTIH3.js → list-C7R33MD5.js} +10 -10
- package/dist/cli-bundle/chunks/{list-5UU2W24O.js → list-DSN6UNFB.js} +10 -10
- package/dist/cli-bundle/chunks/{notes-PYCPLA5Y.js → notes-V4VNIQL4.js} +10 -10
- package/dist/cli-bundle/chunks/{notes-MODH5CBT.js → notes-VYJFN2A3.js} +10 -10
- package/dist/cli-bundle/chunks/{plan-DXRIRYRU.js → plan-DHRSVSHR.js} +14 -14
- package/dist/cli-bundle/chunks/{plan-EHQALWSC.js → plan-RBHQ5PO7.js} +14 -14
- package/dist/cli-bundle/chunks/{register-list-query-QAASVP2J.js → register-list-query-CCMHGZTF.js} +19 -19
- package/dist/cli-bundle/chunks/{register-list-query-WE54YJMH.js → register-list-query-OM3E2KMY.js} +19 -19
- package/dist/cli-bundle/chunks/{register-mutation-B6DZJTY2.js → register-mutation-N3CDEGZU.js} +33 -33
- package/dist/cli-bundle/chunks/{register-mutation-CPV4C2KR.js → register-mutation-UXTTWL6N.js} +33 -33
- package/dist/cli-bundle/chunks/{register-operations-RC4C3423.js → register-operations-R2FLOCRI.js} +32 -32
- package/dist/cli-bundle/chunks/{register-operations-AT3BVVX2.js → register-operations-UDIFMQKD.js} +32 -32
- package/dist/cli-bundle/chunks/{register-setup-JSMJEFCJ.js → register-setup-G5LTSFYK.js} +24 -20
- package/dist/cli-bundle/chunks/register-setup-G5LTSFYK.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-setup-HXEHMDHE.js → register-setup-TWHKICM2.js} +23 -19
- package/dist/cli-bundle/chunks/register-setup-TWHKICM2.js.map +7 -0
- package/dist/cli-bundle/chunks/{restore-FNBV4GWE.js → restore-LL2WLEDG.js} +11 -11
- package/dist/cli-bundle/chunks/restore-LQHXBAY5.js +19 -0
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-ECL6GBMZ.js → scheduling-shortcuts-255GI3BU.js} +14 -14
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-JRIUREEU.js → scheduling-shortcuts-M4H2ZI64.js} +14 -14
- package/dist/cli-bundle/chunks/{schema-74YENAJL.js → schema-C6QA367T.js} +9 -9
- package/dist/cli-bundle/chunks/{schema-TCW3I7QR.js → schema-QO5I4FBL.js} +9 -9
- package/dist/cli-bundle/chunks/{search-7USZ6XZA.js → search-2EI6EAXH.js} +12 -12
- package/dist/cli-bundle/chunks/{search-GNAUE65M.js → search-QBFBLQRO.js} +12 -12
- package/dist/cli-bundle/chunks/{stats-CVHASAEU.js → stats-TCW2SZQG.js} +8 -8
- package/dist/cli-bundle/chunks/{stats-DQMKJMFT.js → stats-TKC6CAKB.js} +8 -8
- package/dist/cli-bundle/chunks/{telemetry-PQTL5YS2.js → telemetry-BT2VSWU2.js} +4 -4
- package/dist/cli-bundle/chunks/{telemetry-7P5EUWCS.js → telemetry-LQ6FRTUT.js} +4 -4
- package/dist/cli-bundle/chunks/{test-FDQZQNZ4.js → test-NV2DRPUS.js} +16 -16
- package/dist/cli-bundle/chunks/test-WA6RZGM2.js +36 -0
- package/dist/cli-bundle/chunks/{test-all-PIPPS4S5.js → test-all-DZ76VTPQ.js} +16 -16
- package/dist/cli-bundle/chunks/{test-all-WQIAZVA6.js → test-all-REW67LXT.js} +16 -16
- package/dist/cli-bundle/chunks/{test-runs-JS6DNCCI.js → test-runs-FQ5WNQLP.js} +5 -5
- package/dist/cli-bundle/chunks/{test-runs-NZD2QGL5.js → test-runs-PX73DMMI.js} +5 -5
- package/dist/cli-bundle/chunks/update-BSKMQOYH.js +28 -0
- package/dist/cli-bundle/chunks/update-FIGYNQ2I.js +24 -0
- package/dist/cli-bundle/chunks/{update-many-B3TH5TDS.js → update-many-2ILP6E4Y.js} +23 -23
- package/dist/cli-bundle/chunks/{update-many-6NTZ5J5D.js → update-many-Q5ZEI64S.js} +23 -23
- package/dist/cli-bundle/chunks/{upgrade-76IKZ6EZ.js → upgrade-DHL74PQH.js} +6 -6
- package/dist/cli-bundle/chunks/{upgrade-4C7VE7MS.js → upgrade-FOZKQTQF.js} +6 -6
- package/dist/cli-bundle/chunks/{validate-BPM6Z3OT.js → validate-54SYJ7QW.js} +21 -21
- package/dist/cli-bundle/chunks/{validate-AQU7OCL3.js → validate-HYZNIB6W.js} +21 -21
- package/dist/cli-bundle/main.js +22 -18
- package/dist/cli-bundle/main.js.map +2 -2
- package/dist/core/extensions/activation-summary.d.ts +109 -0
- package/dist/core/extensions/activation-summary.js +60 -0
- package/dist/core/extensions/activation-summary.js.map +1 -0
- package/dist/core/extensions/capability-usage.d.ts +10 -0
- package/dist/core/extensions/capability-usage.js +12 -3
- package/dist/core/extensions/capability-usage.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +1 -2
- package/dist/core/extensions/loader.js +40 -103
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/version-compat.d.ts +107 -0
- package/dist/core/extensions/version-compat.js +130 -0
- package/dist/core/extensions/version-compat.js.map +1 -0
- package/dist/core/telemetry/runtime.js +5 -2
- package/dist/core/telemetry/runtime.js.map +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.js +4 -2
- package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts.d.ts +1 -0
- package/dist/sdk/cli-contracts.js +10 -2
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/compose.d.ts +636 -0
- package/dist/sdk/compose.js +841 -0
- package/dist/sdk/compose.js.map +1 -0
- package/dist/sdk/define.d.ts +195 -0
- package/dist/sdk/define.js +204 -0
- package/dist/sdk/define.js.map +1 -0
- package/dist/sdk/index.d.ts +4 -27
- package/dist/sdk/index.js +5 -12
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/testing.d.ts +221 -2
- package/dist/sdk/testing.js +276 -2
- package/dist/sdk/testing.js.map +1 -1
- package/docs/COMMANDS.md +1 -0
- package/docs/EXTENSIONS.md +18 -14
- package/docs/SDK.md +445 -16
- package/package.json +1 -1
- package/dist/cli-bundle/chunks/activity-NEOI45NX.js +0 -18
- package/dist/cli-bundle/chunks/chunk-3GL6LTUL.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-4YJA4LGU.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-7GCCDXXN.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-7MPTFYT3.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-D35LTIFR.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-KL5ELX2X.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-RZZMSY4P.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-TRUFOER3.js.map +0 -7
- package/dist/cli-bundle/chunks/close-Z6AI736U.js +0 -15
- package/dist/cli-bundle/chunks/contracts-7YDFEJB3.js.map +0 -7
- package/dist/cli-bundle/chunks/contracts-MP2P3HL5.js.map +0 -1
- package/dist/cli-bundle/chunks/create-3BV2VA3Q.js +0 -30
- package/dist/cli-bundle/chunks/history-YRQUD4YM.js +0 -20
- package/dist/cli-bundle/chunks/history-redact-27OEOZRZ.js +0 -21
- package/dist/cli-bundle/chunks/init-DWAKYRXI.js +0 -21
- package/dist/cli-bundle/chunks/register-setup-HXEHMDHE.js.map +0 -7
- package/dist/cli-bundle/chunks/register-setup-JSMJEFCJ.js.map +0 -1
- package/dist/cli-bundle/chunks/restore-XY4YE2OV.js +0 -19
- package/dist/cli-bundle/chunks/test-COWPCGBE.js +0 -36
- package/dist/cli-bundle/chunks/update-7IYQHX4Q.js +0 -24
- package/dist/cli-bundle/chunks/update-IJKDRBIX.js +0 -28
- /package/dist/cli-bundle/chunks/{activity-NEOI45NX.js.map → activity-54TXGJ2T.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{activity-DXS2XMQU.js.map → activity-N7RVTLBQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{aggregate-IHM4KMQ3.js.map → aggregate-63NWNIBR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{aggregate-NMYDVQF7.js.map → aggregate-YHCYX2EV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-3HY5G7ET.js.map → append-PUKREFV5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-K54MDQYC.js.map → append-VLQQDHMJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DU64SZUQ.js.map → chunk-2WCYE3IF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NKZOJPXK.js.map → chunk-3BKH2CL3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7MALIV5H.js.map → chunk-4XDGYFHL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VB54F347.js.map → chunk-5BBEWX6C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DHBPJ7VG.js.map → chunk-5S4ZGDB2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UKK2VTTH.js.map → chunk-6EBNFQOR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5SESR24H.js.map → chunk-6EL7SW5C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JLSC5NPC.js.map → chunk-6W3Y65PL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HYQV75IB.js.map → chunk-A66VYUOV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-I367IDZP.js.map → chunk-ABYCA5VX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-47HTJ6BU.js.map → chunk-AEACLRVH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-MD7XKVWI.js.map → chunk-ALKFCIIB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-B2KR24R4.js.map → chunk-ALQKV6U7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NIWY4V4Z.js.map → chunk-AYPQUFCX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AJXYOYJV.js.map → chunk-B74BP6IS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-THKDPOS5.js.map → chunk-BFFO3AIB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CR7KFPAQ.js.map → chunk-C4C3EJCJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-J2TSPY5L.js.map → chunk-CG3KP6I5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CWPBGUC7.js.map → chunk-CZIFFMZI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-75VEYQJS.js.map → chunk-DTABLLVE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TIKJAXQW.js.map → chunk-EOGBMLCE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YATDFWYK.js.map → chunk-EWRSXOIZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RPRFBXND.js.map → chunk-F32L4HR6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NVUATMTC.js.map → chunk-F4BNR2IN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-Y4BZEND6.js.map → chunk-FBLT6WGK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PCH2JTEO.js.map → chunk-FMWW2JDU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WQDX7DVG.js.map → chunk-GDUMGZK3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FK6MV5F5.js.map → chunk-HBAEFWX3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6UPTNMVW.js.map → chunk-HC2S36NB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XKNF3VRJ.js.map → chunk-HZF5RLKX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4JXWVHMN.js.map → chunk-I6QMJ2XT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-44O4JIN6.js.map → chunk-IAP5KYBQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-A7E4ZXG2.js.map → chunk-IOT6WRL5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KRJJPDUO.js.map → chunk-IXAZI443.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DMT4ODVN.js.map → chunk-J3NMWFIN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7PBGTIN3.js.map → chunk-J7I4C5ZB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CLLVBO3I.js.map → chunk-JPJDP4VU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PJS2J7Z4.js.map → chunk-JV27C7OZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-K25UDYJ4.js.map → chunk-KIEAK7YE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GGAXE22C.js.map → chunk-KJZOSF7J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GXBSFKSX.js.map → chunk-KKX4Z2SE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-C5SWTISA.js.map → chunk-LNEDHJNQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YRLLL5TY.js.map → chunk-LU36E6GU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-I6XE47J2.js.map → chunk-M6TUBOGW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YJICYNAV.js.map → chunk-MWMHZOZZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SFKQAVZA.js.map → chunk-N5B6WZC5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WBSYW3NT.js.map → chunk-NVXGVEFD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GNDHOR64.js.map → chunk-OHDQNKJB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2LEYMXI6.js.map → chunk-OQ2E64FH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-25XZN3JD.js.map → chunk-PEL2NLQE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-H6FNDCDI.js.map → chunk-PRVTGX64.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TZQKEBKF.js.map → chunk-QOUOMPHO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-77VKGH4L.js.map → chunk-RAWA3Y7O.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-Y335KFHD.js.map → chunk-RRP6D345.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4SDKF5BG.js.map → chunk-SKC4UTRP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JY25IOEZ.js.map → chunk-SUREE24M.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-A25LOPRG.js.map → chunk-TIM4OD74.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KK4TQ3ZP.js.map → chunk-TKPP4GOO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6FQHNHQQ.js.map → chunk-TSI32UEL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TJABI6PR.js.map → chunk-UACWNBL2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EVPVCE4R.js.map → chunk-V4UYNSEM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QQWEROGS.js.map → chunk-VFJYVXHL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YQSWTVZF.js.map → chunk-WB5BYQMF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-MNGAQB2E.js.map → chunk-XVYKWZNL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-V4SM4UAL.js.map → chunk-XXKV4UWE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GU7YHKYP.js.map → chunk-YV2OSAMS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-P7ZU73BO.js.map → chunk-ZLWRPBOW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3VLPDG3J.js.map → chunk-ZV7IQ23N.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-MPXNVBZQ.js.map → claim-FZZZCAY6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-SKHJDLW6.js.map → claim-XK5QBZE3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-Z6AI736U.js.map → close-JEBZXONN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-4RKSL5L6.js.map → close-QHMVWM7M.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-SXODYBDP.js.map → close-many-OIXJE2JZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-AWTPXLHJ.js.map → close-many-SUU5BS2C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-YYW5P7AG.js.map → comments-5YM62D75.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-OOH64LWW.js.map → comments-RH3IBIRH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{config-3445MCQQ.js.map → config-NCNNWF6R.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{config-LCDMKRB2.js.map → config-SW3U7XP2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-PJCURODY.js.map → context-55VEOYI3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-DZMIBIVP.js.map → context-5LB7UGKE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-63IQQRRS.js.map → copy-IEDBJOOX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-TASIH2AZ.js.map → copy-N3GE6FYS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-3BV2VA3Q.js.map → create-CLSCHGJJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-TGSB5GV4.js.map → create-O4VONGPG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-ARILQQLB.js.map → delete-724EQ6OS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-ZQKBZYNK.js.map → delete-LPEIF7RU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-MSHQR2GY.js.map → deps-RSBU4SIU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-NJFJIMQ5.js.map → deps-T3Y6Y7RT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-XK2UVUXX.js.map → docs-75ZLCO3G.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-SS4UKYYA.js.map → docs-IFS7HZPP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-JOTG2YHU.js.map → eval-L2KD7W3M.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-FVZGX5IZ.js.map → eval-QGR7JCQO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-OQPS27B4.js.map → extension-3JYWJ5K2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-NLMS47I4.js.map → extension-YQF4CPIR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-Y2P6LN5A.js.map → files-5BQWDRDT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-3EVJQZ2N.js.map → files-EPEJMJHQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-D5ZUPTII.js.map → focus-DQVJAPOE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-ZPIFTY4R.js.map → focus-RWGKD76E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-LXXDY456.js.map → gc-BEJMQT64.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-RNOEQHSX.js.map → gc-JEFQDJPA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{get-W23G7MJX.js.map → get-LQG6PEVG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{get-Q3SZGQHD.js.map → get-WVN75H42.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{health-UDDGJLPP.js.map → health-JJJOY7DJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{health-5LHSX365.js.map → health-P67NZ6TT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-YRQUD4YM.js.map → history-ALTM2RRP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-6CZVFIUJ.js.map → history-RUKPKNY7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-VWUSQH6Z.js.map → history-compact-NQ7VPRVT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-M35PDQ4G.js.map → history-compact-ZAOWR7GD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-27OEOZRZ.js.map → history-redact-5YGLWUDH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-AJGARHT3.js.map → history-redact-YY4XYVEP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-YUAHIPIN.js.map → history-repair-EHL4ODQY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-5RDMF7K4.js.map → history-repair-YSQH6SY6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-DWAKYRXI.js.map → init-C4CRHW22.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-HASX3YNJ.js.map → init-HBFGYS66.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-JNGUIJDK.js.map → learnings-J555ZFPD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-M4KA6MQE.js.map → learnings-KFQO7GEZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-6FMKTIH3.js.map → list-C7R33MD5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-5UU2W24O.js.map → list-DSN6UNFB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-PYCPLA5Y.js.map → notes-V4VNIQL4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-MODH5CBT.js.map → notes-VYJFN2A3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-DXRIRYRU.js.map → plan-DHRSVSHR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-EHQALWSC.js.map → plan-RBHQ5PO7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-QAASVP2J.js.map → register-list-query-CCMHGZTF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-WE54YJMH.js.map → register-list-query-OM3E2KMY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-B6DZJTY2.js.map → register-mutation-N3CDEGZU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-CPV4C2KR.js.map → register-mutation-UXTTWL6N.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-RC4C3423.js.map → register-operations-R2FLOCRI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-AT3BVVX2.js.map → register-operations-UDIFMQKD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-FNBV4GWE.js.map → restore-LL2WLEDG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-XY4YE2OV.js.map → restore-LQHXBAY5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-ECL6GBMZ.js.map → scheduling-shortcuts-255GI3BU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-JRIUREEU.js.map → scheduling-shortcuts-M4H2ZI64.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-74YENAJL.js.map → schema-C6QA367T.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-TCW3I7QR.js.map → schema-QO5I4FBL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-7USZ6XZA.js.map → search-2EI6EAXH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-GNAUE65M.js.map → search-QBFBLQRO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-CVHASAEU.js.map → stats-TCW2SZQG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-DQMKJMFT.js.map → stats-TKC6CAKB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{telemetry-PQTL5YS2.js.map → telemetry-BT2VSWU2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{telemetry-7P5EUWCS.js.map → telemetry-LQ6FRTUT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-FDQZQNZ4.js.map → test-NV2DRPUS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-COWPCGBE.js.map → test-WA6RZGM2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-all-PIPPS4S5.js.map → test-all-DZ76VTPQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-all-WQIAZVA6.js.map → test-all-REW67LXT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-runs-JS6DNCCI.js.map → test-runs-FQ5WNQLP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-runs-NZD2QGL5.js.map → test-runs-PX73DMMI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-IJKDRBIX.js.map → update-BSKMQOYH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-7IYQHX4Q.js.map → update-FIGYNQ2I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-B3TH5TDS.js.map → update-many-2ILP6E4Y.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-6NTZ5J5D.js.map → update-many-Q5ZEI64S.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{upgrade-76IKZ6EZ.js.map → upgrade-DHL74PQH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{upgrade-4C7VE7MS.js.map → upgrade-FOZKQTQF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{validate-BPM6Z3OT.js.map → validate-54SYJ7QW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{validate-AQU7OCL3.js.map → validate-HYZNIB6W.js.map} +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module cli/commands/extension/describe
|
|
3
|
+
*
|
|
4
|
+
* Builds the `pm extension describe` / `pm package describe` payload: a flat,
|
|
5
|
+
* by-name map of every surface each loaded extension registered.
|
|
6
|
+
*
|
|
7
|
+
* The SDK already ships {@link describeExtensionActivation} -- the `describe`
|
|
8
|
+
* (enumerate-all) verb that complements the `assert*` (verify-one) and `run*`
|
|
9
|
+
* (invoke-one) testing helpers -- but until now it was reachable only from a test
|
|
10
|
+
* that hand-built an {@link ExtensionActivationResult}. This module is the thin
|
|
11
|
+
* orchestration that lets an agent at the CLI (or over MCP) ask "what does this
|
|
12
|
+
* installed extension add to my context?" in one call, instead of stitching
|
|
13
|
+
* together `doctor` (errors), `manage` (update metadata), and a manifest read.
|
|
14
|
+
*
|
|
15
|
+
* It is intentionally pure: the caller performs the load+activate cycle (exactly
|
|
16
|
+
* as `explore`/`doctor` already do) and hands the results here, so the same
|
|
17
|
+
* builder is trivially unit-testable against synthetic activations.
|
|
18
|
+
*/
|
|
19
|
+
import { type ExtensionActivationSummary } from "../../../core/extensions/activation-summary.js";
|
|
20
|
+
import type { ExtensionActivationResult, ExtensionLayer, ExtensionLoadResult } from "../../../core/extensions/loader.js";
|
|
21
|
+
/**
|
|
22
|
+
* Runtime state of a described extension. `ok` loaded and activated cleanly,
|
|
23
|
+
* `failed` loaded but threw during `activate`, and `not_loaded` failed to import
|
|
24
|
+
* at all -- the latter two register nothing, so their `surfaces` are empty and
|
|
25
|
+
* the status explains why (rather than implying the extension contributes
|
|
26
|
+
* nothing).
|
|
27
|
+
*/
|
|
28
|
+
export type ExtensionDescribeActivationStatus = "ok" | "failed" | "not_loaded";
|
|
29
|
+
/**
|
|
30
|
+
* One extension's contribution to the workspace: its identity plus the
|
|
31
|
+
* {@link ExtensionActivationSummary} of every surface it registered.
|
|
32
|
+
*
|
|
33
|
+
* `surfaces` is matched by extension *name* (mirroring
|
|
34
|
+
* {@link describeExtensionActivation}'s name filter), so when the same name is
|
|
35
|
+
* loaded in both the project and global layers each entry reflects that name's
|
|
36
|
+
* combined surfaces -- the `layer`/`version` fields still distinguish the
|
|
37
|
+
* physical entries.
|
|
38
|
+
*/
|
|
39
|
+
export interface ExtensionSurfaceDescription {
|
|
40
|
+
name: string;
|
|
41
|
+
layer: ExtensionLayer;
|
|
42
|
+
version: string;
|
|
43
|
+
activation_status: ExtensionDescribeActivationStatus;
|
|
44
|
+
surfaces: ExtensionActivationSummary;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Result of {@link buildExtensionDescribeResult}: the per-extension surface maps
|
|
48
|
+
* plus a deduplicated `union` across the described set. `target` echoes the
|
|
49
|
+
* requested name filter (or `null` for the whole workspace) and `total` counts
|
|
50
|
+
* the described entries so callers need not re-measure `extensions`.
|
|
51
|
+
*/
|
|
52
|
+
export interface ExtensionDescribeResult {
|
|
53
|
+
target: string | null;
|
|
54
|
+
total: number;
|
|
55
|
+
extensions: ExtensionSurfaceDescription[];
|
|
56
|
+
union: ExtensionActivationSummary;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Summarize, by name, every registration surface the loaded extensions exercised.
|
|
60
|
+
*
|
|
61
|
+
* Walks `loadResult.loaded` (annotating each with `failed` when its layer+name is
|
|
62
|
+
* in `activationResult.failed`) and `loadResult.failed` (as `not_loaded`), sorts
|
|
63
|
+
* the entries by name then layer for deterministic output, and attaches each
|
|
64
|
+
* extension's {@link describeExtensionActivation} summary. When `target` is
|
|
65
|
+
* provided only the case-insensitively matching extensions are described and the
|
|
66
|
+
* `union` is scoped to that name; otherwise every loaded extension contributes.
|
|
67
|
+
* An unmatched `target` yields an empty `extensions` array -- the caller decides
|
|
68
|
+
* whether that is a not-found error.
|
|
69
|
+
*/
|
|
70
|
+
export declare function buildExtensionDescribeResult(target: string | undefined, loadResult: ExtensionLoadResult, activationResult: ExtensionActivationResult): ExtensionDescribeResult;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module cli/commands/extension/describe
|
|
3
|
+
*
|
|
4
|
+
* Builds the `pm extension describe` / `pm package describe` payload: a flat,
|
|
5
|
+
* by-name map of every surface each loaded extension registered.
|
|
6
|
+
*
|
|
7
|
+
* The SDK already ships {@link describeExtensionActivation} -- the `describe`
|
|
8
|
+
* (enumerate-all) verb that complements the `assert*` (verify-one) and `run*`
|
|
9
|
+
* (invoke-one) testing helpers -- but until now it was reachable only from a test
|
|
10
|
+
* that hand-built an {@link ExtensionActivationResult}. This module is the thin
|
|
11
|
+
* orchestration that lets an agent at the CLI (or over MCP) ask "what does this
|
|
12
|
+
* installed extension add to my context?" in one call, instead of stitching
|
|
13
|
+
* together `doctor` (errors), `manage` (update metadata), and a manifest read.
|
|
14
|
+
*
|
|
15
|
+
* It is intentionally pure: the caller performs the load+activate cycle (exactly
|
|
16
|
+
* as `explore`/`doctor` already do) and hands the results here, so the same
|
|
17
|
+
* builder is trivially unit-testable against synthetic activations.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
!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]="7a92163a-99b2-5969-acc2-e2b6b0336c2e")}catch(e){}}();
|
|
21
|
+
import { describeExtensionActivation } from "../../../core/extensions/activation-summary.js";
|
|
22
|
+
import { normalizeExtensionNameForMatch } from "./shared.js";
|
|
23
|
+
/**
|
|
24
|
+
* Compose a collision-free identity key for an extension from its layer and
|
|
25
|
+
* normalized name. The two parts are joined with a colon; the layer prefix is
|
|
26
|
+
* always a colon-free enum value, so distinct (layer, name) pairs never collide
|
|
27
|
+
* even when a name itself contains a colon.
|
|
28
|
+
*/
|
|
29
|
+
function layerNameKey(layer, name) {
|
|
30
|
+
return `${layer}:${normalizeExtensionNameForMatch(name)}`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Summarize, by name, every registration surface the loaded extensions exercised.
|
|
34
|
+
*
|
|
35
|
+
* Walks `loadResult.loaded` (annotating each with `failed` when its layer+name is
|
|
36
|
+
* in `activationResult.failed`) and `loadResult.failed` (as `not_loaded`), sorts
|
|
37
|
+
* the entries by name then layer for deterministic output, and attaches each
|
|
38
|
+
* extension's {@link describeExtensionActivation} summary. When `target` is
|
|
39
|
+
* provided only the case-insensitively matching extensions are described and the
|
|
40
|
+
* `union` is scoped to that name; otherwise every loaded extension contributes.
|
|
41
|
+
* An unmatched `target` yields an empty `extensions` array -- the caller decides
|
|
42
|
+
* whether that is a not-found error.
|
|
43
|
+
*/
|
|
44
|
+
export function buildExtensionDescribeResult(target, loadResult, activationResult) {
|
|
45
|
+
const activationFailedKeys = new Set(activationResult.failed.map((entry) => layerNameKey(entry.layer, entry.name)));
|
|
46
|
+
const candidates = [
|
|
47
|
+
...loadResult.loaded.map((entry) => ({
|
|
48
|
+
name: entry.name,
|
|
49
|
+
layer: entry.layer,
|
|
50
|
+
version: entry.version,
|
|
51
|
+
activation_status: activationFailedKeys.has(layerNameKey(entry.layer, entry.name))
|
|
52
|
+
? "failed"
|
|
53
|
+
: "ok",
|
|
54
|
+
surfaces: describeExtensionActivation(activationResult, { extensionName: entry.name }),
|
|
55
|
+
})),
|
|
56
|
+
...loadResult.failed.map((entry) => ({
|
|
57
|
+
name: entry.name,
|
|
58
|
+
layer: entry.layer,
|
|
59
|
+
version: "unknown",
|
|
60
|
+
activation_status: "not_loaded",
|
|
61
|
+
surfaces: describeExtensionActivation(activationResult, { extensionName: entry.name }),
|
|
62
|
+
})),
|
|
63
|
+
].sort((left, right) => left.name.localeCompare(right.name) || left.layer.localeCompare(right.layer));
|
|
64
|
+
const normalizedTarget = typeof target === "string" ? normalizeExtensionNameForMatch(target) : null;
|
|
65
|
+
const extensions = normalizedTarget === null
|
|
66
|
+
? candidates
|
|
67
|
+
: candidates.filter((entry) => normalizeExtensionNameForMatch(entry.name) === normalizedTarget);
|
|
68
|
+
return {
|
|
69
|
+
target: typeof target === "string" ? target.trim() : null,
|
|
70
|
+
total: extensions.length,
|
|
71
|
+
extensions,
|
|
72
|
+
union: describeExtensionActivation(activationResult, normalizedTarget === null ? {} : { extensionName: target }),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=describe.js.map
|
|
76
|
+
//# debugId=7a92163a-99b2-5969-acc2-e2b6b0336c2e
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.js","sources":["cli/commands/extension/describe.ts"],"sourceRoot":"/","sourcesContent":["/**\n * @module cli/commands/extension/describe\n *\n * Builds the `pm extension describe` / `pm package describe` payload: a flat,\n * by-name map of every surface each loaded extension registered.\n *\n * The SDK already ships {@link describeExtensionActivation} -- the `describe`\n * (enumerate-all) verb that complements the `assert*` (verify-one) and `run*`\n * (invoke-one) testing helpers -- but until now it was reachable only from a test\n * that hand-built an {@link ExtensionActivationResult}. This module is the thin\n * orchestration that lets an agent at the CLI (or over MCP) ask \"what does this\n * installed extension add to my context?\" in one call, instead of stitching\n * together `doctor` (errors), `manage` (update metadata), and a manifest read.\n *\n * It is intentionally pure: the caller performs the load+activate cycle (exactly\n * as `explore`/`doctor` already do) and hands the results here, so the same\n * builder is trivially unit-testable against synthetic activations.\n */\nimport { describeExtensionActivation, type ExtensionActivationSummary } from \"../../../core/extensions/activation-summary.js\";\nimport type { ExtensionActivationResult, ExtensionLayer, ExtensionLoadResult } from \"../../../core/extensions/loader.js\";\nimport { normalizeExtensionNameForMatch } from \"./shared.js\";\n\n/**\n * Runtime state of a described extension. `ok` loaded and activated cleanly,\n * `failed` loaded but threw during `activate`, and `not_loaded` failed to import\n * at all -- the latter two register nothing, so their `surfaces` are empty and\n * the status explains why (rather than implying the extension contributes\n * nothing).\n */\nexport type ExtensionDescribeActivationStatus = \"ok\" | \"failed\" | \"not_loaded\";\n\n/**\n * One extension's contribution to the workspace: its identity plus the\n * {@link ExtensionActivationSummary} of every surface it registered.\n *\n * `surfaces` is matched by extension *name* (mirroring\n * {@link describeExtensionActivation}'s name filter), so when the same name is\n * loaded in both the project and global layers each entry reflects that name's\n * combined surfaces -- the `layer`/`version` fields still distinguish the\n * physical entries.\n */\nexport interface ExtensionSurfaceDescription {\n name: string;\n layer: ExtensionLayer;\n version: string;\n activation_status: ExtensionDescribeActivationStatus;\n surfaces: ExtensionActivationSummary;\n}\n\n/**\n * Result of {@link buildExtensionDescribeResult}: the per-extension surface maps\n * plus a deduplicated `union` across the described set. `target` echoes the\n * requested name filter (or `null` for the whole workspace) and `total` counts\n * the described entries so callers need not re-measure `extensions`.\n */\nexport interface ExtensionDescribeResult {\n target: string | null;\n total: number;\n extensions: ExtensionSurfaceDescription[];\n union: ExtensionActivationSummary;\n}\n\n/**\n * Compose a collision-free identity key for an extension from its layer and\n * normalized name. The two parts are joined with a colon; the layer prefix is\n * always a colon-free enum value, so distinct (layer, name) pairs never collide\n * even when a name itself contains a colon.\n */\nfunction layerNameKey(layer: ExtensionLayer, name: string): string {\n return `${layer}:${normalizeExtensionNameForMatch(name)}`;\n}\n\n/**\n * Summarize, by name, every registration surface the loaded extensions exercised.\n *\n * Walks `loadResult.loaded` (annotating each with `failed` when its layer+name is\n * in `activationResult.failed`) and `loadResult.failed` (as `not_loaded`), sorts\n * the entries by name then layer for deterministic output, and attaches each\n * extension's {@link describeExtensionActivation} summary. When `target` is\n * provided only the case-insensitively matching extensions are described and the\n * `union` is scoped to that name; otherwise every loaded extension contributes.\n * An unmatched `target` yields an empty `extensions` array -- the caller decides\n * whether that is a not-found error.\n */\nexport function buildExtensionDescribeResult(\n target: string | undefined,\n loadResult: ExtensionLoadResult,\n activationResult: ExtensionActivationResult,\n): ExtensionDescribeResult {\n const activationFailedKeys = new Set(activationResult.failed.map((entry) => layerNameKey(entry.layer, entry.name)));\n const candidates: ExtensionSurfaceDescription[] = [\n ...loadResult.loaded.map((entry) => ({\n name: entry.name,\n layer: entry.layer,\n version: entry.version,\n activation_status: activationFailedKeys.has(layerNameKey(entry.layer, entry.name))\n ? (\"failed\" as const)\n : (\"ok\" as const),\n surfaces: describeExtensionActivation(activationResult, { extensionName: entry.name }),\n })),\n ...loadResult.failed.map((entry) => ({\n name: entry.name,\n layer: entry.layer,\n version: \"unknown\",\n activation_status: \"not_loaded\" as const,\n surfaces: describeExtensionActivation(activationResult, { extensionName: entry.name }),\n })),\n ].sort((left, right) => left.name.localeCompare(right.name) || left.layer.localeCompare(right.layer));\n\n const normalizedTarget = typeof target === \"string\" ? normalizeExtensionNameForMatch(target) : null;\n const extensions =\n normalizedTarget === null\n ? candidates\n : candidates.filter((entry) => normalizeExtensionNameForMatch(entry.name) === normalizedTarget);\n\n return {\n target: typeof target === \"string\" ? target.trim() : null,\n total: extensions.length,\n extensions,\n union: describeExtensionActivation(activationResult, normalizedTarget === null ? {} : { extensionName: target }),\n };\n}\n"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AACH,OAAO,EAAE,2BAA2B,EAAmC,MAAM,gDAAgD,CAAC;AAE9H,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AA0C7D;;;;;GAKG;AACH,SAAS,YAAY,CAAC,KAAqB,EAAE,IAAY;IACvD,OAAO,GAAG,KAAK,IAAI,8BAA8B,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,4BAA4B,CAC1C,MAA0B,EAC1B,UAA+B,EAC/B,gBAA2C;IAE3C,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpH,MAAM,UAAU,GAAkC;QAChD,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChF,CAAC,CAAE,QAAkB;gBACrB,CAAC,CAAE,IAAc;YACnB,QAAQ,EAAE,2BAA2B,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;SACvF,CAAC,CAAC;QACH,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,SAAS;YAClB,iBAAiB,EAAE,YAAqB;YACxC,QAAQ,EAAE,2BAA2B,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;SACvF,CAAC,CAAC;KACJ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtG,MAAM,gBAAgB,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpG,MAAM,UAAU,GACd,gBAAgB,KAAK,IAAI;QACvB,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,8BAA8B,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,CAAC;IAEpG,OAAO;QACL,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;QACzD,KAAK,EAAE,UAAU,CAAC,MAAM;QACxB,UAAU;QACV,KAAK,EAAE,2BAA2B,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;KACjH,CAAC;AACJ,CAAC","debugId":"7a92163a-99b2-5969-acc2-e2b6b0336c2e"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Implements extension package-management support for Scaffold.
|
|
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]="9eecdd82-fe71-5803-9186-a33244c4722d")}catch(e){}}();
|
|
8
8
|
import fs from "node:fs/promises";
|
|
9
9
|
import path from "node:path";
|
|
10
10
|
import { pathExists } from "../../../core/fs/fs-utils.js";
|
|
@@ -25,6 +25,40 @@ const SCAFFOLD_DECLARED_PERMISSIONS = {
|
|
|
25
25
|
env_write: false,
|
|
26
26
|
process_spawn: false,
|
|
27
27
|
};
|
|
28
|
+
// TypeScript dev-dependency floor for scaffolded packages, matching the CLI's own
|
|
29
|
+
// toolchain so generated packages compile against the same compiler generation.
|
|
30
|
+
const SCAFFOLD_TYPESCRIPT_VERSION = "^6.0.0";
|
|
31
|
+
// `@types/node` floor for scaffolded packages: the colocated `index.test.ts`
|
|
32
|
+
// imports `node:test`/`node:assert`, which need Node's ambient type definitions
|
|
33
|
+
// to compile. Pinned to the engines floor (Node >=20), matching the CLI itself.
|
|
34
|
+
const SCAFFOLD_TYPES_NODE_VERSION = "^20.0.0";
|
|
35
|
+
// Strict NodeNext tsconfig emitted into every scaffold (ADR pm-2c28: extensions
|
|
36
|
+
// are authored fully in TypeScript). It compiles `index.ts` (and the colocated
|
|
37
|
+
// `index.test.ts`) in place to the `./index.js` entry the manifest loads, so the
|
|
38
|
+
// authored source is type-checked against the SDK contracts while the loader keeps
|
|
39
|
+
// importing plain compiled JavaScript. NodeNext resolution matches the explicit
|
|
40
|
+
// `.js` import specifiers the emitted ESM uses. No `outDir` is set on purpose:
|
|
41
|
+
// tsc auto-excludes its `outDir`, and an in-package `outDir` would exclude the
|
|
42
|
+
// whole package root, leaving the `*.ts` inputs unmatched (TS18003). Emitting
|
|
43
|
+
// beside the source mirrors the first-party `packages/pm-*` layout.
|
|
44
|
+
const SCAFFOLD_TSCONFIG = {
|
|
45
|
+
compilerOptions: {
|
|
46
|
+
target: "ES2022",
|
|
47
|
+
module: "NodeNext",
|
|
48
|
+
moduleResolution: "NodeNext",
|
|
49
|
+
strict: true,
|
|
50
|
+
esModuleInterop: true,
|
|
51
|
+
skipLibCheck: true,
|
|
52
|
+
declaration: false,
|
|
53
|
+
// `node:test`/`node:assert` in the colocated test (and Node globals) resolve
|
|
54
|
+
// from `@types/node`; name it explicitly so it is loaded regardless of how the
|
|
55
|
+
// package manager lays out `node_modules/@types`.
|
|
56
|
+
types: ["node"],
|
|
57
|
+
},
|
|
58
|
+
// Recursive so a package that grows into subdirectory `*.ts` modules still
|
|
59
|
+
// type-checks and compiles them; tsc excludes `node_modules` by default.
|
|
60
|
+
include: ["**/*.ts"],
|
|
61
|
+
};
|
|
28
62
|
/**
|
|
29
63
|
* Capability shapes the package/extension scaffolder can target via the
|
|
30
64
|
* `--capability` selector. `commands` emits the default command-only starter;
|
|
@@ -47,23 +81,24 @@ const SAMPLE_TEST_CAPABILITIES_LITERAL = {
|
|
|
47
81
|
importers: '["commands", "schema", "importers"]',
|
|
48
82
|
};
|
|
49
83
|
const ENTRYPOINT_BULLETS = {
|
|
50
|
-
commands: "- `index.
|
|
51
|
-
hooks: "- `index.
|
|
52
|
-
search: "- `index.
|
|
53
|
-
importers: "- `index.
|
|
84
|
+
commands: "- `index.ts`: starter command registration plus a `deactivate` teardown stub (compiled to `index.js`).",
|
|
85
|
+
hooks: "- `index.ts`: starter command registration, an `after_command` lifecycle hook, and a `deactivate` teardown stub (compiled to `index.js`).",
|
|
86
|
+
search: "- `index.ts`: starter command registration, a search provider, a vector-store adapter, and a `deactivate` teardown stub (compiled to `index.js`).",
|
|
87
|
+
importers: "- `index.ts`: starter command registration, importer/exporter command registrations, and a `deactivate` teardown stub (compiled to `index.js`).",
|
|
54
88
|
};
|
|
55
89
|
const SAMPLE_TEST_BULLETS = {
|
|
56
|
-
commands: "- `index.test.
|
|
57
|
-
hooks: "- `index.test.
|
|
58
|
-
search: "- `index.test.
|
|
59
|
-
importers: "- `index.test.
|
|
90
|
+
commands: "- `index.test.ts`: sample `node:test` suite covering activation, command invocation, and teardown via the SDK testing helpers.",
|
|
91
|
+
hooks: "- `index.test.ts`: sample `node:test` suite covering activation, command invocation, the after_command hook, and teardown via the SDK testing helpers.",
|
|
92
|
+
search: "- `index.test.ts`: sample `node:test` suite covering activation, command invocation, search provider/vector adapter invocation, and teardown via the SDK testing helpers.",
|
|
93
|
+
importers: "- `index.test.ts`: sample `node:test` suite covering activation, command invocation, importer/exporter invocation, and teardown via the SDK testing helpers.",
|
|
60
94
|
};
|
|
95
|
+
const TSCONFIG_BULLET = "- `tsconfig.json`: strict TypeScript config that compiles `index.ts` to the `./index.js` entry.";
|
|
61
96
|
const PACKAGE_CAPABILITY_README_SECTIONS = {
|
|
62
97
|
commands: [],
|
|
63
98
|
hooks: [
|
|
64
99
|
"",
|
|
65
100
|
"## Lifecycle Hook",
|
|
66
|
-
"`index.
|
|
101
|
+
"`index.ts` registers an `after_command` hook via `api.hooks.afterCommand`.",
|
|
67
102
|
"pm fires it once a command finishes, passing the command outcome and the",
|
|
68
103
|
"items it mutated (`context.affected`). React there to keep external context",
|
|
69
104
|
"in sync - sync records, emit telemetry, or refresh derived state. The",
|
|
@@ -73,7 +108,7 @@ const PACKAGE_CAPABILITY_README_SECTIONS = {
|
|
|
73
108
|
search: [
|
|
74
109
|
"",
|
|
75
110
|
"## Search Provider",
|
|
76
|
-
"`index.
|
|
111
|
+
"`index.ts` registers a deterministic in-memory search provider and",
|
|
77
112
|
"vector-store adapter through `api.registerSearchProvider` and",
|
|
78
113
|
"`api.registerVectorStoreAdapter`. Replace the sample scoring,",
|
|
79
114
|
"embedding, and storage behavior with your project-specific retrieval",
|
|
@@ -83,7 +118,7 @@ const PACKAGE_CAPABILITY_README_SECTIONS = {
|
|
|
83
118
|
importers: [
|
|
84
119
|
"",
|
|
85
120
|
"## Importer and Exporter",
|
|
86
|
-
"`index.
|
|
121
|
+
"`index.ts` registers paired project-context import/export commands through",
|
|
87
122
|
"`api.registerImporter` and `api.registerExporter`. Replace the starter",
|
|
88
123
|
"payloads with your domain adapter: GitHub issues, CSV rows, documents,",
|
|
89
124
|
"tickets, or another project-management source of truth. The `importers`",
|
|
@@ -96,7 +131,7 @@ const EXTENSION_CAPABILITY_README_SECTIONS = {
|
|
|
96
131
|
hooks: [
|
|
97
132
|
"",
|
|
98
133
|
"## Lifecycle Hook",
|
|
99
|
-
"`index.
|
|
134
|
+
"`index.ts` registers an `after_command` hook via `api.hooks.afterCommand`.",
|
|
100
135
|
"pm fires it once a command finishes, passing the command outcome and the",
|
|
101
136
|
"items it mutated (`context.affected`). React there to keep external context",
|
|
102
137
|
"in sync. The `hooks` capability in `manifest.json` grants the registration;",
|
|
@@ -105,7 +140,7 @@ const EXTENSION_CAPABILITY_README_SECTIONS = {
|
|
|
105
140
|
search: [
|
|
106
141
|
"",
|
|
107
142
|
"## Search Provider",
|
|
108
|
-
"`index.
|
|
143
|
+
"`index.ts` registers a deterministic in-memory search provider and",
|
|
109
144
|
"vector-store adapter through `api.registerSearchProvider` and",
|
|
110
145
|
"`api.registerVectorStoreAdapter`. Replace the sample scoring, embedding,",
|
|
111
146
|
"and storage behavior with your project-specific retrieval logic. The",
|
|
@@ -114,7 +149,7 @@ const EXTENSION_CAPABILITY_README_SECTIONS = {
|
|
|
114
149
|
importers: [
|
|
115
150
|
"",
|
|
116
151
|
"## Importer and Exporter",
|
|
117
|
-
"`index.
|
|
152
|
+
"`index.ts` registers paired project-context import/export commands through",
|
|
118
153
|
"`api.registerImporter` and `api.registerExporter`. Replace the starter",
|
|
119
154
|
"payloads with your domain adapter. The `importers` capability grants both",
|
|
120
155
|
"registrations, and `schema` grants the example command flag metadata.",
|
|
@@ -253,8 +288,10 @@ function buildActivateBodyLines(extensionName, commandName, capability) {
|
|
|
253
288
|
];
|
|
254
289
|
}
|
|
255
290
|
/**
|
|
256
|
-
* Build the colocated `node:test` sample suite for the chosen
|
|
257
|
-
*
|
|
291
|
+
* Build the colocated `node:test` sample suite (`index.test.ts`) for the chosen
|
|
292
|
+
* capability. Authored in TypeScript and run through `npm test` (`tsc && node
|
|
293
|
+
* --test`), it imports the compiled `./index.js` entry under NodeNext resolution.
|
|
294
|
+
* Every variant covers activation, command invocation, and teardown via the SDK
|
|
258
295
|
* testing helpers; the `hooks` variant adds a test that asserts the
|
|
259
296
|
* `after_command` hook is registered and fires cleanly through the public SDK
|
|
260
297
|
* testing helper `runRegisteredHookForTest`.
|
|
@@ -327,6 +364,8 @@ function buildSampleTestSource(extensionName, commandName, capability) {
|
|
|
327
364
|
` extensionName: ${JSON.stringify(extensionName)},`,
|
|
328
365
|
" });",
|
|
329
366
|
"",
|
|
367
|
+
" // The starter provider reads only document title/id, so `settings` is a",
|
|
368
|
+
" // minimal typed stub and `documents` carry just the fields it inspects.",
|
|
330
369
|
" const query = await runRegisteredSearchProviderForTest(activation.registrations, {",
|
|
331
370
|
` provider: ${JSON.stringify(searchProviderName)},`,
|
|
332
371
|
' operation: "query",',
|
|
@@ -335,11 +374,11 @@ function buildSampleTestSource(extensionName, commandName, capability) {
|
|
|
335
374
|
' mode: "semantic",',
|
|
336
375
|
' tokens: ["sync"],',
|
|
337
376
|
" options: {},",
|
|
338
|
-
" settings: {},",
|
|
377
|
+
" settings: {} as PmSettings,",
|
|
339
378
|
" documents: [",
|
|
340
379
|
' { metadata: { id: "pm-1", title: "Sync external context" }, body: "" },',
|
|
341
380
|
' { metadata: { id: "pm-2", title: "Unrelated task" }, body: "" },',
|
|
342
|
-
" ],",
|
|
381
|
+
" ] as ItemDocument[],",
|
|
343
382
|
" },",
|
|
344
383
|
" });",
|
|
345
384
|
' assert.deepEqual(query, { hits: [{ id: "pm-1", score: 1, matched_fields: ["title"] }] });',
|
|
@@ -347,14 +386,14 @@ function buildSampleTestSource(extensionName, commandName, capability) {
|
|
|
347
386
|
" const embedding = await runRegisteredSearchProviderForTest(activation.registrations, {",
|
|
348
387
|
` provider: ${JSON.stringify(searchProviderName)},`,
|
|
349
388
|
' operation: "embed",',
|
|
350
|
-
' context: { input: "abc", settings: {}, model: "starter-model" },',
|
|
389
|
+
' context: { input: "abc", settings: {} as PmSettings, model: "starter-model" },',
|
|
351
390
|
" });",
|
|
352
391
|
" assert.deepEqual(embedding, [3]);",
|
|
353
392
|
"",
|
|
354
393
|
" const vectorHits = await runRegisteredVectorStoreAdapterForTest(activation.registrations, {",
|
|
355
394
|
` adapter: ${JSON.stringify(vectorAdapterName)},`,
|
|
356
395
|
' operation: "query",',
|
|
357
|
-
" context: { vector: [0.1, 0.2], limit: 2, settings: {} },",
|
|
396
|
+
" context: { vector: [0.1, 0.2], limit: 2, settings: {} as PmSettings },",
|
|
358
397
|
" });",
|
|
359
398
|
' assert.deepEqual(vectorHits, [{ id: "starter-vector-hit", score: 2 }]);',
|
|
360
399
|
"});",
|
|
@@ -402,6 +441,9 @@ function buildSampleTestSource(extensionName, commandName, capability) {
|
|
|
402
441
|
"import {",
|
|
403
442
|
...importNames,
|
|
404
443
|
'} from "@unbrained/pm-cli/sdk/testing";',
|
|
444
|
+
// The search sample's synthetic query/vector contexts reference these SDK types
|
|
445
|
+
// for their typed-stub fixtures; other capabilities need no extra type imports.
|
|
446
|
+
...(searchEnabled ? ['import type { ItemDocument, PmSettings } from "@unbrained/pm-cli/sdk";'] : []),
|
|
405
447
|
'import extension from "./index.js";',
|
|
406
448
|
"",
|
|
407
449
|
`test(${JSON.stringify(`${extensionName} registers its starter command`)}, async () => {`,
|
|
@@ -427,8 +469,14 @@ function buildSampleTestSource(extensionName, commandName, capability) {
|
|
|
427
469
|
` command: ${JSON.stringify(commandName)},`,
|
|
428
470
|
" });",
|
|
429
471
|
" assert.equal(invocation.handled, true);",
|
|
430
|
-
"
|
|
431
|
-
|
|
472
|
+
" // The handler result is typed `unknown`, so deep-equality on the whole",
|
|
473
|
+
" // structured payload keeps the assertion type-safe without a cast.",
|
|
474
|
+
" assert.deepEqual(invocation.result, {",
|
|
475
|
+
" ok: true,",
|
|
476
|
+
` source: ${JSON.stringify(extensionName)},`,
|
|
477
|
+
` command: ${JSON.stringify(commandName)},`,
|
|
478
|
+
' message: "Starter extension scaffold is active.",',
|
|
479
|
+
" });",
|
|
432
480
|
"});",
|
|
433
481
|
"",
|
|
434
482
|
...hookTestLines,
|
|
@@ -465,13 +513,15 @@ export function buildStarterExtensionScaffoldFiles(extensionName, commandName, v
|
|
|
465
513
|
permissions: { ...SCAFFOLD_DECLARED_PERMISSIONS },
|
|
466
514
|
capabilities,
|
|
467
515
|
}, null, 2)}\n`;
|
|
468
|
-
//
|
|
469
|
-
//
|
|
470
|
-
//
|
|
471
|
-
//
|
|
516
|
+
// The entrypoint is authored fully in TypeScript (ADR pm-2c28): the `import
|
|
517
|
+
// type` is erased at compile time, so the typed `ExtensionApi` parameter is
|
|
518
|
+
// checked against the SDK contract at author time while the emitted ./index.js
|
|
519
|
+
// stays import-light. `npm run build` (tsc) compiles this index.ts to the
|
|
520
|
+
// ./index.js the manifest entry loads.
|
|
472
521
|
const entrypoint = [
|
|
473
|
-
'
|
|
474
|
-
"
|
|
522
|
+
'import type { ExtensionApi } from "@unbrained/pm-cli/sdk";',
|
|
523
|
+
"",
|
|
524
|
+
"export function activate(api: ExtensionApi): void {",
|
|
475
525
|
...buildActivateBodyLines(extensionName, commandName, capability),
|
|
476
526
|
"}",
|
|
477
527
|
"",
|
|
@@ -479,7 +529,7 @@ export function buildStarterExtensionScaffoldFiles(extensionName, commandName, v
|
|
|
479
529
|
"// shutdown/reload (e.g. the MCP server between requests) to release anything",
|
|
480
530
|
"// `activate` opened - timers, connections, caches. This starter holds no such",
|
|
481
531
|
"// resources, so it stays a documented no-op; add cleanup here as you grow.",
|
|
482
|
-
"export function deactivate() {}",
|
|
532
|
+
"export function deactivate(): void {}",
|
|
483
533
|
"",
|
|
484
534
|
"export default {",
|
|
485
535
|
" activate,",
|
|
@@ -487,7 +537,8 @@ export function buildStarterExtensionScaffoldFiles(extensionName, commandName, v
|
|
|
487
537
|
"};",
|
|
488
538
|
"",
|
|
489
539
|
].join("\n");
|
|
490
|
-
|
|
540
|
+
const tsconfig = `${JSON.stringify(SCAFFOLD_TSCONFIG, null, 2)}\n`;
|
|
541
|
+
// README bullet describing what index.ts wires, kept in sync with the chosen
|
|
491
542
|
// capability so the generated docs match the generated code.
|
|
492
543
|
const entrypointBullet = ENTRYPOINT_BULLETS[capability];
|
|
493
544
|
if (vocabulary === "package") {
|
|
@@ -497,14 +548,21 @@ export function buildStarterExtensionScaffoldFiles(extensionName, commandName, v
|
|
|
497
548
|
private: true,
|
|
498
549
|
type: "module",
|
|
499
550
|
keywords: ["pm-package"],
|
|
500
|
-
// `
|
|
501
|
-
//
|
|
551
|
+
// `build` compiles index.ts to the ./index.js the manifest loads; `test`
|
|
552
|
+
// compiles first (Node's `node --test` runs the emitted *.test.js, not the
|
|
553
|
+
// TypeScript source) then runs the colocated sample against the peer SDK
|
|
554
|
+
// testing helpers — no third-party test runner required.
|
|
502
555
|
scripts: {
|
|
503
|
-
|
|
556
|
+
build: "tsc",
|
|
557
|
+
test: "tsc && node --test",
|
|
504
558
|
},
|
|
505
559
|
peerDependencies: {
|
|
506
560
|
"@unbrained/pm-cli": "*",
|
|
507
561
|
},
|
|
562
|
+
devDependencies: {
|
|
563
|
+
"@types/node": SCAFFOLD_TYPES_NODE_VERSION,
|
|
564
|
+
typescript: SCAFFOLD_TYPESCRIPT_VERSION,
|
|
565
|
+
},
|
|
508
566
|
pm: {
|
|
509
567
|
aliases: [extensionName],
|
|
510
568
|
extensions: ["."],
|
|
@@ -524,34 +582,103 @@ export function buildStarterExtensionScaffoldFiles(extensionName, commandName, v
|
|
|
524
582
|
// capability, the after_command lifecycle hook).
|
|
525
583
|
const sampleTest = buildSampleTestSource(extensionName, commandName, capability);
|
|
526
584
|
const sampleTestBullet = SAMPLE_TEST_BULLETS[capability];
|
|
527
|
-
|
|
585
|
+
// Ignore compiled TypeScript output wherever tsc emits it. Authors can add
|
|
586
|
+
// sibling or subdirectory modules, and tsc writes each .js next to its source.
|
|
587
|
+
const gitignore = [
|
|
588
|
+
"node_modules/",
|
|
589
|
+
"*.log",
|
|
590
|
+
"",
|
|
591
|
+
"# Compiled TypeScript output (npm run build)",
|
|
592
|
+
"*.js",
|
|
593
|
+
"*.test.js",
|
|
594
|
+
"*.js.map",
|
|
595
|
+
"*.d.ts",
|
|
596
|
+
"*.d.ts.map",
|
|
597
|
+
"",
|
|
598
|
+
].join("\n");
|
|
599
|
+
const searchProviderName = `${extensionName}-search`;
|
|
600
|
+
const vectorAdapterName = `${extensionName}-vector`;
|
|
601
|
+
const adapterName = `${extensionName.replace(/-/g, " ")} items`;
|
|
602
|
+
const defineBuilderImports = [
|
|
603
|
+
"defineCommand",
|
|
604
|
+
...(capability === "hooks" ? ["defineAfterCommandHook"] : []),
|
|
605
|
+
...(capability === "search" ? ["defineSearchProvider", "defineVectorStoreAdapter"] : []),
|
|
606
|
+
...(capability === "importers" ? ["defineImporter", "defineExporter"] : []),
|
|
607
|
+
].join(", ");
|
|
608
|
+
const defineBuilderSnippet = [
|
|
609
|
+
"```ts",
|
|
610
|
+
`import { ${defineBuilderImports} } from "@unbrained/pm-cli/sdk";`,
|
|
611
|
+
'import type { ExtensionApi } from "@unbrained/pm-cli/sdk";',
|
|
612
|
+
"",
|
|
613
|
+
"export const pingCommand = defineCommand({",
|
|
614
|
+
` name: ${JSON.stringify(commandName)},`,
|
|
615
|
+
' description: "Starter scaffold command. Replace with your own behavior.",',
|
|
616
|
+
" run: (context) => ({ ok: true, command: context.command }),",
|
|
617
|
+
"});",
|
|
618
|
+
];
|
|
619
|
+
if (capability === "hooks") {
|
|
620
|
+
defineBuilderSnippet.push("", "export const afterCommandHook = defineAfterCommandHook((context) => {", " if (!context.ok) return;", " // React to context.affected here as your package grows.", "});");
|
|
621
|
+
}
|
|
622
|
+
if (capability === "search") {
|
|
623
|
+
defineBuilderSnippet.push("", "export const searchProvider = defineSearchProvider({", ` name: ${JSON.stringify(searchProviderName)},`, " query: async (context) => ({", " hits: context.documents", " .filter((document) => String(document.metadata.title ?? \"\").toLowerCase().includes(context.query.toLowerCase()))", " .map((document) => ({ id: document.metadata.id, score: 1, matched_fields: [\"title\"] })),", " }),", " embed: async (context) => [context.input.length],", "});", "", "export const vectorStoreAdapter = defineVectorStoreAdapter({", ` name: ${JSON.stringify(vectorAdapterName)},`, " query: async (context) => [{ id: \"starter-vector-hit\", score: context.limit }],", " upsert: async (context) => ({ upserted: context.points.length }),", " delete: async (context) => ({ deleted: context.ids.length }),", "});");
|
|
624
|
+
}
|
|
625
|
+
if (capability === "importers") {
|
|
626
|
+
defineBuilderSnippet.push("", "export const importer = defineImporter(async (context) => ({", " imported: 1,", " source: context.options.source ?? \"starter\",", " args: context.args,", "}));", "", "export const exporter = defineExporter(async (context) => ({", " exported: true,", " destination: context.options.destination ?? \"stdout\",", " args: context.args,", "}));");
|
|
627
|
+
}
|
|
628
|
+
defineBuilderSnippet.push("", "export function activate(api: ExtensionApi): void {", " api.registerCommand(pingCommand);");
|
|
629
|
+
if (capability === "hooks") {
|
|
630
|
+
defineBuilderSnippet.push(" api.hooks.afterCommand(afterCommandHook);");
|
|
631
|
+
}
|
|
632
|
+
if (capability === "search") {
|
|
633
|
+
defineBuilderSnippet.push(" api.registerSearchProvider(searchProvider);", " api.registerVectorStoreAdapter(vectorStoreAdapter);");
|
|
634
|
+
}
|
|
635
|
+
if (capability === "importers") {
|
|
636
|
+
defineBuilderSnippet.push(` api.registerImporter(${JSON.stringify(adapterName)}, importer, {`, ` action: ${JSON.stringify(`${adapterName} import`)},`, ' description: "Import starter records into pm context.",', " flags: [", " {", ' long: "--source",', ' value_name: "name",', ' value_type: "string",', ' description: "Source name or path to import from.",', " },", " ],", " });", ` api.registerExporter(${JSON.stringify(adapterName)}, exporter, {`, ` action: ${JSON.stringify(`${adapterName} export`)},`, ' description: "Export pm context into starter records.",', " flags: [", " {", ' long: "--destination",', ' value_name: "name",', ' value_type: "string",', ' description: "Destination name or path to export to.",', " },", " ],", " });");
|
|
637
|
+
}
|
|
638
|
+
defineBuilderSnippet.push("}", "", "export function deactivate(): void {}", "", "export default { activate, deactivate };", "```");
|
|
528
639
|
const packageReadme = [
|
|
529
640
|
`# ${packageName}`,
|
|
530
641
|
"",
|
|
531
642
|
"Generated by `pm package init`.",
|
|
532
643
|
"",
|
|
533
644
|
"## Included Files",
|
|
534
|
-
"- `package.json`: package metadata, `test`
|
|
645
|
+
"- `package.json`: package metadata, `build`/`test` scripts, and `pm` resource manifest.",
|
|
535
646
|
"- `manifest.json`: extension metadata and capabilities.",
|
|
536
647
|
entrypointBullet,
|
|
537
648
|
sampleTestBullet,
|
|
538
|
-
|
|
649
|
+
TSCONFIG_BULLET,
|
|
650
|
+
"- `.gitignore`: ignores `node_modules/`, logs, and compiled JavaScript/declaration output.",
|
|
539
651
|
"",
|
|
540
652
|
"## Quick Start",
|
|
653
|
+
"This package is authored in TypeScript; build it once so the manifest's",
|
|
654
|
+
"`./index.js` entry exists, then install it:",
|
|
541
655
|
"```bash",
|
|
656
|
+
"npm install",
|
|
657
|
+
"npm run build",
|
|
542
658
|
"pm install --project <package-path>",
|
|
543
659
|
`pm ${commandName}`,
|
|
544
660
|
"pm package doctor --project --detail summary",
|
|
545
661
|
"```",
|
|
546
662
|
"",
|
|
547
663
|
"## Validate the Package",
|
|
548
|
-
"
|
|
664
|
+
"`npm install` pulls the peer SDK and TypeScript; `npm test` compiles and runs",
|
|
665
|
+
"the colocated sample test:",
|
|
549
666
|
"```bash",
|
|
550
667
|
"npm install",
|
|
551
668
|
"npm test",
|
|
552
669
|
"```",
|
|
553
|
-
"`npm test` runs `node --test
|
|
670
|
+
"`npm test` runs `tsc && node --test`: it compiles `index.ts`/`index.test.ts`",
|
|
671
|
+
"then executes the emitted `index.test.js` against the",
|
|
554
672
|
"`@unbrained/pm-cli/sdk/testing` helpers - no extra test runner required.",
|
|
673
|
+
"",
|
|
674
|
+
"## Authoring With define* Builders",
|
|
675
|
+
"`index.ts` is authored fully in TypeScript so every registration is checked",
|
|
676
|
+
"against the SDK contracts at author time. Use the public SDK authoring",
|
|
677
|
+
"builders for exported definitions you want literal-type preservation,",
|
|
678
|
+
"contextual handler inference, and direct unit tests for:",
|
|
679
|
+
...defineBuilderSnippet,
|
|
680
|
+
"The builders return their argument unchanged; runtime validation still lives",
|
|
681
|
+
"in `api.register*`, and behavior validation lives in `sdk/testing`.",
|
|
555
682
|
...PACKAGE_CAPABILITY_README_SECTIONS[capability],
|
|
556
683
|
"",
|
|
557
684
|
"## Compatibility Bounds",
|
|
@@ -564,8 +691,8 @@ export function buildStarterExtensionScaffoldFiles(extensionName, commandName, v
|
|
|
564
691
|
"The starter command is pure compute, so `manifest.json` declares `trusted: true`, `sandbox_profile: \"strict\"`, and all six permission keys as `false`. Keep that least-privilege shape for pure packages; relax only the specific permission your package actually needs and verify with `pm package doctor --project --detail deep --trace`.",
|
|
565
692
|
"",
|
|
566
693
|
"## Notes",
|
|
567
|
-
"-
|
|
568
|
-
"- Move larger runtimes into
|
|
694
|
+
"- Author in `index.ts`; `npm run build` (tsc) emits the `./index.js` the manifest loads, so rebuild after editing before installing or reloading.",
|
|
695
|
+
"- Move larger runtimes into sibling or subdirectory `*.ts` modules and import them; `tsconfig.json` compiles every `*.ts` in the package (recursively).",
|
|
569
696
|
"- Add capabilities to the extension manifest only when the entrypoint uses the matching SDK API.",
|
|
570
697
|
"- Use `@unbrained/pm-cli/sdk` as the public SDK import for richer package runtimes.",
|
|
571
698
|
"",
|
|
@@ -573,8 +700,9 @@ export function buildStarterExtensionScaffoldFiles(extensionName, commandName, v
|
|
|
573
700
|
return {
|
|
574
701
|
"package.json": packageJson,
|
|
575
702
|
"manifest.json": manifest,
|
|
576
|
-
"index.
|
|
577
|
-
"index.test.
|
|
703
|
+
"index.ts": entrypoint,
|
|
704
|
+
"index.test.ts": sampleTest,
|
|
705
|
+
"tsconfig.json": tsconfig,
|
|
578
706
|
".gitignore": gitignore,
|
|
579
707
|
"README.md": packageReadme,
|
|
580
708
|
};
|
|
@@ -587,9 +715,16 @@ export function buildStarterExtensionScaffoldFiles(extensionName, commandName, v
|
|
|
587
715
|
"## Included Files",
|
|
588
716
|
"- `manifest.json`: extension metadata and capabilities.",
|
|
589
717
|
entrypointBullet,
|
|
718
|
+
TSCONFIG_BULLET,
|
|
590
719
|
"",
|
|
591
720
|
"## Quick Start",
|
|
721
|
+
"This extension is authored in TypeScript; compile `index.ts` to the manifest's",
|
|
722
|
+
"`./index.js` entry, then install it. The SDK types resolve once",
|
|
723
|
+
"`@unbrained/pm-cli` is available to the compiler (install it, Node types, and TypeScript, or",
|
|
724
|
+
"build from a project that already depends on the CLI):",
|
|
592
725
|
"```bash",
|
|
726
|
+
"npm install -D typescript @types/node @unbrained/pm-cli",
|
|
727
|
+
"npx tsc",
|
|
593
728
|
"pm extension --install --project <scaffold-path>",
|
|
594
729
|
`pm ${commandName}`,
|
|
595
730
|
"pm extension --doctor --project --detail summary",
|
|
@@ -606,14 +741,15 @@ export function buildStarterExtensionScaffoldFiles(extensionName, commandName, v
|
|
|
606
741
|
"The starter command is pure compute, so `manifest.json` declares `trusted: true`, `sandbox_profile: \"strict\"`, and all six permission keys as `false`. Keep that least-privilege shape for pure extensions; relax only the specific permission your extension actually needs and verify with `pm extension --doctor --project --detail deep --trace`.",
|
|
607
742
|
"",
|
|
608
743
|
"## Notes",
|
|
609
|
-
"- This scaffold uses ESM
|
|
610
|
-
"-
|
|
744
|
+
"- This scaffold uses TypeScript ESM source compiled to ESM output, so it works in package scopes with `type: module`.",
|
|
745
|
+
"- Author in `index.ts` and recompile to `index.js` (the manifest entry) after editing capabilities or command behavior.",
|
|
611
746
|
"- Release any resources `activate` opens (timers, connections, caches) in the `deactivate` teardown hook.",
|
|
612
747
|
"",
|
|
613
748
|
].join("\n");
|
|
614
749
|
return {
|
|
615
750
|
"manifest.json": manifest,
|
|
616
|
-
"index.
|
|
751
|
+
"index.ts": entrypoint,
|
|
752
|
+
"tsconfig.json": tsconfig,
|
|
617
753
|
"README.md": readme,
|
|
618
754
|
};
|
|
619
755
|
}
|
|
@@ -682,4 +818,4 @@ export async function scaffoldExtensionProject(target, vocabulary = "extension",
|
|
|
682
818
|
};
|
|
683
819
|
}
|
|
684
820
|
//# sourceMappingURL=scaffold.js.map
|
|
685
|
-
//# debugId=
|
|
821
|
+
//# debugId=9eecdd82-fe71-5803-9186-a33244c4722d
|