@unbrained/pm-cli 2026.7.16 → 2026.7.17
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 -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/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/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/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 +140 -133
- package/dist/cli/main.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 +341 -341
- 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-WT3ZEOGH.js → chunk-23TCGBRK.js} +16 -7
- package/dist/cli-bundle/chunks/{chunk-WT3ZEOGH.js.map → chunk-23TCGBRK.js.map} +1 -1
- 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-J6364LFM.js → chunk-2MPMKJF2.js} +9 -18
- package/dist/cli-bundle/chunks/{chunk-J6364LFM.js.map → chunk-2MPMKJF2.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-GM5QHQU6.js → chunk-2XOSFSTH.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-K3WII2ME.js → chunk-37DRDP2B.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-2WSE6PO2.js → chunk-37V5MXAU.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-UWQHLMEB.js → chunk-3D4YVTNG.js} +8 -8
- 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-ONG5V5CI.js → chunk-6XAZB6SE.js} +97 -69
- package/dist/cli-bundle/chunks/chunk-6XAZB6SE.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-PENXZX3U.js → chunk-74FKFFXO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-LPYWLWDS.js → chunk-7CTQ7WW5.js} +37 -37
- package/dist/cli-bundle/chunks/chunk-7CTQ7WW5.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-HO4KXD6I.js → chunk-7H5NNCJ5.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-XXXF6PAQ.js → chunk-7LTCLTRG.js} +69 -61
- package/dist/cli-bundle/chunks/chunk-7LTCLTRG.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-TQSZFPIS.js → chunk-AFGKSHAM.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-JXQUXVMI.js → chunk-AFSV5HBB.js} +77 -7
- package/dist/cli-bundle/chunks/{chunk-JXQUXVMI.js.map → chunk-AFSV5HBB.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-6N2VXVTQ.js → chunk-ARGDWQ4J.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-3U7ZR6M4.js → chunk-B57RJHBZ.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-7B67ZL4N.js → chunk-B6SH2YNN.js} +75 -5
- package/dist/cli-bundle/chunks/{chunk-7B67ZL4N.js.map → chunk-B6SH2YNN.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-YCQET3OT.js → chunk-BAP7G3N2.js} +2 -2
- 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-YBLZ2VE7.js → chunk-CFSUNEL7.js} +320 -239
- package/dist/cli-bundle/chunks/chunk-CFSUNEL7.js.map +7 -0
- 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-E2OJMKML.js → chunk-DCC2AQBD.js} +18 -9
- package/dist/cli-bundle/chunks/{chunk-E2OJMKML.js.map → chunk-DCC2AQBD.js.map} +1 -1
- 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-IG3SWA4A.js → chunk-EHJFUOXL.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-ONREO4ST.js → chunk-EY7ZE3TG.js} +3 -3
- 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-EACOH7AU.js → chunk-FZGM3PNA.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-FNSPG7MU.js → chunk-G6KM4YKY.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-AHVTB5I5.js → chunk-G6MYGULG.js} +4 -4
- 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-5ZSLZLDN.js → chunk-HF63SBLC.js} +585 -456
- package/dist/cli-bundle/chunks/chunk-HF63SBLC.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-SELVXEZK.js → chunk-HO4DLBNK.js} +2 -2
- 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-CRVF2JDM.js → chunk-HXVHBERL.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-NU3IMIEA.js → chunk-I7DIDUSP.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-2NCIPMQP.js → chunk-I7GY4X6Y.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-JYFOV7FC.js → chunk-IE5KRAKN.js} +4 -4
- 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-J6EY5V4N.js → chunk-KOEZCHRF.js} +9 -9
- 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-LSG2U345.js → chunk-L6FVNR7X.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-ILX33QXL.js → chunk-LLODAQMP.js} +706 -532
- package/dist/cli-bundle/chunks/chunk-LLODAQMP.js.map +7 -0
- 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-MNV226E4.js +834 -0
- package/dist/cli-bundle/chunks/chunk-MNV226E4.js.map +1 -0
- 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-BKVG6XOA.js → chunk-MSGETE6I.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-3WM75PWC.js → chunk-N33FD2UI.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-UFXU44HV.js → chunk-N7I2DGLP.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-3S5QVM5H.js → chunk-NCAFUBJX.js} +13 -13
- package/dist/cli-bundle/chunks/chunk-NCAFUBJX.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-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-NLDFBC6J.js → chunk-P56LKFQX.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NVPZIJVR.js → chunk-PT7MCCGD.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-P74IZQ7A.js → chunk-QKVVV6QO.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-5JLUII3O.js → chunk-QNUAZYGW.js} +321 -240
- package/dist/cli-bundle/chunks/chunk-QNUAZYGW.js.map +1 -0
- 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-HYB5AZ63.js → chunk-S46R2M3W.js} +117 -71
- package/dist/cli-bundle/chunks/chunk-S46R2M3W.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-H5APFTHZ.js → chunk-S6FF7VW6.js} +18 -18
- package/dist/cli-bundle/chunks/chunk-S6FF7VW6.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-UXONS674.js → chunk-SIJV365F.js} +54 -55
- package/dist/cli-bundle/chunks/chunk-SIJV365F.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-7Z4LKRS4.js → chunk-SPFZV2GR.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-ULTHRDBP.js → chunk-TM5CIO3F.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-4XQ3BDV4.js → chunk-V3VBXQQV.js} +36 -36
- package/dist/cli-bundle/chunks/chunk-V3VBXQQV.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-YAROI3PD.js → chunk-V7MP6YTN.js} +7 -7
- 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-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-J5AOEGDC.js → chunk-XNPMDSQQ.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-K2X6U4UA.js → chunk-XXLXJL7V.js} +4 -4
- package/dist/cli-bundle/chunks/chunk-XYJK6GIQ.js +851 -0
- package/dist/cli-bundle/chunks/chunk-XYJK6GIQ.js.map +7 -0
- 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-JFTKLTEF.js → chunk-YQCWK2MB.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-EYLCSJAI.js → chunk-YQEZWI3R.js} +2 -2
- package/dist/cli-bundle/chunks/close-BEP7MHF3.js +12 -0
- package/dist/cli-bundle/chunks/{close-CWODTPKG.js → close-Y6QFUJQN.js} +5 -5
- package/dist/cli-bundle/chunks/{close-many-CQFUY7MR.js → close-many-JJFW7KTT.js} +14 -14
- package/dist/cli-bundle/chunks/close-many-QJ6FKJUE.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-OA26IS25.js → deps-5NC4IZH7.js} +5 -5
- package/dist/cli-bundle/chunks/{deps-JZ7TMVCB.js → deps-EVTOQMKW.js} +5 -5
- 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-IVXQEL3D.js → profile-AGUKS52S.js} +9 -9
- package/dist/cli-bundle/chunks/{profile-FAU7NZML.js → profile-U2B6Y7GE.js} +9 -9
- package/dist/cli-bundle/chunks/{register-list-query-UL4UKBBN.js → register-list-query-A5KRJ5J2.js} +16 -16
- package/dist/cli-bundle/chunks/{register-list-query-DKA3EH5D.js → register-list-query-NEYP3TXO.js} +16 -16
- package/dist/cli-bundle/chunks/{register-mutation-RBBJ52DK.js → register-mutation-6LOPBAHC.js} +29 -29
- package/dist/cli-bundle/chunks/{register-mutation-ARFHRW55.js → register-mutation-GCZOALNJ.js} +29 -29
- package/dist/cli-bundle/chunks/{register-operations-ZIBBRSED.js → register-operations-6ZZIF27A.js} +35 -35
- package/dist/cli-bundle/chunks/{register-operations-ZUJ5JWPE.js → register-operations-REDIAEGI.js} +35 -35
- package/dist/cli-bundle/chunks/{register-setup-TDCGWIOS.js → register-setup-BHPMN5SK.js} +15 -15
- package/dist/cli-bundle/chunks/{register-setup-BCVLFEYS.js → register-setup-J3JS2ZVT.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-PQQHLYCC.js +21 -0
- package/dist/cli-bundle/chunks/{update-XHSIAIXE.js → update-SA6AG23P.js} +12 -12
- package/dist/cli-bundle/chunks/update-many-RQVTFJPD.js +36 -0
- package/dist/cli-bundle/chunks/update-many-TV3L3KBX.js +32 -0
- package/dist/cli-bundle/main.js +153 -855
- package/dist/cli-bundle/main.js.map +4 -4
- package/dist/cli-bundle/sdk-runtime.js +54 -54
- package/dist/cli-bundle/sdk-testing.js +6 -6
- package/dist/cli-bundle/sdk.js +195 -59
- package/dist/cli-bundle/sdk.js.map +3 -3
- package/dist/core/extensions/item-fields.js +2 -2
- package/dist/core/extensions/item-fields.js.map +1 -1
- 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/eval.d.ts +66 -0
- package/dist/sdk/eval.js +186 -0
- package/dist/sdk/eval.js.map +1 -0
- package/dist/sdk/index.d.ts +16 -4
- package/dist/sdk/index.js +18 -6
- 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 +254 -0
- package/dist/sdk/query/list.js +1073 -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/runtime.d.ts +7 -7
- package/dist/sdk/runtime.js +13 -7
- 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/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/SDK.md +122 -0
- 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-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-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-LPYWLWDS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-ONG5V5CI.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/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/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-2WSE6PO2.js.map → chunk-37V5MXAU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UWQHLMEB.js.map → chunk-3D4YVTNG.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-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-EACOH7AU.js.map → chunk-FZGM3PNA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FNSPG7MU.js.map → chunk-G6KM4YKY.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-3CLU2XZO.js.map → chunk-HSYV4ZYT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CRVF2JDM.js.map → chunk-HXVHBERL.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-2NCIPMQP.js.map → chunk-I7GY4X6Y.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-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-J6EY5V4N.js.map → chunk-KOEZCHRF.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-BKVG6XOA.js.map → chunk-MSGETE6I.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-UFXU44HV.js.map → chunk-N7I2DGLP.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-NLDFBC6J.js.map → chunk-P56LKFQX.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-P74IZQ7A.js.map → chunk-QKVVV6QO.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-7Z4LKRS4.js.map → chunk-SPFZV2GR.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-YAROI3PD.js.map → chunk-V7MP6YTN.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-J5AOEGDC.js.map → chunk-XNPMDSQQ.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-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-JFTKLTEF.js.map → chunk-YQCWK2MB.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-BEP7MHF3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-CWODTPKG.js.map → close-Y6QFUJQN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-CQFUY7MR.js.map → close-many-JJFW7KTT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-DLDDVSH5.js.map → close-many-QJ6FKJUE.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-OA26IS25.js.map → deps-5NC4IZH7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-JZ7TMVCB.js.map → deps-EVTOQMKW.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-IVXQEL3D.js.map → profile-AGUKS52S.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-FAU7NZML.js.map → profile-U2B6Y7GE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-UL4UKBBN.js.map → register-list-query-A5KRJ5J2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-DKA3EH5D.js.map → register-list-query-NEYP3TXO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-RBBJ52DK.js.map → register-mutation-6LOPBAHC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-ARFHRW55.js.map → register-mutation-GCZOALNJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-ZIBBRSED.js.map → register-operations-6ZZIF27A.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-operations-ZUJ5JWPE.js.map → register-operations-REDIAEGI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-setup-TDCGWIOS.js.map → register-setup-BHPMN5SK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-setup-BCVLFEYS.js.map → register-setup-J3JS2ZVT.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-WWBYOPXO.js.map → update-PQQHLYCC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-XHSIAIXE.js.map → update-SA6AG23P.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-TA7NGQBO.js.map → update-many-RQVTFJPD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-OUGIU5SF.js.map → update-many-TV3L3KBX.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
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module docs/examples/sdk-custom-tool
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates a complete domain-specific project tool built only from the
|
|
5
|
+
* public pm SDK, without CLI or private-core imports.
|
|
6
|
+
*/
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { PmClient } from "@unbrained/pm-cli/sdk";
|
|
9
|
+
|
|
10
|
+
/** Configuration for the SDK-only acceptance scenario. */
|
|
11
|
+
export interface UniversalToolScenarioOptions {
|
|
12
|
+
/** Workspace whose `.agents/pm` tracker the exemplar owns. */
|
|
13
|
+
workspace: string;
|
|
14
|
+
/** Stable mutation author recorded in every scenario history event. */
|
|
15
|
+
author: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Structured proof returned by the SDK-only acceptance scenario. */
|
|
19
|
+
export interface UniversalToolScenarioResult {
|
|
20
|
+
/** Registered domain item type. */
|
|
21
|
+
customType: "Deliverable";
|
|
22
|
+
/** Registered domain workflow status. */
|
|
23
|
+
customStatus: "reviewing";
|
|
24
|
+
/** Created parent deliverable id. */
|
|
25
|
+
projectId: string;
|
|
26
|
+
/** Created related child deliverable id. */
|
|
27
|
+
childId: string;
|
|
28
|
+
/** Final lifecycle state of the parent deliverable. */
|
|
29
|
+
projectStatus: string;
|
|
30
|
+
/** Author recorded by the public claim primitive. */
|
|
31
|
+
claimedBy: string;
|
|
32
|
+
/** Prior owner returned by the public release primitive. */
|
|
33
|
+
releasedPreviousAssignee: string | null;
|
|
34
|
+
/** Item ids returned by the typed list primitive. */
|
|
35
|
+
listedIds: string[];
|
|
36
|
+
/** Item ids returned by the typed search primitive. */
|
|
37
|
+
searchedIds: string[];
|
|
38
|
+
/** Active item count observed through bounded context before closeout. */
|
|
39
|
+
activeItemsBeforeClose: number;
|
|
40
|
+
/** Persisted comment count. */
|
|
41
|
+
commentCount: number;
|
|
42
|
+
/** Persisted private-note count. */
|
|
43
|
+
noteCount: number;
|
|
44
|
+
/** Persisted durable-learning count. */
|
|
45
|
+
learningCount: number;
|
|
46
|
+
/** Linked implementation-file count. */
|
|
47
|
+
linkedFileCount: number;
|
|
48
|
+
/** Linked documentation count. */
|
|
49
|
+
linkedDocCount: number;
|
|
50
|
+
/** Dependency edges returned by the graph projection. */
|
|
51
|
+
dependencyEdges: number;
|
|
52
|
+
/** Whether repository health remained clean. */
|
|
53
|
+
healthOk: boolean;
|
|
54
|
+
/** Whether the immutable history drift check passed. */
|
|
55
|
+
historyDriftOk: boolean;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Extract an id from a typed create result and fail with acceptance context. */
|
|
59
|
+
export const requireCreatedId = (
|
|
60
|
+
result: { item?: { id?: unknown } },
|
|
61
|
+
label: string,
|
|
62
|
+
): string => {
|
|
63
|
+
const id = result.item?.id;
|
|
64
|
+
if (typeof id !== "string" || id.length === 0) {
|
|
65
|
+
throw new Error(`SDK exemplar did not receive an id for ${label}.`);
|
|
66
|
+
}
|
|
67
|
+
return id;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/** Read a projected item id from compact, full, or scored search rows. */
|
|
71
|
+
export const readProjectedItemId = (value: unknown): string | undefined => {
|
|
72
|
+
if (typeof value !== "object" || value === null) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
if ("id" in value && typeof value.id === "string") {
|
|
76
|
+
return value.id;
|
|
77
|
+
}
|
|
78
|
+
if (
|
|
79
|
+
"item" in value &&
|
|
80
|
+
typeof value.item === "object" &&
|
|
81
|
+
value.item !== null &&
|
|
82
|
+
"id" in value.item &&
|
|
83
|
+
typeof value.item.id === "string"
|
|
84
|
+
) {
|
|
85
|
+
return value.item.id;
|
|
86
|
+
}
|
|
87
|
+
return undefined;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/** Require the final item projection to contain its lifecycle status. */
|
|
91
|
+
export const requireFinalStatus = (status: unknown): string => {
|
|
92
|
+
if (typeof status !== "string") {
|
|
93
|
+
throw new Error("SDK exemplar final project status is missing.");
|
|
94
|
+
}
|
|
95
|
+
return status;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Run a cross-domain SDK acceptance flow covering customization, lifecycle,
|
|
100
|
+
* context, annotations, linked resources, relationships, and governance.
|
|
101
|
+
*/
|
|
102
|
+
export async function runUniversalToolScenario(
|
|
103
|
+
options: UniversalToolScenarioOptions,
|
|
104
|
+
): Promise<UniversalToolScenarioResult> {
|
|
105
|
+
const pmRoot = path.join(options.workspace, ".agents", "pm");
|
|
106
|
+
const client = new PmClient({
|
|
107
|
+
pmRoot,
|
|
108
|
+
cwd: options.workspace,
|
|
109
|
+
author: options.author,
|
|
110
|
+
noExtensions: true,
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
await client.init("work", { defaults: true, agentGuidance: "skip" });
|
|
114
|
+
await client.schemaAddStatus("reviewing", {
|
|
115
|
+
role: ["active"],
|
|
116
|
+
description: "Deliverable is undergoing domain review.",
|
|
117
|
+
order: 25,
|
|
118
|
+
});
|
|
119
|
+
await client.schemaAddType("Deliverable", {
|
|
120
|
+
description: "A domain deliverable managed by the SDK-only custom tool.",
|
|
121
|
+
defaultStatus: "open",
|
|
122
|
+
folder: "deliverables",
|
|
123
|
+
alias: ["deliverable"],
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
const projectId = requireCreatedId(
|
|
127
|
+
await client.create({
|
|
128
|
+
type: "Deliverable",
|
|
129
|
+
title: "Universal launch",
|
|
130
|
+
description: "Coordinate the SDK-only universal-tool acceptance flow.",
|
|
131
|
+
status: "open",
|
|
132
|
+
createMode: "progressive",
|
|
133
|
+
}),
|
|
134
|
+
"parent deliverable",
|
|
135
|
+
);
|
|
136
|
+
const childId = requireCreatedId(
|
|
137
|
+
await client.create({
|
|
138
|
+
type: "Deliverable",
|
|
139
|
+
title: "Ship contextual primitive",
|
|
140
|
+
description: "Prove a related child can be governed without the pm CLI.",
|
|
141
|
+
status: "open",
|
|
142
|
+
parent: projectId,
|
|
143
|
+
dep: [`id=${projectId},kind=related`],
|
|
144
|
+
createMode: "progressive",
|
|
145
|
+
}),
|
|
146
|
+
"child deliverable",
|
|
147
|
+
);
|
|
148
|
+
const claimed = await client.claim(projectId);
|
|
149
|
+
const released = await client.release(projectId);
|
|
150
|
+
|
|
151
|
+
const comment = await client.comments(projectId, {
|
|
152
|
+
add: "Public execution evidence belongs with the governed work.",
|
|
153
|
+
});
|
|
154
|
+
const note = await client.notes(projectId, {
|
|
155
|
+
add: "Private implementation rationale stays available to future agents.",
|
|
156
|
+
});
|
|
157
|
+
const learning = await client.learnings(projectId, {
|
|
158
|
+
add: "A domain tool can compose pm primitives without shelling out.",
|
|
159
|
+
});
|
|
160
|
+
const linkedFile = await client.files(projectId, {
|
|
161
|
+
add: ["README.md"],
|
|
162
|
+
note: "Custom workspace implementation surface",
|
|
163
|
+
validatePaths: true,
|
|
164
|
+
});
|
|
165
|
+
const linkedDoc = await client.docs(projectId, {
|
|
166
|
+
add: ["README.md"],
|
|
167
|
+
note: "Custom workspace documentation surface",
|
|
168
|
+
validatePaths: true,
|
|
169
|
+
});
|
|
170
|
+
await client.update(projectId, {
|
|
171
|
+
status: "reviewing",
|
|
172
|
+
message: "Enter custom review workflow",
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
const listed = await client.list({ noTruncate: true });
|
|
176
|
+
const searched = await client.search("Universal launch", {
|
|
177
|
+
noTruncate: true,
|
|
178
|
+
});
|
|
179
|
+
const context = await client.context({ limit: "10" });
|
|
180
|
+
const dependencyGraph = await client.deps(childId, { format: "graph" });
|
|
181
|
+
|
|
182
|
+
const resolution = {
|
|
183
|
+
resolution: "completed",
|
|
184
|
+
expectedResult: "SDK-only domain workflow completes with durable context.",
|
|
185
|
+
actualResult: "Customization, lifecycle, graph, and governance primitives passed.",
|
|
186
|
+
};
|
|
187
|
+
await client.close(childId, "SDK-only child acceptance completed.", resolution);
|
|
188
|
+
await client.close(projectId, "SDK-only universal-tool acceptance completed.", resolution);
|
|
189
|
+
|
|
190
|
+
const finalProject = await client.get(projectId, { full: true });
|
|
191
|
+
const health = await client.health({ checkOnly: true });
|
|
192
|
+
const validation = await client.validate({
|
|
193
|
+
checkResolution: true,
|
|
194
|
+
checkHistoryDrift: true,
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
customType: "Deliverable",
|
|
199
|
+
customStatus: "reviewing",
|
|
200
|
+
projectId,
|
|
201
|
+
childId,
|
|
202
|
+
projectStatus: requireFinalStatus(finalProject.item.status),
|
|
203
|
+
claimedBy: claimed.claimed_by,
|
|
204
|
+
releasedPreviousAssignee: released.previous_assignee,
|
|
205
|
+
listedIds: listed.items
|
|
206
|
+
.map(readProjectedItemId)
|
|
207
|
+
.filter((id): id is string => id !== undefined),
|
|
208
|
+
searchedIds: searched.items
|
|
209
|
+
.map(readProjectedItemId)
|
|
210
|
+
.filter((id): id is string => id !== undefined),
|
|
211
|
+
activeItemsBeforeClose: context.summary.active_items,
|
|
212
|
+
commentCount: comment.count,
|
|
213
|
+
noteCount: note.count,
|
|
214
|
+
learningCount: learning.count,
|
|
215
|
+
linkedFileCount: linkedFile.count,
|
|
216
|
+
linkedDocCount: linkedDoc.count,
|
|
217
|
+
dependencyEdges: dependencyGraph.edge_count,
|
|
218
|
+
healthOk: health.ok,
|
|
219
|
+
historyDriftOk:
|
|
220
|
+
validation.checks.find((check) => check.name === "history_drift")
|
|
221
|
+
?.status === "ok",
|
|
222
|
+
};
|
|
223
|
+
}
|
package/marketplace.json
CHANGED
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
8
|
"description": "Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.",
|
|
9
|
-
"version": "2026.7.
|
|
9
|
+
"version": "2026.7.17"
|
|
10
10
|
},
|
|
11
11
|
"plugins": [
|
|
12
12
|
{
|
|
13
13
|
"name": "pm-claude",
|
|
14
14
|
"source": "./plugins/pm-claude",
|
|
15
15
|
"description": "Native pm CLI integration for Claude Code — 28 MCP tools, 5 workflow skills, 14 slash commands, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.",
|
|
16
|
-
"version": "2026.7.
|
|
16
|
+
"version": "2026.7.17",
|
|
17
17
|
"author": {
|
|
18
18
|
"name": "unbrained",
|
|
19
19
|
"url": "https://github.com/unbraind/pm-cli"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unbrained/pm-cli",
|
|
3
|
-
"version": "2026.7.
|
|
3
|
+
"version": "2026.7.17",
|
|
4
4
|
"description": "Git-native project management CLI for humans and agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@11.10.0",
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"lint:complexity:baseline": "eslint . --suppress-rule complexity --suppress-rule sonarjs/cognitive-complexity",
|
|
81
81
|
"lint:duplicates": "jscpd --config .jscpd.json",
|
|
82
82
|
"lint:codefactor": "pnpm quality:static",
|
|
83
|
-
"quality:static": "pnpm build &&
|
|
83
|
+
"quality:static": "pnpm build && pnpm exec tsx scripts/release/static-quality-gate.mts --max-eslint-suppressions 154 --max-coverage-ignore-pragmas 477 --min-docstring-coverage 100 --min-exported-docstring-coverage 100 --min-member-docstring-coverage 100 && node scripts/release/audit-package-boundary.mjs && node scripts/release/token-budget-gate.mjs",
|
|
84
84
|
"quality:token-budget": "node scripts/release/token-budget-gate.mjs",
|
|
85
85
|
"quality:context-eval": "node scripts/release/context-eval-gate.mjs",
|
|
86
86
|
"quality:docs-skills": "node scripts/release/docs-skills-gate.mjs",
|
|
@@ -151,12 +151,12 @@
|
|
|
151
151
|
"@codspeed/vitest-plugin": "^5.7.1",
|
|
152
152
|
"@eslint/js": "^10.0.1",
|
|
153
153
|
"@sentry/cli": "^3.6.0",
|
|
154
|
-
"@types/node": "^
|
|
154
|
+
"@types/node": "^26.1.1",
|
|
155
155
|
"@vitest/coverage-v8": "^4.1.9",
|
|
156
156
|
"esbuild": "0.28.1",
|
|
157
157
|
"eslint": "^10.6.0",
|
|
158
158
|
"eslint-plugin-sonarjs": "^4.1.0",
|
|
159
|
-
"eslint-plugin-unicorn": "^
|
|
159
|
+
"eslint-plugin-unicorn": "^71.1.0",
|
|
160
160
|
"greptile": "^3.1.1",
|
|
161
161
|
"jscpd": "^5.0.11",
|
|
162
162
|
"tsx": "^4.23.0",
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
type GlobalOptions,
|
|
16
16
|
type ItemMetadata,
|
|
17
17
|
type ItemStatus,
|
|
18
|
+
type ListedItem,
|
|
18
19
|
type RuntimeStatusRegistry,
|
|
19
20
|
} from "./sdk.ts";
|
|
20
21
|
|
|
@@ -171,10 +172,11 @@ export interface CommentsAuditHistoryRow {
|
|
|
171
172
|
text: string;
|
|
172
173
|
}
|
|
173
174
|
|
|
174
|
-
|
|
175
|
+
const parseStatus = (
|
|
175
176
|
raw: string | undefined,
|
|
176
177
|
statusRegistry: RuntimeStatusRegistry,
|
|
177
|
-
): ItemStatus | undefined {
|
|
178
|
+
): ItemStatus | undefined => {
|
|
179
|
+
/** Normalize one optional status filter against the active project schema. */
|
|
178
180
|
if (raw === undefined) {
|
|
179
181
|
return undefined;
|
|
180
182
|
}
|
|
@@ -186,12 +188,13 @@ function parseStatus(
|
|
|
186
188
|
);
|
|
187
189
|
}
|
|
188
190
|
return normalized;
|
|
189
|
-
}
|
|
191
|
+
};
|
|
190
192
|
|
|
191
|
-
|
|
193
|
+
const parseNonNegativeInteger = (
|
|
192
194
|
raw: string | undefined,
|
|
193
195
|
flag: string,
|
|
194
|
-
): number | undefined {
|
|
196
|
+
): number | undefined => {
|
|
197
|
+
/** Parse an optional count flag without accepting fractions or negative values. */
|
|
195
198
|
if (raw === undefined) {
|
|
196
199
|
return undefined;
|
|
197
200
|
}
|
|
@@ -203,16 +206,20 @@ function parseNonNegativeInteger(
|
|
|
203
206
|
);
|
|
204
207
|
}
|
|
205
208
|
return parsed;
|
|
206
|
-
}
|
|
209
|
+
};
|
|
207
210
|
|
|
208
|
-
|
|
211
|
+
const limitComments = (values: Comment[], latest: number): Comment[] => {
|
|
212
|
+
/** Retain only the requested trailing comments while preserving chronology. */
|
|
209
213
|
if (latest <= 0) {
|
|
210
214
|
return [];
|
|
211
215
|
}
|
|
212
216
|
return values.slice(Math.max(0, values.length - latest));
|
|
213
|
-
}
|
|
217
|
+
};
|
|
214
218
|
|
|
215
|
-
|
|
219
|
+
const toHistoryRows = (
|
|
220
|
+
items: CommentsAuditEntry[],
|
|
221
|
+
): CommentsAuditHistoryRow[] => {
|
|
222
|
+
/** Flatten per-item comments into stable export rows with item context. */
|
|
216
223
|
const rows: CommentsAuditHistoryRow[] = [];
|
|
217
224
|
for (const item of items) {
|
|
218
225
|
for (let index = 0; index < item.comments.length; index += 1) {
|
|
@@ -233,12 +240,13 @@ function toHistoryRows(items: CommentsAuditEntry[]): CommentsAuditHistoryRow[] {
|
|
|
233
240
|
}
|
|
234
241
|
}
|
|
235
242
|
return rows;
|
|
236
|
-
}
|
|
243
|
+
};
|
|
237
244
|
|
|
238
|
-
|
|
245
|
+
const ratioPercent = (
|
|
239
246
|
numerator: number,
|
|
240
247
|
denominator: number,
|
|
241
|
-
): { ratio: number; percent: number } {
|
|
248
|
+
): { ratio: number; percent: number } => {
|
|
249
|
+
/** Render a bounded ratio and percentage with deterministic precision. */
|
|
242
250
|
if (denominator <= 0) {
|
|
243
251
|
return {
|
|
244
252
|
ratio: 0,
|
|
@@ -250,11 +258,12 @@ function ratioPercent(
|
|
|
250
258
|
ratio: Number(ratio.toFixed(4)),
|
|
251
259
|
percent: Number((ratio * 100).toFixed(2)),
|
|
252
260
|
};
|
|
253
|
-
}
|
|
261
|
+
};
|
|
254
262
|
|
|
255
|
-
|
|
263
|
+
const buildCommentsAuditSummary = (
|
|
256
264
|
items: CommentsAuditEntry[],
|
|
257
|
-
): CommentsAuditSummary {
|
|
265
|
+
): CommentsAuditSummary => {
|
|
266
|
+
/** Aggregate comment coverage globally and by project item type. */
|
|
258
267
|
const itemsScanned = items.length;
|
|
259
268
|
const itemsWithComments = items.filter(
|
|
260
269
|
(entry) => entry.comment_count > 0,
|
|
@@ -326,16 +335,19 @@ function buildCommentsAuditSummary(
|
|
|
326
335
|
},
|
|
327
336
|
by_type: byType,
|
|
328
337
|
};
|
|
329
|
-
}
|
|
338
|
+
};
|
|
330
339
|
|
|
331
|
-
|
|
340
|
+
const resolveCommentsAuditLimits = (
|
|
341
|
+
options: CommentsAuditOptions,
|
|
342
|
+
): {
|
|
332
343
|
fullHistory: boolean;
|
|
333
344
|
latest: number | undefined;
|
|
334
345
|
limitItems: number | undefined;
|
|
335
|
-
} {
|
|
346
|
+
} => {
|
|
347
|
+
/** Reconcile history and item-limit aliases into one validated selection. */
|
|
336
348
|
const fullHistory = options.fullHistory === true;
|
|
337
349
|
const latestParsed = parseNonNegativeInteger(options.latest, "--latest");
|
|
338
|
-
if (fullHistory
|
|
350
|
+
if ([fullHistory, latestParsed !== undefined].every(Boolean)) {
|
|
339
351
|
throw new PmCliError(
|
|
340
352
|
"--full-history cannot be combined with --latest",
|
|
341
353
|
EXIT_CODE.USAGE,
|
|
@@ -346,27 +358,31 @@ function resolveCommentsAuditLimits(options: CommentsAuditOptions): {
|
|
|
346
358
|
"--limit-items",
|
|
347
359
|
);
|
|
348
360
|
const limitItemsAlias = parseNonNegativeInteger(options.limit, "--limit");
|
|
349
|
-
|
|
350
|
-
limitItemsPrimary
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
)
|
|
361
|
+
const distinctItemLimits = new Set(
|
|
362
|
+
[limitItemsPrimary, limitItemsAlias].filter(
|
|
363
|
+
(value): value is number => value !== undefined,
|
|
364
|
+
),
|
|
365
|
+
);
|
|
366
|
+
if (distinctItemLimits.size > 1) {
|
|
354
367
|
throw new PmCliError(
|
|
355
368
|
"--limit and --limit-items must match when both are provided",
|
|
356
369
|
EXIT_CODE.USAGE,
|
|
357
370
|
);
|
|
358
371
|
}
|
|
372
|
+
let latest: number | undefined = latestParsed ?? 1;
|
|
373
|
+
if (fullHistory) latest = undefined;
|
|
359
374
|
return {
|
|
360
375
|
fullHistory,
|
|
361
|
-
latest
|
|
362
|
-
limitItems:
|
|
376
|
+
latest,
|
|
377
|
+
limitItems: distinctItemLimits.values().next().value,
|
|
363
378
|
};
|
|
364
|
-
}
|
|
379
|
+
};
|
|
365
380
|
|
|
366
|
-
|
|
367
|
-
item:
|
|
381
|
+
const toCommentsAuditEntry = (
|
|
382
|
+
item: ListedItem,
|
|
368
383
|
latest: number | undefined,
|
|
369
|
-
): CommentsAuditEntry {
|
|
384
|
+
): CommentsAuditEntry => {
|
|
385
|
+
/** Project one complete list record into the bounded comments-audit shape. */
|
|
370
386
|
const comments = item.comments ?? [];
|
|
371
387
|
return {
|
|
372
388
|
id: item.id,
|
|
@@ -378,36 +394,39 @@ function toCommentsAuditEntry(
|
|
|
378
394
|
comment_count: comments.length,
|
|
379
395
|
comments: latest === undefined ? comments : limitComments(comments, latest),
|
|
380
396
|
};
|
|
381
|
-
}
|
|
397
|
+
};
|
|
382
398
|
|
|
383
|
-
|
|
399
|
+
const buildCommentsAuditFilters = (
|
|
384
400
|
options: CommentsAuditOptions,
|
|
385
401
|
status: ItemStatus | undefined,
|
|
386
402
|
limitItems: number | undefined,
|
|
387
403
|
latest: number | undefined,
|
|
388
404
|
fullHistory: boolean,
|
|
389
|
-
): CommentsAuditResult["filters"] {
|
|
405
|
+
): CommentsAuditResult["filters"] => {
|
|
406
|
+
/** Preserve active audit filters in a stable nullable response envelope. */
|
|
407
|
+
const toNullable = <Value>(value: Value | undefined): Value | null =>
|
|
408
|
+
value === undefined ? null : value;
|
|
390
409
|
return {
|
|
391
|
-
status: status
|
|
392
|
-
type: options.type
|
|
393
|
-
tag: options.tag
|
|
410
|
+
status: toNullable(status),
|
|
411
|
+
type: toNullable(options.type),
|
|
412
|
+
tag: toNullable(options.tag),
|
|
394
413
|
priority: options.priority === undefined ? null : Number(options.priority),
|
|
395
|
-
parent: options.parent
|
|
396
|
-
sprint: options.sprint
|
|
397
|
-
release: options.release
|
|
398
|
-
assignee: options.assignee
|
|
399
|
-
assignee_filter: options.assigneeFilter
|
|
400
|
-
limit_items: limitItems
|
|
401
|
-
latest: latest
|
|
414
|
+
parent: toNullable(options.parent),
|
|
415
|
+
sprint: toNullable(options.sprint),
|
|
416
|
+
release: toNullable(options.release),
|
|
417
|
+
assignee: toNullable(options.assignee),
|
|
418
|
+
assignee_filter: toNullable(options.assigneeFilter),
|
|
419
|
+
limit_items: toNullable(limitItems),
|
|
420
|
+
latest: toNullable(latest),
|
|
402
421
|
full_history: fullHistory,
|
|
403
422
|
};
|
|
404
|
-
}
|
|
423
|
+
};
|
|
405
424
|
|
|
406
425
|
/** Implements run comments audit for the public runtime surface of this module. */
|
|
407
|
-
export async
|
|
426
|
+
export const runCommentsAudit = async (
|
|
408
427
|
options: CommentsAuditOptions,
|
|
409
428
|
global: GlobalOptions,
|
|
410
|
-
): Promise<CommentsAuditResult> {
|
|
429
|
+
): Promise<CommentsAuditResult> => {
|
|
411
430
|
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
412
431
|
const settings = await readSettings(pmRoot);
|
|
413
432
|
const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);
|
|
@@ -427,18 +446,17 @@ export async function runCommentsAudit(
|
|
|
427
446
|
assignee: options.assignee,
|
|
428
447
|
assigneeFilter: options.assigneeFilter,
|
|
429
448
|
limit: limitItems === undefined ? undefined : String(limitItems),
|
|
449
|
+
full: true as const,
|
|
430
450
|
},
|
|
431
451
|
global,
|
|
432
452
|
);
|
|
433
453
|
|
|
434
454
|
const items = listed.items.map((item) => toCommentsAuditEntry(item, latest));
|
|
435
|
-
const rows = fullHistory ? toHistoryRows(items) : undefined;
|
|
436
455
|
const latestRowCount = items.reduce(
|
|
437
456
|
(sum, entry) => sum + entry.comments.length,
|
|
438
457
|
0,
|
|
439
458
|
);
|
|
440
|
-
|
|
441
|
-
return {
|
|
459
|
+
const result: CommentsAuditResult = {
|
|
442
460
|
items,
|
|
443
461
|
count: items.length,
|
|
444
462
|
summary: buildCommentsAuditSummary(items),
|
|
@@ -450,14 +468,16 @@ export async function runCommentsAudit(
|
|
|
450
468
|
fullHistory,
|
|
451
469
|
),
|
|
452
470
|
export: {
|
|
453
|
-
mode:
|
|
454
|
-
|
|
455
|
-
row_count: fullHistory ? (rows?.length ?? 0) : latestRowCount,
|
|
471
|
+
mode: "latest",
|
|
472
|
+
row_count: latestRowCount,
|
|
456
473
|
},
|
|
457
|
-
...(rows ? { rows } : {}),
|
|
458
474
|
now: listed.now ?? nowIso(),
|
|
459
|
-
...(listed.warnings && listed.warnings.length > 0
|
|
460
|
-
? { warnings: listed.warnings }
|
|
461
|
-
: {}),
|
|
462
475
|
};
|
|
463
|
-
|
|
476
|
+
if (fullHistory) {
|
|
477
|
+
const rows = toHistoryRows(items);
|
|
478
|
+
result.rows = rows;
|
|
479
|
+
result.export = { mode: "full_history", row_count: rows.length };
|
|
480
|
+
}
|
|
481
|
+
if (listed.warnings?.length) result.warnings = listed.warnings;
|
|
482
|
+
return result;
|
|
483
|
+
};
|