@unbrained/pm-cli 2026.6.21 → 2026.6.23
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 +44 -0
- package/dist/cli/commands/completion.js +7 -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/doctor.d.ts +11 -0
- package/dist/cli/commands/extension/doctor.js +31 -2
- package/dist/cli/commands/extension/doctor.js.map +1 -1
- package/dist/cli/commands/extension/scaffold.d.ts +16 -2
- package/dist/cli/commands/extension/scaffold.js +529 -48
- package/dist/cli/commands/extension/scaffold.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +3 -1
- package/dist/cli/commands/extension.js +35 -5
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/help-content.js +20 -4
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/register-setup.js +14 -2
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli-bundle/chunks/{activity-KW3IRP44.js → activity-H2LMOSSW.js} +11 -11
- package/dist/cli-bundle/chunks/activity-XUZ2AHCW.js +18 -0
- package/dist/cli-bundle/chunks/{aggregate-3ZKQG5SW.js → aggregate-EGJLZQBI.js} +10 -10
- package/dist/cli-bundle/chunks/{aggregate-FIGQEIL3.js → aggregate-R725FC3S.js} +10 -10
- package/dist/cli-bundle/chunks/{append-EWJYJ7CH.js → append-5J345QGU.js} +8 -8
- package/dist/cli-bundle/chunks/{append-QEOLX3XB.js → append-O5HPBMRN.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-GOZUHWFD.js → chunk-2A34E3BA.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-A4Z7ZOL5.js → chunk-2BFPAUAF.js} +31 -15
- package/dist/cli-bundle/chunks/chunk-2BFPAUAF.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-5QICDWMV.js → chunk-2CKH2LMV.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-WQ7NIVDK.js → chunk-2RDVQEWV.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-NSBZ2CKF.js → chunk-2T3JG6V4.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-76Z3YSHV.js → chunk-34EONI5F.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-PUH4D67U.js → chunk-3VY3YQO6.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-N5ZJACJ6.js → chunk-46G6RSB6.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-SRYYRVPB.js → chunk-4BHT5VDC.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-PFSRUHDH.js → chunk-4KD54S3Z.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-QQHISQBJ.js → chunk-55ISXAQH.js} +7 -4
- package/dist/cli-bundle/chunks/{chunk-QQHISQBJ.js.map → chunk-55ISXAQH.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NIUEXCFS.js → chunk-5UVVASSA.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-CF55WVVS.js → chunk-5VOINNKT.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NIGXMNNI.js → chunk-66MEDTUD.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-AZMOLBN3.js → chunk-7AUB5HNA.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-OTHIWLMB.js → chunk-7K2XXO4I.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-7D3SAQXM.js → chunk-7MRQ4HMK.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-EBH56IXK.js → chunk-7SV63ZHD.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-OFYMIDF2.js → chunk-7UGEAPRY.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-LUWW7L4B.js → chunk-7XGQXHFB.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-UEMNL33O.js → chunk-AD3A7ZD6.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-3EWSGA7N.js → chunk-AONIHR2C.js} +12 -12
- package/dist/cli-bundle/chunks/{chunk-RVHYI7SL.js → chunk-BB6MDVNQ.js} +8 -8
- package/dist/cli-bundle/chunks/chunk-C5AOG6D2.js +691 -0
- package/dist/cli-bundle/chunks/chunk-C5AOG6D2.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-52OCIDPG.js → chunk-CE5P2NQR.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-NXS7ZKAK.js → chunk-CIIK67GW.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-HC4AWIKT.js → chunk-CKGNPJAG.js} +31 -15
- package/dist/cli-bundle/chunks/chunk-CKGNPJAG.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-NB3PYLQ6.js → chunk-DT5LPYOD.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-37QXHBIB.js → chunk-FIGAZ4Y7.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-UV6IYE5U.js → chunk-FXR67XVQ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-3MDHREEV.js → chunk-G6N5VEOK.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-5PCI3UBT.js → chunk-G6PYHBBR.js} +152 -253
- package/dist/cli-bundle/chunks/chunk-G6PYHBBR.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-2GCDRRIF.js → chunk-GAJVRGGA.js} +12 -12
- package/dist/cli-bundle/chunks/{chunk-HCU6WUSY.js → chunk-H2IP4QLJ.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-CZUB4XWO.js → chunk-H4IIJDE4.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-RLK7P77C.js → chunk-HFFUQR73.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-6M4RJS4M.js → chunk-IB3GYLQE.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-SX75ADBK.js → chunk-IPKJ6B36.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-H7NJZWG2.js → chunk-JR2LV3M4.js} +13 -13
- package/dist/cli-bundle/chunks/{chunk-PP2U4NMT.js → chunk-KFWBJPSG.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-32R4PIC6.js → chunk-KQMUV6LX.js} +145 -253
- package/dist/cli-bundle/chunks/chunk-KQMUV6LX.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-F7K5GWP3.js → chunk-LRKKONT2.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-5IDI42VV.js → chunk-M4T5DXD5.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-2PKHRP6G.js → chunk-MJTINN54.js} +10 -10
- package/dist/cli-bundle/chunks/{chunk-HMOADQVT.js → chunk-MJTSZKK5.js} +107 -3
- package/dist/cli-bundle/chunks/chunk-MJTSZKK5.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-MVKFOLLM.js +694 -0
- package/dist/cli-bundle/chunks/chunk-MVKFOLLM.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-QGG32QHW.js → chunk-NCVCO3NZ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-AIS5PGI3.js → chunk-NK3UPBVG.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-6H4LF7AO.js → chunk-O6LLO73I.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-YCJX76PW.js → chunk-P77P2ILI.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-F5NZWFSW.js → chunk-Q2KNGP7C.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-GMHPNNYG.js → chunk-QH3PJYON.js} +10 -10
- package/dist/cli-bundle/chunks/{chunk-NJHMAJ6N.js → chunk-QL5RVYOA.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-O47BPOPC.js → chunk-S26C36QC.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-D7FYS6PG.js → chunk-S2RUQSX2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-CZPXY7UW.js → chunk-SBQTAVJZ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-M5XALUSL.js → chunk-SKH7OGE5.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NJN7LL7U.js → chunk-SKN7LC5W.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-6ZXM2XNF.js → chunk-SR3EKWZG.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-B473GZWW.js → chunk-T5472OMV.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-2EIMPCE4.js → chunk-T72AZDBA.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-6CJWZAN7.js → chunk-TQZH6OD6.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-FWPDUYEY.js → chunk-U2Z5YUSO.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-434HM6Z5.js → chunk-UELRKQQU.js} +100 -3
- package/dist/cli-bundle/chunks/chunk-UELRKQQU.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-HIP7WVTL.js → chunk-UVC5LOR7.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-LEU5GHRC.js → chunk-VAYA4XFX.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-J4MYYSOL.js → chunk-VFAQ4LMN.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-UPE3CDD7.js → chunk-W72GHSJE.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-C4N5I7ZW.js → chunk-WBRKK5QR.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-Z6T4PQI2.js → chunk-WM5ZVBPE.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-TKBHZPKD.js → chunk-WZQWHN4R.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-FKBDKV7Y.js → chunk-XVF4YARA.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-SBGXDO7A.js → chunk-Y4SUQQYH.js} +8 -5
- package/dist/cli-bundle/chunks/{chunk-SBGXDO7A.js.map → chunk-Y4SUQQYH.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-QZTWBFXJ.js → chunk-YDEXO24S.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-FRUFKWNK.js → chunk-YJ3SUEPD.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-5FIEHKEX.js → chunk-YUDJD3XO.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-Q2J2HJUN.js → chunk-ZQ3ZVXX2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-C3AZ5ZML.js → chunk-ZRK4O56R.js} +13 -13
- package/dist/cli-bundle/chunks/{claim-RC56YUWG.js → claim-4KHAA2RN.js} +10 -10
- package/dist/cli-bundle/chunks/{claim-THOJ6CMV.js → claim-CSPJFLNH.js} +10 -10
- package/dist/cli-bundle/chunks/close-A3EMKBBY.js +15 -0
- package/dist/cli-bundle/chunks/{close-SG5MNCVQ.js → close-W56IOGYG.js} +8 -8
- package/dist/cli-bundle/chunks/{close-many-3L3AQZBU.js → close-many-BX5DCSVV.js} +15 -15
- package/dist/cli-bundle/chunks/{close-many-DKQLBGLV.js → close-many-TQU5F4E4.js} +15 -15
- package/dist/cli-bundle/chunks/{comments-M7ZOZNBX.js → comments-U5KUC4EU.js} +10 -10
- package/dist/cli-bundle/chunks/{comments-SKWMDWCW.js → comments-VRECH75R.js} +10 -10
- package/dist/cli-bundle/chunks/{config-OZCUABPB.js → config-D3OKQO52.js} +8 -8
- package/dist/cli-bundle/chunks/{config-7CK62S7T.js → config-MMJA4LLK.js} +8 -8
- package/dist/cli-bundle/chunks/{context-PUG2A7RC.js → context-BLBD3PUB.js} +13 -13
- package/dist/cli-bundle/chunks/{context-OEC366TO.js → context-DHLVPXN3.js} +13 -13
- package/dist/cli-bundle/chunks/{contracts-3THOLA7L.js → contracts-C3SZCXXG.js} +7 -5
- package/dist/cli-bundle/chunks/contracts-C3SZCXXG.js.map +7 -0
- package/dist/cli-bundle/chunks/{contracts-N65FXEOL.js → contracts-XGVMMPC5.js} +8 -6
- package/dist/cli-bundle/chunks/contracts-XGVMMPC5.js.map +1 -0
- package/dist/cli-bundle/chunks/{copy-JPX7VZCH.js → copy-5D5DX3VK.js} +7 -7
- package/dist/cli-bundle/chunks/{copy-6QLHILAC.js → copy-HHL3K4QP.js} +7 -7
- package/dist/cli-bundle/chunks/{create-Y54ZVVZH.js → create-IXY43O4H.js} +14 -14
- package/dist/cli-bundle/chunks/create-QVGFYA2X.js +30 -0
- package/dist/cli-bundle/chunks/{delete-63PCMQAJ.js → delete-IBUR3M42.js} +7 -7
- package/dist/cli-bundle/chunks/{delete-GDSMGAGJ.js → delete-QQC2FGUH.js} +7 -7
- package/dist/cli-bundle/chunks/{deps-XYQ73XRH.js → deps-KWKRHXIN.js} +7 -7
- package/dist/cli-bundle/chunks/{deps-T4ZF5G54.js → deps-VTPO4BSE.js} +7 -7
- package/dist/cli-bundle/chunks/{docs-EHNPDWUL.js → docs-7CHFHXLN.js} +9 -9
- package/dist/cli-bundle/chunks/{docs-C75YIXHC.js → docs-IIO3FEUO.js} +9 -9
- package/dist/cli-bundle/chunks/{eval-GTENKE24.js → eval-CEYYEPSX.js} +12 -12
- package/dist/cli-bundle/chunks/{eval-3WKDTRMH.js → eval-IO7LREOL.js} +12 -12
- package/dist/cli-bundle/chunks/{extension-D5FDZ2CO.js → extension-KCPUWSY2.js} +6 -5
- package/dist/cli-bundle/chunks/{extension-46NWACO3.js → extension-UTTQDUYI.js} +6 -5
- package/dist/cli-bundle/chunks/{files-X3H7CCBQ.js → files-TPUL6KWB.js} +9 -9
- package/dist/cli-bundle/chunks/{files-DSZBOSSN.js → files-Z2HHEFGP.js} +9 -9
- package/dist/cli-bundle/chunks/{focus-5STQXDPU.js → focus-JVJCGC2D.js} +8 -8
- package/dist/cli-bundle/chunks/{focus-MDVPOWB5.js → focus-YRNNH7IP.js} +8 -8
- package/dist/cli-bundle/chunks/{gc-ZMST3WQP.js → gc-O5GUO3SU.js} +3 -3
- package/dist/cli-bundle/chunks/{gc-ZC7JHBG7.js → gc-PYVVEELM.js} +3 -3
- package/dist/cli-bundle/chunks/{get-NT7L2HUZ.js → get-ENLTEGTX.js} +11 -11
- package/dist/cli-bundle/chunks/{get-J2IPJRZW.js → get-X4O3HBEY.js} +11 -11
- package/dist/cli-bundle/chunks/{health-WOYBR3KU.js → health-5EXTY44Q.js} +14 -13
- package/dist/cli-bundle/chunks/{health-WOYBR3KU.js.map → health-5EXTY44Q.js.map} +1 -1
- package/dist/cli-bundle/chunks/{health-IVMA3XQC.js → health-BOTB7YSU.js} +16 -15
- package/dist/cli-bundle/chunks/{health-IVMA3XQC.js.map → health-BOTB7YSU.js.map} +1 -1
- package/dist/cli-bundle/chunks/{history-RLH2QCRO.js → history-AJTXLT6S.js} +10 -10
- package/dist/cli-bundle/chunks/history-AK3E5Z3C.js +20 -0
- package/dist/cli-bundle/chunks/{history-compact-UXDIFC33.js → history-compact-43OOUAWD.js} +12 -12
- package/dist/cli-bundle/chunks/{history-compact-ZBEBGJM7.js → history-compact-46MRHW3I.js} +12 -12
- package/dist/cli-bundle/chunks/{history-redact-P7I7AWMB.js → history-redact-KUUUVUFM.js} +11 -11
- package/dist/cli-bundle/chunks/history-redact-TWIYQV5J.js +21 -0
- package/dist/cli-bundle/chunks/{history-repair-52KINVIK.js → history-repair-B5PZBOPU.js} +12 -12
- package/dist/cli-bundle/chunks/{history-repair-RM5ITLU5.js → history-repair-VQTYOSRS.js} +12 -12
- package/dist/cli-bundle/chunks/{init-2BNZOO6F.js → init-BNLVFPRG.js} +11 -10
- package/dist/cli-bundle/chunks/init-RCRKW5PL.js +21 -0
- package/dist/cli-bundle/chunks/{learnings-YGYVHWJK.js → learnings-MUUU5KMC.js} +10 -10
- package/dist/cli-bundle/chunks/{learnings-W6F3FIPL.js → learnings-XSGX52S7.js} +10 -10
- package/dist/cli-bundle/chunks/{list-K6FPV4J4.js → list-32U7BSKE.js} +10 -10
- package/dist/cli-bundle/chunks/{list-KPAYU5KZ.js → list-ZEEOHLTQ.js} +10 -10
- package/dist/cli-bundle/chunks/{notes-PU74EPKV.js → notes-NJ45OZGF.js} +10 -10
- package/dist/cli-bundle/chunks/{notes-YTD6ZILW.js → notes-OHU25L3M.js} +10 -10
- package/dist/cli-bundle/chunks/{plan-GEQYUCBW.js → plan-KQA7CAKI.js} +14 -14
- package/dist/cli-bundle/chunks/{plan-FNXHXRCI.js → plan-LWWAEV5Y.js} +14 -14
- package/dist/cli-bundle/chunks/{register-list-query-QI45RMKN.js → register-list-query-DDCHPONM.js} +19 -19
- package/dist/cli-bundle/chunks/{register-list-query-PHWYHENI.js → register-list-query-YNPBVIKM.js} +19 -19
- package/dist/cli-bundle/chunks/{register-mutation-YINRTS7L.js → register-mutation-7ALWDDAX.js} +33 -33
- package/dist/cli-bundle/chunks/{register-mutation-X3BUOQEL.js → register-mutation-LAVKYY63.js} +33 -33
- package/dist/cli-bundle/chunks/{register-operations-E5JEASRK.js → register-operations-R4VOQ6EF.js} +32 -32
- package/dist/cli-bundle/chunks/{register-operations-MIDTRW7S.js → register-operations-U5JAW3WE.js} +32 -32
- package/dist/cli-bundle/chunks/{register-setup-EG2U6CEU.js → register-setup-KBXQDCXE.js} +27 -18
- package/dist/cli-bundle/chunks/register-setup-KBXQDCXE.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-setup-DYBFLEZX.js → register-setup-RCRUHMSZ.js} +28 -19
- package/dist/cli-bundle/chunks/register-setup-RCRUHMSZ.js.map +1 -0
- package/dist/cli-bundle/chunks/restore-2ZKT6UDC.js +19 -0
- package/dist/cli-bundle/chunks/{restore-XQYSWBV7.js → restore-6K53WOWO.js} +11 -11
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-NNT5ASZR.js → scheduling-shortcuts-NJ5UVJFB.js} +14 -14
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-HJMTEXKE.js → scheduling-shortcuts-OQVJXG3M.js} +14 -14
- package/dist/cli-bundle/chunks/{schema-263RI4WW.js → schema-MNTAVQCY.js} +9 -9
- package/dist/cli-bundle/chunks/{schema-TZXW6XWD.js → schema-RBTJ2YXW.js} +9 -9
- package/dist/cli-bundle/chunks/{search-SFRJOVDG.js → search-6HOIVZDU.js} +12 -12
- package/dist/cli-bundle/chunks/{search-LECJYSXE.js → search-ZWYEMASC.js} +12 -12
- package/dist/cli-bundle/chunks/{stats-N7ER2PNK.js → stats-FS742AMA.js} +8 -8
- package/dist/cli-bundle/chunks/{stats-VPBGSRQH.js → stats-R5OAJVZK.js} +8 -8
- package/dist/cli-bundle/chunks/{telemetry-PP3FUNBU.js → telemetry-7DIGDQUO.js} +4 -4
- package/dist/cli-bundle/chunks/{telemetry-L6K3BUIQ.js → telemetry-FWEXSJLQ.js} +4 -4
- package/dist/cli-bundle/chunks/{test-3EGNS3T5.js → test-NZF7OT2F.js} +16 -15
- package/dist/cli-bundle/chunks/test-QJXLKV26.js +36 -0
- package/dist/cli-bundle/chunks/{test-all-NJ5V2QFS.js → test-all-DPN62TX7.js} +16 -15
- package/dist/cli-bundle/chunks/{test-all-NJ5V2QFS.js.map → test-all-DPN62TX7.js.map} +1 -1
- package/dist/cli-bundle/chunks/{test-all-ZHFAWNC3.js → test-all-KL7TLMJF.js} +18 -17
- package/dist/cli-bundle/chunks/{test-all-ZHFAWNC3.js.map → test-all-KL7TLMJF.js.map} +1 -1
- package/dist/cli-bundle/chunks/{test-runs-GN3C6GOI.js → test-runs-C6CFIVOS.js} +5 -5
- package/dist/cli-bundle/chunks/{test-runs-AJHR6IQF.js → test-runs-IAJDL6CA.js} +5 -5
- package/dist/cli-bundle/chunks/update-2XCQNOD6.js +28 -0
- package/dist/cli-bundle/chunks/update-IWUCXVH2.js +24 -0
- package/dist/cli-bundle/chunks/{update-many-RYQ64CFW.js → update-many-MUTIOAP3.js} +23 -23
- package/dist/cli-bundle/chunks/{update-many-N2AN6ZDH.js → update-many-YEH2DQL6.js} +23 -23
- package/dist/cli-bundle/chunks/{upgrade-VPCIYAVW.js → upgrade-HYJ3SWWU.js} +8 -7
- package/dist/cli-bundle/chunks/{upgrade-VPCIYAVW.js.map → upgrade-HYJ3SWWU.js.map} +1 -1
- package/dist/cli-bundle/chunks/{upgrade-TJXFLZIX.js → upgrade-UBNLBZNR.js} +6 -5
- package/dist/cli-bundle/chunks/{upgrade-TJXFLZIX.js.map → upgrade-UBNLBZNR.js.map} +1 -1
- package/dist/cli-bundle/chunks/{validate-PHKIYGSY.js → validate-6QWQVCX2.js} +21 -20
- package/dist/cli-bundle/chunks/{validate-PHKIYGSY.js.map → validate-6QWQVCX2.js.map} +1 -1
- package/dist/cli-bundle/chunks/{validate-JMNWEUYF.js → validate-W5V5ZGQX.js} +23 -22
- package/dist/cli-bundle/chunks/{validate-JMNWEUYF.js.map → validate-W5V5ZGQX.js.map} +1 -1
- package/dist/cli-bundle/main.js +38 -22
- package/dist/cli-bundle/main.js.map +2 -2
- package/dist/cli.js +3 -3
- package/dist/cli.js.map +1 -1
- 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 +92 -0
- package/dist/core/extensions/capability-usage.js +142 -0
- package/dist/core/extensions/capability-usage.js.map +1 -0
- package/dist/core/extensions/extension-capability-aliases.d.ts +7 -0
- package/dist/core/extensions/extension-capability-aliases.js +12 -2
- package/dist/core/extensions/extension-capability-aliases.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -0
- package/dist/core/extensions/index.js +3 -2
- package/dist/core/extensions/index.js.map +1 -1
- 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 +2 -0
- package/dist/sdk/cli-contracts.js +26 -13
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/compose.d.ts +297 -0
- package/dist/sdk/compose.js +420 -0
- package/dist/sdk/compose.js.map +1 -0
- package/dist/sdk/define.d.ts +194 -0
- package/dist/sdk/define.js +205 -0
- package/dist/sdk/define.js.map +1 -0
- package/dist/sdk/index.d.ts +8 -26
- package/dist/sdk/index.js +8 -10
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/testing.d.ts +667 -2
- package/dist/sdk/testing.js +654 -18
- package/dist/sdk/testing.js.map +1 -1
- package/docs/COMMANDS.md +1 -0
- package/docs/EXTENSIONS.md +10 -11
- package/docs/SDK.md +502 -16
- package/package.json +2 -2
- package/dist/cli-bundle/chunks/activity-CIHV64UC.js +0 -18
- package/dist/cli-bundle/chunks/chunk-32R4PIC6.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-434HM6Z5.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-5PCI3UBT.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-A4Z7ZOL5.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-HC4AWIKT.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-HMOADQVT.js.map +0 -7
- package/dist/cli-bundle/chunks/close-DNMHGOCX.js +0 -15
- package/dist/cli-bundle/chunks/contracts-3THOLA7L.js.map +0 -7
- package/dist/cli-bundle/chunks/contracts-N65FXEOL.js.map +0 -1
- package/dist/cli-bundle/chunks/create-NNP6TSFO.js +0 -30
- package/dist/cli-bundle/chunks/history-WX3MGFS2.js +0 -20
- package/dist/cli-bundle/chunks/history-redact-YQGU3XRA.js +0 -21
- package/dist/cli-bundle/chunks/init-SC2P6CHP.js +0 -20
- package/dist/cli-bundle/chunks/register-setup-DYBFLEZX.js.map +0 -1
- package/dist/cli-bundle/chunks/register-setup-EG2U6CEU.js.map +0 -7
- package/dist/cli-bundle/chunks/restore-5KHR2YYQ.js +0 -19
- package/dist/cli-bundle/chunks/test-RQCTSWUK.js +0 -35
- package/dist/cli-bundle/chunks/update-6YXOGHRT.js +0 -24
- package/dist/cli-bundle/chunks/update-V33YUBRP.js +0 -28
- /package/dist/cli-bundle/chunks/{activity-KW3IRP44.js.map → activity-H2LMOSSW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{activity-CIHV64UC.js.map → activity-XUZ2AHCW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{aggregate-3ZKQG5SW.js.map → aggregate-EGJLZQBI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{aggregate-FIGQEIL3.js.map → aggregate-R725FC3S.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-EWJYJ7CH.js.map → append-5J345QGU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-QEOLX3XB.js.map → append-O5HPBMRN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GOZUHWFD.js.map → chunk-2A34E3BA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5QICDWMV.js.map → chunk-2CKH2LMV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WQ7NIVDK.js.map → chunk-2RDVQEWV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NSBZ2CKF.js.map → chunk-2T3JG6V4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-76Z3YSHV.js.map → chunk-34EONI5F.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PUH4D67U.js.map → chunk-3VY3YQO6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-N5ZJACJ6.js.map → chunk-46G6RSB6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SRYYRVPB.js.map → chunk-4BHT5VDC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PFSRUHDH.js.map → chunk-4KD54S3Z.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NIUEXCFS.js.map → chunk-5UVVASSA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CF55WVVS.js.map → chunk-5VOINNKT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NIGXMNNI.js.map → chunk-66MEDTUD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AZMOLBN3.js.map → chunk-7AUB5HNA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OTHIWLMB.js.map → chunk-7K2XXO4I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7D3SAQXM.js.map → chunk-7MRQ4HMK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EBH56IXK.js.map → chunk-7SV63ZHD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OFYMIDF2.js.map → chunk-7UGEAPRY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-LUWW7L4B.js.map → chunk-7XGQXHFB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UEMNL33O.js.map → chunk-AD3A7ZD6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3EWSGA7N.js.map → chunk-AONIHR2C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RVHYI7SL.js.map → chunk-BB6MDVNQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-52OCIDPG.js.map → chunk-CE5P2NQR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NXS7ZKAK.js.map → chunk-CIIK67GW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NB3PYLQ6.js.map → chunk-DT5LPYOD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-37QXHBIB.js.map → chunk-FIGAZ4Y7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UV6IYE5U.js.map → chunk-FXR67XVQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3MDHREEV.js.map → chunk-G6N5VEOK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2GCDRRIF.js.map → chunk-GAJVRGGA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HCU6WUSY.js.map → chunk-H2IP4QLJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CZUB4XWO.js.map → chunk-H4IIJDE4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RLK7P77C.js.map → chunk-HFFUQR73.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6M4RJS4M.js.map → chunk-IB3GYLQE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SX75ADBK.js.map → chunk-IPKJ6B36.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-H7NJZWG2.js.map → chunk-JR2LV3M4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PP2U4NMT.js.map → chunk-KFWBJPSG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-F7K5GWP3.js.map → chunk-LRKKONT2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5IDI42VV.js.map → chunk-M4T5DXD5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2PKHRP6G.js.map → chunk-MJTINN54.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QGG32QHW.js.map → chunk-NCVCO3NZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AIS5PGI3.js.map → chunk-NK3UPBVG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6H4LF7AO.js.map → chunk-O6LLO73I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YCJX76PW.js.map → chunk-P77P2ILI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-F5NZWFSW.js.map → chunk-Q2KNGP7C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GMHPNNYG.js.map → chunk-QH3PJYON.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NJHMAJ6N.js.map → chunk-QL5RVYOA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-O47BPOPC.js.map → chunk-S26C36QC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-D7FYS6PG.js.map → chunk-S2RUQSX2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CZPXY7UW.js.map → chunk-SBQTAVJZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-M5XALUSL.js.map → chunk-SKH7OGE5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NJN7LL7U.js.map → chunk-SKN7LC5W.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6ZXM2XNF.js.map → chunk-SR3EKWZG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-B473GZWW.js.map → chunk-T5472OMV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2EIMPCE4.js.map → chunk-T72AZDBA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6CJWZAN7.js.map → chunk-TQZH6OD6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FWPDUYEY.js.map → chunk-U2Z5YUSO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HIP7WVTL.js.map → chunk-UVC5LOR7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-LEU5GHRC.js.map → chunk-VAYA4XFX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-J4MYYSOL.js.map → chunk-VFAQ4LMN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UPE3CDD7.js.map → chunk-W72GHSJE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-C4N5I7ZW.js.map → chunk-WBRKK5QR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-Z6T4PQI2.js.map → chunk-WM5ZVBPE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TKBHZPKD.js.map → chunk-WZQWHN4R.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FKBDKV7Y.js.map → chunk-XVF4YARA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QZTWBFXJ.js.map → chunk-YDEXO24S.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FRUFKWNK.js.map → chunk-YJ3SUEPD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5FIEHKEX.js.map → chunk-YUDJD3XO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-Q2J2HJUN.js.map → chunk-ZQ3ZVXX2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-C3AZ5ZML.js.map → chunk-ZRK4O56R.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-RC56YUWG.js.map → claim-4KHAA2RN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-THOJ6CMV.js.map → claim-CSPJFLNH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-DNMHGOCX.js.map → close-A3EMKBBY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-SG5MNCVQ.js.map → close-W56IOGYG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-3L3AQZBU.js.map → close-many-BX5DCSVV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-DKQLBGLV.js.map → close-many-TQU5F4E4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-M7ZOZNBX.js.map → comments-U5KUC4EU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-SKWMDWCW.js.map → comments-VRECH75R.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{config-OZCUABPB.js.map → config-D3OKQO52.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{config-7CK62S7T.js.map → config-MMJA4LLK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-PUG2A7RC.js.map → context-BLBD3PUB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-OEC366TO.js.map → context-DHLVPXN3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-JPX7VZCH.js.map → copy-5D5DX3VK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-6QLHILAC.js.map → copy-HHL3K4QP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-Y54ZVVZH.js.map → create-IXY43O4H.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-NNP6TSFO.js.map → create-QVGFYA2X.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-63PCMQAJ.js.map → delete-IBUR3M42.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-GDSMGAGJ.js.map → delete-QQC2FGUH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-XYQ73XRH.js.map → deps-KWKRHXIN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-T4ZF5G54.js.map → deps-VTPO4BSE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-EHNPDWUL.js.map → docs-7CHFHXLN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-C75YIXHC.js.map → docs-IIO3FEUO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-GTENKE24.js.map → eval-CEYYEPSX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-3WKDTRMH.js.map → eval-IO7LREOL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-D5FDZ2CO.js.map → extension-KCPUWSY2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-46NWACO3.js.map → extension-UTTQDUYI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-X3H7CCBQ.js.map → files-TPUL6KWB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-DSZBOSSN.js.map → files-Z2HHEFGP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-5STQXDPU.js.map → focus-JVJCGC2D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-MDVPOWB5.js.map → focus-YRNNH7IP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-ZMST3WQP.js.map → gc-O5GUO3SU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-ZC7JHBG7.js.map → gc-PYVVEELM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{get-NT7L2HUZ.js.map → get-ENLTEGTX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{get-J2IPJRZW.js.map → get-X4O3HBEY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-RLH2QCRO.js.map → history-AJTXLT6S.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-WX3MGFS2.js.map → history-AK3E5Z3C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-UXDIFC33.js.map → history-compact-43OOUAWD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-ZBEBGJM7.js.map → history-compact-46MRHW3I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-P7I7AWMB.js.map → history-redact-KUUUVUFM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-YQGU3XRA.js.map → history-redact-TWIYQV5J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-52KINVIK.js.map → history-repair-B5PZBOPU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-RM5ITLU5.js.map → history-repair-VQTYOSRS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-2BNZOO6F.js.map → init-BNLVFPRG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-SC2P6CHP.js.map → init-RCRKW5PL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-YGYVHWJK.js.map → learnings-MUUU5KMC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-W6F3FIPL.js.map → learnings-XSGX52S7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-K6FPV4J4.js.map → list-32U7BSKE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-KPAYU5KZ.js.map → list-ZEEOHLTQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-PU74EPKV.js.map → notes-NJ45OZGF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-YTD6ZILW.js.map → notes-OHU25L3M.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-GEQYUCBW.js.map → plan-KQA7CAKI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-FNXHXRCI.js.map → plan-LWWAEV5Y.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-QI45RMKN.js.map → register-list-query-DDCHPONM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-PHWYHENI.js.map → register-list-query-YNPBVIKM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-YINRTS7L.js.map → register-mutation-7ALWDDAX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-X3BUOQEL.js.map → register-mutation-LAVKYY63.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-E5JEASRK.js.map → register-operations-R4VOQ6EF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-MIDTRW7S.js.map → register-operations-U5JAW3WE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-5KHR2YYQ.js.map → restore-2ZKT6UDC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-XQYSWBV7.js.map → restore-6K53WOWO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-NNT5ASZR.js.map → scheduling-shortcuts-NJ5UVJFB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-HJMTEXKE.js.map → scheduling-shortcuts-OQVJXG3M.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-263RI4WW.js.map → schema-MNTAVQCY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-TZXW6XWD.js.map → schema-RBTJ2YXW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-SFRJOVDG.js.map → search-6HOIVZDU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-LECJYSXE.js.map → search-ZWYEMASC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-N7ER2PNK.js.map → stats-FS742AMA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-VPBGSRQH.js.map → stats-R5OAJVZK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{telemetry-PP3FUNBU.js.map → telemetry-7DIGDQUO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{telemetry-L6K3BUIQ.js.map → telemetry-FWEXSJLQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-3EGNS3T5.js.map → test-NZF7OT2F.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-RQCTSWUK.js.map → test-QJXLKV26.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-runs-GN3C6GOI.js.map → test-runs-C6CFIVOS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-runs-AJHR6IQF.js.map → test-runs-IAJDL6CA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-V33YUBRP.js.map → update-2XCQNOD6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-6YXOGHRT.js.map → update-IWUCXVH2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-RYQ64CFW.js.map → update-many-MUTIOAP3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-N2AN6ZDH.js.map → update-many-YEH2DQL6.js.map} +0 -0
package/docs/SDK.md
CHANGED
|
@@ -36,6 +36,8 @@ Source of truth:
|
|
|
36
36
|
Common authoring exports:
|
|
37
37
|
|
|
38
38
|
- `defineExtension`
|
|
39
|
+
- `composeExtension` / `deriveExtensionCapabilities`
|
|
40
|
+
- `describeExtensionBlueprint` (static surface map of a blueprint) / `lintExtensionBlueprint` (author-time preflight)
|
|
39
41
|
- `EXTENSION_CAPABILITIES`
|
|
40
42
|
- `EXTENSION_CAPABILITY_CONTRACT`
|
|
41
43
|
- `EXTENSION_CAPABILITY_CONTRACT_VERSION`
|
|
@@ -48,6 +50,14 @@ Common authoring exports:
|
|
|
48
50
|
- `createPmCliExpectedError`
|
|
49
51
|
- `isPmCliExpectedError`
|
|
50
52
|
|
|
53
|
+
Registration builders (`define*`, zero-cost identity — see [Authoring Builders](#authoring-builders)):
|
|
54
|
+
|
|
55
|
+
- `defineCommand` / `defineFlag` / `defineItemType` / `defineItemField` / `defineMigration`
|
|
56
|
+
- `defineSearchProvider` / `defineVectorStoreAdapter`
|
|
57
|
+
- `defineCommandOverride` / `defineParserOverride` / `definePreflightOverride` / `defineServiceOverride` / `defineRendererOverride`
|
|
58
|
+
- `defineImporter` / `defineExporter`
|
|
59
|
+
- `defineBeforeCommandHook` / `defineAfterCommandHook` / `defineOnWriteHook` / `defineOnReadHook` / `defineOnIndexHook`
|
|
60
|
+
|
|
51
61
|
Package manifest exports:
|
|
52
62
|
|
|
53
63
|
- `PM_PACKAGE_RESOURCE_KINDS` (`extensions`, `docs`, `examples`, `assets`, `prompts`)
|
|
@@ -73,7 +83,22 @@ Command/action contract exports:
|
|
|
73
83
|
|
|
74
84
|
Testing helper exports (also under `@unbrained/pm-cli/sdk/testing`):
|
|
75
85
|
|
|
86
|
+
- `createExtensionTestHarness`
|
|
76
87
|
- `activateExtensionForTest`
|
|
88
|
+
- `deactivateExtensionForTest`
|
|
89
|
+
- `runRegisteredCommandForTest`
|
|
90
|
+
- `runRegisteredHookForTest`
|
|
91
|
+
- `runRegisteredParserOverrideForTest`
|
|
92
|
+
- `runRegisteredPreflightOverrideForTest`
|
|
93
|
+
- `runRegisteredCommandOverrideForTest`
|
|
94
|
+
- `runRegisteredRendererOverrideForTest`
|
|
95
|
+
- `runRegisteredServiceOverrideForTest`
|
|
96
|
+
- `runRegisteredSearchProviderForTest`
|
|
97
|
+
- `runRegisteredVectorStoreAdapterForTest`
|
|
98
|
+
- `runRegisteredMigrationForTest`
|
|
99
|
+
- `runRegisteredImporterForTest`
|
|
100
|
+
- `runRegisteredExporterForTest`
|
|
101
|
+
- `assertExtensionDeactivated`
|
|
77
102
|
- `assertPackageManifest`
|
|
78
103
|
- `assertRegisteredCommandContract`
|
|
79
104
|
- `assertRegisteredFlags`
|
|
@@ -90,6 +115,171 @@ Testing helper exports (also under `@unbrained/pm-cli/sdk/testing`):
|
|
|
90
115
|
- `assertRegisteredItemType`
|
|
91
116
|
- `assertRegisteredServiceOverride`
|
|
92
117
|
- `assertRegisteredMigration`
|
|
118
|
+
- `assertExtensionCapabilityUsage`
|
|
119
|
+
- `assertExtensionBlueprint` (throwing preflight; pairs with `lintExtensionBlueprint`)
|
|
120
|
+
- `describeExtensionActivation`
|
|
121
|
+
- `describeExtensionBlueprint` / `lintExtensionBlueprint` (also surfaced here for the full author → describe → preflight → test loop)
|
|
122
|
+
|
|
123
|
+
`createExtensionTestHarness(module, options)` is the recommended entry point and
|
|
124
|
+
the ergonomic capstone over every standalone helper below: it activates the
|
|
125
|
+
module once and returns a fluent `ExtensionTestHarness` whose `assert*`/`run*`
|
|
126
|
+
methods are pre-bound to the correct activation sub-registry, so a package author
|
|
127
|
+
never threads `activation.registrations` vs `activation.commands` vs
|
|
128
|
+
`activation.hooks` (etc.) by hand — picking the wrong one is a common footgun that
|
|
129
|
+
surfaces as a confusing `available: (none)` error. Write
|
|
130
|
+
`const ext = await createExtensionTestHarness(module, { capabilities: ["commands"] })`,
|
|
131
|
+
then `ext.assertCommandContract({ command })`, `await ext.runCommand({ command })`,
|
|
132
|
+
and `await ext.deactivate()`. The methods do not use `this`, so they remain safe
|
|
133
|
+
to destructure (`const { runCommand } = ext;`), and the raw `ext.activation`
|
|
134
|
+
stays public as an escape hatch to the standalone helpers for any surface a
|
|
135
|
+
convenience method does not cover.
|
|
136
|
+
|
|
137
|
+
`assertExtensionCapabilityUsage(activation, { declared })` is the least-privilege
|
|
138
|
+
counterpart of the per-surface `assertRegistered*` helpers: pass the same
|
|
139
|
+
capabilities as your `manifest.capabilities` and it fails the test when the
|
|
140
|
+
manifest grants a capability the extension never registers against. Use
|
|
141
|
+
`allowUnused` for capabilities a runtime registers only behind a config flag.
|
|
142
|
+
|
|
143
|
+
`deactivateExtensionForTest(module, options)` is the teardown counterpart to
|
|
144
|
+
`activateExtensionForTest`: it runs pm's real `deactivateExtensions` engine
|
|
145
|
+
(including the bounded per-hook timeout and best-effort failure capture) over the
|
|
146
|
+
module and returns the `ExtensionDeactivationResult`, so a package can prove its
|
|
147
|
+
`deactivate` releases the resources `activate` opened. `assertExtensionDeactivated(result)`
|
|
148
|
+
asserts the single-extension happy path (one extension deactivated, none failed)
|
|
149
|
+
by default; pass `{ deactivated, failed }` to assert other counts. Forward the
|
|
150
|
+
`activation` result and `deactivateTimeoutMs` to mirror real host teardown.
|
|
151
|
+
|
|
152
|
+
`runRegisteredCommandForTest(activation.commands, { command, args, options, global, pmRoot })`
|
|
153
|
+
is the "invoke" verb that completes the package-author testing loop —
|
|
154
|
+
`activateExtensionForTest` → `assertRegisteredCommandContract` → **run** →
|
|
155
|
+
`deactivateExtensionForTest`. It dispatches a registered command handler through
|
|
156
|
+
pm's real engine and returns the `CommandHandlerResult`, so a test can assert
|
|
157
|
+
*behavior* (`result.result`) rather than only that the command is wired. The
|
|
158
|
+
`CommandHandlerContext` is built with agent-safe global defaults
|
|
159
|
+
(`{ json: true, quiet: true, noPager: true }`) that callers may override. A clean
|
|
160
|
+
run yields `{ handled: true, result, warnings: [] }`; a handler that throws a
|
|
161
|
+
non-exit error yields `{ handled: false, warnings: [code], errorMessage }` so the
|
|
162
|
+
failure can be asserted, while one that throws an error carrying a numeric
|
|
163
|
+
`exitCode` propagates the throw. An unregistered command throws a descriptive
|
|
164
|
+
error listing the available handler command paths. Because
|
|
165
|
+
`registerImporter`/`registerExporter` register handlers under `"<name> import"` /
|
|
166
|
+
`"<name> export"`, the same helper exercises importer and exporter handlers too.
|
|
167
|
+
|
|
168
|
+
The remaining runtime surfaces an extension can register have matching invoke
|
|
169
|
+
helpers, so the "invoke" verb covers the whole command pipeline — not just
|
|
170
|
+
command handlers:
|
|
171
|
+
|
|
172
|
+
- `runRegisteredHookForTest(activation.hooks, { kind, context })` fires every
|
|
173
|
+
registered lifecycle hook of a `kind` (`before_command` | `after_command` |
|
|
174
|
+
`on_read` | `on_write` | `on_index`) through pm's real hook runner and returns
|
|
175
|
+
the warnings array (`[]` = clean; a thrown hook contributes one
|
|
176
|
+
`extension_hook_failed:*` warning while the others still run). The `context` is
|
|
177
|
+
type-safe per `kind`.
|
|
178
|
+
- `runRegisteredParserOverrideForTest(activation.parsers, context)` returns the
|
|
179
|
+
rewritten `ParserOverrideResult` (args/options/global the override produces
|
|
180
|
+
before dispatch).
|
|
181
|
+
- `runRegisteredPreflightOverrideForTest(activation.preflight, context)` returns
|
|
182
|
+
the `PreflightOverrideResult` (the migration/format gate decision).
|
|
183
|
+
- `runRegisteredCommandOverrideForTest(activation.commands, context)` returns the
|
|
184
|
+
`CommandOverrideResult` (the transformed command result payload).
|
|
185
|
+
- `runRegisteredRendererOverrideForTest(activation.renderers, context)` returns
|
|
186
|
+
the `RendererOverrideResult` (the custom string rendered for an output format).
|
|
187
|
+
- `runRegisteredServiceOverrideForTest(activation.services, context)` returns the
|
|
188
|
+
`ServiceOverrideResult` (how the override handles an internal service payload).
|
|
189
|
+
|
|
190
|
+
Each override helper guards that a matching override is registered for the target
|
|
191
|
+
(command / format / service), so a typo surfaces as a descriptive error rather
|
|
192
|
+
than a silent `overridden: false` / `handled: false`.
|
|
193
|
+
|
|
194
|
+
The *executable registration* surfaces — search providers, vector store
|
|
195
|
+
adapters, schema migrations, importers, and exporters — also have invoke helpers,
|
|
196
|
+
so every executable register\* method has both an `assertRegistered*` and a
|
|
197
|
+
`runRegistered*ForTest` counterpart. Each exercises the real registered behavior,
|
|
198
|
+
not a re-implementation, but along two execution paths that mirror how the host
|
|
199
|
+
runs them. Providers, adapters, and migrations are resolved through the same
|
|
200
|
+
runtime resolver the host uses and invoked via their `runtime_definition` (the
|
|
201
|
+
clone that preserves live functions). Importers and exporters have no standalone
|
|
202
|
+
`runtime_definition` — `registerImporter`/`registerExporter` wrap their handler
|
|
203
|
+
into a command path, so their helpers resolve by name and dispatch through the
|
|
204
|
+
command runner instead, returning a `CommandHandlerResult`:
|
|
205
|
+
|
|
206
|
+
- `runRegisteredSearchProviderForTest(activation.registrations, { provider, operation, context })`
|
|
207
|
+
resolves a registered provider by name (case-insensitive, last registration
|
|
208
|
+
wins) and invokes one `operation` — `query`, `embed`, `embedBatch`,
|
|
209
|
+
`queryExpansion`, or `rerank` — returning that operation's result. The
|
|
210
|
+
`context` and return type are inferred from `operation`, and the camelCase /
|
|
211
|
+
snake_case spellings the host accepts (`embedBatch`/`embed_batch`,
|
|
212
|
+
`queryExpansion`/`query_expansion`) both resolve.
|
|
213
|
+
- `runRegisteredVectorStoreAdapterForTest(activation.registrations, { adapter, operation, context })`
|
|
214
|
+
resolves a registered adapter by name and invokes `query` (returns
|
|
215
|
+
`VectorStoreQueryHit[]`), `upsert`, or `delete`.
|
|
216
|
+
- `runRegisteredMigrationForTest(activation.registrations, { migration, extensionName?, pmRoot? })`
|
|
217
|
+
resolves a registered migration by id and invokes its `run` with a context
|
|
218
|
+
mirroring the host's (`command: "migration"`, the registering extension's
|
|
219
|
+
layer/name, the supplied `pmRoot`, and the migration's normalized status),
|
|
220
|
+
returning whatever `run` returns. Unlike the host — which skips applied
|
|
221
|
+
migrations and folds a throw into a warning — it always invokes `run` and lets a
|
|
222
|
+
throw propagate, so both success and failure are assertable.
|
|
223
|
+
- `runRegisteredImporterForTest(activation, { importer, extensionName?, args?, options?, global?, pmRoot? })`
|
|
224
|
+
and `runRegisteredExporterForTest(activation, { exporter, ... })` resolve a
|
|
225
|
+
registered importer/exporter by name, derive the `"<name> import"` /
|
|
226
|
+
`"<name> export"` command path internally — so authors never hand-build it — and
|
|
227
|
+
validate that the name is genuinely a registered importer/exporter before
|
|
228
|
+
dispatching. They take the whole `activation` because resolution spans two
|
|
229
|
+
sub-registries (`registrations` proves it exists, `commands` holds the wrapped
|
|
230
|
+
handler), and they return the command runner's `CommandHandlerResult` verbatim,
|
|
231
|
+
so `handled`/`warnings`/`errorMessage` semantics and `exitCode` propagation match
|
|
232
|
+
invoking the importer/exporter as a command.
|
|
233
|
+
|
|
234
|
+
Each surface helper guards that the named provider / adapter / migration /
|
|
235
|
+
importer / exporter is registered (and, for providers and adapters, implements the
|
|
236
|
+
requested operation), so a typo surfaces as a descriptive error rather than a
|
|
237
|
+
silent no-op. All invoke helpers are `async`, so a test always `await`s them.
|
|
238
|
+
|
|
239
|
+
`describeExtensionActivation(activation, { extensionName })` is the **describe**
|
|
240
|
+
(enumerate-all) verb that complements the `assertRegistered*` (verify-one) and
|
|
241
|
+
`runRegistered*ForTest` (invoke-one) helpers. The activation result already
|
|
242
|
+
carries per-surface *counts*; this returns the *names*. It walks every
|
|
243
|
+
sub-registry once and returns a flat `ExtensionActivationSummary` whose arrays
|
|
244
|
+
are de-duplicated and locale-sorted (except `hooks`, emitted in canonical
|
|
245
|
+
lifecycle order to mirror `hook_counts`) of every registered surface's
|
|
246
|
+
identifiers — command paths, hook kinds, item-type /
|
|
247
|
+
field names, migration ids, importer / exporter / provider / adapter names,
|
|
248
|
+
overridden service names and renderer formats, flag target-commands, and the
|
|
249
|
+
preflight-override count — plus the `capabilities` those surfaces exercise. Two
|
|
250
|
+
uses:
|
|
251
|
+
|
|
252
|
+
```ts
|
|
253
|
+
import { describeExtensionActivation } from "@unbrained/pm-cli/sdk/testing";
|
|
254
|
+
|
|
255
|
+
const summary = describeExtensionActivation(activation);
|
|
256
|
+
// Least-privilege check: assert the WHOLE registration surface in one deepEqual.
|
|
257
|
+
assert.deepEqual(summary.commands, ["greet hello"]);
|
|
258
|
+
assert.deepEqual(summary.hooks, ["after_command"]);
|
|
259
|
+
assert.deepEqual(summary.capabilities, ["commands", "hooks"]);
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Without `extensionName` the summary unions every extension in the activation;
|
|
263
|
+
with it (matched case-insensitively after trimming, like
|
|
264
|
+
`collectUsedExtensionCapabilities`) only that extension's registrations
|
|
265
|
+
contribute. The three command fields capture distinct dimensions and can
|
|
266
|
+
overlap: `commands` lists definitions declared via `registerCommand(definition)`,
|
|
267
|
+
`command_handlers` lists every command path backed by an extension handler (a
|
|
268
|
+
superset that also includes the synthesized `"<name> import"` / `"<name> export"`
|
|
269
|
+
importer/exporter paths), and `command_overrides` lists built-in commands
|
|
270
|
+
replaced via `registerCommand(name, override)`. For agents, one call returns the
|
|
271
|
+
entire surface instead of traversing fifteen-plus sub-registries — keeping the context
|
|
272
|
+
window lean ("project management = context management").
|
|
273
|
+
|
|
274
|
+
The same verb is reachable from the CLI and MCP without writing a test:
|
|
275
|
+
`pm extension describe [name]` / `pm package describe [name]` (and `pm_run` with
|
|
276
|
+
`action: "extension"`/`"package"` and `describe: true`) activate the workspace's
|
|
277
|
+
extensions and return each loaded extension's `ExtensionActivationSummary` under
|
|
278
|
+
`details.extensions[].surfaces`, plus a deduplicated `details.union`. Omit the name
|
|
279
|
+
to map every loaded package; pass one to scope to it. This is the agent-facing answer
|
|
280
|
+
to "what does this installed package add to my context?" — distinct from
|
|
281
|
+
`pm package doctor` (errors/policy) and `pm package manage` (update metadata), which
|
|
282
|
+
report only command/action paths, not the full registration surface.
|
|
93
283
|
|
|
94
284
|
Commander option contract exports:
|
|
95
285
|
|
|
@@ -116,9 +306,17 @@ Extension runtime contract exports:
|
|
|
116
306
|
- `PM_EXTENSION_TRUST_MODE_CONTRACTS`
|
|
117
307
|
- `PM_EXTENSION_SANDBOX_PROFILE_CONTRACTS`
|
|
118
308
|
|
|
309
|
+
Least-privilege capability reconciliation exports (map declared capabilities to
|
|
310
|
+
the registration surfaces a package actually exercises at activation):
|
|
311
|
+
|
|
312
|
+
- `EXTENSION_CAPABILITY_REGISTRATION_SURFACES`
|
|
313
|
+
- `collectUsedExtensionCapabilities`
|
|
314
|
+
- `reconcileExtensionCapabilityUsage`
|
|
315
|
+
|
|
119
316
|
Common types:
|
|
120
317
|
|
|
121
318
|
- `ExtensionApi`
|
|
319
|
+
- `ExtensionActivationSummary`
|
|
122
320
|
- `ExtensionManifest`
|
|
123
321
|
- `ExtensionManifestEngines`
|
|
124
322
|
- `CommandDefinition`
|
|
@@ -196,26 +394,18 @@ assertPackageManifest(manifest, {
|
|
|
196
394
|
```
|
|
197
395
|
|
|
198
396
|
Package tests can also assert extension registrations without importing private
|
|
199
|
-
loader internals.
|
|
200
|
-
the
|
|
397
|
+
loader internals. Prefer `createExtensionTestHarness` — its `assert*`/`run*`
|
|
398
|
+
methods bind to the right sub-registry for you:
|
|
201
399
|
|
|
202
400
|
```ts
|
|
203
|
-
import {
|
|
204
|
-
activateExtensionForTest,
|
|
205
|
-
assertRegisteredCommandContract,
|
|
206
|
-
assertRegisteredFlags,
|
|
207
|
-
} from "@unbrained/pm-cli/sdk/testing";
|
|
401
|
+
import { createExtensionTestHarness } from "@unbrained/pm-cli/sdk/testing";
|
|
208
402
|
|
|
209
|
-
const
|
|
403
|
+
const ext = await createExtensionTestHarness(extensionModule, { capabilities: ["commands", "schema"] });
|
|
210
404
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
assertRegisteredFlags(activation.registrations, {
|
|
216
|
-
targetCommand: "list",
|
|
217
|
-
flags: ["--incident-filter"],
|
|
218
|
-
});
|
|
405
|
+
ext.assertCommandContract({ command: "incident triage", flags: ["--severity"] });
|
|
406
|
+
ext.assertFlags({ targetCommand: "list", flags: ["--incident-filter"] });
|
|
407
|
+
const { result } = await ext.runCommand({ command: "incident triage", options: { severity: "high" } });
|
|
408
|
+
await ext.deactivate();
|
|
219
409
|
```
|
|
220
410
|
|
|
221
411
|
For provider-safe schemas, use `PM_PROVIDER_TOOL_PARAMETERS_SCHEMA`. It is flat and avoids advanced schema constructs such as root `oneOf`.
|
|
@@ -282,6 +472,16 @@ Manifest:
|
|
|
282
472
|
"version": "0.1.0",
|
|
283
473
|
"entry": "./index.js",
|
|
284
474
|
"pm_min_version": "2026.5.31",
|
|
475
|
+
"trusted": true,
|
|
476
|
+
"sandbox_profile": "strict",
|
|
477
|
+
"permissions": {
|
|
478
|
+
"fs_read": false,
|
|
479
|
+
"fs_write": false,
|
|
480
|
+
"network": false,
|
|
481
|
+
"env_read": false,
|
|
482
|
+
"env_write": false,
|
|
483
|
+
"process_spawn": false
|
|
484
|
+
},
|
|
285
485
|
"capabilities": ["commands"]
|
|
286
486
|
}
|
|
287
487
|
```
|
|
@@ -300,11 +500,27 @@ Manifest typing also accepts optional `engines` metadata:
|
|
|
300
500
|
```
|
|
301
501
|
|
|
302
502
|
Use `pm_min_version` for the loader gate. Keep `engines` as package-manager and tooling metadata.
|
|
503
|
+
For pure command packages, keep `trusted: true`, `sandbox_profile: "strict"`, and all six permissions set to `false`; relax only the permission keys the package actually needs and verify the result with `pm package doctor --project --detail deep --trace`.
|
|
303
504
|
|
|
304
505
|
For a complete commands-capability package that combines `registerCommand`,
|
|
305
506
|
`registerFlags`, and `registerParser`, see the first-party
|
|
306
507
|
[pm-command-kit exemplar](../packages/pm-command-kit/README.md).
|
|
307
508
|
|
|
509
|
+
For a generated starter, use `pm package init ./my-package`. Pass
|
|
510
|
+
`--capability hooks` to scaffold a command plus an `afterCommand` lifecycle
|
|
511
|
+
reactor and a runnable `node:test` file that exercises
|
|
512
|
+
`activateExtensionForTest`, `assertRegisteredHook`, `runRegisteredHookForTest`,
|
|
513
|
+
and `deactivateExtensionForTest`. Pass `--capability search` to scaffold a
|
|
514
|
+
command plus a deterministic search provider/vector-store adapter pair and a
|
|
515
|
+
runnable `node:test` file that exercises `assertRegisteredSearchProvider`,
|
|
516
|
+
`assertRegisteredVectorStoreAdapter`, `runRegisteredSearchProviderForTest`, and
|
|
517
|
+
`runRegisteredVectorStoreAdapterForTest`. Pass `--capability importers` to
|
|
518
|
+
scaffold paired import/export commands with example flag metadata and a runnable
|
|
519
|
+
`node:test` file that exercises `assertRegisteredImporter`,
|
|
520
|
+
`assertRegisteredExporter`, `runRegisteredImporterForTest`, and
|
|
521
|
+
`runRegisteredExporterForTest`; the generated manifest declares both `importers`
|
|
522
|
+
and `schema` because extension flag metadata is schema-governed.
|
|
523
|
+
|
|
308
524
|
## Self-Identity and Lifecycle
|
|
309
525
|
|
|
310
526
|
`activate(api)` receives a read-only `api.extension` describing the extension it
|
|
@@ -410,6 +626,153 @@ import { createPmCliExpectedError } from "@unbrained/pm-cli/sdk/runtime";
|
|
|
410
626
|
|
|
411
627
|
`PM_CLI_PACKAGE_ROOT` is reserved for first-party packages bundled inside this repository. Those packages use it to locate the running CLI's `dist/sdk/runtime.js` before they are installed as independent npm packages. External packages must not depend on `PM_CLI_PACKAGE_ROOT`, `dist/` paths, or `src/core/...`; declare `@unbrained/pm-cli` as a dependency or peer dependency and import the public SDK subpaths instead. When pm installs a registry package, it links that dependency to the running host CLI so the package gets the active SDK without downloading a second CLI copy into the project.
|
|
412
628
|
|
|
629
|
+
## Authoring Builders
|
|
630
|
+
|
|
631
|
+
Tracked: [pm-12tj](../.agents/pm/features/pm-12tj.toon) (design rationale: ADR [pm-3mph](../.agents/pm/decisions/pm-3mph.toon)).
|
|
632
|
+
|
|
633
|
+
The `define*` builders are the authoring half of the `author → register → test`
|
|
634
|
+
loop: they type a registration definition where you write it, before it ever
|
|
635
|
+
reaches `api.register*`. Each is a zero-cost identity function (it returns its
|
|
636
|
+
argument unchanged), exactly like `defineExtension` and the wider
|
|
637
|
+
`defineConfig`/`defineComponent` ecosystem convention — the value is entirely at
|
|
638
|
+
the type level.
|
|
639
|
+
|
|
640
|
+
This matters most in **plain-JavaScript packages** (the default `pm package init`
|
|
641
|
+
scaffold). A bare `const cmd = { ... }` is unchecked because JS has no type
|
|
642
|
+
annotations; wrapping it in a builder restores full contract checking and infers
|
|
643
|
+
the nested handler's `context` parameter through the editor's TypeScript language
|
|
644
|
+
service. It also lets you colocate, export, reuse, and unit-test a definition
|
|
645
|
+
apart from `activate`:
|
|
646
|
+
|
|
647
|
+
```js
|
|
648
|
+
import { defineCommand, defineAfterCommandHook } from "@unbrained/pm-cli/sdk";
|
|
649
|
+
|
|
650
|
+
// `context` is inferred even though this is a .js file with no annotations.
|
|
651
|
+
export const greetCommand = defineCommand({
|
|
652
|
+
name: "greet hello",
|
|
653
|
+
action: "greet-hello",
|
|
654
|
+
description: "Say hello.",
|
|
655
|
+
run: (context) => ({ greeting: `hi ${context.args[0] ?? "world"}` }),
|
|
656
|
+
});
|
|
657
|
+
|
|
658
|
+
export const auditHook = defineAfterCommandHook((context) => {
|
|
659
|
+
if (!context.ok) return;
|
|
660
|
+
// react to context.affected — "project management = context management"
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
export function activate(api) {
|
|
664
|
+
api.registerCommand(greetCommand);
|
|
665
|
+
api.hooks.afterCommand(auditHook);
|
|
666
|
+
}
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
Object-definition builders (`defineExtensionManifest`, `defineCommand`,
|
|
670
|
+
`defineFlag`, `defineItemType`, `defineItemField`, `defineMigration`,
|
|
671
|
+
`defineSearchProvider`, `defineVectorStoreAdapter`) preserve the narrow literal
|
|
672
|
+
type. `defineExtensionManifest` additionally contract-checks the in-module
|
|
673
|
+
manifest mirror where it is authored and pairs with `deriveExtensionCapabilities`
|
|
674
|
+
(see [Declarative Authoring](#declarative-authoring)). Function-definition
|
|
675
|
+
builders (`defineCommandOverride`, `defineParserOverride`,
|
|
676
|
+
`definePreflightOverride`, `defineServiceOverride`, `defineRendererOverride`,
|
|
677
|
+
`defineImporter`, `defineExporter`, and the five hook builders
|
|
678
|
+
`defineBeforeCommandHook` / `defineAfterCommandHook` / `defineOnWriteHook` /
|
|
679
|
+
`defineOnReadHook` / `defineOnIndexHook`) are non-generic so a bare arrow's
|
|
680
|
+
parameter is contextually typed instead of falling back to `any`. The
|
|
681
|
+
[`assertRegistered*`](#testing-helpers) helpers below verify these same
|
|
682
|
+
definitions once registered.
|
|
683
|
+
|
|
684
|
+
## Declarative Authoring
|
|
685
|
+
|
|
686
|
+
Tracked: [pm-iqq0](../.agents/pm/features/pm-iqq0.toon).
|
|
687
|
+
|
|
688
|
+
`composeExtension` is the capstone of the `author → register → test` loop. Instead
|
|
689
|
+
of hand-wiring each `api.register*` call inside an imperative `activate(api)`
|
|
690
|
+
body — calling the right method, in the right order, without forgetting one —
|
|
691
|
+
describe **what** to register as a plain `ExtensionBlueprint` object and let the
|
|
692
|
+
SDK generate the `activate` for you. Every field is optional; populate the
|
|
693
|
+
surfaces you use (ideally with `define*`-authored definitions) and leave the rest
|
|
694
|
+
out:
|
|
695
|
+
|
|
696
|
+
```js
|
|
697
|
+
import { composeExtension, defineCommand, deriveExtensionCapabilities } from "@unbrained/pm-cli/sdk";
|
|
698
|
+
|
|
699
|
+
const echo = defineCommand({
|
|
700
|
+
name: "command-kit echo",
|
|
701
|
+
action: "command-kit-echo",
|
|
702
|
+
description: "Echo a message as structured output.",
|
|
703
|
+
run: (context) => ({ message: context.args.join(" ") }),
|
|
704
|
+
});
|
|
705
|
+
|
|
706
|
+
const blueprint = {
|
|
707
|
+
commands: [echo],
|
|
708
|
+
parsers: { "command-kit echo": (context) => ({ options: context.options }) },
|
|
709
|
+
flags: { list: [{ long: "--kit-note", value_type: "string", value_name: "text" }] },
|
|
710
|
+
};
|
|
711
|
+
|
|
712
|
+
// The generated `activate` registers commands → overrides → flags → parsers →
|
|
713
|
+
// renderers → services → preflights → item types → item fields → migrations →
|
|
714
|
+
// search providers → vector store adapters → importers → exporters → hooks, then
|
|
715
|
+
// awaits any imperative `activate` you also pass (an escape hatch run last).
|
|
716
|
+
export default composeExtension(blueprint);
|
|
717
|
+
```
|
|
718
|
+
|
|
719
|
+
`deriveExtensionCapabilities(blueprint)` returns the exact least-privilege
|
|
720
|
+
capability set the blueprint exercises (sorted, de-duplicated), so you can author
|
|
721
|
+
`manifest.json` `capabilities` with zero declared-but-unused or used-but-undeclared
|
|
722
|
+
drift. It is the author-time inverse of the runtime
|
|
723
|
+
[`reconcileExtensionCapabilityUsage`](#capability-requirements) check, and the set
|
|
724
|
+
it returns is the set `composeExtension`'s generated `activate` requires — they
|
|
725
|
+
agree by construction:
|
|
726
|
+
|
|
727
|
+
```js
|
|
728
|
+
deriveExtensionCapabilities(blueprint); // ["commands", "parser", "schema"]
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
The blueprint's record-keyed fields (`commandOverrides`, `flags`, `parsers`,
|
|
732
|
+
`renderers`, `services`) map a routing key to its handler, mirroring the
|
|
733
|
+
two-argument `api.register*` overloads; `hooks` groups the five lifecycle kinds.
|
|
734
|
+
`composeExtension` is a pure assembler: it does not validate definitions —
|
|
735
|
+
per-surface contract enforcement stays in `api.register*` and the loader, so a
|
|
736
|
+
malformed definition surfaces the same activation diagnostic as a hand-written
|
|
737
|
+
`activate`. The bundled first-party packages intentionally keep import-free
|
|
738
|
+
hand-written `activate` bodies so they load in extension-only installs; reach for
|
|
739
|
+
`composeExtension` in npm package-mode authoring where the SDK is a dependency.
|
|
740
|
+
|
|
741
|
+
### Author-time introspection and preflight
|
|
742
|
+
|
|
743
|
+
Tracked: [pm-tlpv](../.agents/pm/features/pm-tlpv.toon),
|
|
744
|
+
[pm-9ect](../.agents/pm/features/pm-9ect.toon),
|
|
745
|
+
[pm-4oio](../.agents/pm/decisions/pm-4oio.toon).
|
|
746
|
+
|
|
747
|
+
Two pure, no-activation helpers complete the loop, so a blueprint is fully
|
|
748
|
+
inspectable and verifiable before it is ever loaded — the author-time inverse of
|
|
749
|
+
the runtime guardrails (the same discipline as `deriveExtensionCapabilities`
|
|
750
|
+
inverting [`reconcileExtensionCapabilityUsage`](#capability-requirements)):
|
|
751
|
+
|
|
752
|
+
```js
|
|
753
|
+
import { describeExtensionBlueprint, lintExtensionBlueprint } from "@unbrained/pm-cli/sdk";
|
|
754
|
+
|
|
755
|
+
// describeExtensionBlueprint returns the same ExtensionActivationSummary shape as
|
|
756
|
+
// the runtime describeExtensionActivation — but from the blueprint data alone, no
|
|
757
|
+
// activation. It is to the named surfaces what deriveExtensionCapabilities is to
|
|
758
|
+
// the capability set.
|
|
759
|
+
describeExtensionBlueprint(blueprint).command_handlers; // ["command-kit echo", ...]
|
|
760
|
+
|
|
761
|
+
// lintExtensionBlueprint preflights for the footguns activation would otherwise
|
|
762
|
+
// surface late: a capability a surface exercises but the manifest omits is an
|
|
763
|
+
// `error` (the loader throws extension_capability_missing); a declared-but-unused
|
|
764
|
+
// capability, a duplicate command, a command/override conflict, and a present-but-
|
|
765
|
+
// empty surface are `warning`s. Pass declaredCapabilities or set manifest.capabilities.
|
|
766
|
+
const report = lintExtensionBlueprint(blueprint, { declaredCapabilities: ["commands", "parser", "schema"] });
|
|
767
|
+
report.ok; // false if any error-severity finding
|
|
768
|
+
report.findings; // [{ code, severity, message, capability?/command?/field? }, ...]
|
|
769
|
+
```
|
|
770
|
+
|
|
771
|
+
Both read only the declarative data, so the imperative `activate` escape hatch is
|
|
772
|
+
invisible to them — a blueprint that registers everything through that hatch
|
|
773
|
+
summarizes as empty and lints clean. In a package test, `assertExtensionBlueprint`
|
|
774
|
+
(below) turns the lint into a one-line CI guard.
|
|
775
|
+
|
|
413
776
|
## Testing Helpers
|
|
414
777
|
|
|
415
778
|
Package tests can assert registration contracts without depending on Vitest-specific
|
|
@@ -457,6 +820,96 @@ guardrails, but it does not discover files or install packages. Use it for unit
|
|
|
457
820
|
tests of extension registration shape; keep `pm package doctor` and runtime
|
|
458
821
|
contracts in integration tests.
|
|
459
822
|
|
|
823
|
+
For declarative (`composeExtension`) packages, `assertExtensionBlueprint(blueprint, options?)`
|
|
824
|
+
is the `assert*` family member that preflights the blueprint *without* activating
|
|
825
|
+
it — it runs `lintExtensionBlueprint` and throws if any finding is error-severity
|
|
826
|
+
(today: a capability a surface exercises but the declared set omits, which would
|
|
827
|
+
fail activation with `extension_capability_missing`). It returns the full
|
|
828
|
+
`ExtensionBlueprintLintResult` on success so a test can still inspect advisory
|
|
829
|
+
warnings:
|
|
830
|
+
|
|
831
|
+
```ts
|
|
832
|
+
import { assertExtensionBlueprint } from "@unbrained/pm-cli/sdk/testing";
|
|
833
|
+
|
|
834
|
+
// Throws if the blueprint and its declared capabilities have drifted; otherwise
|
|
835
|
+
// returns the lint result (including any non-blocking warnings) for inspection.
|
|
836
|
+
const report = assertExtensionBlueprint(blueprint);
|
|
837
|
+
```
|
|
838
|
+
|
|
839
|
+
Invoke a registered command handler to assert its behavior (not just that it was
|
|
840
|
+
registered). `runRegisteredCommandForTest` dispatches through pm's real engine and
|
|
841
|
+
returns the `CommandHandlerResult`:
|
|
842
|
+
|
|
843
|
+
```ts
|
|
844
|
+
import { runRegisteredCommandForTest } from "@unbrained/pm-cli/sdk/testing";
|
|
845
|
+
|
|
846
|
+
const invocation = await runRegisteredCommandForTest(activation.commands, {
|
|
847
|
+
command: "hello",
|
|
848
|
+
options: { name: "ada" },
|
|
849
|
+
});
|
|
850
|
+
|
|
851
|
+
// invocation.handled === true; invocation.result is the handler's return value.
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
Importers and exporters get dedicated name-based helpers so tests never hand-build
|
|
855
|
+
the `"<name> import"` / `"<name> export"` command path. Pass the whole `activation`
|
|
856
|
+
and the registration name:
|
|
857
|
+
|
|
858
|
+
```ts
|
|
859
|
+
import { runRegisteredImporterForTest, runRegisteredExporterForTest } from "@unbrained/pm-cli/sdk/testing";
|
|
860
|
+
|
|
861
|
+
const imported = await runRegisteredImporterForTest(activation, {
|
|
862
|
+
importer: "csv",
|
|
863
|
+
options: { rows: 3 },
|
|
864
|
+
});
|
|
865
|
+
const exported = await runRegisteredExporterForTest(activation, { exporter: "csv" });
|
|
866
|
+
|
|
867
|
+
// Both return a CommandHandlerResult: imported.result is the importer's return value.
|
|
868
|
+
```
|
|
869
|
+
|
|
870
|
+
Fire a registered lifecycle hook to assert its behavior (the `context` is
|
|
871
|
+
type-safe per `kind`). A clean run returns `[]`; a hook that throws contributes a
|
|
872
|
+
single `extension_hook_failed:*` warning while the others still run:
|
|
873
|
+
|
|
874
|
+
```ts
|
|
875
|
+
import { runRegisteredHookForTest } from "@unbrained/pm-cli/sdk/testing";
|
|
876
|
+
|
|
877
|
+
const warnings = await runRegisteredHookForTest(activation.hooks, {
|
|
878
|
+
kind: "after_command",
|
|
879
|
+
context: { command: "close", args: ["pm-1a2b"], pm_root: "", ok: true },
|
|
880
|
+
});
|
|
881
|
+
// warnings === [] when every after_command hook ran cleanly.
|
|
882
|
+
```
|
|
883
|
+
|
|
884
|
+
The override surfaces have parallel invoke helpers that delegate to pm's real
|
|
885
|
+
runners and return the override result verbatim, after guarding that a matching
|
|
886
|
+
override is registered for the target (command / format / service):
|
|
887
|
+
|
|
888
|
+
```ts
|
|
889
|
+
import {
|
|
890
|
+
runRegisteredParserOverrideForTest,
|
|
891
|
+
runRegisteredCommandOverrideForTest,
|
|
892
|
+
runRegisteredRendererOverrideForTest,
|
|
893
|
+
runRegisteredServiceOverrideForTest,
|
|
894
|
+
runRegisteredPreflightOverrideForTest,
|
|
895
|
+
} from "@unbrained/pm-cli/sdk/testing";
|
|
896
|
+
|
|
897
|
+
const parsed = await runRegisteredParserOverrideForTest(activation.parsers, {
|
|
898
|
+
command: "deploy",
|
|
899
|
+
args: ["staging"],
|
|
900
|
+
options: {},
|
|
901
|
+
global: {},
|
|
902
|
+
pm_root: "",
|
|
903
|
+
});
|
|
904
|
+
// parsed.overridden === true; parsed.context holds the rewritten args/options.
|
|
905
|
+
|
|
906
|
+
const rendered = await runRegisteredRendererOverrideForTest(activation.renderers, {
|
|
907
|
+
format: "toon",
|
|
908
|
+
result: { id: "pm-1a2b" },
|
|
909
|
+
});
|
|
910
|
+
// rendered.rendered is the custom string the override produced.
|
|
911
|
+
```
|
|
912
|
+
|
|
460
913
|
Assert a command registration contract:
|
|
461
914
|
|
|
462
915
|
```ts
|
|
@@ -585,6 +1038,39 @@ Together these complete the SDK assertion surface: every extension `register*`
|
|
|
585
1038
|
method now has a matching `assertRegistered*` helper, so packages can prove any
|
|
586
1039
|
registration without importing private registry internals.
|
|
587
1040
|
|
|
1041
|
+
The three executable registration surfaces add `runRegistered*ForTest` invoke
|
|
1042
|
+
helpers on top of those assertions, so a package can exercise the real behavior of
|
|
1043
|
+
a custom provider, adapter, or migration:
|
|
1044
|
+
|
|
1045
|
+
```ts
|
|
1046
|
+
import {
|
|
1047
|
+
runRegisteredSearchProviderForTest,
|
|
1048
|
+
runRegisteredVectorStoreAdapterForTest,
|
|
1049
|
+
runRegisteredMigrationForTest,
|
|
1050
|
+
} from "@unbrained/pm-cli/sdk/testing";
|
|
1051
|
+
|
|
1052
|
+
// Invoke a registered provider's semantic query (or embed / embedBatch /
|
|
1053
|
+
// queryExpansion / rerank); the result type follows `operation`.
|
|
1054
|
+
const hits = await runRegisteredSearchProviderForTest(activation.registrations, {
|
|
1055
|
+
provider: "semantic-local",
|
|
1056
|
+
operation: "query",
|
|
1057
|
+
context: { query: "calendar", mode: "semantic", tokens: ["calendar"], options: {}, settings, documents },
|
|
1058
|
+
});
|
|
1059
|
+
|
|
1060
|
+
// Invoke a registered adapter's upsert / query / delete.
|
|
1061
|
+
await runRegisteredVectorStoreAdapterForTest(activation.registrations, {
|
|
1062
|
+
adapter: "pinecone",
|
|
1063
|
+
operation: "upsert",
|
|
1064
|
+
context: { points: [{ id: "pm-1", vector }], settings },
|
|
1065
|
+
});
|
|
1066
|
+
|
|
1067
|
+
// Invoke a registered migration's run with a host-shaped context.
|
|
1068
|
+
await runRegisteredMigrationForTest(activation.registrations, {
|
|
1069
|
+
migration: "backfill-severity",
|
|
1070
|
+
pmRoot,
|
|
1071
|
+
});
|
|
1072
|
+
```
|
|
1073
|
+
|
|
588
1074
|
The bundled `pm-lifecycle-hooks` package is the first-party hooks exemplar. It
|
|
589
1075
|
declares only the `hooks` capability and registers a default-inert `afterCommand`
|
|
590
1076
|
hook, so package authors can copy a lifecycle pattern that does not write files,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unbrained/pm-cli",
|
|
3
|
-
"version": "2026.6.
|
|
3
|
+
"version": "2026.6.23",
|
|
4
4
|
"description": "Git-native project management CLI for humans and agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "unbrained",
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
},
|
|
134
134
|
"devDependencies": {
|
|
135
135
|
"@sentry/cli": "^3.5.1",
|
|
136
|
-
"@types/node": "^
|
|
136
|
+
"@types/node": "^20.0.0",
|
|
137
137
|
"@vitest/coverage-v8": "^4.1.9",
|
|
138
138
|
"esbuild": "0.28.1",
|
|
139
139
|
"tsx": "^4.22.4",
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
_testOnly,
|
|
3
|
-
runActivity
|
|
4
|
-
} from "./chunk-5IDI42VV.js";
|
|
5
|
-
import "./chunk-RVHYI7SL.js";
|
|
6
|
-
import "./chunk-HIP7WVTL.js";
|
|
7
|
-
import "./chunk-B473GZWW.js";
|
|
8
|
-
import "./chunk-SX75ADBK.js";
|
|
9
|
-
import "./chunk-7D3SAQXM.js";
|
|
10
|
-
import "./chunk-QGG32QHW.js";
|
|
11
|
-
import "./chunk-FRUFKWNK.js";
|
|
12
|
-
import "./chunk-YCJX76PW.js";
|
|
13
|
-
import "./chunk-HMOADQVT.js";
|
|
14
|
-
export {
|
|
15
|
-
_testOnly,
|
|
16
|
-
runActivity
|
|
17
|
-
};
|
|
18
|
-
//# sourceMappingURL=activity-CIHV64UC.js.map
|