@unbrained/pm-cli 2026.6.21 → 2026.6.22
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 +22 -0
- package/dist/cli/commands/completion.js +5 -3
- package/dist/cli/commands/completion.js.map +1 -1
- 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 +481 -48
- package/dist/cli/commands/extension/scaffold.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +1 -0
- package/dist/cli/commands/extension.js +9 -4
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/help-content.js +16 -4
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/register-setup.js +6 -2
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli-bundle/chunks/{activity-KW3IRP44.js → activity-DXS2XMQU.js} +11 -11
- package/dist/cli-bundle/chunks/activity-NEOI45NX.js +18 -0
- package/dist/cli-bundle/chunks/{aggregate-FIGQEIL3.js → aggregate-IHM4KMQ3.js} +10 -10
- package/dist/cli-bundle/chunks/{aggregate-3ZKQG5SW.js → aggregate-NMYDVQF7.js} +10 -10
- package/dist/cli-bundle/chunks/{append-EWJYJ7CH.js → append-3HY5G7ET.js} +8 -8
- package/dist/cli-bundle/chunks/{append-QEOLX3XB.js → append-K54MDQYC.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-CF55WVVS.js → chunk-25XZN3JD.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-WQ7NIVDK.js → chunk-2LEYMXI6.js} +4 -4
- package/dist/cli-bundle/chunks/chunk-3GL6LTUL.js +643 -0
- package/dist/cli-bundle/chunks/chunk-3GL6LTUL.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-FRUFKWNK.js → chunk-3VLPDG3J.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-C3AZ5ZML.js → chunk-44O4JIN6.js} +13 -13
- package/dist/cli-bundle/chunks/{chunk-J4MYYSOL.js → chunk-47HTJ6BU.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-YCJX76PW.js → chunk-4JXWVHMN.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-37QXHBIB.js → chunk-4SDKF5BG.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-4YJA4LGU.js +646 -0
- package/dist/cli-bundle/chunks/chunk-4YJA4LGU.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-NJHMAJ6N.js → chunk-5SESR24H.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-2EIMPCE4.js → chunk-6FQHNHQQ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-5FIEHKEX.js → chunk-6UPTNMVW.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-FKBDKV7Y.js → chunk-75VEYQJS.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-GMHPNNYG.js → chunk-77VKGH4L.js} +10 -10
- package/dist/cli-bundle/chunks/{chunk-5PCI3UBT.js → chunk-7GCCDXXN.js} +55 -266
- package/dist/cli-bundle/chunks/chunk-7GCCDXXN.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-OFYMIDF2.js → chunk-7MALIV5H.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-A4Z7ZOL5.js → chunk-7MPTFYT3.js} +20 -15
- package/dist/cli-bundle/chunks/chunk-7MPTFYT3.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-RLK7P77C.js → chunk-7PBGTIN3.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-6H4LF7AO.js → chunk-A25LOPRG.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-M5XALUSL.js → chunk-A7E4ZXG2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-7D3SAQXM.js → chunk-AJXYOYJV.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-HCU6WUSY.js → chunk-B2KR24R4.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-2GCDRRIF.js → chunk-C5SWTISA.js} +12 -12
- package/dist/cli-bundle/chunks/{chunk-AIS5PGI3.js → chunk-CLLVBO3I.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-QGG32QHW.js → chunk-CR7KFPAQ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-UV6IYE5U.js → chunk-CWPBGUC7.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-32R4PIC6.js → chunk-D35LTIFR.js} +55 -259
- package/dist/cli-bundle/chunks/chunk-D35LTIFR.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-QQHISQBJ.js → chunk-DBQUQ3AS.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-5QICDWMV.js → chunk-DHBPJ7VG.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-SRYYRVPB.js → chunk-DMT4ODVN.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-PUH4D67U.js → chunk-DU64SZUQ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-C4N5I7ZW.js → chunk-EVPVCE4R.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-3EWSGA7N.js → chunk-FK6MV5F5.js} +12 -12
- package/dist/cli-bundle/chunks/{chunk-NIUEXCFS.js → chunk-GGAXE22C.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-SX75ADBK.js → chunk-GNDHOR64.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-GOZUHWFD.js → chunk-GU7YHKYP.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NXS7ZKAK.js → chunk-GXBSFKSX.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-NJN7LL7U.js → chunk-H6FNDCDI.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-FWPDUYEY.js → chunk-HYQV75IB.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-F5NZWFSW.js → chunk-I367IDZP.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-52OCIDPG.js → chunk-I6XE47J2.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-HIP7WVTL.js → chunk-J2TSPY5L.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-2PKHRP6G.js → chunk-JLSC5NPC.js} +10 -10
- package/dist/cli-bundle/chunks/{chunk-PP2U4NMT.js → chunk-JY25IOEZ.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-Q2J2HJUN.js → chunk-K25UDYJ4.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-SBGXDO7A.js → chunk-KBTREGVO.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-QZTWBFXJ.js → chunk-KK4TQ3ZP.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-434HM6Z5.js → chunk-KL5ELX2X.js} +81 -3
- package/dist/cli-bundle/chunks/chunk-KL5ELX2X.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-NIGXMNNI.js → chunk-KRJJPDUO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-AZMOLBN3.js → chunk-MD7XKVWI.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-6ZXM2XNF.js → chunk-MNGAQB2E.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-3MDHREEV.js → chunk-NIWY4V4Z.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-TKBHZPKD.js → chunk-NKZOJPXK.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-CZPXY7UW.js → chunk-NVUATMTC.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-LEU5GHRC.js → chunk-P7ZU73BO.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-NSBZ2CKF.js → chunk-PCH2JTEO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-B473GZWW.js → chunk-PJS2J7Z4.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-5IDI42VV.js → chunk-QQWEROGS.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-6M4RJS4M.js → chunk-RPRFBXND.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-HMOADQVT.js → chunk-RZZMSY4P.js} +88 -3
- package/dist/cli-bundle/chunks/chunk-RZZMSY4P.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-N5ZJACJ6.js → chunk-SFKQAVZA.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-EBH56IXK.js → chunk-THKDPOS5.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-LUWW7L4B.js → chunk-TIKJAXQW.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-OTHIWLMB.js → chunk-TJABI6PR.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-HC4AWIKT.js → chunk-TRUFOER3.js} +19 -14
- package/dist/cli-bundle/chunks/{chunk-HC4AWIKT.js.map → chunk-TRUFOER3.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-76Z3YSHV.js → chunk-TZQKEBKF.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-PFSRUHDH.js → chunk-UKK2VTTH.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-H7NJZWG2.js → chunk-V4SM4UAL.js} +13 -13
- package/dist/cli-bundle/chunks/{chunk-CZUB4XWO.js → chunk-VB54F347.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-O47BPOPC.js → chunk-WBSYW3NT.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-UPE3CDD7.js → chunk-WQDX7DVG.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-NB3PYLQ6.js → chunk-XKNF3VRJ.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-F7K5GWP3.js → chunk-Y335KFHD.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-D7FYS6PG.js → chunk-Y4BZEND6.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-6CJWZAN7.js → chunk-YATDFWYK.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-UEMNL33O.js → chunk-YJICYNAV.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-Z6T4PQI2.js → chunk-YQSWTVZF.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-RVHYI7SL.js → chunk-YRLLL5TY.js} +8 -8
- package/dist/cli-bundle/chunks/{claim-RC56YUWG.js → claim-MPXNVBZQ.js} +10 -10
- package/dist/cli-bundle/chunks/{claim-THOJ6CMV.js → claim-SKHJDLW6.js} +10 -10
- package/dist/cli-bundle/chunks/{close-SG5MNCVQ.js → close-4RKSL5L6.js} +8 -8
- package/dist/cli-bundle/chunks/close-Z6AI736U.js +15 -0
- package/dist/cli-bundle/chunks/{close-many-DKQLBGLV.js → close-many-AWTPXLHJ.js} +15 -15
- package/dist/cli-bundle/chunks/{close-many-3L3AQZBU.js → close-many-SXODYBDP.js} +15 -15
- package/dist/cli-bundle/chunks/{comments-SKWMDWCW.js → comments-OOH64LWW.js} +10 -10
- package/dist/cli-bundle/chunks/{comments-M7ZOZNBX.js → comments-YYW5P7AG.js} +10 -10
- package/dist/cli-bundle/chunks/{config-OZCUABPB.js → config-3445MCQQ.js} +8 -8
- package/dist/cli-bundle/chunks/{config-7CK62S7T.js → config-LCDMKRB2.js} +8 -8
- package/dist/cli-bundle/chunks/{context-PUG2A7RC.js → context-DZMIBIVP.js} +13 -13
- package/dist/cli-bundle/chunks/{context-OEC366TO.js → context-PJCURODY.js} +13 -13
- package/dist/cli-bundle/chunks/{contracts-3THOLA7L.js → contracts-7YDFEJB3.js} +4 -4
- package/dist/cli-bundle/chunks/{contracts-N65FXEOL.js → contracts-MP2P3HL5.js} +4 -4
- package/dist/cli-bundle/chunks/{copy-JPX7VZCH.js → copy-63IQQRRS.js} +7 -7
- package/dist/cli-bundle/chunks/{copy-6QLHILAC.js → copy-TASIH2AZ.js} +7 -7
- package/dist/cli-bundle/chunks/create-3BV2VA3Q.js +30 -0
- package/dist/cli-bundle/chunks/{create-Y54ZVVZH.js → create-TGSB5GV4.js} +14 -14
- package/dist/cli-bundle/chunks/{delete-63PCMQAJ.js → delete-ARILQQLB.js} +7 -7
- package/dist/cli-bundle/chunks/{delete-GDSMGAGJ.js → delete-ZQKBZYNK.js} +7 -7
- package/dist/cli-bundle/chunks/{deps-T4ZF5G54.js → deps-MSHQR2GY.js} +7 -7
- package/dist/cli-bundle/chunks/{deps-XYQ73XRH.js → deps-NJFJIMQ5.js} +7 -7
- package/dist/cli-bundle/chunks/{docs-C75YIXHC.js → docs-SS4UKYYA.js} +9 -9
- package/dist/cli-bundle/chunks/{docs-EHNPDWUL.js → docs-XK2UVUXX.js} +9 -9
- package/dist/cli-bundle/chunks/{eval-GTENKE24.js → eval-FVZGX5IZ.js} +12 -12
- package/dist/cli-bundle/chunks/{eval-3WKDTRMH.js → eval-JOTG2YHU.js} +12 -12
- package/dist/cli-bundle/chunks/{extension-46NWACO3.js → extension-NLMS47I4.js} +6 -5
- package/dist/cli-bundle/chunks/{extension-D5FDZ2CO.js → extension-OQPS27B4.js} +6 -5
- package/dist/cli-bundle/chunks/{files-X3H7CCBQ.js → files-3EVJQZ2N.js} +9 -9
- package/dist/cli-bundle/chunks/{files-DSZBOSSN.js → files-Y2P6LN5A.js} +9 -9
- package/dist/cli-bundle/chunks/{focus-5STQXDPU.js → focus-D5ZUPTII.js} +8 -8
- package/dist/cli-bundle/chunks/{focus-MDVPOWB5.js → focus-ZPIFTY4R.js} +8 -8
- package/dist/cli-bundle/chunks/{gc-ZMST3WQP.js → gc-LXXDY456.js} +3 -3
- package/dist/cli-bundle/chunks/{gc-ZC7JHBG7.js → gc-RNOEQHSX.js} +3 -3
- package/dist/cli-bundle/chunks/{get-NT7L2HUZ.js → get-Q3SZGQHD.js} +11 -11
- package/dist/cli-bundle/chunks/{get-J2IPJRZW.js → get-W23G7MJX.js} +11 -11
- package/dist/cli-bundle/chunks/{health-WOYBR3KU.js → health-5LHSX365.js} +14 -13
- package/dist/cli-bundle/chunks/{health-WOYBR3KU.js.map → health-5LHSX365.js.map} +1 -1
- package/dist/cli-bundle/chunks/{health-IVMA3XQC.js → health-UDDGJLPP.js} +16 -15
- package/dist/cli-bundle/chunks/{health-IVMA3XQC.js.map → health-UDDGJLPP.js.map} +1 -1
- package/dist/cli-bundle/chunks/{history-RLH2QCRO.js → history-6CZVFIUJ.js} +10 -10
- package/dist/cli-bundle/chunks/history-YRQUD4YM.js +20 -0
- package/dist/cli-bundle/chunks/{history-compact-ZBEBGJM7.js → history-compact-M35PDQ4G.js} +12 -12
- package/dist/cli-bundle/chunks/{history-compact-UXDIFC33.js → history-compact-VWUSQH6Z.js} +12 -12
- package/dist/cli-bundle/chunks/history-redact-27OEOZRZ.js +21 -0
- package/dist/cli-bundle/chunks/{history-redact-P7I7AWMB.js → history-redact-AJGARHT3.js} +11 -11
- package/dist/cli-bundle/chunks/{history-repair-52KINVIK.js → history-repair-5RDMF7K4.js} +12 -12
- package/dist/cli-bundle/chunks/{history-repair-RM5ITLU5.js → history-repair-YUAHIPIN.js} +12 -12
- package/dist/cli-bundle/chunks/init-DWAKYRXI.js +21 -0
- package/dist/cli-bundle/chunks/{init-2BNZOO6F.js → init-HASX3YNJ.js} +11 -10
- package/dist/cli-bundle/chunks/{learnings-W6F3FIPL.js → learnings-JNGUIJDK.js} +10 -10
- package/dist/cli-bundle/chunks/{learnings-YGYVHWJK.js → learnings-M4KA6MQE.js} +10 -10
- package/dist/cli-bundle/chunks/{list-KPAYU5KZ.js → list-5UU2W24O.js} +10 -10
- package/dist/cli-bundle/chunks/{list-K6FPV4J4.js → list-6FMKTIH3.js} +10 -10
- package/dist/cli-bundle/chunks/{notes-YTD6ZILW.js → notes-MODH5CBT.js} +10 -10
- package/dist/cli-bundle/chunks/{notes-PU74EPKV.js → notes-PYCPLA5Y.js} +10 -10
- package/dist/cli-bundle/chunks/{plan-GEQYUCBW.js → plan-DXRIRYRU.js} +14 -14
- package/dist/cli-bundle/chunks/{plan-FNXHXRCI.js → plan-EHQALWSC.js} +14 -14
- package/dist/cli-bundle/chunks/{register-list-query-QI45RMKN.js → register-list-query-QAASVP2J.js} +19 -19
- package/dist/cli-bundle/chunks/{register-list-query-PHWYHENI.js → register-list-query-WE54YJMH.js} +19 -19
- package/dist/cli-bundle/chunks/{register-mutation-YINRTS7L.js → register-mutation-B6DZJTY2.js} +33 -33
- package/dist/cli-bundle/chunks/{register-mutation-X3BUOQEL.js → register-mutation-CPV4C2KR.js} +33 -33
- package/dist/cli-bundle/chunks/{register-operations-E5JEASRK.js → register-operations-AT3BVVX2.js} +32 -32
- package/dist/cli-bundle/chunks/{register-operations-MIDTRW7S.js → register-operations-RC4C3423.js} +32 -32
- package/dist/cli-bundle/chunks/{register-setup-EG2U6CEU.js → register-setup-HXEHMDHE.js} +23 -18
- package/dist/cli-bundle/chunks/register-setup-HXEHMDHE.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-setup-DYBFLEZX.js → register-setup-JSMJEFCJ.js} +24 -19
- package/dist/cli-bundle/chunks/register-setup-JSMJEFCJ.js.map +1 -0
- package/dist/cli-bundle/chunks/{restore-XQYSWBV7.js → restore-FNBV4GWE.js} +11 -11
- package/dist/cli-bundle/chunks/restore-XY4YE2OV.js +19 -0
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-HJMTEXKE.js → scheduling-shortcuts-ECL6GBMZ.js} +14 -14
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-NNT5ASZR.js → scheduling-shortcuts-JRIUREEU.js} +14 -14
- package/dist/cli-bundle/chunks/{schema-TZXW6XWD.js → schema-74YENAJL.js} +9 -9
- package/dist/cli-bundle/chunks/{schema-263RI4WW.js → schema-TCW3I7QR.js} +9 -9
- package/dist/cli-bundle/chunks/{search-SFRJOVDG.js → search-7USZ6XZA.js} +12 -12
- package/dist/cli-bundle/chunks/{search-LECJYSXE.js → search-GNAUE65M.js} +12 -12
- package/dist/cli-bundle/chunks/{stats-VPBGSRQH.js → stats-CVHASAEU.js} +8 -8
- package/dist/cli-bundle/chunks/{stats-N7ER2PNK.js → stats-DQMKJMFT.js} +8 -8
- package/dist/cli-bundle/chunks/{telemetry-PP3FUNBU.js → telemetry-7P5EUWCS.js} +4 -4
- package/dist/cli-bundle/chunks/{telemetry-L6K3BUIQ.js → telemetry-PQTL5YS2.js} +4 -4
- package/dist/cli-bundle/chunks/test-COWPCGBE.js +36 -0
- package/dist/cli-bundle/chunks/{test-3EGNS3T5.js → test-FDQZQNZ4.js} +16 -15
- package/dist/cli-bundle/chunks/{test-all-ZHFAWNC3.js → test-all-PIPPS4S5.js} +18 -17
- package/dist/cli-bundle/chunks/{test-all-ZHFAWNC3.js.map → test-all-PIPPS4S5.js.map} +1 -1
- package/dist/cli-bundle/chunks/{test-all-NJ5V2QFS.js → test-all-WQIAZVA6.js} +16 -15
- package/dist/cli-bundle/chunks/{test-all-NJ5V2QFS.js.map → test-all-WQIAZVA6.js.map} +1 -1
- package/dist/cli-bundle/chunks/{test-runs-GN3C6GOI.js → test-runs-JS6DNCCI.js} +5 -5
- package/dist/cli-bundle/chunks/{test-runs-AJHR6IQF.js → test-runs-NZD2QGL5.js} +5 -5
- package/dist/cli-bundle/chunks/update-7IYQHX4Q.js +24 -0
- package/dist/cli-bundle/chunks/update-IJKDRBIX.js +28 -0
- package/dist/cli-bundle/chunks/{update-many-RYQ64CFW.js → update-many-6NTZ5J5D.js} +23 -23
- package/dist/cli-bundle/chunks/{update-many-N2AN6ZDH.js → update-many-B3TH5TDS.js} +23 -23
- package/dist/cli-bundle/chunks/{upgrade-VPCIYAVW.js → upgrade-4C7VE7MS.js} +8 -7
- package/dist/cli-bundle/chunks/{upgrade-VPCIYAVW.js.map → upgrade-4C7VE7MS.js.map} +1 -1
- package/dist/cli-bundle/chunks/{upgrade-TJXFLZIX.js → upgrade-76IKZ6EZ.js} +6 -5
- package/dist/cli-bundle/chunks/{upgrade-TJXFLZIX.js.map → upgrade-76IKZ6EZ.js.map} +1 -1
- package/dist/cli-bundle/chunks/{validate-PHKIYGSY.js → validate-AQU7OCL3.js} +21 -20
- package/dist/cli-bundle/chunks/{validate-PHKIYGSY.js.map → validate-AQU7OCL3.js.map} +1 -1
- package/dist/cli-bundle/chunks/{validate-JMNWEUYF.js → validate-BPM6Z3OT.js} +23 -22
- package/dist/cli-bundle/chunks/{validate-JMNWEUYF.js.map → validate-BPM6Z3OT.js.map} +1 -1
- package/dist/cli-bundle/main.js +34 -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/capability-usage.d.ts +82 -0
- package/dist/core/extensions/capability-usage.js +133 -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/sdk/cli-contracts.d.ts +1 -0
- package/dist/sdk/cli-contracts.js +18 -13
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/index.d.ts +7 -2
- package/dist/sdk/index.js +8 -3
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/testing.d.ts +520 -1
- package/dist/sdk/testing.js +477 -18
- package/dist/sdk/testing.js.map +1 -1
- package/docs/EXTENSIONS.md +4 -8
- package/docs/SDK.md +257 -0
- 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-HMOADQVT.js.map +0 -7
- package/dist/cli-bundle/chunks/close-DNMHGOCX.js +0 -15
- 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-DXS2XMQU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{activity-CIHV64UC.js.map → activity-NEOI45NX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{aggregate-FIGQEIL3.js.map → aggregate-IHM4KMQ3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{aggregate-3ZKQG5SW.js.map → aggregate-NMYDVQF7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-EWJYJ7CH.js.map → append-3HY5G7ET.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-QEOLX3XB.js.map → append-K54MDQYC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CF55WVVS.js.map → chunk-25XZN3JD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WQ7NIVDK.js.map → chunk-2LEYMXI6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FRUFKWNK.js.map → chunk-3VLPDG3J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-C3AZ5ZML.js.map → chunk-44O4JIN6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-J4MYYSOL.js.map → chunk-47HTJ6BU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YCJX76PW.js.map → chunk-4JXWVHMN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-37QXHBIB.js.map → chunk-4SDKF5BG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NJHMAJ6N.js.map → chunk-5SESR24H.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2EIMPCE4.js.map → chunk-6FQHNHQQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5FIEHKEX.js.map → chunk-6UPTNMVW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FKBDKV7Y.js.map → chunk-75VEYQJS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GMHPNNYG.js.map → chunk-77VKGH4L.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OFYMIDF2.js.map → chunk-7MALIV5H.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RLK7P77C.js.map → chunk-7PBGTIN3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6H4LF7AO.js.map → chunk-A25LOPRG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-M5XALUSL.js.map → chunk-A7E4ZXG2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7D3SAQXM.js.map → chunk-AJXYOYJV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HCU6WUSY.js.map → chunk-B2KR24R4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2GCDRRIF.js.map → chunk-C5SWTISA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AIS5PGI3.js.map → chunk-CLLVBO3I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QGG32QHW.js.map → chunk-CR7KFPAQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UV6IYE5U.js.map → chunk-CWPBGUC7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QQHISQBJ.js.map → chunk-DBQUQ3AS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5QICDWMV.js.map → chunk-DHBPJ7VG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SRYYRVPB.js.map → chunk-DMT4ODVN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PUH4D67U.js.map → chunk-DU64SZUQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-C4N5I7ZW.js.map → chunk-EVPVCE4R.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3EWSGA7N.js.map → chunk-FK6MV5F5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NIUEXCFS.js.map → chunk-GGAXE22C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SX75ADBK.js.map → chunk-GNDHOR64.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GOZUHWFD.js.map → chunk-GU7YHKYP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NXS7ZKAK.js.map → chunk-GXBSFKSX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NJN7LL7U.js.map → chunk-H6FNDCDI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FWPDUYEY.js.map → chunk-HYQV75IB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-F5NZWFSW.js.map → chunk-I367IDZP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-52OCIDPG.js.map → chunk-I6XE47J2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HIP7WVTL.js.map → chunk-J2TSPY5L.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2PKHRP6G.js.map → chunk-JLSC5NPC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PP2U4NMT.js.map → chunk-JY25IOEZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-Q2J2HJUN.js.map → chunk-K25UDYJ4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SBGXDO7A.js.map → chunk-KBTREGVO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QZTWBFXJ.js.map → chunk-KK4TQ3ZP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NIGXMNNI.js.map → chunk-KRJJPDUO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AZMOLBN3.js.map → chunk-MD7XKVWI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6ZXM2XNF.js.map → chunk-MNGAQB2E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3MDHREEV.js.map → chunk-NIWY4V4Z.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TKBHZPKD.js.map → chunk-NKZOJPXK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CZPXY7UW.js.map → chunk-NVUATMTC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-LEU5GHRC.js.map → chunk-P7ZU73BO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NSBZ2CKF.js.map → chunk-PCH2JTEO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-B473GZWW.js.map → chunk-PJS2J7Z4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5IDI42VV.js.map → chunk-QQWEROGS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6M4RJS4M.js.map → chunk-RPRFBXND.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-N5ZJACJ6.js.map → chunk-SFKQAVZA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EBH56IXK.js.map → chunk-THKDPOS5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-LUWW7L4B.js.map → chunk-TIKJAXQW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OTHIWLMB.js.map → chunk-TJABI6PR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-76Z3YSHV.js.map → chunk-TZQKEBKF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PFSRUHDH.js.map → chunk-UKK2VTTH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-H7NJZWG2.js.map → chunk-V4SM4UAL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CZUB4XWO.js.map → chunk-VB54F347.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-O47BPOPC.js.map → chunk-WBSYW3NT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UPE3CDD7.js.map → chunk-WQDX7DVG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NB3PYLQ6.js.map → chunk-XKNF3VRJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-F7K5GWP3.js.map → chunk-Y335KFHD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-D7FYS6PG.js.map → chunk-Y4BZEND6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6CJWZAN7.js.map → chunk-YATDFWYK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UEMNL33O.js.map → chunk-YJICYNAV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-Z6T4PQI2.js.map → chunk-YQSWTVZF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RVHYI7SL.js.map → chunk-YRLLL5TY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-RC56YUWG.js.map → claim-MPXNVBZQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-THOJ6CMV.js.map → claim-SKHJDLW6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-SG5MNCVQ.js.map → close-4RKSL5L6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-DNMHGOCX.js.map → close-Z6AI736U.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-DKQLBGLV.js.map → close-many-AWTPXLHJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-3L3AQZBU.js.map → close-many-SXODYBDP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-SKWMDWCW.js.map → comments-OOH64LWW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-M7ZOZNBX.js.map → comments-YYW5P7AG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{config-OZCUABPB.js.map → config-3445MCQQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{config-7CK62S7T.js.map → config-LCDMKRB2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-PUG2A7RC.js.map → context-DZMIBIVP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-OEC366TO.js.map → context-PJCURODY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{contracts-3THOLA7L.js.map → contracts-7YDFEJB3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{contracts-N65FXEOL.js.map → contracts-MP2P3HL5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-JPX7VZCH.js.map → copy-63IQQRRS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-6QLHILAC.js.map → copy-TASIH2AZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-NNP6TSFO.js.map → create-3BV2VA3Q.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-Y54ZVVZH.js.map → create-TGSB5GV4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-63PCMQAJ.js.map → delete-ARILQQLB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-GDSMGAGJ.js.map → delete-ZQKBZYNK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-T4ZF5G54.js.map → deps-MSHQR2GY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-XYQ73XRH.js.map → deps-NJFJIMQ5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-C75YIXHC.js.map → docs-SS4UKYYA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-EHNPDWUL.js.map → docs-XK2UVUXX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-GTENKE24.js.map → eval-FVZGX5IZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-3WKDTRMH.js.map → eval-JOTG2YHU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-46NWACO3.js.map → extension-NLMS47I4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-D5FDZ2CO.js.map → extension-OQPS27B4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-X3H7CCBQ.js.map → files-3EVJQZ2N.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-DSZBOSSN.js.map → files-Y2P6LN5A.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-5STQXDPU.js.map → focus-D5ZUPTII.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-MDVPOWB5.js.map → focus-ZPIFTY4R.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-ZMST3WQP.js.map → gc-LXXDY456.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-ZC7JHBG7.js.map → gc-RNOEQHSX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{get-NT7L2HUZ.js.map → get-Q3SZGQHD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{get-J2IPJRZW.js.map → get-W23G7MJX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-RLH2QCRO.js.map → history-6CZVFIUJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-WX3MGFS2.js.map → history-YRQUD4YM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-ZBEBGJM7.js.map → history-compact-M35PDQ4G.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-UXDIFC33.js.map → history-compact-VWUSQH6Z.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-YQGU3XRA.js.map → history-redact-27OEOZRZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-P7I7AWMB.js.map → history-redact-AJGARHT3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-52KINVIK.js.map → history-repair-5RDMF7K4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-RM5ITLU5.js.map → history-repair-YUAHIPIN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-SC2P6CHP.js.map → init-DWAKYRXI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-2BNZOO6F.js.map → init-HASX3YNJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-W6F3FIPL.js.map → learnings-JNGUIJDK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-YGYVHWJK.js.map → learnings-M4KA6MQE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-KPAYU5KZ.js.map → list-5UU2W24O.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-K6FPV4J4.js.map → list-6FMKTIH3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-YTD6ZILW.js.map → notes-MODH5CBT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-PU74EPKV.js.map → notes-PYCPLA5Y.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-GEQYUCBW.js.map → plan-DXRIRYRU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-FNXHXRCI.js.map → plan-EHQALWSC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-QI45RMKN.js.map → register-list-query-QAASVP2J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-PHWYHENI.js.map → register-list-query-WE54YJMH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-YINRTS7L.js.map → register-mutation-B6DZJTY2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-X3BUOQEL.js.map → register-mutation-CPV4C2KR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-E5JEASRK.js.map → register-operations-AT3BVVX2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-MIDTRW7S.js.map → register-operations-RC4C3423.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-XQYSWBV7.js.map → restore-FNBV4GWE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-5KHR2YYQ.js.map → restore-XY4YE2OV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-HJMTEXKE.js.map → scheduling-shortcuts-ECL6GBMZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-NNT5ASZR.js.map → scheduling-shortcuts-JRIUREEU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-TZXW6XWD.js.map → schema-74YENAJL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-263RI4WW.js.map → schema-TCW3I7QR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-SFRJOVDG.js.map → search-7USZ6XZA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-LECJYSXE.js.map → search-GNAUE65M.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-VPBGSRQH.js.map → stats-CVHASAEU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-N7ER2PNK.js.map → stats-DQMKJMFT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{telemetry-PP3FUNBU.js.map → telemetry-7P5EUWCS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{telemetry-L6K3BUIQ.js.map → telemetry-PQTL5YS2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-RQCTSWUK.js.map → test-COWPCGBE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-3EGNS3T5.js.map → test-FDQZQNZ4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-runs-GN3C6GOI.js.map → test-runs-JS6DNCCI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-runs-AJHR6IQF.js.map → test-runs-NZD2QGL5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-6YXOGHRT.js.map → update-7IYQHX4Q.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-V33YUBRP.js.map → update-IJKDRBIX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-RYQ64CFW.js.map → update-many-6NTZ5J5D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-N2AN6ZDH.js.map → update-many-B3TH5TDS.js.map} +0 -0
package/dist/sdk/testing.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
|
|
2
|
-
!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]="
|
|
3
|
-
import { activateExtensions } from "../core/extensions/loader.js";
|
|
2
|
+
!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]="7a8097be-5b9f-5313-9ac3-6120d2fce878")}catch(e){}}();
|
|
3
|
+
import { activateExtensions, deactivateExtensions, runAfterCommandHooks, runBeforeCommandHooks, runCommandHandler, runCommandOverride, runOnIndexHooks, runOnReadHooks, runOnWriteHooks, runParserOverride, runPreflightOverride, runRendererOverride, runServiceOverride, } from "../core/extensions/loader.js";
|
|
4
4
|
import { createDefaultExtensionGovernancePolicy } from "../core/extensions/extension-types.js";
|
|
5
|
+
import { getMigrationRuntimeDefinition, resolveRegisteredSearchProvider, resolveRegisteredVectorStoreAdapter, } from "../core/extensions/runtime-registrations.js";
|
|
6
|
+
import { collectUsedExtensionCapabilities } from "../core/extensions/capability-usage.js";
|
|
7
|
+
import { normalizeKnownExtensionCapability } from "../core/extensions/extension-capability-aliases.js";
|
|
5
8
|
const HOOK_KIND_TO_REGISTRY_FIELD = {
|
|
6
9
|
before_command: "beforeCommand",
|
|
7
10
|
after_command: "afterCommand",
|
|
@@ -69,6 +72,10 @@ function readTestExtensionManifest(module) {
|
|
|
69
72
|
}
|
|
70
73
|
return {};
|
|
71
74
|
}
|
|
75
|
+
function resolveTestExtensionName(manifest, explicitName) {
|
|
76
|
+
return (explicitName ??
|
|
77
|
+
(typeof manifest.name === "string" && manifest.name.trim().length > 0 ? manifest.name.trim() : "test-extension"));
|
|
78
|
+
}
|
|
72
79
|
function readTestExtensionCapabilities(manifest, options) {
|
|
73
80
|
if (Array.isArray(options.capabilities)) {
|
|
74
81
|
return [...options.capabilities];
|
|
@@ -79,18 +86,14 @@ function readTestExtensionCapabilities(manifest, options) {
|
|
|
79
86
|
return [];
|
|
80
87
|
}
|
|
81
88
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
89
|
+
* Build the synthetic single-extension {@link ExtensionLoadResult} shared by the
|
|
90
|
+
* activate/deactivate test helpers, so both stay aligned with the loader's load
|
|
91
|
+
* contract as it evolves. The `loaded` entry mirrors the real on-disk shape
|
|
92
|
+
* (including `capabilities` and the compatibility fields) while leaving
|
|
93
|
+
* filesystem paths empty, since the module is supplied in memory.
|
|
86
94
|
*/
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const name = options.name ??
|
|
90
|
-
(typeof manifest.name === "string" && manifest.name.trim().length > 0 ? manifest.name.trim() : "test-extension");
|
|
91
|
-
const layer = options.layer ?? "project";
|
|
92
|
-
const capabilities = readTestExtensionCapabilities(manifest, options);
|
|
93
|
-
return activateExtensions({
|
|
95
|
+
function buildSingleExtensionLoadResult(module, manifest, identity) {
|
|
96
|
+
return {
|
|
94
97
|
disabled_by_flag: false,
|
|
95
98
|
roots: { global: "", project: "" },
|
|
96
99
|
configured_enabled: [],
|
|
@@ -98,19 +101,19 @@ export async function activateExtensionForTest(module, options = {}) {
|
|
|
98
101
|
discovered: [],
|
|
99
102
|
effective: [],
|
|
100
103
|
warnings: [],
|
|
101
|
-
policy:
|
|
104
|
+
policy: identity.policy,
|
|
102
105
|
failed: [],
|
|
103
106
|
loaded: [
|
|
104
107
|
{
|
|
105
|
-
layer,
|
|
108
|
+
layer: identity.layer,
|
|
106
109
|
directory: "",
|
|
107
110
|
manifest_path: "",
|
|
108
|
-
name,
|
|
111
|
+
name: identity.name,
|
|
109
112
|
version: typeof manifest.version === "string" ? manifest.version : "0.0.0",
|
|
110
113
|
entry: typeof manifest.entry === "string" ? manifest.entry : "./index.js",
|
|
111
114
|
priority: typeof manifest.priority === "number" ? manifest.priority : 0,
|
|
112
115
|
entry_path: "",
|
|
113
|
-
capabilities,
|
|
116
|
+
capabilities: identity.capabilities,
|
|
114
117
|
manifest_version: typeof manifest.manifest_version === "number" ? manifest.manifest_version : undefined,
|
|
115
118
|
pm_min_version: typeof manifest.pm_min_version === "string" ? manifest.pm_min_version : undefined,
|
|
116
119
|
pm_max_version: typeof manifest.pm_max_version === "string" ? manifest.pm_max_version : undefined,
|
|
@@ -123,8 +126,427 @@ export async function activateExtensionForTest(module, options = {}) {
|
|
|
123
126
|
module,
|
|
124
127
|
},
|
|
125
128
|
],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Activate one in-memory extension module for package tests.
|
|
133
|
+
*
|
|
134
|
+
* This uses pm's real registration validation and activation engine while
|
|
135
|
+
* avoiding private loader imports, filesystem manifests, or workspace setup.
|
|
136
|
+
*/
|
|
137
|
+
export async function activateExtensionForTest(module, options = {}) {
|
|
138
|
+
const manifest = readTestExtensionManifest(module);
|
|
139
|
+
return activateExtensions(buildSingleExtensionLoadResult(module, manifest, {
|
|
140
|
+
name: resolveTestExtensionName(manifest, options.name),
|
|
141
|
+
layer: options.layer ?? "project",
|
|
142
|
+
capabilities: readTestExtensionCapabilities(manifest, options),
|
|
143
|
+
policy: options.policy ?? createDefaultExtensionGovernancePolicy(),
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Deactivate one in-memory extension module for package tests — the teardown
|
|
148
|
+
* counterpart to {@link activateExtensionForTest}.
|
|
149
|
+
*
|
|
150
|
+
* Runs pm's real `deactivateExtensions` engine (including its bounded per-hook
|
|
151
|
+
* timeout and best-effort failure capture) over a single synthetic load entry,
|
|
152
|
+
* so authors can prove an extension's `deactivate` releases the resources its
|
|
153
|
+
* `activate` opened — without importing private loader internals or staging a
|
|
154
|
+
* workspace. Resolve `name`/`layer` the same way {@link activateExtensionForTest}
|
|
155
|
+
* does so a forwarded `activation` result skips a failed extension correctly.
|
|
156
|
+
*/
|
|
157
|
+
export async function deactivateExtensionForTest(module, options = {}) {
|
|
158
|
+
const manifest = readTestExtensionManifest(module);
|
|
159
|
+
return deactivateExtensions(buildSingleExtensionLoadResult(module, manifest, {
|
|
160
|
+
name: resolveTestExtensionName(manifest, options.name),
|
|
161
|
+
layer: options.layer ?? "project",
|
|
162
|
+
capabilities: readTestExtensionCapabilities(manifest, {}),
|
|
163
|
+
policy: createDefaultExtensionGovernancePolicy(),
|
|
164
|
+
}), options.activation, options.deactivateTimeoutMs === undefined ? {} : { deactivate_timeout_ms: options.deactivateTimeoutMs });
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Invoke a registered extension command handler and return its real
|
|
168
|
+
* {@link CommandHandlerResult} so package tests can assert on behavior — not
|
|
169
|
+
* just that the command was registered.
|
|
170
|
+
*
|
|
171
|
+
* This is the "invoke" verb that completes the package-author testing loop:
|
|
172
|
+
* `activateExtensionForTest` → `assertRegisteredCommandContract` → **run** →
|
|
173
|
+
* `deactivateExtensionForTest`. It runs pm's real handler-dispatch engine
|
|
174
|
+
* (`runCommandHandler`) over `activation.commands`, building the
|
|
175
|
+
* `CommandHandlerContext` with agent-safe global defaults
|
|
176
|
+
* (`{ json: true, quiet: true, noPager: true }`) that callers may override.
|
|
177
|
+
*
|
|
178
|
+
* Because `registerImporter`/`registerExporter` register their handlers under
|
|
179
|
+
* the `"<name> import"` / `"<name> export"` command paths, this same helper
|
|
180
|
+
* exercises importer and exporter handlers too.
|
|
181
|
+
*
|
|
182
|
+
* Throws a descriptive error (listing the available handler command paths) when
|
|
183
|
+
* no handler is registered for `command`, since that is a wiring/typo bug in the
|
|
184
|
+
* test rather than a behavior under test. When a handler is found, the result is
|
|
185
|
+
* returned verbatim: a clean run yields `{ handled: true, result, warnings: [] }`,
|
|
186
|
+
* while a handler that throws a non-exit error yields
|
|
187
|
+
* `{ handled: false, warnings: [code], errorMessage }` so the failure can be
|
|
188
|
+
* asserted. A handler that throws an error carrying a numeric `exitCode`
|
|
189
|
+
* propagates the throw, matching runtime semantics.
|
|
190
|
+
*/
|
|
191
|
+
export async function runRegisteredCommandForTest(commands, options) {
|
|
192
|
+
const command = normalizeSdkCommandName(options.command);
|
|
193
|
+
if (command.length === 0) {
|
|
194
|
+
throw new Error("Expected command name must be a non-empty string");
|
|
195
|
+
}
|
|
196
|
+
const hasHandler = commands.handlers.some((entry) => entry.command === command);
|
|
197
|
+
if (!hasHandler) {
|
|
198
|
+
const available = sortedUnique(commands.handlers.map((entry) => entry.command));
|
|
199
|
+
throw new Error(`Expected a registered command handler for "${command}" to invoke. Available command handlers: ${formatAvailable(available)}`);
|
|
200
|
+
}
|
|
201
|
+
return runCommandHandler(commands, {
|
|
202
|
+
command,
|
|
203
|
+
args: options.args ? [...options.args] : [],
|
|
204
|
+
options: options.options ? { ...options.options } : {},
|
|
205
|
+
global: { json: true, quiet: true, noPager: true, ...options.global },
|
|
206
|
+
pm_root: options.pmRoot ?? "",
|
|
126
207
|
});
|
|
127
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* Fire every registered lifecycle hook of a given `kind` through pm's real hook
|
|
211
|
+
* runner and return the warnings array so package tests can assert on behavior —
|
|
212
|
+
* not just that a hook was registered.
|
|
213
|
+
*
|
|
214
|
+
* This is the hook counterpart to {@link runRegisteredCommandForTest}, extending
|
|
215
|
+
* the package-author "invoke" verb to the `api.hooks.*` surface. Pass the
|
|
216
|
+
* `ExtensionHookRegistry` from `activateExtensionForTest(...).hooks` together with
|
|
217
|
+
* the lifecycle `kind` and a synthetic context. Hooks observe their inputs via a
|
|
218
|
+
* cloned context snapshot (mutations never leak back to the caller), so the
|
|
219
|
+
* observable signal is twofold: any side effects the hook performs, and the
|
|
220
|
+
* returned warnings. A clean run returns `[]`; a hook that throws contributes one
|
|
221
|
+
* `extension_hook_failed:<layer>:<name>:<hookName>` warning, mirroring runtime
|
|
222
|
+
* dispatch which isolates a failing hook without aborting the others.
|
|
223
|
+
*
|
|
224
|
+
* Throws a descriptive error (listing the hook kinds that do have registrations)
|
|
225
|
+
* when no hook of `kind` is registered, since firing a hook the extension never
|
|
226
|
+
* registered is a wiring/typo bug in the test rather than a behavior under test.
|
|
227
|
+
*/
|
|
228
|
+
export async function runRegisteredHookForTest(hooks, options) {
|
|
229
|
+
if (hooks[HOOK_KIND_TO_REGISTRY_FIELD[options.kind]].length === 0) {
|
|
230
|
+
const populatedKinds = sortedUnique(Object.keys(HOOK_KIND_TO_REGISTRY_FIELD).filter((kind) => hooks[HOOK_KIND_TO_REGISTRY_FIELD[kind]].length > 0));
|
|
231
|
+
throw new Error(`Expected a registered "${options.kind}" hook to invoke. Hook kinds with registrations: ${formatAvailable(populatedKinds)}`);
|
|
232
|
+
}
|
|
233
|
+
switch (options.kind) {
|
|
234
|
+
case "before_command":
|
|
235
|
+
return runBeforeCommandHooks(hooks, options.context);
|
|
236
|
+
case "after_command":
|
|
237
|
+
return runAfterCommandHooks(hooks, options.context);
|
|
238
|
+
case "on_read":
|
|
239
|
+
return runOnReadHooks(hooks, options.context);
|
|
240
|
+
case "on_write":
|
|
241
|
+
return runOnWriteHooks(hooks, options.context);
|
|
242
|
+
case "on_index":
|
|
243
|
+
return runOnIndexHooks(hooks, options.context);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Invoke a registered parser override through pm's real runner and return the
|
|
248
|
+
* resolved {@link ParserOverrideResult}, so package tests can assert the rewritten
|
|
249
|
+
* args/options/global an override produces for a command before dispatch.
|
|
250
|
+
*
|
|
251
|
+
* Guards that a parser override is registered for the (normalized) target command
|
|
252
|
+
* before delegating: without a match `runParserOverride` would silently return
|
|
253
|
+
* `overridden: false`, hiding a typo'd command name in the test. When a match
|
|
254
|
+
* exists the result is returned verbatim — `overridden: true` with the rewritten
|
|
255
|
+
* context on success, or `overridden: false` with an
|
|
256
|
+
* `extension_parser_override_failed:*` warning when the override throws.
|
|
257
|
+
*/
|
|
258
|
+
export async function runRegisteredParserOverrideForTest(parsers, context) {
|
|
259
|
+
const command = normalizeSdkCommandName(context.command);
|
|
260
|
+
if (!parsers.overrides.some((entry) => entry.command === command)) {
|
|
261
|
+
throw new Error(`Expected a registered parser override for command "${command}" to invoke. Available parser override commands: ${formatAvailable(sortedUnique(parsers.overrides.map((entry) => entry.command)))}`);
|
|
262
|
+
}
|
|
263
|
+
return runParserOverride(parsers, context);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Invoke the active preflight override through pm's real runner and return the
|
|
267
|
+
* resolved {@link PreflightOverrideResult}, so package tests can assert the
|
|
268
|
+
* migration/format gate decision an override yields.
|
|
269
|
+
*
|
|
270
|
+
* Unlike command-scoped overrides, the runtime applies the **last** registered
|
|
271
|
+
* preflight override regardless of command, so this helper guards only that at
|
|
272
|
+
* least one preflight override is registered before delegating. The result is
|
|
273
|
+
* returned verbatim — `overridden: true` with the adjusted decision on success,
|
|
274
|
+
* or `overridden: false` with an `extension_preflight_override_failed:*` warning
|
|
275
|
+
* when the override throws.
|
|
276
|
+
*/
|
|
277
|
+
export async function runRegisteredPreflightOverrideForTest(preflight, context) {
|
|
278
|
+
if (preflight.overrides.length === 0) {
|
|
279
|
+
throw new Error("Expected a registered preflight override to invoke, but none are registered.");
|
|
280
|
+
}
|
|
281
|
+
return runPreflightOverride(preflight, context);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Invoke a registered command-result override through pm's real runner and return
|
|
285
|
+
* the resolved {@link CommandOverrideResult}, so package tests can assert how an
|
|
286
|
+
* override transforms a command's result payload.
|
|
287
|
+
*
|
|
288
|
+
* Accepts the same `ExtensionCommandRegistry` exposed as
|
|
289
|
+
* `activateExtensionForTest(...).commands` (it carries both handlers and
|
|
290
|
+
* overrides). Guards that an override is registered for the (normalized) target
|
|
291
|
+
* command before delegating, so a typo'd command name surfaces as a clear error
|
|
292
|
+
* rather than a silent `overridden: false`. The result is returned verbatim —
|
|
293
|
+
* including the `extension_command_override_async_unsupported:*` warning the
|
|
294
|
+
* runtime emits when an override returns a Promise (command overrides are
|
|
295
|
+
* synchronous), or an `extension_command_override_failed:*` warning on throw.
|
|
296
|
+
*/
|
|
297
|
+
export async function runRegisteredCommandOverrideForTest(commands, context) {
|
|
298
|
+
const command = normalizeSdkCommandName(context.command);
|
|
299
|
+
if (!commands.overrides.some((entry) => entry.command === command)) {
|
|
300
|
+
throw new Error(`Expected a registered command override for command "${command}" to invoke. Available command override commands: ${formatAvailable(sortedUnique(commands.overrides.map((entry) => entry.command)))}`);
|
|
301
|
+
}
|
|
302
|
+
return runCommandOverride(commands, context);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Invoke a registered renderer override through pm's real runner and return the
|
|
306
|
+
* resolved {@link RendererOverrideResult}, so package tests can assert the custom
|
|
307
|
+
* string an override renders for a given output `format`.
|
|
308
|
+
*
|
|
309
|
+
* Guards that a renderer override is registered for `context.format` before
|
|
310
|
+
* delegating, so a wrong format surfaces as a clear error rather than a silent
|
|
311
|
+
* `overridden: false`. The result is returned verbatim — `overridden: true` with
|
|
312
|
+
* the rendered string on success, or `overridden: false` (with an
|
|
313
|
+
* `extension_renderer_invalid_result:*` / `extension_renderer_failed:*` warning
|
|
314
|
+
* where applicable) when the override returns a non-string or throws.
|
|
315
|
+
*/
|
|
316
|
+
export async function runRegisteredRendererOverrideForTest(renderers, context) {
|
|
317
|
+
if (!renderers.overrides.some((entry) => entry.format === context.format)) {
|
|
318
|
+
throw new Error(`Expected a registered renderer override for format "${context.format}" to invoke. Available renderer override formats: ${formatAvailable(sortedUnique(renderers.overrides.map((entry) => entry.format)))}`);
|
|
319
|
+
}
|
|
320
|
+
return runRendererOverride(renderers, context);
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Invoke a registered service override through pm's real runner and return the
|
|
324
|
+
* resolved {@link ServiceOverrideResult}, so package tests can assert how an
|
|
325
|
+
* override handles an internal service payload (e.g. `output_format`).
|
|
326
|
+
*
|
|
327
|
+
* Guards that a service override is registered for `context.service` before
|
|
328
|
+
* delegating, so a wrong service name surfaces as a clear error rather than a
|
|
329
|
+
* silent `handled: false`. The result is returned verbatim — `handled: true` with
|
|
330
|
+
* the override's result when it claims the payload, or `handled: false` with the
|
|
331
|
+
* original payload (and any `extension_service_override_*` warnings) otherwise.
|
|
332
|
+
*/
|
|
333
|
+
export async function runRegisteredServiceOverrideForTest(services, context) {
|
|
334
|
+
if (!services.overrides.some((entry) => entry.service === context.service)) {
|
|
335
|
+
throw new Error(`Expected a registered service override for service "${context.service}" to invoke. Available service override services: ${formatAvailable(sortedUnique(services.overrides.map((entry) => entry.service)))}`);
|
|
336
|
+
}
|
|
337
|
+
return runServiceOverride(services, context);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Maps each search-provider operation to the runtime-definition keys that may
|
|
341
|
+
* hold its function, in priority order. The host accepts both camelCase and
|
|
342
|
+
* snake_case spellings for the multi-word operations, so this helper mirrors that
|
|
343
|
+
* by trying `embedBatch` before `embed_batch` and `queryExpansion` before
|
|
344
|
+
* `query_expansion`.
|
|
345
|
+
*/
|
|
346
|
+
const SEARCH_PROVIDER_OPERATION_DEFINITION_KEYS = {
|
|
347
|
+
query: ["query"],
|
|
348
|
+
embed: ["embed"],
|
|
349
|
+
embedBatch: ["embedBatch", "embed_batch"],
|
|
350
|
+
queryExpansion: ["queryExpansion", "query_expansion"],
|
|
351
|
+
rerank: ["rerank"],
|
|
352
|
+
};
|
|
353
|
+
/**
|
|
354
|
+
* Invoke an operation of a registered search provider through the same name
|
|
355
|
+
* resolution the host uses and return the operation's result, so package tests
|
|
356
|
+
* can assert a custom provider's runtime behavior — not just that it registered.
|
|
357
|
+
*
|
|
358
|
+
* This is the search-provider counterpart to {@link runRegisteredCommandForTest},
|
|
359
|
+
* extending the package-author "invoke" verb to the `api.registerSearchProvider`
|
|
360
|
+
* surface. Pass the `ExtensionRegistrationRegistry` from
|
|
361
|
+
* `activateExtensionForTest(...).registrations`, the registered provider name, the
|
|
362
|
+
* `operation` to exercise (`query`, `embed`, `embedBatch`, `queryExpansion`, or
|
|
363
|
+
* `rerank`), and a synthetic context. The provider is resolved via
|
|
364
|
+
* {@link resolveRegisteredSearchProvider} (case-insensitive, last registration
|
|
365
|
+
* wins) and the operation is invoked on its `runtime_definition` — the clone that
|
|
366
|
+
* preserves live functions, matching what the runtime dispatches.
|
|
367
|
+
*
|
|
368
|
+
* Throws a descriptive error listing the available providers when the name is not
|
|
369
|
+
* registered, and a separate error when the resolved provider does not implement
|
|
370
|
+
* the requested operation, since invoking an absent provider/operation is a
|
|
371
|
+
* wiring bug in the test rather than a behavior under test.
|
|
372
|
+
*/
|
|
373
|
+
export async function runRegisteredSearchProviderForTest(registrations, options) {
|
|
374
|
+
const registration = resolveRegisteredSearchProvider(registrations, options.provider);
|
|
375
|
+
if (!registration) {
|
|
376
|
+
const available = sortedUnique(registrations.search_providers.map((entry) => entry.definition.name));
|
|
377
|
+
throw new Error(`Expected a registered search provider "${options.provider}" to invoke. Available search providers: ${formatAvailable(available)}`);
|
|
378
|
+
}
|
|
379
|
+
const runtimeDefinition = registration.runtime_definition;
|
|
380
|
+
const operationFn = SEARCH_PROVIDER_OPERATION_DEFINITION_KEYS[options.operation]
|
|
381
|
+
.map((key) => runtimeDefinition[key])
|
|
382
|
+
.find((value) => typeof value === "function");
|
|
383
|
+
if (typeof operationFn !== "function") {
|
|
384
|
+
throw new Error(`Registered search provider "${options.provider}" does not implement the "${options.operation}" operation.`);
|
|
385
|
+
}
|
|
386
|
+
return (await operationFn(options.context));
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Invoke an operation of a registered vector store adapter through the same name
|
|
390
|
+
* resolution the host uses and return the operation's result, so package tests
|
|
391
|
+
* can assert a custom adapter's runtime behavior — not just that it registered.
|
|
392
|
+
*
|
|
393
|
+
* This is the vector-store counterpart to {@link runRegisteredSearchProviderForTest}.
|
|
394
|
+
* Pass the `ExtensionRegistrationRegistry` from
|
|
395
|
+
* `activateExtensionForTest(...).registrations`, the registered adapter name, the
|
|
396
|
+
* `operation` to exercise (`query`, `upsert`, or `delete`), and a synthetic
|
|
397
|
+
* context. The adapter is resolved via {@link resolveRegisteredVectorStoreAdapter}
|
|
398
|
+
* (case-insensitive, last registration wins) and the operation is invoked on its
|
|
399
|
+
* `runtime_definition` — the clone that preserves live functions, matching what
|
|
400
|
+
* the runtime dispatches.
|
|
401
|
+
*
|
|
402
|
+
* Throws a descriptive error listing the available adapters when the name is not
|
|
403
|
+
* registered, and a separate error when the resolved adapter does not implement
|
|
404
|
+
* the requested operation.
|
|
405
|
+
*/
|
|
406
|
+
export async function runRegisteredVectorStoreAdapterForTest(registrations, options) {
|
|
407
|
+
const registration = resolveRegisteredVectorStoreAdapter(registrations, options.adapter);
|
|
408
|
+
if (!registration) {
|
|
409
|
+
const available = sortedUnique(registrations.vector_store_adapters.map((entry) => entry.definition.name));
|
|
410
|
+
throw new Error(`Expected a registered vector store adapter "${options.adapter}" to invoke. Available vector store adapters: ${formatAvailable(available)}`);
|
|
411
|
+
}
|
|
412
|
+
const operationFn = registration.runtime_definition[options.operation];
|
|
413
|
+
if (typeof operationFn !== "function") {
|
|
414
|
+
throw new Error(`Registered vector store adapter "${options.adapter}" does not implement the "${options.operation}" operation.`);
|
|
415
|
+
}
|
|
416
|
+
return (await operationFn(options.context));
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Invoke a registered schema migration's `run` function through the same runtime
|
|
420
|
+
* definition the host executes and return its result, so package tests can assert
|
|
421
|
+
* a migration's behavior — not just that it registered.
|
|
422
|
+
*
|
|
423
|
+
* This completes the package-author "invoke" verb across every executable
|
|
424
|
+
* registration surface. The migration is resolved by id via
|
|
425
|
+
* {@link assertRegisteredMigration} (which throws a descriptive "available
|
|
426
|
+
* migrations" error when absent), then `run` is invoked on its
|
|
427
|
+
* `runtime_definition` with a context mirroring the one
|
|
428
|
+
* `executeRegisteredRuntimeMigrations` builds at runtime: the resolved id,
|
|
429
|
+
* `command: "migration"`, the registering extension's layer/name, the supplied
|
|
430
|
+
* `pmRoot`, and the migration's normalized status. Unlike the runtime — which
|
|
431
|
+
* skips already-applied migrations and folds a throw into a warning — this helper
|
|
432
|
+
* always invokes `run` and lets a throw propagate, so authors can assert both the
|
|
433
|
+
* success result and failure via rejection.
|
|
434
|
+
*
|
|
435
|
+
* Throws when the resolved migration declares no `run` function, since invoking a
|
|
436
|
+
* runless migration is a wiring bug in the test rather than a behavior under test.
|
|
437
|
+
*/
|
|
438
|
+
export async function runRegisteredMigrationForTest(registrations, options) {
|
|
439
|
+
const migration = assertRegisteredMigration(registrations, {
|
|
440
|
+
migration: options.migration,
|
|
441
|
+
extensionName: options.extensionName,
|
|
442
|
+
});
|
|
443
|
+
const run = getMigrationRuntimeDefinition(migration).run;
|
|
444
|
+
if (typeof run !== "function") {
|
|
445
|
+
throw new Error(`Registered migration "${options.migration}" does not implement a run function to invoke.`);
|
|
446
|
+
}
|
|
447
|
+
const declaredStatus = migration.definition.status;
|
|
448
|
+
const context = {
|
|
449
|
+
id: migration.definition.id,
|
|
450
|
+
command: "migration",
|
|
451
|
+
layer: migration.layer,
|
|
452
|
+
extension: migration.name,
|
|
453
|
+
pm_root: options.pmRoot ?? "",
|
|
454
|
+
status: (typeof declaredStatus === "string" ? declaredStatus.trim().toLowerCase() : "") || "pending",
|
|
455
|
+
};
|
|
456
|
+
return await run(context);
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Invoke a registered extension importer through pm's real handler-dispatch
|
|
460
|
+
* engine and return its {@link CommandHandlerResult}, so package tests can assert
|
|
461
|
+
* an importer's behavior — not just that it registered.
|
|
462
|
+
*
|
|
463
|
+
* This is the importer counterpart to {@link runRegisteredCommandForTest},
|
|
464
|
+
* extending the package-author "invoke" verb to the `api.registerImporter`
|
|
465
|
+
* surface. Because `registerImporter(name, fn)` wraps `fn` into a command handler
|
|
466
|
+
* at the `"<name> import"` path, invoking it through `runRegisteredCommandForTest`
|
|
467
|
+
* requires the author to know that naming convention and to remember that an
|
|
468
|
+
* importer is reachable as a command at all. This helper closes both gaps: it
|
|
469
|
+
* accepts the registered importer name directly, validates via
|
|
470
|
+
* {@link assertRegisteredImporter} that it is genuinely a registered importer
|
|
471
|
+
* (not merely some command parked at that path), derives the command path, and
|
|
472
|
+
* dispatches through the same engine.
|
|
473
|
+
*
|
|
474
|
+
* The full activation result is required because importer execution spans two
|
|
475
|
+
* sub-registries: `registrations.importers` proves the importer exists, while
|
|
476
|
+
* `commands` holds the wrapped handler. The result is returned verbatim from the
|
|
477
|
+
* command engine: a clean run yields `{ handled: true, result, warnings: [] }`
|
|
478
|
+
* (where `result` is the importer's return value), a non-exit throw yields
|
|
479
|
+
* `{ handled: false, warnings: [code], errorMessage }`, and an error carrying a
|
|
480
|
+
* numeric `exitCode` propagates — matching runtime import semantics.
|
|
481
|
+
*
|
|
482
|
+
* Throws a descriptive "available importers" error (via `assertRegisteredImporter`)
|
|
483
|
+
* when no importer matches, since that is a wiring/typo bug in the test rather
|
|
484
|
+
* than a behavior under test.
|
|
485
|
+
*/
|
|
486
|
+
export async function runRegisteredImporterForTest(activation, options) {
|
|
487
|
+
const importer = assertRegisteredImporter(activation.registrations, {
|
|
488
|
+
importer: options.importer,
|
|
489
|
+
extensionName: options.extensionName,
|
|
490
|
+
});
|
|
491
|
+
return runRegisteredCommandForTest(activation.commands, {
|
|
492
|
+
command: `${importer.importer} import`,
|
|
493
|
+
args: options.args,
|
|
494
|
+
options: options.options,
|
|
495
|
+
global: options.global,
|
|
496
|
+
pmRoot: options.pmRoot,
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Invoke a registered extension exporter through pm's real handler-dispatch
|
|
501
|
+
* engine and return its {@link CommandHandlerResult}, so package tests can assert
|
|
502
|
+
* an exporter's behavior — not just that it registered.
|
|
503
|
+
*
|
|
504
|
+
* This is the exporter counterpart to {@link runRegisteredImporterForTest} and
|
|
505
|
+
* the final surface in the package-author "invoke" verb. Because
|
|
506
|
+
* `registerExporter(name, fn)` wraps `fn` into a command handler at the
|
|
507
|
+
* `"<name> export"` path, this helper accepts the registered exporter name
|
|
508
|
+
* directly, validates via {@link assertRegisteredExporter} that it is genuinely a
|
|
509
|
+
* registered exporter, derives the command path, and dispatches through the same
|
|
510
|
+
* engine. See {@link runRegisteredImporterForTest} for the full activation
|
|
511
|
+
* rationale and return semantics (which apply identically here).
|
|
512
|
+
*
|
|
513
|
+
* Throws a descriptive "available exporters" error (via `assertRegisteredExporter`)
|
|
514
|
+
* when no exporter matches, since that is a wiring/typo bug in the test rather
|
|
515
|
+
* than a behavior under test.
|
|
516
|
+
*/
|
|
517
|
+
export async function runRegisteredExporterForTest(activation, options) {
|
|
518
|
+
const exporter = assertRegisteredExporter(activation.registrations, {
|
|
519
|
+
exporter: options.exporter,
|
|
520
|
+
extensionName: options.extensionName,
|
|
521
|
+
});
|
|
522
|
+
return runRegisteredCommandForTest(activation.commands, {
|
|
523
|
+
command: `${exporter.exporter} export`,
|
|
524
|
+
args: options.args,
|
|
525
|
+
options: options.options,
|
|
526
|
+
global: options.global,
|
|
527
|
+
pmRoot: options.pmRoot,
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Assert that an {@link ExtensionDeactivationResult} reports the expected clean
|
|
532
|
+
* teardown counts, throwing a descriptive error otherwise. Defaults assert the
|
|
533
|
+
* single-extension happy path — exactly one extension deactivated and none
|
|
534
|
+
* failed. Returns the result so assertions can chain.
|
|
535
|
+
*/
|
|
536
|
+
export function assertExtensionDeactivated(result, expectation = {}) {
|
|
537
|
+
const expectedDeactivated = expectation.deactivated ?? 1;
|
|
538
|
+
if (result.deactivated !== expectedDeactivated) {
|
|
539
|
+
throw new Error(`Expected ${expectedDeactivated} extension${expectedDeactivated === 1 ? "" : "s"} to deactivate cleanly, ` +
|
|
540
|
+
`but ${result.deactivated} did.`);
|
|
541
|
+
}
|
|
542
|
+
const expectedFailed = expectation.failed ?? 0;
|
|
543
|
+
if (result.failed.length !== expectedFailed) {
|
|
544
|
+
const detail = result.failed.map((failure) => `${failure.layer}:${failure.name} (${failure.error})`).join(", ");
|
|
545
|
+
throw new Error(`Expected ${expectedFailed} teardown failure${expectedFailed === 1 ? "" : "s"}, ` +
|
|
546
|
+
`but observed ${result.failed.length}${detail.length > 0 ? `: ${detail}` : ""}.`);
|
|
547
|
+
}
|
|
548
|
+
return result;
|
|
549
|
+
}
|
|
128
550
|
/**
|
|
129
551
|
* Assert that a normalized package manifest advertises expected package
|
|
130
552
|
* resources. Pair with `readPmPackageManifest(packageRoot)` in package tests.
|
|
@@ -512,5 +934,42 @@ export function assertRegisteredMigration(registrations, expectation) {
|
|
|
512
934
|
}));
|
|
513
935
|
throw new Error(`Expected migration "${expectedMigration}"${extensionNameSuffix(expectation.extensionName)} to be registered. Available migrations: ${formatAvailable(available)}`);
|
|
514
936
|
}
|
|
937
|
+
/**
|
|
938
|
+
* Assert that an activated extension declares no capability it never uses
|
|
939
|
+
* (least privilege). Pass the same capabilities as `manifest.capabilities` via
|
|
940
|
+
* `expectation.declared`; the helper computes what the extension actually
|
|
941
|
+
* registered against and throws when any declared capability is unused.
|
|
942
|
+
*
|
|
943
|
+
* This is the package-test counterpart of the advisory
|
|
944
|
+
* `extension_capability_unused` warning `pm package doctor` emits, letting an
|
|
945
|
+
* author catch an over-broad manifest at `npm test` time. Returns the
|
|
946
|
+
* declared/used/unused breakdown for further assertions.
|
|
947
|
+
*/
|
|
948
|
+
export function assertExtensionCapabilityUsage(activation, expectation) {
|
|
949
|
+
const toKnownCapabilitySet = (capabilities, field) => {
|
|
950
|
+
const known = new Set();
|
|
951
|
+
for (const capability of capabilities) {
|
|
952
|
+
const normalized = normalizeKnownExtensionCapability(capability);
|
|
953
|
+
if (normalized === null) {
|
|
954
|
+
throw new Error(`Expected ${field} capability "${capability}" to be a known extension capability. ` +
|
|
955
|
+
"Use canonical capability names (see manifest.capabilities).");
|
|
956
|
+
}
|
|
957
|
+
known.add(normalized);
|
|
958
|
+
}
|
|
959
|
+
return known;
|
|
960
|
+
};
|
|
961
|
+
const declared = [...toKnownCapabilitySet(expectation.declared, "declared")].sort((left, right) => left.localeCompare(right));
|
|
962
|
+
const allowUnused = toKnownCapabilitySet(expectation.allowUnused ?? [], "allowUnused");
|
|
963
|
+
const used = collectUsedExtensionCapabilities(activation, { extensionName: expectation.extensionName });
|
|
964
|
+
const usedSet = new Set(used);
|
|
965
|
+
const unused = declared.filter((capability) => !usedSet.has(capability) && !allowUnused.has(capability));
|
|
966
|
+
if (unused.length > 0) {
|
|
967
|
+
const scopeSuffix = extensionNameSuffix(expectation.extensionName);
|
|
968
|
+
throw new Error(`Expected every declared capability${scopeSuffix} to be exercised, but [${unused.join(", ")}] ${unused.length === 1 ? "is" : "are"} declared yet never registered against. ` +
|
|
969
|
+
`Remove ${unused.length === 1 ? "it" : "them"} from manifest.capabilities for least privilege, ` +
|
|
970
|
+
"or pass allowUnused for capabilities registered only behind a runtime flag.");
|
|
971
|
+
}
|
|
972
|
+
return { declared, used, unused };
|
|
973
|
+
}
|
|
515
974
|
//# sourceMappingURL=testing.js.map
|
|
516
|
-
//# debugId=
|
|
975
|
+
//# debugId=7a8097be-5b9f-5313-9ac3-6120d2fce878
|