@unbrained/pm-cli 2026.6.20 → 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 +39 -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 +499 -20
- 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 +16 -4
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/health.js +15 -3
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +1 -1
- package/dist/cli/commands/validate.js +44 -2
- package/dist/cli/commands/validate.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-KEEITOTB.js → activity-DXS2XMQU.js} +11 -11
- package/dist/cli-bundle/chunks/activity-NEOI45NX.js +18 -0
- package/dist/cli-bundle/chunks/{aggregate-5BTHOHW2.js → aggregate-IHM4KMQ3.js} +10 -10
- package/dist/cli-bundle/chunks/{aggregate-GB2LJNTZ.js → aggregate-NMYDVQF7.js} +10 -10
- package/dist/cli-bundle/chunks/{append-BBM4MNVD.js → append-3HY5G7ET.js} +8 -8
- package/dist/cli-bundle/chunks/{append-BFV5UYWS.js → append-K54MDQYC.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-DKWIPIJY.js → chunk-25XZN3JD.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-GF44HVZL.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-XNQ3YH6N.js → chunk-3VLPDG3J.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-W2ZESOQE.js → chunk-44O4JIN6.js} +13 -13
- package/dist/cli-bundle/chunks/{chunk-RADIHKJ3.js → chunk-47HTJ6BU.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-B3LROPTV.js → chunk-4JXWVHMN.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-HWHZ7EY7.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-RNKUCHUQ.js → chunk-5SESR24H.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-RICT5QYR.js → chunk-6FQHNHQQ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-FA5O2DEG.js → chunk-6UPTNMVW.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-4KFL5OYK.js → chunk-75VEYQJS.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-2ZY5SLNR.js → chunk-77VKGH4L.js} +10 -10
- package/dist/cli-bundle/chunks/{chunk-H3ZTSYPA.js → chunk-7GCCDXXN.js} +57 -223
- package/dist/cli-bundle/chunks/chunk-7GCCDXXN.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-6Y7IQ6XN.js → chunk-7MALIV5H.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-MFCFHL27.js → chunk-7MPTFYT3.js} +20 -15
- package/dist/cli-bundle/chunks/chunk-7MPTFYT3.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-NMQNXH4U.js → chunk-7PBGTIN3.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-3KVCMB2M.js → chunk-A25LOPRG.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-6KSFULO6.js → chunk-A7E4ZXG2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ZHCSGIUX.js → chunk-AJXYOYJV.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-PF5GLFPU.js → chunk-B2KR24R4.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-ZYG4TR32.js → chunk-C5SWTISA.js} +12 -12
- package/dist/cli-bundle/chunks/{chunk-F4EYOSNC.js → chunk-CLLVBO3I.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-5MWA46UN.js → chunk-CR7KFPAQ.js} +61 -4
- package/dist/cli-bundle/chunks/chunk-CR7KFPAQ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-4PW4C3ZB.js → chunk-CWPBGUC7.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-LTUB7ARL.js → chunk-D35LTIFR.js} +57 -216
- package/dist/cli-bundle/chunks/chunk-D35LTIFR.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-J7VSEFWB.js → chunk-DBQUQ3AS.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-2LUNPA3U.js → chunk-DHBPJ7VG.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-6FSPWUBI.js → chunk-DMT4ODVN.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-XXGAWTH5.js → chunk-DU64SZUQ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-CNPWCUDR.js → chunk-EVPVCE4R.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-ACULWT7G.js → chunk-FK6MV5F5.js} +12 -12
- package/dist/cli-bundle/chunks/{chunk-XKJDCJEH.js → chunk-GGAXE22C.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-SL233DQD.js → chunk-GNDHOR64.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-U3WTMYBX.js → chunk-GU7YHKYP.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-26OQTCGH.js → chunk-GXBSFKSX.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-AOCYDQLT.js → chunk-H6FNDCDI.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-ICEWMJYH.js → chunk-HYQV75IB.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-5XK2RYJR.js → chunk-I367IDZP.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-E4E7UQBT.js → chunk-I6XE47J2.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-NKTUBA2C.js → chunk-J2TSPY5L.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-IWKD7B33.js → chunk-JINYH2DB.js} +23 -2
- package/dist/cli-bundle/chunks/chunk-JINYH2DB.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-DYOJJTCG.js → chunk-JLSC5NPC.js} +10 -10
- package/dist/cli-bundle/chunks/{chunk-FXKPUMIR.js → chunk-JY25IOEZ.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-NCGQ27PK.js → chunk-K25UDYJ4.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-3WAKNI2W.js → chunk-KBTREGVO.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-KCJZREBI.js → chunk-KK4TQ3ZP.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-AZ75OVK4.js → chunk-KL5ELX2X.js} +82 -3
- package/dist/cli-bundle/chunks/chunk-KL5ELX2X.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-7MMXBIRZ.js → chunk-KRJJPDUO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-BYNJWB5F.js → chunk-MD7XKVWI.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-WFOITX4A.js → chunk-MNGAQB2E.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-II4BRHKM.js → chunk-NIWY4V4Z.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-YT4Z2OVB.js → chunk-NKZOJPXK.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-YBQF4CAW.js → chunk-NVUATMTC.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-FSOJCFDS.js → chunk-P7ZU73BO.js} +55 -5
- package/dist/cli-bundle/chunks/chunk-P7ZU73BO.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-MTQK5ZSB.js → chunk-PCH2JTEO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-VE3BUO3R.js → chunk-PJS2J7Z4.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-2QJLN4KM.js → chunk-QQWEROGS.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-OLEP5TJH.js → chunk-R2EMWY7Q.js} +24 -3
- package/dist/cli-bundle/chunks/chunk-R2EMWY7Q.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-6DZO5NN7.js → chunk-RPRFBXND.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-QWAJPGEI.js → chunk-RZZMSY4P.js} +91 -5
- package/dist/cli-bundle/chunks/chunk-RZZMSY4P.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-BBSUVIIT.js → chunk-SFKQAVZA.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-X3CD2VUI.js → chunk-THKDPOS5.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-OVSFW4KD.js → chunk-TIKJAXQW.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-4YMX7XFI.js → chunk-TJABI6PR.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-VONJSFUW.js → chunk-TRUFOER3.js} +19 -14
- package/dist/cli-bundle/chunks/{chunk-VONJSFUW.js.map → chunk-TRUFOER3.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-AW4PYYNF.js → chunk-TZQKEBKF.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-QUTJOHGK.js → chunk-UKK2VTTH.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-ATRXPXAL.js → chunk-V4SM4UAL.js} +13 -13
- package/dist/cli-bundle/chunks/{chunk-6KARQMC6.js → chunk-VB54F347.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-6LTSLEHD.js → chunk-WBSYW3NT.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-4S4INK3B.js → chunk-WQDX7DVG.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-ETJKPURB.js → chunk-XKNF3VRJ.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-BZWIDTDE.js → chunk-Y335KFHD.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-K2LBDYDC.js → chunk-Y4BZEND6.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-EOFROIC5.js → chunk-YATDFWYK.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-EKMHDL6Z.js → chunk-YJICYNAV.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-WMQBNVZL.js → chunk-YQSWTVZF.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-FBBPCSJM.js → chunk-YRLLL5TY.js} +8 -8
- package/dist/cli-bundle/chunks/{claim-G57ZJLZ4.js → claim-MPXNVBZQ.js} +10 -10
- package/dist/cli-bundle/chunks/{claim-TRSDQO6L.js → claim-SKHJDLW6.js} +10 -10
- package/dist/cli-bundle/chunks/{close-4QMUQMON.js → close-4RKSL5L6.js} +8 -8
- package/dist/cli-bundle/chunks/close-Z6AI736U.js +15 -0
- package/dist/cli-bundle/chunks/{close-many-3UWKJRQK.js → close-many-AWTPXLHJ.js} +15 -15
- package/dist/cli-bundle/chunks/{close-many-A7U62CRI.js → close-many-SXODYBDP.js} +15 -15
- package/dist/cli-bundle/chunks/{comments-URWDZP2I.js → comments-OOH64LWW.js} +10 -10
- package/dist/cli-bundle/chunks/{comments-4EM7XR74.js → comments-YYW5P7AG.js} +10 -10
- package/dist/cli-bundle/chunks/{config-PSZ5GWAK.js → config-3445MCQQ.js} +8 -8
- package/dist/cli-bundle/chunks/{config-GRJYZ2O3.js → config-LCDMKRB2.js} +8 -8
- package/dist/cli-bundle/chunks/{context-BCR34RKM.js → context-DZMIBIVP.js} +13 -13
- package/dist/cli-bundle/chunks/{context-A46YAV2F.js → context-PJCURODY.js} +13 -13
- package/dist/cli-bundle/chunks/{contracts-JOPCQNDP.js → contracts-7YDFEJB3.js} +4 -4
- package/dist/cli-bundle/chunks/{contracts-HPT25X4D.js → contracts-MP2P3HL5.js} +4 -4
- package/dist/cli-bundle/chunks/{copy-KBTIUW7L.js → copy-63IQQRRS.js} +7 -7
- package/dist/cli-bundle/chunks/{copy-X7V6AEDB.js → copy-TASIH2AZ.js} +7 -7
- package/dist/cli-bundle/chunks/create-3BV2VA3Q.js +30 -0
- package/dist/cli-bundle/chunks/{create-ZPZKJDFQ.js → create-TGSB5GV4.js} +14 -14
- package/dist/cli-bundle/chunks/{delete-FGKVPUQZ.js → delete-ARILQQLB.js} +7 -7
- package/dist/cli-bundle/chunks/{delete-2ZI6CJZM.js → delete-ZQKBZYNK.js} +7 -7
- package/dist/cli-bundle/chunks/{deps-IUJOBF2H.js → deps-MSHQR2GY.js} +7 -7
- package/dist/cli-bundle/chunks/{deps-SJCEFU3C.js → deps-NJFJIMQ5.js} +7 -7
- package/dist/cli-bundle/chunks/{docs-UWJ75CKR.js → docs-SS4UKYYA.js} +9 -9
- package/dist/cli-bundle/chunks/{docs-2LXF5SVC.js → docs-XK2UVUXX.js} +9 -9
- package/dist/cli-bundle/chunks/{eval-ZTT3F3SL.js → eval-FVZGX5IZ.js} +12 -12
- package/dist/cli-bundle/chunks/{eval-FRIDCTM2.js → eval-JOTG2YHU.js} +12 -12
- package/dist/cli-bundle/chunks/{extension-VRYTNNSV.js → extension-NLMS47I4.js} +6 -5
- package/dist/cli-bundle/chunks/{extension-XFQG3BXL.js → extension-OQPS27B4.js} +6 -5
- package/dist/cli-bundle/chunks/{files-AJOGTTAN.js → files-3EVJQZ2N.js} +9 -9
- package/dist/cli-bundle/chunks/{files-B2RUCA32.js → files-Y2P6LN5A.js} +9 -9
- package/dist/cli-bundle/chunks/{focus-7N36RIMT.js → focus-D5ZUPTII.js} +8 -8
- package/dist/cli-bundle/chunks/{focus-CFE33IYC.js → focus-ZPIFTY4R.js} +8 -8
- package/dist/cli-bundle/chunks/{gc-SBF2FGHK.js → gc-LXXDY456.js} +3 -3
- package/dist/cli-bundle/chunks/{gc-OYJK4YBY.js → gc-RNOEQHSX.js} +3 -3
- package/dist/cli-bundle/chunks/{get-LLFWSPXW.js → get-Q3SZGQHD.js} +11 -11
- package/dist/cli-bundle/chunks/{get-577VLZZ7.js → get-W23G7MJX.js} +11 -11
- package/dist/cli-bundle/chunks/{health-PBJS7W2T.js → health-5LHSX365.js} +33 -19
- package/dist/cli-bundle/chunks/health-5LHSX365.js.map +7 -0
- package/dist/cli-bundle/chunks/{health-C2PUT6JZ.js → health-UDDGJLPP.js} +34 -20
- package/dist/cli-bundle/chunks/health-UDDGJLPP.js.map +1 -0
- package/dist/cli-bundle/chunks/{history-4FJK6Y3O.js → history-6CZVFIUJ.js} +10 -10
- package/dist/cli-bundle/chunks/history-YRQUD4YM.js +20 -0
- package/dist/cli-bundle/chunks/{history-compact-AXR6R6GU.js → history-compact-M35PDQ4G.js} +12 -12
- package/dist/cli-bundle/chunks/{history-compact-HXF3OT7G.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-UMPD4G3K.js → history-redact-AJGARHT3.js} +11 -11
- package/dist/cli-bundle/chunks/{history-repair-WHOK2ICG.js → history-repair-5RDMF7K4.js} +12 -12
- package/dist/cli-bundle/chunks/{history-repair-X57HE5EA.js → history-repair-YUAHIPIN.js} +12 -12
- package/dist/cli-bundle/chunks/init-DWAKYRXI.js +21 -0
- package/dist/cli-bundle/chunks/{init-N7MIIYCU.js → init-HASX3YNJ.js} +11 -10
- package/dist/cli-bundle/chunks/{learnings-GZRBIEAN.js → learnings-JNGUIJDK.js} +10 -10
- package/dist/cli-bundle/chunks/{learnings-FPG7WAVW.js → learnings-M4KA6MQE.js} +10 -10
- package/dist/cli-bundle/chunks/{list-ZDQ2OBSO.js → list-5UU2W24O.js} +10 -10
- package/dist/cli-bundle/chunks/{list-MZBCSKLU.js → list-6FMKTIH3.js} +10 -10
- package/dist/cli-bundle/chunks/{notes-LW53PFLH.js → notes-MODH5CBT.js} +10 -10
- package/dist/cli-bundle/chunks/{notes-WQAP67EC.js → notes-PYCPLA5Y.js} +10 -10
- package/dist/cli-bundle/chunks/{plan-VZKICKIJ.js → plan-DXRIRYRU.js} +14 -14
- package/dist/cli-bundle/chunks/{plan-AVJ4VJQO.js → plan-EHQALWSC.js} +14 -14
- package/dist/cli-bundle/chunks/{register-list-query-7BD6ZHU5.js → register-list-query-QAASVP2J.js} +19 -19
- package/dist/cli-bundle/chunks/{register-list-query-CM4SVAQA.js → register-list-query-WE54YJMH.js} +19 -19
- package/dist/cli-bundle/chunks/{register-mutation-ANZIWHUF.js → register-mutation-B6DZJTY2.js} +33 -33
- package/dist/cli-bundle/chunks/{register-mutation-PLFHAS4N.js → register-mutation-CPV4C2KR.js} +33 -33
- package/dist/cli-bundle/chunks/{register-operations-KQPQIFF2.js → register-operations-AT3BVVX2.js} +32 -32
- package/dist/cli-bundle/chunks/{register-operations-VLGCAWIW.js → register-operations-RC4C3423.js} +32 -32
- package/dist/cli-bundle/chunks/{register-setup-KPTZ36D4.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-TMEF6V7O.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-64JKQV7G.js → restore-FNBV4GWE.js} +11 -11
- package/dist/cli-bundle/chunks/restore-XY4YE2OV.js +19 -0
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-X6D6VSZR.js → scheduling-shortcuts-ECL6GBMZ.js} +14 -14
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-4ION7QAX.js → scheduling-shortcuts-JRIUREEU.js} +14 -14
- package/dist/cli-bundle/chunks/{schema-TA3NF3RG.js → schema-74YENAJL.js} +9 -9
- package/dist/cli-bundle/chunks/{schema-OA4RSVMI.js → schema-TCW3I7QR.js} +9 -9
- package/dist/cli-bundle/chunks/{search-UAIHEQZL.js → search-7USZ6XZA.js} +12 -12
- package/dist/cli-bundle/chunks/{search-INCM5I4J.js → search-GNAUE65M.js} +12 -12
- package/dist/cli-bundle/chunks/{stats-RHEMG4CE.js → stats-CVHASAEU.js} +8 -8
- package/dist/cli-bundle/chunks/{stats-WQWTIA5Y.js → stats-DQMKJMFT.js} +8 -8
- package/dist/cli-bundle/chunks/{telemetry-XA5D2QEO.js → telemetry-7P5EUWCS.js} +4 -4
- package/dist/cli-bundle/chunks/{telemetry-G6UKGKJU.js → telemetry-PQTL5YS2.js} +4 -4
- package/dist/cli-bundle/chunks/test-COWPCGBE.js +36 -0
- package/dist/cli-bundle/chunks/{test-ZMQF23P3.js → test-FDQZQNZ4.js} +16 -15
- package/dist/cli-bundle/chunks/{test-all-ZNQBMUOI.js → test-all-PIPPS4S5.js} +18 -17
- package/dist/cli-bundle/chunks/{test-all-ZNQBMUOI.js.map → test-all-PIPPS4S5.js.map} +1 -1
- package/dist/cli-bundle/chunks/{test-all-WUBBJCPU.js → test-all-WQIAZVA6.js} +16 -15
- package/dist/cli-bundle/chunks/{test-all-WUBBJCPU.js.map → test-all-WQIAZVA6.js.map} +1 -1
- package/dist/cli-bundle/chunks/{test-runs-N7LI7HLH.js → test-runs-JS6DNCCI.js} +5 -5
- package/dist/cli-bundle/chunks/{test-runs-RFA42EEX.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-6XFR7TFG.js → update-many-6NTZ5J5D.js} +23 -23
- package/dist/cli-bundle/chunks/{update-many-NMRUQZL2.js → update-many-B3TH5TDS.js} +23 -23
- package/dist/cli-bundle/chunks/{upgrade-QMCSONWR.js → upgrade-4C7VE7MS.js} +8 -7
- package/dist/cli-bundle/chunks/{upgrade-QMCSONWR.js.map → upgrade-4C7VE7MS.js.map} +1 -1
- package/dist/cli-bundle/chunks/{upgrade-EJTME2YQ.js → upgrade-76IKZ6EZ.js} +6 -5
- package/dist/cli-bundle/chunks/{upgrade-EJTME2YQ.js.map → upgrade-76IKZ6EZ.js.map} +1 -1
- package/dist/cli-bundle/chunks/{validate-KIIJY5RC.js → validate-AQU7OCL3.js} +62 -23
- package/dist/cli-bundle/chunks/validate-AQU7OCL3.js.map +7 -0
- package/dist/cli-bundle/chunks/{validate-3SUCHXXX.js → validate-BPM6Z3OT.js} +63 -24
- package/dist/cli-bundle/chunks/validate-BPM6Z3OT.js.map +1 -0
- 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/diagnostics/remediation.js +23 -2
- package/dist/core/diagnostics/remediation.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/core/item/item-format-version.d.ts +87 -0
- package/dist/core/item/item-format-version.js +85 -0
- package/dist/core/item/item-format-version.js.map +1 -0
- package/dist/core/item/item-format.js +8 -2
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/shared/constants.js +3 -2
- package/dist/core/shared/constants.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/runtime.d.ts +1 -0
- package/dist/sdk/runtime.js +3 -2
- package/dist/sdk/runtime.js.map +1 -1
- package/dist/sdk/testing.d.ts +567 -1
- package/dist/sdk/testing.js +573 -18
- package/dist/sdk/testing.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/docs/ARCHITECTURE.md +2 -0
- package/docs/COMMANDS.md +2 -0
- package/docs/EXTENSIONS.md +4 -8
- package/docs/SDK.md +328 -0
- package/package.json +2 -2
- package/packages/pm-command-kit/README.md +4 -0
- package/packages/pm-todos/extensions/todos/runtime.js +191 -8
- package/packages/pm-todos/extensions/todos/runtime.ts +207 -7
- package/dist/cli-bundle/chunks/activity-7G7NNNZQ.js +0 -18
- package/dist/cli-bundle/chunks/chunk-5MWA46UN.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-AZ75OVK4.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-FSOJCFDS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-H3ZTSYPA.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-IWKD7B33.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-LTUB7ARL.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-MFCFHL27.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-OLEP5TJH.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-QWAJPGEI.js.map +0 -7
- package/dist/cli-bundle/chunks/close-NNZZTZ5V.js +0 -15
- package/dist/cli-bundle/chunks/create-4KOAQ6ME.js +0 -30
- package/dist/cli-bundle/chunks/health-C2PUT6JZ.js.map +0 -1
- package/dist/cli-bundle/chunks/health-PBJS7W2T.js.map +0 -7
- package/dist/cli-bundle/chunks/history-ZXNWG6H4.js +0 -20
- package/dist/cli-bundle/chunks/history-redact-GV633Z4H.js +0 -21
- package/dist/cli-bundle/chunks/init-KQWZSNBX.js +0 -20
- package/dist/cli-bundle/chunks/register-setup-KPTZ36D4.js.map +0 -7
- package/dist/cli-bundle/chunks/register-setup-TMEF6V7O.js.map +0 -1
- package/dist/cli-bundle/chunks/restore-GKM26SAW.js +0 -19
- package/dist/cli-bundle/chunks/test-XF7BYLMZ.js +0 -35
- package/dist/cli-bundle/chunks/update-CPNOG73P.js +0 -24
- package/dist/cli-bundle/chunks/update-T5AYT6ZN.js +0 -28
- package/dist/cli-bundle/chunks/validate-3SUCHXXX.js.map +0 -1
- package/dist/cli-bundle/chunks/validate-KIIJY5RC.js.map +0 -7
- /package/dist/cli-bundle/chunks/{activity-KEEITOTB.js.map → activity-DXS2XMQU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{activity-7G7NNNZQ.js.map → activity-NEOI45NX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{aggregate-5BTHOHW2.js.map → aggregate-IHM4KMQ3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{aggregate-GB2LJNTZ.js.map → aggregate-NMYDVQF7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-BBM4MNVD.js.map → append-3HY5G7ET.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-BFV5UYWS.js.map → append-K54MDQYC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DKWIPIJY.js.map → chunk-25XZN3JD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GF44HVZL.js.map → chunk-2LEYMXI6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XNQ3YH6N.js.map → chunk-3VLPDG3J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-W2ZESOQE.js.map → chunk-44O4JIN6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RADIHKJ3.js.map → chunk-47HTJ6BU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-B3LROPTV.js.map → chunk-4JXWVHMN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HWHZ7EY7.js.map → chunk-4SDKF5BG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RNKUCHUQ.js.map → chunk-5SESR24H.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RICT5QYR.js.map → chunk-6FQHNHQQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FA5O2DEG.js.map → chunk-6UPTNMVW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4KFL5OYK.js.map → chunk-75VEYQJS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2ZY5SLNR.js.map → chunk-77VKGH4L.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6Y7IQ6XN.js.map → chunk-7MALIV5H.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NMQNXH4U.js.map → chunk-7PBGTIN3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3KVCMB2M.js.map → chunk-A25LOPRG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6KSFULO6.js.map → chunk-A7E4ZXG2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ZHCSGIUX.js.map → chunk-AJXYOYJV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PF5GLFPU.js.map → chunk-B2KR24R4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ZYG4TR32.js.map → chunk-C5SWTISA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-F4EYOSNC.js.map → chunk-CLLVBO3I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4PW4C3ZB.js.map → chunk-CWPBGUC7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-J7VSEFWB.js.map → chunk-DBQUQ3AS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2LUNPA3U.js.map → chunk-DHBPJ7VG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6FSPWUBI.js.map → chunk-DMT4ODVN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XXGAWTH5.js.map → chunk-DU64SZUQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CNPWCUDR.js.map → chunk-EVPVCE4R.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ACULWT7G.js.map → chunk-FK6MV5F5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XKJDCJEH.js.map → chunk-GGAXE22C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SL233DQD.js.map → chunk-GNDHOR64.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-U3WTMYBX.js.map → chunk-GU7YHKYP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-26OQTCGH.js.map → chunk-GXBSFKSX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AOCYDQLT.js.map → chunk-H6FNDCDI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ICEWMJYH.js.map → chunk-HYQV75IB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5XK2RYJR.js.map → chunk-I367IDZP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-E4E7UQBT.js.map → chunk-I6XE47J2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NKTUBA2C.js.map → chunk-J2TSPY5L.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DYOJJTCG.js.map → chunk-JLSC5NPC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FXKPUMIR.js.map → chunk-JY25IOEZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NCGQ27PK.js.map → chunk-K25UDYJ4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3WAKNI2W.js.map → chunk-KBTREGVO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KCJZREBI.js.map → chunk-KK4TQ3ZP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7MMXBIRZ.js.map → chunk-KRJJPDUO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BYNJWB5F.js.map → chunk-MD7XKVWI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WFOITX4A.js.map → chunk-MNGAQB2E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-II4BRHKM.js.map → chunk-NIWY4V4Z.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YT4Z2OVB.js.map → chunk-NKZOJPXK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YBQF4CAW.js.map → chunk-NVUATMTC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-MTQK5ZSB.js.map → chunk-PCH2JTEO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VE3BUO3R.js.map → chunk-PJS2J7Z4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2QJLN4KM.js.map → chunk-QQWEROGS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6DZO5NN7.js.map → chunk-RPRFBXND.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BBSUVIIT.js.map → chunk-SFKQAVZA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-X3CD2VUI.js.map → chunk-THKDPOS5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OVSFW4KD.js.map → chunk-TIKJAXQW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4YMX7XFI.js.map → chunk-TJABI6PR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AW4PYYNF.js.map → chunk-TZQKEBKF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QUTJOHGK.js.map → chunk-UKK2VTTH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ATRXPXAL.js.map → chunk-V4SM4UAL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6KARQMC6.js.map → chunk-VB54F347.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6LTSLEHD.js.map → chunk-WBSYW3NT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4S4INK3B.js.map → chunk-WQDX7DVG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ETJKPURB.js.map → chunk-XKNF3VRJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BZWIDTDE.js.map → chunk-Y335KFHD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-K2LBDYDC.js.map → chunk-Y4BZEND6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EOFROIC5.js.map → chunk-YATDFWYK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EKMHDL6Z.js.map → chunk-YJICYNAV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WMQBNVZL.js.map → chunk-YQSWTVZF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FBBPCSJM.js.map → chunk-YRLLL5TY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-G57ZJLZ4.js.map → claim-MPXNVBZQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-TRSDQO6L.js.map → claim-SKHJDLW6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-4QMUQMON.js.map → close-4RKSL5L6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-NNZZTZ5V.js.map → close-Z6AI736U.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-3UWKJRQK.js.map → close-many-AWTPXLHJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-A7U62CRI.js.map → close-many-SXODYBDP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-URWDZP2I.js.map → comments-OOH64LWW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-4EM7XR74.js.map → comments-YYW5P7AG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{config-PSZ5GWAK.js.map → config-3445MCQQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{config-GRJYZ2O3.js.map → config-LCDMKRB2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-BCR34RKM.js.map → context-DZMIBIVP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-A46YAV2F.js.map → context-PJCURODY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{contracts-JOPCQNDP.js.map → contracts-7YDFEJB3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{contracts-HPT25X4D.js.map → contracts-MP2P3HL5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-KBTIUW7L.js.map → copy-63IQQRRS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-X7V6AEDB.js.map → copy-TASIH2AZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-4KOAQ6ME.js.map → create-3BV2VA3Q.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-ZPZKJDFQ.js.map → create-TGSB5GV4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-FGKVPUQZ.js.map → delete-ARILQQLB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-2ZI6CJZM.js.map → delete-ZQKBZYNK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-IUJOBF2H.js.map → deps-MSHQR2GY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-SJCEFU3C.js.map → deps-NJFJIMQ5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-UWJ75CKR.js.map → docs-SS4UKYYA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-2LXF5SVC.js.map → docs-XK2UVUXX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-ZTT3F3SL.js.map → eval-FVZGX5IZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-FRIDCTM2.js.map → eval-JOTG2YHU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-VRYTNNSV.js.map → extension-NLMS47I4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-XFQG3BXL.js.map → extension-OQPS27B4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-AJOGTTAN.js.map → files-3EVJQZ2N.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-B2RUCA32.js.map → files-Y2P6LN5A.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-7N36RIMT.js.map → focus-D5ZUPTII.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-CFE33IYC.js.map → focus-ZPIFTY4R.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-SBF2FGHK.js.map → gc-LXXDY456.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-OYJK4YBY.js.map → gc-RNOEQHSX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{get-LLFWSPXW.js.map → get-Q3SZGQHD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{get-577VLZZ7.js.map → get-W23G7MJX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-4FJK6Y3O.js.map → history-6CZVFIUJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-ZXNWG6H4.js.map → history-YRQUD4YM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-AXR6R6GU.js.map → history-compact-M35PDQ4G.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-HXF3OT7G.js.map → history-compact-VWUSQH6Z.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-GV633Z4H.js.map → history-redact-27OEOZRZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-UMPD4G3K.js.map → history-redact-AJGARHT3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-WHOK2ICG.js.map → history-repair-5RDMF7K4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-X57HE5EA.js.map → history-repair-YUAHIPIN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-KQWZSNBX.js.map → init-DWAKYRXI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-N7MIIYCU.js.map → init-HASX3YNJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-GZRBIEAN.js.map → learnings-JNGUIJDK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-FPG7WAVW.js.map → learnings-M4KA6MQE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-ZDQ2OBSO.js.map → list-5UU2W24O.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-MZBCSKLU.js.map → list-6FMKTIH3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-LW53PFLH.js.map → notes-MODH5CBT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-WQAP67EC.js.map → notes-PYCPLA5Y.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-VZKICKIJ.js.map → plan-DXRIRYRU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-AVJ4VJQO.js.map → plan-EHQALWSC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-7BD6ZHU5.js.map → register-list-query-QAASVP2J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-CM4SVAQA.js.map → register-list-query-WE54YJMH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-ANZIWHUF.js.map → register-mutation-B6DZJTY2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-PLFHAS4N.js.map → register-mutation-CPV4C2KR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-KQPQIFF2.js.map → register-operations-AT3BVVX2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-VLGCAWIW.js.map → register-operations-RC4C3423.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-64JKQV7G.js.map → restore-FNBV4GWE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-GKM26SAW.js.map → restore-XY4YE2OV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-X6D6VSZR.js.map → scheduling-shortcuts-ECL6GBMZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-4ION7QAX.js.map → scheduling-shortcuts-JRIUREEU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-TA3NF3RG.js.map → schema-74YENAJL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-OA4RSVMI.js.map → schema-TCW3I7QR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-UAIHEQZL.js.map → search-7USZ6XZA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-INCM5I4J.js.map → search-GNAUE65M.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-RHEMG4CE.js.map → stats-CVHASAEU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-WQWTIA5Y.js.map → stats-DQMKJMFT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{telemetry-XA5D2QEO.js.map → telemetry-7P5EUWCS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{telemetry-G6UKGKJU.js.map → telemetry-PQTL5YS2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-XF7BYLMZ.js.map → test-COWPCGBE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-ZMQF23P3.js.map → test-FDQZQNZ4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-runs-N7LI7HLH.js.map → test-runs-JS6DNCCI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-runs-RFA42EEX.js.map → test-runs-NZD2QGL5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-CPNOG73P.js.map → update-7IYQHX4Q.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-T5AYT6ZN.js.map → update-IJKDRBIX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-6XFR7TFG.js.map → update-many-6NTZ5J5D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-NMRUQZL2.js.map → update-many-B3TH5TDS.js.map} +0 -0
package/docs/COMMANDS.md
CHANGED
|
@@ -618,6 +618,8 @@ pm validate --check-metadata --json | jq -r '.checks[] | select(.name=="metadata
|
|
|
618
618
|
|
|
619
619
|
`pm validate --check-files` classifies every stale linked path in `details.missing_linked_path_classifications` as either `moved` (a file with the same basename still exists in the scan — the row carries the top relink candidate, e.g. `old/path.md:moved:new/path.md`) or `deleted` (no candidate anywhere, e.g. `old/path.md:deleted`). It also reports `details.missing_linked_path_rows` — owner attribution so cleanup is evidence-based without a reverse lookup. By default these are token-efficient one-liners (`<path>:<classification> owner=<id> status=<status> field=<files|docs> title="…"`); `--verbose-file-lists` expands them to the full structured shape (`{ path, classification, items: [{ id, type, title, status, field }] }`). Orphaned existing files get the same treatment through `details.orphaned_path_classifications` and `details.orphaned_path_rows`; classifications start with `docs_unowned`, `tests_unowned`, `source_unowned`, or `unlinked_existing`, and rows include a concrete `pm docs|files <id> --add ...` hint when a likely owner is found from nearby linked paths. `--prune-missing` bulk-removes the stale links classified `deleted` from their items (link removal only — real files are never touched; `moved` links are kept so their relink candidates are not lost) and reports each removal in `fixes.applied_fixes[]` as the equivalent `pm files <id> --remove <path>` / `pm docs <id> --remove <path>` command. It honors `--dry-run` and implies `--check-files`.
|
|
620
620
|
|
|
621
|
+
The default `pm validate` run also includes a `format_version` check that compares every item's stored front-matter format version (`pm_format_version`, absent meaning the implicit baseline version `1`) against the version this pm runtime writes. `details.outdated_items` lists items that predate the current version (a future storage migration would rewrite them — advisory `warn`); `details.ahead_items` lists items written by a *newer* pm than the one running, which is an `error` because validation cannot vouch for fields it does not understand (upgrade pm to read them safely). At the current baseline version both lists are empty and the check is `ok`. The same `pm_format_version` integrity is surfaced by `pm health` under the `integrity` check (`details.counts.item_outdated_format_version` / `item_ahead_format_version`).
|
|
622
|
+
|
|
621
623
|
### Telemetry Local Analytics
|
|
622
624
|
|
|
623
625
|
`pm telemetry` surfaces local queue/runtime telemetry state without running full health checks:
|
package/docs/EXTENSIONS.md
CHANGED
|
@@ -4,6 +4,7 @@ Packages add optional `pm` workflows without changing the core CLI. A package ca
|
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
6
|
pm package init ./my-package
|
|
7
|
+
pm package init ./my-hook-package --capability hooks
|
|
7
8
|
pm install ./my-package --project
|
|
8
9
|
pm package doctor --project --detail summary
|
|
9
10
|
pm package reload --project
|
|
@@ -86,7 +87,7 @@ Package roots declare resources in `package.json` under `pm`:
|
|
|
86
87
|
|
|
87
88
|
Installation activates `pm.extensions`. `pm.docs`, `pm.examples`, `pm.assets`, and `pm.prompts` are catalog metadata (metadata-only — they are discovered and surfaced in the catalog but not executed). Declare agent-facing prompt/slash-command markdown under `pm.prompts` and non-code assets (images, skills, fixtures) under `pm.assets`; their conventional roots are `prompts/` (also `.agents/pm/prompts/`) and `assets/` (also `.agents/pm/assets/`).
|
|
88
89
|
|
|
89
|
-
`pm package init` emits a root extension (`"extensions": ["."]`) so local package installs can activate without dependency bootstrapping. Larger packages may point at nested extension directories after declaring runtime dependencies and validating with `pm package doctor`.
|
|
90
|
+
`pm package init` emits a root extension (`"extensions": ["."]`) so local package installs can activate without dependency bootstrapping. The default `--capability commands` scaffold registers a starter command and a colocated `node:test` suite. `--capability hooks` keeps the starter command and adds an `after_command` lifecycle hook plus SDK testing coverage with `assertRegisteredHook` and `runRegisteredHookForTest`, giving package authors a runnable template for reacting to pm mutations when project management is context management. `--capability search` keeps the starter command and adds a deterministic search provider/vector-store adapter pair plus SDK tests with `assertRegisteredSearchProvider`, `assertRegisteredVectorStoreAdapter`, `runRegisteredSearchProviderForTest`, and `runRegisteredVectorStoreAdapterForTest`, giving retrieval packages a copyable context-management primitive without external services. `--capability importers` keeps the starter command and adds paired import/export command registrations plus SDK tests with `assertRegisteredImporter`, `assertRegisteredExporter`, `runRegisteredImporterForTest`, and `runRegisteredExporterForTest`, giving integration packages a copyable context-movement primitive for synchronizing external project systems; the generated manifest declares both `importers` and `schema` because the starter includes schema-governed flag metadata. Starter manifests use the same least-privilege policy metadata as pure first-party command packages: `trusted: true`, `sandbox_profile: "strict"`, and explicit `false` permissions for `fs_read`, `fs_write`, `network`, `env_read`, `env_write`, and `process_spawn`. Larger packages may point at nested extension directories after declaring runtime dependencies, relaxing only the permissions they actually need, and validating with `pm package doctor`.
|
|
90
91
|
|
|
91
92
|
Package tests can pair `readPmPackageManifest(packageRoot)` with
|
|
92
93
|
`assertPackageManifest(manifest, { resources: ... })` from
|
|
@@ -198,7 +199,7 @@ Rules:
|
|
|
198
199
|
- Both bounds share the same warning-code shapes: `*_invalid` blocks, `*_unchecked` allows with a warning, and `extension_pm_min_version_unmet` / `extension_pm_max_version_exceeded` blocks unless the max-version warn mode is enabled.
|
|
199
200
|
- An empty-string or non-string `pm_min_version`/`pm_max_version` makes the whole manifest malformed (`extension_manifest_invalid:<layer>:<name>`). Omit the field instead of leaving it blank.
|
|
200
201
|
- Optional `engines.pm` and `engines.node` metadata is accepted for tooling, but `pm_min_version`/`pm_max_version` are the loader-enforced compatibility fields.
|
|
201
|
-
- Declare only capabilities the extension actually uses.
|
|
202
|
+
- Declare only capabilities the extension actually uses. Declaring a capability it never registers against is over-broad: `pm package doctor` emits an advisory `extension_capability_unused:<layer>:<name>:<capability>` warning (never blocking) so you can trim the manifest, while the inverse — registering a surface whose capability is undeclared — is the blocking `extension_capability_missing` activation failure. Catch over-declaration earlier with the `assertExtensionCapabilityUsage` SDK testing helper.
|
|
202
203
|
- Unknown capabilities emit deterministic warnings.
|
|
203
204
|
- Legacy aliases such as `migration` and `validation` are normalized to `schema` with warnings.
|
|
204
205
|
|
|
@@ -420,12 +421,7 @@ import { activateExtensionForTest, assertRegisteredCommandContract } from "@unbr
|
|
|
420
421
|
|
|
421
422
|
Use `createPmCliExpectedError(message, { exitCode, context })` for expected user/action failures from package commands. It creates an `Error` named `PmCliError` with a structural `exitCode`, so separately installed package code still gets expected-error handling and Sentry filtering.
|
|
422
423
|
|
|
423
|
-
Use `activateExtensionForTest(module)` in package unit tests when you need an
|
|
424
|
-
`activation.registrations` or `activation.hooks` object for assertion helpers.
|
|
425
|
-
It exercises the real activation and capability validation path without
|
|
426
|
-
requiring private loader imports or a temporary `.agents/pm/extensions` tree.
|
|
427
|
-
Keep `pm package doctor --project --detail deep --trace` and runtime contracts
|
|
428
|
-
for integration tests against installed packages.
|
|
424
|
+
Use `activateExtensionForTest(module)` in package unit tests when you need an `activation.registrations` or `activation.hooks` object for assertion helpers. Then `runRegisteredCommandForTest(activation.commands, { command })` invokes a registered command handler through pm's real dispatch engine to assert behavior, not just wiring; the matching `runRegisteredHookForTest` (lifecycle hooks), `runRegistered{Parser,Preflight,Command,Renderer,Service}OverrideForTest` (override surfaces), and `runRegistered{SearchProvider,VectorStoreAdapter,Migration,Importer,Exporter}ForTest` (executable registrations — the importer/exporter helpers take the whole `activation` and resolve by name, deriving the command path internally) helpers extend that invoke verb to every other runtime surface. Keep `pm package doctor --project --detail deep --trace` and runtime contracts for integration tests against installed packages.
|
|
429
425
|
|
|
430
426
|
`PM_CLI_PACKAGE_ROOT` is first-party only. Bundled packages in this repository use it to find the running CLI's `dist/sdk/runtime.js` before they are published or installed independently. External packages must not read this environment variable or import from `dist/` or `src/core`; use `@unbrained/pm-cli/sdk`, `@unbrained/pm-cli/sdk/runtime`, and `@unbrained/pm-cli/sdk/testing`. During `pm install npm:<package>`, pm links the installed package's `@unbrained/pm-cli` dependency back to the running host CLI so SDK imports resolve without a duplicate nested CLI install.
|
|
431
427
|
|
package/docs/SDK.md
CHANGED
|
@@ -55,6 +55,14 @@ Package manifest exports:
|
|
|
55
55
|
- `readPmPackageManifest`
|
|
56
56
|
- `collectPackageExtensionDirectories`
|
|
57
57
|
|
|
58
|
+
Storage format-version exports (under `@unbrained/pm-cli/sdk/runtime`):
|
|
59
|
+
|
|
60
|
+
- `CURRENT_ITEM_FORMAT_VERSION` / `BASELINE_ITEM_FORMAT_VERSION`
|
|
61
|
+
- `effectiveItemFormatVersion` (resolve an item's stored version; absent means the baseline)
|
|
62
|
+
- `normalizeItemFormatVersion` (persisted form; the baseline is dropped so it is never serialized)
|
|
63
|
+
- `classifyItemFormatVersion` (`current` / `outdated` / `ahead`)
|
|
64
|
+
- `scanItemFormatVersions` (partition items into outdated/ahead reference lists)
|
|
65
|
+
|
|
58
66
|
Command/action contract exports:
|
|
59
67
|
|
|
60
68
|
- `PM_CORE_COMMAND_NAMES`
|
|
@@ -66,8 +74,23 @@ Command/action contract exports:
|
|
|
66
74
|
Testing helper exports (also under `@unbrained/pm-cli/sdk/testing`):
|
|
67
75
|
|
|
68
76
|
- `activateExtensionForTest`
|
|
77
|
+
- `deactivateExtensionForTest`
|
|
78
|
+
- `runRegisteredCommandForTest`
|
|
79
|
+
- `runRegisteredHookForTest`
|
|
80
|
+
- `runRegisteredParserOverrideForTest`
|
|
81
|
+
- `runRegisteredPreflightOverrideForTest`
|
|
82
|
+
- `runRegisteredCommandOverrideForTest`
|
|
83
|
+
- `runRegisteredRendererOverrideForTest`
|
|
84
|
+
- `runRegisteredServiceOverrideForTest`
|
|
85
|
+
- `runRegisteredSearchProviderForTest`
|
|
86
|
+
- `runRegisteredVectorStoreAdapterForTest`
|
|
87
|
+
- `runRegisteredMigrationForTest`
|
|
88
|
+
- `runRegisteredImporterForTest`
|
|
89
|
+
- `runRegisteredExporterForTest`
|
|
90
|
+
- `assertExtensionDeactivated`
|
|
69
91
|
- `assertPackageManifest`
|
|
70
92
|
- `assertRegisteredCommandContract`
|
|
93
|
+
- `assertRegisteredFlags`
|
|
71
94
|
- `assertRegisteredCommandOverride`
|
|
72
95
|
- `assertRegisteredParserOverride`
|
|
73
96
|
- `assertRegisteredPreflightOverride`
|
|
@@ -77,6 +100,113 @@ Testing helper exports (also under `@unbrained/pm-cli/sdk/testing`):
|
|
|
77
100
|
- `assertRegisteredImporter`
|
|
78
101
|
- `assertRegisteredExporter`
|
|
79
102
|
- `assertRegisteredVectorStoreAdapter`
|
|
103
|
+
- `assertRegisteredItemField`
|
|
104
|
+
- `assertRegisteredItemType`
|
|
105
|
+
- `assertRegisteredServiceOverride`
|
|
106
|
+
- `assertRegisteredMigration`
|
|
107
|
+
- `assertExtensionCapabilityUsage`
|
|
108
|
+
|
|
109
|
+
`assertExtensionCapabilityUsage(activation, { declared })` is the least-privilege
|
|
110
|
+
counterpart of the per-surface `assertRegistered*` helpers: pass the same
|
|
111
|
+
capabilities as your `manifest.capabilities` and it fails the test when the
|
|
112
|
+
manifest grants a capability the extension never registers against. Use
|
|
113
|
+
`allowUnused` for capabilities a runtime registers only behind a config flag.
|
|
114
|
+
|
|
115
|
+
`deactivateExtensionForTest(module, options)` is the teardown counterpart to
|
|
116
|
+
`activateExtensionForTest`: it runs pm's real `deactivateExtensions` engine
|
|
117
|
+
(including the bounded per-hook timeout and best-effort failure capture) over the
|
|
118
|
+
module and returns the `ExtensionDeactivationResult`, so a package can prove its
|
|
119
|
+
`deactivate` releases the resources `activate` opened. `assertExtensionDeactivated(result)`
|
|
120
|
+
asserts the single-extension happy path (one extension deactivated, none failed)
|
|
121
|
+
by default; pass `{ deactivated, failed }` to assert other counts. Forward the
|
|
122
|
+
`activation` result and `deactivateTimeoutMs` to mirror real host teardown.
|
|
123
|
+
|
|
124
|
+
`runRegisteredCommandForTest(activation.commands, { command, args, options, global, pmRoot })`
|
|
125
|
+
is the "invoke" verb that completes the package-author testing loop —
|
|
126
|
+
`activateExtensionForTest` → `assertRegisteredCommandContract` → **run** →
|
|
127
|
+
`deactivateExtensionForTest`. It dispatches a registered command handler through
|
|
128
|
+
pm's real engine and returns the `CommandHandlerResult`, so a test can assert
|
|
129
|
+
*behavior* (`result.result`) rather than only that the command is wired. The
|
|
130
|
+
`CommandHandlerContext` is built with agent-safe global defaults
|
|
131
|
+
(`{ json: true, quiet: true, noPager: true }`) that callers may override. A clean
|
|
132
|
+
run yields `{ handled: true, result, warnings: [] }`; a handler that throws a
|
|
133
|
+
non-exit error yields `{ handled: false, warnings: [code], errorMessage }` so the
|
|
134
|
+
failure can be asserted, while one that throws an error carrying a numeric
|
|
135
|
+
`exitCode` propagates the throw. An unregistered command throws a descriptive
|
|
136
|
+
error listing the available handler command paths. Because
|
|
137
|
+
`registerImporter`/`registerExporter` register handlers under `"<name> import"` /
|
|
138
|
+
`"<name> export"`, the same helper exercises importer and exporter handlers too.
|
|
139
|
+
|
|
140
|
+
The remaining runtime surfaces an extension can register have matching invoke
|
|
141
|
+
helpers, so the "invoke" verb covers the whole command pipeline — not just
|
|
142
|
+
command handlers:
|
|
143
|
+
|
|
144
|
+
- `runRegisteredHookForTest(activation.hooks, { kind, context })` fires every
|
|
145
|
+
registered lifecycle hook of a `kind` (`before_command` | `after_command` |
|
|
146
|
+
`on_read` | `on_write` | `on_index`) through pm's real hook runner and returns
|
|
147
|
+
the warnings array (`[]` = clean; a thrown hook contributes one
|
|
148
|
+
`extension_hook_failed:*` warning while the others still run). The `context` is
|
|
149
|
+
type-safe per `kind`.
|
|
150
|
+
- `runRegisteredParserOverrideForTest(activation.parsers, context)` returns the
|
|
151
|
+
rewritten `ParserOverrideResult` (args/options/global the override produces
|
|
152
|
+
before dispatch).
|
|
153
|
+
- `runRegisteredPreflightOverrideForTest(activation.preflight, context)` returns
|
|
154
|
+
the `PreflightOverrideResult` (the migration/format gate decision).
|
|
155
|
+
- `runRegisteredCommandOverrideForTest(activation.commands, context)` returns the
|
|
156
|
+
`CommandOverrideResult` (the transformed command result payload).
|
|
157
|
+
- `runRegisteredRendererOverrideForTest(activation.renderers, context)` returns
|
|
158
|
+
the `RendererOverrideResult` (the custom string rendered for an output format).
|
|
159
|
+
- `runRegisteredServiceOverrideForTest(activation.services, context)` returns the
|
|
160
|
+
`ServiceOverrideResult` (how the override handles an internal service payload).
|
|
161
|
+
|
|
162
|
+
Each override helper guards that a matching override is registered for the target
|
|
163
|
+
(command / format / service), so a typo surfaces as a descriptive error rather
|
|
164
|
+
than a silent `overridden: false` / `handled: false`.
|
|
165
|
+
|
|
166
|
+
The *executable registration* surfaces — search providers, vector store
|
|
167
|
+
adapters, schema migrations, importers, and exporters — also have invoke helpers,
|
|
168
|
+
so every executable register\* method has both an `assertRegistered*` and a
|
|
169
|
+
`runRegistered*ForTest` counterpart. Each exercises the real registered behavior,
|
|
170
|
+
not a re-implementation, but along two execution paths that mirror how the host
|
|
171
|
+
runs them. Providers, adapters, and migrations are resolved through the same
|
|
172
|
+
runtime resolver the host uses and invoked via their `runtime_definition` (the
|
|
173
|
+
clone that preserves live functions). Importers and exporters have no standalone
|
|
174
|
+
`runtime_definition` — `registerImporter`/`registerExporter` wrap their handler
|
|
175
|
+
into a command path, so their helpers resolve by name and dispatch through the
|
|
176
|
+
command runner instead, returning a `CommandHandlerResult`:
|
|
177
|
+
|
|
178
|
+
- `runRegisteredSearchProviderForTest(activation.registrations, { provider, operation, context })`
|
|
179
|
+
resolves a registered provider by name (case-insensitive, last registration
|
|
180
|
+
wins) and invokes one `operation` — `query`, `embed`, `embedBatch`,
|
|
181
|
+
`queryExpansion`, or `rerank` — returning that operation's result. The
|
|
182
|
+
`context` and return type are inferred from `operation`, and the camelCase /
|
|
183
|
+
snake_case spellings the host accepts (`embedBatch`/`embed_batch`,
|
|
184
|
+
`queryExpansion`/`query_expansion`) both resolve.
|
|
185
|
+
- `runRegisteredVectorStoreAdapterForTest(activation.registrations, { adapter, operation, context })`
|
|
186
|
+
resolves a registered adapter by name and invokes `query` (returns
|
|
187
|
+
`VectorStoreQueryHit[]`), `upsert`, or `delete`.
|
|
188
|
+
- `runRegisteredMigrationForTest(activation.registrations, { migration, extensionName?, pmRoot? })`
|
|
189
|
+
resolves a registered migration by id and invokes its `run` with a context
|
|
190
|
+
mirroring the host's (`command: "migration"`, the registering extension's
|
|
191
|
+
layer/name, the supplied `pmRoot`, and the migration's normalized status),
|
|
192
|
+
returning whatever `run` returns. Unlike the host — which skips applied
|
|
193
|
+
migrations and folds a throw into a warning — it always invokes `run` and lets a
|
|
194
|
+
throw propagate, so both success and failure are assertable.
|
|
195
|
+
- `runRegisteredImporterForTest(activation, { importer, extensionName?, args?, options?, global?, pmRoot? })`
|
|
196
|
+
and `runRegisteredExporterForTest(activation, { exporter, ... })` resolve a
|
|
197
|
+
registered importer/exporter by name, derive the `"<name> import"` /
|
|
198
|
+
`"<name> export"` command path internally — so authors never hand-build it — and
|
|
199
|
+
validate that the name is genuinely a registered importer/exporter before
|
|
200
|
+
dispatching. They take the whole `activation` because resolution spans two
|
|
201
|
+
sub-registries (`registrations` proves it exists, `commands` holds the wrapped
|
|
202
|
+
handler), and they return the command runner's `CommandHandlerResult` verbatim,
|
|
203
|
+
so `handled`/`warnings`/`errorMessage` semantics and `exitCode` propagation match
|
|
204
|
+
invoking the importer/exporter as a command.
|
|
205
|
+
|
|
206
|
+
Each surface helper guards that the named provider / adapter / migration /
|
|
207
|
+
importer / exporter is registered (and, for providers and adapters, implements the
|
|
208
|
+
requested operation), so a typo surfaces as a descriptive error rather than a
|
|
209
|
+
silent no-op. All invoke helpers are `async`, so a test always `await`s them.
|
|
80
210
|
|
|
81
211
|
Commander option contract exports:
|
|
82
212
|
|
|
@@ -103,6 +233,13 @@ Extension runtime contract exports:
|
|
|
103
233
|
- `PM_EXTENSION_TRUST_MODE_CONTRACTS`
|
|
104
234
|
- `PM_EXTENSION_SANDBOX_PROFILE_CONTRACTS`
|
|
105
235
|
|
|
236
|
+
Least-privilege capability reconciliation exports (map declared capabilities to
|
|
237
|
+
the registration surfaces a package actually exercises at activation):
|
|
238
|
+
|
|
239
|
+
- `EXTENSION_CAPABILITY_REGISTRATION_SURFACES`
|
|
240
|
+
- `collectUsedExtensionCapabilities`
|
|
241
|
+
- `reconcileExtensionCapabilityUsage`
|
|
242
|
+
|
|
106
243
|
Common types:
|
|
107
244
|
|
|
108
245
|
- `ExtensionApi`
|
|
@@ -182,6 +319,29 @@ assertPackageManifest(manifest, {
|
|
|
182
319
|
});
|
|
183
320
|
```
|
|
184
321
|
|
|
322
|
+
Package tests can also assert extension registrations without importing private
|
|
323
|
+
loader internals. Use `activateExtensionForTest` plus the targeted assertion for
|
|
324
|
+
the surface your package owns:
|
|
325
|
+
|
|
326
|
+
```ts
|
|
327
|
+
import {
|
|
328
|
+
activateExtensionForTest,
|
|
329
|
+
assertRegisteredCommandContract,
|
|
330
|
+
assertRegisteredFlags,
|
|
331
|
+
} from "@unbrained/pm-cli/sdk/testing";
|
|
332
|
+
|
|
333
|
+
const activation = await activateExtensionForTest(extensionModule);
|
|
334
|
+
|
|
335
|
+
assertRegisteredCommandContract(activation.registrations, {
|
|
336
|
+
command: "incident triage",
|
|
337
|
+
flags: ["--severity"],
|
|
338
|
+
});
|
|
339
|
+
assertRegisteredFlags(activation.registrations, {
|
|
340
|
+
targetCommand: "list",
|
|
341
|
+
flags: ["--incident-filter"],
|
|
342
|
+
});
|
|
343
|
+
```
|
|
344
|
+
|
|
185
345
|
For provider-safe schemas, use `PM_PROVIDER_TOOL_PARAMETERS_SCHEMA`. It is flat and avoids advanced schema constructs such as root `oneOf`.
|
|
186
346
|
|
|
187
347
|
## Capability Requirements
|
|
@@ -246,6 +406,16 @@ Manifest:
|
|
|
246
406
|
"version": "0.1.0",
|
|
247
407
|
"entry": "./index.js",
|
|
248
408
|
"pm_min_version": "2026.5.31",
|
|
409
|
+
"trusted": true,
|
|
410
|
+
"sandbox_profile": "strict",
|
|
411
|
+
"permissions": {
|
|
412
|
+
"fs_read": false,
|
|
413
|
+
"fs_write": false,
|
|
414
|
+
"network": false,
|
|
415
|
+
"env_read": false,
|
|
416
|
+
"env_write": false,
|
|
417
|
+
"process_spawn": false
|
|
418
|
+
},
|
|
249
419
|
"capabilities": ["commands"]
|
|
250
420
|
}
|
|
251
421
|
```
|
|
@@ -264,11 +434,27 @@ Manifest typing also accepts optional `engines` metadata:
|
|
|
264
434
|
```
|
|
265
435
|
|
|
266
436
|
Use `pm_min_version` for the loader gate. Keep `engines` as package-manager and tooling metadata.
|
|
437
|
+
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`.
|
|
267
438
|
|
|
268
439
|
For a complete commands-capability package that combines `registerCommand`,
|
|
269
440
|
`registerFlags`, and `registerParser`, see the first-party
|
|
270
441
|
[pm-command-kit exemplar](../packages/pm-command-kit/README.md).
|
|
271
442
|
|
|
443
|
+
For a generated starter, use `pm package init ./my-package`. Pass
|
|
444
|
+
`--capability hooks` to scaffold a command plus an `afterCommand` lifecycle
|
|
445
|
+
reactor and a runnable `node:test` file that exercises
|
|
446
|
+
`activateExtensionForTest`, `assertRegisteredHook`, `runRegisteredHookForTest`,
|
|
447
|
+
and `deactivateExtensionForTest`. Pass `--capability search` to scaffold a
|
|
448
|
+
command plus a deterministic search provider/vector-store adapter pair and a
|
|
449
|
+
runnable `node:test` file that exercises `assertRegisteredSearchProvider`,
|
|
450
|
+
`assertRegisteredVectorStoreAdapter`, `runRegisteredSearchProviderForTest`, and
|
|
451
|
+
`runRegisteredVectorStoreAdapterForTest`. Pass `--capability importers` to
|
|
452
|
+
scaffold paired import/export commands with example flag metadata and a runnable
|
|
453
|
+
`node:test` file that exercises `assertRegisteredImporter`,
|
|
454
|
+
`assertRegisteredExporter`, `runRegisteredImporterForTest`, and
|
|
455
|
+
`runRegisteredExporterForTest`; the generated manifest declares both `importers`
|
|
456
|
+
and `schema` because extension flag metadata is schema-governed.
|
|
457
|
+
|
|
272
458
|
## Self-Identity and Lifecycle
|
|
273
459
|
|
|
274
460
|
`activate(api)` receives a read-only `api.extension` describing the extension it
|
|
@@ -421,6 +607,80 @@ guardrails, but it does not discover files or install packages. Use it for unit
|
|
|
421
607
|
tests of extension registration shape; keep `pm package doctor` and runtime
|
|
422
608
|
contracts in integration tests.
|
|
423
609
|
|
|
610
|
+
Invoke a registered command handler to assert its behavior (not just that it was
|
|
611
|
+
registered). `runRegisteredCommandForTest` dispatches through pm's real engine and
|
|
612
|
+
returns the `CommandHandlerResult`:
|
|
613
|
+
|
|
614
|
+
```ts
|
|
615
|
+
import { runRegisteredCommandForTest } from "@unbrained/pm-cli/sdk/testing";
|
|
616
|
+
|
|
617
|
+
const invocation = await runRegisteredCommandForTest(activation.commands, {
|
|
618
|
+
command: "hello",
|
|
619
|
+
options: { name: "ada" },
|
|
620
|
+
});
|
|
621
|
+
|
|
622
|
+
// invocation.handled === true; invocation.result is the handler's return value.
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
Importers and exporters get dedicated name-based helpers so tests never hand-build
|
|
626
|
+
the `"<name> import"` / `"<name> export"` command path. Pass the whole `activation`
|
|
627
|
+
and the registration name:
|
|
628
|
+
|
|
629
|
+
```ts
|
|
630
|
+
import { runRegisteredImporterForTest, runRegisteredExporterForTest } from "@unbrained/pm-cli/sdk/testing";
|
|
631
|
+
|
|
632
|
+
const imported = await runRegisteredImporterForTest(activation, {
|
|
633
|
+
importer: "csv",
|
|
634
|
+
options: { rows: 3 },
|
|
635
|
+
});
|
|
636
|
+
const exported = await runRegisteredExporterForTest(activation, { exporter: "csv" });
|
|
637
|
+
|
|
638
|
+
// Both return a CommandHandlerResult: imported.result is the importer's return value.
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
Fire a registered lifecycle hook to assert its behavior (the `context` is
|
|
642
|
+
type-safe per `kind`). A clean run returns `[]`; a hook that throws contributes a
|
|
643
|
+
single `extension_hook_failed:*` warning while the others still run:
|
|
644
|
+
|
|
645
|
+
```ts
|
|
646
|
+
import { runRegisteredHookForTest } from "@unbrained/pm-cli/sdk/testing";
|
|
647
|
+
|
|
648
|
+
const warnings = await runRegisteredHookForTest(activation.hooks, {
|
|
649
|
+
kind: "after_command",
|
|
650
|
+
context: { command: "close", args: ["pm-1a2b"], pm_root: "", ok: true },
|
|
651
|
+
});
|
|
652
|
+
// warnings === [] when every after_command hook ran cleanly.
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
The override surfaces have parallel invoke helpers that delegate to pm's real
|
|
656
|
+
runners and return the override result verbatim, after guarding that a matching
|
|
657
|
+
override is registered for the target (command / format / service):
|
|
658
|
+
|
|
659
|
+
```ts
|
|
660
|
+
import {
|
|
661
|
+
runRegisteredParserOverrideForTest,
|
|
662
|
+
runRegisteredCommandOverrideForTest,
|
|
663
|
+
runRegisteredRendererOverrideForTest,
|
|
664
|
+
runRegisteredServiceOverrideForTest,
|
|
665
|
+
runRegisteredPreflightOverrideForTest,
|
|
666
|
+
} from "@unbrained/pm-cli/sdk/testing";
|
|
667
|
+
|
|
668
|
+
const parsed = await runRegisteredParserOverrideForTest(activation.parsers, {
|
|
669
|
+
command: "deploy",
|
|
670
|
+
args: ["staging"],
|
|
671
|
+
options: {},
|
|
672
|
+
global: {},
|
|
673
|
+
pm_root: "",
|
|
674
|
+
});
|
|
675
|
+
// parsed.overridden === true; parsed.context holds the rewritten args/options.
|
|
676
|
+
|
|
677
|
+
const rendered = await runRegisteredRendererOverrideForTest(activation.renderers, {
|
|
678
|
+
format: "toon",
|
|
679
|
+
result: { id: "pm-1a2b" },
|
|
680
|
+
});
|
|
681
|
+
// rendered.rendered is the custom string the override produced.
|
|
682
|
+
```
|
|
683
|
+
|
|
424
684
|
Assert a command registration contract:
|
|
425
685
|
|
|
426
686
|
```ts
|
|
@@ -514,6 +774,74 @@ assertRegisteredPreflightOverride(activation.preflight); // preflight overrides
|
|
|
514
774
|
assertRegisteredRendererOverride(activation.renderers, { format: "toon" });
|
|
515
775
|
```
|
|
516
776
|
|
|
777
|
+
Service overrides from `registerService(service, override)` live on
|
|
778
|
+
`activation.services` (an `ExtensionServiceRegistry`), so
|
|
779
|
+
`assertRegisteredServiceOverride` takes the service registry and a known service
|
|
780
|
+
name (`output_format` | `error_format` | `help_format` | `lock_acquire` |
|
|
781
|
+
`lock_release` | `history_append` | `item_store_write` | `item_store_delete`):
|
|
782
|
+
|
|
783
|
+
```ts
|
|
784
|
+
import { assertRegisteredServiceOverride } from "@unbrained/pm-cli/sdk/testing";
|
|
785
|
+
|
|
786
|
+
const service = assertRegisteredServiceOverride(activation.services, {
|
|
787
|
+
service: "output_format",
|
|
788
|
+
extensionName: "my-ext",
|
|
789
|
+
});
|
|
790
|
+
// service.run is the registered ServiceOverride handler
|
|
791
|
+
```
|
|
792
|
+
|
|
793
|
+
Schema migrations from `registerMigration(definition)` live on
|
|
794
|
+
`activation.registrations.migrations`. `assertRegisteredMigration` matches by the
|
|
795
|
+
migration `id` and can additionally assert the `mandatory` governance flag (an
|
|
796
|
+
unset flag is treated as non-mandatory):
|
|
797
|
+
|
|
798
|
+
```ts
|
|
799
|
+
import { assertRegisteredMigration } from "@unbrained/pm-cli/sdk/testing";
|
|
800
|
+
|
|
801
|
+
const migration = assertRegisteredMigration(activation.registrations, {
|
|
802
|
+
migration: "backfill-severity",
|
|
803
|
+
mandatory: true,
|
|
804
|
+
});
|
|
805
|
+
// migration.definition is the normalized SchemaMigrationDefinition
|
|
806
|
+
```
|
|
807
|
+
|
|
808
|
+
Together these complete the SDK assertion surface: every extension `register*`
|
|
809
|
+
method now has a matching `assertRegistered*` helper, so packages can prove any
|
|
810
|
+
registration without importing private registry internals.
|
|
811
|
+
|
|
812
|
+
The three executable registration surfaces add `runRegistered*ForTest` invoke
|
|
813
|
+
helpers on top of those assertions, so a package can exercise the real behavior of
|
|
814
|
+
a custom provider, adapter, or migration:
|
|
815
|
+
|
|
816
|
+
```ts
|
|
817
|
+
import {
|
|
818
|
+
runRegisteredSearchProviderForTest,
|
|
819
|
+
runRegisteredVectorStoreAdapterForTest,
|
|
820
|
+
runRegisteredMigrationForTest,
|
|
821
|
+
} from "@unbrained/pm-cli/sdk/testing";
|
|
822
|
+
|
|
823
|
+
// Invoke a registered provider's semantic query (or embed / embedBatch /
|
|
824
|
+
// queryExpansion / rerank); the result type follows `operation`.
|
|
825
|
+
const hits = await runRegisteredSearchProviderForTest(activation.registrations, {
|
|
826
|
+
provider: "semantic-local",
|
|
827
|
+
operation: "query",
|
|
828
|
+
context: { query: "calendar", mode: "semantic", tokens: ["calendar"], options: {}, settings, documents },
|
|
829
|
+
});
|
|
830
|
+
|
|
831
|
+
// Invoke a registered adapter's upsert / query / delete.
|
|
832
|
+
await runRegisteredVectorStoreAdapterForTest(activation.registrations, {
|
|
833
|
+
adapter: "pinecone",
|
|
834
|
+
operation: "upsert",
|
|
835
|
+
context: { points: [{ id: "pm-1", vector }], settings },
|
|
836
|
+
});
|
|
837
|
+
|
|
838
|
+
// Invoke a registered migration's run with a host-shaped context.
|
|
839
|
+
await runRegisteredMigrationForTest(activation.registrations, {
|
|
840
|
+
migration: "backfill-severity",
|
|
841
|
+
pmRoot,
|
|
842
|
+
});
|
|
843
|
+
```
|
|
844
|
+
|
|
517
845
|
The bundled `pm-lifecycle-hooks` package is the first-party hooks exemplar. It
|
|
518
846
|
declares only the `hooks` capability and registers a default-inert `afterCommand`
|
|
519
847
|
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.22",
|
|
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",
|
|
@@ -70,3 +70,7 @@ Key conventions for authors:
|
|
|
70
70
|
- `activation.commands` in `manifest.json` lists both package-owned commands and
|
|
71
71
|
existing commands that receive injected flags so the host can lazily activate the
|
|
72
72
|
extension before option validation.
|
|
73
|
+
- Unit tests can validate this package's three command-facing registrations with
|
|
74
|
+
public SDK helpers: `assertRegisteredCommandContract(...)` for the owned command,
|
|
75
|
+
`assertRegisteredParserOverride(...)` for parser rewrites, and
|
|
76
|
+
`assertRegisteredFlags(...)` for the injected `pm list --kit-note` flag.
|