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