@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
|
@@ -13,24 +13,24 @@ import {
|
|
|
13
13
|
parseLinkedTestMinLines,
|
|
14
14
|
parseLinkedTestRegexList,
|
|
15
15
|
parseLinkedTestStringList
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-Y4NRKBFW.js";
|
|
17
17
|
import {
|
|
18
18
|
createStdinTokenResolver,
|
|
19
19
|
parseCsvKv,
|
|
20
20
|
parseOptionalNumber
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-ZNHEYCDD.js";
|
|
22
22
|
import {
|
|
23
23
|
runInit
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-66Z3X7ZG.js";
|
|
25
25
|
import {
|
|
26
26
|
locateItem,
|
|
27
27
|
mutateItem,
|
|
28
28
|
readLocatedItem
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-JXAUVO6X.js";
|
|
30
30
|
import {
|
|
31
31
|
compareTimestampStrings,
|
|
32
32
|
nowIso
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-AIAIXG7I.js";
|
|
34
34
|
import {
|
|
35
35
|
EXIT_CODE,
|
|
36
36
|
ITEM_FILE_EXTENSIONS,
|
|
@@ -44,7 +44,7 @@ import {
|
|
|
44
44
|
resolveItemTypeRegistry,
|
|
45
45
|
resolvePmRoot,
|
|
46
46
|
stableValueEquals
|
|
47
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-7NSPKJUS.js";
|
|
48
48
|
|
|
49
49
|
// dist/cli/commands/test.js
|
|
50
50
|
import { spawn } from "node:child_process";
|
|
@@ -408,7 +408,7 @@ function firstPositionalToken(tokens) {
|
|
|
408
408
|
!(function() {
|
|
409
409
|
try {
|
|
410
410
|
var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
|
|
411
|
-
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "
|
|
411
|
+
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "caa941ed-c848-506c-9a3c-3d4959be0246");
|
|
412
412
|
} catch (e2) {
|
|
413
413
|
}
|
|
414
414
|
})();
|
|
@@ -644,23 +644,24 @@ function extractPmInvocationArgsFromSegment(segment) {
|
|
|
644
644
|
if (executable === "node" && args.length > 0 && isPmCliScriptToken(args[0])) {
|
|
645
645
|
return args.slice(1);
|
|
646
646
|
}
|
|
647
|
+
return extractPackageManagerPmInvocationArgs(executable, args);
|
|
648
|
+
}
|
|
649
|
+
function extractPackageManagerPmInvocationArgs(executable, args) {
|
|
650
|
+
const parsed = parsePackageManagerPmInvocation(executable, args);
|
|
651
|
+
if (!parsed || !isPmExecutableToken(parsed.command) && !isPmCliPackageToken(parsed.command)) {
|
|
652
|
+
return null;
|
|
653
|
+
}
|
|
654
|
+
return parsed.args;
|
|
655
|
+
}
|
|
656
|
+
function parsePackageManagerPmInvocation(executable, args) {
|
|
647
657
|
if (executable === "npx" || executable === "bunx") {
|
|
648
|
-
|
|
649
|
-
if (parsed && (isPmExecutableToken(parsed.command) || isPmCliPackageToken(parsed.command))) {
|
|
650
|
-
return parsed.args;
|
|
651
|
-
}
|
|
658
|
+
return parseNpxCommand(args);
|
|
652
659
|
}
|
|
653
660
|
if (executable === "pnpm") {
|
|
654
|
-
|
|
655
|
-
if (parsed && (isPmExecutableToken(parsed.command) || isPmCliPackageToken(parsed.command))) {
|
|
656
|
-
return parsed.args;
|
|
657
|
-
}
|
|
661
|
+
return parsePnpmDlxCommand(args);
|
|
658
662
|
}
|
|
659
663
|
if (executable === "npm") {
|
|
660
|
-
|
|
661
|
-
if (parsed && (isPmExecutableToken(parsed.command) || isPmCliPackageToken(parsed.command))) {
|
|
662
|
-
return parsed.args;
|
|
663
|
-
}
|
|
664
|
+
return parseNpmExecCommand(args);
|
|
664
665
|
}
|
|
665
666
|
return null;
|
|
666
667
|
}
|
|
@@ -804,29 +805,21 @@ function segmentInvokesUnsafeDirectTestRunner(normalizedSegment) {
|
|
|
804
805
|
return true;
|
|
805
806
|
}
|
|
806
807
|
if (executable === "node") {
|
|
807
|
-
return
|
|
808
|
+
return nodeArgsInvokeUnsafeDirectTestRunner(args);
|
|
808
809
|
}
|
|
810
|
+
return packageManagerInvokesUnsafeDirectTestRunner(executable, args);
|
|
811
|
+
}
|
|
812
|
+
function nodeArgsInvokeUnsafeDirectTestRunner(args) {
|
|
813
|
+
return args.includes("--test") || args.some((arg) => arg === "vitest" || arg === "vitest.mjs" || arg.endsWith("/vitest") || arg.endsWith("/vitest.mjs"));
|
|
814
|
+
}
|
|
815
|
+
function packageManagerInvokesUnsafeDirectTestRunner(executable, args) {
|
|
809
816
|
if (executable === "npx" || executable === "bunx") {
|
|
810
817
|
return isDirectTestRunnerSubcommand(parseNpxCommand(args)?.command);
|
|
811
818
|
}
|
|
812
|
-
if (executable === "pnpm") {
|
|
813
|
-
|
|
814
|
-
if (isDirectTestRunnerSubcommand(dlx?.command)) {
|
|
815
|
-
return true;
|
|
816
|
-
}
|
|
817
|
-
return firstDirectTestRunnerSubcommand(executable, args) === "vitest";
|
|
818
|
-
}
|
|
819
|
-
if (executable === "npm") {
|
|
820
|
-
const exec = parseNpmExecCommand(args);
|
|
821
|
-
if (isDirectTestRunnerSubcommand(exec?.command)) {
|
|
822
|
-
return true;
|
|
823
|
-
}
|
|
824
|
-
return firstDirectTestRunnerSubcommand(executable, args) === "vitest";
|
|
825
|
-
}
|
|
826
|
-
if (executable === "yarn" || executable === "bun") {
|
|
827
|
-
return firstDirectTestRunnerSubcommand(executable, args) === "vitest";
|
|
819
|
+
if (executable === "pnpm" || executable === "npm") {
|
|
820
|
+
return isDirectTestRunnerSubcommand(parsePackageManagerPmInvocation(executable, args)?.command) || firstDirectTestRunnerSubcommand(executable, args) === "vitest";
|
|
828
821
|
}
|
|
829
|
-
return
|
|
822
|
+
return (executable === "yarn" || executable === "bun") && firstDirectTestRunnerSubcommand(executable, args) === "vitest";
|
|
830
823
|
}
|
|
831
824
|
function assertSandboxSafeTestRunnerCommand(command) {
|
|
832
825
|
const normalized = normalizeCommandForValidation(command);
|
|
@@ -845,48 +838,46 @@ function getRuntimeSafetySkipReason(command) {
|
|
|
845
838
|
function parseAddEntries(raw) {
|
|
846
839
|
if (!raw)
|
|
847
840
|
return [];
|
|
848
|
-
return raw.map(
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
};
|
|
889
|
-
});
|
|
841
|
+
return raw.map(parseAddEntry);
|
|
842
|
+
}
|
|
843
|
+
function parseAddEntry(entry) {
|
|
844
|
+
const trimmed = entry.trim();
|
|
845
|
+
const kv = looksLikeStructuredLinkedTestEntry(trimmed) ? normalizeStructuredLinkedTestEntry(parseCsvKv(entry, "--add"), "--add") : { command: trimmed };
|
|
846
|
+
const command = trimLinkedTestEntryField(kv.command);
|
|
847
|
+
if (!command) {
|
|
848
|
+
throw new PmCliError("--add requires command=<value> or a bare command (path=<value> is optional metadata)", EXIT_CODE.USAGE);
|
|
849
|
+
}
|
|
850
|
+
assertNoRecursiveTestAllCommand(command);
|
|
851
|
+
assertSandboxSafeTestRunnerCommand(command);
|
|
852
|
+
return {
|
|
853
|
+
command,
|
|
854
|
+
path: trimLinkedTestEntryField(kv.path),
|
|
855
|
+
scope: ensureScope(kv.scope),
|
|
856
|
+
timeout_seconds: parseLinkedTestTimeoutSeconds(trimLinkedTestEntryField(kv.timeout_seconds), trimLinkedTestEntryField(kv.timeout)),
|
|
857
|
+
pm_context_mode: parseLinkedTestContextMode(trimLinkedTestEntryField(kv.pm_context_mode), "--add"),
|
|
858
|
+
env_set: parseLinkedTestEnvSet(trimLinkedTestEntryField(kv.env_set), "--add"),
|
|
859
|
+
env_clear: parseLinkedTestEnvClear(trimLinkedTestEntryField(kv.env_clear), "--add"),
|
|
860
|
+
shared_host_safe: parseLinkedTestBoolean(trimLinkedTestEntryField(kv.shared_host_safe), "--add", "shared_host_safe"),
|
|
861
|
+
assert_stdout_contains: parseLinkedTestStringList(trimLinkedTestEntryField(kv.assert_stdout_contains)),
|
|
862
|
+
assert_stdout_regex: parseLinkedTestRegexList(trimLinkedTestEntryField(kv.assert_stdout_regex), "--add", "assert_stdout_regex"),
|
|
863
|
+
assert_stderr_contains: parseLinkedTestStringList(trimLinkedTestEntryField(kv.assert_stderr_contains)),
|
|
864
|
+
assert_stderr_regex: parseLinkedTestRegexList(trimLinkedTestEntryField(kv.assert_stderr_regex), "--add", "assert_stderr_regex"),
|
|
865
|
+
assert_stdout_min_lines: parseLinkedTestMinLines(trimLinkedTestEntryField(kv.assert_stdout_min_lines), "--add"),
|
|
866
|
+
assert_json_field_equals: parseLinkedTestAssertionEqualsMap(trimLinkedTestEntryField(kv.assert_json_field_equals), "--add"),
|
|
867
|
+
assert_json_field_gte: parseLinkedTestAssertionGteMap(trimLinkedTestEntryField(kv.assert_json_field_gte), "--add"),
|
|
868
|
+
note: trimLinkedTestEntryField(kv.note)
|
|
869
|
+
};
|
|
870
|
+
}
|
|
871
|
+
function trimLinkedTestEntryField(value) {
|
|
872
|
+
const trimmed = value?.trim();
|
|
873
|
+
return trimmed && trimmed.length > 0 ? trimmed : void 0;
|
|
874
|
+
}
|
|
875
|
+
function parseLinkedTestTimeoutSeconds(timeoutSecondsRaw, timeoutAliasRaw) {
|
|
876
|
+
if (timeoutSecondsRaw && timeoutAliasRaw && timeoutSecondsRaw !== timeoutAliasRaw) {
|
|
877
|
+
throw new PmCliError("--add timeout and timeout_seconds must match when both are provided", EXIT_CODE.USAGE);
|
|
878
|
+
}
|
|
879
|
+
const timeoutRaw = timeoutSecondsRaw ?? timeoutAliasRaw;
|
|
880
|
+
return timeoutRaw === void 0 ? void 0 : Math.floor(parseOptionalNumber(timeoutRaw, "timeout_seconds"));
|
|
890
881
|
}
|
|
891
882
|
function parseAddJsonEntries(raw) {
|
|
892
883
|
if (!raw)
|
|
@@ -1415,42 +1406,11 @@ function compareAssertionValues(actual, expected) {
|
|
|
1415
1406
|
}
|
|
1416
1407
|
function evaluateLinkedTestAssertions(linkedTest, stdout, stderr) {
|
|
1417
1408
|
const failures = [];
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
for (const pattern of linkedTest.assert_stdout_regex ?? []) {
|
|
1424
|
-
try {
|
|
1425
|
-
const regex = new RegExp(pattern, "m");
|
|
1426
|
-
if (!regex.test(stdout)) {
|
|
1427
|
-
failures.push(`stdout failed regex assertion: /${pattern}/m`);
|
|
1428
|
-
}
|
|
1429
|
-
} catch (error) {
|
|
1430
|
-
failures.push(`stdout regex assertion is invalid: /${pattern}/ (${error instanceof Error ? error.message : String(error)})`);
|
|
1431
|
-
}
|
|
1432
|
-
}
|
|
1433
|
-
for (const expected of linkedTest.assert_stderr_contains ?? []) {
|
|
1434
|
-
if (!stderr.includes(expected)) {
|
|
1435
|
-
failures.push(`stderr missing required text: "${expected}"`);
|
|
1436
|
-
}
|
|
1437
|
-
}
|
|
1438
|
-
for (const pattern of linkedTest.assert_stderr_regex ?? []) {
|
|
1439
|
-
try {
|
|
1440
|
-
const regex = new RegExp(pattern, "m");
|
|
1441
|
-
if (!regex.test(stderr)) {
|
|
1442
|
-
failures.push(`stderr failed regex assertion: /${pattern}/m`);
|
|
1443
|
-
}
|
|
1444
|
-
} catch (error) {
|
|
1445
|
-
failures.push(`stderr regex assertion is invalid: /${pattern}/ (${error instanceof Error ? error.message : String(error)})`);
|
|
1446
|
-
}
|
|
1447
|
-
}
|
|
1448
|
-
if (typeof linkedTest.assert_stdout_min_lines === "number") {
|
|
1449
|
-
const lineCount = stdout.split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0).length;
|
|
1450
|
-
if (lineCount < linkedTest.assert_stdout_min_lines) {
|
|
1451
|
-
failures.push(`stdout line count ${lineCount} is below required minimum ${linkedTest.assert_stdout_min_lines}`);
|
|
1452
|
-
}
|
|
1453
|
-
}
|
|
1409
|
+
failures.push(...evaluateContainsAssertions("stdout", stdout, linkedTest.assert_stdout_contains));
|
|
1410
|
+
failures.push(...evaluateRegexAssertions("stdout", stdout, linkedTest.assert_stdout_regex));
|
|
1411
|
+
failures.push(...evaluateContainsAssertions("stderr", stderr, linkedTest.assert_stderr_contains));
|
|
1412
|
+
failures.push(...evaluateRegexAssertions("stderr", stderr, linkedTest.assert_stderr_regex));
|
|
1413
|
+
failures.push(...evaluateStdoutLineCountAssertion(stdout, linkedTest.assert_stdout_min_lines));
|
|
1454
1414
|
const jsonEqualsAssertions = linkedTest.assert_json_field_equals ?? {};
|
|
1455
1415
|
const jsonGteAssertions = linkedTest.assert_json_field_gte ?? {};
|
|
1456
1416
|
const needsJsonAssertions = Object.keys(jsonEqualsAssertions).length > 0 || Object.keys(jsonGteAssertions).length > 0;
|
|
@@ -1491,6 +1451,36 @@ function evaluateLinkedTestAssertions(linkedTest, stdout, stderr) {
|
|
|
1491
1451
|
}
|
|
1492
1452
|
return failures;
|
|
1493
1453
|
}
|
|
1454
|
+
function evaluateContainsAssertions(streamName, output, expectedValues) {
|
|
1455
|
+
const failures = [];
|
|
1456
|
+
for (const expected of expectedValues ?? []) {
|
|
1457
|
+
if (!output.includes(expected)) {
|
|
1458
|
+
failures.push(`${streamName} missing required text: "${expected}"`);
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1461
|
+
return failures;
|
|
1462
|
+
}
|
|
1463
|
+
function evaluateRegexAssertions(streamName, output, patterns) {
|
|
1464
|
+
const failures = [];
|
|
1465
|
+
for (const pattern of patterns ?? []) {
|
|
1466
|
+
try {
|
|
1467
|
+
const regex = new RegExp(pattern, "m");
|
|
1468
|
+
if (!regex.test(output)) {
|
|
1469
|
+
failures.push(`${streamName} failed regex assertion: /${pattern}/m`);
|
|
1470
|
+
}
|
|
1471
|
+
} catch (error) {
|
|
1472
|
+
failures.push(`${streamName} regex assertion is invalid: /${pattern}/ (${error instanceof Error ? error.message : String(error)})`);
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
return failures;
|
|
1476
|
+
}
|
|
1477
|
+
function evaluateStdoutLineCountAssertion(stdout, minimum) {
|
|
1478
|
+
if (typeof minimum !== "number") {
|
|
1479
|
+
return [];
|
|
1480
|
+
}
|
|
1481
|
+
const lineCount = stdout.split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0).length;
|
|
1482
|
+
return lineCount < minimum ? [`stdout line count ${lineCount} is below required minimum ${minimum}`] : [];
|
|
1483
|
+
}
|
|
1494
1484
|
var EMPTY_LINKED_TEST_RUN_PATTERNS = [
|
|
1495
1485
|
{ code: "no_projects_matched_filters", regex: /\bNo projects matched the filters\b/i },
|
|
1496
1486
|
{ code: "no_test_files_found", regex: /\bNo test files found\b/i },
|
|
@@ -1508,300 +1498,343 @@ ${stderr}`;
|
|
|
1508
1498
|
}
|
|
1509
1499
|
return null;
|
|
1510
1500
|
}
|
|
1501
|
+
function createLinkedTestSandboxLayout(sandboxRoot) {
|
|
1502
|
+
return {
|
|
1503
|
+
root: sandboxRoot,
|
|
1504
|
+
schemaProjectPmPath: path.join(sandboxRoot, "schema", "project", ".agents", "pm"),
|
|
1505
|
+
schemaGlobalPmPath: path.join(sandboxRoot, "schema", "global"),
|
|
1506
|
+
trackerProjectPmPath: path.join(sandboxRoot, "tracker", "project", ".agents", "pm"),
|
|
1507
|
+
trackerGlobalPmPath: path.join(sandboxRoot, "tracker", "global")
|
|
1508
|
+
};
|
|
1509
|
+
}
|
|
1510
|
+
async function initializeLinkedTestSandboxes(layout) {
|
|
1511
|
+
await runInit(void 0, { path: layout.schemaProjectPmPath });
|
|
1512
|
+
await runInit(void 0, { path: layout.schemaGlobalPmPath });
|
|
1513
|
+
await runInit(void 0, { path: layout.trackerProjectPmPath });
|
|
1514
|
+
await runInit(void 0, { path: layout.trackerGlobalPmPath });
|
|
1515
|
+
}
|
|
1516
|
+
async function seedLinkedTestSandboxesFromSource(layout, sourceRoots) {
|
|
1517
|
+
if (!sourceRoots) {
|
|
1518
|
+
return;
|
|
1519
|
+
}
|
|
1520
|
+
await seedLinkedTestSandbox(layout.schemaProjectPmPath, layout.schemaGlobalPmPath, sourceRoots);
|
|
1521
|
+
await seedLinkedTestSandbox(layout.trackerProjectPmPath, layout.trackerGlobalPmPath, sourceRoots);
|
|
1522
|
+
await seedLinkedTestTrackerData(sourceRoots.projectPmRoot, layout.trackerProjectPmPath);
|
|
1523
|
+
await seedLinkedTestTrackerData(sourceRoots.globalPmRoot, layout.trackerGlobalPmPath);
|
|
1524
|
+
}
|
|
1525
|
+
async function countLinkedTestSandboxItems(layout, sourceRoots) {
|
|
1526
|
+
return {
|
|
1527
|
+
sourceProjectItemCount: sourceRoots ? await countLinkedTestItemFiles(sourceRoots.projectPmRoot) : 0,
|
|
1528
|
+
sourceGlobalItemCount: sourceRoots ? await countLinkedTestItemFiles(sourceRoots.globalPmRoot) : 0,
|
|
1529
|
+
schemaProjectItemCount: await countLinkedTestItemFiles(layout.schemaProjectPmPath),
|
|
1530
|
+
schemaGlobalItemCount: await countLinkedTestItemFiles(layout.schemaGlobalPmPath),
|
|
1531
|
+
trackerProjectItemCount: await countLinkedTestItemFiles(layout.trackerProjectPmPath),
|
|
1532
|
+
trackerGlobalItemCount: await countLinkedTestItemFiles(layout.trackerGlobalPmPath)
|
|
1533
|
+
};
|
|
1534
|
+
}
|
|
1535
|
+
function buildLinkedTestExecutionContext(params) {
|
|
1536
|
+
const trackerMode = params.effectivePmContextMode === "tracker";
|
|
1537
|
+
const selectedSandboxProjectPmPath = trackerMode ? params.layout.trackerProjectPmPath : params.layout.schemaProjectPmPath;
|
|
1538
|
+
const selectedSandboxGlobalPmPath = trackerMode ? params.layout.trackerGlobalPmPath : params.layout.schemaGlobalPmPath;
|
|
1539
|
+
const selectedSandboxProjectItemCount = trackerMode ? params.counts.trackerProjectItemCount : params.counts.schemaProjectItemCount;
|
|
1540
|
+
const selectedSandboxGlobalItemCount = trackerMode ? params.counts.trackerGlobalItemCount : params.counts.schemaGlobalItemCount;
|
|
1541
|
+
return {
|
|
1542
|
+
requested_pm_context_mode: params.requestedPmContextMode,
|
|
1543
|
+
pm_context_mode: params.effectivePmContextMode,
|
|
1544
|
+
auto_pm_context_applied: params.autoPmContextApplied,
|
|
1545
|
+
is_pm_command: params.isPmCommand,
|
|
1546
|
+
is_pm_tracker_read_command: params.isPmTrackerReadCommand,
|
|
1547
|
+
source_project_pm_path: params.sourceRoots?.projectPmRoot ?? "",
|
|
1548
|
+
sandbox_project_pm_path: selectedSandboxProjectPmPath,
|
|
1549
|
+
source_global_pm_path: params.sourceRoots?.globalPmRoot ?? "",
|
|
1550
|
+
sandbox_global_pm_path: selectedSandboxGlobalPmPath,
|
|
1551
|
+
source_project_item_count: params.counts.sourceProjectItemCount,
|
|
1552
|
+
sandbox_project_item_count: selectedSandboxProjectItemCount,
|
|
1553
|
+
source_global_item_count: params.counts.sourceGlobalItemCount,
|
|
1554
|
+
sandbox_global_item_count: selectedSandboxGlobalItemCount,
|
|
1555
|
+
mismatch_detected: params.isPmCommand && params.counts.sourceProjectItemCount !== selectedSandboxProjectItemCount,
|
|
1556
|
+
project_extensions_seeded: Boolean(params.sourceRoots),
|
|
1557
|
+
global_extensions_seeded: Boolean(params.sourceRoots)
|
|
1558
|
+
};
|
|
1559
|
+
}
|
|
1560
|
+
function resolveLinkedTestCommandContext(params) {
|
|
1561
|
+
const linkedOverridePmContextMode = typeof params.linkedTest.pm_context_mode === "string" && params.linkedTest.pm_context_mode.trim().length > 0 ? parsePmContextMode(params.linkedTest.pm_context_mode) : void 0;
|
|
1562
|
+
const command = typeof params.linkedTest.command === "string" && params.linkedTest.command.length > 0 ? params.linkedTest.command : void 0;
|
|
1563
|
+
const isPmCommand = command ? commandInvokesPmCli(command) : false;
|
|
1564
|
+
const isPmTrackerReadCommand = isPmCommand && command ? commandInvokesPmTrackerReadCommand(command) : false;
|
|
1565
|
+
const autoPmContextApplied = params.options?.autoPmContext === true && isPmTrackerReadCommand;
|
|
1566
|
+
const requestedPmContextMode = autoPmContextApplied ? "auto" : resolveLinkedTestRequestedContextMode(params.linkedTest, params.runLevelPmContextMode, params.options?.overrideLinkedPmContext === true);
|
|
1567
|
+
const effectivePmContextMode = resolveLinkedTestEffectiveContextMode(requestedPmContextMode, isPmTrackerReadCommand);
|
|
1568
|
+
return {
|
|
1569
|
+
linkedOverridePmContextMode,
|
|
1570
|
+
executionContext: buildLinkedTestExecutionContext({
|
|
1571
|
+
layout: params.layout,
|
|
1572
|
+
counts: params.counts,
|
|
1573
|
+
sourceRoots: params.sourceRoots,
|
|
1574
|
+
isPmCommand,
|
|
1575
|
+
isPmTrackerReadCommand,
|
|
1576
|
+
requestedPmContextMode,
|
|
1577
|
+
effectivePmContextMode,
|
|
1578
|
+
autoPmContextApplied
|
|
1579
|
+
})
|
|
1580
|
+
};
|
|
1581
|
+
}
|
|
1582
|
+
function buildLinkedTestSkippedResult(linkedTest, executionContext, error) {
|
|
1583
|
+
return {
|
|
1584
|
+
command: linkedTest.command,
|
|
1585
|
+
path: linkedTest.path,
|
|
1586
|
+
status: "skipped",
|
|
1587
|
+
execution_context: executionContext,
|
|
1588
|
+
error
|
|
1589
|
+
};
|
|
1590
|
+
}
|
|
1591
|
+
function buildLinkedTestAssertionFailureResult(linkedTest, executionContext, error, output) {
|
|
1592
|
+
return {
|
|
1593
|
+
command: linkedTest.command,
|
|
1594
|
+
path: linkedTest.path,
|
|
1595
|
+
status: "failed",
|
|
1596
|
+
exit_code: 1,
|
|
1597
|
+
failure_category: "assertion_failure",
|
|
1598
|
+
execution_context: executionContext,
|
|
1599
|
+
...output ? { stdout: output.stdout, stderr: output.stderr } : {},
|
|
1600
|
+
error
|
|
1601
|
+
};
|
|
1602
|
+
}
|
|
1603
|
+
function resolveLinkedTestPreflightResult(params) {
|
|
1604
|
+
if (!params.linkedTest.command) {
|
|
1605
|
+
return buildLinkedTestSkippedResult(params.linkedTest, params.executionContext, "No command configured for this linked test.");
|
|
1606
|
+
}
|
|
1607
|
+
const runtimeSafetySkipReason = getRuntimeSafetySkipReason(params.linkedTest.command);
|
|
1608
|
+
if (runtimeSafetySkipReason) {
|
|
1609
|
+
return buildLinkedTestSkippedResult(params.linkedTest, params.executionContext, runtimeSafetySkipReason);
|
|
1610
|
+
}
|
|
1611
|
+
const failOnMismatchByDefault = params.executionContext.pm_context_mode === "schema" && params.executionContext.is_pm_tracker_read_command && params.executionContext.mismatch_detected;
|
|
1612
|
+
const failOnMismatchByFlag = params.options?.failOnContextMismatch === true && params.executionContext.is_pm_command && params.executionContext.mismatch_detected;
|
|
1613
|
+
if (failOnMismatchByDefault || failOnMismatchByFlag) {
|
|
1614
|
+
const mismatchHint = buildPmContextMismatchHint({
|
|
1615
|
+
executionContext: params.executionContext,
|
|
1616
|
+
runLevelPmContextMode: params.runLevelPmContextMode,
|
|
1617
|
+
linkedOverridePmContextMode: params.linkedOverridePmContextMode
|
|
1618
|
+
});
|
|
1619
|
+
const mismatchPrefix = params.options?.checkContext === true ? "Linked test preflight PM context mismatch detected" : "Linked test PM context mismatch detected";
|
|
1620
|
+
return buildLinkedTestAssertionFailureResult(params.linkedTest, params.executionContext, `${mismatchPrefix} (source_project_items=${params.executionContext.source_project_item_count}, sandbox_project_items=${params.executionContext.sandbox_project_item_count}).${mismatchHint}`);
|
|
1621
|
+
}
|
|
1622
|
+
if (params.options?.requireAssertionsForPm === true && params.executionContext.is_pm_command && !hasLinkedTestAssertions(params.linkedTest)) {
|
|
1623
|
+
return buildLinkedTestAssertionFailureResult(params.linkedTest, params.executionContext, "Linked PM command requires assertions when --require-assertions-for-pm is enabled.");
|
|
1624
|
+
}
|
|
1625
|
+
return null;
|
|
1626
|
+
}
|
|
1627
|
+
function buildLinkedTestExecutionEnv(params) {
|
|
1628
|
+
const effectiveDirectives = resolveEffectiveLinkedTestDirectives(params.runtimeDirectives, params.linkedTest);
|
|
1629
|
+
const executionEnv = { ...process.env };
|
|
1630
|
+
applyEnvDirectiveStage(executionEnv, params.runtimeDirectives);
|
|
1631
|
+
applyEnvDirectiveStage(executionEnv, {
|
|
1632
|
+
env_set: params.linkedTest.env_set ?? {},
|
|
1633
|
+
env_clear: params.linkedTest.env_clear ?? []
|
|
1634
|
+
});
|
|
1635
|
+
if (effectiveDirectives.shared_host_safe) {
|
|
1636
|
+
applySharedHostSafeDefaults(executionEnv);
|
|
1637
|
+
}
|
|
1638
|
+
executionEnv.FORCE_COLOR = "0";
|
|
1639
|
+
executionEnv.PM_PATH = params.executionContext.sandbox_project_pm_path;
|
|
1640
|
+
executionEnv.PM_GLOBAL_PATH = params.executionContext.sandbox_global_pm_path;
|
|
1641
|
+
return executionEnv;
|
|
1642
|
+
}
|
|
1643
|
+
function buildLinkedTestPassedResult(linkedTest, executionContext, execution) {
|
|
1644
|
+
return {
|
|
1645
|
+
command: linkedTest.command,
|
|
1646
|
+
path: linkedTest.path,
|
|
1647
|
+
status: "passed",
|
|
1648
|
+
exit_code: 0,
|
|
1649
|
+
execution_context: executionContext,
|
|
1650
|
+
stdout: execution.stdout,
|
|
1651
|
+
stderr: execution.stderr
|
|
1652
|
+
};
|
|
1653
|
+
}
|
|
1654
|
+
function buildLinkedTestEmptyRunResult(params) {
|
|
1655
|
+
return {
|
|
1656
|
+
command: params.linkedTest.command,
|
|
1657
|
+
path: params.linkedTest.path,
|
|
1658
|
+
status: "failed",
|
|
1659
|
+
exit_code: 1,
|
|
1660
|
+
failure_category: "empty_run",
|
|
1661
|
+
execution_context: params.executionContext,
|
|
1662
|
+
stdout: params.execution.stdout,
|
|
1663
|
+
stderr: params.execution.stderr,
|
|
1664
|
+
error: `Linked test reported an empty test run (${params.emptyRunSignal}) while --fail-on-empty-test-run is enabled. Update test selection or disable --fail-on-empty-test-run for this run.`
|
|
1665
|
+
};
|
|
1666
|
+
}
|
|
1667
|
+
function buildLinkedTestCommandFailureResult(params) {
|
|
1668
|
+
return {
|
|
1669
|
+
command: params.linkedTest.command,
|
|
1670
|
+
path: params.linkedTest.path,
|
|
1671
|
+
status: "failed",
|
|
1672
|
+
exit_code: resolveLinkedTestFailureExitCode(params.execution),
|
|
1673
|
+
failure_category: classifyLinkedTestFailure(params.execution),
|
|
1674
|
+
execution_context: params.executionContext,
|
|
1675
|
+
stdout: params.execution.stdout,
|
|
1676
|
+
stderr: params.execution.stderr,
|
|
1677
|
+
error: formatLinkedTestExecutionError(params.execution, params.timeoutMs)
|
|
1678
|
+
};
|
|
1679
|
+
}
|
|
1680
|
+
function buildLinkedTestPassedExecutionResult(params) {
|
|
1681
|
+
if (params.options?.failOnEmptyTestRun === true) {
|
|
1682
|
+
const emptyRunSignal = detectEmptyLinkedTestRun(params.execution.stdout, params.execution.stderr);
|
|
1683
|
+
if (emptyRunSignal) {
|
|
1684
|
+
return buildLinkedTestEmptyRunResult({ ...params, emptyRunSignal });
|
|
1685
|
+
}
|
|
1686
|
+
}
|
|
1687
|
+
const assertionFailures = evaluateLinkedTestAssertions(params.linkedTest, params.execution.stdout, params.execution.stderr);
|
|
1688
|
+
if (assertionFailures.length > 0) {
|
|
1689
|
+
return buildLinkedTestAssertionFailureResult(params.linkedTest, params.executionContext, `Linked test assertion(s) failed: ${assertionFailures.join("; ")}`, params.execution);
|
|
1690
|
+
}
|
|
1691
|
+
return buildLinkedTestPassedResult(params.linkedTest, params.executionContext, params.execution);
|
|
1692
|
+
}
|
|
1693
|
+
async function runSingleLinkedTest(params) {
|
|
1694
|
+
const command = params.linkedTest.command ?? "";
|
|
1695
|
+
const timeoutMs = (params.linkedTest.timeout_seconds ?? params.defaultTimeoutSeconds ?? 120) * 1e3;
|
|
1696
|
+
const execution = await runLinkedTestCommand(command, timeoutMs, buildLinkedTestExecutionEnv(params), {
|
|
1697
|
+
index: params.index + 1,
|
|
1698
|
+
total: params.total,
|
|
1699
|
+
timeoutMs,
|
|
1700
|
+
command
|
|
1701
|
+
}, params.progressMode);
|
|
1702
|
+
const passed = execution.exitCode === 0 && !execution.timedOut && !execution.maxBufferExceeded;
|
|
1703
|
+
return passed ? buildLinkedTestPassedExecutionResult({ ...params, execution }) : buildLinkedTestCommandFailureResult({ ...params, execution, timeoutMs });
|
|
1704
|
+
}
|
|
1511
1705
|
async function runLinkedTests(tests, defaultTimeoutSeconds, options) {
|
|
1512
1706
|
const results = [];
|
|
1513
1707
|
const sandboxRoot = await mkdtemp(path.join(tmpdir(), "pm-linked-test-"));
|
|
1514
|
-
const
|
|
1515
|
-
const schemaSandboxGlobalPath = path.join(sandboxRoot, "schema", "global");
|
|
1516
|
-
const trackerSandboxPmPath = path.join(sandboxRoot, "tracker", "project", ".agents", "pm");
|
|
1517
|
-
const trackerSandboxGlobalPath = path.join(sandboxRoot, "tracker", "global");
|
|
1708
|
+
const layout = createLinkedTestSandboxLayout(sandboxRoot);
|
|
1518
1709
|
const runLevelPmContextMode = parsePmContextMode(options?.pmContext);
|
|
1519
1710
|
const progressMode = options?.progress === true ? "always" : "auto";
|
|
1520
1711
|
const runtimeDirectives = resolveRuntimeDirectives(options?.envSet, options?.envClear, options?.sharedHostSafe);
|
|
1521
|
-
let sourceProjectItemCount = 0;
|
|
1522
|
-
let sourceGlobalItemCount = 0;
|
|
1523
|
-
let schemaSandboxProjectItemCount = 0;
|
|
1524
|
-
let schemaSandboxGlobalItemCount = 0;
|
|
1525
|
-
let trackerSandboxProjectItemCount = 0;
|
|
1526
|
-
let trackerSandboxGlobalItemCount = 0;
|
|
1527
1712
|
const sourceRoots = options?.sourceRoots;
|
|
1528
|
-
const projectExtensionsSeeded = Boolean(sourceRoots);
|
|
1529
|
-
const globalExtensionsSeeded = Boolean(sourceRoots);
|
|
1530
1713
|
try {
|
|
1531
|
-
await
|
|
1532
|
-
await
|
|
1533
|
-
await
|
|
1534
|
-
await runInit(void 0, { path: trackerSandboxGlobalPath });
|
|
1535
|
-
if (sourceRoots) {
|
|
1536
|
-
await seedLinkedTestSandbox(schemaSandboxPmPath, schemaSandboxGlobalPath, sourceRoots);
|
|
1537
|
-
await seedLinkedTestSandbox(trackerSandboxPmPath, trackerSandboxGlobalPath, sourceRoots);
|
|
1538
|
-
await seedLinkedTestTrackerData(sourceRoots.projectPmRoot, trackerSandboxPmPath);
|
|
1539
|
-
await seedLinkedTestTrackerData(sourceRoots.globalPmRoot, trackerSandboxGlobalPath);
|
|
1540
|
-
sourceProjectItemCount = await countLinkedTestItemFiles(sourceRoots.projectPmRoot);
|
|
1541
|
-
sourceGlobalItemCount = await countLinkedTestItemFiles(sourceRoots.globalPmRoot);
|
|
1542
|
-
}
|
|
1543
|
-
schemaSandboxProjectItemCount = await countLinkedTestItemFiles(schemaSandboxPmPath);
|
|
1544
|
-
schemaSandboxGlobalItemCount = await countLinkedTestItemFiles(schemaSandboxGlobalPath);
|
|
1545
|
-
trackerSandboxProjectItemCount = await countLinkedTestItemFiles(trackerSandboxPmPath);
|
|
1546
|
-
trackerSandboxGlobalItemCount = await countLinkedTestItemFiles(trackerSandboxGlobalPath);
|
|
1547
|
-
const buildExecutionContext = (isPmCommand, isPmTrackerReadCommand, requestedPmContextMode, effectivePmContextMode, autoPmContextApplied) => {
|
|
1548
|
-
const selectedSandboxProjectPmPath = effectivePmContextMode === "tracker" ? trackerSandboxPmPath : schemaSandboxPmPath;
|
|
1549
|
-
const selectedSandboxGlobalPmPath = effectivePmContextMode === "tracker" ? trackerSandboxGlobalPath : schemaSandboxGlobalPath;
|
|
1550
|
-
const selectedSandboxProjectItemCount = effectivePmContextMode === "tracker" ? trackerSandboxProjectItemCount : schemaSandboxProjectItemCount;
|
|
1551
|
-
const selectedSandboxGlobalItemCount = effectivePmContextMode === "tracker" ? trackerSandboxGlobalItemCount : schemaSandboxGlobalItemCount;
|
|
1552
|
-
const mismatchDetected = isPmCommand && sourceProjectItemCount !== selectedSandboxProjectItemCount;
|
|
1553
|
-
return {
|
|
1554
|
-
requested_pm_context_mode: requestedPmContextMode,
|
|
1555
|
-
pm_context_mode: effectivePmContextMode,
|
|
1556
|
-
auto_pm_context_applied: autoPmContextApplied,
|
|
1557
|
-
is_pm_command: isPmCommand,
|
|
1558
|
-
is_pm_tracker_read_command: isPmTrackerReadCommand,
|
|
1559
|
-
source_project_pm_path: sourceRoots?.projectPmRoot ?? "",
|
|
1560
|
-
sandbox_project_pm_path: selectedSandboxProjectPmPath,
|
|
1561
|
-
source_global_pm_path: sourceRoots?.globalPmRoot ?? "",
|
|
1562
|
-
sandbox_global_pm_path: selectedSandboxGlobalPmPath,
|
|
1563
|
-
source_project_item_count: sourceProjectItemCount,
|
|
1564
|
-
sandbox_project_item_count: selectedSandboxProjectItemCount,
|
|
1565
|
-
source_global_item_count: sourceGlobalItemCount,
|
|
1566
|
-
sandbox_global_item_count: selectedSandboxGlobalItemCount,
|
|
1567
|
-
mismatch_detected: mismatchDetected,
|
|
1568
|
-
project_extensions_seeded: projectExtensionsSeeded,
|
|
1569
|
-
global_extensions_seeded: globalExtensionsSeeded
|
|
1570
|
-
};
|
|
1571
|
-
};
|
|
1714
|
+
await initializeLinkedTestSandboxes(layout);
|
|
1715
|
+
await seedLinkedTestSandboxesFromSource(layout, sourceRoots);
|
|
1716
|
+
const counts = await countLinkedTestSandboxItems(layout, sourceRoots);
|
|
1572
1717
|
for (let index = 0; index < tests.length; index += 1) {
|
|
1573
1718
|
const linkedTest = tests[index];
|
|
1574
|
-
const
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
if (!linkedTest.command) {
|
|
1582
|
-
results.push({
|
|
1583
|
-
command: linkedTest.command,
|
|
1584
|
-
path: linkedTest.path,
|
|
1585
|
-
status: "skipped",
|
|
1586
|
-
execution_context: executionContext,
|
|
1587
|
-
error: "No command configured for this linked test."
|
|
1588
|
-
});
|
|
1589
|
-
continue;
|
|
1590
|
-
}
|
|
1591
|
-
const runtimeSafetySkipReason = getRuntimeSafetySkipReason(linkedTest.command);
|
|
1592
|
-
if (runtimeSafetySkipReason) {
|
|
1593
|
-
results.push({
|
|
1594
|
-
command: linkedTest.command,
|
|
1595
|
-
path: linkedTest.path,
|
|
1596
|
-
status: "skipped",
|
|
1597
|
-
execution_context: executionContext,
|
|
1598
|
-
error: runtimeSafetySkipReason
|
|
1599
|
-
});
|
|
1600
|
-
continue;
|
|
1601
|
-
}
|
|
1602
|
-
const failOnMismatchByDefault = executionContext.pm_context_mode === "schema" && executionContext.is_pm_tracker_read_command && executionContext.mismatch_detected;
|
|
1603
|
-
const failOnMismatchByFlag = options?.failOnContextMismatch === true && executionContext.is_pm_command && executionContext.mismatch_detected;
|
|
1604
|
-
if (failOnMismatchByDefault || failOnMismatchByFlag) {
|
|
1605
|
-
const mismatchHint = buildPmContextMismatchHint({
|
|
1606
|
-
executionContext,
|
|
1607
|
-
runLevelPmContextMode,
|
|
1608
|
-
linkedOverridePmContextMode
|
|
1609
|
-
});
|
|
1610
|
-
const mismatchPrefix = options?.checkContext === true ? "Linked test preflight PM context mismatch detected" : "Linked test PM context mismatch detected";
|
|
1611
|
-
results.push({
|
|
1612
|
-
command: linkedTest.command,
|
|
1613
|
-
path: linkedTest.path,
|
|
1614
|
-
status: "failed",
|
|
1615
|
-
exit_code: 1,
|
|
1616
|
-
failure_category: "assertion_failure",
|
|
1617
|
-
execution_context: executionContext,
|
|
1618
|
-
error: `${mismatchPrefix} (source_project_items=${executionContext.source_project_item_count}, sandbox_project_items=${executionContext.sandbox_project_item_count}).${mismatchHint}`
|
|
1619
|
-
});
|
|
1620
|
-
continue;
|
|
1621
|
-
}
|
|
1622
|
-
if (options?.requireAssertionsForPm === true && executionContext.is_pm_command && !hasLinkedTestAssertions(linkedTest)) {
|
|
1623
|
-
results.push({
|
|
1624
|
-
command: linkedTest.command,
|
|
1625
|
-
path: linkedTest.path,
|
|
1626
|
-
status: "failed",
|
|
1627
|
-
exit_code: 1,
|
|
1628
|
-
failure_category: "assertion_failure",
|
|
1629
|
-
execution_context: executionContext,
|
|
1630
|
-
error: "Linked PM command requires assertions when --require-assertions-for-pm is enabled."
|
|
1631
|
-
});
|
|
1632
|
-
continue;
|
|
1633
|
-
}
|
|
1634
|
-
const timeoutMs = (linkedTest.timeout_seconds ?? defaultTimeoutSeconds ?? 120) * 1e3;
|
|
1635
|
-
const effectiveDirectives = resolveEffectiveLinkedTestDirectives(runtimeDirectives, linkedTest);
|
|
1636
|
-
const executionEnv = { ...process.env };
|
|
1637
|
-
applyEnvDirectiveStage(executionEnv, runtimeDirectives);
|
|
1638
|
-
applyEnvDirectiveStage(executionEnv, {
|
|
1639
|
-
env_set: linkedTest.env_set ?? {},
|
|
1640
|
-
env_clear: linkedTest.env_clear ?? []
|
|
1719
|
+
const commandContext = resolveLinkedTestCommandContext({
|
|
1720
|
+
linkedTest,
|
|
1721
|
+
layout,
|
|
1722
|
+
counts,
|
|
1723
|
+
sourceRoots,
|
|
1724
|
+
runLevelPmContextMode,
|
|
1725
|
+
options
|
|
1641
1726
|
});
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
timeoutMs,
|
|
1652
|
-
command: linkedTest.command
|
|
1653
|
-
}, progressMode);
|
|
1654
|
-
const passed = execution.exitCode === 0 && !execution.timedOut && !execution.maxBufferExceeded;
|
|
1655
|
-
if (passed) {
|
|
1656
|
-
if (options?.failOnEmptyTestRun === true) {
|
|
1657
|
-
const emptyRunSignal = detectEmptyLinkedTestRun(execution.stdout, execution.stderr);
|
|
1658
|
-
if (emptyRunSignal) {
|
|
1659
|
-
results.push({
|
|
1660
|
-
command: linkedTest.command,
|
|
1661
|
-
path: linkedTest.path,
|
|
1662
|
-
status: "failed",
|
|
1663
|
-
exit_code: 1,
|
|
1664
|
-
failure_category: "empty_run",
|
|
1665
|
-
execution_context: executionContext,
|
|
1666
|
-
stdout: execution.stdout,
|
|
1667
|
-
stderr: execution.stderr,
|
|
1668
|
-
error: `Linked test reported an empty test run (${emptyRunSignal}) while --fail-on-empty-test-run is enabled. Update test selection or disable --fail-on-empty-test-run for this run.`
|
|
1669
|
-
});
|
|
1670
|
-
continue;
|
|
1671
|
-
}
|
|
1672
|
-
}
|
|
1673
|
-
const assertionFailures = evaluateLinkedTestAssertions(linkedTest, execution.stdout, execution.stderr);
|
|
1674
|
-
if (assertionFailures.length > 0) {
|
|
1675
|
-
results.push({
|
|
1676
|
-
command: linkedTest.command,
|
|
1677
|
-
path: linkedTest.path,
|
|
1678
|
-
status: "failed",
|
|
1679
|
-
exit_code: 1,
|
|
1680
|
-
failure_category: "assertion_failure",
|
|
1681
|
-
execution_context: executionContext,
|
|
1682
|
-
stdout: execution.stdout,
|
|
1683
|
-
stderr: execution.stderr,
|
|
1684
|
-
error: `Linked test assertion(s) failed: ${assertionFailures.join("; ")}`
|
|
1685
|
-
});
|
|
1686
|
-
continue;
|
|
1687
|
-
}
|
|
1688
|
-
results.push({
|
|
1689
|
-
command: linkedTest.command,
|
|
1690
|
-
path: linkedTest.path,
|
|
1691
|
-
status: "passed",
|
|
1692
|
-
exit_code: 0,
|
|
1693
|
-
execution_context: executionContext,
|
|
1694
|
-
stdout: execution.stdout,
|
|
1695
|
-
stderr: execution.stderr
|
|
1696
|
-
});
|
|
1727
|
+
const preflightResult = resolveLinkedTestPreflightResult({
|
|
1728
|
+
linkedTest,
|
|
1729
|
+
executionContext: commandContext.executionContext,
|
|
1730
|
+
runLevelPmContextMode,
|
|
1731
|
+
linkedOverridePmContextMode: commandContext.linkedOverridePmContextMode,
|
|
1732
|
+
options
|
|
1733
|
+
});
|
|
1734
|
+
if (preflightResult) {
|
|
1735
|
+
results.push(preflightResult);
|
|
1697
1736
|
continue;
|
|
1698
1737
|
}
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
error: formatLinkedTestExecutionError(execution, timeoutMs)
|
|
1710
|
-
});
|
|
1738
|
+
results.push(await runSingleLinkedTest({
|
|
1739
|
+
linkedTest,
|
|
1740
|
+
index,
|
|
1741
|
+
total: tests.length,
|
|
1742
|
+
defaultTimeoutSeconds,
|
|
1743
|
+
runtimeDirectives,
|
|
1744
|
+
progressMode,
|
|
1745
|
+
executionContext: commandContext.executionContext,
|
|
1746
|
+
options
|
|
1747
|
+
}));
|
|
1711
1748
|
}
|
|
1712
1749
|
} finally {
|
|
1713
|
-
await rm(
|
|
1750
|
+
await rm(layout.root, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
|
|
1714
1751
|
}
|
|
1715
1752
|
return results;
|
|
1716
1753
|
}
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
}
|
|
1723
|
-
const settings = await readSettings(pmRoot);
|
|
1724
|
-
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
1725
|
-
const resolvedAdds = await stdinResolver.resolveList(options.add, "--add");
|
|
1726
|
-
const resolvedAddJsons = await stdinResolver.resolveList(options.addJson, "--add-json");
|
|
1727
|
-
const resolvedRemoves = await stdinResolver.resolveList(options.remove, "--remove");
|
|
1728
|
-
const adds = [...parseAddEntries(resolvedAdds), ...parseAddJsonEntries(resolvedAddJsons)];
|
|
1729
|
-
const removes = parseRemoveEntries(resolvedRemoves);
|
|
1730
|
-
const shouldMutate = adds.length > 0 || removes.length > 0;
|
|
1731
|
-
let tests = [];
|
|
1732
|
-
let itemId;
|
|
1733
|
-
let changed = false;
|
|
1734
|
-
if (shouldMutate) {
|
|
1735
|
-
const author = resolveAuthor(options.author, settings.author_default);
|
|
1736
|
-
const result = await mutateItem({
|
|
1737
|
-
pmRoot,
|
|
1738
|
-
settings,
|
|
1739
|
-
id,
|
|
1740
|
-
op: "tests_add",
|
|
1741
|
-
author,
|
|
1742
|
-
message: options.message,
|
|
1743
|
-
force: options.force,
|
|
1744
|
-
skipNoop: true,
|
|
1745
|
-
mutate(document) {
|
|
1746
|
-
const previous = document.metadata.tests ?? [];
|
|
1747
|
-
const next = [...document.metadata.tests ?? []];
|
|
1748
|
-
for (const add of adds) {
|
|
1749
|
-
const exists = next.some((entry) => entry.command === add.command && entry.path === add.path && entry.scope === add.scope && entry.pm_context_mode === add.pm_context_mode);
|
|
1750
|
-
if (!exists) {
|
|
1751
|
-
next.push(add);
|
|
1752
|
-
}
|
|
1753
|
-
}
|
|
1754
|
-
if (removes.length > 0) {
|
|
1755
|
-
for (let i = next.length - 1; i >= 0; i -= 1) {
|
|
1756
|
-
const entry = next[i];
|
|
1757
|
-
if (removes.includes(entry.path ?? "") || removes.includes(entry.command ?? "")) {
|
|
1758
|
-
next.splice(i, 1);
|
|
1759
|
-
}
|
|
1760
|
-
}
|
|
1761
|
-
}
|
|
1762
|
-
document.metadata.tests = next;
|
|
1763
|
-
return { changedFields: stableValueEquals(previous, next) ? [] : ["tests"] };
|
|
1764
|
-
}
|
|
1765
|
-
});
|
|
1766
|
-
tests = result.item.tests ?? [];
|
|
1767
|
-
itemId = result.item.id;
|
|
1768
|
-
changed = result.changedFields.length > 0;
|
|
1769
|
-
} else {
|
|
1770
|
-
const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);
|
|
1771
|
-
if (!located) {
|
|
1772
|
-
throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
|
|
1773
|
-
}
|
|
1774
|
-
itemId = located.id;
|
|
1775
|
-
const loaded = await readLocatedItem(located, { schema: settings.schema });
|
|
1776
|
-
tests = loaded.document.metadata.tests ?? [];
|
|
1777
|
-
}
|
|
1778
|
-
let defaultTimeoutSeconds;
|
|
1779
|
-
if (options.timeout !== void 0) {
|
|
1780
|
-
defaultTimeoutSeconds = parseOptionalNumber(options.timeout, "timeout");
|
|
1781
|
-
}
|
|
1782
|
-
const pmContextMode = parsePmContextMode(options.pmContext);
|
|
1783
|
-
const hasRuntimeDirectiveFlags = (options.envSet?.length ?? 0) > 0 || (options.envClear?.length ?? 0) > 0 || options.sharedHostSafe === true || options.pmContext !== void 0 || options.overrideLinkedPmContext === true || options.failOnContextMismatch === true || options.failOnSkipped === true || options.failOnEmptyTestRun === true || options.requireAssertionsForPm === true || options.checkContext === true || options.autoPmContext === true;
|
|
1784
|
-
if (hasRuntimeDirectiveFlags && options.run !== true) {
|
|
1754
|
+
function hasTestRuntimeDirectiveFlags(options) {
|
|
1755
|
+
return (options.envSet?.length ?? 0) > 0 || (options.envClear?.length ?? 0) > 0 || options.sharedHostSafe === true || options.pmContext !== void 0 || options.overrideLinkedPmContext === true || options.failOnContextMismatch === true || options.failOnSkipped === true || options.failOnEmptyTestRun === true || options.requireAssertionsForPm === true || options.checkContext === true || options.autoPmContext === true;
|
|
1756
|
+
}
|
|
1757
|
+
function assertTestRunFlagUsage(options) {
|
|
1758
|
+
if (hasTestRuntimeDirectiveFlags(options) && options.run !== true) {
|
|
1785
1759
|
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);
|
|
1786
1760
|
}
|
|
1787
1761
|
const hasSelectorFlags = options.match !== void 0 || options.onlyIndex !== void 0 || options.onlyLast === true;
|
|
1788
1762
|
if (hasSelectorFlags && options.run !== true) {
|
|
1789
1763
|
throw new PmCliError("--match, --only-index, and --only-last require --run", EXIT_CODE.USAGE);
|
|
1790
1764
|
}
|
|
1765
|
+
}
|
|
1766
|
+
async function resolveLinkedTestItem(params) {
|
|
1767
|
+
const { id, options, pmRoot, settings, typeToFolder, adds, removes } = params;
|
|
1768
|
+
if (adds.length === 0 && removes.length === 0) {
|
|
1769
|
+
const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeToFolder);
|
|
1770
|
+
if (!located) {
|
|
1771
|
+
throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
|
|
1772
|
+
}
|
|
1773
|
+
const loaded = await readLocatedItem(located, { schema: settings.schema });
|
|
1774
|
+
return { itemId: located.id, tests: loaded.document.metadata.tests ?? [], changed: false };
|
|
1775
|
+
}
|
|
1776
|
+
const result = await mutateItem({
|
|
1777
|
+
pmRoot,
|
|
1778
|
+
settings,
|
|
1779
|
+
id,
|
|
1780
|
+
op: "tests_add",
|
|
1781
|
+
author: resolveAuthor(options.author, settings.author_default),
|
|
1782
|
+
message: options.message,
|
|
1783
|
+
force: options.force,
|
|
1784
|
+
skipNoop: true,
|
|
1785
|
+
mutate(document) {
|
|
1786
|
+
const previous = document.metadata.tests ?? [];
|
|
1787
|
+
const next = [...previous];
|
|
1788
|
+
for (const add of adds) {
|
|
1789
|
+
const exists = next.some((entry) => entry.command === add.command && entry.path === add.path && entry.scope === add.scope && entry.pm_context_mode === add.pm_context_mode);
|
|
1790
|
+
if (!exists) {
|
|
1791
|
+
next.push(add);
|
|
1792
|
+
}
|
|
1793
|
+
}
|
|
1794
|
+
if (removes.length > 0) {
|
|
1795
|
+
for (let i = next.length - 1; i >= 0; i -= 1) {
|
|
1796
|
+
const entry = next[i];
|
|
1797
|
+
if (removes.includes(entry.path ?? "") || removes.includes(entry.command ?? "")) {
|
|
1798
|
+
next.splice(i, 1);
|
|
1799
|
+
}
|
|
1800
|
+
}
|
|
1801
|
+
}
|
|
1802
|
+
document.metadata.tests = next;
|
|
1803
|
+
return { changedFields: stableValueEquals(previous, next) ? [] : ["tests"] };
|
|
1804
|
+
}
|
|
1805
|
+
});
|
|
1806
|
+
return {
|
|
1807
|
+
itemId: result.item.id,
|
|
1808
|
+
tests: result.item.tests ?? [],
|
|
1809
|
+
changed: result.changedFields.length > 0
|
|
1810
|
+
};
|
|
1811
|
+
}
|
|
1812
|
+
function resolveTestRunOptions(options, tests) {
|
|
1813
|
+
assertTestRunFlagUsage(options);
|
|
1791
1814
|
const selectorInput = {
|
|
1792
1815
|
match: options.match,
|
|
1793
1816
|
onlyIndex: options.onlyIndex === void 0 ? void 0 : parseOnlyIndexValue(options.onlyIndex),
|
|
1794
1817
|
onlyLast: options.onlyLast
|
|
1795
1818
|
};
|
|
1796
1819
|
const runSelection = options.run === true ? resolveLinkedTestRunSelection(tests, selectorInput) : void 0;
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1820
|
+
return {
|
|
1821
|
+
defaultTimeoutSeconds: options.timeout === void 0 ? void 0 : parseOptionalNumber(options.timeout, "timeout"),
|
|
1822
|
+
pmContextMode: parsePmContextMode(options.pmContext),
|
|
1823
|
+
runSelection,
|
|
1824
|
+
testsToRun: runSelection?.selected ?? tests
|
|
1825
|
+
};
|
|
1826
|
+
}
|
|
1827
|
+
async function executeSelectedLinkedTests(params) {
|
|
1828
|
+
const { options, runOptions, pmRoot } = params;
|
|
1829
|
+
if (options.run !== true) {
|
|
1830
|
+
return [];
|
|
1831
|
+
}
|
|
1832
|
+
return await runLinkedTests(runOptions.testsToRun, runOptions.defaultTimeoutSeconds, {
|
|
1800
1833
|
progress: options.progress,
|
|
1801
1834
|
envSet: options.envSet,
|
|
1802
1835
|
envClear: options.envClear,
|
|
1803
1836
|
sharedHostSafe: options.sharedHostSafe,
|
|
1804
|
-
pmContext: pmContextMode,
|
|
1837
|
+
pmContext: runOptions.pmContextMode,
|
|
1805
1838
|
overrideLinkedPmContext: options.overrideLinkedPmContext,
|
|
1806
1839
|
failOnContextMismatch: options.failOnContextMismatch,
|
|
1807
1840
|
failOnEmptyTestRun: options.failOnEmptyTestRun,
|
|
@@ -1812,9 +1845,9 @@ async function runTest(id, options, global2) {
|
|
|
1812
1845
|
projectPmRoot: pmRoot,
|
|
1813
1846
|
globalPmRoot: resolveGlobalPmRoot(process.cwd())
|
|
1814
1847
|
}
|
|
1815
|
-
})
|
|
1816
|
-
|
|
1817
|
-
|
|
1848
|
+
});
|
|
1849
|
+
}
|
|
1850
|
+
function buildTestWarnings(options, runSelection, runResults) {
|
|
1818
1851
|
const warnings = [];
|
|
1819
1852
|
if (runSelection && runSelection.selector !== null) {
|
|
1820
1853
|
warnings.push(`linked_test_selection:${runSelection.selector}=${runSelection.requested};selected=${runSelection.selected_count};skipped=${runSelection.skipped_count};indexes=${runSelection.selected_indexes.join(",")}`);
|
|
@@ -1823,55 +1856,90 @@ async function runTest(id, options, global2) {
|
|
|
1823
1856
|
const preflight = summarizeContextPreflight(runResults);
|
|
1824
1857
|
warnings.push(`context_preflight:checked_pm_commands=${preflight.checked_pm_commands};tracker_read_commands=${preflight.tracker_read_commands};mismatches=${preflight.mismatches};auto_remediated=${preflight.auto_remediated}`);
|
|
1825
1858
|
}
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1859
|
+
return warnings;
|
|
1860
|
+
}
|
|
1861
|
+
async function recordTestRunSummary(params) {
|
|
1862
|
+
const { options, pmRoot, settings, itemId, runStartedAt, runResults, failOnSkippedTriggered, warnings } = params;
|
|
1863
|
+
if (options.run !== true || !runStartedAt || settings.testing.record_results_to_items !== true) {
|
|
1864
|
+
return;
|
|
1865
|
+
}
|
|
1866
|
+
const summary = summarizeRunResultStatuses(runResults);
|
|
1867
|
+
const trackedRunId = resolveTrackedRunId("test");
|
|
1868
|
+
const attemptRaw = process.env.PM_BACKGROUND_TEST_RUN_ATTEMPT?.trim();
|
|
1869
|
+
const parsedAttempt = attemptRaw ? Number.parseInt(attemptRaw, 10) : Number.NaN;
|
|
1870
|
+
const resumedFrom = process.env.PM_BACKGROUND_TEST_RUN_RESUMED_FROM?.trim();
|
|
1871
|
+
try {
|
|
1872
|
+
await appendTrackedTestRunSummary({
|
|
1873
|
+
pmRoot,
|
|
1874
|
+
settings,
|
|
1875
|
+
itemId,
|
|
1876
|
+
author: resolveAuthor(options.author, settings.author_default),
|
|
1877
|
+
message: `Track test run summary (${trackedRunId})`,
|
|
1878
|
+
entry: {
|
|
1879
|
+
run_id: trackedRunId,
|
|
1880
|
+
kind: "test",
|
|
1881
|
+
status: summary.failed > 0 || failOnSkippedTriggered === true ? "failed" : "passed",
|
|
1882
|
+
started_at: runStartedAt,
|
|
1883
|
+
finished_at: nowIso(),
|
|
1884
|
+
recorded_at: nowIso(),
|
|
1885
|
+
attempt: Number.isFinite(parsedAttempt) && parsedAttempt >= 1 ? parsedAttempt : void 0,
|
|
1886
|
+
resumed_from: resumedFrom && resumedFrom.length > 0 ? resumedFrom : void 0,
|
|
1887
|
+
passed: summary.passed,
|
|
1888
|
+
failed: summary.failed,
|
|
1889
|
+
skipped: summary.skipped,
|
|
1890
|
+
fail_on_skipped_triggered: failOnSkippedTriggered ? true : void 0
|
|
1891
|
+
}
|
|
1892
|
+
});
|
|
1893
|
+
} catch (error) {
|
|
1894
|
+
warnings.push(`test_result_tracking_failed:${itemId}:${error instanceof Error ? error.message : String(error)}`);
|
|
1857
1895
|
}
|
|
1896
|
+
}
|
|
1897
|
+
async function runTest(id, options, global2) {
|
|
1898
|
+
const stdinResolver = createStdinTokenResolver();
|
|
1899
|
+
const pmRoot = resolvePmRoot(process.cwd(), global2.path);
|
|
1900
|
+
if (!await pathExists(getSettingsPath(pmRoot))) {
|
|
1901
|
+
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
1902
|
+
}
|
|
1903
|
+
const settings = await readSettings(pmRoot);
|
|
1904
|
+
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
1905
|
+
const resolvedAdds = await stdinResolver.resolveList(options.add, "--add");
|
|
1906
|
+
const resolvedAddJsons = await stdinResolver.resolveList(options.addJson, "--add-json");
|
|
1907
|
+
const resolvedRemoves = await stdinResolver.resolveList(options.remove, "--remove");
|
|
1908
|
+
const adds = [...parseAddEntries(resolvedAdds), ...parseAddJsonEntries(resolvedAddJsons)];
|
|
1909
|
+
const removes = parseRemoveEntries(resolvedRemoves);
|
|
1910
|
+
const item = await resolveLinkedTestItem({
|
|
1911
|
+
id,
|
|
1912
|
+
options,
|
|
1913
|
+
pmRoot,
|
|
1914
|
+
settings,
|
|
1915
|
+
typeToFolder: typeRegistry.type_to_folder,
|
|
1916
|
+
adds,
|
|
1917
|
+
removes
|
|
1918
|
+
});
|
|
1919
|
+
const runOptions = resolveTestRunOptions(options, item.tests);
|
|
1920
|
+
const runStartedAt = options.run === true ? nowIso() : void 0;
|
|
1921
|
+
const runResults = await executeSelectedLinkedTests({ options, runOptions, pmRoot });
|
|
1922
|
+
const failureCategories = countFailureCategories(runResults);
|
|
1923
|
+
const failOnSkippedTriggered = options.run === true && options.failOnSkipped === true && runResults.some((entry) => entry.status === "skipped");
|
|
1924
|
+
const warnings = buildTestWarnings(options, runOptions.runSelection, runResults);
|
|
1925
|
+
await recordTestRunSummary({ options, pmRoot, settings, itemId: item.itemId, runStartedAt, runResults, failOnSkippedTriggered, warnings });
|
|
1858
1926
|
return {
|
|
1859
1927
|
ok: runResults.every((entry) => entry.status !== "failed") && failOnSkippedTriggered !== true,
|
|
1860
|
-
id: itemId,
|
|
1861
|
-
tests,
|
|
1928
|
+
id: item.itemId,
|
|
1929
|
+
tests: item.tests,
|
|
1862
1930
|
run_results: runResults,
|
|
1863
1931
|
failure_categories: failureCategories,
|
|
1864
|
-
selection: runSelection ? {
|
|
1865
|
-
selector: runSelection.selector,
|
|
1866
|
-
requested: runSelection.requested,
|
|
1867
|
-
selected_indexes: runSelection.selected_indexes,
|
|
1868
|
-
selected_count: runSelection.selected_count,
|
|
1869
|
-
skipped_count: runSelection.skipped_count
|
|
1932
|
+
selection: runOptions.runSelection ? {
|
|
1933
|
+
selector: runOptions.runSelection.selector,
|
|
1934
|
+
requested: runOptions.runSelection.requested,
|
|
1935
|
+
selected_indexes: runOptions.runSelection.selected_indexes,
|
|
1936
|
+
selected_count: runOptions.runSelection.selected_count,
|
|
1937
|
+
skipped_count: runOptions.runSelection.skipped_count
|
|
1870
1938
|
} : void 0,
|
|
1871
1939
|
fail_on_skipped_triggered: failOnSkippedTriggered ? true : void 0,
|
|
1872
1940
|
warnings: warnings.length > 0 ? warnings : void 0,
|
|
1873
|
-
changed,
|
|
1874
|
-
count: tests.length
|
|
1941
|
+
changed: item.changed,
|
|
1942
|
+
count: item.tests.length
|
|
1875
1943
|
};
|
|
1876
1944
|
}
|
|
1877
1945
|
var _testOnlyTestCommand = {
|
|
@@ -1912,4 +1980,4 @@ export {
|
|
|
1912
1980
|
runTest,
|
|
1913
1981
|
_testOnlyTestCommand
|
|
1914
1982
|
};
|
|
1915
|
-
//# sourceMappingURL=chunk-
|
|
1983
|
+
//# sourceMappingURL=chunk-IG5JYZGU.js.map
|