@unbrained/pm-cli 2026.7.18 → 2026.7.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +17 -0
- package/dist/cli/commands/claim.js +6 -4
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/comments.js +5 -2
- package/dist/cli/commands/comments.js.map +1 -1
- package/dist/cli/commands/context.d.ts +10 -1
- package/dist/cli/commands/context.js +44 -6
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/create.js +15 -4
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/next.js +13 -3
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/update.js +14 -3
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/error-guidance.js +23 -4
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-help.d.ts +11 -0
- package/dist/cli/extension-command-help.js +62 -2
- package/dist/cli/extension-command-help.js.map +1 -1
- package/dist/cli/main.d.ts +1 -0
- package/dist/cli/main.js +16 -11
- package/dist/cli/main.js.map +1 -1
- package/dist/cli-bundle/bundle-manifest.json +326 -350
- package/dist/cli-bundle/chunks/{append-5YF3TO7I.js → append-MBXHNWSX.js} +5 -5
- package/dist/cli-bundle/chunks/append-XUYF7NON.js +11 -0
- package/dist/cli-bundle/chunks/{chunk-BIRYX32V.js → chunk-2UCG5H6B.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-VE6ZSTQW.js → chunk-2XPDCXK5.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-I3INI567.js → chunk-3EZZTFL2.js} +909 -124
- package/dist/cli-bundle/chunks/chunk-3EZZTFL2.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-GLZKZON6.js → chunk-3HSRP6T2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-XWBD6DSR.js → chunk-3KPNOZOH.js} +23 -23
- package/dist/cli-bundle/chunks/{chunk-MR4SHYR4.js → chunk-3QNUDDY2.js} +104 -23
- package/dist/cli-bundle/chunks/chunk-3QNUDDY2.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-SIPOACV5.js → chunk-46Z6FAVP.js} +888 -124
- package/dist/cli-bundle/chunks/chunk-46Z6FAVP.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-HO4DLBNK.js → chunk-4M6RZJXF.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-RXPQ5Q23.js → chunk-4PSJVGRE.js} +11 -11
- package/dist/cli-bundle/chunks/{chunk-ADXDCAKP.js → chunk-5S6IZXK7.js} +146 -32
- package/dist/cli-bundle/chunks/{chunk-IL5SPRMH.js.map → chunk-5S6IZXK7.js.map} +7 -1
- package/dist/cli-bundle/chunks/chunk-66SRNEBK.js +143 -0
- package/dist/cli-bundle/chunks/chunk-66SRNEBK.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-YFE7JHX3.js → chunk-6BNV3G6C.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-43UMFKCK.js → chunk-6V4T4RD3.js} +23 -23
- package/dist/cli-bundle/chunks/chunk-77XFQRTD.js +140 -0
- package/dist/cli-bundle/chunks/chunk-77XFQRTD.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-EHJFUOXL.js → chunk-7B7IHMLH.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-I7DIDUSP.js → chunk-7CHWLT2J.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-L6FVNR7X.js → chunk-A3GAQLBH.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-B57RJHBZ.js → chunk-A4FVWFZY.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-D52ZN3BF.js → chunk-A5EQPNV7.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-TZAE66GQ.js → chunk-AGEBQRBG.js} +15 -15
- package/dist/cli-bundle/chunks/{chunk-WU3KAN6A.js → chunk-AQUNTB7G.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-OGVTB5VO.js → chunk-AR24KW26.js} +237 -36
- package/dist/cli-bundle/chunks/chunk-AR24KW26.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-XWYQ2LT4.js → chunk-BBGR4FKQ.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-HTXXXF45.js → chunk-BDC4TW4B.js} +98 -24
- package/dist/cli-bundle/chunks/chunk-BDC4TW4B.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-2FUOXSRN.js → chunk-BFJP4VYC.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-633PKXLT.js → chunk-BZKE2O5V.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-XPUTSGJU.js → chunk-CZA2DXCV.js} +230 -36
- package/dist/cli-bundle/chunks/chunk-CZA2DXCV.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KX62NMZC.js → chunk-D35WYXWC.js} +626 -5
- package/dist/cli-bundle/chunks/chunk-D35WYXWC.js.map +1 -0
- package/dist/cli-bundle/chunks/chunk-DOASIOQR.js +289 -0
- package/dist/cli-bundle/chunks/chunk-DOASIOQR.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-L337QKWJ.js → chunk-DUDLSQFG.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-BVLOMU6O.js → chunk-E7KBMWEF.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-3QDR6ZLU.js → chunk-EAV3P54W.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-3QDR6ZLU.js.map → chunk-EAV3P54W.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-WQXRZMFN.js → chunk-EEECAV5M.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-35FHWD4C.js → chunk-EI3UIMZM.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-RGMWJLXF.js → chunk-EVAN5VJA.js} +8 -5
- package/dist/cli-bundle/chunks/{chunk-RGMWJLXF.js.map → chunk-EVAN5VJA.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-PT7MCCGD.js → chunk-FIUTBFC6.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-7H5NNCJ5.js → chunk-FQF6VVPH.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-6DYOZS6C.js → chunk-FQO5THHM.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-5HGZKQUL.js → chunk-FQODDTE7.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-67RO3H4N.js → chunk-G33XIMRT.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-D53RTYVI.js → chunk-GFZB5CLP.js} +20 -10
- package/dist/cli-bundle/chunks/chunk-GFZB5CLP.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-QWBKN3QC.js → chunk-GKCEEXMA.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-DG2EQRIH.js → chunk-GRDK25BN.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-FXFCFL73.js → chunk-H3YKUVDR.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-IL5SPRMH.js → chunk-IEMXESIS.js} +123 -16
- package/dist/cli-bundle/chunks/chunk-IEMXESIS.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ARGDWQ4J.js → chunk-IGBBTPM5.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-QPGQNLPI.js → chunk-IR3GOO6E.js} +3842 -4109
- package/dist/cli-bundle/chunks/chunk-IR3GOO6E.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-FY4RLHSC.js → chunk-IRJ6F23W.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-66MKH7SZ.js → chunk-IXG5CMBR.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-F3VC3GOV.js → chunk-JBW2S2C6.js} +2090 -253
- package/dist/cli-bundle/chunks/chunk-JBW2S2C6.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-7UCY6DR5.js → chunk-JPWUZOMR.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-FVNWHUME.js → chunk-K2L6FZBX.js} +8 -8
- package/dist/cli-bundle/chunks/chunk-KGPLSHJD.js +286 -0
- package/dist/cli-bundle/chunks/chunk-KGPLSHJD.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-YQEZWI3R.js → chunk-KZ5AC6B5.js} +5 -3
- package/dist/cli-bundle/chunks/chunk-KZ5AC6B5.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-X2MGQMZO.js → chunk-LT5UWU7H.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KH6QAHME.js → chunk-M4B4RK4J.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-QRZNCRNA.js → chunk-MI3346YW.js} +377 -240
- package/dist/cli-bundle/chunks/chunk-MI3346YW.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-2XOSFSTH.js → chunk-MQOSMBWV.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-YIIIAKCE.js → chunk-MRXAHR4B.js} +28 -22
- package/dist/cli-bundle/chunks/chunk-MRXAHR4B.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-7R6UIHYY.js → chunk-N2TEEOXJ.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-NTRQLE2R.js → chunk-N7FCFJ76.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-37DRDP2B.js → chunk-NPEYH6CE.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-GKPCTQYG.js → chunk-NTS2RKHN.js} +3942 -4216
- package/dist/cli-bundle/chunks/chunk-NTS2RKHN.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-6VHUGVNP.js → chunk-ODEIDKGW.js} +2062 -246
- package/dist/cli-bundle/chunks/chunk-ODEIDKGW.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-2CXL335K.js → chunk-OK7VSX3N.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-NNANAWFH.js → chunk-OKPZDH43.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-G6MYGULG.js → chunk-OKWJUL6F.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-HPAYDSR2.js → chunk-P24ZU5QV.js} +27 -21
- package/dist/cli-bundle/chunks/chunk-P24ZU5QV.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-TGBTLGPX.js → chunk-Q4PSG2GV.js} +13 -4
- package/dist/cli-bundle/chunks/{chunk-TGBTLGPX.js.map → chunk-Q4PSG2GV.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-5UKQLQM2.js → chunk-Q5NHJ6RO.js} +6 -4
- package/dist/cli-bundle/chunks/chunk-Q5NHJ6RO.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-D5XHO4Q7.js → chunk-Q6JPYR7I.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-P22HGFFI.js → chunk-QFG4MB7P.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-P22HGFFI.js.map → chunk-QFG4MB7P.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-IE5KRAKN.js → chunk-QQ77W23U.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-M7MVOKVV.js → chunk-QYGK2XQ3.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-646MQXFW.js → chunk-RLLOZAM2.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-646MQXFW.js.map → chunk-RLLOZAM2.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-X5YCTFKT.js → chunk-RWAIRGBC.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-W5E2UUSH.js → chunk-RX53WHFI.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-R5XTTZSJ.js → chunk-SBW7EQC4.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-TM5CIO3F.js → chunk-SGJB6PXA.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-DDFGYUCQ.js → chunk-STBCBDKF.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-EX7OQT3Y.js → chunk-SUNZKVAH.js} +10 -10
- package/dist/cli-bundle/chunks/{chunk-EX7OQT3Y.js.map → chunk-SUNZKVAH.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-FHOBCGQO.js → chunk-SVAWG7EE.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-6O44IN44.js → chunk-T6MOTLOJ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-HSYV4ZYT.js → chunk-TELI67UP.js} +9 -6
- package/dist/cli-bundle/chunks/{chunk-HSYV4ZYT.js.map → chunk-TELI67UP.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-EWIT5WIC.js → chunk-U6RYD446.js} +11 -11
- package/dist/cli-bundle/chunks/{chunk-E4FXM2XB.js → chunk-UE7LK3RE.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-N33FD2UI.js → chunk-UNNCT5QY.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-2IPNL3DR.js → chunk-UOIFZ66L.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-LSOWTLEM.js → chunk-UU6EP25G.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-HYTOJW2Q.js → chunk-UW6HCMP2.js} +15 -15
- package/dist/cli-bundle/chunks/{chunk-47HXN6RX.js → chunk-UWAQI3B7.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-YKFHF37B.js → chunk-V4QHAMI5.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-VAHZIPWS.js → chunk-VA3H7VVC.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-XC2HEEOV.js → chunk-VFA5EIEN.js} +21 -11
- package/dist/cli-bundle/chunks/chunk-VFA5EIEN.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-TLWJP5BF.js → chunk-VQOG2ETB.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-H5IOT54C.js → chunk-VSQE43NO.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-BDA35QG5.js → chunk-W6IEJXNC.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-WACRQ26A.js → chunk-WCBB6VI3.js} +637 -9
- package/dist/cli-bundle/chunks/chunk-WCBB6VI3.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-OWP6QFBV.js → chunk-XDWXPG2E.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-CKX4WOPC.js → chunk-XKVHL3MB.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-WL3SS45P.js → chunk-XVB6BATY.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-NVZ6NVHJ.js → chunk-XXWDEQ6O.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-ILVOOAT4.js → chunk-Y2VSGFT4.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-NCVT6XEL.js → chunk-YG56M3NE.js} +11 -11
- package/dist/cli-bundle/chunks/{chunk-AFGKSHAM.js → chunk-YGEA4CLH.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-AXRT7K5V.js → chunk-YIC5NGXF.js} +11 -11
- package/dist/cli-bundle/chunks/{chunk-DHNG452T.js → chunk-ZF52NVRT.js} +396 -245
- package/dist/cli-bundle/chunks/chunk-ZF52NVRT.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-XXLXJL7V.js → chunk-ZUCBPXNA.js} +4 -4
- package/dist/cli-bundle/chunks/{close-X3CF6FQP.js → close-7NWA3GLA.js} +5 -5
- package/dist/cli-bundle/chunks/close-ZZCDDWJT.js +12 -0
- package/dist/cli-bundle/chunks/close-many-QCZHFCON.js +23 -0
- package/dist/cli-bundle/chunks/{close-many-J7A5EHOQ.js → close-many-YALQ7AXS.js} +14 -14
- package/dist/cli-bundle/chunks/comments-FMQNYPSZ.js +13 -0
- package/dist/cli-bundle/chunks/{comments-TMHMALA5.js → comments-SQIQ5WYR.js} +7 -7
- package/dist/cli-bundle/chunks/copy-GI3RCVZP.js +9 -0
- package/dist/cli-bundle/chunks/{copy-FWQA5OU4.js → copy-YDAMENCP.js} +4 -4
- package/dist/cli-bundle/chunks/{create-AQ5SIGZC.js → create-JSL6CXU3.js} +11 -9
- package/dist/cli-bundle/chunks/create-LXMLYJNM.js +29 -0
- package/dist/cli-bundle/chunks/delete-5DFAXJNI.js +10 -0
- package/dist/cli-bundle/chunks/{delete-YYYFOSEA.js → delete-IGVOZEU2.js} +4 -4
- package/dist/cli-bundle/chunks/{deps-NIIKXLPB.js → deps-BQAXUQAK.js} +6 -6
- package/dist/cli-bundle/chunks/{deps-MQ4ZIGZB.js → deps-CBPPSS6J.js} +6 -6
- package/dist/cli-bundle/chunks/docs-KCWPLQOV.js +14 -0
- package/dist/cli-bundle/chunks/{docs-53NUGMIQ.js → docs-NS2AZWCN.js} +7 -7
- package/dist/cli-bundle/chunks/{files-3PXGXYDB.js → files-PVWEPT5J.js} +7 -7
- package/dist/cli-bundle/chunks/{files-EGLKHD7O.js → files-XUUBQ76I.js} +7 -7
- package/dist/cli-bundle/chunks/focus-3EJVFI3D.js +10 -0
- package/dist/cli-bundle/chunks/{focus-SRPASFTN.js → focus-DHBHKK3E.js} +5 -5
- package/dist/cli-bundle/chunks/{history-compact-G4DULDCX.js → history-compact-3TNPYVFG.js} +6 -6
- package/dist/cli-bundle/chunks/history-compact-JHYVDYLW.js +16 -0
- package/dist/cli-bundle/chunks/{history-redact-IUSJ6X3E.js → history-redact-ELRL73XN.js} +4 -4
- package/dist/cli-bundle/chunks/{history-redact-THHGRQXV.js → history-redact-KKFDICCF.js} +4 -4
- package/dist/cli-bundle/chunks/{history-repair-LUQWRS7X.js → history-repair-J7WKZFAG.js} +6 -6
- package/dist/cli-bundle/chunks/history-repair-REMI7DDI.js +16 -0
- package/dist/cli-bundle/chunks/learnings-O6V5WDCV.js +13 -0
- package/dist/cli-bundle/chunks/{learnings-2MRNBFJF.js → learnings-X4D6JCCG.js} +7 -7
- package/dist/cli-bundle/chunks/{notes-73JWKWUD.js → notes-UQC6VS6N.js} +7 -7
- package/dist/cli-bundle/chunks/notes-ZSZREWZA.js +13 -0
- package/dist/cli-bundle/chunks/{plan-AZPMCG37.js → plan-5GKRBJJO.js} +12 -10
- package/dist/cli-bundle/chunks/plan-EZW2YDDY.js +26 -0
- package/dist/cli-bundle/chunks/{profile-AVCIIZID.js → profile-5PQAPCLF.js} +10 -10
- package/dist/cli-bundle/chunks/{profile-LFYO3HHX.js → profile-CW4BD3FO.js} +10 -10
- package/dist/cli-bundle/chunks/{register-list-query-UKMF55FT.js → register-list-query-HTDQE6VI.js} +24 -24
- package/dist/cli-bundle/chunks/{register-list-query-MZUF2EEC.js → register-list-query-PHIPDFP2.js} +24 -24
- package/dist/cli-bundle/chunks/{register-mutation-T6RVNJC4.js → register-mutation-BLEWM5I6.js} +32 -32
- package/dist/cli-bundle/chunks/{register-mutation-2PBW2GEX.js → register-mutation-OTYHR7J6.js} +32 -32
- package/dist/cli-bundle/chunks/{register-operations-KHZYR6MG.js → register-operations-AMCUFYEW.js} +38 -40
- package/dist/cli-bundle/chunks/{register-operations-KHZYR6MG.js.map → register-operations-AMCUFYEW.js.map} +1 -1
- package/dist/cli-bundle/chunks/{register-operations-WPQ2LWZJ.js → register-operations-MRLHOZYR.js} +36 -38
- package/dist/cli-bundle/chunks/{register-operations-WPQ2LWZJ.js.map → register-operations-MRLHOZYR.js.map} +1 -1
- package/dist/cli-bundle/chunks/{register-setup-PGDNOXDQ.js → register-setup-N2FOSWAG.js} +15 -17
- package/dist/cli-bundle/chunks/{register-setup-PGDNOXDQ.js.map → register-setup-N2FOSWAG.js.map} +1 -1
- package/dist/cli-bundle/chunks/{register-setup-TDN7WAO6.js → register-setup-ZVKTDL4G.js} +17 -19
- package/dist/cli-bundle/chunks/{register-setup-TDN7WAO6.js.map → register-setup-ZVKTDL4G.js.map} +1 -1
- package/dist/cli-bundle/chunks/restore-A55MLFAI.js +14 -0
- package/dist/cli-bundle/chunks/{restore-E3PRGDN3.js → restore-HEQAG6EK.js} +6 -6
- package/dist/cli-bundle/chunks/{schema-5JNFQFUW.js → schema-MAXAIHEC.js} +6 -6
- package/dist/cli-bundle/chunks/{schema-TMIW4XZC.js → schema-Q5DAWJ2S.js} +6 -6
- package/dist/cli-bundle/chunks/update-5DTSCWVF.js +23 -0
- package/dist/cli-bundle/chunks/{update-SQYZA3ZW.js → update-DWFXXJKP.js} +15 -13
- package/dist/cli-bundle/chunks/update-many-6T4ZLZS7.js +34 -0
- package/dist/cli-bundle/chunks/update-many-MYRK6VBJ.js +38 -0
- package/dist/cli-bundle/main.js +152 -29
- package/dist/cli-bundle/main.js.map +3 -3
- package/dist/cli-bundle/sdk-runtime.js +72 -75
- package/dist/cli-bundle/sdk-testing.js +8 -8
- package/dist/cli-bundle/sdk.js +288 -642
- package/dist/cli-bundle/sdk.js.map +4 -4
- package/dist/core/extensions/activation-summary.d.ts +2 -0
- package/dist/core/extensions/activation-summary.js +7 -2
- package/dist/core/extensions/activation-summary.js.map +1 -1
- package/dist/core/extensions/capability-usage.d.ts +1 -1
- package/dist/core/extensions/capability-usage.js +5 -2
- package/dist/core/extensions/capability-usage.js.map +1 -1
- package/dist/core/extensions/extension-hook-runtime.js +3 -2
- package/dist/core/extensions/extension-hook-runtime.js.map +1 -1
- package/dist/core/extensions/extension-registries.js +3 -2
- package/dist/core/extensions/extension-registries.js.map +1 -1
- package/dist/core/extensions/extension-types.d.ts +38 -1
- package/dist/core/extensions/extension-types.js +3 -2
- package/dist/core/extensions/extension-types.js.map +1 -1
- package/dist/core/extensions/loader.js +36 -2
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/store/item-store.d.ts +4 -1
- package/dist/core/store/item-store.js +3 -3
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/paths.d.ts +2 -0
- package/dist/core/store/paths.js +26 -3
- package/dist/core/store/paths.js.map +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +1 -1
- package/dist/sdk/compose.d.ts +3 -0
- package/dist/sdk/compose.js +14 -2
- package/dist/sdk/compose.js.map +1 -1
- package/dist/sdk/dependencies.js +3 -3
- package/dist/sdk/dependencies.js.map +1 -1
- package/dist/sdk/extension-command-context.d.ts +10 -0
- package/dist/sdk/extension-command-context.js +30 -0
- package/dist/sdk/extension-command-context.js.map +1 -0
- package/dist/sdk/graph/assembly.js +14 -4
- package/dist/sdk/graph/assembly.js.map +1 -1
- package/dist/sdk/graph/index.d.ts +1 -0
- package/dist/sdk/graph/index.js +3 -2
- package/dist/sdk/graph/index.js.map +1 -1
- package/dist/sdk/graph/mutation-advisory.d.ts +20 -0
- package/dist/sdk/graph/mutation-advisory.js +80 -0
- package/dist/sdk/graph/mutation-advisory.js.map +1 -0
- package/dist/sdk/graph/run.d.ts +5 -1
- package/dist/sdk/graph/run.js +11 -3
- package/dist/sdk/graph/run.js.map +1 -1
- package/dist/sdk/index.d.ts +4 -1
- package/dist/sdk/index.js +5 -2
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/ownership-source.d.ts +2 -0
- package/dist/sdk/ownership-source.js +22 -0
- package/dist/sdk/ownership-source.js.map +1 -0
- package/dist/sdk/relationship-history.d.ts +38 -0
- package/dist/sdk/relationship-history.js +60 -2
- package/dist/sdk/relationship-history.js.map +1 -1
- package/dist/sdk/relationships.js +49 -8
- package/dist/sdk/relationships.js.map +1 -1
- package/dist/sdk/runtime-input.js +3 -2
- package/dist/sdk/runtime-input.js.map +1 -1
- package/dist/sdk/runtime.d.ts +2 -0
- package/dist/sdk/runtime.js +19 -2
- package/dist/sdk/runtime.js.map +1 -1
- package/dist/sdk/tracker-root-discovery.d.ts +6 -0
- package/dist/sdk/tracker-root-discovery.js +10 -0
- package/dist/sdk/tracker-root-discovery.js.map +1 -0
- package/dist/sdk/workspace-transaction.d.ts +83 -0
- package/dist/sdk/workspace-transaction.js +364 -0
- package/dist/sdk/workspace-transaction.js.map +1 -0
- package/docs/AGENT_UX_CONTRACTS.md +41 -0
- package/docs/EXTENSIONS.md +4 -4
- package/docs/README.md +1 -0
- package/docs/SDK.md +102 -1
- package/marketplace.json +2 -2
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/GAP_REPORT.md +31 -0
- package/packages/pm-vcs/README.md +62 -0
- package/packages/pm-vcs/extensions/vcs/index.ts +745 -0
- package/packages/pm-vcs/extensions/vcs/manifest.json +19 -0
- package/packages/pm-vcs/extensions/vcs/package.json +3 -0
- package/packages/pm-vcs/package.json +55 -0
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/dist/cli-bundle/chunks/append-JHO5K6RP.js +0 -11
- package/dist/cli-bundle/chunks/chunk-2BX74BAS.js +0 -125
- package/dist/cli-bundle/chunks/chunk-2BX74BAS.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-3CUQZNQ6.js +0 -672
- package/dist/cli-bundle/chunks/chunk-3CUQZNQ6.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-5UKQLQM2.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-6VHUGVNP.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-74FKFFXO.js +0 -172
- package/dist/cli-bundle/chunks/chunk-74FKFFXO.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ADXDCAKP.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-BAP7G3N2.js +0 -178
- package/dist/cli-bundle/chunks/chunk-BAP7G3N2.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-D53RTYVI.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-DHNG452T.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-EY7ZE3TG.js +0 -1831
- package/dist/cli-bundle/chunks/chunk-EY7ZE3TG.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-F3VC3GOV.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-FL4D53ND.js +0 -162
- package/dist/cli-bundle/chunks/chunk-FL4D53ND.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-GKPCTQYG.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-HPAYDSR2.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-HTXXXF45.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-I3INI567.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-KX62NMZC.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-L5BTTDU5.js +0 -662
- package/dist/cli-bundle/chunks/chunk-L5BTTDU5.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-MR4SHYR4.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-OGVTB5VO.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-QPGQNLPI.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-QRZNCRNA.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-RC4UOUXA.js +0 -122
- package/dist/cli-bundle/chunks/chunk-RC4UOUXA.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-RTBX3C4C.js +0 -1841
- package/dist/cli-bundle/chunks/chunk-RTBX3C4C.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-SIPOACV5.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-WACRQ26A.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-XC2HEEOV.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-XPUTSGJU.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-YIIIAKCE.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-YJSURTBB.js +0 -175
- package/dist/cli-bundle/chunks/chunk-YJSURTBB.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-YQEZWI3R.js.map +0 -7
- package/dist/cli-bundle/chunks/close-GPD7DTJV.js +0 -12
- package/dist/cli-bundle/chunks/close-many-NQLYGPYW.js +0 -23
- package/dist/cli-bundle/chunks/comments-2AOZQ5D2.js +0 -13
- package/dist/cli-bundle/chunks/copy-N3LCQBMC.js +0 -9
- package/dist/cli-bundle/chunks/create-KOGQ3JKD.js +0 -27
- package/dist/cli-bundle/chunks/delete-6G3MBZ6S.js +0 -10
- package/dist/cli-bundle/chunks/docs-OWRGDMNY.js +0 -14
- package/dist/cli-bundle/chunks/focus-KZLIA6WS.js +0 -10
- package/dist/cli-bundle/chunks/history-compact-HHIUOMZ7.js +0 -16
- package/dist/cli-bundle/chunks/history-repair-KG7SWXI6.js +0 -16
- package/dist/cli-bundle/chunks/learnings-ZVHSALJY.js +0 -13
- package/dist/cli-bundle/chunks/notes-BAKUL5DJ.js +0 -13
- package/dist/cli-bundle/chunks/plan-LEAGLPGP.js +0 -24
- package/dist/cli-bundle/chunks/restore-KIUYTAEJ.js +0 -14
- package/dist/cli-bundle/chunks/update-XZJYS5X7.js +0 -21
- package/dist/cli-bundle/chunks/update-many-R24B3GBK.js +0 -36
- package/dist/cli-bundle/chunks/update-many-WQ3R3J6N.js +0 -32
- /package/dist/cli-bundle/chunks/{append-5YF3TO7I.js.map → append-MBXHNWSX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-JHO5K6RP.js.map → append-XUYF7NON.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BIRYX32V.js.map → chunk-2UCG5H6B.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VE6ZSTQW.js.map → chunk-2XPDCXK5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GLZKZON6.js.map → chunk-3HSRP6T2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XWBD6DSR.js.map → chunk-3KPNOZOH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HO4DLBNK.js.map → chunk-4M6RZJXF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RXPQ5Q23.js.map → chunk-4PSJVGRE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YFE7JHX3.js.map → chunk-6BNV3G6C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-43UMFKCK.js.map → chunk-6V4T4RD3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EHJFUOXL.js.map → chunk-7B7IHMLH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-I7DIDUSP.js.map → chunk-7CHWLT2J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-L6FVNR7X.js.map → chunk-A3GAQLBH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-B57RJHBZ.js.map → chunk-A4FVWFZY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-D52ZN3BF.js.map → chunk-A5EQPNV7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TZAE66GQ.js.map → chunk-AGEBQRBG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WU3KAN6A.js.map → chunk-AQUNTB7G.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XWYQ2LT4.js.map → chunk-BBGR4FKQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2FUOXSRN.js.map → chunk-BFJP4VYC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-633PKXLT.js.map → chunk-BZKE2O5V.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-L337QKWJ.js.map → chunk-DUDLSQFG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BVLOMU6O.js.map → chunk-E7KBMWEF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WQXRZMFN.js.map → chunk-EEECAV5M.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-35FHWD4C.js.map → chunk-EI3UIMZM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PT7MCCGD.js.map → chunk-FIUTBFC6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7H5NNCJ5.js.map → chunk-FQF6VVPH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6DYOZS6C.js.map → chunk-FQO5THHM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5HGZKQUL.js.map → chunk-FQODDTE7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-67RO3H4N.js.map → chunk-G33XIMRT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QWBKN3QC.js.map → chunk-GKCEEXMA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DG2EQRIH.js.map → chunk-GRDK25BN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FXFCFL73.js.map → chunk-H3YKUVDR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ARGDWQ4J.js.map → chunk-IGBBTPM5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FY4RLHSC.js.map → chunk-IRJ6F23W.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-66MKH7SZ.js.map → chunk-IXG5CMBR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7UCY6DR5.js.map → chunk-JPWUZOMR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FVNWHUME.js.map → chunk-K2L6FZBX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-X2MGQMZO.js.map → chunk-LT5UWU7H.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KH6QAHME.js.map → chunk-M4B4RK4J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2XOSFSTH.js.map → chunk-MQOSMBWV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7R6UIHYY.js.map → chunk-N2TEEOXJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NTRQLE2R.js.map → chunk-N7FCFJ76.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-37DRDP2B.js.map → chunk-NPEYH6CE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2CXL335K.js.map → chunk-OK7VSX3N.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NNANAWFH.js.map → chunk-OKPZDH43.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-G6MYGULG.js.map → chunk-OKWJUL6F.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-D5XHO4Q7.js.map → chunk-Q6JPYR7I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IE5KRAKN.js.map → chunk-QQ77W23U.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-M7MVOKVV.js.map → chunk-QYGK2XQ3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-X5YCTFKT.js.map → chunk-RWAIRGBC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-W5E2UUSH.js.map → chunk-RX53WHFI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-R5XTTZSJ.js.map → chunk-SBW7EQC4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TM5CIO3F.js.map → chunk-SGJB6PXA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DDFGYUCQ.js.map → chunk-STBCBDKF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FHOBCGQO.js.map → chunk-SVAWG7EE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6O44IN44.js.map → chunk-T6MOTLOJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EWIT5WIC.js.map → chunk-U6RYD446.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-E4FXM2XB.js.map → chunk-UE7LK3RE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-N33FD2UI.js.map → chunk-UNNCT5QY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2IPNL3DR.js.map → chunk-UOIFZ66L.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-LSOWTLEM.js.map → chunk-UU6EP25G.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HYTOJW2Q.js.map → chunk-UW6HCMP2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-47HXN6RX.js.map → chunk-UWAQI3B7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YKFHF37B.js.map → chunk-V4QHAMI5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VAHZIPWS.js.map → chunk-VA3H7VVC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TLWJP5BF.js.map → chunk-VQOG2ETB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-H5IOT54C.js.map → chunk-VSQE43NO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BDA35QG5.js.map → chunk-W6IEJXNC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OWP6QFBV.js.map → chunk-XDWXPG2E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CKX4WOPC.js.map → chunk-XKVHL3MB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WL3SS45P.js.map → chunk-XVB6BATY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NVZ6NVHJ.js.map → chunk-XXWDEQ6O.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ILVOOAT4.js.map → chunk-Y2VSGFT4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NCVT6XEL.js.map → chunk-YG56M3NE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AFGKSHAM.js.map → chunk-YGEA4CLH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AXRT7K5V.js.map → chunk-YIC5NGXF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XXLXJL7V.js.map → chunk-ZUCBPXNA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-X3CF6FQP.js.map → close-7NWA3GLA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-GPD7DTJV.js.map → close-ZZCDDWJT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-NQLYGPYW.js.map → close-many-QCZHFCON.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-J7A5EHOQ.js.map → close-many-YALQ7AXS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-2AOZQ5D2.js.map → comments-FMQNYPSZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-TMHMALA5.js.map → comments-SQIQ5WYR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-N3LCQBMC.js.map → copy-GI3RCVZP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-FWQA5OU4.js.map → copy-YDAMENCP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-AQ5SIGZC.js.map → create-JSL6CXU3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-KOGQ3JKD.js.map → create-LXMLYJNM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-6G3MBZ6S.js.map → delete-5DFAXJNI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-YYYFOSEA.js.map → delete-IGVOZEU2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-NIIKXLPB.js.map → deps-BQAXUQAK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-MQ4ZIGZB.js.map → deps-CBPPSS6J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-OWRGDMNY.js.map → docs-KCWPLQOV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-53NUGMIQ.js.map → docs-NS2AZWCN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-3PXGXYDB.js.map → files-PVWEPT5J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-EGLKHD7O.js.map → files-XUUBQ76I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-KZLIA6WS.js.map → focus-3EJVFI3D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-SRPASFTN.js.map → focus-DHBHKK3E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-G4DULDCX.js.map → history-compact-3TNPYVFG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-HHIUOMZ7.js.map → history-compact-JHYVDYLW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-IUSJ6X3E.js.map → history-redact-ELRL73XN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-THHGRQXV.js.map → history-redact-KKFDICCF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-LUQWRS7X.js.map → history-repair-J7WKZFAG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-KG7SWXI6.js.map → history-repair-REMI7DDI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-ZVHSALJY.js.map → learnings-O6V5WDCV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-2MRNBFJF.js.map → learnings-X4D6JCCG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-73JWKWUD.js.map → notes-UQC6VS6N.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-BAKUL5DJ.js.map → notes-ZSZREWZA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-AZPMCG37.js.map → plan-5GKRBJJO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-LEAGLPGP.js.map → plan-EZW2YDDY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-AVCIIZID.js.map → profile-5PQAPCLF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-LFYO3HHX.js.map → profile-CW4BD3FO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-UKMF55FT.js.map → register-list-query-HTDQE6VI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-MZUF2EEC.js.map → register-list-query-PHIPDFP2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-T6RVNJC4.js.map → register-mutation-BLEWM5I6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-2PBW2GEX.js.map → register-mutation-OTYHR7J6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-KIUYTAEJ.js.map → restore-A55MLFAI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-E3PRGDN3.js.map → restore-HEQAG6EK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-5JNFQFUW.js.map → schema-MAXAIHEC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-TMIW4XZC.js.map → schema-Q5DAWJ2S.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-XZJYS5X7.js.map → update-5DTSCWVF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-SQYZA3ZW.js.map → update-DWFXXJKP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-WQ3R3J6N.js.map → update-many-6T4ZLZS7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-R24B3GBK.js.map → update-many-MYRK6VBJ.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../cli/commands/update.ts"],"sourcesContent":["/**\n * @module cli/commands/update\n *\n * Implements the pm update command surface and its agent-facing runtime behavior.\n */\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport {\n COMMON_MUTATION_COMMAND_OPTION_KEYS,\n canonicalizeCommandOptionKey,\n commandOptionFlagLabel,\n resolveItemTypeRegistry,\n resolveCommandOptionPolicyState,\n resolveTypeDefinition,\n resolveTypeName,\n validateTypeOptions,\n} from \"../../core/item/type-registry.js\";\nimport { normalizeItemId } from \"../../core/item/id.js\";\nimport { toItemRecord } from \"../../core/item/item-record.js\";\nimport { buildInvalidTypeError } from \"../../core/schema/item-types-file.js\";\nimport {\n assertParentReferenceIsNotSelf,\n normalizeParentReferenceValue,\n validateMissingParentReference,\n} from \"../../core/item/parent-reference-policy.js\";\nimport { validateSprintOrReleaseValue } from \"../../core/item/sprint-release-format.js\";\nimport {\n applyTagRemovals,\n assertNoUnknownCsvKeys,\n createStdinTokenResolver,\n looksLikeGenericKeyValueEntry,\n mergeAdditiveTags,\n parseCsvKv,\n parseOptionalNonNegativeInteger,\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 {\n buildItemNotFoundError,\n locateItem,\n mutateItem,\n readLocatedItem,\n} from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport { runClose } from \"./close.js\";\nimport {\n normalizeRiskInput,\n normalizeSeverityInput,\n parseConfidenceInput,\n parseRegressionInput,\n} from \"./metadata-normalizers.js\";\nimport {\n applyLegacyNoneCollectionNormalizers,\n createLegacyNoneCollectionNormalizers,\n assertNoLegacyNoneToken,\n assertNoLegacyNoneTokens,\n isLegacyNoneToken,\n} from \"./legacy-none-tokens.js\";\nimport { ensureEnumValue as ensureEnum } from \"./recurrence-parsers.js\";\nimport {\n parseEventEntries,\n parseReminderEntries,\n parseTypeOptionEntries,\n} from \"./repeatable-metadata-parsers.js\";\nimport { assertValidBareDependencyFlagValue } from \"../../sdk/dependency-flag-validation.js\";\nimport type {\n Comment,\n Dependency,\n GovernanceWorkflowEnforcement,\n ItemFormat,\n ItemDocument,\n ItemMetadata,\n ItemStatus,\n LinkedDoc,\n LinkedFile,\n LinkedTest,\n LogNote,\n} from \"../../types/index.js\";\nimport {\n DEPENDENCY_KIND_VALUES,\n ISSUE_SEVERITY_VALUES,\n RISK_VALUES,\n} from \"../../types/index.js\";\nimport {\n parseDocs,\n parseFiles,\n parseLogSeed,\n parseTests,\n requireStringOption,\n} from \"./create.js\";\nimport {\n COMMON_UNSET_FIELD_DEFINITIONS_AFTER_CLOSE_REASON_BEFORE_AUTHOR,\n COMMON_UNSET_FIELD_DEFINITIONS_AFTER_AUTHOR,\n COMMON_UNSET_FIELD_DEFINITIONS_BEFORE_CLOSE_REASON,\n parseCommandUnsetTargets,\n resolveRuntimeUnsetFieldDefinition,\n type CommandUnsetFieldDefinition,\n} from \"./shared-unset-fields.js\";\nimport type {\n MutationMetadataCommandOptions,\n SharedLinkedResourceClearOptions,\n SharedLinkedResourceOptions,\n} from \"./mutation-command-options.js\";\n\n/** Documents the update command options payload exchanged by command, SDK, and package integrations. */\nexport interface UpdateCommandOptions\n extends\n MutationMetadataCommandOptions,\n SharedLinkedResourceOptions,\n SharedLinkedResourceClearOptions {\n /** Value that configures or reports title for this contract. */\n title?: string;\n /** Value that configures or reports description for this contract. */\n description?: string;\n /** Value that configures or reports body for this contract. */\n body?: string;\n /** Lifecycle state reported for status. */\n status?: string;\n /** Value that configures or reports close reason for this contract. */\n closeReason?: string;\n /** Value that configures or reports priority for this contract. */\n priority?: string;\n /** Schema type that determines the shape and validation rules for this value. */\n type?: string;\n /** Value that configures or reports tags for this contract. */\n tags?: string;\n /** Value that configures or reports add tags for this contract. */\n addTags?: string[];\n /** Value that configures or reports remove tags for this contract. */\n removeTags?: string[];\n /** Value that configures or reports force for this contract. */\n force?: boolean;\n /** Value that configures or reports dep remove for this contract. */\n depRemove?: string[];\n /** Value that configures or reports replace deps for this contract. */\n replaceDeps?: boolean;\n /** Value that configures or reports replace tests for this contract. */\n replaceTests?: boolean;\n /** Value that configures or reports runtime field commands for this contract. */\n runtimeFieldCommands?: Array<\"update\" | \"update_many\">;\n [key: string]: unknown;\n}\n\n/** Documents the update result payload exchanged by command, SDK, and package integrations. */\nexport interface UpdateResult {\n /** Value that configures or reports item for this contract. */\n item: Record<string, unknown>;\n /** Value that configures or reports changed fields for this contract. */\n changed_fields: string[];\n /** Value that configures or reports warnings for this contract. */\n warnings: string[];\n}\n\ninterface UpdateUnsetFieldDefinition {\n optionKey: string;\n metadataKey: string;\n}\n\nconst UPDATE_UNSET_FIELD_DEFINITIONS: readonly CommandUnsetFieldDefinition[] = [\n ...COMMON_UNSET_FIELD_DEFINITIONS_BEFORE_CLOSE_REASON,\n {\n canonical: \"close-reason\",\n aliases: [\"close_reason\", \"close-reason\"],\n optionKey: \"closeReason\",\n metadataKey: \"close_reason\",\n },\n ...COMMON_UNSET_FIELD_DEFINITIONS_AFTER_CLOSE_REASON_BEFORE_AUTHOR,\n ...COMMON_UNSET_FIELD_DEFINITIONS_AFTER_AUTHOR,\n];\n\nconst UPDATE_UNSET_ALIAS_MAP: Map<string, UpdateUnsetFieldDefinition> = (() => {\n const map = new Map<string, UpdateUnsetFieldDefinition>();\n for (const definition of UPDATE_UNSET_FIELD_DEFINITIONS) {\n for (const alias of definition.aliases) {\n map.set(alias, {\n optionKey: definition.optionKey,\n metadataKey: definition.metadataKey,\n });\n }\n }\n return map;\n})();\n\nconst UPDATE_OPTION_KEY_TO_UNSET_CANONICAL = new Map<string, string>(\n UPDATE_UNSET_FIELD_DEFINITIONS.map((definition) => [\n definition.optionKey,\n definition.canonical,\n ]),\n);\n\nconst UPDATE_UNSET_SUPPORTED_CANONICAL_FIELDS =\n UPDATE_UNSET_FIELD_DEFINITIONS.map((definition) => definition.canonical)\n .sort((left, right) => left.localeCompare(right))\n .join(\", \");\n\nconst OWNERSHIP_BYPASS_DISALLOWED_UNSET_ITEM_METADATA_KEYS = new Set<string>([\n \"close_reason\",\n \"assignee\",\n \"parent\",\n \"blocked_by\",\n \"blocked_reason\",\n \"unblock_note\",\n \"dependencies\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"files\",\n \"tests\",\n \"docs\",\n \"reminders\",\n \"events\",\n]);\n\nfunction toAuthor(\n candidate: string | undefined,\n defaultAuthor: string,\n): string {\n const resolved = candidate ?? process.env.PM_AUTHOR ?? defaultAuthor;\n const trimmed = resolved.trim();\n return trimmed || \"unknown\";\n}\n\nconst UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS =\n createLegacyNoneCollectionNormalizers<UpdateCommandOptions>({\n depDisableFlagKey: \"replaceDeps\",\n testDisableFlagKey: \"replaceTests\",\n });\n\nfunction normalizeLegacyNoneUpdateOptions(\n options: UpdateCommandOptions,\n): UpdateCommandOptions {\n const normalized: UpdateCommandOptions = {\n ...options,\n unset: options.unset ? [...options.unset] : undefined,\n };\n /* c8 ignore start -- unset dedupe helper branch permutations are covered by legacy option compatibility suites. */\n const appendUnsetTarget = (value: string): void => {\n const current = normalized.unset ? [...normalized.unset] : [];\n if (!current.includes(value)) {\n current.push(value);\n }\n normalized.unset = current;\n };\n /* c8 ignore stop */\n\n const scalarOptionKeys = new Set<string>([\n ...UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.keys(),\n \"rank\",\n ]);\n for (const optionKey of scalarOptionKeys) {\n const candidate = normalized[optionKey];\n if (typeof candidate !== \"string\" || !isLegacyNoneToken(candidate)) {\n continue;\n }\n /* c8 ignore start -- rank alias canonicalization is exercised in legacy-option compatibility tests. */\n const canonicalUnset =\n optionKey === \"rank\"\n ? \"order\"\n : (UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey) ?? optionKey);\n appendUnsetTarget(canonicalUnset);\n normalized[optionKey] = undefined;\n /* c8 ignore stop */\n }\n\n return applyLegacyNoneCollectionNormalizers(\n normalized,\n UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS,\n );\n}\n\nfunction parseUpdateUnsetTargets(\n raw: string[] | undefined,\n runtimeFieldRegistry?: RuntimeFieldRegistry,\n extensionFieldNames: readonly string[] = [],\n): { metadataKeys: Set<string>; optionKeys: Set<string> } {\n return parseCommandUnsetTargets({\n raw,\n supportedFields: UPDATE_UNSET_SUPPORTED_CANONICAL_FIELDS,\n resolveDefinition: (trimmed) => {\n const extensionFieldName = extensionFieldNames.find((fieldName) => {\n const normalizedFieldName = fieldName.toLowerCase();\n return (\n normalizedFieldName === trimmed ||\n normalizedFieldName.replaceAll(\"_\", \"-\") === trimmed ||\n normalizedFieldName.replaceAll(\"-\", \"_\") === trimmed\n );\n });\n const definition =\n UPDATE_UNSET_ALIAS_MAP.get(trimmed) ??\n resolveRuntimeUnsetFieldDefinition(\n trimmed,\n \"update\",\n runtimeFieldRegistry,\n ) ??\n (extensionFieldName\n ? { optionKey: \"field\", metadataKey: extensionFieldName }\n : undefined);\n return definition;\n },\n });\n}\n\n// Restricted append-style flags have dedicated commands with their own\n// ownership semantics; map each one to its exact replacement invocation so\n// scope errors tell the agent how to retry instead of dead-ending. The\n// evidence append flags are allowed by the metadata ownership bypass, but still used by\n// narrower scopes such as the dependency ownership bypass.\nconst OWNERSHIP_BYPASS_RESTRICTED_FLAG_REPLACEMENTS: ReadonlyMap<\n string,\n (id: string) => string\n> = new Map([\n [\n \"--comment\",\n (id: string) => `pm comments ${id} --add \"<text>\" --force`,\n ],\n [\n \"--file\",\n (id: string) =>\n `pm files ${id} --add \"path=<path>,scope=<scope>,note=<note>\" --force`,\n ],\n [\n \"--doc\",\n (id: string) =>\n `pm docs ${id} --add \"path=<path>,scope=<scope>,note=<note>\" --force`,\n ],\n]);\n\nfunction buildOwnershipBypassRestrictedOptionsError(params: {\n id: string;\n code: string;\n message: string;\n required: string;\n why: string;\n disallowedFlags: string[];\n}): PmCliError {\n // Only surface replacement commands for restricted flags the caller actually\n // passed, so the guidance is an exact retry path.\n const replacementCommands = params.disallowedFlags.flatMap((flag) => {\n const replacement = OWNERSHIP_BYPASS_RESTRICTED_FLAG_REPLACEMENTS.get(flag);\n return replacement ? [replacement(params.id)] : [];\n });\n const replacementSteps = params.disallowedFlags.flatMap((flag) => {\n const replacement = OWNERSHIP_BYPASS_RESTRICTED_FLAG_REPLACEMENTS.get(flag);\n return replacement\n ? [`Replace ${flag} with: ${replacement(params.id)}`]\n : [];\n });\n return new PmCliError(params.message, EXIT_CODE.USAGE, {\n code: params.code,\n required: params.required,\n why: params.why,\n ...(replacementCommands.length > 0\n ? { examples: replacementCommands }\n : {}),\n nextSteps: [\n `Re-run without: ${params.disallowedFlags.join(\", \")}`,\n ...replacementSteps,\n ],\n });\n}\n\nfunction enforceOwnershipBypassScope(\n id: string,\n options: UpdateCommandOptions,\n clearItemMetadataKeys: Set<string>,\n): void {\n const ownershipMetadataBypass = options.ownershipMetadataBypass === true;\n const ownershipDependencyBypass = options.ownershipDependencyBypass === true;\n if (!ownershipMetadataBypass && !ownershipDependencyBypass) {\n return;\n }\n if (ownershipMetadataBypass && ownershipDependencyBypass) {\n throw new PmCliError(\n \"Choose only one package-provided ownership bypass mode.\",\n EXIT_CODE.USAGE,\n );\n }\n const pushIf = (condition: boolean, flag: string, list: string[]): void => {\n if (condition) {\n list.push(flag);\n }\n };\n if (ownershipDependencyBypass) {\n const disallowedFlags: string[] = [];\n pushIf(options.title !== undefined, \"--title\", disallowedFlags);\n pushIf(options.description !== undefined, \"--description\", disallowedFlags);\n pushIf(options.body !== undefined, \"--body\", disallowedFlags);\n pushIf(options.status !== undefined, \"--status\", disallowedFlags);\n pushIf(\n options.closeReason !== undefined,\n \"--close-reason\",\n disallowedFlags,\n );\n pushIf(options.priority !== undefined, \"--priority\", disallowedFlags);\n pushIf(options.type !== undefined, \"--type\", disallowedFlags);\n pushIf(options.tags !== undefined, \"--tags\", disallowedFlags);\n pushIf(\n Array.isArray(options.addTags) && options.addTags.length > 0,\n \"--add-tags\",\n disallowedFlags,\n );\n pushIf(\n Array.isArray(options.removeTags) && options.removeTags.length > 0,\n \"--remove-tags\",\n disallowedFlags,\n );\n pushIf(options.deadline !== undefined, \"--deadline\", disallowedFlags);\n pushIf(\n options.estimatedMinutes !== undefined,\n \"--estimate\",\n disallowedFlags,\n );\n pushIf(\n options.acceptanceCriteria !== undefined,\n \"--acceptance-criteria\",\n disallowedFlags,\n );\n pushIf(\n options.definitionOfReady !== undefined,\n \"--definition-of-ready\",\n disallowedFlags,\n );\n pushIf(\n options.order !== undefined || options.rank !== undefined,\n \"--order/--rank\",\n disallowedFlags,\n );\n pushIf(options.goal !== undefined, \"--goal\", disallowedFlags);\n pushIf(options.objective !== undefined, \"--objective\", disallowedFlags);\n pushIf(options.value !== undefined, \"--value\", disallowedFlags);\n pushIf(options.impact !== undefined, \"--impact\", disallowedFlags);\n pushIf(options.outcome !== undefined, \"--outcome\", disallowedFlags);\n pushIf(options.whyNow !== undefined, \"--why-now\", disallowedFlags);\n pushIf(options.assignee !== undefined, \"--assignee\", disallowedFlags);\n pushIf(options.parent !== undefined, \"--parent\", disallowedFlags);\n pushIf(options.reviewer !== undefined, \"--reviewer\", disallowedFlags);\n pushIf(options.risk !== undefined, \"--risk\", disallowedFlags);\n pushIf(options.confidence !== undefined, \"--confidence\", disallowedFlags);\n pushIf(options.sprint !== undefined, \"--sprint\", disallowedFlags);\n pushIf(options.release !== undefined, \"--release\", disallowedFlags);\n pushIf(options.blockedBy !== undefined, \"--blocked-by\", disallowedFlags);\n pushIf(\n options.blockedReason !== undefined,\n \"--blocked-reason\",\n disallowedFlags,\n );\n pushIf(\n options.unblockNote !== undefined,\n \"--unblock-note\",\n disallowedFlags,\n );\n pushIf(options.reporter !== undefined, \"--reporter\", disallowedFlags);\n pushIf(options.severity !== undefined, \"--severity\", disallowedFlags);\n pushIf(options.environment !== undefined, \"--environment\", disallowedFlags);\n pushIf(options.reproSteps !== undefined, \"--repro-steps\", disallowedFlags);\n pushIf(options.resolution !== undefined, \"--resolution\", disallowedFlags);\n pushIf(\n options.expectedResult !== undefined,\n \"--expected-result\",\n disallowedFlags,\n );\n pushIf(\n options.actualResult !== undefined,\n \"--actual-result\",\n disallowedFlags,\n );\n pushIf(\n options.affectedVersion !== undefined,\n \"--affected-version\",\n disallowedFlags,\n );\n pushIf(\n options.fixedVersion !== undefined,\n \"--fixed-version\",\n disallowedFlags,\n );\n pushIf(options.component !== undefined, \"--component\", disallowedFlags);\n pushIf(options.regression !== undefined, \"--regression\", disallowedFlags);\n pushIf(\n options.customerImpact !== undefined,\n \"--customer-impact\",\n disallowedFlags,\n );\n pushIf(options.depRemove !== undefined, \"--dep-remove\", disallowedFlags);\n pushIf(options.replaceDeps === true, \"--replace-deps\", disallowedFlags);\n pushIf(options.replaceTests === true, \"--replace-tests\", disallowedFlags);\n pushIf(options.comment !== undefined, \"--comment\", disallowedFlags);\n pushIf(options.note !== undefined, \"--note\", disallowedFlags);\n pushIf(options.learning !== undefined, \"--learning\", disallowedFlags);\n pushIf(options.file !== undefined, \"--file\", disallowedFlags);\n pushIf(options.test !== undefined, \"--test\", disallowedFlags);\n pushIf(options.doc !== undefined, \"--doc\", disallowedFlags);\n pushIf(options.reminder !== undefined, \"--reminder\", disallowedFlags);\n pushIf(options.event !== undefined, \"--event\", disallowedFlags);\n pushIf(options.typeOption !== undefined, \"--type-option\", disallowedFlags);\n pushIf(options.clearDeps === true, \"--clear-deps\", disallowedFlags);\n pushIf(options.clearComments === true, \"--clear-comments\", disallowedFlags);\n pushIf(options.clearNotes === true, \"--clear-notes\", disallowedFlags);\n pushIf(\n options.clearLearnings === true,\n \"--clear-learnings\",\n disallowedFlags,\n );\n pushIf(options.clearFiles === true, \"--clear-files\", disallowedFlags);\n pushIf(options.clearTests === true, \"--clear-tests\", disallowedFlags);\n pushIf(options.clearDocs === true, \"--clear-docs\", disallowedFlags);\n pushIf(\n options.clearReminders === true,\n \"--clear-reminders\",\n disallowedFlags,\n );\n pushIf(options.clearEvents === true, \"--clear-events\", disallowedFlags);\n pushIf(\n options.clearTypeOptions === true,\n \"--clear-type-options\",\n disallowedFlags,\n );\n pushIf(options.force === true, \"--force\", disallowedFlags);\n pushIf(clearItemMetadataKeys.size > 0, \"--unset\", disallowedFlags);\n if (options.dep === undefined || options.dep.length === 0) {\n throw new PmCliError(\n \"The dependency ownership bypass requires at least one --dep value\",\n EXIT_CODE.USAGE,\n );\n }\n if (disallowedFlags.length > 0) {\n throw buildOwnershipBypassRestrictedOptionsError({\n id,\n code: \"ownership_dependency_bypass_restricted_options\",\n message: `The dependency ownership bypass supports append-only dependency additions via --dep. Remove restricted options: ${disallowedFlags.join(\", \")}`,\n required:\n \"Pass only --dep additions (plus --message/--author) with the dependency ownership bypass.\",\n why: \"the dependency ownership bypass is a narrow non-owner override scoped to append-only dependency additions; every other mutation keeps its normal ownership rules.\",\n disallowedFlags,\n });\n }\n return;\n }\n\n const disallowedFlags: string[] = [];\n pushIf(options.status !== undefined, \"--status\", disallowedFlags);\n pushIf(options.closeReason !== undefined, \"--close-reason\", disallowedFlags);\n pushIf(options.assignee !== undefined, \"--assignee\", disallowedFlags);\n pushIf(options.parent !== undefined, \"--parent\", disallowedFlags);\n pushIf(options.blockedBy !== undefined, \"--blocked-by\", disallowedFlags);\n pushIf(\n options.blockedReason !== undefined,\n \"--blocked-reason\",\n disallowedFlags,\n );\n pushIf(options.unblockNote !== undefined, \"--unblock-note\", disallowedFlags);\n pushIf(options.dep !== undefined, \"--dep\", disallowedFlags);\n pushIf(options.depRemove !== undefined, \"--dep-remove\", disallowedFlags);\n pushIf(options.replaceDeps === true, \"--replace-deps\", disallowedFlags);\n pushIf(options.replaceTests === true, \"--replace-tests\", disallowedFlags);\n pushIf(options.note !== undefined, \"--note\", disallowedFlags);\n pushIf(options.learning !== undefined, \"--learning\", disallowedFlags);\n pushIf(options.test !== undefined, \"--test\", disallowedFlags);\n pushIf(options.reminder !== undefined, \"--reminder\", disallowedFlags);\n pushIf(options.event !== undefined, \"--event\", disallowedFlags);\n pushIf(options.clearDeps === true, \"--clear-deps\", disallowedFlags);\n pushIf(options.clearComments === true, \"--clear-comments\", disallowedFlags);\n pushIf(options.clearNotes === true, \"--clear-notes\", disallowedFlags);\n pushIf(options.clearLearnings === true, \"--clear-learnings\", disallowedFlags);\n pushIf(options.clearFiles === true, \"--clear-files\", disallowedFlags);\n pushIf(options.clearTests === true, \"--clear-tests\", disallowedFlags);\n pushIf(options.clearDocs === true, \"--clear-docs\", disallowedFlags);\n pushIf(options.clearReminders === true, \"--clear-reminders\", disallowedFlags);\n pushIf(options.clearEvents === true, \"--clear-events\", disallowedFlags);\n\n /* c8 ignore start -- unset ordering fallback is validated by package-governance integration coverage. */\n const disallowedUnset = [...clearItemMetadataKeys]\n .filter((field) =>\n OWNERSHIP_BYPASS_DISALLOWED_UNSET_ITEM_METADATA_KEYS.has(field),\n )\n .sort((left, right) => left.localeCompare(right))\n .map((field) => `--unset ${field.replaceAll(\"_\", \"-\")}`);\n /* c8 ignore stop */\n disallowedFlags.push(...disallowedUnset);\n\n if (disallowedFlags.length > 0) {\n throw buildOwnershipBypassRestrictedOptionsError({\n id,\n code: \"ownership_metadata_bypass_restricted_options\",\n message: `The metadata ownership bypass only supports non-lifecycle metadata fields and evidence appends. Remove restricted options: ${disallowedFlags.join(\", \")}`,\n required:\n \"Limit the metadata ownership bypass to non-lifecycle metadata fields plus append-only --comment/--file/--doc evidence; route restricted appends and lifecycle changes through their dedicated commands.\",\n why: \"the metadata ownership bypass is a non-owner override scoped to metadata maintenance and append-only evidence; lifecycle, ownership, dependency mutations, restricted append fields, and clear/replace operations keep their normal ownership rules.\",\n disallowedFlags,\n });\n }\n}\n\n/* c8 ignore start -- lifecycle/dependency edge branches are exercised by dedicated update workflow integration tests. */\nfunction parseStatus(\n value: string,\n statusRegistry: RuntimeStatusRegistry,\n): ItemStatus {\n const normalized = normalizeStatusInput(value, statusRegistry);\n if (!normalized) {\n const allowedStatuses = statusRegistry.definitions.map(\n (definition) => definition.id,\n );\n throw new PmCliError(\n `Invalid --status value \"${value}\". Allowed: ${allowedStatuses.join(\", \")}`,\n EXIT_CODE.USAGE,\n );\n }\n return normalized;\n}\n\n/** Enforce per-type allowed-transition rules (governance.workflow_enforcement). `off` (default) or an unrestricted type is a no-op. `strict` throws on a disallowed transition; `warn` returns a warning string surfaced on the update result. The target status is the raw `--status` value (resolved case-insensitively through the registry inside evaluateTransition). */\nfunction enforceTypeWorkflowTransition(params: {\n enforcement: GovernanceWorkflowEnforcement;\n typeWorkflows: NormalizedTypeWorkflow[];\n statusRegistry: RuntimeStatusRegistry;\n typeName: string;\n fromStatus: string;\n toStatus: string;\n}): string | undefined {\n if (params.enforcement === \"off\" || params.typeWorkflows.length === 0) {\n return undefined;\n }\n const result = evaluateTransition({\n typeName: params.typeName,\n fromStatus: params.fromStatus,\n toStatus: params.toStatus,\n typeWorkflows: params.typeWorkflows,\n statusRegistry: params.statusRegistry,\n });\n if (!result.hasRule || result.allowed) {\n return undefined;\n }\n const normalizedFrom =\n normalizeStatusInput(params.fromStatus, params.statusRegistry) ??\n params.fromStatus;\n const normalizedTo =\n normalizeStatusInput(params.toStatus, params.statusRegistry) ??\n params.toStatus;\n const message =\n `Disallowed transition for type \"${params.typeName}\": ${normalizedFrom} -> ${normalizedTo}. ` +\n `Allowed transitions: ${describeAllowedTransitions(result.allowedTransitions)}.`;\n if (params.enforcement === \"strict\") {\n throw new PmCliError(message, EXIT_CODE.USAGE);\n }\n return `workflow_transition_not_allowed: ${message}`;\n}\n\ninterface ParsedDependencyUpdates {\n additions: Dependency[];\n}\n\ninterface DependencyRemovalSelector {\n id: string;\n kind?: (typeof DEPENDENCY_KIND_VALUES)[number];\n source_kind?: string;\n}\n\nfunction parseDependencyCreatedAt(\n value: string | undefined,\n currentIso: string,\n): string {\n if (!value || value.trim() === \"\" || value.trim().toLowerCase() === \"now\") {\n return currentIso;\n }\n const parsed = Date.parse(value);\n if (!Number.isFinite(parsed)) {\n throw new PmCliError(\n `Invalid dependency created_at timestamp \"${value}\"`,\n EXIT_CODE.USAGE,\n );\n }\n return new Date(parsed).toISOString();\n}\n\nfunction parseOptionalDependencyString(\n value: string | undefined,\n): string | undefined {\n if (value === undefined) return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\n/** Allowed CSV/markdown keys for the update `--dep` addition seed (GH-258). */\nconst DEP_ADDITION_KEYS = [\n \"id\",\n \"kind\",\n \"type\",\n \"author\",\n \"created_at\",\n \"source_kind\",\n] as const;\n/** Allowed CSV/markdown keys for the `--dep-remove` selector (GH-258). */\nconst DEP_REMOVE_KEYS = [\"id\", \"kind\", \"type\", \"source_kind\"] as const;\n\nfunction looksLikeStructuredDependencyEntry(raw: string): boolean {\n if (raw.startsWith(\"```\") || raw.includes(\"\\n\")) {\n return true;\n }\n if (\n /^(?:[-*+]\\s+)?(?:id|kind|type|author|created_at|source_kind)\\s*[:=]/i.test(\n raw,\n )\n ) {\n return true;\n }\n // A first-key typo (e.g. `bogus=v,id=pm-2`) must still be parsed so the unknown\n // key is rejected rather than swallowed as a bare item id (GH-258).\n return looksLikeGenericKeyValueEntry(raw);\n}\n\n// pm-fl0c #4 (2026-05-28): `pm plan` accepts `depends_on` as a link kind\n// (`PLAN_STEP_LINK_KIND_VALUES`) but `pm update --dep kind=depends_on` rejected\n// it because `DEPENDENCY_KIND_VALUES` only lists `blocked_by`. The two terms\n// are semantically identical from this side (\"X depends on Y\" === \"X blocked\n// by Y\"), so we normalize input here rather than expanding the persisted enum\n// — the stored kind stays canonical (`blocked_by`) and downstream consumers\n// (closing logic, dependency graphs, blockers views) keep working unchanged.\nconst DEPENDENCY_KIND_INPUT_ALIASES: Readonly<Record<string, string>> = {\n \"blocked-by\": \"blocked_by\",\n depends_on: \"blocked_by\",\n \"depends-on\": \"blocked_by\",\n};\n\nfunction normalizeDependencyKindInput(\n raw: string | undefined,\n): string | undefined {\n if (typeof raw !== \"string\") {\n return raw;\n }\n const trimmed = raw.trim();\n const alias = DEPENDENCY_KIND_INPUT_ALIASES[trimmed.toLowerCase()];\n return alias ?? trimmed;\n}\n\nfunction parseDependencyAdditions(\n raw: string[] | undefined,\n prefix: string,\n nowIso: string,\n): ParsedDependencyUpdates {\n if (!raw) {\n return { additions: [] };\n }\n assertNoLegacyNoneTokens(\n raw,\n \"--dep\",\n \"Use --clear-deps to clear dependencies.\",\n );\n const additions: Dependency[] = raw.map((entry) => {\n const trimmedEntry = entry.trim();\n const isStructured = looksLikeStructuredDependencyEntry(trimmedEntry);\n assertValidBareDependencyFlagValue(trimmedEntry, isStructured);\n const kv = isStructured\n ? parseCsvKv(entry, \"--dep\")\n : { id: trimmedEntry, kind: \"related\" };\n if (isStructured) {\n assertNoUnknownCsvKeys(kv, \"--dep\", DEP_ADDITION_KEYS);\n }\n const id = kv.id?.trim();\n const kind = normalizeDependencyKindInput((kv.kind ?? kv.type)?.trim());\n if (!id || !kind) {\n throw new PmCliError(\n \"--dep requires id and kind, or a bare item id to add a related dependency\",\n EXIT_CODE.USAGE,\n );\n }\n if (id.toLowerCase() === \"undefined\") {\n throw new PmCliError(\n `--dep id must not use placeholder token \"${id}\". Use --clear-deps to clear dependencies.`,\n EXIT_CODE.USAGE,\n );\n }\n const sourceKind = parseOptionalDependencyString(kv.source_kind);\n return {\n id: normalizeItemId(id, prefix),\n kind: ensureEnum(kind, DEPENDENCY_KIND_VALUES, \"dependency kind\"),\n created_at: parseDependencyCreatedAt(kv.created_at, nowIso),\n author: parseOptionalDependencyString(kv.author),\n source_kind: sourceKind,\n };\n });\n return { additions };\n}\n\nfunction parseDependencyRemovals(\n raw: string[] | undefined,\n prefix: string,\n): DependencyRemovalSelector[] {\n if (!raw) {\n return [];\n }\n assertNoLegacyNoneTokens(raw, \"--dep-remove\");\n return raw.map((entry) => {\n const trimmed = entry.trim();\n if (!trimmed) {\n throw new PmCliError(\n \"--dep-remove requires id or key/value selectors\",\n EXIT_CODE.USAGE,\n );\n }\n if (\n trimmed.includes(\"=\") ||\n /^(?:[-*+]\\s+)?(?:id|kind|type|source_kind)\\s*[:=]/i.test(trimmed) ||\n trimmed.startsWith(\"```\")\n ) {\n const kv = parseCsvKv(trimmed, \"--dep-remove\");\n assertNoUnknownCsvKeys(kv, \"--dep-remove\", DEP_REMOVE_KEYS);\n const idRaw = kv.id?.trim();\n if (!idRaw) {\n throw new PmCliError(\n \"--dep-remove key/value form requires id=<value>\",\n EXIT_CODE.USAGE,\n );\n }\n if (idRaw.toLowerCase() === \"undefined\") {\n throw new PmCliError(\n `--dep-remove id must not use placeholder token \"${idRaw}\"`,\n EXIT_CODE.USAGE,\n );\n }\n const kindRaw = normalizeDependencyKindInput(\n parseOptionalDependencyString(kv.kind ?? kv.type),\n );\n const sourceKind = parseOptionalDependencyString(kv.source_kind);\n return {\n id: normalizeItemId(idRaw, prefix),\n kind: kindRaw\n ? ensureEnum(kindRaw, DEPENDENCY_KIND_VALUES, \"dependency kind\")\n : undefined,\n source_kind: sourceKind,\n };\n }\n if (trimmed.toLowerCase() === \"undefined\") {\n throw new PmCliError(\n `--dep-remove id must not use placeholder token \"${trimmed}\"`,\n EXIT_CODE.USAGE,\n );\n }\n return {\n id: normalizeItemId(trimmed, prefix),\n };\n });\n}\n\nfunction dependencyKey(\n value: Pick<Dependency, \"id\" | \"kind\" | \"source_kind\">,\n): string {\n return `${value.id}::${value.kind}::${value.source_kind ?? \"\"}`;\n}\n\n// pm-kyd6: `--blocked-by` writes the `blocked_by` scalar, but the dependency\n// graph (`pm deps`) is built only from the `dependencies` array. Mirror the\n// behaviour create.ts already has so the metadata and the graph agree: a\n// resolvable blocker also gets a `blocked_by` dependency edge. Repeated\n// `--blocked-by` updates preserve prior blocker edges because the graph is the\n// full dependency record; the scalar remains the latest primary blocker for\n// backward compatibility. Clearing the scalar removes all derived blocker edges.\nfunction reconcileBlockedByDependency(\n current: Dependency[] | undefined,\n nextBlockedById: string | undefined,\n nowIsoValue: string,\n author: string,\n): { dependencies: Dependency[] | undefined; changed: boolean } {\n let next = [...(current ?? [])];\n let changed = false;\n if (nextBlockedById === undefined) {\n const filtered = next.filter((dep) => dep.kind !== \"blocked_by\");\n if (filtered.length !== next.length) {\n next = filtered;\n changed = true;\n }\n if (!changed) {\n return { dependencies: current, changed: false };\n }\n return { dependencies: next.length > 0 ? next : undefined, changed: true };\n }\n if (\n !next.some((dep) => dep.kind === \"blocked_by\" && dep.id === nextBlockedById)\n ) {\n next.push({\n id: nextBlockedById,\n kind: \"blocked_by\",\n created_at: nowIsoValue,\n author,\n });\n changed = true;\n }\n if (!changed) {\n return { dependencies: current, changed: false };\n }\n return { dependencies: next.length > 0 ? next : undefined, changed: true };\n}\n\n// pm-kyd6: resolve the --blocked-by target before the synchronous mutate\n// callback so a real blocker can also become a `blocked_by` dependency edge.\n// `id` is set when the target resolves; `unresolved` carries the raw value when\n// --blocked-by points at an item that does not exist (the scalar is still set,\n// mirroring create.ts and the never-block missing-parent behaviour, but the\n// caller surfaces a warning so the metadata/graph mismatch is visible).\nasync function resolveBlockedByDependencyTarget(\n blockedByOption: string | undefined,\n blockedByCleared: boolean,\n pmRoot: string,\n idPrefix: string,\n itemFormat: ItemFormat,\n typeToFolder: Record<string, string>,\n): Promise<{ id?: string; unresolved?: string }> {\n if (blockedByOption === undefined || blockedByCleared) {\n return {};\n }\n const blockedByValue = blockedByOption.trim();\n if (blockedByValue.length === 0) {\n return {};\n }\n const located = await locateItem(\n pmRoot,\n normalizeItemId(blockedByValue, idPrefix),\n idPrefix,\n itemFormat,\n typeToFolder,\n );\n return located ? { id: located.id } : { unresolved: blockedByValue };\n}\n\n// pm-kyd6: apply the reconciled blocked_by dependency edge to the item metadata\n// and record the `dependencies` change. Kept out of the mutate callback so the\n// large runUpdate function stays under the static-quality complexity budget.\nfunction applyBlockedByDependencyEdge(\n metadata: ItemMetadata,\n resolvedBlockedById: string | undefined,\n nowIsoValue: string,\n author: string,\n changedFields: string[],\n): void {\n const reconciled = reconcileBlockedByDependency(\n metadata.dependencies,\n resolvedBlockedById,\n nowIsoValue,\n author,\n );\n if (!reconciled.changed) {\n return;\n }\n if (reconciled.dependencies === undefined) {\n delete metadata.dependencies;\n } else {\n metadata.dependencies = reconciled.dependencies;\n }\n if (!changedFields.includes(\"dependencies\")) {\n changedFields.push(\"dependencies\");\n }\n}\n\nfunction fileKey(value: Pick<LinkedFile, \"path\" | \"scope\">): string {\n return `${value.path}::${value.scope}`;\n}\n\nfunction docKey(value: Pick<LinkedDoc, \"path\" | \"scope\">): string {\n return `${value.path}::${value.scope}`;\n}\n\nfunction testKey(\n value: Pick<LinkedTest, \"command\" | \"path\" | \"scope\" | \"pm_context_mode\">,\n): string {\n return `${value.command}::${value.path ?? \"\"}::${value.scope}::${value.pm_context_mode ?? \"\"}`;\n}\n\nfunction matchesDependencySelector(\n value: Dependency,\n selector: DependencyRemovalSelector,\n): boolean {\n if (value.id !== selector.id) {\n return false;\n }\n if (selector.kind && value.kind !== selector.kind) {\n return false;\n }\n if (\n selector.source_kind !== undefined &&\n (value.source_kind ?? undefined) !== selector.source_kind\n ) {\n return false;\n }\n return true;\n}\n\nfunction ensurePriority(raw: string | number): 0 | 1 | 2 | 3 | 4 {\n return resolvePriority(raw);\n}\n\nfunction normalizeUpdatePolicyOptionKey(raw: string, typeName: string): string {\n const canonical = canonicalizeCommandOptionKey(\"update\", raw);\n if (!canonical) {\n throw new PmCliError(\n `Unsupported command_option_policies option \"${raw}\" for update command on type \"${typeName}\"`,\n EXIT_CODE.CONFLICT,\n );\n }\n return canonical;\n}\n\nfunction collectProvidedUpdatePolicyOptions(\n options: UpdateCommandOptions,\n runtimeFieldRegistry: RuntimeFieldRegistry,\n extensionFieldNames: readonly string[],\n): Set<string> {\n const provided = new Set<string>();\n const mark = (optionKey: string, isProvided: boolean): void => {\n if (isProvided) {\n provided.add(optionKey);\n }\n };\n mark(\"title\", options.title !== undefined);\n mark(\"description\", options.description !== undefined);\n mark(\"body\", options.body !== undefined);\n mark(\"status\", options.status !== undefined);\n mark(\"closeReason\", options.closeReason !== undefined);\n mark(\"priority\", options.priority !== undefined);\n mark(\"type\", options.type !== undefined);\n // `--add-tags` / `--remove-tags` mutate the same `tags` field as `--tags`, so\n // they count toward the `tags` command_option_policy (disabled + required).\n mark(\n \"tags\",\n options.tags !== undefined ||\n (Array.isArray(options.addTags) && options.addTags.length > 0) ||\n (Array.isArray(options.removeTags) && options.removeTags.length > 0),\n );\n mark(\"deadline\", options.deadline !== undefined);\n mark(\"estimatedMinutes\", options.estimatedMinutes !== undefined);\n 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(\"ownershipMetadataBypass\", options.ownershipMetadataBypass === true);\n mark(\"ownershipDependencyBypass\", options.ownershipDependencyBypass === true);\n mark(\"dep\", options.clearDeps === true);\n mark(\"comment\", options.clearComments === true);\n mark(\"note\", options.clearNotes === true);\n mark(\"learning\", options.clearLearnings === true);\n mark(\"file\", options.clearFiles === true);\n mark(\"test\", options.clearTests === true);\n mark(\"doc\", options.clearDocs === true);\n mark(\"reminder\", options.clearReminders === true);\n mark(\"event\", options.clearEvents === true);\n mark(\"typeOption\", options.clearTypeOptions === true);\n if (options.unset && options.unset.length > 0) {\n const unsetTargets = parseUpdateUnsetTargets(\n options.unset,\n runtimeFieldRegistry,\n extensionFieldNames,\n );\n for (const optionKey of unsetTargets.optionKeys) {\n mark(optionKey, true);\n }\n }\n return provided;\n}\n\nfunction enforceUpdateOptionsByType(\n typeName: string,\n options: UpdateCommandOptions,\n typeRegistry: ReturnType<typeof resolveItemTypeRegistry>,\n runtimeFieldRegistry: RuntimeFieldRegistry,\n extensionFieldNames: readonly string[],\n): void {\n const typeDefinition = resolveTypeDefinition(typeName, typeRegistry);\n if (!typeDefinition) {\n throw new PmCliError(`Invalid type value \"${typeName}\"`, EXIT_CODE.USAGE);\n }\n const policyState = resolveCommandOptionPolicyState(\n typeDefinition,\n \"update\",\n [],\n );\n if (policyState.errors.length > 0) {\n throw new PmCliError(policyState.errors.join(\"; \"), EXIT_CODE.CONFLICT);\n }\n\n const provided = collectProvidedUpdatePolicyOptions(\n options,\n runtimeFieldRegistry,\n extensionFieldNames,\n );\n for (const disabled of policyState.disabled) {\n if (provided.has(normalizeUpdatePolicyOptionKey(disabled, typeName))) {\n throw new PmCliError(\n `Option ${commandOptionFlagLabel(\"update\", disabled)} is disabled for type \"${typeName}\" by command_option_policies`,\n EXIT_CODE.USAGE,\n );\n }\n }\n\n for (const required of policyState.required) {\n if (!provided.has(normalizeUpdatePolicyOptionKey(required, typeName))) {\n throw new PmCliError(\n `Missing required option ${commandOptionFlagLabel(\"update\", required)} for type \"${typeName}\"`,\n EXIT_CODE.USAGE,\n );\n }\n }\n}\n\ninterface UpdateScalarMutationContext {\n metadataRecord: Record<string, unknown>;\n clearItemMetadataKeys: ReadonlySet<string>;\n changedFields: string[];\n nowValue: Date;\n}\n\ninterface UpdateScalarMutationDefinition {\n optionKey: keyof UpdateCommandOptions;\n metadataKey: string;\n transform?: (value: string, context: UpdateScalarMutationContext) => unknown;\n}\n\ninterface UpdateClearCollectionDefinition {\n enabled: boolean | undefined;\n optionKey: string;\n clearFlag: string;\n valueFlag: string;\n values: string[] | undefined;\n metadataKey: string;\n}\n\ninterface UpdateMutationContext {\n options: UpdateCommandOptions;\n settings: Awaited<ReturnType<typeof readSettings>>;\n typeRegistry: ReturnType<typeof resolveItemTypeRegistry>;\n statusRegistry: RuntimeStatusRegistry;\n runtimeFieldRegistry: RuntimeFieldRegistry;\n extensionRegistrations: ReturnType<typeof getActiveExtensionRegistrations>;\n extensionFieldNames: readonly string[];\n clearItemMetadataKeys: ReadonlySet<string>;\n dependencyUpdates: ParsedDependencyUpdates;\n dependencyRemovals: DependencyRemovalSelector[];\n commentUpdates: ReturnType<typeof parseLogSeed>;\n noteUpdates: ReturnType<typeof parseLogSeed>;\n learningUpdates: ReturnType<typeof parseLogSeed>;\n fileUpdates: ReturnType<typeof parseFiles>;\n testUpdates: ReturnType<typeof parseTests>;\n docUpdates: ReturnType<typeof parseDocs>;\n resolvedParentValue: string | undefined;\n resolvedBlockedByDependencyId: string | undefined;\n runtimeFieldUpdates: Record<string, unknown>;\n nowValue: Date;\n nowIso: string;\n author: string;\n pmRoot: string;\n}\n\ninterface CloseRouteContext {\n options: UpdateCommandOptions;\n fieldFlags: Record<string, boolean>;\n statusRegistry: RuntimeStatusRegistry;\n workflowTransitionWarnings: readonly string[];\n global: GlobalOptions;\n id: string;\n}\n\n// `rank` is a legacy alias for `order`; keep it out of the scalar loop if the\n// shared mutation key list ever grows to include that alias.\nconst UPDATE_LEGACY_COMMON_SCALAR_OPTION_EXCLUSIONS = new Set<string>([\n \"order\",\n \"rank\",\n]);\nconst UPDATE_LEGACY_COMMON_SCALAR_OPTION_KEYS =\n COMMON_MUTATION_COMMAND_OPTION_KEYS.filter(\n (key) => !UPDATE_LEGACY_COMMON_SCALAR_OPTION_EXCLUSIONS.has(key),\n ) as readonly (keyof UpdateCommandOptions)[];\n\nconst UPDATE_LEGACY_SCALAR_OPTION_KEYS: readonly (keyof UpdateCommandOptions)[] =\n [\"tags\", \"closeReason\", ...UPDATE_LEGACY_COMMON_SCALAR_OPTION_KEYS];\n\nconst UPDATE_SIMPLE_FIELD_FLAG_KEYS: readonly (keyof UpdateCommandOptions)[] = [\n \"title\",\n \"description\",\n \"body\",\n \"status\",\n \"closeReason\",\n \"priority\",\n \"type\",\n ...COMMON_MUTATION_COMMAND_OPTION_KEYS,\n \"dep\",\n \"depRemove\",\n \"comment\",\n \"note\",\n \"learning\",\n \"file\",\n \"test\",\n \"doc\",\n \"reminder\",\n \"event\",\n \"typeOption\",\n \"field\",\n];\n\nconst UPDATE_POST_TAG_SCALAR_MUTATIONS: ReadonlyArray<UpdateScalarMutationDefinition> =\n [\n {\n optionKey: \"deadline\",\n metadataKey: \"deadline\",\n transform: (value, context) =>\n resolveIsoOrRelative(value, context.nowValue, \"deadline\"),\n },\n {\n optionKey: \"estimatedMinutes\",\n metadataKey: \"estimated_minutes\",\n transform: (value) =>\n parseOptionalNonNegativeInteger(value, \"estimated-minutes\"),\n },\n {\n optionKey: \"acceptanceCriteria\",\n metadataKey: \"acceptance_criteria\",\n transform: (value) => value,\n },\n { optionKey: \"definitionOfReady\", metadataKey: \"definition_of_ready\" },\n { optionKey: \"goal\", metadataKey: \"goal\" },\n { optionKey: \"objective\", metadataKey: \"objective\" },\n { optionKey: \"value\", metadataKey: \"value\" },\n { optionKey: \"impact\", metadataKey: \"impact\" },\n { optionKey: \"outcome\", metadataKey: \"outcome\" },\n { optionKey: \"whyNow\", metadataKey: \"why_now\" },\n ];\n\nconst UPDATE_STAKEHOLDER_SCALAR_MUTATIONS: ReadonlyArray<UpdateScalarMutationDefinition> =\n [\n { optionKey: \"reviewer\", metadataKey: \"reviewer\" },\n {\n optionKey: \"risk\",\n metadataKey: \"risk\",\n transform: (value) =>\n ensureEnum(normalizeRiskInput(value), RISK_VALUES, \"risk\"),\n },\n {\n optionKey: \"confidence\",\n metadataKey: \"confidence\",\n transform: (value) => parseConfidenceInput(value),\n },\n ];\n\nconst UPDATE_ISSUE_SCALAR_MUTATIONS: ReadonlyArray<UpdateScalarMutationDefinition> =\n [\n { optionKey: \"blockedReason\", metadataKey: \"blocked_reason\" },\n { optionKey: \"unblockNote\", metadataKey: \"unblock_note\" },\n { optionKey: \"reporter\", metadataKey: \"reporter\" },\n {\n optionKey: \"severity\",\n metadataKey: \"severity\",\n transform: (value) =>\n ensureEnum(\n normalizeSeverityInput(value),\n ISSUE_SEVERITY_VALUES,\n \"severity\",\n ),\n },\n { optionKey: \"environment\", metadataKey: \"environment\" },\n { optionKey: \"reproSteps\", metadataKey: \"repro_steps\" },\n { optionKey: \"resolution\", metadataKey: \"resolution\" },\n { optionKey: \"expectedResult\", metadataKey: \"expected_result\" },\n { optionKey: \"actualResult\", metadataKey: \"actual_result\" },\n { optionKey: \"affectedVersion\", metadataKey: \"affected_version\" },\n { optionKey: \"fixedVersion\", metadataKey: \"fixed_version\" },\n { optionKey: \"component\", metadataKey: \"component\" },\n {\n optionKey: \"regression\",\n metadataKey: \"regression\",\n transform: (value) => parseRegressionInput(value),\n },\n { optionKey: \"customerImpact\", metadataKey: \"customer_impact\" },\n ];\n\nfunction applyUpdateScalarMutations(\n definitions: ReadonlyArray<UpdateScalarMutationDefinition>,\n options: UpdateCommandOptions,\n context: UpdateScalarMutationContext,\n): void {\n for (const definition of definitions) {\n const optionValue = options[definition.optionKey];\n const shouldClear = context.clearItemMetadataKeys.has(\n definition.metadataKey,\n );\n if (optionValue === undefined && !shouldClear) {\n continue;\n }\n if (shouldClear) {\n delete context.metadataRecord[definition.metadataKey];\n context.changedFields.push(definition.metadataKey);\n continue;\n }\n if (typeof optionValue !== \"string\") {\n throw new PmCliError(\n `${commandOptionFlagLabel(\"update\", String(definition.optionKey))} must be a string value`,\n EXIT_CODE.USAGE,\n );\n }\n context.metadataRecord[definition.metadataKey] = definition.transform\n ? definition.transform(optionValue, context)\n : optionValue.trim();\n context.changedFields.push(definition.metadataKey);\n }\n}\n\nasync function resolveStdinUpdateOptions(\n options: UpdateCommandOptions,\n): Promise<UpdateCommandOptions> {\n const stdinResolver = createStdinTokenResolver();\n return normalizeLegacyNoneUpdateOptions({\n ...options,\n body: await stdinResolver.resolveValue(options.body, \"--body\"),\n dep: await stdinResolver.resolveList(options.dep, \"--dep\"),\n depRemove: await stdinResolver.resolveList(\n options.depRemove,\n \"--dep-remove\",\n ),\n comment: await stdinResolver.resolveList(options.comment, \"--comment\"),\n note: await stdinResolver.resolveList(options.note, \"--note\"),\n learning: await stdinResolver.resolveList(options.learning, \"--learning\"),\n file: await stdinResolver.resolveList(options.file, \"--file\"),\n test: await stdinResolver.resolveList(options.test, \"--test\"),\n doc: await stdinResolver.resolveList(options.doc, \"--doc\"),\n reminder: await stdinResolver.resolveList(options.reminder, \"--reminder\"),\n event: await stdinResolver.resolveList(options.event, \"--event\"),\n typeOption: await stdinResolver.resolveList(\n options.typeOption,\n \"--type-option\",\n ),\n field: await stdinResolver.resolveList(options.field, \"--field\"),\n });\n}\n\nfunction buildClearCollectionDefinitions(\n options: UpdateCommandOptions,\n): readonly UpdateClearCollectionDefinition[] {\n return [\n {\n enabled: options.clearDeps || options.replaceDeps,\n optionKey: \"dep\",\n clearFlag: \"--clear-deps\",\n valueFlag: \"--dep\",\n values: options.dep,\n metadataKey: \"dependencies\",\n },\n {\n enabled: options.clearComments,\n optionKey: \"comment\",\n clearFlag: \"--clear-comments\",\n valueFlag: \"--comment\",\n values: options.comment,\n metadataKey: \"comments\",\n },\n {\n enabled: options.clearNotes,\n optionKey: \"note\",\n clearFlag: \"--clear-notes\",\n valueFlag: \"--note\",\n values: options.note,\n metadataKey: \"notes\",\n },\n {\n enabled: options.clearLearnings,\n optionKey: \"learning\",\n clearFlag: \"--clear-learnings\",\n valueFlag: \"--learning\",\n values: options.learning,\n metadataKey: \"learnings\",\n },\n {\n enabled: options.clearFiles,\n optionKey: \"file\",\n clearFlag: \"--clear-files\",\n valueFlag: \"--file\",\n values: options.file,\n metadataKey: \"files\",\n },\n {\n enabled: options.clearTests || options.replaceTests,\n optionKey: \"test\",\n clearFlag: \"--clear-tests\",\n valueFlag: \"--test\",\n values: options.test,\n metadataKey: \"tests\",\n },\n {\n enabled: options.clearDocs,\n optionKey: \"doc\",\n clearFlag: \"--clear-docs\",\n valueFlag: \"--doc\",\n values: options.doc,\n metadataKey: \"docs\",\n },\n {\n enabled: options.clearReminders,\n optionKey: \"reminder\",\n clearFlag: \"--clear-reminders\",\n valueFlag: \"--reminder\",\n values: options.reminder,\n metadataKey: \"reminders\",\n },\n {\n enabled: options.clearEvents,\n optionKey: \"event\",\n clearFlag: \"--clear-events\",\n valueFlag: \"--event\",\n values: options.event,\n metadataKey: \"events\",\n },\n {\n enabled: options.clearTypeOptions,\n optionKey: \"typeOption\",\n clearFlag: \"--clear-type-options\",\n valueFlag: \"--type-option\",\n values: options.typeOption,\n metadataKey: \"type_options\",\n },\n ];\n}\n\nfunction validateReplaceOptions(options: UpdateCommandOptions): void {\n if (\n options.replaceDeps === true &&\n (options.dep === undefined || options.dep.length === 0)\n ) {\n throw new PmCliError(\n \"--replace-deps requires at least one --dep entry\",\n EXIT_CODE.USAGE,\n );\n }\n if (\n options.replaceDeps === true &&\n options.depRemove !== undefined &&\n options.depRemove.length > 0\n ) {\n throw new PmCliError(\n \"--replace-deps cannot be combined with --dep-remove\",\n EXIT_CODE.USAGE,\n );\n }\n if (\n options.replaceTests === true &&\n (options.test === undefined || options.test.length === 0)\n ) {\n throw new PmCliError(\n \"--replace-tests requires at least one --test entry\",\n EXIT_CODE.USAGE,\n );\n }\n if (options.replaceTests === true && options.clearTests === true) {\n throw new PmCliError(\n \"--replace-tests cannot be combined with --clear-tests\",\n EXIT_CODE.USAGE,\n );\n }\n}\n\nfunction applyClearCollectionDefinitions(params: {\n definitions: readonly UpdateClearCollectionDefinition[];\n options: UpdateCommandOptions;\n clearOptionKeys: Set<string>;\n clearItemMetadataKeys: Set<string>;\n}): void {\n for (const definition of params.definitions) {\n if (!definition.enabled) {\n continue;\n }\n const isReplacement =\n (definition.optionKey === \"dep\" && params.options.replaceDeps === true) ||\n (definition.optionKey === \"test\" && params.options.replaceTests === true);\n if (definition.values && definition.values.length > 0 && !isReplacement) {\n throw new PmCliError(\n `Cannot combine ${definition.clearFlag} with ${definition.valueFlag}`,\n EXIT_CODE.USAGE,\n );\n }\n params.clearOptionKeys.add(definition.optionKey);\n params.clearItemMetadataKeys.add(definition.metadataKey);\n }\n}\n\nfunction buildScalarOptionPresence(\n options: UpdateCommandOptions,\n): Record<string, boolean> {\n const presence: Record<string, boolean> = {};\n for (const key of UPDATE_LEGACY_SCALAR_OPTION_KEYS) {\n presence[String(key)] = options[key] !== undefined;\n }\n presence.order = options.order !== undefined || options.rank !== undefined;\n return presence;\n}\n\nfunction rejectUnsetScalarConflicts(\n options: UpdateCommandOptions,\n unsetTargets: { optionKeys: Set<string>; metadataKeys: Set<string> },\n): void {\n const scalarOptionPresence = buildScalarOptionPresence(options);\n for (const [optionKey, hasValue] of Object.entries(scalarOptionPresence)) {\n if (!hasValue || !unsetTargets.optionKeys.has(optionKey)) {\n continue;\n }\n const unsetField =\n UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey) ?? optionKey;\n throw new PmCliError(\n `Cannot combine --unset ${unsetField} with ${commandOptionFlagLabel(\"update\", optionKey)}`,\n EXIT_CODE.USAGE,\n );\n }\n if (!unsetTargets.metadataKeys.has(\"tags\")) {\n return;\n }\n if (Array.isArray(options.addTags) && options.addTags.length > 0) {\n throw new PmCliError(\n \"Cannot combine --unset tags with --add-tags\",\n EXIT_CODE.USAGE,\n );\n }\n if (Array.isArray(options.removeTags) && options.removeTags.length > 0) {\n throw new PmCliError(\n \"Cannot combine --unset tags with --remove-tags\",\n EXIT_CODE.USAGE,\n );\n }\n}\n\nfunction rejectLegacyScalarTokens(options: UpdateCommandOptions): void {\n const assertNoLegacyScalarToken = (\n value: string | undefined,\n optionKey: string,\n ): void => {\n const unsetField = UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey);\n const hint = unsetField\n ? `Use --unset ${unsetField} to clear this field.`\n : undefined;\n assertNoLegacyNoneToken(\n value,\n commandOptionFlagLabel(\"update\", optionKey),\n hint,\n );\n };\n for (const key of UPDATE_LEGACY_SCALAR_OPTION_KEYS) {\n assertNoLegacyScalarToken(options[key] as string | undefined, String(key));\n }\n assertNoLegacyScalarToken(options.order ?? options.rank, \"order\");\n assertNoLegacyNoneTokens(\n options.reminder,\n \"--reminder\",\n \"Use --clear-reminders to clear reminders.\",\n );\n assertNoLegacyNoneTokens(\n options.event,\n \"--event\",\n \"Use --clear-events to clear linked events.\",\n );\n}\n\nfunction buildUpdateFieldFlags(\n options: UpdateCommandOptions,\n runtimeFieldUpdates: Record<string, unknown>,\n): Record<string, boolean> {\n const flags: Record<string, boolean> = {};\n for (const key of UPDATE_SIMPLE_FIELD_FLAG_KEYS) {\n flags[String(key)] = options[key] !== undefined;\n }\n flags.tags = options.tags !== undefined;\n flags.addTags = Array.isArray(options.addTags) && options.addTags.length > 0;\n flags.removeTags =\n Array.isArray(options.removeTags) && options.removeTags.length > 0;\n flags.order = options.order !== undefined;\n flags.rank = options.rank !== undefined;\n flags.replaceDeps = options.replaceDeps === true;\n flags.replaceTests = options.replaceTests === true;\n flags.unset = options.unset !== undefined && options.unset.length > 0;\n flags.clearDeps = options.clearDeps === true;\n flags.clearComments = options.clearComments === true;\n flags.clearNotes = options.clearNotes === true;\n flags.clearLearnings = options.clearLearnings === true;\n flags.clearFiles = options.clearFiles === true;\n flags.clearTests = options.clearTests === true;\n flags.clearDocs = options.clearDocs === true;\n flags.clearReminders = options.clearReminders === true;\n flags.clearEvents = options.clearEvents === true;\n flags.clearTypeOptions = options.clearTypeOptions === true;\n flags.runtimeFields = Object.keys(runtimeFieldUpdates).length > 0;\n return flags;\n}\n\nasync function buildNoopUpdateResult(params: {\n pmRoot: string;\n id: string;\n settings: Awaited<ReturnType<typeof readSettings>>;\n typeRegistry: ReturnType<typeof resolveItemTypeRegistry>;\n}): Promise<UpdateResult> {\n const located = await locateItem(\n params.pmRoot,\n params.id,\n params.settings.id_prefix,\n params.settings.item_format,\n params.typeRegistry.type_to_folder,\n );\n if (!located) {\n throw await buildItemNotFoundError(\n params.pmRoot,\n params.id,\n params.settings.id_prefix,\n params.typeRegistry.type_to_folder,\n );\n }\n const { document } = await readLocatedItem(located, {\n schema: params.settings.schema,\n });\n return {\n item: toItemRecord(document.metadata),\n changed_fields: [],\n warnings: [\"noop_no_update_fields\"],\n };\n}\n\nasync function assertUpdateTrackerInitialized(pmRoot: string): Promise<void> {\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(\n `Tracker is not initialized at ${pmRoot}. Run pm init first.`,\n EXIT_CODE.NOT_FOUND,\n );\n }\n}\n\nfunction assertMatchingOrderRank(options: UpdateCommandOptions): void {\n if (\n options.order !== undefined &&\n options.rank !== undefined &&\n options.order !== options.rank\n ) {\n throw new PmCliError(\n \"--order and --rank must match when both are provided\",\n EXIT_CODE.USAGE,\n );\n }\n}\n\nasync function resolveParentReferenceForUpdate(params: {\n id: string;\n options: UpdateCommandOptions;\n unsetTargets: { metadataKeys: Set<string> };\n pmRoot: string;\n settings: Awaited<ReturnType<typeof readSettings>>;\n typeRegistry: ReturnType<typeof resolveItemTypeRegistry>;\n parentReferencePolicy: Awaited<\n ReturnType<typeof readSettings>\n >[\"validation\"][\"parent_reference\"];\n}): Promise<{ resolvedParentValue: string | undefined; warnings: string[] }> {\n if (\n params.options.parent === undefined ||\n params.unsetTargets.metadataKeys.has(\"parent\")\n ) {\n return { resolvedParentValue: undefined, warnings: [] };\n }\n const resolvedParentValue = normalizeParentReferenceValue(\n params.options.parent,\n );\n assertParentReferenceIsNotSelf(\n params.id,\n resolvedParentValue,\n params.settings.id_prefix,\n );\n const parentLocated = await locateItem(\n params.pmRoot,\n resolvedParentValue,\n params.settings.id_prefix,\n params.settings.item_format,\n params.typeRegistry.type_to_folder,\n );\n if (parentLocated) {\n return { resolvedParentValue, warnings: [] };\n }\n const normalizedParentId = normalizeItemId(\n resolvedParentValue,\n params.settings.id_prefix,\n );\n return {\n resolvedParentValue,\n warnings: validateMissingParentReference(\n normalizedParentId,\n params.parentReferencePolicy,\n ).warnings,\n };\n}\n\nfunction blockedByResolutionWarnings(resolution: {\n unresolved?: string;\n}): string[] {\n return resolution.unresolved === undefined\n ? []\n : [`blocked_by_unresolved:${resolution.unresolved}`];\n}\n\nasync function collectWorkflowTransitionWarnings(params: {\n options: UpdateCommandOptions;\n fieldFlags: Record<string, boolean>;\n workflowEnforcement: GovernanceWorkflowEnforcement;\n typeWorkflows: NormalizedTypeWorkflow[];\n statusRegistry: RuntimeStatusRegistry;\n typeRegistry: ReturnType<typeof resolveItemTypeRegistry>;\n pmRoot: string;\n id: string;\n settings: Awaited<ReturnType<typeof readSettings>>;\n}): Promise<string[]> {\n if (\n params.workflowEnforcement === \"off\" ||\n params.typeWorkflows.length === 0 ||\n !params.fieldFlags.status ||\n params.options.status === undefined\n ) {\n return [];\n }\n const located = await locateItem(\n params.pmRoot,\n params.id,\n params.settings.id_prefix,\n params.settings.item_format,\n params.typeRegistry.type_to_folder,\n );\n if (!located) {\n throw await buildItemNotFoundError(\n params.pmRoot,\n params.id,\n params.settings.id_prefix,\n params.typeRegistry.type_to_folder,\n );\n }\n const { document } = await readLocatedItem(located, {\n schema: params.settings.schema,\n });\n const effectiveType =\n params.options.type !== undefined\n ? (resolveTypeName(params.options.type, params.typeRegistry) ??\n params.options.type)\n : (document.metadata?.type ?? \"\");\n const warning = enforceTypeWorkflowTransition({\n enforcement: params.workflowEnforcement,\n typeWorkflows: params.typeWorkflows,\n statusRegistry: params.statusRegistry,\n typeName: effectiveType,\n fromStatus: document.metadata?.status ?? \"\",\n toStatus: params.options.status,\n });\n return warning ? [warning] : [];\n}\n\nasync function routeCloseStatusUpdate(\n context: CloseRouteContext,\n): Promise<UpdateResult | undefined> {\n if (!context.fieldFlags.status) {\n return undefined;\n }\n const targetStatus = normalizeStatusInput(\n context.options.status as ItemStatus,\n context.statusRegistry,\n );\n if (targetStatus !== context.statusRegistry.close_status) {\n return undefined;\n }\n\n const otherFieldKeys = Object.entries(context.fieldFlags)\n .filter(\n ([key, value]) => value && key !== \"status\" && key !== \"closeReason\",\n )\n .map(([key]) => key);\n const routeWarnings: string[] = [];\n let preChangedFields: string[] = [];\n if (otherFieldKeys.length > 0) {\n const preUpdate = await runUpdate(\n context.id,\n {\n ...context.options,\n status: undefined,\n closeReason: undefined,\n message: undefined,\n },\n context.global,\n );\n preChangedFields = preUpdate.changed_fields;\n routeWarnings.push(...preUpdate.warnings);\n }\n\n const explicitReason =\n typeof context.options.closeReason === \"string\"\n ? context.options.closeReason.trim()\n : \"\";\n const fallbackMessage =\n typeof context.options.message === \"string\"\n ? context.options.message.trim()\n : \"\";\n const closeReason =\n explicitReason || fallbackMessage || \"Closed via pm update\";\n const closeResult = await runClose(\n context.id,\n closeReason,\n {\n author: context.options.author,\n message: context.options.message,\n force: context.options.force,\n },\n context.global,\n );\n\n const warnings = [\n ...context.workflowTransitionWarnings,\n ...routeWarnings,\n ...closeResult.warnings,\n \"auto_routed_from_update_to_close\",\n ];\n if (explicitReason.length === 0 && fallbackMessage.length === 0) {\n warnings.push(\"close_reason_defaulted\");\n }\n return {\n item: closeResult.item,\n changed_fields: [...preChangedFields, ...closeResult.changed_fields],\n warnings,\n };\n}\n\nfunction applySimpleItemMutations(\n document: ItemDocument,\n options: UpdateCommandOptions,\n statusRegistry: RuntimeStatusRegistry,\n changedFields: string[],\n): string {\n if (options.title !== undefined) {\n document.metadata.title = requireStringOption(options.title, \"--title\");\n changedFields.push(\"title\");\n }\n if (options.description !== undefined) {\n document.metadata.description = options.description;\n changedFields.push(\"description\");\n }\n if (options.body !== undefined) {\n document.body = options.body;\n changedFields.push(\"body\");\n }\n return (\n normalizeStatusInput(document.metadata.status, statusRegistry) ??\n document.metadata.status\n );\n}\n\nfunction hasClosedAt(metadata: ItemDocument[\"metadata\"]): boolean {\n return metadata.closed_at !== undefined && metadata.closed_at !== null;\n}\n\nfunction hasClosedAtProperty(metadata: ItemDocument[\"metadata\"]): boolean {\n return metadata.closed_at !== undefined;\n}\n\nfunction applyStatusAndCloseReasonMutations(\n document: ItemDocument,\n context: Pick<\n UpdateMutationContext,\n \"options\" | \"statusRegistry\" | \"clearItemMetadataKeys\" | \"nowIso\"\n >,\n previousStatusNormalized: string,\n changedFields: string[],\n): void {\n if (context.options.status !== undefined) {\n const status = parseStatus(context.options.status, context.statusRegistry);\n document.metadata.status = status;\n changedFields.push(\"status\");\n if (\n status === context.statusRegistry.close_status &&\n !hasClosedAt(document.metadata)\n ) {\n document.metadata.closed_at = context.nowIso;\n changedFields.push(\"closed_at\");\n } else if (\n previousStatusNormalized === context.statusRegistry.close_status &&\n status !== context.statusRegistry.close_status &&\n hasClosedAtProperty(document.metadata)\n ) {\n delete document.metadata.closed_at;\n changedFields.push(\"closed_at\");\n }\n }\n if (\n context.options.closeReason !== undefined ||\n context.clearItemMetadataKeys.has(\"close_reason\")\n ) {\n if (context.clearItemMetadataKeys.has(\"close_reason\")) {\n delete document.metadata.close_reason;\n } else {\n const closeReason = context.options.closeReason?.trim() ?? \"\";\n if (closeReason.length === 0) {\n throw new PmCliError(\n \"--close-reason must not be empty\",\n EXIT_CODE.USAGE,\n );\n }\n document.metadata.close_reason = closeReason;\n }\n changedFields.push(\"close_reason\");\n return;\n }\n if (\n context.options.status !== undefined &&\n previousStatusNormalized === context.statusRegistry.close_status &&\n document.metadata.status !== context.statusRegistry.canceled_status &&\n document.metadata.close_reason !== undefined\n ) {\n delete document.metadata.close_reason;\n changedFields.push(\"close_reason\");\n }\n}\n\nfunction applyPriorityTypeAndOptions(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): string {\n let activeTypeName =\n resolveTypeName(document.metadata.type, context.typeRegistry) ??\n document.metadata.type;\n if (context.options.priority !== undefined) {\n document.metadata.priority = ensurePriority(context.options.priority);\n changedFields.push(\"priority\");\n }\n if (context.options.type !== undefined) {\n const resolvedTypeName = resolveTypeName(\n context.options.type,\n context.typeRegistry,\n );\n if (!resolvedTypeName) {\n throw new PmCliError(\n buildInvalidTypeError(\n context.options.type,\n context.typeRegistry.types,\n resolveItemTypesFilePath(context.pmRoot, context.settings.schema),\n ),\n EXIT_CODE.USAGE,\n );\n }\n document.metadata.type = resolvedTypeName;\n activeTypeName = resolvedTypeName;\n changedFields.push(\"type\");\n }\n enforceUpdateOptionsByType(\n activeTypeName,\n context.options,\n context.typeRegistry,\n context.runtimeFieldRegistry,\n context.extensionFieldNames,\n );\n applyTypeOptionMutation(document, context, activeTypeName, changedFields);\n return activeTypeName;\n}\n\nfunction applyTypeOptionMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n activeTypeName: string,\n changedFields: string[],\n): void {\n if (\n context.options.typeOption !== undefined ||\n context.clearItemMetadataKeys.has(\"type_options\")\n ) {\n if (context.clearItemMetadataKeys.has(\"type_options\")) {\n delete document.metadata.type_options;\n } else {\n const parsedTypeOptions = parseTypeOptionEntries(\n context.options.typeOption ?? [],\n );\n const validation = validateTypeOptions(\n activeTypeName,\n parsedTypeOptions,\n context.typeRegistry,\n );\n if (validation.errors.length > 0) {\n throw new PmCliError(validation.errors.join(\"; \"), EXIT_CODE.USAGE);\n }\n document.metadata.type_options = validation.normalized;\n }\n changedFields.push(\"type_options\");\n return;\n }\n if (\n context.options.type === undefined ||\n document.metadata.type_options === undefined\n ) {\n return;\n }\n const validation = validateTypeOptions(\n activeTypeName,\n document.metadata.type_options,\n context.typeRegistry,\n );\n if (validation.errors.length > 0) {\n throw new PmCliError(\n `Current type options are incompatible with type \"${activeTypeName}\". ${validation.errors.join(\"; \")}. Use --clear-type-options to clear them.`,\n EXIT_CODE.USAGE,\n );\n }\n document.metadata.type_options = validation.normalized;\n}\n\nfunction applyDependencyMutations(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n if (\n context.options.dep === undefined &&\n context.options.depRemove === undefined &&\n !context.clearItemMetadataKeys.has(\"dependencies\")\n ) {\n return;\n }\n let nextDependencies = context.clearItemMetadataKeys.has(\"dependencies\")\n ? []\n : [...(document.metadata.dependencies ?? [])];\n if (context.dependencyUpdates.additions.length > 0) {\n const seen = new Set(nextDependencies.map((entry) => dependencyKey(entry)));\n for (const addition of context.dependencyUpdates.additions) {\n const key = dependencyKey(addition);\n if (!seen.has(key)) {\n nextDependencies.push(addition);\n seen.add(key);\n }\n }\n }\n if (context.dependencyRemovals.length > 0) {\n nextDependencies = nextDependencies.filter(\n (entry) =>\n !context.dependencyRemovals.some((selector) =>\n matchesDependencySelector(entry, selector),\n ),\n );\n }\n if (nextDependencies.length === 0) {\n delete document.metadata.dependencies;\n } else {\n document.metadata.dependencies = nextDependencies;\n }\n changedFields.push(\"dependencies\");\n}\n\nfunction applyLogCollectionMutations(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n applyLogCollectionMutation(\n document,\n \"comments\",\n context.options.comment,\n context.commentUpdates.values as Comment[] | undefined,\n context.clearItemMetadataKeys,\n changedFields,\n );\n applyLogCollectionMutation(\n document,\n \"notes\",\n context.options.note,\n context.noteUpdates.values as LogNote[] | undefined,\n context.clearItemMetadataKeys,\n changedFields,\n );\n applyLogCollectionMutation(\n document,\n \"learnings\",\n context.options.learning,\n context.learningUpdates.values as LogNote[] | undefined,\n context.clearItemMetadataKeys,\n changedFields,\n );\n}\n\nfunction applyLogCollectionMutation(\n document: ItemDocument,\n key: \"comments\" | \"notes\" | \"learnings\",\n optionValue: string[] | undefined,\n values: Comment[] | LogNote[] | undefined,\n clearItemMetadataKeys: ReadonlySet<string>,\n changedFields: string[],\n): void {\n if (optionValue === undefined && !clearItemMetadataKeys.has(key)) {\n return;\n }\n if (clearItemMetadataKeys.has(key) || !values || values.length === 0) {\n delete document.metadata[key];\n } else {\n document.metadata[key] = [\n ...(document.metadata[key] ?? []),\n ...values,\n ] as never;\n }\n changedFields.push(key);\n}\n\nfunction applyEvidenceCollectionMutations(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n applyUniqueLinkedCollectionMutation(\n document,\n \"files\",\n context.options.file,\n context.fileUpdates.values,\n fileKey,\n context.clearItemMetadataKeys,\n changedFields,\n );\n applyTestCollectionMutation(document, context, changedFields);\n applyUniqueLinkedCollectionMutation(\n document,\n \"docs\",\n context.options.doc,\n context.docUpdates.values,\n docKey,\n context.clearItemMetadataKeys,\n changedFields,\n );\n}\n\nfunction applyUniqueLinkedCollectionMutation<T extends LinkedFile | LinkedDoc>(\n document: ItemDocument,\n key: \"files\" | \"docs\",\n optionValue: string[] | undefined,\n values: T[] | undefined,\n keyOf: (value: T) => string,\n clearItemMetadataKeys: ReadonlySet<string>,\n changedFields: string[],\n): void {\n if (optionValue === undefined && !clearItemMetadataKeys.has(key)) {\n return;\n }\n if (clearItemMetadataKeys.has(key) || !values || values.length === 0) {\n delete document.metadata[key];\n } else {\n const next = [...((document.metadata[key] as T[] | undefined) ?? [])];\n const seen = new Set(next.map((entry) => keyOf(entry)));\n for (const entry of values) {\n const keyValue = keyOf(entry);\n if (!seen.has(keyValue)) {\n next.push(entry);\n seen.add(keyValue);\n }\n }\n document.metadata[key] = next as never;\n }\n changedFields.push(key);\n}\n\nfunction applyTestCollectionMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n if (\n context.options.test === undefined &&\n !context.clearItemMetadataKeys.has(\"tests\")\n ) {\n return;\n }\n if (\n context.clearItemMetadataKeys.has(\"tests\") &&\n context.options.replaceTests === true\n ) {\n document.metadata.tests =\n dedupeLinkedTests(context.testUpdates.values) ?? [];\n } else if (\n context.clearItemMetadataKeys.has(\"tests\") ||\n !context.testUpdates.values ||\n context.testUpdates.values.length === 0\n ) {\n delete document.metadata.tests;\n } else {\n document.metadata.tests = dedupeLinkedTests([\n ...(document.metadata.tests ?? []),\n ...context.testUpdates.values,\n ]);\n }\n if (\n document.metadata.tests !== undefined &&\n document.metadata.tests.length === 0\n ) {\n delete document.metadata.tests;\n }\n changedFields.push(\"tests\");\n}\n\nfunction dedupeLinkedTests(\n values: LinkedTest[] | undefined,\n): LinkedTest[] | undefined {\n if (!values || values.length === 0) {\n return undefined;\n }\n const next: LinkedTest[] = [];\n const seen = new Set<string>();\n for (const entry of values) {\n const key = testKey(entry);\n if (!seen.has(key)) {\n next.push(entry);\n seen.add(key);\n }\n }\n return next;\n}\n\nfunction applyTagsAndPlanningMutations(\n document: ItemDocument,\n context: UpdateMutationContext,\n scalarMutationContext: UpdateScalarMutationContext,\n): void {\n const addTagsValues = context.options.addTags;\n const removeTagsValues = context.options.removeTags;\n const hasAdditiveTagMutation =\n (Array.isArray(addTagsValues) && addTagsValues.length > 0) ||\n (Array.isArray(removeTagsValues) && removeTagsValues.length > 0);\n if (\n context.options.tags !== undefined ||\n context.clearItemMetadataKeys.has(\"tags\") ||\n hasAdditiveTagMutation\n ) {\n const baseTags = context.clearItemMetadataKeys.has(\"tags\")\n ? []\n : context.options.tags !== undefined\n ? parseTags(context.options.tags)\n : Array.isArray(document.metadata.tags)\n ? [...(document.metadata.tags as string[])]\n : [];\n document.metadata.tags = applyTagRemovals(\n mergeAdditiveTags(baseTags, addTagsValues),\n removeTagsValues,\n );\n scalarMutationContext.changedFields.push(\"tags\");\n }\n applyUpdateScalarMutations(\n UPDATE_POST_TAG_SCALAR_MUTATIONS,\n context.options,\n scalarMutationContext,\n );\n applyOrderMutation(document, context, scalarMutationContext.changedFields);\n}\n\nfunction applyOrderMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n const orderRaw = context.options.order ?? context.options.rank;\n if (orderRaw === undefined && !context.clearItemMetadataKeys.has(\"order\")) {\n return;\n }\n if (context.clearItemMetadataKeys.has(\"order\")) {\n delete document.metadata.order;\n } else {\n const parsedOrder = parseOptionalNumber(orderRaw ?? \"\", \"order\");\n if (!Number.isInteger(parsedOrder)) {\n throw new PmCliError(\"Order must be an integer\", EXIT_CODE.USAGE);\n }\n document.metadata.order = parsedOrder;\n }\n changedFields.push(\"order\");\n}\n\nfunction applyOwnershipAndIssueMutations(\n document: ItemDocument,\n context: UpdateMutationContext,\n scalarMutationContext: UpdateScalarMutationContext,\n warnings: string[],\n): void {\n applyAssigneeMutation(document, context, scalarMutationContext.changedFields);\n applyParentMutation(document, context, scalarMutationContext.changedFields);\n applyUpdateScalarMutations(\n UPDATE_STAKEHOLDER_SCALAR_MUTATIONS,\n context.options,\n scalarMutationContext,\n );\n applySprintReleaseMutation(\n document,\n context,\n \"sprint\",\n warnings,\n scalarMutationContext.changedFields,\n );\n applySprintReleaseMutation(\n document,\n context,\n \"release\",\n warnings,\n scalarMutationContext.changedFields,\n );\n applyBlockedByMutation(\n document,\n context,\n scalarMutationContext.changedFields,\n );\n applyUpdateScalarMutations(\n UPDATE_ISSUE_SCALAR_MUTATIONS,\n context.options,\n scalarMutationContext,\n );\n}\n\nfunction applyAssigneeMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n if (\n context.options.assignee === undefined &&\n !context.clearItemMetadataKeys.has(\"assignee\")\n ) {\n return;\n }\n if (context.clearItemMetadataKeys.has(\"assignee\")) {\n delete document.metadata.assignee;\n } else {\n const assignee = context.options.assignee?.trim() ?? \"\";\n if (assignee === \"\") {\n throw new PmCliError(\n \"--assignee must not be empty. Use --unset assignee to clear it.\",\n EXIT_CODE.USAGE,\n );\n }\n document.metadata.assignee = assignee;\n }\n changedFields.push(\"assignee\");\n}\n\nfunction applyParentMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n if (\n context.options.parent === undefined &&\n !context.clearItemMetadataKeys.has(\"parent\")\n ) {\n return;\n }\n if (context.clearItemMetadataKeys.has(\"parent\")) {\n delete document.metadata.parent;\n } else {\n document.metadata.parent = context.resolvedParentValue ?? \"\";\n }\n changedFields.push(\"parent\");\n}\n\nfunction applySprintReleaseMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n key: \"sprint\" | \"release\",\n warnings: string[],\n changedFields: string[],\n): void {\n if (\n context.options[key] === undefined &&\n !context.clearItemMetadataKeys.has(key)\n ) {\n return;\n }\n if (context.clearItemMetadataKeys.has(key)) {\n delete document.metadata[key];\n } else {\n const validation = validateSprintOrReleaseValue(\n key,\n context.options[key] ?? \"\",\n context.settings.validation.sprint_release_format,\n );\n document.metadata[key] = validation.value;\n warnings.push(...validation.warnings);\n }\n changedFields.push(key);\n}\n\nfunction applyBlockedByMutation(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n if (\n context.options.blockedBy === undefined &&\n !context.clearItemMetadataKeys.has(\"blocked_by\")\n ) {\n return;\n }\n if (context.clearItemMetadataKeys.has(\"blocked_by\")) {\n delete document.metadata.blocked_by;\n } else {\n document.metadata.blocked_by = context.options.blockedBy?.trim() ?? \"\";\n }\n changedFields.push(\"blocked_by\");\n if (\n context.clearItemMetadataKeys.has(\"blocked_by\") ||\n context.resolvedBlockedByDependencyId !== undefined\n ) {\n applyBlockedByDependencyEdge(\n document.metadata,\n context.resolvedBlockedByDependencyId,\n context.nowIso,\n context.author,\n changedFields,\n );\n }\n}\n\nfunction applyScheduleMutations(\n document: ItemDocument,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n if (\n context.options.reminder !== undefined ||\n context.clearItemMetadataKeys.has(\"reminders\")\n ) {\n if (context.clearItemMetadataKeys.has(\"reminders\")) {\n delete document.metadata.reminders;\n } else {\n document.metadata.reminders = parseReminderEntries(\n context.options.reminder ?? [],\n context.nowValue,\n { valueMode: \"trimmed\" },\n );\n }\n changedFields.push(\"reminders\");\n }\n if (\n context.options.event !== undefined ||\n context.clearItemMetadataKeys.has(\"events\")\n ) {\n if (context.clearItemMetadataKeys.has(\"events\")) {\n delete document.metadata.events;\n } else {\n document.metadata.events = parseEventEntries(\n context.options.event ?? [],\n context.nowValue,\n {\n allDayEmptyGuard: \"truthy\",\n recurrenceEmptyNumericGuard: \"truthy\",\n },\n );\n }\n changedFields.push(\"events\");\n }\n}\n\nfunction applyRuntimeAndRegisteredFieldMutations(\n metadataRecord: Record<string, unknown>,\n context: UpdateMutationContext,\n changedFields: string[],\n): void {\n clearDynamicFields(\n metadataRecord,\n context.runtimeFieldRegistry.definitions.map(\n (definition) => definition.metadata_key,\n ),\n context.clearItemMetadataKeys,\n changedFields,\n );\n clearDynamicFields(\n metadataRecord,\n context.extensionFieldNames,\n context.clearItemMetadataKeys,\n changedFields,\n );\n for (const [fieldKey, fieldValue] of Object.entries(\n context.runtimeFieldUpdates,\n )) {\n if (context.clearItemMetadataKeys.has(fieldKey)) {\n const fieldFlag = fieldKey.replaceAll(\"_\", \"-\");\n const definition = context.runtimeFieldRegistry.definitions.find(\n (candidate) => candidate.metadata_key === fieldKey,\n );\n const updateFlag = definition?.cli_flag ?? fieldFlag;\n throw new PmCliError(\n `Cannot combine --unset ${fieldFlag} with --${updateFlag}`,\n EXIT_CODE.USAGE,\n );\n }\n if (stableValueEquals(metadataRecord[fieldKey], fieldValue)) {\n continue;\n }\n metadataRecord[fieldKey] = fieldValue;\n changedFields.push(fieldKey);\n }\n\n const registeredItemFieldUpdates = parseRegisteredItemFieldAssignments(\n context.options.field,\n context.extensionRegistrations,\n );\n for (const fieldKey of Object.keys(registeredItemFieldUpdates)) {\n if (context.clearItemMetadataKeys.has(fieldKey)) {\n throw new PmCliError(\n `Cannot combine --unset ${fieldKey.replaceAll(\"_\", \"-\")} with --field ${fieldKey}=...`,\n EXIT_CODE.USAGE,\n );\n }\n }\n for (const [fieldKey, fieldValue] of Object.entries(\n registeredItemFieldUpdates,\n )) {\n if (!stableValueEquals(metadataRecord[fieldKey], fieldValue)) {\n metadataRecord[fieldKey] = fieldValue;\n changedFields.push(fieldKey);\n }\n }\n}\n\nfunction clearDynamicFields(\n metadataRecord: Record<string, unknown>,\n fieldKeys: readonly string[],\n clearItemMetadataKeys: ReadonlySet<string>,\n changedFields: string[],\n): void {\n for (const fieldKey of fieldKeys) {\n if (\n !clearItemMetadataKeys.has(fieldKey) ||\n metadataRecord[fieldKey] === undefined\n ) {\n continue;\n }\n delete metadataRecord[fieldKey];\n changedFields.push(fieldKey);\n }\n}\n\nfunction mutateUpdateDocument(\n document: ItemDocument,\n context: UpdateMutationContext,\n): { changedFields: string[]; warnings: string[] } {\n const beforeMetadata = structuredClone(toItemRecord(document.metadata));\n const beforeBody = document.body;\n const changedFields: string[] = [];\n const warnings: string[] = [];\n const previousStatusNormalized = applySimpleItemMutations(\n document,\n context.options,\n context.statusRegistry,\n changedFields,\n );\n const metadataRecord = toItemRecord(document.metadata);\n const scalarMutationContext: UpdateScalarMutationContext = {\n metadataRecord,\n clearItemMetadataKeys: context.clearItemMetadataKeys,\n changedFields,\n nowValue: context.nowValue,\n };\n\n applyStatusAndCloseReasonMutations(\n document,\n context,\n previousStatusNormalized,\n changedFields,\n );\n applyPriorityTypeAndOptions(document, context, changedFields);\n applyDependencyMutations(document, context, changedFields);\n applyLogCollectionMutations(document, context, changedFields);\n applyEvidenceCollectionMutations(document, context, changedFields);\n applyTagsAndPlanningMutations(document, context, scalarMutationContext);\n applyOwnershipAndIssueMutations(\n document,\n context,\n scalarMutationContext,\n warnings,\n );\n if (\n normalizeStatusInput(document.metadata.status, context.statusRegistry) ===\n context.statusRegistry.canceled_status &&\n document.metadata.assignee !== undefined\n ) {\n delete document.metadata.assignee;\n if (!changedFields.includes(\"assignee\")) {\n changedFields.push(\"assignee\");\n }\n }\n applyScheduleMutations(document, context, changedFields);\n applyRuntimeAndRegisteredFieldMutations(\n metadataRecord,\n context,\n changedFields,\n );\n try {\n applyRegisteredItemFieldDefaultsAndValidation(\n metadataRecord,\n context.extensionRegistrations,\n { skipDefaultFields: context.clearItemMetadataKeys },\n );\n } catch (error: unknown) {\n throw new PmCliError(\n error instanceof Error\n ? error.message\n : \"Invalid extension item field values\",\n EXIT_CODE.USAGE,\n );\n }\n const afterMetadata = toItemRecord(document.metadata);\n const actualChangedFields = [...new Set(changedFields)].filter((field) =>\n field === \"body\"\n ? document.body !== beforeBody\n : !stableValueEquals(beforeMetadata[field], afterMetadata[field]),\n );\n return { changedFields: actualChangedFields, warnings };\n}\n\n/** Implements run update for the public runtime surface of this module. */\nexport async function runUpdate(\n id: string,\n options: UpdateCommandOptions,\n global: GlobalOptions,\n): Promise<UpdateResult> {\n options = await resolveStdinUpdateOptions(options);\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n await assertUpdateTrackerInitialized(pmRoot);\n const settings = await readSettings(pmRoot);\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const runtimeFieldRegistry = resolveRuntimeFieldRegistry(settings.schema);\n const extensionRegistrations = getActiveExtensionRegistrations();\n const extensionFieldNames = collectRegisteredItemFieldNames(\n extensionRegistrations,\n );\n const typeRegistry = resolveItemTypeRegistry(\n settings,\n extensionRegistrations,\n );\n // Per-type allowed-transition enforcement is read RAW (not preset-derived) so\n // existing projects are unaffected when unset; defaults to \"off\".\n const workflowEnforcement: GovernanceWorkflowEnforcement =\n settings.governance.workflow_enforcement ?? \"off\";\n const typeWorkflows =\n workflowEnforcement === \"off\" ? [] : resolveTypeWorkflows(settings.schema);\n const parentReferencePolicy = settings.validation.parent_reference;\n const unsetTargets = parseUpdateUnsetTargets(\n options.unset,\n runtimeFieldRegistry,\n extensionFieldNames,\n );\n const clearOptionKeys = new Set<string>(unsetTargets.optionKeys);\n const clearItemMetadataKeys = new Set<string>(unsetTargets.metadataKeys);\n\n validateReplaceOptions(options);\n applyClearCollectionDefinitions({\n definitions: buildClearCollectionDefinitions(options),\n options,\n clearOptionKeys,\n clearItemMetadataKeys,\n });\n enforceOwnershipBypassScope(id, options, clearItemMetadataKeys);\n\n rejectUnsetScalarConflicts(options, unsetTargets);\n rejectLegacyScalarTokens(options);\n\n const author = toAuthor(options.author, settings.author_default);\n const nowValue = new Date();\n const nowIso = nowValue.toISOString();\n const dependencyUpdates = parseDependencyAdditions(\n options.dep,\n settings.id_prefix,\n nowIso,\n );\n const dependencyRemovals = parseDependencyRemovals(\n options.depRemove,\n settings.id_prefix,\n );\n const parsedCommentUpdates = parseLogSeed(\n \"--comment\",\n options.comment,\n nowIso,\n author,\n );\n const commentUpdates =\n options.ownershipMetadataBypass === true && parsedCommentUpdates.values\n ? {\n ...parsedCommentUpdates,\n values: parsedCommentUpdates.values.map((entry) => ({\n ...entry,\n author,\n })),\n }\n : parsedCommentUpdates;\n const noteUpdates = parseLogSeed(\"--note\", options.note, nowIso, author);\n const learningUpdates = parseLogSeed(\n \"--learning\",\n options.learning,\n nowIso,\n author,\n );\n const fileUpdates = parseFiles(options.file);\n const testUpdates = parseTests(options.test);\n const docUpdates = parseDocs(options.doc);\n const workflowTransitionWarnings: string[] = [];\n const parentReference = await resolveParentReferenceForUpdate({\n id,\n options,\n unsetTargets,\n pmRoot,\n settings,\n typeRegistry,\n parentReferencePolicy,\n });\n\n // pm-kyd6: resolve the --blocked-by target up front (async) so the sync\n // mutate callback can mirror create.ts and add a `blocked_by` dependency edge.\n const blockedByResolution = await resolveBlockedByDependencyTarget(\n options.blockedBy,\n clearItemMetadataKeys.has(\"blocked_by\"),\n pmRoot,\n settings.id_prefix,\n settings.item_format,\n typeRegistry.type_to_folder,\n );\n const resolvedBlockedByDependencyId = blockedByResolution.id;\n const parentReferenceWarnings = [\n ...parentReference.warnings,\n ...blockedByResolutionWarnings(blockedByResolution),\n ];\n\n const runtimeFieldUpdates = collectRuntimeUpdateFieldValues(\n options as Record<string, unknown>,\n runtimeFieldRegistry,\n options.runtimeFieldCommands,\n );\n const fieldFlags = buildUpdateFieldFlags(options, runtimeFieldUpdates);\n const changedFlags = Object.values(fieldFlags).some(Boolean);\n\n if (!changedFlags) {\n return buildNoopUpdateResult({ pmRoot, id, settings, typeRegistry });\n }\n\n workflowTransitionWarnings.push(\n ...(await collectWorkflowTransitionWarnings({\n options,\n fieldFlags,\n workflowEnforcement,\n typeWorkflows,\n statusRegistry,\n typeRegistry,\n pmRoot,\n id,\n settings,\n })),\n );\n const routedClose = await routeCloseStatusUpdate({\n options,\n fieldFlags,\n statusRegistry,\n workflowTransitionWarnings,\n global,\n id,\n });\n if (routedClose) {\n return routedClose;\n }\n assertMatchingOrderRank(options);\n\n const result = await mutateItem({\n pmRoot,\n settings,\n typeToFolder: typeRegistry.type_to_folder,\n id,\n op:\n options.ownershipMetadataBypass === true || options.ownershipDependencyBypass === true\n ? \"update_ownership_bypass\"\n : \"update\",\n author,\n message: options.message,\n force: options.force,\n bypassAssigneeConflict:\n options.ownershipMetadataBypass === true || options.ownershipDependencyBypass === true,\n extensionFieldNames,\n skipNoop: true,\n mutate(document) {\n return mutateUpdateDocument(document, {\n options,\n settings,\n typeRegistry,\n statusRegistry,\n runtimeFieldRegistry,\n extensionRegistrations,\n extensionFieldNames,\n clearItemMetadataKeys,\n dependencyUpdates,\n dependencyRemovals,\n commentUpdates,\n noteUpdates,\n learningUpdates,\n fileUpdates,\n testUpdates,\n docUpdates,\n resolvedParentValue: parentReference.resolvedParentValue,\n resolvedBlockedByDependencyId,\n runtimeFieldUpdates,\n nowValue,\n nowIso,\n author,\n pmRoot,\n });\n },\n });\n\n return {\n item: toItemRecord(result.item),\n changed_fields: result.changedFields,\n warnings: [\n ...workflowTransitionWarnings,\n ...parentReferenceWarnings,\n ...result.warnings,\n ],\n };\n}\n\n/* c8 ignore stop */\n/** Public contract for test only update command, shared by SDK and presentation-layer consumers. */\nexport const _testOnlyUpdateCommand = {\n applyStatusAndCloseReasonMutations,\n collectProvidedUpdatePolicyOptions,\n buildOwnershipBypassRestrictedOptionsError,\n enforceOwnershipBypassScope,\n enforceTypeWorkflowTransition,\n matchesDependencySelector,\n normalizeLegacyNoneUpdateOptions,\n normalizeUpdatePolicyOptionKey,\n parseDependencyAdditions,\n parseDependencyRemovals,\n parseUpdateUnsetTargets,\n reconcileBlockedByDependency,\n resolveRuntimeUnsetDefinition: (\n token: string,\n registry: RuntimeFieldRegistry | undefined,\n ) => resolveRuntimeUnsetFieldDefinition(token, \"update\", registry),\n};\n"],"names":["disallowedFlags","validation"],"mappings":"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","debugId":"3aa2c8db-8ac9-5f0a-af70-d8ee2bd6f5db"}
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3d4f2f59-58e6-53e5-b8c5-8023feda0408")}catch(e){}}();
|
|
3
|
-
import {
|
|
4
|
-
acquireLock
|
|
5
|
-
} from "./chunk-P22HGFFI.js";
|
|
6
|
-
|
|
7
|
-
// dist/sdk/context-usage.js
|
|
8
|
-
import { randomUUID } from "node:crypto";
|
|
9
|
-
import { appendFile, mkdir, readFile, rename, stat, writeFile } from "node:fs/promises";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
var DEFAULT_MAX_EVENTS = 2048;
|
|
12
|
-
var DEFAULT_RETENTION_DAYS = 30;
|
|
13
|
-
var DAY_MS = 864e5;
|
|
14
|
-
var DEFAULT_COMPACTION_BYTES = 262144;
|
|
15
|
-
var CONTEXT_USAGE_LOCK_ID = "context-usage-ledger";
|
|
16
|
-
function ledgerPath(pmRoot) {
|
|
17
|
-
return path.join(pmRoot, "runtime", "context-usage.jsonl");
|
|
18
|
-
}
|
|
19
|
-
function resolveNow(options) {
|
|
20
|
-
const iso = options.now ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
21
|
-
const ms = Date.parse(iso);
|
|
22
|
-
if (!Number.isFinite(ms))
|
|
23
|
-
throw new TypeError("Context usage now must be a valid timestamp");
|
|
24
|
-
return { iso: new Date(ms).toISOString(), ms };
|
|
25
|
-
}
|
|
26
|
-
async function readEvents(options) {
|
|
27
|
-
try {
|
|
28
|
-
const text = await readFile(ledgerPath(options.pmRoot), "utf8");
|
|
29
|
-
const events = text.split("\n").filter(Boolean).flatMap((line) => {
|
|
30
|
-
try {
|
|
31
|
-
return [JSON.parse(line)];
|
|
32
|
-
} catch {
|
|
33
|
-
return [];
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
const maxEvents = options.maxEvents ?? DEFAULT_MAX_EVENTS;
|
|
37
|
-
const retentionDays = options.retentionDays ?? DEFAULT_RETENTION_DAYS;
|
|
38
|
-
const cutoff = resolveNow(options).ms - retentionDays * DAY_MS;
|
|
39
|
-
return events.filter((entry) => Date.parse(entry.at) >= cutoff).slice(-maxEvents);
|
|
40
|
-
} catch {
|
|
41
|
-
return [];
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
async function appendEvents(options, events) {
|
|
45
|
-
const maxEvents = options.maxEvents ?? DEFAULT_MAX_EVENTS;
|
|
46
|
-
const retentionDays = options.retentionDays ?? DEFAULT_RETENTION_DAYS;
|
|
47
|
-
if (!Number.isInteger(maxEvents) || maxEvents < 1 || !Number.isFinite(retentionDays) || retentionDays <= 0) {
|
|
48
|
-
throw new TypeError("Context usage retention requires positive maxEvents and retentionDays");
|
|
49
|
-
}
|
|
50
|
-
const target = ledgerPath(options.pmRoot);
|
|
51
|
-
const runtimeDirectory = path.dirname(target);
|
|
52
|
-
const releaseLock = await acquireLock(options.pmRoot, CONTEXT_USAGE_LOCK_ID, 30, `context-usage:${process.pid}`, false, false, 3e3);
|
|
53
|
-
try {
|
|
54
|
-
await mkdir(runtimeDirectory, { recursive: true });
|
|
55
|
-
await appendFile(target, events.map((event) => `${JSON.stringify(event)}
|
|
56
|
-
`).join(""), "utf8");
|
|
57
|
-
const customBounds = options.maxEvents !== void 0 || options.retentionDays !== void 0;
|
|
58
|
-
if (!customBounds && (await stat(target)).size <= DEFAULT_COMPACTION_BYTES)
|
|
59
|
-
return;
|
|
60
|
-
const retained = await readEvents(options);
|
|
61
|
-
const temporary = `${target}.${process.pid}.${randomUUID()}.tmp`;
|
|
62
|
-
await writeFile(temporary, `${retained.map((entry) => JSON.stringify(entry)).join("\n")}
|
|
63
|
-
`, "utf8");
|
|
64
|
-
await rename(temporary, target);
|
|
65
|
-
} finally {
|
|
66
|
-
await releaseLock();
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
async function appendEvent(options, event) {
|
|
70
|
-
await appendEvents(options, [event]);
|
|
71
|
-
}
|
|
72
|
-
async function recordContextUsageServing(options) {
|
|
73
|
-
if (process.env.PM_CONTEXT_USAGE_DISABLED === "1" || options.enabled === false)
|
|
74
|
-
return;
|
|
75
|
-
if (!options.author.trim() || options.rows.some((row) => !row.id.trim() || !Number.isInteger(row.rank) || row.rank < 1)) {
|
|
76
|
-
throw new TypeError("Context usage serving requires an author and valid ranked rows");
|
|
77
|
-
}
|
|
78
|
-
await appendEvent(options, {
|
|
79
|
-
kind: "serve",
|
|
80
|
-
at: resolveNow(options).iso,
|
|
81
|
-
author: options.author.trim(),
|
|
82
|
-
surface: options.surface,
|
|
83
|
-
profile: options.profile.trim() || "balanced",
|
|
84
|
-
rows: options.rows
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
async function recordContextUsageTouch(options) {
|
|
88
|
-
if (process.env.PM_CONTEXT_USAGE_DISABLED === "1" || options.enabled === false)
|
|
89
|
-
return;
|
|
90
|
-
if (!options.author.trim() || !options.itemId.trim() || !options.intent.trim()) {
|
|
91
|
-
throw new TypeError("Context usage touch requires author, itemId, and intent");
|
|
92
|
-
}
|
|
93
|
-
await appendEvent(options, {
|
|
94
|
-
kind: "touch",
|
|
95
|
-
at: resolveNow(options).iso,
|
|
96
|
-
author: options.author.trim(),
|
|
97
|
-
item_id: options.itemId.trim(),
|
|
98
|
-
intent: options.intent.trim()
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
async function recordContextUsageTouches(options) {
|
|
102
|
-
if (process.env.PM_CONTEXT_USAGE_DISABLED === "1" || options.enabled === false || options.itemIds.length === 0)
|
|
103
|
-
return;
|
|
104
|
-
const author = options.author.trim();
|
|
105
|
-
const intent = options.intent.trim();
|
|
106
|
-
if (!author || !intent) {
|
|
107
|
-
throw new TypeError("Context usage touch requires author and intent");
|
|
108
|
-
}
|
|
109
|
-
const itemIds = /* @__PURE__ */ new Set();
|
|
110
|
-
for (const itemId of options.itemIds) {
|
|
111
|
-
if (typeof itemId !== "string") {
|
|
112
|
-
throw new TypeError("Context usage touch requires string itemIds");
|
|
113
|
-
}
|
|
114
|
-
const trimmedId = itemId.trim();
|
|
115
|
-
if (!trimmedId)
|
|
116
|
-
throw new TypeError("Context usage touch requires non-empty itemId");
|
|
117
|
-
itemIds.add(trimmedId);
|
|
118
|
-
}
|
|
119
|
-
const at = resolveNow(options).iso;
|
|
120
|
-
const events = [...itemIds].map((itemId) => ({ kind: "touch", at, author, item_id: itemId, intent }));
|
|
121
|
-
await appendEvents(options, events);
|
|
122
|
-
}
|
|
123
|
-
function findTouchTimeInHorizon(touches, itemId, servedAt, horizonMs) {
|
|
124
|
-
return touches.find(({ entry, time }) => entry.item_id === itemId && time >= servedAt && time - servedAt <= horizonMs)?.time;
|
|
125
|
-
}
|
|
126
|
-
async function readContextUsageAffinity(options) {
|
|
127
|
-
if (process.env.PM_CONTEXT_USAGE_DISABLED === "1" || options.enabled === false)
|
|
128
|
-
return { affinity: {}, positive_judgments: 0, serving_events: 0 };
|
|
129
|
-
const events = await readEvents(options);
|
|
130
|
-
const now = resolveNow(options).ms;
|
|
131
|
-
const horizonMs = (options.horizonHours ?? 24) * 36e5;
|
|
132
|
-
if (!Number.isFinite(horizonMs) || horizonMs <= 0)
|
|
133
|
-
throw new TypeError("Context usage horizonHours must be positive");
|
|
134
|
-
const author = options.author.trim();
|
|
135
|
-
const touches = events.filter((event) => event.kind === "touch" && event.author === author).map((entry) => ({ entry, time: Date.parse(entry.at) }));
|
|
136
|
-
const scores = /* @__PURE__ */ new Map();
|
|
137
|
-
let servingEvents = 0;
|
|
138
|
-
let positiveJudgments = 0;
|
|
139
|
-
for (const event of events) {
|
|
140
|
-
if (event.kind !== "serve" || event.author !== author)
|
|
141
|
-
continue;
|
|
142
|
-
servingEvents += 1;
|
|
143
|
-
const servedAt = Date.parse(event.at);
|
|
144
|
-
for (const row of event.rows) {
|
|
145
|
-
if (!row.included)
|
|
146
|
-
continue;
|
|
147
|
-
const touchTime = findTouchTimeInHorizon(touches, row.id, servedAt, horizonMs);
|
|
148
|
-
if (touchTime === void 0)
|
|
149
|
-
continue;
|
|
150
|
-
positiveJudgments += 1;
|
|
151
|
-
const ageDays = Math.max(0, (now - touchTime) / DAY_MS);
|
|
152
|
-
scores.set(row.id, (scores.get(row.id) ?? 0) + Math.exp(-ageDays / 14));
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
const maximum = Math.max(0, ...scores.values());
|
|
156
|
-
const affinity = Object.fromEntries([...scores.entries()].map(([id, score]) => [
|
|
157
|
-
id,
|
|
158
|
-
0.05 + 0.95 * (maximum > 0 ? score / maximum : 0)
|
|
159
|
-
]));
|
|
160
|
-
return {
|
|
161
|
-
affinity,
|
|
162
|
-
positive_judgments: positiveJudgments,
|
|
163
|
-
serving_events: servingEvents
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export {
|
|
168
|
-
recordContextUsageServing,
|
|
169
|
-
recordContextUsageTouch,
|
|
170
|
-
recordContextUsageTouches,
|
|
171
|
-
readContextUsageAffinity
|
|
172
|
-
};
|
|
173
|
-
//# sourceMappingURL=chunk-YJSURTBB.js.map
|
|
174
|
-
|
|
175
|
-
//# debugId=3d4f2f59-58e6-53e5-b8c5-8023feda0408
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../sdk/context-usage.ts"],"sourcesContent":["/**\n * @module sdk/context-usage\n *\n * Privacy-minimal, derived context-usage feedback primitives. The JSONL ledger\n * contains only item ids, timestamps, authors, ranks, profiles, and command\n * intents; it never enters item history and is safe to delete or rebuild.\n */\nimport { randomUUID } from \"node:crypto\";\nimport {\n appendFile,\n mkdir,\n readFile,\n rename,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { acquireLock } from \"../core/lock/lock.js\";\nimport type { ContextRelevanceSurface } from \"./context-relevance.js\";\n\n/** One propensity row disclosed when context or next serves a candidate. */\nexport interface ContextUsageServingRow {\n /** Served item identifier. */\n id: string;\n /** One-based scorer rank. */\n rank: number;\n /** Whether the packer included the item. */\n included: boolean;\n}\n\n/** Append-only serving or subsequent-touch event. */\nexport type ContextUsageEvent =\n | {\n kind: \"serve\";\n at: string;\n author: string;\n surface: ContextRelevanceSurface;\n profile: string;\n rows: ContextUsageServingRow[];\n }\n | {\n kind: \"touch\";\n at: string;\n author: string;\n item_id: string;\n intent: string;\n };\n\n/** Runtime controls for the bounded derived ledger. */\nexport interface ContextUsageLedgerOptions {\n /** Tracker root containing the runtime directory. */\n pmRoot: string;\n /** Disable all reads and writes with zero filesystem work. */\n enabled?: boolean;\n /** Maximum retained event rows. */\n maxEvents?: number;\n /** Retention horizon in days. */\n retentionDays?: number;\n /** Deterministic timestamp override. */\n now?: string;\n}\n\n/** Decayed per-item affinity derived for one author. */\nexport interface ContextUsageAffinity {\n /** Normalized affinity by item id. */\n affinity: Record<string, number>;\n /** Number of eligible served-then-touched judgments. */\n positive_judgments: number;\n /** Number of retained serving events inspected. */\n serving_events: number;\n}\n\nconst DEFAULT_MAX_EVENTS = 2_048;\nconst DEFAULT_RETENTION_DAYS = 30;\nconst DAY_MS = 86_400_000;\nconst DEFAULT_COMPACTION_BYTES = 262_144;\nconst CONTEXT_USAGE_LOCK_ID = \"context-usage-ledger\";\n\nfunction ledgerPath(pmRoot: string): string {\n return path.join(pmRoot, \"runtime\", \"context-usage.jsonl\");\n}\n\nfunction resolveNow(options: ContextUsageLedgerOptions): {\n iso: string;\n ms: number;\n} {\n const iso = options.now ?? new Date().toISOString();\n const ms = Date.parse(iso);\n if (!Number.isFinite(ms))\n throw new TypeError(\"Context usage now must be a valid timestamp\");\n return { iso: new Date(ms).toISOString(), ms };\n}\n\nasync function readEvents(\n options: ContextUsageLedgerOptions,\n): Promise<ContextUsageEvent[]> {\n try {\n const text = await readFile(ledgerPath(options.pmRoot), \"utf8\");\n const events = text\n .split(\"\\n\")\n .filter(Boolean)\n .flatMap((line) => {\n try {\n return [JSON.parse(line) as ContextUsageEvent];\n } catch {\n return [];\n }\n });\n const maxEvents = options.maxEvents ?? DEFAULT_MAX_EVENTS;\n const retentionDays = options.retentionDays ?? DEFAULT_RETENTION_DAYS;\n const cutoff = resolveNow(options).ms - retentionDays * DAY_MS;\n return events\n .filter((entry) => Date.parse(entry.at) >= cutoff)\n .slice(-maxEvents);\n } catch {\n return [];\n }\n}\n\nasync function appendEvents(\n options: ContextUsageLedgerOptions,\n events: readonly ContextUsageEvent[],\n): Promise<void> {\n const maxEvents = options.maxEvents ?? DEFAULT_MAX_EVENTS;\n const retentionDays = options.retentionDays ?? DEFAULT_RETENTION_DAYS;\n if (\n !Number.isInteger(maxEvents) ||\n maxEvents < 1 ||\n !Number.isFinite(retentionDays) ||\n retentionDays <= 0\n ) {\n throw new TypeError(\n \"Context usage retention requires positive maxEvents and retentionDays\",\n );\n }\n const target = ledgerPath(options.pmRoot);\n const runtimeDirectory = path.dirname(target);\n const releaseLock = await acquireLock(\n options.pmRoot,\n CONTEXT_USAGE_LOCK_ID,\n 30,\n `context-usage:${process.pid}`,\n false,\n false,\n 3_000,\n );\n try {\n await mkdir(runtimeDirectory, { recursive: true });\n await appendFile(target, events.map((event) => `${JSON.stringify(event)}\\n`).join(\"\"), \"utf8\");\n const customBounds =\n options.maxEvents !== undefined || options.retentionDays !== undefined;\n if (!customBounds && (await stat(target)).size <= DEFAULT_COMPACTION_BYTES)\n return;\n const retained = await readEvents(options);\n const temporary = `${target}.${process.pid}.${randomUUID()}.tmp`;\n await writeFile(\n temporary,\n `${retained.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`,\n \"utf8\",\n );\n await rename(temporary, target);\n } finally {\n await releaseLock();\n }\n}\n\nasync function appendEvent(\n options: ContextUsageLedgerOptions,\n event: ContextUsageEvent,\n): Promise<void> {\n await appendEvents(options, [event]);\n}\n\n/** Records a propensity-complete context/next serving event. */\nexport async function recordContextUsageServing(\n options: ContextUsageLedgerOptions & {\n author: string;\n surface: ContextRelevanceSurface;\n profile: string;\n rows: ContextUsageServingRow[];\n },\n): Promise<void> {\n if (process.env.PM_CONTEXT_USAGE_DISABLED === \"1\" || options.enabled === false) return;\n if (\n !options.author.trim() ||\n options.rows.some(\n (row) => !row.id.trim() || !Number.isInteger(row.rank) || row.rank < 1,\n )\n ) {\n throw new TypeError(\n \"Context usage serving requires an author and valid ranked rows\",\n );\n }\n await appendEvent(options, {\n kind: \"serve\",\n at: resolveNow(options).iso,\n author: options.author.trim(),\n surface: options.surface,\n profile: options.profile.trim() || \"balanced\",\n rows: options.rows,\n });\n}\n\n/** Records one subsequent item read or mutation outcome. */\nexport async function recordContextUsageTouch(\n options: ContextUsageLedgerOptions & {\n author: string;\n itemId: string;\n intent: string;\n },\n): Promise<void> {\n if (process.env.PM_CONTEXT_USAGE_DISABLED === \"1\" || options.enabled === false) return;\n if (\n !options.author.trim() ||\n !options.itemId.trim() ||\n !options.intent.trim()\n ) {\n throw new TypeError(\n \"Context usage touch requires author, itemId, and intent\",\n );\n }\n await appendEvent(options, {\n kind: \"touch\",\n at: resolveNow(options).iso,\n author: options.author.trim(),\n item_id: options.itemId.trim(),\n intent: options.intent.trim(),\n });\n}\n\n/**\n * Records mutation outcomes as one append and one optional compaction pass.\n */\nexport async function recordContextUsageTouches(\n options: ContextUsageLedgerOptions & {\n /** Stable caller identity used to isolate affinity. */\n author: string;\n /** Item identifiers affected by the completed command. */\n itemIds: readonly string[];\n /** Command or workflow intent associated with the touches. */\n intent: string;\n },\n): Promise<void> {\n if (process.env.PM_CONTEXT_USAGE_DISABLED === \"1\" || options.enabled === false || options.itemIds.length === 0) return;\n const author = options.author.trim();\n const intent = options.intent.trim();\n if (!author || !intent) {\n throw new TypeError(\"Context usage touch requires author and intent\");\n }\n const itemIds = new Set<string>();\n for (const itemId of options.itemIds) {\n if (typeof itemId !== \"string\") {\n throw new TypeError(\"Context usage touch requires string itemIds\");\n }\n const trimmedId = itemId.trim();\n if (!trimmedId) throw new TypeError(\"Context usage touch requires non-empty itemId\");\n itemIds.add(trimmedId);\n }\n const at = resolveNow(options).iso;\n const events = [...itemIds].map(\n (itemId): ContextUsageEvent => ({ kind: \"touch\", at, author, item_id: itemId, intent }),\n );\n await appendEvents(options, events);\n}\n\nfunction findTouchTimeInHorizon(\n touches: readonly { entry: Extract<ContextUsageEvent, { kind: \"touch\" }>; time: number }[],\n itemId: string,\n servedAt: number,\n horizonMs: number,\n): number | undefined {\n return touches.find(({ entry, time }) =>\n entry.item_id === itemId && time >= servedAt && time - servedAt <= horizonMs\n )?.time;\n}\n\n/**\n * Derives decayed served-then-touched affinity. A small exploration floor keeps\n * ignored and unseen items eligible, preventing a popularity feedback lock-in.\n */\nexport async function readContextUsageAffinity(\n options: ContextUsageLedgerOptions & {\n author: string;\n horizonHours?: number;\n },\n): Promise<ContextUsageAffinity> {\n if (process.env.PM_CONTEXT_USAGE_DISABLED === \"1\" || options.enabled === false)\n return { affinity: {}, positive_judgments: 0, serving_events: 0 };\n const events = await readEvents(options);\n const now = resolveNow(options).ms;\n const horizonMs = (options.horizonHours ?? 24) * 3_600_000;\n if (!Number.isFinite(horizonMs) || horizonMs <= 0)\n throw new TypeError(\"Context usage horizonHours must be positive\");\n const author = options.author.trim();\n const touches = events\n .filter(\n (event): event is Extract<ContextUsageEvent, { kind: \"touch\" }> =>\n event.kind === \"touch\" && event.author === author,\n )\n .map((entry) => ({ entry, time: Date.parse(entry.at) }));\n const scores = new Map<string, number>();\n let servingEvents = 0;\n let positiveJudgments = 0;\n for (const event of events) {\n if (event.kind !== \"serve\" || event.author !== author) continue;\n servingEvents += 1;\n const servedAt = Date.parse(event.at);\n for (const row of event.rows) {\n if (!row.included) continue;\n const touchTime = findTouchTimeInHorizon(touches, row.id, servedAt, horizonMs);\n if (touchTime === undefined) continue;\n positiveJudgments += 1;\n const ageDays = Math.max(0, (now - touchTime) / DAY_MS);\n scores.set(row.id, (scores.get(row.id) ?? 0) + Math.exp(-ageDays / 14));\n }\n }\n const maximum = Math.max(0, ...scores.values());\n const affinity = Object.fromEntries(\n [...scores.entries()].map(([id, score]) => [\n id,\n 0.05 + 0.95 * (maximum > 0 ? score / maximum : 0),\n ]),\n );\n return {\n affinity,\n positive_judgments: positiveJudgments,\n serving_events: servingEvents,\n };\n}\n"],"names":[],"mappings":"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","debugId":"3d4f2f59-58e6-53e5-b8c5-8023feda0408"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../../../core/extensions/activation-summary.ts", "../../../../../../../../core/extensions/activation-summary-markdown.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @module core/extensions/activation-summary\n *\n * Enumerates *what* an extension activation registered, by name, in one pass.\n *\n * {@link ./extension-types.js#ExtensionActivationResult | `ExtensionActivationResult`}\n * already carries per-surface *counts* (`hook_counts`, `registration_counts`,\n * the various `*_count` fields), but answering \"what does this extension\n * register?\" otherwise means walking fifteen-plus sub-registries by hand\n * (`registrations.commands`/`flags`/`item_types`/`item_fields`/`migrations`/\n * `importers`/`exporters`/`search_providers`/`vector_store_adapters`,\n * `commands.overrides`/`handlers`, the `parsers`/`preflight`/`services`/\n * `renderers` override registries, and the five `hooks.*` arrays).\n *\n * {@link describeExtensionActivation} flattens all of them into one sorted,\n * deterministic {@link ExtensionActivationSummary} of identifiers — the\n * `describe` (enumerate-all) verb that complements the SDK's `assert*`\n * (verify-one) and `run*` (invoke-one) testing helpers. It serves two callers:\n *\n * - **Agents** get a single token-efficient view of an activation instead of\n * traversing every registry (\"project management = context management\").\n * - **Package authors** can assert their *entire* registration surface in one\n * `deepEqual` — a least-privilege \"I register exactly these surfaces and\n * nothing more\" check, the positive counterpart to\n * {@link ./capability-usage.js#reconcileExtensionCapabilityUsage}.\n */\nimport type {\n ExtensionActivationResult,\n ExtensionCapability,\n ExtensionHookRegistry,\n ExtensionServiceName,\n OutputRendererFormat,\n} from \"./extension-types.js\";\nimport {\n collectUsedExtensionCapabilities,\n normalizeExtensionName,\n} from \"./capability-usage.js\";\n\n/**\n * Canonical lifecycle hook kinds paired with their {@link ExtensionHookRegistry}\n * field, ordered to match `ExtensionActivationResult.hook_counts` so a summary's\n * `hooks` list reads in the same stable order the runtime reports counts in.\n */\nconst HOOK_REGISTRY_FIELD_TO_KIND = [\n [\"beforeCommand\", \"before_command\"],\n [\"afterCommand\", \"after_command\"],\n [\"onWrite\", \"on_write\"],\n [\"onRead\", \"on_read\"],\n [\"onIndex\", \"on_index\"],\n] as const satisfies ReadonlyArray<\n readonly [keyof ExtensionHookRegistry, string]\n>;\n\n/**\n * Flat, name-level enumeration of every surface an activation registered.\n *\n * Arrays are de-duplicated for deterministic equality. Most are locale-sorted;\n * {@link ExtensionActivationSummary.hooks} is the exception — it is emitted in\n * canonical lifecycle order to mirror `ExtensionActivationResult.hook_counts`,\n * not alphabetically. The three command fields capture distinct dimensions and\n * can overlap: a command\n * registered via `api.registerCommand(definition)` appears in both\n * {@link ExtensionActivationSummary.commands} (its declared definition) and\n * {@link ExtensionActivationSummary.command_handlers} (its executable handler),\n * whereas a built-in command replaced via `api.registerCommand(name, override)`\n * appears only in {@link ExtensionActivationSummary.command_overrides}.\n */\nexport interface ExtensionActivationSummary {\n /** Known capabilities the registered surfaces exercise (sorted, de-duplicated). */\n capabilities: ExtensionCapability[];\n /** Full command paths declared via `registerCommand`'s definition form. */\n commands: string[];\n /** Built-in command paths replaced by an `registerCommand(name, override)` handler. */\n command_overrides: string[];\n /**\n * Full command paths backed by an extension-provided handler. A superset of\n * {@link ExtensionActivationSummary.commands} that also includes the\n * `<name> import`/`<name> export` paths synthesized for importers/exporters.\n */\n command_handlers: string[];\n /** Lifecycle hook kinds with at least one registered hook (canonical order). */\n hooks: string[];\n /** Command paths that received extension-registered flags. */\n flag_commands: string[];\n /** Custom item-type names registered via `registerItemTypes`. */\n item_types: string[];\n /** Custom item-metadata field names registered via `registerItemFields`. */\n item_fields: string[];\n /** Schema migration ids registered via `registerMigration` (id-less migrations are omitted — they carry no identifier). */\n migrations: string[];\n /** Project profile names registered via `registerProfile`. */\n profiles: string[];\n /** Importer names registered via `registerImporter`. */\n importers: string[];\n /** Exporter names registered via `registerExporter`. */\n exporters: string[];\n /** Search-provider names registered via `registerSearchProvider`. */\n search_providers: string[];\n /** Vector-store adapter names registered via `registerVectorStoreAdapter`. */\n vector_store_adapters: string[];\n /** Command paths with a parser override registered via `registerParser`. */\n parser_overrides: string[];\n /** Built-in service names overridden via `registerService`. */\n service_overrides: ExtensionServiceName[];\n /** Output formats with a renderer override registered via `registerRenderer`. */\n renderer_overrides: OutputRendererFormat[];\n /** Count of registered preflight overrides. The surface carries no per-entry identifier, so this is a `number` rather than `string[]` — the only numeric field in the summary. */\n preflight_overrides: number;\n}\n\n/**\n * Options for {@link describeExtensionActivation}.\n */\nexport interface DescribeExtensionActivationOptions {\n /**\n * Restrict the summary to a single extension by name. Names are matched\n * case-insensitively after trimming, mirroring\n * {@link ./capability-usage.js#collectUsedExtensionCapabilities}. Omit to\n * union across every extension in the activation result.\n */\n extensionName?: string;\n /** Restrict the summary to a set of extension names. This supports package aliases that resolve to multiple extensions while keeping the historical single-name option intact. */\n extensionNames?: readonly string[];\n}\n\n/**\n * Summarize, by name, every registration surface an activation exercised.\n *\n * Walks the same sub-registries the loader populates and the capability\n * reconciler attributes, returning a flat {@link ExtensionActivationSummary}\n * whose arrays are sorted and de-duplicated. With\n * {@link DescribeExtensionActivationOptions.extensionName} only the matching\n * extension's registrations contribute (across both layers); without it the\n * summary unions every extension in the activation. Failed activations register\n * nothing, so they contribute only an empty summary.\n */\nexport function describeExtensionActivation(\n activation: ExtensionActivationResult,\n options: DescribeExtensionActivationOptions = {},\n): ExtensionActivationSummary {\n // Match both sides with the same normalizer collectUsedExtensionCapabilities\n // uses for the `capabilities` field below, so a filtered summary's named\n // surfaces and capabilities never disagree for a stored name with whitespace.\n const filters = new Set<string>();\n if (options.extensionName !== undefined) {\n filters.add(normalizeExtensionName(options.extensionName));\n }\n for (const name of options.extensionNames ?? []) {\n filters.add(normalizeExtensionName(name));\n }\n const matches = (name: string): boolean =>\n filters.size === 0 || filters.has(normalizeExtensionName(name));\n const collect = <TEntry extends { name: string }, TValue extends string>(\n entries: readonly TEntry[],\n identify: (entry: TEntry) => TValue,\n ): TValue[] =>\n sortUnique(entries.filter((entry) => matches(entry.name)).map(identify));\n const collectFlat = <TEntry extends { name: string }>(\n entries: readonly TEntry[],\n expand: (entry: TEntry) => readonly string[],\n ): string[] =>\n sortUnique(entries.filter((entry) => matches(entry.name)).flatMap(expand));\n const {\n registrations,\n commands,\n parsers,\n preflight,\n services,\n renderers,\n hooks,\n } = activation;\n return {\n capabilities: collectUsedExtensionCapabilities(activation, options),\n commands: collect(registrations.commands, (entry) => entry.command),\n command_overrides: collect(commands.overrides, (entry) => entry.command),\n command_handlers: collect(commands.handlers, (entry) => entry.command),\n hooks: HOOK_REGISTRY_FIELD_TO_KIND.filter(([field]) =>\n hooks[field].some((entry) => matches(entry.name)),\n ).map(([, kind]) => kind),\n flag_commands: collect(\n registrations.flags,\n (entry) => entry.target_command,\n ),\n item_types: collectFlat(registrations.item_types, (entry) =>\n entry.types.map((type) => type.name),\n ),\n item_fields: collectFlat(registrations.item_fields, (entry) =>\n entry.fields.map((field) => field.name),\n ),\n migrations: collectFlat(registrations.migrations, (entry) =>\n typeof entry.definition.id === \"string\" ? [entry.definition.id] : [],\n ),\n profiles: collect(registrations.profiles, (entry) => entry.profile.name),\n importers: collect(registrations.importers, (entry) => entry.importer),\n exporters: collect(registrations.exporters, (entry) => entry.exporter),\n search_providers: collect(\n registrations.search_providers,\n (entry) => entry.definition.name,\n ),\n vector_store_adapters: collect(\n registrations.vector_store_adapters,\n (entry) => entry.definition.name,\n ),\n parser_overrides: collect(parsers.overrides, (entry) => entry.command),\n service_overrides: collect(services.overrides, (entry) => entry.service),\n renderer_overrides: collect(renderers.overrides, (entry) => entry.format),\n preflight_overrides: preflight.overrides.filter((entry) =>\n matches(entry.name),\n ).length,\n };\n}\n\nfunction sortUnique<TValue extends string>(\n values: readonly TValue[],\n): TValue[] {\n return [...new Set(values)].sort((left, right) => left.localeCompare(right));\n}\n", "/**\n * @module core/extensions/activation-summary-markdown\n *\n * Renders an {@link ExtensionActivationSummary} to a deterministic Markdown\n * reference document — the *render* leg that completes the `describe`\n * (enumerate-all) verb.\n *\n * {@link ./activation-summary.js#describeExtensionActivation | `describeExtensionActivation`}\n * (and its author-time twin\n * {@link ../../sdk/compose.js#describeExtensionBlueprint | `describeExtensionBlueprint`})\n * already answer \"what does this package register?\" as a structured summary, and\n * the `assert*`/`run*` testing helpers verify and invoke each surface. What was\n * missing is a way to turn that summary into human-readable docs: package\n * authors hand-wrote the README \"commands & capabilities\" reference, which\n * silently drifted from the surface the loader actually registers.\n *\n * {@link renderExtensionSurfaceMarkdown} closes that gap. It is a pure,\n * dependency-free projection of the summary, so an author can pipe\n * `describeExtensionBlueprint(blueprint)` straight into it during their build or\n * test step and embed the result in their README — a reference that can never\n * drift from the registered surface (\"project management = context management\").\n * The CLI's `pm extension|package describe --markdown` composes the same\n * primitive across every loaded extension.\n */\nimport type { ExtensionActivationSummary } from \"./activation-summary.js\";\n\n/**\n * The lowest and highest ATX heading levels Markdown supports, used to validate\n * {@link ExtensionSurfaceMarkdownOptions.headingLevel} and to clamp nested\n * section headings so a deep title never emits an invalid `#######` run.\n */\nconst MIN_HEADING_LEVEL = 1;\nconst MAX_HEADING_LEVEL = 6;\n\n/**\n * Options for {@link renderExtensionSurfaceMarkdown}.\n */\nexport interface ExtensionSurfaceMarkdownOptions {\n /**\n * Heading text for the document title. Defaults to `\"Extension surfaces\"`.\n * The title always renders as an ATX heading at\n * {@link ExtensionSurfaceMarkdownOptions.headingLevel}; per-surface sections\n * render one level deeper.\n */\n title?: string;\n /**\n * ATX heading level for the title, an integer in `[1, 6]` (default `2`, i.e.\n * `##`, so the document embeds cleanly under a `# Package` README heading).\n * Section headings render at `headingLevel + 1`, clamped to `6`. Values\n * outside `[1, 6]` throw a {@link RangeError}.\n */\n headingLevel?: number;\n /** When `true`, render every surface section even when it has no entries (emitting `_None._` under the heading) and always emit the capabilities line. Defaults to `false`, which omits empty sections so the reference lists only what the package actually contributes. */\n includeEmpty?: boolean;\n}\n\n/**\n * A surface section paired with the {@link ExtensionActivationSummary} field\n * whose identifiers populate it. Ordered for an author-facing reference:\n * commands first, then schema, then importers/exporters, retrieval, lifecycle\n * hooks, and finally the override surfaces. {@link ExtensionActivationSummary.command_handlers}\n * is intentionally omitted — it is a documented superset of `commands` plus the\n * synthesized `<name> import`/`<name> export` paths already covered by the\n * Importers and Exporters sections, so rendering it would duplicate information.\n */\nconst SURFACE_SECTIONS = [\n [\"commands\", \"Commands\"],\n [\"command_overrides\", \"Command overrides\"],\n [\"flag_commands\", \"Flag commands\"],\n [\"item_types\", \"Item types\"],\n [\"item_fields\", \"Item fields\"],\n [\"migrations\", \"Migrations\"],\n [\"profiles\", \"Profiles\"],\n [\"importers\", \"Importers\"],\n [\"exporters\", \"Exporters\"],\n [\"search_providers\", \"Search providers\"],\n [\"vector_store_adapters\", \"Vector store adapters\"],\n [\"hooks\", \"Lifecycle hooks\"],\n [\"parser_overrides\", \"Parser overrides\"],\n [\"service_overrides\", \"Service overrides\"],\n [\"renderer_overrides\", \"Renderer overrides\"],\n] as const satisfies ReadonlyArray<\n readonly [\n {\n [K in keyof ExtensionActivationSummary]: ExtensionActivationSummary[K] extends readonly string[]\n ? K\n : never;\n }[keyof ExtensionActivationSummary],\n string,\n ]\n>;\n\n/** Repeat `#` `level` times to form an ATX heading prefix. */\nfunction headingPrefix(level: number): string {\n return \"#\".repeat(level);\n}\n\n/** Render `value` as an inline Markdown code span. Backslash escapes do not work inside CommonMark code spans, so when `value` contains backticks the span is delimited by a run of backticks one longer than the longest internal run, and padded with a space when the value borders a backtick — the CommonMark rule for embedding literal backticks in a code span. */\nfunction code(value: string): string {\n if (!value.includes(\"`\")) {\n return `\\`${value}\\``;\n }\n let longestRun = 0;\n let currentRun = 0;\n for (const char of value) {\n currentRun = char === \"`\" ? currentRun + 1 : 0;\n longestRun = Math.max(longestRun, currentRun);\n }\n const fence = \"`\".repeat(longestRun + 1);\n const pad = value.startsWith(\"`\") || value.endsWith(\"`\") ? \" \" : \"\";\n return `${fence}${pad}${value}${pad}${fence}`;\n}\n\n/** Render the comma-separated capabilities summary line (or `_none registered_` when the activation exercised no known capability). */\nfunction renderCapabilitiesLine(capabilities: readonly string[]): string {\n if (capabilities.length === 0) {\n return \"Capabilities: _none registered_\";\n }\n return `Capabilities: ${capabilities.map(code).join(\", \")}`;\n}\n\n/**\n * Render one surface section as `heading` + a bullet per identifier, or, when\n * `entries` is empty, `heading` + `_None._`. Callers decide whether an empty\n * section is rendered at all via {@link ExtensionSurfaceMarkdownOptions.includeEmpty}.\n */\nfunction renderSection(\n heading: string,\n level: number,\n entries: readonly string[],\n): string[] {\n const lines = [`${headingPrefix(level)} ${heading}`, \"\"];\n if (entries.length === 0) {\n lines.push(\"_None._\", \"\");\n return lines;\n }\n lines.push(...entries.map((entry) => `- ${code(entry)}`), \"\");\n return lines;\n}\n\n/**\n * Render the preflight-overrides section: a count line when any are registered,\n * `_None._` when {@link ExtensionSurfaceMarkdownOptions.includeEmpty} forces the\n * empty section, or no lines at all otherwise. Preflight overrides carry no\n * per-entry identifier, so they have a bespoke renderer rather than reusing\n * {@link renderSection}.\n */\nfunction renderPreflightSection(\n count: number,\n level: number,\n includeEmpty: boolean,\n): string[] {\n if (count === 0 && !includeEmpty) {\n return [];\n }\n return [\n `${headingPrefix(level)} Preflight overrides`,\n \"\",\n count > 0\n ? `- ${count} registered (this surface carries no per-entry identifier)`\n : \"_None._\",\n \"\",\n ];\n}\n\n/**\n * Render an {@link ExtensionActivationSummary} as a deterministic Markdown\n * reference document.\n *\n * The output is a title heading, a one-line capabilities summary, and a section\n * per registered surface (commands, overrides, flags, item types/fields,\n * migrations, importers/exporters, search providers, vector adapters, lifecycle\n * hooks, and the parser/service/renderer override surfaces), followed by a\n * preflight-override count line when any are registered. Section order and\n * within-section identifier order both come straight from the summary, so the\n * same summary always renders byte-for-byte the same document.\n *\n * By default empty sections are omitted so the reference lists only what the\n * package contributes; set {@link ExtensionSurfaceMarkdownOptions.includeEmpty}\n * to render every section. A summary with no surfaces at all renders the title,\n * the capabilities line, and a `_This extension registers no surfaces._` note.\n *\n * @throws {RangeError} when `options.headingLevel` is not an integer in `[1, 6]`.\n */\nexport function renderExtensionSurfaceMarkdown(\n summary: ExtensionActivationSummary,\n options: ExtensionSurfaceMarkdownOptions = {},\n): string {\n const titleLevel = options.headingLevel ?? 2;\n if (\n !Number.isInteger(titleLevel) ||\n titleLevel < MIN_HEADING_LEVEL ||\n titleLevel > MAX_HEADING_LEVEL\n ) {\n throw new RangeError(\n `headingLevel must be an integer in [${MIN_HEADING_LEVEL}, ${MAX_HEADING_LEVEL}], received ${String(options.headingLevel)}`,\n );\n }\n const sectionLevel = Math.min(titleLevel + 1, MAX_HEADING_LEVEL);\n const includeEmpty = options.includeEmpty === true;\n const title = options.title ?? \"Extension surfaces\";\n\n const lines = [`${headingPrefix(titleLevel)} ${title}`, \"\"];\n if (includeEmpty || summary.capabilities.length > 0) {\n lines.push(renderCapabilitiesLine(summary.capabilities), \"\");\n }\n\n for (const [field, heading] of SURFACE_SECTIONS) {\n const entries = summary[field];\n if (entries.length === 0 && !includeEmpty) {\n continue;\n }\n lines.push(...renderSection(heading, sectionLevel, entries));\n }\n\n lines.push(\n ...renderPreflightSection(\n summary.preflight_overrides,\n sectionLevel,\n includeEmpty,\n ),\n );\n\n const hasAnySurface =\n summary.preflight_overrides > 0 ||\n SURFACE_SECTIONS.some(([field]) => summary[field].length > 0);\n if (!hasAnySurface && !includeEmpty) {\n lines.push(\"_This extension registers no surfaces._\", \"\");\n }\n\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|