@unbrained/pm-cli 2026.6.30 → 2026.7.2
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/AGENTS.md +2 -0
- package/CHANGELOG.md +26 -0
- package/dist/cli/bootstrap-args.js +89 -79
- package/dist/cli/bootstrap-args.js.map +1 -1
- package/dist/cli/commander-usage.d.ts +2 -0
- package/dist/cli/commander-usage.js +58 -47
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/aggregate.js +102 -79
- package/dist/cli/commands/aggregate.js.map +1 -1
- package/dist/cli/commands/calendar.js +339 -303
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/close-many.js +89 -68
- package/dist/cli/commands/close-many.js.map +1 -1
- package/dist/cli/commands/close.js +157 -129
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/comments-audit.js +50 -42
- package/dist/cli/commands/comments-audit.js.map +1 -1
- package/dist/cli/commands/config.d.ts +2 -0
- package/dist/cli/commands/config.js +443 -879
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/context.js +365 -287
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/contracts.js +352 -238
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.js +483 -434
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/dedupe-audit.js +46 -39
- package/dist/cli/commands/dedupe-audit.js.map +1 -1
- package/dist/cli/commands/dedupe-merge.js +88 -69
- package/dist/cli/commands/dedupe-merge.js.map +1 -1
- package/dist/cli/commands/extension/bundled-catalog.js +59 -46
- package/dist/cli/commands/extension/bundled-catalog.js.map +1 -1
- package/dist/cli/commands/extension/doctor.js +129 -78
- package/dist/cli/commands/extension/doctor.js.map +1 -1
- package/dist/cli/commands/extension/managed-state.js +101 -57
- package/dist/cli/commands/extension/managed-state.js.map +1 -1
- package/dist/cli/commands/extension/scaffold.d.ts +7 -0
- package/dist/cli/commands/extension/scaffold.js +214 -186
- package/dist/cli/commands/extension/scaffold.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +6 -1
- package/dist/cli/commands/extension.js +1034 -902
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/get.js +114 -81
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/health.d.ts +17 -0
- package/dist/cli/commands/health.js +446 -307
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history-compact.js +209 -140
- package/dist/cli/commands/history-compact.js.map +1 -1
- package/dist/cli/commands/history-redact.js +162 -119
- package/dist/cli/commands/history-redact.js.map +1 -1
- package/dist/cli/commands/history-repair.js +120 -85
- package/dist/cli/commands/history-repair.js.map +1 -1
- package/dist/cli/commands/init.d.ts +8 -2
- package/dist/cli/commands/init.js +263 -162
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/list-filter-shared.js +55 -48
- package/dist/cli/commands/list-filter-shared.js.map +1 -1
- package/dist/cli/commands/list.js +152 -102
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/next.js +49 -32
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/plan.js +373 -298
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/recurrence-parsers.js +43 -25
- package/dist/cli/commands/recurrence-parsers.js.map +1 -1
- package/dist/cli/commands/reindex.d.ts +21 -5
- package/dist/cli/commands/reindex.js +345 -205
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/restore.d.ts +8 -7
- package/dist/cli/commands/restore.js +105 -69
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/schema.js +33 -30
- package/dist/cli/commands/schema.js.map +1 -1
- package/dist/cli/commands/search.d.ts +10 -2
- package/dist/cli/commands/search.js +595 -536
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/telemetry.js +98 -87
- package/dist/cli/commands/telemetry.js.map +1 -1
- package/dist/cli/commands/test-all.js +237 -168
- package/dist/cli/commands/test-all.js.map +1 -1
- package/dist/cli/commands/test.d.ts +6 -5
- package/dist/cli/commands/test.js +530 -464
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.js +57 -42
- package/dist/cli/commands/update-many.js.map +1 -1
- package/dist/cli/commands/update.d.ts +1 -1
- package/dist/cli/commands/update.js +764 -747
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +18 -1
- package/dist/cli/commands/validate.js +466 -343
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/error-guidance.js +399 -357
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-options.js +48 -21
- package/dist/cli/extension-command-options.js.map +1 -1
- package/dist/cli/main.d.ts +47 -0
- package/dist/cli/main.js +428 -341
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/migration-gates.js +22 -45
- package/dist/cli/migration-gates.js.map +1 -1
- package/dist/cli/register-list-query.js +94 -105
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.js +400 -416
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.js +86 -66
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +120 -101
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.js +117 -122
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli-bundle/chunks/{activity-MVSEND6D.js → activity-CUC4JY3U.js} +9 -9
- package/dist/cli-bundle/chunks/activity-WEIEMM73.js +16 -0
- package/dist/cli-bundle/chunks/{aggregate-MOC4TR2G.js → aggregate-DKUTRY6R.js} +109 -85
- package/dist/cli-bundle/chunks/aggregate-DKUTRY6R.js.map +1 -0
- package/dist/cli-bundle/chunks/{aggregate-XJHLZQ5X.js → aggregate-SW5PNGCS.js} +108 -84
- package/dist/cli-bundle/chunks/{aggregate-XJHLZQ5X.js.map → aggregate-SW5PNGCS.js.map} +2 -2
- package/dist/cli-bundle/chunks/{append-KDHT4GHI.js → append-H32VOR2Y.js} +6 -6
- package/dist/cli-bundle/chunks/{append-LEDBAM3K.js → append-UBM632FK.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-Z55WX4IQ.js → chunk-2227673O.js} +158 -114
- package/dist/cli-bundle/chunks/chunk-2227673O.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-SJZTPVFT.js → chunk-2ASNV4DH.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-JVQ7UOYC.js → chunk-2CHRYUXL.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-QE5UFCCO.js → chunk-2KWL5NPW.js} +42 -27
- package/dist/cli-bundle/chunks/chunk-2KWL5NPW.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ZEATCVAC.js → chunk-36UGKF4O.js} +21 -29
- package/dist/cli-bundle/chunks/chunk-36UGKF4O.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-JZG5ADVE.js → chunk-3AZUFQK6.js} +1103 -963
- package/dist/cli-bundle/chunks/chunk-3AZUFQK6.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-DRPF274X.js → chunk-3LCUASYG.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-JJ4SG243.js → chunk-3Q2HBMTI.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-4BU75MF4.js +87 -0
- package/dist/cli-bundle/chunks/chunk-4BU75MF4.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-GF7EAR22.js → chunk-4NUOWFBT.js} +109 -72
- package/dist/cli-bundle/chunks/chunk-4NUOWFBT.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-TQ6E76BE.js → chunk-55XRYWEG.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-5IRVSKPS.js → chunk-5GVTFFTC.js} +150 -224
- package/dist/cli-bundle/chunks/chunk-5GVTFFTC.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-CHRNYKNI.js → chunk-5PGBHRY3.js} +41 -26
- package/dist/cli-bundle/chunks/chunk-5PGBHRY3.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-53ARXF2O.js → chunk-66Z3X7ZG.js} +261 -161
- package/dist/cli-bundle/chunks/chunk-66Z3X7ZG.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-A3UNLXNJ.js → chunk-6ITZLD4T.js} +738 -688
- package/dist/cli-bundle/chunks/chunk-6ITZLD4T.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-JTRKME24.js → chunk-6YCYF2AI.js} +262 -162
- package/dist/cli-bundle/chunks/chunk-6YCYF2AI.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-RM6MHL6A.js → chunk-6ZMBJRDJ.js} +580 -467
- package/dist/cli-bundle/chunks/chunk-6ZMBJRDJ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-RPRW26NG.js → chunk-7MYWF4ZX.js} +110 -73
- package/dist/cli-bundle/chunks/chunk-7MYWF4ZX.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-SNUK7H5J.js → chunk-7NSPKJUS.js} +716 -606
- package/dist/cli-bundle/chunks/chunk-7NSPKJUS.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-KYDYQMNW.js → chunk-7TH5NMVB.js} +95 -53
- package/dist/cli-bundle/chunks/chunk-7TH5NMVB.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-VD3LKZFX.js → chunk-7W4H4K26.js} +739 -689
- package/dist/cli-bundle/chunks/chunk-7W4H4K26.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-IBU2LLWM.js → chunk-A6VOGKBA.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-MLHX6DN5.js → chunk-AIAIXG7I.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NIBP3I7A.js → chunk-AJEBCRIY.js} +128 -126
- package/dist/cli-bundle/chunks/chunk-AJEBCRIY.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js → chunk-B4O5S7I3.js} +79 -57
- package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js.map → chunk-B4O5S7I3.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-5ABGFWR4.js → chunk-BTX5MIQF.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-BVZZN2LH.js +809 -0
- package/dist/cli-bundle/chunks/chunk-BVZZN2LH.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-3JWQCLR5.js → chunk-CYBDUHNO.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-WFJZDUM7.js → chunk-CZPVDLD2.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-FDEVKXC4.js → chunk-EMPGXBUF.js} +22 -30
- package/dist/cli-bundle/chunks/chunk-EMPGXBUF.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-HUYYMTGW.js → chunk-EUKTMRN3.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-EVWYAG46.js → chunk-FFOQHGNH.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-IF4ERU6A.js → chunk-GFMSLORL.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-IZQOJR2B.js → chunk-GRRG3MCT.js} +198 -189
- package/dist/cli-bundle/chunks/chunk-GRRG3MCT.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-IDYCAK35.js → chunk-H4GRLYJS.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-VMY7MZEM.js → chunk-HQTPRV4D.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-CY5IJMUM.js → chunk-I66WE2HE.js} +712 -602
- package/dist/cli-bundle/chunks/chunk-I66WE2HE.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ZFIEEDTJ.js → chunk-IEEJQCZ4.js} +509 -363
- package/dist/cli-bundle/chunks/chunk-IEEJQCZ4.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-DU66JUGT.js → chunk-IG5JYZGU.js} +488 -420
- package/dist/cli-bundle/chunks/chunk-IG5JYZGU.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-7L6TXOOC.js → chunk-JMK5GCK2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-LBH7UYKY.js → chunk-JXAUVO6X.js} +258 -169
- package/dist/cli-bundle/chunks/{chunk-LBH7UYKY.js.map → chunk-JXAUVO6X.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KRASIL6M.js → chunk-K2VYLVX4.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-4YIMPANT.js → chunk-KCO2EAN5.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-T7ZMQI4J.js → chunk-KIYCOJ63.js} +198 -189
- package/dist/cli-bundle/chunks/chunk-KIYCOJ63.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-D6USKAMA.js → chunk-KLXF7NCC.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-V3KLX7U7.js → chunk-KN3URLKS.js} +510 -364
- package/dist/cli-bundle/chunks/chunk-KN3URLKS.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-OB3RJV5F.js → chunk-LRKMWUUV.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-74PUWBGN.js → chunk-LTRAF2D7.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-5T6WPLRO.js → chunk-MNBPX5JS.js} +394 -354
- package/dist/cli-bundle/chunks/chunk-MNBPX5JS.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-4TXTVZL3.js → chunk-MRD4T5LF.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-E2Q2ULMR.js → chunk-N2JSWVWG.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-7WDETKGP.js → chunk-N3QCJS4M.js} +1105 -965
- package/dist/cli-bundle/chunks/chunk-N3QCJS4M.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-KGQ3W65B.js → chunk-NRZS637N.js} +258 -169
- package/dist/cli-bundle/chunks/chunk-NRZS637N.js.map +1 -0
- package/dist/cli-bundle/chunks/chunk-OTUJZKGI.js +799 -0
- package/dist/cli-bundle/chunks/chunk-OTUJZKGI.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ZIE6WXJ2.js → chunk-Q6K2OACU.js} +153 -90
- package/dist/cli-bundle/chunks/chunk-Q6K2OACU.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-K46GQ265.js → chunk-Q6NXOHS6.js} +489 -421
- package/dist/cli-bundle/chunks/chunk-Q6NXOHS6.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-7RIJGN4R.js → chunk-QH3FSKRJ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-UB3V5WUI.js → chunk-RM37OPYK.js} +394 -354
- package/dist/cli-bundle/chunks/chunk-RM37OPYK.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-OUQ5JEFM.js → chunk-S62UANU7.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-NO6Y6FB2.js → chunk-SPM2XLWI.js} +37 -28
- package/dist/cli-bundle/chunks/chunk-SPM2XLWI.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-DORJSBGJ.js → chunk-SYNKD3ZG.js} +127 -125
- package/dist/cli-bundle/chunks/chunk-SYNKD3ZG.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-6YRAMXRS.js → chunk-SYVUU7EK.js} +581 -468
- package/dist/cli-bundle/chunks/chunk-SYVUU7EK.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-D5LYZVGB.js → chunk-TPOFWBMY.js} +95 -53
- package/dist/cli-bundle/chunks/chunk-TPOFWBMY.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-IHXXUIXS.js → chunk-TTHCEV5Q.js} +92 -77
- package/dist/cli-bundle/chunks/chunk-TTHCEV5Q.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-DLDCPF5X.js → chunk-U2BEEM2X.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-Z5BM2FKQ.js → chunk-UGLU6Q2I.js} +91 -76
- package/dist/cli-bundle/chunks/chunk-UGLU6Q2I.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-73PTKMAE.js → chunk-UT73HUPC.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-F7G53BOA.js → chunk-UTSH5GWX.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-AWN4PPH5.js → chunk-UWKEJMZU.js} +157 -113
- package/dist/cli-bundle/chunks/chunk-UWKEJMZU.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js +84 -0
- package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KTMMTOIP.js → chunk-W47SML5B.js} +152 -89
- package/dist/cli-bundle/chunks/chunk-W47SML5B.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-UFKNF23C.js → chunk-WJAMWAHZ.js} +157 -118
- package/dist/cli-bundle/chunks/chunk-WJAMWAHZ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-HIBK6H4S.js → chunk-XCHUVHKU.js} +685 -544
- package/dist/cli-bundle/chunks/chunk-XCHUVHKU.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-DJDXAU74.js → chunk-XEWQKDYZ.js} +685 -544
- package/dist/cli-bundle/chunks/chunk-XEWQKDYZ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-BOWQWXLI.js → chunk-XTHQWXVC.js} +158 -119
- package/dist/cli-bundle/chunks/chunk-XTHQWXVC.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-6T5ZIWBS.js → chunk-XWGEMNBR.js} +150 -224
- package/dist/cli-bundle/chunks/chunk-XWGEMNBR.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-JIP67N2K.js → chunk-Y4NRKBFW.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-WTRUDJ3R.js → chunk-YLZZ6T54.js} +38 -29
- package/dist/cli-bundle/chunks/chunk-YLZZ6T54.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-FBZ5XAAF.js → chunk-YPKFV2JR.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js → chunk-Z4DGFQDH.js} +80 -58
- package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js.map → chunk-Z4DGFQDH.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-BN3CWK6G.js → chunk-ZNHEYCDD.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-YEDFE4DC.js → chunk-ZNT7KEWE.js} +2 -2
- package/dist/cli-bundle/chunks/{claim-HMCLSLUE.js → claim-SENTPZBN.js} +8 -8
- package/dist/cli-bundle/chunks/{claim-6NINZYB3.js → claim-Z7MEQCBT.js} +8 -8
- package/dist/cli-bundle/chunks/{close-OP3LK7Z2.js → close-424MX4CU.js} +7 -7
- package/dist/cli-bundle/chunks/close-YCWQQPDS.js +14 -0
- package/dist/cli-bundle/chunks/{close-many-CXJBOWWY.js → close-many-2IV4J2TR.js} +103 -82
- package/dist/cli-bundle/chunks/close-many-2IV4J2TR.js.map +1 -0
- package/dist/cli-bundle/chunks/{close-many-BFMP6HHK.js → close-many-SWY34BII.js} +102 -81
- package/dist/cli-bundle/chunks/close-many-SWY34BII.js.map +7 -0
- package/dist/cli-bundle/chunks/{comments-ETHABIY6.js → comments-4FGNTSNV.js} +8 -8
- package/dist/cli-bundle/chunks/{comments-MU2WMBUY.js → comments-7YS5MY5X.js} +8 -8
- package/dist/cli-bundle/chunks/config-BZJKK7FZ.js +1062 -0
- package/dist/cli-bundle/chunks/config-BZJKK7FZ.js.map +1 -0
- package/dist/cli-bundle/chunks/config-G74GISC4.js +1072 -0
- package/dist/cli-bundle/chunks/config-G74GISC4.js.map +7 -0
- package/dist/cli-bundle/chunks/{context-7ZEZV3BV.js → context-LHVKJSPJ.js} +12 -12
- package/dist/cli-bundle/chunks/{context-XDI4DKKT.js → context-ZQY54JNS.js} +12 -12
- package/dist/cli-bundle/chunks/{contracts-SMOAN5NF.js → contracts-CP2EZJC7.js} +320 -199
- package/dist/cli-bundle/chunks/contracts-CP2EZJC7.js.map +7 -0
- package/dist/cli-bundle/chunks/{contracts-KP4QAGVW.js → contracts-FIZLMP7O.js} +321 -200
- package/dist/cli-bundle/chunks/contracts-FIZLMP7O.js.map +1 -0
- package/dist/cli-bundle/chunks/{copy-JJ3KOQW2.js → copy-GYNQQPW2.js} +5 -5
- package/dist/cli-bundle/chunks/{copy-CWM6SBY6.js → copy-TLW7JTQT.js} +5 -5
- package/dist/cli-bundle/chunks/{create-J5Q2ELZT.js → create-VSKYSOCD.js} +12 -12
- package/dist/cli-bundle/chunks/create-XTMAPS7I.js +28 -0
- package/dist/cli-bundle/chunks/{delete-2GZLQEUQ.js → delete-4W5JYCEG.js} +5 -5
- package/dist/cli-bundle/chunks/{delete-OOQS4KVD.js → delete-ANTOTI2I.js} +5 -5
- package/dist/cli-bundle/chunks/{deps-IF4IGL4R.js → deps-HPPE6MJN.js} +5 -5
- package/dist/cli-bundle/chunks/{deps-ZVGGCRR6.js → deps-ZQZN54EZ.js} +5 -5
- package/dist/cli-bundle/chunks/{docs-NFTBCQQC.js → docs-RPOVFMP3.js} +7 -7
- package/dist/cli-bundle/chunks/{docs-2TIFR62T.js → docs-XJNYBJGE.js} +7 -7
- package/dist/cli-bundle/chunks/{eval-2F6EH4XN.js → eval-DM6JBZTS.js} +10 -10
- package/dist/cli-bundle/chunks/{eval-PFKXQR3B.js → eval-RFBI5FGS.js} +10 -10
- package/dist/cli-bundle/chunks/{extension-GMVOIP4O.js → extension-B3YY4WY5.js} +11 -10
- package/dist/cli-bundle/chunks/{extension-3LRYX7SW.js → extension-TTSEFQTS.js} +11 -10
- package/dist/cli-bundle/chunks/{files-DF3HO6XK.js → files-5D65CHGE.js} +7 -7
- package/dist/cli-bundle/chunks/{files-T5ODMETM.js → files-GPIG77EN.js} +7 -7
- package/dist/cli-bundle/chunks/{focus-MY5ARIEK.js → focus-C3PEJV2C.js} +6 -6
- package/dist/cli-bundle/chunks/{focus-DLXKK4AH.js → focus-ZHN7WIGX.js} +6 -6
- package/dist/cli-bundle/chunks/{gc-MDGRR2SU.js → gc-D4JQ6OWN.js} +3 -3
- package/dist/cli-bundle/chunks/{gc-FULIVYR4.js → gc-VZIXDL32.js} +3 -3
- package/dist/cli-bundle/chunks/{get-VYPIICPC.js → get-GIBRUUOP.js} +121 -81
- package/dist/cli-bundle/chunks/get-GIBRUUOP.js.map +1 -0
- package/dist/cli-bundle/chunks/{get-AWK324RS.js → get-IOVAN6RU.js} +120 -80
- package/dist/cli-bundle/chunks/get-IOVAN6RU.js.map +7 -0
- package/dist/cli-bundle/chunks/{health-Q66C43GN.js → health-L2U3AFKV.js} +437 -264
- package/dist/cli-bundle/chunks/health-L2U3AFKV.js.map +1 -0
- package/dist/cli-bundle/chunks/{health-FBCVZGSX.js → health-MM7AWXYF.js} +436 -263
- package/dist/cli-bundle/chunks/health-MM7AWXYF.js.map +7 -0
- package/dist/cli-bundle/chunks/history-DD7L7BNL.js +18 -0
- package/dist/cli-bundle/chunks/{history-X4OSES6K.js → history-IL7XCEX2.js} +8 -8
- package/dist/cli-bundle/chunks/{history-compact-2GHT32UX.js → history-compact-HALOTOU7.js} +214 -135
- package/dist/cli-bundle/chunks/history-compact-HALOTOU7.js.map +1 -0
- package/dist/cli-bundle/chunks/{history-compact-WLCQEKXS.js → history-compact-MV25P7DM.js} +213 -134
- package/dist/cli-bundle/chunks/history-compact-MV25P7DM.js.map +7 -0
- package/dist/cli-bundle/chunks/history-redact-IX4YEWMY.js +19 -0
- package/dist/cli-bundle/chunks/{history-redact-45YW65BK.js → history-redact-VYCWQFK7.js} +9 -9
- package/dist/cli-bundle/chunks/{history-repair-FY75IC26.js → history-repair-44MODPQF.js} +124 -84
- package/dist/cli-bundle/chunks/history-repair-44MODPQF.js.map +1 -0
- package/dist/cli-bundle/chunks/{history-repair-GABSDSVD.js → history-repair-CPNAOCNF.js} +123 -83
- package/dist/cli-bundle/chunks/history-repair-CPNAOCNF.js.map +7 -0
- package/dist/cli-bundle/chunks/{init-KO7CGIRQ.js → init-F27NHENZ.js} +12 -11
- package/dist/cli-bundle/chunks/init-HHVQQP6C.js +22 -0
- package/dist/cli-bundle/chunks/{learnings-LHZT5BHW.js → learnings-HJVDQIGY.js} +8 -8
- package/dist/cli-bundle/chunks/{learnings-3F7YLI45.js → learnings-XSFSUUWK.js} +8 -8
- package/dist/cli-bundle/chunks/{list-Y6AU5BJS.js → list-HPMEKCAA.js} +8 -8
- package/dist/cli-bundle/chunks/{list-ROT7JF62.js → list-VMPWTURB.js} +8 -8
- package/dist/cli-bundle/chunks/{next-66BJB4N2.js → next-ETXF2ZCN.js} +59 -37
- package/dist/cli-bundle/chunks/next-ETXF2ZCN.js.map +7 -0
- package/dist/cli-bundle/chunks/{next-N5MWJTBY.js → next-QM6YJIIS.js} +60 -38
- package/dist/cli-bundle/chunks/next-QM6YJIIS.js.map +1 -0
- package/dist/cli-bundle/chunks/{notes-FW6YFLND.js → notes-GDZIKGR6.js} +8 -8
- package/dist/cli-bundle/chunks/{notes-EVJZ3VAB.js → notes-WDDBPC4D.js} +8 -8
- package/dist/cli-bundle/chunks/{plan-ZHKZ7JVF.js → plan-BGDR73Z6.js} +373 -279
- package/dist/cli-bundle/chunks/plan-BGDR73Z6.js.map +1 -0
- package/dist/cli-bundle/chunks/{plan-DQ7G4EDC.js → plan-C5IMM335.js} +372 -278
- package/dist/cli-bundle/chunks/plan-C5IMM335.js.map +7 -0
- package/dist/cli-bundle/chunks/{profile-CHAW6SEA.js → profile-CCOKZ2IQ.js} +9 -9
- package/dist/cli-bundle/chunks/{profile-UPZGCDOG.js → profile-HUCENIEQ.js} +9 -9
- package/dist/cli-bundle/chunks/{register-list-query-Y2VRHPCL.js → register-list-query-ROSNIL52.js} +80 -83
- package/dist/cli-bundle/chunks/register-list-query-ROSNIL52.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-list-query-KY6Z6WV7.js → register-list-query-XN4ZRHSV.js} +79 -82
- package/dist/cli-bundle/chunks/register-list-query-XN4ZRHSV.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-mutation-PCARIGZS.js → register-mutation-CFSB2MS3.js} +406 -385
- package/dist/cli-bundle/chunks/register-mutation-CFSB2MS3.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-mutation-N6AYSKPM.js → register-mutation-KRLAHEL2.js} +405 -384
- package/dist/cli-bundle/chunks/register-mutation-KRLAHEL2.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-operations-L6CYTOIH.js → register-operations-4PASGJDB.js} +112 -93
- package/dist/cli-bundle/chunks/register-operations-4PASGJDB.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-operations-YAT6FUUB.js → register-operations-MBN4KGUM.js} +113 -94
- package/dist/cli-bundle/chunks/register-operations-MBN4KGUM.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-setup-N7UGXYJC.js → register-setup-VIAWYFP5.js} +129 -104
- package/dist/cli-bundle/chunks/register-setup-VIAWYFP5.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-setup-MPANILQF.js → register-setup-ZCGKHDKL.js} +128 -103
- package/dist/cli-bundle/chunks/register-setup-ZCGKHDKL.js.map +7 -0
- package/dist/cli-bundle/chunks/{restore-DKMCLPI5.js → restore-4CBWUMCX.js} +9 -9
- package/dist/cli-bundle/chunks/restore-5UEAGG3W.js +17 -0
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-3F4QUEDH.js → scheduling-shortcuts-6VFKNKCM.js} +12 -12
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-BNZLQK36.js → scheduling-shortcuts-ERHCVTEM.js} +12 -12
- package/dist/cli-bundle/chunks/{schema-OLT6LVKH.js → schema-TDGK6N3I.js} +7 -7
- package/dist/cli-bundle/chunks/{schema-XJXKJQF5.js → schema-UE5KKAUX.js} +7 -7
- package/dist/cli-bundle/chunks/{search-KP6H7COV.js → search-FP7MEU4S.js} +10 -10
- package/dist/cli-bundle/chunks/{search-CX5UMV4H.js → search-K4CFLQ5S.js} +10 -10
- package/dist/cli-bundle/chunks/{stats-QZUG6MX5.js → stats-NJJCALEZ.js} +6 -6
- package/dist/cli-bundle/chunks/{stats-7XW4OEMK.js → stats-XT6QRKQY.js} +6 -6
- package/dist/cli-bundle/chunks/{telemetry-DIFPXCAT.js → telemetry-5SQ5UDXC.js} +84 -70
- package/dist/cli-bundle/chunks/telemetry-5SQ5UDXC.js.map +7 -0
- package/dist/cli-bundle/chunks/{telemetry-WTYFUPRL.js → telemetry-HVXFZA2U.js} +85 -71
- package/dist/cli-bundle/chunks/telemetry-HVXFZA2U.js.map +1 -0
- package/dist/cli-bundle/chunks/{test-QNDXZQCW.js → test-UFSJ5YIO.js} +15 -14
- package/dist/cli-bundle/chunks/{test-HU2BS7EY.js → test-YCDAUBWF.js} +15 -14
- package/dist/cli-bundle/chunks/test-all-2BWKY3GQ.js +427 -0
- package/dist/cli-bundle/chunks/test-all-2BWKY3GQ.js.map +1 -0
- package/dist/cli-bundle/chunks/test-all-PM7UYN42.js +430 -0
- package/dist/cli-bundle/chunks/test-all-PM7UYN42.js.map +7 -0
- package/dist/cli-bundle/chunks/{test-runs-CA6K32RD.js → test-runs-FK5E75AA.js} +185 -147
- package/dist/cli-bundle/chunks/test-runs-FK5E75AA.js.map +1 -0
- package/dist/cli-bundle/chunks/{test-runs-LANLLPVO.js → test-runs-H4TGWGRN.js} +184 -146
- package/dist/cli-bundle/chunks/test-runs-H4TGWGRN.js.map +7 -0
- package/dist/cli-bundle/chunks/update-MTCFES6X.js +24 -0
- package/dist/cli-bundle/chunks/{update-DJKWLBWJ.js → update-Y5WQVT5O.js} +15 -15
- package/dist/cli-bundle/chunks/{update-many-LU3SCNK5.js → update-many-6YAYYRLE.js} +83 -68
- package/dist/cli-bundle/chunks/{update-many-LU3SCNK5.js.map → update-many-6YAYYRLE.js.map} +2 -2
- package/dist/cli-bundle/chunks/{update-many-VW5DGF3S.js → update-many-JTKKSA7Y.js} +84 -69
- package/dist/cli-bundle/chunks/{update-many-VW5DGF3S.js.map → update-many-JTKKSA7Y.js.map} +1 -1
- package/dist/cli-bundle/chunks/{upgrade-ICXY244R.js → upgrade-DTAHZ236.js} +11 -10
- package/dist/cli-bundle/chunks/{upgrade-ICXY244R.js.map → upgrade-DTAHZ236.js.map} +1 -1
- package/dist/cli-bundle/chunks/{upgrade-77FRUAXN.js → upgrade-JUDU7YL4.js} +13 -12
- package/dist/cli-bundle/chunks/{upgrade-77FRUAXN.js.map → upgrade-JUDU7YL4.js.map} +1 -1
- package/dist/cli-bundle/chunks/{validate-2G566PKQ.js → validate-732RWS5W.js} +440 -319
- package/dist/cli-bundle/chunks/validate-732RWS5W.js.map +7 -0
- package/dist/cli-bundle/chunks/{validate-BDPVXHHH.js → validate-W7H5TEDC.js} +441 -320
- package/dist/cli-bundle/chunks/validate-W7H5TEDC.js.map +1 -0
- package/dist/cli-bundle/main.js +986 -1500
- package/dist/cli-bundle/main.js.map +4 -4
- package/dist/core/config/nested-settings.js +89 -67
- package/dist/core/config/nested-settings.js.map +1 -1
- package/dist/core/extensions/activation-summary-markdown.js +23 -12
- package/dist/core/extensions/activation-summary-markdown.js.map +1 -1
- package/dist/core/extensions/extension-policy.d.ts +18 -3
- package/dist/core/extensions/extension-policy.js +116 -106
- package/dist/core/extensions/extension-policy.js.map +1 -1
- package/dist/core/extensions/loader.js +310 -232
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/governance/metadata-coverage.js +20 -28
- package/dist/core/governance/metadata-coverage.js.map +1 -1
- package/dist/core/history/drift-scan.js +93 -81
- package/dist/core/history/drift-scan.js.map +1 -1
- package/dist/core/item/item-format.js +523 -410
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/item-type-definition.js +14 -14
- package/dist/core/item/item-type-definition.js.map +1 -1
- package/dist/core/item/type-registry.js +87 -82
- package/dist/core/item/type-registry.js.map +1 -1
- package/dist/core/output/mutation-projection.js +42 -26
- package/dist/core/output/mutation-projection.js.map +1 -1
- package/dist/core/schema/runtime-schema.js +34 -28
- package/dist/core/schema/runtime-schema.js.map +1 -1
- package/dist/core/search/semantic-defaults.js +64 -37
- package/dist/core/search/semantic-defaults.js.map +1 -1
- package/dist/core/search/vector-stores.js +32 -17
- package/dist/core/search/vector-stores.js.map +1 -1
- package/dist/core/sentry/helpers.js +31 -28
- package/dist/core/sentry/helpers.js.map +1 -1
- package/dist/core/sentry/instrument.js +54 -43
- package/dist/core/sentry/instrument.js.map +1 -1
- package/dist/core/store/front-matter-cache.js +239 -153
- package/dist/core/store/front-matter-cache.js.map +1 -1
- package/dist/core/store/item-store.js +33 -26
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/settings.js +247 -203
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/test/background-runs.js +189 -160
- package/dist/core/test/background-runs.js.map +1 -1
- package/dist/mcp/server.js +387 -367
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts/flag-contracts.js +111 -180
- package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-schema.js +76 -45
- package/dist/sdk/cli-contracts/tool-schema.js.map +1 -1
- package/dist/sdk/compose.d.ts +4 -1
- package/dist/sdk/compose.js +181 -115
- package/dist/sdk/compose.js.map +1 -1
- package/docs/RELEASING.md +2 -3
- package/package.json +2 -2
- package/packages/pm-beads/extensions/beads/runtime.ts +240 -167
- package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +65 -58
- package/packages/pm-todos/extensions/todos/runtime.ts +65 -42
- package/dist/cli-bundle/chunks/activity-EJBMXUBH.js +0 -16
- package/dist/cli-bundle/chunks/aggregate-MOC4TR2G.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-53ARXF2O.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-5IRVSKPS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-5T6WPLRO.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-6T5ZIWBS.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-6YRAMXRS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-7WDETKGP.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-A3UNLXNJ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-AWN4PPH5.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-BOWQWXLI.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-C2KCIZKZ.js +0 -115
- package/dist/cli-bundle/chunks/chunk-C2KCIZKZ.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-CHRNYKNI.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-CY5IJMUM.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-D5LYZVGB.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-DJDXAU74.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-DORJSBGJ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-DU66JUGT.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-F6VH3LFC.js +0 -118
- package/dist/cli-bundle/chunks/chunk-F6VH3LFC.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-FDEVKXC4.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-GF7EAR22.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-HIBK6H4S.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-IHXXUIXS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-ISEKN64V.js +0 -35
- package/dist/cli-bundle/chunks/chunk-ISEKN64V.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-IZQOJR2B.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-JTRKME24.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-JZG5ADVE.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-K46GQ265.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-KGQ3W65B.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-KTMMTOIP.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-KYDYQMNW.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-NIBP3I7A.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-NO6Y6FB2.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-QE5UFCCO.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-RM6MHL6A.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-RPRW26NG.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-SNUK7H5J.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-T7ZMQI4J.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-UB3V5WUI.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-UFKNF23C.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-V3KLX7U7.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-VD3LKZFX.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js +0 -32
- package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-WTRUDJ3R.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-Z55WX4IQ.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-Z5BM2FKQ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ZEATCVAC.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ZFIEEDTJ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ZIE6WXJ2.js.map +0 -1
- package/dist/cli-bundle/chunks/close-37KEHLYM.js +0 -14
- package/dist/cli-bundle/chunks/close-many-BFMP6HHK.js.map +0 -7
- package/dist/cli-bundle/chunks/close-many-CXJBOWWY.js.map +0 -1
- package/dist/cli-bundle/chunks/config-FIXJZEQK.js +0 -1541
- package/dist/cli-bundle/chunks/config-FIXJZEQK.js.map +0 -7
- package/dist/cli-bundle/chunks/config-X3ZVCUUG.js +0 -1531
- package/dist/cli-bundle/chunks/config-X3ZVCUUG.js.map +0 -1
- package/dist/cli-bundle/chunks/contracts-KP4QAGVW.js.map +0 -1
- package/dist/cli-bundle/chunks/contracts-SMOAN5NF.js.map +0 -7
- package/dist/cli-bundle/chunks/create-DFMNBKBS.js +0 -28
- package/dist/cli-bundle/chunks/get-AWK324RS.js.map +0 -7
- package/dist/cli-bundle/chunks/get-VYPIICPC.js.map +0 -1
- package/dist/cli-bundle/chunks/health-FBCVZGSX.js.map +0 -7
- package/dist/cli-bundle/chunks/health-Q66C43GN.js.map +0 -1
- package/dist/cli-bundle/chunks/history-5XUSLAJA.js +0 -18
- package/dist/cli-bundle/chunks/history-compact-2GHT32UX.js.map +0 -1
- package/dist/cli-bundle/chunks/history-compact-WLCQEKXS.js.map +0 -7
- package/dist/cli-bundle/chunks/history-redact-BVHWDXPR.js +0 -19
- package/dist/cli-bundle/chunks/history-repair-FY75IC26.js.map +0 -1
- package/dist/cli-bundle/chunks/history-repair-GABSDSVD.js.map +0 -7
- package/dist/cli-bundle/chunks/init-TRYJELH4.js +0 -21
- package/dist/cli-bundle/chunks/next-66BJB4N2.js.map +0 -7
- package/dist/cli-bundle/chunks/next-N5MWJTBY.js.map +0 -1
- package/dist/cli-bundle/chunks/plan-DQ7G4EDC.js.map +0 -7
- package/dist/cli-bundle/chunks/plan-ZHKZ7JVF.js.map +0 -1
- package/dist/cli-bundle/chunks/register-list-query-KY6Z6WV7.js.map +0 -7
- package/dist/cli-bundle/chunks/register-list-query-Y2VRHPCL.js.map +0 -1
- package/dist/cli-bundle/chunks/register-mutation-N6AYSKPM.js.map +0 -7
- package/dist/cli-bundle/chunks/register-mutation-PCARIGZS.js.map +0 -1
- package/dist/cli-bundle/chunks/register-operations-L6CYTOIH.js.map +0 -7
- package/dist/cli-bundle/chunks/register-operations-YAT6FUUB.js.map +0 -1
- package/dist/cli-bundle/chunks/register-setup-MPANILQF.js.map +0 -7
- package/dist/cli-bundle/chunks/register-setup-N7UGXYJC.js.map +0 -1
- package/dist/cli-bundle/chunks/restore-IRAKSWIW.js +0 -17
- package/dist/cli-bundle/chunks/telemetry-DIFPXCAT.js.map +0 -7
- package/dist/cli-bundle/chunks/telemetry-WTYFUPRL.js.map +0 -1
- package/dist/cli-bundle/chunks/test-all-PZTBLLQ6.js +0 -360
- package/dist/cli-bundle/chunks/test-all-PZTBLLQ6.js.map +0 -7
- package/dist/cli-bundle/chunks/test-all-XLPI4USF.js +0 -357
- package/dist/cli-bundle/chunks/test-all-XLPI4USF.js.map +0 -1
- package/dist/cli-bundle/chunks/test-runs-CA6K32RD.js.map +0 -1
- package/dist/cli-bundle/chunks/test-runs-LANLLPVO.js.map +0 -7
- package/dist/cli-bundle/chunks/update-UXDLTEOZ.js +0 -24
- package/dist/cli-bundle/chunks/validate-2G566PKQ.js.map +0 -7
- package/dist/cli-bundle/chunks/validate-BDPVXHHH.js.map +0 -1
- /package/dist/cli-bundle/chunks/{activity-MVSEND6D.js.map → activity-CUC4JY3U.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{activity-EJBMXUBH.js.map → activity-WEIEMM73.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-KDHT4GHI.js.map → append-H32VOR2Y.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-LEDBAM3K.js.map → append-UBM632FK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SJZTPVFT.js.map → chunk-2ASNV4DH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JVQ7UOYC.js.map → chunk-2CHRYUXL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DRPF274X.js.map → chunk-3LCUASYG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JJ4SG243.js.map → chunk-3Q2HBMTI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TQ6E76BE.js.map → chunk-55XRYWEG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IBU2LLWM.js.map → chunk-A6VOGKBA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-MLHX6DN5.js.map → chunk-AIAIXG7I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5ABGFWR4.js.map → chunk-BTX5MIQF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3JWQCLR5.js.map → chunk-CYBDUHNO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WFJZDUM7.js.map → chunk-CZPVDLD2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HUYYMTGW.js.map → chunk-EUKTMRN3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EVWYAG46.js.map → chunk-FFOQHGNH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IF4ERU6A.js.map → chunk-GFMSLORL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IDYCAK35.js.map → chunk-H4GRLYJS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VMY7MZEM.js.map → chunk-HQTPRV4D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7L6TXOOC.js.map → chunk-JMK5GCK2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KRASIL6M.js.map → chunk-K2VYLVX4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4YIMPANT.js.map → chunk-KCO2EAN5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-D6USKAMA.js.map → chunk-KLXF7NCC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OB3RJV5F.js.map → chunk-LRKMWUUV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-74PUWBGN.js.map → chunk-LTRAF2D7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4TXTVZL3.js.map → chunk-MRD4T5LF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-E2Q2ULMR.js.map → chunk-N2JSWVWG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7RIJGN4R.js.map → chunk-QH3FSKRJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OUQ5JEFM.js.map → chunk-S62UANU7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DLDCPF5X.js.map → chunk-U2BEEM2X.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-73PTKMAE.js.map → chunk-UT73HUPC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-F7G53BOA.js.map → chunk-UTSH5GWX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JIP67N2K.js.map → chunk-Y4NRKBFW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FBZ5XAAF.js.map → chunk-YPKFV2JR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BN3CWK6G.js.map → chunk-ZNHEYCDD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YEDFE4DC.js.map → chunk-ZNT7KEWE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-HMCLSLUE.js.map → claim-SENTPZBN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-6NINZYB3.js.map → claim-Z7MEQCBT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-OP3LK7Z2.js.map → close-424MX4CU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-37KEHLYM.js.map → close-YCWQQPDS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-ETHABIY6.js.map → comments-4FGNTSNV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-MU2WMBUY.js.map → comments-7YS5MY5X.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-7ZEZV3BV.js.map → context-LHVKJSPJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-XDI4DKKT.js.map → context-ZQY54JNS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-JJ3KOQW2.js.map → copy-GYNQQPW2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-CWM6SBY6.js.map → copy-TLW7JTQT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-J5Q2ELZT.js.map → create-VSKYSOCD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-DFMNBKBS.js.map → create-XTMAPS7I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-2GZLQEUQ.js.map → delete-4W5JYCEG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-OOQS4KVD.js.map → delete-ANTOTI2I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-IF4IGL4R.js.map → deps-HPPE6MJN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-ZVGGCRR6.js.map → deps-ZQZN54EZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-NFTBCQQC.js.map → docs-RPOVFMP3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-2TIFR62T.js.map → docs-XJNYBJGE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-2F6EH4XN.js.map → eval-DM6JBZTS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-PFKXQR3B.js.map → eval-RFBI5FGS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-GMVOIP4O.js.map → extension-B3YY4WY5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-3LRYX7SW.js.map → extension-TTSEFQTS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-DF3HO6XK.js.map → files-5D65CHGE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-T5ODMETM.js.map → files-GPIG77EN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-MY5ARIEK.js.map → focus-C3PEJV2C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-DLXKK4AH.js.map → focus-ZHN7WIGX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-MDGRR2SU.js.map → gc-D4JQ6OWN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-FULIVYR4.js.map → gc-VZIXDL32.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-5XUSLAJA.js.map → history-DD7L7BNL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-X4OSES6K.js.map → history-IL7XCEX2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-BVHWDXPR.js.map → history-redact-IX4YEWMY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-45YW65BK.js.map → history-redact-VYCWQFK7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-KO7CGIRQ.js.map → init-F27NHENZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-TRYJELH4.js.map → init-HHVQQP6C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-LHZT5BHW.js.map → learnings-HJVDQIGY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-3F7YLI45.js.map → learnings-XSFSUUWK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-Y6AU5BJS.js.map → list-HPMEKCAA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-ROT7JF62.js.map → list-VMPWTURB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-FW6YFLND.js.map → notes-GDZIKGR6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-EVJZ3VAB.js.map → notes-WDDBPC4D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-CHAW6SEA.js.map → profile-CCOKZ2IQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-UPZGCDOG.js.map → profile-HUCENIEQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-DKMCLPI5.js.map → restore-4CBWUMCX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-IRAKSWIW.js.map → restore-5UEAGG3W.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-3F4QUEDH.js.map → scheduling-shortcuts-6VFKNKCM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-BNZLQK36.js.map → scheduling-shortcuts-ERHCVTEM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-OLT6LVKH.js.map → schema-TDGK6N3I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-XJXKJQF5.js.map → schema-UE5KKAUX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-KP6H7COV.js.map → search-FP7MEU4S.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-CX5UMV4H.js.map → search-K4CFLQ5S.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-QZUG6MX5.js.map → stats-NJJCALEZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-7XW4OEMK.js.map → stats-XT6QRKQY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-QNDXZQCW.js.map → test-UFSJ5YIO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-HU2BS7EY.js.map → test-YCDAUBWF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-UXDLTEOZ.js.map → update-MTCFES6X.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-DJKWLBWJ.js.map → update-Y5WQVT5O.js.map} +0 -0
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Implements the pm test command surface and its agent-facing runtime behavior.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
7
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="caa941ed-c848-506c-9a3c-3d4959be0246")}catch(e){}}();
|
|
8
8
|
import { spawn } from "node:child_process";
|
|
9
9
|
import { cp, mkdir, mkdtemp, readdir, rm } from "node:fs/promises";
|
|
10
10
|
import { tmpdir } from "node:os";
|
|
@@ -276,25 +276,24 @@ function extractPmInvocationArgsFromSegment(segment) {
|
|
|
276
276
|
if (executable === "node" && args.length > 0 && isPmCliScriptToken(args[0])) {
|
|
277
277
|
return args.slice(1);
|
|
278
278
|
}
|
|
279
|
+
return extractPackageManagerPmInvocationArgs(executable, args);
|
|
280
|
+
}
|
|
281
|
+
function extractPackageManagerPmInvocationArgs(executable, args) {
|
|
282
|
+
const parsed = parsePackageManagerPmInvocation(executable, args);
|
|
283
|
+
if (!parsed || (!isPmExecutableToken(parsed.command) && !isPmCliPackageToken(parsed.command))) {
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
return parsed.args;
|
|
287
|
+
}
|
|
288
|
+
function parsePackageManagerPmInvocation(executable, args) {
|
|
279
289
|
if (executable === "npx" || executable === "bunx") {
|
|
280
|
-
|
|
281
|
-
/* c8 ignore start -- npx launcher edge permutations are covered by command-parser integration suites */
|
|
282
|
-
if (parsed && (isPmExecutableToken(parsed.command) || isPmCliPackageToken(parsed.command))) {
|
|
283
|
-
return parsed.args;
|
|
284
|
-
}
|
|
285
|
-
/* c8 ignore stop */
|
|
290
|
+
return parseNpxCommand(args);
|
|
286
291
|
}
|
|
287
292
|
if (executable === "pnpm") {
|
|
288
|
-
|
|
289
|
-
if (parsed && (isPmExecutableToken(parsed.command) || isPmCliPackageToken(parsed.command))) {
|
|
290
|
-
return parsed.args;
|
|
291
|
-
}
|
|
293
|
+
return parsePnpmDlxCommand(args);
|
|
292
294
|
}
|
|
293
295
|
if (executable === "npm") {
|
|
294
|
-
|
|
295
|
-
if (parsed && (isPmExecutableToken(parsed.command) || isPmCliPackageToken(parsed.command))) {
|
|
296
|
-
return parsed.args;
|
|
297
|
-
}
|
|
296
|
+
return parseNpmExecCommand(args);
|
|
298
297
|
}
|
|
299
298
|
return null;
|
|
300
299
|
}
|
|
@@ -452,30 +451,23 @@ function segmentInvokesUnsafeDirectTestRunner(normalizedSegment) {
|
|
|
452
451
|
return true;
|
|
453
452
|
}
|
|
454
453
|
if (executable === "node") {
|
|
455
|
-
return (args
|
|
456
|
-
args.some((arg) => arg === "vitest" || arg === "vitest.mjs" || arg.endsWith("/vitest") || arg.endsWith("/vitest.mjs")));
|
|
454
|
+
return nodeArgsInvokeUnsafeDirectTestRunner(args);
|
|
457
455
|
}
|
|
456
|
+
return packageManagerInvokesUnsafeDirectTestRunner(executable, args);
|
|
457
|
+
}
|
|
458
|
+
function nodeArgsInvokeUnsafeDirectTestRunner(args) {
|
|
459
|
+
return (args.includes("--test") ||
|
|
460
|
+
args.some((arg) => arg === "vitest" || arg === "vitest.mjs" || arg.endsWith("/vitest") || arg.endsWith("/vitest.mjs")));
|
|
461
|
+
}
|
|
462
|
+
function packageManagerInvokesUnsafeDirectTestRunner(executable, args) {
|
|
458
463
|
if (executable === "npx" || executable === "bunx") {
|
|
459
464
|
return isDirectTestRunnerSubcommand(parseNpxCommand(args)?.command);
|
|
460
465
|
}
|
|
461
|
-
if (executable === "pnpm") {
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
return true;
|
|
465
|
-
}
|
|
466
|
-
return firstDirectTestRunnerSubcommand(executable, args) === "vitest";
|
|
467
|
-
}
|
|
468
|
-
if (executable === "npm") {
|
|
469
|
-
const exec = parseNpmExecCommand(args);
|
|
470
|
-
if (isDirectTestRunnerSubcommand(exec?.command)) {
|
|
471
|
-
return true;
|
|
472
|
-
}
|
|
473
|
-
return firstDirectTestRunnerSubcommand(executable, args) === "vitest";
|
|
474
|
-
}
|
|
475
|
-
if (executable === "yarn" || executable === "bun") {
|
|
476
|
-
return firstDirectTestRunnerSubcommand(executable, args) === "vitest";
|
|
466
|
+
if (executable === "pnpm" || executable === "npm") {
|
|
467
|
+
return (isDirectTestRunnerSubcommand(parsePackageManagerPmInvocation(executable, args)?.command) ||
|
|
468
|
+
firstDirectTestRunnerSubcommand(executable, args) === "vitest");
|
|
477
469
|
}
|
|
478
|
-
return
|
|
470
|
+
return (executable === "yarn" || executable === "bun") && firstDirectTestRunnerSubcommand(executable, args) === "vitest";
|
|
479
471
|
}
|
|
480
472
|
function assertSandboxSafeTestRunnerCommand(command) {
|
|
481
473
|
const normalized = normalizeCommandForValidation(command);
|
|
@@ -496,52 +488,48 @@ function getRuntimeSafetySkipReason(command) {
|
|
|
496
488
|
function parseAddEntries(raw) {
|
|
497
489
|
if (!raw)
|
|
498
490
|
return [];
|
|
499
|
-
return raw.map(
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
assert_json_field_gte: parseLinkedTestAssertionGteMap(kv.assert_json_field_gte?.trim(), "--add"),
|
|
542
|
-
note: kv.note?.trim() || undefined,
|
|
543
|
-
};
|
|
544
|
-
});
|
|
491
|
+
return raw.map(parseAddEntry);
|
|
492
|
+
}
|
|
493
|
+
function parseAddEntry(entry) {
|
|
494
|
+
const trimmed = entry.trim();
|
|
495
|
+
const kv = looksLikeStructuredLinkedTestEntry(trimmed)
|
|
496
|
+
? normalizeStructuredLinkedTestEntry(parseCsvKv(entry, "--add"), "--add")
|
|
497
|
+
: { command: trimmed };
|
|
498
|
+
const command = trimLinkedTestEntryField(kv.command);
|
|
499
|
+
if (!command) {
|
|
500
|
+
throw new PmCliError("--add requires command=<value> or a bare command (path=<value> is optional metadata)", EXIT_CODE.USAGE);
|
|
501
|
+
}
|
|
502
|
+
assertNoRecursiveTestAllCommand(command);
|
|
503
|
+
assertSandboxSafeTestRunnerCommand(command);
|
|
504
|
+
return {
|
|
505
|
+
command,
|
|
506
|
+
path: trimLinkedTestEntryField(kv.path),
|
|
507
|
+
scope: ensureScope(kv.scope),
|
|
508
|
+
timeout_seconds: parseLinkedTestTimeoutSeconds(trimLinkedTestEntryField(kv.timeout_seconds), trimLinkedTestEntryField(kv.timeout)),
|
|
509
|
+
pm_context_mode: parseLinkedTestContextModeValue(trimLinkedTestEntryField(kv.pm_context_mode), "--add"),
|
|
510
|
+
env_set: parseLinkedTestEnvSetValue(trimLinkedTestEntryField(kv.env_set), "--add"),
|
|
511
|
+
env_clear: parseLinkedTestEnvClearValue(trimLinkedTestEntryField(kv.env_clear), "--add"),
|
|
512
|
+
shared_host_safe: parseLinkedTestBooleanValue(trimLinkedTestEntryField(kv.shared_host_safe), "--add", "shared_host_safe"),
|
|
513
|
+
assert_stdout_contains: parseLinkedTestStringList(trimLinkedTestEntryField(kv.assert_stdout_contains)),
|
|
514
|
+
assert_stdout_regex: parseLinkedTestRegexList(trimLinkedTestEntryField(kv.assert_stdout_regex), "--add", "assert_stdout_regex"),
|
|
515
|
+
assert_stderr_contains: parseLinkedTestStringList(trimLinkedTestEntryField(kv.assert_stderr_contains)),
|
|
516
|
+
assert_stderr_regex: parseLinkedTestRegexList(trimLinkedTestEntryField(kv.assert_stderr_regex), "--add", "assert_stderr_regex"),
|
|
517
|
+
assert_stdout_min_lines: parseLinkedTestMinLines(trimLinkedTestEntryField(kv.assert_stdout_min_lines), "--add"),
|
|
518
|
+
assert_json_field_equals: parseLinkedTestAssertionEqualsMap(trimLinkedTestEntryField(kv.assert_json_field_equals), "--add"),
|
|
519
|
+
assert_json_field_gte: parseLinkedTestAssertionGteMap(trimLinkedTestEntryField(kv.assert_json_field_gte), "--add"),
|
|
520
|
+
note: trimLinkedTestEntryField(kv.note),
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
function trimLinkedTestEntryField(value) {
|
|
524
|
+
const trimmed = value?.trim();
|
|
525
|
+
return trimmed && trimmed.length > 0 ? trimmed : undefined;
|
|
526
|
+
}
|
|
527
|
+
function parseLinkedTestTimeoutSeconds(timeoutSecondsRaw, timeoutAliasRaw) {
|
|
528
|
+
if (timeoutSecondsRaw && timeoutAliasRaw && timeoutSecondsRaw !== timeoutAliasRaw) {
|
|
529
|
+
throw new PmCliError("--add timeout and timeout_seconds must match when both are provided", EXIT_CODE.USAGE);
|
|
530
|
+
}
|
|
531
|
+
const timeoutRaw = timeoutSecondsRaw ?? timeoutAliasRaw;
|
|
532
|
+
return timeoutRaw === undefined ? undefined : Math.floor(parseOptionalNumber(timeoutRaw, "timeout_seconds"));
|
|
545
533
|
}
|
|
546
534
|
/* c8 ignore start -- add-json validation matrix is covered by linked-test parser integration suites */
|
|
547
535
|
function parseAddJsonEntries(raw) {
|
|
@@ -1121,47 +1109,11 @@ function compareAssertionValues(actual, expected) {
|
|
|
1121
1109
|
/* c8 ignore start -- assertion failure-path permutations are covered by linked-test integration fixtures */
|
|
1122
1110
|
function evaluateLinkedTestAssertions(linkedTest, stdout, stderr) {
|
|
1123
1111
|
const failures = [];
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
for (const pattern of linkedTest.assert_stdout_regex ?? []) {
|
|
1130
|
-
try {
|
|
1131
|
-
const regex = new RegExp(pattern, "m");
|
|
1132
|
-
if (!regex.test(stdout)) {
|
|
1133
|
-
failures.push(`stdout failed regex assertion: /${pattern}/m`);
|
|
1134
|
-
}
|
|
1135
|
-
}
|
|
1136
|
-
catch (error) {
|
|
1137
|
-
failures.push(`stdout regex assertion is invalid: /${pattern}/ (${error instanceof Error ? error.message : String(error)})`);
|
|
1138
|
-
}
|
|
1139
|
-
}
|
|
1140
|
-
for (const expected of linkedTest.assert_stderr_contains ?? []) {
|
|
1141
|
-
if (!stderr.includes(expected)) {
|
|
1142
|
-
failures.push(`stderr missing required text: "${expected}"`);
|
|
1143
|
-
}
|
|
1144
|
-
}
|
|
1145
|
-
for (const pattern of linkedTest.assert_stderr_regex ?? []) {
|
|
1146
|
-
try {
|
|
1147
|
-
const regex = new RegExp(pattern, "m");
|
|
1148
|
-
if (!regex.test(stderr)) {
|
|
1149
|
-
failures.push(`stderr failed regex assertion: /${pattern}/m`);
|
|
1150
|
-
}
|
|
1151
|
-
}
|
|
1152
|
-
catch (error) {
|
|
1153
|
-
failures.push(`stderr regex assertion is invalid: /${pattern}/ (${error instanceof Error ? error.message : String(error)})`);
|
|
1154
|
-
}
|
|
1155
|
-
}
|
|
1156
|
-
if (typeof linkedTest.assert_stdout_min_lines === "number") {
|
|
1157
|
-
const lineCount = stdout
|
|
1158
|
-
.split(/\r?\n/)
|
|
1159
|
-
.map((line) => line.trim())
|
|
1160
|
-
.filter((line) => line.length > 0).length;
|
|
1161
|
-
if (lineCount < linkedTest.assert_stdout_min_lines) {
|
|
1162
|
-
failures.push(`stdout line count ${lineCount} is below required minimum ${linkedTest.assert_stdout_min_lines}`);
|
|
1163
|
-
}
|
|
1164
|
-
}
|
|
1112
|
+
failures.push(...evaluateContainsAssertions("stdout", stdout, linkedTest.assert_stdout_contains));
|
|
1113
|
+
failures.push(...evaluateRegexAssertions("stdout", stdout, linkedTest.assert_stdout_regex));
|
|
1114
|
+
failures.push(...evaluateContainsAssertions("stderr", stderr, linkedTest.assert_stderr_contains));
|
|
1115
|
+
failures.push(...evaluateRegexAssertions("stderr", stderr, linkedTest.assert_stderr_regex));
|
|
1116
|
+
failures.push(...evaluateStdoutLineCountAssertion(stdout, linkedTest.assert_stdout_min_lines));
|
|
1165
1117
|
const jsonEqualsAssertions = linkedTest.assert_json_field_equals ?? {};
|
|
1166
1118
|
const jsonGteAssertions = linkedTest.assert_json_field_gte ?? {};
|
|
1167
1119
|
const needsJsonAssertions = Object.keys(jsonEqualsAssertions).length > 0 || Object.keys(jsonGteAssertions).length > 0;
|
|
@@ -1204,6 +1156,40 @@ function evaluateLinkedTestAssertions(linkedTest, stdout, stderr) {
|
|
|
1204
1156
|
return failures;
|
|
1205
1157
|
}
|
|
1206
1158
|
/* c8 ignore stop */
|
|
1159
|
+
function evaluateContainsAssertions(streamName, output, expectedValues) {
|
|
1160
|
+
const failures = [];
|
|
1161
|
+
for (const expected of expectedValues ?? []) {
|
|
1162
|
+
if (!output.includes(expected)) {
|
|
1163
|
+
failures.push(`${streamName} missing required text: "${expected}"`);
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
return failures;
|
|
1167
|
+
}
|
|
1168
|
+
function evaluateRegexAssertions(streamName, output, patterns) {
|
|
1169
|
+
const failures = [];
|
|
1170
|
+
for (const pattern of patterns ?? []) {
|
|
1171
|
+
try {
|
|
1172
|
+
const regex = new RegExp(pattern, "m");
|
|
1173
|
+
if (!regex.test(output)) {
|
|
1174
|
+
failures.push(`${streamName} failed regex assertion: /${pattern}/m`);
|
|
1175
|
+
}
|
|
1176
|
+
}
|
|
1177
|
+
catch (error) {
|
|
1178
|
+
failures.push(`${streamName} regex assertion is invalid: /${pattern}/ (${error instanceof Error ? error.message : String(error)})`);
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
return failures;
|
|
1182
|
+
}
|
|
1183
|
+
function evaluateStdoutLineCountAssertion(stdout, minimum) {
|
|
1184
|
+
if (typeof minimum !== "number") {
|
|
1185
|
+
return [];
|
|
1186
|
+
}
|
|
1187
|
+
const lineCount = stdout
|
|
1188
|
+
.split(/\r?\n/)
|
|
1189
|
+
.map((line) => line.trim())
|
|
1190
|
+
.filter((line) => line.length > 0).length;
|
|
1191
|
+
return lineCount < minimum ? [`stdout line count ${lineCount} is below required minimum ${minimum}`] : [];
|
|
1192
|
+
}
|
|
1207
1193
|
const EMPTY_LINKED_TEST_RUN_PATTERNS = [
|
|
1208
1194
|
{ code: "no_projects_matched_filters", regex: /\bNo projects matched the filters\b/i },
|
|
1209
1195
|
{ code: "no_test_files_found", regex: /\bNo test files found\b/i },
|
|
@@ -1220,303 +1206,283 @@ function detectEmptyLinkedTestRun(stdout, stderr) {
|
|
|
1220
1206
|
}
|
|
1221
1207
|
return null;
|
|
1222
1208
|
}
|
|
1223
|
-
|
|
1209
|
+
function createLinkedTestSandboxLayout(sandboxRoot) {
|
|
1210
|
+
return {
|
|
1211
|
+
root: sandboxRoot,
|
|
1212
|
+
schemaProjectPmPath: path.join(sandboxRoot, "schema", "project", ".agents", "pm"),
|
|
1213
|
+
schemaGlobalPmPath: path.join(sandboxRoot, "schema", "global"),
|
|
1214
|
+
trackerProjectPmPath: path.join(sandboxRoot, "tracker", "project", ".agents", "pm"),
|
|
1215
|
+
trackerGlobalPmPath: path.join(sandboxRoot, "tracker", "global"),
|
|
1216
|
+
};
|
|
1217
|
+
}
|
|
1218
|
+
async function initializeLinkedTestSandboxes(layout) {
|
|
1219
|
+
await runInit(undefined, { path: layout.schemaProjectPmPath });
|
|
1220
|
+
await runInit(undefined, { path: layout.schemaGlobalPmPath });
|
|
1221
|
+
await runInit(undefined, { path: layout.trackerProjectPmPath });
|
|
1222
|
+
await runInit(undefined, { path: layout.trackerGlobalPmPath });
|
|
1223
|
+
}
|
|
1224
|
+
async function seedLinkedTestSandboxesFromSource(layout, sourceRoots) {
|
|
1225
|
+
if (!sourceRoots) {
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1228
|
+
await seedLinkedTestSandbox(layout.schemaProjectPmPath, layout.schemaGlobalPmPath, sourceRoots);
|
|
1229
|
+
await seedLinkedTestSandbox(layout.trackerProjectPmPath, layout.trackerGlobalPmPath, sourceRoots);
|
|
1230
|
+
await seedLinkedTestTrackerData(sourceRoots.projectPmRoot, layout.trackerProjectPmPath);
|
|
1231
|
+
await seedLinkedTestTrackerData(sourceRoots.globalPmRoot, layout.trackerGlobalPmPath);
|
|
1232
|
+
}
|
|
1233
|
+
async function countLinkedTestSandboxItems(layout, sourceRoots) {
|
|
1234
|
+
return {
|
|
1235
|
+
sourceProjectItemCount: sourceRoots ? await countLinkedTestItemFiles(sourceRoots.projectPmRoot) : 0,
|
|
1236
|
+
sourceGlobalItemCount: sourceRoots ? await countLinkedTestItemFiles(sourceRoots.globalPmRoot) : 0,
|
|
1237
|
+
schemaProjectItemCount: await countLinkedTestItemFiles(layout.schemaProjectPmPath),
|
|
1238
|
+
schemaGlobalItemCount: await countLinkedTestItemFiles(layout.schemaGlobalPmPath),
|
|
1239
|
+
trackerProjectItemCount: await countLinkedTestItemFiles(layout.trackerProjectPmPath),
|
|
1240
|
+
trackerGlobalItemCount: await countLinkedTestItemFiles(layout.trackerGlobalPmPath),
|
|
1241
|
+
};
|
|
1242
|
+
}
|
|
1243
|
+
function buildLinkedTestExecutionContext(params) {
|
|
1244
|
+
const trackerMode = params.effectivePmContextMode === "tracker";
|
|
1245
|
+
const selectedSandboxProjectPmPath = trackerMode ? params.layout.trackerProjectPmPath : params.layout.schemaProjectPmPath;
|
|
1246
|
+
const selectedSandboxGlobalPmPath = trackerMode ? params.layout.trackerGlobalPmPath : params.layout.schemaGlobalPmPath;
|
|
1247
|
+
const selectedSandboxProjectItemCount = trackerMode ? params.counts.trackerProjectItemCount : params.counts.schemaProjectItemCount;
|
|
1248
|
+
const selectedSandboxGlobalItemCount = trackerMode ? params.counts.trackerGlobalItemCount : params.counts.schemaGlobalItemCount;
|
|
1249
|
+
return {
|
|
1250
|
+
requested_pm_context_mode: params.requestedPmContextMode,
|
|
1251
|
+
pm_context_mode: params.effectivePmContextMode,
|
|
1252
|
+
auto_pm_context_applied: params.autoPmContextApplied,
|
|
1253
|
+
is_pm_command: params.isPmCommand,
|
|
1254
|
+
is_pm_tracker_read_command: params.isPmTrackerReadCommand,
|
|
1255
|
+
source_project_pm_path: params.sourceRoots?.projectPmRoot ?? "",
|
|
1256
|
+
sandbox_project_pm_path: selectedSandboxProjectPmPath,
|
|
1257
|
+
source_global_pm_path: params.sourceRoots?.globalPmRoot ?? "",
|
|
1258
|
+
sandbox_global_pm_path: selectedSandboxGlobalPmPath,
|
|
1259
|
+
source_project_item_count: params.counts.sourceProjectItemCount,
|
|
1260
|
+
sandbox_project_item_count: selectedSandboxProjectItemCount,
|
|
1261
|
+
source_global_item_count: params.counts.sourceGlobalItemCount,
|
|
1262
|
+
sandbox_global_item_count: selectedSandboxGlobalItemCount,
|
|
1263
|
+
mismatch_detected: params.isPmCommand && params.counts.sourceProjectItemCount !== selectedSandboxProjectItemCount,
|
|
1264
|
+
project_extensions_seeded: Boolean(params.sourceRoots),
|
|
1265
|
+
global_extensions_seeded: Boolean(params.sourceRoots),
|
|
1266
|
+
};
|
|
1267
|
+
}
|
|
1268
|
+
function resolveLinkedTestCommandContext(params) {
|
|
1269
|
+
const linkedOverridePmContextMode = typeof params.linkedTest.pm_context_mode === "string" && params.linkedTest.pm_context_mode.trim().length > 0
|
|
1270
|
+
? parsePmContextMode(params.linkedTest.pm_context_mode)
|
|
1271
|
+
: undefined;
|
|
1272
|
+
const command = typeof params.linkedTest.command === "string" && params.linkedTest.command.length > 0
|
|
1273
|
+
? params.linkedTest.command
|
|
1274
|
+
: undefined;
|
|
1275
|
+
const isPmCommand = command ? commandInvokesPmCli(command) : false;
|
|
1276
|
+
const isPmTrackerReadCommand = isPmCommand && command ? commandInvokesPmTrackerReadCommand(command) : false;
|
|
1277
|
+
const autoPmContextApplied = params.options?.autoPmContext === true && isPmTrackerReadCommand;
|
|
1278
|
+
const requestedPmContextMode = autoPmContextApplied
|
|
1279
|
+
? "auto"
|
|
1280
|
+
: resolveLinkedTestRequestedContextMode(params.linkedTest, params.runLevelPmContextMode, params.options?.overrideLinkedPmContext === true);
|
|
1281
|
+
const effectivePmContextMode = resolveLinkedTestEffectiveContextMode(requestedPmContextMode, isPmTrackerReadCommand);
|
|
1282
|
+
return {
|
|
1283
|
+
linkedOverridePmContextMode,
|
|
1284
|
+
executionContext: buildLinkedTestExecutionContext({
|
|
1285
|
+
layout: params.layout,
|
|
1286
|
+
counts: params.counts,
|
|
1287
|
+
sourceRoots: params.sourceRoots,
|
|
1288
|
+
isPmCommand,
|
|
1289
|
+
isPmTrackerReadCommand,
|
|
1290
|
+
requestedPmContextMode,
|
|
1291
|
+
effectivePmContextMode,
|
|
1292
|
+
autoPmContextApplied,
|
|
1293
|
+
}),
|
|
1294
|
+
};
|
|
1295
|
+
}
|
|
1296
|
+
function buildLinkedTestSkippedResult(linkedTest, executionContext, error) {
|
|
1297
|
+
return {
|
|
1298
|
+
command: linkedTest.command,
|
|
1299
|
+
path: linkedTest.path,
|
|
1300
|
+
status: "skipped",
|
|
1301
|
+
execution_context: executionContext,
|
|
1302
|
+
error,
|
|
1303
|
+
};
|
|
1304
|
+
}
|
|
1305
|
+
function buildLinkedTestAssertionFailureResult(linkedTest, executionContext, error, output) {
|
|
1306
|
+
return {
|
|
1307
|
+
command: linkedTest.command,
|
|
1308
|
+
path: linkedTest.path,
|
|
1309
|
+
status: "failed",
|
|
1310
|
+
exit_code: 1,
|
|
1311
|
+
failure_category: "assertion_failure",
|
|
1312
|
+
execution_context: executionContext,
|
|
1313
|
+
...(output ? { stdout: output.stdout, stderr: output.stderr } : {}),
|
|
1314
|
+
error,
|
|
1315
|
+
};
|
|
1316
|
+
}
|
|
1317
|
+
function resolveLinkedTestPreflightResult(params) {
|
|
1318
|
+
if (!params.linkedTest.command) {
|
|
1319
|
+
return buildLinkedTestSkippedResult(params.linkedTest, params.executionContext, "No command configured for this linked test.");
|
|
1320
|
+
}
|
|
1321
|
+
const runtimeSafetySkipReason = getRuntimeSafetySkipReason(params.linkedTest.command);
|
|
1322
|
+
if (runtimeSafetySkipReason) {
|
|
1323
|
+
return buildLinkedTestSkippedResult(params.linkedTest, params.executionContext, runtimeSafetySkipReason);
|
|
1324
|
+
}
|
|
1325
|
+
const failOnMismatchByDefault = params.executionContext.pm_context_mode === "schema" &&
|
|
1326
|
+
params.executionContext.is_pm_tracker_read_command &&
|
|
1327
|
+
params.executionContext.mismatch_detected;
|
|
1328
|
+
const failOnMismatchByFlag = params.options?.failOnContextMismatch === true &&
|
|
1329
|
+
params.executionContext.is_pm_command &&
|
|
1330
|
+
params.executionContext.mismatch_detected;
|
|
1331
|
+
if (failOnMismatchByDefault || failOnMismatchByFlag) {
|
|
1332
|
+
const mismatchHint = buildPmContextMismatchHint({
|
|
1333
|
+
executionContext: params.executionContext,
|
|
1334
|
+
runLevelPmContextMode: params.runLevelPmContextMode,
|
|
1335
|
+
linkedOverridePmContextMode: params.linkedOverridePmContextMode,
|
|
1336
|
+
});
|
|
1337
|
+
const mismatchPrefix = params.options?.checkContext === true
|
|
1338
|
+
? "Linked test preflight PM context mismatch detected"
|
|
1339
|
+
: "Linked test PM context mismatch detected";
|
|
1340
|
+
return buildLinkedTestAssertionFailureResult(params.linkedTest, params.executionContext, `${mismatchPrefix} (source_project_items=${params.executionContext.source_project_item_count}, ` +
|
|
1341
|
+
`sandbox_project_items=${params.executionContext.sandbox_project_item_count}).${mismatchHint}`);
|
|
1342
|
+
}
|
|
1343
|
+
if (params.options?.requireAssertionsForPm === true &&
|
|
1344
|
+
params.executionContext.is_pm_command &&
|
|
1345
|
+
!hasLinkedTestAssertions(params.linkedTest)) {
|
|
1346
|
+
return buildLinkedTestAssertionFailureResult(params.linkedTest, params.executionContext, "Linked PM command requires assertions when --require-assertions-for-pm is enabled.");
|
|
1347
|
+
}
|
|
1348
|
+
return null;
|
|
1349
|
+
}
|
|
1350
|
+
function buildLinkedTestExecutionEnv(params) {
|
|
1351
|
+
const effectiveDirectives = resolveEffectiveLinkedTestDirectives(params.runtimeDirectives, params.linkedTest);
|
|
1352
|
+
const executionEnv = { ...process.env };
|
|
1353
|
+
applyEnvDirectiveStage(executionEnv, params.runtimeDirectives);
|
|
1354
|
+
applyEnvDirectiveStage(executionEnv, {
|
|
1355
|
+
env_set: params.linkedTest.env_set ?? {},
|
|
1356
|
+
env_clear: params.linkedTest.env_clear ?? [],
|
|
1357
|
+
});
|
|
1358
|
+
if (effectiveDirectives.shared_host_safe) {
|
|
1359
|
+
applySharedHostSafeDefaults(executionEnv);
|
|
1360
|
+
}
|
|
1361
|
+
executionEnv.FORCE_COLOR = "0";
|
|
1362
|
+
executionEnv.PM_PATH = params.executionContext.sandbox_project_pm_path;
|
|
1363
|
+
executionEnv.PM_GLOBAL_PATH = params.executionContext.sandbox_global_pm_path;
|
|
1364
|
+
return executionEnv;
|
|
1365
|
+
}
|
|
1366
|
+
function buildLinkedTestPassedResult(linkedTest, executionContext, execution) {
|
|
1367
|
+
return {
|
|
1368
|
+
command: linkedTest.command,
|
|
1369
|
+
path: linkedTest.path,
|
|
1370
|
+
status: "passed",
|
|
1371
|
+
exit_code: 0,
|
|
1372
|
+
execution_context: executionContext,
|
|
1373
|
+
stdout: execution.stdout,
|
|
1374
|
+
stderr: execution.stderr,
|
|
1375
|
+
};
|
|
1376
|
+
}
|
|
1377
|
+
function buildLinkedTestEmptyRunResult(params) {
|
|
1378
|
+
return {
|
|
1379
|
+
command: params.linkedTest.command,
|
|
1380
|
+
path: params.linkedTest.path,
|
|
1381
|
+
status: "failed",
|
|
1382
|
+
exit_code: 1,
|
|
1383
|
+
failure_category: "empty_run",
|
|
1384
|
+
execution_context: params.executionContext,
|
|
1385
|
+
stdout: params.execution.stdout,
|
|
1386
|
+
stderr: params.execution.stderr,
|
|
1387
|
+
error: `Linked test reported an empty test run (${params.emptyRunSignal}) while --fail-on-empty-test-run is enabled. ` +
|
|
1388
|
+
"Update test selection or disable --fail-on-empty-test-run for this run.",
|
|
1389
|
+
};
|
|
1390
|
+
}
|
|
1391
|
+
function buildLinkedTestCommandFailureResult(params) {
|
|
1392
|
+
return {
|
|
1393
|
+
command: params.linkedTest.command,
|
|
1394
|
+
path: params.linkedTest.path,
|
|
1395
|
+
status: "failed",
|
|
1396
|
+
exit_code: resolveLinkedTestFailureExitCode(params.execution),
|
|
1397
|
+
failure_category: classifyLinkedTestFailure(params.execution),
|
|
1398
|
+
execution_context: params.executionContext,
|
|
1399
|
+
stdout: params.execution.stdout,
|
|
1400
|
+
stderr: params.execution.stderr,
|
|
1401
|
+
error: formatLinkedTestExecutionError(params.execution, params.timeoutMs),
|
|
1402
|
+
};
|
|
1403
|
+
}
|
|
1404
|
+
function buildLinkedTestPassedExecutionResult(params) {
|
|
1405
|
+
if (params.options?.failOnEmptyTestRun === true) {
|
|
1406
|
+
const emptyRunSignal = detectEmptyLinkedTestRun(params.execution.stdout, params.execution.stderr);
|
|
1407
|
+
if (emptyRunSignal) {
|
|
1408
|
+
return buildLinkedTestEmptyRunResult({ ...params, emptyRunSignal });
|
|
1409
|
+
}
|
|
1410
|
+
}
|
|
1411
|
+
const assertionFailures = evaluateLinkedTestAssertions(params.linkedTest, params.execution.stdout, params.execution.stderr);
|
|
1412
|
+
if (assertionFailures.length > 0) {
|
|
1413
|
+
return buildLinkedTestAssertionFailureResult(params.linkedTest, params.executionContext, `Linked test assertion(s) failed: ${assertionFailures.join("; ")}`, params.execution);
|
|
1414
|
+
}
|
|
1415
|
+
return buildLinkedTestPassedResult(params.linkedTest, params.executionContext, params.execution);
|
|
1416
|
+
}
|
|
1417
|
+
async function runSingleLinkedTest(params) {
|
|
1418
|
+
const command = params.linkedTest.command ?? "";
|
|
1419
|
+
const timeoutMs = (params.linkedTest.timeout_seconds ?? params.defaultTimeoutSeconds ?? 120) * 1000;
|
|
1420
|
+
const execution = await runLinkedTestCommand(command, timeoutMs, buildLinkedTestExecutionEnv(params), {
|
|
1421
|
+
index: params.index + 1,
|
|
1422
|
+
total: params.total,
|
|
1423
|
+
timeoutMs,
|
|
1424
|
+
command,
|
|
1425
|
+
}, params.progressMode);
|
|
1426
|
+
const passed = execution.exitCode === 0 && !execution.timedOut && !execution.maxBufferExceeded;
|
|
1427
|
+
return passed
|
|
1428
|
+
? buildLinkedTestPassedExecutionResult({ ...params, execution })
|
|
1429
|
+
: buildLinkedTestCommandFailureResult({ ...params, execution, timeoutMs });
|
|
1430
|
+
}
|
|
1224
1431
|
/**
|
|
1225
1432
|
* Implements run linked tests for the public runtime surface of this module.
|
|
1226
1433
|
*/
|
|
1227
1434
|
export async function runLinkedTests(tests, defaultTimeoutSeconds, options) {
|
|
1228
1435
|
const results = [];
|
|
1229
1436
|
const sandboxRoot = await mkdtemp(path.join(tmpdir(), "pm-linked-test-"));
|
|
1230
|
-
const
|
|
1231
|
-
const schemaSandboxGlobalPath = path.join(sandboxRoot, "schema", "global");
|
|
1232
|
-
const trackerSandboxPmPath = path.join(sandboxRoot, "tracker", "project", ".agents", "pm");
|
|
1233
|
-
const trackerSandboxGlobalPath = path.join(sandboxRoot, "tracker", "global");
|
|
1437
|
+
const layout = createLinkedTestSandboxLayout(sandboxRoot);
|
|
1234
1438
|
const runLevelPmContextMode = parsePmContextMode(options?.pmContext);
|
|
1235
1439
|
const progressMode = options?.progress === true ? "always" : "auto";
|
|
1236
1440
|
const runtimeDirectives = resolveRuntimeDirectives(options?.envSet, options?.envClear, options?.sharedHostSafe);
|
|
1237
|
-
let sourceProjectItemCount = 0;
|
|
1238
|
-
let sourceGlobalItemCount = 0;
|
|
1239
|
-
let schemaSandboxProjectItemCount = 0;
|
|
1240
|
-
let schemaSandboxGlobalItemCount = 0;
|
|
1241
|
-
let trackerSandboxProjectItemCount = 0;
|
|
1242
|
-
let trackerSandboxGlobalItemCount = 0;
|
|
1243
1441
|
const sourceRoots = options?.sourceRoots;
|
|
1244
|
-
const projectExtensionsSeeded = Boolean(sourceRoots);
|
|
1245
|
-
const globalExtensionsSeeded = Boolean(sourceRoots);
|
|
1246
1442
|
try {
|
|
1247
|
-
await
|
|
1248
|
-
await
|
|
1249
|
-
await
|
|
1250
|
-
await runInit(undefined, { path: trackerSandboxGlobalPath });
|
|
1251
|
-
if (sourceRoots) {
|
|
1252
|
-
await seedLinkedTestSandbox(schemaSandboxPmPath, schemaSandboxGlobalPath, sourceRoots);
|
|
1253
|
-
await seedLinkedTestSandbox(trackerSandboxPmPath, trackerSandboxGlobalPath, sourceRoots);
|
|
1254
|
-
await seedLinkedTestTrackerData(sourceRoots.projectPmRoot, trackerSandboxPmPath);
|
|
1255
|
-
await seedLinkedTestTrackerData(sourceRoots.globalPmRoot, trackerSandboxGlobalPath);
|
|
1256
|
-
sourceProjectItemCount = await countLinkedTestItemFiles(sourceRoots.projectPmRoot);
|
|
1257
|
-
sourceGlobalItemCount = await countLinkedTestItemFiles(sourceRoots.globalPmRoot);
|
|
1258
|
-
}
|
|
1259
|
-
schemaSandboxProjectItemCount = await countLinkedTestItemFiles(schemaSandboxPmPath);
|
|
1260
|
-
schemaSandboxGlobalItemCount = await countLinkedTestItemFiles(schemaSandboxGlobalPath);
|
|
1261
|
-
trackerSandboxProjectItemCount = await countLinkedTestItemFiles(trackerSandboxPmPath);
|
|
1262
|
-
trackerSandboxGlobalItemCount = await countLinkedTestItemFiles(trackerSandboxGlobalPath);
|
|
1263
|
-
const buildExecutionContext = (isPmCommand, isPmTrackerReadCommand, requestedPmContextMode, effectivePmContextMode, autoPmContextApplied) => {
|
|
1264
|
-
const selectedSandboxProjectPmPath = effectivePmContextMode === "tracker" ? trackerSandboxPmPath : schemaSandboxPmPath;
|
|
1265
|
-
const selectedSandboxGlobalPmPath = effectivePmContextMode === "tracker" ? trackerSandboxGlobalPath : schemaSandboxGlobalPath;
|
|
1266
|
-
const selectedSandboxProjectItemCount = effectivePmContextMode === "tracker" ? trackerSandboxProjectItemCount : schemaSandboxProjectItemCount;
|
|
1267
|
-
const selectedSandboxGlobalItemCount = effectivePmContextMode === "tracker" ? trackerSandboxGlobalItemCount : schemaSandboxGlobalItemCount;
|
|
1268
|
-
const mismatchDetected = isPmCommand && sourceProjectItemCount !== selectedSandboxProjectItemCount;
|
|
1269
|
-
return {
|
|
1270
|
-
requested_pm_context_mode: requestedPmContextMode,
|
|
1271
|
-
pm_context_mode: effectivePmContextMode,
|
|
1272
|
-
auto_pm_context_applied: autoPmContextApplied,
|
|
1273
|
-
is_pm_command: isPmCommand,
|
|
1274
|
-
is_pm_tracker_read_command: isPmTrackerReadCommand,
|
|
1275
|
-
source_project_pm_path: sourceRoots?.projectPmRoot ?? "",
|
|
1276
|
-
sandbox_project_pm_path: selectedSandboxProjectPmPath,
|
|
1277
|
-
source_global_pm_path: sourceRoots?.globalPmRoot ?? "",
|
|
1278
|
-
sandbox_global_pm_path: selectedSandboxGlobalPmPath,
|
|
1279
|
-
source_project_item_count: sourceProjectItemCount,
|
|
1280
|
-
sandbox_project_item_count: selectedSandboxProjectItemCount,
|
|
1281
|
-
source_global_item_count: sourceGlobalItemCount,
|
|
1282
|
-
sandbox_global_item_count: selectedSandboxGlobalItemCount,
|
|
1283
|
-
mismatch_detected: mismatchDetected,
|
|
1284
|
-
project_extensions_seeded: projectExtensionsSeeded,
|
|
1285
|
-
global_extensions_seeded: globalExtensionsSeeded,
|
|
1286
|
-
};
|
|
1287
|
-
};
|
|
1443
|
+
await initializeLinkedTestSandboxes(layout);
|
|
1444
|
+
await seedLinkedTestSandboxesFromSource(layout, sourceRoots);
|
|
1445
|
+
const counts = await countLinkedTestSandboxItems(layout, sourceRoots);
|
|
1288
1446
|
for (let index = 0; index < tests.length; index += 1) {
|
|
1289
1447
|
const linkedTest = tests[index];
|
|
1290
|
-
const
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
? commandInvokesPmTrackerReadCommand(linkedTest.command)
|
|
1298
|
-
: false;
|
|
1299
|
-
const autoPmContextApplied = options?.autoPmContext === true && isPmTrackerReadCommand;
|
|
1300
|
-
const requestedPmContextMode = autoPmContextApplied
|
|
1301
|
-
? "auto"
|
|
1302
|
-
: resolveLinkedTestRequestedContextMode(linkedTest, runLevelPmContextMode, options?.overrideLinkedPmContext === true);
|
|
1303
|
-
const effectivePmContextMode = resolveLinkedTestEffectiveContextMode(requestedPmContextMode, isPmTrackerReadCommand);
|
|
1304
|
-
const executionContext = buildExecutionContext(isPmCommand, isPmTrackerReadCommand, requestedPmContextMode, effectivePmContextMode, autoPmContextApplied);
|
|
1305
|
-
if (!linkedTest.command) {
|
|
1306
|
-
results.push({
|
|
1307
|
-
command: linkedTest.command,
|
|
1308
|
-
path: linkedTest.path,
|
|
1309
|
-
status: "skipped",
|
|
1310
|
-
execution_context: executionContext,
|
|
1311
|
-
error: "No command configured for this linked test.",
|
|
1312
|
-
});
|
|
1313
|
-
continue;
|
|
1314
|
-
}
|
|
1315
|
-
const runtimeSafetySkipReason = getRuntimeSafetySkipReason(linkedTest.command);
|
|
1316
|
-
if (runtimeSafetySkipReason) {
|
|
1317
|
-
results.push({
|
|
1318
|
-
command: linkedTest.command,
|
|
1319
|
-
path: linkedTest.path,
|
|
1320
|
-
status: "skipped",
|
|
1321
|
-
execution_context: executionContext,
|
|
1322
|
-
error: runtimeSafetySkipReason,
|
|
1323
|
-
});
|
|
1324
|
-
continue;
|
|
1325
|
-
}
|
|
1326
|
-
const failOnMismatchByDefault = executionContext.pm_context_mode === "schema" &&
|
|
1327
|
-
executionContext.is_pm_tracker_read_command &&
|
|
1328
|
-
executionContext.mismatch_detected;
|
|
1329
|
-
const failOnMismatchByFlag = options?.failOnContextMismatch === true && executionContext.is_pm_command && executionContext.mismatch_detected;
|
|
1330
|
-
if (failOnMismatchByDefault || failOnMismatchByFlag) {
|
|
1331
|
-
const mismatchHint = buildPmContextMismatchHint({
|
|
1332
|
-
executionContext,
|
|
1333
|
-
runLevelPmContextMode,
|
|
1334
|
-
linkedOverridePmContextMode,
|
|
1335
|
-
});
|
|
1336
|
-
const mismatchPrefix = options?.checkContext === true ? "Linked test preflight PM context mismatch detected" : "Linked test PM context mismatch detected";
|
|
1337
|
-
results.push({
|
|
1338
|
-
command: linkedTest.command,
|
|
1339
|
-
path: linkedTest.path,
|
|
1340
|
-
status: "failed",
|
|
1341
|
-
exit_code: 1,
|
|
1342
|
-
failure_category: "assertion_failure",
|
|
1343
|
-
execution_context: executionContext,
|
|
1344
|
-
error: `${mismatchPrefix} (source_project_items=${executionContext.source_project_item_count}, ` +
|
|
1345
|
-
`sandbox_project_items=${executionContext.sandbox_project_item_count}).${mismatchHint}`,
|
|
1346
|
-
});
|
|
1347
|
-
continue;
|
|
1348
|
-
}
|
|
1349
|
-
if (options?.requireAssertionsForPm === true && executionContext.is_pm_command && !hasLinkedTestAssertions(linkedTest)) {
|
|
1350
|
-
results.push({
|
|
1351
|
-
command: linkedTest.command,
|
|
1352
|
-
path: linkedTest.path,
|
|
1353
|
-
status: "failed",
|
|
1354
|
-
exit_code: 1,
|
|
1355
|
-
failure_category: "assertion_failure",
|
|
1356
|
-
execution_context: executionContext,
|
|
1357
|
-
error: "Linked PM command requires assertions when --require-assertions-for-pm is enabled.",
|
|
1358
|
-
});
|
|
1359
|
-
continue;
|
|
1360
|
-
}
|
|
1361
|
-
const timeoutMs = ((linkedTest.timeout_seconds ?? defaultTimeoutSeconds ?? 120) * 1000);
|
|
1362
|
-
const effectiveDirectives = resolveEffectiveLinkedTestDirectives(runtimeDirectives, linkedTest);
|
|
1363
|
-
const executionEnv = { ...process.env };
|
|
1364
|
-
applyEnvDirectiveStage(executionEnv, runtimeDirectives);
|
|
1365
|
-
applyEnvDirectiveStage(executionEnv, {
|
|
1366
|
-
env_set: linkedTest.env_set ?? {},
|
|
1367
|
-
env_clear: linkedTest.env_clear ?? [],
|
|
1448
|
+
const commandContext = resolveLinkedTestCommandContext({
|
|
1449
|
+
linkedTest,
|
|
1450
|
+
layout,
|
|
1451
|
+
counts,
|
|
1452
|
+
sourceRoots,
|
|
1453
|
+
runLevelPmContextMode,
|
|
1454
|
+
options,
|
|
1368
1455
|
});
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
timeoutMs,
|
|
1379
|
-
command: linkedTest.command,
|
|
1380
|
-
}, progressMode);
|
|
1381
|
-
const passed = execution.exitCode === 0 && !execution.timedOut && !execution.maxBufferExceeded;
|
|
1382
|
-
if (passed) {
|
|
1383
|
-
if (options?.failOnEmptyTestRun === true) {
|
|
1384
|
-
const emptyRunSignal = detectEmptyLinkedTestRun(execution.stdout, execution.stderr);
|
|
1385
|
-
if (emptyRunSignal) {
|
|
1386
|
-
results.push({
|
|
1387
|
-
command: linkedTest.command,
|
|
1388
|
-
path: linkedTest.path,
|
|
1389
|
-
status: "failed",
|
|
1390
|
-
exit_code: 1,
|
|
1391
|
-
failure_category: "empty_run",
|
|
1392
|
-
execution_context: executionContext,
|
|
1393
|
-
stdout: execution.stdout,
|
|
1394
|
-
stderr: execution.stderr,
|
|
1395
|
-
error: `Linked test reported an empty test run (${emptyRunSignal}) while --fail-on-empty-test-run is enabled. ` +
|
|
1396
|
-
"Update test selection or disable --fail-on-empty-test-run for this run.",
|
|
1397
|
-
});
|
|
1398
|
-
continue;
|
|
1399
|
-
}
|
|
1400
|
-
}
|
|
1401
|
-
const assertionFailures = evaluateLinkedTestAssertions(linkedTest, execution.stdout, execution.stderr);
|
|
1402
|
-
if (assertionFailures.length > 0) {
|
|
1403
|
-
results.push({
|
|
1404
|
-
command: linkedTest.command,
|
|
1405
|
-
path: linkedTest.path,
|
|
1406
|
-
status: "failed",
|
|
1407
|
-
exit_code: 1,
|
|
1408
|
-
failure_category: "assertion_failure",
|
|
1409
|
-
execution_context: executionContext,
|
|
1410
|
-
stdout: execution.stdout,
|
|
1411
|
-
stderr: execution.stderr,
|
|
1412
|
-
error: `Linked test assertion(s) failed: ${assertionFailures.join("; ")}`,
|
|
1413
|
-
});
|
|
1414
|
-
continue;
|
|
1415
|
-
}
|
|
1416
|
-
results.push({
|
|
1417
|
-
command: linkedTest.command,
|
|
1418
|
-
path: linkedTest.path,
|
|
1419
|
-
status: "passed",
|
|
1420
|
-
exit_code: 0,
|
|
1421
|
-
execution_context: executionContext,
|
|
1422
|
-
stdout: execution.stdout,
|
|
1423
|
-
stderr: execution.stderr,
|
|
1424
|
-
});
|
|
1456
|
+
const preflightResult = resolveLinkedTestPreflightResult({
|
|
1457
|
+
linkedTest,
|
|
1458
|
+
executionContext: commandContext.executionContext,
|
|
1459
|
+
runLevelPmContextMode,
|
|
1460
|
+
linkedOverridePmContextMode: commandContext.linkedOverridePmContextMode,
|
|
1461
|
+
options,
|
|
1462
|
+
});
|
|
1463
|
+
if (preflightResult) {
|
|
1464
|
+
results.push(preflightResult);
|
|
1425
1465
|
continue;
|
|
1426
1466
|
}
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
error: formatLinkedTestExecutionError(execution, timeoutMs),
|
|
1438
|
-
});
|
|
1467
|
+
results.push(await runSingleLinkedTest({
|
|
1468
|
+
linkedTest,
|
|
1469
|
+
index,
|
|
1470
|
+
total: tests.length,
|
|
1471
|
+
defaultTimeoutSeconds,
|
|
1472
|
+
runtimeDirectives,
|
|
1473
|
+
progressMode,
|
|
1474
|
+
executionContext: commandContext.executionContext,
|
|
1475
|
+
options,
|
|
1476
|
+
}));
|
|
1439
1477
|
}
|
|
1440
1478
|
}
|
|
1441
1479
|
finally {
|
|
1442
|
-
await rm(
|
|
1480
|
+
await rm(layout.root, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
|
|
1443
1481
|
}
|
|
1444
1482
|
return results;
|
|
1445
1483
|
}
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
*/
|
|
1449
|
-
export async function runTest(id, options, global) {
|
|
1450
|
-
const stdinResolver = createStdinTokenResolver();
|
|
1451
|
-
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
1452
|
-
if (!(await pathExists(getSettingsPath(pmRoot)))) {
|
|
1453
|
-
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
1454
|
-
}
|
|
1455
|
-
const settings = await readSettings(pmRoot);
|
|
1456
|
-
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
1457
|
-
const resolvedAdds = await stdinResolver.resolveList(options.add, "--add");
|
|
1458
|
-
const resolvedAddJsons = await stdinResolver.resolveList(options.addJson, "--add-json");
|
|
1459
|
-
const resolvedRemoves = await stdinResolver.resolveList(options.remove, "--remove");
|
|
1460
|
-
const adds = [...parseAddEntries(resolvedAdds), ...parseAddJsonEntries(resolvedAddJsons)];
|
|
1461
|
-
const removes = parseRemoveEntries(resolvedRemoves);
|
|
1462
|
-
const shouldMutate = adds.length > 0 || removes.length > 0;
|
|
1463
|
-
let tests = [];
|
|
1464
|
-
let itemId;
|
|
1465
|
-
let changed = false;
|
|
1466
|
-
if (shouldMutate) {
|
|
1467
|
-
const author = resolveAuthor(options.author, settings.author_default);
|
|
1468
|
-
const result = await mutateItem({
|
|
1469
|
-
pmRoot,
|
|
1470
|
-
settings,
|
|
1471
|
-
id,
|
|
1472
|
-
op: "tests_add",
|
|
1473
|
-
author,
|
|
1474
|
-
message: options.message,
|
|
1475
|
-
force: options.force,
|
|
1476
|
-
skipNoop: true,
|
|
1477
|
-
mutate(document) {
|
|
1478
|
-
const previous = document.metadata.tests ?? [];
|
|
1479
|
-
const next = [...(document.metadata.tests ?? [])];
|
|
1480
|
-
for (const add of adds) {
|
|
1481
|
-
const exists = next.some((entry) => entry.command === add.command &&
|
|
1482
|
-
entry.path === add.path &&
|
|
1483
|
-
entry.scope === add.scope &&
|
|
1484
|
-
entry.pm_context_mode === add.pm_context_mode);
|
|
1485
|
-
if (!exists) {
|
|
1486
|
-
next.push(add);
|
|
1487
|
-
}
|
|
1488
|
-
}
|
|
1489
|
-
if (removes.length > 0) {
|
|
1490
|
-
for (let i = next.length - 1; i >= 0; i -= 1) {
|
|
1491
|
-
const entry = next[i];
|
|
1492
|
-
if (removes.includes(entry.path ?? "") || removes.includes(entry.command ?? "")) {
|
|
1493
|
-
next.splice(i, 1);
|
|
1494
|
-
}
|
|
1495
|
-
}
|
|
1496
|
-
}
|
|
1497
|
-
document.metadata.tests = next;
|
|
1498
|
-
return { changedFields: stableValueEquals(previous, next) ? [] : ["tests"] };
|
|
1499
|
-
},
|
|
1500
|
-
});
|
|
1501
|
-
tests = result.item.tests ?? [];
|
|
1502
|
-
itemId = result.item.id;
|
|
1503
|
-
changed = result.changedFields.length > 0;
|
|
1504
|
-
}
|
|
1505
|
-
else {
|
|
1506
|
-
const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);
|
|
1507
|
-
if (!located) {
|
|
1508
|
-
throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
|
|
1509
|
-
}
|
|
1510
|
-
itemId = located.id;
|
|
1511
|
-
const loaded = await readLocatedItem(located, { schema: settings.schema });
|
|
1512
|
-
tests = loaded.document.metadata.tests ?? [];
|
|
1513
|
-
}
|
|
1514
|
-
let defaultTimeoutSeconds;
|
|
1515
|
-
if (options.timeout !== undefined) {
|
|
1516
|
-
defaultTimeoutSeconds = parseOptionalNumber(options.timeout, "timeout");
|
|
1517
|
-
}
|
|
1518
|
-
const pmContextMode = parsePmContextMode(options.pmContext);
|
|
1519
|
-
const hasRuntimeDirectiveFlags = (options.envSet?.length ?? 0) > 0 ||
|
|
1484
|
+
function hasTestRuntimeDirectiveFlags(options) {
|
|
1485
|
+
return ((options.envSet?.length ?? 0) > 0 ||
|
|
1520
1486
|
(options.envClear?.length ?? 0) > 0 ||
|
|
1521
1487
|
options.sharedHostSafe === true ||
|
|
1522
1488
|
options.pmContext !== undefined ||
|
|
@@ -1526,43 +1492,105 @@ export async function runTest(id, options, global) {
|
|
|
1526
1492
|
options.failOnEmptyTestRun === true ||
|
|
1527
1493
|
options.requireAssertionsForPm === true ||
|
|
1528
1494
|
options.checkContext === true ||
|
|
1529
|
-
options.autoPmContext === true;
|
|
1530
|
-
|
|
1495
|
+
options.autoPmContext === true);
|
|
1496
|
+
}
|
|
1497
|
+
function assertTestRunFlagUsage(options) {
|
|
1498
|
+
if (hasTestRuntimeDirectiveFlags(options) && options.run !== true) {
|
|
1531
1499
|
throw new PmCliError("--env-set, --env-clear, --shared-host-safe, --pm-context, --override-linked-pm-context, --fail-on-context-mismatch, --fail-on-skipped, --fail-on-empty-test-run, --require-assertions-for-pm, --check-context, and --auto-pm-context require --run", EXIT_CODE.USAGE);
|
|
1532
1500
|
}
|
|
1533
1501
|
const hasSelectorFlags = options.match !== undefined || options.onlyIndex !== undefined || options.onlyLast === true;
|
|
1534
1502
|
if (hasSelectorFlags && options.run !== true) {
|
|
1535
1503
|
throw new PmCliError("--match, --only-index, and --only-last require --run", EXIT_CODE.USAGE);
|
|
1536
1504
|
}
|
|
1505
|
+
}
|
|
1506
|
+
async function resolveLinkedTestItem(params) {
|
|
1507
|
+
const { id, options, pmRoot, settings, typeToFolder, adds, removes } = params;
|
|
1508
|
+
if (adds.length === 0 && removes.length === 0) {
|
|
1509
|
+
const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeToFolder);
|
|
1510
|
+
if (!located) {
|
|
1511
|
+
throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
|
|
1512
|
+
}
|
|
1513
|
+
const loaded = await readLocatedItem(located, { schema: settings.schema });
|
|
1514
|
+
return { itemId: located.id, tests: loaded.document.metadata.tests ?? [], changed: false };
|
|
1515
|
+
}
|
|
1516
|
+
const result = await mutateItem({
|
|
1517
|
+
pmRoot,
|
|
1518
|
+
settings,
|
|
1519
|
+
id,
|
|
1520
|
+
op: "tests_add",
|
|
1521
|
+
author: resolveAuthor(options.author, settings.author_default),
|
|
1522
|
+
message: options.message,
|
|
1523
|
+
force: options.force,
|
|
1524
|
+
skipNoop: true,
|
|
1525
|
+
mutate(document) {
|
|
1526
|
+
const previous = document.metadata.tests ?? [];
|
|
1527
|
+
const next = [...previous];
|
|
1528
|
+
for (const add of adds) {
|
|
1529
|
+
const exists = next.some((entry) => entry.command === add.command &&
|
|
1530
|
+
entry.path === add.path &&
|
|
1531
|
+
entry.scope === add.scope &&
|
|
1532
|
+
entry.pm_context_mode === add.pm_context_mode);
|
|
1533
|
+
if (!exists) {
|
|
1534
|
+
next.push(add);
|
|
1535
|
+
}
|
|
1536
|
+
}
|
|
1537
|
+
if (removes.length > 0) {
|
|
1538
|
+
for (let i = next.length - 1; i >= 0; i -= 1) {
|
|
1539
|
+
const entry = next[i];
|
|
1540
|
+
if (removes.includes(entry.path ?? "") || removes.includes(entry.command ?? "")) {
|
|
1541
|
+
next.splice(i, 1);
|
|
1542
|
+
}
|
|
1543
|
+
}
|
|
1544
|
+
}
|
|
1545
|
+
document.metadata.tests = next;
|
|
1546
|
+
return { changedFields: stableValueEquals(previous, next) ? [] : ["tests"] };
|
|
1547
|
+
},
|
|
1548
|
+
});
|
|
1549
|
+
return {
|
|
1550
|
+
itemId: result.item.id,
|
|
1551
|
+
tests: result.item.tests ?? [],
|
|
1552
|
+
changed: result.changedFields.length > 0,
|
|
1553
|
+
};
|
|
1554
|
+
}
|
|
1555
|
+
function resolveTestRunOptions(options, tests) {
|
|
1556
|
+
assertTestRunFlagUsage(options);
|
|
1537
1557
|
const selectorInput = {
|
|
1538
1558
|
match: options.match,
|
|
1539
1559
|
onlyIndex: options.onlyIndex === undefined ? undefined : parseOnlyIndexValue(options.onlyIndex),
|
|
1540
1560
|
onlyLast: options.onlyLast,
|
|
1541
1561
|
};
|
|
1542
1562
|
const runSelection = options.run === true ? resolveLinkedTestRunSelection(tests, selectorInput) : undefined;
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
:
|
|
1564
|
-
|
|
1565
|
-
|
|
1563
|
+
return {
|
|
1564
|
+
defaultTimeoutSeconds: options.timeout === undefined ? undefined : parseOptionalNumber(options.timeout, "timeout"),
|
|
1565
|
+
pmContextMode: parsePmContextMode(options.pmContext),
|
|
1566
|
+
runSelection,
|
|
1567
|
+
testsToRun: runSelection?.selected ?? tests,
|
|
1568
|
+
};
|
|
1569
|
+
}
|
|
1570
|
+
async function executeSelectedLinkedTests(params) {
|
|
1571
|
+
const { options, runOptions, pmRoot } = params;
|
|
1572
|
+
if (options.run !== true) {
|
|
1573
|
+
return [];
|
|
1574
|
+
}
|
|
1575
|
+
return await runLinkedTests(runOptions.testsToRun, runOptions.defaultTimeoutSeconds, {
|
|
1576
|
+
progress: options.progress,
|
|
1577
|
+
envSet: options.envSet,
|
|
1578
|
+
envClear: options.envClear,
|
|
1579
|
+
sharedHostSafe: options.sharedHostSafe,
|
|
1580
|
+
pmContext: runOptions.pmContextMode,
|
|
1581
|
+
overrideLinkedPmContext: options.overrideLinkedPmContext,
|
|
1582
|
+
failOnContextMismatch: options.failOnContextMismatch,
|
|
1583
|
+
failOnEmptyTestRun: options.failOnEmptyTestRun,
|
|
1584
|
+
requireAssertionsForPm: options.requireAssertionsForPm,
|
|
1585
|
+
checkContext: options.checkContext,
|
|
1586
|
+
autoPmContext: options.autoPmContext,
|
|
1587
|
+
sourceRoots: {
|
|
1588
|
+
projectPmRoot: pmRoot,
|
|
1589
|
+
globalPmRoot: resolveGlobalPmRoot(process.cwd()),
|
|
1590
|
+
},
|
|
1591
|
+
});
|
|
1592
|
+
}
|
|
1593
|
+
function buildTestWarnings(options, runSelection, runResults) {
|
|
1566
1594
|
const warnings = [];
|
|
1567
1595
|
if (runSelection && runSelection.selector !== null) {
|
|
1568
1596
|
warnings.push(`linked_test_selection:${runSelection.selector}=${runSelection.requested};selected=${runSelection.selected_count};skipped=${runSelection.skipped_count};indexes=${runSelection.selected_indexes.join(",")}`);
|
|
@@ -1574,58 +1602,96 @@ export async function runTest(id, options, global) {
|
|
|
1574
1602
|
`mismatches=${preflight.mismatches};` +
|
|
1575
1603
|
`auto_remediated=${preflight.auto_remediated}`);
|
|
1576
1604
|
}
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1605
|
+
return warnings;
|
|
1606
|
+
}
|
|
1607
|
+
async function recordTestRunSummary(params) {
|
|
1608
|
+
const { options, pmRoot, settings, itemId, runStartedAt, runResults, failOnSkippedTriggered, warnings } = params;
|
|
1609
|
+
if (options.run !== true || !runStartedAt || settings.testing.record_results_to_items !== true) {
|
|
1610
|
+
return;
|
|
1611
|
+
}
|
|
1612
|
+
const summary = summarizeRunResultStatuses(runResults);
|
|
1613
|
+
const trackedRunId = resolveTrackedRunId("test");
|
|
1614
|
+
const attemptRaw = process.env.PM_BACKGROUND_TEST_RUN_ATTEMPT?.trim();
|
|
1615
|
+
const parsedAttempt = attemptRaw ? Number.parseInt(attemptRaw, 10) : Number.NaN;
|
|
1616
|
+
const resumedFrom = process.env.PM_BACKGROUND_TEST_RUN_RESUMED_FROM?.trim();
|
|
1617
|
+
try {
|
|
1618
|
+
await appendTrackedTestRunSummary({
|
|
1619
|
+
pmRoot,
|
|
1620
|
+
settings,
|
|
1621
|
+
itemId,
|
|
1622
|
+
author: resolveAuthor(options.author, settings.author_default),
|
|
1623
|
+
message: `Track test run summary (${trackedRunId})`,
|
|
1624
|
+
entry: {
|
|
1625
|
+
run_id: trackedRunId,
|
|
1626
|
+
kind: "test",
|
|
1627
|
+
status: summary.failed > 0 || failOnSkippedTriggered === true ? "failed" : "passed",
|
|
1628
|
+
started_at: runStartedAt,
|
|
1629
|
+
finished_at: nowIso(),
|
|
1630
|
+
recorded_at: nowIso(),
|
|
1631
|
+
attempt: Number.isFinite(parsedAttempt) && parsedAttempt >= 1 ? parsedAttempt : undefined,
|
|
1632
|
+
resumed_from: resumedFrom && resumedFrom.length > 0 ? resumedFrom : undefined,
|
|
1633
|
+
passed: summary.passed,
|
|
1634
|
+
failed: summary.failed,
|
|
1635
|
+
skipped: summary.skipped,
|
|
1636
|
+
fail_on_skipped_triggered: failOnSkippedTriggered ? true : undefined,
|
|
1637
|
+
},
|
|
1638
|
+
});
|
|
1609
1639
|
}
|
|
1640
|
+
catch (error) {
|
|
1641
|
+
warnings.push(`test_result_tracking_failed:${itemId}:${error instanceof Error ? error.message : String(error)}`);
|
|
1642
|
+
}
|
|
1643
|
+
}
|
|
1644
|
+
/**
|
|
1645
|
+
* Implements run test for the public runtime surface of this module.
|
|
1646
|
+
*/
|
|
1647
|
+
export async function runTest(id, options, global) {
|
|
1648
|
+
const stdinResolver = createStdinTokenResolver();
|
|
1649
|
+
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
1650
|
+
if (!(await pathExists(getSettingsPath(pmRoot)))) {
|
|
1651
|
+
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
1652
|
+
}
|
|
1653
|
+
const settings = await readSettings(pmRoot);
|
|
1654
|
+
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
1655
|
+
const resolvedAdds = await stdinResolver.resolveList(options.add, "--add");
|
|
1656
|
+
const resolvedAddJsons = await stdinResolver.resolveList(options.addJson, "--add-json");
|
|
1657
|
+
const resolvedRemoves = await stdinResolver.resolveList(options.remove, "--remove");
|
|
1658
|
+
const adds = [...parseAddEntries(resolvedAdds), ...parseAddJsonEntries(resolvedAddJsons)];
|
|
1659
|
+
const removes = parseRemoveEntries(resolvedRemoves);
|
|
1660
|
+
const item = await resolveLinkedTestItem({
|
|
1661
|
+
id,
|
|
1662
|
+
options,
|
|
1663
|
+
pmRoot,
|
|
1664
|
+
settings,
|
|
1665
|
+
typeToFolder: typeRegistry.type_to_folder,
|
|
1666
|
+
adds,
|
|
1667
|
+
removes,
|
|
1668
|
+
});
|
|
1669
|
+
const runOptions = resolveTestRunOptions(options, item.tests);
|
|
1670
|
+
const runStartedAt = options.run === true ? nowIso() : undefined;
|
|
1671
|
+
const runResults = await executeSelectedLinkedTests({ options, runOptions, pmRoot });
|
|
1672
|
+
const failureCategories = countFailureCategories(runResults);
|
|
1673
|
+
const failOnSkippedTriggered = options.run === true && options.failOnSkipped === true && runResults.some((entry) => entry.status === "skipped");
|
|
1674
|
+
const warnings = buildTestWarnings(options, runOptions.runSelection, runResults);
|
|
1675
|
+
await recordTestRunSummary({ options, pmRoot, settings, itemId: item.itemId, runStartedAt, runResults, failOnSkippedTriggered, warnings });
|
|
1610
1676
|
return {
|
|
1611
1677
|
ok: runResults.every((entry) => entry.status !== "failed") && failOnSkippedTriggered !== true,
|
|
1612
|
-
id: itemId,
|
|
1613
|
-
tests,
|
|
1678
|
+
id: item.itemId,
|
|
1679
|
+
tests: item.tests,
|
|
1614
1680
|
run_results: runResults,
|
|
1615
1681
|
failure_categories: failureCategories,
|
|
1616
|
-
selection: runSelection
|
|
1682
|
+
selection: runOptions.runSelection
|
|
1617
1683
|
? {
|
|
1618
|
-
selector: runSelection.selector,
|
|
1619
|
-
requested: runSelection.requested,
|
|
1620
|
-
selected_indexes: runSelection.selected_indexes,
|
|
1621
|
-
selected_count: runSelection.selected_count,
|
|
1622
|
-
skipped_count: runSelection.skipped_count,
|
|
1684
|
+
selector: runOptions.runSelection.selector,
|
|
1685
|
+
requested: runOptions.runSelection.requested,
|
|
1686
|
+
selected_indexes: runOptions.runSelection.selected_indexes,
|
|
1687
|
+
selected_count: runOptions.runSelection.selected_count,
|
|
1688
|
+
skipped_count: runOptions.runSelection.skipped_count,
|
|
1623
1689
|
}
|
|
1624
1690
|
: undefined,
|
|
1625
1691
|
fail_on_skipped_triggered: failOnSkippedTriggered ? true : undefined,
|
|
1626
1692
|
warnings: warnings.length > 0 ? warnings : undefined,
|
|
1627
|
-
changed,
|
|
1628
|
-
count: tests.length,
|
|
1693
|
+
changed: item.changed,
|
|
1694
|
+
count: item.tests.length,
|
|
1629
1695
|
};
|
|
1630
1696
|
}
|
|
1631
1697
|
/* c8 ignore stop */
|
|
@@ -1656,4 +1722,4 @@ export const _testOnlyTestCommand = {
|
|
|
1656
1722
|
summarizeRunResultStatuses,
|
|
1657
1723
|
};
|
|
1658
1724
|
//# sourceMappingURL=test.js.map
|
|
1659
|
-
//# debugId=
|
|
1725
|
+
//# debugId=caa941ed-c848-506c-9a3c-3d4959be0246
|