@unbrained/pm-cli 2026.7.16 → 2026.7.18
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 +30 -2
- package/CONTRIBUTING.md +2 -2
- package/dist/cli/bootstrap-args.d.ts +2 -115
- package/dist/cli/bootstrap-args.js +4 -831
- package/dist/cli/bootstrap-args.js.map +1 -1
- package/dist/cli/commands/close.d.ts +1 -1
- package/dist/cli/commands/close.js +3 -3
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/completion.js +47 -5
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/context.d.ts +2 -2
- package/dist/cli/commands/context.js +42 -28
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/contracts.js +5 -3
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/eval.d.ts +4 -64
- package/dist/cli/commands/eval.js +4 -153
- package/dist/cli/commands/eval.js.map +1 -1
- package/dist/cli/commands/graph.d.ts +7 -0
- package/dist/cli/commands/graph.js +11 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.js +3 -2
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/linked-test-entry.d.ts +6 -6
- package/dist/cli/commands/linked-test-entry.js +4 -65
- package/dist/cli/commands/linked-test-entry.js.map +1 -1
- package/dist/cli/commands/linked-test-parsers.d.ts +3 -45
- package/dist/cli/commands/linked-test-parsers.js +4 -516
- package/dist/cli/commands/linked-test-parsers.js.map +1 -1
- package/dist/cli/commands/list.d.ts +3 -210
- package/dist/cli/commands/list.js +4 -1068
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/next.d.ts +1 -1
- package/dist/cli/commands/next.js +3 -3
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/search.d.ts +3 -464
- package/dist/cli/commands/search.js +4 -2236
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/stats.d.ts +6 -66
- package/dist/cli/commands/stats.js +4 -157
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/telemetry.d.ts +6 -14
- package/dist/cli/commands/telemetry.js +4 -349
- package/dist/cli/commands/telemetry.js.map +1 -1
- package/dist/cli/commands/test-all.d.ts +6 -95
- package/dist/cli/commands/test-all.js +4 -439
- package/dist/cli/commands/test-all.js.map +1 -1
- package/dist/cli/commands/test-runs.d.ts +6 -92
- package/dist/cli/commands/test-runs.js +4 -189
- package/dist/cli/commands/test-runs.js.map +1 -1
- package/dist/cli/commands/test.d.ts +6 -244
- package/dist/cli/commands/test.js +4 -1780
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.d.ts +15 -29
- package/dist/cli/commands/update-many.js +355 -259
- package/dist/cli/commands/update-many.js.map +1 -1
- package/dist/cli/main.js +141 -133
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.js +49 -7
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.js +7 -3
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/search-refresh.js +4 -9
- package/dist/cli/search-refresh.js.map +1 -1
- package/dist/cli/shared-parsers.d.ts +6 -9
- package/dist/cli/shared-parsers.js +4 -37
- package/dist/cli/shared-parsers.js.map +1 -1
- package/dist/cli/telemetry-flush.js +4 -4
- package/dist/cli/telemetry-flush.js.map +1 -1
- package/dist/cli-bundle/bundle-manifest.json +334 -326
- package/dist/cli-bundle/chunks/{append-OJQFUQ4T.js → append-5YF3TO7I.js} +5 -5
- package/dist/cli-bundle/chunks/append-JHO5K6RP.js +11 -0
- package/dist/cli-bundle/chunks/{chunk-BCOFWYW4.js → chunk-2BX74BAS.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-APRVSW2O.js → chunk-2CXL335K.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-KG44YSKD.js → chunk-2FUOXSRN.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-HDH3JUGG.js → chunk-2IPNL3DR.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-GM5QHQU6.js → chunk-2XOSFSTH.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-UFXU44HV.js → chunk-35FHWD4C.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-2WSE6PO2.js.map → chunk-35FHWD4C.js.map} +1 -7
- package/dist/cli-bundle/chunks/{chunk-K3WII2ME.js → chunk-37DRDP2B.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-BKVG6XOA.js → chunk-3CUQZNQ6.js} +67 -509
- package/dist/cli-bundle/chunks/chunk-3CUQZNQ6.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-3QDR6ZLU.js +800 -0
- package/dist/cli-bundle/chunks/chunk-3QDR6ZLU.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-5JLUII3O.js → chunk-43UMFKCK.js} +321 -240
- package/dist/cli-bundle/chunks/chunk-43UMFKCK.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-PMOSXADO.js → chunk-47HXN6RX.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-6CFNAVTF.js → chunk-5HGZKQUL.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-2IFFUZLC.js → chunk-5UKQLQM2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-DM4H7FP4.js → chunk-633PKXLT.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-XSJUSQAE.js → chunk-646MQXFW.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ZI6VQWQ7.js → chunk-66MKH7SZ.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-S6MQESFR.js → chunk-67RO3H4N.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-34L5OT3Y.js → chunk-6DYOZS6C.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-RRM5JYJC.js → chunk-6O44IN44.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-5ZSLZLDN.js → chunk-6VHUGVNP.js} +608 -456
- package/dist/cli-bundle/chunks/chunk-6VHUGVNP.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-PENXZX3U.js → chunk-74FKFFXO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-HO4KXD6I.js → chunk-7H5NNCJ5.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-7B67ZL4N.js → chunk-7R6UIHYY.js} +75 -5
- package/dist/cli-bundle/chunks/{chunk-7B67ZL4N.js.map → chunk-7R6UIHYY.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-3S5QVM5H.js → chunk-7UCY6DR5.js} +193 -22
- package/dist/cli-bundle/chunks/chunk-7UCY6DR5.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-WT3ZEOGH.js → chunk-ADXDCAKP.js} +16 -7
- package/dist/cli-bundle/chunks/{chunk-WT3ZEOGH.js.map → chunk-ADXDCAKP.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-TQSZFPIS.js → chunk-AFGKSHAM.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-6N2VXVTQ.js → chunk-ARGDWQ4J.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-XXXF6PAQ.js → chunk-AXRT7K5V.js} +83 -62
- package/dist/cli-bundle/chunks/chunk-AXRT7K5V.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-3U7ZR6M4.js → chunk-B57RJHBZ.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-YCQET3OT.js → chunk-BAP7G3N2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NLDFBC6J.js → chunk-BDA35QG5.js} +35 -5
- package/dist/cli-bundle/chunks/chunk-BDA35QG5.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-QKXHFPYM.js → chunk-BIRYX32V.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-RMLWNPH2.js → chunk-BVLOMU6O.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-2VPAVL7O.js → chunk-CKX4WOPC.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-TKOVBP6C.js → chunk-D52ZN3BF.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KPMKHGEA.js → chunk-D53RTYVI.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-ODALILG3.js → chunk-D5XHO4Q7.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-YAQEBNY7.js → chunk-DDFGYUCQ.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-EAB64KLB.js → chunk-DG2EQRIH.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-J6364LFM.js → chunk-DHNG452T.js} +9 -18
- package/dist/cli-bundle/chunks/{chunk-J6364LFM.js.map → chunk-DHNG452T.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-JXQUXVMI.js → chunk-E4FXM2XB.js} +77 -7
- package/dist/cli-bundle/chunks/{chunk-JXQUXVMI.js.map → chunk-E4FXM2XB.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-IG3SWA4A.js → chunk-EHJFUOXL.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-P74IZQ7A.js → chunk-EWIT5WIC.js} +7 -7
- package/dist/cli-bundle/chunks/chunk-EX7OQT3Y.js +783 -0
- package/dist/cli-bundle/chunks/chunk-EX7OQT3Y.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ONREO4ST.js → chunk-EY7ZE3TG.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-ILX33QXL.js → chunk-F3VC3GOV.js} +669 -472
- package/dist/cli-bundle/chunks/chunk-F3VC3GOV.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-EJEXHTY5.js → chunk-FHOBCGQO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-H3EIEWGR.js → chunk-FL4D53ND.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-WUJQK4YV.js → chunk-FVNWHUME.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-INU6DKT5.js → chunk-FXFCFL73.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-QEHQ2GVG.js → chunk-FY4RLHSC.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-AHVTB5I5.js → chunk-G6MYGULG.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-HYB5AZ63.js → chunk-GKPCTQYG.js} +1822 -72
- package/dist/cli-bundle/chunks/chunk-GKPCTQYG.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-TSMHDIW4.js → chunk-GLZKZON6.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-2JKGO6QX.js → chunk-H5IOT54C.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-SELVXEZK.js → chunk-HO4DLBNK.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-CRVF2JDM.js → chunk-HPAYDSR2.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-3CLU2XZO.js → chunk-HSYV4ZYT.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-EH2OPHBI.js → chunk-HTXXXF45.js} +23 -19
- package/dist/cli-bundle/chunks/chunk-HTXXXF45.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-J5AOEGDC.js → chunk-HYTOJW2Q.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-4XQ3BDV4.js → chunk-I3INI567.js} +536 -449
- package/dist/cli-bundle/chunks/chunk-I3INI567.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-NU3IMIEA.js → chunk-I7DIDUSP.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-JYFOV7FC.js → chunk-IE5KRAKN.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-YAROI3PD.js → chunk-IL5SPRMH.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-UY2ACEMF.js → chunk-ILVOOAT4.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-GOSLKLFE.js → chunk-KH6QAHME.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-QKECXBBG.js → chunk-KX62NMZC.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-QKECXBBG.js.map → chunk-KX62NMZC.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-WQPUU7XD.js → chunk-L337QKWJ.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-JFTKLTEF.js → chunk-L5BTTDU5.js} +68 -503
- package/dist/cli-bundle/chunks/chunk-L5BTTDU5.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-LSG2U345.js → chunk-L6FVNR7X.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-FMBNM2EN.js → chunk-LSOWTLEM.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-4223PVZT.js → chunk-M7MVOKVV.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-UMOPHQSU.js → chunk-MR4SHYR4.js} +41 -19
- package/dist/cli-bundle/chunks/chunk-MR4SHYR4.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-3WM75PWC.js → chunk-N33FD2UI.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-UXONS674.js → chunk-NCVT6XEL.js} +68 -56
- package/dist/cli-bundle/chunks/chunk-NCVT6XEL.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-6S3YSUYG.js → chunk-NNANAWFH.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-IJIICKVW.js → chunk-NTRQLE2R.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-SDQLJWBO.js → chunk-NVZ6NVHJ.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-E2OJMKML.js → chunk-OGVTB5VO.js} +47 -37
- package/dist/cli-bundle/chunks/chunk-OGVTB5VO.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-H2Z3FYXQ.js → chunk-OWP6QFBV.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-Q7A43DS4.js → chunk-P22HGFFI.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NVPZIJVR.js → chunk-PT7MCCGD.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ONG5V5CI.js → chunk-QPGQNLPI.js} +1751 -70
- package/dist/cli-bundle/chunks/chunk-QPGQNLPI.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-J6EY5V4N.js → chunk-QRZNCRNA.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-QIPLHNP7.js → chunk-QWBKN3QC.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-7PIWCHTW.js → chunk-R5XTTZSJ.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-JOUQZENX.js → chunk-RC4UOUXA.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-BEP7WJA2.js → chunk-RGMWJLXF.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-NP22ERDF.js → chunk-RTBX3C4C.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-FNSPG7MU.js → chunk-RXPQ5Q23.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-LPYWLWDS.js → chunk-SIPOACV5.js} +534 -447
- package/dist/cli-bundle/chunks/chunk-SIPOACV5.js.map +1 -0
- package/dist/cli-bundle/chunks/chunk-TGBTLGPX.js +851 -0
- package/dist/cli-bundle/chunks/chunk-TGBTLGPX.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-2WSE6PO2.js → chunk-TLWJP5BF.js} +5 -5
- package/dist/cli-bundle/chunks/chunk-TLWJP5BF.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-ULTHRDBP.js → chunk-TM5CIO3F.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-UWQHLMEB.js → chunk-TZAE66GQ.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-OW4JWD5M.js → chunk-VAHZIPWS.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-DYH63FX7.js → chunk-VE6ZSTQW.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-3AUGG2DP.js → chunk-W5E2UUSH.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-BSEQUTQP.js → chunk-WACRQ26A.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-BSEQUTQP.js.map → chunk-WACRQ26A.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-UOHFKBUV.js → chunk-WL3SS45P.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-H5APFTHZ.js → chunk-WQXRZMFN.js} +204 -33
- package/dist/cli-bundle/chunks/chunk-WQXRZMFN.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-QKJGPFAF.js → chunk-WU3KAN6A.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-IA5FKNII.js → chunk-X2MGQMZO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-TD3LVC7D.js → chunk-X5YCTFKT.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-B7PE22W6.js → chunk-XC2HEEOV.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-7Z4LKRS4.js → chunk-XPUTSGJU.js} +38 -37
- package/dist/cli-bundle/chunks/chunk-XPUTSGJU.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-YBLZ2VE7.js → chunk-XWBD6DSR.js} +320 -239
- package/dist/cli-bundle/chunks/chunk-XWBD6DSR.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-XWYQ2LT4.js +834 -0
- package/dist/cli-bundle/chunks/chunk-XWYQ2LT4.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-K2X6U4UA.js → chunk-XXLXJL7V.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-2NCIPMQP.js → chunk-YFE7JHX3.js} +27 -6
- package/dist/cli-bundle/chunks/chunk-YFE7JHX3.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-EACOH7AU.js → chunk-YIIIAKCE.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-RLCHOOHC.js → chunk-YJSURTBB.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-PGY23YTC.js → chunk-YKFHF37B.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-EYLCSJAI.js → chunk-YQEZWI3R.js} +2 -2
- package/dist/cli-bundle/chunks/close-GPD7DTJV.js +12 -0
- package/dist/cli-bundle/chunks/{close-CWODTPKG.js → close-X3CF6FQP.js} +5 -5
- package/dist/cli-bundle/chunks/{close-many-CQFUY7MR.js → close-many-J7A5EHOQ.js} +14 -14
- package/dist/cli-bundle/chunks/close-many-NQLYGPYW.js +23 -0
- package/dist/cli-bundle/chunks/comments-2AOZQ5D2.js +13 -0
- package/dist/cli-bundle/chunks/{comments-WGLHR7LB.js → comments-TMHMALA5.js} +7 -7
- package/dist/cli-bundle/chunks/{copy-LXVDXH7B.js → copy-FWQA5OU4.js} +4 -4
- package/dist/cli-bundle/chunks/copy-N3LCQBMC.js +9 -0
- package/dist/cli-bundle/chunks/{create-LBVCYMEG.js → create-AQ5SIGZC.js} +9 -9
- package/dist/cli-bundle/chunks/{create-J5U6ND4K.js → create-KOGQ3JKD.js} +9 -9
- package/dist/cli-bundle/chunks/delete-6G3MBZ6S.js +10 -0
- package/dist/cli-bundle/chunks/{delete-PMJBNY5G.js → delete-YYYFOSEA.js} +4 -4
- package/dist/cli-bundle/chunks/{deps-JZ7TMVCB.js → deps-MQ4ZIGZB.js} +16 -7
- package/dist/cli-bundle/chunks/deps-NIIKXLPB.js +28 -0
- package/dist/cli-bundle/chunks/{docs-FEWB2DQB.js → docs-53NUGMIQ.js} +6 -6
- package/dist/cli-bundle/chunks/docs-OWRGDMNY.js +14 -0
- package/dist/cli-bundle/chunks/{files-EFIWKFTM.js → files-3PXGXYDB.js} +6 -6
- package/dist/cli-bundle/chunks/{files-6YFBJRBG.js → files-EGLKHD7O.js} +6 -6
- package/dist/cli-bundle/chunks/focus-KZLIA6WS.js +10 -0
- package/dist/cli-bundle/chunks/{focus-4QJR7FOQ.js → focus-SRPASFTN.js} +5 -5
- package/dist/cli-bundle/chunks/{history-compact-CKRPDTJN.js → history-compact-G4DULDCX.js} +6 -6
- package/dist/cli-bundle/chunks/history-compact-HHIUOMZ7.js +16 -0
- package/dist/cli-bundle/chunks/{history-redact-BB3TGDAE.js → history-redact-IUSJ6X3E.js} +4 -4
- package/dist/cli-bundle/chunks/{history-redact-D225BHOZ.js → history-redact-THHGRQXV.js} +4 -4
- package/dist/cli-bundle/chunks/history-repair-KG7SWXI6.js +16 -0
- package/dist/cli-bundle/chunks/{history-repair-RQXKQHL4.js → history-repair-LUQWRS7X.js} +6 -6
- package/dist/cli-bundle/chunks/{learnings-JLNLCOL5.js → learnings-2MRNBFJF.js} +7 -7
- package/dist/cli-bundle/chunks/learnings-ZVHSALJY.js +13 -0
- package/dist/cli-bundle/chunks/{notes-GB47XXQQ.js → notes-73JWKWUD.js} +7 -7
- package/dist/cli-bundle/chunks/notes-BAKUL5DJ.js +13 -0
- package/dist/cli-bundle/chunks/{plan-VDCJ2PCN.js → plan-AZPMCG37.js} +10 -10
- package/dist/cli-bundle/chunks/plan-LEAGLPGP.js +24 -0
- package/dist/cli-bundle/chunks/{profile-FAU7NZML.js → profile-AVCIIZID.js} +9 -9
- package/dist/cli-bundle/chunks/{profile-IVXQEL3D.js → profile-LFYO3HHX.js} +9 -9
- package/dist/cli-bundle/chunks/{register-list-query-UL4UKBBN.js → register-list-query-MZUF2EEC.js} +50 -22
- package/dist/cli-bundle/chunks/register-list-query-MZUF2EEC.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-list-query-DKA3EH5D.js → register-list-query-UKMF55FT.js} +49 -21
- package/dist/cli-bundle/chunks/register-list-query-UKMF55FT.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-mutation-RBBJ52DK.js → register-mutation-2PBW2GEX.js} +35 -33
- package/dist/cli-bundle/chunks/register-mutation-2PBW2GEX.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-mutation-ARFHRW55.js → register-mutation-T6RVNJC4.js} +34 -32
- package/dist/cli-bundle/chunks/{register-mutation-ARFHRW55.js.map → register-mutation-T6RVNJC4.js.map} +2 -2
- package/dist/cli-bundle/chunks/{register-operations-ZIBBRSED.js → register-operations-KHZYR6MG.js} +35 -35
- package/dist/cli-bundle/chunks/{register-operations-ZUJ5JWPE.js → register-operations-WPQ2LWZJ.js} +35 -35
- package/dist/cli-bundle/chunks/{register-setup-BCVLFEYS.js → register-setup-PGDNOXDQ.js} +15 -15
- package/dist/cli-bundle/chunks/{register-setup-TDCGWIOS.js → register-setup-TDN7WAO6.js} +15 -15
- package/dist/cli-bundle/chunks/{restore-25DLT2Q2.js → restore-E3PRGDN3.js} +6 -6
- package/dist/cli-bundle/chunks/restore-KIUYTAEJ.js +14 -0
- package/dist/cli-bundle/chunks/{schema-FNU3WE4O.js → schema-5JNFQFUW.js} +6 -6
- package/dist/cli-bundle/chunks/{schema-NBCM3RAD.js → schema-TMIW4XZC.js} +6 -6
- package/dist/cli-bundle/chunks/{update-XHSIAIXE.js → update-SQYZA3ZW.js} +12 -12
- package/dist/cli-bundle/chunks/update-XZJYS5X7.js +21 -0
- package/dist/cli-bundle/chunks/update-many-R24B3GBK.js +36 -0
- package/dist/cli-bundle/chunks/update-many-WQ3R3J6N.js +32 -0
- package/dist/cli-bundle/main.js +170 -856
- package/dist/cli-bundle/main.js.map +4 -4
- package/dist/cli-bundle/sdk-runtime.js +57 -54
- package/dist/cli-bundle/sdk-testing.js +6 -6
- package/dist/cli-bundle/sdk.js +266 -340
- package/dist/cli-bundle/sdk.js.map +4 -4
- package/dist/core/extensions/item-fields.js +2 -2
- package/dist/core/extensions/item-fields.js.map +1 -1
- package/dist/core/item/actionability.d.ts +12 -0
- package/dist/core/item/actionability.js +39 -4
- package/dist/core/item/actionability.js.map +1 -1
- package/dist/core/sentry/instrument.d.ts +11 -0
- package/dist/core/sentry/instrument.js +21 -2
- package/dist/core/sentry/instrument.js.map +1 -1
- package/dist/mcp/server.d.ts +16 -18
- package/dist/mcp/server.js +84 -31
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-definitions.js +17 -4
- package/dist/mcp/tool-definitions.js.map +1 -1
- package/dist/sdk/actionability.d.ts +10 -0
- package/dist/sdk/actionability.js +14 -0
- package/dist/sdk/actionability.js.map +1 -0
- package/dist/sdk/cli-bootstrap.d.ts +122 -0
- package/dist/sdk/cli-bootstrap.js +879 -0
- package/dist/sdk/cli-bootstrap.js.map +1 -0
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +6 -2
- package/dist/sdk/cli-contracts/enum-contracts.js +19 -2
- package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/flag-contracts.d.ts +2 -0
- package/dist/sdk/cli-contracts/flag-contracts.js +21 -2
- package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-option-contracts.d.ts +2 -0
- package/dist/sdk/cli-contracts/tool-option-contracts.js +16 -2
- package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +80 -3
- package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-schema.d.ts +20 -0
- package/dist/sdk/cli-contracts/tool-schema.js +97 -9
- package/dist/sdk/cli-contracts/tool-schema.js.map +1 -1
- package/dist/sdk/cli-contracts.d.ts +2 -2
- package/dist/sdk/cli-contracts.js +4 -4
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/dependencies.d.ts +42 -53
- package/dist/sdk/dependencies.js +177 -125
- package/dist/sdk/dependencies.js.map +1 -1
- package/dist/sdk/eval.d.ts +66 -0
- package/dist/sdk/eval.js +186 -0
- package/dist/sdk/eval.js.map +1 -0
- package/dist/sdk/governance/validate.js +3 -3
- package/dist/sdk/governance/validate.js.map +1 -1
- package/dist/sdk/graph/analytics.d.ts +124 -0
- package/dist/sdk/graph/analytics.js +464 -0
- package/dist/sdk/graph/analytics.js.map +1 -0
- package/dist/sdk/graph/assembly.d.ts +97 -0
- package/dist/sdk/graph/assembly.js +146 -0
- package/dist/sdk/graph/assembly.js.map +1 -0
- package/dist/sdk/graph/cache.d.ts +66 -0
- package/dist/sdk/graph/cache.js +148 -0
- package/dist/sdk/graph/cache.js.map +1 -0
- package/dist/sdk/graph/governance.d.ts +108 -0
- package/dist/sdk/graph/governance.js +360 -0
- package/dist/sdk/graph/governance.js.map +1 -0
- package/dist/sdk/graph/index.d.ts +16 -0
- package/dist/sdk/graph/index.js +20 -0
- package/dist/sdk/graph/index.js.map +1 -0
- package/dist/sdk/graph/remediation.d.ts +52 -0
- package/dist/sdk/graph/remediation.js +148 -0
- package/dist/sdk/graph/remediation.js.map +1 -0
- package/dist/sdk/graph/run.d.ts +295 -0
- package/dist/sdk/graph/run.js +468 -0
- package/dist/sdk/graph/run.js.map +1 -0
- package/dist/sdk/graph/traversal.d.ts +77 -0
- package/dist/sdk/graph/traversal.js +262 -0
- package/dist/sdk/graph/traversal.js.map +1 -0
- package/dist/sdk/index.d.ts +19 -5
- package/dist/sdk/index.js +21 -7
- package/dist/sdk/index.js.map +1 -1
- package/dist/{cli/commands → sdk/query}/item-filter-options.d.ts +1 -1
- package/dist/{cli/commands → sdk/query}/item-filter-options.js +3 -3
- package/dist/sdk/query/item-filter-options.js.map +1 -0
- package/dist/sdk/query/list.d.ts +262 -0
- package/dist/sdk/query/list.js +1089 -0
- package/dist/sdk/query/list.js.map +1 -0
- package/dist/sdk/query/parsers.d.ts +9 -0
- package/dist/sdk/query/parsers.js +45 -0
- package/dist/sdk/query/parsers.js.map +1 -0
- package/dist/{cli/commands → sdk/query}/search-pagination.js +4 -4
- package/dist/sdk/query/search-pagination.js.map +1 -0
- package/dist/{cli/commands → sdk/query}/search-rendering.js +3 -3
- package/dist/sdk/query/search-rendering.js.map +1 -0
- package/dist/sdk/query/search.d.ts +469 -0
- package/dist/sdk/query/search.js +2247 -0
- package/dist/sdk/query/search.js.map +1 -0
- package/dist/sdk/relationship-context.d.ts +42 -0
- package/dist/sdk/relationship-context.js +99 -20
- package/dist/sdk/relationship-context.js.map +1 -1
- package/dist/sdk/relationships.d.ts +13 -0
- package/dist/sdk/relationships.js +30 -2
- package/dist/sdk/relationships.js.map +1 -1
- package/dist/sdk/runtime-input.d.ts +41 -0
- package/dist/sdk/runtime-input.js +422 -2
- package/dist/sdk/runtime-input.js.map +1 -1
- package/dist/sdk/runtime.d.ts +19 -30
- package/dist/sdk/runtime.js +30 -376
- package/dist/sdk/runtime.js.map +1 -1
- package/dist/sdk/search-refresh-worker.d.ts +2 -0
- package/dist/sdk/search-refresh-worker.js +19 -0
- package/dist/sdk/search-refresh-worker.js.map +1 -0
- package/dist/sdk/stats.d.ts +66 -0
- package/dist/sdk/stats.js +151 -0
- package/dist/sdk/stats.js.map +1 -0
- package/dist/sdk/telemetry-flush.d.ts +2 -0
- package/dist/sdk/telemetry-flush.js +14 -0
- package/dist/sdk/telemetry-flush.js.map +1 -0
- package/dist/sdk/telemetry.d.ts +14 -0
- package/dist/sdk/telemetry.js +398 -0
- package/dist/sdk/telemetry.js.map +1 -0
- package/dist/sdk/test/batch.d.ts +94 -0
- package/dist/sdk/test/batch.js +492 -0
- package/dist/sdk/test/batch.js.map +1 -0
- package/dist/sdk/test/entry.d.ts +6 -0
- package/dist/sdk/test/entry.js +74 -0
- package/dist/sdk/test/entry.js.map +1 -0
- package/dist/sdk/test/execution.d.ts +282 -0
- package/dist/sdk/test/execution.js +1817 -0
- package/dist/sdk/test/execution.js.map +1 -0
- package/dist/sdk/test/linked-command-detection.js +12 -3
- package/dist/sdk/test/linked-command-detection.js.map +1 -1
- package/dist/sdk/test/parsers.d.ts +48 -0
- package/dist/sdk/test/parsers.js +522 -0
- package/dist/sdk/test/parsers.js.map +1 -0
- package/dist/sdk/test/runs.d.ts +92 -0
- package/dist/sdk/test/runs.js +195 -0
- package/dist/sdk/test/runs.js.map +1 -0
- package/docs/AGENT_GUIDE.md +1 -0
- package/docs/COMMANDS.md +19 -1
- package/docs/RELATIONSHIP_GRAPH.md +99 -3
- package/docs/SDK.md +139 -3
- package/docs/SDK_PRIMITIVE_INVENTORY.md +5 -3
- package/docs/examples/sdk-custom-tool/README.md +27 -0
- package/docs/examples/sdk-custom-tool/package.json +13 -0
- package/docs/examples/sdk-custom-tool/src/cli.ts +36 -0
- package/docs/examples/sdk-custom-tool/src/entry.ts +15 -0
- package/docs/examples/sdk-custom-tool/src/index.ts +223 -0
- package/marketplace.json +2 -2
- package/package.json +4 -4
- 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/extensions/governance-audit/comments-audit.ts +77 -57
- package/packages/pm-governance-audit/extensions/governance-audit/dedupe-audit.ts +202 -194
- package/packages/pm-governance-audit/extensions/governance-audit/dedupe-merge.ts +227 -153
- package/packages/pm-governance-audit/extensions/governance-audit/normalize.ts +169 -125
- package/packages/pm-governance-audit/extensions/governance-audit/runtime-utils.ts +130 -81
- package/packages/pm-governance-audit/extensions/governance-audit/sdk.ts +53 -4
- 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/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/dist/cli/commands/item-filter-options.js.map +0 -1
- package/dist/cli/commands/search-pagination.js.map +0 -1
- package/dist/cli/commands/search-rendering.js.map +0 -1
- package/dist/cli-bundle/chunks/append-UZVHUO74.js +0 -11
- package/dist/cli-bundle/chunks/chunk-2NCIPMQP.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-3S5QVM5H.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-4XQ3BDV4.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-5JLUII3O.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-5ZSLZLDN.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-7Z4LKRS4.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-BKVG6XOA.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-E2OJMKML.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-EH2OPHBI.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-H5APFTHZ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-HYB5AZ63.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ILX33QXL.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-JFTKLTEF.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-LPYWLWDS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-NLDFBC6J.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ONG5V5CI.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-UFXU44HV.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-UMOPHQSU.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-UXONS674.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-XXXF6PAQ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-YBLZ2VE7.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-YXSHIAUJ.js +0 -58
- package/dist/cli-bundle/chunks/chunk-YXSHIAUJ.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-ZKRZY773.js +0 -68
- package/dist/cli-bundle/chunks/chunk-ZKRZY773.js.map +0 -7
- package/dist/cli-bundle/chunks/close-W6LI2PKM.js +0 -12
- package/dist/cli-bundle/chunks/close-many-DLDDVSH5.js +0 -23
- package/dist/cli-bundle/chunks/comments-E3TNTK24.js +0 -13
- package/dist/cli-bundle/chunks/copy-Q5ZJPUKR.js +0 -9
- package/dist/cli-bundle/chunks/delete-WNHB3LYW.js +0 -10
- package/dist/cli-bundle/chunks/deps-OA26IS25.js +0 -19
- package/dist/cli-bundle/chunks/docs-HA2AIDBB.js +0 -14
- package/dist/cli-bundle/chunks/focus-POIW5LTJ.js +0 -10
- package/dist/cli-bundle/chunks/history-compact-FWG2C7FZ.js +0 -16
- package/dist/cli-bundle/chunks/history-repair-6GEAM7HE.js +0 -16
- package/dist/cli-bundle/chunks/learnings-RSNLSWDC.js +0 -13
- package/dist/cli-bundle/chunks/notes-2WDH6DXU.js +0 -13
- package/dist/cli-bundle/chunks/plan-DOVI2VMW.js +0 -24
- package/dist/cli-bundle/chunks/register-list-query-DKA3EH5D.js.map +0 -7
- package/dist/cli-bundle/chunks/register-list-query-UL4UKBBN.js.map +0 -1
- package/dist/cli-bundle/chunks/register-mutation-RBBJ52DK.js.map +0 -1
- package/dist/cli-bundle/chunks/restore-YPMVUUEX.js +0 -14
- package/dist/cli-bundle/chunks/update-WWBYOPXO.js +0 -21
- package/dist/cli-bundle/chunks/update-many-OUGIU5SF.js +0 -32
- package/dist/cli-bundle/chunks/update-many-TA7NGQBO.js +0 -36
- /package/dist/cli-bundle/chunks/{append-OJQFUQ4T.js.map → append-5YF3TO7I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-UZVHUO74.js.map → append-JHO5K6RP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BCOFWYW4.js.map → chunk-2BX74BAS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-APRVSW2O.js.map → chunk-2CXL335K.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KG44YSKD.js.map → chunk-2FUOXSRN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HDH3JUGG.js.map → chunk-2IPNL3DR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GM5QHQU6.js.map → chunk-2XOSFSTH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-K3WII2ME.js.map → chunk-37DRDP2B.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PMOSXADO.js.map → chunk-47HXN6RX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6CFNAVTF.js.map → chunk-5HGZKQUL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2IFFUZLC.js.map → chunk-5UKQLQM2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DM4H7FP4.js.map → chunk-633PKXLT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XSJUSQAE.js.map → chunk-646MQXFW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ZI6VQWQ7.js.map → chunk-66MKH7SZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-S6MQESFR.js.map → chunk-67RO3H4N.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-34L5OT3Y.js.map → chunk-6DYOZS6C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RRM5JYJC.js.map → chunk-6O44IN44.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PENXZX3U.js.map → chunk-74FKFFXO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HO4KXD6I.js.map → chunk-7H5NNCJ5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TQSZFPIS.js.map → chunk-AFGKSHAM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6N2VXVTQ.js.map → chunk-ARGDWQ4J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3U7ZR6M4.js.map → chunk-B57RJHBZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YCQET3OT.js.map → chunk-BAP7G3N2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QKXHFPYM.js.map → chunk-BIRYX32V.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RMLWNPH2.js.map → chunk-BVLOMU6O.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2VPAVL7O.js.map → chunk-CKX4WOPC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TKOVBP6C.js.map → chunk-D52ZN3BF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KPMKHGEA.js.map → chunk-D53RTYVI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ODALILG3.js.map → chunk-D5XHO4Q7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YAQEBNY7.js.map → chunk-DDFGYUCQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EAB64KLB.js.map → chunk-DG2EQRIH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IG3SWA4A.js.map → chunk-EHJFUOXL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-P74IZQ7A.js.map → chunk-EWIT5WIC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ONREO4ST.js.map → chunk-EY7ZE3TG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EJEXHTY5.js.map → chunk-FHOBCGQO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-H3EIEWGR.js.map → chunk-FL4D53ND.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WUJQK4YV.js.map → chunk-FVNWHUME.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-INU6DKT5.js.map → chunk-FXFCFL73.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QEHQ2GVG.js.map → chunk-FY4RLHSC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AHVTB5I5.js.map → chunk-G6MYGULG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TSMHDIW4.js.map → chunk-GLZKZON6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2JKGO6QX.js.map → chunk-H5IOT54C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SELVXEZK.js.map → chunk-HO4DLBNK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CRVF2JDM.js.map → chunk-HPAYDSR2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3CLU2XZO.js.map → chunk-HSYV4ZYT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-J5AOEGDC.js.map → chunk-HYTOJW2Q.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NU3IMIEA.js.map → chunk-I7DIDUSP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JYFOV7FC.js.map → chunk-IE5KRAKN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YAROI3PD.js.map → chunk-IL5SPRMH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UY2ACEMF.js.map → chunk-ILVOOAT4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GOSLKLFE.js.map → chunk-KH6QAHME.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WQPUU7XD.js.map → chunk-L337QKWJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-LSG2U345.js.map → chunk-L6FVNR7X.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FMBNM2EN.js.map → chunk-LSOWTLEM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4223PVZT.js.map → chunk-M7MVOKVV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3WM75PWC.js.map → chunk-N33FD2UI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6S3YSUYG.js.map → chunk-NNANAWFH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IJIICKVW.js.map → chunk-NTRQLE2R.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SDQLJWBO.js.map → chunk-NVZ6NVHJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-H2Z3FYXQ.js.map → chunk-OWP6QFBV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-Q7A43DS4.js.map → chunk-P22HGFFI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NVPZIJVR.js.map → chunk-PT7MCCGD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-J6EY5V4N.js.map → chunk-QRZNCRNA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QIPLHNP7.js.map → chunk-QWBKN3QC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7PIWCHTW.js.map → chunk-R5XTTZSJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JOUQZENX.js.map → chunk-RC4UOUXA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BEP7WJA2.js.map → chunk-RGMWJLXF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NP22ERDF.js.map → chunk-RTBX3C4C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FNSPG7MU.js.map → chunk-RXPQ5Q23.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ULTHRDBP.js.map → chunk-TM5CIO3F.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UWQHLMEB.js.map → chunk-TZAE66GQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OW4JWD5M.js.map → chunk-VAHZIPWS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DYH63FX7.js.map → chunk-VE6ZSTQW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3AUGG2DP.js.map → chunk-W5E2UUSH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UOHFKBUV.js.map → chunk-WL3SS45P.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QKJGPFAF.js.map → chunk-WU3KAN6A.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IA5FKNII.js.map → chunk-X2MGQMZO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TD3LVC7D.js.map → chunk-X5YCTFKT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-B7PE22W6.js.map → chunk-XC2HEEOV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-K2X6U4UA.js.map → chunk-XXLXJL7V.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EACOH7AU.js.map → chunk-YIIIAKCE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RLCHOOHC.js.map → chunk-YJSURTBB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PGY23YTC.js.map → chunk-YKFHF37B.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EYLCSJAI.js.map → chunk-YQEZWI3R.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-W6LI2PKM.js.map → close-GPD7DTJV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-CWODTPKG.js.map → close-X3CF6FQP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-CQFUY7MR.js.map → close-many-J7A5EHOQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-DLDDVSH5.js.map → close-many-NQLYGPYW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-E3TNTK24.js.map → comments-2AOZQ5D2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-WGLHR7LB.js.map → comments-TMHMALA5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-LXVDXH7B.js.map → copy-FWQA5OU4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-Q5ZJPUKR.js.map → copy-N3LCQBMC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-LBVCYMEG.js.map → create-AQ5SIGZC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-J5U6ND4K.js.map → create-KOGQ3JKD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-WNHB3LYW.js.map → delete-6G3MBZ6S.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-PMJBNY5G.js.map → delete-YYYFOSEA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-JZ7TMVCB.js.map → deps-MQ4ZIGZB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-OA26IS25.js.map → deps-NIIKXLPB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-FEWB2DQB.js.map → docs-53NUGMIQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-HA2AIDBB.js.map → docs-OWRGDMNY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-EFIWKFTM.js.map → files-3PXGXYDB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-6YFBJRBG.js.map → files-EGLKHD7O.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-POIW5LTJ.js.map → focus-KZLIA6WS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-4QJR7FOQ.js.map → focus-SRPASFTN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-CKRPDTJN.js.map → history-compact-G4DULDCX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-FWG2C7FZ.js.map → history-compact-HHIUOMZ7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-BB3TGDAE.js.map → history-redact-IUSJ6X3E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-D225BHOZ.js.map → history-redact-THHGRQXV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-6GEAM7HE.js.map → history-repair-KG7SWXI6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-RQXKQHL4.js.map → history-repair-LUQWRS7X.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-JLNLCOL5.js.map → learnings-2MRNBFJF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-RSNLSWDC.js.map → learnings-ZVHSALJY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-GB47XXQQ.js.map → notes-73JWKWUD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-2WDH6DXU.js.map → notes-BAKUL5DJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-VDCJ2PCN.js.map → plan-AZPMCG37.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-DOVI2VMW.js.map → plan-LEAGLPGP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-FAU7NZML.js.map → profile-AVCIIZID.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-IVXQEL3D.js.map → profile-LFYO3HHX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-ZIBBRSED.js.map → register-operations-KHZYR6MG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-ZUJ5JWPE.js.map → register-operations-WPQ2LWZJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-setup-BCVLFEYS.js.map → register-setup-PGDNOXDQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-setup-TDCGWIOS.js.map → register-setup-TDN7WAO6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-25DLT2Q2.js.map → restore-E3PRGDN3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-YPMVUUEX.js.map → restore-KIUYTAEJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-FNU3WE4O.js.map → schema-5JNFQFUW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-NBCM3RAD.js.map → schema-TMIW4XZC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-XHSIAIXE.js.map → update-SQYZA3ZW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-WWBYOPXO.js.map → update-XZJYS5X7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-TA7NGQBO.js.map → update-many-R24B3GBK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-OUGIU5SF.js.map → update-many-WQ3R3J6N.js.map} +0 -0
- /package/dist/{cli/commands → sdk/query}/search-pagination.d.ts +0 -0
- /package/dist/{cli/commands → sdk/query}/search-rendering.d.ts +0 -0
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { EXIT_CODE, PmCliError, PmClient, type ListOptions } from "./sdk.ts";
|
|
8
8
|
|
|
9
9
|
/** Retain only list filters that the package-owned audit queries may forward. */
|
|
10
|
-
export
|
|
10
|
+
export const buildListQueryFilters = (
|
|
11
11
|
filters: Pick<
|
|
12
12
|
ListOptions,
|
|
13
13
|
| "type"
|
|
@@ -21,7 +21,7 @@ export function buildListQueryFilters(
|
|
|
21
21
|
| "sprint"
|
|
22
22
|
| "release"
|
|
23
23
|
>,
|
|
24
|
-
): ListOptions {
|
|
24
|
+
): ListOptions => {
|
|
25
25
|
const {
|
|
26
26
|
type,
|
|
27
27
|
tag,
|
|
@@ -46,48 +46,50 @@ export function buildListQueryFilters(
|
|
|
46
46
|
sprint,
|
|
47
47
|
release,
|
|
48
48
|
};
|
|
49
|
-
}
|
|
49
|
+
};
|
|
50
50
|
|
|
51
51
|
/** Order valid timestamps chronologically and malformed values lexicographically. */
|
|
52
|
-
export
|
|
52
|
+
export const compareTimestampStrings = (
|
|
53
|
+
left: string,
|
|
54
|
+
right: string,
|
|
55
|
+
): number => {
|
|
53
56
|
const leftMs = Date.parse(left);
|
|
54
57
|
const rightMs = Date.parse(right);
|
|
55
58
|
if (Number.isFinite(leftMs) && Number.isFinite(rightMs) && leftMs !== rightMs)
|
|
56
59
|
return leftMs - rightMs;
|
|
57
60
|
return left.localeCompare(right);
|
|
58
|
-
}
|
|
61
|
+
};
|
|
59
62
|
|
|
60
63
|
/** Measure set overlap between two token lists on the inclusive zero-to-one scale. */
|
|
61
|
-
export
|
|
64
|
+
export const jaccardSimilarity = (
|
|
62
65
|
leftTokens: string[],
|
|
63
66
|
rightTokens: string[],
|
|
64
|
-
): number {
|
|
65
|
-
if (leftTokens.length === 0 && rightTokens.length === 0) return 1;
|
|
66
|
-
if (leftTokens.length === 0 || rightTokens.length === 0) return 0;
|
|
67
|
+
): number => {
|
|
67
68
|
const left = new Set(leftTokens);
|
|
68
69
|
const right = new Set(rightTokens);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
const union = new Set([...left, ...right]);
|
|
71
|
+
if (union.size === 0) return 1;
|
|
72
|
+
const intersection = [...left].filter((token) => right.has(token)).length;
|
|
73
|
+
return intersection / union.size;
|
|
74
|
+
};
|
|
73
75
|
|
|
74
76
|
/** Trim, lowercase, and collapse internal whitespace for stable audit comparisons. */
|
|
75
|
-
export
|
|
77
|
+
export const normalizeLowercaseWhitespace = (value: string): string => {
|
|
76
78
|
return value.trim().toLowerCase().replace(/\s+/g, " ");
|
|
77
|
-
}
|
|
79
|
+
};
|
|
78
80
|
|
|
79
81
|
/** Split normalized text into non-empty lowercase ASCII alphanumeric tokens. */
|
|
80
|
-
export
|
|
82
|
+
export const tokenizeAlphaNumeric = (value: string): string[] => {
|
|
81
83
|
return normalizeLowercaseWhitespace(value)
|
|
82
84
|
.split(/[^a-z0-9]+/)
|
|
83
85
|
.filter((token) => token.length > 0);
|
|
84
|
-
}
|
|
86
|
+
};
|
|
85
87
|
|
|
86
88
|
/** Parse an optional non-negative integer limit with package-specific error context. */
|
|
87
|
-
export
|
|
89
|
+
export const parseIntegerLimit = (
|
|
88
90
|
raw: string | undefined,
|
|
89
91
|
label = "--limit",
|
|
90
|
-
): number | undefined {
|
|
92
|
+
): number | undefined => {
|
|
91
93
|
if (raw === undefined) return undefined;
|
|
92
94
|
const parsed = Number(raw);
|
|
93
95
|
if (!Number.isInteger(parsed) || parsed < 0)
|
|
@@ -96,31 +98,31 @@ export function parseIntegerLimit(
|
|
|
96
98
|
EXIT_CODE.USAGE,
|
|
97
99
|
);
|
|
98
100
|
return parsed;
|
|
99
|
-
}
|
|
101
|
+
};
|
|
100
102
|
|
|
101
103
|
/** Normalize an optional comma-separated value into trimmed non-empty entries. */
|
|
102
|
-
export
|
|
104
|
+
export const splitCommaList = (raw: string | undefined | null): string[] => {
|
|
103
105
|
if (raw == null) return [];
|
|
104
106
|
return raw
|
|
105
107
|
.split(",")
|
|
106
108
|
.map((entry) => entry.trim())
|
|
107
109
|
.filter(Boolean);
|
|
108
|
-
}
|
|
110
|
+
};
|
|
109
111
|
|
|
110
112
|
/** Convert thrown values to a concise message suitable for audit result envelopes. */
|
|
111
|
-
export
|
|
113
|
+
export const toErrorMessage = (error: unknown): string => {
|
|
112
114
|
if (error instanceof Error) return error.message.trim() || error.name;
|
|
113
115
|
return String(error);
|
|
114
|
-
}
|
|
116
|
+
};
|
|
115
117
|
|
|
116
118
|
/** Return trimmed non-empty text while rejecting non-string and blank values. */
|
|
117
|
-
export
|
|
119
|
+
export const toNonEmptyStringOrUndefined = (
|
|
118
120
|
value: unknown,
|
|
119
|
-
): string | undefined {
|
|
121
|
+
): string | undefined => {
|
|
120
122
|
if (typeof value !== "string") return undefined;
|
|
121
123
|
const normalized = value.trim();
|
|
122
124
|
return normalized.length > 0 ? normalized : undefined;
|
|
123
|
-
}
|
|
125
|
+
};
|
|
124
126
|
|
|
125
127
|
/** Inputs used to attribute linked paths to every item that references them. */
|
|
126
128
|
export interface LinkedArtifactAuditPayload {
|
|
@@ -141,18 +143,22 @@ export interface LinkedArtifactAuditEntry {
|
|
|
141
143
|
}
|
|
142
144
|
|
|
143
145
|
/** Build sorted, duplicate-free reverse attribution for requested artifact paths. */
|
|
144
|
-
export
|
|
146
|
+
export const buildLinkedArtifactAudit = (
|
|
145
147
|
input: LinkedArtifactAuditPayload,
|
|
146
|
-
): LinkedArtifactAuditEntry[] {
|
|
148
|
+
): LinkedArtifactAuditEntry[] => {
|
|
149
|
+
/** Build a stable reverse index over optional item and path collections. */
|
|
150
|
+
/** Normalize an optional read-only collection into an iterable array. */
|
|
151
|
+
const optionalArray = <Value>(values: readonly Value[] | undefined) =>
|
|
152
|
+
values ?? [];
|
|
147
153
|
const index = new Map<string, Set<string>>();
|
|
148
|
-
for (const item of input.items
|
|
149
|
-
for (const artifact of item.artifacts
|
|
154
|
+
for (const item of optionalArray(input.items)) {
|
|
155
|
+
for (const artifact of optionalArray(item.artifacts)) {
|
|
150
156
|
const ids = index.get(artifact.path) ?? new Set<string>();
|
|
151
157
|
ids.add(item.id);
|
|
152
158
|
index.set(artifact.path, ids);
|
|
153
159
|
}
|
|
154
160
|
}
|
|
155
|
-
return [...new Set(input.paths
|
|
161
|
+
return [...new Set(optionalArray(input.paths))]
|
|
156
162
|
.sort((left, right) => left.localeCompare(right))
|
|
157
163
|
.map((linkedPath) => {
|
|
158
164
|
const linkedItemIds = [...(index.get(linkedPath) ?? [])].sort(
|
|
@@ -164,7 +170,7 @@ export function buildLinkedArtifactAudit(
|
|
|
164
170
|
linked_item_ids: linkedItemIds,
|
|
165
171
|
};
|
|
166
172
|
});
|
|
167
|
-
}
|
|
173
|
+
};
|
|
168
174
|
|
|
169
175
|
interface CommandResultPayload {
|
|
170
176
|
command?: string;
|
|
@@ -174,80 +180,123 @@ interface CommandResultPayload {
|
|
|
174
180
|
result?: unknown;
|
|
175
181
|
}
|
|
176
182
|
|
|
177
|
-
|
|
183
|
+
const asRecord = (value: unknown): Record<string, unknown> | undefined => {
|
|
184
|
+
/** Narrow an unknown payload to a non-null object record. */
|
|
178
185
|
return typeof value === "object" && value !== null
|
|
179
186
|
? (value as Record<string, unknown>)
|
|
180
187
|
: undefined;
|
|
181
|
-
}
|
|
188
|
+
};
|
|
182
189
|
|
|
183
|
-
|
|
190
|
+
const hasUpdateAuditBypass = (
|
|
191
|
+
options: Record<string, unknown> | undefined,
|
|
192
|
+
): boolean => {
|
|
193
|
+
/** Detect every supported update-audit bypass alias. */
|
|
194
|
+
const resolved = options ?? {};
|
|
184
195
|
return (
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
196
|
+
resolved.allowAuditUpdate === true ||
|
|
197
|
+
resolved.allow_audit_update === true ||
|
|
198
|
+
resolved.allowAuditDepUpdate === true ||
|
|
199
|
+
resolved.allow_audit_dep_update === true
|
|
189
200
|
);
|
|
190
|
-
}
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
const resolveLinkedArtifactAuditKey = (
|
|
204
|
+
payload: CommandResultPayload,
|
|
205
|
+
): "files" | "docs" | undefined => {
|
|
206
|
+
/** Resolve the supported linked-artifact result key for an eligible audit request. */
|
|
207
|
+
const artifactKey = (["files", "docs"] as const).find(
|
|
208
|
+
(candidate) => candidate === payload.command,
|
|
209
|
+
);
|
|
210
|
+
if (artifactKey === undefined) return undefined;
|
|
211
|
+
if (payload.options?.audit !== true) return undefined;
|
|
212
|
+
if (!payload.pm_root) return undefined;
|
|
213
|
+
return artifactKey;
|
|
214
|
+
};
|
|
191
215
|
|
|
192
|
-
async
|
|
216
|
+
const decorateLinkedArtifactResult = async (
|
|
193
217
|
payload: CommandResultPayload,
|
|
194
218
|
result: Record<string, unknown>,
|
|
195
|
-
): Promise<Record<string, unknown> | undefined> {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
!payload.pm_root
|
|
200
|
-
) {
|
|
201
|
-
return undefined;
|
|
202
|
-
}
|
|
203
|
-
const artifactKey = payload.command;
|
|
219
|
+
): Promise<Record<string, unknown> | undefined> => {
|
|
220
|
+
/** Add reverse linked-artifact attribution to eligible files/docs results. */
|
|
221
|
+
const artifactKey = resolveLinkedArtifactAuditKey(payload);
|
|
222
|
+
if (artifactKey === undefined) return undefined;
|
|
204
223
|
const artifacts = Array.isArray(result[artifactKey])
|
|
205
|
-
?
|
|
224
|
+
? result[artifactKey]
|
|
206
225
|
: [];
|
|
207
|
-
const paths = artifacts.flatMap((entry) =>
|
|
208
|
-
|
|
209
|
-
|
|
226
|
+
const paths = artifacts.flatMap((entry) => {
|
|
227
|
+
const artifact = asRecord(entry);
|
|
228
|
+
return typeof artifact?.path === "string" ? [artifact.path] : [];
|
|
229
|
+
});
|
|
210
230
|
const listed = await new PmClient({ pmRoot: payload.pm_root }).list({
|
|
211
231
|
status: "all",
|
|
212
232
|
noTruncate: true,
|
|
213
233
|
fields: `id,${artifactKey}`,
|
|
214
234
|
});
|
|
215
|
-
const items = listed.items.
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
235
|
+
const items = listed.items.flatMap((item) =>
|
|
236
|
+
typeof item.id === "string"
|
|
237
|
+
? [
|
|
238
|
+
{
|
|
239
|
+
id: item.id,
|
|
240
|
+
artifacts: Array.isArray(item[artifactKey])
|
|
241
|
+
? item[artifactKey].flatMap((entry) => {
|
|
242
|
+
const artifact = asRecord(entry);
|
|
243
|
+
return typeof artifact?.path === "string"
|
|
244
|
+
? [{ path: artifact.path }]
|
|
245
|
+
: [];
|
|
246
|
+
})
|
|
247
|
+
: undefined,
|
|
248
|
+
},
|
|
249
|
+
]
|
|
250
|
+
: [],
|
|
251
|
+
);
|
|
221
252
|
return {
|
|
222
253
|
...result,
|
|
223
254
|
audit: buildLinkedArtifactAudit({ paths, items }),
|
|
224
255
|
};
|
|
225
|
-
}
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
const decorateUpdateAuditBypassResult = (
|
|
259
|
+
payload: CommandResultPayload,
|
|
260
|
+
result: Record<string, unknown>,
|
|
261
|
+
): Record<string, unknown> | undefined => {
|
|
262
|
+
/** Add the package-owned audit marker for an explicit update bypass. */
|
|
263
|
+
const isUpdate = ["update", "update-many"].includes(String(payload.command));
|
|
264
|
+
if (isUpdate && hasUpdateAuditBypass(payload.options)) {
|
|
265
|
+
return { ...result, audit_update: true };
|
|
266
|
+
}
|
|
267
|
+
return undefined;
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
const decorateReleaseAuditBypassResult = (
|
|
271
|
+
payload: CommandResultPayload,
|
|
272
|
+
result: Record<string, unknown>,
|
|
273
|
+
): Record<string, unknown> | undefined => {
|
|
274
|
+
/** Add the package-owned audit marker for an explicit release bypass. */
|
|
275
|
+
if (
|
|
276
|
+
payload.command === "release" &&
|
|
277
|
+
payload.options?.allowAuditRelease === true
|
|
278
|
+
) {
|
|
279
|
+
return { ...result, audit_release: true };
|
|
280
|
+
}
|
|
281
|
+
return undefined;
|
|
282
|
+
};
|
|
226
283
|
|
|
227
284
|
/** Add package-owned fields to a completed core command result. */
|
|
228
|
-
export async
|
|
285
|
+
export const decorateGovernanceCommandResult = async (
|
|
229
286
|
raw: unknown,
|
|
230
|
-
): Promise<unknown> {
|
|
287
|
+
): Promise<unknown> => {
|
|
231
288
|
const payload = asRecord(raw) as CommandResultPayload | undefined;
|
|
232
|
-
|
|
233
|
-
const
|
|
234
|
-
if (!
|
|
289
|
+
if (!payload) return undefined;
|
|
290
|
+
const result = asRecord(payload.result);
|
|
291
|
+
if (!result) return payload.result;
|
|
235
292
|
const linkedArtifactResult = await decorateLinkedArtifactResult(
|
|
236
293
|
payload,
|
|
237
294
|
result,
|
|
238
295
|
);
|
|
239
296
|
if (linkedArtifactResult) return linkedArtifactResult;
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
(payload
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
if (payload.command === "release" && options.allowAuditRelease === true) {
|
|
249
|
-
return { ...result, audit_release: true };
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
return result;
|
|
253
|
-
}
|
|
297
|
+
const bypassResult = [
|
|
298
|
+
decorateUpdateAuditBypassResult(payload, result),
|
|
299
|
+
decorateReleaseAuditBypassResult(payload, result),
|
|
300
|
+
].find((candidate) => candidate !== undefined);
|
|
301
|
+
return bypassResult ?? result;
|
|
302
|
+
};
|
|
@@ -6,16 +6,63 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import path from "node:path";
|
|
8
8
|
import { pathToFileURL } from "node:url";
|
|
9
|
-
import type
|
|
9
|
+
import type {
|
|
10
|
+
EXIT_CODE as RuntimeExitCode,
|
|
11
|
+
PmCliError as RuntimePmCliError,
|
|
12
|
+
PmClient as RuntimePmClient,
|
|
13
|
+
getActiveExtensionRegistrations as runtimeGetActiveExtensionRegistrations,
|
|
14
|
+
getSettingsPath as runtimeGetSettingsPath,
|
|
15
|
+
isTerminalStatus as runtimeIsTerminalStatus,
|
|
16
|
+
locateItem as runtimeLocateItem,
|
|
17
|
+
normalizeStatusInput as runtimeNormalizeStatusInput,
|
|
18
|
+
nowIso as runtimeNowIso,
|
|
19
|
+
pathExists as runtimePathExists,
|
|
20
|
+
readBooleanOption as runtimeReadBooleanOption,
|
|
21
|
+
readCsvListOption as runtimeReadCsvListOption,
|
|
22
|
+
readLocatedItem as runtimeReadLocatedItem,
|
|
23
|
+
readSettings as runtimeReadSettings,
|
|
24
|
+
readStringOption as runtimeReadStringOption,
|
|
25
|
+
resolveItemTypeRegistry as runtimeResolveItemTypeRegistry,
|
|
26
|
+
resolvePmRoot as runtimeResolvePmRoot,
|
|
27
|
+
resolveRuntimeStatusRegistry as runtimeResolveRuntimeStatusRegistry,
|
|
28
|
+
runClose as runtimeRunClose,
|
|
29
|
+
runList as runtimeRunList,
|
|
30
|
+
runUpdate as runtimeRunUpdate,
|
|
31
|
+
} from "@unbrained/pm-cli/sdk/runtime";
|
|
32
|
+
|
|
33
|
+
/** Typed host-runtime values consumed through the package's dynamic boundary. */
|
|
34
|
+
interface RuntimeSdkModule {
|
|
35
|
+
EXIT_CODE: typeof RuntimeExitCode;
|
|
36
|
+
PmCliError: typeof RuntimePmCliError;
|
|
37
|
+
PmClient: typeof RuntimePmClient;
|
|
38
|
+
getActiveExtensionRegistrations: typeof runtimeGetActiveExtensionRegistrations;
|
|
39
|
+
getSettingsPath: typeof runtimeGetSettingsPath;
|
|
40
|
+
isTerminalStatus: typeof runtimeIsTerminalStatus;
|
|
41
|
+
locateItem: typeof runtimeLocateItem;
|
|
42
|
+
normalizeStatusInput: typeof runtimeNormalizeStatusInput;
|
|
43
|
+
nowIso: typeof runtimeNowIso;
|
|
44
|
+
pathExists: typeof runtimePathExists;
|
|
45
|
+
readBooleanOption: typeof runtimeReadBooleanOption;
|
|
46
|
+
readCsvListOption: typeof runtimeReadCsvListOption;
|
|
47
|
+
readLocatedItem: typeof runtimeReadLocatedItem;
|
|
48
|
+
readSettings: typeof runtimeReadSettings;
|
|
49
|
+
readStringOption: typeof runtimeReadStringOption;
|
|
50
|
+
resolveItemTypeRegistry: typeof runtimeResolveItemTypeRegistry;
|
|
51
|
+
resolvePmRoot: typeof runtimeResolvePmRoot;
|
|
52
|
+
resolveRuntimeStatusRegistry: typeof runtimeResolveRuntimeStatusRegistry;
|
|
53
|
+
runClose: typeof runtimeRunClose;
|
|
54
|
+
runList: typeof runtimeRunList;
|
|
55
|
+
runUpdate: typeof runtimeRunUpdate;
|
|
56
|
+
}
|
|
10
57
|
|
|
11
58
|
const packageRoot = process.env.PM_CLI_PACKAGE_ROOT?.trim();
|
|
12
|
-
let loadedRuntime:
|
|
59
|
+
let loadedRuntime: RuntimeSdkModule;
|
|
13
60
|
/* c8 ignore start -- copied installs exercise PM_CLI_PACKAGE_ROOT in subprocess integration coverage. */
|
|
14
61
|
try {
|
|
15
62
|
if (packageRoot) {
|
|
16
63
|
loadedRuntime = (await import(
|
|
17
64
|
pathToFileURL(path.join(packageRoot, "dist", "sdk", "runtime.js")).href
|
|
18
|
-
)) as
|
|
65
|
+
)) as RuntimeSdkModule;
|
|
19
66
|
} else {
|
|
20
67
|
loadedRuntime = await import("@unbrained/pm-cli/sdk/runtime");
|
|
21
68
|
}
|
|
@@ -50,10 +97,12 @@ export const {
|
|
|
50
97
|
resolvePmRoot,
|
|
51
98
|
resolveRuntimeStatusRegistry,
|
|
52
99
|
runClose,
|
|
53
|
-
runList,
|
|
54
100
|
runUpdate,
|
|
55
101
|
} = runtime;
|
|
56
102
|
|
|
103
|
+
/** Preserve the host SDK list overloads across the dynamic runtime boundary. */
|
|
104
|
+
export const runList: typeof runtimeRunList = runtime.runList;
|
|
105
|
+
|
|
57
106
|
/** Runtime status registry inferred from the host SDK's schema resolver. */
|
|
58
107
|
export type RuntimeStatusRegistry = ReturnType<
|
|
59
108
|
typeof resolveRuntimeStatusRegistry
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pm-claude",
|
|
3
3
|
"description": "Native pm CLI integration for Claude Code — 28 MCP tools, 5 workflow skills, 14 slash commands, 4 subagents (coordinator, delivery-chain, triage, verification), hybrid TUI task tracking (pm as persistent store + Claude Code task panel as live view), session context injection, and full git-based project management without leaving Claude Code.",
|
|
4
|
-
"version": "2026.7.
|
|
4
|
+
"version": "2026.7.18",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "unbrained",
|
|
7
7
|
"url": "https://github.com/unbraind/pm-cli"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"item-filter-options.js","sources":["cli/commands/item-filter-options.ts"],"sourceRoot":"/","sourcesContent":["/**\n * @module cli/commands/item-filter-options\n *\n * Shared item-filter option contracts used by command implementations and SDK-facing types.\n */\n\n/** Common scalar item filters accepted by list/search-style commands. */\nexport interface SharedItemScalarFilterOptions {\n /** Lifecycle state reported for status. */\n status?: string;\n /** Schema type that determines the shape and validation rules for this value. */\n type?: string;\n /** Value that configures or reports tag for this contract. */\n tag?: string;\n /** Value that configures or reports priority for this contract. */\n priority?: string;\n /** Value that configures or reports deadline before for this contract. */\n deadlineBefore?: string;\n /** Value that configures or reports deadline after for this contract. */\n deadlineAfter?: string;\n /** Value that configures or reports updated after for this contract. */\n updatedAfter?: string;\n /** Value that configures or reports updated before for this contract. */\n updatedBefore?: string;\n /** Value that configures or reports created after for this contract. */\n createdAfter?: string;\n /** Value that configures or reports created before for this contract. */\n createdBefore?: string;\n /** Value that configures or reports assignee for this contract. */\n assignee?: string;\n /** Value that configures or reports parent for this contract. */\n parent?: string;\n /** Value that configures or reports sprint for this contract. */\n sprint?: string;\n /** Value that configures or reports release for this contract. */\n release?: string;\n}\n\n/** Common governance-metadata presence filters accepted by item query commands. */\nexport interface SharedGovernanceMissingFilterOptions {\n /** Value that configures or reports filter reviewer missing for this contract. */\n filterReviewerMissing?: boolean;\n /** Value that configures or reports filter risk missing for this contract. */\n filterRiskMissing?: boolean;\n /** Value that configures or reports filter confidence missing for this contract. */\n filterConfidenceMissing?: boolean;\n /** Value that configures or reports filter sprint missing for this contract. */\n filterSprintMissing?: boolean;\n /** Value that configures or reports filter release missing for this contract. */\n filterReleaseMissing?: boolean;\n}\n\n/** Common content-field presence filters accepted by item query commands. */\nexport interface SharedContentFieldFilterOptions {\n /** Whether notes applies to this operation. */\n hasNotes?: boolean;\n /** Whether learnings applies to this operation. */\n hasLearnings?: boolean;\n /** Whether files applies to this operation. */\n hasFiles?: boolean;\n /** Whether docs applies to this operation. */\n hasDocs?: boolean;\n /** Whether tests applies to this operation. */\n hasTests?: boolean;\n /** Whether comments applies to this operation. */\n hasComments?: boolean;\n /** Whether deps applies to this operation. */\n hasDeps?: boolean;\n /** Whether body applies to this operation. */\n hasBody?: boolean;\n /** Whether linked command applies to this operation. */\n hasLinkedCommand?: boolean;\n /** Value that configures or reports no notes for this contract. */\n noNotes?: boolean;\n /** Value that configures or reports no learnings for this contract. */\n noLearnings?: boolean;\n /** Value that configures or reports no files for this contract. */\n noFiles?: boolean;\n /** Value that configures or reports filter files missing for this contract. */\n filterFilesMissing?: boolean;\n /** Value that configures or reports no docs for this contract. */\n noDocs?: boolean;\n /** Value that configures or reports filter docs missing for this contract. */\n filterDocsMissing?: boolean;\n /** Value that configures or reports no tests for this contract. */\n noTests?: boolean;\n /** Value that configures or reports no comments for this contract. */\n noComments?: boolean;\n /** Value that configures or reports no deps for this contract. */\n noDeps?: boolean;\n /** Value that configures or reports empty body for this contract. */\n emptyBody?: boolean;\n /** Value that configures or reports no linked command for this contract. */\n noLinkedCommand?: boolean;\n}\n\n/** Base option shape for item query commands with schema/runtime extension flags. */\nexport interface SharedItemFilterOptions\n extends\n SharedItemScalarFilterOptions,\n SharedGovernanceMissingFilterOptions,\n SharedContentFieldFilterOptions {\n [key: string]: unknown;\n}\n"],"names":[],"mappings":"AAAA;;;;GAIG","debugId":"e9715bcc-aec2-557d-8ccd-13d3d0262792"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-pagination.js","sources":["cli/commands/search-pagination.ts"],"sourceRoot":"/","sourcesContent":["/**\n * @module cli/commands/search-pagination\n *\n * Applies the shared SDK cursor contract to ranked search results.\n */\nimport {\n createQueryFingerprint,\n paginateQueryRows,\n} from \"../../sdk/pagination.js\";\nimport type { SearchHit, SearchOptions } from \"./search.js\";\nimport type { SearchMode } from \"./search-rendering.js\";\n\n/** Build the query-only fingerprint shared by search retrieval and paging. */\nexport function createSearchCursorFingerprint(options: {\n query: string;\n mode: SearchMode;\n searchOptions: SearchOptions;\n}): string {\n const normalizedOptions: Record<string, unknown> = {\n ...options.searchOptions,\n };\n delete normalizedOptions.after;\n delete normalizedOptions.limit;\n delete normalizedOptions.compact;\n delete normalizedOptions.full;\n delete normalizedOptions.fields;\n delete normalizedOptions.highlight;\n delete normalizedOptions.format;\n return createQueryFingerprint(\"search\", {\n query: options.query.trim(),\n mode: options.mode,\n options: normalizedOptions,\n });\n}\n\n/** Page ranked search hits without coupling cursor mechanics to search scoring. */\nexport function resolveSearchPage(options: {\n sorted: SearchHit[];\n query: string;\n mode: SearchMode;\n searchOptions: SearchOptions;\n limit: number;\n}): {\n limited: SearchHit[];\n pageExtras: {\n has_more?: boolean;\n next_cursor?: string;\n applied_limit: number;\n truncated?: true;\n };\n} {\n const page = paginateQueryRows(options.sorted, {\n cursor: options.searchOptions.after,\n fingerprint: createSearchCursorFingerprint(options),\n limit: options.limit,\n readId: (hit) => hit.item.id,\n });\n return {\n limited: page.rows,\n pageExtras: {\n applied_limit: options.limit,\n ...(page.has_more ? { has_more: true, truncated: true } : {}),\n ...(page.next_cursor ? { next_cursor: page.next_cursor } : {}),\n },\n };\n}\n"],"names":[],"mappings":"AAAA;;;;GAIG;;;AACH,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AAIjC,8EAA8E;AAC9E,MAAM,UAAU,6BAA6B,CAAC,OAI7C;IACC,MAAM,iBAAiB,GAA4B;QACjD,GAAG,OAAO,CAAC,aAAa;KACzB,CAAC;IACF,OAAO,iBAAiB,CAAC,KAAK,CAAC;IAC/B,OAAO,iBAAiB,CAAC,KAAK,CAAC;IAC/B,OAAO,iBAAiB,CAAC,OAAO,CAAC;IACjC,OAAO,iBAAiB,CAAC,IAAI,CAAC;IAC9B,OAAO,iBAAiB,CAAC,MAAM,CAAC;IAChC,OAAO,iBAAiB,CAAC,SAAS,CAAC;IACnC,OAAO,iBAAiB,CAAC,MAAM,CAAC;IAChC,OAAO,sBAAsB,CAAC,QAAQ,EAAE;QACtC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;QAC3B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,iBAAiB;KAC3B,CAAC,CAAC;AACL,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,OAMjC;IASC,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE;QAC7C,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK;QACnC,WAAW,EAAE,6BAA6B,CAAC,OAAO,CAAC;QACnD,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;KAC7B,CAAC,CAAC;IACH,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,IAAI;QAClB,UAAU,EAAE;YACV,aAAa,EAAE,OAAO,CAAC,KAAK;YAC5B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D;KACF,CAAC;AACJ,CAAC","debugId":"39599b41-97b7-53e2-9318-db5e3724bf2e"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-rendering.js","sources":["cli/commands/search-rendering.ts"],"sourceRoot":"/","sourcesContent":["/**\n * @module cli/commands/search-rendering\n *\n * Builds stable compact and verbose filter projections for search responses.\n */\nimport {\n applyFilterValueEcho,\n buildContentFilterEcho,\n buildGovernanceMissingFilterEcho,\n} from \"./list.js\";\nimport type { SearchMatchMode, SearchOptions } from \"./search.js\";\n\n/** Search execution modes represented in response metadata. */\nexport type SearchMode = \"keyword\" | \"semantic\" | \"hybrid\";\n\ninterface SearchRenderingQueryExpansion {\n enabled: boolean;\n provider: string | null;\n}\n\ninterface SearchRenderingRerank {\n enabled: boolean;\n model: string;\n top_k: number;\n}\n\nfunction isAllStatuses(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n const tokens = value\n .split(\",\")\n .map((entry) => entry.trim().toLowerCase())\n .filter(Boolean);\n return tokens.length === 1 && tokens[0] === \"all\";\n}\n\nconst COMPACT_SEARCH_VALUE_FILTER_ECHO_ENTRIES = [\n {\n optionKey: \"status\",\n summaryKey: \"status\",\n normalize: (value: unknown) => (isAllStatuses(value) ? \"all\" : value),\n },\n { optionKey: \"type\", summaryKey: \"type\" },\n { optionKey: \"tag\", summaryKey: \"tag\" },\n { optionKey: \"priority\", summaryKey: \"priority\" },\n { optionKey: \"deadlineBefore\", summaryKey: \"deadline_before\" },\n { optionKey: \"deadlineAfter\", summaryKey: \"deadline_after\" },\n { optionKey: \"updatedAfter\", summaryKey: \"updated_after\" },\n { optionKey: \"updatedBefore\", summaryKey: \"updated_before\" },\n { optionKey: \"createdAfter\", summaryKey: \"created_after\" },\n { optionKey: \"createdBefore\", summaryKey: \"created_before\" },\n { optionKey: \"assignee\", summaryKey: \"assignee\" },\n { optionKey: \"sprint\", summaryKey: \"sprint\" },\n { optionKey: \"release\", summaryKey: \"release\" },\n { optionKey: \"parent\", summaryKey: \"parent\" },\n] as const;\n\n/** Builds the token-efficient filter echo used by compact search results. */\nexport function buildCompactSearchFilterSummary(params: {\n mode: SearchMode;\n matchMode: SearchMatchMode;\n options: SearchOptions;\n includeLinked: boolean;\n titleExact: boolean;\n phraseExact: boolean;\n scoreThreshold: number;\n hybridSemanticWeight: number;\n runtimeFieldFilters?: Record<string, unknown>;\n}): Record<string, unknown> {\n const { mode, matchMode, options, includeLinked, titleExact, phraseExact, scoreThreshold, hybridSemanticWeight, runtimeFieldFilters } = params;\n const filters: Record<string, unknown> = {};\n applyFilterValueEcho(filters, options, COMPACT_SEARCH_VALUE_FILTER_ECHO_ENTRIES);\n Object.assign(filters, buildGovernanceMissingFilterEcho(options as Record<string, unknown>));\n Object.assign(filters, buildContentFilterEcho(options as Record<string, unknown>));\n if (matchMode !== \"or\") filters.match_mode = matchMode;\n if (includeLinked) filters.include_linked = true;\n if (titleExact) filters.title_exact = true;\n if (phraseExact) filters.phrase_exact = true;\n if (scoreThreshold > 0) filters.score_threshold = scoreThreshold;\n if (mode === \"hybrid\" && options.semanticWeight !== undefined) {\n filters.hybrid_semantic_weight = hybridSemanticWeight;\n }\n if (options.limit !== undefined) filters.limit = options.limit;\n if (runtimeFieldFilters && Object.keys(runtimeFieldFilters).length > 0) {\n filters.runtime_filters = runtimeFieldFilters;\n }\n return filters;\n}\n\n/** Builds the complete filter echo shared by verbose search response paths. */\nexport function buildVerboseSearchFilters(params: {\n effectiveMode: SearchMode;\n matchMode: SearchMatchMode;\n options: SearchOptions;\n includeLinked: boolean;\n titleExact: boolean;\n phraseExact: boolean;\n scoreThreshold: number;\n hybridSemanticWeight: number;\n queryExpansion: SearchRenderingQueryExpansion;\n rerank: SearchRenderingRerank;\n runtimeFieldFilters: Record<string, unknown>;\n}): Record<string, unknown> {\n const { effectiveMode, matchMode, options, includeLinked, titleExact, phraseExact, scoreThreshold, hybridSemanticWeight, queryExpansion, rerank, runtimeFieldFilters } = params;\n const valueOrNull = (value: unknown): unknown => value ?? null;\n return {\n mode: effectiveMode,\n match_mode: matchMode,\n status: isAllStatuses(options.status) ? \"all\" : valueOrNull(options.status),\n type: valueOrNull(options.type),\n tag: valueOrNull(options.tag),\n priority: valueOrNull(options.priority),\n deadline_before: valueOrNull(options.deadlineBefore),\n deadline_after: valueOrNull(options.deadlineAfter),\n updated_after: valueOrNull(options.updatedAfter),\n updated_before: valueOrNull(options.updatedBefore),\n created_after: valueOrNull(options.createdAfter),\n created_before: valueOrNull(options.createdBefore),\n assignee: valueOrNull(options.assignee),\n sprint: valueOrNull(options.sprint),\n release: valueOrNull(options.release),\n parent: valueOrNull(options.parent),\n ...buildGovernanceMissingFilterEcho(options as Record<string, unknown>),\n ...buildContentFilterEcho(options as Record<string, unknown>),\n include_linked: includeLinked,\n title_exact: titleExact,\n phrase_exact: phraseExact,\n score_threshold: scoreThreshold,\n hybrid_semantic_weight: effectiveMode === \"hybrid\" ? hybridSemanticWeight : null,\n query_expansion_enabled: queryExpansion.enabled,\n query_expansion_provider: queryExpansion.provider,\n rerank_enabled: rerank.enabled,\n rerank_model: rerank.model,\n rerank_top_k: rerank.top_k,\n limit: valueOrNull(options.limit),\n runtime_filters: runtimeFieldFilters,\n };\n}\n"],"names":[],"mappings":"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","debugId":"4445c28d-0c05-583a-8b92-9dbe60e8b467"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../core/item/actionability.ts"],"sourcesContent":["/**\n * @module core/item/actionability\n *\n * Pure, dependency-aware actionability model shared by the `pm next` command and\n * the close-time auto-unblock sweep. It answers \"what is ready to work on now?\"\n * without any I/O: given a candidate set and the surrounding corpus it partitions\n * work into READY items (active, leaf, no open blockers) and BLOCKED items (active\n * leaf waiting on at least one open blocker). Keeping the logic here — rather than\n * inside a CLI command — makes it trivially testable and reusable, and gives the\n * `blocked_by` resolution a single source of truth.\n */\nimport { isTerminalStatus, normalizeStatusForRegistry } from \"./status.js\";\nimport type { RuntimeStatusRegistry } from \"../schema/runtime-schema.js\";\nimport type { ItemMetadata, ItemStatus } from \"../../types/index.js\";\n\n/** Dependency kind that marks \"this item is blocked by the referenced item\". */\nconst BLOCKED_BY_DEPENDENCY_KIND = \"blocked_by\";\n\n/**\n * Normalizes an item id / parent reference / blocker id to its canonical\n * comparison key (trimmed, lowercased). pm ids are canonically lowercase, but\n * resolving case-insensitively — as {@link collectSubtreeIds} does — keeps a\n * hand-edited mixed-case reference from being silently treated as missing.\n */\nfunction normalizeItemId(id: string): string {\n return id.trim().toLowerCase();\n}\n\n/** Collects the blocker item ids declared by an item: the legacy scalar `blocked_by` field plus every `blocked_by` dependency edge. Ids are trimmed, de-duplicated, and returned in stable lexicographic order. This is the single source of truth for \"what must close before this item can proceed\", shared by `pm next` readiness classification and the close-time auto-unblock sweep. */\nexport function collectBlockedByIds(\n item: Pick<ItemMetadata, \"blocked_by\" | \"dependencies\">,\n): string[] {\n const ids = new Set<string>();\n const scalar =\n typeof item.blocked_by === \"string\" ? item.blocked_by.trim() : \"\";\n if (scalar.length > 0) {\n ids.add(scalar);\n }\n for (const dependency of item.dependencies ?? []) {\n if (\n dependency.kind === BLOCKED_BY_DEPENDENCY_KIND &&\n typeof dependency.id === \"string\" &&\n dependency.id.trim().length > 0\n ) {\n ids.add(dependency.id.trim());\n }\n }\n return [...ids].sort((left, right) => left.localeCompare(right));\n}\n\n/** A blocker reference resolved against the corpus and annotated with its state. */\nexport interface ResolvedBlocker {\n /** Stable identifier used to reference this record across commands and storage. */\n id: string;\n /** Value that configures or reports title for this contract. */\n title: string | null;\n /** Lifecycle state reported for status. */\n status: ItemStatus | null;\n /** True when the blocker no longer gates work because the referenced item is terminal. */\n resolved: boolean;\n}\n\n/** Resolves an item's declared blockers against a corpus index, annotating each with the blocker's title/status and whether it still gates work. Unknown ids remain unresolved: silently treating a typo as satisfied would dispatch work whose prerequisite was never completed. Terminal referenced items alone are resolved. */\nexport function resolveItemBlockers(\n item: Pick<ItemMetadata, \"blocked_by\" | \"dependencies\">,\n itemsById: Map<string, ItemMetadata>,\n statusRegistry: RuntimeStatusRegistry,\n): ResolvedBlocker[] {\n return collectBlockedByIds(item).map((id) => {\n const blocker = itemsById.get(normalizeItemId(id));\n if (!blocker) {\n return { id, title: null, status: null, resolved: false };\n }\n return {\n id,\n title: blocker.title,\n status: blocker.status,\n resolved: isTerminalStatus(blocker.status, statusRegistry),\n };\n });\n}\n\n/** A classified actionable item plus the context an agent needs to act on it. */\nexport interface ActionableEntry {\n /** Value that configures or reports item for this contract. */\n item: ItemMetadata;\n /** Blockers that still gate the item (resolved blockers are filtered out). */\n open_blockers: ResolvedBlocker[];\n /** Ids of non-terminal items whose `blocked_by` points at this item. */\n unblocks: string[];\n}\n\n/** Result of partitioning a candidate set into ready vs blocked leaf work. */\nexport interface ActionabilityReport {\n /** Active leaves with no open blockers — ready to work on now. */\n ready: ActionableEntry[];\n /** Active leaves with at least one open blocker — waiting to become ready. */\n blocked: ActionableEntry[];\n /** Active candidates considered before the leaf/blocker split. */\n active_count: number;\n /** Active candidates skipped because they still have open descendants. */\n container_count: number;\n}\n\n/** Resolves the registry's active status set, falling back to just the canonical open status when a custom schema declares none — the same safety net `pm context` applies so the report never misclassifies every item as inactive. */\nfunction resolveActiveStatusSet(\n statusRegistry: RuntimeStatusRegistry,\n): Set<string> {\n /* c8 ignore start -- fallback applies only to custom schemas that intentionally define zero active statuses */\n return statusRegistry.active_statuses.size > 0\n ? statusRegistry.active_statuses\n : new Set<string>([statusRegistry.open_status]);\n /* c8 ignore stop */\n}\n\n/** Returns whether an item has any non-terminal descendant by walking the parent→children index depth-first, short-circuiting on the first one found. Such an item is a container (its real work lives in its children), so `pm next` skips it and recommends a leaf instead. Cycle-safe via a visited set. */\nfunction hasOpenDescendant(\n rootId: string,\n childrenByParent: Map<string, ItemMetadata[]>,\n statusRegistry: RuntimeStatusRegistry,\n): boolean {\n const stack = [normalizeItemId(rootId)];\n const visited = new Set<string>();\n while (stack.length > 0) {\n const current = stack.pop() as string;\n /* c8 ignore start -- defensive cycle-guard: unreachable for active roots (an open child returns before any node is revisited, and single-parent graphs cannot form a root-reachable cycle excluding the root), retained for safety */\n if (visited.has(current)) continue;\n /* c8 ignore stop */\n visited.add(current);\n for (const child of childrenByParent.get(current) ?? []) {\n if (!isTerminalStatus(child.status, statusRegistry)) {\n return true;\n }\n stack.push(normalizeItemId(child.id));\n }\n }\n return false;\n}\n\n/** Indexes the corpus into a by-id map, a parent→children map, and a reverse blocker map (blocker id → ids of items it blocks). Built once per report so blocker resolution, descendant counting, and downstream \"unblocks\" lookups share the same passes over the corpus. */\nfunction indexCorpus(corpus: ItemMetadata[]): {\n itemsById: Map<string, ItemMetadata>;\n childrenByParent: Map<string, ItemMetadata[]>;\n blockedByReverse: Map<string, string[]>;\n} {\n const itemsById = new Map<string, ItemMetadata>();\n const childrenByParent = new Map<string, ItemMetadata[]>();\n const blockedByReverse = new Map<string, string[]>();\n for (const item of corpus) {\n // Index keys are normalized (lowercased) for case-insensitive resolution;\n // stored values keep the item's original-case id for display.\n itemsById.set(normalizeItemId(item.id), item);\n const parent = typeof item.parent === \"string\" ? item.parent.trim() : \"\";\n if (parent.length > 0) {\n const parentKey = normalizeItemId(parent);\n const siblings = childrenByParent.get(parentKey) ?? [];\n siblings.push(item);\n childrenByParent.set(parentKey, siblings);\n }\n for (const blockerId of collectBlockedByIds(item)) {\n const blockerKey = normalizeItemId(blockerId);\n const dependents = blockedByReverse.get(blockerKey) ?? [];\n dependents.push(item.id);\n blockedByReverse.set(blockerKey, dependents);\n }\n }\n return { itemsById, childrenByParent, blockedByReverse };\n}\n\n/**\n * Partitions a candidate set into ready vs blocked leaf work using the corpus to\n * resolve blockers, descendants, and downstream dependents.\n *\n * An item qualifies when its status is active. Containers — items with at least\n * one non-terminal descendant — are excluded from both lists because the real\n * work is the leaf beneath them. A leaf with no open blockers is READY; a leaf\n * with one or more open blockers is BLOCKED, annotated with the unresolved\n * blockers and the non-terminal items it would unblock. Returned lists preserve\n * the candidate order so the caller can apply its own ranking.\n */\nexport function computeActionabilityReport(\n candidates: ItemMetadata[],\n corpus: ItemMetadata[],\n statusRegistry: RuntimeStatusRegistry,\n): ActionabilityReport {\n const { itemsById, childrenByParent, blockedByReverse } = indexCorpus(corpus);\n const activeStatuses = new Set([\n ...resolveActiveStatusSet(statusRegistry),\n ...statusRegistry.blocked_statuses,\n ]);\n // Ids of corpus items still in flight, used to keep only the non-terminal\n // dependents in each item's downstream \"unblocks\" list.\n const nonTerminalIds = new Set(\n corpus\n .filter((entry) => !isTerminalStatus(entry.status, statusRegistry))\n .map((entry) => normalizeItemId(entry.id)),\n );\n const ready: ActionableEntry[] = [];\n const blocked: ActionableEntry[] = [];\n let activeCount = 0;\n let containerCount = 0;\n for (const item of candidates) {\n if (\n !activeStatuses.has(\n normalizeStatusForRegistry(item.status, statusRegistry),\n )\n )\n continue;\n activeCount += 1;\n if (hasOpenDescendant(item.id, childrenByParent, statusRegistry)) {\n containerCount += 1;\n continue;\n }\n const openBlockers = resolveItemBlockers(\n item,\n itemsById,\n statusRegistry,\n ).filter((blocker) => !blocker.resolved);\n const unblocks = (blockedByReverse.get(normalizeItemId(item.id)) ?? [])\n .filter((dependentId) => nonTerminalIds.has(normalizeItemId(dependentId)))\n .sort((left, right) => left.localeCompare(right));\n const entry: ActionableEntry = {\n item,\n open_blockers: openBlockers,\n unblocks,\n };\n const lifecycleBlocked = statusRegistry.blocked_statuses.has(\n normalizeStatusForRegistry(item.status, statusRegistry),\n );\n if (openBlockers.length === 0 && !lifecycleBlocked) {\n ready.push(entry);\n } else {\n blocked.push(entry);\n }\n }\n return {\n ready,\n blocked,\n active_count: activeCount,\n container_count: containerCount,\n };\n}\n"],"names":[],"mappings":"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","debugId":"2fcf91f3-1b2e-5b80-a790-93055aee4f49"}
|