@unbrained/pm-cli 2026.7.1 → 2026.7.3
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 +3 -3
- package/CHANGELOG.md +25 -0
- package/CONTRIBUTING.md +2 -2
- package/README.md +1 -1
- package/dist/cli/commander-usage.d.ts +2 -0
- package/dist/cli/commander-usage.js +110 -86
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/activity.js +79 -57
- package/dist/cli/commands/activity.js.map +1 -1
- package/dist/cli/commands/aggregate.js +102 -79
- package/dist/cli/commands/aggregate.js.map +1 -1
- package/dist/cli/commands/calendar.js +278 -243
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/close-many.js +176 -114
- package/dist/cli/commands/close-many.js.map +1 -1
- package/dist/cli/commands/close.js +157 -129
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/comments-audit.js +50 -42
- package/dist/cli/commands/comments-audit.js.map +1 -1
- package/dist/cli/commands/config.d.ts +2 -0
- package/dist/cli/commands/config.js +443 -879
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/context.js +365 -287
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/contracts.js +352 -238
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.js +32 -17
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/dedupe-audit.js +46 -39
- package/dist/cli/commands/dedupe-audit.js.map +1 -1
- package/dist/cli/commands/dedupe-merge.js +88 -69
- package/dist/cli/commands/dedupe-merge.js.map +1 -1
- package/dist/cli/commands/extension/doctor.js +56 -67
- package/dist/cli/commands/extension/doctor.js.map +1 -1
- package/dist/cli/commands/extension/shared.js +21 -15
- package/dist/cli/commands/extension/shared.js.map +1 -1
- package/dist/cli/commands/get.js +114 -81
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/health.d.ts +17 -0
- package/dist/cli/commands/health.js +545 -417
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history-compact.js +209 -140
- package/dist/cli/commands/history-compact.js.map +1 -1
- package/dist/cli/commands/history-redact.js +162 -119
- package/dist/cli/commands/history-redact.js.map +1 -1
- package/dist/cli/commands/history-repair.js +120 -85
- package/dist/cli/commands/history-repair.js.map +1 -1
- package/dist/cli/commands/init-agent-guidance.js +32 -19
- package/dist/cli/commands/init-agent-guidance.js.map +1 -1
- package/dist/cli/commands/init.d.ts +8 -2
- package/dist/cli/commands/init.js +263 -162
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/list.js +152 -102
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/next.js +60 -40
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/plan.js +373 -298
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/profile.js +23 -15
- package/dist/cli/commands/profile.js.map +1 -1
- package/dist/cli/commands/recurrence-parsers.js +43 -25
- package/dist/cli/commands/recurrence-parsers.js.map +1 -1
- package/dist/cli/commands/reindex.d.ts +21 -5
- package/dist/cli/commands/reindex.js +345 -205
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/restore.d.ts +8 -7
- package/dist/cli/commands/restore.js +105 -69
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/schema.js +33 -30
- package/dist/cli/commands/schema.js.map +1 -1
- package/dist/cli/commands/search.d.ts +10 -2
- package/dist/cli/commands/search.js +503 -470
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/telemetry.js +98 -87
- package/dist/cli/commands/telemetry.js.map +1 -1
- package/dist/cli/commands/test-all.js +237 -168
- package/dist/cli/commands/test-all.js.map +1 -1
- package/dist/cli/commands/test.d.ts +6 -5
- package/dist/cli/commands/test.js +424 -344
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.js +57 -42
- package/dist/cli/commands/update-many.js.map +1 -1
- package/dist/cli/commands/update.d.ts +1 -1
- package/dist/cli/commands/update.js +738 -671
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +20 -1
- package/dist/cli/commands/validate.js +478 -343
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/error-guidance.js +406 -361
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-help.js +27 -19
- package/dist/cli/extension-command-help.js.map +1 -1
- package/dist/cli/help-json-payload.js +57 -49
- package/dist/cli/help-json-payload.js.map +1 -1
- package/dist/cli/main.d.ts +47 -0
- package/dist/cli/main.js +474 -371
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/migration-gates.js +22 -45
- package/dist/cli/migration-gates.js.map +1 -1
- package/dist/cli/register-list-query.js +299 -310
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.js +763 -779
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.js +386 -362
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +120 -101
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.d.ts +4 -0
- package/dist/cli/registration-helpers.js +45 -56
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli-bundle/chunks/{activity-DBLQVIP6.js → activity-5YWLSPGE.js} +9 -9
- package/dist/cli-bundle/chunks/activity-BIML7K2D.js +16 -0
- package/dist/cli-bundle/chunks/{aggregate-SDF7DUOD.js → aggregate-2V2M3JZU.js} +107 -83
- package/dist/cli-bundle/chunks/{aggregate-SDF7DUOD.js.map → aggregate-2V2M3JZU.js.map} +2 -2
- package/dist/cli-bundle/chunks/{aggregate-JTEF4BP7.js → aggregate-EK7DXML7.js} +108 -84
- package/dist/cli-bundle/chunks/aggregate-EK7DXML7.js.map +1 -0
- package/dist/cli-bundle/chunks/{append-LOVPGVPT.js → append-EZESUVJT.js} +8 -8
- package/dist/cli-bundle/chunks/{append-QCFJSDFL.js → append-JFG4WQMG.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-TP5Q5ZD3.js → chunk-32IUNTG4.js} +158 -119
- package/dist/cli-bundle/chunks/chunk-32IUNTG4.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-BHO33VBQ.js → chunk-3W2HJKJX.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-VARHOHYV.js → chunk-4EXFFP7T.js} +86 -52
- package/dist/cli-bundle/chunks/chunk-4EXFFP7T.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-4DUVCVLZ.js → chunk-4PFVUUYV.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-JSU5P7VS.js → chunk-4WB6S4YX.js} +308 -184
- package/dist/cli-bundle/chunks/chunk-4WB6S4YX.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-HXTQJXWT.js → chunk-572FKBRL.js} +61 -102
- package/dist/cli-bundle/chunks/chunk-572FKBRL.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-IJYK2T43.js → chunk-5E7N4T2Z.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NKZAN7BD.js → chunk-5IZUBZBR.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-NOLPZMSV.js → chunk-5JIWFWOZ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-FFMQB7WR.js → chunk-67LARBDL.js} +493 -404
- package/dist/cli-bundle/chunks/chunk-67LARBDL.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-6AQZPVHQ.js → chunk-6CDCWKSX.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-3K2M5OYU.js → chunk-6KRFL33E.js} +308 -184
- package/dist/cli-bundle/chunks/chunk-6KRFL33E.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-LB6TP6MC.js → chunk-6NYJGMTY.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-SLMUGTK3.js → chunk-7CLLC75T.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-2466X6E4.js → chunk-7LYO6S5A.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-W4ULYO7Z.js → chunk-A3OQ7TFW.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-5CGRF3L5.js → chunk-AIKU3IIL.js} +153 -90
- package/dist/cli-bundle/chunks/chunk-AIKU3IIL.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-WYDHYJPO.js → chunk-AJHYQCBJ.js} +39 -5
- package/dist/cli-bundle/chunks/chunk-AJHYQCBJ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js → chunk-B4O5S7I3.js} +79 -57
- package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js.map → chunk-B4O5S7I3.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-OTUHB4HS.js → chunk-BE2SR6QL.js} +92 -77
- package/dist/cli-bundle/chunks/chunk-BE2SR6QL.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-JLM7BHI7.js → chunk-BI4R7HI2.js} +75 -53
- package/dist/cli-bundle/chunks/chunk-BI4R7HI2.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-AXIDKKAT.js → chunk-CXR3CMBQ.js} +33 -6
- package/dist/cli-bundle/chunks/chunk-CXR3CMBQ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ZETXE4SE.js → chunk-ECU6MMTQ.js} +713 -613
- package/dist/cli-bundle/chunks/chunk-ECU6MMTQ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-2D4HATP2.js → chunk-EJ2OCBHF.js} +54 -30
- package/dist/cli-bundle/chunks/chunk-EJ2OCBHF.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-BDTISOSD.js → chunk-EQURFOMH.js} +41 -26
- package/dist/cli-bundle/chunks/chunk-EQURFOMH.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-GJ326ZKX.js → chunk-ER4ME5U2.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-HZZEHPRG.js → chunk-ERG65A2L.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-IZBR4NRW.js → chunk-F6WNBITZ.js} +157 -113
- package/dist/cli-bundle/chunks/chunk-F6WNBITZ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-L5OEFZQG.js → chunk-FH2H3CBD.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-JPECA746.js → chunk-FUFFPIYA.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-CF7RL6FR.js → chunk-FZJM2TXF.js} +110 -73
- package/dist/cli-bundle/chunks/chunk-FZJM2TXF.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-27BXPBAY.js → chunk-GUYNUXQT.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-MAUKX7JC.js → chunk-GVJE5T7Q.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-3J6JRJ3I.js → chunk-HB4FAT3O.js} +42 -60
- package/dist/cli-bundle/chunks/chunk-HB4FAT3O.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-55SNVXRQ.js → chunk-HQAF23Q2.js} +626 -484
- package/dist/cli-bundle/chunks/chunk-HQAF23Q2.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-ZRP4VG5U.js → chunk-JBZ2NTKX.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-RMMQ74TG.js → chunk-JPATY4SE.js} +54 -30
- package/dist/cli-bundle/chunks/chunk-JPATY4SE.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-IPYBJWTE.js → chunk-K5DT2YKM.js} +109 -72
- package/dist/cli-bundle/chunks/chunk-K5DT2YKM.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-EJUDVUYZ.js → chunk-KEZOIPCR.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-RVUALSJF.js → chunk-KHVGM5CS.js} +466 -365
- package/dist/cli-bundle/chunks/chunk-KHVGM5CS.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-YITK2PJ6.js → chunk-KS6ATO47.js} +288 -175
- package/dist/cli-bundle/chunks/chunk-KS6ATO47.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-7R4QEMZZ.js → chunk-L4SLHV6G.js} +463 -362
- package/dist/cli-bundle/chunks/chunk-L4SLHV6G.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-RLDHZHQS.js → chunk-LBE5QFMZ.js} +158 -114
- package/dist/cli-bundle/chunks/chunk-LBE5QFMZ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-22WKIL3H.js → chunk-LCWQP6NM.js} +76 -54
- package/dist/cli-bundle/chunks/chunk-LCWQP6NM.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KNPEF7QG.js → chunk-LOWVNZBZ.js} +91 -76
- package/dist/cli-bundle/chunks/chunk-LOWVNZBZ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-HYTGA6GI.js → chunk-MDHWWBNZ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-N74UMG5H.js → chunk-MEZZZBYX.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-V3NOKJF2.js → chunk-MHRS5FUX.js} +288 -175
- package/dist/cli-bundle/chunks/chunk-MHRS5FUX.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-3XZCOZ5J.js → chunk-NOIEVOK5.js} +391 -313
- package/dist/cli-bundle/chunks/chunk-NOIEVOK5.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-SDR5J34Q.js → chunk-NZ7QIUP5.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-UYUYDGIB.js → chunk-OGLGI22K.js} +115 -67
- package/dist/cli-bundle/chunks/{chunk-UYUYDGIB.js.map → chunk-OGLGI22K.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-DDPTYJIM.js → chunk-P5L7Z2O6.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-BZCEN4JA.js → chunk-PULUSQAV.js} +492 -403
- package/dist/cli-bundle/chunks/chunk-PULUSQAV.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-3VGN2UWE.js → chunk-QCDTQCMW.js} +22 -30
- package/dist/cli-bundle/chunks/chunk-QCDTQCMW.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-4A3BJ675.js → chunk-QNNQAAZ5.js} +24 -18
- package/dist/cli-bundle/chunks/{chunk-4A3BJ675.js.map → chunk-QNNQAAZ5.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-MDPEOIGN.js → chunk-RAHINBVP.js} +60 -101
- package/dist/cli-bundle/chunks/chunk-RAHINBVP.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-CWFNTKQJ.js → chunk-RJH5VQHW.js} +43 -61
- package/dist/cli-bundle/chunks/chunk-RJH5VQHW.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-OGXLACHC.js → chunk-SU2E4AWU.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-HPPFYYOV.js → chunk-SU3TB4NS.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-JWXRETDF.js → chunk-SYE6WMV6.js} +626 -484
- package/dist/cli-bundle/chunks/chunk-SYE6WMV6.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-NWMZWYYB.js → chunk-T3P7PMZP.js} +42 -27
- package/dist/cli-bundle/chunks/chunk-T3P7PMZP.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-G7I7DEZA.js → chunk-T4XBKJ3F.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-RH5ZBYFD.js → chunk-T6AXEBOP.js} +23 -17
- package/dist/cli-bundle/chunks/{chunk-RH5ZBYFD.js.map → chunk-T6AXEBOP.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-5QFDBI4F.js → chunk-TQ6AX5SQ.js} +58 -69
- package/dist/cli-bundle/chunks/{chunk-5QFDBI4F.js.map → chunk-TQ6AX5SQ.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-4XOIEKSD.js → chunk-U3S2B7TA.js} +86 -52
- package/dist/cli-bundle/chunks/chunk-U3S2B7TA.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-VICZWYGZ.js → chunk-U5TR4N7J.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-EVMTBV6V.js → chunk-UMNQZS4H.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-A7FPBAQS.js → chunk-WJA3PXW7.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-RGEMWD6Q.js → chunk-WRYERRZX.js} +157 -118
- package/dist/cli-bundle/chunks/chunk-WRYERRZX.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-NUHHPVVS.js → chunk-WYOIIFSE.js} +712 -612
- package/dist/cli-bundle/chunks/chunk-WYOIIFSE.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-4DSGXSBL.js → chunk-XRYSCRZR.js} +116 -68
- package/dist/cli-bundle/chunks/{chunk-4DSGXSBL.js.map → chunk-XRYSCRZR.js.map} +3 -3
- package/dist/cli-bundle/chunks/{chunk-NU2UEROZ.js → chunk-YF746GTH.js} +59 -70
- package/dist/cli-bundle/chunks/{chunk-NU2UEROZ.js.map → chunk-YF746GTH.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-JMP4E6D7.js → chunk-YPWUSH72.js} +390 -312
- package/dist/cli-bundle/chunks/{chunk-JMP4E6D7.js.map → chunk-YPWUSH72.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-QCWF6IYD.js → chunk-YSDFIY7N.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-UZIWVBE6.js → chunk-YSGTMDWC.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NFDPYAIP.js → chunk-YVKZ3ANP.js} +21 -29
- package/dist/cli-bundle/chunks/chunk-YVKZ3ANP.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js → chunk-Z4DGFQDH.js} +80 -58
- package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js.map → chunk-Z4DGFQDH.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-64HNBBFQ.js → chunk-Z5F6XZXE.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-AVEE5EHK.js → chunk-Z7RPDF2Y.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-3S2KT7NG.js → chunk-ZFTKYWIF.js} +152 -89
- package/dist/cli-bundle/chunks/chunk-ZFTKYWIF.js.map +7 -0
- package/dist/cli-bundle/chunks/{claim-T3GCKV7C.js → claim-2BGBGSVI.js} +8 -8
- package/dist/cli-bundle/chunks/{claim-EMQLYPRW.js → claim-5GU7OE67.js} +8 -8
- package/dist/cli-bundle/chunks/close-6YODBUIV.js +14 -0
- package/dist/cli-bundle/chunks/{close-TQYAAFJP.js → close-AFVKPR57.js} +7 -7
- package/dist/cli-bundle/chunks/{close-many-BG5QQIDQ.js → close-many-7KLOSYLP.js} +186 -122
- package/dist/cli-bundle/chunks/close-many-7KLOSYLP.js.map +7 -0
- package/dist/cli-bundle/chunks/{close-many-LDRVEQY2.js → close-many-JKUJMHLG.js} +187 -123
- package/dist/cli-bundle/chunks/close-many-JKUJMHLG.js.map +1 -0
- package/dist/cli-bundle/chunks/{comments-YUXJRZPQ.js → comments-DNWHEBOS.js} +9 -9
- package/dist/cli-bundle/chunks/{comments-QCKR2YY2.js → comments-RW23R3VE.js} +9 -9
- package/dist/cli-bundle/chunks/config-AUM5WBYA.js +1072 -0
- package/dist/cli-bundle/chunks/config-AUM5WBYA.js.map +7 -0
- package/dist/cli-bundle/chunks/config-OZWSA2NP.js +1062 -0
- package/dist/cli-bundle/chunks/config-OZWSA2NP.js.map +1 -0
- package/dist/cli-bundle/chunks/{context-B6275WPX.js → context-OYXRGY7S.js} +12 -12
- package/dist/cli-bundle/chunks/{context-OCZ3FJ4Z.js → context-PKCEHQY3.js} +12 -12
- package/dist/cli-bundle/chunks/{contracts-HN7ABKLP.js → contracts-L6ODXNUM.js} +320 -199
- package/dist/cli-bundle/chunks/contracts-L6ODXNUM.js.map +7 -0
- package/dist/cli-bundle/chunks/{contracts-W4FZVVD6.js → contracts-X74F2GSM.js} +321 -200
- package/dist/cli-bundle/chunks/contracts-X74F2GSM.js.map +1 -0
- package/dist/cli-bundle/chunks/{copy-DEM4DATS.js → copy-6XOR3HKN.js} +5 -5
- package/dist/cli-bundle/chunks/{copy-BTJOSKKT.js → copy-I4NCLBR4.js} +5 -5
- package/dist/cli-bundle/chunks/{create-RLRJMRTM.js → create-PM45M6PE.js} +12 -12
- package/dist/cli-bundle/chunks/create-Z7YCH3BE.js +28 -0
- package/dist/cli-bundle/chunks/{delete-BHK7VB2Z.js → delete-7YXHYG67.js} +5 -5
- package/dist/cli-bundle/chunks/{delete-LSVHAB4Y.js → delete-LPISP43T.js} +5 -5
- package/dist/cli-bundle/chunks/{deps-XHYXWEPT.js → deps-N2T26FME.js} +5 -5
- package/dist/cli-bundle/chunks/{deps-4UDFJRUA.js → deps-WATKQDE3.js} +5 -5
- package/dist/cli-bundle/chunks/{docs-GYZNVS26.js → docs-6LQ3GLM7.js} +7 -7
- package/dist/cli-bundle/chunks/{docs-26S44RXU.js → docs-Z3X6JZLT.js} +7 -7
- package/dist/cli-bundle/chunks/{eval-UYF3ZPVO.js → eval-6DCLG52D.js} +10 -10
- package/dist/cli-bundle/chunks/{eval-PGRVIJQU.js → eval-Y3ZCUTHK.js} +10 -10
- package/dist/cli-bundle/chunks/{extension-CPSLJQVE.js → extension-BNINIMT7.js} +11 -11
- package/dist/cli-bundle/chunks/{extension-CXJ6RELI.js → extension-QWE4YYK5.js} +11 -11
- package/dist/cli-bundle/chunks/{files-NQHEXUZD.js → files-6SGKHS6O.js} +7 -7
- package/dist/cli-bundle/chunks/{files-MBNICQFM.js → files-FUYPSOFJ.js} +7 -7
- package/dist/cli-bundle/chunks/{focus-DWYIG7GU.js → focus-2Q3K76G2.js} +6 -6
- package/dist/cli-bundle/chunks/{focus-XZW5423D.js → focus-ATLBWXXD.js} +6 -6
- package/dist/cli-bundle/chunks/{gc-LPVMKJQJ.js → gc-RUYEMNRF.js} +3 -3
- package/dist/cli-bundle/chunks/{gc-7GQYOS2G.js → gc-TDWSDR66.js} +3 -3
- package/dist/cli-bundle/chunks/{get-A7MAOHCU.js → get-2WGLX74N.js} +120 -80
- package/dist/cli-bundle/chunks/get-2WGLX74N.js.map +7 -0
- package/dist/cli-bundle/chunks/{get-DSDEKJ3L.js → get-LY6M2JIM.js} +121 -81
- package/dist/cli-bundle/chunks/get-LY6M2JIM.js.map +1 -0
- package/dist/cli-bundle/chunks/{health-3IPFLKXB.js → health-4RKHYS3T.js} +535 -371
- package/dist/cli-bundle/chunks/health-4RKHYS3T.js.map +1 -0
- package/dist/cli-bundle/chunks/{health-GZXGBZ36.js → health-TMFVNYRA.js} +534 -370
- package/dist/cli-bundle/chunks/health-TMFVNYRA.js.map +7 -0
- package/dist/cli-bundle/chunks/history-CGNQJXFE.js +18 -0
- package/dist/cli-bundle/chunks/{history-NERDJNUB.js → history-SGRRS72R.js} +8 -8
- package/dist/cli-bundle/chunks/{history-compact-2WRZ2WK4.js → history-compact-LOED43R3.js} +213 -134
- package/dist/cli-bundle/chunks/history-compact-LOED43R3.js.map +7 -0
- package/dist/cli-bundle/chunks/{history-compact-HR7BB4LR.js → history-compact-V5DNAQHH.js} +214 -135
- package/dist/cli-bundle/chunks/history-compact-V5DNAQHH.js.map +1 -0
- package/dist/cli-bundle/chunks/{history-redact-O3NBCNWC.js → history-redact-IRL7WJ3E.js} +9 -9
- package/dist/cli-bundle/chunks/history-redact-N3JK7VBW.js +19 -0
- package/dist/cli-bundle/chunks/{history-repair-XA3LC4GA.js → history-repair-4WVBVHFR.js} +124 -84
- package/dist/cli-bundle/chunks/history-repair-4WVBVHFR.js.map +1 -0
- package/dist/cli-bundle/chunks/{history-repair-LCMOS45X.js → history-repair-PGYQJMGD.js} +123 -83
- package/dist/cli-bundle/chunks/history-repair-PGYQJMGD.js.map +7 -0
- package/dist/cli-bundle/chunks/{init-64XDLQJB.js → init-4GESW7RM.js} +12 -12
- package/dist/cli-bundle/chunks/init-XIDPABA4.js +22 -0
- package/dist/cli-bundle/chunks/{learnings-LPKCSJX7.js → learnings-4BHWFFUV.js} +9 -9
- package/dist/cli-bundle/chunks/{learnings-JR6MA5TI.js → learnings-4FJY7WIW.js} +9 -9
- package/dist/cli-bundle/chunks/{list-G5Y65VF6.js → list-472TIOVK.js} +8 -8
- package/dist/cli-bundle/chunks/{list-DNBJVO3E.js → list-D7BF5CL2.js} +8 -8
- package/dist/cli-bundle/chunks/{next-FYTQF6HG.js → next-D5STGWI2.js} +71 -46
- package/dist/cli-bundle/chunks/next-D5STGWI2.js.map +1 -0
- package/dist/cli-bundle/chunks/{next-BCERKDUR.js → next-SFQZVX2B.js} +70 -45
- package/dist/cli-bundle/chunks/next-SFQZVX2B.js.map +7 -0
- package/dist/cli-bundle/chunks/{notes-2BMU3VVQ.js → notes-6KNOSLIT.js} +9 -9
- package/dist/cli-bundle/chunks/{notes-6KTGO2OJ.js → notes-W4UEICGF.js} +9 -9
- package/dist/cli-bundle/chunks/{plan-RKZHQVXR.js → plan-JO6V7BXO.js} +373 -279
- package/dist/cli-bundle/chunks/plan-JO6V7BXO.js.map +1 -0
- package/dist/cli-bundle/chunks/{plan-4WXEQCTN.js → plan-MJQW5XK3.js} +372 -278
- package/dist/cli-bundle/chunks/plan-MJQW5XK3.js.map +7 -0
- package/dist/cli-bundle/chunks/{profile-4OMM32CD.js → profile-3TOTMUR4.js} +27 -19
- package/dist/cli-bundle/chunks/profile-3TOTMUR4.js.map +7 -0
- package/dist/cli-bundle/chunks/{profile-QLER5ENE.js → profile-WIQY2KCV.js} +28 -20
- package/dist/cli-bundle/chunks/profile-WIQY2KCV.js.map +1 -0
- package/dist/cli-bundle/chunks/register-list-query-ELBHCCFI.js +416 -0
- package/dist/cli-bundle/chunks/register-list-query-ELBHCCFI.js.map +7 -0
- package/dist/cli-bundle/chunks/register-list-query-GAPQ6DM3.js +406 -0
- package/dist/cli-bundle/chunks/register-list-query-GAPQ6DM3.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-mutation-KK7PHYYU.js → register-mutation-ROFE2YPC.js} +729 -702
- package/dist/cli-bundle/chunks/register-mutation-ROFE2YPC.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-mutation-ENNDUAZG.js → register-mutation-SJWMVIJ2.js} +730 -703
- package/dist/cli-bundle/chunks/register-mutation-SJWMVIJ2.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-operations-HZ6XERQG.js → register-operations-IADFVH53.js} +389 -365
- package/dist/cli-bundle/chunks/register-operations-IADFVH53.js.map +7 -0
- package/dist/cli-bundle/chunks/register-operations-MEKU3AKC.js +510 -0
- package/dist/cli-bundle/chunks/register-operations-MEKU3AKC.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-setup-ZKJ53RS7.js → register-setup-3QJY43CY.js} +128 -103
- package/dist/cli-bundle/chunks/register-setup-3QJY43CY.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-setup-P67EMBDJ.js → register-setup-AJWUSSQX.js} +129 -104
- package/dist/cli-bundle/chunks/register-setup-AJWUSSQX.js.map +1 -0
- package/dist/cli-bundle/chunks/{restore-4MHZFJ2E.js → restore-44IHMMZZ.js} +9 -9
- package/dist/cli-bundle/chunks/restore-EXHU34EU.js +17 -0
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-LB6DOLRL.js → scheduling-shortcuts-OLHNLAZY.js} +12 -12
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-UTOYKLXQ.js → scheduling-shortcuts-TSBK4AY5.js} +12 -12
- package/dist/cli-bundle/chunks/{schema-73HR2OJW.js → schema-IB2NZZWD.js} +7 -7
- package/dist/cli-bundle/chunks/{schema-U6LJKSIR.js → schema-VBCELP5G.js} +7 -7
- package/dist/cli-bundle/chunks/{search-AXPXKZER.js → search-7UBETML4.js} +10 -10
- package/dist/cli-bundle/chunks/{search-KILGT37L.js → search-R227JOL6.js} +10 -10
- package/dist/cli-bundle/chunks/{stats-W5KNVJWQ.js → stats-FAG7COEH.js} +6 -6
- package/dist/cli-bundle/chunks/{stats-PSYVVTNZ.js → stats-MCK7PLYS.js} +6 -6
- package/dist/cli-bundle/chunks/{telemetry-GAHHQTOS.js → telemetry-DRPDZMAO.js} +84 -70
- package/dist/cli-bundle/chunks/telemetry-DRPDZMAO.js.map +7 -0
- package/dist/cli-bundle/chunks/{telemetry-BZUF6H7G.js → telemetry-GVVUQSJQ.js} +85 -71
- package/dist/cli-bundle/chunks/telemetry-GVVUQSJQ.js.map +1 -0
- package/dist/cli-bundle/chunks/{test-PWDIZ255.js → test-QY44WAMR.js} +15 -15
- package/dist/cli-bundle/chunks/{test-ACD52Z3S.js → test-SY76DZTO.js} +15 -15
- package/dist/cli-bundle/chunks/test-all-QD6QAEG7.js +430 -0
- package/dist/cli-bundle/chunks/test-all-QD6QAEG7.js.map +7 -0
- package/dist/cli-bundle/chunks/test-all-USPJHXFR.js +427 -0
- package/dist/cli-bundle/chunks/test-all-USPJHXFR.js.map +1 -0
- package/dist/cli-bundle/chunks/{test-runs-UXIXPDKU.js → test-runs-MG5VIGSK.js} +185 -147
- package/dist/cli-bundle/chunks/test-runs-MG5VIGSK.js.map +1 -0
- package/dist/cli-bundle/chunks/{test-runs-PLRAZEFW.js → test-runs-QIR5MJPL.js} +184 -146
- package/dist/cli-bundle/chunks/test-runs-QIR5MJPL.js.map +7 -0
- package/dist/cli-bundle/chunks/update-A7EICML6.js +24 -0
- package/dist/cli-bundle/chunks/{update-KFX2SIAC.js → update-IKJZWLQC.js} +15 -15
- package/dist/cli-bundle/chunks/{update-many-RNSBX2TA.js → update-many-BEMTDA2X.js} +84 -69
- package/dist/cli-bundle/chunks/{update-many-RNSBX2TA.js.map → update-many-BEMTDA2X.js.map} +1 -1
- package/dist/cli-bundle/chunks/{update-many-Z5GJS5LC.js → update-many-RATAARHU.js} +83 -68
- package/dist/cli-bundle/chunks/{update-many-Z5GJS5LC.js.map → update-many-RATAARHU.js.map} +2 -2
- package/dist/cli-bundle/chunks/{upgrade-BRL6KCOJ.js → upgrade-NWMR3VQL.js} +11 -11
- package/dist/cli-bundle/chunks/{upgrade-HAK6JG2O.js → upgrade-VU46BLJZ.js} +11 -11
- package/dist/cli-bundle/chunks/{validate-X5W76YJL.js → validate-GAJ6FUSI.js} +451 -321
- package/dist/cli-bundle/chunks/validate-GAJ6FUSI.js.map +1 -0
- package/dist/cli-bundle/chunks/{validate-MTUVL5VC.js → validate-NRY6MFXN.js} +450 -320
- package/dist/cli-bundle/chunks/validate-NRY6MFXN.js.map +7 -0
- package/dist/cli-bundle/main.js +1107 -916
- package/dist/cli-bundle/main.js.map +3 -3
- package/dist/core/config/nested-settings.js +89 -67
- package/dist/core/config/nested-settings.js.map +1 -1
- package/dist/core/governance/metadata-coverage.js +20 -28
- package/dist/core/governance/metadata-coverage.js.map +1 -1
- package/dist/core/history/drift-scan.js +93 -81
- package/dist/core/history/drift-scan.js.map +1 -1
- package/dist/core/item/item-type-definition.js +14 -14
- package/dist/core/item/item-type-definition.js.map +1 -1
- package/dist/core/item/type-registry.js +114 -99
- package/dist/core/item/type-registry.js.map +1 -1
- package/dist/core/output/mutation-projection.js +42 -26
- package/dist/core/output/mutation-projection.js.map +1 -1
- package/dist/core/schema/runtime-schema.js +97 -80
- package/dist/core/schema/runtime-schema.js.map +1 -1
- package/dist/core/schema/status-defs-file.js +26 -3
- package/dist/core/schema/status-defs-file.js.map +1 -1
- package/dist/core/search/corpus.js +25 -19
- package/dist/core/search/corpus.js.map +1 -1
- package/dist/core/search/semantic-defaults.js +64 -37
- package/dist/core/search/semantic-defaults.js.map +1 -1
- package/dist/core/search/vector-stores.js +32 -17
- package/dist/core/search/vector-stores.js.map +1 -1
- package/dist/core/sentry/helpers.js +31 -28
- package/dist/core/sentry/helpers.js.map +1 -1
- package/dist/core/sentry/instrument.js +54 -43
- package/dist/core/sentry/instrument.js.map +1 -1
- package/dist/core/shared/memo.d.ts +12 -0
- package/dist/core/shared/memo.js +25 -0
- package/dist/core/shared/memo.js.map +1 -0
- package/dist/core/shared/serialization.js +24 -14
- package/dist/core/shared/serialization.js.map +1 -1
- package/dist/core/shared/time.js +26 -4
- package/dist/core/shared/time.js.map +1 -1
- package/dist/core/store/front-matter-cache.d.ts +5 -0
- package/dist/core/store/front-matter-cache.js +316 -171
- package/dist/core/store/front-matter-cache.js.map +1 -1
- package/dist/core/store/item-store.js +33 -26
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/settings.js +247 -203
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/test/background-runs.js +189 -160
- package/dist/core/test/background-runs.js.map +1 -1
- package/dist/sdk/cli-contracts/flag-contracts.js +71 -99
- package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -1
- package/dist/sdk/compose.js +51 -42
- package/dist/sdk/compose.js.map +1 -1
- package/docs/AGENT_GUIDE.md +2 -2
- package/docs/ARCHITECTURE.md +2 -2
- package/docs/COMMANDS.md +8 -4
- package/docs/CONFIGURATION.md +1 -1
- package/docs/EXTENSIONS.md +12 -12
- package/docs/ONBOARDING.md +4 -2
- package/docs/README.md +2 -0
- package/docs/examples/starter-extension/README.md +11 -10
- package/marketplace.json +3 -3
- package/package.json +2 -2
- package/packages/pm-beads/extensions/beads/runtime.ts +240 -167
- package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +65 -58
- package/packages/pm-todos/extensions/todos/runtime.ts +65 -42
- package/plugins/pm-claude/.claude-plugin/plugin.json +2 -2
- package/plugins/pm-claude/README.md +6 -3
- package/plugins/pm-claude/commands/pm-init.md +1 -1
- package/dist/cli-bundle/chunks/activity-AW6XVFH6.js +0 -16
- package/dist/cli-bundle/chunks/aggregate-JTEF4BP7.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-22WKIL3H.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-2D4HATP2.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-3J6JRJ3I.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-3K2M5OYU.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-3S2KT7NG.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-3VGN2UWE.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-3XZCOZ5J.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-4XOIEKSD.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-55SNVXRQ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-5CGRF3L5.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-7R4QEMZZ.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-AXIDKKAT.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-BDTISOSD.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-BZCEN4JA.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-CF7RL6FR.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-CWFNTKQJ.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-FFMQB7WR.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-HXTQJXWT.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-IPYBJWTE.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-IZBR4NRW.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-JLM7BHI7.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-JSU5P7VS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-JWXRETDF.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-KNPEF7QG.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-MDPEOIGN.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-NFDPYAIP.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-NUHHPVVS.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-NWMZWYYB.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-OTUHB4HS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-RGEMWD6Q.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-RLDHZHQS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-RMMQ74TG.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-RVUALSJF.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-TP5Q5ZD3.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-V3NOKJF2.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-VARHOHYV.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-WYDHYJPO.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-YITK2PJ6.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ZETXE4SE.js.map +0 -1
- package/dist/cli-bundle/chunks/close-E6ZZGCJY.js +0 -14
- package/dist/cli-bundle/chunks/close-many-BG5QQIDQ.js.map +0 -7
- package/dist/cli-bundle/chunks/close-many-LDRVEQY2.js.map +0 -1
- package/dist/cli-bundle/chunks/config-DMSU64QO.js +0 -1541
- package/dist/cli-bundle/chunks/config-DMSU64QO.js.map +0 -7
- package/dist/cli-bundle/chunks/config-QH2DICD6.js +0 -1531
- package/dist/cli-bundle/chunks/config-QH2DICD6.js.map +0 -1
- package/dist/cli-bundle/chunks/contracts-HN7ABKLP.js.map +0 -7
- package/dist/cli-bundle/chunks/contracts-W4FZVVD6.js.map +0 -1
- package/dist/cli-bundle/chunks/create-OH3BDGBB.js +0 -28
- package/dist/cli-bundle/chunks/get-A7MAOHCU.js.map +0 -7
- package/dist/cli-bundle/chunks/get-DSDEKJ3L.js.map +0 -1
- package/dist/cli-bundle/chunks/health-3IPFLKXB.js.map +0 -1
- package/dist/cli-bundle/chunks/health-GZXGBZ36.js.map +0 -7
- package/dist/cli-bundle/chunks/history-WSZHY3PN.js +0 -18
- package/dist/cli-bundle/chunks/history-compact-2WRZ2WK4.js.map +0 -7
- package/dist/cli-bundle/chunks/history-compact-HR7BB4LR.js.map +0 -1
- package/dist/cli-bundle/chunks/history-redact-MP6CH7U5.js +0 -19
- package/dist/cli-bundle/chunks/history-repair-LCMOS45X.js.map +0 -7
- package/dist/cli-bundle/chunks/history-repair-XA3LC4GA.js.map +0 -1
- package/dist/cli-bundle/chunks/init-PAX32BJA.js +0 -22
- package/dist/cli-bundle/chunks/next-BCERKDUR.js.map +0 -7
- package/dist/cli-bundle/chunks/next-FYTQF6HG.js.map +0 -1
- package/dist/cli-bundle/chunks/plan-4WXEQCTN.js.map +0 -7
- package/dist/cli-bundle/chunks/plan-RKZHQVXR.js.map +0 -1
- package/dist/cli-bundle/chunks/profile-4OMM32CD.js.map +0 -7
- package/dist/cli-bundle/chunks/profile-QLER5ENE.js.map +0 -1
- package/dist/cli-bundle/chunks/register-list-query-7LV46VAU.js +0 -400
- package/dist/cli-bundle/chunks/register-list-query-7LV46VAU.js.map +0 -1
- package/dist/cli-bundle/chunks/register-list-query-SNG5PGA4.js +0 -410
- package/dist/cli-bundle/chunks/register-list-query-SNG5PGA4.js.map +0 -7
- package/dist/cli-bundle/chunks/register-mutation-ENNDUAZG.js.map +0 -1
- package/dist/cli-bundle/chunks/register-mutation-KK7PHYYU.js.map +0 -7
- package/dist/cli-bundle/chunks/register-operations-C6OWLDSH.js +0 -486
- package/dist/cli-bundle/chunks/register-operations-C6OWLDSH.js.map +0 -1
- package/dist/cli-bundle/chunks/register-operations-HZ6XERQG.js.map +0 -7
- package/dist/cli-bundle/chunks/register-setup-P67EMBDJ.js.map +0 -1
- package/dist/cli-bundle/chunks/register-setup-ZKJ53RS7.js.map +0 -7
- package/dist/cli-bundle/chunks/restore-YALDGTQR.js +0 -17
- package/dist/cli-bundle/chunks/telemetry-BZUF6H7G.js.map +0 -1
- package/dist/cli-bundle/chunks/telemetry-GAHHQTOS.js.map +0 -7
- package/dist/cli-bundle/chunks/test-all-L2MDDUCA.js +0 -358
- package/dist/cli-bundle/chunks/test-all-L2MDDUCA.js.map +0 -1
- package/dist/cli-bundle/chunks/test-all-RBZ6DLU2.js +0 -361
- package/dist/cli-bundle/chunks/test-all-RBZ6DLU2.js.map +0 -7
- package/dist/cli-bundle/chunks/test-runs-PLRAZEFW.js.map +0 -7
- package/dist/cli-bundle/chunks/test-runs-UXIXPDKU.js.map +0 -1
- package/dist/cli-bundle/chunks/update-AMRSOIWP.js +0 -24
- package/dist/cli-bundle/chunks/validate-MTUVL5VC.js.map +0 -7
- package/dist/cli-bundle/chunks/validate-X5W76YJL.js.map +0 -1
- /package/dist/cli-bundle/chunks/{activity-DBLQVIP6.js.map → activity-5YWLSPGE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{activity-AW6XVFH6.js.map → activity-BIML7K2D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-LOVPGVPT.js.map → append-EZESUVJT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-QCFJSDFL.js.map → append-JFG4WQMG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BHO33VBQ.js.map → chunk-3W2HJKJX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4DUVCVLZ.js.map → chunk-4PFVUUYV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IJYK2T43.js.map → chunk-5E7N4T2Z.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NKZAN7BD.js.map → chunk-5IZUBZBR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NOLPZMSV.js.map → chunk-5JIWFWOZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6AQZPVHQ.js.map → chunk-6CDCWKSX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-LB6TP6MC.js.map → chunk-6NYJGMTY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SLMUGTK3.js.map → chunk-7CLLC75T.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2466X6E4.js.map → chunk-7LYO6S5A.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-W4ULYO7Z.js.map → chunk-A3OQ7TFW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GJ326ZKX.js.map → chunk-ER4ME5U2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HZZEHPRG.js.map → chunk-ERG65A2L.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-L5OEFZQG.js.map → chunk-FH2H3CBD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JPECA746.js.map → chunk-FUFFPIYA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-27BXPBAY.js.map → chunk-GUYNUXQT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-MAUKX7JC.js.map → chunk-GVJE5T7Q.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ZRP4VG5U.js.map → chunk-JBZ2NTKX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EJUDVUYZ.js.map → chunk-KEZOIPCR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HYTGA6GI.js.map → chunk-MDHWWBNZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-N74UMG5H.js.map → chunk-MEZZZBYX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SDR5J34Q.js.map → chunk-NZ7QIUP5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DDPTYJIM.js.map → chunk-P5L7Z2O6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OGXLACHC.js.map → chunk-SU2E4AWU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HPPFYYOV.js.map → chunk-SU3TB4NS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-G7I7DEZA.js.map → chunk-T4XBKJ3F.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VICZWYGZ.js.map → chunk-U5TR4N7J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EVMTBV6V.js.map → chunk-UMNQZS4H.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-A7FPBAQS.js.map → chunk-WJA3PXW7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QCWF6IYD.js.map → chunk-YSDFIY7N.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UZIWVBE6.js.map → chunk-YSGTMDWC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-64HNBBFQ.js.map → chunk-Z5F6XZXE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AVEE5EHK.js.map → chunk-Z7RPDF2Y.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-T3GCKV7C.js.map → claim-2BGBGSVI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-EMQLYPRW.js.map → claim-5GU7OE67.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-E6ZZGCJY.js.map → close-6YODBUIV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-TQYAAFJP.js.map → close-AFVKPR57.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-YUXJRZPQ.js.map → comments-DNWHEBOS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-QCKR2YY2.js.map → comments-RW23R3VE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-B6275WPX.js.map → context-OYXRGY7S.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-OCZ3FJ4Z.js.map → context-PKCEHQY3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-DEM4DATS.js.map → copy-6XOR3HKN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-BTJOSKKT.js.map → copy-I4NCLBR4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-RLRJMRTM.js.map → create-PM45M6PE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-OH3BDGBB.js.map → create-Z7YCH3BE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-BHK7VB2Z.js.map → delete-7YXHYG67.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-LSVHAB4Y.js.map → delete-LPISP43T.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-XHYXWEPT.js.map → deps-N2T26FME.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-4UDFJRUA.js.map → deps-WATKQDE3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-GYZNVS26.js.map → docs-6LQ3GLM7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-26S44RXU.js.map → docs-Z3X6JZLT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-UYF3ZPVO.js.map → eval-6DCLG52D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-PGRVIJQU.js.map → eval-Y3ZCUTHK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-CPSLJQVE.js.map → extension-BNINIMT7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-CXJ6RELI.js.map → extension-QWE4YYK5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-NQHEXUZD.js.map → files-6SGKHS6O.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-MBNICQFM.js.map → files-FUYPSOFJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-DWYIG7GU.js.map → focus-2Q3K76G2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-XZW5423D.js.map → focus-ATLBWXXD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-LPVMKJQJ.js.map → gc-RUYEMNRF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-7GQYOS2G.js.map → gc-TDWSDR66.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-WSZHY3PN.js.map → history-CGNQJXFE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-NERDJNUB.js.map → history-SGRRS72R.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-O3NBCNWC.js.map → history-redact-IRL7WJ3E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-MP6CH7U5.js.map → history-redact-N3JK7VBW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-64XDLQJB.js.map → init-4GESW7RM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-PAX32BJA.js.map → init-XIDPABA4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-LPKCSJX7.js.map → learnings-4BHWFFUV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-JR6MA5TI.js.map → learnings-4FJY7WIW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-G5Y65VF6.js.map → list-472TIOVK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-DNBJVO3E.js.map → list-D7BF5CL2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-2BMU3VVQ.js.map → notes-6KNOSLIT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-6KTGO2OJ.js.map → notes-W4UEICGF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-4MHZFJ2E.js.map → restore-44IHMMZZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-YALDGTQR.js.map → restore-EXHU34EU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-LB6DOLRL.js.map → scheduling-shortcuts-OLHNLAZY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-UTOYKLXQ.js.map → scheduling-shortcuts-TSBK4AY5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-73HR2OJW.js.map → schema-IB2NZZWD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-U6LJKSIR.js.map → schema-VBCELP5G.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-AXPXKZER.js.map → search-7UBETML4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-KILGT37L.js.map → search-R227JOL6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-W5KNVJWQ.js.map → stats-FAG7COEH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-PSYVVTNZ.js.map → stats-MCK7PLYS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-PWDIZ255.js.map → test-QY44WAMR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-ACD52Z3S.js.map → test-SY76DZTO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-AMRSOIWP.js.map → update-A7EICML6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-KFX2SIAC.js.map → update-IKJZWLQC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{upgrade-BRL6KCOJ.js.map → upgrade-NWMR3VQL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{upgrade-HAK6JG2O.js.map → upgrade-VU46BLJZ.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../../../core/governance/metadata-coverage.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Metadata governance & coverage observability primitives.\n *\n * One dependency-light module that powers the whole metadata-governance\n * surface: missing-field selection (pm list / pm update-many), coverage\n * percentages (pm stats --metadata-coverage / pm validate), and grouped\n * lifecycle breakdowns (pm stats --by-assignee/--by-tag/--by-priority,\n * pm aggregate explicit labels).\n *\n * The module is pure: it performs no IO and imports no heavy runtime\n * dependencies. Lifecycle semantics are injected via a {@link LifecycleClassifier}\n * so callers map their runtime status registry to lifecycle buckets while the\n * pure logic here stays trivially testable with a fake classifier.\n */\n\nimport { toNonEmptyStringOrUndefined } from \"../shared/primitives.js\";\n\n/** Minimal structural shape this module needs from an item's front matter. */\nexport interface CoverageItem {\n type: string;\n status: string;\n assignee?: string;\n tags?: string[];\n parent?: string;\n priority?: number;\n acceptance_criteria?: string;\n estimated_minutes?: number;\n resolution?: string;\n reviewer?: string;\n risk?: string;\n /** Confidence is a string-like enum or a numeric score depending on workspace. */\n confidence?: string | number;\n sprint?: string;\n release?: string;\n [key: string]: unknown;\n}\n\n/** Lifecycle buckets used by grouped breakdowns and distributions. */\nexport type LifecycleBucket =\n | \"open\"\n | \"in_progress\"\n | \"blocked\"\n | \"draft\"\n | \"closed\"\n | \"canceled\"\n | \"other\";\n\n/** Stable rendering order for lifecycle buckets. */\nexport const LIFECYCLE_BUCKET_ORDER: readonly LifecycleBucket[] = [\n \"open\",\n \"in_progress\",\n \"blocked\",\n \"draft\",\n \"closed\",\n \"canceled\",\n \"other\",\n] as const;\n\n/**\n * Classifies a raw status string into a lifecycle bucket and reports whether a\n * status is terminal (closed/canceled). Callers build this from their resolved\n * runtime status registry via {@link lifecycleClassifierFromStatusRegistry}.\n */\nexport interface LifecycleClassifier {\n classify(status: string): LifecycleBucket;\n isTerminal(status: string): boolean;\n}\n\n/** The subset of a resolved runtime status registry this module consumes. */\nexport interface StatusRegistryLike {\n alias_to_id: Map<string, string>;\n terminal_statuses: Set<string>;\n terminal_canceled_statuses: Set<string>;\n blocked_statuses: Set<string>;\n draft_statuses: Set<string>;\n active_statuses: Set<string>;\n open_status: string;\n}\n\nfunction normalizeStatus(status: string, registry: StatusRegistryLike): string {\n const trimmed = status.trim().toLowerCase();\n return registry.alias_to_id.get(trimmed) ?? trimmed;\n}\n\n/**\n * Adapt a resolved runtime status registry into a {@link LifecycleClassifier}.\n *\n * Precedence is deliberate and disjoint: canceled → closed → blocked → draft →\n * open → in_progress (active but not the default open status) → other.\n */\nexport function lifecycleClassifierFromStatusRegistry(registry: StatusRegistryLike): LifecycleClassifier {\n return {\n isTerminal(status: string): boolean {\n return registry.terminal_statuses.has(normalizeStatus(status, registry));\n },\n classify(status: string): LifecycleBucket {\n const id = normalizeStatus(status, registry);\n if (registry.terminal_canceled_statuses.has(id)) {\n return \"canceled\";\n }\n if (registry.terminal_statuses.has(id)) {\n return \"closed\";\n }\n if (registry.blocked_statuses.has(id)) {\n return \"blocked\";\n }\n if (registry.draft_statuses.has(id)) {\n return \"draft\";\n }\n if (id === registry.open_status) {\n return \"open\";\n }\n if (registry.active_statuses.has(id)) {\n return \"in_progress\";\n }\n return \"other\";\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Missing-metadata predicates\n// ---------------------------------------------------------------------------\n\n/** True when an item has no non-empty acceptance_criteria. */\nexport function isAcMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.acceptance_criteria) === undefined;\n}\n\n/** True when an item has no finite estimated_minutes. */\nexport function isEstimateMissing(item: CoverageItem): boolean {\n return !Number.isFinite(item.estimated_minutes);\n}\n\n/**\n * True when a terminal (closed/canceled) item has no non-empty resolution.\n * Resolution is only expected on terminal items, so open items are never\n * considered \"resolution-missing\".\n */\nexport function isResolutionMissing(item: CoverageItem, classifier: LifecycleClassifier): boolean {\n if (!classifier.isTerminal(item.status)) {\n return false;\n }\n return toNonEmptyStringOrUndefined(item.resolution) === undefined;\n}\n\n/** True when an item has no non-empty reviewer. */\nexport function isReviewerMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.reviewer) === undefined;\n}\n\n/** True when an item has no non-empty risk level. */\nexport function isRiskMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.risk) === undefined;\n}\n\n/**\n * True when an item has no confidence value. Confidence is a string-like enum\n * or a numeric score depending on workspace, so a finite number counts as\n * present and only blank/absent values are treated as missing.\n */\nexport function isConfidenceMissing(item: CoverageItem): boolean {\n if (typeof item.confidence === \"number\") {\n return !Number.isFinite(item.confidence);\n }\n return toNonEmptyStringOrUndefined(item.confidence) === undefined;\n}\n\n/** True when an item has no non-empty sprint. */\nexport function isSprintMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.sprint) === undefined;\n}\n\n/** True when an item has no non-empty release. */\nexport function isReleaseMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.release) === undefined;\n}\n\n/** Selection flags for {@link filterMissingMetadata}. */\nexport interface MissingMetadataFilters {\n acMissing?: boolean;\n estimatesMissing?: boolean;\n resolutionMissing?: boolean;\n reviewerMissing?: boolean;\n riskMissing?: boolean;\n confidenceMissing?: boolean;\n sprintMissing?: boolean;\n releaseMissing?: boolean;\n /** Match items missing ANY of the tracked metadata fields (union). */\n metadataMissing?: boolean;\n}\n\n/** True when any missing-metadata filter is requested. */\nexport function hasMissingMetadataFilter(filters: MissingMetadataFilters): boolean {\n return Boolean(\n filters.acMissing ||\n filters.estimatesMissing ||\n filters.resolutionMissing ||\n filters.reviewerMissing ||\n filters.riskMissing ||\n filters.confidenceMissing ||\n filters.sprintMissing ||\n filters.releaseMissing ||\n filters.metadataMissing,\n );\n}\n\n/**\n * Does a single item satisfy the requested missing-metadata filters?\n *\n * Specific flags (acMissing/estimatesMissing/resolutionMissing plus the\n * governance flags reviewerMissing/riskMissing/confidenceMissing/sprintMissing/\n * releaseMissing) are ANDed together so callers can narrow precisely.\n * `metadataMissing` is ORed in as a union shortcut for \"missing any of the\n * core tracked fields\" (acceptance_criteria/estimated_minutes/resolution); it\n * deliberately excludes the governance fields so the long-standing flag keeps\n * its original meaning. When no filter is requested the item passes.\n */\nexport function itemMatchesMissingMetadata(\n item: CoverageItem,\n filters: MissingMetadataFilters,\n classifier: LifecycleClassifier,\n): boolean {\n if (!hasMissingMetadataFilter(filters)) {\n return true;\n }\n if (filters.acMissing && !isAcMissing(item)) {\n return false;\n }\n if (filters.estimatesMissing && !isEstimateMissing(item)) {\n return false;\n }\n if (filters.resolutionMissing && !isResolutionMissing(item, classifier)) {\n return false;\n }\n if (filters.reviewerMissing && !isReviewerMissing(item)) {\n return false;\n }\n if (filters.riskMissing && !isRiskMissing(item)) {\n return false;\n }\n if (filters.confidenceMissing && !isConfidenceMissing(item)) {\n return false;\n }\n if (filters.sprintMissing && !isSprintMissing(item)) {\n return false;\n }\n if (filters.releaseMissing && !isReleaseMissing(item)) {\n return false;\n }\n if (filters.metadataMissing) {\n const anyMissing =\n isAcMissing(item) || isEstimateMissing(item) || isResolutionMissing(item, classifier);\n if (!anyMissing) {\n return false;\n }\n }\n return true;\n}\n\n/** Filter a list of items by the requested missing-metadata predicates. */\nexport function filterMissingMetadata<T extends CoverageItem>(\n items: readonly T[],\n filters: MissingMetadataFilters,\n classifier: LifecycleClassifier,\n): T[] {\n if (!hasMissingMetadataFilter(filters)) {\n return [...items];\n }\n return items.filter((item) => itemMatchesMissingMetadata(item, filters, classifier));\n}\n\n// ---------------------------------------------------------------------------\n// Metadata coverage percentages\n// ---------------------------------------------------------------------------\n\n/** Coverage-tracked metadata fields. */\nexport type CoverageField =\n | \"acceptance_criteria\"\n | \"estimated_minutes\"\n | \"resolution\"\n | \"tags\"\n | \"parent\";\n\n/** Stable ordering of coverage fields for rendering. */\nexport const COVERAGE_FIELD_ORDER: readonly CoverageField[] = [\n \"acceptance_criteria\",\n \"estimated_minutes\",\n \"resolution\",\n \"tags\",\n \"parent\",\n] as const;\n\n/** Coverage of a single field: present vs applicable, with a rounded percent. */\nexport interface FieldCoverage {\n present: number;\n /** Items for which the field is expected (all items, except resolution = terminal only). */\n applicable: number;\n /** present/applicable * 100, rounded to one decimal; 100 when applicable is 0. */\n percent: number;\n}\n\n/**\n * Documents the metadata coverage report payload exchanged by command, SDK, and package integrations.\n */\nexport interface MetadataCoverageReport {\n overall: Record<CoverageField, FieldCoverage>;\n by_type: Record<string, Record<CoverageField, FieldCoverage>>;\n}\n\nfunction isFieldPresent(item: CoverageItem, field: CoverageField): boolean {\n switch (field) {\n case \"acceptance_criteria\":\n return !isAcMissing(item);\n case \"estimated_minutes\":\n return !isEstimateMissing(item);\n case \"resolution\":\n return toNonEmptyStringOrUndefined(item.resolution) !== undefined;\n case \"tags\":\n return Array.isArray(item.tags) && item.tags.length > 0;\n default:\n return toNonEmptyStringOrUndefined(item.parent) !== undefined;\n }\n}\n\n/** Whether a field applies to a given item (resolution only applies to terminal items). */\nfunction isFieldApplicable(item: CoverageItem, field: CoverageField, classifier: LifecycleClassifier): boolean {\n if (field === \"resolution\") {\n return classifier.isTerminal(item.status);\n }\n return true;\n}\n\nfunction roundPercent(present: number, applicable: number): number {\n if (applicable === 0) {\n return 100;\n }\n return Math.round((present / applicable) * 1000) / 10;\n}\n\nfunction emptyFieldCoverage(): Record<CoverageField, FieldCoverage> {\n const record = {} as Record<CoverageField, FieldCoverage>;\n for (const field of COVERAGE_FIELD_ORDER) {\n record[field] = { present: 0, applicable: 0, percent: 100 };\n }\n return record;\n}\n\nfunction accumulateCoverage(\n target: Record<CoverageField, FieldCoverage>,\n item: CoverageItem,\n classifier: LifecycleClassifier,\n): void {\n for (const field of COVERAGE_FIELD_ORDER) {\n if (!isFieldApplicable(item, field, classifier)) {\n continue;\n }\n const entry = target[field];\n entry.applicable += 1;\n if (isFieldPresent(item, field)) {\n entry.present += 1;\n }\n }\n}\n\nfunction finalizePercentages(record: Record<CoverageField, FieldCoverage>): void {\n for (const field of COVERAGE_FIELD_ORDER) {\n const entry = record[field];\n entry.percent = roundPercent(entry.present, entry.applicable);\n }\n}\n\n/**\n * Compute metadata coverage overall and per item type. For each tracked field\n * we report present/applicable counts and a rounded percentage. Resolution is\n * scoped to terminal items (its only applicable population).\n */\nexport function computeMetadataCoverage(\n items: readonly CoverageItem[],\n classifier: LifecycleClassifier,\n): MetadataCoverageReport {\n const overall = emptyFieldCoverage();\n const byType: Record<string, Record<CoverageField, FieldCoverage>> = {};\n for (const item of items) {\n accumulateCoverage(overall, item, classifier);\n const typeRecord = byType[item.type] ?? (byType[item.type] = emptyFieldCoverage());\n accumulateCoverage(typeRecord, item, classifier);\n }\n finalizePercentages(overall);\n for (const typeRecord of Object.values(byType)) {\n finalizePercentages(typeRecord);\n }\n return { overall, by_type: byType };\n}\n\n// ---------------------------------------------------------------------------\n// Grouped lifecycle breakdowns\n// ---------------------------------------------------------------------------\n\n/** Dimensions a breakdown can group by. */\nexport type GroupDimension = \"assignee\" | \"priority\" | \"tag\" | \"parent\" | \"type\" | \"status\";\n\n/** Explicit labels for empty/blank group keys, by dimension. */\nconst EMPTY_GROUP_LABELS: Record<GroupDimension, string> = {\n assignee: \"(unassigned)\",\n priority: \"(no priority)\",\n tag: \"(untagged)\",\n parent: \"(unparented)\",\n type: \"(untyped)\",\n status: \"(no status)\",\n};\n\n/** Explicit label for an empty/blank group value for a given dimension. */\nexport function emptyGroupLabel(dimension: GroupDimension): string {\n return EMPTY_GROUP_LABELS[dimension];\n}\n\n/**\n * Documents the group row payload exchanged by command, SDK, and package integrations.\n */\nexport interface GroupRow {\n /** Display label; explicit \"(unassigned)\"-style label for blank keys. */\n label: string;\n /** Stable structured key (null for the empty/blank group). */\n key: string | null;\n buckets: Record<LifecycleBucket, number>;\n total: number;\n}\n\n/**\n * Documents the grouped breakdown payload exchanged by command, SDK, and package integrations.\n */\nexport interface GroupedBreakdown {\n dimension: GroupDimension;\n rows: GroupRow[];\n /** Distinct items observed (an item can contribute to multiple tag rows). */\n total_items: number;\n}\n\n/**\n * Documents the group options payload exchanged by command, SDK, and package integrations.\n */\nexport interface GroupOptions {\n /** For dimension=\"tag\": only consider tags starting with this prefix. */\n tagPrefix?: string;\n}\n\nfunction emptyBuckets(): Record<LifecycleBucket, number> {\n return {\n open: 0,\n in_progress: 0,\n blocked: 0,\n draft: 0,\n closed: 0,\n canceled: 0,\n other: 0,\n };\n}\n\n/**\n * Resolve the group keys an item belongs to for a dimension. Most dimensions\n * yield exactly one key (possibly null for blank); tag yields one key per\n * matching tag (or [null] when none match), so an item can span multiple rows.\n */\nfunction groupKeysForItem(item: CoverageItem, dimension: GroupDimension, options: GroupOptions): (string | null)[] {\n switch (dimension) {\n case \"assignee\":\n return [toNonEmptyStringOrUndefined(item.assignee) ?? null];\n case \"parent\":\n return [toNonEmptyStringOrUndefined(item.parent) ?? null];\n case \"type\":\n return [toNonEmptyStringOrUndefined(item.type) ?? null];\n case \"status\":\n return [toNonEmptyStringOrUndefined(item.status) ?? null];\n case \"priority\":\n return [typeof item.priority === \"number\" ? `P${item.priority}` : null];\n default: {\n const prefix = options.tagPrefix?.trim();\n const tags = Array.isArray(item.tags) ? item.tags : [];\n const matching = tags.filter(\n (tag) => typeof tag === \"string\" && tag.length > 0 && (!prefix || tag.startsWith(prefix)),\n );\n return matching.length > 0 ? matching : [null];\n }\n }\n}\n\n/**\n * Group items by a dimension into lifecycle-bucketed rows. Blank keys render\n * with an explicit \"(unassigned)\"-style label. Rows are sorted by total\n * descending, then label ascending, with the empty group sorted last on ties.\n */\nexport function groupItemsByDimension(\n items: readonly CoverageItem[],\n dimension: GroupDimension,\n classifier: LifecycleClassifier,\n options: GroupOptions = {},\n): GroupedBreakdown {\n const rows = new Map<string, GroupRow>();\n let totalItems = 0;\n for (const item of items) {\n totalItems += 1;\n const bucket = classifier.classify(item.status);\n for (const key of groupKeysForItem(item, dimension, options)) {\n const mapKey = key ?? \"\u0000empty\";\n let row = rows.get(mapKey);\n if (!row) {\n row = {\n label: key ?? emptyGroupLabel(dimension),\n key,\n buckets: emptyBuckets(),\n total: 0,\n };\n rows.set(mapKey, row);\n }\n row.buckets[bucket] += 1;\n row.total += 1;\n }\n }\n const sorted = [...rows.values()].sort((left, right) => {\n if (right.total !== left.total) {\n return right.total - left.total;\n }\n // All blank-key items collapse into a single row per dimension, so at most\n // one row has key === null; it sorts last on ties.\n if (left.key === null) {\n return 1;\n }\n if (right.key === null) {\n return -1;\n }\n return left.label.localeCompare(right.label);\n });\n return { dimension, rows: sorted, total_items: totalItems };\n}\n\n/** Lifecycle-bucket distribution across all items (for stats lifecycle section). */\nexport function computeLifecycleDistribution(\n items: readonly CoverageItem[],\n classifier: LifecycleClassifier,\n): Record<LifecycleBucket, number> {\n const buckets = emptyBuckets();\n for (const item of items) {\n buckets[classifier.classify(item.status)] += 1;\n }\n return buckets;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../../../cli/commands/update.ts"],
|
|
4
|
-
"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 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 normalizeParentReferenceValue,\n validateMissingParentReference,\n} from \"../../core/item/parent-reference-policy.js\";\nimport { validateSprintOrReleaseValue } from \"../../core/item/sprint-release-format.js\";\nimport {\n applyTagRemovals,\n assertNoUnknownCsvKeys,\n createStdinTokenResolver,\n looksLikeGenericKeyValueEntry,\n mergeAdditiveTags,\n parseCsvKv,\n parseOptionalNumber,\n parseTags,\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 { buildItemNotFoundError, locateItem, mutateItem, readLocatedItem } 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 assertNoLegacyNoneToken,\n assertNoLegacyNoneTokens,\n isLegacyNoneToken,\n type LegacyNoneCollectionNormalizer,\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 type {\n Comment,\n Dependency,\n GovernanceWorkflowEnforcement,\n ItemFormat,\n ItemFrontMatter,\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 { parseDocs, parseFiles, parseLogSeed, parseTests } 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 resolveRuntimeUnsetFieldDefinition,\n type CommandUnsetFieldDefinition,\n} from \"./shared-unset-fields.js\";\n\n/**\n * Documents the update command options payload exchanged by command, SDK, and package integrations.\n */\nexport interface UpdateCommandOptions {\n title?: string;\n description?: string;\n body?: string;\n status?: string;\n closeReason?: string;\n priority?: string;\n type?: string;\n tags?: string;\n addTags?: string[];\n removeTags?: string[];\n deadline?: string;\n estimatedMinutes?: string;\n acceptanceCriteria?: string;\n definitionOfReady?: string;\n order?: string;\n rank?: string;\n goal?: string;\n objective?: string;\n value?: string;\n impact?: string;\n outcome?: string;\n whyNow?: string;\n author?: string;\n message?: string;\n force?: boolean;\n allowAuditUpdate?: boolean;\n allowAuditDepUpdate?: boolean;\n assignee?: string;\n parent?: string;\n reviewer?: string;\n risk?: string;\n confidence?: string;\n sprint?: string;\n release?: string;\n blockedBy?: string;\n blockedReason?: string;\n unblockNote?: string;\n reporter?: string;\n severity?: string;\n environment?: string;\n reproSteps?: string;\n resolution?: string;\n expectedResult?: string;\n actualResult?: string;\n affectedVersion?: string;\n fixedVersion?: string;\n component?: string;\n regression?: string;\n customerImpact?: string;\n dep?: string[];\n depRemove?: string[];\n replaceDeps?: boolean;\n replaceTests?: boolean;\n runtimeFieldCommands?: Array<\"update\" | \"update_many\">;\n comment?: string[];\n note?: string[];\n learning?: string[];\n file?: string[];\n test?: string[];\n doc?: string[];\n reminder?: string[];\n event?: string[];\n typeOption?: string[];\n field?: string[];\n unset?: string[];\n clearDeps?: boolean;\n clearComments?: boolean;\n clearNotes?: boolean;\n clearLearnings?: boolean;\n clearFiles?: boolean;\n clearTests?: boolean;\n clearDocs?: boolean;\n clearReminders?: boolean;\n clearEvents?: boolean;\n clearTypeOptions?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Documents the update result payload exchanged by command, SDK, and package integrations.\n */\nexport interface UpdateResult {\n item: Record<string, unknown>;\n changed_fields: string[];\n warnings: string[];\n audit_update?: boolean;\n}\n\ninterface UpdateUnsetFieldDefinition {\n optionKey: string;\n frontMatterKey: string;\n}\n\nconst UPDATE_UNSET_FIELD_DEFINITIONS: readonly CommandUnsetFieldDefinition[] = [\n ...COMMON_UNSET_FIELD_DEFINITIONS_BEFORE_CLOSE_REASON,\n { canonical: \"close-reason\", aliases: [\"close_reason\", \"close-reason\"], optionKey: \"closeReason\", frontMatterKey: \"close_reason\" },\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 frontMatterKey: definition.frontMatterKey,\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) => [definition.optionKey, definition.canonical]),\n);\n\nconst UPDATE_UNSET_SUPPORTED_CANONICAL_FIELDS = UPDATE_UNSET_FIELD_DEFINITIONS.map((definition) => definition.canonical)\n .sort((left, right) => left.localeCompare(right))\n .join(\", \");\n\nconst AUDIT_UPDATE_DISALLOWED_UNSET_FRONT_MATTER_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(candidate: string | undefined, defaultAuthor: string): 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: ReadonlyArray<LegacyNoneCollectionNormalizer<UpdateCommandOptions>> = [\n { optionKey: \"dep\", clearFlagKey: \"clearDeps\", valueFlag: \"--dep\", clearFlag: \"--clear-deps\", disableFlagKey: \"replaceDeps\" },\n { optionKey: \"comment\", clearFlagKey: \"clearComments\", valueFlag: \"--comment\", clearFlag: \"--clear-comments\" },\n { optionKey: \"note\", clearFlagKey: \"clearNotes\", valueFlag: \"--note\", clearFlag: \"--clear-notes\" },\n { optionKey: \"learning\", clearFlagKey: \"clearLearnings\", valueFlag: \"--learning\", clearFlag: \"--clear-learnings\" },\n { optionKey: \"file\", clearFlagKey: \"clearFiles\", valueFlag: \"--file\", clearFlag: \"--clear-files\" },\n { optionKey: \"test\", clearFlagKey: \"clearTests\", valueFlag: \"--test\", clearFlag: \"--clear-tests\", disableFlagKey: \"replaceTests\" },\n { optionKey: \"doc\", clearFlagKey: \"clearDocs\", valueFlag: \"--doc\", clearFlag: \"--clear-docs\" },\n { optionKey: \"reminder\", clearFlagKey: \"clearReminders\", valueFlag: \"--reminder\", clearFlag: \"--clear-reminders\" },\n { optionKey: \"event\", clearFlagKey: \"clearEvents\", valueFlag: \"--event\", clearFlag: \"--clear-events\" },\n { optionKey: \"typeOption\", clearFlagKey: \"clearTypeOptions\", valueFlag: \"--type-option\", clearFlag: \"--clear-type-options\" },\n];\n\nfunction normalizeLegacyNoneUpdateOptions(options: UpdateCommandOptions): 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>([...UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.keys(), \"rank\"]);\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 = optionKey === \"rank\" ? \"order\" : (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(normalized, UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS);\n}\n\nfunction parseUpdateUnsetTargets(\n raw: string[] | undefined,\n runtimeFieldRegistry?: RuntimeFieldRegistry,\n extensionFieldNames: readonly string[] = [],\n): { frontMatterKeys: Set<string>; optionKeys: Set<string> } {\n const frontMatterKeys = new Set<string>();\n const optionKeys = new Set<string>();\n if (!raw || raw.length === 0) {\n return { frontMatterKeys, optionKeys };\n }\n\n for (const entry of raw) {\n const trimmed = entry.trim().toLowerCase();\n if (!trimmed) {\n throw new PmCliError(\"--unset values must not be empty\", EXIT_CODE.USAGE);\n }\n if (isLegacyNoneToken(trimmed)) {\n throw new PmCliError(\n '--unset no longer accepts \"none\" or \"null\". Specify concrete field names such as --unset deadline',\n EXIT_CODE.USAGE,\n );\n }\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 = UPDATE_UNSET_ALIAS_MAP.get(trimmed) ??\n resolveRuntimeUnsetFieldDefinition(trimmed, \"update\", runtimeFieldRegistry) ??\n (extensionFieldName ? { optionKey: \"field\", frontMatterKey: extensionFieldName } : undefined);\n if (!definition) {\n throw new PmCliError(\n `Unsupported --unset field \"${entry}\". Supported fields: ${UPDATE_UNSET_SUPPORTED_CANONICAL_FIELDS}`,\n EXIT_CODE.USAGE,\n );\n }\n frontMatterKeys.add(definition.frontMatterKey);\n optionKeys.add(definition.optionKey);\n }\n\n return { frontMatterKeys, optionKeys };\n}\n\n// Restricted append-style flags have dedicated commands with their own\n// audit/override semantics; map each one to its exact replacement invocation so\n// audit-scope errors tell the agent how to retry instead of dead-ending. The\n// evidence append flags are allowed by --allow-audit-update, but still used by\n// narrower scopes such as --allow-audit-dep-update.\nconst AUDIT_RESTRICTED_FLAG_REPLACEMENTS: ReadonlyMap<string, (id: string) => string> = new Map([\n [\"--comment\", (id: string) => `pm comments ${id} --add \"<text>\" --allow-audit-comment`],\n [\"--file\", (id: string) => `pm files ${id} --add \"path=<path>,scope=<scope>,note=<note>\" --force`],\n [\"--doc\", (id: string) => `pm docs ${id} --add \"path=<path>,scope=<scope>,note=<note>\" --force`],\n]);\n\nfunction buildAuditScopeRestrictedOptionsError(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\n .flatMap((flag) => {\n const replacement = AUDIT_RESTRICTED_FLAG_REPLACEMENTS.get(flag);\n return replacement ? [replacement(params.id)] : [];\n });\n const replacementSteps = params.disallowedFlags\n .flatMap((flag) => {\n const replacement = AUDIT_RESTRICTED_FLAG_REPLACEMENTS.get(flag);\n return replacement ? [`Replace ${flag} with: ${replacement(params.id)}`] : [];\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 ? { examples: replacementCommands } : {}),\n nextSteps: [\n `Re-run without: ${params.disallowedFlags.join(\", \")}`,\n ...replacementSteps,\n ],\n });\n}\n\nfunction enforceAllowAuditUpdateScope(id: string, options: UpdateCommandOptions, clearFrontMatterKeys: Set<string>): void {\n const allowAuditUpdate = options.allowAuditUpdate === true;\n const allowAuditDepUpdate = options.allowAuditDepUpdate === true;\n if (!allowAuditUpdate && !allowAuditDepUpdate) {\n return;\n }\n if (allowAuditUpdate && allowAuditDepUpdate) {\n throw new PmCliError(\n \"Choose either --allow-audit-update or --allow-audit-dep-update; these override modes are mutually exclusive.\",\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 (allowAuditDepUpdate) {\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(options.closeReason !== undefined, \"--close-reason\", disallowedFlags);\n pushIf(options.priority !== undefined, \"--priority\", disallowedFlags);\n pushIf(options.type !== undefined, \"--type\", disallowedFlags);\n pushIf(options.tags !== undefined, \"--tags\", disallowedFlags);\n pushIf(Array.isArray(options.addTags) && options.addTags.length > 0, \"--add-tags\", disallowedFlags);\n pushIf(Array.isArray(options.removeTags) && options.removeTags.length > 0, \"--remove-tags\", disallowedFlags);\n pushIf(options.deadline !== undefined, \"--deadline\", disallowedFlags);\n pushIf(options.estimatedMinutes !== undefined, \"--estimate\", disallowedFlags);\n pushIf(options.acceptanceCriteria !== undefined, \"--acceptance-criteria\", disallowedFlags);\n pushIf(options.definitionOfReady !== undefined, \"--definition-of-ready\", disallowedFlags);\n pushIf(options.order !== undefined || options.rank !== undefined, \"--order/--rank\", disallowedFlags);\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(options.blockedReason !== undefined, \"--blocked-reason\", disallowedFlags);\n pushIf(options.unblockNote !== undefined, \"--unblock-note\", disallowedFlags);\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(options.expectedResult !== undefined, \"--expected-result\", disallowedFlags);\n pushIf(options.actualResult !== undefined, \"--actual-result\", disallowedFlags);\n pushIf(options.affectedVersion !== undefined, \"--affected-version\", disallowedFlags);\n pushIf(options.fixedVersion !== undefined, \"--fixed-version\", disallowedFlags);\n pushIf(options.component !== undefined, \"--component\", disallowedFlags);\n pushIf(options.regression !== undefined, \"--regression\", disallowedFlags);\n pushIf(options.customerImpact !== undefined, \"--customer-impact\", 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.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(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 pushIf(options.clearTypeOptions === true, \"--clear-type-options\", disallowedFlags);\n pushIf(options.force === true, \"--force\", disallowedFlags);\n pushIf(clearFrontMatterKeys.size > 0, \"--unset\", disallowedFlags);\n if (options.dep === undefined || options.dep.length === 0) {\n throw new PmCliError(\"--allow-audit-dep-update requires at least one --dep value\", EXIT_CODE.USAGE);\n }\n if (disallowedFlags.length > 0) {\n throw buildAuditScopeRestrictedOptionsError({\n id,\n code: \"audit_dep_update_restricted_options\",\n message: `--allow-audit-dep-update supports append-only dependency additions via --dep. Remove restricted options: ${disallowedFlags.join(\", \")}`,\n required: \"Pass only --dep additions (plus --message/--author) when using --allow-audit-dep-update.\",\n why: \"--allow-audit-dep-update 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(options.blockedReason !== undefined, \"--blocked-reason\", disallowedFlags);\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 -- audit unset ordering fallback is validated by audit-governance integration coverage. */\n const disallowedUnset = [...clearFrontMatterKeys]\n .filter((field) => AUDIT_UPDATE_DISALLOWED_UNSET_FRONT_MATTER_KEYS.has(field))\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 buildAuditScopeRestrictedOptionsError({\n id,\n code: \"audit_update_restricted_options\",\n message: `--allow-audit-update only supports non-lifecycle metadata fields and evidence appends. Remove restricted options: ${disallowedFlags.join(\", \")}`,\n required: \"Limit --allow-audit-update to non-lifecycle metadata fields plus append-only --comment/--file/--doc evidence; route restricted appends and lifecycle changes through their dedicated commands.\",\n why: \"--allow-audit-update is a non-owner override scoped to metadata audits 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(value: string, statusRegistry: RuntimeStatusRegistry): ItemStatus {\n const normalized = normalizeStatusInput(value, statusRegistry);\n if (!normalized) {\n const allowedStatuses = statusRegistry.definitions.map((definition) => definition.id);\n throw new PmCliError(`Invalid --status value \"${value}\". Allowed: ${allowedStatuses.join(\", \")}`, EXIT_CODE.USAGE);\n }\n return normalized;\n}\n\n/**\n * Enforce per-type allowed-transition rules (governance.workflow_enforcement).\n * `off` (default) or an unrestricted type is a no-op. `strict` throws on a\n * disallowed transition; `warn` returns a warning string surfaced on the\n * update result. The target status is the raw `--status` value (resolved\n * case-insensitively through the registry inside evaluateTransition).\n */\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 = normalizeStatusInput(params.fromStatus, params.statusRegistry) ?? params.fromStatus;\n const normalizedTo = normalizeStatusInput(params.toStatus, params.statusRegistry) ?? 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(value: string | undefined, currentIso: string): 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(`Invalid dependency created_at timestamp \"${value}\"`, EXIT_CODE.USAGE);\n }\n return new Date(parsed).toISOString();\n}\n\nfunction parseOptionalDependencyString(value: string | undefined): 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 = [\"id\", \"kind\", \"type\", \"author\", \"created_at\", \"source_kind\"] 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 (/^(?:[-*+]\\s+)?(?:id|kind|type|author|created_at|source_kind)\\s*[:=]/i.test(raw)) {\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(raw: string | undefined): 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(raw: string[] | undefined, prefix: string, nowIso: string): ParsedDependencyUpdates {\n if (!raw) {\n return { additions: [] };\n }\n assertNoLegacyNoneTokens(raw, \"--dep\", \"Use --clear-deps to clear dependencies.\");\n const additions: Dependency[] = raw.map((entry) => {\n const trimmedEntry = entry.trim();\n const isStructured = looksLikeStructuredDependencyEntry(trimmedEntry);\n const kv = isStructured ? parseCsvKv(entry, \"--dep\") : { 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(\"--dep requires id and kind, or a bare item id to add a related dependency\", EXIT_CODE.USAGE);\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(raw: string[] | undefined, prefix: string): 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(\"--dep-remove requires id or key/value selectors\", EXIT_CODE.USAGE);\n }\n if (trimmed.includes(\"=\") || /^(?:[-*+]\\s+)?(?:id|kind|type|source_kind)\\s*[:=]/i.test(trimmed) || trimmed.startsWith(\"```\")) {\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(\"--dep-remove key/value form requires id=<value>\", EXIT_CODE.USAGE);\n }\n if (idRaw.toLowerCase() === \"undefined\") {\n throw new PmCliError(`--dep-remove id must not use placeholder token \"${idRaw}\"`, EXIT_CODE.USAGE);\n }\n const kindRaw = normalizeDependencyKindInput(parseOptionalDependencyString(kv.kind ?? kv.type));\n const sourceKind = parseOptionalDependencyString(kv.source_kind);\n return {\n id: normalizeItemId(idRaw, prefix),\n kind: kindRaw ? ensureEnum(kindRaw, DEPENDENCY_KIND_VALUES, \"dependency kind\") : undefined,\n source_kind: sourceKind,\n };\n }\n if (trimmed.toLowerCase() === \"undefined\") {\n throw new PmCliError(`--dep-remove id must not use placeholder token \"${trimmed}\"`, EXIT_CODE.USAGE);\n }\n return {\n id: normalizeItemId(trimmed, prefix),\n };\n });\n}\n\nfunction dependencyKey(value: Pick<Dependency, \"id\" | \"kind\" | \"source_kind\">): 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, clearing the\n// scalar removes that edge, and re-pointing it replaces the prior edge.\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 const filtered = next.filter((dep) => dep.kind !== \"blocked_by\" || dep.id === nextBlockedById);\n if (filtered.length !== next.length) {\n next = filtered;\n changed = true;\n }\n if (nextBlockedById && !next.some((dep) => dep.kind === \"blocked_by\" && dep.id === nextBlockedById)) {\n next.push({ id: nextBlockedById, kind: \"blocked_by\", created_at: nowIsoValue, author });\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(pmRoot, normalizeItemId(blockedByValue, idPrefix), idPrefix, itemFormat, typeToFolder);\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: ItemFrontMatter,\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(value: Pick<LinkedTest, \"command\" | \"path\" | \"scope\" | \"pm_context_mode\">): string {\n return `${value.command}::${value.path ?? \"\"}::${value.scope}::${value.pm_context_mode ?? \"\"}`;\n}\n\nfunction matchesDependencySelector(value: Dependency, selector: DependencyRemovalSelector): 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 (selector.source_kind !== undefined && (value.source_kind ?? undefined) !== selector.source_kind) {\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(options: UpdateCommandOptions, extensionFieldNames: readonly string[]): 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 mark(\"acceptanceCriteria\", options.acceptanceCriteria !== undefined);\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(\"allowAuditUpdate\", options.allowAuditUpdate === 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(options.unset, undefined, extensionFieldNames);\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 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(typeDefinition, \"update\", []);\n if (policyState.errors.length > 0) {\n throw new PmCliError(policyState.errors.join(\"; \"), EXIT_CODE.CONFLICT);\n }\n\n const provided = collectProvidedUpdatePolicyOptions(options, extensionFieldNames);\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 clearFrontMatterKeys: 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\nconst UPDATE_POST_TAG_SCALAR_MUTATIONS: ReadonlyArray<UpdateScalarMutationDefinition> = [\n {\n optionKey: \"deadline\",\n metadataKey: \"deadline\",\n transform: (value, context) => resolveIsoOrRelative(value, context.nowValue, \"deadline\"),\n },\n {\n optionKey: \"estimatedMinutes\",\n metadataKey: \"estimated_minutes\",\n transform: (value) => parseOptionalNumber(value, \"estimated-minutes\"),\n },\n { optionKey: \"acceptanceCriteria\", metadataKey: \"acceptance_criteria\", transform: (value) => value },\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 { optionKey: \"reviewer\", metadataKey: \"reviewer\" },\n { optionKey: \"risk\", metadataKey: \"risk\", transform: (value) => ensureEnum(normalizeRiskInput(value), RISK_VALUES, \"risk\") },\n { optionKey: \"confidence\", metadataKey: \"confidence\", transform: (value) => parseConfidenceInput(value) },\n];\n\nconst UPDATE_ISSUE_SCALAR_MUTATIONS: ReadonlyArray<UpdateScalarMutationDefinition> = [\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) => ensureEnum(normalizeSeverityInput(value), ISSUE_SEVERITY_VALUES, \"severity\"),\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 { optionKey: \"regression\", metadataKey: \"regression\", transform: (value) => parseRegressionInput(value) },\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.clearFrontMatterKeys.has(definition.metadataKey);\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\n/**\n * Implements run update for the public runtime surface of this module.\n */\nexport async function runUpdate(id: string, options: UpdateCommandOptions, global: GlobalOptions): Promise<UpdateResult> {\n const stdinResolver = createStdinTokenResolver();\n options = normalizeLegacyNoneUpdateOptions({\n ...options,\n body: await stdinResolver.resolveValue(options.body, \"--body\"),\n dep: await stdinResolver.resolveList(options.dep, \"--dep\"),\n depRemove: await stdinResolver.resolveList(options.depRemove, \"--dep-remove\"),\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(options.typeOption, \"--type-option\"),\n field: await stdinResolver.resolveList(options.field, \"--field\"),\n });\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\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(extensionRegistrations);\n const typeRegistry = resolveItemTypeRegistry(settings, extensionRegistrations);\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 = settings.governance.workflow_enforcement ?? \"off\";\n const typeWorkflows = workflowEnforcement === \"off\" ? [] : resolveTypeWorkflows(settings.schema);\n const parentReferencePolicy = settings.validation.parent_reference;\n const sprintReleasePolicy = settings.validation.sprint_release_format;\n const unsetTargets = parseUpdateUnsetTargets(options.unset, runtimeFieldRegistry, extensionFieldNames);\n const clearOptionKeys = new Set<string>(unsetTargets.optionKeys);\n const clearFrontMatterKeys = new Set<string>(unsetTargets.frontMatterKeys);\n\n const clearCollectionDefinitions: ReadonlyArray<{\n enabled: boolean | undefined;\n optionKey: string;\n clearFlag: string;\n valueFlag: string;\n values: string[] | undefined;\n frontMatterKey: string;\n }> = [\n {\n enabled: options.clearDeps || options.replaceDeps,\n optionKey: \"dep\",\n clearFlag: \"--clear-deps\",\n valueFlag: \"--dep\",\n values: options.dep,\n frontMatterKey: \"dependencies\",\n },\n {\n enabled: options.clearComments,\n optionKey: \"comment\",\n clearFlag: \"--clear-comments\",\n valueFlag: \"--comment\",\n values: options.comment,\n frontMatterKey: \"comments\",\n },\n {\n enabled: options.clearNotes,\n optionKey: \"note\",\n clearFlag: \"--clear-notes\",\n valueFlag: \"--note\",\n values: options.note,\n frontMatterKey: \"notes\",\n },\n {\n enabled: options.clearLearnings,\n optionKey: \"learning\",\n clearFlag: \"--clear-learnings\",\n valueFlag: \"--learning\",\n values: options.learning,\n frontMatterKey: \"learnings\",\n },\n {\n enabled: options.clearFiles,\n optionKey: \"file\",\n clearFlag: \"--clear-files\",\n valueFlag: \"--file\",\n values: options.file,\n frontMatterKey: \"files\",\n },\n {\n enabled: options.clearTests || options.replaceTests,\n optionKey: \"test\",\n clearFlag: \"--clear-tests\",\n valueFlag: \"--test\",\n values: options.test,\n frontMatterKey: \"tests\",\n },\n {\n enabled: options.clearDocs,\n optionKey: \"doc\",\n clearFlag: \"--clear-docs\",\n valueFlag: \"--doc\",\n values: options.doc,\n frontMatterKey: \"docs\",\n },\n {\n enabled: options.clearReminders,\n optionKey: \"reminder\",\n clearFlag: \"--clear-reminders\",\n valueFlag: \"--reminder\",\n values: options.reminder,\n frontMatterKey: \"reminders\",\n },\n {\n enabled: options.clearEvents,\n optionKey: \"event\",\n clearFlag: \"--clear-events\",\n valueFlag: \"--event\",\n values: options.event,\n frontMatterKey: \"events\",\n },\n {\n enabled: options.clearTypeOptions,\n optionKey: \"typeOption\",\n clearFlag: \"--clear-type-options\",\n valueFlag: \"--type-option\",\n values: options.typeOption,\n frontMatterKey: \"type_options\",\n },\n ];\n if (options.replaceDeps === true && (options.dep === undefined || options.dep.length === 0)) {\n throw new PmCliError(\"--replace-deps requires at least one --dep entry\", EXIT_CODE.USAGE);\n }\n if (options.replaceDeps === true && options.depRemove !== undefined && options.depRemove.length > 0) {\n throw new PmCliError(\"--replace-deps cannot be combined with --dep-remove\", EXIT_CODE.USAGE);\n }\n if (options.replaceTests === true && (options.test === undefined || options.test.length === 0)) {\n throw new PmCliError(\"--replace-tests requires at least one --test entry\", EXIT_CODE.USAGE);\n }\n if (options.replaceTests === true && options.clearTests === true) {\n throw new PmCliError(\"--replace-tests cannot be combined with --clear-tests\", EXIT_CODE.USAGE);\n }\n for (const definition of clearCollectionDefinitions) {\n if (!definition.enabled) {\n continue;\n }\n if (\n definition.values &&\n definition.values.length > 0 &&\n !(\n (definition.optionKey === \"dep\" && options.replaceDeps === true) ||\n (definition.optionKey === \"test\" && options.replaceTests === true)\n )\n ) {\n throw new PmCliError(`Cannot combine ${definition.clearFlag} with ${definition.valueFlag}`, EXIT_CODE.USAGE);\n }\n clearOptionKeys.add(definition.optionKey);\n clearFrontMatterKeys.add(definition.frontMatterKey);\n }\n enforceAllowAuditUpdateScope(id, options, clearFrontMatterKeys);\n\n const scalarOptionPresence: Record<string, boolean> = {\n tags: options.tags !== undefined,\n closeReason: options.closeReason !== undefined,\n deadline: options.deadline !== undefined,\n estimatedMinutes: options.estimatedMinutes !== undefined,\n acceptanceCriteria: options.acceptanceCriteria !== undefined,\n definitionOfReady: options.definitionOfReady !== undefined,\n order: options.order !== undefined || options.rank !== undefined,\n goal: options.goal !== undefined,\n objective: options.objective !== undefined,\n value: options.value !== undefined,\n impact: options.impact !== undefined,\n outcome: options.outcome !== undefined,\n whyNow: options.whyNow !== undefined,\n assignee: options.assignee !== undefined,\n parent: options.parent !== undefined,\n reviewer: options.reviewer !== undefined,\n risk: options.risk !== undefined,\n confidence: options.confidence !== undefined,\n sprint: options.sprint !== undefined,\n release: options.release !== undefined,\n blockedBy: options.blockedBy !== undefined,\n blockedReason: options.blockedReason !== undefined,\n unblockNote: options.unblockNote !== undefined,\n reporter: options.reporter !== undefined,\n severity: options.severity !== undefined,\n environment: options.environment !== undefined,\n reproSteps: options.reproSteps !== undefined,\n resolution: options.resolution !== undefined,\n expectedResult: options.expectedResult !== undefined,\n actualResult: options.actualResult !== undefined,\n affectedVersion: options.affectedVersion !== undefined,\n fixedVersion: options.fixedVersion !== undefined,\n component: options.component !== undefined,\n regression: options.regression !== undefined,\n customerImpact: options.customerImpact !== undefined,\n };\n for (const [optionKey, hasValue] of Object.entries(scalarOptionPresence)) {\n if (!hasValue || !unsetTargets.optionKeys.has(optionKey)) {\n continue;\n }\n const unsetField = 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 // `--add-tags`/`--remove-tags` aren't in the scalar presence map above (they\n // are repeatable), but combining them with `--unset tags` is the same\n // contradiction as `--unset tags --tags ...`, so reject it explicitly.\n if (clearFrontMatterKeys.has(\"tags\")) {\n if (Array.isArray(options.addTags) && options.addTags.length > 0) {\n throw new PmCliError(\"Cannot combine --unset tags with --add-tags\", EXIT_CODE.USAGE);\n }\n if (Array.isArray(options.removeTags) && options.removeTags.length > 0) {\n throw new PmCliError(\"Cannot combine --unset tags with --remove-tags\", EXIT_CODE.USAGE);\n }\n }\n\n const assertNoLegacyScalarToken = (value: string | undefined, optionKey: string): void => {\n const unsetField = UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey);\n const hint = unsetField ? `Use --unset ${unsetField} to clear this field.` : undefined;\n assertNoLegacyNoneToken(value, commandOptionFlagLabel(\"update\", optionKey), hint);\n };\n assertNoLegacyScalarToken(options.tags, \"tags\");\n assertNoLegacyScalarToken(options.closeReason, \"closeReason\");\n assertNoLegacyScalarToken(options.deadline, \"deadline\");\n assertNoLegacyScalarToken(options.estimatedMinutes, \"estimatedMinutes\");\n assertNoLegacyScalarToken(options.acceptanceCriteria, \"acceptanceCriteria\");\n assertNoLegacyScalarToken(options.definitionOfReady, \"definitionOfReady\");\n assertNoLegacyScalarToken(options.order ?? options.rank, \"order\");\n assertNoLegacyScalarToken(options.goal, \"goal\");\n assertNoLegacyScalarToken(options.objective, \"objective\");\n assertNoLegacyScalarToken(options.value, \"value\");\n assertNoLegacyScalarToken(options.impact, \"impact\");\n assertNoLegacyScalarToken(options.outcome, \"outcome\");\n assertNoLegacyScalarToken(options.whyNow, \"whyNow\");\n assertNoLegacyScalarToken(options.assignee, \"assignee\");\n assertNoLegacyScalarToken(options.parent, \"parent\");\n assertNoLegacyScalarToken(options.reviewer, \"reviewer\");\n assertNoLegacyScalarToken(options.risk, \"risk\");\n assertNoLegacyScalarToken(options.confidence, \"confidence\");\n assertNoLegacyScalarToken(options.sprint, \"sprint\");\n assertNoLegacyScalarToken(options.release, \"release\");\n assertNoLegacyScalarToken(options.blockedBy, \"blockedBy\");\n assertNoLegacyScalarToken(options.blockedReason, \"blockedReason\");\n assertNoLegacyScalarToken(options.unblockNote, \"unblockNote\");\n assertNoLegacyScalarToken(options.reporter, \"reporter\");\n assertNoLegacyScalarToken(options.severity, \"severity\");\n assertNoLegacyScalarToken(options.environment, \"environment\");\n assertNoLegacyScalarToken(options.reproSteps, \"reproSteps\");\n assertNoLegacyScalarToken(options.resolution, \"resolution\");\n assertNoLegacyScalarToken(options.expectedResult, \"expectedResult\");\n assertNoLegacyScalarToken(options.actualResult, \"actualResult\");\n assertNoLegacyScalarToken(options.affectedVersion, \"affectedVersion\");\n assertNoLegacyScalarToken(options.fixedVersion, \"fixedVersion\");\n assertNoLegacyScalarToken(options.component, \"component\");\n assertNoLegacyScalarToken(options.regression, \"regression\");\n assertNoLegacyScalarToken(options.customerImpact, \"customerImpact\");\n assertNoLegacyNoneTokens(options.reminder, \"--reminder\", \"Use --clear-reminders to clear reminders.\");\n assertNoLegacyNoneTokens(options.event, \"--event\", \"Use --clear-events to clear linked events.\");\n\n const author = toAuthor(options.author, settings.author_default);\n const nowValue = new Date();\n const nowIso = nowValue.toISOString();\n const dependencyUpdates = parseDependencyAdditions(options.dep, settings.id_prefix, nowIso);\n const dependencyRemovals = parseDependencyRemovals(options.depRemove, settings.id_prefix);\n const parsedCommentUpdates = parseLogSeed(\"--comment\", options.comment, nowIso, author);\n const commentUpdates = options.allowAuditUpdate === true && parsedCommentUpdates.values\n ? {\n ...parsedCommentUpdates,\n values: parsedCommentUpdates.values.map((entry) => ({ ...entry, author })),\n }\n : parsedCommentUpdates;\n const noteUpdates = parseLogSeed(\"--note\", options.note, nowIso, author);\n const learningUpdates = parseLogSeed(\"--learning\", options.learning, nowIso, author);\n const fileUpdates = parseFiles(options.file);\n const testUpdates = parseTests(options.test);\n const docUpdates = parseDocs(options.doc);\n const parentReferenceWarnings: string[] = [];\n const workflowTransitionWarnings: string[] = [];\n let resolvedParentValue: string | undefined;\n if (options.parent !== undefined && !unsetTargets.frontMatterKeys.has(\"parent\")) {\n resolvedParentValue = normalizeParentReferenceValue(options.parent);\n const parentLocated = await locateItem(\n pmRoot,\n resolvedParentValue,\n settings.id_prefix,\n settings.item_format,\n typeRegistry.type_to_folder,\n );\n if (!parentLocated) {\n const normalizedParentId = normalizeItemId(resolvedParentValue, settings.id_prefix);\n parentReferenceWarnings.push(...validateMissingParentReference(normalizedParentId, parentReferencePolicy).warnings);\n }\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 clearFrontMatterKeys.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 if (blockedByResolution.unresolved !== undefined) {\n parentReferenceWarnings.push(`blocked_by_unresolved:${blockedByResolution.unresolved}`);\n }\n\n const runtimeFieldUpdates = collectRuntimeUpdateFieldValues(\n options as Record<string, unknown>,\n runtimeFieldRegistry,\n options.runtimeFieldCommands,\n );\n const fieldFlags: Record<string, boolean> = {\n title: options.title !== undefined,\n description: options.description !== undefined,\n body: options.body !== undefined,\n status: options.status !== undefined,\n closeReason: options.closeReason !== undefined,\n priority: options.priority !== undefined,\n type: options.type !== undefined,\n tags: options.tags !== undefined,\n addTags: Array.isArray(options.addTags) && options.addTags.length > 0,\n removeTags: Array.isArray(options.removeTags) && options.removeTags.length > 0,\n deadline: options.deadline !== undefined,\n estimatedMinutes: options.estimatedMinutes !== undefined,\n acceptanceCriteria: options.acceptanceCriteria !== undefined,\n definitionOfReady: options.definitionOfReady !== undefined,\n order: options.order !== undefined,\n rank: options.rank !== undefined,\n goal: options.goal !== undefined,\n objective: options.objective !== undefined,\n value: options.value !== undefined,\n impact: options.impact !== undefined,\n outcome: options.outcome !== undefined,\n whyNow: options.whyNow !== undefined,\n assignee: options.assignee !== undefined,\n parent: options.parent !== undefined,\n reviewer: options.reviewer !== undefined,\n risk: options.risk !== undefined,\n confidence: options.confidence !== undefined,\n sprint: options.sprint !== undefined,\n release: options.release !== undefined,\n blockedBy: options.blockedBy !== undefined,\n blockedReason: options.blockedReason !== undefined,\n unblockNote: options.unblockNote !== undefined,\n reporter: options.reporter !== undefined,\n severity: options.severity !== undefined,\n environment: options.environment !== undefined,\n reproSteps: options.reproSteps !== undefined,\n resolution: options.resolution !== undefined,\n expectedResult: options.expectedResult !== undefined,\n actualResult: options.actualResult !== undefined,\n affectedVersion: options.affectedVersion !== undefined,\n fixedVersion: options.fixedVersion !== undefined,\n component: options.component !== undefined,\n regression: options.regression !== undefined,\n customerImpact: options.customerImpact !== undefined,\n dep: options.dep !== undefined,\n depRemove: options.depRemove !== undefined,\n replaceDeps: options.replaceDeps === true,\n comment: options.comment !== undefined,\n note: options.note !== undefined,\n learning: options.learning !== undefined,\n file: options.file !== undefined,\n test: options.test !== undefined,\n replaceTests: options.replaceTests === true,\n doc: options.doc !== undefined,\n reminder: options.reminder !== undefined,\n event: options.event !== undefined,\n typeOption: options.typeOption !== undefined,\n field: options.field !== undefined,\n unset: options.unset !== undefined && options.unset.length > 0,\n clearDeps: options.clearDeps === true,\n clearComments: options.clearComments === true,\n clearNotes: options.clearNotes === true,\n clearLearnings: options.clearLearnings === true,\n clearFiles: options.clearFiles === true,\n clearTests: options.clearTests === true,\n clearDocs: options.clearDocs === true,\n clearReminders: options.clearReminders === true,\n clearEvents: options.clearEvents === true,\n clearTypeOptions: options.clearTypeOptions === true,\n runtimeFields: Object.keys(runtimeFieldUpdates).length > 0,\n };\n const changedFlags = Object.values(fieldFlags).some(Boolean);\n\n if (!changedFlags) {\n const located = await locateItem(\n pmRoot,\n id,\n settings.id_prefix,\n settings.item_format,\n typeRegistry.type_to_folder,\n );\n if (!located) {\n throw await buildItemNotFoundError(pmRoot, id, settings.id_prefix, typeRegistry.type_to_folder);\n }\n const { document } = await readLocatedItem(located, { schema: settings.schema });\n return {\n item: toItemRecord(document.metadata),\n changed_fields: [],\n warnings: [\"noop_no_update_fields\"],\n };\n }\n\n // Per-type allowed-transition enforcement runs BEFORE the close-reroute so a\n // transition toward the close status is gated too. We read the item's current\n // status + type once (only when enforcement is active and --status is set) so\n // the default `off` path adds zero extra work. A `strict` violation throws; a\n // `warn` violation surfaces a warning on the result.\n if (workflowEnforcement !== \"off\" && typeWorkflows.length > 0 && fieldFlags.status && options.status !== undefined) {\n const located = await locateItem(\n pmRoot,\n id,\n settings.id_prefix,\n settings.item_format,\n typeRegistry.type_to_folder,\n );\n if (!located) {\n throw await buildItemNotFoundError(pmRoot, id, settings.id_prefix, typeRegistry.type_to_folder);\n }\n const { document } = await readLocatedItem(located, { schema: settings.schema });\n // When this update also changes --type, gate the transition against the\n // EFFECTIVE (post-update) type, so a combined --type/--status change can't\n // bypass a target-type rule (or be wrongly blocked by the pre-update type's\n // rule that will no longer apply). Falls back to the raw value when --type is\n // unresolved; the later type resolution surfaces an invalid-type error.\n const effectiveType =\n options.type !== undefined\n ? (resolveTypeName(options.type, typeRegistry) ?? options.type)\n : (document.metadata?.type ?? \"\");\n const warning = enforceTypeWorkflowTransition({\n enforcement: workflowEnforcement,\n typeWorkflows,\n statusRegistry,\n typeName: effectiveType,\n fromStatus: document.metadata?.status ?? \"\",\n toStatus: options.status ?? \"\",\n });\n if (warning) {\n workflowTransitionWarnings.push(warning);\n }\n }\n\n // `pm update --status <close_status>` always routes to the auditable close\n // workflow so agents are never blocked by close-through-update errors. Any\n // other field updates in the same call are applied first, then the item is\n // closed with the supplied --close-reason (or a derived default when omitted).\n if (fieldFlags.status) {\n const targetStatus = normalizeStatusInput(options.status as ItemStatus, statusRegistry);\n if (targetStatus === statusRegistry.close_status) {\n const otherFieldKeys = Object.entries(fieldFlags)\n .filter(([key, value]) => value && key !== \"status\" && key !== \"closeReason\")\n .map(([key]) => key);\n\n const routeWarnings: string[] = [];\n let preChangedFields: string[] = [];\n if (otherFieldKeys.length > 0) {\n const preUpdate = await runUpdate(\n id,\n { ...options, status: undefined, closeReason: undefined, message: undefined },\n global,\n );\n preChangedFields = preUpdate.changed_fields;\n routeWarnings.push(...preUpdate.warnings);\n }\n\n const explicitReason = typeof options.closeReason === \"string\" ? options.closeReason.trim() : \"\";\n const fallbackMessage = typeof options.message === \"string\" ? options.message.trim() : \"\";\n const closeReason = explicitReason || fallbackMessage || \"Closed via pm update\";\n // Only flag a defaulted reason when neither --close-reason nor --message\n // supplied any text and we had to invent the generic placeholder.\n const reasonDefaulted = explicitReason.length === 0 && fallbackMessage.length === 0;\n\n const closeResult = await runClose(\n id,\n closeReason,\n {\n author: options.author,\n message: options.message,\n force: options.force,\n },\n global,\n );\n\n const warnings = [\n ...workflowTransitionWarnings,\n ...routeWarnings,\n ...closeResult.warnings,\n \"auto_routed_from_update_to_close\",\n ];\n if (reasonDefaulted) {\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 }\n if (options.order !== undefined && options.rank !== undefined && options.order !== options.rank) {\n throw new PmCliError(\"--order and --rank must match when both are provided\", EXIT_CODE.USAGE);\n }\n\n const result = await mutateItem({\n pmRoot,\n settings,\n typeToFolder: typeRegistry.type_to_folder,\n id,\n op: options.allowAuditUpdate === true || options.allowAuditDepUpdate === true ? \"update_audit\" : \"update\",\n author,\n message: options.message,\n force: options.force,\n bypassAssigneeConflict: options.allowAuditUpdate === true || options.allowAuditDepUpdate === true,\n extensionFieldNames,\n mutate(document) {\n const changedFields: string[] = [];\n const warnings: string[] = [];\n let activeTypeName = resolveTypeName(document.metadata.type, typeRegistry) ?? document.metadata.type;\n\n // Declarative set-or-clear helpers for the many string scalar fields that\n // share an identical shape: set from `--flag` (optionally transformed) or\n // delete when `--unset <field>` was requested, then record the change.\n // Each call is placed in the same position the inline block occupied so\n // the order of `changedFields` is preserved exactly (pm-why9).\n const metadataRecord = toItemRecord(document.metadata);\n const scalarMutationContext: UpdateScalarMutationContext = {\n metadataRecord,\n clearFrontMatterKeys,\n changedFields,\n nowValue,\n };\n\n if (options.title !== undefined) {\n document.metadata.title = options.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 const previousStatus = document.metadata.status;\n const previousStatusNormalized = normalizeStatusInput(previousStatus, statusRegistry) ?? previousStatus;\n if (options.status !== undefined) {\n // Close-status routing (with reason + audit) is handled before mutateItem\n // by the close gate above, so only non-close transitions reach this path.\n const status = parseStatus(options.status, statusRegistry);\n document.metadata.status = status;\n if (status === statusRegistry.canceled_status) {\n delete document.metadata.assignee;\n }\n changedFields.push(\"status\");\n }\n if (options.closeReason !== undefined || clearFrontMatterKeys.has(\"close_reason\")) {\n if (clearFrontMatterKeys.has(\"close_reason\")) {\n delete document.metadata.close_reason;\n } else {\n const closeReason = options.closeReason?.trim() ?? \"\";\n if (closeReason.length === 0) {\n throw new PmCliError(\"--close-reason must not be empty\", EXIT_CODE.USAGE);\n }\n document.metadata.close_reason = closeReason;\n }\n changedFields.push(\"close_reason\");\n } else if (\n options.status !== undefined &&\n previousStatusNormalized === statusRegistry.close_status &&\n document.metadata.status !== statusRegistry.canceled_status &&\n document.metadata.close_reason !== undefined\n ) {\n delete document.metadata.close_reason;\n changedFields.push(\"close_reason\");\n }\n if (options.priority !== undefined) {\n document.metadata.priority = ensurePriority(options.priority);\n changedFields.push(\"priority\");\n }\n if (options.type !== undefined) {\n const resolvedTypeName = resolveTypeName(options.type, typeRegistry);\n if (!resolvedTypeName) {\n throw new PmCliError(\n buildInvalidTypeError(options.type, typeRegistry.types, resolveItemTypesFilePath(pmRoot, settings.schema)),\n EXIT_CODE.USAGE,\n );\n }\n document.metadata.type = resolvedTypeName;\n activeTypeName = resolvedTypeName;\n changedFields.push(\"type\");\n }\n enforceUpdateOptionsByType(activeTypeName, options, typeRegistry, extensionFieldNames);\n if (options.typeOption !== undefined || clearFrontMatterKeys.has(\"type_options\")) {\n if (clearFrontMatterKeys.has(\"type_options\")) {\n delete document.metadata.type_options;\n } else {\n const parsedTypeOptions = parseTypeOptionEntries(options.typeOption ?? []);\n const validation = validateTypeOptions(activeTypeName, parsedTypeOptions, typeRegistry);\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 } else if (options.type !== undefined && document.metadata.type_options !== undefined) {\n const validation = validateTypeOptions(activeTypeName, document.metadata.type_options, typeRegistry);\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 if (options.dep !== undefined || options.depRemove !== undefined || clearFrontMatterKeys.has(\"dependencies\")) {\n let nextDependencies = clearFrontMatterKeys.has(\"dependencies\") ? [] : [...(document.metadata.dependencies ?? [])];\n if (dependencyUpdates.additions.length > 0) {\n const seen = new Set(nextDependencies.map((entry) => dependencyKey(entry)));\n for (const addition of dependencyUpdates.additions) {\n const key = dependencyKey(addition);\n if (seen.has(key)) {\n continue;\n }\n nextDependencies.push(addition);\n seen.add(key);\n }\n }\n if (dependencyRemovals.length > 0) {\n nextDependencies = nextDependencies.filter(\n (entry) => !dependencyRemovals.some((selector) => matchesDependencySelector(entry, selector)),\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 if (options.comment !== undefined || clearFrontMatterKeys.has(\"comments\")) {\n if (clearFrontMatterKeys.has(\"comments\") || !commentUpdates.values || commentUpdates.values.length === 0) {\n delete document.metadata.comments;\n } else {\n document.metadata.comments = [...(document.metadata.comments ?? []), ...(commentUpdates.values as Comment[])];\n }\n changedFields.push(\"comments\");\n }\n if (options.note !== undefined || clearFrontMatterKeys.has(\"notes\")) {\n if (clearFrontMatterKeys.has(\"notes\") || !noteUpdates.values || noteUpdates.values.length === 0) {\n delete document.metadata.notes;\n } else {\n document.metadata.notes = [...(document.metadata.notes ?? []), ...(noteUpdates.values as LogNote[])];\n }\n changedFields.push(\"notes\");\n }\n if (options.learning !== undefined || clearFrontMatterKeys.has(\"learnings\")) {\n if (clearFrontMatterKeys.has(\"learnings\") || !learningUpdates.values || learningUpdates.values.length === 0) {\n delete document.metadata.learnings;\n } else {\n document.metadata.learnings = [...(document.metadata.learnings ?? []), ...(learningUpdates.values as LogNote[])];\n }\n changedFields.push(\"learnings\");\n }\n if (options.file !== undefined || clearFrontMatterKeys.has(\"files\")) {\n if (clearFrontMatterKeys.has(\"files\") || !fileUpdates.values || fileUpdates.values.length === 0) {\n delete document.metadata.files;\n } else {\n const nextFiles = [...(document.metadata.files ?? [])];\n const seen = new Set(nextFiles.map((entry) => fileKey(entry)));\n for (const entry of fileUpdates.values) {\n const key = fileKey(entry);\n if (seen.has(key)) {\n continue;\n }\n nextFiles.push(entry);\n seen.add(key);\n }\n document.metadata.files = nextFiles;\n }\n changedFields.push(\"files\");\n }\n if (options.test !== undefined || clearFrontMatterKeys.has(\"tests\")) {\n if (clearFrontMatterKeys.has(\"tests\") && options.replaceTests === true) {\n if (!testUpdates.values || testUpdates.values.length === 0) {\n delete document.metadata.tests;\n } else {\n const replacementTests: LinkedTest[] = [];\n const seen = new Set<string>();\n for (const entry of testUpdates.values) {\n const key = testKey(entry);\n if (seen.has(key)) {\n continue;\n }\n replacementTests.push(entry);\n seen.add(key);\n }\n document.metadata.tests = replacementTests;\n }\n } else if (clearFrontMatterKeys.has(\"tests\") || !testUpdates.values || testUpdates.values.length === 0) {\n delete document.metadata.tests;\n } else {\n const nextTests = [...(document.metadata.tests ?? [])];\n const seen = new Set(nextTests.map((entry) => testKey(entry)));\n for (const entry of testUpdates.values) {\n const key = testKey(entry);\n if (seen.has(key)) {\n continue;\n }\n nextTests.push(entry);\n seen.add(key);\n }\n document.metadata.tests = nextTests;\n }\n changedFields.push(\"tests\");\n }\n if (options.doc !== undefined || clearFrontMatterKeys.has(\"docs\")) {\n if (clearFrontMatterKeys.has(\"docs\") || !docUpdates.values || docUpdates.values.length === 0) {\n delete document.metadata.docs;\n } else {\n const nextDocs = [...(document.metadata.docs ?? [])];\n const seen = new Set(nextDocs.map((entry) => docKey(entry)));\n for (const entry of docUpdates.values) {\n const key = docKey(entry);\n if (seen.has(key)) {\n continue;\n }\n nextDocs.push(entry);\n seen.add(key);\n }\n document.metadata.docs = nextDocs;\n }\n changedFields.push(\"docs\");\n }\n const addTagsValues = options.addTags;\n const removeTagsValues = options.removeTags;\n const hasAdditiveTagMutation =\n (Array.isArray(addTagsValues) && addTagsValues.length > 0) ||\n (Array.isArray(removeTagsValues) && removeTagsValues.length > 0);\n if (options.tags !== undefined || clearFrontMatterKeys.has(\"tags\") || hasAdditiveTagMutation) {\n const baseTags = clearFrontMatterKeys.has(\"tags\")\n ? []\n : options.tags !== undefined\n ? parseTags(options.tags)\n : Array.isArray(document.metadata.tags)\n ? [...(document.metadata.tags as string[])]\n : [];\n const withAdditions = mergeAdditiveTags(baseTags, addTagsValues);\n const finalTags = applyTagRemovals(withAdditions, removeTagsValues);\n document.metadata.tags = finalTags;\n changedFields.push(\"tags\");\n }\n applyUpdateScalarMutations(UPDATE_POST_TAG_SCALAR_MUTATIONS, options, scalarMutationContext);\n const orderRaw = options.order ?? options.rank;\n if (orderRaw !== undefined || clearFrontMatterKeys.has(\"order\")) {\n if (clearFrontMatterKeys.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 if (options.assignee !== undefined || clearFrontMatterKeys.has(\"assignee\")) {\n if (clearFrontMatterKeys.has(\"assignee\")) {\n delete document.metadata.assignee;\n } else {\n const assignee = options.assignee?.trim() ?? \"\";\n if (assignee === \"\") {\n throw new PmCliError(\"--assignee must not be empty. Use --unset assignee to clear it.\", EXIT_CODE.USAGE);\n }\n document.metadata.assignee = assignee;\n }\n changedFields.push(\"assignee\");\n }\n if (options.parent !== undefined || clearFrontMatterKeys.has(\"parent\")) {\n if (clearFrontMatterKeys.has(\"parent\")) {\n delete document.metadata.parent;\n } else {\n document.metadata.parent = resolvedParentValue ?? \"\";\n }\n changedFields.push(\"parent\");\n }\n applyUpdateScalarMutations(UPDATE_STAKEHOLDER_SCALAR_MUTATIONS, options, scalarMutationContext);\n if (options.sprint !== undefined || clearFrontMatterKeys.has(\"sprint\")) {\n if (clearFrontMatterKeys.has(\"sprint\")) {\n delete document.metadata.sprint;\n } else {\n const sprintValidation = validateSprintOrReleaseValue(\"sprint\", options.sprint ?? \"\", sprintReleasePolicy);\n document.metadata.sprint = sprintValidation.value;\n warnings.push(...sprintValidation.warnings);\n }\n changedFields.push(\"sprint\");\n }\n if (options.release !== undefined || clearFrontMatterKeys.has(\"release\")) {\n if (clearFrontMatterKeys.has(\"release\")) {\n delete document.metadata.release;\n } else {\n const releaseValidation = validateSprintOrReleaseValue(\"release\", options.release ?? \"\", sprintReleasePolicy);\n document.metadata.release = releaseValidation.value;\n warnings.push(...releaseValidation.warnings);\n }\n changedFields.push(\"release\");\n }\n if (options.blockedBy !== undefined || clearFrontMatterKeys.has(\"blocked_by\")) {\n if (clearFrontMatterKeys.has(\"blocked_by\")) {\n delete document.metadata.blocked_by;\n } else {\n document.metadata.blocked_by = options.blockedBy?.trim() ?? \"\";\n }\n changedFields.push(\"blocked_by\");\n // pm-kyd6: keep the dependency graph in sync with the blocked_by scalar.\n applyBlockedByDependencyEdge(\n document.metadata,\n resolvedBlockedByDependencyId,\n nowIso,\n author,\n changedFields,\n );\n }\n applyUpdateScalarMutations(UPDATE_ISSUE_SCALAR_MUTATIONS, options, scalarMutationContext);\n if (options.reminder !== undefined || clearFrontMatterKeys.has(\"reminders\")) {\n if (clearFrontMatterKeys.has(\"reminders\")) {\n delete document.metadata.reminders;\n } else {\n document.metadata.reminders = parseReminderEntries(options.reminder ?? [], nowValue, { valueMode: \"trimmed\" });\n }\n changedFields.push(\"reminders\");\n }\n if (options.event !== undefined || clearFrontMatterKeys.has(\"events\")) {\n if (clearFrontMatterKeys.has(\"events\")) {\n delete document.metadata.events;\n } else {\n document.metadata.events = parseEventEntries(options.event ?? [], nowValue, {\n allDayEmptyGuard: \"truthy\",\n recurrenceEmptyNumericGuard: \"truthy\",\n });\n }\n changedFields.push(\"events\");\n }\n\n for (const definition of runtimeFieldRegistry.definitions) {\n if (!clearFrontMatterKeys.has(definition.metadata_key)) {\n continue;\n }\n if (metadataRecord[definition.metadata_key] === undefined) {\n continue;\n }\n delete metadataRecord[definition.metadata_key];\n changedFields.push(definition.metadata_key);\n }\n\n for (const fieldKey of extensionFieldNames) {\n if (!clearFrontMatterKeys.has(fieldKey)) {\n continue;\n }\n if (metadataRecord[fieldKey] === undefined) {\n continue;\n }\n delete metadataRecord[fieldKey];\n changedFields.push(fieldKey);\n }\n\n for (const [fieldKey, fieldValue] of Object.entries(runtimeFieldUpdates)) {\n if (clearFrontMatterKeys.has(fieldKey)) {\n continue;\n }\n if (stableValueEquals(metadataRecord[fieldKey], fieldValue)) {\n continue;\n }\n metadataRecord[fieldKey] = fieldValue;\n changedFields.push(fieldKey);\n }\n\n const registeredItemFieldUpdates = parseRegisteredItemFieldAssignments(options.field, extensionRegistrations);\n for (const fieldKey of Object.keys(registeredItemFieldUpdates)) {\n if (!clearFrontMatterKeys.has(fieldKey)) {\n continue;\n }\n throw new PmCliError(\n `Cannot combine --unset ${fieldKey.replaceAll(\"_\", \"-\")} with --field ${fieldKey}=...`,\n EXIT_CODE.USAGE,\n );\n }\n for (const [fieldKey, fieldValue] of Object.entries(registeredItemFieldUpdates)) {\n if (stableValueEquals(metadataRecord[fieldKey], fieldValue)) {\n continue;\n }\n metadataRecord[fieldKey] = fieldValue;\n changedFields.push(fieldKey);\n }\n\n try {\n applyRegisteredItemFieldDefaultsAndValidation(\n metadataRecord,\n extensionRegistrations,\n { skipDefaultFields: clearFrontMatterKeys },\n );\n } catch (error: unknown) {\n throw new PmCliError(error instanceof Error ? error.message : \"Invalid extension item field values\", EXIT_CODE.USAGE);\n }\n\n return { changedFields, warnings };\n },\n });\n\n return {\n item: toItemRecord(result.item),\n changed_fields: result.changedFields,\n warnings: [...workflowTransitionWarnings, ...parentReferenceWarnings, ...result.warnings],\n ...(options.allowAuditUpdate === true || options.allowAuditDepUpdate === true ? { audit_update: true } : {}),\n };\n}\n\n/* c8 ignore stop */\nexport const _testOnlyUpdateCommand = {\n collectProvidedUpdatePolicyOptions,\n buildAuditScopeRestrictedOptionsError,\n enforceAllowAuditUpdateScope,\n enforceTypeWorkflowTransition,\n matchesDependencySelector,\n normalizeLegacyNoneUpdateOptions,\n normalizeUpdatePolicyOptionKey,\n parseDependencyAdditions,\n parseDependencyRemovals,\n parseUpdateUnsetTargets,\n reconcileBlockedByDependency,\n resolveRuntimeUnsetDefinition: (token: string, registry: RuntimeFieldRegistry | undefined) =>\n resolveRuntimeUnsetFieldDefinition(token, \"update\", registry),\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["disallowedFlags", "global"]
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../core/output/mutation-projection.ts","../../../../../../../../core/output/output.ts"],"sourcesContent":["/**\n * Shared projection helper for mutation command results.\n *\n * Mutation commands (create/update/close/append/update-many) return a result\n * envelope that carries a `changed_fields` string array. On create this array simply\n * re-lists every field the command just set, which the item echo above it already\n * shows, so for high-volume agent loops it is ~50% redundant payload. This helper\n * lets the CLI (`--no-changed-fields`) and the MCP agent path trim that array down\n * to a deterministic `changed_field_count` without losing mutation evidence.\n *\n * Compaction is deliberately scoped to the mutation envelope only:\n * - the envelope's own top-level `changed_fields` (create/update/close/append), and\n * - `rows[*].changed_fields` (update-many reports its delta per row).\n * It does NOT recurse into arbitrary nested objects, so unrelated payloads that\n * legitimately carry `changed_fields` (for example `pm history --diff` entries, or a\n * custom runtime metadata field) are left untouched.\n *\n * The helper is pure and side-effect free, reused by both the output layer and the\n * MCP server, and returns the original reference unchanged when nothing is compacted.\n */\n\n/** Controls whether mutation output keeps full changed fields or compact counts. */\nexport type ChangedFieldsMode = \"full\" | \"compact\";\n\n/**\n * Documents the mutation projection options payload exchanged by command, SDK, and package integrations.\n */\nexport interface MutationProjectionOptions {\n /** Defaults to \"full\" (unchanged output). \"compact\" drops the array, keeping a count. */\n changedFields?: ChangedFieldsMode;\n /** Return only id/status for single-item mutation envelopes. */\n idOnly?: boolean;\n}\n\nconst CHANGED_FIELDS_KEY = \"changed_fields\";\nconst CHANGED_FIELD_COUNT_KEY = \"changed_field_count\";\nconst ROWS_KEY = \"rows\";\nconst UPDATE_MANY_MUTATION_MODES = new Set([\"apply\", \"rollback\"]);\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 proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n\n/** Replace a single envelope's own top-level `changed_fields` array with a count. */\nfunction compactOwnChangedFields(envelope: Record<string, unknown>): Record<string, unknown> | null {\n const changedFields = envelope[CHANGED_FIELDS_KEY];\n if (!Array.isArray(changedFields)) {\n return null;\n }\n const projected: Record<string, unknown> =\n Object.getPrototypeOf(envelope) === null ? Object.create(null) : {};\n for (const [key, value] of Object.entries(envelope)) {\n if (key !== CHANGED_FIELDS_KEY) {\n projected[key] = value;\n }\n }\n projected[CHANGED_FIELD_COUNT_KEY] = changedFields.length;\n return projected;\n}\n\nfunction isMutationEnvelope(value: Record<string, unknown>): boolean {\n return \"item\" in value && Array.isArray(value[CHANGED_FIELDS_KEY]);\n}\n\nfunction isUpdateManyMutationEnvelope(value: Record<string, unknown>): boolean {\n return (\n typeof value.mode === \"string\" &&\n UPDATE_MANY_MUTATION_MODES.has(value.mode) &&\n Array.isArray(value[ROWS_KEY])\n );\n}\n\nfunction replaceRows(envelope: Record<string, unknown>, rows: unknown[]): Record<string, unknown> {\n const projected: Record<string, unknown> =\n Object.getPrototypeOf(envelope) === null ? Object.create(null) : {};\n Object.assign(projected, envelope);\n projected[ROWS_KEY] = rows;\n return projected;\n}\n\n/**\n * Returns a copy of a mutation result with the envelope `changed_fields` arrays\n * replaced by `changed_field_count` when compact mode is requested. Inputs that are\n * not a mutation envelope (or full mode) are returned unchanged (same reference).\n */\nexport function projectMutationResult(result: unknown, options: MutationProjectionOptions = {}): unknown {\n if (options.idOnly === true && isPlainObject(result) && isPlainObject(result.item)) {\n const id = typeof result.item.id === \"string\" ? result.item.id : undefined;\n const status = typeof result.item.status === \"string\" ? result.item.status : undefined;\n if (id) {\n return status ? { id, status } : { id };\n }\n }\n\n const mode = options.changedFields ?? \"full\";\n if (mode === \"full\" || !isPlainObject(result)) {\n return result;\n }\n\n let changed = false;\n let projected: Record<string, unknown> = result;\n\n const compactedTop = isMutationEnvelope(result) ? compactOwnChangedFields(result) : null;\n if (compactedTop !== null) {\n projected = compactedTop;\n changed = true;\n }\n\n // update-many reports its per-item delta under rows[*].changed_fields.\n const rows = isUpdateManyMutationEnvelope(projected) ? projected[ROWS_KEY] : undefined;\n if (Array.isArray(rows)) {\n let rowsChanged = false;\n const nextRows = rows.map((row) => {\n if (!isPlainObject(row)) {\n return row;\n }\n const compactedRow = compactOwnChangedFields(row);\n if (compactedRow) {\n rowsChanged = true;\n return compactedRow;\n }\n return row;\n });\n if (rowsChanged) {\n projected = replaceRows(projected, nextRows);\n changed = true;\n }\n }\n\n return changed ? projected : result;\n}\n","/**\n * @module core/output/output\n *\n * Formats compact human and machine output for Output.\n */\nimport {\n runActiveCommandOverride,\n runActiveRendererOverride,\n runActiveServiceOverrideSync,\n setActiveCommandResult,\n} from \"../extensions/index.js\";\nimport { EXIT_CODE } from \"../shared/constants.js\";\nimport { projectMutationResult } from \"./mutation-projection.js\";\n\n/**\n * Documents the output options payload exchanged by command, SDK, and package integrations.\n */\nexport interface OutputOptions {\n json?: boolean;\n quiet?: boolean;\n /** When true, mutation results drop the verbose changed_fields array (keeps changed_field_count). */\n noChangedFields?: boolean;\n /** When true, single-item mutation results print only id and status. */\n idOnly?: boolean;\n defaultOutputFormat?: \"toon\" | \"json\";\n command?: string;\n commandArgs?: string[];\n commandOptions?: Record<string, unknown>;\n pmRoot?: string;\n}\n\ninterface NodeLikeError {\n code?: string;\n}\n\nconst NATIVE_OUTPUT_MARKER = \"__pm_native_output\";\n\nlet streamErrorHandlersInstalled = false;\ntype OutputStreamTarget = \"stdout\" | \"stderr\";\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction shouldUseNativeOutput(result: unknown): boolean {\n return isPlainObject(result) && result[NATIVE_OUTPUT_MARKER] === true;\n}\n\nfunction stripNativeOutputMarker<T>(result: T): T {\n if (!isPlainObject(result) || result[NATIVE_OUTPUT_MARKER] !== true) {\n return result;\n }\n const { [NATIVE_OUTPUT_MARKER]: _marker, ...rest } = result;\n return rest as T;\n}\n\nfunction isBrokenPipeError(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && (error as NodeLikeError).code === \"EPIPE\";\n}\n\nfunction markStdoutBrokenPipeExitCode(): void {\n if (process.exitCode === undefined || process.exitCode === EXIT_CODE.SUCCESS) {\n process.exitCode = EXIT_CODE.SUCCESS;\n }\n}\n\nfunction markStderrBrokenPipeExitCode(): void {\n if (process.exitCode === undefined || process.exitCode === EXIT_CODE.SUCCESS) {\n process.exitCode = EXIT_CODE.GENERIC_FAILURE;\n }\n}\n\nfunction markBrokenPipeExitCode(target: OutputStreamTarget): void {\n if (target === \"stdout\") {\n markStdoutBrokenPipeExitCode();\n return;\n }\n markStderrBrokenPipeExitCode();\n}\n\nfunction handleUnhandledStreamError(error: unknown): void {\n const unhandled = error instanceof Error ? error : new Error(String(error));\n setImmediate(() => {\n throw unhandled;\n });\n}\n\nfunction installStreamErrorHandlers(): void {\n if (streamErrorHandlersInstalled) {\n return;\n }\n streamErrorHandlersInstalled = true;\n process.stdout.on(\"error\", (error: unknown) => {\n if (isBrokenPipeError(error)) {\n markBrokenPipeExitCode(\"stdout\");\n return;\n }\n handleUnhandledStreamError(error);\n });\n process.stderr.on(\"error\", (error: unknown) => {\n if (isBrokenPipeError(error)) {\n markBrokenPipeExitCode(\"stderr\");\n return;\n }\n handleUnhandledStreamError(error);\n });\n}\n\nfunction writeToStream(target: OutputStreamTarget, text: string): boolean {\n installStreamErrorHandlers();\n try {\n if (target === \"stdout\") {\n process.stdout.write(text);\n } else {\n process.stderr.write(text);\n }\n return true;\n } catch (error: unknown) {\n if (isBrokenPipeError(error)) {\n markBrokenPipeExitCode(target);\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Implements write stdout for the public runtime surface of this module.\n */\nexport function writeStdout(text: string): boolean {\n return writeToStream(\"stdout\", text);\n}\n\n/**\n * Implements write stderr for the public runtime surface of this module.\n */\nexport function writeStderr(text: string): boolean {\n return writeToStream(\"stderr\", text);\n}\n\nfunction renderScalar(value: unknown): string {\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (value === null) return \"null\";\n return JSON.stringify(value);\n}\n\nfunction compactToonValue(value: unknown): unknown | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n const compactedEntries = value\n .map((entry) => compactToonValue(entry))\n .filter((entry): entry is unknown => entry !== undefined);\n return compactedEntries.length > 0 ? compactedEntries : undefined;\n }\n\n if (isPlainObject(value)) {\n const compacted: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n const compactedEntry = compactToonValue(entry);\n if (compactedEntry !== undefined) {\n compacted[key] = compactedEntry;\n }\n }\n return Object.keys(compacted).length > 0 ? compacted : undefined;\n }\n\n return value;\n}\n\nfunction renderToonValue(value: unknown, depth: number): string {\n const indent = \" \".repeat(depth);\n\n if (Array.isArray(value)) {\n if (value.length === 0) return \"[]\";\n return value\n .map((entry) => {\n if (!isPlainObject(entry) && !Array.isArray(entry)) {\n return `${indent}- ${renderScalar(entry)}`;\n }\n const rendered = renderToonValue(entry, depth + 1);\n const lines = rendered.split(\"\\n\");\n const [firstLine, ...rest] = lines;\n if (rest.length === 0) {\n return `${indent}- ${firstLine.trimStart()}`;\n }\n return `${indent}- ${firstLine.trimStart()}\\n${rest.join(\"\\n\")}`;\n })\n .join(\"\\n\");\n }\n\n if (isPlainObject(value)) {\n const entries = Object.entries(value);\n if (entries.length === 0) return \"{}\";\n return entries\n .map(([key, entry]) => {\n if (!isPlainObject(entry) && !Array.isArray(entry)) {\n return `${indent}${key}: ${renderScalar(entry)}`;\n }\n if (Array.isArray(entry) && entry.length === 0) {\n return `${indent}${key}: []`;\n }\n if (isPlainObject(entry) && Object.keys(entry).length === 0) {\n return `${indent}${key}: {}`;\n }\n return `${indent}${key}:\\n${renderToonValue(entry, depth + 1)}`;\n })\n .join(\"\\n\");\n }\n\n return `${indent}${renderScalar(value)}`;\n}\n\nfunction renderDefaultMarkdownResult(value: unknown): string | null {\n if (!isPlainObject(value) || value.output_default !== \"markdown\") {\n return null;\n }\n if (typeof value.view !== \"string\" || !Array.isArray(value.events) || !Array.isArray(value.days)) {\n return null;\n }\n const lines = [`# pm calendar (${value.view})`, \"\"];\n const summary = isPlainObject(value.summary) ? value.summary : {};\n lines.push(`- events: ${String(summary.events ?? 0)}`);\n lines.push(\"\");\n if (value.events.length === 0) {\n lines.push(\"No calendar events matched the selected filters.\");\n return `${lines.join(\"\\n\")}\\n`;\n }\n for (const event of value.events) {\n if (!isPlainObject(event)) {\n continue;\n }\n const kind = typeof event.kind === \"string\" ? event.kind : \"event\";\n const title = typeof event.item_title === \"string\" ? event.item_title : \"\";\n const itemId = typeof event.item_id === \"string\" ? event.item_id : \"\";\n const reminderText = typeof event.reminder_text === \"string\" && event.reminder_text.length > 0 ? ` ${event.reminder_text}` : \"\";\n lines.push(`- [${kind}] ${itemId} ${title}${reminderText}`.trim());\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/**\n * Implements format output for the public runtime surface of this module.\n */\nexport function formatOutput(result: unknown, options: OutputOptions): string {\n const commandOverride = runActiveCommandOverride(result);\n const nativeOutput = shouldUseNativeOutput(commandOverride.result);\n const effectiveResult = stripNativeOutputMarker(commandOverride.result);\n setActiveCommandResult(effectiveResult);\n const format =\n options.json === true\n ? \"json\"\n : options.json === false\n ? \"toon\"\n : options.defaultOutputFormat === \"json\"\n ? \"json\"\n : \"toon\";\n const serviceOverride = nativeOutput ? { handled: false, result: effectiveResult } : runActiveServiceOverrideSync(\"output_format\", {\n command: options.command,\n args: options.commandArgs,\n command_options: options.commandOptions,\n global: { ...options },\n pm_root: options.pmRoot,\n format,\n options: { ...options },\n result: effectiveResult,\n });\n if (serviceOverride.handled && typeof serviceOverride.result === \"string\") {\n return serviceOverride.result.endsWith(\"\\n\") ? serviceOverride.result : `${serviceOverride.result}\\n`;\n }\n const outputResult = serviceOverride.handled ? serviceOverride.result : effectiveResult;\n if (format === \"toon\") {\n const markdownDefault = renderDefaultMarkdownResult(outputResult);\n if (markdownDefault !== null) {\n return markdownDefault;\n }\n }\n const rendererOverride = nativeOutput ? { rendered: null } : runActiveRendererOverride(format, outputResult);\n if (rendererOverride.rendered !== null) {\n return rendererOverride.rendered.endsWith(\"\\n\") ? rendererOverride.rendered : `${rendererOverride.rendered}\\n`;\n }\n if (format === \"json\") {\n return `${JSON.stringify(outputResult, null, 2)}\\n`;\n }\n const compactedToon = compactToonValue(outputResult);\n if (compactedToon === undefined) {\n return \"{}\\n\";\n }\n return `${renderToonValue(compactedToon, 0)}\\n`;\n}\n\n/**\n * Implements print result for the public runtime surface of this module.\n */\nexport function printResult(result: unknown, options: OutputOptions): void {\n const projected = options.idOnly\n ? projectMutationResult(result, { idOnly: true })\n : options.noChangedFields\n ? projectMutationResult(result, { changedFields: \"compact\" })\n : result;\n const rendered = formatOutput(projected, options);\n if (options.quiet) {\n return;\n }\n writeStdout(rendered);\n}\n\n/**\n * Implements print error for the public runtime surface of this module.\n */\nexport function printError(message: string): void {\n const override = runActiveServiceOverrideSync(\"error_format\", {\n message,\n });\n const rendered = override.handled && typeof override.result === \"string\" ? override.result : message;\n writeStderr(rendered.endsWith(\"\\n\") ? rendered : `${rendered}\\n`);\n}\n\nexport const outputTestOnly = {\n compactToonValue,\n renderToonValue,\n};\n"],"names":["isPlainObject"],"mappings":"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","debugId":"2f6ea7ca-7f24-526b-ba18-1a10d4a0d3b7"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../core/history/drift-scan.ts"],"sourcesContent":["/**\n * @module core/history/drift-scan\n *\n * Implements append-only history and replay behavior for Drift Scan.\n */\nimport fs from \"fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport path from \"node:path\";\nimport { getHistoryPath } from \"../store/paths.js\";\nimport { writeFileAtomic } from \"../fs/fs-utils.js\";\nimport { hashDocument } from \"./history.js\";\nimport { verifyHistoryChain } from \"./replay.js\";\nimport type { HistoryEntry, ItemMetadata } from \"../../types/index.js\";\n\n/**\n * Documents the drift scan result payload exchanged by command, SDK, and package integrations.\n */\nexport interface DriftScanResult {\n missingStreams: string[];\n unreadableStreams: string[];\n hashMismatches: string[];\n chainMismatches: string[];\n driftedItems: string[];\n}\n\nconst DRIFT_CACHE_VERSION = 3;\nconst DRIFT_CACHE_FILENAME = \"history-drift-cache.json\";\n\n/**\n * Controls how cached history stream verification is trusted when the file stat\n * tuple still matches a previous scan.\n */\nexport type DriftCacheHitVerification = \"content_hash\" | \"metadata\";\n\n/**\n * Documents the history drift scan options shared by health, validate, and\n * repair callers.\n */\nexport interface DriftScanOptions {\n cacheHitVerification?: DriftCacheHitVerification;\n}\n\ninterface DriftCacheEntry {\n mtime_ms: number;\n ctime_ms: number;\n size: number;\n content_hash: string;\n latest_after_hash: string;\n chain_ok: boolean;\n}\n\ninterface DriftCacheEnvelope {\n version: number;\n entries: Record<string, DriftCacheEntry>;\n}\n\nfunction getDriftCachePath(pmRoot: string): string {\n return path.join(pmRoot, \"runtime\", DRIFT_CACHE_FILENAME);\n}\n\nasync function loadDriftCache(pmRoot: string): Promise<DriftCacheEnvelope | null> {\n try {\n const raw = await fs.readFile(getDriftCachePath(pmRoot), \"utf8\");\n const parsed = JSON.parse(raw) as DriftCacheEnvelope;\n if (parsed.version !== DRIFT_CACHE_VERSION || typeof parsed.entries !== \"object\" || parsed.entries === null) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction isErrno(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && (error as { code?: string }).code === code;\n}\n\ninterface StreamVerification {\n latestAfterHash: string;\n chainOk: boolean;\n contentHash: string;\n}\n\nfunction hashContent(raw: string): string {\n return createHash(\"sha256\").update(raw).digest(\"hex\");\n}\n\nasync function readHistoryContentHash(historyPath: string): Promise<string> {\n const raw = await fs.readFile(historyPath, \"utf8\");\n return hashContent(raw);\n}\n\n/**\n * Read and fully verify one history stream's hash chain. Returns null for an\n * empty/missing stream (caller records it as a missing stream).\n */\nasync function verifyHistoryStream(historyPath: string): Promise<StreamVerification | null> {\n const raw = await fs.readFile(historyPath, \"utf8\");\n const contentHash = hashContent(raw);\n if (raw.trim().length === 0) {\n return null;\n }\n const entries: HistoryEntry[] = [];\n let latestAfterHash: string | null = null;\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n continue;\n }\n const parsed = JSON.parse(trimmed) as HistoryEntry;\n if (typeof parsed.after_hash !== \"string\" || parsed.after_hash.trim().length === 0) {\n throw new Error(\"missing after_hash\");\n }\n entries.push(parsed);\n latestAfterHash = parsed.after_hash;\n }\n /* c8 ignore start -- defensive guard for future history schema changes. */\n if (!latestAfterHash) {\n return null;\n }\n /* c8 ignore stop */\n return {\n latestAfterHash,\n chainOk: verifyHistoryChain(entries).ok,\n contentHash,\n };\n}\n\n/**\n * Scan every item's history stream for drift (missing/unreadable streams, broken\n * hash chains, and item/history hash mismatches).\n *\n * Full chain re-verification of a large history tree is the dominant cost of\n * `pm health`. We cache the per-stream verification keyed by the history file's\n * mtime/ctime/size plus content hash. Strict callers keep recomputing the\n * content hash on metadata hits; latency-sensitive health checks can opt into\n * trusting the stat tuple and skip rereading unchanged streams.\n */\nexport async function scanHistoryDrift(\n pmRoot: string,\n items: Array<ItemMetadata & { body: string }>,\n options: DriftScanOptions = {},\n): Promise<DriftScanResult> {\n const missingStreams: string[] = [];\n const unreadableStreams: string[] = [];\n const hashMismatches: string[] = [];\n const chainMismatches: string[] = [];\n\n const cache = await loadDriftCache(pmRoot);\n const previousEntries: Record<string, DriftCacheEntry> = cache?.entries ?? {};\n const nextEntries: Record<string, DriftCacheEntry> = {};\n let cacheDirty = false;\n // Metadata mode does not open a stat-matched stream, so unreadable-after-stat\n // failures are intentionally deferred to strict validate/history-repair scans.\n const verifyCacheHitByContent = options.cacheHitVerification !== \"metadata\";\n\n for (const item of items) {\n const historyPath = getHistoryPath(pmRoot, item.id);\n\n let stat: Awaited<ReturnType<typeof fs.stat>>;\n try {\n stat = await fs.stat(historyPath);\n } catch (error: unknown) {\n if (isErrno(error, \"ENOENT\")) {\n missingStreams.push(item.id);\n } else {\n unreadableStreams.push(item.id);\n }\n continue;\n }\n\n const loadStreamVerification = async (): Promise<StreamVerification | null | \"unreadable\"> => {\n try {\n return await verifyHistoryStream(historyPath);\n } catch {\n return \"unreadable\";\n }\n };\n\n const loadFreshVerification = async (): Promise<StreamVerification | null> => {\n const loaded = await loadStreamVerification();\n if (loaded === \"unreadable\") {\n unreadableStreams.push(item.id);\n return null;\n }\n if (!loaded) {\n missingStreams.push(item.id);\n return null;\n }\n return loaded;\n };\n\n const cached = previousEntries[item.id];\n let verification: StreamVerification;\n const metadataMatchesCache =\n cached !== undefined &&\n cached.mtime_ms === stat.mtimeMs &&\n cached.ctime_ms === stat.ctimeMs &&\n cached.size === stat.size;\n const cachedContentHash =\n typeof cached?.content_hash === \"string\" && cached.content_hash.length > 0 ? cached.content_hash : undefined;\n const canUseCache = metadataMatchesCache && cachedContentHash !== undefined;\n if (canUseCache && cached) {\n let currentContentHash: string;\n if (verifyCacheHitByContent) {\n try {\n currentContentHash = await readHistoryContentHash(historyPath);\n } catch {\n unreadableStreams.push(item.id);\n continue;\n }\n } else {\n currentContentHash = cachedContentHash;\n }\n if (!verifyCacheHitByContent || currentContentHash === cachedContentHash) {\n verification = {\n latestAfterHash: cached.latest_after_hash,\n chainOk: cached.chain_ok,\n contentHash: currentContentHash,\n };\n } else {\n cacheDirty = true;\n const refreshed = await loadFreshVerification();\n if (!refreshed) {\n continue;\n }\n verification = refreshed;\n }\n } else {\n cacheDirty = true;\n const refreshed = await loadFreshVerification();\n if (!refreshed) {\n continue;\n }\n verification = refreshed;\n }\n\n if (!verification.chainOk) {\n chainMismatches.push(item.id);\n }\n nextEntries[item.id] = {\n mtime_ms: stat.mtimeMs,\n ctime_ms: stat.ctimeMs,\n size: stat.size,\n content_hash: verification.contentHash,\n latest_after_hash: verification.latestAfterHash,\n chain_ok: verification.chainOk,\n };\n\n const { body, ...frontMatter } = item;\n const currentHash = hashDocument({\n metadata: frontMatter as ItemMetadata,\n body,\n });\n if (currentHash !== verification.latestAfterHash) {\n hashMismatches.push(item.id);\n }\n }\n\n if (cacheDirty || Object.keys(previousEntries).length !== Object.keys(nextEntries).length) {\n const cachePath = getDriftCachePath(pmRoot);\n try {\n await fs.mkdir(path.dirname(cachePath), { recursive: true });\n await writeFileAtomic(cachePath, JSON.stringify({ version: DRIFT_CACHE_VERSION, entries: nextEntries }));\n } catch {\n // Best-effort cache write: a failed persist must never fail a health scan.\n }\n }\n\n const driftedItems = [...new Set([...missingStreams, ...unreadableStreams, ...hashMismatches, ...chainMismatches])].sort((a, b) =>\n a.localeCompare(b),\n );\n return { missingStreams, unreadableStreams, hashMismatches, chainMismatches, driftedItems };\n}\n"],"names":[],"mappings":"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","debugId":"7919579f-9834-5809-8c55-f7618807569e"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../../../cli/commands/close.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @module cli/commands/close\n *\n * Implements the pm close command surface and its agent-facing runtime behavior.\n */\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { collectBlockedByIds } from \"../../core/item/actionability.js\";\nimport { toItemRecord } from \"../../core/item/item-record.js\";\nimport { isTerminalStatus } from \"../../core/item/status.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { resolveRuntimeStatusRegistry, type RuntimeStatusRegistry } from \"../../core/schema/runtime-schema.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 {\n buildItemNotFoundError,\n listAllFrontMatterLight,\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 type { ItemFrontMatter } from \"../../types/index.js\";\n\n/**\n * Documents the close command options payload exchanged by command, SDK, and package integrations.\n */\nexport interface CloseCommandOptions {\n author?: string;\n message?: string;\n validateClose?: string;\n force?: boolean;\n // pm-fl0c #11 (2026-05-28): allow setting the three closure validation\n // fields inline on `pm close` so agents do not have to issue a prior\n // `pm update` just to satisfy --validate-close warn|strict. These map 1:1\n // to ItemFrontMatter.{resolution,expected_result,actual_result}.\n resolution?: string;\n expectedResult?: string;\n actualResult?: string;\n duplicateOf?: string;\n}\n\n/**\n * Documents the close result payload exchanged by command, SDK, and package integrations.\n */\nexport interface CloseResult {\n item: Record<string, unknown>;\n changed_fields: string[];\n warnings: string[];\n}\n\ninterface AutoUnblockCandidate {\n id: string;\n blocker_ids: string[];\n}\n\nfunction toAuthor(candidate: string | undefined, defaultAuthor: string): string {\n const resolved = candidate ?? process.env.PM_AUTHOR ?? defaultAuthor;\n const trimmed = resolved.trim();\n return trimmed || \"unknown\";\n}\n\nfunction normalizeCloseReason(reasonText: string | undefined, required: boolean): string | undefined {\n const reason = (reasonText ?? \"\").trim();\n if (reason.length > 0) {\n return reason;\n }\n if (required) {\n throw new PmCliError(\n \"Close reason text is required because governance.require_close_reason is enabled\",\n EXIT_CODE.USAGE,\n {\n code: \"close_reason_required\",\n required: \"Provide a one-line closing summary as the positional text or via --reason.\",\n why: \"governance.require_close_reason is enabled, so every close must record why the item is done.\",\n examples: [\n 'pm close <id> \"Done: <what changed and why>\"',\n 'pm close <id> --reason \"<closing summary>\"',\n \"pm close <id> --duplicate-of <canonical-id>\",\n ],\n nextSteps: [\n \"Re-run the close with a closing summary.\",\n 'When closing as a duplicate, --duplicate-of <id> auto-fills the close reason as \"Duplicate of <id>\".',\n \"To stop requiring reasons, run: pm config set governance-require-close-reason --policy disabled\",\n ],\n },\n );\n }\n return undefined;\n}\n\ntype ValidateCloseMode = \"off\" | \"warn\" | \"strict\";\n\nconst CLOSE_VALIDATION_FIELDS: Array<{ key: keyof Pick<ItemFrontMatter, \"resolution\" | \"expected_result\" | \"actual_result\">; label: string }> = [\n { key: \"resolution\", label: \"resolution\" },\n { key: \"expected_result\", label: \"expected_result\" },\n { key: \"actual_result\", label: \"actual_result\" },\n];\n\nfunction parseValidateCloseMode(raw: string | undefined): ValidateCloseMode | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const normalized = raw.trim().toLowerCase();\n if (normalized.length === 0 || normalized === \"warn\") {\n return \"warn\";\n }\n if (normalized === \"off\" || normalized === \"none\" || normalized === \"disabled\") {\n return \"off\";\n }\n if (normalized === \"strict\") {\n return \"strict\";\n }\n throw new PmCliError(`Invalid --validate-close mode \"${raw}\" (expected \"off\", \"warn\", or \"strict\")`, EXIT_CODE.USAGE);\n}\n\nfunction findMissingCloseValidationFields(frontMatter: ItemFrontMatter): string[] {\n const missing: string[] = [];\n for (const field of CLOSE_VALIDATION_FIELDS) {\n const rawValue = frontMatter[field.key];\n if (typeof rawValue !== \"string\" || rawValue.trim().length === 0) {\n missing.push(field.label);\n }\n }\n return missing;\n}\n\nasync function duplicateChainReferencesClosingItem(\n loadItemById: (id: string) => Promise<ItemFrontMatter | null>,\n initialDuplicateOf: unknown,\n closingId: string,\n): Promise<boolean> {\n const visited = new Set<string>();\n let current = initialDuplicateOf;\n while (typeof current === \"string\" && current.trim().length > 0) {\n const currentId = current.trim();\n if (currentId === closingId) {\n return true;\n }\n if (visited.has(currentId)) {\n return false;\n }\n visited.add(currentId);\n current = (await loadItemById(currentId))?.duplicate_of;\n }\n return false;\n}\n\nfunction shouldApplyDuplicateFallback(value: unknown): boolean {\n return typeof value !== \"string\" || value.trim().length === 0;\n}\n\nasync function assertDuplicateTargetExists(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n duplicateOf: string | undefined,\n closingId: string,\n): Promise<string | undefined> {\n const rawTarget = duplicateOf?.trim();\n if (!rawTarget) {\n return undefined;\n }\n if (rawTarget === closingId) {\n throw new PmCliError(\"An item cannot be closed as a duplicate of itself.\", EXIT_CODE.USAGE, {\n code: \"duplicate_target_self\",\n why: \"--duplicate-of must identify the canonical item that should remain open or already represent the work.\",\n });\n }\n const typeRegistry = resolveItemTypeRegistry(settings);\n const itemCache = new Map<string, ItemFrontMatter | null>();\n const loadItemById = async (id: string): Promise<ItemFrontMatter | null> => {\n if (itemCache.has(id)) {\n return itemCache.get(id) ?? null;\n }\n const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);\n if (!located) {\n itemCache.set(id, null);\n return null;\n }\n const { document } = await readLocatedItem(located, { schema: settings.schema });\n itemCache.set(id, document.metadata);\n return document.metadata;\n };\n const target = await loadItemById(rawTarget);\n if (!target) {\n throw new PmCliError(`Duplicate target \"${rawTarget}\" was not found. Create or locate the canonical item first.`, EXIT_CODE.USAGE, {\n code: \"duplicate_target_missing\",\n why: \"Duplicate closure should point at a real canonical pm item so future dedupe and changelog tooling can trace the relationship.\",\n examples: [`pm close ${closingId} \"Duplicate of ${rawTarget}\" --duplicate-of ${rawTarget}`],\n nextSteps: [\"Run pm search/list to find the canonical item, then retry with --duplicate-of <id>.\"],\n });\n }\n if (await duplicateChainReferencesClosingItem(loadItemById, target.duplicate_of, closingId)) {\n throw new PmCliError(`Circular duplicate reference detected. Target \"${rawTarget}\" points back to \"${closingId}\".`, EXIT_CODE.USAGE, {\n code: \"duplicate_target_circular\",\n why: \"Circular duplicate relationships create loops for dedupe and status propagation tooling.\",\n nextSteps: [\"Choose the existing canonical item, or clear the target duplicate_of metadata before closing this item as a duplicate.\"],\n });\n }\n if (typeof target.duplicate_of === \"string\" && target.duplicate_of.trim().length > 0) {\n throw new PmCliError(`Duplicate target \"${rawTarget}\" is already marked as a duplicate of \"${target.duplicate_of.trim()}\".`, EXIT_CODE.USAGE, {\n code: \"duplicate_target_is_duplicate\",\n why: \"Duplicate closure should point directly at the canonical item, not another duplicate.\",\n examples: [`pm close ${closingId} \"Duplicate of ${target.duplicate_of.trim()}\" --duplicate-of ${target.duplicate_of.trim()}`],\n nextSteps: [\"Use the canonical item referenced by duplicate_of as the --duplicate-of target.\"],\n });\n }\n return target.id;\n}\n\nasync function findActiveChildIds(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n parentId: string,\n statusRegistry: RuntimeStatusRegistry,\n): Promise<string[]> {\n const typeRegistry = resolveItemTypeRegistry(settings);\n const items = await listAllFrontMatterLight(\n pmRoot,\n settings.item_format,\n typeRegistry.type_to_folder,\n undefined,\n settings.schema,\n );\n return items\n .filter((item) => item.parent === parentId && !isTerminalStatus(item.status, statusRegistry))\n .map((item) => item.id)\n .sort((left, right) => left.localeCompare(right));\n}\n\nasync function findAutoUnblockCandidates(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n closedId: string,\n statusRegistry: RuntimeStatusRegistry,\n): Promise<AutoUnblockCandidate[]> {\n const typeRegistry = resolveItemTypeRegistry(settings);\n const items = await listAllFrontMatterLight(\n pmRoot,\n settings.item_format,\n typeRegistry.type_to_folder,\n undefined,\n settings.schema,\n );\n const itemsById = new Map(items.map((item) => [item.id, item]));\n const blockedStatuses = statusRegistry.blocked_statuses;\n return items\n .filter((item) => blockedStatuses.has(item.status))\n .map((item) => ({ item, blockerIds: collectBlockedByIds(item) }))\n .filter(({ blockerIds }) => blockerIds.includes(closedId))\n .filter(({ blockerIds }) =>\n blockerIds.every((blockerId) => {\n const blocker = itemsById.get(blockerId);\n return blocker !== undefined && isTerminalStatus(blocker.status, statusRegistry);\n }),\n )\n .map(({ item, blockerIds }) => ({ id: item.id, blocker_ids: blockerIds }))\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nasync function autoUnblockResolvedDependents(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n closedId: string,\n author: string,\n statusRegistry: RuntimeStatusRegistry,\n): Promise<string[]> {\n const candidates = await findAutoUnblockCandidates(pmRoot, settings, closedId, statusRegistry);\n const warnings: string[] = [];\n for (const candidate of candidates) {\n try {\n const unblocked = await mutateItem({\n pmRoot,\n settings,\n id: candidate.id,\n op: \"update\",\n author,\n message: `Auto-unblocked after blocker ${closedId} closed`,\n mutate(document) {\n /* c8 ignore start -- normal auto-unblock candidates carry dependency metadata; fallback preserves hand-edited scalar-only blockers. */\n const dependencies = document.metadata.dependencies ?? [];\n /* c8 ignore stop */\n const remainingDependencies = dependencies.filter((dependency) => {\n const dependencyId = dependency.id.trim();\n return dependency.kind !== \"blocked_by\" || !candidate.blocker_ids.includes(dependencyId);\n });\n document.metadata.status = statusRegistry.open_status;\n delete document.metadata.blocked_by;\n delete document.metadata.blocked_reason;\n document.metadata.unblock_note = `Auto-unblocked after blocker ${closedId} closed; all blockers resolved (${candidate.blocker_ids.join(\", \")}).`;\n if (remainingDependencies.length > 0) {\n document.metadata.dependencies = remainingDependencies;\n } else {\n delete document.metadata.dependencies;\n }\n const changedFields = [\"status\", \"blocked_by\", \"blocked_reason\", \"unblock_note\"];\n if (remainingDependencies.length !== dependencies.length) {\n changedFields.push(\"dependencies\");\n }\n return {\n changedFields,\n };\n },\n });\n warnings.push(`auto_unblocked:${unblocked.item.id}:resolved_blockers=${candidate.blocker_ids.join(\",\")}`);\n /* c8 ignore start -- defensive fan-out failure path; normal lock/claim state is auditable and still unblocks. */\n } catch (error) {\n const reason = error instanceof Error ? error.message.replace(/\\s+/g, \" \").trim() : \"unknown\";\n warnings.push(`auto_unblock_failed:${candidate.id}:${reason}`);\n }\n /* c8 ignore stop */\n }\n return warnings;\n}\n\nexport const _testOnlyCloseCommand = {\n blockedByIds: collectBlockedByIds,\n};\n\n/**\n * Implements run close for the public runtime surface of this module.\n */\nexport async function runClose(\n id: string,\n closeReasonText: string | undefined,\n options: CloseCommandOptions,\n global: GlobalOptions,\n): Promise<CloseResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n\n const settings = await readSettings(pmRoot);\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const author = toAuthor(options.author, settings.author_default);\n // GH-250: verify the target item EXISTS before the governance close-reason\n // gate fires. Otherwise closing a typo'd id with no reason reports\n // \"Close reason text is required\" and hides the real cause (bad id) until a\n // reason is supplied. Existence is the more fundamental precondition, so it\n // is validated first regardless of whether a reason was provided.\n const typeToFolder = resolveItemTypeRegistry(settings).type_to_folder;\n const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeToFolder);\n if (!located) {\n throw await buildItemNotFoundError(pmRoot, id, settings.id_prefix, typeToFolder);\n }\n // GH-204: resolve the duplicate target BEFORE reason validation so\n // `pm close <id> --duplicate-of <canonical>` succeeds under\n // governance.require_close_reason without a manual reason — when no\n // positional/--reason text is provided the reason defaults to\n // \"Duplicate of <id>\" (mirroring the auto-filled closure metadata).\n // Explicit reason text still wins.\n const duplicateOf = await assertDuplicateTargetExists(pmRoot, settings, options.duplicateOf, id);\n // pm-7x8d / GH-204: when no explicit positional/--reason text is given, derive\n // the close reason from the next-best closure signal instead of hard-blocking\n // under governance.require_close_reason. Precedence: explicit reason text >\n // --duplicate-of (\"Duplicate of <id>\") > --resolution summary. The resolution\n // is still written to metadata.resolution below; reusing it as the close\n // reason just lets a single `pm close <id> --resolution \"...\"` succeed.\n const hasExplicitReason = (closeReasonText ?? \"\").trim().length > 0;\n const trimmedResolution = typeof options.resolution === \"string\" ? options.resolution.trim() : \"\";\n const effectiveCloseReasonText = hasExplicitReason\n ? closeReasonText\n : duplicateOf !== undefined\n ? `Duplicate of ${duplicateOf}`\n : trimmedResolution.length > 0\n ? trimmedResolution\n : closeReasonText;\n const closeReason = normalizeCloseReason(effectiveCloseReasonText, settings.governance.require_close_reason);\n const validateCloseMode = parseValidateCloseMode(options.validateClose) ?? settings.governance.close_validation_default;\n // C3 (pm-fu5d): scan for active children even under minimal governance so\n // closing a parent is never silently orphaning — off mode emits an\n // informational note instead of the warn/strict validation warning.\n const activeChildIds = await findActiveChildIds(pmRoot, settings, id, statusRegistry);\n\n const result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: \"close\",\n author,\n message: options.message,\n force: options.force,\n mutate(document) {\n if (isTerminalStatus(document.metadata.status, statusRegistry) && !options.force) {\n throw new PmCliError(`Item ${document.metadata.id} is already terminal; use --force to close again.`, EXIT_CODE.CONFLICT);\n }\n const mutationWarnings: string[] = [];\n // pm-fl0c #11: apply inline closure fields BEFORE the validation pass so\n // a single `pm close <id> \"reason\" --resolution \"...\"` call satisfies\n // strict validation without a prior pm update. Only meaningful trimmed\n // text writes; an empty/whitespace value is a no-op rather than a clear.\n const inlineCloseFields: Array<{ option: string | undefined; key: \"resolution\" | \"expected_result\" | \"actual_result\" }> = [\n { option: options.resolution, key: \"resolution\" },\n { option: options.expectedResult, key: \"expected_result\" },\n { option: options.actualResult, key: \"actual_result\" },\n ];\n const duplicateFallbackFields: Array<\"resolution\" | \"expected_result\" | \"actual_result\"> = [];\n for (const { option, key } of inlineCloseFields) {\n if (typeof option !== \"string\") continue;\n const trimmed = option.trim();\n if (trimmed.length === 0) continue;\n document.metadata[key] = trimmed;\n }\n if (duplicateOf !== undefined) {\n document.metadata.duplicate_of = duplicateOf;\n const duplicateResolution = `Duplicate of ${duplicateOf}`;\n const duplicateExpectedResult = `Canonical item ${duplicateOf} tracks the work.`;\n const duplicateActualResult = `Closed as duplicate of ${duplicateOf}.`;\n if (shouldApplyDuplicateFallback(document.metadata.resolution)) {\n document.metadata.resolution = duplicateResolution;\n duplicateFallbackFields.push(\"resolution\");\n }\n if (shouldApplyDuplicateFallback(document.metadata.expected_result)) {\n document.metadata.expected_result = duplicateExpectedResult;\n duplicateFallbackFields.push(\"expected_result\");\n }\n if (shouldApplyDuplicateFallback(document.metadata.actual_result)) {\n document.metadata.actual_result = duplicateActualResult;\n duplicateFallbackFields.push(\"actual_result\");\n }\n }\n if (validateCloseMode !== \"off\") {\n const missingFields = findMissingCloseValidationFields(document.metadata);\n if (missingFields.length > 0) {\n if (validateCloseMode === \"strict\") {\n throw new PmCliError(\n `Cannot close item ${document.metadata.id}: missing ${missingFields.join(\", \")}. Populate fields or use --validate-close warn.`,\n EXIT_CODE.USAGE,\n );\n }\n mutationWarnings.push(`close_validation_missing_fields:${document.metadata.id}:${missingFields.join(\",\")}`);\n }\n if (activeChildIds.length > 0) {\n if (validateCloseMode === \"strict\") {\n throw new PmCliError(\n `Cannot close item ${document.metadata.id}: active child items remain open (${activeChildIds.join(\", \")}). Close, cancel, or re-parent them first, or use --validate-close warn.`,\n EXIT_CODE.USAGE,\n );\n }\n mutationWarnings.push(`close_validation_active_children:${document.metadata.id}:${activeChildIds.join(\",\")}`);\n }\n } else if (activeChildIds.length > 0) {\n // C3: minimal governance (validate-close off) should still tell the\n // agent it just closed a parent with open children, without blocking.\n mutationWarnings.push(`closed_with_active_children:${document.metadata.id}:${activeChildIds.join(\",\")}`);\n }\n\n document.metadata.status = statusRegistry.close_status;\n const changedFields = [\"status\"];\n if (closeReason !== undefined) {\n document.metadata.close_reason = closeReason;\n changedFields.push(\"close_reason\");\n } else if (document.metadata.close_reason !== undefined) {\n delete document.metadata.close_reason;\n changedFields.push(\"close_reason\");\n }\n for (const { option, key } of inlineCloseFields) {\n if (typeof option === \"string\" && option.trim().length > 0) {\n changedFields.push(key);\n }\n }\n if (duplicateOf !== undefined) {\n changedFields.push(\"duplicate_of\");\n if (duplicateFallbackFields.includes(\"resolution\") && !changedFields.includes(\"resolution\")) {\n changedFields.push(\"resolution\");\n }\n if (duplicateFallbackFields.includes(\"expected_result\") && !changedFields.includes(\"expected_result\")) {\n changedFields.push(\"expected_result\");\n }\n if (duplicateFallbackFields.includes(\"actual_result\") && !changedFields.includes(\"actual_result\")) {\n changedFields.push(\"actual_result\");\n }\n }\n if (document.metadata.assignee !== undefined) {\n delete document.metadata.assignee;\n changedFields.push(\"assignee\");\n }\n\n // C4 (pm-fu5d): a terminal item is no longer blocked. Clear every active\n // blocker signal independently — scalar blocked_by, blocked_reason, and the\n // blocked_by dependency edges (kept consistent with the kyd6 invariant) —\n // even if only some are present (e.g. an orphaned edge or a stale\n // blocked_reason left by manual edits), so closed work stops surfacing in\n // blockers views, and annotate the cleanup.\n const previousBlockedBy =\n typeof document.metadata.blocked_by === \"string\" ? document.metadata.blocked_by.trim() : \"\";\n const existingDeps = document.metadata.dependencies ?? [];\n const blockedByEdge = existingDeps.find((dep) => dep.kind === \"blocked_by\");\n const hadBlockedReason = document.metadata.blocked_reason !== undefined;\n if (previousBlockedBy.length > 0 || blockedByEdge !== undefined || hadBlockedReason) {\n if (previousBlockedBy.length > 0) {\n delete document.metadata.blocked_by;\n changedFields.push(\"blocked_by\");\n }\n if (hadBlockedReason) {\n delete document.metadata.blocked_reason;\n changedFields.push(\"blocked_reason\");\n }\n if (blockedByEdge !== undefined) {\n const remainingDeps = existingDeps.filter((dep) => dep.kind !== \"blocked_by\");\n if (remainingDeps.length > 0) {\n document.metadata.dependencies = remainingDeps;\n } else {\n delete document.metadata.dependencies;\n }\n changedFields.push(\"dependencies\");\n }\n const reportedBlocker = previousBlockedBy || blockedByEdge?.id || \"unknown\";\n mutationWarnings.push(`closed_cleared_blocked_by:${document.metadata.id}:${reportedBlocker}`);\n }\n\n return {\n changedFields,\n ...(mutationWarnings.length > 0 ? { warnings: mutationWarnings } : {}),\n };\n },\n });\n\n return {\n item: toItemRecord(result.item),\n changed_fields: result.changedFields,\n warnings: [\n ...result.warnings,\n ...(await autoUnblockResolvedDependents(pmRoot, settings, located.id, author, statusRegistry)),\n ],\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["global"]
|
|
7
|
-
}
|