@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.
Files changed (628) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +26 -0
  3. package/dist/cli/bootstrap-args.js +89 -79
  4. package/dist/cli/bootstrap-args.js.map +1 -1
  5. package/dist/cli/commander-usage.d.ts +2 -0
  6. package/dist/cli/commander-usage.js +58 -47
  7. package/dist/cli/commander-usage.js.map +1 -1
  8. package/dist/cli/commands/aggregate.js +102 -79
  9. package/dist/cli/commands/aggregate.js.map +1 -1
  10. package/dist/cli/commands/calendar.js +339 -303
  11. package/dist/cli/commands/calendar.js.map +1 -1
  12. package/dist/cli/commands/close-many.js +89 -68
  13. package/dist/cli/commands/close-many.js.map +1 -1
  14. package/dist/cli/commands/close.js +157 -129
  15. package/dist/cli/commands/close.js.map +1 -1
  16. package/dist/cli/commands/comments-audit.js +50 -42
  17. package/dist/cli/commands/comments-audit.js.map +1 -1
  18. package/dist/cli/commands/config.d.ts +2 -0
  19. package/dist/cli/commands/config.js +443 -879
  20. package/dist/cli/commands/config.js.map +1 -1
  21. package/dist/cli/commands/context.js +365 -287
  22. package/dist/cli/commands/context.js.map +1 -1
  23. package/dist/cli/commands/contracts.js +352 -238
  24. package/dist/cli/commands/contracts.js.map +1 -1
  25. package/dist/cli/commands/create.js +483 -434
  26. package/dist/cli/commands/create.js.map +1 -1
  27. package/dist/cli/commands/dedupe-audit.js +46 -39
  28. package/dist/cli/commands/dedupe-audit.js.map +1 -1
  29. package/dist/cli/commands/dedupe-merge.js +88 -69
  30. package/dist/cli/commands/dedupe-merge.js.map +1 -1
  31. package/dist/cli/commands/extension/bundled-catalog.js +59 -46
  32. package/dist/cli/commands/extension/bundled-catalog.js.map +1 -1
  33. package/dist/cli/commands/extension/doctor.js +129 -78
  34. package/dist/cli/commands/extension/doctor.js.map +1 -1
  35. package/dist/cli/commands/extension/managed-state.js +101 -57
  36. package/dist/cli/commands/extension/managed-state.js.map +1 -1
  37. package/dist/cli/commands/extension/scaffold.d.ts +7 -0
  38. package/dist/cli/commands/extension/scaffold.js +214 -186
  39. package/dist/cli/commands/extension/scaffold.js.map +1 -1
  40. package/dist/cli/commands/extension.d.ts +6 -1
  41. package/dist/cli/commands/extension.js +1034 -902
  42. package/dist/cli/commands/extension.js.map +1 -1
  43. package/dist/cli/commands/get.js +114 -81
  44. package/dist/cli/commands/get.js.map +1 -1
  45. package/dist/cli/commands/health.d.ts +17 -0
  46. package/dist/cli/commands/health.js +446 -307
  47. package/dist/cli/commands/health.js.map +1 -1
  48. package/dist/cli/commands/history-compact.js +209 -140
  49. package/dist/cli/commands/history-compact.js.map +1 -1
  50. package/dist/cli/commands/history-redact.js +162 -119
  51. package/dist/cli/commands/history-redact.js.map +1 -1
  52. package/dist/cli/commands/history-repair.js +120 -85
  53. package/dist/cli/commands/history-repair.js.map +1 -1
  54. package/dist/cli/commands/init.d.ts +8 -2
  55. package/dist/cli/commands/init.js +263 -162
  56. package/dist/cli/commands/init.js.map +1 -1
  57. package/dist/cli/commands/list-filter-shared.js +55 -48
  58. package/dist/cli/commands/list-filter-shared.js.map +1 -1
  59. package/dist/cli/commands/list.js +152 -102
  60. package/dist/cli/commands/list.js.map +1 -1
  61. package/dist/cli/commands/next.js +49 -32
  62. package/dist/cli/commands/next.js.map +1 -1
  63. package/dist/cli/commands/plan.js +373 -298
  64. package/dist/cli/commands/plan.js.map +1 -1
  65. package/dist/cli/commands/recurrence-parsers.js +43 -25
  66. package/dist/cli/commands/recurrence-parsers.js.map +1 -1
  67. package/dist/cli/commands/reindex.d.ts +21 -5
  68. package/dist/cli/commands/reindex.js +345 -205
  69. package/dist/cli/commands/reindex.js.map +1 -1
  70. package/dist/cli/commands/restore.d.ts +8 -7
  71. package/dist/cli/commands/restore.js +105 -69
  72. package/dist/cli/commands/restore.js.map +1 -1
  73. package/dist/cli/commands/schema.js +33 -30
  74. package/dist/cli/commands/schema.js.map +1 -1
  75. package/dist/cli/commands/search.d.ts +10 -2
  76. package/dist/cli/commands/search.js +595 -536
  77. package/dist/cli/commands/search.js.map +1 -1
  78. package/dist/cli/commands/telemetry.js +98 -87
  79. package/dist/cli/commands/telemetry.js.map +1 -1
  80. package/dist/cli/commands/test-all.js +237 -168
  81. package/dist/cli/commands/test-all.js.map +1 -1
  82. package/dist/cli/commands/test.d.ts +6 -5
  83. package/dist/cli/commands/test.js +530 -464
  84. package/dist/cli/commands/test.js.map +1 -1
  85. package/dist/cli/commands/update-many.js +57 -42
  86. package/dist/cli/commands/update-many.js.map +1 -1
  87. package/dist/cli/commands/update.d.ts +1 -1
  88. package/dist/cli/commands/update.js +764 -747
  89. package/dist/cli/commands/update.js.map +1 -1
  90. package/dist/cli/commands/validate.d.ts +18 -1
  91. package/dist/cli/commands/validate.js +466 -343
  92. package/dist/cli/commands/validate.js.map +1 -1
  93. package/dist/cli/error-guidance.js +399 -357
  94. package/dist/cli/error-guidance.js.map +1 -1
  95. package/dist/cli/extension-command-options.js +48 -21
  96. package/dist/cli/extension-command-options.js.map +1 -1
  97. package/dist/cli/main.d.ts +47 -0
  98. package/dist/cli/main.js +428 -341
  99. package/dist/cli/main.js.map +1 -1
  100. package/dist/cli/migration-gates.js +22 -45
  101. package/dist/cli/migration-gates.js.map +1 -1
  102. package/dist/cli/register-list-query.js +94 -105
  103. package/dist/cli/register-list-query.js.map +1 -1
  104. package/dist/cli/register-mutation.js +400 -416
  105. package/dist/cli/register-mutation.js.map +1 -1
  106. package/dist/cli/register-operations.js +86 -66
  107. package/dist/cli/register-operations.js.map +1 -1
  108. package/dist/cli/register-setup.js +120 -101
  109. package/dist/cli/register-setup.js.map +1 -1
  110. package/dist/cli/registration-helpers.js +117 -122
  111. package/dist/cli/registration-helpers.js.map +1 -1
  112. package/dist/cli-bundle/chunks/{activity-MVSEND6D.js → activity-CUC4JY3U.js} +9 -9
  113. package/dist/cli-bundle/chunks/activity-WEIEMM73.js +16 -0
  114. package/dist/cli-bundle/chunks/{aggregate-MOC4TR2G.js → aggregate-DKUTRY6R.js} +109 -85
  115. package/dist/cli-bundle/chunks/aggregate-DKUTRY6R.js.map +1 -0
  116. package/dist/cli-bundle/chunks/{aggregate-XJHLZQ5X.js → aggregate-SW5PNGCS.js} +108 -84
  117. package/dist/cli-bundle/chunks/{aggregate-XJHLZQ5X.js.map → aggregate-SW5PNGCS.js.map} +2 -2
  118. package/dist/cli-bundle/chunks/{append-KDHT4GHI.js → append-H32VOR2Y.js} +6 -6
  119. package/dist/cli-bundle/chunks/{append-LEDBAM3K.js → append-UBM632FK.js} +6 -6
  120. package/dist/cli-bundle/chunks/{chunk-Z55WX4IQ.js → chunk-2227673O.js} +158 -114
  121. package/dist/cli-bundle/chunks/chunk-2227673O.js.map +1 -0
  122. package/dist/cli-bundle/chunks/{chunk-SJZTPVFT.js → chunk-2ASNV4DH.js} +4 -4
  123. package/dist/cli-bundle/chunks/{chunk-JVQ7UOYC.js → chunk-2CHRYUXL.js} +2 -2
  124. package/dist/cli-bundle/chunks/{chunk-QE5UFCCO.js → chunk-2KWL5NPW.js} +42 -27
  125. package/dist/cli-bundle/chunks/chunk-2KWL5NPW.js.map +1 -0
  126. package/dist/cli-bundle/chunks/{chunk-ZEATCVAC.js → chunk-36UGKF4O.js} +21 -29
  127. package/dist/cli-bundle/chunks/chunk-36UGKF4O.js.map +7 -0
  128. package/dist/cli-bundle/chunks/{chunk-JZG5ADVE.js → chunk-3AZUFQK6.js} +1103 -963
  129. package/dist/cli-bundle/chunks/chunk-3AZUFQK6.js.map +1 -0
  130. package/dist/cli-bundle/chunks/{chunk-DRPF274X.js → chunk-3LCUASYG.js} +2 -2
  131. package/dist/cli-bundle/chunks/{chunk-JJ4SG243.js → chunk-3Q2HBMTI.js} +2 -2
  132. package/dist/cli-bundle/chunks/chunk-4BU75MF4.js +87 -0
  133. package/dist/cli-bundle/chunks/chunk-4BU75MF4.js.map +7 -0
  134. package/dist/cli-bundle/chunks/{chunk-GF7EAR22.js → chunk-4NUOWFBT.js} +109 -72
  135. package/dist/cli-bundle/chunks/chunk-4NUOWFBT.js.map +7 -0
  136. package/dist/cli-bundle/chunks/{chunk-TQ6E76BE.js → chunk-55XRYWEG.js} +6 -6
  137. package/dist/cli-bundle/chunks/{chunk-5IRVSKPS.js → chunk-5GVTFFTC.js} +150 -224
  138. package/dist/cli-bundle/chunks/chunk-5GVTFFTC.js.map +1 -0
  139. package/dist/cli-bundle/chunks/{chunk-CHRNYKNI.js → chunk-5PGBHRY3.js} +41 -26
  140. package/dist/cli-bundle/chunks/chunk-5PGBHRY3.js.map +7 -0
  141. package/dist/cli-bundle/chunks/{chunk-53ARXF2O.js → chunk-66Z3X7ZG.js} +261 -161
  142. package/dist/cli-bundle/chunks/chunk-66Z3X7ZG.js.map +7 -0
  143. package/dist/cli-bundle/chunks/{chunk-A3UNLXNJ.js → chunk-6ITZLD4T.js} +738 -688
  144. package/dist/cli-bundle/chunks/chunk-6ITZLD4T.js.map +7 -0
  145. package/dist/cli-bundle/chunks/{chunk-JTRKME24.js → chunk-6YCYF2AI.js} +262 -162
  146. package/dist/cli-bundle/chunks/chunk-6YCYF2AI.js.map +1 -0
  147. package/dist/cli-bundle/chunks/{chunk-RM6MHL6A.js → chunk-6ZMBJRDJ.js} +580 -467
  148. package/dist/cli-bundle/chunks/chunk-6ZMBJRDJ.js.map +7 -0
  149. package/dist/cli-bundle/chunks/{chunk-RPRW26NG.js → chunk-7MYWF4ZX.js} +110 -73
  150. package/dist/cli-bundle/chunks/chunk-7MYWF4ZX.js.map +1 -0
  151. package/dist/cli-bundle/chunks/{chunk-SNUK7H5J.js → chunk-7NSPKJUS.js} +716 -606
  152. package/dist/cli-bundle/chunks/chunk-7NSPKJUS.js.map +7 -0
  153. package/dist/cli-bundle/chunks/{chunk-KYDYQMNW.js → chunk-7TH5NMVB.js} +95 -53
  154. package/dist/cli-bundle/chunks/chunk-7TH5NMVB.js.map +7 -0
  155. package/dist/cli-bundle/chunks/{chunk-VD3LKZFX.js → chunk-7W4H4K26.js} +739 -689
  156. package/dist/cli-bundle/chunks/chunk-7W4H4K26.js.map +1 -0
  157. package/dist/cli-bundle/chunks/{chunk-IBU2LLWM.js → chunk-A6VOGKBA.js} +6 -6
  158. package/dist/cli-bundle/chunks/{chunk-MLHX6DN5.js → chunk-AIAIXG7I.js} +2 -2
  159. package/dist/cli-bundle/chunks/{chunk-NIBP3I7A.js → chunk-AJEBCRIY.js} +128 -126
  160. package/dist/cli-bundle/chunks/chunk-AJEBCRIY.js.map +1 -0
  161. package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js → chunk-B4O5S7I3.js} +79 -57
  162. package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js.map → chunk-B4O5S7I3.js.map} +2 -2
  163. package/dist/cli-bundle/chunks/{chunk-5ABGFWR4.js → chunk-BTX5MIQF.js} +2 -2
  164. package/dist/cli-bundle/chunks/chunk-BVZZN2LH.js +809 -0
  165. package/dist/cli-bundle/chunks/chunk-BVZZN2LH.js.map +7 -0
  166. package/dist/cli-bundle/chunks/{chunk-3JWQCLR5.js → chunk-CYBDUHNO.js} +3 -3
  167. package/dist/cli-bundle/chunks/{chunk-WFJZDUM7.js → chunk-CZPVDLD2.js} +4 -4
  168. package/dist/cli-bundle/chunks/{chunk-FDEVKXC4.js → chunk-EMPGXBUF.js} +22 -30
  169. package/dist/cli-bundle/chunks/chunk-EMPGXBUF.js.map +1 -0
  170. package/dist/cli-bundle/chunks/{chunk-HUYYMTGW.js → chunk-EUKTMRN3.js} +2 -2
  171. package/dist/cli-bundle/chunks/{chunk-EVWYAG46.js → chunk-FFOQHGNH.js} +6 -6
  172. package/dist/cli-bundle/chunks/{chunk-IF4ERU6A.js → chunk-GFMSLORL.js} +6 -6
  173. package/dist/cli-bundle/chunks/{chunk-IZQOJR2B.js → chunk-GRRG3MCT.js} +198 -189
  174. package/dist/cli-bundle/chunks/chunk-GRRG3MCT.js.map +7 -0
  175. package/dist/cli-bundle/chunks/{chunk-IDYCAK35.js → chunk-H4GRLYJS.js} +3 -3
  176. package/dist/cli-bundle/chunks/{chunk-VMY7MZEM.js → chunk-HQTPRV4D.js} +6 -6
  177. package/dist/cli-bundle/chunks/{chunk-CY5IJMUM.js → chunk-I66WE2HE.js} +712 -602
  178. package/dist/cli-bundle/chunks/chunk-I66WE2HE.js.map +1 -0
  179. package/dist/cli-bundle/chunks/{chunk-ZFIEEDTJ.js → chunk-IEEJQCZ4.js} +509 -363
  180. package/dist/cli-bundle/chunks/chunk-IEEJQCZ4.js.map +7 -0
  181. package/dist/cli-bundle/chunks/{chunk-DU66JUGT.js → chunk-IG5JYZGU.js} +488 -420
  182. package/dist/cli-bundle/chunks/chunk-IG5JYZGU.js.map +7 -0
  183. package/dist/cli-bundle/chunks/{chunk-7L6TXOOC.js → chunk-JMK5GCK2.js} +2 -2
  184. package/dist/cli-bundle/chunks/{chunk-LBH7UYKY.js → chunk-JXAUVO6X.js} +258 -169
  185. package/dist/cli-bundle/chunks/{chunk-LBH7UYKY.js.map → chunk-JXAUVO6X.js.map} +2 -2
  186. package/dist/cli-bundle/chunks/{chunk-KRASIL6M.js → chunk-K2VYLVX4.js} +2 -2
  187. package/dist/cli-bundle/chunks/{chunk-4YIMPANT.js → chunk-KCO2EAN5.js} +3 -3
  188. package/dist/cli-bundle/chunks/{chunk-T7ZMQI4J.js → chunk-KIYCOJ63.js} +198 -189
  189. package/dist/cli-bundle/chunks/chunk-KIYCOJ63.js.map +1 -0
  190. package/dist/cli-bundle/chunks/{chunk-D6USKAMA.js → chunk-KLXF7NCC.js} +2 -2
  191. package/dist/cli-bundle/chunks/{chunk-V3KLX7U7.js → chunk-KN3URLKS.js} +510 -364
  192. package/dist/cli-bundle/chunks/chunk-KN3URLKS.js.map +1 -0
  193. package/dist/cli-bundle/chunks/{chunk-OB3RJV5F.js → chunk-LRKMWUUV.js} +2 -2
  194. package/dist/cli-bundle/chunks/{chunk-74PUWBGN.js → chunk-LTRAF2D7.js} +3 -3
  195. package/dist/cli-bundle/chunks/{chunk-5T6WPLRO.js → chunk-MNBPX5JS.js} +394 -354
  196. package/dist/cli-bundle/chunks/chunk-MNBPX5JS.js.map +7 -0
  197. package/dist/cli-bundle/chunks/{chunk-4TXTVZL3.js → chunk-MRD4T5LF.js} +2 -2
  198. package/dist/cli-bundle/chunks/{chunk-E2Q2ULMR.js → chunk-N2JSWVWG.js} +4 -4
  199. package/dist/cli-bundle/chunks/{chunk-7WDETKGP.js → chunk-N3QCJS4M.js} +1105 -965
  200. package/dist/cli-bundle/chunks/chunk-N3QCJS4M.js.map +7 -0
  201. package/dist/cli-bundle/chunks/{chunk-KGQ3W65B.js → chunk-NRZS637N.js} +258 -169
  202. package/dist/cli-bundle/chunks/chunk-NRZS637N.js.map +1 -0
  203. package/dist/cli-bundle/chunks/chunk-OTUJZKGI.js +799 -0
  204. package/dist/cli-bundle/chunks/chunk-OTUJZKGI.js.map +1 -0
  205. package/dist/cli-bundle/chunks/{chunk-ZIE6WXJ2.js → chunk-Q6K2OACU.js} +153 -90
  206. package/dist/cli-bundle/chunks/chunk-Q6K2OACU.js.map +1 -0
  207. package/dist/cli-bundle/chunks/{chunk-K46GQ265.js → chunk-Q6NXOHS6.js} +489 -421
  208. package/dist/cli-bundle/chunks/chunk-Q6NXOHS6.js.map +1 -0
  209. package/dist/cli-bundle/chunks/{chunk-7RIJGN4R.js → chunk-QH3FSKRJ.js} +2 -2
  210. package/dist/cli-bundle/chunks/{chunk-UB3V5WUI.js → chunk-RM37OPYK.js} +394 -354
  211. package/dist/cli-bundle/chunks/chunk-RM37OPYK.js.map +1 -0
  212. package/dist/cli-bundle/chunks/{chunk-OUQ5JEFM.js → chunk-S62UANU7.js} +3 -3
  213. package/dist/cli-bundle/chunks/{chunk-NO6Y6FB2.js → chunk-SPM2XLWI.js} +37 -28
  214. package/dist/cli-bundle/chunks/chunk-SPM2XLWI.js.map +7 -0
  215. package/dist/cli-bundle/chunks/{chunk-DORJSBGJ.js → chunk-SYNKD3ZG.js} +127 -125
  216. package/dist/cli-bundle/chunks/chunk-SYNKD3ZG.js.map +7 -0
  217. package/dist/cli-bundle/chunks/{chunk-6YRAMXRS.js → chunk-SYVUU7EK.js} +581 -468
  218. package/dist/cli-bundle/chunks/chunk-SYVUU7EK.js.map +1 -0
  219. package/dist/cli-bundle/chunks/{chunk-D5LYZVGB.js → chunk-TPOFWBMY.js} +95 -53
  220. package/dist/cli-bundle/chunks/chunk-TPOFWBMY.js.map +1 -0
  221. package/dist/cli-bundle/chunks/{chunk-IHXXUIXS.js → chunk-TTHCEV5Q.js} +92 -77
  222. package/dist/cli-bundle/chunks/chunk-TTHCEV5Q.js.map +1 -0
  223. package/dist/cli-bundle/chunks/{chunk-DLDCPF5X.js → chunk-U2BEEM2X.js} +3 -3
  224. package/dist/cli-bundle/chunks/{chunk-Z5BM2FKQ.js → chunk-UGLU6Q2I.js} +91 -76
  225. package/dist/cli-bundle/chunks/chunk-UGLU6Q2I.js.map +7 -0
  226. package/dist/cli-bundle/chunks/{chunk-73PTKMAE.js → chunk-UT73HUPC.js} +3 -3
  227. package/dist/cli-bundle/chunks/{chunk-F7G53BOA.js → chunk-UTSH5GWX.js} +4 -4
  228. package/dist/cli-bundle/chunks/{chunk-AWN4PPH5.js → chunk-UWKEJMZU.js} +157 -113
  229. package/dist/cli-bundle/chunks/chunk-UWKEJMZU.js.map +7 -0
  230. package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js +84 -0
  231. package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js.map +1 -0
  232. package/dist/cli-bundle/chunks/{chunk-KTMMTOIP.js → chunk-W47SML5B.js} +152 -89
  233. package/dist/cli-bundle/chunks/chunk-W47SML5B.js.map +7 -0
  234. package/dist/cli-bundle/chunks/{chunk-UFKNF23C.js → chunk-WJAMWAHZ.js} +157 -118
  235. package/dist/cli-bundle/chunks/chunk-WJAMWAHZ.js.map +7 -0
  236. package/dist/cli-bundle/chunks/{chunk-HIBK6H4S.js → chunk-XCHUVHKU.js} +685 -544
  237. package/dist/cli-bundle/chunks/chunk-XCHUVHKU.js.map +1 -0
  238. package/dist/cli-bundle/chunks/{chunk-DJDXAU74.js → chunk-XEWQKDYZ.js} +685 -544
  239. package/dist/cli-bundle/chunks/chunk-XEWQKDYZ.js.map +7 -0
  240. package/dist/cli-bundle/chunks/{chunk-BOWQWXLI.js → chunk-XTHQWXVC.js} +158 -119
  241. package/dist/cli-bundle/chunks/chunk-XTHQWXVC.js.map +1 -0
  242. package/dist/cli-bundle/chunks/{chunk-6T5ZIWBS.js → chunk-XWGEMNBR.js} +150 -224
  243. package/dist/cli-bundle/chunks/chunk-XWGEMNBR.js.map +7 -0
  244. package/dist/cli-bundle/chunks/{chunk-JIP67N2K.js → chunk-Y4NRKBFW.js} +3 -3
  245. package/dist/cli-bundle/chunks/{chunk-WTRUDJ3R.js → chunk-YLZZ6T54.js} +38 -29
  246. package/dist/cli-bundle/chunks/chunk-YLZZ6T54.js.map +1 -0
  247. package/dist/cli-bundle/chunks/{chunk-FBZ5XAAF.js → chunk-YPKFV2JR.js} +6 -6
  248. package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js → chunk-Z4DGFQDH.js} +80 -58
  249. package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js.map → chunk-Z4DGFQDH.js.map} +1 -1
  250. package/dist/cli-bundle/chunks/{chunk-BN3CWK6G.js → chunk-ZNHEYCDD.js} +2 -2
  251. package/dist/cli-bundle/chunks/{chunk-YEDFE4DC.js → chunk-ZNT7KEWE.js} +2 -2
  252. package/dist/cli-bundle/chunks/{claim-HMCLSLUE.js → claim-SENTPZBN.js} +8 -8
  253. package/dist/cli-bundle/chunks/{claim-6NINZYB3.js → claim-Z7MEQCBT.js} +8 -8
  254. package/dist/cli-bundle/chunks/{close-OP3LK7Z2.js → close-424MX4CU.js} +7 -7
  255. package/dist/cli-bundle/chunks/close-YCWQQPDS.js +14 -0
  256. package/dist/cli-bundle/chunks/{close-many-CXJBOWWY.js → close-many-2IV4J2TR.js} +103 -82
  257. package/dist/cli-bundle/chunks/close-many-2IV4J2TR.js.map +1 -0
  258. package/dist/cli-bundle/chunks/{close-many-BFMP6HHK.js → close-many-SWY34BII.js} +102 -81
  259. package/dist/cli-bundle/chunks/close-many-SWY34BII.js.map +7 -0
  260. package/dist/cli-bundle/chunks/{comments-ETHABIY6.js → comments-4FGNTSNV.js} +8 -8
  261. package/dist/cli-bundle/chunks/{comments-MU2WMBUY.js → comments-7YS5MY5X.js} +8 -8
  262. package/dist/cli-bundle/chunks/config-BZJKK7FZ.js +1062 -0
  263. package/dist/cli-bundle/chunks/config-BZJKK7FZ.js.map +1 -0
  264. package/dist/cli-bundle/chunks/config-G74GISC4.js +1072 -0
  265. package/dist/cli-bundle/chunks/config-G74GISC4.js.map +7 -0
  266. package/dist/cli-bundle/chunks/{context-7ZEZV3BV.js → context-LHVKJSPJ.js} +12 -12
  267. package/dist/cli-bundle/chunks/{context-XDI4DKKT.js → context-ZQY54JNS.js} +12 -12
  268. package/dist/cli-bundle/chunks/{contracts-SMOAN5NF.js → contracts-CP2EZJC7.js} +320 -199
  269. package/dist/cli-bundle/chunks/contracts-CP2EZJC7.js.map +7 -0
  270. package/dist/cli-bundle/chunks/{contracts-KP4QAGVW.js → contracts-FIZLMP7O.js} +321 -200
  271. package/dist/cli-bundle/chunks/contracts-FIZLMP7O.js.map +1 -0
  272. package/dist/cli-bundle/chunks/{copy-JJ3KOQW2.js → copy-GYNQQPW2.js} +5 -5
  273. package/dist/cli-bundle/chunks/{copy-CWM6SBY6.js → copy-TLW7JTQT.js} +5 -5
  274. package/dist/cli-bundle/chunks/{create-J5Q2ELZT.js → create-VSKYSOCD.js} +12 -12
  275. package/dist/cli-bundle/chunks/create-XTMAPS7I.js +28 -0
  276. package/dist/cli-bundle/chunks/{delete-2GZLQEUQ.js → delete-4W5JYCEG.js} +5 -5
  277. package/dist/cli-bundle/chunks/{delete-OOQS4KVD.js → delete-ANTOTI2I.js} +5 -5
  278. package/dist/cli-bundle/chunks/{deps-IF4IGL4R.js → deps-HPPE6MJN.js} +5 -5
  279. package/dist/cli-bundle/chunks/{deps-ZVGGCRR6.js → deps-ZQZN54EZ.js} +5 -5
  280. package/dist/cli-bundle/chunks/{docs-NFTBCQQC.js → docs-RPOVFMP3.js} +7 -7
  281. package/dist/cli-bundle/chunks/{docs-2TIFR62T.js → docs-XJNYBJGE.js} +7 -7
  282. package/dist/cli-bundle/chunks/{eval-2F6EH4XN.js → eval-DM6JBZTS.js} +10 -10
  283. package/dist/cli-bundle/chunks/{eval-PFKXQR3B.js → eval-RFBI5FGS.js} +10 -10
  284. package/dist/cli-bundle/chunks/{extension-GMVOIP4O.js → extension-B3YY4WY5.js} +11 -10
  285. package/dist/cli-bundle/chunks/{extension-3LRYX7SW.js → extension-TTSEFQTS.js} +11 -10
  286. package/dist/cli-bundle/chunks/{files-DF3HO6XK.js → files-5D65CHGE.js} +7 -7
  287. package/dist/cli-bundle/chunks/{files-T5ODMETM.js → files-GPIG77EN.js} +7 -7
  288. package/dist/cli-bundle/chunks/{focus-MY5ARIEK.js → focus-C3PEJV2C.js} +6 -6
  289. package/dist/cli-bundle/chunks/{focus-DLXKK4AH.js → focus-ZHN7WIGX.js} +6 -6
  290. package/dist/cli-bundle/chunks/{gc-MDGRR2SU.js → gc-D4JQ6OWN.js} +3 -3
  291. package/dist/cli-bundle/chunks/{gc-FULIVYR4.js → gc-VZIXDL32.js} +3 -3
  292. package/dist/cli-bundle/chunks/{get-VYPIICPC.js → get-GIBRUUOP.js} +121 -81
  293. package/dist/cli-bundle/chunks/get-GIBRUUOP.js.map +1 -0
  294. package/dist/cli-bundle/chunks/{get-AWK324RS.js → get-IOVAN6RU.js} +120 -80
  295. package/dist/cli-bundle/chunks/get-IOVAN6RU.js.map +7 -0
  296. package/dist/cli-bundle/chunks/{health-Q66C43GN.js → health-L2U3AFKV.js} +437 -264
  297. package/dist/cli-bundle/chunks/health-L2U3AFKV.js.map +1 -0
  298. package/dist/cli-bundle/chunks/{health-FBCVZGSX.js → health-MM7AWXYF.js} +436 -263
  299. package/dist/cli-bundle/chunks/health-MM7AWXYF.js.map +7 -0
  300. package/dist/cli-bundle/chunks/history-DD7L7BNL.js +18 -0
  301. package/dist/cli-bundle/chunks/{history-X4OSES6K.js → history-IL7XCEX2.js} +8 -8
  302. package/dist/cli-bundle/chunks/{history-compact-2GHT32UX.js → history-compact-HALOTOU7.js} +214 -135
  303. package/dist/cli-bundle/chunks/history-compact-HALOTOU7.js.map +1 -0
  304. package/dist/cli-bundle/chunks/{history-compact-WLCQEKXS.js → history-compact-MV25P7DM.js} +213 -134
  305. package/dist/cli-bundle/chunks/history-compact-MV25P7DM.js.map +7 -0
  306. package/dist/cli-bundle/chunks/history-redact-IX4YEWMY.js +19 -0
  307. package/dist/cli-bundle/chunks/{history-redact-45YW65BK.js → history-redact-VYCWQFK7.js} +9 -9
  308. package/dist/cli-bundle/chunks/{history-repair-FY75IC26.js → history-repair-44MODPQF.js} +124 -84
  309. package/dist/cli-bundle/chunks/history-repair-44MODPQF.js.map +1 -0
  310. package/dist/cli-bundle/chunks/{history-repair-GABSDSVD.js → history-repair-CPNAOCNF.js} +123 -83
  311. package/dist/cli-bundle/chunks/history-repair-CPNAOCNF.js.map +7 -0
  312. package/dist/cli-bundle/chunks/{init-KO7CGIRQ.js → init-F27NHENZ.js} +12 -11
  313. package/dist/cli-bundle/chunks/init-HHVQQP6C.js +22 -0
  314. package/dist/cli-bundle/chunks/{learnings-LHZT5BHW.js → learnings-HJVDQIGY.js} +8 -8
  315. package/dist/cli-bundle/chunks/{learnings-3F7YLI45.js → learnings-XSFSUUWK.js} +8 -8
  316. package/dist/cli-bundle/chunks/{list-Y6AU5BJS.js → list-HPMEKCAA.js} +8 -8
  317. package/dist/cli-bundle/chunks/{list-ROT7JF62.js → list-VMPWTURB.js} +8 -8
  318. package/dist/cli-bundle/chunks/{next-66BJB4N2.js → next-ETXF2ZCN.js} +59 -37
  319. package/dist/cli-bundle/chunks/next-ETXF2ZCN.js.map +7 -0
  320. package/dist/cli-bundle/chunks/{next-N5MWJTBY.js → next-QM6YJIIS.js} +60 -38
  321. package/dist/cli-bundle/chunks/next-QM6YJIIS.js.map +1 -0
  322. package/dist/cli-bundle/chunks/{notes-FW6YFLND.js → notes-GDZIKGR6.js} +8 -8
  323. package/dist/cli-bundle/chunks/{notes-EVJZ3VAB.js → notes-WDDBPC4D.js} +8 -8
  324. package/dist/cli-bundle/chunks/{plan-ZHKZ7JVF.js → plan-BGDR73Z6.js} +373 -279
  325. package/dist/cli-bundle/chunks/plan-BGDR73Z6.js.map +1 -0
  326. package/dist/cli-bundle/chunks/{plan-DQ7G4EDC.js → plan-C5IMM335.js} +372 -278
  327. package/dist/cli-bundle/chunks/plan-C5IMM335.js.map +7 -0
  328. package/dist/cli-bundle/chunks/{profile-CHAW6SEA.js → profile-CCOKZ2IQ.js} +9 -9
  329. package/dist/cli-bundle/chunks/{profile-UPZGCDOG.js → profile-HUCENIEQ.js} +9 -9
  330. package/dist/cli-bundle/chunks/{register-list-query-Y2VRHPCL.js → register-list-query-ROSNIL52.js} +80 -83
  331. package/dist/cli-bundle/chunks/register-list-query-ROSNIL52.js.map +1 -0
  332. package/dist/cli-bundle/chunks/{register-list-query-KY6Z6WV7.js → register-list-query-XN4ZRHSV.js} +79 -82
  333. package/dist/cli-bundle/chunks/register-list-query-XN4ZRHSV.js.map +7 -0
  334. package/dist/cli-bundle/chunks/{register-mutation-PCARIGZS.js → register-mutation-CFSB2MS3.js} +406 -385
  335. package/dist/cli-bundle/chunks/register-mutation-CFSB2MS3.js.map +1 -0
  336. package/dist/cli-bundle/chunks/{register-mutation-N6AYSKPM.js → register-mutation-KRLAHEL2.js} +405 -384
  337. package/dist/cli-bundle/chunks/register-mutation-KRLAHEL2.js.map +7 -0
  338. package/dist/cli-bundle/chunks/{register-operations-L6CYTOIH.js → register-operations-4PASGJDB.js} +112 -93
  339. package/dist/cli-bundle/chunks/register-operations-4PASGJDB.js.map +7 -0
  340. package/dist/cli-bundle/chunks/{register-operations-YAT6FUUB.js → register-operations-MBN4KGUM.js} +113 -94
  341. package/dist/cli-bundle/chunks/register-operations-MBN4KGUM.js.map +1 -0
  342. package/dist/cli-bundle/chunks/{register-setup-N7UGXYJC.js → register-setup-VIAWYFP5.js} +129 -104
  343. package/dist/cli-bundle/chunks/register-setup-VIAWYFP5.js.map +1 -0
  344. package/dist/cli-bundle/chunks/{register-setup-MPANILQF.js → register-setup-ZCGKHDKL.js} +128 -103
  345. package/dist/cli-bundle/chunks/register-setup-ZCGKHDKL.js.map +7 -0
  346. package/dist/cli-bundle/chunks/{restore-DKMCLPI5.js → restore-4CBWUMCX.js} +9 -9
  347. package/dist/cli-bundle/chunks/restore-5UEAGG3W.js +17 -0
  348. package/dist/cli-bundle/chunks/{scheduling-shortcuts-3F4QUEDH.js → scheduling-shortcuts-6VFKNKCM.js} +12 -12
  349. package/dist/cli-bundle/chunks/{scheduling-shortcuts-BNZLQK36.js → scheduling-shortcuts-ERHCVTEM.js} +12 -12
  350. package/dist/cli-bundle/chunks/{schema-OLT6LVKH.js → schema-TDGK6N3I.js} +7 -7
  351. package/dist/cli-bundle/chunks/{schema-XJXKJQF5.js → schema-UE5KKAUX.js} +7 -7
  352. package/dist/cli-bundle/chunks/{search-KP6H7COV.js → search-FP7MEU4S.js} +10 -10
  353. package/dist/cli-bundle/chunks/{search-CX5UMV4H.js → search-K4CFLQ5S.js} +10 -10
  354. package/dist/cli-bundle/chunks/{stats-QZUG6MX5.js → stats-NJJCALEZ.js} +6 -6
  355. package/dist/cli-bundle/chunks/{stats-7XW4OEMK.js → stats-XT6QRKQY.js} +6 -6
  356. package/dist/cli-bundle/chunks/{telemetry-DIFPXCAT.js → telemetry-5SQ5UDXC.js} +84 -70
  357. package/dist/cli-bundle/chunks/telemetry-5SQ5UDXC.js.map +7 -0
  358. package/dist/cli-bundle/chunks/{telemetry-WTYFUPRL.js → telemetry-HVXFZA2U.js} +85 -71
  359. package/dist/cli-bundle/chunks/telemetry-HVXFZA2U.js.map +1 -0
  360. package/dist/cli-bundle/chunks/{test-QNDXZQCW.js → test-UFSJ5YIO.js} +15 -14
  361. package/dist/cli-bundle/chunks/{test-HU2BS7EY.js → test-YCDAUBWF.js} +15 -14
  362. package/dist/cli-bundle/chunks/test-all-2BWKY3GQ.js +427 -0
  363. package/dist/cli-bundle/chunks/test-all-2BWKY3GQ.js.map +1 -0
  364. package/dist/cli-bundle/chunks/test-all-PM7UYN42.js +430 -0
  365. package/dist/cli-bundle/chunks/test-all-PM7UYN42.js.map +7 -0
  366. package/dist/cli-bundle/chunks/{test-runs-CA6K32RD.js → test-runs-FK5E75AA.js} +185 -147
  367. package/dist/cli-bundle/chunks/test-runs-FK5E75AA.js.map +1 -0
  368. package/dist/cli-bundle/chunks/{test-runs-LANLLPVO.js → test-runs-H4TGWGRN.js} +184 -146
  369. package/dist/cli-bundle/chunks/test-runs-H4TGWGRN.js.map +7 -0
  370. package/dist/cli-bundle/chunks/update-MTCFES6X.js +24 -0
  371. package/dist/cli-bundle/chunks/{update-DJKWLBWJ.js → update-Y5WQVT5O.js} +15 -15
  372. package/dist/cli-bundle/chunks/{update-many-LU3SCNK5.js → update-many-6YAYYRLE.js} +83 -68
  373. package/dist/cli-bundle/chunks/{update-many-LU3SCNK5.js.map → update-many-6YAYYRLE.js.map} +2 -2
  374. package/dist/cli-bundle/chunks/{update-many-VW5DGF3S.js → update-many-JTKKSA7Y.js} +84 -69
  375. package/dist/cli-bundle/chunks/{update-many-VW5DGF3S.js.map → update-many-JTKKSA7Y.js.map} +1 -1
  376. package/dist/cli-bundle/chunks/{upgrade-ICXY244R.js → upgrade-DTAHZ236.js} +11 -10
  377. package/dist/cli-bundle/chunks/{upgrade-ICXY244R.js.map → upgrade-DTAHZ236.js.map} +1 -1
  378. package/dist/cli-bundle/chunks/{upgrade-77FRUAXN.js → upgrade-JUDU7YL4.js} +13 -12
  379. package/dist/cli-bundle/chunks/{upgrade-77FRUAXN.js.map → upgrade-JUDU7YL4.js.map} +1 -1
  380. package/dist/cli-bundle/chunks/{validate-2G566PKQ.js → validate-732RWS5W.js} +440 -319
  381. package/dist/cli-bundle/chunks/validate-732RWS5W.js.map +7 -0
  382. package/dist/cli-bundle/chunks/{validate-BDPVXHHH.js → validate-W7H5TEDC.js} +441 -320
  383. package/dist/cli-bundle/chunks/validate-W7H5TEDC.js.map +1 -0
  384. package/dist/cli-bundle/main.js +986 -1500
  385. package/dist/cli-bundle/main.js.map +4 -4
  386. package/dist/core/config/nested-settings.js +89 -67
  387. package/dist/core/config/nested-settings.js.map +1 -1
  388. package/dist/core/extensions/activation-summary-markdown.js +23 -12
  389. package/dist/core/extensions/activation-summary-markdown.js.map +1 -1
  390. package/dist/core/extensions/extension-policy.d.ts +18 -3
  391. package/dist/core/extensions/extension-policy.js +116 -106
  392. package/dist/core/extensions/extension-policy.js.map +1 -1
  393. package/dist/core/extensions/loader.js +310 -232
  394. package/dist/core/extensions/loader.js.map +1 -1
  395. package/dist/core/governance/metadata-coverage.js +20 -28
  396. package/dist/core/governance/metadata-coverage.js.map +1 -1
  397. package/dist/core/history/drift-scan.js +93 -81
  398. package/dist/core/history/drift-scan.js.map +1 -1
  399. package/dist/core/item/item-format.js +523 -410
  400. package/dist/core/item/item-format.js.map +1 -1
  401. package/dist/core/item/item-type-definition.js +14 -14
  402. package/dist/core/item/item-type-definition.js.map +1 -1
  403. package/dist/core/item/type-registry.js +87 -82
  404. package/dist/core/item/type-registry.js.map +1 -1
  405. package/dist/core/output/mutation-projection.js +42 -26
  406. package/dist/core/output/mutation-projection.js.map +1 -1
  407. package/dist/core/schema/runtime-schema.js +34 -28
  408. package/dist/core/schema/runtime-schema.js.map +1 -1
  409. package/dist/core/search/semantic-defaults.js +64 -37
  410. package/dist/core/search/semantic-defaults.js.map +1 -1
  411. package/dist/core/search/vector-stores.js +32 -17
  412. package/dist/core/search/vector-stores.js.map +1 -1
  413. package/dist/core/sentry/helpers.js +31 -28
  414. package/dist/core/sentry/helpers.js.map +1 -1
  415. package/dist/core/sentry/instrument.js +54 -43
  416. package/dist/core/sentry/instrument.js.map +1 -1
  417. package/dist/core/store/front-matter-cache.js +239 -153
  418. package/dist/core/store/front-matter-cache.js.map +1 -1
  419. package/dist/core/store/item-store.js +33 -26
  420. package/dist/core/store/item-store.js.map +1 -1
  421. package/dist/core/store/settings.js +247 -203
  422. package/dist/core/store/settings.js.map +1 -1
  423. package/dist/core/test/background-runs.js +189 -160
  424. package/dist/core/test/background-runs.js.map +1 -1
  425. package/dist/mcp/server.js +387 -367
  426. package/dist/mcp/server.js.map +1 -1
  427. package/dist/sdk/cli-contracts/flag-contracts.js +111 -180
  428. package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -1
  429. package/dist/sdk/cli-contracts/tool-schema.js +76 -45
  430. package/dist/sdk/cli-contracts/tool-schema.js.map +1 -1
  431. package/dist/sdk/compose.d.ts +4 -1
  432. package/dist/sdk/compose.js +181 -115
  433. package/dist/sdk/compose.js.map +1 -1
  434. package/docs/RELEASING.md +2 -3
  435. package/package.json +2 -2
  436. package/packages/pm-beads/extensions/beads/runtime.ts +240 -167
  437. package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +65 -58
  438. package/packages/pm-todos/extensions/todos/runtime.ts +65 -42
  439. package/dist/cli-bundle/chunks/activity-EJBMXUBH.js +0 -16
  440. package/dist/cli-bundle/chunks/aggregate-MOC4TR2G.js.map +0 -1
  441. package/dist/cli-bundle/chunks/chunk-53ARXF2O.js.map +0 -7
  442. package/dist/cli-bundle/chunks/chunk-5IRVSKPS.js.map +0 -1
  443. package/dist/cli-bundle/chunks/chunk-5T6WPLRO.js.map +0 -7
  444. package/dist/cli-bundle/chunks/chunk-6T5ZIWBS.js.map +0 -7
  445. package/dist/cli-bundle/chunks/chunk-6YRAMXRS.js.map +0 -1
  446. package/dist/cli-bundle/chunks/chunk-7WDETKGP.js.map +0 -7
  447. package/dist/cli-bundle/chunks/chunk-A3UNLXNJ.js.map +0 -7
  448. package/dist/cli-bundle/chunks/chunk-AWN4PPH5.js.map +0 -7
  449. package/dist/cli-bundle/chunks/chunk-BOWQWXLI.js.map +0 -1
  450. package/dist/cli-bundle/chunks/chunk-C2KCIZKZ.js +0 -115
  451. package/dist/cli-bundle/chunks/chunk-C2KCIZKZ.js.map +0 -1
  452. package/dist/cli-bundle/chunks/chunk-CHRNYKNI.js.map +0 -7
  453. package/dist/cli-bundle/chunks/chunk-CY5IJMUM.js.map +0 -1
  454. package/dist/cli-bundle/chunks/chunk-D5LYZVGB.js.map +0 -1
  455. package/dist/cli-bundle/chunks/chunk-DJDXAU74.js.map +0 -7
  456. package/dist/cli-bundle/chunks/chunk-DORJSBGJ.js.map +0 -7
  457. package/dist/cli-bundle/chunks/chunk-DU66JUGT.js.map +0 -7
  458. package/dist/cli-bundle/chunks/chunk-F6VH3LFC.js +0 -118
  459. package/dist/cli-bundle/chunks/chunk-F6VH3LFC.js.map +0 -7
  460. package/dist/cli-bundle/chunks/chunk-FDEVKXC4.js.map +0 -1
  461. package/dist/cli-bundle/chunks/chunk-GF7EAR22.js.map +0 -7
  462. package/dist/cli-bundle/chunks/chunk-HIBK6H4S.js.map +0 -1
  463. package/dist/cli-bundle/chunks/chunk-IHXXUIXS.js.map +0 -1
  464. package/dist/cli-bundle/chunks/chunk-ISEKN64V.js +0 -35
  465. package/dist/cli-bundle/chunks/chunk-ISEKN64V.js.map +0 -7
  466. package/dist/cli-bundle/chunks/chunk-IZQOJR2B.js.map +0 -7
  467. package/dist/cli-bundle/chunks/chunk-JTRKME24.js.map +0 -1
  468. package/dist/cli-bundle/chunks/chunk-JZG5ADVE.js.map +0 -1
  469. package/dist/cli-bundle/chunks/chunk-K46GQ265.js.map +0 -1
  470. package/dist/cli-bundle/chunks/chunk-KGQ3W65B.js.map +0 -1
  471. package/dist/cli-bundle/chunks/chunk-KTMMTOIP.js.map +0 -7
  472. package/dist/cli-bundle/chunks/chunk-KYDYQMNW.js.map +0 -7
  473. package/dist/cli-bundle/chunks/chunk-NIBP3I7A.js.map +0 -1
  474. package/dist/cli-bundle/chunks/chunk-NO6Y6FB2.js.map +0 -7
  475. package/dist/cli-bundle/chunks/chunk-QE5UFCCO.js.map +0 -1
  476. package/dist/cli-bundle/chunks/chunk-RM6MHL6A.js.map +0 -7
  477. package/dist/cli-bundle/chunks/chunk-RPRW26NG.js.map +0 -1
  478. package/dist/cli-bundle/chunks/chunk-SNUK7H5J.js.map +0 -7
  479. package/dist/cli-bundle/chunks/chunk-T7ZMQI4J.js.map +0 -1
  480. package/dist/cli-bundle/chunks/chunk-UB3V5WUI.js.map +0 -1
  481. package/dist/cli-bundle/chunks/chunk-UFKNF23C.js.map +0 -7
  482. package/dist/cli-bundle/chunks/chunk-V3KLX7U7.js.map +0 -1
  483. package/dist/cli-bundle/chunks/chunk-VD3LKZFX.js.map +0 -1
  484. package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js +0 -32
  485. package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js.map +0 -1
  486. package/dist/cli-bundle/chunks/chunk-WTRUDJ3R.js.map +0 -1
  487. package/dist/cli-bundle/chunks/chunk-Z55WX4IQ.js.map +0 -1
  488. package/dist/cli-bundle/chunks/chunk-Z5BM2FKQ.js.map +0 -7
  489. package/dist/cli-bundle/chunks/chunk-ZEATCVAC.js.map +0 -7
  490. package/dist/cli-bundle/chunks/chunk-ZFIEEDTJ.js.map +0 -7
  491. package/dist/cli-bundle/chunks/chunk-ZIE6WXJ2.js.map +0 -1
  492. package/dist/cli-bundle/chunks/close-37KEHLYM.js +0 -14
  493. package/dist/cli-bundle/chunks/close-many-BFMP6HHK.js.map +0 -7
  494. package/dist/cli-bundle/chunks/close-many-CXJBOWWY.js.map +0 -1
  495. package/dist/cli-bundle/chunks/config-FIXJZEQK.js +0 -1541
  496. package/dist/cli-bundle/chunks/config-FIXJZEQK.js.map +0 -7
  497. package/dist/cli-bundle/chunks/config-X3ZVCUUG.js +0 -1531
  498. package/dist/cli-bundle/chunks/config-X3ZVCUUG.js.map +0 -1
  499. package/dist/cli-bundle/chunks/contracts-KP4QAGVW.js.map +0 -1
  500. package/dist/cli-bundle/chunks/contracts-SMOAN5NF.js.map +0 -7
  501. package/dist/cli-bundle/chunks/create-DFMNBKBS.js +0 -28
  502. package/dist/cli-bundle/chunks/get-AWK324RS.js.map +0 -7
  503. package/dist/cli-bundle/chunks/get-VYPIICPC.js.map +0 -1
  504. package/dist/cli-bundle/chunks/health-FBCVZGSX.js.map +0 -7
  505. package/dist/cli-bundle/chunks/health-Q66C43GN.js.map +0 -1
  506. package/dist/cli-bundle/chunks/history-5XUSLAJA.js +0 -18
  507. package/dist/cli-bundle/chunks/history-compact-2GHT32UX.js.map +0 -1
  508. package/dist/cli-bundle/chunks/history-compact-WLCQEKXS.js.map +0 -7
  509. package/dist/cli-bundle/chunks/history-redact-BVHWDXPR.js +0 -19
  510. package/dist/cli-bundle/chunks/history-repair-FY75IC26.js.map +0 -1
  511. package/dist/cli-bundle/chunks/history-repair-GABSDSVD.js.map +0 -7
  512. package/dist/cli-bundle/chunks/init-TRYJELH4.js +0 -21
  513. package/dist/cli-bundle/chunks/next-66BJB4N2.js.map +0 -7
  514. package/dist/cli-bundle/chunks/next-N5MWJTBY.js.map +0 -1
  515. package/dist/cli-bundle/chunks/plan-DQ7G4EDC.js.map +0 -7
  516. package/dist/cli-bundle/chunks/plan-ZHKZ7JVF.js.map +0 -1
  517. package/dist/cli-bundle/chunks/register-list-query-KY6Z6WV7.js.map +0 -7
  518. package/dist/cli-bundle/chunks/register-list-query-Y2VRHPCL.js.map +0 -1
  519. package/dist/cli-bundle/chunks/register-mutation-N6AYSKPM.js.map +0 -7
  520. package/dist/cli-bundle/chunks/register-mutation-PCARIGZS.js.map +0 -1
  521. package/dist/cli-bundle/chunks/register-operations-L6CYTOIH.js.map +0 -7
  522. package/dist/cli-bundle/chunks/register-operations-YAT6FUUB.js.map +0 -1
  523. package/dist/cli-bundle/chunks/register-setup-MPANILQF.js.map +0 -7
  524. package/dist/cli-bundle/chunks/register-setup-N7UGXYJC.js.map +0 -1
  525. package/dist/cli-bundle/chunks/restore-IRAKSWIW.js +0 -17
  526. package/dist/cli-bundle/chunks/telemetry-DIFPXCAT.js.map +0 -7
  527. package/dist/cli-bundle/chunks/telemetry-WTYFUPRL.js.map +0 -1
  528. package/dist/cli-bundle/chunks/test-all-PZTBLLQ6.js +0 -360
  529. package/dist/cli-bundle/chunks/test-all-PZTBLLQ6.js.map +0 -7
  530. package/dist/cli-bundle/chunks/test-all-XLPI4USF.js +0 -357
  531. package/dist/cli-bundle/chunks/test-all-XLPI4USF.js.map +0 -1
  532. package/dist/cli-bundle/chunks/test-runs-CA6K32RD.js.map +0 -1
  533. package/dist/cli-bundle/chunks/test-runs-LANLLPVO.js.map +0 -7
  534. package/dist/cli-bundle/chunks/update-UXDLTEOZ.js +0 -24
  535. package/dist/cli-bundle/chunks/validate-2G566PKQ.js.map +0 -7
  536. package/dist/cli-bundle/chunks/validate-BDPVXHHH.js.map +0 -1
  537. /package/dist/cli-bundle/chunks/{activity-MVSEND6D.js.map → activity-CUC4JY3U.js.map} +0 -0
  538. /package/dist/cli-bundle/chunks/{activity-EJBMXUBH.js.map → activity-WEIEMM73.js.map} +0 -0
  539. /package/dist/cli-bundle/chunks/{append-KDHT4GHI.js.map → append-H32VOR2Y.js.map} +0 -0
  540. /package/dist/cli-bundle/chunks/{append-LEDBAM3K.js.map → append-UBM632FK.js.map} +0 -0
  541. /package/dist/cli-bundle/chunks/{chunk-SJZTPVFT.js.map → chunk-2ASNV4DH.js.map} +0 -0
  542. /package/dist/cli-bundle/chunks/{chunk-JVQ7UOYC.js.map → chunk-2CHRYUXL.js.map} +0 -0
  543. /package/dist/cli-bundle/chunks/{chunk-DRPF274X.js.map → chunk-3LCUASYG.js.map} +0 -0
  544. /package/dist/cli-bundle/chunks/{chunk-JJ4SG243.js.map → chunk-3Q2HBMTI.js.map} +0 -0
  545. /package/dist/cli-bundle/chunks/{chunk-TQ6E76BE.js.map → chunk-55XRYWEG.js.map} +0 -0
  546. /package/dist/cli-bundle/chunks/{chunk-IBU2LLWM.js.map → chunk-A6VOGKBA.js.map} +0 -0
  547. /package/dist/cli-bundle/chunks/{chunk-MLHX6DN5.js.map → chunk-AIAIXG7I.js.map} +0 -0
  548. /package/dist/cli-bundle/chunks/{chunk-5ABGFWR4.js.map → chunk-BTX5MIQF.js.map} +0 -0
  549. /package/dist/cli-bundle/chunks/{chunk-3JWQCLR5.js.map → chunk-CYBDUHNO.js.map} +0 -0
  550. /package/dist/cli-bundle/chunks/{chunk-WFJZDUM7.js.map → chunk-CZPVDLD2.js.map} +0 -0
  551. /package/dist/cli-bundle/chunks/{chunk-HUYYMTGW.js.map → chunk-EUKTMRN3.js.map} +0 -0
  552. /package/dist/cli-bundle/chunks/{chunk-EVWYAG46.js.map → chunk-FFOQHGNH.js.map} +0 -0
  553. /package/dist/cli-bundle/chunks/{chunk-IF4ERU6A.js.map → chunk-GFMSLORL.js.map} +0 -0
  554. /package/dist/cli-bundle/chunks/{chunk-IDYCAK35.js.map → chunk-H4GRLYJS.js.map} +0 -0
  555. /package/dist/cli-bundle/chunks/{chunk-VMY7MZEM.js.map → chunk-HQTPRV4D.js.map} +0 -0
  556. /package/dist/cli-bundle/chunks/{chunk-7L6TXOOC.js.map → chunk-JMK5GCK2.js.map} +0 -0
  557. /package/dist/cli-bundle/chunks/{chunk-KRASIL6M.js.map → chunk-K2VYLVX4.js.map} +0 -0
  558. /package/dist/cli-bundle/chunks/{chunk-4YIMPANT.js.map → chunk-KCO2EAN5.js.map} +0 -0
  559. /package/dist/cli-bundle/chunks/{chunk-D6USKAMA.js.map → chunk-KLXF7NCC.js.map} +0 -0
  560. /package/dist/cli-bundle/chunks/{chunk-OB3RJV5F.js.map → chunk-LRKMWUUV.js.map} +0 -0
  561. /package/dist/cli-bundle/chunks/{chunk-74PUWBGN.js.map → chunk-LTRAF2D7.js.map} +0 -0
  562. /package/dist/cli-bundle/chunks/{chunk-4TXTVZL3.js.map → chunk-MRD4T5LF.js.map} +0 -0
  563. /package/dist/cli-bundle/chunks/{chunk-E2Q2ULMR.js.map → chunk-N2JSWVWG.js.map} +0 -0
  564. /package/dist/cli-bundle/chunks/{chunk-7RIJGN4R.js.map → chunk-QH3FSKRJ.js.map} +0 -0
  565. /package/dist/cli-bundle/chunks/{chunk-OUQ5JEFM.js.map → chunk-S62UANU7.js.map} +0 -0
  566. /package/dist/cli-bundle/chunks/{chunk-DLDCPF5X.js.map → chunk-U2BEEM2X.js.map} +0 -0
  567. /package/dist/cli-bundle/chunks/{chunk-73PTKMAE.js.map → chunk-UT73HUPC.js.map} +0 -0
  568. /package/dist/cli-bundle/chunks/{chunk-F7G53BOA.js.map → chunk-UTSH5GWX.js.map} +0 -0
  569. /package/dist/cli-bundle/chunks/{chunk-JIP67N2K.js.map → chunk-Y4NRKBFW.js.map} +0 -0
  570. /package/dist/cli-bundle/chunks/{chunk-FBZ5XAAF.js.map → chunk-YPKFV2JR.js.map} +0 -0
  571. /package/dist/cli-bundle/chunks/{chunk-BN3CWK6G.js.map → chunk-ZNHEYCDD.js.map} +0 -0
  572. /package/dist/cli-bundle/chunks/{chunk-YEDFE4DC.js.map → chunk-ZNT7KEWE.js.map} +0 -0
  573. /package/dist/cli-bundle/chunks/{claim-HMCLSLUE.js.map → claim-SENTPZBN.js.map} +0 -0
  574. /package/dist/cli-bundle/chunks/{claim-6NINZYB3.js.map → claim-Z7MEQCBT.js.map} +0 -0
  575. /package/dist/cli-bundle/chunks/{close-OP3LK7Z2.js.map → close-424MX4CU.js.map} +0 -0
  576. /package/dist/cli-bundle/chunks/{close-37KEHLYM.js.map → close-YCWQQPDS.js.map} +0 -0
  577. /package/dist/cli-bundle/chunks/{comments-ETHABIY6.js.map → comments-4FGNTSNV.js.map} +0 -0
  578. /package/dist/cli-bundle/chunks/{comments-MU2WMBUY.js.map → comments-7YS5MY5X.js.map} +0 -0
  579. /package/dist/cli-bundle/chunks/{context-7ZEZV3BV.js.map → context-LHVKJSPJ.js.map} +0 -0
  580. /package/dist/cli-bundle/chunks/{context-XDI4DKKT.js.map → context-ZQY54JNS.js.map} +0 -0
  581. /package/dist/cli-bundle/chunks/{copy-JJ3KOQW2.js.map → copy-GYNQQPW2.js.map} +0 -0
  582. /package/dist/cli-bundle/chunks/{copy-CWM6SBY6.js.map → copy-TLW7JTQT.js.map} +0 -0
  583. /package/dist/cli-bundle/chunks/{create-J5Q2ELZT.js.map → create-VSKYSOCD.js.map} +0 -0
  584. /package/dist/cli-bundle/chunks/{create-DFMNBKBS.js.map → create-XTMAPS7I.js.map} +0 -0
  585. /package/dist/cli-bundle/chunks/{delete-2GZLQEUQ.js.map → delete-4W5JYCEG.js.map} +0 -0
  586. /package/dist/cli-bundle/chunks/{delete-OOQS4KVD.js.map → delete-ANTOTI2I.js.map} +0 -0
  587. /package/dist/cli-bundle/chunks/{deps-IF4IGL4R.js.map → deps-HPPE6MJN.js.map} +0 -0
  588. /package/dist/cli-bundle/chunks/{deps-ZVGGCRR6.js.map → deps-ZQZN54EZ.js.map} +0 -0
  589. /package/dist/cli-bundle/chunks/{docs-NFTBCQQC.js.map → docs-RPOVFMP3.js.map} +0 -0
  590. /package/dist/cli-bundle/chunks/{docs-2TIFR62T.js.map → docs-XJNYBJGE.js.map} +0 -0
  591. /package/dist/cli-bundle/chunks/{eval-2F6EH4XN.js.map → eval-DM6JBZTS.js.map} +0 -0
  592. /package/dist/cli-bundle/chunks/{eval-PFKXQR3B.js.map → eval-RFBI5FGS.js.map} +0 -0
  593. /package/dist/cli-bundle/chunks/{extension-GMVOIP4O.js.map → extension-B3YY4WY5.js.map} +0 -0
  594. /package/dist/cli-bundle/chunks/{extension-3LRYX7SW.js.map → extension-TTSEFQTS.js.map} +0 -0
  595. /package/dist/cli-bundle/chunks/{files-DF3HO6XK.js.map → files-5D65CHGE.js.map} +0 -0
  596. /package/dist/cli-bundle/chunks/{files-T5ODMETM.js.map → files-GPIG77EN.js.map} +0 -0
  597. /package/dist/cli-bundle/chunks/{focus-MY5ARIEK.js.map → focus-C3PEJV2C.js.map} +0 -0
  598. /package/dist/cli-bundle/chunks/{focus-DLXKK4AH.js.map → focus-ZHN7WIGX.js.map} +0 -0
  599. /package/dist/cli-bundle/chunks/{gc-MDGRR2SU.js.map → gc-D4JQ6OWN.js.map} +0 -0
  600. /package/dist/cli-bundle/chunks/{gc-FULIVYR4.js.map → gc-VZIXDL32.js.map} +0 -0
  601. /package/dist/cli-bundle/chunks/{history-5XUSLAJA.js.map → history-DD7L7BNL.js.map} +0 -0
  602. /package/dist/cli-bundle/chunks/{history-X4OSES6K.js.map → history-IL7XCEX2.js.map} +0 -0
  603. /package/dist/cli-bundle/chunks/{history-redact-BVHWDXPR.js.map → history-redact-IX4YEWMY.js.map} +0 -0
  604. /package/dist/cli-bundle/chunks/{history-redact-45YW65BK.js.map → history-redact-VYCWQFK7.js.map} +0 -0
  605. /package/dist/cli-bundle/chunks/{init-KO7CGIRQ.js.map → init-F27NHENZ.js.map} +0 -0
  606. /package/dist/cli-bundle/chunks/{init-TRYJELH4.js.map → init-HHVQQP6C.js.map} +0 -0
  607. /package/dist/cli-bundle/chunks/{learnings-LHZT5BHW.js.map → learnings-HJVDQIGY.js.map} +0 -0
  608. /package/dist/cli-bundle/chunks/{learnings-3F7YLI45.js.map → learnings-XSFSUUWK.js.map} +0 -0
  609. /package/dist/cli-bundle/chunks/{list-Y6AU5BJS.js.map → list-HPMEKCAA.js.map} +0 -0
  610. /package/dist/cli-bundle/chunks/{list-ROT7JF62.js.map → list-VMPWTURB.js.map} +0 -0
  611. /package/dist/cli-bundle/chunks/{notes-FW6YFLND.js.map → notes-GDZIKGR6.js.map} +0 -0
  612. /package/dist/cli-bundle/chunks/{notes-EVJZ3VAB.js.map → notes-WDDBPC4D.js.map} +0 -0
  613. /package/dist/cli-bundle/chunks/{profile-CHAW6SEA.js.map → profile-CCOKZ2IQ.js.map} +0 -0
  614. /package/dist/cli-bundle/chunks/{profile-UPZGCDOG.js.map → profile-HUCENIEQ.js.map} +0 -0
  615. /package/dist/cli-bundle/chunks/{restore-DKMCLPI5.js.map → restore-4CBWUMCX.js.map} +0 -0
  616. /package/dist/cli-bundle/chunks/{restore-IRAKSWIW.js.map → restore-5UEAGG3W.js.map} +0 -0
  617. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-3F4QUEDH.js.map → scheduling-shortcuts-6VFKNKCM.js.map} +0 -0
  618. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-BNZLQK36.js.map → scheduling-shortcuts-ERHCVTEM.js.map} +0 -0
  619. /package/dist/cli-bundle/chunks/{schema-OLT6LVKH.js.map → schema-TDGK6N3I.js.map} +0 -0
  620. /package/dist/cli-bundle/chunks/{schema-XJXKJQF5.js.map → schema-UE5KKAUX.js.map} +0 -0
  621. /package/dist/cli-bundle/chunks/{search-KP6H7COV.js.map → search-FP7MEU4S.js.map} +0 -0
  622. /package/dist/cli-bundle/chunks/{search-CX5UMV4H.js.map → search-K4CFLQ5S.js.map} +0 -0
  623. /package/dist/cli-bundle/chunks/{stats-QZUG6MX5.js.map → stats-NJJCALEZ.js.map} +0 -0
  624. /package/dist/cli-bundle/chunks/{stats-7XW4OEMK.js.map → stats-XT6QRKQY.js.map} +0 -0
  625. /package/dist/cli-bundle/chunks/{test-QNDXZQCW.js.map → test-UFSJ5YIO.js.map} +0 -0
  626. /package/dist/cli-bundle/chunks/{test-HU2BS7EY.js.map → test-YCDAUBWF.js.map} +0 -0
  627. /package/dist/cli-bundle/chunks/{update-UXDLTEOZ.js.map → update-MTCFES6X.js.map} +0 -0
  628. /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]="423439fe-45c5-53c3-8269-8b25cd07afff")}catch(e){}}();
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-4YIMPANT.js";
18
+ } from "./chunk-KCO2EAN5.js";
19
19
  import {
20
20
  createStdinTokenResolver,
21
21
  parseCsvKv,
22
22
  parseOptionalNumber
23
- } from "./chunk-D6USKAMA.js";
23
+ } from "./chunk-KLXF7NCC.js";
24
24
  import {
25
25
  runInit
26
- } from "./chunk-JTRKME24.js";
26
+ } from "./chunk-6YCYF2AI.js";
27
27
  import {
28
28
  locateItem,
29
29
  mutateItem,
30
30
  readLocatedItem
31
- } from "./chunk-KGQ3W65B.js";
31
+ } from "./chunk-NRZS637N.js";
32
32
  import {
33
33
  compareTimestampStrings,
34
34
  nowIso
35
- } from "./chunk-KRASIL6M.js";
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-CY5IJMUM.js";
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
- const parsed = parseNpxCommand(args);
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
- const parsed = parsePnpmDlxCommand(args);
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
- const parsed = parseNpmExecCommand(args);
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 args.includes("--test") || args.some((arg) => arg === "vitest" || arg === "vitest.mjs" || arg.endsWith("/vitest") || arg.endsWith("/vitest.mjs"));
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
- const dlx = parsePnpmDlxCommand(args);
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 false;
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((entry) => {
823
- const trimmed = entry.trim();
824
- const kv = looksLikeStructuredLinkedTestEntry(trimmed) ? normalizeStructuredLinkedTestEntry(parseCsvKv(entry, "--add"), "--add") : { command: trimmed };
825
- const command = kv.command?.trim() || void 0;
826
- const filePath = kv.path?.trim() || void 0;
827
- if (!command) {
828
- throw new PmCliError("--add requires command=<value> or a bare command (path=<value> is optional metadata)", EXIT_CODE.USAGE);
829
- }
830
- const sharedHostSafe = parseLinkedTestBoolean(kv.shared_host_safe?.trim(), "--add", "shared_host_safe");
831
- if (command) {
832
- assertNoRecursiveTestAllCommand(command);
833
- assertSandboxSafeTestRunnerCommand(command);
834
- }
835
- const timeoutSecondsRaw = kv.timeout_seconds?.trim();
836
- const timeoutAliasRaw = kv.timeout?.trim();
837
- if (timeoutSecondsRaw && timeoutAliasRaw && timeoutSecondsRaw !== timeoutAliasRaw) {
838
- throw new PmCliError("--add timeout and timeout_seconds must match when both are provided", EXIT_CODE.USAGE);
839
- }
840
- const timeoutRaw = timeoutSecondsRaw ?? timeoutAliasRaw;
841
- const timeoutSeconds = timeoutRaw === void 0 ? void 0 : Math.floor(parseOptionalNumber(timeoutRaw, "timeout_seconds"));
842
- const envSet = parseLinkedTestEnvSet(kv.env_set?.trim(), "--add");
843
- const envClear = parseLinkedTestEnvClear(kv.env_clear?.trim(), "--add");
844
- const pmContextMode = parseLinkedTestContextMode(kv.pm_context_mode?.trim(), "--add");
845
- return {
846
- command,
847
- path: filePath,
848
- scope: ensureScope(kv.scope),
849
- timeout_seconds: timeoutSeconds,
850
- pm_context_mode: pmContextMode,
851
- env_set: envSet,
852
- env_clear: envClear,
853
- shared_host_safe: sharedHostSafe,
854
- assert_stdout_contains: parseLinkedTestStringList(kv.assert_stdout_contains?.trim()),
855
- assert_stdout_regex: parseLinkedTestRegexList(kv.assert_stdout_regex?.trim(), "--add", "assert_stdout_regex"),
856
- assert_stderr_contains: parseLinkedTestStringList(kv.assert_stderr_contains?.trim()),
857
- assert_stderr_regex: parseLinkedTestRegexList(kv.assert_stderr_regex?.trim(), "--add", "assert_stderr_regex"),
858
- assert_stdout_min_lines: parseLinkedTestMinLines(kv.assert_stdout_min_lines?.trim(), "--add"),
859
- assert_json_field_equals: parseLinkedTestAssertionEqualsMap(kv.assert_json_field_equals?.trim(), "--add"),
860
- assert_json_field_gte: parseLinkedTestAssertionGteMap(kv.assert_json_field_gte?.trim(), "--add"),
861
- note: kv.note?.trim() || void 0
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
- for (const expected of linkedTest.assert_stdout_contains ?? []) {
1393
- if (!stdout.includes(expected)) {
1394
- failures.push(`stdout missing required text: "${expected}"`);
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 schemaSandboxPmPath = path.join(sandboxRoot, "schema", "project", ".agents", "pm");
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 runInit(void 0, { path: schemaSandboxPmPath });
1506
- await runInit(void 0, { path: schemaSandboxGlobalPath });
1507
- await runInit(void 0, { path: trackerSandboxPmPath });
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 linkedOverridePmContextMode = typeof linkedTest.pm_context_mode === "string" && linkedTest.pm_context_mode.trim().length > 0 ? parsePmContextMode(linkedTest.pm_context_mode) : void 0;
1549
- const isPmCommand = typeof linkedTest.command === "string" && linkedTest.command.length > 0 ? commandInvokesPmCli(linkedTest.command) : false;
1550
- const isPmTrackerReadCommand = isPmCommand && typeof linkedTest.command === "string" && linkedTest.command.length > 0 ? commandInvokesPmTrackerReadCommand(linkedTest.command) : false;
1551
- const autoPmContextApplied = options?.autoPmContext === true && isPmTrackerReadCommand;
1552
- const requestedPmContextMode = autoPmContextApplied ? "auto" : resolveLinkedTestRequestedContextMode(linkedTest, runLevelPmContextMode, options?.overrideLinkedPmContext === true);
1553
- const effectivePmContextMode = resolveLinkedTestEffectiveContextMode(requestedPmContextMode, isPmTrackerReadCommand);
1554
- const executionContext = buildExecutionContext(isPmCommand, isPmTrackerReadCommand, requestedPmContextMode, effectivePmContextMode, autoPmContextApplied);
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
- if (effectiveDirectives.shared_host_safe) {
1617
- applySharedHostSafeDefaults(executionEnv);
1618
- }
1619
- executionEnv.FORCE_COLOR = "0";
1620
- executionEnv.PM_PATH = executionContext.sandbox_project_pm_path;
1621
- executionEnv.PM_GLOBAL_PATH = executionContext.sandbox_global_pm_path;
1622
- const execution = await runLinkedTestCommand(linkedTest.command, timeoutMs, executionEnv, {
1623
- index: index + 1,
1624
- total: tests.length,
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
- const failureCategory = classifyLinkedTestFailure(execution);
1674
- results.push({
1675
- command: linkedTest.command,
1676
- path: linkedTest.path,
1677
- status: "failed",
1678
- exit_code: resolveLinkedTestFailureExitCode(execution),
1679
- failure_category: failureCategory,
1680
- execution_context: executionContext,
1681
- stdout: execution.stdout,
1682
- stderr: execution.stderr,
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(sandboxRoot, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
1724
+ await rm(layout.root, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
1688
1725
  }
1689
1726
  return results;
1690
1727
  }
1691
- async function runTest(id, options, global) {
1692
- const stdinResolver = createStdinTokenResolver();
1693
- const pmRoot = resolvePmRoot(process.cwd(), global.path);
1694
- if (!await pathExists(getSettingsPath(pmRoot))) {
1695
- throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
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
- const testsToRun = runSelection?.selected ?? tests;
1772
- const runStartedAt = options.run === true ? nowIso() : void 0;
1773
- const runResults = options.run === true ? await runLinkedTests(testsToRun, defaultTimeoutSeconds, {
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
- const failureCategories = countFailureCategories(runResults);
1791
- const failOnSkippedTriggered = options.run === true && options.failOnSkipped === true && runResults.some((entry) => entry.status === "skipped");
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
- if (options.run === true && runStartedAt && settings.testing.record_results_to_items === true) {
1801
- const summary = summarizeRunResultStatuses(runResults);
1802
- const trackedRunId = resolveTrackedRunId("test");
1803
- const attemptRaw = process.env.PM_BACKGROUND_TEST_RUN_ATTEMPT?.trim();
1804
- const parsedAttempt = attemptRaw ? Number.parseInt(attemptRaw, 10) : Number.NaN;
1805
- const resumedFrom = process.env.PM_BACKGROUND_TEST_RUN_RESUMED_FROM?.trim();
1806
- try {
1807
- await appendTrackedTestRunSummary({
1808
- pmRoot,
1809
- settings,
1810
- itemId,
1811
- author: resolveAuthor(options.author, settings.author_default),
1812
- message: `Track test run summary (${trackedRunId})`,
1813
- entry: {
1814
- run_id: trackedRunId,
1815
- kind: "test",
1816
- status: summary.failed > 0 || failOnSkippedTriggered === true ? "failed" : "passed",
1817
- started_at: runStartedAt,
1818
- finished_at: nowIso(),
1819
- recorded_at: nowIso(),
1820
- attempt: Number.isFinite(parsedAttempt) && parsedAttempt >= 1 ? parsedAttempt : void 0,
1821
- resumed_from: resumedFrom && resumedFrom.length > 0 ? resumedFrom : void 0,
1822
- passed: summary.passed,
1823
- failed: summary.failed,
1824
- skipped: summary.skipped,
1825
- fail_on_skipped_triggered: failOnSkippedTriggered ? true : void 0
1826
- }
1827
- });
1828
- } catch (error) {
1829
- warnings.push(`test_result_tracking_failed:${itemId}:${error instanceof Error ? error.message : String(error)}`);
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-K46GQ265.js.map
1957
+ //# sourceMappingURL=chunk-Q6NXOHS6.js.map
1890
1958
 
1891
- //# debugId=423439fe-45c5-53c3-8269-8b25cd07afff
1959
+ //# debugId=4f00aa88-9fd7-5416-a1a3-4df09dba7e93