@unbrained/pm-cli 2026.7.21 → 2026.7.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/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +25 -0
- package/dist/cli/bundle-integrity.js +3 -3
- package/dist/cli/bundle-integrity.js.map +1 -1
- package/dist/cli/commands/contracts.d.ts +5 -0
- package/dist/cli/commands/contracts.js +8 -6
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/copy.js +36 -20
- package/dist/cli/commands/copy.js.map +1 -1
- package/dist/cli/commands/create.js +48 -24
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/merge.d.ts +1 -1
- package/dist/cli/commands/merge.js +3 -3
- package/dist/cli/commands/merge.js.map +1 -1
- package/dist/cli/commands/restore.js +40 -22
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/update.js +12 -9
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/extension-command-help.js +3 -4
- package/dist/cli/extension-command-help.js.map +1 -1
- package/dist/cli/main.d.ts +3 -2
- package/dist/cli/main.js +6 -6
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.js +33 -21
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.js +63 -37
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/registration-helpers.d.ts +2 -0
- package/dist/cli/registration-helpers.js +3 -2
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli-bundle/bundle-manifest.json +349 -341
- package/dist/cli-bundle/chunks/{append-7OVFYR3C.js → append-CYMA7RJT.js} +5 -5
- package/dist/cli-bundle/chunks/append-H53CAPMP.js +11 -0
- package/dist/cli-bundle/chunks/{chunk-PFNHX655.js → chunk-2P7OK4WG.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-EJDGV4GR.js → chunk-3EBGHNNQ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-DZRV2OPA.js → chunk-3EDFN3VV.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ZOY5K4D3.js → chunk-3PWJWLLQ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-VXOOB6YX.js → chunk-3SJAR3CY.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-GTLCVJOE.js → chunk-3WVKMF2A.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-LAV26CQG.js → chunk-42SYYKA4.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-NLR32VFS.js → chunk-4IXLNV7W.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-BKIAH72N.js → chunk-4LTPHDKA.js} +39 -23
- package/dist/cli-bundle/chunks/chunk-4LTPHDKA.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ABWCF646.js → chunk-4YTQVO3V.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-E5XMKOSB.js → chunk-5EBRMHI6.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-IY6VZ3IW.js → chunk-5FAG2JUC.js} +320 -62
- package/dist/cli-bundle/chunks/chunk-5FAG2JUC.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-GKX4NJ7U.js → chunk-5K5LHZZX.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-T6PPNM7V.js → chunk-5K7BOAB6.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-4QOB7L7I.js → chunk-5MUZ54G2.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-SF3DT5HJ.js → chunk-5QME4KX2.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-RMF7LMBS.js → chunk-6PDGFY3P.js} +27 -17
- package/dist/cli-bundle/chunks/{chunk-RMF7LMBS.js.map → chunk-6PDGFY3P.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-TRSHFPRZ.js → chunk-6PM6CPPP.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-O4BCOJTZ.js → chunk-7AHRY3ZB.js} +21 -16
- package/dist/cli-bundle/chunks/chunk-7AHRY3ZB.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-OR42SO64.js → chunk-7B36A3VT.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-QWRVBJ4D.js → chunk-7OR2YKKD.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-FPBMLYPI.js → chunk-7QUV54XX.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-WWNL6WMH.js → chunk-7WXW6JHG.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-BXNDKOR2.js → chunk-A2VL5SVG.js} +4 -4
- package/dist/cli-bundle/chunks/chunk-AXGDUXJW.js +5 -0
- package/dist/cli-bundle/chunks/{chunk-IAQE32BI.js → chunk-B2AVNGG3.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-K36WV5J6.js → chunk-B7O44UBR.js} +71 -8
- package/dist/cli-bundle/chunks/chunk-B7O44UBR.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-HCEBZNC3.js → chunk-BRMPF2RM.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-Z7VWXXJM.js → chunk-BTNKMF2A.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-KH44WBAT.js → chunk-CD4643VW.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-OWXOPDHD.js → chunk-CJEEC5O4.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-PZC2FUOQ.js → chunk-CTPKCZCF.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-7W2UAXXT.js → chunk-D4OBQVL3.js} +10 -10
- package/dist/cli-bundle/chunks/{chunk-EWJWSNRU.js → chunk-DM4TYC2A.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-VJQG4BIM.js → chunk-DSFTAQ7T.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-AELMUANP.js → chunk-DVB6SQU7.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KBLZ3AA5.js → chunk-E3ZWOFSO.js} +4 -4
- package/dist/cli-bundle/chunks/chunk-EP25DV6P.js +9 -0
- package/dist/cli-bundle/chunks/{chunk-GTK4DTEW.js → chunk-F4VCB4WY.js} +10 -10
- package/dist/cli-bundle/chunks/{chunk-V22ZPOKN.js → chunk-F4XAQUQA.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-QOOTOD3W.js → chunk-FGR6IBAF.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-JSLT7WVE.js → chunk-FKBMT2Q6.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-QIH77CAG.js → chunk-G5RLSSIX.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-P7MTHPJQ.js → chunk-GEKRVH3G.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-2L6ZP22J.js → chunk-GSP6IZFU.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-ATBCUC7Y.js → chunk-H3MDK2VU.js} +48 -30
- package/dist/cli-bundle/chunks/chunk-H3MDK2VU.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ZVZGXPQ5.js → chunk-HYZZM3Q2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-XJTABV3X.js → chunk-IBWG3OSH.js} +22 -17
- package/dist/cli-bundle/chunks/chunk-IBWG3OSH.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-4XGJLADW.js → chunk-IHY5SX7O.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-UCBDQI5E.js → chunk-IMU7JLUI.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-Z75ONV25.js → chunk-IPAQAJWB.js} +77 -7
- package/dist/cli-bundle/chunks/chunk-IPAQAJWB.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-7RW4JCU2.js → chunk-IQCD6OO3.js} +25 -13
- package/dist/cli-bundle/chunks/chunk-IQCD6OO3.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-YQWCZ5AC.js → chunk-J3ZKFEDM.js} +38 -22
- package/dist/cli-bundle/chunks/chunk-J3ZKFEDM.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-PEQGTJ5Q.js → chunk-JCLXCGIL.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-GROYI4RB.js → chunk-JLTHOYR7.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-JHJSFOAM.js → chunk-JMPVHM44.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-MATHDCGG.js → chunk-JWYG36RV.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-ZTVA4KLN.js → chunk-KEGVMZNA.js} +28 -16
- package/dist/cli-bundle/chunks/chunk-KEGVMZNA.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-VLRGDBLY.js → chunk-KEHOPUHH.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-K55VMLSS.js → chunk-KJ4ZF35M.js} +63 -13
- package/dist/cli-bundle/chunks/chunk-KJ4ZF35M.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-CPX275C6.js → chunk-KPCZL2YK.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-POG76WWZ.js → chunk-L7DZV6EZ.js} +319 -61
- package/dist/cli-bundle/chunks/chunk-L7DZV6EZ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-FO6OSVEN.js → chunk-LANV45W2.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-LVC72YRD.js → chunk-LC5ZUXWE.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-SY4SFZSD.js → chunk-LE522OXA.js} +55 -30
- package/dist/cli-bundle/chunks/chunk-LE522OXA.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-TVYYO5A7.js → chunk-MBHYQYCS.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-FJIFFBJX.js → chunk-MROP2RNT.js} +66 -74
- package/dist/cli-bundle/chunks/chunk-MROP2RNT.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-7656MAUL.js → chunk-MUAJHL2R.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-R3P6FZJW.js → chunk-N6QCY2AX.js} +43 -25
- package/dist/cli-bundle/chunks/chunk-N6QCY2AX.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-7WCE6Y64.js → chunk-NUQCSV4P.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-SZVB53Y3.js → chunk-O3GFE2PX.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-OY7DMU5P.js → chunk-O43LEUSD.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-AMJPSANK.js → chunk-O7RH6BWP.js} +103 -44
- package/dist/cli-bundle/chunks/chunk-O7RH6BWP.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-NUF7ROFH.js → chunk-OODR5KYF.js} +26 -27
- package/dist/cli-bundle/chunks/chunk-OODR5KYF.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-LZYP423P.js → chunk-OZ25YD4Q.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-VZIZB6QH.js → chunk-PKYKQCTJ.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-UZLJOEAC.js → chunk-PMRED6QZ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-ADBTSVGK.js → chunk-PPATPPI6.js} +65 -73
- package/dist/cli-bundle/chunks/chunk-PPATPPI6.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-K4CI6Y45.js → chunk-PWGJCP2V.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-UVN66B3M.js → chunk-Q3Z2Y5WJ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-RNPZYNHS.js → chunk-Q6YZ3VCI.js} +104 -45
- package/dist/cli-bundle/chunks/chunk-Q6YZ3VCI.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-7DOJC3HS.js → chunk-QE5EUHKN.js} +28 -18
- package/dist/cli-bundle/chunks/chunk-QE5EUHKN.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-AS4SAZ5R.js → chunk-QKMMWESK.js} +25 -26
- package/dist/cli-bundle/chunks/chunk-QKMMWESK.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-R7QV7ICM.js → chunk-QSXN2FAN.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-5NTE36LD.js → chunk-RBECHH5K.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-JXCW2TI2.js → chunk-RPNC7M63.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-ICDAQ4TD.js → chunk-S2QQNTA6.js} +26 -14
- package/dist/cli-bundle/chunks/chunk-S2QQNTA6.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-JFD5LPMI.js → chunk-SP3BAXFF.js} +29 -17
- package/dist/cli-bundle/chunks/chunk-SP3BAXFF.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-F2LBF7XJ.js → chunk-SUSFH6F7.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-VHXHVTUU.js → chunk-TDOPC7UY.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-HYW67VJ5.js → chunk-TLF52ZDP.js} +30 -25
- package/dist/cli-bundle/chunks/chunk-TLF52ZDP.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-FSE2IKJQ.js → chunk-TWHG646K.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-OCUBRA6D.js → chunk-U7U7WGEC.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-PONKZPCJ.js → chunk-UFRVIIJ2.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-VNTCM3VW.js → chunk-VKX2VZZH.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-7AVEY74G.js → chunk-VTOCZ343.js} +29 -24
- package/dist/cli-bundle/chunks/chunk-VTOCZ343.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-6JUTHVQS.js → chunk-W2JDNTN3.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-PQSEQD6E.js → chunk-W35PHE44.js} +62 -12
- package/dist/cli-bundle/chunks/chunk-W35PHE44.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-4QSQ6XDK.js → chunk-WT4KXBUD.js} +68 -31
- package/dist/cli-bundle/chunks/chunk-WT4KXBUD.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-RPESLSO5.js → chunk-XC5RVKHH.js} +69 -32
- package/dist/cli-bundle/chunks/chunk-XC5RVKHH.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-QG4GFLQ6.js → chunk-XD6UF2NB.js} +42 -24
- package/dist/cli-bundle/chunks/chunk-XD6UF2NB.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-AF2CCM5U.js → chunk-XKRVX4B3.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-JGUKMMRS.js → chunk-XN4NQZJK.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-3P7UJQOX.js → chunk-YKFMLQNK.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-YCIUJJOD.js → chunk-YKWKMGL7.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-TOBGV45Y.js → chunk-YUKIFPWK.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-72LQ4TKV.js → chunk-YYEZEP3E.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-X3W65QK3.js → chunk-ZEY3XSZQ.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-MWQ2HC2A.js → chunk-ZKOQHLJP.js} +59 -34
- package/dist/cli-bundle/chunks/chunk-ZKOQHLJP.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-QJIKE24M.js → chunk-ZQ3UMKWE.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-4PUUNQDV.js → chunk-ZVVEWHWK.js} +58 -33
- package/dist/cli-bundle/chunks/chunk-ZVVEWHWK.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-OG5DVFMA.js → chunk-ZXE6SNKO.js} +5 -5
- package/dist/cli-bundle/chunks/close-GAUIGOQC.js +12 -0
- package/dist/cli-bundle/chunks/{close-QEMOYZN3.js → close-SJIEKNY4.js} +5 -5
- package/dist/cli-bundle/chunks/{close-many-RZVTUGBG.js → close-many-B6AIC5OQ.js} +15 -14
- package/dist/cli-bundle/chunks/close-many-QCINT6I2.js +24 -0
- package/dist/cli-bundle/chunks/comments-4SK5EUEJ.js +13 -0
- package/dist/cli-bundle/chunks/{comments-TPU7QRBL.js → comments-DM5KV2RS.js} +7 -7
- package/dist/cli-bundle/chunks/copy-4KCCLTYQ.js +10 -0
- package/dist/cli-bundle/chunks/{copy-DKTSSCK7.js → copy-HEP5SZHB.js} +5 -4
- package/dist/cli-bundle/chunks/create-BDKQFPRE.js +30 -0
- package/dist/cli-bundle/chunks/{create-EIFBIVNQ.js → create-VCGBCYL2.js} +11 -10
- package/dist/cli-bundle/chunks/delete-JWDXPR3H.js +10 -0
- package/dist/cli-bundle/chunks/{delete-LCS3VPDH.js → delete-ZSPBTVJD.js} +4 -4
- package/dist/cli-bundle/chunks/{deps-YG7UF3VR.js → deps-BZTWWOIE.js} +6 -6
- package/dist/cli-bundle/chunks/{deps-UH5EQQUY.js → deps-OVAJOQIE.js} +6 -6
- package/dist/cli-bundle/chunks/{docs-G32TK6XS.js → docs-3GFMSWLL.js} +6 -6
- package/dist/cli-bundle/chunks/docs-SY2NPT6Y.js +14 -0
- package/dist/cli-bundle/chunks/{files-4ALMCSKB.js → files-2SEL4QIU.js} +6 -6
- package/dist/cli-bundle/chunks/{files-3H32UQ4K.js → files-FYMMJGNN.js} +6 -6
- package/dist/cli-bundle/chunks/focus-4A27YJ2Z.js +10 -0
- package/dist/cli-bundle/chunks/{focus-7SOUT5PZ.js → focus-TEUJKTAT.js} +5 -5
- package/dist/cli-bundle/chunks/history-compact-7QOKL2NB.js +16 -0
- package/dist/cli-bundle/chunks/{history-compact-77BT2LUB.js → history-compact-U7A37VR6.js} +6 -6
- package/dist/cli-bundle/chunks/{history-redact-LJPZPNFA.js → history-redact-TNKUO4ZE.js} +4 -4
- package/dist/cli-bundle/chunks/{history-redact-PWTTJ3XS.js → history-redact-ZWRUWQY3.js} +4 -4
- package/dist/cli-bundle/chunks/{history-repair-I7CBNCV3.js → history-repair-6IU5VWHN.js} +7 -7
- package/dist/cli-bundle/chunks/history-repair-GWCGJUM2.js +17 -0
- package/dist/cli-bundle/chunks/learnings-DDFAUUX3.js +13 -0
- package/dist/cli-bundle/chunks/{learnings-KTYW3AL7.js → learnings-GOEZXMKL.js} +7 -7
- package/dist/cli-bundle/chunks/{notes-ZERD3KB2.js → notes-BZWODAEK.js} +7 -7
- package/dist/cli-bundle/chunks/notes-OBJ6FL36.js +13 -0
- package/dist/cli-bundle/chunks/{plan-OFJUBIM5.js → plan-V57VQTAG.js} +12 -11
- package/dist/cli-bundle/chunks/plan-ZMOBD6FX.js +27 -0
- package/dist/cli-bundle/chunks/{profile-3THJPIQY.js → profile-BG3N4ETA.js} +9 -9
- package/dist/cli-bundle/chunks/{profile-XEZAMMBW.js → profile-XLM45FKV.js} +9 -9
- package/dist/cli-bundle/chunks/{register-list-query-BR435Q2H.js → register-list-query-EYYNTGMF.js} +48 -38
- package/dist/cli-bundle/chunks/register-list-query-EYYNTGMF.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-list-query-RWTWLOBE.js → register-list-query-WGXJPXXY.js} +47 -37
- package/dist/cli-bundle/chunks/register-list-query-WGXJPXXY.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-mutation-HLWC2WNP.js → register-mutation-3YSDDVOL.js} +131 -105
- package/dist/cli-bundle/chunks/register-mutation-3YSDDVOL.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-mutation-ZJX5AZM5.js → register-mutation-VDGUMMUY.js} +131 -105
- package/dist/cli-bundle/chunks/register-mutation-VDGUMMUY.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-operations-744YBJMV.js → register-operations-H4URGAHX.js} +36 -35
- package/dist/cli-bundle/chunks/{register-operations-744YBJMV.js.map → register-operations-H4URGAHX.js.map} +1 -1
- package/dist/cli-bundle/chunks/{register-operations-UEBJH6AN.js → register-operations-HSO7X77D.js} +34 -33
- package/dist/cli-bundle/chunks/{register-operations-UEBJH6AN.js.map → register-operations-HSO7X77D.js.map} +1 -1
- package/dist/cli-bundle/chunks/{register-setup-5DA4UZXI.js → register-setup-HZ2KKXK4.js} +13 -13
- package/dist/cli-bundle/chunks/{register-setup-6H25M3BH.js → register-setup-WCBKJ3H3.js} +13 -13
- package/dist/cli-bundle/chunks/{restore-6TDVSATY.js → restore-3NGRFDPX.js} +7 -6
- package/dist/cli-bundle/chunks/restore-LNVNUWHE.js +15 -0
- package/dist/cli-bundle/chunks/{schema-TPVTIJPO.js → schema-LMFZ742C.js} +6 -6
- package/dist/cli-bundle/chunks/{schema-HFXFSGPG.js → schema-O34O33UW.js} +6 -6
- package/dist/cli-bundle/chunks/update-BN6VZSYX.js +24 -0
- package/dist/cli-bundle/chunks/{update-LJZCL5SI.js → update-FDLPLKOB.js} +14 -13
- package/dist/cli-bundle/chunks/update-many-WCKOPN3K.js +35 -0
- package/dist/cli-bundle/chunks/update-many-WCKOPN3K.js.map +7 -0
- package/dist/cli-bundle/chunks/update-many-X6DVGOMM.js +39 -0
- package/dist/cli-bundle/chunks/update-many-X6DVGOMM.js.map +1 -0
- package/dist/cli-bundle/main.js +65 -64
- package/dist/cli-bundle/main.js.map +2 -2
- package/dist/cli-bundle/sdk-runtime.js +53 -52
- package/dist/cli-bundle/sdk-testing.js +6 -6
- package/dist/cli-bundle/sdk.js +362 -56
- package/dist/cli-bundle/sdk.js.map +4 -4
- package/dist/cli.js +10 -4
- package/dist/cli.js.map +1 -1
- package/dist/core/diagnostics/remediation.js +7 -2
- package/dist/core/diagnostics/remediation.js.map +1 -1
- package/dist/core/search/background-refresh.d.ts +3 -1
- package/dist/core/search/background-refresh.js +34 -6
- package/dist/core/search/background-refresh.js.map +1 -1
- package/dist/core/search/cache.js +28 -5
- package/dist/core/search/cache.js.map +1 -1
- package/dist/core/shared/constants.d.ts +2 -0
- package/dist/core/shared/constants.js +29 -24
- package/dist/core/shared/constants.js.map +1 -1
- package/dist/core/store/item-metadata-cache.d.ts +32 -1
- package/dist/core/store/item-metadata-cache.js +289 -21
- package/dist/core/store/item-metadata-cache.js.map +1 -1
- package/dist/core/store/item-store.js +71 -34
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/settings.js +9 -3
- package/dist/core/store/settings.js.map +1 -1
- package/dist/sdk/cli-bootstrap.js +68 -76
- package/dist/sdk/cli-bootstrap.js.map +1 -1
- package/dist/sdk/compile-cache.d.ts +16 -0
- package/dist/sdk/compile-cache.js +73 -0
- package/dist/sdk/compile-cache.js.map +1 -0
- package/dist/sdk/context-relevance.d.ts +16 -1
- package/dist/sdk/context-relevance.js +20 -8
- package/dist/sdk/context-relevance.js.map +1 -1
- package/dist/sdk/context-signal-store.d.ts +77 -0
- package/dist/sdk/context-signal-store.js +201 -0
- package/dist/sdk/context-signal-store.js.map +1 -0
- package/dist/sdk/dependency-provenance.d.ts +12 -0
- package/dist/sdk/dependency-provenance.js +38 -0
- package/dist/sdk/dependency-provenance.js.map +1 -0
- package/dist/sdk/governance/storage-integrity.d.ts +1 -1
- package/dist/sdk/governance/storage-integrity.js +47 -6
- package/dist/sdk/governance/storage-integrity.js.map +1 -1
- package/dist/sdk/graph/assembly.d.ts +2 -0
- package/dist/sdk/graph/assembly.js +51 -4
- package/dist/sdk/graph/assembly.js.map +1 -1
- package/dist/sdk/graph/run.js +12 -13
- package/dist/sdk/graph/run.js.map +1 -1
- package/dist/sdk/index.d.ts +5 -0
- package/dist/sdk/index.js +7 -2
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/item-metadata-index.d.ts +11 -0
- package/dist/sdk/item-metadata-index.js +15 -0
- package/dist/sdk/item-metadata-index.js.map +1 -0
- package/dist/sdk/merge/index.d.ts +1 -0
- package/dist/sdk/merge/index.js +3 -2
- package/dist/sdk/merge/index.js.map +1 -1
- package/dist/sdk/merge/install.js +25 -9
- package/dist/sdk/merge/install.js.map +1 -1
- package/dist/sdk/merge/reconcile.d.ts +46 -0
- package/dist/sdk/merge/reconcile.js +46 -0
- package/dist/sdk/merge/reconcile.js.map +1 -0
- package/dist/sdk/query/list.d.ts +5 -4
- package/dist/sdk/query/list.js +22 -14
- package/dist/sdk/query/list.js.map +1 -1
- package/dist/sdk/relationship-history.d.ts +30 -0
- package/dist/sdk/relationship-history.js +75 -7
- package/dist/sdk/relationship-history.js.map +1 -1
- package/dist/sdk/relationship-migration.d.ts +42 -0
- package/dist/sdk/relationship-migration.js +78 -0
- package/dist/sdk/relationship-migration.js.map +1 -0
- package/dist/sdk/structured-mutations.js +4 -25
- package/dist/sdk/structured-mutations.js.map +1 -1
- package/docs/COMMANDS.md +26 -3
- package/docs/CONFIGURATION.md +1 -1
- package/docs/MERGE_SAFETY.md +14 -5
- package/docs/PERFORMANCE.md +28 -0
- package/docs/RELATIONSHIP_GRAPH.md +47 -1
- package/docs/SDK.md +78 -5
- package/marketplace.json +2 -2
- package/package.json +2 -2
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/dist/cli-bundle/chunks/append-DFETHAZL.js +0 -11
- package/dist/cli-bundle/chunks/chunk-4PUUNQDV.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-4QSQ6XDK.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-7AVEY74G.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-7DOJC3HS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-7RW4JCU2.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ADBTSVGK.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-AMJPSANK.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-AS4SAZ5R.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ATBCUC7Y.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-BKIAH72N.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-FJIFFBJX.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-HYW67VJ5.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-ICDAQ4TD.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-IY6VZ3IW.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-JFD5LPMI.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-K36WV5J6.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-K55VMLSS.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-MWQ2HC2A.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-NUF7ROFH.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-O4BCOJTZ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-POG76WWZ.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-PQSEQD6E.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-QG4GFLQ6.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-R3P6FZJW.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-RNPZYNHS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-RPESLSO5.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-SY4SFZSD.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-XJTABV3X.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-YQWCZ5AC.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-Z75ONV25.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ZTVA4KLN.js.map +0 -7
- package/dist/cli-bundle/chunks/close-O5QVZ6ET.js +0 -12
- package/dist/cli-bundle/chunks/close-many-5RZXVN4J.js +0 -23
- package/dist/cli-bundle/chunks/comments-Z4KV6FU3.js +0 -13
- package/dist/cli-bundle/chunks/copy-M7DDI6LS.js +0 -9
- package/dist/cli-bundle/chunks/create-RGSPN5GD.js +0 -29
- package/dist/cli-bundle/chunks/delete-MD7YXQLH.js +0 -10
- package/dist/cli-bundle/chunks/docs-JWWNRC27.js +0 -14
- package/dist/cli-bundle/chunks/focus-DRQ6FQH6.js +0 -10
- package/dist/cli-bundle/chunks/history-compact-VCKGTX64.js +0 -16
- package/dist/cli-bundle/chunks/history-repair-YTDZRK5E.js +0 -17
- package/dist/cli-bundle/chunks/learnings-CYNOICKR.js +0 -13
- package/dist/cli-bundle/chunks/notes-FGO63FXL.js +0 -13
- package/dist/cli-bundle/chunks/plan-SGCDDTYR.js +0 -26
- package/dist/cli-bundle/chunks/register-list-query-BR435Q2H.js.map +0 -1
- package/dist/cli-bundle/chunks/register-list-query-RWTWLOBE.js.map +0 -7
- package/dist/cli-bundle/chunks/register-mutation-HLWC2WNP.js.map +0 -1
- package/dist/cli-bundle/chunks/register-mutation-ZJX5AZM5.js.map +0 -7
- package/dist/cli-bundle/chunks/restore-RSL7C7LO.js +0 -14
- package/dist/cli-bundle/chunks/update-SIA7LH5Y.js +0 -23
- package/dist/cli-bundle/chunks/update-many-BDBZVGQL.js +0 -38
- package/dist/cli-bundle/chunks/update-many-MOY3A5B3.js +0 -34
- /package/dist/cli-bundle/chunks/{append-7OVFYR3C.js.map → append-CYMA7RJT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-DFETHAZL.js.map → append-H53CAPMP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PFNHX655.js.map → chunk-2P7OK4WG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EJDGV4GR.js.map → chunk-3EBGHNNQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DZRV2OPA.js.map → chunk-3EDFN3VV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ZOY5K4D3.js.map → chunk-3PWJWLLQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VXOOB6YX.js.map → chunk-3SJAR3CY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GTLCVJOE.js.map → chunk-3WVKMF2A.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-LAV26CQG.js.map → chunk-42SYYKA4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NLR32VFS.js.map → chunk-4IXLNV7W.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ABWCF646.js.map → chunk-4YTQVO3V.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-E5XMKOSB.js.map → chunk-5EBRMHI6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GKX4NJ7U.js.map → chunk-5K5LHZZX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-T6PPNM7V.js.map → chunk-5K7BOAB6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4QOB7L7I.js.map → chunk-5MUZ54G2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SF3DT5HJ.js.map → chunk-5QME4KX2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TRSHFPRZ.js.map → chunk-6PM6CPPP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OR42SO64.js.map → chunk-7B36A3VT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QWRVBJ4D.js.map → chunk-7OR2YKKD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FPBMLYPI.js.map → chunk-7QUV54XX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WWNL6WMH.js.map → chunk-7WXW6JHG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BXNDKOR2.js.map → chunk-A2VL5SVG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-QEMOYZN3.js.map → chunk-AXGDUXJW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IAQE32BI.js.map → chunk-B2AVNGG3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HCEBZNC3.js.map → chunk-BRMPF2RM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-Z7VWXXJM.js.map → chunk-BTNKMF2A.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KH44WBAT.js.map → chunk-CD4643VW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OWXOPDHD.js.map → chunk-CJEEC5O4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PZC2FUOQ.js.map → chunk-CTPKCZCF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7W2UAXXT.js.map → chunk-D4OBQVL3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EWJWSNRU.js.map → chunk-DM4TYC2A.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VJQG4BIM.js.map → chunk-DSFTAQ7T.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AELMUANP.js.map → chunk-DVB6SQU7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KBLZ3AA5.js.map → chunk-E3ZWOFSO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-O5QVZ6ET.js.map → chunk-EP25DV6P.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GTK4DTEW.js.map → chunk-F4VCB4WY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-V22ZPOKN.js.map → chunk-F4XAQUQA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QOOTOD3W.js.map → chunk-FGR6IBAF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JSLT7WVE.js.map → chunk-FKBMT2Q6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QIH77CAG.js.map → chunk-G5RLSSIX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-P7MTHPJQ.js.map → chunk-GEKRVH3G.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2L6ZP22J.js.map → chunk-GSP6IZFU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ZVZGXPQ5.js.map → chunk-HYZZM3Q2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4XGJLADW.js.map → chunk-IHY5SX7O.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UCBDQI5E.js.map → chunk-IMU7JLUI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PEQGTJ5Q.js.map → chunk-JCLXCGIL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GROYI4RB.js.map → chunk-JLTHOYR7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JHJSFOAM.js.map → chunk-JMPVHM44.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-MATHDCGG.js.map → chunk-JWYG36RV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VLRGDBLY.js.map → chunk-KEHOPUHH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CPX275C6.js.map → chunk-KPCZL2YK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FO6OSVEN.js.map → chunk-LANV45W2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-LVC72YRD.js.map → chunk-LC5ZUXWE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TVYYO5A7.js.map → chunk-MBHYQYCS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7656MAUL.js.map → chunk-MUAJHL2R.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7WCE6Y64.js.map → chunk-NUQCSV4P.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SZVB53Y3.js.map → chunk-O3GFE2PX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OY7DMU5P.js.map → chunk-O43LEUSD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-LZYP423P.js.map → chunk-OZ25YD4Q.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VZIZB6QH.js.map → chunk-PKYKQCTJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UZLJOEAC.js.map → chunk-PMRED6QZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-K4CI6Y45.js.map → chunk-PWGJCP2V.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UVN66B3M.js.map → chunk-Q3Z2Y5WJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-R7QV7ICM.js.map → chunk-QSXN2FAN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5NTE36LD.js.map → chunk-RBECHH5K.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JXCW2TI2.js.map → chunk-RPNC7M63.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-F2LBF7XJ.js.map → chunk-SUSFH6F7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VHXHVTUU.js.map → chunk-TDOPC7UY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FSE2IKJQ.js.map → chunk-TWHG646K.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OCUBRA6D.js.map → chunk-U7U7WGEC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PONKZPCJ.js.map → chunk-UFRVIIJ2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VNTCM3VW.js.map → chunk-VKX2VZZH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6JUTHVQS.js.map → chunk-W2JDNTN3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AF2CCM5U.js.map → chunk-XKRVX4B3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JGUKMMRS.js.map → chunk-XN4NQZJK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3P7UJQOX.js.map → chunk-YKFMLQNK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YCIUJJOD.js.map → chunk-YKWKMGL7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TOBGV45Y.js.map → chunk-YUKIFPWK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-72LQ4TKV.js.map → chunk-YYEZEP3E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-X3W65QK3.js.map → chunk-ZEY3XSZQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QJIKE24M.js.map → chunk-ZQ3UMKWE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OG5DVFMA.js.map → chunk-ZXE6SNKO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-5RZXVN4J.js.map → close-GAUIGOQC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-RZVTUGBG.js.map → close-SJIEKNY4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-TPU7QRBL.js.map → close-many-B6AIC5OQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-Z4KV6FU3.js.map → close-many-QCINT6I2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-M7DDI6LS.js.map → comments-4SK5EUEJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-DKTSSCK7.js.map → comments-DM5KV2RS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-RGSPN5GD.js.map → copy-4KCCLTYQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-EIFBIVNQ.js.map → copy-HEP5SZHB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-MD7YXQLH.js.map → create-BDKQFPRE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-LCS3VPDH.js.map → create-VCGBCYL2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-YG7UF3VR.js.map → delete-JWDXPR3H.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-UH5EQQUY.js.map → delete-ZSPBTVJD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-JWWNRC27.js.map → deps-BZTWWOIE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-G32TK6XS.js.map → deps-OVAJOQIE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-3H32UQ4K.js.map → docs-3GFMSWLL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-4ALMCSKB.js.map → docs-SY2NPT6Y.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-DRQ6FQH6.js.map → files-2SEL4QIU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-7SOUT5PZ.js.map → files-FYMMJGNN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-VCKGTX64.js.map → focus-4A27YJ2Z.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-77BT2LUB.js.map → focus-TEUJKTAT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-PWTTJ3XS.js.map → history-compact-7QOKL2NB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-LJPZPNFA.js.map → history-compact-U7A37VR6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-I7CBNCV3.js.map → history-redact-TNKUO4ZE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-YTDZRK5E.js.map → history-redact-ZWRUWQY3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-KTYW3AL7.js.map → history-repair-6IU5VWHN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-CYNOICKR.js.map → history-repair-GWCGJUM2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-FGO63FXL.js.map → learnings-DDFAUUX3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-ZERD3KB2.js.map → learnings-GOEZXMKL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-OFJUBIM5.js.map → notes-BZWODAEK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-SGCDDTYR.js.map → notes-OBJ6FL36.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-3THJPIQY.js.map → plan-V57VQTAG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-XEZAMMBW.js.map → plan-ZMOBD6FX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-6TDVSATY.js.map → profile-BG3N4ETA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-RSL7C7LO.js.map → profile-XLM45FKV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-setup-5DA4UZXI.js.map → register-setup-HZ2KKXK4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-setup-6H25M3BH.js.map → register-setup-WCBKJ3H3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-TPVTIJPO.js.map → restore-3NGRFDPX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-HFXFSGPG.js.map → restore-LNVNUWHE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-LJZCL5SI.js.map → schema-LMFZ742C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-SIA7LH5Y.js.map → schema-O34O33UW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-MOY3A5B3.js.map → update-BN6VZSYX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-BDBZVGQL.js.map → update-FDLPLKOB.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../../../sdk/workspace.ts", "../../../../../../../../sdk/merge/install.ts", "../../../../../../../../sdk/schema.ts", "../../../../../../../../core/schema/type-inference.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @module sdk/workspace\n *\n * Maintains repository-scaffold contracts shared by the public SDK and CLI.\n */\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/** Opening marker for the init-owned ignore block. */\nexport const PM_GITIGNORE_START = \"# pm-cli:runtime-cache:start\";\n/** Closing marker for the init-owned ignore block. */\nexport const PM_GITIGNORE_END = \"# pm-cli:runtime-cache:end\";\n\n/** Default workspace-relative tracker root used when no custom root is resolved. */\nexport const PM_GITIGNORE_DEFAULT_TRACKER_ROOT = \".agents/pm\";\n\n/**\n * Tracker-relative directories that hold per-clone runtime state (caches,\n * search indexes, locks, crash-recovery receipts). They must never be\n * committed: they churn on every command and conflict on every concurrent\n * branch merge. `transactions/` (SDK workspace-transaction journals) and\n * `checkpoints/` (bulk-mutation rollback receipts) are per-branch recovery\n * state with their own GC (`pm gc --scope transactions|checkpoints`), so\n * keeping them untracked is the recorded merge-safety disposition.\n */\nexport const PM_GITIGNORE_RUNTIME_DIRECTORIES = [\n \"runtime/\",\n \"search/\",\n \"locks/\",\n \"transactions/\",\n \"checkpoints/\",\n] as const;\n\n/** Result of reconciling the init-owned repository ignore block. */\nexport interface EnsurePmGitignoreResult {\n /** Absolute path to the reconciled file. */\n path: string;\n /** Whether the file content changed. */\n changed: boolean;\n}\n\nfunction normalizeTrackerRelativeRoot(trackerRelativeRoot: string): string {\n return trackerRelativeRoot\n .replaceAll(\"\\\\\", \"/\")\n .replace(/^\\.\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n}\n\n/** Return whether a relative path escapes its owning root, without rejecting valid names such as `..pm`. */\nexport function isPathOutsideRoot(relativePath: string): boolean {\n const normalized = relativePath.replaceAll(\"\\\\\", \"/\");\n return (\n path.isAbsolute(relativePath) ||\n normalized === \"..\" ||\n normalized.startsWith(\"../\")\n );\n}\n\n/** Return the canonical pm ignore block rendered for the given workspace-relative tracker root (defaults to `.agents/pm`), primarily for documentation and tests. */\nexport function getPmGitignoreBlock(\n trackerRelativeRoot: string = PM_GITIGNORE_DEFAULT_TRACKER_ROOT,\n): string {\n const root = normalizeTrackerRelativeRoot(trackerRelativeRoot);\n return [\n PM_GITIGNORE_START,\n ...PM_GITIGNORE_RUNTIME_DIRECTORIES.map(\n (directory) => `${root}/${directory}`,\n ),\n PM_GITIGNORE_END,\n ].join(\"\\n\");\n}\n\n/**\n * Idempotently create or replace the fenced pm cache block in a workspace\n * `.gitignore`. When `pmRoot` is provided the ignored runtime directories are\n * rendered under the resolved workspace-relative tracker root, so custom-root\n * workspaces (`--pm-path`/`PM_PATH`) stop committing runtime caches (GH-598).\n * A tracker root outside the workspace needs no ignore rules here, so the\n * file is left untouched.\n */\nexport async function ensurePmGitignore(\n workspaceRoot: string,\n options: {\n /** Absolute tracker root; rendered relative to the workspace root. */\n pmRoot?: string;\n } = {},\n): Promise<EnsurePmGitignoreResult> {\n const gitignorePath = path.join(workspaceRoot, \".gitignore\");\n let trackerRelativeRoot = PM_GITIGNORE_DEFAULT_TRACKER_ROOT;\n if (options.pmRoot !== undefined) {\n const relative = normalizeTrackerRelativeRoot(\n path.relative(path.resolve(workspaceRoot), path.resolve(options.pmRoot)),\n );\n if (isPathOutsideRoot(relative)) {\n return { path: gitignorePath, changed: false };\n }\n if (relative.length > 0) {\n trackerRelativeRoot = relative;\n }\n }\n let current = \"\";\n try {\n current = await readFile(gitignorePath, \"utf8\");\n } catch (error: unknown) {\n if (\n !(error instanceof Error && \"code\" in error && error.code === \"ENOENT\")\n ) {\n throw error;\n }\n }\n const start = current.indexOf(PM_GITIGNORE_START);\n const end = current.indexOf(PM_GITIGNORE_END);\n const withoutManagedBlock =\n start >= 0 && end >= start\n ? `${current.slice(0, start)}${current.slice(end + PM_GITIGNORE_END.length)}`\n : current;\n const prefix = withoutManagedBlock.trimEnd();\n const next = `${prefix.length > 0 ? `${prefix}\\n\\n` : \"\"}${getPmGitignoreBlock(trackerRelativeRoot)}\\n`;\n if (next === current) {\n return { path: gitignorePath, changed: false };\n }\n await writeFile(gitignorePath, next, \"utf8\");\n return { path: gitignorePath, changed: true };\n}\n", "/**\n * @module sdk/merge/install\n *\n * Installs the tracker's git merge configuration into a repository: a fenced\n * `.gitattributes` block mapping every mergeable tracker artifact class to a\n * pm merge driver, plus the local `git config` driver definitions that make\n * those attributes effective. Idempotent and re-runnable; schema type\n * mutations refresh the fenced block automatically once it is installed.\n */\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { execFile } from \"node:child_process\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { getActiveExtensionRegistrations } from \"../../core/extensions/index.js\";\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { acquireLock } from \"../../core/lock/lock.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { nowIso } from \"../../core/shared/time.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport {\n readSettings,\n resolveGovernanceKnobs,\n} from \"../../core/store/settings.js\";\nimport { isPathOutsideRoot } from \"../workspace.js\";\n\nconst execFileAsync = promisify(execFile);\n\n/** Opening marker for the pm-owned merge-driver `.gitattributes` block. */\nexport const PM_GITATTRIBUTES_START = \"# pm-cli:merge-drivers:start\";\n/** Closing marker for the pm-owned merge-driver `.gitattributes` block. */\nexport const PM_GITATTRIBUTES_END = \"# pm-cli:merge-drivers:end\";\n\nconst MERGE_FENCE_LOCK_ID = \"merge-fence\";\n\nconst MERGE_DRIVER_DEFINITIONS = [\n {\n key: \"pm-item-toon\",\n name: \"pm field-aware TOON item document merge\",\n artifact: \"item\",\n itemPath: \"item.toon\",\n },\n {\n key: \"pm-item-markdown\",\n name: \"pm field-aware JSON-markdown item document merge\",\n artifact: \"item\",\n itemPath: \"item.md\",\n },\n {\n key: \"pm-history\",\n name: \"pm append-only history stream merge\",\n artifact: \"history\",\n itemPath: undefined,\n },\n {\n key: \"pm-relationship\",\n name: \"pm append-only relationship event store merge\",\n artifact: \"relationship\",\n itemPath: undefined,\n },\n {\n key: \"pm-json\",\n name: \"pm key-level JSON config merge\",\n artifact: \"json\",\n itemPath: undefined,\n },\n] as const;\n\n/** Documents the merge install options payload exchanged by command, SDK, and package integrations. */\nexport interface MergeInstallOptions {\n /** Preview the `.gitattributes` and `git config` changes without writing anything. */\n dryRun?: boolean;\n}\n\n/** Documents the merge install result payload exchanged by command, SDK, and package integrations. */\nexport interface MergeInstallResult {\n /** Whether the installation completed (or, for dry runs, would complete) without errors. */\n ok: boolean;\n /** Whether this run was a preview only. */\n dry_run: boolean;\n /** Repository root the merge configuration was installed into. */\n workspace_root: string;\n /** `.gitattributes` reconciliation outcome. */\n gitattributes: {\n path: string;\n changed: boolean;\n patterns: string[];\n };\n /** Local `git config` merge-driver definitions applied (or previewed). */\n git_config: Array<{ key: string; value: string }>;\n /** Guidance for completing the multi-branch workflow setup. */\n guidance: string[];\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\nasync function resolveGitWorkspaceRoot(cwd: string): Promise<string> {\n try {\n const { stdout } = await execFileAsync(\n \"git\",\n [\"rev-parse\", \"--show-toplevel\"],\n { cwd, encoding: \"utf8\", windowsHide: true, timeout: 10_000 },\n );\n return stdout.trim();\n } catch {\n throw new PmCliError(\n \"pm merge install requires a git repository (merge drivers are git configuration).\",\n EXIT_CODE.USAGE,\n );\n }\n}\n\nfunction toPosixRelative(fromPath: string, toPath: string): string {\n return path.relative(fromPath, toPath).replaceAll(\"\\\\\", \"/\");\n}\n\n/** Encode one Git attributes pattern with C-style quoting so whitespace, backslashes, and quotation marks remain part of the repository path instead of being parsed as attribute separators. */\nfunction quoteGitAttributePattern(value: string): string {\n return `\"${value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"')}\"`;\n}\n\n/**\n * Build the complete fenced `.gitattributes` pattern list for a tracker rooted\n * at `trackerRelativeRoot` (git-root-relative POSIX path, empty when the\n * tracker root IS the git root). This is the single coverage contract shared\n * by `pm merge install` (which writes the fence) and the validate\n * merge-fence-drift detection (which compares the committed fence against the\n * active schema's type folders), so schema-added custom types can never\n * silently diverge from the installed fence without a warning.\n */\nexport function buildMergeAttributePatterns(\n trackerRelativeRoot: string,\n typeFolders: string[],\n): string[] {\n const prefix =\n trackerRelativeRoot.length > 0 ? `${trackerRelativeRoot}/` : \"\";\n const patterns: string[] = [];\n for (const folder of typeFolders) {\n patterns.push(\n `${quoteGitAttributePattern(`${prefix}${folder}/*.toon`)} merge=pm-item-toon`,\n );\n patterns.push(\n `${quoteGitAttributePattern(`${prefix}${folder}/*.md`)} merge=pm-item-markdown`,\n );\n }\n // RelationshipEventStore deliberately accepts a caller-chosen relativePath\n // anywhere below the tracker root. Cover all tracker JSONL first, then let\n // the more-specific history rule below override it. This keeps custom event\n // stores protected without guessing package-owned paths.\n patterns.push(\n `${quoteGitAttributePattern(`${prefix}**/*.jsonl`)} merge=pm-relationship`,\n );\n patterns.push(\n `${quoteGitAttributePattern(`${prefix}history/*.jsonl`)} merge=pm-history`,\n );\n patterns.push(\n `${quoteGitAttributePattern(`${prefix}settings.json`)} merge=pm-json`,\n );\n patterns.push(\n `${quoteGitAttributePattern(`${prefix}schema/*.json`)} merge=pm-json`,\n );\n return patterns;\n}\n\nasync function reconcileGitattributesBlock(\n workspaceRoot: string,\n patterns: string[],\n dryRun: boolean,\n): Promise<{ path: string; changed: boolean }> {\n const gitattributesPath = path.join(workspaceRoot, \".gitattributes\");\n let current = \"\";\n try {\n current = await readFile(gitattributesPath, \"utf8\");\n } catch (error: unknown) {\n if (\n !(error instanceof Error && \"code\" in error && error.code === \"ENOENT\")\n ) {\n throw error;\n }\n }\n const block = [\n PM_GITATTRIBUTES_START,\n ...patterns,\n PM_GITATTRIBUTES_END,\n ].join(\"\\n\");\n const start = current.indexOf(PM_GITATTRIBUTES_START);\n const end = current.indexOf(PM_GITATTRIBUTES_END);\n const withoutManagedBlock =\n start >= 0 && end > start\n ? `${current.slice(0, start)}${current.slice(end + PM_GITATTRIBUTES_END.length)}`\n : current\n .replace(PM_GITATTRIBUTES_START, \"\")\n .replace(PM_GITATTRIBUTES_END, \"\");\n const prefix = withoutManagedBlock.trimEnd();\n const next = `${prefix.length > 0 ? `${prefix}\\n\\n` : \"\"}${block}\\n`;\n if (next === current) {\n return { path: gitattributesPath, changed: false };\n }\n if (!dryRun) {\n await writeFile(gitattributesPath, next, \"utf8\");\n }\n return { path: gitattributesPath, changed: true };\n}\n\n/** Result of comparing the committed merge-fence block against the coverage the active schema requires. */\nexport interface MergeFenceAuditResult {\n /** Audit outcome: no fence installed (nothing to audit), fence matches, or fence drifted from the active schema/type folders. */\n status: \"not_installed\" | \"ok\" | \"drift\";\n /** `.gitattributes` file containing the fence, when one was found. */\n path?: string;\n /** Expected attribute lines absent from the committed fence (for example a schema-added type folder). */\n missing_patterns: string[];\n /** Committed fence lines no longer produced by the coverage contract (for example a removed type folder). */\n stale_patterns: string[];\n}\n\n/**\n * Audit the committed `.gitattributes` merge fence against the coverage the\n * active schema requires, without touching git configuration. The fence file\n * is discovered by walking up from the tracker root (bounded), so the audit\n * stays filesystem-only and safe to run inside `pm validate`. A `drift`\n * result means items of some type folder (or a tracker JSONL store) would\n * merge under git's default text driver despite the fence being installed.\n */\nexport async function auditMergeAttributeFence(\n pmRoot: string,\n typeFolders: string[],\n): Promise<MergeFenceAuditResult> {\n const resolvedRoot = path.resolve(pmRoot);\n let fenceDirectory: string | null = null;\n let fenceContent = \"\";\n let directory = resolvedRoot;\n for (let depth = 0; depth < 8; depth += 1) {\n const candidate = path.join(directory, \".gitattributes\");\n try {\n const raw = await readFile(candidate, \"utf8\");\n if (raw.includes(PM_GITATTRIBUTES_START)) {\n fenceDirectory = directory;\n fenceContent = raw;\n break;\n }\n } catch {\n // No .gitattributes at this level; keep walking up.\n }\n const parent = path.dirname(directory);\n if (parent === directory) {\n break;\n }\n directory = parent;\n }\n if (fenceDirectory === null) {\n return { status: \"not_installed\", missing_patterns: [], stale_patterns: [] };\n }\n const fencePath = path.join(fenceDirectory, \".gitattributes\");\n const start = fenceContent.indexOf(PM_GITATTRIBUTES_START);\n const end = fenceContent.indexOf(PM_GITATTRIBUTES_END);\n const committed =\n end > start\n ? fenceContent\n .slice(start + PM_GITATTRIBUTES_START.length, end)\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n : [];\n const expected = buildMergeAttributePatterns(\n toPosixRelative(fenceDirectory, resolvedRoot),\n typeFolders,\n );\n const committedSet = new Set(committed);\n const expectedSet = new Set(expected);\n const missing = expected.filter((line) => !committedSet.has(line));\n const stale = committed.filter((line) => !expectedSet.has(line));\n return {\n status: missing.length > 0 || stale.length > 0 ? \"drift\" : \"ok\",\n path: fencePath,\n missing_patterns: missing,\n stale_patterns: stale,\n };\n}\n\n/** Outcome of an automatic merge-fence refresh attempted after a schema type mutation. */\nexport interface MergeFenceRefreshOutcome {\n /** What happened: the fence was rewritten, already matched, was never installed (actionable hint), or there is no git repository to configure. */\n status: \"refreshed\" | \"unchanged\" | \"not_installed\" | \"no_git\";\n /** `.gitattributes` path examined, when a git repository was found. */\n path?: string;\n}\n\n/**\n * Refresh the fenced `.gitattributes` merge-driver block after a schema type\n * mutation, but only when `pm merge install` already ran (the fence markers\n * are present). Without this, custom item types registered after install\n * would write items into folders with no merge attribute — silently\n * reintroducing the whole-file conflict class for exactly those items. Repos\n * that never installed the fence get a `not_installed` outcome so callers can\n * surface an actionable hint instead of mutating git configuration nobody\n * asked for.\n */\nexport async function refreshMergeAttributeFenceIfInstalled(\n pmRoot: string,\n): Promise<MergeFenceRefreshOutcome> {\n let workspaceRoot: string;\n try {\n workspaceRoot = await resolveGitWorkspaceRoot(path.resolve(pmRoot));\n } catch {\n return { status: \"no_git\" };\n }\n const trackerRelativeRoot = toPosixRelative(\n workspaceRoot,\n path.resolve(pmRoot),\n );\n const lockSettings = await readSettings(pmRoot);\n const owner = (process.env.PM_AUTHOR ?? lockSettings.author_default).trim();\n const releaseLock = await acquireLock(\n pmRoot,\n MERGE_FENCE_LOCK_ID,\n lockSettings.locks.ttl_seconds,\n owner.length > 0 ? owner : \"unknown\",\n false,\n resolveGovernanceKnobs(lockSettings).force_required_for_stale_lock,\n lockSettings.locks.wait_ms,\n );\n try {\n const gitattributesPath = path.join(workspaceRoot, \".gitattributes\");\n let current: string;\n try {\n current = await readFile(gitattributesPath, \"utf8\");\n } catch (error: unknown) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return { status: \"not_installed\", path: gitattributesPath };\n }\n throw error;\n }\n if (!current.includes(PM_GITATTRIBUTES_START)) {\n return { status: \"not_installed\", path: gitattributesPath };\n }\n // Re-read after acquiring the dedicated fence lock so every concurrent\n // refresher computes from the latest committed type registry.\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(\n settings,\n getActiveExtensionRegistrations(),\n );\n const typeFolders = [\n ...new Set(Object.values(typeRegistry.type_to_folder)),\n ].sort((left, right) => left.localeCompare(right));\n const outcome = await reconcileGitattributesBlock(\n workspaceRoot,\n buildMergeAttributePatterns(trackerRelativeRoot, typeFolders),\n false,\n );\n return {\n status: outcome.changed ? \"refreshed\" : \"unchanged\",\n path: outcome.path,\n };\n } finally {\n await releaseLock();\n }\n}\n\n/**\n * Install (or preview) the repository merge configuration for tracker data:\n * writes the fenced merge-driver block into `.gitattributes` (committed and\n * shared with every branch) and defines the `merge.pm-*.driver` entries in the\n * repository-local git config (per-clone, so every collaborator runs this once\n * per checkout). Requires an initialized tracker and a git repository.\n */\nexport async function runMergeInstall(\n options: MergeInstallOptions,\n global: GlobalOptions,\n): Promise<MergeInstallResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(\n `Tracker is not initialized at ${pmRoot}. Run pm init first.`,\n EXIT_CODE.NOT_FOUND,\n );\n }\n const dryRun = options.dryRun === true;\n const workspaceRoot = await resolveGitWorkspaceRoot(process.cwd());\n const trackerRelativeRoot = toPosixRelative(\n workspaceRoot,\n path.resolve(pmRoot),\n );\n if (isPathOutsideRoot(trackerRelativeRoot)) {\n throw new PmCliError(\n `Tracker root ${pmRoot} is outside the git repository ${workspaceRoot}; there is nothing to configure for this repository.`,\n EXIT_CODE.USAGE,\n );\n }\n\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(\n settings,\n getActiveExtensionRegistrations(),\n );\n const typeFolders = [\n ...new Set(Object.values(typeRegistry.type_to_folder)),\n ].sort((left, right) => left.localeCompare(right));\n const patterns = buildMergeAttributePatterns(\n trackerRelativeRoot,\n typeFolders,\n );\n const gitattributes = await reconcileGitattributesBlock(\n workspaceRoot,\n patterns,\n dryRun,\n );\n\n const gitConfigEntries: Array<{ key: string; value: string }> = [];\n for (const definition of MERGE_DRIVER_DEFINITIONS) {\n gitConfigEntries.push({\n key: `merge.${definition.key}.name`,\n value: definition.name,\n });\n gitConfigEntries.push({\n key: `merge.${definition.key}.driver`,\n value: `pm merge driver ${definition.artifact} \"%O\" \"%A\" \"%B\"${definition.itemPath === undefined ? \"\" : ` --item-path ${definition.itemPath}`}`,\n });\n }\n if (!dryRun) {\n for (const entry of gitConfigEntries) {\n await execFileAsync(\"git\", [\"config\", entry.key, entry.value], {\n cwd: workspaceRoot,\n encoding: \"utf8\",\n windowsHide: true,\n timeout: 10_000,\n });\n }\n }\n\n return {\n ok: true,\n dry_run: dryRun,\n workspace_root: workspaceRoot,\n gitattributes: {\n path: gitattributes.path,\n changed: gitattributes.changed,\n patterns,\n },\n git_config: gitConfigEntries,\n guidance: [\n \"Commit .gitattributes so every branch and collaborator shares the merge mapping.\",\n 'git config is per-clone: each collaborator (and each fresh worktree/clone) runs \"pm merge install\" once.',\n 'After merging branches, run \"pm validate\" and, if history drift is reported, \"pm history-repair --all\" to reconcile item state with merged history.',\n \"Custom item types registered later refresh this fence automatically (pm schema add-type/remove-type); rerun pm merge install only after out-of-band type-folder edits.\",\n ],\n generated_at: nowIso(),\n };\n}\n", "/**\n * @module sdk/schema\n *\n * Owns typed schema customization primitives shared by SDK, CLI, and MCP consumers.\n */\nimport path from \"node:path\";\nimport { mkdir } from \"node:fs/promises\";\nimport {\n pathExists,\n readFileIfExists,\n writeFileAtomic,\n} from \"../core/fs/fs-utils.js\";\nimport { acquireLock } from \"../core/lock/lock.js\";\nimport { refreshMergeAttributeFenceIfInstalled } from \"./merge/install.js\";\nimport {\n assertAliasesAvailable,\n assertTypeFolderAvailable,\n buildInvalidTypeHint,\n escapeForDoubleQuotes,\n normalizeAddTypeInput,\n parseItemTypesFile,\n removeItemType,\n serializeItemTypesFile,\n upsertItemType,\n type ItemTypeDefinition,\n} from \"../core/schema/item-types-file.js\";\nimport {\n assertStatusTokensAvailable,\n BUILTIN_STATUS_IDS,\n normalizeAddStatusInput,\n normalizeStatusToken,\n parseStatusDefsFile,\n removeStatusDef,\n serializeStatusDefsFile,\n upsertStatusDef,\n type RuntimeStatusDefinition,\n} from \"../core/schema/status-defs-file.js\";\nimport {\n normalizeAddFieldInput,\n normalizeFieldKey,\n parseFieldsFile,\n removeField,\n serializeFieldsFile,\n upsertField,\n type RuntimeFieldDefinition,\n} from \"../core/schema/fields-file.js\";\nimport {\n normalizeTypePresetName,\n resolveTypePresetDefinitions,\n TYPE_PRESET_NAMES,\n type TypePresetName,\n} from \"../core/schema/type-presets.js\";\nimport {\n inferTypesFromTitles,\n type InferredTypeCandidate,\n} from \"../core/schema/type-inference.js\";\nimport {\n DEFAULT_RUNTIME_SCHEMA_FILE_PATHS,\n filePathForSchemaSection,\n normalizeRuntimeSchemaSettings,\n resolveRuntimeFieldRegistry,\n resolveRuntimeStatusRegistry,\n} from \"../core/schema/runtime-schema.js\";\nimport {\n resolveItemTypeRegistry,\n toDefaultFolder,\n type ResolvedItemTypeDefinition,\n} from \"../core/item/type-registry.js\";\nimport { listAllItemMetadataLight } from \"../core/store/item-store.js\";\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../core/shared/command-types.js\";\nimport type { PmSettings } from \"../types/index.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\nimport { nowIso } from \"../core/shared/time.js\";\nimport {\n getActiveExtensionRegistrations,\n runActiveOnWriteHooks,\n} from \"../core/extensions/index.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../core/store/paths.js\";\nimport {\n readSettings,\n resolveGovernanceKnobs,\n} from \"../core/store/settings.js\";\n\n/** Public contract for schema subcommands, shared by SDK and presentation-layer consumers. */\nexport const SCHEMA_SUBCOMMANDS = [\n \"add-type\",\n \"remove-type\",\n \"add-status\",\n \"remove-status\",\n \"add-field\",\n \"remove-field\",\n \"list-fields\",\n \"show-field\",\n \"apply-preset\",\n \"list\",\n \"show\",\n \"show-status\",\n] as const;\n/** Restricts schema subcommand values accepted by command, SDK, and storage contracts. */\nexport type SchemaSubcommand = (typeof SCHEMA_SUBCOMMANDS)[number];\n\nconst SCHEMA_TYPES_LOCK_ID = \"schema-types\";\nconst SCHEMA_STATUSES_LOCK_ID = \"schema-statuses\";\nconst SCHEMA_FIELDS_LOCK_ID = \"schema-fields\";\n\n/** Documents the schema add type command options payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaAddTypeCommandOptions {\n /** Value that configures or reports description for this contract. */\n description?: string;\n /** Default status id newly created items of this type receive. */\n defaultStatus?: string;\n /** Value that configures or reports folder for this contract. */\n folder?: string;\n /** Value that configures or reports alias for this contract. */\n alias?: string[];\n /** Value that configures or reports author for this contract. */\n author?: string;\n /** Value that configures or reports force for this contract. */\n force?: boolean;\n}\n\n/** Documents the schema remove type command options payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaRemoveTypeCommandOptions {\n /** Value that configures or reports author for this contract. */\n author?: string;\n /** Value that configures or reports force for this contract. */\n force?: boolean;\n}\n\n/** Documents the schema add status command options payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaAddStatusCommandOptions {\n /** Value that configures or reports role for this contract. */\n role?: string[];\n /** Value that configures or reports alias for this contract. */\n alias?: string[];\n /** Value that configures or reports description for this contract. */\n description?: string;\n /** Value that configures or reports order for this contract. */\n order?: number;\n /** Value that configures or reports author for this contract. */\n author?: string;\n /** Value that configures or reports force for this contract. */\n force?: boolean;\n}\n\n/** Documents the schema remove status command options payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaRemoveStatusCommandOptions {\n /** Value that configures or reports author for this contract. */\n author?: string;\n /** Value that configures or reports force for this contract. */\n force?: boolean;\n}\n\n/** Documents the schema add type result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaAddTypeResult {\n /** Value that configures or reports action for this contract. */\n action: \"add-type\";\n /** Value that configures or reports registered for this contract. */\n registered: boolean;\n /** Value that configures or reports replaced for this contract. */\n replaced: boolean;\n /** Schema type that determines the shape and validation rules for this value. */\n type: ItemTypeDefinition;\n /** Value that configures or reports file for this contract. */\n file: {\n path: string;\n definitions: number;\n };\n /** Value that configures or reports warnings for this contract. */\n warnings: string[];\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\n/** Documents the schema remove type result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaRemoveTypeResult {\n /** Value that configures or reports action for this contract. */\n action: \"remove-type\";\n /** Value that configures or reports removed for this contract. */\n removed: boolean;\n /** Schema type that determines the shape and validation rules for this value. */\n type?: ItemTypeDefinition;\n /** Value that configures or reports file for this contract. */\n file: {\n path: string;\n definitions: number;\n };\n /** Value that configures or reports warnings for this contract. */\n warnings: string[];\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\n/** Documents the schema add status result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaAddStatusResult {\n /** Value that configures or reports action for this contract. */\n action: \"add-status\";\n /** Value that configures or reports registered for this contract. */\n registered: boolean;\n /** Value that configures or reports replaced for this contract. */\n replaced: boolean;\n /** Lifecycle state reported for status. */\n status: RuntimeStatusDefinition;\n /** Value that configures or reports file for this contract. */\n file: {\n path: string;\n statuses: number;\n };\n /** Value that configures or reports warnings for this contract. */\n warnings: string[];\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\n/** Documents the schema remove status result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaRemoveStatusResult {\n /** Value that configures or reports action for this contract. */\n action: \"remove-status\";\n /** Value that configures or reports removed for this contract. */\n removed: boolean;\n /** Lifecycle state reported for status. */\n status?: RuntimeStatusDefinition;\n /** Value that configures or reports file for this contract. */\n file: {\n path: string;\n statuses: number;\n };\n /** Value that configures or reports warnings for this contract. */\n warnings: string[];\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\n/** Documents the schema add field command options payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaAddFieldCommandOptions {\n /** Schema type that determines the shape and validation rules for this value. */\n type?: string;\n /** Value that configures or reports commands for this contract. */\n commands?: string[];\n /** Value that configures or reports description for this contract. */\n description?: string;\n /** Value that configures or reports cli flag for this contract. */\n cliFlag?: string;\n /** Value that configures or reports alias for this contract. */\n alias?: string[];\n /** Value that configures or reports required for this contract. */\n required?: boolean;\n /** Value that configures or reports required on create for this contract. */\n requiredOnCreate?: boolean;\n /** Value that configures or reports allow unset for this contract. */\n allowUnset?: boolean;\n /** Value that configures or reports required types for this contract. */\n requiredTypes?: string[];\n /** Value that configures or reports author for this contract. */\n author?: string;\n /** Value that configures or reports force for this contract. */\n force?: boolean;\n}\n\n/** Documents the schema remove field command options payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaRemoveFieldCommandOptions {\n /** Value that configures or reports author for this contract. */\n author?: string;\n /** Value that configures or reports force for this contract. */\n force?: boolean;\n}\n\n/** Documents the schema apply preset command options payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaApplyPresetCommandOptions {\n /** Value that configures or reports author for this contract. */\n author?: string;\n /** Value that configures or reports force for this contract. */\n force?: boolean;\n}\n\n/** Documents the schema add type infer command options payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaAddTypeInferCommandOptions {\n /** Number of min entries represented by this result. */\n minCount?: number;\n /** Value that configures or reports apply for this contract. */\n apply?: boolean;\n /** Value that configures or reports author for this contract. */\n author?: string;\n /** Value that configures or reports force for this contract. */\n force?: boolean;\n}\n\n/** Documents the schema field summary payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaFieldSummary {\n /** Value that configures or reports key for this contract. */\n key: string;\n /** Schema type that determines the shape and validation rules for this value. */\n type: string;\n /** Value that configures or reports commands for this contract. */\n commands: string[];\n /** Value that configures or reports cli flag for this contract. */\n cli_flag: string;\n /** Value that configures or reports cli aliases for this contract. */\n cli_aliases: string[];\n /** Value that configures or reports description for this contract. */\n description?: string;\n /** Value that configures or reports required for this contract. */\n required: boolean;\n /** Value that configures or reports required on create for this contract. */\n required_on_create: boolean;\n /** Value that configures or reports allow unset for this contract. */\n allow_unset: boolean;\n /** Value that configures or reports required types for this contract. */\n required_types: string[];\n}\n\n/** Documents the schema add field result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaAddFieldResult {\n /** Value that configures or reports action for this contract. */\n action: \"add-field\";\n /** Value that configures or reports registered for this contract. */\n registered: boolean;\n /** Value that configures or reports replaced for this contract. */\n replaced: boolean;\n /** Value that configures or reports field for this contract. */\n field: RuntimeFieldDefinition;\n /** Value that configures or reports file for this contract. */\n file: {\n path: string;\n fields: number;\n };\n /** Value that configures or reports warnings for this contract. */\n warnings: string[];\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\n/** Documents the schema remove field result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaRemoveFieldResult {\n /** Value that configures or reports action for this contract. */\n action: \"remove-field\";\n /** Value that configures or reports removed for this contract. */\n removed: boolean;\n /** Value that configures or reports field for this contract. */\n field?: RuntimeFieldDefinition;\n /** Value that configures or reports file for this contract. */\n file: {\n path: string;\n fields: number;\n };\n /** Value that configures or reports warnings for this contract. */\n warnings: string[];\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\n/** Documents the schema list fields result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaListFieldsResult {\n /** Value that configures or reports action for this contract. */\n action: \"list-fields\";\n /** Value that configures or reports fields for this contract. */\n fields: SchemaFieldSummary[];\n /** Value that configures or reports counts for this contract. */\n counts: {\n total: number;\n };\n /** Value that configures or reports file for this contract. */\n file: {\n path: string;\n };\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\n/** Documents the schema show field result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaShowFieldResult {\n /** Value that configures or reports action for this contract. */\n action: \"show-field\";\n /** Value that configures or reports field for this contract. */\n field: SchemaFieldSummary;\n /** Value that configures or reports file for this contract. */\n file: {\n path: string;\n };\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\n/** Documents the schema apply preset result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaApplyPresetResult {\n /** Value that configures or reports action for this contract. */\n action: \"apply-preset\";\n /** Value that configures or reports preset for this contract. */\n preset: TypePresetName;\n /** Value that configures or reports registered for this contract. */\n registered: string[];\n /** Value that configures or reports replaced for this contract. */\n replaced: string[];\n /** Value that configures or reports file for this contract. */\n file: {\n path: string;\n definitions: number;\n };\n /** Value that configures or reports warnings for this contract. */\n warnings: string[];\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\n/** Documents the schema add type infer result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaAddTypeInferResult {\n /** Value that configures or reports action for this contract. */\n action: \"infer-types\";\n /** Value that configures or reports applied for this contract. */\n applied: boolean;\n /** Number of min entries represented by this result. */\n min_count: number;\n /** Value that configures or reports candidates for this contract. */\n candidates: InferredTypeCandidate[];\n /** Value that configures or reports registered for this contract. */\n registered: string[];\n /** Value that configures or reports replaced for this contract. */\n replaced: string[];\n /** Value that configures or reports skipped for this contract. */\n skipped: Array<{ name: string; reason: string }>;\n /** Value that configures or reports file for this contract. */\n file: {\n path: string;\n definitions: number;\n };\n /** Value that configures or reports warnings for this contract. */\n warnings: string[];\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\n/** Documents the schema type summary payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaTypeSummary {\n /** Value that configures or reports name for this contract. */\n name: string;\n /** Value that configures or reports folder for this contract. */\n folder: string;\n /** Value that configures or reports aliases for this contract. */\n aliases: string[];\n /** Default status id newly created items of this type receive. */\n default_status?: string;\n /** Value that configures or reports description for this contract. */\n description?: string;\n}\n\n/** Documents the schema status summary payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaStatusSummary {\n /** Stable identifier used to reference this record across commands and storage. */\n id: string;\n /** Value that configures or reports source for this contract. */\n source: \"builtin\" | \"custom\";\n /** Value that configures or reports roles for this contract. */\n roles: string[];\n /** Value that configures or reports aliases for this contract. */\n aliases: string[];\n /** Value that configures or reports description for this contract. */\n description?: string;\n /** Value that configures or reports order for this contract. */\n order?: number;\n}\n\n/** Documents the schema type definition result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaTypeDefinitionResult extends SchemaTypeSummary {\n /** Value that configures or reports source for this contract. */\n source: \"builtin\" | \"custom\" | \"extension\";\n /** Value that configures or reports extension for this contract. */\n extension?: {\n layer: string;\n name: string;\n };\n /** Value that configures or reports required create fields for this contract. */\n required_create_fields: string[];\n /** Value that configures or reports required create repeatables for this contract. */\n required_create_repeatables: string[];\n /** Value that configures or reports options for this contract. */\n options: ResolvedItemTypeDefinition[\"options\"];\n /** Value that configures or reports command option policies for this contract. */\n command_option_policies: ResolvedItemTypeDefinition[\"command_option_policies\"];\n}\n\n/** Documents the schema list result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaListResult {\n /** Value that configures or reports action for this contract. */\n action: \"list\";\n /** Value that configures or reports builtin for this contract. */\n builtin: SchemaTypeSummary[];\n /** Value that configures or reports custom for this contract. */\n custom: SchemaTypeSummary[];\n /** Value that configures or reports extension for this contract. */\n extension: SchemaTypeSummary[];\n /** Value that configures or reports counts for this contract. */\n counts: {\n builtin: number;\n custom: number;\n extension: number;\n total: number;\n };\n /** Value that configures or reports statuses for this contract. */\n statuses: {\n builtin: SchemaStatusSummary[];\n custom: SchemaStatusSummary[];\n counts: {\n builtin: number;\n custom: number;\n total: number;\n };\n };\n /** Value that configures or reports fields for this contract. */\n fields: {\n custom: SchemaFieldSummary[];\n counts: {\n total: number;\n };\n };\n /** Value that configures or reports file for this contract. */\n file: {\n path: string;\n };\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\n/** Documents the schema show result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaShowResult {\n /** Value that configures or reports action for this contract. */\n action: \"show\";\n /** Schema type that determines the shape and validation rules for this value. */\n type: SchemaTypeDefinitionResult;\n /** Value that configures or reports file for this contract. */\n file: {\n path: string;\n };\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\n/** Documents the schema show status result payload exchanged by command, SDK, and package integrations. */\nexport interface SchemaShowStatusResult {\n /** Value that configures or reports action for this contract. */\n action: \"show-status\";\n /** Lifecycle state reported for status. */\n status: SchemaStatusSummary;\n /** Value that configures or reports file for this contract. */\n file: {\n path: string;\n };\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\n/** Restricts schema inspect result values accepted by command, SDK, and storage contracts. */\nexport type SchemaInspectResult =\n | SchemaListResult\n | SchemaShowResult\n | SchemaShowStatusResult\n | SchemaListFieldsResult\n | SchemaShowFieldResult;\n\nfunction toAuthor(\n candidate: string | undefined,\n defaultAuthor: string,\n): string {\n const resolved = candidate ?? process.env.PM_AUTHOR ?? defaultAuthor;\n const trimmed = resolved.trim();\n return trimmed.length > 0 ? trimmed : \"unknown\";\n}\n\n/* c8 ignore start -- schema command mutation/inspection branches are covered by broader schema integration workflows. */\n/** Implements run schema add type for the public runtime surface of this module. */\nexport async function runSchemaAddType(\n name: string | undefined,\n options: SchemaAddTypeCommandOptions,\n global: GlobalOptions,\n): Promise<SchemaAddTypeResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n await ensureInitialized(pmRoot);\n\n let normalized;\n try {\n normalized = normalizeAddTypeInput({\n name,\n description: options.description,\n defaultStatus: options.defaultStatus,\n folder: options.folder,\n aliases: options.alias,\n });\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.USAGE,\n );\n }\n\n const settings = await readSettings(pmRoot);\n const schema = normalizeRuntimeSchemaSettings(settings.schema);\n const typesPath = filePathForSchemaSection(\n pmRoot,\n schema.files.types,\n DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.types,\n );\n\n const warnings: string[] = [];\n const author = toAuthor(options.author, settings.author_default);\n const governance = resolveGovernanceKnobs(settings);\n\n const releaseLock = await acquireLock(\n pmRoot,\n SCHEMA_TYPES_LOCK_ID,\n settings.locks.ttl_seconds,\n author,\n Boolean(options.force),\n governance.force_required_for_stale_lock,\n settings.locks.wait_ms,\n );\n let upsert;\n try {\n const previousRaw = await readFileIfExists(typesPath);\n let parsed;\n try {\n parsed = parseItemTypesFile(previousRaw);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n try {\n assertAliasesAvailable(normalized, parsed);\n // GH-248: reject distinct type names that would slug to the same storage\n // folder (e.g. \"Spike\"/\"Spikes\") so item files never silently share a\n // directory. Same-named upserts (recase/idempotent re-runs) are exempt.\n // reservedFolders covers built-in + extension + settings-resolved custom\n // folders so a slug like \"Tasks\" can't collide with the built-in Task.\n const reservedFolders = new Map<string, string>();\n const resolvedRegistry = resolveItemTypeRegistry(\n settings,\n getActiveExtensionRegistrations(),\n );\n for (const [typeName, folder] of Object.entries(\n resolvedRegistry.type_to_folder,\n )) {\n const folderKey = folder.trim().toLowerCase();\n if (folderKey.length > 0 && !reservedFolders.has(folderKey)) {\n reservedFolders.set(folderKey, typeName);\n }\n }\n assertTypeFolderAvailable(normalized, parsed, reservedFolders);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.USAGE,\n );\n }\n upsert = upsertItemType(parsed, normalized);\n // GH-248: an upsert that only differs in case from the existing canonical\n // name silently renames the stored type (e.g. registering \"spike\" over\n // \"Spike\"). Surface it as a non-blocking warning so the operator knows the\n // existing definition was replaced rather than a new type created.\n if (\n upsert.replaced &&\n upsert.previousName !== undefined &&\n upsert.previousName !== upsert.definition.name\n ) {\n warnings.push(\n `type_recased:${upsert.previousName}->${upsert.definition.name}`,\n );\n }\n // writeFileAtomic writes to a temp file then renames, so a failure leaves the\n // existing types.json untouched; no manual rollback is needed.\n await writeFileAtomic(typesPath, serializeItemTypesFile(upsert.file));\n await ensureTypeFolderScaffold(\n pmRoot,\n [upsert.definition],\n warnings,\n \"schema:add-type-folder\",\n );\n warnings.push(\n ...(await runActiveOnWriteHooks({\n path: typesPath,\n scope: \"project\",\n op: \"schema:add-type\",\n })),\n );\n } finally {\n await releaseLock();\n }\n await appendMergeFenceWarnings(pmRoot, warnings);\n\n return {\n action: \"add-type\",\n registered: true,\n replaced: upsert.replaced,\n type: upsert.definition,\n file: {\n path: typesPath,\n definitions: upsert.file.definitions.length,\n },\n warnings: finalizeWarnings(warnings),\n generated_at: nowIso(),\n };\n}\n\nasync function ensureInitialized(pmRoot: string): Promise<void> {\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(\n `Tracker is not initialized at ${pmRoot}. Run pm init first.`,\n EXIT_CODE.NOT_FOUND,\n );\n }\n}\n\n/**\n * Reconcile the committed merge-driver fence with the type folders that exist\n * after a schema type mutation. When `pm merge install` already ran the fence\n * is rewritten in place (`merge_fence_refreshed`); when the repository has a\n * tracker inside git but never installed the fence, an actionable hint warning\n * is emitted instead — new type folders would otherwise merge under git's\n * default text driver and reintroduce whole-file item conflicts (pm-i4fx).\n */\nasync function appendMergeFenceWarnings(\n pmRoot: string,\n warnings: string[],\n): Promise<void> {\n try {\n const fence = await refreshMergeAttributeFenceIfInstalled(pmRoot);\n if (fence.status === \"refreshed\") {\n warnings.push(\"merge_fence_refreshed\");\n } else if (fence.status === \"not_installed\") {\n warnings.push(\n 'merge_fence_not_installed:type folders lack git merge drivers; run \"pm merge install\"',\n );\n }\n } catch {\n warnings.push(\n 'merge_fence_refresh_failed:run \"pm merge install\" to reconcile',\n );\n }\n}\n\n/** Deduplicates schema mutation warnings and returns their stable locale-aware order. */\nfunction finalizeWarnings(warnings: string[]): string[] {\n return [...new Set(warnings)].sort((left, right) =>\n left.localeCompare(right),\n );\n}\n\n/** Counts items whose resolved type matches `typeName` (case-insensitive). Uses the lightest existing read path (listAllItemMetadataLight skips the heavy collections cache). All items are counted — not just open ones — so the advisory warning surfaces every item the removed definition would orphan; the count is non-blocking. The caller passes its already-loaded `settings` so we never re-read settings.json from disk here. */\nasync function countItemsUsingType(\n pmRoot: string,\n settings: PmSettings,\n schema: ReturnType<typeof normalizeRuntimeSchemaSettings>,\n typeName: string,\n): Promise<number> {\n const registry = resolveItemTypeRegistry(\n settings,\n getActiveExtensionRegistrations(),\n );\n const lowerName = typeName.trim().toLowerCase();\n const items = await listAllItemMetadataLight(\n pmRoot,\n settings.item_format,\n registry.type_to_folder,\n [],\n schema,\n );\n return items.filter(\n (item) =>\n typeof item.type === \"string\" && item.type.toLowerCase() === lowerName,\n ).length;\n}\n\n/** Counts items currently set to the status whose id/aliases resolve to `statusId`. Uses listAllItemMetadataLight (the lightest read path). All items are counted regardless of lifecycle phase; the count is advisory only. The caller passes its already-loaded `settings` so we never re-read from disk. */\nasync function countItemsUsingStatus(\n pmRoot: string,\n settings: PmSettings,\n schema: ReturnType<typeof normalizeRuntimeSchemaSettings>,\n statusId: string,\n): Promise<number> {\n const registry = resolveItemTypeRegistry(\n settings,\n getActiveExtensionRegistrations(),\n );\n const statusRegistry = resolveRuntimeStatusRegistry(schema);\n const normalizedId = normalizeStatusToken(statusId);\n const items = await listAllItemMetadataLight(\n pmRoot,\n settings.item_format,\n registry.type_to_folder,\n [],\n schema,\n );\n return items.filter((item) => {\n const itemStatus = typeof item.status === \"string\" ? item.status : \"\";\n const resolved =\n statusRegistry.alias_to_id.get(normalizeStatusToken(itemStatus)) ??\n normalizeStatusToken(itemStatus);\n return resolved === normalizedId;\n }).length;\n}\n\n/** Adds non-blocking usage and workflow diagnostics for a removed custom status. */\nasync function appendRemovedStatusWarnings(\n warnings: string[],\n pmRoot: string,\n settings: PmSettings,\n schema: ReturnType<typeof normalizeRuntimeSchemaSettings>,\n removedId: string,\n): Promise<void> {\n if (removedId.length === 0 || BUILTIN_STATUS_IDS.has(removedId)) {\n return;\n }\n const usingStatus = await countItemsUsingStatus(\n pmRoot,\n settings,\n schema,\n removedId,\n );\n if (usingStatus > 0) {\n warnings.push(`items_using_status:${usingStatus}`);\n }\n const referencingSlots = workflowSlotsReferencing(schema.workflow, removedId);\n if (referencingSlots.length > 0) {\n warnings.push(\n `status_referenced_by_workflow:${referencingSlots.join(\",\")}`,\n );\n }\n}\n\n/** Returns the workflow role-slot names (open_status, close_status, ...) that currently point at `statusId` (normalized). Used to warn before removing a status that a workflow default still references. */\nfunction workflowSlotsReferencing(\n workflow: {\n draft_status?: string;\n open_status?: string;\n in_progress_status?: string;\n blocked_status?: string;\n close_status?: string;\n canceled_status?: string;\n },\n statusId: string,\n): string[] {\n const slots: Array<[string, string | undefined]> = [\n [\"draft_status\", workflow.draft_status],\n [\"open_status\", workflow.open_status],\n [\"in_progress_status\", workflow.in_progress_status],\n [\"blocked_status\", workflow.blocked_status],\n [\"close_status\", workflow.close_status],\n [\"canceled_status\", workflow.canceled_status],\n ];\n return slots\n .filter(\n ([, value]) =>\n value !== undefined && normalizeStatusToken(value) === statusId,\n )\n .map(([slot]) => slot);\n}\n\n/** Implements run schema remove type for the public runtime surface of this module. */\nexport async function runSchemaRemoveType(\n name: string | undefined,\n options: SchemaRemoveTypeCommandOptions,\n global: GlobalOptions,\n): Promise<SchemaRemoveTypeResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n await ensureInitialized(pmRoot);\n\n const settings = await readSettings(pmRoot);\n const schema = normalizeRuntimeSchemaSettings(settings.schema);\n const typesPath = filePathForSchemaSection(\n pmRoot,\n schema.files.types,\n DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.types,\n );\n\n const warnings: string[] = [];\n const author = toAuthor(options.author, settings.author_default);\n const governance = resolveGovernanceKnobs(settings);\n\n const releaseLock = await acquireLock(\n pmRoot,\n SCHEMA_TYPES_LOCK_ID,\n settings.locks.ttl_seconds,\n author,\n Boolean(options.force),\n governance.force_required_for_stale_lock,\n settings.locks.wait_ms,\n );\n let removal;\n try {\n const previousRaw = await readFileIfExists(typesPath);\n let parsed;\n try {\n parsed = parseItemTypesFile(previousRaw);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n try {\n removal = removeItemType(parsed, name);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.USAGE,\n );\n }\n if (removal.removed) {\n // Only emit the advisory orphan-count warning once a removable custom\n // definition was actually removed; a no-op/unknown removal would otherwise\n // surface a misleading items_using_type:* warning. The count is\n // non-blocking and reuses the already-loaded settings (no disk re-read).\n const removedName = (removal.definition?.name ?? name ?? \"\").trim();\n if (removedName.length > 0) {\n const usingType = await countItemsUsingType(\n pmRoot,\n settings,\n schema,\n removedName,\n );\n if (usingType > 0) {\n warnings.push(`items_using_type:${usingType}`);\n }\n }\n // writeFileAtomic writes to a temp file then renames, so a failure leaves\n // the existing types.json untouched; no manual rollback is needed.\n await writeFileAtomic(typesPath, serializeItemTypesFile(removal.file));\n warnings.push(\n ...(await runActiveOnWriteHooks({\n path: typesPath,\n scope: \"project\",\n op: \"schema:remove-type\",\n })),\n );\n }\n } finally {\n await releaseLock();\n }\n if (removal.removed) {\n await appendMergeFenceWarnings(pmRoot, warnings);\n }\n\n return {\n action: \"remove-type\",\n removed: removal.removed,\n ...(removal.definition ? { type: removal.definition } : {}),\n file: {\n path: typesPath,\n definitions: removal.file.definitions.length,\n },\n warnings: finalizeWarnings(warnings),\n generated_at: nowIso(),\n };\n}\n\nfunction statusesPathFor(\n pmRoot: string,\n schema: ReturnType<typeof normalizeRuntimeSchemaSettings>,\n): string {\n return filePathForSchemaSection(\n pmRoot,\n schema.files.statuses,\n DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.statuses,\n );\n}\n\nfunction fieldsPathFor(\n pmRoot: string,\n schema: ReturnType<typeof normalizeRuntimeSchemaSettings>,\n): string {\n return filePathForSchemaSection(\n pmRoot,\n schema.files.fields,\n DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.fields,\n );\n}\n\nfunction typesPathFor(\n pmRoot: string,\n schema: ReturnType<typeof normalizeRuntimeSchemaSettings>,\n): string {\n return filePathForSchemaSection(\n pmRoot,\n schema.files.types,\n DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.types,\n );\n}\n\n/** Creates the storage folder for each item-type definition (resolving the default folder when unset) and runs on-write hooks for newly created folders. Shared with `pm profile apply` so profile-staged types scaffold identically to `pm schema add-type`. Existing folders are skipped, keeping the call idempotent. */\nexport async function ensureTypeFolderScaffold(\n pmRoot: string,\n definitions: readonly ItemTypeDefinition[],\n warnings: string[],\n op: string,\n): Promise<void> {\n for (const definition of definitions) {\n const folder = definition.folder ?? toDefaultFolder(definition.name);\n const target = path.join(pmRoot, folder);\n if (await pathExists(target)) {\n continue;\n }\n await mkdir(target, { recursive: true });\n warnings.push(\n ...(await runActiveOnWriteHooks({\n path: target,\n scope: \"project\",\n op,\n })),\n );\n }\n}\n\nfunction toSchemaFieldSummary(\n field: ReturnType<typeof resolveRuntimeFieldRegistry>[\"definitions\"][number],\n): SchemaFieldSummary {\n return {\n key: field.key,\n type: field.type,\n commands: [...field.commands],\n cli_flag: `--${field.cli_flag}`,\n cli_aliases: field.cli_aliases.map((alias) => `--${alias}`),\n ...(field.description ? { description: field.description } : {}),\n required: field.required,\n required_on_create: field.required_on_create,\n allow_unset: field.allow_unset,\n required_types: [...field.required_types],\n };\n}\n\nfunction toExistingStatusDefinition(\n resolvedExisting:\n | ReturnType<typeof resolveRuntimeStatusRegistry>[\"definitions\"][number]\n | undefined,\n): RuntimeStatusDefinition | undefined {\n if (!resolvedExisting) {\n return undefined;\n }\n return {\n id: resolvedExisting.id,\n ...(resolvedExisting.roles.length > 0\n ? { roles: [...resolvedExisting.roles] }\n : {}),\n ...(resolvedExisting.aliases.length > 0\n ? { aliases: [...resolvedExisting.aliases] }\n : {}),\n ...(resolvedExisting.description\n ? { description: resolvedExisting.description }\n : {}),\n ...(typeof resolvedExisting.order === \"number\"\n ? { order: resolvedExisting.order }\n : {}),\n };\n}\n\nfunction buildStatusFileAliasMap(\n statuses: RuntimeStatusDefinition[],\n): Map<string, string> {\n const fileAliasToId = new Map<string, string>();\n for (const definition of statuses) {\n const defId = normalizeStatusToken(definition.id);\n if (defId.length === 0) {\n continue;\n }\n fileAliasToId.set(defId, defId);\n for (const alias of Array.isArray(definition.aliases)\n ? definition.aliases\n : []) {\n const aliasToken = normalizeStatusToken(alias);\n if (aliasToken.length > 0 && !fileAliasToId.has(aliasToken)) {\n fileAliasToId.set(aliasToken, defId);\n }\n }\n }\n return fileAliasToId;\n}\n\n/** Implements run schema add status for the public runtime surface of this module. */\nexport async function runSchemaAddStatus(\n id: string | undefined,\n options: SchemaAddStatusCommandOptions,\n global: GlobalOptions,\n): Promise<SchemaAddStatusResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n await ensureInitialized(pmRoot);\n\n let normalized;\n try {\n normalized = normalizeAddStatusInput({\n id,\n roles: options.role,\n aliases: options.alias,\n description: options.description,\n order: options.order,\n });\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.USAGE,\n );\n }\n\n const settings = await readSettings(pmRoot);\n const schema = normalizeRuntimeSchemaSettings(settings.schema);\n const statusesPath = statusesPathFor(pmRoot, schema);\n const statusRegistry = resolveRuntimeStatusRegistry(schema);\n\n // Reject id/alias collisions with a DIFFERENT existing status so a custom\n // status can never shadow a built-in lifecycle token (e.g. --alias open).\n try {\n assertStatusTokensAvailable(normalized, statusRegistry.alias_to_id);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.USAGE,\n );\n }\n\n // Seed the upsert from the resolved (settings-or-file) definition so omitting\n // --role/--alias preserves metadata defined in settings.schema.statuses, not\n // only what is already in statuses.json.\n const baseDefinition = toExistingStatusDefinition(\n statusRegistry.by_id.get(normalized.id),\n );\n\n const warnings: string[] = [];\n const author = toAuthor(options.author, settings.author_default);\n const governance = resolveGovernanceKnobs(settings);\n\n const releaseLock = await acquireLock(\n pmRoot,\n SCHEMA_STATUSES_LOCK_ID,\n settings.locks.ttl_seconds,\n author,\n Boolean(options.force),\n governance.force_required_for_stale_lock,\n settings.locks.wait_ms,\n );\n let upsert;\n try {\n const previousRaw = await readFileIfExists(statusesPath);\n let parsed;\n try {\n parsed = parseStatusDefsFile(previousRaw);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n // Re-check collisions against the CURRENT file under the lock: the pre-lock\n // check used the registry loaded before acquiring schema-statuses, so a\n // concurrent add-status could have written a colliding id/alias in between.\n // The lock serializes writes; this serializes the collision decision too.\n const fileAliasToId = buildStatusFileAliasMap(parsed.statuses);\n try {\n assertStatusTokensAvailable(normalized, fileAliasToId);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.USAGE,\n );\n }\n upsert = upsertStatusDef(parsed, normalized, baseDefinition);\n // writeFileAtomic writes to a temp file then renames, so a failure leaves\n // the existing statuses.json untouched; no manual rollback is needed.\n await writeFileAtomic(statusesPath, serializeStatusDefsFile(upsert.file));\n warnings.push(\n ...(await runActiveOnWriteHooks({\n path: statusesPath,\n scope: \"project\",\n op: \"schema:add-status\",\n })),\n );\n } finally {\n await releaseLock();\n }\n\n return {\n action: \"add-status\",\n registered: true,\n replaced: upsert.replaced,\n status: upsert.definition,\n file: {\n path: statusesPath,\n statuses: upsert.file.statuses.length,\n },\n warnings: finalizeWarnings(warnings),\n generated_at: nowIso(),\n };\n}\n\n/** Implements run schema remove status for the public runtime surface of this module. */\nexport async function runSchemaRemoveStatus(\n id: string | undefined,\n options: SchemaRemoveStatusCommandOptions,\n global: GlobalOptions,\n): Promise<SchemaRemoveStatusResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n await ensureInitialized(pmRoot);\n\n const settings = await readSettings(pmRoot);\n const schema = normalizeRuntimeSchemaSettings(settings.schema);\n const statusesPath = statusesPathFor(pmRoot, schema);\n\n const warnings: string[] = [];\n const author = toAuthor(options.author, settings.author_default);\n const governance = resolveGovernanceKnobs(settings);\n\n const releaseLock = await acquireLock(\n pmRoot,\n SCHEMA_STATUSES_LOCK_ID,\n settings.locks.ttl_seconds,\n author,\n Boolean(options.force),\n governance.force_required_for_stale_lock,\n settings.locks.wait_ms,\n );\n let removal;\n try {\n const previousRaw = await readFileIfExists(statusesPath);\n let parsed;\n try {\n parsed = parseStatusDefsFile(previousRaw);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n try {\n removal = removeStatusDef(parsed, id);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.USAGE,\n );\n }\n if (removal.removed) {\n // Only emit the advisory orphan-count warning once a removable custom\n // status was actually removed; a no-op/unknown removal would otherwise\n // surface a misleading items_using_status:* warning. The count reuses the\n // already-loaded settings (no disk re-read) and is non-blocking.\n const removedId = normalizeStatusToken(removal.definition?.id ?? id);\n // Removing a status that a workflow default still points at would leave\n // pm close / default pm create resolving to an unregistered status. Warn\n // (non-blocking, consistent with remove-type) so the operator re-points\n // the workflow slot via schema/workflows.json or pm config.\n await appendRemovedStatusWarnings(\n warnings,\n pmRoot,\n settings,\n schema,\n removedId,\n );\n await writeFileAtomic(\n statusesPath,\n serializeStatusDefsFile(removal.file),\n );\n warnings.push(\n ...(await runActiveOnWriteHooks({\n path: statusesPath,\n scope: \"project\",\n op: \"schema:remove-status\",\n })),\n );\n }\n } finally {\n await releaseLock();\n }\n\n return {\n action: \"remove-status\",\n removed: removal.removed,\n ...(removal.definition ? { status: removal.definition } : {}),\n file: {\n path: statusesPath,\n statuses: removal.file.statuses.length,\n },\n warnings: finalizeWarnings(warnings),\n generated_at: nowIso(),\n };\n}\n\nfunction toSchemaTypeSummary(\n definition: ResolvedItemTypeDefinition,\n): SchemaTypeSummary {\n return {\n name: definition.name,\n folder: definition.folder,\n aliases: Array.isArray(definition.aliases) ? [...definition.aliases] : [],\n ...(definition.default_status\n ? { default_status: definition.default_status }\n : {}),\n ...(definition.description ? { description: definition.description } : {}),\n };\n}\n\nfunction toSchemaTypeDefinition(\n definition: ResolvedItemTypeDefinition,\n source: SchemaTypeDefinitionResult[\"source\"],\n extensionProvenance?: SchemaTypeDefinitionResult[\"extension\"],\n): SchemaTypeDefinitionResult {\n return {\n ...toSchemaTypeSummary(definition),\n source,\n ...(extensionProvenance ? { extension: extensionProvenance } : {}),\n required_create_fields: [...definition.required_create_fields],\n required_create_repeatables: [...definition.required_create_repeatables],\n options: structuredClone(definition.options),\n command_option_policies: structuredClone(\n definition.command_option_policies,\n ),\n };\n}\n\nfunction toSchemaStatusSummary(\n definition: RuntimeStatusDefinition,\n): SchemaStatusSummary {\n return {\n id: definition.id,\n source: BUILTIN_STATUS_IDS.has(definition.id) ? \"builtin\" : \"custom\",\n roles: Array.isArray(definition.roles) ? [...definition.roles] : [],\n aliases: Array.isArray(definition.aliases) ? [...definition.aliases] : [],\n ...(definition.description ? { description: definition.description } : {}),\n ...(typeof definition.order === \"number\"\n ? { order: definition.order }\n : {}),\n };\n}\n\nfunction classifyTypeSource(\n name: string,\n customNames: Set<string>,\n extensionNames: Set<string>,\n): SchemaTypeDefinitionResult[\"source\"] {\n const lowerName = name.toLowerCase();\n if (extensionNames.has(lowerName)) {\n return \"extension\";\n }\n if (customNames.has(lowerName)) {\n return \"custom\";\n }\n return \"builtin\";\n}\n\nfunction collectExtensionTypeProvenance(): Map<\n string,\n SchemaTypeDefinitionResult[\"extension\"]\n> {\n const provenance = new Map<string, SchemaTypeDefinitionResult[\"extension\"]>();\n const registrations = getActiveExtensionRegistrations();\n for (const registration of registrations?.item_types ?? []) {\n const rawTypes = (registration as { types?: unknown[] }).types;\n if (!Array.isArray(rawTypes)) {\n continue;\n }\n for (const rawType of rawTypes) {\n if (\n typeof rawType !== \"object\" ||\n rawType === null ||\n Array.isArray(rawType)\n ) {\n continue;\n }\n const name = (rawType as { name?: unknown }).name;\n if (typeof name === \"string\" && name.trim().length > 0) {\n provenance.set(name.trim().toLowerCase(), {\n layer: registration.layer,\n name: registration.name,\n });\n }\n }\n }\n return provenance;\n}\n\nfunction buildSchemaStatusSummaries(\n schema: ReturnType<typeof normalizeRuntimeSchemaSettings>,\n): { builtin: SchemaStatusSummary[]; custom: SchemaStatusSummary[] } {\n const registry = resolveRuntimeStatusRegistry(schema);\n const builtin: SchemaStatusSummary[] = [];\n const custom: SchemaStatusSummary[] = [];\n for (const definition of registry.definitions) {\n const summary = toSchemaStatusSummary(definition);\n if (summary.source === \"builtin\") {\n builtin.push(summary);\n } else {\n custom.push(summary);\n }\n }\n return { builtin, custom };\n}\n\nasync function loadSchemaInspectionContext(global: GlobalOptions): Promise<{\n pmRoot: string;\n typesPath: string;\n statusesPath: string;\n byType: Record<string, ResolvedItemTypeDefinition>;\n customNames: Set<string>;\n extensionProvenance: Map<string, SchemaTypeDefinitionResult[\"extension\"]>;\n schema: ReturnType<typeof normalizeRuntimeSchemaSettings>;\n}> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n await ensureInitialized(pmRoot);\n const settings = await readSettings(pmRoot);\n const schema = normalizeRuntimeSchemaSettings(settings.schema);\n const typesPath = filePathForSchemaSection(\n pmRoot,\n schema.files.types,\n DEFAULT_RUNTIME_SCHEMA_FILE_PATHS.types,\n );\n const statusesPath = statusesPathFor(pmRoot, schema);\n const registry = resolveItemTypeRegistry(\n settings,\n getActiveExtensionRegistrations(),\n );\n const extensionProvenance = collectExtensionTypeProvenance();\n const customNames = new Set(\n (settings.item_types?.definitions ?? [])\n .map((definition) => definition.name.trim().toLowerCase())\n .filter((name) => name.length > 0 && !extensionProvenance.has(name)),\n );\n return {\n pmRoot,\n typesPath,\n statusesPath,\n byType: registry.by_type,\n customNames,\n extensionProvenance,\n schema,\n };\n}\n\n/** Implements run schema list for the public runtime surface of this module. */\nexport async function runSchemaList(\n global: GlobalOptions,\n): Promise<SchemaListResult> {\n const context = await loadSchemaInspectionContext(global);\n const builtin: SchemaTypeSummary[] = [];\n const custom: SchemaTypeSummary[] = [];\n const extension: SchemaTypeSummary[] = [];\n for (const definition of Object.values(context.byType).sort((left, right) =>\n left.name.localeCompare(right.name),\n )) {\n const source = classifyTypeSource(\n definition.name,\n context.customNames,\n new Set(context.extensionProvenance.keys()),\n );\n const summary = toSchemaTypeSummary(definition);\n if (source === \"extension\") {\n extension.push(summary);\n } else if (source === \"custom\") {\n custom.push(summary);\n } else {\n builtin.push(summary);\n }\n }\n const statusSummaries = buildSchemaStatusSummaries(context.schema);\n const fieldSummaries = resolveRuntimeFieldRegistry(\n context.schema,\n ).definitions.map(toSchemaFieldSummary);\n return {\n action: \"list\",\n builtin,\n custom,\n extension,\n counts: {\n builtin: builtin.length,\n custom: custom.length,\n extension: extension.length,\n total: builtin.length + custom.length + extension.length,\n },\n statuses: {\n builtin: statusSummaries.builtin,\n custom: statusSummaries.custom,\n counts: {\n builtin: statusSummaries.builtin.length,\n custom: statusSummaries.custom.length,\n total: statusSummaries.builtin.length + statusSummaries.custom.length,\n },\n },\n fields: {\n custom: fieldSummaries,\n counts: {\n total: fieldSummaries.length,\n },\n },\n file: {\n path: context.typesPath,\n },\n generated_at: nowIso(),\n };\n}\n\n/** Implements run schema show for the public runtime surface of this module. */\nexport async function runSchemaShow(\n name: string | undefined,\n global: GlobalOptions,\n): Promise<SchemaShowResult> {\n const typeName = (name ?? \"\").trim();\n if (typeName.length === 0) {\n throw new PmCliError(\"Type name must not be empty.\", EXIT_CODE.USAGE);\n }\n const context = await loadSchemaInspectionContext(global);\n const match = Object.values(context.byType).find(\n (definition) =>\n definition.name.toLowerCase() === typeName.toLowerCase() ||\n definition.aliases.some(\n (alias) => alias.toLowerCase() === typeName.toLowerCase(),\n ),\n );\n if (!match) {\n throw new PmCliError(\n `Unknown item type \"${typeName}\". Run pm schema list to inspect registered types, or pm schema add-type \"${escapeForDoubleQuotes(typeName)}\" to register it.`,\n EXIT_CODE.NOT_FOUND,\n { code: \"unknown_item_type\" },\n );\n }\n return {\n action: \"show\",\n type: toSchemaTypeDefinition(\n match,\n classifyTypeSource(\n match.name,\n context.customNames,\n new Set(context.extensionProvenance.keys()),\n ),\n context.extensionProvenance.get(match.name.toLowerCase()),\n ),\n file: {\n path: context.typesPath,\n },\n generated_at: nowIso(),\n };\n}\n\n/** Implements run schema show status for the public runtime surface of this module. */\nexport async function runSchemaShowStatus(\n id: string | undefined,\n global: GlobalOptions,\n): Promise<SchemaShowStatusResult> {\n const statusToken = normalizeStatusToken(id);\n if (statusToken.length === 0) {\n throw new PmCliError(\"Status id must not be empty.\", EXIT_CODE.USAGE);\n }\n const context = await loadSchemaInspectionContext(global);\n const statusRegistry = resolveRuntimeStatusRegistry(context.schema);\n const resolvedId = statusRegistry.alias_to_id.get(statusToken) ?? statusToken;\n const match = statusRegistry.by_id.get(resolvedId);\n if (!match) {\n throw new PmCliError(\n `Unknown status \"${id}\". Run pm schema list to inspect registered statuses, or pm schema add-status \"${escapeForDoubleQuotes(\n id ?? \"\",\n )}\" to register it.`,\n EXIT_CODE.NOT_FOUND,\n { code: \"unknown_status\" },\n );\n }\n return {\n action: \"show-status\",\n status: toSchemaStatusSummary(match),\n file: {\n path: context.statusesPath,\n },\n generated_at: nowIso(),\n };\n}\n\n/** Implements run schema add field for the public runtime surface of this module. */\nexport async function runSchemaAddField(\n key: string | undefined,\n options: SchemaAddFieldCommandOptions,\n global: GlobalOptions,\n): Promise<SchemaAddFieldResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n await ensureInitialized(pmRoot);\n\n let normalized;\n try {\n normalized = normalizeAddFieldInput({\n key,\n type: options.type,\n commands: options.commands,\n description: options.description,\n cliFlag: options.cliFlag,\n aliases: options.alias,\n required: options.required,\n requiredOnCreate: options.requiredOnCreate,\n allowUnset: options.allowUnset,\n requiredTypes: options.requiredTypes,\n });\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.USAGE,\n );\n }\n\n const settings = await readSettings(pmRoot);\n const schema = normalizeRuntimeSchemaSettings(settings.schema);\n const fieldsPath = fieldsPathFor(pmRoot, schema);\n\n const warnings: string[] = [];\n const author = toAuthor(options.author, settings.author_default);\n const governance = resolveGovernanceKnobs(settings);\n\n const releaseLock = await acquireLock(\n pmRoot,\n SCHEMA_FIELDS_LOCK_ID,\n settings.locks.ttl_seconds,\n author,\n Boolean(options.force),\n governance.force_required_for_stale_lock,\n settings.locks.wait_ms,\n );\n let upsert;\n try {\n const previousRaw = await readFileIfExists(fieldsPath);\n let parsed;\n try {\n parsed = parseFieldsFile(previousRaw);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n upsert = upsertField(parsed, normalized);\n await writeFileAtomic(fieldsPath, serializeFieldsFile(upsert.file));\n warnings.push(\n ...(await runActiveOnWriteHooks({\n path: fieldsPath,\n scope: \"project\",\n op: \"schema:add-field\",\n })),\n );\n } finally {\n await releaseLock();\n }\n\n return {\n action: \"add-field\",\n registered: true,\n replaced: upsert.replaced,\n field: upsert.definition,\n file: {\n path: fieldsPath,\n fields: upsert.file.fields.length,\n },\n warnings: finalizeWarnings(warnings),\n generated_at: nowIso(),\n };\n}\n\n/** Counts items carrying a non-empty value for the custom field's metadata key. Advisory only (non-blocking) so remove-field can surface how many items would lose a managed column. Reuses the already-loaded settings (no disk re-read). */\nasync function countItemsUsingField(\n pmRoot: string,\n settings: PmSettings,\n schema: ReturnType<typeof normalizeRuntimeSchemaSettings>,\n metadataKey: string,\n): Promise<number> {\n const registry = resolveItemTypeRegistry(\n settings,\n getActiveExtensionRegistrations(),\n );\n const items = await listAllItemMetadataLight(\n pmRoot,\n settings.item_format,\n registry.type_to_folder,\n [],\n schema,\n );\n return items.filter((item) => {\n const value = (item as unknown as Record<string, unknown>)[metadataKey];\n if (value === undefined || value === null) {\n return false;\n }\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n if (typeof value === \"string\") {\n return value.trim().length > 0;\n }\n return true;\n }).length;\n}\n\n/** Implements run schema remove field for the public runtime surface of this module. */\nexport async function runSchemaRemoveField(\n key: string | undefined,\n options: SchemaRemoveFieldCommandOptions,\n global: GlobalOptions,\n): Promise<SchemaRemoveFieldResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n await ensureInitialized(pmRoot);\n\n const settings = await readSettings(pmRoot);\n const schema = normalizeRuntimeSchemaSettings(settings.schema);\n const fieldsPath = fieldsPathFor(pmRoot, schema);\n\n const warnings: string[] = [];\n const author = toAuthor(options.author, settings.author_default);\n const governance = resolveGovernanceKnobs(settings);\n\n const releaseLock = await acquireLock(\n pmRoot,\n SCHEMA_FIELDS_LOCK_ID,\n settings.locks.ttl_seconds,\n author,\n Boolean(options.force),\n governance.force_required_for_stale_lock,\n settings.locks.wait_ms,\n );\n let removal;\n try {\n const previousRaw = await readFileIfExists(fieldsPath);\n let parsed;\n try {\n parsed = parseFieldsFile(previousRaw);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n try {\n removal = removeField(parsed, key);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.USAGE,\n );\n }\n if (removal.removed) {\n const removedKey = normalizeFieldKey(removal.definition?.key ?? key);\n const metadataKey = normalizeFieldKey(\n removal.definition?.metadata_key ??\n removal.definition?.front_matter_key ??\n removedKey,\n );\n if (metadataKey.length > 0) {\n const usingField = await countItemsUsingField(\n pmRoot,\n settings,\n schema,\n metadataKey,\n );\n if (usingField > 0) {\n warnings.push(`items_using_field:${usingField}`);\n }\n }\n await writeFileAtomic(fieldsPath, serializeFieldsFile(removal.file));\n warnings.push(\n ...(await runActiveOnWriteHooks({\n path: fieldsPath,\n scope: \"project\",\n op: \"schema:remove-field\",\n })),\n );\n }\n } finally {\n await releaseLock();\n }\n\n return {\n action: \"remove-field\",\n removed: removal.removed,\n ...(removal.definition ? { field: removal.definition } : {}),\n file: {\n path: fieldsPath,\n fields: removal.file.fields.length,\n },\n warnings: finalizeWarnings(warnings),\n generated_at: nowIso(),\n };\n}\n\n/** Implements run schema list fields for the public runtime surface of this module. */\nexport async function runSchemaListFields(\n global: GlobalOptions,\n): Promise<SchemaListFieldsResult> {\n const context = await loadSchemaInspectionContext(global);\n const fields = resolveRuntimeFieldRegistry(context.schema).definitions.map(\n toSchemaFieldSummary,\n );\n return {\n action: \"list-fields\",\n fields,\n counts: {\n total: fields.length,\n },\n file: {\n path: fieldsPathFor(context.pmRoot, context.schema),\n },\n generated_at: nowIso(),\n };\n}\n\n/** Implements run schema show field for the public runtime surface of this module. */\nexport async function runSchemaShowField(\n key: string | undefined,\n global: GlobalOptions,\n): Promise<SchemaShowFieldResult> {\n const fieldKey = normalizeFieldKey(key);\n if (fieldKey.length === 0) {\n throw new PmCliError(\"Field key must not be empty.\", EXIT_CODE.USAGE);\n }\n const context = await loadSchemaInspectionContext(global);\n const match = resolveRuntimeFieldRegistry(context.schema).by_key.get(\n fieldKey,\n );\n if (!match) {\n throw new PmCliError(\n `Unknown custom field \"${key}\". Run pm schema list-fields to inspect registered fields, or pm schema add-field \"${escapeForDoubleQuotes(\n key ?? \"\",\n )}\" to register it.`,\n EXIT_CODE.NOT_FOUND,\n { code: \"unknown_field\" },\n );\n }\n return {\n action: \"show-field\",\n field: toSchemaFieldSummary(match),\n file: {\n path: fieldsPathFor(context.pmRoot, context.schema),\n },\n generated_at: nowIso(),\n };\n}\n\n/** Implements run schema apply preset for the public runtime surface of this module. */\nexport async function runSchemaApplyPreset(\n preset: string | undefined,\n options: SchemaApplyPresetCommandOptions,\n global: GlobalOptions,\n): Promise<SchemaApplyPresetResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n await ensureInitialized(pmRoot);\n\n let presetName: TypePresetName;\n try {\n const normalized = normalizeTypePresetName(preset);\n if (normalized === undefined) {\n throw new Error(\n `Type preset name is required. Allowed: ${TYPE_PRESET_NAMES.join(\", \")}.`,\n );\n }\n presetName = normalized;\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.USAGE,\n );\n }\n\n const settings = await readSettings(pmRoot);\n const schema = normalizeRuntimeSchemaSettings(settings.schema);\n const typesPath = typesPathFor(pmRoot, schema);\n\n const warnings: string[] = [];\n const author = toAuthor(options.author, settings.author_default);\n const governance = resolveGovernanceKnobs(settings);\n\n const registered: string[] = [];\n const replaced: string[] = [];\n let definitionsCount: number;\n const releaseLock = await acquireLock(\n pmRoot,\n SCHEMA_TYPES_LOCK_ID,\n settings.locks.ttl_seconds,\n author,\n Boolean(options.force),\n governance.force_required_for_stale_lock,\n settings.locks.wait_ms,\n );\n try {\n const previousRaw = await readFileIfExists(typesPath);\n let parsed;\n try {\n parsed = parseItemTypesFile(previousRaw);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n let nextFile = parsed;\n for (const normalized of resolveTypePresetDefinitions(presetName)) {\n const upsert = upsertItemType(nextFile, normalized);\n nextFile = upsert.file;\n (upsert.replaced ? replaced : registered).push(upsert.definition.name);\n }\n definitionsCount = nextFile.definitions.length;\n await writeFileAtomic(typesPath, serializeItemTypesFile(nextFile));\n await ensureTypeFolderScaffold(\n pmRoot,\n resolveTypePresetDefinitions(presetName),\n warnings,\n \"schema:apply-preset-folder\",\n );\n warnings.push(\n ...(await runActiveOnWriteHooks({\n path: typesPath,\n scope: \"project\",\n op: \"schema:apply-preset\",\n })),\n );\n } finally {\n await releaseLock();\n }\n\n return {\n action: \"apply-preset\",\n preset: presetName,\n registered,\n replaced,\n file: {\n path: typesPath,\n definitions: definitionsCount,\n },\n warnings: finalizeWarnings(warnings),\n generated_at: nowIso(),\n };\n}\n\n/** Validates the positive inference threshold while preserving the command default. */\nfunction resolveSchemaInferenceMinCount(value: number | undefined): number {\n if (value === undefined) {\n return 10;\n }\n if (!Number.isInteger(value) || value < 1) {\n throw new PmCliError(\n \"--min-count must be a positive integer (>= 1).\",\n EXIT_CODE.USAGE,\n );\n }\n return value;\n}\n\n/** Implements run schema infer types for the public runtime surface of this module. */\nexport async function runSchemaInferTypes(\n options: SchemaAddTypeInferCommandOptions,\n global: GlobalOptions,\n): Promise<SchemaAddTypeInferResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n await ensureInitialized(pmRoot);\n\n const settings = await readSettings(pmRoot);\n const schema = normalizeRuntimeSchemaSettings(settings.schema);\n const typesPath = typesPathFor(pmRoot, schema);\n const minCount = resolveSchemaInferenceMinCount(options.minCount);\n\n const registry = resolveItemTypeRegistry(\n settings,\n getActiveExtensionRegistrations(),\n );\n const items = await listAllItemMetadataLight(\n pmRoot,\n settings.item_format,\n registry.type_to_folder,\n [],\n schema,\n );\n const titles = items.map((item) =>\n typeof item.title === \"string\" ? item.title : \"\",\n );\n const candidates = inferTypesFromTitles(titles, { minCount });\n\n const warnings: string[] = [];\n const registered: string[] = [];\n const replaced: string[] = [];\n const skipped: Array<{ name: string; reason: string }> = [];\n let definitionsCount: number;\n\n // Dry-run preview by default: only --apply mutates schema/types.json.\n if (!options.apply) {\n let parsed;\n try {\n parsed = parseItemTypesFile(await readFileIfExists(typesPath));\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n definitionsCount = parsed.definitions.length;\n return {\n action: \"infer-types\",\n applied: false,\n min_count: minCount,\n candidates,\n registered,\n replaced,\n skipped,\n file: {\n path: typesPath,\n definitions: definitionsCount,\n },\n warnings,\n generated_at: nowIso(),\n };\n }\n\n const author = toAuthor(options.author, settings.author_default);\n const governance = resolveGovernanceKnobs(settings);\n const releaseLock = await acquireLock(\n pmRoot,\n SCHEMA_TYPES_LOCK_ID,\n settings.locks.ttl_seconds,\n author,\n Boolean(options.force),\n governance.force_required_for_stale_lock,\n settings.locks.wait_ms,\n );\n try {\n const previousRaw = await readFileIfExists(typesPath);\n let parsed;\n try {\n parsed = parseItemTypesFile(previousRaw);\n } catch (error) {\n throw new PmCliError(\n error instanceof Error ? error.message : String(error),\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n let nextFile = parsed;\n for (const candidate of candidates) {\n if (candidate.shadows_builtin) {\n skipped.push({ name: candidate.name, reason: \"shadows_builtin\" });\n continue;\n }\n let normalized;\n try {\n normalized = normalizeAddTypeInput({ name: candidate.name });\n } catch {\n // A title prefix that does not normalize to a valid type token (rare,\n // given the inference pattern) is skipped rather than aborting the batch.\n skipped.push({ name: candidate.name, reason: \"invalid_type_token\" });\n continue;\n }\n const upsert = upsertItemType(nextFile, normalized);\n nextFile = upsert.file;\n (upsert.replaced ? replaced : registered).push(upsert.definition.name);\n }\n definitionsCount = nextFile.definitions.length;\n await writeFileAtomic(typesPath, serializeItemTypesFile(nextFile));\n await ensureTypeFolderScaffold(\n pmRoot,\n nextFile.definitions.filter(\n (definition) =>\n registered.includes(definition.name) ||\n replaced.includes(definition.name),\n ),\n warnings,\n \"schema:infer-types-folder\",\n );\n warnings.push(\n ...(await runActiveOnWriteHooks({\n path: typesPath,\n scope: \"project\",\n op: \"schema:infer-types\",\n })),\n );\n } finally {\n await releaseLock();\n }\n\n return {\n action: \"infer-types\",\n applied: true,\n min_count: minCount,\n candidates,\n registered,\n replaced,\n skipped,\n file: {\n path: typesPath,\n definitions: definitionsCount,\n },\n warnings: finalizeWarnings(warnings),\n generated_at: nowIso(),\n };\n}\n\n/** Implements format schema add type human for the public runtime surface of this module. */\nexport function formatSchemaAddTypeHuman(result: SchemaAddTypeResult): string {\n const verb = result.replaced ? \"Updated\" : \"Registered\";\n const aliasSuffix =\n result.type.aliases && result.type.aliases.length > 0\n ? ` (aliases: ${result.type.aliases.join(\", \")})`\n : \"\";\n return `${verb} custom item type \"${result.type.name}\"${aliasSuffix} in ${result.file.path}. Run: pm create \"${escapeForDoubleQuotes(result.type.name)}\" \"<title>\"`;\n}\n\n/** Implements format schema remove type human for the public runtime surface of this module. */\nexport function formatSchemaRemoveTypeHuman(\n result: SchemaRemoveTypeResult,\n): string {\n if (!result.removed) {\n return `No custom item type matched; nothing removed from ${result.file.path}.`;\n }\n const name = result.type?.name ?? \"(unknown)\";\n return `Removed custom item type \"${name}\" from ${result.file.path}.`;\n}\n\n/** Implements format schema add status human for the public runtime surface of this module. */\nexport function formatSchemaAddStatusHuman(\n result: SchemaAddStatusResult,\n): string {\n const verb = result.replaced ? \"Updated\" : \"Registered\";\n const roleSuffix =\n result.status.roles && result.status.roles.length > 0\n ? ` (roles: ${result.status.roles.join(\", \")})`\n : \"\";\n const aliasSuffix =\n result.status.aliases && result.status.aliases.length > 0\n ? ` (aliases: ${result.status.aliases.join(\", \")})`\n : \"\";\n return `${verb} status \"${result.status.id}\"${roleSuffix}${aliasSuffix} in ${result.file.path}.`;\n}\n\n/** Implements format schema remove status human for the public runtime surface of this module. */\nexport function formatSchemaRemoveStatusHuman(\n result: SchemaRemoveStatusResult,\n): string {\n if (!result.removed) {\n return `No custom status matched; nothing removed from ${result.file.path}.`;\n }\n const id = result.status?.id ?? \"(unknown)\";\n return `Removed custom status \"${id}\" from ${result.file.path}.`;\n}\n\n/** Implements format schema list human for the public runtime surface of this module. */\nexport function formatSchemaListHuman(result: SchemaListResult): string {\n const lines = [\n `Schema types: ${result.counts.total} total (${result.counts.builtin} builtin, ${result.counts.custom} custom, ${result.counts.extension} extension)`,\n ];\n for (const [label, entries] of [\n [\"builtin\", result.builtin],\n [\"custom\", result.custom],\n [\"extension\", result.extension],\n ] as const) {\n if (entries.length === 0) {\n continue;\n }\n lines.push(`${label}: ${entries.map((entry) => entry.name).join(\", \")}`);\n }\n lines.push(\n `statuses: ${result.statuses.counts.total} total (${result.statuses.counts.builtin} builtin, ${result.statuses.counts.custom} custom)`,\n );\n for (const [label, entries] of [\n [\"builtin statuses\", result.statuses.builtin],\n [\"custom statuses\", result.statuses.custom],\n ] as const) {\n if (entries.length === 0) {\n continue;\n }\n lines.push(`${label}: ${entries.map((entry) => entry.id).join(\", \")}`);\n }\n lines.push(`custom fields: ${result.fields.counts.total} total`);\n if (result.fields.custom.length > 0) {\n lines.push(\n `fields: ${result.fields.custom.map((field) => `${field.key} (${field.type}, ${field.cli_flag})`).join(\", \")}`,\n );\n }\n lines.push(`Inspect one: pm schema show <Type>`);\n lines.push(`Inspect one status: pm schema show-status <status>`);\n lines.push(`Inspect one field: pm schema show-field <key>`);\n return lines.join(\"\\n\");\n}\n\n/** Implements format schema show human for the public runtime surface of this module. */\nexport function formatSchemaShowHuman(result: SchemaShowResult): string {\n const parts = [\n `type: ${result.type.name}`,\n `source: ${result.type.source}`,\n `folder: ${result.type.folder}`,\n ];\n if (result.type.default_status) {\n parts.push(`default_status: ${result.type.default_status}`);\n }\n if (result.type.aliases.length > 0) {\n parts.push(`aliases: ${result.type.aliases.join(\", \")}`);\n }\n if (result.type.description) {\n parts.push(`description: ${result.type.description}`);\n }\n if (result.type.options.length > 0) {\n parts.push(\n `options: ${result.type.options.map((option) => option.key).join(\", \")}`,\n );\n }\n return parts.join(\"\\n\");\n}\n\n/** Implements format schema show status human for the public runtime surface of this module. */\nexport function formatSchemaShowStatusHuman(\n result: SchemaShowStatusResult,\n): string {\n const parts = [\n `status: ${result.status.id}`,\n `source: ${result.status.source}`,\n ];\n if (result.status.roles.length > 0) {\n parts.push(`roles: ${result.status.roles.join(\", \")}`);\n }\n if (result.status.aliases.length > 0) {\n parts.push(`aliases: ${result.status.aliases.join(\", \")}`);\n }\n if (result.status.description) {\n parts.push(`description: ${result.status.description}`);\n }\n if (typeof result.status.order === \"number\") {\n parts.push(`order: ${result.status.order}`);\n }\n return parts.join(\"\\n\");\n}\n\nfunction formatFieldSummaryLine(field: SchemaFieldSummary): string {\n const flags: string[] = [];\n if (field.required) {\n flags.push(\"required\");\n }\n if (field.required_on_create) {\n flags.push(\"required_on_create\");\n }\n if (!field.allow_unset) {\n flags.push(\"no_unset\");\n }\n const flagSuffix = flags.length > 0 ? ` [${flags.join(\", \")}]` : \"\";\n return `${field.key} (${field.type}) ${field.cli_flag} commands=${field.commands.join(\"/\")}${flagSuffix}`;\n}\n\n/** Implements format schema add field human for the public runtime surface of this module. */\nexport function formatSchemaAddFieldHuman(\n result: SchemaAddFieldResult,\n): string {\n const verb = result.replaced ? \"Updated\" : \"Registered\";\n return `${verb} custom field \"${result.field.key}\" in ${result.file.path}. Use it: pm create \"<title>\" --${(result.field.cli_flag ?? result.field.key).replaceAll(\"_\", \"-\")} <value>`;\n}\n\n/** Implements format schema remove field human for the public runtime surface of this module. */\nexport function formatSchemaRemoveFieldHuman(\n result: SchemaRemoveFieldResult,\n): string {\n if (!result.removed) {\n return `No custom field matched; nothing removed from ${result.file.path}.`;\n }\n const key = result.field?.key ?? \"(unknown)\";\n return `Removed custom field \"${key}\" from ${result.file.path}.`;\n}\n\n/** Implements format schema list fields human for the public runtime surface of this module. */\nexport function formatSchemaListFieldsHuman(\n result: SchemaListFieldsResult,\n): string {\n const lines = [`Custom fields: ${result.counts.total} total`];\n for (const field of result.fields) {\n lines.push(` ${formatFieldSummaryLine(field)}`);\n }\n lines.push(`Inspect one: pm schema show-field <key>`);\n return lines.join(\"\\n\");\n}\n\n/** Implements format schema show field human for the public runtime surface of this module. */\nexport function formatSchemaShowFieldHuman(\n result: SchemaShowFieldResult,\n): string {\n const field = result.field;\n const parts = [\n `field: ${field.key}`,\n `type: ${field.type}`,\n `cli_flag: ${field.cli_flag}`,\n `commands: ${field.commands.join(\", \")}`,\n ];\n if (field.cli_aliases.length > 0) {\n parts.push(`cli_aliases: ${field.cli_aliases.join(\", \")}`);\n }\n if (field.description) {\n parts.push(`description: ${field.description}`);\n }\n if (field.required) {\n parts.push(`required: true`);\n }\n if (field.required_on_create) {\n parts.push(`required_on_create: true`);\n }\n if (!field.allow_unset) {\n parts.push(`allow_unset: false`);\n }\n if (field.required_types.length > 0) {\n parts.push(`required_types: ${field.required_types.join(\", \")}`);\n }\n return parts.join(\"\\n\");\n}\n\n/** Implements format schema apply preset human for the public runtime surface of this module. */\nexport function formatSchemaApplyPresetHuman(\n result: SchemaApplyPresetResult,\n): string {\n const registered =\n result.registered.length > 0\n ? `registered: ${result.registered.join(\", \")}`\n : \"\";\n const replaced =\n result.replaced.length > 0 ? `updated: ${result.replaced.join(\", \")}` : \"\";\n const detail = [registered, replaced]\n .filter((part) => part.length > 0)\n .join(\"; \");\n return `Applied \"${result.preset}\" type preset to ${result.file.path}${detail.length > 0 ? ` (${detail})` : \"\"}.`;\n}\n\n/** Implements format schema infer types human for the public runtime surface of this module. */\nexport function formatSchemaInferTypesHuman(\n result: SchemaAddTypeInferResult,\n): string {\n if (result.candidates.length === 0) {\n return `No title-prefix conventions found with at least ${result.min_count} items. Lower the threshold with --min-count <n>.`;\n }\n const lines = result.applied\n ? [\n `Inferred and registered custom types from title prefixes (min-count ${result.min_count}):`,\n ]\n : [\n `Inferred custom type candidates from title prefixes (min-count ${result.min_count}, dry-run):`,\n ];\n for (const candidate of result.candidates) {\n const note = candidate.shadows_builtin\n ? \" [shadows built-in, skipped]\"\n : \"\";\n lines.push(\n ` ${candidate.name} <- \"${candidate.prefix}\" (${candidate.count} items)${note}`,\n );\n }\n if (!result.applied) {\n lines.push(`Re-run with --apply to register the non-shadowing candidates.`);\n } else {\n if (result.registered.length > 0) {\n lines.push(`registered: ${result.registered.join(\", \")}`);\n }\n if (result.replaced.length > 0) {\n lines.push(`updated: ${result.replaced.join(\", \")}`);\n }\n }\n return lines.join(\"\\n\");\n}\n\n/* c8 ignore stop */\n\n/** Re-export so register-mutation can surface the hint in usage examples without importing the core module directly. */\nexport { buildInvalidTypeHint };\n\n/** Public contract for test only schema command, shared by SDK and presentation-layer consumers. */\nexport const _testOnlySchemaCommand = {\n toAuthor,\n workflowSlotsReferencing,\n};\n", "/**\n * @module core/schema/type-inference\n *\n * Resolves configurable schema, fields, statuses, and workflows for Type Inference.\n */\nimport { matchBuiltinTypeName } from \"./item-types-file.js\";\n\n/**\n * Pure logic for `pm schema add-type --infer`: scan existing item titles for\n * stable `PREFIX-`/`PREFIX:` conventions and propose them as custom item types.\n * The CLI command file (schema.ts) owns IO and the optional registration; this\n * module only derives candidates from a list of titles so it is fully testable\n * and coverage-gated to 100%.\n *\n * Conventions recognized (case-insensitive, first run wins per title):\n * - `INFRA- ...` / `SECURITY-...` (hyphen-delimited prefix)\n * - `BUG: ...` / `SPIKE: ...` (colon-delimited prefix)\n * The prefix token must be a letter-led identifier of letters, digits, and\n * internal hyphens/underscores so it maps cleanly to a single PascalCase type\n * name. Purely numeric or sequence-style prefixes (e.g. `S001-`, `E12-`) are\n * intentionally skipped: they index items, they are not type boundaries.\n */\n\nconst PREFIX_PATTERN = /^([A-Za-z][A-Za-z0-9_-]*?)\\s*[-:]\\s+\\S/;\n\n/** Documents the inferred type candidate payload exchanged by command, SDK, and package integrations. */\nexport interface InferredTypeCandidate {\n /** Suggested PascalCase type name derived from the prefix. */\n name: string;\n /** The normalized prefix token (lowercase) the items share. */\n prefix: string;\n /** How many scanned titles carry this prefix. */\n count: number;\n /** A few example titles (capped) for human/agent review. */\n examples: string[];\n /** True when `name` already resolves to a reserved built-in type. */\n shadows_builtin: boolean;\n}\n\n/** Documents the infer types options payload exchanged by command, SDK, and package integrations. */\nexport interface InferTypesOptions {\n /** Minimum number of titles that must share a prefix to surface it (default 10). */\n minCount?: number;\n /** Maximum example titles retained per candidate (default 3). */\n maxExamples?: number;\n}\n\n/** Extracts the leading prefix token from a title, or undefined when the title has no stable letter-led `PREFIX-`/`PREFIX:` convention. */\nexport function extractTitlePrefix(title: string): string | undefined {\n const match = PREFIX_PATTERN.exec(title.trim());\n if (!match) {\n return undefined;\n }\n const token = match[1];\n // Reject single-character prefixes (e.g. \"S-\", \"E-\"): they are sequence/index\n // markers far more often than genuine type boundaries.\n if (token.length < 2) {\n return undefined;\n }\n // Reject sequence/index-style prefixes — a single leading letter followed by\n // only digits (e.g. \"S001-\", \"E12-\", \"V1-\"). These index items rather than\n // mark a type boundary, matching the convention documented above.\n if (/^[A-Za-z]\\d+$/.test(token)) {\n return undefined;\n }\n return token.toLowerCase();\n}\n\n/** Converts a normalized prefix token into a PascalCase type name. Internal hyphen/underscore runs become word boundaries; each word is capitalized. */\nexport function prefixToTypeName(prefix: string): string {\n return prefix\n .split(/[-_]+/)\n .filter((segment) => segment.length > 0)\n .map(\n (segment) =>\n `${segment.slice(0, 1).toUpperCase()}${segment.slice(1).toLowerCase()}`,\n )\n .join(\"\");\n}\n\n/** Scans titles for shared prefix conventions and returns candidate custom types, sorted by descending frequency then name. Only prefixes carried by at least `minCount` titles are returned. */\nexport function inferTypesFromTitles(\n titles: string[],\n options: InferTypesOptions = {},\n): InferredTypeCandidate[] {\n const minCount =\n typeof options.minCount === \"number\" && options.minCount > 0\n ? Math.trunc(options.minCount)\n : 10;\n const maxExamples =\n typeof options.maxExamples === \"number\" && options.maxExamples > 0\n ? Math.trunc(options.maxExamples)\n : 3;\n const byPrefix = new Map<string, { count: number; examples: string[] }>();\n for (const rawTitle of titles) {\n const title = typeof rawTitle === \"string\" ? rawTitle.trim() : \"\";\n if (title.length === 0) {\n continue;\n }\n const prefix = extractTitlePrefix(title);\n if (prefix === undefined) {\n continue;\n }\n const bucket = byPrefix.get(prefix) ?? { count: 0, examples: [] };\n bucket.count += 1;\n if (bucket.examples.length < maxExamples) {\n bucket.examples.push(title);\n }\n byPrefix.set(prefix, bucket);\n }\n const candidates: InferredTypeCandidate[] = [];\n for (const [prefix, bucket] of byPrefix.entries()) {\n if (bucket.count < minCount) {\n continue;\n }\n const name = prefixToTypeName(prefix);\n candidates.push({\n name,\n prefix,\n count: bucket.count,\n examples: bucket.examples,\n shadows_builtin: matchBuiltinTypeName(name) !== undefined,\n });\n }\n candidates.sort(\n (left, right) =>\n right.count - left.count || left.name.localeCompare(right.name),\n );\n return candidates;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["readFile", "writeFile", "path", "path", "readFile", "writeFile", "global", "path", "global", "path"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../../../sdk/error-runtime.ts", "../../../../../../../../sdk/cli-bootstrap.ts", "../../../../../../../../sdk/invocation-author.ts", "../../../../../../../../sdk/cli-program.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @module sdk/error-runtime\n *\n * Provides presentation-independent normalization for values thrown through CLI and SDK runtimes.\n */\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\n\n/** Returns a stable message for errors and unknown thrown values. */\nexport function describeUnknownError(error: unknown): string {\n if (error instanceof PmCliError) {\n return error.message;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return \"Unknown failure\";\n}\n\n/** Reads a finite numeric exit code from an arbitrary thrown value. */\nexport function readThrownExitCode(error: unknown): number | undefined {\n if (typeof error !== \"object\" || error === null || !(\"exitCode\" in error)) {\n return undefined;\n }\n const exitCode = (error as { exitCode?: unknown }).exitCode;\n return typeof exitCode === \"number\" && Number.isFinite(exitCode)\n ? exitCode\n : undefined;\n}\n\n/** Normalizes thrown exit codes to a positive integer failure status. */\nexport function normalizeThrownExitCode(exitCode: number): number {\n const normalized = Math.trunc(exitCode);\n return normalized > EXIT_CODE.SUCCESS\n ? normalized\n : EXIT_CODE.GENERIC_FAILURE;\n}\n\n/** Identifies errors emitted by Commander without importing its private classes. */\nexport function isCommanderError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof (error as { code?: unknown }).code === \"string\" &&\n (error as { code: string }).code.startsWith(\"commander.\")\n );\n}\n\n/** Converts non-Error thrown values into errors suitable for Sentry capture. */\nexport function wrapThrownErrorForSentry(\n error: unknown,\n message: string,\n): Error {\n if (error instanceof Error) {\n return error;\n }\n const wrapped = new Error(message) as Error & { exitCode?: number };\n const exitCode = readThrownExitCode(error);\n /* c8 ignore next */\n if (exitCode !== undefined) {\n wrapped.exitCode = normalizeThrownExitCode(exitCode);\n }\n return wrapped;\n}\n", "/**\n * @module sdk/cli-bootstrap\n *\n * Provides public bootstrap argument normalization for embedded CLI hosts.\n */\nimport {\n EXECUTABLE_COMMAND_ALIASES,\n resolveSubcommandFlagContractsForCommand,\n type CliFlagContract,\n} from \"./cli-contracts.js\";\nexport { EXECUTABLE_COMMAND_ALIASES };\nimport { levenshteinDistanceWithinLimit } from \"../core/shared/levenshtein.js\";\n\nconst GLOBAL_VALUE_CONSUMING_FLAGS = new Set<string>([\n \"--pm-path\",\n \"--path\",\n \"--author\",\n]);\n\n/** Whether a global value-consuming flag uses its inline `--flag=value` form. */\nconst isInlineGlobalValueToken = (token: string): boolean => {\n const equalsIndex = token.indexOf(\"=\");\n return (\n equalsIndex > 0 &&\n GLOBAL_VALUE_CONSUMING_FLAGS.has(token.slice(0, equalsIndex))\n );\n};\n\n/** Whether optional bootstrap author syntax consumes the following token. */\nconst consumesBootstrapAuthorValue = (next: string | undefined): boolean => {\n return typeof next === \"string\" && !next.startsWith(\"-\");\n};\n\nfunction parseBootstrapPathToken(\n token: string,\n next: string | undefined,\n): { consumed: number; pathValue?: string; preferred: boolean } | null {\n if (token === \"--path\" || token === \"--pm-path\") {\n if (typeof next === \"string\" && next.length > 0) {\n return {\n consumed: 2,\n pathValue: next,\n preferred: token === \"--pm-path\",\n };\n }\n return {\n consumed: 1,\n preferred: token === \"--pm-path\",\n };\n }\n\n const inlinePrefix = token.startsWith(\"--path=\")\n ? \"--path=\"\n : token.startsWith(\"--pm-path=\")\n ? \"--pm-path=\"\n : undefined;\n if (!inlinePrefix) {\n return null;\n }\n\n const value = token.slice(inlinePrefix.length);\n if (value.length > 0) {\n return {\n consumed: 1,\n pathValue: value,\n preferred: inlinePrefix === \"--pm-path=\",\n };\n }\n return {\n consumed: 1,\n preferred: inlinePrefix === \"--pm-path=\",\n };\n}\n\n/** Documents the bootstrap global options payload exchanged by command, SDK, and package integrations. */\nexport interface BootstrapGlobalOptions {\n /** Filesystem path used for path resolution. */\n path?: string;\n /** Value that configures or reports no extensions for this contract. */\n noExtensions: boolean;\n /** Value that configures or reports no pager for this contract. */\n noPager: boolean;\n /** Value that configures or reports json for this contract. */\n json: boolean;\n /** Value that configures or reports quiet for this contract. */\n quiet: boolean;\n /** Whether compact JSON projection is requested. */\n lean: boolean;\n /** Invocation-wide mutation author override. */\n author?: string;\n /** Whether `--author` was present without its required value. */\n authorMissingValue?: true;\n}\n\nconst BOOTSTRAP_BOOLEAN_FLAGS = new Set([\n \"--no-extensions\",\n \"--no-pager\",\n \"--json\",\n \"--quiet\",\n \"--lean\",\n]);\n\n/** Implements parse bootstrap global options for the public runtime surface of this module. */\nexport function parseBootstrapGlobalOptions(\n argv: string[],\n): BootstrapGlobalOptions {\n let legacyPathValue: string | undefined;\n let pmPathValue: string | undefined;\n const booleanFlags = new Set<string>();\n let author: string | undefined;\n let index = 0;\n while (index < argv.length) {\n const token = argv[index];\n if (token === \"--\") {\n break;\n }\n if (BOOTSTRAP_BOOLEAN_FLAGS.has(token)) {\n booleanFlags.add(token);\n index += 1;\n continue;\n }\n const parsedPath = parseBootstrapPathToken(token, argv[index + 1]);\n if (parsedPath) {\n if (parsedPath.pathValue !== undefined) {\n if (parsedPath.preferred) {\n pmPathValue = parsedPath.pathValue;\n } else {\n legacyPathValue = parsedPath.pathValue;\n }\n }\n index += parsedPath.consumed;\n continue;\n }\n if (token === \"--author\") {\n if (consumesBootstrapAuthorValue(argv[index + 1])) {\n author = argv[index + 1];\n index += 2;\n } else {\n author = \"\";\n index += 1;\n }\n continue;\n }\n if (token.startsWith(\"--author=\")) {\n author = token.slice(\"--author=\".length);\n index += 1;\n continue;\n }\n index += 1;\n }\n return {\n path: pmPathValue ?? legacyPathValue,\n noExtensions: booleanFlags.has(\"--no-extensions\"),\n noPager: booleanFlags.has(\"--no-pager\"),\n json: booleanFlags.has(\"--json\"),\n quiet: booleanFlags.has(\"--quiet\"),\n lean: booleanFlags.has(\"--lean\"),\n ...(author === \"\"\n ? { authorMissingValue: true }\n : author !== undefined\n ? { author }\n : {}),\n };\n}\n\n/** Implements strip global bootstrap tokens for the public runtime surface of this module. */\nexport function stripGlobalBootstrapTokens(argv: string[]): string[] {\n const remaining: string[] = [];\n let index = 0;\n while (index < argv.length) {\n const token = argv[index];\n if (token === \"--\") {\n break;\n }\n if (\n token === \"--json\" ||\n token === \"--quiet\" ||\n token === \"--lean\" ||\n token === \"--no-extensions\" ||\n token === \"--no-pager\" ||\n token === \"--profile\" ||\n token === \"--id-only\" ||\n token === \"--full-changed-fields\" ||\n token === \"--explain\"\n ) {\n index += 1;\n continue;\n }\n if (token === \"--author\") {\n index += consumesBootstrapAuthorValue(argv[index + 1]) ? 2 : 1;\n continue;\n }\n if (GLOBAL_VALUE_CONSUMING_FLAGS.has(token)) {\n index += 2;\n continue;\n }\n if (isInlineGlobalValueToken(token)) {\n index += 1;\n continue;\n }\n remaining.push(token);\n index += 1;\n }\n return remaining;\n}\n\n/** Documents the bootstrap help request payload exchanged by command, SDK, and package integrations. */\nexport interface BootstrapHelpRequest {\n /** Value that configures or reports requested for this contract. */\n requested: boolean;\n /** Value that configures or reports command path tokens for this contract. */\n commandPathTokens: string[];\n}\n\n/** Implements parse bootstrap help request for the public runtime surface of this module. */\nexport function parseBootstrapHelpRequest(\n argv: string[],\n): BootstrapHelpRequest {\n const stripped = stripGlobalBootstrapTokens(argv);\n const first = stripped[0]?.trim().toLowerCase();\n if (first === \"help\") {\n const commandPathTokens: string[] = [];\n for (let index = 1; index < stripped.length; index += 1) {\n const token = stripped[index];\n if (token.startsWith(\"-\")) {\n break;\n }\n commandPathTokens.push(token.trim().toLowerCase());\n }\n return {\n requested: true,\n commandPathTokens,\n };\n }\n\n const helpFlagIndex = stripped.findIndex(\n (token) => token === \"--help\" || token === \"-h\",\n );\n if (helpFlagIndex < 0) {\n return {\n requested: false,\n commandPathTokens: [],\n };\n }\n\n const commandPathTokens: string[] = [];\n for (const token of stripped) {\n if (token.startsWith(\"-\")) {\n break;\n }\n commandPathTokens.push(token.trim().toLowerCase());\n }\n return {\n requested: true,\n commandPathTokens,\n };\n}\n\n/**\n * Index of the command token in argv — the first non-flag token, skipping the\n * value-consuming/global bootstrap flags. Returns undefined when there is none\n * (bare invocation, only global flags, or a leading `--`). Single source of truth\n * for command-position scanning shared by {@link parseBootstrapCommandName} and the\n * command-alias rewrite so their precedence rules can never drift apart.\n */\nfunction findCommandTokenIndex(argv: string[]): number | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === \"--\") {\n return undefined;\n }\n if (token === \"--author\") {\n index += consumesBootstrapAuthorValue(argv[index + 1]) ? 1 : 0;\n continue;\n }\n if (GLOBAL_VALUE_CONSUMING_FLAGS.has(token)) {\n index += 1;\n continue;\n }\n if (\n isInlineGlobalValueToken(token) ||\n token === \"--json\" ||\n token === \"--quiet\" ||\n token === \"--lean\" ||\n token === \"--no-extensions\" ||\n token === \"--no-pager\" ||\n token === \"--profile\" ||\n token === \"--id-only\" ||\n token === \"--explain\"\n ) {\n continue;\n }\n if (token.startsWith(\"-\")) {\n continue;\n }\n return index;\n }\n return undefined;\n}\n\n/** Implements parse bootstrap command name for the public runtime surface of this module. */\nexport function parseBootstrapCommandName(argv: string[]): string | undefined {\n const index = findCommandTokenIndex(argv);\n return index === undefined ? undefined : argv[index].trim().toLowerCase();\n}\n\nfunction shouldDisablePagerForInvocation(\n argv: string[],\n bootstrapGlobal: BootstrapGlobalOptions,\n): boolean {\n if (bootstrapGlobal.noPager) {\n return true;\n }\n if (process.stdout.isTTY === true) {\n return false;\n }\n const helpRequest = parseBootstrapHelpRequest(argv);\n return helpRequest.requested;\n}\n\n/** Implements apply bootstrap pager policy for the public runtime surface of this module. */\nexport function applyBootstrapPagerPolicy(argv: string[]): () => void {\n const pagerEnvironmentKeys = [\n \"PAGER\",\n \"MANPAGER\",\n \"GIT_PAGER\",\n \"LESS\",\n ] as const;\n const previousValues = pagerEnvironmentKeys.map((key) => process.env[key]);\n const restore = (): void => {\n for (const [index, key] of pagerEnvironmentKeys.entries()) {\n const value = previousValues[index];\n if (value === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n }\n };\n const bootstrapGlobal = parseBootstrapGlobalOptions(argv);\n if (!shouldDisablePagerForInvocation(argv, bootstrapGlobal)) {\n return restore;\n }\n process.env.PAGER = \"cat\";\n process.env.MANPAGER = \"cat\";\n process.env.GIT_PAGER = \"cat\";\n if (\n typeof process.env.LESS !== \"string\" ||\n process.env.LESS.trim().length === 0\n ) {\n process.env.LESS = \"FRX\";\n }\n return restore;\n}\n\ntype ExtensionSubcommandAction =\n | \"init\"\n | \"install\"\n | \"uninstall\"\n | \"explore\"\n | \"manage\"\n | \"doctor\"\n | \"adopt\"\n | \"adopt-all\"\n | \"activate\"\n | \"deactivate\";\n\nconst EXTENSION_ACTION_SYNTAX_TOKENS = new Set<ExtensionSubcommandAction>([\n \"install\",\n \"uninstall\",\n \"explore\",\n \"manage\",\n \"doctor\",\n \"adopt\",\n \"adopt-all\",\n \"activate\",\n \"deactivate\",\n]);\n\n/** Implements normalize legacy extension action syntax for the public runtime surface of this module. */\nexport function normalizeLegacyExtensionActionSyntax(argv: string[]): string[] {\n const extensionIndex = findCommandTokenIndex(argv);\n if (extensionIndex === undefined || argv[extensionIndex] !== \"extension\") {\n return [...argv];\n }\n const actionToken = argv[extensionIndex + 1];\n if (!actionToken || actionToken.startsWith(\"-\")) {\n return [...argv];\n }\n if (\n !EXTENSION_ACTION_SYNTAX_TOKENS.has(\n actionToken as ExtensionSubcommandAction,\n )\n ) {\n return [...argv];\n }\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n return [...argv];\n }\n const forcedActionFlag = `--${actionToken}`;\n if (argv.includes(forcedActionFlag)) {\n return [...argv];\n }\n return [\n ...argv.slice(0, extensionIndex + 1),\n forcedActionFlag,\n ...argv.slice(extensionIndex + 2),\n ];\n}\n\ntype BootstrapNormalizationReason =\n | \"legacy_extension_action\"\n | \"command_alias\"\n | \"flag_alias\"\n | \"flag_typo\"\n | \"bare_key_value\"\n | \"list_merge\";\ntype BootstrapNormalizationConfidence = \"high\" | \"medium\";\n\n/** Executable command aliases: a leading command token here is rewritten to its canonical command BEFORE commander parses, so the alias actually runs instead of merely being suggested. These are the highest-frequency aliases real agents type (telemetry: `pm show <id>` alone is the single most common unknown-command) and each target takes the same positional/flags as the alias (with `--comment`/ `--note`/`--learning` flag-aliased to `--add` on the target command). Keeping this in one place means the alias is consistent across registration, commander dispatch, telemetry, and error handling — all of which read the normalized argv. */\n/**\n * Rewrite a leading command-alias token (e.g. `show` -> `get`) in place. Only the\n * command position is considered — the same token appearing later as an argument\n * (`pm get show`) is left untouched — and only when it is not preceded by `--` or a\n * value-consuming global flag, mirroring {@link parseBootstrapCommandName}.\n */\nfunction rewriteCommandAlias(\n argv: string[],\n trace: BootstrapNormalizationEvent[],\n): string[] {\n const index = findCommandTokenIndex(argv);\n if (index === undefined) {\n return argv;\n }\n const token = argv[index];\n const canonical = EXECUTABLE_COMMAND_ALIASES[token.trim().toLowerCase()];\n if (!canonical) {\n return argv;\n }\n const rewritten = [...argv];\n rewritten[index] = canonical;\n trace.push({\n from: token,\n to: [canonical],\n reason: \"command_alias\",\n confidence: \"high\",\n });\n return rewritten;\n}\n\n/** Documents the bootstrap normalization event payload exchanged by command, SDK, and package integrations. */\nexport interface BootstrapNormalizationEvent {\n /** Value that configures or reports from for this contract. */\n from: string;\n /** Value that configures or reports to for this contract. */\n to: string[];\n /** Value that configures or reports reason for this contract. */\n reason: BootstrapNormalizationReason;\n /** Value that configures or reports confidence for this contract. */\n confidence: BootstrapNormalizationConfidence;\n}\n\n/** Documents the bootstrap invocation normalization result payload exchanged by command, SDK, and package integrations. */\nexport interface BootstrapInvocationNormalizationResult {\n /** Value that configures or reports argv for this contract. */\n argv: string[];\n /** Value that configures or reports command name for this contract. */\n commandName: string | undefined;\n /** Value that configures or reports trace for this contract. */\n trace: BootstrapNormalizationEvent[];\n}\n\ninterface FlagLookup {\n canonicalByNormalized: Map<string, string | null>;\n canonicalByCompact: Map<string, string | null>;\n canonicalComparables: Array<{ canonicalFlag: string; comparable: string }>;\n listCanonicalFlags: Set<string>;\n}\n\nfunction normalizeFlagKeyToken(raw: string): string {\n const withoutPrefix = raw.replace(/^--?/, \"\");\n return withoutPrefix\n .replace(/_/g, \"-\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\nfunction toComparableFlagKey(raw: string): string {\n return normalizeFlagKeyToken(raw).replace(/-/g, \"\");\n}\n\nfunction markUnambiguousFlag(\n map: Map<string, string | null>,\n key: string,\n canonicalFlag: string,\n): void {\n const existing = map.get(key);\n if (existing === undefined) {\n map.set(key, canonicalFlag);\n return;\n }\n if (existing !== canonicalFlag) {\n map.set(key, null);\n }\n}\n\nfunction collectLongFlagCandidates(contract: CliFlagContract): string[] {\n const candidates: string[] = [];\n const pushLongFlag = (value: string | undefined): void => {\n if (typeof value !== \"string\") {\n return;\n }\n if (!value.startsWith(\"--\")) {\n return;\n }\n candidates.push(value);\n };\n pushLongFlag(contract.flag);\n for (const alias of contract.aliases ?? []) {\n pushLongFlag(alias);\n }\n return candidates;\n}\n\nfunction buildFlagLookup(\n commandName: string | undefined,\n contractsOverride?: CliFlagContract[],\n): FlagLookup {\n const contracts =\n contractsOverride ?? resolveSubcommandFlagContractsForCommand(commandName);\n const canonicalByNormalized = new Map<string, string | null>();\n const canonicalByCompact = new Map<string, string | null>();\n const canonicalComparablesMap = new Map<string, string>();\n const listCanonicalFlags = new Set<string>();\n for (const contract of contracts) {\n const longCandidates = collectLongFlagCandidates(contract);\n if (longCandidates.length === 0) {\n continue;\n }\n const canonicalFlag = `--${normalizeFlagKeyToken(longCandidates[0])}`;\n for (const candidate of longCandidates) {\n markUnambiguousFlag(\n canonicalByNormalized,\n normalizeFlagKeyToken(candidate),\n canonicalFlag,\n );\n markUnambiguousFlag(\n canonicalByCompact,\n toComparableFlagKey(candidate),\n canonicalFlag,\n );\n }\n const comparable = toComparableFlagKey(canonicalFlag);\n if (!canonicalComparablesMap.has(canonicalFlag)) {\n canonicalComparablesMap.set(canonicalFlag, comparable);\n }\n if (contract.list === true) {\n listCanonicalFlags.add(canonicalFlag);\n }\n }\n return {\n canonicalByNormalized,\n canonicalByCompact,\n canonicalComparables: [...canonicalComparablesMap.entries()].map(\n ([canonicalFlag, comparable]) => ({\n canonicalFlag,\n comparable,\n }),\n ),\n listCanonicalFlags,\n };\n}\n\nfunction resolveCanonicalFlag(\n rawKey: string,\n lookup: FlagLookup,\n): {\n flag: string;\n reason: \"flag_alias\" | \"flag_typo\";\n confidence: BootstrapNormalizationConfidence;\n} | null {\n const normalizedKey = normalizeFlagKeyToken(rawKey);\n const direct = lookup.canonicalByNormalized.get(normalizedKey);\n if (typeof direct === \"string\") {\n return {\n flag: direct,\n reason: \"flag_alias\",\n confidence: \"high\",\n };\n }\n const comparableKey = normalizedKey.replace(/-/g, \"\");\n const compactMatch = lookup.canonicalByCompact.get(comparableKey);\n if (typeof compactMatch === \"string\") {\n return {\n flag: compactMatch,\n reason: \"flag_alias\",\n confidence: \"high\",\n };\n }\n const maxDistance = comparableKey.length >= 8 ? 2 : 1;\n let bestDistance = Number.POSITIVE_INFINITY;\n let bestFlag: string | undefined;\n let tied = false;\n for (const candidate of lookup.canonicalComparables) {\n const distance = levenshteinDistanceWithinLimit(\n comparableKey,\n candidate.comparable,\n maxDistance,\n );\n if (distance === null) {\n continue;\n }\n if (distance < bestDistance) {\n bestDistance = distance;\n bestFlag = candidate.canonicalFlag;\n tied = false;\n continue;\n }\n if (distance === bestDistance && bestFlag !== candidate.canonicalFlag) {\n tied = true;\n }\n }\n if (\n !bestFlag ||\n tied ||\n !Number.isFinite(bestDistance) ||\n bestDistance <= 0\n ) {\n return null;\n }\n return {\n flag: bestFlag,\n reason: \"flag_typo\",\n confidence: bestDistance >= 2 ? \"medium\" : \"high\",\n };\n}\n\n/** Implements list alias plural keys for the public runtime surface of this module. */\nexport function listAliasPluralKeys(normalizedKey: string): string[] {\n const candidates = [`${normalizedKey}s`];\n if (normalizedKey.endsWith(\"y\") && normalizedKey.length > 1) {\n candidates.push(`${normalizedKey.slice(0, -1)}ies`);\n }\n return candidates;\n}\n\nfunction parseBareKeyValueToken(\n token: string,\n preserve = false,\n): { key: string; value: string } | null {\n if (preserve || token.includes(\"://\")) {\n return null;\n }\n const match = token.match(/^([A-Za-z][A-Za-z0-9_-]{1,63})([:=])(.*)$/);\n if (!match) {\n return null;\n }\n const key = match[1];\n const value = match[3];\n if (value.length === 0) {\n return null;\n }\n return {\n key,\n value,\n };\n}\n\nfunction normalizeLongOptionToken(\n token: string,\n lookup: FlagLookup,\n preserve = false,\n): { tokens: string[]; event?: BootstrapNormalizationEvent } {\n if (preserve || !token.startsWith(\"--\")) {\n return { tokens: [token] };\n }\n const equalsIndex = token.indexOf(\"=\");\n const key = equalsIndex >= 0 ? token.slice(0, equalsIndex) : token;\n const inlineValue =\n equalsIndex >= 0 ? token.slice(equalsIndex + 1) : undefined;\n const resolution = resolveCanonicalFlag(key, lookup);\n if (!resolution) {\n return { tokens: [token] };\n }\n const normalizedToken =\n inlineValue === undefined\n ? resolution.flag\n : `${resolution.flag}=${inlineValue}`;\n if (normalizedToken === token) {\n return { tokens: [token] };\n }\n return {\n tokens: [normalizedToken],\n event: {\n from: token,\n to: [normalizedToken],\n reason: resolution.reason,\n confidence: resolution.confidence,\n },\n };\n}\n\n/** Locate global path-value tokens that normalization must preserve literally. */\nfunction collectBootstrapPathValueIndices(argv: string[]): Set<number> {\n const indices = new Set<number>();\n let expectsValue = false;\n for (let index = 0; index < argv.length; index += 1) {\n if (expectsValue) {\n indices.add(index);\n expectsValue = false;\n continue;\n }\n const token = argv[index];\n expectsValue = token === \"--path\" || token === \"--pm-path\";\n }\n return indices;\n}\n\n// Global option flags whose value may legitimately begin with \"--\" (commander\n// accepts such values). Their value token must not be reinterpreted as a list\n// flag during coalescing. `--pm-path <dir>` and its legacy `--path <dir>`\n// alias are the documented cases; other globals\n// (--json/--quiet/--no-extensions/--no-pager/--profile) are boolean.\nfunction splitCanonicalListToken(\n token: string,\n): { flag: string; inlineValue?: string } | null {\n if (!token.startsWith(\"--\")) {\n return null;\n }\n const equalsIndex = token.indexOf(\"=\");\n if (equalsIndex < 0) {\n return { flag: token };\n }\n return {\n flag: token.slice(0, equalsIndex),\n inlineValue: token.slice(equalsIndex + 1),\n };\n}\n\ninterface ListFlagSlot {\n outputIndex: number;\n originalTokens: string[];\n values: string[];\n occurrences: number;\n}\n\ninterface ListFlagOccurrence {\n originalTokens: string[];\n value: string | undefined;\n consumed: number;\n}\n\ninterface ValuedListFlagOccurrence {\n originalTokens: string[];\n value: string;\n}\n\nfunction copyValueConsumingFlag(\n argv: string[],\n index: number,\n result: (string | null)[],\n): number {\n result.push(argv[index]);\n const next = argv[index + 1];\n if (typeof next === \"string\" && next !== \"--\") {\n result.push(next);\n return index + 2;\n }\n return index + 1;\n}\n\nfunction readListFlagOccurrence(\n argv: string[],\n index: number,\n parsed: { flag: string; inlineValue?: string },\n multiValueListFlags: Set<string>,\n): ListFlagOccurrence {\n if (parsed.inlineValue !== undefined) {\n return {\n originalTokens: [argv[index]],\n value: parsed.inlineValue,\n consumed: 1,\n };\n }\n\n const values: string[] = [];\n let valueIndex = index + 1;\n while (\n valueIndex < argv.length &&\n argv[valueIndex] !== \"--\" &&\n !argv[valueIndex].startsWith(\"-\") &&\n (values.length === 0 || multiValueListFlags.has(parsed.flag))\n ) {\n values.push(argv[valueIndex]);\n valueIndex += 1;\n }\n\n const consumed = values.length === 0 ? 1 : 1 + values.length;\n return {\n originalTokens: argv.slice(index, index + consumed),\n value: values.length === 0 ? undefined : values.join(\",\"),\n consumed,\n };\n}\n\nfunction recordListFlagOccurrence(\n slots: Map<string, ListFlagSlot>,\n result: (string | null)[],\n flag: string,\n occurrence: ValuedListFlagOccurrence,\n): void {\n const existing = slots.get(flag);\n if (existing) {\n existing.values.push(occurrence.value);\n existing.occurrences += 1;\n return;\n }\n\n slots.set(flag, {\n outputIndex: result.length,\n originalTokens: occurrence.originalTokens,\n values: [occurrence.value],\n occurrences: 1,\n });\n // Reserve the anchor position; finalized after the walk so we know the full\n // merged value or can restore the original token form for single uses.\n result.push(null);\n}\n\nfunction buildListFlagCoalescingSplices(\n slots: Map<string, ListFlagSlot>,\n multiValueListFlags: Set<string>,\n): {\n events: BootstrapNormalizationEvent[];\n splices: Array<{ outputIndex: number; tokens: string[] }>;\n} {\n const events: BootstrapNormalizationEvent[] = [];\n const splices: Array<{ outputIndex: number; tokens: string[] }> = [];\n for (const [flag, slot] of slots) {\n const shouldMerge =\n slot.occurrences >= 2 ||\n (multiValueListFlags.has(flag) && slot.originalTokens.length > 2);\n if (!shouldMerge) {\n splices.push({\n outputIndex: slot.outputIndex,\n tokens: slot.originalTokens,\n });\n continue;\n }\n const mergedToken = `${flag}=${slot.values.join(\",\")}`;\n splices.push({ outputIndex: slot.outputIndex, tokens: [mergedToken] });\n events.push({\n from: `${flag} (x${slot.occurrences})`,\n to: [mergedToken],\n reason: \"list_merge\",\n confidence: \"high\",\n });\n }\n return { events, splices };\n}\n\nfunction applyListFlagSplices(\n result: (string | null)[],\n splices: Array<{ outputIndex: number; tokens: string[] }>,\n): void {\n splices.sort((a, b) => b.outputIndex - a.outputIndex);\n for (const splice of splices) {\n result.splice(splice.outputIndex, 1, ...splice.tokens);\n }\n}\n\n/**\n * Coalesce repeated occurrences of comma-separated list flags into a single\n * `--flag=v1,v2,v3` token anchored at the FIRST occurrence. Without this,\n * Commander treats these flags as scalars and silently keeps only the last\n * value (data loss). Both `--flag value` and `--flag=value` forms are merged;\n * a value-less occurrence is preserved untouched, and a `--` terminator stops\n * coalescing (remainder is passed through verbatim).\n *\n * `valueConsumingFlags` lists option flags (e.g. global `--pm-path`) whose value\n * may itself begin with `--`. Their value token is emitted verbatim so a\n * list-flag-looking value (`--path --tags`) is never reinterpreted as a flag\n * nor allowed to swallow the following command/positional token.\n */\nexport function coalesceRepeatedListFlags(\n argv: string[],\n listFlags: Set<string>,\n valueConsumingFlags: Set<string> = new Set(),\n multiValueListFlags: Set<string> = new Set(),\n): { argv: string[]; events: BootstrapNormalizationEvent[] } {\n if (listFlags.size === 0) {\n return { argv: [...argv], events: [] };\n }\n\n const result: (string | null)[] = [];\n const slots = new Map<string, ListFlagSlot>();\n let index = 0;\n while (index < argv.length) {\n const token = argv[index];\n if (token === \"--\") {\n result.push(...argv.slice(index));\n break;\n }\n // A value-consuming option in space form owns the next token as its value,\n // even when that value begins with \"--\". Emit both verbatim so the value is\n // never misread as a list-flag occurrence.\n if (valueConsumingFlags.has(token)) {\n index = copyValueConsumingFlag(argv, index, result);\n continue;\n }\n const parsed = splitCanonicalListToken(token);\n if (!parsed || !listFlags.has(parsed.flag)) {\n result.push(token);\n index += 1;\n continue;\n }\n\n const occurrence = readListFlagOccurrence(\n argv,\n index,\n parsed,\n multiValueListFlags,\n );\n if (occurrence.value === undefined) {\n // Value-less occurrence: leave untouched, do not coalesce.\n result.push(token);\n index += occurrence.consumed;\n continue;\n }\n\n recordListFlagOccurrence(slots, result, parsed.flag, {\n originalTokens: occurrence.originalTokens,\n value: occurrence.value,\n });\n index += occurrence.consumed;\n }\n\n // Apply anchor splices from the end so earlier indices stay valid when a\n // single-occurrence anchor expands back into two tokens.\n const { events, splices } = buildListFlagCoalescingSplices(\n slots,\n multiValueListFlags,\n );\n applyListFlagSplices(result, splices);\n\n return { argv: result as string[], events };\n}\n\n/** Linked-test entry keys accepted in the two-token form `pm test <id> --add command \"npm test -- parser\"` (GH-191). Only entry-identity keys are merged: `command`/`cmd` name the shell command and `path` names the test file, so a single key=value entry is meaningful for them. Other structured keys (scope, env_set, assertions, ...) cannot form a valid standalone entry and are left for the normal parser to reject. `--remove` matches existing entries by `command=`/`path=` only, so `cmd` is excluded there. Key names mirror STRUCTURED_LINKED_TEST_KEYS in src/cli/commands/linked-test-entry.ts. */\nconst LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG: ReadonlyMap<\n string,\n ReadonlySet<string>\n> = new Map([\n [\"--add\", new Set([\"command\", \"cmd\", \"path\"])],\n [\"--remove\", new Set([\"command\", \"path\"])],\n]);\n\n/** Sandbox-safe linked-test commands legitimately start with env assignments (`PM_PATH=... PM_GLOBAL_PATH=... vitest run -- parser`), which look like bare key=value settings tokens. When the two preceding tokens are a linked-test flag plus a bare two-token key (`--add command <value>`), the value must be left intact for mergeLinkedTestTwoTokenEntries instead of being rewritten into a canonical flag (e.g. PM_PATH= -> --pm-path), which would silently corrupt the command into `--add command --pm-path ...`. */\nfunction isLinkedTestTwoTokenValuePosition(\n commandName: string | undefined,\n emittedTokens: readonly string[],\n): boolean {\n if (commandName !== \"test\" || emittedTokens.length < 2) {\n return false;\n }\n const key = emittedTokens[emittedTokens.length - 1];\n const flag = emittedTokens[emittedTokens.length - 2];\n const keys = LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG.get(flag);\n return keys !== undefined && keys.has(key);\n}\n\nfunction shouldPreserveBareKeyValueToken(\n commandName: string | undefined,\n emittedTokens: readonly string[],\n): boolean {\n return (\n commandName === \"search\" ||\n isLinkedTestTwoTokenValuePosition(commandName, emittedTokens)\n );\n}\n\n/** Accept the two-token linked-test form `pm test <id> --add command \"npm test -- parser\"` by merging the bare key token and its single quoted value into the documented `--add command=...` shape. Without this merge Commander binds the bare key as the option value and treats the quoted command as an excess positional, failing with \"too many arguments\" (GH-191). The merge only fires when EXACTLY ONE non-flag token follows the bare key, i.e. the value was quoted into one shell token — an unquoted multi-token value stays ambiguous (it may swallow the item id), still fails fast, and is routed to targeted quoting guidance by the commander error classifier instead. */\nexport function mergeLinkedTestTwoTokenEntries(\n argv: string[],\n commandName: string | undefined,\n trace: BootstrapNormalizationEvent[],\n): string[] {\n if (commandName !== \"test\") {\n return argv;\n }\n const result: string[] = [];\n let index = 0;\n while (index < argv.length) {\n const token = argv[index];\n if (token === \"--\") {\n result.push(...argv.slice(index));\n return result;\n }\n const keys = LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG.get(token);\n const key = keys ? argv[index + 1] : undefined;\n if (!keys || typeof key !== \"string\" || !keys.has(key)) {\n result.push(token);\n index += 1;\n continue;\n }\n let runEnd = index + 2;\n while (runEnd < argv.length && !argv[runEnd].startsWith(\"-\")) {\n runEnd += 1;\n }\n if (runEnd - (index + 2) !== 1) {\n result.push(token);\n index += 1;\n continue;\n }\n const value = argv[index + 2];\n const mergedValue = `${key}=${value}`;\n result.push(token, mergedValue);\n trace.push({\n from: `${token} ${key} ${value}`,\n to: [token, mergedValue],\n reason: \"bare_key_value\",\n confidence: \"high\",\n });\n index += 3;\n }\n return result;\n}\n\n/** Implements normalize bootstrap invocation for the public runtime surface of this module. */\nexport function normalizeBootstrapInvocation(\n argv: string[],\n): BootstrapInvocationNormalizationResult {\n const trace: BootstrapNormalizationEvent[] = [];\n const legacyNormalized = normalizeLegacyExtensionActionSyntax(argv);\n if (\n legacyNormalized.length !== argv.length ||\n legacyNormalized.some((token, index) => token !== argv[index])\n ) {\n trace.push({\n from: argv.join(\" \"),\n to: [...legacyNormalized],\n reason: \"legacy_extension_action\",\n confidence: \"high\",\n });\n }\n const aliasNormalized = rewriteCommandAlias(legacyNormalized, trace);\n const commandName = parseBootstrapCommandName(aliasNormalized);\n const commandPathName = parseBootstrapCommandPathName(aliasNormalized);\n const lookup = buildFlagLookup(commandPathName ?? commandName);\n const normalizedArgv: string[] = [];\n const pathValueIndices = collectBootstrapPathValueIndices(aliasNormalized);\n for (let index = 0; index < aliasNormalized.length; index += 1) {\n const token = aliasNormalized[index];\n if (token === \"--\") {\n normalizedArgv.push(...aliasNormalized.slice(index));\n break;\n }\n const preserveCurrentToken = pathValueIndices.has(index);\n const previous = normalizedArgv[normalizedArgv.length - 1];\n if (token.startsWith(\"--\")) {\n const normalizedToken = normalizeLongOptionToken(\n token,\n lookup,\n preserveCurrentToken,\n );\n normalizedArgv.push(...normalizedToken.tokens);\n if (normalizedToken.event) {\n trace.push(normalizedToken.event);\n }\n continue;\n }\n const bareKeyValue = parseBareKeyValueToken(token, preserveCurrentToken);\n if (\n bareKeyValue &&\n !(typeof previous === \"string\" && previous.startsWith(\"-\")) &&\n !shouldPreserveBareKeyValueToken(commandName, normalizedArgv)\n ) {\n const resolution = resolveCanonicalFlag(bareKeyValue.key, lookup);\n if (resolution) {\n const replacement = [resolution.flag, bareKeyValue.value];\n normalizedArgv.push(...replacement);\n trace.push({\n from: token,\n to: replacement,\n reason: \"bare_key_value\",\n confidence: resolution.confidence,\n });\n continue;\n }\n }\n normalizedArgv.push(token);\n }\n const linkedTestNormalized = mergeLinkedTestTwoTokenEntries(\n normalizedArgv,\n commandName,\n trace,\n );\n const coalesced = coalesceRepeatedListFlags(\n linkedTestNormalized,\n lookup.listCanonicalFlags,\n GLOBAL_VALUE_CONSUMING_FLAGS,\n commandName === \"create\" ? new Set([\"--tags\"]) : new Set(),\n );\n for (const event of coalesced.events) {\n trace.push(event);\n }\n return {\n argv: coalesced.argv,\n commandName,\n trace,\n };\n}\n\nfunction parseBootstrapCommandPathName(argv: string[]): string | undefined {\n const stripped = stripGlobalBootstrapTokens(argv);\n const first = stripped[0]?.trim().toLowerCase();\n const second = stripped[1]?.trim().toLowerCase();\n if (\n (first === \"extension\" || first === \"package\" || first === \"packages\") &&\n typeof second === \"string\" &&\n second.length > 0 &&\n !second.startsWith(\"-\")\n ) {\n return `${first} ${second}`;\n }\n return first;\n}\n\n/** Implements parse bootstrap type value for the public runtime surface of this module. */\nexport function parseBootstrapTypeValue(argv: string[]): string | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === \"--\") {\n break;\n }\n if (token === \"--type\") {\n const candidate = argv[index + 1];\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n return candidate.trim();\n }\n continue;\n }\n if (token.startsWith(\"--type=\")) {\n const candidate = token.slice(\"--type=\".length).trim();\n if (candidate.length > 0) {\n return candidate;\n }\n }\n }\n return undefined;\n}\n\n/** Public contract for test only, shared by SDK and presentation-layer consumers. */\nexport const _testOnly = {\n buildFlagLookup,\n collectBootstrapPathValueIndices,\n collectLongFlagCandidates,\n markUnambiguousFlag,\n normalizeLongOptionToken,\n resolveCanonicalFlag,\n};\n", "/**\n * @module sdk/invocation-author\n *\n * Safely scopes invocation-wide mutation authors for one-shot and embedded CLI hosts.\n */\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\n\n/** Apply an optional author override and return an idempotent environment restorer. */\nexport function applyInvocationAuthorOverride(\n author: string | undefined,\n): () => void {\n if (author === undefined) {\n return () => {};\n }\n const normalizedAuthor = author.trim();\n if (normalizedAuthor.length === 0) {\n throw new PmCliError(\n \"--author requires a non-empty value.\",\n EXIT_CODE.USAGE,\n {\n code: \"missing_required_argument\",\n nextSteps: [\"Pass an explicit author identifier with --author <id>.\"],\n },\n );\n }\n const previousAuthor = process.env.PM_AUTHOR;\n process.env.PM_AUTHOR = normalizedAuthor;\n let restored = false;\n return () => {\n if (restored) {\n return;\n }\n restored = true;\n if (previousAuthor === undefined) {\n delete process.env.PM_AUTHOR;\n } else {\n process.env.PM_AUTHOR = previousAuthor;\n }\n };\n}\n", "/**\n * @module sdk/cli-program\n *\n * Builds the reusable Commander root that embeds pm's universal global contracts.\n */\nimport { Command } from \"commander\";\nimport { writeStdout } from \"../core/output/output.js\";\n\n/** Create a fresh pm root program suitable for one-shot CLI or embedded hosts. */\nexport function createPmCliProgram(version: string): Command {\n return new Command()\n .name(\"pm\")\n .description(\n \"Universal, flexible, extensible, agent-optimized project management CLI for any project or programming language.\",\n )\n .version(version)\n .showHelpAfterError(false)\n .allowExcessArguments(false)\n .allowUnknownOption(false)\n .configureOutput({\n writeOut: (value) => {\n writeStdout(value);\n },\n writeErr: () => {},\n })\n .option(\"--json\", \"Output JSON instead of TOON\")\n .option(\"--lean\", \"Omit null and empty containers from JSON output\")\n .option(\"--quiet\", \"Suppress stdout output\")\n .option(\n \"--no-changed-fields\",\n \"Omit the changed_fields array from mutation output (keeps changed_field_count)\",\n )\n .option(\n \"--full-changed-fields\",\n \"Restore the legacy full mutation envelope and changed_fields array\",\n )\n .option(\n \"--id-only\",\n \"Print only id and status for single-item mutation output\",\n )\n .option(\n \"--pm-path <dir>\",\n \"Explicit tracker storage path for this command (preferred over --path)\",\n )\n .option(\n \"--path <dir>\",\n \"Backward-compatible alias for --pm-path; this is the tracker storage path, not a workspace cwd\",\n )\n .option(\"--no-extensions\", \"Disable extension loading\")\n .option(\"--no-pager\", \"Disable pager integration for help and long output\")\n .option(\n \"--explain\",\n \"Render extended rationale and examples in help output\",\n )\n .option(\"--profile\", \"Print deterministic timing diagnostics\")\n .option(\"--author <id>\", \"Override mutation author for this invocation\")\n .exitOverride();\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASM,SAAU,qBAAqB,OAAc;AACjD,MAAI,iBAAiB,YAAY;AAC/B,WAAO,MAAM;EACf;AACA,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;EACf;AACA,SAAO;AACT;AAGM,SAAU,mBAAmB,OAAc;AAC/C,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,EAAE,cAAc,QAAQ;AACzE,WAAO;EACT;AACA,QAAM,WAAY,MAAiC;AACnD,SAAO,OAAO,aAAa,YAAY,OAAO,SAAS,QAAQ,IAC3D,WACA;AACN;AAGM,SAAU,wBAAwB,UAAgB;AACtD,QAAM,aAAa,KAAK,MAAM,QAAQ;AACtC,SAAO,aAAa,UAAU,UAC1B,aACA,UAAU;AAChB;AAGM,SAAU,iBAAiB,OAAc;AAC7C,SACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,OAAQ,MAA6B,SAAS,YAC7C,MAA2B,KAAK,WAAW,YAAY;AAE5D;AAGM,SAAU,yBACd,OACA,SAAe;AAEf,MAAI,iBAAiB,OAAO;AAC1B,WAAO;EACT;AACA,QAAM,UAAU,IAAI,MAAM,OAAO;AACjC,QAAM,WAAW,mBAAmB,KAAK;AAEzC,MAAI,aAAa,QAAW;AAC1B,YAAQ,WAAW,wBAAwB,QAAQ;EACrD;AACA,SAAO;AACT;A;;;;;;;;;ACnDA,IAAM,+BAA+B,oBAAI,IAAY;EACnD;EACA;EACA;CACD;AAGD,IAAM,2BAA2B,CAAC,UAA0B;AAC1D,QAAM,cAAc,MAAM,QAAQ,GAAG;AACrC,SACE,cAAc,KACd,6BAA6B,IAAI,MAAM,MAAM,GAAG,WAAW,CAAC;AAEhE;AAGA,IAAM,+BAA+B,CAAC,SAAqC;AACzE,SAAO,OAAO,SAAS,YAAY,CAAC,KAAK,WAAW,GAAG;AACzD;AAEA,SAAS,wBACP,OACA,MAAwB;AAExB,MAAI,UAAU,YAAY,UAAU,aAAa;AAC/C,QAAI,OAAO,SAAS,YAAY,KAAK,SAAS,GAAG;AAC/C,aAAO;QACL,UAAU;QACV,WAAW;QACX,WAAW,UAAU;;IAEzB;AACA,WAAO;MACL,UAAU;MACV,WAAW,UAAU;;EAEzB;AAEA,QAAM,eAAe,MAAM,WAAW,SAAS,IAC3C,YACA,MAAM,WAAW,YAAY,IAC3B,eACA;AACN,MAAI,CAAC,cAAc;AACjB,WAAO;EACT;AAEA,QAAM,QAAQ,MAAM,MAAM,aAAa,MAAM;AAC7C,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;MACL,UAAU;MACV,WAAW;MACX,WAAW,iBAAiB;;EAEhC;AACA,SAAO;IACL,UAAU;IACV,WAAW,iBAAiB;;AAEhC;AAsBA,IAAM,0BAA0B,oBAAI,IAAI;EACtC;EACA;EACA;EACA;EACA;CACD;AAGK,SAAU,4BACd,MAAc;AAEd,MAAI;AACJ,MAAI;AACJ,QAAM,eAAe,oBAAI,IAAG;AAC5B,MAAI;AACJ,MAAI,QAAQ;AACZ,SAAO,QAAQ,KAAK,QAAQ;AAC1B,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,UAAU,MAAM;AAClB;IACF;AACA,QAAI,wBAAwB,IAAI,KAAK,GAAG;AACtC,mBAAa,IAAI,KAAK;AACtB,eAAS;AACT;IACF;AACA,UAAM,aAAa,wBAAwB,OAAO,KAAK,QAAQ,CAAC,CAAC;AACjE,QAAI,YAAY;AACd,UAAI,WAAW,cAAc,QAAW;AACtC,YAAI,WAAW,WAAW;AACxB,wBAAc,WAAW;QAC3B,OAAO;AACL,4BAAkB,WAAW;QAC/B;MACF;AACA,eAAS,WAAW;AACpB;IACF;AACA,QAAI,UAAU,YAAY;AACxB,UAAI,6BAA6B,KAAK,QAAQ,CAAC,CAAC,GAAG;AACjD,iBAAS,KAAK,QAAQ,CAAC;AACvB,iBAAS;MACX,OAAO;AACL,iBAAS;AACT,iBAAS;MACX;AACA;IACF;AACA,QAAI,MAAM,WAAW,WAAW,GAAG;AACjC,eAAS,MAAM,MAAM,YAAY,MAAM;AACvC,eAAS;AACT;IACF;AACA,aAAS;EACX;AACA,SAAO;IACL,MAAM,eAAe;IACrB,cAAc,aAAa,IAAI,iBAAiB;IAChD,SAAS,aAAa,IAAI,YAAY;IACtC,MAAM,aAAa,IAAI,QAAQ;IAC/B,OAAO,aAAa,IAAI,SAAS;IACjC,MAAM,aAAa,IAAI,QAAQ;IAC/B,GAAI,WAAW,KACX,EAAE,oBAAoB,KAAI,IAC1B,WAAW,SACT,EAAE,OAAM,IACR,CAAA;;AAEV;AAGM,SAAU,2BAA2B,MAAc;AACvD,QAAM,YAAsB,CAAA;AAC5B,MAAI,QAAQ;AACZ,SAAO,QAAQ,KAAK,QAAQ;AAC1B,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,UAAU,MAAM;AAClB;IACF;AACA,QACE,UAAU,YACV,UAAU,aACV,UAAU,YACV,UAAU,qBACV,UAAU,gBACV,UAAU,eACV,UAAU,eACV,UAAU,2BACV,UAAU,aACV;AACA,eAAS;AACT;IACF;AACA,QAAI,UAAU,YAAY;AACxB,eAAS,6BAA6B,KAAK,QAAQ,CAAC,CAAC,IAAI,IAAI;AAC7D;IACF;AACA,QAAI,6BAA6B,IAAI,KAAK,GAAG;AAC3C,eAAS;AACT;IACF;AACA,QAAI,yBAAyB,KAAK,GAAG;AACnC,eAAS;AACT;IACF;AACA,cAAU,KAAK,KAAK;AACpB,aAAS;EACX;AACA,SAAO;AACT;AAWM,SAAU,0BACd,MAAc;AAEd,QAAM,WAAW,2BAA2B,IAAI;AAChD,QAAM,QAAQ,SAAS,CAAC,GAAG,KAAI,EAAG,YAAW;AAC7C,MAAI,UAAU,QAAQ;AACpB,UAAMA,qBAA8B,CAAA;AACpC,aAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS,GAAG;AACvD,YAAM,QAAQ,SAAS,KAAK;AAC5B,UAAI,MAAM,WAAW,GAAG,GAAG;AACzB;MACF;AACA,MAAAA,mBAAkB,KAAK,MAAM,KAAI,EAAG,YAAW,CAAE;IACnD;AACA,WAAO;MACL,WAAW;MACX,mBAAAA;;EAEJ;AAEA,QAAM,gBAAgB,SAAS,UAC7B,CAAC,UAAU,UAAU,YAAY,UAAU,IAAI;AAEjD,MAAI,gBAAgB,GAAG;AACrB,WAAO;MACL,WAAW;MACX,mBAAmB,CAAA;;EAEvB;AAEA,QAAM,oBAA8B,CAAA;AACpC,aAAW,SAAS,UAAU;AAC5B,QAAI,MAAM,WAAW,GAAG,GAAG;AACzB;IACF;AACA,sBAAkB,KAAK,MAAM,KAAI,EAAG,YAAW,CAAE;EACnD;AACA,SAAO;IACL,WAAW;IACX;;AAEJ;AASA,SAAS,sBAAsB,MAAc;AAC3C,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,UAAU,MAAM;AAClB,aAAO;IACT;AACA,QAAI,UAAU,YAAY;AACxB,eAAS,6BAA6B,KAAK,QAAQ,CAAC,CAAC,IAAI,IAAI;AAC7D;IACF;AACA,QAAI,6BAA6B,IAAI,KAAK,GAAG;AAC3C,eAAS;AACT;IACF;AACA,QACE,yBAAyB,KAAK,KAC9B,UAAU,YACV,UAAU,aACV,UAAU,YACV,UAAU,qBACV,UAAU,gBACV,UAAU,eACV,UAAU,eACV,UAAU,aACV;AACA;IACF;AACA,QAAI,MAAM,WAAW,GAAG,GAAG;AACzB;IACF;AACA,WAAO;EACT;AACA,SAAO;AACT;AAGM,SAAU,0BAA0B,MAAc;AACtD,QAAM,QAAQ,sBAAsB,IAAI;AACxC,SAAO,UAAU,SAAY,SAAY,KAAK,KAAK,EAAE,KAAI,EAAG,YAAW;AACzE;AAEA,SAAS,gCACP,MACA,iBAAuC;AAEvC,MAAI,gBAAgB,SAAS;AAC3B,WAAO;EACT;AACA,MAAI,QAAQ,OAAO,UAAU,MAAM;AACjC,WAAO;EACT;AACA,QAAM,cAAc,0BAA0B,IAAI;AAClD,SAAO,YAAY;AACrB;AAGM,SAAU,0BAA0B,MAAc;AACtD,QAAM,uBAAuB;IAC3B;IACA;IACA;IACA;;AAEF,QAAM,iBAAiB,qBAAqB,IAAI,CAAC,QAAQ,QAAQ,IAAI,GAAG,CAAC;AACzE,QAAM,UAAU,MAAW;AACzB,eAAW,CAAC,OAAO,GAAG,KAAK,qBAAqB,QAAO,GAAI;AACzD,YAAM,QAAQ,eAAe,KAAK;AAClC,UAAI,UAAU,QAAW;AACvB,eAAO,QAAQ,IAAI,GAAG;MACxB,OAAO;AACL,gBAAQ,IAAI,GAAG,IAAI;MACrB;IACF;EACF;AACA,QAAM,kBAAkB,4BAA4B,IAAI;AACxD,MAAI,CAAC,gCAAgC,MAAM,eAAe,GAAG;AAC3D,WAAO;EACT;AACA,UAAQ,IAAI,QAAQ;AACpB,UAAQ,IAAI,WAAW;AACvB,UAAQ,IAAI,YAAY;AACxB,MACE,OAAO,QAAQ,IAAI,SAAS,YAC5B,QAAQ,IAAI,KAAK,KAAI,EAAG,WAAW,GACnC;AACA,YAAQ,IAAI,OAAO;EACrB;AACA,SAAO;AACT;AAcA,IAAM,iCAAiC,oBAAI,IAA+B;EACxE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AAGK,SAAU,qCAAqC,MAAc;AACjE,QAAM,iBAAiB,sBAAsB,IAAI;AACjD,MAAI,mBAAmB,UAAa,KAAK,cAAc,MAAM,aAAa;AACxE,WAAO,CAAC,GAAG,IAAI;EACjB;AACA,QAAM,cAAc,KAAK,iBAAiB,CAAC;AAC3C,MAAI,CAAC,eAAe,YAAY,WAAW,GAAG,GAAG;AAC/C,WAAO,CAAC,GAAG,IAAI;EACjB;AACA,MACE,CAAC,+BAA+B,IAC9B,WAAwC,GAE1C;AACA,WAAO,CAAC,GAAG,IAAI;EACjB;AACA,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AAClD,WAAO,CAAC,GAAG,IAAI;EACjB;AACA,QAAM,mBAAmB,KAAK,WAAW;AACzC,MAAI,KAAK,SAAS,gBAAgB,GAAG;AACnC,WAAO,CAAC,GAAG,IAAI;EACjB;AACA,SAAO;IACL,GAAG,KAAK,MAAM,GAAG,iBAAiB,CAAC;IACnC;IACA,GAAG,KAAK,MAAM,iBAAiB,CAAC;;AAEpC;AAkBA,SAAS,oBACP,MACA,OAAoC;AAEpC,QAAM,QAAQ,sBAAsB,IAAI;AACxC,MAAI,UAAU,QAAW;AACvB,WAAO;EACT;AACA,QAAM,QAAQ,KAAK,KAAK;AACxB,QAAM,YAAY,2BAA2B,MAAM,KAAI,EAAG,YAAW,CAAE;AACvE,MAAI,CAAC,WAAW;AACd,WAAO;EACT;AACA,QAAM,YAAY,CAAC,GAAG,IAAI;AAC1B,YAAU,KAAK,IAAI;AACnB,QAAM,KAAK;IACT,MAAM;IACN,IAAI,CAAC,SAAS;IACd,QAAQ;IACR,YAAY;GACb;AACD,SAAO;AACT;AA+BA,SAAS,sBAAsB,KAAW;AACxC,QAAM,gBAAgB,IAAI,QAAQ,QAAQ,EAAE;AAC5C,SAAO,cACJ,QAAQ,MAAM,GAAG,EACjB,QAAQ,sBAAsB,OAAO,EACrC,YAAW;AAChB;AAEA,SAAS,oBAAoB,KAAW;AACtC,SAAO,sBAAsB,GAAG,EAAE,QAAQ,MAAM,EAAE;AACpD;AAEA,SAAS,oBACP,KACA,KACA,eAAqB;AAErB,QAAM,WAAW,IAAI,IAAI,GAAG;AAC5B,MAAI,aAAa,QAAW;AAC1B,QAAI,IAAI,KAAK,aAAa;AAC1B;EACF;AACA,MAAI,aAAa,eAAe;AAC9B,QAAI,IAAI,KAAK,IAAI;EACnB;AACF;AAEA,SAAS,0BAA0B,UAAyB;AAC1D,QAAM,aAAuB,CAAA;AAC7B,QAAM,eAAe,CAAC,UAAmC;AACvD,QAAI,OAAO,UAAU,UAAU;AAC7B;IACF;AACA,QAAI,CAAC,MAAM,WAAW,IAAI,GAAG;AAC3B;IACF;AACA,eAAW,KAAK,KAAK;EACvB;AACA,eAAa,SAAS,IAAI;AAC1B,aAAW,SAAS,SAAS,WAAW,CAAA,GAAI;AAC1C,iBAAa,KAAK;EACpB;AACA,SAAO;AACT;AAEA,SAAS,gBACP,aACA,mBAAqC;AAErC,QAAM,YACJ,qBAAqB,yCAAyC,WAAW;AAC3E,QAAM,wBAAwB,oBAAI,IAAG;AACrC,QAAM,qBAAqB,oBAAI,IAAG;AAClC,QAAM,0BAA0B,oBAAI,IAAG;AACvC,QAAM,qBAAqB,oBAAI,IAAG;AAClC,aAAW,YAAY,WAAW;AAChC,UAAM,iBAAiB,0BAA0B,QAAQ;AACzD,QAAI,eAAe,WAAW,GAAG;AAC/B;IACF;AACA,UAAM,gBAAgB,KAAK,sBAAsB,eAAe,CAAC,CAAC,CAAC;AACnE,eAAW,aAAa,gBAAgB;AACtC,0BACE,uBACA,sBAAsB,SAAS,GAC/B,aAAa;AAEf,0BACE,oBACA,oBAAoB,SAAS,GAC7B,aAAa;IAEjB;AACA,UAAM,aAAa,oBAAoB,aAAa;AACpD,QAAI,CAAC,wBAAwB,IAAI,aAAa,GAAG;AAC/C,8BAAwB,IAAI,eAAe,UAAU;IACvD;AACA,QAAI,SAAS,SAAS,MAAM;AAC1B,yBAAmB,IAAI,aAAa;IACtC;EACF;AACA,SAAO;IACL;IACA;IACA,sBAAsB,CAAC,GAAG,wBAAwB,QAAO,CAAE,EAAE,IAC3D,CAAC,CAAC,eAAe,UAAU,OAAO;MAChC;MACA;MACA;IAEJ;;AAEJ;AAEA,SAAS,qBACP,QACA,QAAkB;AAMlB,QAAM,gBAAgB,sBAAsB,MAAM;AAClD,QAAM,SAAS,OAAO,sBAAsB,IAAI,aAAa;AAC7D,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;MACL,MAAM;MACN,QAAQ;MACR,YAAY;;EAEhB;AACA,QAAM,gBAAgB,cAAc,QAAQ,MAAM,EAAE;AACpD,QAAM,eAAe,OAAO,mBAAmB,IAAI,aAAa;AAChE,MAAI,OAAO,iBAAiB,UAAU;AACpC,WAAO;MACL,MAAM;MACN,QAAQ;MACR,YAAY;;EAEhB;AACA,QAAM,cAAc,cAAc,UAAU,IAAI,IAAI;AACpD,MAAI,eAAe,OAAO;AAC1B,MAAI;AACJ,MAAI,OAAO;AACX,aAAW,aAAa,OAAO,sBAAsB;AACnD,UAAM,WAAW,+BACf,eACA,UAAU,YACV,WAAW;AAEb,QAAI,aAAa,MAAM;AACrB;IACF;AACA,QAAI,WAAW,cAAc;AAC3B,qBAAe;AACf,iBAAW,UAAU;AACrB,aAAO;AACP;IACF;AACA,QAAI,aAAa,gBAAgB,aAAa,UAAU,eAAe;AACrE,aAAO;IACT;EACF;AACA,MACE,CAAC,YACD,QACA,CAAC,OAAO,SAAS,YAAY,KAC7B,gBAAgB,GAChB;AACA,WAAO;EACT;AACA,SAAO;IACL,MAAM;IACN,QAAQ;IACR,YAAY,gBAAgB,IAAI,WAAW;;AAE/C;AAGM,SAAU,oBAAoB,eAAqB;AACvD,QAAM,aAAa,CAAC,GAAG,aAAa,GAAG;AACvC,MAAI,cAAc,SAAS,GAAG,KAAK,cAAc,SAAS,GAAG;AAC3D,eAAW,KAAK,GAAG,cAAc,MAAM,GAAG,EAAE,CAAC,KAAK;EACpD;AACA,SAAO;AACT;AAEA,SAAS,uBACP,OACA,WAAW,OAAK;AAEhB,MAAI,YAAY,MAAM,SAAS,KAAK,GAAG;AACrC,WAAO;EACT;AACA,QAAM,QAAQ,MAAM,MAAM,2CAA2C;AACrE,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AACA,QAAM,MAAM,MAAM,CAAC;AACnB,QAAM,QAAQ,MAAM,CAAC;AACrB,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;EACT;AACA,SAAO;IACL;IACA;;AAEJ;AAEA,SAAS,yBACP,OACA,QACA,WAAW,OAAK;AAEhB,MAAI,YAAY,CAAC,MAAM,WAAW,IAAI,GAAG;AACvC,WAAO,EAAE,QAAQ,CAAC,KAAK,EAAC;EAC1B;AACA,QAAM,cAAc,MAAM,QAAQ,GAAG;AACrC,QAAM,MAAM,eAAe,IAAI,MAAM,MAAM,GAAG,WAAW,IAAI;AAC7D,QAAM,cACJ,eAAe,IAAI,MAAM,MAAM,cAAc,CAAC,IAAI;AACpD,QAAM,aAAa,qBAAqB,KAAK,MAAM;AACnD,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,QAAQ,CAAC,KAAK,EAAC;EAC1B;AACA,QAAM,kBACJ,gBAAgB,SACZ,WAAW,OACX,GAAG,WAAW,IAAI,IAAI,WAAW;AACvC,MAAI,oBAAoB,OAAO;AAC7B,WAAO,EAAE,QAAQ,CAAC,KAAK,EAAC;EAC1B;AACA,SAAO;IACL,QAAQ,CAAC,eAAe;IACxB,OAAO;MACL,MAAM;MACN,IAAI,CAAC,eAAe;MACpB,QAAQ,WAAW;MACnB,YAAY,WAAW;;;AAG7B;AAGA,SAAS,iCAAiC,MAAc;AACtD,QAAM,UAAU,oBAAI,IAAG;AACvB,MAAI,eAAe;AACnB,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,QAAI,cAAc;AAChB,cAAQ,IAAI,KAAK;AACjB,qBAAe;AACf;IACF;AACA,UAAM,QAAQ,KAAK,KAAK;AACxB,mBAAe,UAAU,YAAY,UAAU;EACjD;AACA,SAAO;AACT;AAOA,SAAS,wBACP,OAAa;AAEb,MAAI,CAAC,MAAM,WAAW,IAAI,GAAG;AAC3B,WAAO;EACT;AACA,QAAM,cAAc,MAAM,QAAQ,GAAG;AACrC,MAAI,cAAc,GAAG;AACnB,WAAO,EAAE,MAAM,MAAK;EACtB;AACA,SAAO;IACL,MAAM,MAAM,MAAM,GAAG,WAAW;IAChC,aAAa,MAAM,MAAM,cAAc,CAAC;;AAE5C;AAoBA,SAAS,uBACP,MACA,OACA,QAAyB;AAEzB,SAAO,KAAK,KAAK,KAAK,CAAC;AACvB,QAAM,OAAO,KAAK,QAAQ,CAAC;AAC3B,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,WAAO,KAAK,IAAI;AAChB,WAAO,QAAQ;EACjB;AACA,SAAO,QAAQ;AACjB;AAEA,SAAS,uBACP,MACA,OACA,QACA,qBAAgC;AAEhC,MAAI,OAAO,gBAAgB,QAAW;AACpC,WAAO;MACL,gBAAgB,CAAC,KAAK,KAAK,CAAC;MAC5B,OAAO,OAAO;MACd,UAAU;;EAEd;AAEA,QAAM,SAAmB,CAAA;AACzB,MAAI,aAAa,QAAQ;AACzB,SACE,aAAa,KAAK,UAClB,KAAK,UAAU,MAAM,QACrB,CAAC,KAAK,UAAU,EAAE,WAAW,GAAG,MAC/B,OAAO,WAAW,KAAK,oBAAoB,IAAI,OAAO,IAAI,IAC3D;AACA,WAAO,KAAK,KAAK,UAAU,CAAC;AAC5B,kBAAc;EAChB;AAEA,QAAM,WAAW,OAAO,WAAW,IAAI,IAAI,IAAI,OAAO;AACtD,SAAO;IACL,gBAAgB,KAAK,MAAM,OAAO,QAAQ,QAAQ;IAClD,OAAO,OAAO,WAAW,IAAI,SAAY,OAAO,KAAK,GAAG;IACxD;;AAEJ;AAEA,SAAS,yBACP,OACA,QACA,MACA,YAAoC;AAEpC,QAAM,WAAW,MAAM,IAAI,IAAI;AAC/B,MAAI,UAAU;AACZ,aAAS,OAAO,KAAK,WAAW,KAAK;AACrC,aAAS,eAAe;AACxB;EACF;AAEA,QAAM,IAAI,MAAM;IACd,aAAa,OAAO;IACpB,gBAAgB,WAAW;IAC3B,QAAQ,CAAC,WAAW,KAAK;IACzB,aAAa;GACd;AAGD,SAAO,KAAK,IAAI;AAClB;AAEA,SAAS,+BACP,OACA,qBAAgC;AAKhC,QAAM,SAAwC,CAAA;AAC9C,QAAM,UAA4D,CAAA;AAClE,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO;AAChC,UAAM,cACJ,KAAK,eAAe,KACnB,oBAAoB,IAAI,IAAI,KAAK,KAAK,eAAe,SAAS;AACjE,QAAI,CAAC,aAAa;AAChB,cAAQ,KAAK;QACX,aAAa,KAAK;QAClB,QAAQ,KAAK;OACd;AACD;IACF;AACA,UAAM,cAAc,GAAG,IAAI,IAAI,KAAK,OAAO,KAAK,GAAG,CAAC;AACpD,YAAQ,KAAK,EAAE,aAAa,KAAK,aAAa,QAAQ,CAAC,WAAW,EAAC,CAAE;AACrE,WAAO,KAAK;MACV,MAAM,GAAG,IAAI,MAAM,KAAK,WAAW;MACnC,IAAI,CAAC,WAAW;MAChB,QAAQ;MACR,YAAY;KACb;EACH;AACA,SAAO,EAAE,QAAQ,QAAO;AAC1B;AAEA,SAAS,qBACP,QACA,SAAyD;AAEzD,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW;AACpD,aAAW,UAAU,SAAS;AAC5B,WAAO,OAAO,OAAO,aAAa,GAAG,GAAG,OAAO,MAAM;EACvD;AACF;AAeM,SAAU,0BACd,MACA,WACA,sBAAmC,oBAAI,IAAG,GAC1C,sBAAmC,oBAAI,IAAG,GAAE;AAE5C,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAA,EAAE;EACtC;AAEA,QAAM,SAA4B,CAAA;AAClC,QAAM,QAAQ,oBAAI,IAAG;AACrB,MAAI,QAAQ;AACZ,SAAO,QAAQ,KAAK,QAAQ;AAC1B,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,UAAU,MAAM;AAClB,aAAO,KAAK,GAAG,KAAK,MAAM,KAAK,CAAC;AAChC;IACF;AAIA,QAAI,oBAAoB,IAAI,KAAK,GAAG;AAClC,cAAQ,uBAAuB,MAAM,OAAO,MAAM;AAClD;IACF;AACA,UAAM,SAAS,wBAAwB,KAAK;AAC5C,QAAI,CAAC,UAAU,CAAC,UAAU,IAAI,OAAO,IAAI,GAAG;AAC1C,aAAO,KAAK,KAAK;AACjB,eAAS;AACT;IACF;AAEA,UAAM,aAAa,uBACjB,MACA,OACA,QACA,mBAAmB;AAErB,QAAI,WAAW,UAAU,QAAW;AAElC,aAAO,KAAK,KAAK;AACjB,eAAS,WAAW;AACpB;IACF;AAEA,6BAAyB,OAAO,QAAQ,OAAO,MAAM;MACnD,gBAAgB,WAAW;MAC3B,OAAO,WAAW;KACnB;AACD,aAAS,WAAW;EACtB;AAIA,QAAM,EAAE,QAAQ,QAAO,IAAK,+BAC1B,OACA,mBAAmB;AAErB,uBAAqB,QAAQ,OAAO;AAEpC,SAAO,EAAE,MAAM,QAAoB,OAAM;AAC3C;AAGA,IAAM,qCAGF,oBAAI,IAAI;EACV,CAAC,SAAS,oBAAI,IAAI,CAAC,WAAW,OAAO,MAAM,CAAC,CAAC;EAC7C,CAAC,YAAY,oBAAI,IAAI,CAAC,WAAW,MAAM,CAAC,CAAC;CAC1C;AAGD,SAAS,kCACP,aACA,eAAgC;AAEhC,MAAI,gBAAgB,UAAU,cAAc,SAAS,GAAG;AACtD,WAAO;EACT;AACA,QAAM,MAAM,cAAc,cAAc,SAAS,CAAC;AAClD,QAAM,OAAO,cAAc,cAAc,SAAS,CAAC;AACnD,QAAM,OAAO,mCAAmC,IAAI,IAAI;AACxD,SAAO,SAAS,UAAa,KAAK,IAAI,GAAG;AAC3C;AAEA,SAAS,gCACP,aACA,eAAgC;AAEhC,SACE,gBAAgB,YAChB,kCAAkC,aAAa,aAAa;AAEhE;AAGM,SAAU,+BACd,MACA,aACA,OAAoC;AAEpC,MAAI,gBAAgB,QAAQ;AAC1B,WAAO;EACT;AACA,QAAM,SAAmB,CAAA;AACzB,MAAI,QAAQ;AACZ,SAAO,QAAQ,KAAK,QAAQ;AAC1B,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,UAAU,MAAM;AAClB,aAAO,KAAK,GAAG,KAAK,MAAM,KAAK,CAAC;AAChC,aAAO;IACT;AACA,UAAM,OAAO,mCAAmC,IAAI,KAAK;AACzD,UAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,IAAI;AACrC,QAAI,CAAC,QAAQ,OAAO,QAAQ,YAAY,CAAC,KAAK,IAAI,GAAG,GAAG;AACtD,aAAO,KAAK,KAAK;AACjB,eAAS;AACT;IACF;AACA,QAAI,SAAS,QAAQ;AACrB,WAAO,SAAS,KAAK,UAAU,CAAC,KAAK,MAAM,EAAE,WAAW,GAAG,GAAG;AAC5D,gBAAU;IACZ;AACA,QAAI,UAAU,QAAQ,OAAO,GAAG;AAC9B,aAAO,KAAK,KAAK;AACjB,eAAS;AACT;IACF;AACA,UAAM,QAAQ,KAAK,QAAQ,CAAC;AAC5B,UAAM,cAAc,GAAG,GAAG,IAAI,KAAK;AACnC,WAAO,KAAK,OAAO,WAAW;AAC9B,UAAM,KAAK;MACT,MAAM,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK;MAC9B,IAAI,CAAC,OAAO,WAAW;MACvB,QAAQ;MACR,YAAY;KACb;AACD,aAAS;EACX;AACA,SAAO;AACT;AAGM,SAAU,6BACd,MAAc;AAEd,QAAM,QAAuC,CAAA;AAC7C,QAAM,mBAAmB,qCAAqC,IAAI;AAClE,MACE,iBAAiB,WAAW,KAAK,UACjC,iBAAiB,KAAK,CAAC,OAAO,UAAU,UAAU,KAAK,KAAK,CAAC,GAC7D;AACA,UAAM,KAAK;MACT,MAAM,KAAK,KAAK,GAAG;MACnB,IAAI,CAAC,GAAG,gBAAgB;MACxB,QAAQ;MACR,YAAY;KACb;EACH;AACA,QAAM,kBAAkB,oBAAoB,kBAAkB,KAAK;AACnE,QAAM,cAAc,0BAA0B,eAAe;AAC7D,QAAM,kBAAkB,8BAA8B,eAAe;AACrE,QAAM,SAAS,gBAAgB,mBAAmB,WAAW;AAC7D,QAAM,iBAA2B,CAAA;AACjC,QAAM,mBAAmB,iCAAiC,eAAe;AACzE,WAAS,QAAQ,GAAG,QAAQ,gBAAgB,QAAQ,SAAS,GAAG;AAC9D,UAAM,QAAQ,gBAAgB,KAAK;AACnC,QAAI,UAAU,MAAM;AAClB,qBAAe,KAAK,GAAG,gBAAgB,MAAM,KAAK,CAAC;AACnD;IACF;AACA,UAAM,uBAAuB,iBAAiB,IAAI,KAAK;AACvD,UAAM,WAAW,eAAe,eAAe,SAAS,CAAC;AACzD,QAAI,MAAM,WAAW,IAAI,GAAG;AAC1B,YAAM,kBAAkB,yBACtB,OACA,QACA,oBAAoB;AAEtB,qBAAe,KAAK,GAAG,gBAAgB,MAAM;AAC7C,UAAI,gBAAgB,OAAO;AACzB,cAAM,KAAK,gBAAgB,KAAK;MAClC;AACA;IACF;AACA,UAAM,eAAe,uBAAuB,OAAO,oBAAoB;AACvE,QACE,gBACA,EAAE,OAAO,aAAa,YAAY,SAAS,WAAW,GAAG,MACzD,CAAC,gCAAgC,aAAa,cAAc,GAC5D;AACA,YAAM,aAAa,qBAAqB,aAAa,KAAK,MAAM;AAChE,UAAI,YAAY;AACd,cAAM,cAAc,CAAC,WAAW,MAAM,aAAa,KAAK;AACxD,uBAAe,KAAK,GAAG,WAAW;AAClC,cAAM,KAAK;UACT,MAAM;UACN,IAAI;UACJ,QAAQ;UACR,YAAY,WAAW;SACxB;AACD;MACF;IACF;AACA,mBAAe,KAAK,KAAK;EAC3B;AACA,QAAM,uBAAuB,+BAC3B,gBACA,aACA,KAAK;AAEP,QAAM,YAAY,0BAChB,sBACA,OAAO,oBACP,8BACA,gBAAgB,WAAW,oBAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,oBAAI,IAAG,CAAE;AAE5D,aAAW,SAAS,UAAU,QAAQ;AACpC,UAAM,KAAK,KAAK;EAClB;AACA,SAAO;IACL,MAAM,UAAU;IAChB;IACA;;AAEJ;AAEA,SAAS,8BAA8B,MAAc;AACnD,QAAM,WAAW,2BAA2B,IAAI;AAChD,QAAM,QAAQ,SAAS,CAAC,GAAG,KAAI,EAAG,YAAW;AAC7C,QAAM,SAAS,SAAS,CAAC,GAAG,KAAI,EAAG,YAAW;AAC9C,OACG,UAAU,eAAe,UAAU,aAAa,UAAU,eAC3D,OAAO,WAAW,YAClB,OAAO,SAAS,KAChB,CAAC,OAAO,WAAW,GAAG,GACtB;AACA,WAAO,GAAG,KAAK,IAAI,MAAM;EAC3B;AACA,SAAO;AACT;AAGM,SAAU,wBAAwB,MAAc;AACpD,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,UAAU,MAAM;AAClB;IACF;AACA,QAAI,UAAU,UAAU;AACtB,YAAM,YAAY,KAAK,QAAQ,CAAC;AAChC,UAAI,OAAO,cAAc,YAAY,UAAU,KAAI,EAAG,SAAS,GAAG;AAChE,eAAO,UAAU,KAAI;MACvB;AACA;IACF;AACA,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,YAAM,YAAY,MAAM,MAAM,UAAU,MAAM,EAAE,KAAI;AACpD,UAAI,UAAU,SAAS,GAAG;AACxB,eAAO;MACT;IACF;EACF;AACA,SAAO;AACT;;;;;;;;;;ACrnCM,SAAU,8BACd,QAA0B;AAE1B,MAAI,WAAW,QAAW;AACxB,WAAO,MAAK;IAAE;EAChB;AACA,QAAM,mBAAmB,OAAO,KAAI;AACpC,MAAI,iBAAiB,WAAW,GAAG;AACjC,UAAM,IAAI,WACR,wCACA,UAAU,OACV;MACE,MAAM;MACN,WAAW,CAAC,wDAAwD;KACrE;EAEL;AACA,QAAM,iBAAiB,QAAQ,IAAI;AACnC,UAAQ,IAAI,YAAY;AACxB,MAAI,WAAW;AACf,SAAO,MAAK;AACV,QAAI,UAAU;AACZ;IACF;AACA,eAAW;AACX,QAAI,mBAAmB,QAAW;AAChC,aAAO,QAAQ,IAAI;IACrB,OAAO;AACL,cAAQ,IAAI,YAAY;IAC1B;EACF;AACF;;;ACnCA,SAAS,eAAe;;;;;;;;AAIlB,SAAU,mBAAmB,SAAe;AAChD,SAAO,IAAI,QAAO,EACf,KAAK,IAAI,EACT,YACC,kHAAkH,EAEnH,QAAQ,OAAO,EACf,mBAAmB,KAAK,EACxB,qBAAqB,KAAK,EAC1B,mBAAmB,KAAK,EACxB,gBAAgB;IACf,UAAU,CAAC,UAAS;AAClB,kBAAY,KAAK;IACnB;IACA,UAAU,MAAK;IAAE;GAClB,EACA,OAAO,UAAU,6BAA6B,EAC9C,OAAO,UAAU,iDAAiD,EAClE,OAAO,WAAW,wBAAwB,EAC1C,OACC,uBACA,gFAAgF,EAEjF,OACC,yBACA,oEAAoE,EAErE,OACC,aACA,0DAA0D,EAE3D,OACC,mBACA,wEAAwE,EAEzE,OACC,gBACA,gGAAgG,EAEjG,OAAO,mBAAmB,2BAA2B,EACrD,OAAO,cAAc,oDAAoD,EACzE,OACC,aACA,uDAAuD,EAExD,OAAO,aAAa,wCAAwC,EAC5D,OAAO,iBAAiB,8CAA8C,EACtE,aAAY;AACjB;",
|
|
6
|
-
"names": ["commandPathTokens"]
|
|
7
|
-
}
|