@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/merge/three-way.ts", "../../../../../../../../sdk/merge/driver.ts", "../../../../../../../../sdk/structured-mutations.ts", "../../../../../../../../sdk/item-transaction.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @module sdk/merge/three-way\n *\n * Field-aware three-way merge primitives for every mergeable tracker artifact\n * class: append-only history JSONL streams, item documents (TOON or\n * JSON+Markdown), and key-level JSON configuration/schema files. These\n * primitives are pure (content in, content out) so the CLI merge driver, the\n * MCP surface, and package integrations all share one merge semantics\n * definition for multi-branch agent workflows.\n */\nimport {\n historyEntriesToRaw,\n reanchorHistoryEntries,\n} from \"../../core/history/replay.js\";\nimport {\n canonicalDocument,\n parseItemDocument,\n serializeItemDocument,\n type ItemDocumentFormatOptions,\n} from \"../../core/item/item-format.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport { findFirstMergeConflictMarker } from \"../../core/shared/conflict-markers.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { stableStringify } from \"../../core/shared/serialization.js\";\nimport { compareTimestampStrings } from \"../../core/shared/time.js\";\nimport type {\n HistoryEntry,\n ItemDocument,\n ItemMetadata,\n} from \"../../types/index.js\";\n\n/** Restricts which side of a three-way merge wins an unresolvable conflict. */\nexport type MergePreferredSide = \"ours\" | \"theirs\";\n\n/** Restricts the strategy labels reported by the history stream merge. */\nexport type HistoryMergeStrategy =\n | \"identical\"\n | \"fast_forward_ours\"\n | \"fast_forward_theirs\"\n | \"union_reanchor\";\n\n/** Documents the history stream merge result payload exchanged by command, SDK, and package integrations. */\nexport interface HistoryMergeResult {\n /** Merged JSONL content ready to be written as the resolved history stream. */\n merged: string;\n /** Strategy the merge used: identical inputs, one-sided fast-forward, or a deterministic union with a re-anchored hash chain. */\n strategy: HistoryMergeStrategy;\n /** Number of entries shared by both sides before their streams diverged. */\n common_entries: number;\n /** Number of divergent entries contributed by the ours side. */\n entries_from_ours: number;\n /** Number of divergent entries contributed by the theirs side. */\n entries_from_theirs: number;\n /** Total entries in the merged stream. */\n entries_total: number;\n /** Whether the merged chain required hash re-anchoring (true for every union merge). */\n reanchored: boolean;\n}\n\nfunction parseHistoryJsonl(raw: string, label: string): HistoryEntry[] {\n const conflictMarker = findFirstMergeConflictMarker(raw);\n if (conflictMarker) {\n throw new PmCliError(\n `History merge input (${label}) contains unresolved conflict markers at line ${conflictMarker.line}. Merge drivers must receive clean per-side versions.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n const entries: HistoryEntry[] = [];\n for (const [index, rawLine] of raw.split(/\\r?\\n/).entries()) {\n const line = rawLine.trim();\n if (!line) {\n continue;\n }\n try {\n const parsed = JSON.parse(line) as unknown;\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new TypeError(\"history entry must be an object\");\n }\n entries.push(parsed as HistoryEntry);\n } catch {\n throw new PmCliError(\n `History merge input (${label}) contains invalid JSON at line ${index + 1}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n }\n return entries;\n}\n\nfunction historyEntryIdentity(entry: HistoryEntry): string {\n return stableStringify({\n ts: entry.ts,\n author: entry.author,\n op: entry.op,\n patch: entry.patch,\n message: entry.message ?? null,\n });\n}\n\nfunction commonHistoryPrefixLength(\n ours: HistoryEntry[],\n theirs: HistoryEntry[],\n): number {\n const limit = Math.min(ours.length, theirs.length);\n let shared = 0;\n while (\n shared < limit &&\n historyEntryIdentity(ours[shared]) === historyEntryIdentity(theirs[shared])\n ) {\n shared += 1;\n }\n return shared;\n}\n\n/**\n * Deterministically merge two diverged versions of one append-only history\n * JSONL stream. Identical streams and one-sided fast-forwards keep the winning\n * side byte-for-byte; genuinely diverged streams are merged as the shared\n * prefix plus both suffixes ordered by timestamp (ours-first on ties), then\n * hash re-anchored so the resulting chain verifies again. No side's events are\n * ever discarded: content divergence is preserved for the post-merge\n * reconciliation pass (`pm validate` + `pm history-repair`) instead of being\n * silently resolved by last-writer-wins.\n */\nexport function mergeHistoryStreams(\n baseRaw: string,\n oursRaw: string,\n theirsRaw: string,\n): HistoryMergeResult {\n parseHistoryJsonl(baseRaw, \"base\");\n const ours = parseHistoryJsonl(oursRaw, \"ours\");\n const theirs = parseHistoryJsonl(theirsRaw, \"theirs\");\n const shared = commonHistoryPrefixLength(ours, theirs);\n\n if (shared === ours.length && shared === theirs.length) {\n return {\n merged: historyEntriesToRaw(ours),\n strategy: \"identical\",\n common_entries: shared,\n entries_from_ours: 0,\n entries_from_theirs: 0,\n entries_total: ours.length,\n reanchored: false,\n };\n }\n if (shared === theirs.length) {\n return {\n merged: historyEntriesToRaw(ours),\n strategy: \"fast_forward_ours\",\n common_entries: shared,\n entries_from_ours: ours.length - shared,\n entries_from_theirs: 0,\n entries_total: ours.length,\n reanchored: false,\n };\n }\n if (shared === ours.length) {\n return {\n merged: historyEntriesToRaw(theirs),\n strategy: \"fast_forward_theirs\",\n common_entries: shared,\n entries_from_ours: 0,\n entries_from_theirs: theirs.length - shared,\n entries_total: theirs.length,\n reanchored: false,\n };\n }\n\n const oursSuffix = ours.slice(shared);\n const seenIdentities = new Set(oursSuffix.map(historyEntryIdentity));\n const theirsSuffix = theirs\n .slice(shared)\n .filter((entry) => !seenIdentities.has(historyEntryIdentity(entry)));\n const mergedSuffix = [...oursSuffix, ...theirsSuffix].sort((left, right) => {\n const byTs = compareTimestampStrings(left.ts, right.ts);\n if (byTs !== 0) {\n return byTs;\n }\n const leftFromOurs = seenIdentities.has(historyEntryIdentity(left));\n const rightFromOurs = seenIdentities.has(historyEntryIdentity(right));\n if (leftFromOurs !== rightFromOurs) {\n return Number(rightFromOurs) - Number(leftFromOurs);\n }\n return historyEntryIdentity(left).localeCompare(historyEntryIdentity(right));\n });\n const reanchored = reanchorHistoryEntries([\n ...ours.slice(0, shared),\n ...mergedSuffix,\n ]);\n return {\n merged: historyEntriesToRaw(reanchored.entries),\n strategy: \"union_reanchor\",\n common_entries: shared,\n entries_from_ours: oursSuffix.length,\n entries_from_theirs: theirsSuffix.length,\n entries_total: reanchored.entries.length,\n reanchored: true,\n };\n}\n\n/** Documents the relationship event stream merge result payload exchanged by command, SDK, and package integrations. */\nexport interface RelationshipStreamMergeResult {\n /** Merged JSONL content with consecutively renumbered `sequence` values, ready to be written as the resolved event store. */\n merged: string;\n /** Strategy the merge used: identical inputs, one-sided fast-forward, or a deterministic union with renumbered sequences. */\n strategy: HistoryMergeStrategy;\n /** Number of events shared by both sides before their streams diverged. */\n common_entries: number;\n /** Number of divergent events contributed by the ours side. */\n entries_from_ours: number;\n /** Number of divergent events contributed by the theirs side. */\n entries_from_theirs: number;\n /** Total events in the merged stream. */\n entries_total: number;\n /** Whether merged events required sequence renumbering (true for every union merge). */\n reanchored: boolean;\n}\n\ninterface RelationshipStreamEvent {\n /** Globally unique event identity used for prefix detection and suffix deduplication. */\n eventId: string;\n /** One-based append sequence; rewritten consecutively in the merged stream. */\n sequence: number;\n /** ISO timestamp used to order divergent suffixes deterministically. */\n timestamp?: string;\n /** Remaining event payload fields, preserved verbatim. */\n [key: string]: unknown;\n}\n\nfunction parseRelationshipJsonl(\n raw: string,\n label: string,\n): RelationshipStreamEvent[] {\n const conflictMarker = findFirstMergeConflictMarker(raw);\n if (conflictMarker) {\n throw new PmCliError(\n `Relationship merge input (${label}) contains unresolved conflict markers at line ${conflictMarker.line}. Merge drivers must receive clean per-side versions.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n const events: RelationshipStreamEvent[] = [];\n for (const [index, rawLine] of raw.split(/\\r?\\n/).entries()) {\n const line = rawLine.trim();\n if (!line) {\n continue;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(line) as unknown;\n } catch {\n throw new PmCliError(\n `Relationship merge input (${label}) contains invalid JSON at line ${index + 1}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed) ||\n typeof (parsed as { eventId?: unknown }).eventId !== \"string\" ||\n typeof (parsed as { sequence?: unknown }).sequence !== \"number\"\n ) {\n throw new PmCliError(\n `Relationship merge input (${label}) line ${index + 1} is not a relationship event (eventId + sequence required).`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n events.push(parsed as RelationshipStreamEvent);\n }\n return events;\n}\n\nfunction relationshipEventsToRaw(events: RelationshipStreamEvent[]): string {\n return events.length === 0\n ? \"\"\n : `${events.map((event) => JSON.stringify(event)).join(\"\\n\")}\\n`;\n}\n\nfunction renumberRelationshipEvents(\n events: RelationshipStreamEvent[],\n): RelationshipStreamEvent[] {\n return events.map((event, index) => ({ ...event, sequence: index + 1 }));\n}\n\n/**\n * Deterministically merge two diverged versions of one append-only\n * relationship event JSONL store. The store's loader enforces strictly\n * consecutive one-based `sequence` values, so a plain text union of two\n * diverged streams is always unreadable; this merge keeps the shared prefix,\n * unions both divergent suffixes by `eventId` (ordered by event timestamp,\n * ours-first on ties), and renumbers every merged sequence consecutively so\n * the resulting stream loads again. No side's events are ever discarded.\n */\nexport function mergeRelationshipEventStreams(\n baseRaw: string,\n oursRaw: string,\n theirsRaw: string,\n): RelationshipStreamMergeResult {\n parseRelationshipJsonl(baseRaw, \"base\");\n const ours = parseRelationshipJsonl(oursRaw, \"ours\");\n const theirs = parseRelationshipJsonl(theirsRaw, \"theirs\");\n const limit = Math.min(ours.length, theirs.length);\n let shared = 0;\n while (shared < limit && ours[shared].eventId === theirs[shared].eventId) {\n shared += 1;\n }\n\n if (shared === ours.length && shared === theirs.length) {\n return {\n merged: relationshipEventsToRaw(ours),\n strategy: \"identical\",\n common_entries: shared,\n entries_from_ours: 0,\n entries_from_theirs: 0,\n entries_total: ours.length,\n reanchored: false,\n };\n }\n if (shared === theirs.length) {\n return {\n merged: relationshipEventsToRaw(ours),\n strategy: \"fast_forward_ours\",\n common_entries: shared,\n entries_from_ours: ours.length - shared,\n entries_from_theirs: 0,\n entries_total: ours.length,\n reanchored: false,\n };\n }\n if (shared === ours.length) {\n return {\n merged: relationshipEventsToRaw(theirs),\n strategy: \"fast_forward_theirs\",\n common_entries: shared,\n entries_from_ours: 0,\n entries_from_theirs: theirs.length - shared,\n entries_total: theirs.length,\n reanchored: false,\n };\n }\n\n const oursSuffix = ours.slice(shared);\n const oursEventIds = new Set(oursSuffix.map((event) => event.eventId));\n const theirsSuffix = theirs\n .slice(shared)\n .filter((event) => !oursEventIds.has(event.eventId));\n const mergedSuffix = [...oursSuffix, ...theirsSuffix].sort((left, right) => {\n if (left.timestamp !== undefined && right.timestamp !== undefined) {\n const byTs = compareTimestampStrings(left.timestamp, right.timestamp);\n if (byTs !== 0) {\n return byTs;\n }\n } else if (left.timestamp === undefined && right.timestamp !== undefined) {\n return 1;\n } else if (left.timestamp !== undefined) {\n return -1;\n }\n const leftFromOurs = oursEventIds.has(left.eventId);\n const rightFromOurs = oursEventIds.has(right.eventId);\n if (leftFromOurs !== rightFromOurs) {\n return Number(rightFromOurs) - Number(leftFromOurs);\n }\n // Array.prototype.sort is stable: returning zero preserves each side's\n // original append order when its events share a timestamp.\n return 0;\n });\n const merged = renumberRelationshipEvents([\n ...ours.slice(0, shared),\n ...mergedSuffix,\n ]);\n return {\n merged: relationshipEventsToRaw(merged),\n strategy: \"union_reanchor\",\n common_entries: shared,\n entries_from_ours: oursSuffix.length,\n entries_from_theirs: theirsSuffix.length,\n entries_total: merged.length,\n reanchored: true,\n };\n}\n\n/**\n * Item metadata collections merged by element-identity set semantics instead\n * of whole-field three-way comparison: concurrent commutative appends from two\n * branches (notes on A, tags on B, a test run on each) must merge cleanly.\n * Element identity is the stable serialization of the normalized element, so\n * an element edited on one side counts as remove-old + add-new and both sides'\n * contributions survive. Plan collections are deliberately excluded: plan\n * steps carry cross-element ordering invariants that set-union would corrupt,\n * so they stay under scalar three-way semantics with explicit conflicts.\n */\nexport const ITEM_UNION_COLLECTION_FIELDS = [\n \"tags\",\n \"dependencies\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"files\",\n \"tests\",\n \"test_runs\",\n \"docs\",\n \"reminders\",\n \"events\",\n] as const;\n\n/** Item metadata fields resolved by deterministic latest-timestamp-wins instead of three-way conflict, so disjoint-field edits never conflict on the shared freshness scalar every mutation rewrites. */\nexport const ITEM_LATEST_TIMESTAMP_FIELDS = [\"updated_at\"] as const;\n\n/** Documents the item document merge result payload exchanged by command, SDK, and package integrations. */\nexport interface ItemDocumentMergeResult {\n /** Serialized merged item document (always parseable; count headers recomputed by canonical serialization). */\n merged: string;\n /** Metadata fields (plus `body`) where both sides changed to different values; resolved toward the preferred side. */\n conflict_fields: string[];\n /** Fields taken from the theirs side by clean three-way resolution. */\n fields_from_theirs: string[];\n /** Collection fields that merged by element-identity union. */\n union_fields: string[];\n /** Which side unresolvable conflicts were resolved toward. */\n preferred: MergePreferredSide;\n}\n\nfunction jsonEquals(left: unknown, right: unknown): boolean {\n return stableStringify(left ?? null) === stableStringify(right ?? null);\n}\n\nfunction unionCollection(\n base: unknown,\n ours: unknown,\n theirs: unknown,\n): unknown[] {\n const toEntries = (value: unknown): unknown[] =>\n Array.isArray(value) ? value : [];\n const baseIds = new Set(toEntries(base).map((entry) => stableStringify(entry)));\n const oursEntries = toEntries(ours);\n const oursIds = new Set(oursEntries.map((entry) => stableStringify(entry)));\n const theirsEntries = toEntries(theirs);\n const theirsIds = new Set(\n theirsEntries.map((entry) => stableStringify(entry)),\n );\n const merged = oursEntries.filter((entry) => {\n const identity = stableStringify(entry);\n // An element kept by ours survives unless theirs deleted it (present in\n // base, absent from theirs).\n return !baseIds.has(identity) || theirsIds.has(identity);\n });\n for (const entry of theirsEntries) {\n const identity = stableStringify(entry);\n if (!oursIds.has(identity) && !baseIds.has(identity)) {\n merged.push(entry);\n }\n }\n return merged;\n}\n\nfunction latestTimestamp(ours: unknown, theirs: unknown): unknown {\n return compareTimestampStrings(String(ours), String(theirs)) >= 0\n ? ours\n : theirs;\n}\n\ninterface ScalarMergeOutcome {\n value: unknown;\n from_theirs: boolean;\n conflict: boolean;\n}\n\nfunction mergeScalarThreeWay(\n base: unknown,\n ours: unknown,\n theirs: unknown,\n preferred: MergePreferredSide,\n): ScalarMergeOutcome {\n if (jsonEquals(ours, theirs)) {\n return { value: ours, from_theirs: false, conflict: false };\n }\n if (jsonEquals(base, ours)) {\n return { value: theirs, from_theirs: true, conflict: false };\n }\n if (jsonEquals(base, theirs)) {\n return { value: ours, from_theirs: false, conflict: false };\n }\n return {\n value: preferred === \"theirs\" ? theirs : ours,\n from_theirs: preferred === \"theirs\",\n conflict: true,\n };\n}\n\nfunction toMetadataRecord(document: ItemDocument): Record<string, unknown> {\n return { ...(document.metadata as unknown as Record<string, unknown>) };\n}\n\nfunction parseItemMergeSide(\n raw: string,\n label: string,\n options: ItemDocumentFormatOptions,\n): ItemDocument {\n try {\n return canonicalDocument(parseItemDocument(raw, options), options);\n } catch (error) {\n throw new PmCliError(\n `Item merge input (${label}) is not a readable item document: ${String(error)}`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n}\n\ninterface ItemMetadataMergeAccumulator {\n /** Merged metadata values keyed by canonical field name. */\n merged: Record<string, unknown>;\n /** Scalar fields where both sides diverged from the base. */\n conflictFields: string[];\n /** Scalar fields cleanly selected from the other branch. */\n fieldsFromTheirs: string[];\n /** Collection fields whose final union differs from ours. */\n unionFields: string[];\n}\n\nfunction mergeItemMetadataRecords(\n baseRecord: Record<string, unknown>,\n oursRecord: Record<string, unknown>,\n theirsRecord: Record<string, unknown>,\n preferred: MergePreferredSide,\n): ItemMetadataMergeAccumulator {\n const unionFieldSet = new Set<string>(ITEM_UNION_COLLECTION_FIELDS);\n const latestFieldSet = new Set<string>(ITEM_LATEST_TIMESTAMP_FIELDS);\n const fieldNames = [\n ...new Set([...Object.keys(oursRecord), ...Object.keys(theirsRecord)]),\n ].sort((left, right) => left.localeCompare(right));\n const accumulator: ItemMetadataMergeAccumulator = {\n merged: {},\n conflictFields: [],\n fieldsFromTheirs: [],\n unionFields: [],\n };\n\n for (const field of fieldNames) {\n const baseValue = baseRecord[field];\n const oursValue = oursRecord[field];\n const theirsValue = theirsRecord[field];\n if (unionFieldSet.has(field)) {\n const union = unionCollection(baseValue, oursValue, theirsValue);\n // `fieldNames` is derived from both records' own keys, so a collection\n // reached here is declared by at least one side. Preserve even an empty\n // result (`tags` is required) so serialization never drops it.\n accumulator.merged[field] = union;\n if (!jsonEquals(union, oursValue)) {\n accumulator.unionFields.push(field);\n }\n continue;\n }\n if (latestFieldSet.has(field)) {\n accumulator.merged[field] = latestTimestamp(oursValue, theirsValue);\n continue;\n }\n const outcome = mergeScalarThreeWay(\n baseValue,\n oursValue,\n theirsValue,\n preferred,\n );\n if (outcome.value !== undefined) {\n accumulator.merged[field] = outcome.value;\n }\n if (outcome.conflict) {\n accumulator.conflictFields.push(field);\n } else if (outcome.from_theirs) {\n accumulator.fieldsFromTheirs.push(field);\n }\n }\n return accumulator;\n}\n\n/**\n * Field-aware three-way merge of one tracker item document. Commutative\n * collections (notes, tags, tests, ...) union by element identity so\n * concurrent appends never conflict; `updated_at` resolves to the latest\n * timestamp so disjoint-field edits never collide on the shared freshness\n * scalar; every other metadata field and the body use classic three-way\n * resolution. Unresolvable both-sides-changed conflicts are resolved toward\n * the preferred side but reported in `conflict_fields`, and the merged output\n * is always canonically serialized — count-prefixed TOON array headers are\n * recomputed, so the hand-resolution corruption class (stale `notes[N]`\n * headers) cannot be produced by this merge.\n */\nexport function mergeItemDocuments(\n baseRaw: string,\n oursRaw: string,\n theirsRaw: string,\n options: ItemDocumentFormatOptions & {\n /** Side that wins unresolvable conflicts (default \"ours\"). */\n preferred?: MergePreferredSide;\n } = {},\n): ItemDocumentMergeResult {\n const preferred: MergePreferredSide = options.preferred ?? \"ours\";\n // An empty base means both branches created the file independently\n // (add/add); three-way falls back to treating every differing field as an\n // ours/theirs decision, which the scalar resolver already models.\n const hasBase = baseRaw.trim().length > 0;\n const ours = parseItemMergeSide(oursRaw, \"ours\", options);\n const theirs = parseItemMergeSide(theirsRaw, \"theirs\", options);\n const base = hasBase ? parseItemMergeSide(baseRaw, \"base\", options) : ours;\n\n const baseRecord = hasBase\n ? toMetadataRecord(base)\n : ({} as Record<string, unknown>);\n const oursRecord = toMetadataRecord(ours);\n const theirsRecord = toMetadataRecord(theirs);\n const { merged, conflictFields, fieldsFromTheirs, unionFields } =\n mergeItemMetadataRecords(baseRecord, oursRecord, theirsRecord, preferred);\n\n const bodyOutcome = mergeScalarThreeWay(\n hasBase ? base.body : \"\",\n ours.body,\n theirs.body,\n preferred,\n );\n if (bodyOutcome.conflict) {\n conflictFields.push(\"body\");\n } else if (bodyOutcome.from_theirs) {\n fieldsFromTheirs.push(\"body\");\n }\n\n const mergedRaw = serializeItemDocument(\n {\n metadata: merged as unknown as ItemMetadata,\n body: bodyOutcome.value as string,\n },\n options,\n );\n return {\n merged: mergedRaw,\n conflict_fields: conflictFields,\n fields_from_theirs: fieldsFromTheirs,\n union_fields: unionFields,\n preferred,\n };\n}\n\n/** Documents the JSON document merge result payload exchanged by command, SDK, and package integrations. */\nexport interface JsonDocumentMergeResult {\n /** Serialized merged JSON document (two-space indent, trailing newline — the tracker's canonical config style). */\n merged: string;\n /** Dotted key paths where both sides changed to different values; resolved toward the preferred side. */\n conflict_paths: string[];\n /** Dotted key paths taken from the theirs side by clean three-way resolution. */\n paths_from_theirs: string[];\n /** Which side unresolvable conflicts were resolved toward. */\n preferred: MergePreferredSide;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value)\n );\n}\n\nfunction parseJsonSide(raw: string, label: string): unknown {\n const conflictMarker = findFirstMergeConflictMarker(raw);\n if (conflictMarker) {\n throw new PmCliError(\n `JSON merge input (${label}) contains unresolved conflict markers at line ${conflictMarker.line}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n if (raw.trim().length === 0) {\n return undefined;\n }\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n throw new PmCliError(\n `JSON merge input (${label}) is not valid JSON.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n}\n\nfunction mergeJsonValue(\n base: unknown,\n ours: unknown,\n theirs: unknown,\n preferred: MergePreferredSide,\n pathPrefix: string,\n conflictPaths: string[],\n pathsFromTheirs: string[],\n): unknown {\n if (jsonEquals(ours, theirs)) {\n return ours;\n }\n if (isPlainObject(ours) && isPlainObject(theirs)) {\n const baseObject = isPlainObject(base) ? base : {};\n const merged: Record<string, unknown> = {};\n const keys = [\n ...new Set([...Object.keys(ours), ...Object.keys(theirs)]),\n ].sort((left, right) => left.localeCompare(right));\n for (const key of keys) {\n const childPath = pathPrefix.length > 0 ? `${pathPrefix}.${key}` : key;\n const child = mergeJsonKey(\n baseObject,\n ours,\n theirs,\n key,\n preferred,\n childPath,\n conflictPaths,\n pathsFromTheirs,\n );\n if (child !== undefined) {\n merged[key] = child;\n }\n }\n return merged;\n }\n const outcome = mergeScalarThreeWay(base, ours, theirs, preferred);\n if (outcome.conflict) {\n conflictPaths.push(pathPrefix);\n } else if (outcome.from_theirs) {\n pathsFromTheirs.push(pathPrefix);\n }\n return outcome.value;\n}\n\nfunction mergeJsonKey(\n base: Record<string, unknown>,\n ours: Record<string, unknown>,\n theirs: Record<string, unknown>,\n key: string,\n preferred: MergePreferredSide,\n childPath: string,\n conflictPaths: string[],\n pathsFromTheirs: string[],\n): unknown {\n const inOurs = Object.prototype.hasOwnProperty.call(ours, key);\n const inTheirs = Object.prototype.hasOwnProperty.call(theirs, key);\n const inBase = Object.prototype.hasOwnProperty.call(base, key);\n if (inOurs && inTheirs) {\n return mergeJsonValue(\n base[key],\n ours[key],\n theirs[key],\n preferred,\n childPath,\n conflictPaths,\n pathsFromTheirs,\n );\n }\n if (inOurs) {\n // Present only in ours: either ours added it (keep) or theirs deleted it\n // (honor the delete when ours left it untouched from base).\n if (inBase && jsonEquals(base[key], ours[key])) {\n pathsFromTheirs.push(childPath);\n return undefined;\n }\n if (inBase) {\n conflictPaths.push(childPath);\n return preferred === \"theirs\" ? undefined : ours[key];\n }\n return ours[key];\n }\n // Present only in theirs (mirror of the branch above).\n if (inBase && jsonEquals(base[key], theirs[key])) {\n return undefined;\n }\n if (inBase) {\n conflictPaths.push(childPath);\n return preferred === \"theirs\" ? theirs[key] : undefined;\n }\n pathsFromTheirs.push(childPath);\n return theirs[key];\n}\n\n/**\n * Key-level three-way merge for the tracker's single-file JSON configuration\n * artifacts (`settings.json`, `schema/*.json`). Nested objects merge\n * recursively per key so two branches editing disjoint settings never\n * conflict; both-sides-changed leaf values resolve toward the preferred side\n * and are reported in `conflict_paths`. The output is always valid JSON, so a\n * merged configuration can never regress into the silent-defaults fallback\n * that raw conflict markers cause.\n */\nexport function mergeJsonDocuments(\n baseRaw: string,\n oursRaw: string,\n theirsRaw: string,\n options: {\n /** Side that wins unresolvable conflicts (default \"ours\"). */\n preferred?: MergePreferredSide;\n } = {},\n): JsonDocumentMergeResult {\n const preferred: MergePreferredSide = options.preferred ?? \"ours\";\n const base = parseJsonSide(baseRaw, \"base\");\n const ours = parseJsonSide(oursRaw, \"ours\");\n const theirs = parseJsonSide(theirsRaw, \"theirs\");\n const conflictPaths: string[] = [];\n const pathsFromTheirs: string[] = [];\n const merged = mergeJsonValue(\n base,\n ours,\n theirs,\n preferred,\n \"\",\n conflictPaths,\n pathsFromTheirs,\n );\n return {\n merged: `${JSON.stringify(merged ?? null, null, 2)}\\n`,\n conflict_paths: conflictPaths,\n paths_from_theirs: pathsFromTheirs,\n preferred,\n };\n}\n", "/**\n * @module sdk/merge/driver\n *\n * File-level git merge driver runner for tracker artifacts. Git invokes the\n * driver with the base (%O), ours (%A), and theirs (%B) temporary files; the\n * driver writes the merged content back to the ours path and reports whether\n * unresolvable conflicts remain. Conflicted artifacts are still written as\n * parseable documents (resolved toward the preferred side) so a conflicted\n * merge never corrupts tracker storage the way raw conflict markers do.\n */\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { getActiveExtensionRegistrations } from \"../../core/extensions/index.js\";\nimport { collectRegisteredItemFieldNames } from \"../../core/extensions/item-fields.js\";\nimport { pathExists } from \"../../core/fs/fs-utils.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 { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemFormat, PmSettings } from \"../../types/index.js\";\nimport {\n mergeHistoryStreams,\n mergeItemDocuments,\n mergeJsonDocuments,\n mergeRelationshipEventStreams,\n type MergePreferredSide,\n} from \"./three-way.js\";\n\n/** Supported values accepted by the merge driver artifact contract across CLI, SDK, and MCP surfaces. */\nexport const MERGE_DRIVER_ARTIFACT_VALUES = [\n \"item\",\n \"history\",\n \"relationship\",\n \"json\",\n] as const;\n/** Restricts merge driver artifact values accepted by command, SDK, and storage contracts. */\nexport type MergeDriverArtifact = (typeof MERGE_DRIVER_ARTIFACT_VALUES)[number];\n\n/** Documents the merge driver options payload exchanged by command, SDK, and package integrations. */\nexport interface MergeDriverOptions {\n /** Artifact class being merged: item document, history JSONL stream, relationship event JSONL store, or key-level JSON config. */\n artifact: string;\n /** Path to the common-ancestor version (git %O). */\n basePath: string;\n /** Path to the current-branch version (git %A); also the default output path per the git merge-driver protocol. */\n oursPath: string;\n /** Path to the other-branch version (git %B). */\n theirsPath: string;\n /** Optional explicit output path overriding the git default of writing to the ours path. */\n outputPath?: string;\n /** Original repository-relative item path supplied by Git as `%P`, used to detect item format when temporary side paths lack extensions. */\n itemPath?: string;\n /** Side that wins unresolvable conflicts (default \"ours\"). */\n prefer?: string;\n}\n\n/** Documents the merge driver result payload exchanged by command, SDK, and package integrations. */\nexport interface MergeDriverResult {\n /** Whether the merge completed without unresolvable conflicts. */\n ok: boolean;\n /** Artifact class that was merged. */\n artifact: MergeDriverArtifact;\n /** Path the merged content was written to. */\n output_path: string;\n /** Side unresolvable conflicts were resolved toward. */\n preferred: MergePreferredSide;\n /** Unresolvable conflict labels: metadata field names (item), dotted key paths (json). Empty for history merges. */\n conflicts: string[];\n /** History-merge strategy and entry accounting; present only for the history artifact. */\n history?: {\n strategy: string;\n common_entries: number;\n entries_from_ours: number;\n entries_from_theirs: number;\n entries_total: number;\n reanchored: boolean;\n };\n /** Relationship-event-merge strategy and accounting; present only for the relationship artifact. */\n relationship?: {\n strategy: string;\n common_entries: number;\n entries_from_ours: number;\n entries_from_theirs: number;\n entries_total: number;\n reanchored: boolean;\n };\n /** Item-merge field accounting; present only for the item artifact. */\n item?: {\n fields_from_theirs: string[];\n union_fields: string[];\n };\n /** JSON-merge key accounting; present only for the json artifact. */\n json?: {\n paths_from_theirs: string[];\n };\n /** Guidance for resolving remaining conflicts or verifying the merged workspace. */\n guidance: string[];\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\nfunction resolveArtifact(value: string): MergeDriverArtifact {\n const normalized = value.trim().toLowerCase();\n if (\n (MERGE_DRIVER_ARTIFACT_VALUES as readonly string[]).includes(normalized)\n ) {\n return normalized as MergeDriverArtifact;\n }\n throw new PmCliError(\n `Unknown merge artifact \"${value}\". Supported values: ${MERGE_DRIVER_ARTIFACT_VALUES.join(\", \")}.`,\n EXIT_CODE.USAGE,\n );\n}\n\nfunction resolvePreferredSide(value: string | undefined): MergePreferredSide {\n if (value === undefined) {\n return \"ours\";\n }\n const normalized = value.trim().toLowerCase();\n if (normalized === \"ours\" || normalized === \"theirs\") {\n return normalized;\n }\n throw new PmCliError(\n `Unknown --prefer value \"${value}\". Supported values: ours, theirs.`,\n EXIT_CODE.USAGE,\n );\n}\n\nasync function readSideFile(filePath: string, label: string): Promise<string> {\n try {\n return await readFile(filePath, \"utf8\");\n } catch {\n throw new PmCliError(\n `Cannot read merge ${label} file at ${filePath}.`,\n EXIT_CODE.NOT_FOUND,\n );\n }\n}\n\n/**\n * Load the workspace settings when a tracker is initialized at the resolved pm\n * root, or fall back to format defaults when the driver runs outside a tracker\n * (git can invoke merge drivers before `pm init`, e.g. while rebasing the\n * commit that introduces the tracker).\n */\nasync function loadOptionalSettings(\n global: GlobalOptions,\n): Promise<PmSettings | null> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n return null;\n }\n return readSettings(pmRoot);\n}\n\nfunction itemFormatForPath(\n filePath: string,\n settings: PmSettings | null,\n): ItemFormat {\n if (filePath.endsWith(\".md\")) {\n return \"json_markdown\";\n }\n if (filePath.endsWith(\".toon\")) {\n return \"toon\";\n }\n return settings?.item_format ?? \"toon\";\n}\n\n/**\n * Execute one git merge-driver invocation for a tracker artifact. Reads the\n * three per-side versions, applies the artifact's field-aware merge semantics,\n * writes the merged content (parseable even when conflicted) to the output\n * path, and reports remaining conflicts so the CLI can exit non-zero and let\n * git mark the path unmerged.\n */\nexport async function runMergeDriver(\n options: MergeDriverOptions,\n global: GlobalOptions,\n): Promise<MergeDriverResult> {\n const artifact = resolveArtifact(options.artifact);\n const preferred = resolvePreferredSide(options.prefer);\n const outputPath = path.resolve(options.outputPath ?? options.oursPath);\n const [baseRaw, oursRaw, theirsRaw] = await Promise.all([\n readSideFile(options.basePath, \"base\"),\n readSideFile(options.oursPath, \"ours\"),\n readSideFile(options.theirsPath, \"theirs\"),\n ]);\n\n let merged: string;\n const conflicts: string[] = [];\n const result: Partial<MergeDriverResult> = {};\n if (artifact === \"history\") {\n const historyMerge = mergeHistoryStreams(baseRaw, oursRaw, theirsRaw);\n merged = historyMerge.merged;\n result.history = {\n strategy: historyMerge.strategy,\n common_entries: historyMerge.common_entries,\n entries_from_ours: historyMerge.entries_from_ours,\n entries_from_theirs: historyMerge.entries_from_theirs,\n entries_total: historyMerge.entries_total,\n reanchored: historyMerge.reanchored,\n };\n } else if (artifact === \"relationship\") {\n const relationshipMerge = mergeRelationshipEventStreams(\n baseRaw,\n oursRaw,\n theirsRaw,\n );\n merged = relationshipMerge.merged;\n result.relationship = {\n strategy: relationshipMerge.strategy,\n common_entries: relationshipMerge.common_entries,\n entries_from_ours: relationshipMerge.entries_from_ours,\n entries_from_theirs: relationshipMerge.entries_from_theirs,\n entries_total: relationshipMerge.entries_total,\n reanchored: relationshipMerge.reanchored,\n };\n } else if (artifact === \"item\") {\n const settings = await loadOptionalSettings(global);\n const itemMerge = mergeItemDocuments(baseRaw, oursRaw, theirsRaw, {\n format: itemFormatForPath(options.itemPath ?? outputPath, settings),\n schema: settings?.schema,\n extensionFieldNames: collectRegisteredItemFieldNames(\n getActiveExtensionRegistrations(),\n ),\n preferred,\n });\n merged = itemMerge.merged;\n conflicts.push(...itemMerge.conflict_fields);\n result.item = {\n fields_from_theirs: itemMerge.fields_from_theirs,\n union_fields: itemMerge.union_fields,\n };\n } else {\n const jsonMerge = mergeJsonDocuments(baseRaw, oursRaw, theirsRaw, {\n preferred,\n });\n merged = jsonMerge.merged;\n conflicts.push(...jsonMerge.conflict_paths);\n result.json = {\n paths_from_theirs: jsonMerge.paths_from_theirs,\n };\n }\n\n await writeFile(outputPath, merged, \"utf8\");\n const guidance: string[] = [];\n if (conflicts.length > 0) {\n guidance.push(\n `Both branches changed ${conflicts.join(\", \")}; the ${preferred} value was kept. Review the merged file, re-apply the losing change if needed, then \"git add\" it.`,\n );\n }\n if (artifact === \"history\" && result.history?.reanchored) {\n guidance.push(\n 'The merged history chain was re-anchored. Run \"pm validate --check-history-drift\" and \"pm history-repair --all\" after the merge to reconcile item state with merged history.',\n );\n }\n return {\n ok: conflicts.length === 0,\n artifact,\n output_path: outputPath,\n preferred,\n conflicts,\n ...result,\n guidance,\n generated_at: nowIso(),\n };\n}\n", "/**\n * @module sdk/structured-mutations\n *\n * Parses agent-authored JSON mutation payloads into the public atomic item\n * transaction contract and normalizes full item documents for CLI round trips.\n */\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\nimport { levenshteinDistanceWithinLimit } from \"../core/shared/levenshtein.js\";\nimport { CLOSE_FLAG_CONTRACTS } from \"./cli-contracts/flag-contracts.js\";\nimport {\n CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS,\n UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS,\n} from \"./cli-contracts/commander-mutation-options.js\";\nimport type { PmClientFullMutationOptions } from \"./runtime.js\";\nimport type { BulkItemMutation } from \"./item-transaction.js\";\n\nconst MUTATION_ROW_KEYS = [\"op\", \"id\", \"reason\", \"options\"] as const;\nconst ITEM_ENVELOPE_KEYS = [\n \"item\",\n \"linked\",\n \"schedule\",\n \"claim_state\",\n \"children\",\n] as const;\nconst READ_ONLY_ITEM_KEYS = new Set([\n \"created_at\",\n \"updated_at\",\n \"closed_at\",\n \"version\",\n \"format_version\",\n \"path\",\n \"author\",\n]);\nconst UPDATE_READ_ONLY_ITEM_KEYS = new Set([...READ_ONLY_ITEM_KEYS, \"id\"]);\nconst ITEM_FIELD_KEYS = new Set([\n \"id\",\n \"title\",\n \"description\",\n \"type\",\n \"status\",\n \"priority\",\n \"tags\",\n \"body\",\n \"deadline\",\n \"estimated_minutes\",\n \"acceptance_criteria\",\n \"definition_of_ready\",\n \"order\",\n \"rank\",\n \"goal\",\n \"objective\",\n \"value\",\n \"impact\",\n \"outcome\",\n \"why_now\",\n \"assignee\",\n \"parent\",\n \"reviewer\",\n \"risk\",\n \"confidence\",\n \"sprint\",\n \"release\",\n \"blocked_by\",\n \"blocked_reason\",\n \"unblock_note\",\n \"reporter\",\n \"severity\",\n \"environment\",\n \"repro_steps\",\n \"resolution\",\n \"expected_result\",\n \"actual_result\",\n \"affected_version\",\n \"fixed_version\",\n \"component\",\n \"regression\",\n \"customer_impact\",\n \"close_reason\",\n \"dependencies\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"files\",\n \"tests\",\n \"docs\",\n \"reminders\",\n \"events\",\n \"type_options\",\n]);\nconst MUTATION_OPTION_KEYS: Readonly<\n Record<BulkItemMutation[\"op\"], readonly string[]>\n> = {\n create: CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS.map(\n (contract) => contract.target,\n ),\n update: UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS.map(\n (contract) => contract.target,\n ),\n close: CLOSE_FLAG_CONTRACTS.map((contract) =>\n contract.flag\n .slice(2)\n .replaceAll(/-([a-z])/gu, (_match, letter: string) =>\n letter.toUpperCase(),\n ),\n ).filter((key) => key !== \"reason\"),\n};\n\n/** Validated transaction controls shared by atomic CLI and MCP adapters. */\nexport interface AtomicMutationControls {\n /** Compensation policy applied to created items when a later step fails. */\n createCompensation?: \"close\" | \"delete\";\n /** Workspace transaction lock lifetime in seconds. */\n lockTtlSeconds?: number;\n /** Maximum time to wait for the workspace transaction lock. */\n lockWaitMs?: number;\n}\n\n/** Validate and normalize atomic transaction controls at every transport boundary. */\nexport function parseAtomicMutationControls(\n value: Record<string, unknown>,\n): AtomicMutationControls {\n const controls: AtomicMutationControls = {};\n const compensation = value.createCompensation;\n if (compensation !== undefined) {\n if (compensation !== \"close\" && compensation !== \"delete\") {\n throw new PmCliError(\n \"createCompensation must be close or delete.\",\n EXIT_CODE.USAGE,\n );\n }\n controls.createCompensation = compensation;\n }\n for (const key of [\"lockTtlSeconds\", \"lockWaitMs\"] as const) {\n const raw = value[key];\n if (raw === undefined) continue;\n const parsed =\n typeof raw === \"number\" ||\n (typeof raw === \"string\" && raw.trim().length > 0)\n ? Number(raw)\n : Number.NaN;\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new PmCliError(\n `${key} must be a positive safe integer.`,\n EXIT_CODE.USAGE,\n );\n }\n controls[key] = parsed;\n }\n return controls;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction nearestKey(\n key: string,\n candidates: readonly string[],\n): string | undefined {\n const limit = Math.max(1, Math.min(3, Math.floor(key.length / 4) + 1));\n let best: { key: string; distance: number } | undefined;\n for (const candidate of candidates) {\n const distance = levenshteinDistanceWithinLimit(key, candidate, limit);\n if (distance !== null && (best === undefined || distance < best.distance)) {\n best = { key: candidate, distance };\n }\n }\n return best?.key;\n}\n\nfunction unknownKeyError(\n scope: string,\n key: string,\n candidates: readonly string[],\n): PmCliError {\n const suggestion = nearestKey(key, candidates);\n return new PmCliError(\n suggestion === undefined\n ? `${scope} does not recognize key \"${key}\". Allowed keys: ${candidates.join(\", \")}.`\n : `${scope} does not recognize key \"${key}\". Did you mean \"${suggestion}\"?`,\n EXIT_CODE.USAGE,\n {\n code: \"stdin_json_unknown_key\",\n required: `Use documented ${scope} keys only.`,\n why: \"Strict structured input prevents silent typos from creating incomplete or unintended mutations.\",\n nextSteps: [\n suggestion === undefined\n ? `Remove or correct \"${key}\".`\n : `Replace \"${key}\" with \"${suggestion}\".`,\n ],\n },\n );\n}\n\nfunction parseJsonValue(input: string, label: string): unknown {\n try {\n return JSON.parse(input) as unknown;\n } catch (error: unknown) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new PmCliError(\n `${label} must be valid JSON: ${detail}`,\n EXIT_CODE.USAGE,\n {\n code: \"stdin_json_invalid\",\n required: `Pipe one valid JSON ${label.toLowerCase()} into stdin.`,\n why: \"Structured mutation input must parse deterministically before any tracker write begins.\",\n },\n );\n }\n}\n\nfunction validateMutationObject(\n value: unknown,\n index: number,\n): Record<string, unknown> {\n if (!isPlainObject(value)) {\n throw new PmCliError(\n `Mutation ${index + 1} must be an object.`,\n EXIT_CODE.USAGE,\n );\n }\n for (const key of Object.keys(value)) {\n if (\n !MUTATION_ROW_KEYS.includes(key as (typeof MUTATION_ROW_KEYS)[number])\n ) {\n throw unknownKeyError(`mutation ${index + 1}`, key, MUTATION_ROW_KEYS);\n }\n }\n return value;\n}\n\nfunction validateMutationOptions(\n options: unknown,\n op: BulkItemMutation[\"op\"],\n index: number,\n): Record<string, unknown> | undefined {\n if (options === undefined) return undefined;\n if (!isPlainObject(options)) {\n throw new PmCliError(\n `Mutation ${index + 1} options must be an object.`,\n EXIT_CODE.USAGE,\n );\n }\n for (const key of Object.keys(options)) {\n if (!MUTATION_OPTION_KEYS[op].includes(key)) {\n throw unknownKeyError(\n `mutation ${index + 1} ${op} options`,\n key,\n MUTATION_OPTION_KEYS[op],\n );\n }\n }\n return options;\n}\n\nfunction validateMutationRow(value: unknown, index: number): BulkItemMutation {\n const mutation = validateMutationObject(value, index);\n const { op, id, reason } = mutation;\n if (op !== \"create\" && op !== \"update\" && op !== \"close\") {\n throw new PmCliError(\n `Mutation ${index + 1} op must be create, update, or close.`,\n EXIT_CODE.USAGE,\n );\n }\n const options = validateMutationOptions(mutation.options, op, index);\n if (typeof id !== \"string\" || id.trim().length === 0) {\n throw new PmCliError(\n `Mutation ${index + 1} requires a non-empty id.`,\n EXIT_CODE.USAGE,\n );\n }\n const normalizedId = id.trim();\n if (op === \"close\") {\n if (typeof reason !== \"string\" || reason.trim().length === 0) {\n throw new PmCliError(\n `Mutation ${index + 1} close requires a non-empty reason.`,\n EXIT_CODE.USAGE,\n );\n }\n return {\n op,\n id: normalizedId,\n reason: reason.trim(),\n ...(options === undefined\n ? {}\n : { options: options as PmClientFullMutationOptions }),\n };\n }\n if (!isPlainObject(options)) {\n throw new PmCliError(\n `Mutation ${index + 1} ${op} requires an options object.`,\n EXIT_CODE.USAGE,\n );\n }\n return {\n op,\n id: normalizedId,\n options: options as PmClientFullMutationOptions,\n };\n}\n\n/** Parse a JSON array, or an object containing `mutations`, into an atomic mutation batch. */\nexport function parseItemMutationBatch(input: string): BulkItemMutation[] {\n const parsed = parseJsonValue(input, \"Mutation batch\");\n const rows = Array.isArray(parsed)\n ? parsed\n : isPlainObject(parsed) && Array.isArray(parsed.mutations)\n ? parsed.mutations\n : undefined;\n if (rows === undefined || rows.length === 0) {\n throw new PmCliError(\n \"Mutation batch must be a non-empty JSON array or an object with a non-empty mutations array.\",\n EXIT_CODE.USAGE,\n );\n }\n return rows.map((row, index) => validateMutationRow(row, index));\n}\n\nfunction serializePairs(\n value: Record<string, unknown>,\n keys: readonly string[],\n): string {\n return keys\n .filter((key) => value[key] !== undefined && value[key] !== null)\n .map((key) => {\n const rendered = String(value[key]);\n return `${key}=${/[\",\\n\\r\\\\]/u.test(rendered) ? JSON.stringify(rendered) : rendered}`;\n })\n .join(\",\");\n}\n\nfunction serializeObjectArray(\n value: unknown,\n keys: readonly string[],\n label: string,\n): string[] | undefined {\n if (value === undefined) return undefined;\n if (!Array.isArray(value) || !value.every(isPlainObject)) {\n throw new PmCliError(\n `${label} must be an array of objects.`,\n EXIT_CODE.USAGE,\n );\n }\n return value.map((entry) => serializePairs(entry, keys));\n}\n\nfunction scalarItemOption(key: string, value: unknown): unknown {\n if (\n key === \"tags\" &&\n Array.isArray(value) &&\n value.every((entry) => typeof entry === \"string\")\n ) {\n return JSON.stringify(value);\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n return value;\n}\n\nfunction appendFacetOptions(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n skipPersistedAnnotations = false,\n): void {\n const mappings: ReadonlyArray<readonly [string, string, readonly string[]]> =\n [\n [\"dependencies\", \"dep\", [\"id\", \"kind\", \"created_at\", \"author\"]],\n [\"comments\", \"comment\", [\"text\", \"created_at\", \"author\"]],\n [\"notes\", \"note\", [\"text\", \"created_at\", \"author\"]],\n [\"learnings\", \"learning\", [\"text\", \"created_at\", \"author\"]],\n [\"files\", \"file\", [\"path\", \"scope\", \"note\"]],\n [\"tests\", \"test\", [\"command\", \"scope\", \"timeout_seconds\"]],\n [\"docs\", \"doc\", [\"path\", \"scope\", \"note\"]],\n [\"reminders\", \"reminder\", [\"at\", \"text\", \"created_at\"]],\n [\"events\", \"event\", [\"start_at\", \"end_at\", \"title\", \"location\"]],\n [\"type_options\", \"typeOption\", [\"key\", \"value\"]],\n ];\n for (const [sourceKey, targetKey, keys] of mappings) {\n const sourceValue = source[sourceKey];\n const serialized = serializeObjectArray(\n skipPersistedAnnotations &&\n [\"comments\", \"notes\", \"learnings\"].includes(sourceKey) &&\n Array.isArray(sourceValue)\n ? sourceValue.filter(\n (entry) =>\n !isPlainObject(entry) || entry.created_at === undefined,\n )\n : sourceValue,\n keys,\n sourceKey,\n );\n if (serialized !== undefined && serialized.length > 0)\n target[targetKey] = serialized;\n }\n}\n\nfunction validateItemDocumentKeys(\n parsed: Record<string, unknown>,\n envelope: boolean,\n): void {\n for (const key of Object.keys(parsed)) {\n if (envelope) {\n if (\n !ITEM_ENVELOPE_KEYS.includes(key as (typeof ITEM_ENVELOPE_KEYS)[number])\n )\n throw unknownKeyError(\"item envelope\", key, ITEM_ENVELOPE_KEYS);\n continue;\n }\n if (\n !ITEM_FIELD_KEYS.has(key) &&\n nearestKey(key, [...ITEM_FIELD_KEYS]) === undefined &&\n nearestKey(key, ITEM_ENVELOPE_KEYS) === \"item\"\n )\n throw unknownKeyError(\"item envelope\", key, ITEM_ENVELOPE_KEYS);\n }\n}\n\nfunction resolveItemDocument(parsed: Record<string, unknown>): {\n item: Record<string, unknown>;\n linked?: Record<string, unknown>;\n} {\n const envelope = Object.hasOwn(parsed, \"item\");\n validateItemDocumentKeys(parsed, envelope);\n const item = envelope ? parsed.item : parsed;\n if (!isPlainObject(item)) {\n throw new PmCliError(\n \"Item document item must be an object.\",\n EXIT_CODE.USAGE,\n );\n }\n return {\n item,\n ...(envelope && isPlainObject(parsed.linked)\n ? { linked: parsed.linked }\n : {}),\n };\n}\n\nfunction appendItemDocumentEntry(\n documentOptions: Record<string, unknown>,\n key: string,\n value: unknown,\n mode: \"create\" | \"update\",\n): void {\n const readOnlyKeys =\n mode === \"update\" ? UPDATE_READ_ONLY_ITEM_KEYS : READ_ONLY_ITEM_KEYS;\n if (readOnlyKeys.has(key)) return;\n if (!ITEM_FIELD_KEYS.has(key)) {\n const suggestion = nearestKey(key, [...ITEM_FIELD_KEYS]);\n if (suggestion !== undefined)\n throw unknownKeyError(\"item document\", key, [...ITEM_FIELD_KEYS]);\n const fields = Array.isArray(documentOptions.field)\n ? (documentOptions.field as string[])\n : [];\n fields.push(\n serializePairs(\n {\n key,\n value: typeof value === \"string\" ? value : JSON.stringify(value),\n },\n [\"key\", \"value\"],\n ),\n );\n documentOptions.field = fields;\n return;\n }\n if (\n [\n \"dependencies\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"files\",\n \"tests\",\n \"docs\",\n \"reminders\",\n \"events\",\n \"type_options\",\n ].includes(key)\n )\n return;\n documentOptions[\n key.replaceAll(/_([a-z])/gu, (_match, letter: string) =>\n letter.toUpperCase(),\n )\n ] = scalarItemOption(key, value);\n}\n\n/**\n * Convert a direct item JSON document or `pm get --json` envelope into the\n * create/update option shape. Explicit CLI flags override document values.\n */\nexport function itemDocumentToMutationOptions(\n input: string,\n mode: \"create\" | \"update\",\n explicitOptions: Record<string, unknown> = {},\n): Record<string, unknown> {\n const parsed = parseJsonValue(input, \"Item document\");\n if (!isPlainObject(parsed)) {\n throw new PmCliError(\n \"Item document must be a JSON object.\",\n EXIT_CODE.USAGE,\n );\n }\n const { item, linked } = resolveItemDocument(parsed);\n const documentOptions: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(item)) {\n appendItemDocumentEntry(documentOptions, key, value, mode);\n }\n appendFacetOptions(documentOptions, item, mode === \"update\");\n if (linked !== undefined) appendFacetOptions(documentOptions, linked);\n return {\n ...documentOptions,\n ...Object.fromEntries(\n Object.entries(explicitOptions).filter(\n ([, value]) => value !== undefined,\n ),\n ),\n stdinJson: undefined,\n };\n}\n\n/** Validate an already-decoded MCP mutation array through the same strict parser as CLI stdin. */\nexport function validateItemMutationRows(value: unknown): BulkItemMutation[] {\n return parseItemMutationBatch(JSON.stringify(value));\n}\n", "/**\n * @module sdk/item-transaction\n *\n * Provides the bulk item-mutation convenience layer over\n * `commitWorkspaceTransaction`: atomic, resumable create/update/close batches\n * with correct-by-construction inspection and compensation wiring.\n */\nimport path from \"node:path\";\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\nimport { readHistoryEntries } from \"./history-read.js\";\nimport {\n close,\n create,\n deleteItem,\n get,\n restore,\n update,\n type PmClientFullMutationOptions,\n} from \"./runtime.js\";\nimport {\n commitWorkspaceTransaction,\n type CommitWorkspaceTransactionOptions,\n type WorkspaceTransactionJsonValue,\n type WorkspaceTransactionStep,\n type WorkspaceTransactionStepInspection,\n} from \"./workspace-transaction.js\";\n\n/**\n * One atomic item creation inside a bulk mutation batch. The explicit `id`\n * doubles as the idempotency key: recovery treats an existing item with this id\n * as the already-applied result, so ids must be stable and transaction-owned.\n */\nexport interface BulkItemCreateMutation {\n /** Discriminates the creation operation. */\n op: \"create\";\n /** Explicit stable item id (normalized with the configured id_prefix). */\n id: string;\n /** Creation options forwarded to the public `create` runtime primitive. */\n options: PmClientFullMutationOptions;\n}\n\n/** One atomic item update inside a bulk mutation batch. */\nexport interface BulkItemUpdateMutation {\n /** Discriminates the update operation. */\n op: \"update\";\n /** Target item id. */\n id: string;\n /** Update options forwarded to the public `update` runtime primitive. */\n options: PmClientFullMutationOptions;\n}\n\n/** One atomic item closure inside a bulk mutation batch. */\nexport interface BulkItemCloseMutation {\n /** Discriminates the close operation. */\n op: \"close\";\n /** Target item id. */\n id: string;\n /** Close reason recorded on the item. */\n reason: string;\n /** Close options forwarded to the public `close` runtime primitive. */\n options?: PmClientFullMutationOptions;\n}\n\n/** Union of the item mutations a bulk transaction batch can carry. */\nexport type BulkItemMutation =\n | BulkItemCreateMutation\n | BulkItemUpdateMutation\n | BulkItemCloseMutation;\n\n/** Options accepted by the bulk item-mutation transaction helper. */\nexport interface CommitItemMutationsOptions {\n /** Tracker root that owns the journal and workspace-wide writer lock. */\n pmRoot: string;\n /** Stable idempotency key reused to recover an interrupted batch. */\n transactionId: string;\n /** Attributable actor recorded in the journal and forwarded to mutations. */\n author: string;\n /** Ordered item mutations; compensations run in reverse order. */\n mutations: readonly BulkItemMutation[];\n /**\n * Compensation strategy for created items: `close` (default) preserves the\n * item and its history with an explanatory close reason, `delete` removes\n * the item document (its history stream is retained by `pm delete`).\n */\n createCompensation?: \"close\" | \"delete\";\n /** Lock lifetime in seconds; size this above the longest expected attempt. */\n lockTtlSeconds?: number;\n /** Maximum time to wait for the workspace writer lock. */\n lockWaitMs?: number;\n /** Optional transition observer used by telemetry and deterministic crash tests. */\n onTransition?: CommitWorkspaceTransactionOptions[\"onTransition\"];\n}\n\n/** Journal-safe outcome recorded for one committed bulk item mutation. */\nexport interface BulkItemMutationOutcome {\n /** Canonical id of the mutated item. */\n id: string;\n /** Operation the batch applied for this item. */\n op: BulkItemMutation[\"op\"];\n}\n\n/** Successful durable result of a bulk item-mutation transaction. */\nexport interface CommitItemMutationsResult {\n /** Stable transaction identifier. */\n transactionId: string;\n /** Final durable state. */\n status: \"committed\";\n /** Whether an interrupted journal was resumed. */\n recovered: boolean;\n /** One outcome per mutation, keyed by the derived transaction step id. */\n results: Record<string, BulkItemMutationOutcome>;\n}\n\ninterface LocatedItemSnapshot {\n id: string;\n closedAt: string | undefined;\n updatedAt: string;\n}\n\n/** Read one item's transaction-relevant fields, mapping not-found to undefined. */\nasync function readItemSnapshot(\n pmRoot: string,\n id: string,\n): Promise<LocatedItemSnapshot | undefined> {\n try {\n const located = await get(id, {}, { pmRoot });\n const item = located.item as {\n id: string;\n closed_at?: string;\n updated_at: string;\n };\n return {\n id: item.id,\n closedAt: item.closed_at,\n updatedAt: item.updated_at,\n };\n } catch (error) {\n if (\n error instanceof PmCliError &&\n error.exitCode === EXIT_CODE.NOT_FOUND\n ) {\n return undefined;\n }\n throw error;\n }\n}\n\n/** Derive a journal-safe step id from one mutation's position and target. */\nfunction deriveStepId(mutation: BulkItemMutation, index: number): string {\n const sanitizedTarget = mutation.id.replaceAll(/[^a-zA-Z0-9._-]/gu, \"_\");\n return `${index + 1}-${mutation.op}-${sanitizedTarget}`;\n}\n\n/** Build the durable history-message marker for one bulk mutation phase. */\nfunction bulkHistoryMarker(\n transactionId: string,\n stepId: string,\n phase: \"apply\" | \"compensate\",\n): string {\n return `bulk-item-transaction ${transactionId} ${stepId} ${phase}`;\n}\n\n/**\n * Report whether an update step's forward mutation is durably applied. Updates\n * cannot be inferred from field values (a moving target), so the applied apply\n * marker in the item's immutable history is the source of truth; a later\n * compensate marker means the mutation was rolled back and must re-apply.\n */\nasync function isUpdateMarkerApplied(\n pmRoot: string,\n canonicalId: string,\n transactionId: string,\n stepId: string,\n): Promise<boolean> {\n const entries = await readHistoryEntries(\n path.join(pmRoot, \"history\", `${canonicalId}.jsonl`),\n canonicalId,\n );\n const applyMarker = bulkHistoryMarker(transactionId, stepId, \"apply\");\n const compensateMarker = bulkHistoryMarker(transactionId, stepId, \"compensate\");\n for (let index = entries.length - 1; index >= 0; index -= 1) {\n const message = entries[index].message;\n if (message === applyMarker) {\n return true;\n }\n if (message === compensateMarker) {\n return false;\n }\n }\n return false;\n}\n\n/** Capture the restore target used to compensate an update or close mutation. */\nasync function prepareRestoreCompensation(\n pmRoot: string,\n mutation: BulkItemMutation,\n): Promise<WorkspaceTransactionJsonValue> {\n const snapshot = await readItemSnapshot(pmRoot, mutation.id);\n if (snapshot?.updatedAt === undefined) {\n throw new PmCliError(\n `Bulk ${mutation.op} target ${mutation.id} does not exist or has no restorable version`,\n EXIT_CODE.NOT_FOUND,\n );\n }\n return { target_updated_at: snapshot.updatedAt };\n}\n\n/** Idempotently restore an item to its captured pre-mutation version. */\nasync function compensateByRestore(\n config: { pmRoot: string; author: string; transactionId: string },\n itemId: string,\n stepId: string,\n data: WorkspaceTransactionJsonValue | undefined,\n): Promise<void> {\n const target =\n data !== null && typeof data === \"object\" && !Array.isArray(data)\n ? data.target_updated_at\n : undefined;\n if (typeof target !== \"string\") {\n return;\n }\n if ((await readItemSnapshot(config.pmRoot, itemId)) === undefined) {\n return;\n }\n await restore(\n itemId,\n target,\n {\n force: true,\n author: config.author,\n message: bulkHistoryMarker(config.transactionId, stepId, \"compensate\"),\n },\n { pmRoot: config.pmRoot },\n );\n}\n\n/** Build the workspace-transaction step for one item creation. */\nfunction buildCreateStep(\n config: {\n pmRoot: string;\n author: string;\n transactionId: string;\n createCompensation: \"close\" | \"delete\";\n },\n mutation: BulkItemCreateMutation,\n stepId: string,\n): WorkspaceTransactionStep {\n return {\n id: stepId,\n async inspect(): Promise<WorkspaceTransactionStepInspection> {\n const snapshot = await readItemSnapshot(config.pmRoot, mutation.id);\n if (snapshot === undefined) {\n return { state: \"pending\" };\n }\n return { state: \"applied\", result: { id: snapshot.id, op: \"create\" } };\n },\n async apply(): Promise<WorkspaceTransactionJsonValue> {\n const created = await create(\n { ...mutation.options, author: config.author, id: mutation.id },\n { pmRoot: config.pmRoot },\n );\n const createdItem = created.item as Record<string, unknown>;\n return { id: String(createdItem.id), op: \"create\" };\n },\n async compensate(): Promise<void> {\n const snapshot = await readItemSnapshot(config.pmRoot, mutation.id);\n if (snapshot === undefined) {\n return;\n }\n if (config.createCompensation === \"delete\") {\n await deleteItem(\n mutation.id,\n {\n force: true,\n author: config.author,\n message: `Compensate interrupted bulk transaction ${config.transactionId}`,\n },\n { pmRoot: config.pmRoot },\n );\n return;\n }\n if (snapshot.closedAt !== undefined) {\n return;\n }\n await close(\n mutation.id,\n `Compensated: interrupted bulk transaction ${config.transactionId}`,\n { force: true, author: config.author },\n { pmRoot: config.pmRoot },\n );\n },\n };\n}\n\n/** Build the workspace-transaction step for one item update. */\nfunction buildUpdateStep(\n config: { pmRoot: string; author: string; transactionId: string },\n mutation: BulkItemUpdateMutation,\n stepId: string,\n): WorkspaceTransactionStep {\n return {\n id: stepId,\n async inspect(): Promise<WorkspaceTransactionStepInspection> {\n const snapshot = await readItemSnapshot(config.pmRoot, mutation.id);\n if (snapshot === undefined) {\n return { state: \"pending\" };\n }\n const applied = await isUpdateMarkerApplied(\n config.pmRoot,\n snapshot.id,\n config.transactionId,\n stepId,\n );\n if (!applied) {\n return { state: \"pending\" };\n }\n return { state: \"applied\", result: { id: snapshot.id, op: \"update\" } };\n },\n async prepareCompensation(): Promise<WorkspaceTransactionJsonValue> {\n return prepareRestoreCompensation(config.pmRoot, mutation);\n },\n async apply(): Promise<WorkspaceTransactionJsonValue> {\n const updated = await update(\n mutation.id,\n {\n ...mutation.options,\n author: config.author,\n message: bulkHistoryMarker(config.transactionId, stepId, \"apply\"),\n },\n { pmRoot: config.pmRoot },\n );\n const updatedItem = updated.item as Record<string, unknown>;\n return { id: String(updatedItem.id), op: \"update\" };\n },\n async compensate(\n data?: WorkspaceTransactionJsonValue,\n ): Promise<void> {\n await compensateByRestore(config, mutation.id, stepId, data);\n },\n };\n}\n\n/** Build the workspace-transaction step for one item closure. */\nfunction buildCloseStep(\n config: { pmRoot: string; author: string; transactionId: string },\n mutation: BulkItemCloseMutation,\n stepId: string,\n): WorkspaceTransactionStep {\n return {\n id: stepId,\n // An already-terminal target counts as applied: closing it again would\n // fight legitimate prior closure, and recovery must adopt completed work.\n async inspect(): Promise<WorkspaceTransactionStepInspection> {\n const snapshot = await readItemSnapshot(config.pmRoot, mutation.id);\n if (snapshot?.closedAt === undefined) {\n return { state: \"pending\" };\n }\n return { state: \"applied\", result: { id: snapshot.id, op: \"close\" } };\n },\n async prepareCompensation(): Promise<WorkspaceTransactionJsonValue> {\n return prepareRestoreCompensation(config.pmRoot, mutation);\n },\n async apply(): Promise<WorkspaceTransactionJsonValue> {\n const closed = await close(\n mutation.id,\n mutation.reason,\n { ...mutation.options, author: config.author },\n { pmRoot: config.pmRoot },\n );\n const closedItem = closed.item as Record<string, unknown>;\n return { id: String(closedItem.id), op: \"close\" };\n },\n async compensate(\n data?: WorkspaceTransactionJsonValue,\n ): Promise<void> {\n await compensateByRestore(config, mutation.id, stepId, data);\n },\n };\n}\n\n/** Convert one validated bulk mutation into its workspace-transaction step. */\nfunction buildStepForMutation(\n config: {\n pmRoot: string;\n author: string;\n transactionId: string;\n createCompensation: \"close\" | \"delete\";\n },\n mutation: BulkItemMutation,\n index: number,\n): WorkspaceTransactionStep {\n const stepId = deriveStepId(mutation, index);\n if (mutation.op === \"create\") {\n return buildCreateStep(config, mutation, stepId);\n }\n if (mutation.op === \"update\") {\n return buildUpdateStep(config, mutation, stepId);\n }\n return buildCloseStep(config, mutation, stepId);\n}\n\n/** Reject malformed bulk mutation rows before any journal or lock work. */\nfunction assertValidBulkMutation(\n mutation: BulkItemMutation,\n index: number,\n): void {\n if (\n mutation === null ||\n typeof mutation !== \"object\" ||\n Array.isArray(mutation)\n ) {\n throw new TypeError(`Bulk mutation ${index + 1} must be an object`);\n }\n if (![\"create\", \"update\", \"close\"].includes(mutation.op)) {\n throw new TypeError(\n `Bulk mutation ${index + 1} op must be create, update, or close`,\n );\n }\n if (typeof mutation.id !== \"string\" || mutation.id.trim().length === 0) {\n throw new TypeError(`Bulk mutation ${index + 1} requires a non-empty id`);\n }\n if (\n mutation.op === \"close\" &&\n (typeof mutation.reason !== \"string\" || mutation.reason.trim().length === 0)\n ) {\n throw new TypeError(\n `Bulk close mutation ${index + 1} requires a non-empty reason`,\n );\n }\n}\n\n/**\n * Commit an ordered batch of item create/update/close mutations atomically\n * (all-or-nothing) in one durable workspace transaction. This is the\n * high-level companion to `commitWorkspaceTransaction`: instead of\n * hand-writing `inspect`/`prepareCompensation`/`apply`/`compensate` for the\n * ubiquitous bulk import/sync case, callers describe the mutations and the\n * helper wires the crash-consistency contract — exists-by-id inspection for\n * creates, version-restore compensation for updates and closes, and\n * close-or-delete compensation for creates. A stable `transactionId` makes\n * interrupted batches resumable across processes and agents.\n */\nexport async function commitItemMutations(\n options: CommitItemMutationsOptions,\n): Promise<CommitItemMutationsResult> {\n const mutations = [...options.mutations];\n if (mutations.length === 0) {\n throw new TypeError(\"Bulk item transaction requires at least one mutation\");\n }\n for (const [index, mutation] of mutations.entries()) {\n assertValidBulkMutation(mutation, index);\n }\n const createCompensation = options.createCompensation ?? \"close\";\n if (![\"close\", \"delete\"].includes(createCompensation)) {\n throw new TypeError(\n \"Bulk item transaction createCompensation must be close or delete\",\n );\n }\n const stepConfig = {\n pmRoot: options.pmRoot,\n author: options.author,\n transactionId: options.transactionId,\n createCompensation,\n };\n const committed = await commitWorkspaceTransaction({\n pmRoot: options.pmRoot,\n transactionId: options.transactionId,\n author: options.author,\n steps: mutations.map((mutation, index) =>\n buildStepForMutation(stepConfig, mutation, index),\n ),\n ...(options.lockTtlSeconds === undefined\n ? {}\n : { lockTtlSeconds: options.lockTtlSeconds }),\n ...(options.lockWaitMs === undefined\n ? {}\n : { lockWaitMs: options.lockWaitMs }),\n ...(options.onTransition === undefined\n ? {}\n : { onTransition: options.onTransition }),\n });\n const results: Record<string, BulkItemMutationOutcome> = {};\n for (const [stepId, value] of Object.entries(committed.results)) {\n // Journal values round-trip this module's own step outputs, which are\n // always {id, op} objects — the cast restores the concrete outcome shape.\n results[stepId] = value as unknown as BulkItemMutationOutcome;\n }\n return {\n transactionId: committed.transactionId,\n status: \"committed\",\n recovered: committed.recovered,\n results,\n };\n}\n\n/** Public contract for test only item transaction internals, shared with white-box specs. */\nexport const _testOnlyItemTransaction = {\n buildCreateStep,\n bulkHistoryMarker,\n compensateByRestore,\n deriveStepId,\n isUpdateMarkerApplied,\n readItemSnapshot,\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DA,SAAS,kBAAkB,KAAa,OAAa;AACnD,QAAM,iBAAiB,6BAA6B,GAAG;AACvD,MAAI,gBAAgB;AAClB,UAAM,IAAI,WACR,wBAAwB,KAAK,kDAAkD,eAAe,IAAI,yDAClG,UAAU,eAAe;EAE7B;AACA,QAAM,UAA0B,CAAA;AAChC,aAAW,CAAC,OAAO,OAAO,KAAK,IAAI,MAAM,OAAO,EAAE,QAAO,GAAI;AAC3D,UAAM,OAAO,QAAQ,KAAI;AACzB,QAAI,CAAC,MAAM;AACT;IACF;AACA,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,UAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GAAG;AAC1E,cAAM,IAAI,UAAU,iCAAiC;MACvD;AACA,cAAQ,KAAK,MAAsB;IACrC,QAAQ;AACN,YAAM,IAAI,WACR,wBAAwB,KAAK,mCAAmC,QAAQ,CAAC,KACzE,UAAU,eAAe;IAE7B;EACF;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAmB;AAC/C,SAAO,gBAAgB;IACrB,IAAI,MAAM;IACV,QAAQ,MAAM;IACd,IAAI,MAAM;IACV,OAAO,MAAM;IACb,SAAS,MAAM,WAAW;GAC3B;AACH;AAEA,SAAS,0BACP,MACA,QAAsB;AAEtB,QAAM,QAAQ,KAAK,IAAI,KAAK,QAAQ,OAAO,MAAM;AACjD,MAAI,SAAS;AACb,SACE,SAAS,SACT,qBAAqB,KAAK,MAAM,CAAC,MAAM,qBAAqB,OAAO,MAAM,CAAC,GAC1E;AACA,cAAU;EACZ;AACA,SAAO;AACT;AAYM,SAAU,oBACd,SACA,SACA,WAAiB;AAEjB,oBAAkB,SAAS,MAAM;AACjC,QAAM,OAAO,kBAAkB,SAAS,MAAM;AAC9C,QAAM,SAAS,kBAAkB,WAAW,QAAQ;AACpD,QAAM,SAAS,0BAA0B,MAAM,MAAM;AAErD,MAAI,WAAW,KAAK,UAAU,WAAW,OAAO,QAAQ;AACtD,WAAO;MACL,QAAQ,oBAAoB,IAAI;MAChC,UAAU;MACV,gBAAgB;MAChB,mBAAmB;MACnB,qBAAqB;MACrB,eAAe,KAAK;MACpB,YAAY;;EAEhB;AACA,MAAI,WAAW,OAAO,QAAQ;AAC5B,WAAO;MACL,QAAQ,oBAAoB,IAAI;MAChC,UAAU;MACV,gBAAgB;MAChB,mBAAmB,KAAK,SAAS;MACjC,qBAAqB;MACrB,eAAe,KAAK;MACpB,YAAY;;EAEhB;AACA,MAAI,WAAW,KAAK,QAAQ;AAC1B,WAAO;MACL,QAAQ,oBAAoB,MAAM;MAClC,UAAU;MACV,gBAAgB;MAChB,mBAAmB;MACnB,qBAAqB,OAAO,SAAS;MACrC,eAAe,OAAO;MACtB,YAAY;;EAEhB;AAEA,QAAM,aAAa,KAAK,MAAM,MAAM;AACpC,QAAM,iBAAiB,IAAI,IAAI,WAAW,IAAI,oBAAoB,CAAC;AACnE,QAAM,eAAe,OAClB,MAAM,MAAM,EACZ,OAAO,CAAC,UAAU,CAAC,eAAe,IAAI,qBAAqB,KAAK,CAAC,CAAC;AACrE,QAAM,eAAe,CAAC,GAAG,YAAY,GAAG,YAAY,EAAE,KAAK,CAAC,MAAM,UAAS;AACzE,UAAM,OAAO,wBAAwB,KAAK,IAAI,MAAM,EAAE;AACtD,QAAI,SAAS,GAAG;AACd,aAAO;IACT;AACA,UAAM,eAAe,eAAe,IAAI,qBAAqB,IAAI,CAAC;AAClE,UAAM,gBAAgB,eAAe,IAAI,qBAAqB,KAAK,CAAC;AACpE,QAAI,iBAAiB,eAAe;AAClC,aAAO,OAAO,aAAa,IAAI,OAAO,YAAY;IACpD;AACA,WAAO,qBAAqB,IAAI,EAAE,cAAc,qBAAqB,KAAK,CAAC;EAC7E,CAAC;AACD,QAAM,aAAa,uBAAuB;IACxC,GAAG,KAAK,MAAM,GAAG,MAAM;IACvB,GAAG;GACJ;AACD,SAAO;IACL,QAAQ,oBAAoB,WAAW,OAAO;IAC9C,UAAU;IACV,gBAAgB;IAChB,mBAAmB,WAAW;IAC9B,qBAAqB,aAAa;IAClC,eAAe,WAAW,QAAQ;IAClC,YAAY;;AAEhB;AA+BA,SAAS,uBACP,KACA,OAAa;AAEb,QAAM,iBAAiB,6BAA6B,GAAG;AACvD,MAAI,gBAAgB;AAClB,UAAM,IAAI,WACR,6BAA6B,KAAK,kDAAkD,eAAe,IAAI,yDACvG,UAAU,eAAe;EAE7B;AACA,QAAM,SAAoC,CAAA;AAC1C,aAAW,CAAC,OAAO,OAAO,KAAK,IAAI,MAAM,OAAO,EAAE,QAAO,GAAI;AAC3D,UAAM,OAAO,QAAQ,KAAI;AACzB,QAAI,CAAC,MAAM;AACT;IACF;AACA,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,IAAI;IAC1B,QAAQ;AACN,YAAM,IAAI,WACR,6BAA6B,KAAK,mCAAmC,QAAQ,CAAC,KAC9E,UAAU,eAAe;IAE7B;AACA,QACE,OAAO,WAAW,YAClB,WAAW,QACX,MAAM,QAAQ,MAAM,KACpB,OAAQ,OAAiC,YAAY,YACrD,OAAQ,OAAkC,aAAa,UACvD;AACA,YAAM,IAAI,WACR,6BAA6B,KAAK,UAAU,QAAQ,CAAC,+DACrD,UAAU,eAAe;IAE7B;AACA,WAAO,KAAK,MAAiC;EAC/C;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,QAAiC;AAChE,SAAO,OAAO,WAAW,IACrB,KACA,GAAG,OAAO,IAAI,CAAC,UAAU,KAAK,UAAU,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;;AAChE;AAEA,SAAS,2BACP,QAAiC;AAEjC,SAAO,OAAO,IAAI,CAAC,OAAO,WAAW,EAAE,GAAG,OAAO,UAAU,QAAQ,EAAC,EAAG;AACzE;AAWM,SAAU,8BACd,SACA,SACA,WAAiB;AAEjB,yBAAuB,SAAS,MAAM;AACtC,QAAM,OAAO,uBAAuB,SAAS,MAAM;AACnD,QAAM,SAAS,uBAAuB,WAAW,QAAQ;AACzD,QAAM,QAAQ,KAAK,IAAI,KAAK,QAAQ,OAAO,MAAM;AACjD,MAAI,SAAS;AACb,SAAO,SAAS,SAAS,KAAK,MAAM,EAAE,YAAY,OAAO,MAAM,EAAE,SAAS;AACxE,cAAU;EACZ;AAEA,MAAI,WAAW,KAAK,UAAU,WAAW,OAAO,QAAQ;AACtD,WAAO;MACL,QAAQ,wBAAwB,IAAI;MACpC,UAAU;MACV,gBAAgB;MAChB,mBAAmB;MACnB,qBAAqB;MACrB,eAAe,KAAK;MACpB,YAAY;;EAEhB;AACA,MAAI,WAAW,OAAO,QAAQ;AAC5B,WAAO;MACL,QAAQ,wBAAwB,IAAI;MACpC,UAAU;MACV,gBAAgB;MAChB,mBAAmB,KAAK,SAAS;MACjC,qBAAqB;MACrB,eAAe,KAAK;MACpB,YAAY;;EAEhB;AACA,MAAI,WAAW,KAAK,QAAQ;AAC1B,WAAO;MACL,QAAQ,wBAAwB,MAAM;MACtC,UAAU;MACV,gBAAgB;MAChB,mBAAmB;MACnB,qBAAqB,OAAO,SAAS;MACrC,eAAe,OAAO;MACtB,YAAY;;EAEhB;AAEA,QAAM,aAAa,KAAK,MAAM,MAAM;AACpC,QAAM,eAAe,IAAI,IAAI,WAAW,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC;AACrE,QAAM,eAAe,OAClB,MAAM,MAAM,EACZ,OAAO,CAAC,UAAU,CAAC,aAAa,IAAI,MAAM,OAAO,CAAC;AACrD,QAAM,eAAe,CAAC,GAAG,YAAY,GAAG,YAAY,EAAE,KAAK,CAAC,MAAM,UAAS;AACzE,QAAI,KAAK,cAAc,UAAa,MAAM,cAAc,QAAW;AACjE,YAAM,OAAO,wBAAwB,KAAK,WAAW,MAAM,SAAS;AACpE,UAAI,SAAS,GAAG;AACd,eAAO;MACT;IACF,WAAW,KAAK,cAAc,UAAa,MAAM,cAAc,QAAW;AACxE,aAAO;IACT,WAAW,KAAK,cAAc,QAAW;AACvC,aAAO;IACT;AACA,UAAM,eAAe,aAAa,IAAI,KAAK,OAAO;AAClD,UAAM,gBAAgB,aAAa,IAAI,MAAM,OAAO;AACpD,QAAI,iBAAiB,eAAe;AAClC,aAAO,OAAO,aAAa,IAAI,OAAO,YAAY;IACpD;AAGA,WAAO;EACT,CAAC;AACD,QAAM,SAAS,2BAA2B;IACxC,GAAG,KAAK,MAAM,GAAG,MAAM;IACvB,GAAG;GACJ;AACD,SAAO;IACL,QAAQ,wBAAwB,MAAM;IACtC,UAAU;IACV,gBAAgB;IAChB,mBAAmB,WAAW;IAC9B,qBAAqB,aAAa;IAClC,eAAe,OAAO;IACtB,YAAY;;AAEhB;AAYO,IAAM,+BAA+B;EAC1C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIK,IAAM,+BAA+B,CAAC,YAAY;AAgBzD,SAAS,WAAW,MAAe,OAAc;AAC/C,SAAO,gBAAgB,QAAQ,IAAI,MAAM,gBAAgB,SAAS,IAAI;AACxE;AAEA,SAAS,gBACP,MACA,MACA,QAAe;AAEf,QAAM,YAAY,CAAC,UACjB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAA;AACjC,QAAM,UAAU,IAAI,IAAI,UAAU,IAAI,EAAE,IAAI,CAAC,UAAU,gBAAgB,KAAK,CAAC,CAAC;AAC9E,QAAM,cAAc,UAAU,IAAI;AAClC,QAAM,UAAU,IAAI,IAAI,YAAY,IAAI,CAAC,UAAU,gBAAgB,KAAK,CAAC,CAAC;AAC1E,QAAM,gBAAgB,UAAU,MAAM;AACtC,QAAM,YAAY,IAAI,IACpB,cAAc,IAAI,CAAC,UAAU,gBAAgB,KAAK,CAAC,CAAC;AAEtD,QAAM,SAAS,YAAY,OAAO,CAAC,UAAS;AAC1C,UAAM,WAAW,gBAAgB,KAAK;AAGtC,WAAO,CAAC,QAAQ,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ;EACzD,CAAC;AACD,aAAW,SAAS,eAAe;AACjC,UAAM,WAAW,gBAAgB,KAAK;AACtC,QAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,CAAC,QAAQ,IAAI,QAAQ,GAAG;AACpD,aAAO,KAAK,KAAK;IACnB;EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAe,QAAe;AACrD,SAAO,wBAAwB,OAAO,IAAI,GAAG,OAAO,MAAM,CAAC,KAAK,IAC5D,OACA;AACN;AAQA,SAAS,oBACP,MACA,MACA,QACA,WAA6B;AAE7B,MAAI,WAAW,MAAM,MAAM,GAAG;AAC5B,WAAO,EAAE,OAAO,MAAM,aAAa,OAAO,UAAU,MAAK;EAC3D;AACA,MAAI,WAAW,MAAM,IAAI,GAAG;AAC1B,WAAO,EAAE,OAAO,QAAQ,aAAa,MAAM,UAAU,MAAK;EAC5D;AACA,MAAI,WAAW,MAAM,MAAM,GAAG;AAC5B,WAAO,EAAE,OAAO,MAAM,aAAa,OAAO,UAAU,MAAK;EAC3D;AACA,SAAO;IACL,OAAO,cAAc,WAAW,SAAS;IACzC,aAAa,cAAc;IAC3B,UAAU;;AAEd;AAEA,SAAS,iBAAiB,UAAsB;AAC9C,SAAO,EAAE,GAAI,SAAS,SAA+C;AACvE;AAEA,SAAS,mBACP,KACA,OACA,SAAkC;AAElC,MAAI;AACF,WAAO,kBAAkB,kBAAkB,KAAK,OAAO,GAAG,OAAO;EACnE,SAAS,OAAO;AACd,UAAM,IAAI,WACR,qBAAqB,KAAK,sCAAsC,OAAO,KAAK,CAAC,IAC7E,UAAU,eAAe;EAE7B;AACF;AAaA,SAAS,yBACP,YACA,YACA,cACA,WAA6B;AAE7B,QAAM,gBAAgB,IAAI,IAAY,4BAA4B;AAClE,QAAM,iBAAiB,IAAI,IAAY,4BAA4B;AACnE,QAAM,aAAa;IACjB,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,UAAU,GAAG,GAAG,OAAO,KAAK,YAAY,CAAC,CAAC;IACrE,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AACjD,QAAM,cAA4C;IAChD,QAAQ,CAAA;IACR,gBAAgB,CAAA;IAChB,kBAAkB,CAAA;IAClB,aAAa,CAAA;;AAGf,aAAW,SAAS,YAAY;AAC9B,UAAM,YAAY,WAAW,KAAK;AAClC,UAAM,YAAY,WAAW,KAAK;AAClC,UAAM,cAAc,aAAa,KAAK;AACtC,QAAI,cAAc,IAAI,KAAK,GAAG;AAC5B,YAAM,QAAQ,gBAAgB,WAAW,WAAW,WAAW;AAI/D,kBAAY,OAAO,KAAK,IAAI;AAC5B,UAAI,CAAC,WAAW,OAAO,SAAS,GAAG;AACjC,oBAAY,YAAY,KAAK,KAAK;MACpC;AACA;IACF;AACA,QAAI,eAAe,IAAI,KAAK,GAAG;AAC7B,kBAAY,OAAO,KAAK,IAAI,gBAAgB,WAAW,WAAW;AAClE;IACF;AACA,UAAM,UAAU,oBACd,WACA,WACA,aACA,SAAS;AAEX,QAAI,QAAQ,UAAU,QAAW;AAC/B,kBAAY,OAAO,KAAK,IAAI,QAAQ;IACtC;AACA,QAAI,QAAQ,UAAU;AACpB,kBAAY,eAAe,KAAK,KAAK;IACvC,WAAW,QAAQ,aAAa;AAC9B,kBAAY,iBAAiB,KAAK,KAAK;IACzC;EACF;AACA,SAAO;AACT;AAcM,SAAU,mBACd,SACA,SACA,WACA,UAGI,CAAA,GAAE;AAEN,QAAM,YAAgC,QAAQ,aAAa;AAI3D,QAAM,UAAU,QAAQ,KAAI,EAAG,SAAS;AACxC,QAAM,OAAO,mBAAmB,SAAS,QAAQ,OAAO;AACxD,QAAM,SAAS,mBAAmB,WAAW,UAAU,OAAO;AAC9D,QAAM,OAAO,UAAU,mBAAmB,SAAS,QAAQ,OAAO,IAAI;AAEtE,QAAM,aAAa,UACf,iBAAiB,IAAI,IACpB,CAAA;AACL,QAAM,aAAa,iBAAiB,IAAI;AACxC,QAAM,eAAe,iBAAiB,MAAM;AAC5C,QAAM,EAAE,QAAQ,gBAAgB,kBAAkB,YAAW,IAC3D,yBAAyB,YAAY,YAAY,cAAc,SAAS;AAE1E,QAAM,cAAc,oBAClB,UAAU,KAAK,OAAO,IACtB,KAAK,MACL,OAAO,MACP,SAAS;AAEX,MAAI,YAAY,UAAU;AACxB,mBAAe,KAAK,MAAM;EAC5B,WAAW,YAAY,aAAa;AAClC,qBAAiB,KAAK,MAAM;EAC9B;AAEA,QAAM,YAAY,sBAChB;IACE,UAAU;IACV,MAAM,YAAY;KAEpB,OAAO;AAET,SAAO;IACL,QAAQ;IACR,iBAAiB;IACjB,oBAAoB;IACpB,cAAc;IACd;;AAEJ;AAcA,SAAS,cAAc,OAAc;AACnC,SACE,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,KAAK;AAExB;AAEA,SAAS,cAAc,KAAa,OAAa;AAC/C,QAAM,iBAAiB,6BAA6B,GAAG;AACvD,MAAI,gBAAgB;AAClB,UAAM,IAAI,WACR,qBAAqB,KAAK,kDAAkD,eAAe,IAAI,KAC/F,UAAU,eAAe;EAE7B;AACA,MAAI,IAAI,KAAI,EAAG,WAAW,GAAG;AAC3B,WAAO;EACT;AACA,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;EACvB,QAAQ;AACN,UAAM,IAAI,WACR,qBAAqB,KAAK,wBAC1B,UAAU,eAAe;EAE7B;AACF;AAEA,SAAS,eACP,MACA,MACA,QACA,WACA,YACA,eACA,iBAAyB;AAEzB,MAAI,WAAW,MAAM,MAAM,GAAG;AAC5B,WAAO;EACT;AACA,MAAI,cAAc,IAAI,KAAK,cAAc,MAAM,GAAG;AAChD,UAAM,aAAa,cAAc,IAAI,IAAI,OAAO,CAAA;AAChD,UAAM,SAAkC,CAAA;AACxC,UAAM,OAAO;MACX,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC;MACzD,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AACjD,eAAW,OAAO,MAAM;AACtB,YAAM,YAAY,WAAW,SAAS,IAAI,GAAG,UAAU,IAAI,GAAG,KAAK;AACnE,YAAM,QAAQ,aACZ,YACA,MACA,QACA,KACA,WACA,WACA,eACA,eAAe;AAEjB,UAAI,UAAU,QAAW;AACvB,eAAO,GAAG,IAAI;MAChB;IACF;AACA,WAAO;EACT;AACA,QAAM,UAAU,oBAAoB,MAAM,MAAM,QAAQ,SAAS;AACjE,MAAI,QAAQ,UAAU;AACpB,kBAAc,KAAK,UAAU;EAC/B,WAAW,QAAQ,aAAa;AAC9B,oBAAgB,KAAK,UAAU;EACjC;AACA,SAAO,QAAQ;AACjB;AAEA,SAAS,aACP,MACA,MACA,QACA,KACA,WACA,WACA,eACA,iBAAyB;AAEzB,QAAM,SAAS,OAAO,UAAU,eAAe,KAAK,MAAM,GAAG;AAC7D,QAAM,WAAW,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG;AACjE,QAAM,SAAS,OAAO,UAAU,eAAe,KAAK,MAAM,GAAG;AAC7D,MAAI,UAAU,UAAU;AACtB,WAAO,eACL,KAAK,GAAG,GACR,KAAK,GAAG,GACR,OAAO,GAAG,GACV,WACA,WACA,eACA,eAAe;EAEnB;AACA,MAAI,QAAQ;AAGV,QAAI,UAAU,WAAW,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG;AAC9C,sBAAgB,KAAK,SAAS;AAC9B,aAAO;IACT;AACA,QAAI,QAAQ;AACV,oBAAc,KAAK,SAAS;AAC5B,aAAO,cAAc,WAAW,SAAY,KAAK,GAAG;IACtD;AACA,WAAO,KAAK,GAAG;EACjB;AAEA,MAAI,UAAU,WAAW,KAAK,GAAG,GAAG,OAAO,GAAG,CAAC,GAAG;AAChD,WAAO;EACT;AACA,MAAI,QAAQ;AACV,kBAAc,KAAK,SAAS;AAC5B,WAAO,cAAc,WAAW,OAAO,GAAG,IAAI;EAChD;AACA,kBAAgB,KAAK,SAAS;AAC9B,SAAO,OAAO,GAAG;AACnB;AAWM,SAAU,mBACd,SACA,SACA,WACA,UAGI,CAAA,GAAE;AAEN,QAAM,YAAgC,QAAQ,aAAa;AAC3D,QAAM,OAAO,cAAc,SAAS,MAAM;AAC1C,QAAM,OAAO,cAAc,SAAS,MAAM;AAC1C,QAAM,SAAS,cAAc,WAAW,QAAQ;AAChD,QAAM,gBAA0B,CAAA;AAChC,QAAM,kBAA4B,CAAA;AAClC,QAAM,SAAS,eACb,MACA,MACA,QACA,WACA,IACA,eACA,eAAe;AAEjB,SAAO;IACL,QAAQ,GAAG,KAAK,UAAU,UAAU,MAAM,MAAM,CAAC,CAAC;;IAClD,gBAAgB;IAChB,mBAAmB;IACnB;;AAEJ;;;ACpyBA,SAAS,UAAU,iBAAiB;AACpC,OAAO,UAAU;;;;;;;;AAoBV,IAAM,+BAA+B;EAC1C;EACA;EACA;EACA;;AAoEF,SAAS,gBAAgB,OAAa;AACpC,QAAM,aAAa,MAAM,KAAI,EAAG,YAAW;AAC3C,MACG,6BAAmD,SAAS,UAAU,GACvE;AACA,WAAO;EACT;AACA,QAAM,IAAI,WACR,2BAA2B,KAAK,wBAAwB,6BAA6B,KAAK,IAAI,CAAC,KAC/F,UAAU,KAAK;AAEnB;AAEA,SAAS,qBAAqB,OAAyB;AACrD,MAAI,UAAU,QAAW;AACvB,WAAO;EACT;AACA,QAAM,aAAa,MAAM,KAAI,EAAG,YAAW;AAC3C,MAAI,eAAe,UAAU,eAAe,UAAU;AACpD,WAAO;EACT;AACA,QAAM,IAAI,WACR,2BAA2B,KAAK,sCAChC,UAAU,KAAK;AAEnB;AAEA,eAAe,aAAa,UAAkB,OAAa;AACzD,MAAI;AACF,WAAO,MAAM,SAAS,UAAU,MAAM;EACxC,QAAQ;AACN,UAAM,IAAI,WACR,qBAAqB,KAAK,YAAY,QAAQ,KAC9C,UAAU,SAAS;EAEvB;AACF;AAQA,eAAe,qBACbA,SAAqB;AAErB,QAAM,SAAS,cAAc,QAAQ,IAAG,GAAIA,QAAO,IAAI;AACvD,MAAI,CAAE,MAAM,WAAW,gBAAgB,MAAM,CAAC,GAAI;AAChD,WAAO;EACT;AACA,SAAO,aAAa,MAAM;AAC5B;AAEA,SAAS,kBACP,UACA,UAA2B;AAE3B,MAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,WAAO;EACT;AACA,MAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,WAAO;EACT;AACA,SAAO,UAAU,eAAe;AAClC;AASA,eAAsB,eACpB,SACAA,SAAqB;AAErB,QAAM,WAAW,gBAAgB,QAAQ,QAAQ;AACjD,QAAM,YAAY,qBAAqB,QAAQ,MAAM;AACrD,QAAM,aAAa,KAAK,QAAQ,QAAQ,cAAc,QAAQ,QAAQ;AACtE,QAAM,CAAC,SAAS,SAAS,SAAS,IAAI,MAAM,QAAQ,IAAI;IACtD,aAAa,QAAQ,UAAU,MAAM;IACrC,aAAa,QAAQ,UAAU,MAAM;IACrC,aAAa,QAAQ,YAAY,QAAQ;GAC1C;AAED,MAAI;AACJ,QAAM,YAAsB,CAAA;AAC5B,QAAM,SAAqC,CAAA;AAC3C,MAAI,aAAa,WAAW;AAC1B,UAAM,eAAe,oBAAoB,SAAS,SAAS,SAAS;AACpE,aAAS,aAAa;AACtB,WAAO,UAAU;MACf,UAAU,aAAa;MACvB,gBAAgB,aAAa;MAC7B,mBAAmB,aAAa;MAChC,qBAAqB,aAAa;MAClC,eAAe,aAAa;MAC5B,YAAY,aAAa;;EAE7B,WAAW,aAAa,gBAAgB;AACtC,UAAM,oBAAoB,8BACxB,SACA,SACA,SAAS;AAEX,aAAS,kBAAkB;AAC3B,WAAO,eAAe;MACpB,UAAU,kBAAkB;MAC5B,gBAAgB,kBAAkB;MAClC,mBAAmB,kBAAkB;MACrC,qBAAqB,kBAAkB;MACvC,eAAe,kBAAkB;MACjC,YAAY,kBAAkB;;EAElC,WAAW,aAAa,QAAQ;AAC9B,UAAM,WAAW,MAAM,qBAAqBA,OAAM;AAClD,UAAM,YAAY,mBAAmB,SAAS,SAAS,WAAW;MAChE,QAAQ,kBAAkB,QAAQ,YAAY,YAAY,QAAQ;MAClE,QAAQ,UAAU;MAClB,qBAAqB,gCACnB,gCAA+B,CAAE;MAEnC;KACD;AACD,aAAS,UAAU;AACnB,cAAU,KAAK,GAAG,UAAU,eAAe;AAC3C,WAAO,OAAO;MACZ,oBAAoB,UAAU;MAC9B,cAAc,UAAU;;EAE5B,OAAO;AACL,UAAM,YAAY,mBAAmB,SAAS,SAAS,WAAW;MAChE;KACD;AACD,aAAS,UAAU;AACnB,cAAU,KAAK,GAAG,UAAU,cAAc;AAC1C,WAAO,OAAO;MACZ,mBAAmB,UAAU;;EAEjC;AAEA,QAAM,UAAU,YAAY,QAAQ,MAAM;AAC1C,QAAM,WAAqB,CAAA;AAC3B,MAAI,UAAU,SAAS,GAAG;AACxB,aAAS,KACP,yBAAyB,UAAU,KAAK,IAAI,CAAC,SAAS,SAAS,mGAAmG;EAEtK;AACA,MAAI,aAAa,aAAa,OAAO,SAAS,YAAY;AACxD,aAAS,KACP,8KAA8K;EAElL;AACA,SAAO;IACL,IAAI,UAAU,WAAW;IACzB;IACA,aAAa;IACb;IACA;IACA,GAAG;IACH;IACA,cAAc,OAAM;;AAExB;A;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3PA,IAAM,oBAAoB,CAAC,MAAM,MAAM,UAAU,SAAS;AAC1D,IAAM,qBAAqB;EACzB;EACA;EACA;EACA;EACA;;AAEF,IAAM,sBAAsB,oBAAI,IAAI;EAClC;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AACD,IAAM,6BAA6B,oBAAI,IAAI,CAAC,GAAG,qBAAqB,IAAI,CAAC;AACzE,IAAM,kBAAkB,oBAAI,IAAI;EAC9B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AACD,IAAM,uBAEF;EACF,QAAQ,+CAA+C,IACrD,CAAC,aAAa,SAAS,MAAM;EAE/B,QAAQ,+CAA+C,IACrD,CAAC,aAAa,SAAS,MAAM;EAE/B,OAAO,qBAAqB,IAAI,CAAC,aAC/B,SAAS,KACN,MAAM,CAAC,EACP,WAAW,cAAc,CAAC,QAAQ,WACjC,OAAO,YAAW,CAAE,CACrB,EACH,OAAO,CAAC,QAAQ,QAAQ,QAAQ;;AAc9B,SAAU,4BACd,OAA8B;AAE9B,QAAM,WAAmC,CAAA;AACzC,QAAM,eAAe,MAAM;AAC3B,MAAI,iBAAiB,QAAW;AAC9B,QAAI,iBAAiB,WAAW,iBAAiB,UAAU;AACzD,YAAM,IAAI,WACR,+CACA,UAAU,KAAK;IAEnB;AACA,aAAS,qBAAqB;EAChC;AACA,aAAW,OAAO,CAAC,kBAAkB,YAAY,GAAY;AAC3D,UAAM,MAAM,MAAM,GAAG;AACrB,QAAI,QAAQ;AAAW;AACvB,UAAM,SACJ,OAAO,QAAQ,YACd,OAAO,QAAQ,YAAY,IAAI,KAAI,EAAG,SAAS,IAC5C,OAAO,GAAG,IACV,OAAO;AACb,QAAI,CAAC,OAAO,cAAc,MAAM,KAAK,UAAU,GAAG;AAChD,YAAM,IAAI,WACR,GAAG,GAAG,qCACN,UAAU,KAAK;IAEnB;AACA,aAAS,GAAG,IAAI;EAClB;AACA,SAAO;AACT;AAEA,SAASC,eAAc,OAAc;AACnC,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,WAAO;EACT;AACA,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,SAAO,cAAc,OAAO,aAAa,cAAc;AACzD;AAEA,SAAS,WACP,KACA,YAA6B;AAE7B,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;AACrE,MAAI;AACJ,aAAW,aAAa,YAAY;AAClC,UAAM,WAAW,+BAA+B,KAAK,WAAW,KAAK;AACrE,QAAI,aAAa,SAAS,SAAS,UAAa,WAAW,KAAK,WAAW;AACzE,aAAO,EAAE,KAAK,WAAW,SAAQ;IACnC;EACF;AACA,SAAO,MAAM;AACf;AAEA,SAAS,gBACP,OACA,KACA,YAA6B;AAE7B,QAAM,aAAa,WAAW,KAAK,UAAU;AAC7C,SAAO,IAAI,WACT,eAAe,SACX,GAAG,KAAK,4BAA4B,GAAG,oBAAoB,WAAW,KAAK,IAAI,CAAC,MAChF,GAAG,KAAK,4BAA4B,GAAG,oBAAoB,UAAU,MACzE,UAAU,OACV;IACE,MAAM;IACN,UAAU,kBAAkB,KAAK;IACjC,KAAK;IACL,WAAW;MACT,eAAe,SACX,sBAAsB,GAAG,OACzB,YAAY,GAAG,WAAW,UAAU;;GAE3C;AAEL;AAEA,SAAS,eAAe,OAAe,OAAa;AAClD,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;EACzB,SAAS,OAAgB;AACvB,UAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACpE,UAAM,IAAI,WACR,GAAG,KAAK,wBAAwB,MAAM,IACtC,UAAU,OACV;MACE,MAAM;MACN,UAAU,uBAAuB,MAAM,YAAW,CAAE;MACpD,KAAK;KACN;EAEL;AACF;AAEA,SAAS,uBACP,OACA,OAAa;AAEb,MAAI,CAACA,eAAc,KAAK,GAAG;AACzB,UAAM,IAAI,WACR,YAAY,QAAQ,CAAC,uBACrB,UAAU,KAAK;EAEnB;AACA,aAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,QACE,CAAC,kBAAkB,SAAS,GAAyC,GACrE;AACA,YAAM,gBAAgB,YAAY,QAAQ,CAAC,IAAI,KAAK,iBAAiB;IACvE;EACF;AACA,SAAO;AACT;AAEA,SAAS,wBACP,SACA,IACA,OAAa;AAEb,MAAI,YAAY;AAAW,WAAO;AAClC,MAAI,CAACA,eAAc,OAAO,GAAG;AAC3B,UAAM,IAAI,WACR,YAAY,QAAQ,CAAC,+BACrB,UAAU,KAAK;EAEnB;AACA,aAAW,OAAO,OAAO,KAAK,OAAO,GAAG;AACtC,QAAI,CAAC,qBAAqB,EAAE,EAAE,SAAS,GAAG,GAAG;AAC3C,YAAM,gBACJ,YAAY,QAAQ,CAAC,IAAI,EAAE,YAC3B,KACA,qBAAqB,EAAE,CAAC;IAE5B;EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAgB,OAAa;AACxD,QAAM,WAAW,uBAAuB,OAAO,KAAK;AACpD,QAAM,EAAE,IAAI,IAAI,OAAM,IAAK;AAC3B,MAAI,OAAO,YAAY,OAAO,YAAY,OAAO,SAAS;AACxD,UAAM,IAAI,WACR,YAAY,QAAQ,CAAC,yCACrB,UAAU,KAAK;EAEnB;AACA,QAAM,UAAU,wBAAwB,SAAS,SAAS,IAAI,KAAK;AACnE,MAAI,OAAO,OAAO,YAAY,GAAG,KAAI,EAAG,WAAW,GAAG;AACpD,UAAM,IAAI,WACR,YAAY,QAAQ,CAAC,6BACrB,UAAU,KAAK;EAEnB;AACA,QAAM,eAAe,GAAG,KAAI;AAC5B,MAAI,OAAO,SAAS;AAClB,QAAI,OAAO,WAAW,YAAY,OAAO,KAAI,EAAG,WAAW,GAAG;AAC5D,YAAM,IAAI,WACR,YAAY,QAAQ,CAAC,uCACrB,UAAU,KAAK;IAEnB;AACA,WAAO;MACL;MACA,IAAI;MACJ,QAAQ,OAAO,KAAI;MACnB,GAAI,YAAY,SACZ,CAAA,IACA,EAAE,QAA+C;;EAEzD;AACA,MAAI,CAACA,eAAc,OAAO,GAAG;AAC3B,UAAM,IAAI,WACR,YAAY,QAAQ,CAAC,IAAI,EAAE,gCAC3B,UAAU,KAAK;EAEnB;AACA,SAAO;IACL;IACA,IAAI;IACJ;;AAEJ;AAGM,SAAU,uBAAuB,OAAa;AAClD,QAAM,SAAS,eAAe,OAAO,gBAAgB;AACrD,QAAM,OAAO,MAAM,QAAQ,MAAM,IAC7B,SACAA,eAAc,MAAM,KAAK,MAAM,QAAQ,OAAO,SAAS,IACrD,OAAO,YACP;AACN,MAAI,SAAS,UAAa,KAAK,WAAW,GAAG;AAC3C,UAAM,IAAI,WACR,gGACA,UAAU,KAAK;EAEnB;AACA,SAAO,KAAK,IAAI,CAAC,KAAK,UAAU,oBAAoB,KAAK,KAAK,CAAC;AACjE;AAEA,SAAS,eACP,OACA,MAAuB;AAEvB,SAAO,KACJ,OAAO,CAAC,QAAQ,MAAM,GAAG,MAAM,UAAa,MAAM,GAAG,MAAM,IAAI,EAC/D,IAAI,CAAC,QAAO;AACX,UAAM,WAAW,OAAO,MAAM,GAAG,CAAC;AAClC,WAAO,GAAG,GAAG,IAAI,cAAc,KAAK,QAAQ,IAAI,KAAK,UAAU,QAAQ,IAAI,QAAQ;EACrF,CAAC,EACA,KAAK,GAAG;AACb;AAEA,SAAS,qBACP,OACA,MACA,OAAa;AAEb,MAAI,UAAU;AAAW,WAAO;AAChC,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,MAAMA,cAAa,GAAG;AACxD,UAAM,IAAI,WACR,GAAG,KAAK,iCACR,UAAU,KAAK;EAEnB;AACA,SAAO,MAAM,IAAI,CAAC,UAAU,eAAe,OAAO,IAAI,CAAC;AACzD;AAEA,SAAS,iBAAiB,KAAa,OAAc;AACnD,MACE,QAAQ,UACR,MAAM,QAAQ,KAAK,KACnB,MAAM,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,GAChD;AACA,WAAO,KAAK,UAAU,KAAK;EAC7B;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AAC3D,WAAO,OAAO,KAAK;EACrB;AACA,SAAO;AACT;AAEA,SAAS,mBACP,QACA,QACA,2BAA2B,OAAK;AAEhC,QAAM,WACJ;IACE,CAAC,gBAAgB,OAAO,CAAC,MAAM,QAAQ,cAAc,QAAQ,CAAC;IAC9D,CAAC,YAAY,WAAW,CAAC,QAAQ,cAAc,QAAQ,CAAC;IACxD,CAAC,SAAS,QAAQ,CAAC,QAAQ,cAAc,QAAQ,CAAC;IAClD,CAAC,aAAa,YAAY,CAAC,QAAQ,cAAc,QAAQ,CAAC;IAC1D,CAAC,SAAS,QAAQ,CAAC,QAAQ,SAAS,MAAM,CAAC;IAC3C,CAAC,SAAS,QAAQ,CAAC,WAAW,SAAS,iBAAiB,CAAC;IACzD,CAAC,QAAQ,OAAO,CAAC,QAAQ,SAAS,MAAM,CAAC;IACzC,CAAC,aAAa,YAAY,CAAC,MAAM,QAAQ,YAAY,CAAC;IACtD,CAAC,UAAU,SAAS,CAAC,YAAY,UAAU,SAAS,UAAU,CAAC;IAC/D,CAAC,gBAAgB,cAAc,CAAC,OAAO,OAAO,CAAC;;AAEnD,aAAW,CAAC,WAAW,WAAW,IAAI,KAAK,UAAU;AACnD,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,aAAa,qBACjB,4BACE,CAAC,YAAY,SAAS,WAAW,EAAE,SAAS,SAAS,KACrD,MAAM,QAAQ,WAAW,IACvB,YAAY,OACV,CAAC,UACC,CAACA,eAAc,KAAK,KAAK,MAAM,eAAe,MAAS,IAE3D,aACJ,MACA,SAAS;AAEX,QAAI,eAAe,UAAa,WAAW,SAAS;AAClD,aAAO,SAAS,IAAI;EACxB;AACF;AAEA,SAAS,yBACP,QACA,UAAiB;AAEjB,aAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,QAAI,UAAU;AACZ,UACE,CAAC,mBAAmB,SAAS,GAA0C;AAEvE,cAAM,gBAAgB,iBAAiB,KAAK,kBAAkB;AAChE;IACF;AACA,QACE,CAAC,gBAAgB,IAAI,GAAG,KACxB,WAAW,KAAK,CAAC,GAAG,eAAe,CAAC,MAAM,UAC1C,WAAW,KAAK,kBAAkB,MAAM;AAExC,YAAM,gBAAgB,iBAAiB,KAAK,kBAAkB;EAClE;AACF;AAEA,SAAS,oBAAoB,QAA+B;AAI1D,QAAM,WAAW,OAAO,OAAO,QAAQ,MAAM;AAC7C,2BAAyB,QAAQ,QAAQ;AACzC,QAAM,OAAO,WAAW,OAAO,OAAO;AACtC,MAAI,CAACA,eAAc,IAAI,GAAG;AACxB,UAAM,IAAI,WACR,yCACA,UAAU,KAAK;EAEnB;AACA,SAAO;IACL;IACA,GAAI,YAAYA,eAAc,OAAO,MAAM,IACvC,EAAE,QAAQ,OAAO,OAAM,IACvB,CAAA;;AAER;AAEA,SAAS,wBACP,iBACA,KACA,OACA,MAAyB;AAEzB,QAAM,eACJ,SAAS,WAAW,6BAA6B;AACnD,MAAI,aAAa,IAAI,GAAG;AAAG;AAC3B,MAAI,CAAC,gBAAgB,IAAI,GAAG,GAAG;AAC7B,UAAM,aAAa,WAAW,KAAK,CAAC,GAAG,eAAe,CAAC;AACvD,QAAI,eAAe;AACjB,YAAM,gBAAgB,iBAAiB,KAAK,CAAC,GAAG,eAAe,CAAC;AAClE,UAAM,SAAS,MAAM,QAAQ,gBAAgB,KAAK,IAC7C,gBAAgB,QACjB,CAAA;AACJ,WAAO,KACL,eACE;MACE;MACA,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;OAEjE,CAAC,OAAO,OAAO,CAAC,CACjB;AAEH,oBAAgB,QAAQ;AACxB;EACF;AACA,MACE;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,GAAG;AAEd;AACF,kBACE,IAAI,WAAW,cAAc,CAAC,QAAQ,WACpC,OAAO,YAAW,CAAE,CACrB,IACC,iBAAiB,KAAK,KAAK;AACjC;AAMM,SAAU,8BACd,OACA,MACA,kBAA2C,CAAA,GAAE;AAE7C,QAAM,SAAS,eAAe,OAAO,eAAe;AACpD,MAAI,CAACA,eAAc,MAAM,GAAG;AAC1B,UAAM,IAAI,WACR,wCACA,UAAU,KAAK;EAEnB;AACA,QAAM,EAAE,MAAM,OAAM,IAAK,oBAAoB,MAAM;AACnD,QAAM,kBAA2C,CAAA;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,4BAAwB,iBAAiB,KAAK,OAAO,IAAI;EAC3D;AACA,qBAAmB,iBAAiB,MAAM,SAAS,QAAQ;AAC3D,MAAI,WAAW;AAAW,uBAAmB,iBAAiB,MAAM;AACpE,SAAO;IACL,GAAG;IACH,GAAG,OAAO,YACR,OAAO,QAAQ,eAAe,EAAE,OAC9B,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,CACnC;IAEH,WAAW;;AAEf;AAGM,SAAU,yBAAyB,OAAc;AACrD,SAAO,uBAAuB,KAAK,UAAU,KAAK,CAAC;AACrD;;;AC5gBA,OAAOC,WAAU;;;;;;;;AAkHjB,eAAe,iBACb,QACA,IAAU;AAEV,MAAI;AACF,UAAM,UAAU,MAAM,IAAI,IAAI,CAAA,GAAI,EAAE,OAAM,CAAE;AAC5C,UAAM,OAAO,QAAQ;AAKrB,WAAO;MACL,IAAI,KAAK;MACT,UAAU,KAAK;MACf,WAAW,KAAK;;EAEpB,SAAS,OAAO;AACd,QACE,iBAAiB,cACjB,MAAM,aAAa,UAAU,WAC7B;AACA,aAAO;IACT;AACA,UAAM;EACR;AACF;AAGA,SAAS,aAAa,UAA4B,OAAa;AAC7D,QAAM,kBAAkB,SAAS,GAAG,WAAW,qBAAqB,GAAG;AACvE,SAAO,GAAG,QAAQ,CAAC,IAAI,SAAS,EAAE,IAAI,eAAe;AACvD;AAGA,SAAS,kBACP,eACA,QACA,OAA6B;AAE7B,SAAO,yBAAyB,aAAa,IAAI,MAAM,IAAI,KAAK;AAClE;AAQA,eAAe,sBACb,QACA,aACA,eACA,QAAc;AAEd,QAAM,UAAU,MAAM,mBACpBC,MAAK,KAAK,QAAQ,WAAW,GAAG,WAAW,QAAQ,GACnD,WAAW;AAEb,QAAM,cAAc,kBAAkB,eAAe,QAAQ,OAAO;AACpE,QAAM,mBAAmB,kBAAkB,eAAe,QAAQ,YAAY;AAC9E,WAAS,QAAQ,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC3D,UAAM,UAAU,QAAQ,KAAK,EAAE;AAC/B,QAAI,YAAY,aAAa;AAC3B,aAAO;IACT;AACA,QAAI,YAAY,kBAAkB;AAChC,aAAO;IACT;EACF;AACA,SAAO;AACT;AAGA,eAAe,2BACb,QACA,UAA0B;AAE1B,QAAM,WAAW,MAAM,iBAAiB,QAAQ,SAAS,EAAE;AAC3D,MAAI,UAAU,cAAc,QAAW;AACrC,UAAM,IAAI,WACR,QAAQ,SAAS,EAAE,WAAW,SAAS,EAAE,gDACzC,UAAU,SAAS;EAEvB;AACA,SAAO,EAAE,mBAAmB,SAAS,UAAS;AAChD;AAGA,eAAe,oBACb,QACA,QACA,QACA,MAA+C;AAE/C,QAAM,SACJ,SAAS,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,IAC5D,KAAK,oBACL;AACN,MAAI,OAAO,WAAW,UAAU;AAC9B;EACF;AACA,MAAK,MAAM,iBAAiB,OAAO,QAAQ,MAAM,MAAO,QAAW;AACjE;EACF;AACA,QAAM,QACJ,QACA,QACA;IACE,OAAO;IACP,QAAQ,OAAO;IACf,SAAS,kBAAkB,OAAO,eAAe,QAAQ,YAAY;KAEvE,EAAE,QAAQ,OAAO,OAAM,CAAE;AAE7B;AAGA,SAAS,gBACP,QAMA,UACA,QAAc;AAEd,SAAO;IACL,IAAI;IACJ,MAAM,UAAO;AACX,YAAM,WAAW,MAAM,iBAAiB,OAAO,QAAQ,SAAS,EAAE;AAClE,UAAI,aAAa,QAAW;AAC1B,eAAO,EAAE,OAAO,UAAS;MAC3B;AACA,aAAO,EAAE,OAAO,WAAW,QAAQ,EAAE,IAAI,SAAS,IAAI,IAAI,SAAQ,EAAE;IACtE;IACA,MAAM,QAAK;AACT,YAAM,UAAU,MAAM,OACpB,EAAE,GAAG,SAAS,SAAS,QAAQ,OAAO,QAAQ,IAAI,SAAS,GAAE,GAC7D,EAAE,QAAQ,OAAO,OAAM,CAAE;AAE3B,YAAM,cAAc,QAAQ;AAC5B,aAAO,EAAE,IAAI,OAAO,YAAY,EAAE,GAAG,IAAI,SAAQ;IACnD;IACA,MAAM,aAAU;AACd,YAAM,WAAW,MAAM,iBAAiB,OAAO,QAAQ,SAAS,EAAE;AAClE,UAAI,aAAa,QAAW;AAC1B;MACF;AACA,UAAI,OAAO,uBAAuB,UAAU;AAC1C,cAAM,WACJ,SAAS,IACT;UACE,OAAO;UACP,QAAQ,OAAO;UACf,SAAS,2CAA2C,OAAO,aAAa;WAE1E,EAAE,QAAQ,OAAO,OAAM,CAAE;AAE3B;MACF;AACA,UAAI,SAAS,aAAa,QAAW;AACnC;MACF;AACA,YAAM,MACJ,SAAS,IACT,6CAA6C,OAAO,aAAa,IACjE,EAAE,OAAO,MAAM,QAAQ,OAAO,OAAM,GACpC,EAAE,QAAQ,OAAO,OAAM,CAAE;IAE7B;;AAEJ;AAGA,SAAS,gBACP,QACA,UACA,QAAc;AAEd,SAAO;IACL,IAAI;IACJ,MAAM,UAAO;AACX,YAAM,WAAW,MAAM,iBAAiB,OAAO,QAAQ,SAAS,EAAE;AAClE,UAAI,aAAa,QAAW;AAC1B,eAAO,EAAE,OAAO,UAAS;MAC3B;AACA,YAAM,UAAU,MAAM,sBACpB,OAAO,QACP,SAAS,IACT,OAAO,eACP,MAAM;AAER,UAAI,CAAC,SAAS;AACZ,eAAO,EAAE,OAAO,UAAS;MAC3B;AACA,aAAO,EAAE,OAAO,WAAW,QAAQ,EAAE,IAAI,SAAS,IAAI,IAAI,SAAQ,EAAE;IACtE;IACA,MAAM,sBAAmB;AACvB,aAAO,2BAA2B,OAAO,QAAQ,QAAQ;IAC3D;IACA,MAAM,QAAK;AACT,YAAM,UAAU,MAAM,OACpB,SAAS,IACT;QACE,GAAG,SAAS;QACZ,QAAQ,OAAO;QACf,SAAS,kBAAkB,OAAO,eAAe,QAAQ,OAAO;SAElE,EAAE,QAAQ,OAAO,OAAM,CAAE;AAE3B,YAAM,cAAc,QAAQ;AAC5B,aAAO,EAAE,IAAI,OAAO,YAAY,EAAE,GAAG,IAAI,SAAQ;IACnD;IACA,MAAM,WACJ,MAAoC;AAEpC,YAAM,oBAAoB,QAAQ,SAAS,IAAI,QAAQ,IAAI;IAC7D;;AAEJ;AAGA,SAAS,eACP,QACA,UACA,QAAc;AAEd,SAAO;IACL,IAAI;;;IAGJ,MAAM,UAAO;AACX,YAAM,WAAW,MAAM,iBAAiB,OAAO,QAAQ,SAAS,EAAE;AAClE,UAAI,UAAU,aAAa,QAAW;AACpC,eAAO,EAAE,OAAO,UAAS;MAC3B;AACA,aAAO,EAAE,OAAO,WAAW,QAAQ,EAAE,IAAI,SAAS,IAAI,IAAI,QAAO,EAAE;IACrE;IACA,MAAM,sBAAmB;AACvB,aAAO,2BAA2B,OAAO,QAAQ,QAAQ;IAC3D;IACA,MAAM,QAAK;AACT,YAAM,SAAS,MAAM,MACnB,SAAS,IACT,SAAS,QACT,EAAE,GAAG,SAAS,SAAS,QAAQ,OAAO,OAAM,GAC5C,EAAE,QAAQ,OAAO,OAAM,CAAE;AAE3B,YAAM,aAAa,OAAO;AAC1B,aAAO,EAAE,IAAI,OAAO,WAAW,EAAE,GAAG,IAAI,QAAO;IACjD;IACA,MAAM,WACJ,MAAoC;AAEpC,YAAM,oBAAoB,QAAQ,SAAS,IAAI,QAAQ,IAAI;IAC7D;;AAEJ;AAGA,SAAS,qBACP,QAMA,UACA,OAAa;AAEb,QAAM,SAAS,aAAa,UAAU,KAAK;AAC3C,MAAI,SAAS,OAAO,UAAU;AAC5B,WAAO,gBAAgB,QAAQ,UAAU,MAAM;EACjD;AACA,MAAI,SAAS,OAAO,UAAU;AAC5B,WAAO,gBAAgB,QAAQ,UAAU,MAAM;EACjD;AACA,SAAO,eAAe,QAAQ,UAAU,MAAM;AAChD;AAGA,SAAS,wBACP,UACA,OAAa;AAEb,MACE,aAAa,QACb,OAAO,aAAa,YACpB,MAAM,QAAQ,QAAQ,GACtB;AACA,UAAM,IAAI,UAAU,iBAAiB,QAAQ,CAAC,oBAAoB;EACpE;AACA,MAAI,CAAC,CAAC,UAAU,UAAU,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG;AACxD,UAAM,IAAI,UACR,iBAAiB,QAAQ,CAAC,sCAAsC;EAEpE;AACA,MAAI,OAAO,SAAS,OAAO,YAAY,SAAS,GAAG,KAAI,EAAG,WAAW,GAAG;AACtE,UAAM,IAAI,UAAU,iBAAiB,QAAQ,CAAC,0BAA0B;EAC1E;AACA,MACE,SAAS,OAAO,YACf,OAAO,SAAS,WAAW,YAAY,SAAS,OAAO,KAAI,EAAG,WAAW,IAC1E;AACA,UAAM,IAAI,UACR,uBAAuB,QAAQ,CAAC,8BAA8B;EAElE;AACF;AAaA,eAAsB,oBACpB,SAAmC;AAEnC,QAAM,YAAY,CAAC,GAAG,QAAQ,SAAS;AACvC,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,IAAI,UAAU,sDAAsD;EAC5E;AACA,aAAW,CAAC,OAAO,QAAQ,KAAK,UAAU,QAAO,GAAI;AACnD,4BAAwB,UAAU,KAAK;EACzC;AACA,QAAM,qBAAqB,QAAQ,sBAAsB;AACzD,MAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,kBAAkB,GAAG;AACrD,UAAM,IAAI,UACR,kEAAkE;EAEtE;AACA,QAAM,aAAa;IACjB,QAAQ,QAAQ;IAChB,QAAQ,QAAQ;IAChB,eAAe,QAAQ;IACvB;;AAEF,QAAM,YAAY,MAAM,2BAA2B;IACjD,QAAQ,QAAQ;IAChB,eAAe,QAAQ;IACvB,QAAQ,QAAQ;IAChB,OAAO,UAAU,IAAI,CAAC,UAAU,UAC9B,qBAAqB,YAAY,UAAU,KAAK,CAAC;IAEnD,GAAI,QAAQ,mBAAmB,SAC3B,CAAA,IACA,EAAE,gBAAgB,QAAQ,eAAc;IAC5C,GAAI,QAAQ,eAAe,SACvB,CAAA,IACA,EAAE,YAAY,QAAQ,WAAU;IACpC,GAAI,QAAQ,iBAAiB,SACzB,CAAA,IACA,EAAE,cAAc,QAAQ,aAAY;GACzC;AACD,QAAM,UAAmD,CAAA;AACzD,aAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,UAAU,OAAO,GAAG;AAG/D,YAAQ,MAAM,IAAI;EACpB;AACA,SAAO;IACL,eAAe,UAAU;IACzB,QAAQ;IACR,WAAW,UAAU;IACrB;;AAEJ;AAGO,IAAM,2BAA2B;EACtC;EACA;EACA;EACA;EACA;EACA;;",
|
|
6
|
-
"names": ["global", "isPlainObject", "path", "path"]
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../cli/commands/update.ts"],"sourcesContent":["/**\n * @module cli/commands/update\n *\n * Implements the pm update command surface and its agent-facing runtime behavior.\n */\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport {\n COMMON_MUTATION_COMMAND_OPTION_KEYS,\n canonicalizeCommandOptionKey,\n commandOptionFlagLabel,\n resolveItemTypeRegistry,\n resolveCommandOptionPolicyState,\n resolveTypeDefinition,\n resolveTypeName,\n validateTypeOptions,\n} from \"../../core/item/type-registry.js\";\nimport { normalizeItemId } from \"../../core/item/id.js\";\nimport { toItemRecord } from \"../../core/item/item-record.js\";\nimport { buildInvalidTypeError } from \"../../core/schema/item-types-file.js\";\nimport {\n assertParentReferenceIsNotSelf,\n normalizeParentReferenceValue,\n validateMissingParentReference,\n} from \"../../core/item/parent-reference-policy.js\";\nimport { validateSprintOrReleaseValue } from \"../../core/item/sprint-release-format.js\";\nimport {\n applyAcceptanceCriteriaMutations,\n applyTagRemovals,\n assertNoUnknownCsvKeys,\n createStdinTokenResolver,\n looksLikeGenericKeyValueEntry,\n mergeAdditiveTags,\n parseCsvKv,\n parseOptionalNonNegativeInteger,\n parseOptionalNumber,\n parseTags,\n splitAcceptanceCriteria,\n} from \"../../core/item/parse.js\";\nimport { resolvePriority } from \"../../core/item/priority.js\";\nimport { normalizeStatusInput } from \"../../core/item/status.js\";\nimport { collectRuntimeUpdateFieldValues } from \"../../core/schema/runtime-field-values.js\";\nimport {\n resolveItemTypesFilePath,\n resolveRuntimeFieldRegistry,\n resolveRuntimeStatusRegistry,\n type RuntimeFieldRegistry,\n type RuntimeStatusRegistry,\n} from \"../../core/schema/runtime-schema.js\";\nimport {\n describeAllowedTransitions,\n evaluateTransition,\n resolveTypeWorkflows,\n type NormalizedTypeWorkflow,\n} from \"../../core/schema/type-workflows.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 { stableValueEquals } from \"../../core/shared/serialization.js\";\nimport { resolveIsoOrRelative } from \"../../core/shared/time.js\";\nimport { getActiveExtensionRegistrations } from \"../../core/extensions/index.js\";\nimport {\n collectRegisteredItemFieldNames,\n applyRegisteredItemFieldDefaultsAndValidation,\n parseRegisteredItemFieldAssignments,\n} from \"../../core/extensions/item-fields.js\";\nimport {\n buildItemNotFoundError,\n listAllItemMetadataLight,\n locateItem,\n mutateItem,\n readLocatedItem,\n} from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport { runClose } from \"./close.js\";\nimport {\n normalizeRiskInput,\n normalizeSeverityInput,\n parseConfidenceInput,\n parseRegressionInput,\n} from \"./metadata-normalizers.js\";\nimport {\n applyLegacyNoneCollectionNormalizers,\n createLegacyNoneCollectionNormalizers,\n assertNoLegacyNoneToken,\n assertNoLegacyNoneTokens,\n isLegacyNoneToken,\n} from \"./legacy-none-tokens.js\";\nimport { ensureEnumValue as ensureEnum } from \"./recurrence-parsers.js\";\nimport {\n parseEventEntries,\n parseReminderEntries,\n parseTypeOptionEntries,\n} from \"./repeatable-metadata-parsers.js\";\nimport { assertValidBareDependencyFlagValue } from \"../../sdk/dependency-flag-validation.js\";\nimport { collectNewOrderingCycleWarnings } from \"../../sdk/graph/mutation-advisory.js\";\nimport type {\n Comment,\n Dependency,\n GovernanceWorkflowEnforcement,\n ItemFormat,\n ItemDocument,\n ItemMetadata,\n ItemStatus,\n LinkedDoc,\n LinkedFile,\n LinkedTest,\n LogNote,\n} from \"../../types/index.js\";\nimport {\n DEPENDENCY_KIND_VALUES,\n ISSUE_SEVERITY_VALUES,\n RISK_VALUES,\n} from \"../../types/index.js\";\nimport {\n parseDocs,\n parseFiles,\n parseLogSeed,\n parseTests,\n requireStringOption,\n} from \"./create.js\";\nimport {\n COMMON_UNSET_FIELD_DEFINITIONS_AFTER_CLOSE_REASON_BEFORE_AUTHOR,\n COMMON_UNSET_FIELD_DEFINITIONS_AFTER_AUTHOR,\n COMMON_UNSET_FIELD_DEFINITIONS_BEFORE_CLOSE_REASON,\n parseCommandUnsetTargets,\n resolveRuntimeUnsetFieldDefinition,\n type CommandUnsetFieldDefinition,\n} from \"./shared-unset-fields.js\";\nimport type {\n MutationMetadataCommandOptions,\n SharedLinkedResourceClearOptions,\n SharedLinkedResourceOptions,\n} from \"./mutation-command-options.js\";\n\n/** Documents the update command options payload exchanged by command, SDK, and package integrations. */\nexport interface UpdateCommandOptions\n extends\n MutationMetadataCommandOptions,\n SharedLinkedResourceOptions,\n SharedLinkedResourceClearOptions {\n /** Value that configures or reports title for this contract. */\n title?: string;\n /** Value that configures or reports description for this contract. */\n description?: string;\n /** Value that configures or reports body for this contract. */\n body?: string;\n /** Lifecycle state reported for status. */\n status?: string;\n /** Value that configures or reports close reason for this contract. */\n closeReason?: string;\n /** Value that configures or reports priority for this contract. */\n priority?: string | number;\n /** Schema type that determines the shape and validation rules for this value. */\n type?: string;\n /** Value that configures or reports tags for this contract. */\n tags?: string;\n /** Value that configures or reports add tags for this contract. */\n addTags?: string[];\n /** Value that configures or reports remove tags for this contract. */\n removeTags?: string[];\n /** Acceptance criteria appended individually without replacing the existing list. */\n addAc?: string[];\n /** Acceptance criteria removed individually by exact text match. */\n removeAc?: string[];\n /** Value that configures or reports force for this contract. */\n force?: boolean;\n /** Value that configures or reports dep remove for this contract. */\n depRemove?: string[];\n /** Value that configures or reports replace deps for this contract. */\n replaceDeps?: boolean;\n /** Value that configures or reports replace tests for this contract. */\n replaceTests?: boolean;\n /** Value that configures or reports runtime field commands for this contract. */\n runtimeFieldCommands?: Array<\"update\" | \"update_many\">;\n [key: string]: unknown;\n}\n\n/** Documents the update result payload exchanged by command, SDK, and package integrations. */\nexport interface UpdateResult {\n /** Value that configures or reports item for this contract. */\n item: Record<string, unknown>;\n /** Value that configures or reports changed fields for this contract. */\n changed_fields: string[];\n /** Value that configures or reports warnings for this contract. */\n warnings: string[];\n}\n\ninterface UpdateUnsetFieldDefinition {\n optionKey: string;\n metadataKey: string;\n}\n\nconst UPDATE_UNSET_FIELD_DEFINITIONS: readonly CommandUnsetFieldDefinition[] = [\n ...COMMON_UNSET_FIELD_DEFINITIONS_BEFORE_CLOSE_REASON,\n {\n canonical: \"close-reason\",\n aliases: [\"close_reason\", \"close-reason\"],\n optionKey: \"closeReason\",\n metadataKey: \"close_reason\",\n },\n ...COMMON_UNSET_FIELD_DEFINITIONS_AFTER_CLOSE_REASON_BEFORE_AUTHOR,\n ...COMMON_UNSET_FIELD_DEFINITIONS_AFTER_AUTHOR,\n];\n\nconst UPDATE_UNSET_ALIAS_MAP: Map<string, UpdateUnsetFieldDefinition> = (() => {\n const map = new Map<string, UpdateUnsetFieldDefinition>();\n for (const definition of UPDATE_UNSET_FIELD_DEFINITIONS) {\n for (const alias of definition.aliases) {\n map.set(alias, {\n optionKey: definition.optionKey,\n metadataKey: definition.metadataKey,\n });\n }\n }\n return map;\n})();\n\nconst UPDATE_OPTION_KEY_TO_UNSET_CANONICAL = new Map<string, string>(\n UPDATE_UNSET_FIELD_DEFINITIONS.map((definition) => [\n definition.optionKey,\n definition.canonical,\n ]),\n);\n\nconst UPDATE_UNSET_SUPPORTED_CANONICAL_FIELDS =\n UPDATE_UNSET_FIELD_DEFINITIONS.map((definition) => definition.canonical)\n .sort((left, right) => left.localeCompare(right))\n .join(\", \");\n\nconst OWNERSHIP_BYPASS_DISALLOWED_UNSET_ITEM_METADATA_KEYS = new Set<string>([\n \"close_reason\",\n \"assignee\",\n \"parent\",\n \"blocked_by\",\n \"blocked_reason\",\n \"unblock_note\",\n \"dependencies\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"files\",\n \"tests\",\n \"docs\",\n \"reminders\",\n \"events\",\n]);\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 || \"unknown\";\n}\n\nconst UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS =\n createLegacyNoneCollectionNormalizers<UpdateCommandOptions>({\n depDisableFlagKey: \"replaceDeps\",\n testDisableFlagKey: \"replaceTests\",\n });\n\nfunction normalizeLegacyNoneUpdateOptions(\n options: UpdateCommandOptions,\n): UpdateCommandOptions {\n const normalized: UpdateCommandOptions = {\n ...options,\n unset: options.unset ? [...options.unset] : undefined,\n };\n /* c8 ignore start -- unset dedupe helper branch permutations are covered by legacy option compatibility suites. */\n const appendUnsetTarget = (value: string): void => {\n const current = normalized.unset ? [...normalized.unset] : [];\n if (!current.includes(value)) {\n current.push(value);\n }\n normalized.unset = current;\n };\n /* c8 ignore stop */\n\n const scalarOptionKeys = new Set<string>([\n ...UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.keys(),\n \"rank\",\n ]);\n for (const optionKey of scalarOptionKeys) {\n const candidate = normalized[optionKey];\n if (typeof candidate !== \"string\" || !isLegacyNoneToken(candidate)) {\n continue;\n }\n /* c8 ignore start -- rank alias canonicalization is exercised in legacy-option compatibility tests. */\n const canonicalUnset =\n optionKey === \"rank\"\n ? \"order\"\n : (UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey) ?? optionKey);\n appendUnsetTarget(canonicalUnset);\n normalized[optionKey] = undefined;\n /* c8 ignore stop */\n }\n\n return applyLegacyNoneCollectionNormalizers(\n normalized,\n UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS,\n );\n}\n\nfunction parseUpdateUnsetTargets(\n raw: string[] | undefined,\n runtimeFieldRegistry?: RuntimeFieldRegistry,\n extensionFieldNames: readonly string[] = [],\n): { metadataKeys: Set<string>; optionKeys: Set<string> } {\n return parseCommandUnsetTargets({\n raw,\n supportedFields: UPDATE_UNSET_SUPPORTED_CANONICAL_FIELDS,\n resolveDefinition: (trimmed) => {\n const extensionFieldName = extensionFieldNames.find((fieldName) => {\n const normalizedFieldName = fieldName.toLowerCase();\n return (\n normalizedFieldName === trimmed ||\n normalizedFieldName.replaceAll(\"_\", \"-\") === trimmed ||\n normalizedFieldName.replaceAll(\"-\", \"_\") === trimmed\n );\n });\n const definition =\n UPDATE_UNSET_ALIAS_MAP.get(trimmed) ??\n resolveRuntimeUnsetFieldDefinition(\n trimmed,\n \"update\",\n runtimeFieldRegistry,\n ) ??\n (extensionFieldName\n ? { optionKey: \"field\", metadataKey: extensionFieldName }\n : undefined);\n return definition;\n },\n });\n}\n\n// Restricted append-style flags have dedicated commands with their own\n// ownership semantics; map each one to its exact replacement invocation so\n// scope errors tell the agent how to retry instead of dead-ending. The\n// evidence append flags are allowed by the metadata ownership bypass, but still used by\n// narrower scopes such as the dependency ownership bypass.\nconst OWNERSHIP_BYPASS_RESTRICTED_FLAG_REPLACEMENTS: ReadonlyMap<\n string,\n (id: string) => string\n> = new Map([\n [\n \"--comment\",\n (id: string) => `pm comments ${id} --add \"<text>\" --force`,\n ],\n [\n \"--file\",\n (id: string) =>\n `pm files ${id} --add \"path=<path>,scope=<scope>,note=<note>\" --force`,\n ],\n [\n \"--doc\",\n (id: string) =>\n `pm docs ${id} --add \"path=<path>,scope=<scope>,note=<note>\" --force`,\n ],\n]);\n\nfunction buildOwnershipBypassRestrictedOptionsError(params: {\n id: string;\n code: string;\n message: string;\n required: string;\n why: string;\n disallowedFlags: string[];\n}): PmCliError {\n // Only surface replacement commands for restricted flags the caller actually\n // passed, so the guidance is an exact retry path.\n const replacementCommands = params.disallowedFlags.flatMap((flag) => {\n const replacement = OWNERSHIP_BYPASS_RESTRICTED_FLAG_REPLACEMENTS.get(flag);\n return replacement ? [replacement(params.id)] : [];\n });\n const replacementSteps = params.disallowedFlags.flatMap((flag) => {\n const replacement = OWNERSHIP_BYPASS_RESTRICTED_FLAG_REPLACEMENTS.get(flag);\n return replacement\n ? [`Replace ${flag} with: ${replacement(params.id)}`]\n : [];\n });\n return new PmCliError(params.message, EXIT_CODE.USAGE, {\n code: params.code,\n required: params.required,\n why: params.why,\n ...(replacementCommands.length > 0\n ? { examples: replacementCommands }\n : {}),\n nextSteps: [\n `Re-run without: ${params.disallowedFlags.join(\", \")}`,\n ...replacementSteps,\n ],\n });\n}\n\nfunction enforceOwnershipBypassScope(\n id: string,\n options: UpdateCommandOptions,\n clearItemMetadataKeys: Set<string>,\n): void {\n const ownershipMetadataBypass = options.ownershipMetadataBypass === true;\n const ownershipDependencyBypass = options.ownershipDependencyBypass === true;\n if (!ownershipMetadataBypass && !ownershipDependencyBypass) {\n return;\n }\n if (ownershipMetadataBypass && ownershipDependencyBypass) {\n throw new PmCliError(\n \"Choose only one package-provided ownership bypass mode.\",\n EXIT_CODE.USAGE,\n );\n }\n const pushIf = (condition: boolean, flag: string, list: string[]): void => {\n if (condition) {\n list.push(flag);\n }\n };\n if (ownershipDependencyBypass) {\n const disallowedFlags: string[] = [];\n pushIf(options.title !== undefined, \"--title\", disallowedFlags);\n pushIf(options.description !== undefined, \"--description\", disallowedFlags);\n pushIf(options.body !== undefined, \"--body\", disallowedFlags);\n pushIf(options.status !== undefined, \"--status\", disallowedFlags);\n pushIf(\n options.closeReason !== undefined,\n \"--close-reason\",\n disallowedFlags,\n );\n pushIf(options.priority !== undefined, \"--priority\", disallowedFlags);\n pushIf(options.type !== undefined, \"--type\", disallowedFlags);\n pushIf(options.tags !== undefined, \"--tags\", disallowedFlags);\n pushIf(\n Array.isArray(options.addTags) && options.addTags.length > 0,\n \"--add-tags\",\n disallowedFlags,\n );\n pushIf(\n Array.isArray(options.removeTags) && options.removeTags.length > 0,\n \"--remove-tags\",\n disallowedFlags,\n );\n pushIf(options.deadline !== undefined, \"--deadline\", disallowedFlags);\n pushIf(\n options.estimatedMinutes !== undefined,\n \"--estimate\",\n disallowedFlags,\n );\n pushIf(\n options.acceptanceCriteria !== undefined,\n \"--acceptance-criteria\",\n disallowedFlags,\n );\n pushIf(\n Array.isArray(options.addAc) && options.addAc.length > 0,\n \"--add-ac\",\n disallowedFlags,\n );\n pushIf(\n Array.isArray(options.removeAc) && options.removeAc.length > 0,\n \"--remove-ac\",\n disallowedFlags,\n );\n pushIf(\n options.definitionOfReady !== undefined,\n \"--definition-of-ready\",\n disallowedFlags,\n );\n pushIf(\n options.order !== undefined || options.rank !== undefined,\n \"--order/--rank\",\n disallowedFlags,\n );\n pushIf(options.goal !== undefined, \"--goal\", disallowedFlags);\n pushIf(options.objective !== undefined, \"--objective\", disallowedFlags);\n pushIf(options.value !== undefined, \"--value\", disallowedFlags);\n pushIf(options.impact !== undefined, \"--impact\", disallowedFlags);\n pushIf(options.outcome !== undefined, \"--outcome\", disallowedFlags);\n pushIf(options.whyNow !== undefined, \"--why-now\", disallowedFlags);\n pushIf(options.assignee !== undefined, \"--assignee\", disallowedFlags);\n pushIf(options.parent !== undefined, \"--parent\", disallowedFlags);\n pushIf(options.reviewer !== undefined, \"--reviewer\", disallowedFlags);\n pushIf(options.risk !== undefined, \"--risk\", disallowedFlags);\n pushIf(options.confidence !== undefined, \"--confidence\", disallowedFlags);\n pushIf(options.sprint !== undefined, \"--sprint\", disallowedFlags);\n pushIf(options.release !== undefined, \"--release\", disallowedFlags);\n pushIf(options.blockedBy !== undefined, \"--blocked-by\", disallowedFlags);\n pushIf(\n options.blockedReason !== undefined,\n \"--blocked-reason\",\n disallowedFlags,\n );\n pushIf(\n options.unblockNote !== undefined,\n \"--unblock-note\",\n disallowedFlags,\n );\n pushIf(options.reporter !== undefined, \"--reporter\", disallowedFlags);\n pushIf(options.severity !== undefined, \"--severity\", disallowedFlags);\n pushIf(options.environment !== undefined, \"--environment\", disallowedFlags);\n pushIf(options.reproSteps !== undefined, \"--repro-steps\", disallowedFlags);\n pushIf(options.resolution !== undefined, \"--resolution\", disallowedFlags);\n pushIf(\n options.expectedResult !== undefined,\n \"--expected-result\",\n disallowedFlags,\n );\n pushIf(\n options.actualResult !== undefined,\n \"--actual-result\",\n disallowedFlags,\n );\n pushIf(\n options.affectedVersion !== undefined,\n \"--affected-version\",\n disallowedFlags,\n );\n pushIf(\n options.fixedVersion !== undefined,\n \"--fixed-version\",\n disallowedFlags,\n );\n pushIf(options.component !== undefined, \"--component\", disallowedFlags);\n pushIf(options.regression !== undefined, \"--regression\", disallowedFlags);\n pushIf(\n options.customerImpact !== undefined,\n \"--customer-impact\",\n disallowedFlags,\n );\n pushIf(options.depRemove !== undefined, \"--dep-remove\", disallowedFlags);\n pushIf(options.replaceDeps === true, \"--replace-deps\", disallowedFlags);\n pushIf(options.replaceTests === true, \"--replace-tests\", disallowedFlags);\n pushIf(options.comment !== undefined, \"--comment\", disallowedFlags);\n pushIf(options.note !== undefined, \"--note\", disallowedFlags);\n pushIf(options.learning !== undefined, \"--learning\", disallowedFlags);\n pushIf(options.file !== undefined, \"--file\", disallowedFlags);\n pushIf(options.test !== undefined, \"--test\", disallowedFlags);\n pushIf(options.doc !== undefined, \"--doc\", disallowedFlags);\n pushIf(options.reminder !== undefined, \"--reminder\", disallowedFlags);\n pushIf(options.event !== undefined, \"--event\", disallowedFlags);\n pushIf(options.typeOption !== undefined, \"--type-option\", disallowedFlags);\n pushIf(options.clearDeps === true, \"--clear-deps\", disallowedFlags);\n pushIf(options.clearComments === true, \"--clear-comments\", disallowedFlags);\n pushIf(options.clearNotes === true, \"--clear-notes\", disallowedFlags);\n pushIf(\n options.clearLearnings === true,\n \"--clear-learnings\",\n disallowedFlags,\n );\n pushIf(options.clearFiles === true, \"--clear-files\", disallowedFlags);\n pushIf(options.clearTests === true, \"--clear-tests\", disallowedFlags);\n pushIf(options.clearDocs === true, \"--clear-docs\", disallowedFlags);\n pushIf(\n options.clearReminders === true,\n \"--clear-reminders\",\n disallowedFlags,\n );\n pushIf(options.clearEvents === true, \"--clear-events\", disallowedFlags);\n pushIf(\n options.clearTypeOptions === true,\n \"--clear-type-options\",\n disallowedFlags,\n );\n pushIf(options.force === true, \"--force\", disallowedFlags);\n pushIf(clearItemMetadataKeys.size > 0, \"--unset\", disallowedFlags);\n if (options.dep === undefined || options.dep.length === 0) {\n throw new PmCliError(\n \"The dependency ownership bypass requires at least one --dep value\",\n EXIT_CODE.USAGE,\n );\n }\n if (disallowedFlags.length > 0) {\n throw buildOwnershipBypassRestrictedOptionsError({\n id,\n code: \"ownership_dependency_bypass_restricted_options\",\n message: `The dependency ownership bypass supports append-only dependency additions via --dep. Remove restricted options: ${disallowedFlags.join(\", \")}`,\n required:\n \"Pass only --dep additions (plus --message/--author) with the dependency ownership bypass.\",\n why: \"the dependency ownership bypass is a narrow non-owner override scoped to append-only dependency additions; every other mutation keeps its normal ownership rules.\",\n disallowedFlags,\n });\n }\n return;\n }\n\n const disallowedFlags: string[] = [];\n pushIf(options.status !== undefined, \"--status\", disallowedFlags);\n pushIf(options.closeReason !== undefined, \"--close-reason\", disallowedFlags);\n pushIf(options.assignee !== undefined, \"--assignee\", disallowedFlags);\n pushIf(options.parent !== undefined, \"--parent\", disallowedFlags);\n pushIf(options.blockedBy !== undefined, \"--blocked-by\", disallowedFlags);\n pushIf(\n options.blockedReason !== undefined,\n \"--blocked-reason\",\n disallowedFlags,\n );\n pushIf(options.unblockNote !== undefined, \"--unblock-note\", disallowedFlags);\n pushIf(options.dep !== undefined, \"--dep\", disallowedFlags);\n pushIf(options.depRemove !== undefined, \"--dep-remove\", disallowedFlags);\n pushIf(options.replaceDeps === true, \"--replace-deps\", disallowedFlags);\n pushIf(options.replaceTests === true, \"--replace-tests\", disallowedFlags);\n pushIf(options.note !== undefined, \"--note\", disallowedFlags);\n pushIf(options.learning !== undefined, \"--learning\", disallowedFlags);\n pushIf(options.test !== undefined, \"--test\", disallowedFlags);\n pushIf(options.reminder !== undefined, \"--reminder\", disallowedFlags);\n pushIf(options.event !== undefined, \"--event\", disallowedFlags);\n pushIf(options.clearDeps === true, \"--clear-deps\", disallowedFlags);\n pushIf(options.clearComments === true, \"--clear-comments\", disallowedFlags);\n pushIf(options.clearNotes === true, \"--clear-notes\", disallowedFlags);\n pushIf(options.clearLearnings === true, \"--clear-learnings\", disallowedFlags);\n pushIf(options.clearFiles === true, \"--clear-files\", disallowedFlags);\n pushIf(options.clearTests === true, \"--clear-tests\", disallowedFlags);\n pushIf(options.clearDocs === true, \"--clear-docs\", disallowedFlags);\n pushIf(options.clearReminders === true, \"--clear-reminders\", disallowedFlags);\n pushIf(options.clearEvents === true, \"--clear-events\", disallowedFlags);\n\n /* c8 ignore start -- unset ordering fallback is validated by package-governance integration coverage. */\n const disallowedUnset = [...clearItemMetadataKeys]\n .filter((field) =>\n OWNERSHIP_BYPASS_DISALLOWED_UNSET_ITEM_METADATA_KEYS.has(field),\n )\n .sort((left, right) => left.localeCompare(right))\n .map((field) => `--unset ${field.replaceAll(\"_\", \"-\")}`);\n /* c8 ignore stop */\n disallowedFlags.push(...disallowedUnset);\n\n if (disallowedFlags.length > 0) {\n throw buildOwnershipBypassRestrictedOptionsError({\n id,\n code: \"ownership_metadata_bypass_restricted_options\",\n message: `The metadata ownership bypass only supports non-lifecycle metadata fields and evidence appends. Remove restricted options: ${disallowedFlags.join(\", \")}`,\n required:\n \"Limit the metadata ownership bypass to non-lifecycle metadata fields plus append-only --comment/--file/--doc evidence; route restricted appends and lifecycle changes through their dedicated commands.\",\n why: \"the metadata ownership bypass is a non-owner override scoped to metadata maintenance and append-only evidence; lifecycle, ownership, dependency mutations, restricted append fields, and clear/replace operations keep their normal ownership rules.\",\n disallowedFlags,\n });\n }\n}\n\n/* c8 ignore start -- lifecycle/dependency edge branches are exercised by dedicated update workflow integration tests. */\nfunction parseStatus(\n value: string,\n statusRegistry: RuntimeStatusRegistry,\n): ItemStatus {\n const normalized = normalizeStatusInput(value, statusRegistry);\n if (!normalized) {\n const allowedStatuses = statusRegistry.definitions.map(\n (definition) => definition.id,\n );\n throw new PmCliError(\n `Invalid --status value \"${value}\". Allowed: ${allowedStatuses.join(\", \")}`,\n EXIT_CODE.USAGE,\n );\n }\n return normalized;\n}\n\n/** Enforce per-type allowed-transition rules (governance.workflow_enforcement). `off` (default) or an unrestricted type is a no-op. `strict` throws on a disallowed transition; `warn` returns a warning string surfaced on the update result. The target status is the raw `--status` value (resolved case-insensitively through the registry inside evaluateTransition). */\nfunction enforceTypeWorkflowTransition(params: {\n enforcement: GovernanceWorkflowEnforcement;\n typeWorkflows: NormalizedTypeWorkflow[];\n statusRegistry: RuntimeStatusRegistry;\n typeName: string;\n fromStatus: string;\n toStatus: string;\n}): string | undefined {\n if (params.enforcement === \"off\" || params.typeWorkflows.length === 0) {\n return undefined;\n }\n const result = evaluateTransition({\n typeName: params.typeName,\n fromStatus: params.fromStatus,\n toStatus: params.toStatus,\n typeWorkflows: params.typeWorkflows,\n statusRegistry: params.statusRegistry,\n });\n if (!result.hasRule || result.allowed) {\n return undefined;\n }\n const normalizedFrom =\n normalizeStatusInput(params.fromStatus, params.statusRegistry) ??\n params.fromStatus;\n const normalizedTo =\n normalizeStatusInput(params.toStatus, params.statusRegistry) ??\n params.toStatus;\n const message =\n `Disallowed transition for type \"${params.typeName}\": ${normalizedFrom} -> ${normalizedTo}. ` +\n `Allowed transitions: ${describeAllowedTransitions(result.allowedTransitions)}.`;\n if (params.enforcement === \"strict\") {\n throw new PmCliError(message, EXIT_CODE.USAGE);\n }\n return `workflow_transition_not_allowed: ${message}`;\n}\n\ninterface ParsedDependencyUpdates {\n additions: Dependency[];\n}\n\ninterface DependencyRemovalSelector {\n id: string;\n kind?: (typeof DEPENDENCY_KIND_VALUES)[number];\n source_kind?: string;\n}\n\nfunction parseDependencyCreatedAt(\n value: string | undefined,\n currentIso: string,\n): string {\n if (!value || value.trim() === \"\" || value.trim().toLowerCase() === \"now\") {\n return currentIso;\n }\n const parsed = Date.parse(value);\n if (!Number.isFinite(parsed)) {\n throw new PmCliError(\n `Invalid dependency created_at timestamp \"${value}\"`,\n EXIT_CODE.USAGE,\n );\n }\n return new Date(parsed).toISOString();\n}\n\nfunction parseOptionalDependencyString(\n value: string | undefined,\n): string | undefined {\n if (value === undefined) return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\n/** Allowed CSV/markdown keys for the update `--dep` addition seed (GH-258). */\nconst DEP_ADDITION_KEYS = [\n \"id\",\n \"kind\",\n \"type\",\n \"author\",\n \"created_at\",\n \"source_kind\",\n] as const;\n/** Allowed CSV/markdown keys for the `--dep-remove` selector (GH-258). */\nconst DEP_REMOVE_KEYS = [\"id\", \"kind\", \"type\", \"source_kind\"] as const;\n\nfunction looksLikeStructuredDependencyEntry(raw: string): boolean {\n if (raw.startsWith(\"```\") || raw.includes(\"\\n\")) {\n return true;\n }\n if (\n /^(?:[-*+]\\s+)?(?:id|kind|type|author|created_at|source_kind)\\s*[:=]/i.test(\n raw,\n )\n ) {\n return true;\n }\n // A first-key typo (e.g. `bogus=v,id=pm-2`) must still be parsed so the unknown\n // key is rejected rather than swallowed as a bare item id (GH-258).\n return looksLikeGenericKeyValueEntry(raw);\n}\n\n// pm-fl0c #4 (2026-05-28): `pm plan` accepts `depends_on` as a link kind\n// (`PLAN_STEP_LINK_KIND_VALUES`) but `pm update --dep kind=depends_on` rejected\n// it because `DEPENDENCY_KIND_VALUES` only lists `blocked_by`. The two terms\n// are semantically identical from this side (\"X depends on Y\" === \"X blocked\n// by Y\"), so we normalize input here rather than expanding the persisted enum\n// — the stored kind stays canonical (`blocked_by`) and downstream consumers\n// (closing logic, dependency graphs, blockers views) keep working unchanged.\nconst DEPENDENCY_KIND_INPUT_ALIASES: Readonly<Record<string, string>> = {\n \"blocked-by\": \"blocked_by\",\n depends_on: \"blocked_by\",\n \"depends-on\": \"blocked_by\",\n};\n\nfunction normalizeDependencyKindInput(\n raw: string | undefined,\n): string | undefined {\n if (typeof raw !== \"string\") {\n return raw;\n }\n const trimmed = raw.trim();\n const alias = DEPENDENCY_KIND_INPUT_ALIASES[trimmed.toLowerCase()];\n return alias ?? trimmed;\n}\n\nfunction parseDependencyAdditions(\n raw: string[] | undefined,\n prefix: string,\n nowIso: string,\n): ParsedDependencyUpdates {\n if (!raw) {\n return { additions: [] };\n }\n assertNoLegacyNoneTokens(\n raw,\n \"--dep\",\n \"Use --clear-deps to clear dependencies.\",\n );\n const additions: Dependency[] = raw.map((entry) => {\n const trimmedEntry = entry.trim();\n const isStructured = looksLikeStructuredDependencyEntry(trimmedEntry);\n assertValidBareDependencyFlagValue(trimmedEntry, isStructured);\n const kv = isStructured\n ? parseCsvKv(entry, \"--dep\")\n : { id: trimmedEntry, kind: \"related\" };\n if (isStructured) {\n assertNoUnknownCsvKeys(kv, \"--dep\", DEP_ADDITION_KEYS);\n }\n const id = kv.id?.trim();\n const kind = normalizeDependencyKindInput((kv.kind ?? kv.type)?.trim());\n if (!id || !kind) {\n throw new PmCliError(\n \"--dep requires id and kind, or a bare item id to add a related dependency\",\n EXIT_CODE.USAGE,\n );\n }\n if (id.toLowerCase() === \"undefined\") {\n throw new PmCliError(\n `--dep id must not use placeholder token \"${id}\". Use --clear-deps to clear dependencies.`,\n EXIT_CODE.USAGE,\n );\n }\n const sourceKind = parseOptionalDependencyString(kv.source_kind);\n return {\n id: normalizeItemId(id, prefix),\n kind: ensureEnum(kind, DEPENDENCY_KIND_VALUES, \"dependency kind\"),\n created_at: parseDependencyCreatedAt(kv.created_at, nowIso),\n author: parseOptionalDependencyString(kv.author),\n source_kind: sourceKind,\n };\n });\n return { additions };\n}\n\nfunction parseDependencyRemovals(\n raw: string[] | undefined,\n prefix: string,\n): DependencyRemovalSelector[] {\n if (!raw) {\n return [];\n }\n assertNoLegacyNoneTokens(raw, \"--dep-remove\");\n return raw.map((entry) => {\n const trimmed = entry.trim();\n if (!trimmed) {\n throw new PmCliError(\n \"--dep-remove requires id or key/value selectors\",\n EXIT_CODE.USAGE,\n );\n }\n if (\n trimmed.includes(\"=\") ||\n /^(?:[-*+]\\s+)?(?:id|kind|type|source_kind)\\s*[:=]/i.test(trimmed) ||\n trimmed.startsWith(\"```\")\n ) {\n const kv = parseCsvKv(trimmed, \"--dep-remove\");\n assertNoUnknownCsvKeys(kv, \"--dep-remove\", DEP_REMOVE_KEYS);\n const idRaw = kv.id?.trim();\n if (!idRaw) {\n throw new PmCliError(\n \"--dep-remove key/value form requires id=<value>\",\n EXIT_CODE.USAGE,\n );\n }\n if (idRaw.toLowerCase() === \"undefined\") {\n throw new PmCliError(\n `--dep-remove id must not use placeholder token \"${idRaw}\"`,\n EXIT_CODE.USAGE,\n );\n }\n const kindRaw = normalizeDependencyKindInput(\n parseOptionalDependencyString(kv.kind ?? kv.type),\n );\n const sourceKind = parseOptionalDependencyString(kv.source_kind);\n return {\n id: normalizeItemId(idRaw, prefix),\n kind: kindRaw\n ? ensureEnum(kindRaw, DEPENDENCY_KIND_VALUES, \"dependency kind\")\n : undefined,\n source_kind: sourceKind,\n };\n }\n if (trimmed.toLowerCase() === \"undefined\") {\n throw new PmCliError(\n `--dep-remove id must not use placeholder token \"${trimmed}\"`,\n EXIT_CODE.USAGE,\n );\n }\n return {\n id: normalizeItemId(trimmed, prefix),\n };\n });\n}\n\nfunction dependencyKey(\n value: Pick<Dependency, \"id\" | \"kind\" | \"source_kind\">,\n): string {\n return `${value.id}::${value.kind}::${value.source_kind ?? \"\"}`;\n}\n\n// pm-kyd6: `--blocked-by` writes the `blocked_by` scalar, but the dependency\n// graph (`pm deps`) is built only from the `dependencies` array. Mirror the\n// behaviour create.ts already has so the metadata and the graph agree: a\n// resolvable blocker also gets a `blocked_by` dependency edge. Repeated\n// `--blocked-by` updates preserve prior blocker edges because the graph is the\n// full dependency record; the scalar remains the latest primary blocker for\n// backward compatibility. Clearing the scalar removes all derived blocker edges.\nfunction reconcileBlockedByDependency(\n current: Dependency[] | undefined,\n nextBlockedById: string | undefined,\n nowIsoValue: string,\n author: string,\n): { dependencies: Dependency[] | undefined; changed: boolean } {\n let next = [...(current ?? [])];\n let changed = false;\n if (nextBlockedById === undefined) {\n const filtered = next.filter((dep) => dep.kind !== \"blocked_by\");\n if (filtered.length !== next.length) {\n next = filtered;\n changed = true;\n }\n if (!changed) {\n return { dependencies: current, changed: false };\n }\n return { dependencies: next.length > 0 ? next : undefined, changed: true };\n }\n if (\n !next.some((dep) => dep.kind === \"blocked_by\" && dep.id === nextBlockedById)\n ) {\n next.push({\n id: nextBlockedById,\n kind: \"blocked_by\",\n created_at: nowIsoValue,\n author,\n });\n changed = true;\n }\n if (!changed) {\n return { dependencies: current, changed: false };\n }\n return { dependencies: next.length > 0 ? next : undefined, changed: true };\n}\n\n// pm-kyd6: resolve the --blocked-by target before the synchronous mutate\n// callback so a real blocker can also become a `blocked_by` dependency edge.\n// `id` is set when the target resolves; `unresolved` carries the raw value when\n// --blocked-by points at an item that does not exist (the scalar is still set,\n// mirroring create.ts and the never-block missing-parent behaviour, but the\n// caller surfaces a warning so the metadata/graph mismatch is visible).\nasync function resolveBlockedByDependencyTarget(\n blockedByOption: string | undefined,\n blockedByCleared: boolean,\n pmRoot: string,\n idPrefix: string,\n itemFormat: ItemFormat,\n typeToFolder: Record<string, string>,\n): Promise<{ id?: string; unresolved?: string }> {\n if (blockedByOption === undefined || blockedByCleared) {\n return {};\n }\n const blockedByValue = blockedByOption.trim();\n if (blockedByValue.length === 0) {\n return {};\n }\n const located = await locateItem(\n pmRoot,\n normalizeItemId(blockedByValue, idPrefix),\n idPrefix,\n itemFormat,\n typeToFolder,\n );\n return located ? { id: located.id } : { unresolved: blockedByValue };\n}\n\n// pm-kyd6: apply the reconciled blocked_by dependency edge to the item metadata\n// and record the `dependencies` change. Kept out of the mutate callback so the\n// large runUpdate function stays under the static-quality complexity budget.\nfunction applyBlockedByDependencyEdge(\n metadata: ItemMetadata,\n resolvedBlockedById: string | undefined,\n nowIsoValue: string,\n author: string,\n changedFields: string[],\n): void {\n const reconciled = reconcileBlockedByDependency(\n metadata.dependencies,\n resolvedBlockedById,\n nowIsoValue,\n author,\n );\n if (!reconciled.changed) {\n return;\n }\n if (reconciled.dependencies === undefined) {\n delete metadata.dependencies;\n } else {\n metadata.dependencies = reconciled.dependencies;\n }\n if (!changedFields.includes(\"dependencies\")) {\n changedFields.push(\"dependencies\");\n }\n}\n\nfunction fileKey(value: Pick<LinkedFile, \"path\" | \"scope\">): string {\n return `${value.path}::${value.scope}`;\n}\n\nfunction docKey(value: Pick<LinkedDoc, \"path\" | \"scope\">): string {\n return `${value.path}::${value.scope}`;\n}\n\nfunction testKey(\n value: Pick<LinkedTest, \"command\" | \"path\" | \"scope\" | \"pm_context_mode\">,\n): string {\n return `${value.command}::${value.path ?? \"\"}::${value.scope}::${value.pm_context_mode ?? \"\"}`;\n}\n\nfunction matchesDependencySelector(\n value: Dependency,\n selector: DependencyRemovalSelector,\n): boolean {\n if (value.id !== selector.id) {\n return false;\n }\n if (selector.kind && value.kind !== selector.kind) {\n return false;\n }\n if (\n selector.source_kind !== undefined &&\n (value.source_kind ?? undefined) !== selector.source_kind\n ) {\n return false;\n }\n return true;\n}\n\nfunction ensurePriority(raw: string | number): 0 | 1 | 2 | 3 | 4 {\n return resolvePriority(raw);\n}\n\nfunction normalizeUpdatePolicyOptionKey(raw: string, typeName: string): string {\n const canonical = canonicalizeCommandOptionKey(\"update\", raw);\n if (!canonical) {\n throw new PmCliError(\n `Unsupported command_option_policies option \"${raw}\" for update command on type \"${typeName}\"`,\n EXIT_CODE.CONFLICT,\n );\n }\n return canonical;\n}\n\nfunction collectProvidedUpdatePolicyOptions(\n options: UpdateCommandOptions,\n runtimeFieldRegistry: RuntimeFieldRegistry,\n extensionFieldNames: readonly string[],\n): Set<string> {\n const provided = new Set<string>();\n const mark = (optionKey: string, isProvided: boolean): void => {\n if (isProvided) {\n provided.add(optionKey);\n }\n };\n mark(\"title\", options.title !== undefined);\n mark(\"description\", options.description !== undefined);\n mark(\"body\", options.body !== undefined);\n mark(\"status\", options.status !== undefined);\n mark(\"closeReason\", options.closeReason !== undefined);\n mark(\"priority\", options.priority !== undefined);\n mark(\"type\", options.type !== undefined);\n // `--add-tags` / `--remove-tags` mutate the same `tags` field as `--tags`, so\n // they count toward the `tags` command_option_policy (disabled + required).\n mark(\n \"tags\",\n options.tags !== undefined ||\n (Array.isArray(options.addTags) && options.addTags.length > 0) ||\n (Array.isArray(options.removeTags) && options.removeTags.length > 0),\n );\n mark(\"deadline\", options.deadline !== undefined);\n mark(\"estimatedMinutes\", options.estimatedMinutes !== undefined);\n // `--add-ac` / `--remove-ac` mutate the same `acceptance_criteria` field as\n // `--acceptance-criteria`, so they count toward its command_option_policy.\n mark(\n \"acceptanceCriteria\",\n options.acceptanceCriteria !== undefined ||\n (Array.isArray(options.addAc) && options.addAc.length > 0) ||\n (Array.isArray(options.removeAc) && options.removeAc.length > 0),\n );\n mark(\"definitionOfReady\", options.definitionOfReady !== undefined);\n mark(\"order\", options.order !== undefined || options.rank !== undefined);\n mark(\"goal\", options.goal !== undefined);\n mark(\"objective\", options.objective !== undefined);\n mark(\"value\", options.value !== undefined);\n mark(\"impact\", options.impact !== undefined);\n mark(\"outcome\", options.outcome !== undefined);\n mark(\"whyNow\", options.whyNow !== undefined);\n mark(\"author\", options.author !== undefined);\n mark(\"message\", options.message !== undefined);\n mark(\"assignee\", options.assignee !== undefined);\n mark(\"parent\", options.parent !== undefined);\n mark(\"reviewer\", options.reviewer !== undefined);\n mark(\"risk\", options.risk !== undefined);\n mark(\"confidence\", options.confidence !== undefined);\n mark(\"sprint\", options.sprint !== undefined);\n mark(\"release\", options.release !== undefined);\n mark(\"blockedBy\", options.blockedBy !== undefined);\n mark(\"blockedReason\", options.blockedReason !== undefined);\n mark(\"unblockNote\", options.unblockNote !== undefined);\n mark(\"reporter\", options.reporter !== undefined);\n mark(\"severity\", options.severity !== undefined);\n mark(\"environment\", options.environment !== undefined);\n mark(\"reproSteps\", options.reproSteps !== undefined);\n mark(\"resolution\", options.resolution !== undefined);\n mark(\"expectedResult\", options.expectedResult !== undefined);\n mark(\"actualResult\", options.actualResult !== undefined);\n mark(\"affectedVersion\", options.affectedVersion !== undefined);\n mark(\"fixedVersion\", options.fixedVersion !== undefined);\n mark(\"component\", options.component !== undefined);\n mark(\"regression\", options.regression !== undefined);\n mark(\"customerImpact\", options.customerImpact !== undefined);\n mark(\"dep\", options.dep !== undefined);\n mark(\"depRemove\", options.depRemove !== undefined);\n mark(\"dep\", options.replaceDeps === true);\n mark(\"comment\", options.comment !== undefined);\n mark(\"note\", options.note !== undefined);\n mark(\"learning\", options.learning !== undefined);\n mark(\"file\", options.file !== undefined);\n mark(\"test\", options.test !== undefined);\n mark(\"test\", options.replaceTests === true);\n mark(\"doc\", options.doc !== undefined);\n mark(\"reminder\", options.reminder !== undefined);\n mark(\"event\", options.event !== undefined);\n mark(\"typeOption\", options.typeOption !== undefined);\n mark(\"field\", options.field !== undefined);\n mark(\"force\", options.force === true);\n mark(\"ownershipMetadataBypass\", options.ownershipMetadataBypass === true);\n mark(\"ownershipDependencyBypass\", options.ownershipDependencyBypass === true);\n mark(\"dep\", options.clearDeps === true);\n mark(\"comment\", options.clearComments === true);\n mark(\"note\", options.clearNotes === true);\n mark(\"learning\", options.clearLearnings === true);\n mark(\"file\", options.clearFiles === true);\n mark(\"test\", options.clearTests === true);\n mark(\"doc\", options.clearDocs === true);\n mark(\"reminder\", options.clearReminders === true);\n mark(\"event\", options.clearEvents === true);\n mark(\"typeOption\", options.clearTypeOptions === true);\n if (options.unset && options.unset.length > 0) {\n const unsetTargets = parseUpdateUnsetTargets(\n options.unset,\n runtimeFieldRegistry,\n extensionFieldNames,\n );\n for (const optionKey of unsetTargets.optionKeys) {\n mark(optionKey, true);\n }\n }\n return provided;\n}\n\nfunction enforceUpdateOptionsByType(\n typeName: string,\n options: UpdateCommandOptions,\n typeRegistry: ReturnType<typeof resolveItemTypeRegistry>,\n runtimeFieldRegistry: RuntimeFieldRegistry,\n extensionFieldNames: readonly string[],\n): void {\n const typeDefinition = resolveTypeDefinition(typeName, typeRegistry);\n if (!typeDefinition) {\n throw new PmCliError(`Invalid type value \"${typeName}\"`, EXIT_CODE.USAGE);\n }\n const policyState = resolveCommandOptionPolicyState(\n typeDefinition,\n \"update\",\n [],\n );\n if (policyState.errors.length > 0) {\n throw new PmCliError(policyState.errors.join(\"; \"), EXIT_CODE.CONFLICT);\n }\n\n const provided = collectProvidedUpdatePolicyOptions(\n options,\n runtimeFieldRegistry,\n extensionFieldNames,\n );\n for (const disabled of policyState.disabled) {\n if (provided.has(normalizeUpdatePolicyOptionKey(disabled, typeName))) {\n throw new PmCliError(\n `Option ${commandOptionFlagLabel(\"update\", disabled)} is disabled for type \"${typeName}\" by command_option_policies`,\n EXIT_CODE.USAGE,\n );\n }\n }\n\n for (const required of policyState.required) {\n if (!provided.has(normalizeUpdatePolicyOptionKey(required, typeName))) {\n throw new PmCliError(\n `Missing required option ${commandOptionFlagLabel(\"update\", required)} for type \"${typeName}\"`,\n EXIT_CODE.USAGE,\n );\n }\n }\n}\n\ninterface UpdateScalarMutationContext {\n metadataRecord: Record<string, unknown>;\n clearItemMetadataKeys: ReadonlySet<string>;\n changedFields: string[];\n nowValue: Date;\n}\n\ninterface UpdateScalarMutationDefinition {\n optionKey: keyof UpdateCommandOptions;\n metadataKey: string;\n transform?: (value: string, context: UpdateScalarMutationContext) => unknown;\n}\n\ninterface UpdateClearCollectionDefinition {\n enabled: boolean | undefined;\n optionKey: string;\n clearFlag: string;\n valueFlag: string;\n values: string[] | undefined;\n metadataKey: string;\n}\n\ninterface UpdateMutationContext {\n options: UpdateCommandOptions;\n settings: Awaited<ReturnType<typeof readSettings>>;\n typeRegistry: ReturnType<typeof resolveItemTypeRegistry>;\n statusRegistry: RuntimeStatusRegistry;\n runtimeFieldRegistry: RuntimeFieldRegistry;\n extensionRegistrations: ReturnType<typeof getActiveExtensionRegistrations>;\n extensionFieldNames: readonly string[];\n clearItemMetadataKeys: ReadonlySet<string>;\n dependencyUpdates: ParsedDependencyUpdates;\n dependencyRemovals: DependencyRemovalSelector[];\n commentUpdates: ReturnType<typeof parseLogSeed>;\n noteUpdates: ReturnType<typeof parseLogSeed>;\n learningUpdates: ReturnType<typeof parseLogSeed>;\n fileUpdates: ReturnType<typeof parseFiles>;\n testUpdates: ReturnType<typeof parseTests>;\n docUpdates: ReturnType<typeof parseDocs>;\n resolvedParentValue: string | undefined;\n resolvedBlockedByDependencyId: string | undefined;\n runtimeFieldUpdates: Record<string, unknown>;\n nowValue: Date;\n nowIso: string;\n author: string;\n pmRoot: string;\n}\n\ninterface CloseRouteContext {\n options: UpdateCommandOptions;\n fieldFlags: Record<string, boolean>;\n statusRegistry: RuntimeStatusRegistry;\n workflowTransitionWarnings: readonly string[];\n global: GlobalOptions;\n id: string;\n}\n\n// `rank` is a legacy alias for `order`; keep it out of the scalar loop if the\n// shared mutation key list ever grows to include that alias.\nconst UPDATE_LEGACY_COMMON_SCALAR_OPTION_EXCLUSIONS = new Set<string>([\n \"order\",\n \"rank\",\n]);\nconst UPDATE_LEGACY_COMMON_SCALAR_OPTION_KEYS =\n COMMON_MUTATION_COMMAND_OPTION_KEYS.filter(\n (key) => !UPDATE_LEGACY_COMMON_SCALAR_OPTION_EXCLUSIONS.has(key),\n ) as readonly (keyof UpdateCommandOptions)[];\n\nconst UPDATE_LEGACY_SCALAR_OPTION_KEYS: readonly (keyof UpdateCommandOptions)[] =\n [\"tags\", \"closeReason\", ...UPDATE_LEGACY_COMMON_SCALAR_OPTION_KEYS];\n\nconst UPDATE_SIMPLE_FIELD_FLAG_KEYS: readonly (keyof UpdateCommandOptions)[] = [\n \"title\",\n \"description\",\n \"body\",\n \"status\",\n \"closeReason\",\n \"priority\",\n \"type\",\n ...COMMON_MUTATION_COMMAND_OPTION_KEYS,\n \"dep\",\n \"depRemove\",\n \"comment\",\n \"note\",\n \"learning\",\n \"file\",\n \"test\",\n \"doc\",\n \"reminder\",\n \"event\",\n \"typeOption\",\n \"field\",\n];\n\nconst UPDATE_POST_TAG_SCALAR_MUTATIONS: ReadonlyArray<UpdateScalarMutationDefinition> =\n [\n {\n optionKey: \"deadline\",\n metadataKey: \"deadline\",\n transform: (value, context) =>\n resolveIsoOrRelative(value, context.nowValue, \"deadline\"),\n },\n {\n optionKey: \"estimatedMinutes\",\n metadataKey: \"estimated_minutes\",\n transform: (value) =>\n parseOptionalNonNegativeInteger(value, \"estimated-minutes\"),\n },\n {\n optionKey: \"acceptanceCriteria\",\n metadataKey: \"acceptance_criteria\",\n transform: (value) => value,\n },\n { optionKey: \"definitionOfReady\", metadataKey: \"definition_of_ready\" },\n { optionKey: \"goal\", metadataKey: \"goal\" },\n { optionKey: \"objective\", metadataKey: \"objective\" },\n { optionKey: \"value\", metadataKey: \"value\" },\n { optionKey: \"impact\", metadataKey: \"impact\" },\n { optionKey: \"outcome\", metadataKey: \"outcome\" },\n { optionKey: \"whyNow\", metadataKey: \"why_now\" },\n ];\n\nconst UPDATE_STAKEHOLDER_SCALAR_MUTATIONS: ReadonlyArray<UpdateScalarMutationDefinition> =\n [\n { optionKey: \"reviewer\", metadataKey: \"reviewer\" },\n {\n optionKey: \"risk\",\n metadataKey: \"risk\",\n transform: (value) =>\n ensureEnum(normalizeRiskInput(value), RISK_VALUES, \"risk\"),\n },\n {\n optionKey: \"confidence\",\n metadataKey: \"confidence\",\n transform: (value) => parseConfidenceInput(value),\n },\n ];\n\nconst UPDATE_ISSUE_SCALAR_MUTATIONS: ReadonlyArray<UpdateScalarMutationDefinition> =\n [\n { optionKey: \"blockedReason\", metadataKey: \"blocked_reason\" },\n { optionKey: \"unblockNote\", metadataKey: \"unblock_note\" },\n { optionKey: \"reporter\", metadataKey: \"reporter\" },\n {\n optionKey: \"severity\",\n metadataKey: \"severity\",\n transform: (value) =>\n ensureEnum(\n normalizeSeverityInput(value),\n ISSUE_SEVERITY_VALUES,\n \"severity\",\n ),\n },\n { optionKey: \"environment\", metadataKey: \"environment\" },\n { optionKey: \"reproSteps\", metadataKey: \"repro_steps\" },\n { optionKey: \"resolution\", metadataKey: \"resolution\" },\n { optionKey: \"expectedResult\", metadataKey: \"expected_result\" },\n { optionKey: \"actualResult\", metadataKey: \"actual_result\" },\n { optionKey: \"affectedVersion\", metadataKey: \"affected_version\" },\n { optionKey: \"fixedVersion\", metadataKey: \"fixed_version\" },\n { optionKey: \"component\", metadataKey: \"component\" },\n {\n optionKey: \"regression\",\n metadataKey: \"regression\",\n transform: (value) => parseRegressionInput(value),\n },\n { optionKey: \"customerImpact\", metadataKey: \"customer_impact\" },\n ];\n\nfunction applyUpdateScalarMutations(\n definitions: ReadonlyArray<UpdateScalarMutationDefinition>,\n options: UpdateCommandOptions,\n context: UpdateScalarMutationContext,\n): void {\n for (const definition of definitions) {\n const optionValue = options[definition.optionKey];\n const shouldClear = context.clearItemMetadataKeys.has(\n definition.metadataKey,\n );\n if (optionValue === undefined && !shouldClear) {\n continue;\n }\n if (shouldClear) {\n delete context.metadataRecord[definition.metadataKey];\n context.changedFields.push(definition.metadataKey);\n continue;\n }\n if (typeof optionValue !== \"string\") {\n throw new PmCliError(\n `${commandOptionFlagLabel(\"update\", String(definition.optionKey))} must be a string value`,\n EXIT_CODE.USAGE,\n );\n }\n context.metadataRecord[definition.metadataKey] = definition.transform\n ? definition.transform(optionValue, context)\n : optionValue.trim();\n context.changedFields.push(definition.metadataKey);\n }\n}\n\nasync function resolveStdinUpdateOptions(\n options: UpdateCommandOptions,\n): Promise<UpdateCommandOptions> {\n const stdinResolver = createStdinTokenResolver();\n return normalizeLegacyNoneUpdateOptions({\n ...options,\n body: await stdinResolver.resolveValue(options.body, \"--body\"),\n dep: await stdinResolver.resolveList(options.dep, \"--dep\"),\n depRemove: await stdinResolver.resolveList(\n options.depRemove,\n \"--dep-remove\",\n ),\n comment: await stdinResolver.resolveList(options.comment, \"--comment\"),\n note: await stdinResolver.resolveList(options.note, \"--note\"),\n learning: await stdinResolver.resolveList(options.learning, \"--learning\"),\n file: await stdinResolver.resolveList(options.file, \"--file\"),\n test: await stdinResolver.resolveList(options.test, \"--test\"),\n doc: await stdinResolver.resolveList(options.doc, \"--doc\"),\n reminder: await stdinResolver.resolveList(options.reminder, \"--reminder\"),\n event: await stdinResolver.resolveList(options.event, \"--event\"),\n typeOption: await stdinResolver.resolveList(\n options.typeOption,\n \"--type-option\",\n ),\n field: await stdinResolver.resolveList(options.field, \"--field\"),\n });\n}\n\nfunction buildClearCollectionDefinitions(\n options: UpdateCommandOptions,\n): readonly UpdateClearCollectionDefinition[] {\n return [\n {\n enabled: options.clearDeps || options.replaceDeps,\n optionKey: \"dep\",\n clearFlag: \"--clear-deps\",\n valueFlag: \"--dep\",\n values: options.dep,\n metadataKey: \"dependencies\",\n },\n {\n enabled: options.clearComments,\n optionKey: \"comment\",\n clearFlag: \"--clear-comments\",\n valueFlag: \"--comment\",\n values: options.comment,\n metadataKey: \"comments\",\n },\n {\n enabled: options.clearNotes,\n optionKey: \"note\",\n clearFlag: \"--clear-notes\",\n valueFlag: \"--note\",\n values: options.note,\n metadataKey: \"notes\",\n },\n {\n enabled: options.clearLearnings,\n optionKey: \"learning\",\n clearFlag: \"--clear-learnings\",\n valueFlag: \"--learning\",\n values: options.learning,\n metadataKey: \"learnings\",\n },\n {\n enabled: options.clearFiles,\n optionKey: \"file\",\n clearFlag: \"--clear-files\",\n valueFlag: \"--file\",\n values: options.file,\n metadataKey: \"files\",\n },\n {\n enabled: options.clearTests || options.replaceTests,\n optionKey: \"test\",\n clearFlag: \"--clear-tests\",\n valueFlag: \"--test\",\n values: options.test,\n metadataKey: \"tests\",\n },\n {\n enabled: options.clearDocs,\n optionKey: \"doc\",\n clearFlag: \"--clear-docs\",\n valueFlag: \"--doc\",\n values: options.doc,\n metadataKey: \"docs\",\n },\n {\n enabled: options.clearReminders,\n optionKey: \"reminder\",\n clearFlag: \"--clear-reminders\",\n valueFlag: \"--reminder\",\n values: options.reminder,\n metadataKey: \"reminders\",\n },\n {\n enabled: options.clearEvents,\n optionKey: \"event\",\n clearFlag: \"--clear-events\",\n valueFlag: \"--event\",\n values: options.event,\n metadataKey: \"events\",\n },\n {\n enabled: options.clearTypeOptions,\n optionKey: \"typeOption\",\n clearFlag: \"--clear-type-options\",\n valueFlag: \"--type-option\",\n values: options.typeOption,\n metadataKey: \"type_options\",\n },\n ];\n}\n\nfunction validateReplaceOptions(options: UpdateCommandOptions): void {\n if (\n options.replaceDeps === true &&\n (options.dep === undefined || options.dep.length === 0)\n ) {\n throw new PmCliError(\n \"--replace-deps requires at least one --dep entry\",\n EXIT_CODE.USAGE,\n );\n }\n if (\n options.replaceDeps === true &&\n options.depRemove !== undefined &&\n options.depRemove.length > 0\n ) {\n throw new PmCliError(\n \"--replace-deps cannot be combined with --dep-remove\",\n EXIT_CODE.USAGE,\n );\n }\n if (\n options.replaceTests === true &&\n (options.test === undefined || options.test.length === 0)\n ) {\n throw new PmCliError(\n \"--replace-tests requires at least one --test entry\",\n EXIT_CODE.USAGE,\n );\n }\n if (options.replaceTests === true && options.clearTests === true) {\n throw new PmCliError(\n \"--replace-tests cannot be combined with --clear-tests\",\n EXIT_CODE.USAGE,\n );\n }\n}\n\nfunction applyClearCollectionDefinitions(params: {\n definitions: readonly UpdateClearCollectionDefinition[];\n options: UpdateCommandOptions;\n clearOptionKeys: Set<string>;\n clearItemMetadataKeys: Set<string>;\n}): void {\n for (const definition of params.definitions) {\n if (!definition.enabled) {\n continue;\n }\n const isReplacement =\n (definition.optionKey === \"dep\" && params.options.replaceDeps === true) ||\n (definition.optionKey === \"test\" && params.options.replaceTests === true);\n if (definition.values && definition.values.length > 0 && !isReplacement) {\n throw new PmCliError(\n `Cannot combine ${definition.clearFlag} with ${definition.valueFlag}`,\n EXIT_CODE.USAGE,\n );\n }\n params.clearOptionKeys.add(definition.optionKey);\n params.clearItemMetadataKeys.add(definition.metadataKey);\n }\n}\n\nfunction buildScalarOptionPresence(\n options: UpdateCommandOptions,\n): Record<string, boolean> {\n const presence: Record<string, boolean> = {};\n for (const key of UPDATE_LEGACY_SCALAR_OPTION_KEYS) {\n presence[String(key)] = options[key] !== undefined;\n }\n presence.order = options.order !== undefined || options.rank !== undefined;\n return presence;\n}\n\nfunction rejectUnsetScalarConflicts(\n options: UpdateCommandOptions,\n unsetTargets: { optionKeys: Set<string>; metadataKeys: Set<string> },\n): void {\n const scalarOptionPresence = buildScalarOptionPresence(options);\n for (const [optionKey, hasValue] of Object.entries(scalarOptionPresence)) {\n if (!hasValue || !unsetTargets.optionKeys.has(optionKey)) {\n continue;\n }\n const unsetField =\n UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey) ?? optionKey;\n throw new PmCliError(\n `Cannot combine --unset ${unsetField} with ${commandOptionFlagLabel(\"update\", optionKey)}`,\n EXIT_CODE.USAGE,\n );\n }\n if (unsetTargets.metadataKeys.has(\"acceptance_criteria\")) {\n if (Array.isArray(options.addAc) && options.addAc.length > 0) {\n throw new PmCliError(\n \"Cannot combine --unset acceptance-criteria with --add-ac\",\n EXIT_CODE.USAGE,\n );\n }\n if (Array.isArray(options.removeAc) && options.removeAc.length > 0) {\n throw new PmCliError(\n \"Cannot combine --unset acceptance-criteria with --remove-ac\",\n EXIT_CODE.USAGE,\n );\n }\n }\n if (!unsetTargets.metadataKeys.has(\"tags\")) {\n return;\n }\n if (Array.isArray(options.addTags) && options.addTags.length > 0) {\n throw new PmCliError(\n \"Cannot combine --unset tags with --add-tags\",\n EXIT_CODE.USAGE,\n );\n }\n if (Array.isArray(options.removeTags) && options.removeTags.length > 0) {\n throw new PmCliError(\n \"Cannot combine --unset tags with --remove-tags\",\n EXIT_CODE.USAGE,\n );\n }\n}\n\nfunction rejectLegacyScalarTokens(options: UpdateCommandOptions): void {\n const assertNoLegacyScalarToken = (\n value: string | undefined,\n optionKey: string,\n ): void => {\n const unsetField = UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey);\n const hint = unsetField\n ? `Use --unset ${unsetField} to clear this field.`\n : undefined;\n assertNoLegacyNoneToken(\n value,\n commandOptionFlagLabel(\"update\", optionKey),\n hint,\n );\n };\n for (const key of UPDATE_LEGACY_SCALAR_OPTION_KEYS) {\n assertNoLegacyScalarToken(options[key] as string | undefined, String(key));\n }\n assertNoLegacyScalarToken(options.order ?? options.rank, \"order\");\n assertNoLegacyNoneTokens(\n options.reminder,\n \"--reminder\",\n \"Use --clear-reminders to clear reminders.\",\n );\n assertNoLegacyNoneTokens(\n options.event,\n \"--event\",\n \"Use --clear-events to clear linked events.\",\n );\n}\n\nfunction buildUpdateFieldFlags(\n options: UpdateCommandOptions,\n runtimeFieldUpdates: Record<string, unknown>,\n): Record<string, boolean> {\n const flags: Record<string, boolean> = {};\n for (const key of UPDATE_SIMPLE_FIELD_FLAG_KEYS) {\n flags[String(key)] = options[key] !== undefined;\n }\n flags.tags = options.tags !== undefined;\n flags.addTags = Array.isArray(options.addTags) && options.addTags.length > 0;\n flags.removeTags =\n Array.isArray(options.removeTags) && options.removeTags.length > 0;\n flags.addAc = Array.isArray(options.addAc) && options.addAc.length > 0;\n flags.removeAc =\n Array.isArray(options.removeAc) && options.removeAc.length > 0;\n flags.order = options.order !== undefined;\n flags.rank = options.rank !== undefined;\n flags.replaceDeps = options.replaceDeps === true;\n flags.replaceTests = options.replaceTests === true;\n flags.unset = options.unset !== undefined && options.unset.length > 0;\n flags.clearDeps = options.clearDeps === true;\n flags.clearComments = options.clearComments === true;\n flags.clearNotes = options.clearNotes === true;\n flags.clearLearnings = options.clearLearnings === true;\n flags.clearFiles = options.clearFiles === true;\n flags.clearTests = options.clearTests === true;\n flags.clearDocs = options.clearDocs === true;\n flags.clearReminders = options.clearReminders === true;\n flags.clearEvents = options.clearEvents === true;\n flags.clearTypeOptions = options.clearTypeOptions === true;\n flags.runtimeFields = Object.keys(runtimeFieldUpdates).length > 0;\n return flags;\n}\n\nasync function buildNoopUpdateResult(params: {\n pmRoot: string;\n id: string;\n settings: Awaited<ReturnType<typeof readSettings>>;\n typeRegistry: ReturnType<typeof resolveItemTypeRegistry>;\n}): Promise<UpdateResult> {\n const located = await locateItem(\n params.pmRoot,\n params.id,\n params.settings.id_prefix,\n params.settings.item_format,\n params.typeRegistry.type_to_folder,\n );\n if (!located) {\n throw await buildItemNotFoundError(\n params.pmRoot,\n params.id,\n params.settings.id_prefix,\n params.typeRegistry.type_to_folder,\n );\n }\n const { document } = await readLocatedItem(located, {\n schema: params.settings.schema,\n });\n return {\n item: toItemRecord(document.metadata),\n changed_fields: [],\n warnings: [\"noop_no_update_fields\"],\n };\n}\n\nasync function assertUpdateTrackerInitialized(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\nfunction assertMatchingOrderRank(options: UpdateCommandOptions): void {\n if (\n options.order !== undefined &&\n options.rank !== undefined &&\n options.order !== options.rank\n ) {\n throw new PmCliError(\n \"--order and --rank must match when both are provided\",\n EXIT_CODE.USAGE,\n );\n }\n}\n\nasync function resolveParentReferenceForUpdate(params: {\n id: string;\n options: UpdateCommandOptions;\n unsetTargets: { metadataKeys: Set<string> };\n pmRoot: string;\n settings: Awaited<ReturnType<typeof readSettings>>;\n typeRegistry: ReturnType<typeof resolveItemTypeRegistry>;\n parentReferencePolicy: Awaited<\n ReturnType<typeof readSettings>\n >[\"validation\"][\"parent_reference\"];\n}): Promise<{ resolvedParentValue: string | undefined; warnings: string[] }> {\n if (\n params.options.parent === undefined ||\n params.unsetTargets.metadataKeys.has(\"parent\")\n ) {\n return { resolvedParentValue: undefined, warnings: [] };\n }\n const resolvedParentValue = normalizeParentReferenceValue(\n params.options.parent,\n );\n assertParentReferenceIsNotSelf(\n params.id,\n resolvedParentValue,\n params.settings.id_prefix,\n );\n const parentLocated = await locateItem(\n params.pmRoot,\n resolvedParentValue,\n params.settings.id_prefix,\n params.settings.item_format,\n params.typeRegistry.type_to_folder,\n );\n if (parentLocated) {\n return { resolvedParentValue, warnings: [] };\n }\n const normalizedParentId = normalizeItemId(\n resolvedParentValue,\n params.settings.id_prefix,\n );\n return {\n resolvedParentValue,\n warnings: validateMissingParentReference(\n normalizedParentId,\n params.parentReferencePolicy,\n ).warnings,\n };\n}\n\nfunction blockedByResolutionWarnings(resolution: {\n unresolved?: string;\n}): string[] {\n return resolution.unresolved === undefined\n ? []\n : [`blocked_by_unresolved:${resolution.unresolved}`];\n}\n\nasync function collectWorkflowTransitionWarnings(params: {\n options: UpdateCommandOptions;\n fieldFlags: Record<string, boolean>;\n workflowEnforcement: GovernanceWorkflowEnforcement;\n typeWorkflows: NormalizedTypeWorkflow[];\n statusRegistry: RuntimeStatusRegistry;\n typeRegistry: ReturnType<typeof resolveItemTypeRegistry>;\n pmRoot: string;\n id: string;\n settings: Awaited<ReturnType<typeof readSettings>>;\n}): Promise<string[]> {\n if (\n params.workflowEnforcement === \"off\" ||\n params.typeWorkflows.length === 0 ||\n !params.fieldFlags.status ||\n params.options.status === undefined\n ) {\n return [];\n }\n const located = await locateItem(\n params.pmRoot,\n params.id,\n params.settings.id_prefix,\n params.settings.item_format,\n params.typeRegistry.type_to_folder,\n );\n if (!located) {\n throw await buildItemNotFoundError(\n params.pmRoot,\n params.id,\n params.settings.id_prefix,\n params.typeRegistry.type_to_folder,\n );\n }\n const { document } = await readLocatedItem(located, {\n schema: params.settings.schema,\n });\n const effectiveType =\n params.options.type !== undefined\n ? (resolveTypeName(params.options.type, params.typeRegistry) ??\n params.options.type)\n : (document.metadata?.type ?? \"\");\n const warning = enforceTypeWorkflowTransition({\n enforcement: params.workflowEnforcement,\n typeWorkflows: params.typeWorkflows,\n statusRegistry: params.statusRegistry,\n typeName: effectiveType,\n fromStatus: document.metadata?.status ?? \"\",\n toStatus: params.options.status,\n });\n return warning ? [warning] : [];\n}\n\nasync function routeCloseStatusUpdate(\n context: CloseRouteContext,\n): Promise<UpdateResult | undefined> {\n if (!context.fieldFlags.status) {\n return undefined;\n }\n const targetStatus = normalizeStatusInput(\n context.options.status as ItemStatus,\n context.statusRegistry,\n );\n if (targetStatus !== context.statusRegistry.close_status) {\n return undefined;\n }\n\n const otherFieldKeys = Object.entries(context.fieldFlags)\n .filter(\n ([key, value]) => value && key !== \"status\" && key !== \"closeReason\",\n )\n .map(([key]) => key);\n const routeWarnings: string[] = [];\n let preChangedFields: string[] = [];\n if (otherFieldKeys.length > 0) {\n const preUpdate = await runUpdate(\n context.id,\n {\n ...context.options,\n status: undefined,\n closeReason: undefined,\n message: undefined,\n },\n context.global,\n );\n preChangedFields = preUpdate.changed_fields;\n routeWarnings.push(...preUpdate.warnings);\n }\n\n const explicitReason =\n typeof context.options.closeReason === \"string\"\n ? context.options.closeReason.trim()\n : \"\";\n const fallbackMessage =\n typeof context.options.message === \"string\"\n ? context.options.message.trim()\n : \"\";\n const closeReason =\n explicitReason || fallbackMessage || \"Closed via pm update\";\n const closeResult = await runClose(\n context.id,\n closeReason,\n {\n author: context.options.author,\n message: context.options.message,\n force: context.options.force,\n },\n context.global,\n );\n\n const warnings = [\n ...context.workflowTransitionWarnings,\n ...routeWarnings,\n ...closeResult.warnings,\n \"auto_routed_from_update_to_close\",\n ];\n if (explicitReason.length === 0 && fallbackMessage.length === 0) {\n warnings.push(\"close_reason_defaulted\");\n }\n return {\n item: closeResult.item,\n changed_fields: [...preChangedFields, ...closeResult.changed_fields],\n warnings,\n };\n}\n\nfunction applySimpleItemMutations(\n document: ItemDocument,\n options: UpdateCommandOptions,\n statusRegistry: RuntimeStatusRegistry,\n changedFields: string[],\n): string {\n if (options.title !== undefined) {\n document.metadata.title = requireStringOption(options.title, \"--title\");\n changedFields.push(\"title\");\n }\n if (options.description !== undefined) {\n document.metadata.description = options.description;\n changedFields.push(\"description\");\n }\n if (options.body !== undefined) {\n document.body = options.body;\n changedFields.push(\"body\");\n }\n return (\n normalizeStatusInput(document.metadata.status, statusRegistry) ??\n document.metadata.status\n );\n}\n\nfunction hasClosedAt(metadata: ItemDocument[\"metadata\"]): boolean {\n return metadata.closed_at !== undefined && metadata.closed_at !== null;\n}\n\nfunction hasClosedAtProperty(metadata: ItemDocument[\"metadata\"]): boolean {\n return metadata.closed_at !== undefined;\n}\n\nfunction applyStatusAndCloseReasonMutations(\n document: ItemDocument,\n context: Pick<\n UpdateMutationContext,\n \"options\" | \"statusRegistry\" | \"clearItemMetadataKeys\" | \"nowIso\"\n >,\n previousStatusNormalized: string,\n changedFields: string[],\n): void {\n if (context.options.status !== undefined) {\n const status = parseStatus(context.options.status, context.statusRegistry);\n document.metadata.status = status;\n changedFields.push(\"status\");\n if (\n status === context.statusRegistry.close_status &&\n !hasClosedAt(document.metadata)\n ) {\n document.metadata.closed_at = context.nowIso;\n changedFields.push(\"closed_at\");\n } else if (\n previousStatusNormalized === context.statusRegistry.close_status &&\n status !== context.statusRegistry.close_status &&\n hasClosedAtProperty(document.metadata)\n ) {\n delete document.metadata.closed_at;\n changedFields.push(\"closed_at\");\n }\n }\n if (\n context.options.closeReason !== undefined ||\n context.clearItemMetadataKeys.has(\"close_reason\")\n ) {\n if (context.clearItemMetadataKeys.has(\"close_reason\")) {\n delete document.metadata.close_reason;\n } else {\n const closeReason = context.options.closeReason?.trim() ?? \"\";\n if (closeReason.length === 0) {\n throw new PmCliError(\n \"--close-reason must not be empty\",\n EXIT_CODE.USAGE,\n );\n }\n document.metadata.close_reason = closeReason;\n }\n changedFields.push(\"close_reason\");\n return;\n }\n if (\n context.options.status !== undefined &&\n previousStatusNormalized === context.statusRegistry.close_status &&\n document.metadata.status !== context.statusRegistry.canceled_status &&\n document.metadata.close_reason !== undefined\n ) {\n delete document.metadata.close_reason;\n changedFields.push(\"close_reason\");\n }\n}\n\nfunction applyPriorityTypeAndOptions(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): string {\n let activeTypeName =\n resolveTypeName(document.metadata.type, context.typeRegistry) ??\n document.metadata.type;\n if (context.options.priority !== undefined) {\n document.metadata.priority = ensurePriority(context.options.priority);\n changedFields.push(\"priority\");\n }\n if (context.options.type !== undefined) {\n const resolvedTypeName = resolveTypeName(\n context.options.type,\n context.typeRegistry,\n );\n if (!resolvedTypeName) {\n throw new PmCliError(\n buildInvalidTypeError(\n context.options.type,\n context.typeRegistry.types,\n resolveItemTypesFilePath(context.pmRoot, context.settings.schema),\n ),\n EXIT_CODE.USAGE,\n );\n }\n document.metadata.type = resolvedTypeName;\n activeTypeName = resolvedTypeName;\n changedFields.push(\"type\");\n }\n enforceUpdateOptionsByType(\n activeTypeName,\n context.options,\n context.typeRegistry,\n context.runtimeFieldRegistry,\n context.extensionFieldNames,\n );\n applyTypeOptionMutation(document, context, activeTypeName, changedFields);\n return activeTypeName;\n}\n\nfunction applyTypeOptionMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n activeTypeName: string,\n changedFields: string[],\n): void {\n if (\n context.options.typeOption !== undefined ||\n context.clearItemMetadataKeys.has(\"type_options\")\n ) {\n if (context.clearItemMetadataKeys.has(\"type_options\")) {\n delete document.metadata.type_options;\n } else {\n const parsedTypeOptions = parseTypeOptionEntries(\n context.options.typeOption ?? [],\n );\n const validation = validateTypeOptions(\n activeTypeName,\n parsedTypeOptions,\n context.typeRegistry,\n );\n if (validation.errors.length > 0) {\n throw new PmCliError(validation.errors.join(\"; \"), EXIT_CODE.USAGE);\n }\n document.metadata.type_options = validation.normalized;\n }\n changedFields.push(\"type_options\");\n return;\n }\n if (\n context.options.type === undefined ||\n document.metadata.type_options === undefined\n ) {\n return;\n }\n const validation = validateTypeOptions(\n activeTypeName,\n document.metadata.type_options,\n context.typeRegistry,\n );\n if (validation.errors.length > 0) {\n throw new PmCliError(\n `Current type options are incompatible with type \"${activeTypeName}\". ${validation.errors.join(\"; \")}. Use --clear-type-options to clear them.`,\n EXIT_CODE.USAGE,\n );\n }\n document.metadata.type_options = validation.normalized;\n}\n\nfunction applyDependencyMutations(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n if (\n context.options.dep === undefined &&\n context.options.depRemove === undefined &&\n !context.clearItemMetadataKeys.has(\"dependencies\")\n ) {\n return;\n }\n let nextDependencies = context.clearItemMetadataKeys.has(\"dependencies\")\n ? []\n : [...(document.metadata.dependencies ?? [])];\n if (context.dependencyUpdates.additions.length > 0) {\n const seen = new Set(nextDependencies.map((entry) => dependencyKey(entry)));\n for (const addition of context.dependencyUpdates.additions) {\n const key = dependencyKey(addition);\n if (!seen.has(key)) {\n nextDependencies.push(addition);\n seen.add(key);\n }\n }\n }\n if (context.dependencyRemovals.length > 0) {\n nextDependencies = nextDependencies.filter(\n (entry) =>\n !context.dependencyRemovals.some((selector) =>\n matchesDependencySelector(entry, selector),\n ),\n );\n }\n if (nextDependencies.length === 0) {\n delete document.metadata.dependencies;\n } else {\n document.metadata.dependencies = nextDependencies;\n }\n changedFields.push(\"dependencies\");\n}\n\nfunction applyLogCollectionMutations(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n applyLogCollectionMutation(\n document,\n \"comments\",\n context.options.comment,\n context.commentUpdates.values as Comment[] | undefined,\n context.clearItemMetadataKeys,\n changedFields,\n );\n applyLogCollectionMutation(\n document,\n \"notes\",\n context.options.note,\n context.noteUpdates.values as LogNote[] | undefined,\n context.clearItemMetadataKeys,\n changedFields,\n );\n applyLogCollectionMutation(\n document,\n \"learnings\",\n context.options.learning,\n context.learningUpdates.values as LogNote[] | undefined,\n context.clearItemMetadataKeys,\n changedFields,\n );\n}\n\nfunction applyLogCollectionMutation(\n document: ItemDocument,\n key: \"comments\" | \"notes\" | \"learnings\",\n optionValue: string[] | undefined,\n values: Comment[] | LogNote[] | undefined,\n clearItemMetadataKeys: ReadonlySet<string>,\n changedFields: string[],\n): void {\n if (optionValue === undefined && !clearItemMetadataKeys.has(key)) {\n return;\n }\n if (clearItemMetadataKeys.has(key) || !values || values.length === 0) {\n delete document.metadata[key];\n } else {\n document.metadata[key] = [\n ...(document.metadata[key] ?? []),\n ...values,\n ] as never;\n }\n changedFields.push(key);\n}\n\nfunction applyEvidenceCollectionMutations(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n applyUniqueLinkedCollectionMutation(\n document,\n \"files\",\n context.options.file,\n context.fileUpdates.values,\n fileKey,\n context.clearItemMetadataKeys,\n changedFields,\n );\n applyTestCollectionMutation(document, context, changedFields);\n applyUniqueLinkedCollectionMutation(\n document,\n \"docs\",\n context.options.doc,\n context.docUpdates.values,\n docKey,\n context.clearItemMetadataKeys,\n changedFields,\n );\n}\n\nfunction applyUniqueLinkedCollectionMutation<T extends LinkedFile | LinkedDoc>(\n document: ItemDocument,\n key: \"files\" | \"docs\",\n optionValue: string[] | undefined,\n values: T[] | undefined,\n keyOf: (value: T) => string,\n clearItemMetadataKeys: ReadonlySet<string>,\n changedFields: string[],\n): void {\n if (optionValue === undefined && !clearItemMetadataKeys.has(key)) {\n return;\n }\n if (clearItemMetadataKeys.has(key) || !values || values.length === 0) {\n delete document.metadata[key];\n } else {\n const next = [...((document.metadata[key] as T[] | undefined) ?? [])];\n const seen = new Set(next.map((entry) => keyOf(entry)));\n for (const entry of values) {\n const keyValue = keyOf(entry);\n if (!seen.has(keyValue)) {\n next.push(entry);\n seen.add(keyValue);\n }\n }\n document.metadata[key] = next as never;\n }\n changedFields.push(key);\n}\n\nfunction applyTestCollectionMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n if (\n context.options.test === undefined &&\n !context.clearItemMetadataKeys.has(\"tests\")\n ) {\n return;\n }\n if (\n context.clearItemMetadataKeys.has(\"tests\") &&\n context.options.replaceTests === true\n ) {\n document.metadata.tests =\n dedupeLinkedTests(context.testUpdates.values) ?? [];\n } else if (\n context.clearItemMetadataKeys.has(\"tests\") ||\n !context.testUpdates.values ||\n context.testUpdates.values.length === 0\n ) {\n delete document.metadata.tests;\n } else {\n document.metadata.tests = dedupeLinkedTests([\n ...(document.metadata.tests ?? []),\n ...context.testUpdates.values,\n ]);\n }\n if (\n document.metadata.tests !== undefined &&\n document.metadata.tests.length === 0\n ) {\n delete document.metadata.tests;\n }\n changedFields.push(\"tests\");\n}\n\nfunction dedupeLinkedTests(\n values: LinkedTest[] | undefined,\n): LinkedTest[] | undefined {\n if (!values || values.length === 0) {\n return undefined;\n }\n const next: LinkedTest[] = [];\n const seen = new Set<string>();\n for (const entry of values) {\n const key = testKey(entry);\n if (!seen.has(key)) {\n next.push(entry);\n seen.add(key);\n }\n }\n return next;\n}\n\nfunction applyTagsAndPlanningMutations(\n document: ItemDocument,\n context: UpdateMutationContext,\n scalarMutationContext: UpdateScalarMutationContext,\n): void {\n const addTagsValues = context.options.addTags;\n const removeTagsValues = context.options.removeTags;\n const hasAdditiveTagMutation =\n (Array.isArray(addTagsValues) && addTagsValues.length > 0) ||\n (Array.isArray(removeTagsValues) && removeTagsValues.length > 0);\n if (\n context.options.tags !== undefined ||\n context.clearItemMetadataKeys.has(\"tags\") ||\n hasAdditiveTagMutation\n ) {\n const baseTags = context.clearItemMetadataKeys.has(\"tags\")\n ? []\n : context.options.tags !== undefined\n ? parseTags(context.options.tags)\n : Array.isArray(document.metadata.tags)\n ? [...(document.metadata.tags as string[])]\n : [];\n document.metadata.tags = applyTagRemovals(\n mergeAdditiveTags(baseTags, addTagsValues),\n removeTagsValues,\n );\n scalarMutationContext.changedFields.push(\"tags\");\n }\n applyUpdateScalarMutations(\n UPDATE_POST_TAG_SCALAR_MUTATIONS,\n context.options,\n scalarMutationContext,\n );\n applyOrderMutation(document, context, scalarMutationContext.changedFields);\n}\n\n// GH-612: `--add-ac` / `--remove-ac` edit individual \"; \"-separated criteria so\n// concurrent branch edits with disjoint additions merge instead of clobbering\n// the whole acceptance_criteria value (tag-API parity). Runs after the scalar\n// mutations so composition with a `--ac` replace uses the replaced base.\nfunction applyAcceptanceCriteriaAdditiveMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n scalarMutationContext: UpdateScalarMutationContext,\n warnings: string[],\n): void {\n const addValues = context.options.addAc;\n const removeValues = context.options.removeAc;\n if (\n !(Array.isArray(addValues) && addValues.length > 0) &&\n !(Array.isArray(removeValues) && removeValues.length > 0)\n ) {\n return;\n }\n const mutation = applyAcceptanceCriteriaMutations(\n splitAcceptanceCriteria(document.metadata.acceptance_criteria),\n addValues,\n removeValues,\n );\n for (const unmatched of mutation.unmatchedRemovals) {\n warnings.push(`remove_ac_unmatched:${unmatched}`);\n }\n const nextValue = mutation.criteria.join(\"; \");\n if (document.metadata.acceptance_criteria === nextValue) {\n return;\n }\n if (\n nextValue === \"\" &&\n document.metadata.acceptance_criteria === undefined\n ) {\n return;\n }\n document.metadata.acceptance_criteria = nextValue;\n if (!scalarMutationContext.changedFields.includes(\"acceptance_criteria\")) {\n scalarMutationContext.changedFields.push(\"acceptance_criteria\");\n }\n}\n\nfunction applyOrderMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n const orderRaw = context.options.order ?? context.options.rank;\n if (orderRaw === undefined && !context.clearItemMetadataKeys.has(\"order\")) {\n return;\n }\n if (context.clearItemMetadataKeys.has(\"order\")) {\n delete document.metadata.order;\n } else {\n const parsedOrder = parseOptionalNumber(orderRaw ?? \"\", \"order\");\n if (!Number.isInteger(parsedOrder)) {\n throw new PmCliError(\"Order must be an integer\", EXIT_CODE.USAGE);\n }\n document.metadata.order = parsedOrder;\n }\n changedFields.push(\"order\");\n}\n\nfunction applyOwnershipAndIssueMutations(\n document: ItemDocument,\n context: UpdateMutationContext,\n scalarMutationContext: UpdateScalarMutationContext,\n warnings: string[],\n): void {\n applyAssigneeMutation(document, context, scalarMutationContext.changedFields);\n applyParentMutation(document, context, scalarMutationContext.changedFields);\n applyUpdateScalarMutations(\n UPDATE_STAKEHOLDER_SCALAR_MUTATIONS,\n context.options,\n scalarMutationContext,\n );\n applySprintReleaseMutation(\n document,\n context,\n \"sprint\",\n warnings,\n scalarMutationContext.changedFields,\n );\n applySprintReleaseMutation(\n document,\n context,\n \"release\",\n warnings,\n scalarMutationContext.changedFields,\n );\n applyBlockedByMutation(\n document,\n context,\n scalarMutationContext.changedFields,\n );\n applyUpdateScalarMutations(\n UPDATE_ISSUE_SCALAR_MUTATIONS,\n context.options,\n scalarMutationContext,\n );\n}\n\nfunction applyAssigneeMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n if (\n context.options.assignee === undefined &&\n !context.clearItemMetadataKeys.has(\"assignee\")\n ) {\n return;\n }\n if (context.clearItemMetadataKeys.has(\"assignee\")) {\n delete document.metadata.assignee;\n } else {\n const assignee = context.options.assignee?.trim() ?? \"\";\n if (assignee === \"\") {\n throw new PmCliError(\n \"--assignee must not be empty. Use --unset assignee to clear it.\",\n EXIT_CODE.USAGE,\n );\n }\n document.metadata.assignee = assignee;\n }\n changedFields.push(\"assignee\");\n}\n\nfunction applyParentMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n if (\n context.options.parent === undefined &&\n !context.clearItemMetadataKeys.has(\"parent\")\n ) {\n return;\n }\n if (context.clearItemMetadataKeys.has(\"parent\")) {\n delete document.metadata.parent;\n } else {\n document.metadata.parent = context.resolvedParentValue ?? \"\";\n }\n changedFields.push(\"parent\");\n}\n\nfunction applySprintReleaseMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n key: \"sprint\" | \"release\",\n warnings: string[],\n changedFields: string[],\n): void {\n if (\n context.options[key] === undefined &&\n !context.clearItemMetadataKeys.has(key)\n ) {\n return;\n }\n if (context.clearItemMetadataKeys.has(key)) {\n delete document.metadata[key];\n } else {\n const validation = validateSprintOrReleaseValue(\n key,\n context.options[key] ?? \"\",\n context.settings.validation.sprint_release_format,\n );\n document.metadata[key] = validation.value;\n warnings.push(...validation.warnings);\n }\n changedFields.push(key);\n}\n\nfunction applyBlockedByMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n if (\n context.options.blockedBy === undefined &&\n !context.clearItemMetadataKeys.has(\"blocked_by\")\n ) {\n return;\n }\n if (context.clearItemMetadataKeys.has(\"blocked_by\")) {\n delete document.metadata.blocked_by;\n } else {\n document.metadata.blocked_by = context.options.blockedBy?.trim() ?? \"\";\n }\n changedFields.push(\"blocked_by\");\n if (\n context.clearItemMetadataKeys.has(\"blocked_by\") ||\n context.resolvedBlockedByDependencyId !== undefined\n ) {\n applyBlockedByDependencyEdge(\n document.metadata,\n context.resolvedBlockedByDependencyId,\n context.nowIso,\n context.author,\n changedFields,\n );\n }\n}\n\nfunction applyScheduleMutations(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n if (\n context.options.reminder !== undefined ||\n context.clearItemMetadataKeys.has(\"reminders\")\n ) {\n if (context.clearItemMetadataKeys.has(\"reminders\")) {\n delete document.metadata.reminders;\n } else {\n document.metadata.reminders = parseReminderEntries(\n context.options.reminder ?? [],\n context.nowValue,\n { valueMode: \"trimmed\" },\n );\n }\n changedFields.push(\"reminders\");\n }\n if (\n context.options.event !== undefined ||\n context.clearItemMetadataKeys.has(\"events\")\n ) {\n if (context.clearItemMetadataKeys.has(\"events\")) {\n delete document.metadata.events;\n } else {\n document.metadata.events = parseEventEntries(\n context.options.event ?? [],\n context.nowValue,\n {\n allDayEmptyGuard: \"truthy\",\n recurrenceEmptyNumericGuard: \"truthy\",\n },\n );\n }\n changedFields.push(\"events\");\n }\n}\n\nfunction applyRuntimeAndRegisteredFieldMutations(\n metadataRecord: Record<string, unknown>,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n clearDynamicFields(\n metadataRecord,\n context.runtimeFieldRegistry.definitions.map(\n (definition) => definition.metadata_key,\n ),\n context.clearItemMetadataKeys,\n changedFields,\n );\n clearDynamicFields(\n metadataRecord,\n context.extensionFieldNames,\n context.clearItemMetadataKeys,\n changedFields,\n );\n for (const [fieldKey, fieldValue] of Object.entries(\n context.runtimeFieldUpdates,\n )) {\n if (context.clearItemMetadataKeys.has(fieldKey)) {\n const fieldFlag = fieldKey.replaceAll(\"_\", \"-\");\n const definition = context.runtimeFieldRegistry.definitions.find(\n (candidate) => candidate.metadata_key === fieldKey,\n );\n const updateFlag = definition?.cli_flag ?? fieldFlag;\n throw new PmCliError(\n `Cannot combine --unset ${fieldFlag} with --${updateFlag}`,\n EXIT_CODE.USAGE,\n );\n }\n if (stableValueEquals(metadataRecord[fieldKey], fieldValue)) {\n continue;\n }\n metadataRecord[fieldKey] = fieldValue;\n changedFields.push(fieldKey);\n }\n\n const registeredItemFieldUpdates = parseRegisteredItemFieldAssignments(\n context.options.field,\n context.extensionRegistrations,\n );\n for (const fieldKey of Object.keys(registeredItemFieldUpdates)) {\n if (context.clearItemMetadataKeys.has(fieldKey)) {\n throw new PmCliError(\n `Cannot combine --unset ${fieldKey.replaceAll(\"_\", \"-\")} with --field ${fieldKey}=...`,\n EXIT_CODE.USAGE,\n );\n }\n }\n for (const [fieldKey, fieldValue] of Object.entries(\n registeredItemFieldUpdates,\n )) {\n if (!stableValueEquals(metadataRecord[fieldKey], fieldValue)) {\n metadataRecord[fieldKey] = fieldValue;\n changedFields.push(fieldKey);\n }\n }\n}\n\nfunction clearDynamicFields(\n metadataRecord: Record<string, unknown>,\n fieldKeys: readonly string[],\n clearItemMetadataKeys: ReadonlySet<string>,\n changedFields: string[],\n): void {\n for (const fieldKey of fieldKeys) {\n if (\n !clearItemMetadataKeys.has(fieldKey) ||\n metadataRecord[fieldKey] === undefined\n ) {\n continue;\n }\n delete metadataRecord[fieldKey];\n changedFields.push(fieldKey);\n }\n}\n\nfunction mutateUpdateDocument(\n document: ItemDocument,\n context: UpdateMutationContext,\n): { changedFields: string[]; warnings: string[] } {\n const beforeMetadata = structuredClone(toItemRecord(document.metadata));\n const beforeBody = document.body;\n const changedFields: string[] = [];\n const warnings: string[] = [];\n const previousStatusNormalized = applySimpleItemMutations(\n document,\n context.options,\n context.statusRegistry,\n changedFields,\n );\n const metadataRecord = toItemRecord(document.metadata);\n const scalarMutationContext: UpdateScalarMutationContext = {\n metadataRecord,\n clearItemMetadataKeys: context.clearItemMetadataKeys,\n changedFields,\n nowValue: context.nowValue,\n };\n\n applyStatusAndCloseReasonMutations(\n document,\n context,\n previousStatusNormalized,\n changedFields,\n );\n applyPriorityTypeAndOptions(document, context, changedFields);\n applyDependencyMutations(document, context, changedFields);\n applyLogCollectionMutations(document, context, changedFields);\n applyEvidenceCollectionMutations(document, context, changedFields);\n applyTagsAndPlanningMutations(document, context, scalarMutationContext);\n applyAcceptanceCriteriaAdditiveMutation(\n document,\n context,\n scalarMutationContext,\n warnings,\n );\n applyOwnershipAndIssueMutations(\n document,\n context,\n scalarMutationContext,\n warnings,\n );\n if (\n normalizeStatusInput(document.metadata.status, context.statusRegistry) ===\n context.statusRegistry.canceled_status &&\n document.metadata.assignee !== undefined\n ) {\n delete document.metadata.assignee;\n if (!changedFields.includes(\"assignee\")) {\n changedFields.push(\"assignee\");\n }\n }\n applyScheduleMutations(document, context, changedFields);\n applyRuntimeAndRegisteredFieldMutations(\n metadataRecord,\n context,\n changedFields,\n );\n try {\n applyRegisteredItemFieldDefaultsAndValidation(\n metadataRecord,\n context.extensionRegistrations,\n { skipDefaultFields: context.clearItemMetadataKeys },\n );\n } catch (error: unknown) {\n throw new PmCliError(\n error instanceof Error\n ? error.message\n : \"Invalid extension item field values\",\n EXIT_CODE.USAGE,\n );\n }\n const afterMetadata = toItemRecord(document.metadata);\n const actualChangedFields = [...new Set(changedFields)].filter((field) =>\n field === \"body\"\n ? document.body !== beforeBody\n : !stableValueEquals(beforeMetadata[field], afterMetadata[field]),\n );\n return { changedFields: actualChangedFields, warnings };\n}\n\n/** Implements run update for the public runtime surface of this module. */\nexport async function runUpdate(\n id: string,\n options: UpdateCommandOptions,\n global: GlobalOptions,\n): Promise<UpdateResult> {\n options = await resolveStdinUpdateOptions(options);\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n await assertUpdateTrackerInitialized(pmRoot);\n const settings = await readSettings(pmRoot);\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const runtimeFieldRegistry = resolveRuntimeFieldRegistry(settings.schema);\n const extensionRegistrations = getActiveExtensionRegistrations();\n const extensionFieldNames = collectRegisteredItemFieldNames(\n extensionRegistrations,\n );\n const typeRegistry = resolveItemTypeRegistry(\n settings,\n extensionRegistrations,\n );\n // Per-type allowed-transition enforcement is read RAW (not preset-derived) so\n // existing projects are unaffected when unset; defaults to \"off\".\n const workflowEnforcement: GovernanceWorkflowEnforcement =\n settings.governance.workflow_enforcement ?? \"off\";\n const typeWorkflows =\n workflowEnforcement === \"off\" ? [] : resolveTypeWorkflows(settings.schema);\n const parentReferencePolicy = settings.validation.parent_reference;\n const unsetTargets = parseUpdateUnsetTargets(\n options.unset,\n runtimeFieldRegistry,\n extensionFieldNames,\n );\n const clearOptionKeys = new Set<string>(unsetTargets.optionKeys);\n const clearItemMetadataKeys = new Set<string>(unsetTargets.metadataKeys);\n\n validateReplaceOptions(options);\n applyClearCollectionDefinitions({\n definitions: buildClearCollectionDefinitions(options),\n options,\n clearOptionKeys,\n clearItemMetadataKeys,\n });\n enforceOwnershipBypassScope(id, options, clearItemMetadataKeys);\n\n rejectUnsetScalarConflicts(options, unsetTargets);\n rejectLegacyScalarTokens(options);\n\n const author = toAuthor(options.author, settings.author_default);\n const nowValue = new Date();\n const nowIso = nowValue.toISOString();\n const dependencyUpdates = parseDependencyAdditions(\n options.dep,\n settings.id_prefix,\n nowIso,\n );\n const dependencyRemovals = parseDependencyRemovals(\n options.depRemove,\n settings.id_prefix,\n );\n const parsedCommentUpdates = parseLogSeed(\n \"--comment\",\n options.comment,\n nowIso,\n author,\n );\n const commentUpdates =\n options.ownershipMetadataBypass === true && parsedCommentUpdates.values\n ? {\n ...parsedCommentUpdates,\n values: parsedCommentUpdates.values.map((entry) => ({\n ...entry,\n author,\n })),\n }\n : parsedCommentUpdates;\n const noteUpdates = parseLogSeed(\"--note\", options.note, nowIso, author);\n const learningUpdates = parseLogSeed(\n \"--learning\",\n options.learning,\n nowIso,\n author,\n );\n const fileUpdates = parseFiles(options.file);\n const testUpdates = parseTests(options.test);\n const docUpdates = parseDocs(options.doc);\n const workflowTransitionWarnings: string[] = [];\n const parentReference = await resolveParentReferenceForUpdate({\n id,\n options,\n unsetTargets,\n pmRoot,\n settings,\n typeRegistry,\n parentReferencePolicy,\n });\n\n // pm-kyd6: resolve the --blocked-by target up front (async) so the sync\n // mutate callback can mirror create.ts and add a `blocked_by` dependency edge.\n const blockedByResolution = await resolveBlockedByDependencyTarget(\n options.blockedBy,\n clearItemMetadataKeys.has(\"blocked_by\"),\n pmRoot,\n settings.id_prefix,\n settings.item_format,\n typeRegistry.type_to_folder,\n );\n const resolvedBlockedByDependencyId = blockedByResolution.id;\n const parentReferenceWarnings = [\n ...parentReference.warnings,\n ...blockedByResolutionWarnings(blockedByResolution),\n ];\n\n const runtimeFieldUpdates = collectRuntimeUpdateFieldValues(\n options as Record<string, unknown>,\n runtimeFieldRegistry,\n options.runtimeFieldCommands,\n );\n const fieldFlags = buildUpdateFieldFlags(options, runtimeFieldUpdates);\n const changedFlags = Object.values(fieldFlags).some(Boolean);\n\n if (!changedFlags) {\n return buildNoopUpdateResult({ pmRoot, id, settings, typeRegistry });\n }\n\n workflowTransitionWarnings.push(\n ...(await collectWorkflowTransitionWarnings({\n options,\n fieldFlags,\n workflowEnforcement,\n typeWorkflows,\n statusRegistry,\n typeRegistry,\n pmRoot,\n id,\n settings,\n })),\n );\n const routedClose = await routeCloseStatusUpdate({\n options,\n fieldFlags,\n statusRegistry,\n workflowTransitionWarnings,\n global,\n id,\n });\n if (routedClose) {\n return routedClose;\n }\n assertMatchingOrderRank(options);\n\n let graphBeforeUpdate =\n fieldFlags.dep || fieldFlags.depRemove || fieldFlags.blockedBy\n ? await listAllItemMetadataLight(\n pmRoot,\n settings.item_format,\n typeRegistry.type_to_folder,\n undefined,\n settings.schema,\n )\n : undefined;\n\n const result = await mutateItem({\n pmRoot,\n settings,\n typeToFolder: typeRegistry.type_to_folder,\n id,\n op:\n options.ownershipMetadataBypass === true || options.ownershipDependencyBypass === true\n ? \"update_ownership_bypass\"\n : \"update\",\n author,\n message: options.message,\n force: options.force,\n bypassAssigneeConflict:\n options.ownershipMetadataBypass === true || options.ownershipDependencyBypass === true,\n extensionFieldNames,\n skipNoop: true,\n mutate(document) {\n graphBeforeUpdate = graphBeforeUpdate?.map((item) =>\n item.id === document.metadata.id\n ? structuredClone(document.metadata)\n : item,\n );\n return mutateUpdateDocument(document, {\n options,\n settings,\n typeRegistry,\n statusRegistry,\n runtimeFieldRegistry,\n extensionRegistrations,\n extensionFieldNames,\n clearItemMetadataKeys,\n dependencyUpdates,\n dependencyRemovals,\n commentUpdates,\n noteUpdates,\n learningUpdates,\n fileUpdates,\n testUpdates,\n docUpdates,\n resolvedParentValue: parentReference.resolvedParentValue,\n resolvedBlockedByDependencyId,\n runtimeFieldUpdates,\n nowValue,\n nowIso,\n author,\n pmRoot,\n });\n },\n });\n const orderingCycleWarnings = graphBeforeUpdate\n ? collectNewOrderingCycleWarnings(\n graphBeforeUpdate,\n graphBeforeUpdate.map((item) =>\n item.id === result.item.id ? result.item : item,\n ),\n result.item.id,\n )\n : [];\n\n return {\n item: toItemRecord(result.item),\n changed_fields: result.changedFields,\n warnings: [\n ...workflowTransitionWarnings,\n ...parentReferenceWarnings,\n ...orderingCycleWarnings,\n ...result.warnings,\n ],\n };\n}\n\n/* c8 ignore stop */\n/** Public contract for test only update command, shared by SDK and presentation-layer consumers. */\nexport const _testOnlyUpdateCommand = {\n applyStatusAndCloseReasonMutations,\n collectProvidedUpdatePolicyOptions,\n buildOwnershipBypassRestrictedOptionsError,\n enforceOwnershipBypassScope,\n enforceTypeWorkflowTransition,\n matchesDependencySelector,\n normalizeLegacyNoneUpdateOptions,\n normalizeUpdatePolicyOptionKey,\n parseDependencyAdditions,\n parseDependencyRemovals,\n parseUpdateUnsetTargets,\n reconcileBlockedByDependency,\n resolveRuntimeUnsetDefinition: (\n token: string,\n registry: RuntimeFieldRegistry | undefined,\n ) => resolveRuntimeUnsetFieldDefinition(token, \"update\", registry),\n};\n"],"names":["disallowedFlags","validation"],"mappings":"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","debugId":"f7652cf1-aaa9-5fe4-97b5-23dcce2a9d9f"}
|