@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,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../../cli/commands/test.ts", "../../../../../../../../core/test/item-test-run-tracking.ts", "../../../../../../../../core/test/run-selectors.ts", "../../../../../../../../cli/commands/test/linked-command-detection.ts"],
4
- "sourcesContent": ["/**\n * @module cli/commands/test\n *\n * Implements the pm test command surface and its agent-facing runtime behavior.\n */\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { cp, mkdir, mkdtemp, readdir, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { getActiveExtensionRegistrations } from \"../../core/extensions/index.js\";\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { createStdinTokenResolver, parseCsvKv, parseOptionalNumber } from \"../../core/item/parse.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { stableValueEquals } from \"../../core/shared/serialization.js\";\nimport { nowIso } from \"../../core/shared/time.js\";\nimport { locateItem, mutateItem, readLocatedItem } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, ITEM_FILE_EXTENSIONS, resolveGlobalPmRoot, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport { appendTrackedTestRunSummary } from \"../../core/test/item-test-run-tracking.js\";\nimport { runInit } from \"./init.js\";\nimport { looksLikeStructuredLinkedTestEntry, normalizeStructuredLinkedTestEntry } from \"./linked-test-entry.js\";\nimport {\n LINKED_TEST_ENV_NAME_PATTERN,\n LINKED_TEST_PM_CONTEXT_MODE_VALUES as PM_CONTEXT_MODE_VALUES,\n LINKED_TEST_PROTECTED_ENV_KEYS,\n parseLinkedTestAssertionEqualsMap,\n parseLinkedTestAssertionGteMap,\n parseLinkedTestBoolean as parseLinkedTestBooleanValue,\n parseLinkedTestContextMode as parseLinkedTestContextModeValue,\n parseLinkedTestEnvClear as parseLinkedTestEnvClearValue,\n parseLinkedTestEnvSet as parseLinkedTestEnvSetValue,\n parseLinkedTestJsonEntries,\n parseLinkedTestMinLines,\n parseLinkedTestRegexList,\n parseLinkedTestStringList,\n type LinkedTestPmContextMode,\n} from \"./linked-test-parsers.js\";\nimport {\n parseOnlyIndexValue,\n resolveLinkedTestRunSelection,\n type LinkedTestRunSelection,\n type LinkedTestSelectorKind,\n} from \"../../core/test/run-selectors.js\";\nimport { SCOPE_VALUES } from \"../../types/index.js\";\nimport type { LinkedTest, LinkScope } from \"../../types/index.js\";\n\nconst TEST_OUTPUT_MAX_BUFFER_BYTES = 20 * 1024 * 1024;\nconst DEFAULT_LINKED_TEST_TIMEOUT_FORCE_KILL_DELAY_MS = 3000;\nconst DEFAULT_LINKED_TEST_HEARTBEAT_INTERVAL_MS = 10000;\nconst DEFAULT_LINKED_TEST_PIPE_CLOSE_GRACE_MS = 5000;\nconst MAX_LINKED_TEST_COMMAND_LABEL_LENGTH = 120;\ntype ResolvedLinkedTestPmContextMode = Exclude<LinkedTestPmContextMode, \"auto\">;\nconst LINKED_TEST_TRACKER_DIRS_TO_SKIP = new Set([\"locks\", \"extensions\", \"runtime\"]);\nconst LINKED_TEST_ITEM_COUNT_DIRS_TO_SKIP = new Set([\"history\", \"index\", \"search\", \"extensions\", \"locks\", \"runtime\"]);\nconst LINKED_TEST_INFRA_COLLISION_PATTERNS = [\n /eaddrinuse/i,\n /address already in use/i,\n /port\\s+\\d+\\s+is already in use/i,\n /web server[^.\\n]*already running/i,\n /failed to listen on/i,\n];\nconst PM_SUBCOMMANDS_WITH_ITEM_REFERENCE = new Set([\n \"get\",\n \"history\",\n \"restore\",\n \"update\",\n \"close\",\n \"delete\",\n \"append\",\n \"claim\",\n \"release\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"files\",\n \"docs\",\n \"deps\",\n \"test\",\n]);\nconst PM_TRACKER_READ_SUBCOMMANDS = new Set([\n \"activity\",\n \"calendar\",\n \"context\",\n \"ctx\",\n \"deps\",\n \"get\",\n \"health\",\n \"history\",\n \"list\",\n \"list-all\",\n \"list-blocked\",\n \"list-canceled\",\n \"list-closed\",\n \"list-draft\",\n \"list-in-progress\",\n \"list-open\",\n \"search\",\n \"stats\",\n \"test-all\",\n \"validate\",\n]);\n\nfunction readPositiveIntegerEnv(name: string, fallback: number): number {\n const raw = process.env[name];\n if (typeof raw !== \"string\" || raw.trim().length === 0) {\n return fallback;\n }\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return fallback;\n }\n return parsed;\n}\n\nfunction linkedTestTimeoutForceKillDelayMs(): number {\n return readPositiveIntegerEnv(\"PM_LINKED_TEST_TIMEOUT_FORCE_KILL_DELAY_MS\", DEFAULT_LINKED_TEST_TIMEOUT_FORCE_KILL_DELAY_MS);\n}\n\nfunction linkedTestHeartbeatIntervalMs(): number {\n return readPositiveIntegerEnv(\"PM_LINKED_TEST_HEARTBEAT_INTERVAL_MS\", DEFAULT_LINKED_TEST_HEARTBEAT_INTERVAL_MS);\n}\n\nfunction linkedTestPipeCloseGraceMs(): number {\n return readPositiveIntegerEnv(\"PM_LINKED_TEST_PIPE_CLOSE_GRACE_MS\", DEFAULT_LINKED_TEST_PIPE_CLOSE_GRACE_MS);\n}\n\ninterface LinkedTestExecutionResult {\n stdout: string;\n stderr: string;\n exitCode: number | null;\n signal?: NodeJS.Signals | null;\n timedOut: boolean;\n maxBufferExceeded: boolean;\n spawnError?: string;\n}\n\ninterface LinkedTestProgressContext {\n index: number;\n total: number;\n timeoutMs: number;\n command: string;\n}\n\ntype LinkedTestProgressMode = \"auto\" | \"always\" | \"off\";\n\ninterface LinkedTestSandboxSourceRoots {\n projectPmRoot: string;\n globalPmRoot: string;\n}\n\ninterface LinkedTestRuntimeDirectives {\n env_set: Record<string, string>;\n env_clear: string[];\n shared_host_safe: boolean;\n}\n\n/**\n * Documents the test command options payload exchanged by command, SDK, and package integrations.\n */\nexport interface TestCommandOptions {\n add?: string[];\n addJson?: string[];\n remove?: string[];\n list?: boolean;\n run?: boolean;\n match?: string;\n onlyIndex?: string | number;\n onlyLast?: boolean;\n timeout?: string;\n progress?: boolean;\n envSet?: string[];\n envClear?: string[];\n sharedHostSafe?: boolean;\n pmContext?: string;\n overrideLinkedPmContext?: boolean;\n failOnContextMismatch?: boolean;\n failOnSkipped?: boolean;\n failOnEmptyTestRun?: boolean;\n requireAssertionsForPm?: boolean;\n checkContext?: boolean;\n autoPmContext?: boolean;\n author?: string;\n message?: string;\n force?: boolean;\n}\n\n/**\n * Restricts linked test failure category values accepted by command, SDK, and storage contracts.\n */\nexport type LinkedTestFailureCategory =\n | \"infra_collision\"\n | \"assertion_failure\"\n | \"empty_run\"\n | \"timeout\"\n | \"max_buffer\"\n | \"spawn_error\"\n | \"signal\";\n\n/**\n * Documents the test run result payload exchanged by command, SDK, and package integrations.\n */\nexport interface TestRunResult {\n command?: string;\n path?: string;\n status: \"passed\" | \"failed\" | \"skipped\";\n exit_code?: number;\n failure_category?: LinkedTestFailureCategory;\n execution_context?: {\n requested_pm_context_mode: LinkedTestPmContextMode;\n pm_context_mode: LinkedTestPmContextMode;\n auto_pm_context_applied: boolean;\n is_pm_command: boolean;\n is_pm_tracker_read_command: boolean;\n source_project_pm_path: string;\n sandbox_project_pm_path: string;\n source_global_pm_path: string;\n sandbox_global_pm_path: string;\n source_project_item_count: number;\n sandbox_project_item_count: number;\n source_global_item_count: number;\n sandbox_global_item_count: number;\n mismatch_detected: boolean;\n project_extensions_seeded: boolean;\n global_extensions_seeded: boolean;\n };\n stdout?: string;\n stderr?: string;\n error?: string;\n}\n\n/**\n * Documents the test result payload exchanged by command, SDK, and package integrations.\n */\nexport interface TestResult {\n ok: boolean;\n id: string;\n tests: LinkedTest[];\n run_results: TestRunResult[];\n failure_categories: Record<LinkedTestFailureCategory, number>;\n selection?: Omit<LinkedTestRunSelection, \"selected\">;\n fail_on_skipped_triggered?: boolean;\n warnings?: string[];\n changed: boolean;\n count: number;\n}\n\nfunction resolveAuthor(candidate: string | undefined, fallback: string): string {\n const resolved = candidate ?? process.env.PM_AUTHOR ?? fallback;\n const trimmed = resolved.trim();\n return trimmed || \"unknown\";\n}\n\nfunction resolveTrackedRunId(kind: \"test\" | \"test-all\"): string {\n const fromEnv = process.env.PM_BACKGROUND_TEST_RUN_ID?.trim();\n if (fromEnv && fromEnv.length > 0) {\n return fromEnv;\n }\n return `${kind}-local-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction summarizeRunResultStatuses(results: TestRunResult[]): { passed: number; failed: number; skipped: number } {\n let passed = 0;\n let failed = 0;\n let skipped = 0;\n for (const entry of results) {\n if (entry.status === \"passed\") {\n passed += 1;\n continue;\n }\n if (entry.status === \"failed\") {\n failed += 1;\n continue;\n }\n skipped += 1;\n }\n return { passed, failed, skipped };\n}\n\n/**\n * Implements summarize context preflight for the public runtime surface of this module.\n */\nexport function summarizeContextPreflight(runResults: TestRunResult[]): {\n checked_pm_commands: number;\n tracker_read_commands: number;\n mismatches: number;\n auto_remediated: number;\n} {\n let checkedPmCommands = 0;\n let trackerReadCommands = 0;\n let mismatches = 0;\n let autoRemediated = 0;\n for (const result of runResults) {\n const context = result.execution_context;\n if (!context || context.is_pm_command !== true) {\n continue;\n }\n checkedPmCommands += 1;\n if (context.is_pm_tracker_read_command === true) {\n trackerReadCommands += 1;\n }\n if (context.mismatch_detected === true) {\n mismatches += 1;\n }\n if (context.auto_pm_context_applied === true) {\n autoRemediated += 1;\n }\n }\n return {\n checked_pm_commands: checkedPmCommands,\n tracker_read_commands: trackerReadCommands,\n mismatches,\n auto_remediated: autoRemediated,\n };\n}\n\nfunction ensureScope(raw: string | undefined): LinkScope {\n const value = (raw ?? \"project\") as LinkScope;\n if (!SCOPE_VALUES.includes(value)) {\n throw new PmCliError(`Invalid scope \"${raw}\"`, EXIT_CODE.USAGE);\n }\n return value;\n}\n\nfunction parsePmContextMode(raw: string | undefined): LinkedTestPmContextMode {\n if (!raw) {\n return \"schema\";\n }\n const normalized = raw.trim().toLowerCase();\n if ((PM_CONTEXT_MODE_VALUES as readonly string[]).includes(normalized)) {\n return normalized as LinkedTestPmContextMode;\n }\n throw new PmCliError(\n `Invalid --pm-context value \"${raw}\". Expected one of: ${PM_CONTEXT_MODE_VALUES.join(\", \")}`,\n EXIT_CODE.USAGE,\n );\n}\n\nfunction resolveLinkedTestRequestedContextMode(\n linkedTest: LinkedTest,\n runLevelMode: LinkedTestPmContextMode,\n overrideLinkedPmContext: boolean,\n): LinkedTestPmContextMode {\n if (overrideLinkedPmContext) {\n return runLevelMode;\n }\n if (typeof linkedTest.pm_context_mode !== \"string\" || linkedTest.pm_context_mode.trim().length === 0) {\n return runLevelMode;\n }\n return parsePmContextMode(linkedTest.pm_context_mode);\n}\n\nfunction resolveLinkedTestEffectiveContextMode(\n requestedMode: LinkedTestPmContextMode,\n isPmTrackerReadCommand: boolean,\n): ResolvedLinkedTestPmContextMode {\n if (requestedMode === \"auto\") {\n return isPmTrackerReadCommand ? \"tracker\" : \"schema\";\n }\n return requestedMode;\n}\n\n/* c8 ignore start -- assertion-shape truthiness combinations are covered by linked-test integration suites */\nfunction hasLinkedTestAssertions(linkedTest: LinkedTest): boolean {\n return (\n (linkedTest.assert_stdout_contains?.length ?? 0) > 0 ||\n (linkedTest.assert_stdout_regex?.length ?? 0) > 0 ||\n (linkedTest.assert_stderr_contains?.length ?? 0) > 0 ||\n (linkedTest.assert_stderr_regex?.length ?? 0) > 0 ||\n typeof linkedTest.assert_stdout_min_lines === \"number\" ||\n Object.keys(linkedTest.assert_json_field_equals ?? {}).length > 0 ||\n Object.keys(linkedTest.assert_json_field_gte ?? {}).length > 0\n );\n}\n/* c8 ignore stop */\n\n/* c8 ignore start -- pm-context mismatch hint combinations are validated by tracker/schema integration runs */\nfunction buildPmContextMismatchHint(params: {\n executionContext: NonNullable<TestRunResult[\"execution_context\"]>;\n runLevelPmContextMode: LinkedTestPmContextMode;\n linkedOverridePmContextMode: LinkedTestPmContextMode | undefined;\n}): string {\n const { executionContext, runLevelPmContextMode, linkedOverridePmContextMode } = params;\n if (!executionContext.is_pm_tracker_read_command || !executionContext.mismatch_detected) {\n return \"\";\n }\n if (runLevelPmContextMode === \"tracker\" && linkedOverridePmContextMode === \"schema\") {\n return (\n \" Linked test metadata pm_context_mode=schema overrides run-level --pm-context tracker.\" +\n \" Set pm_context_mode=tracker (or auto) on the linked test, or remove the override, to run against seeded tracker data.\"\n );\n }\n if (executionContext.pm_context_mode === \"schema\") {\n return \" Use --pm-context tracker to run PM tracker-read commands against seeded tracker data.\";\n }\n return \"\";\n}\n/* c8 ignore stop */\n\nfunction mergeEnvSetDirectives(entries: string[] | undefined, optionName: string): Record<string, string> {\n const merged: Record<string, string> = {};\n if (!entries) {\n return merged;\n }\n for (const entry of entries) {\n const parsed = parseLinkedTestEnvSetValue(entry, optionName);\n if (!parsed) {\n continue;\n }\n for (const [key, value] of Object.entries(parsed)) {\n merged[key] = value;\n }\n }\n return merged;\n}\n\nfunction mergeEnvClearDirectives(entries: string[] | undefined, optionName: string): string[] {\n if (!entries) {\n return [];\n }\n const values: string[] = [];\n for (const entry of entries) {\n const parsed = parseLinkedTestEnvClearValue(entry, optionName);\n if (parsed) {\n values.push(...parsed);\n }\n }\n return [...new Set(values)];\n}\n\n// Linked-test command detection helpers + constants live in a sibling leaf\n// module to keep this command file under the per-file LOC budget. Re-exported\n// here so no consumer outside this file changes.\nimport {\n BUN_GLOBAL_FLAGS_WITH_VALUE,\n NPM_EXEC_SUBCOMMANDS,\n NPM_GLOBAL_FLAGS_WITH_VALUE,\n NPX_FLAGS_WITH_VALUE,\n PM_GLOBAL_FLAGS_WITH_VALUE,\n PNPM_GLOBAL_FLAGS_WITH_VALUE,\n SCRIPT_RUN_FLAGS_WITH_VALUE,\n SCRIPT_RUN_SUBCOMMANDS,\n YARN_GLOBAL_FLAGS_WITH_VALUE,\n firstPmSubcommand,\n firstPositionalToken,\n isPmCliPackageToken,\n isPmCliScriptToken,\n isPmExecutableToken,\n normalizePackageSpecifier,\n parseLauncherSubcommand,\n parseNpmExecCommand,\n parseNpxCommand,\n parsePnpmDlxCommand,\n resolvePmSubcommandContext,\n splitNormalizedCommandSegments,\n stripLeadingEnvAssignments,\n} from \"./test/linked-command-detection.js\";\n\nfunction looksLikePrefixedItemId(token: string, idPrefix: string): boolean {\n const normalizedPrefix = idPrefix.trim().toLowerCase().replace(/-+$/, \"\");\n if (normalizedPrefix.length === 0) {\n return false;\n }\n const normalized = token.trim().toLowerCase();\n if (!normalized.startsWith(`${normalizedPrefix}-`)) {\n return false;\n }\n return normalized.length > normalizedPrefix.length + 1;\n}\n\nfunction extractPmInvocationArgsFromSegment(segment: string): string[] | null {\n const rawTokens = segment.split(\" \").filter((token) => token.length > 0);\n const tokens = stripLeadingEnvAssignments(rawTokens);\n if (tokens.length === 0) {\n return null;\n }\n const [executable, ...args] = tokens;\n if (isPmExecutableToken(executable) || isPmCliScriptToken(executable)) {\n return args;\n }\n if (executable === \"node\" && args.length > 0 && isPmCliScriptToken(args[0])) {\n return args.slice(1);\n }\n if (executable === \"npx\" || executable === \"bunx\") {\n const parsed = parseNpxCommand(args);\n /* c8 ignore start -- npx launcher edge permutations are covered by command-parser integration suites */\n if (parsed && (isPmExecutableToken(parsed.command) || isPmCliPackageToken(parsed.command))) {\n return parsed.args;\n }\n /* c8 ignore stop */\n }\n if (executable === \"pnpm\") {\n const parsed = parsePnpmDlxCommand(args);\n if (parsed && (isPmExecutableToken(parsed.command) || isPmCliPackageToken(parsed.command))) {\n return parsed.args;\n }\n }\n if (executable === \"npm\") {\n const parsed = parseNpmExecCommand(args);\n if (parsed && (isPmExecutableToken(parsed.command) || isPmCliPackageToken(parsed.command))) {\n return parsed.args;\n }\n }\n return null;\n}\n\nfunction commandInvokesPmCli(command: string): boolean {\n const normalizedCommand = normalizeCommandForValidation(command);\n return splitNormalizedCommandSegments(normalizedCommand).some((segment) => extractPmInvocationArgsFromSegment(segment) !== null);\n}\n\nfunction commandInvokesPmTrackerReadCommand(command: string): boolean {\n const normalizedCommand = normalizeCommandForValidation(command);\n return splitNormalizedCommandSegments(normalizedCommand).some((segment) => {\n const invocationArgs = extractPmInvocationArgsFromSegment(segment);\n if (!invocationArgs) {\n return false;\n }\n const context = resolvePmSubcommandContext(invocationArgs);\n if (!context) {\n return false;\n }\n return PM_TRACKER_READ_SUBCOMMANDS.has(context.subcommand);\n });\n}\n\n/* c8 ignore start -- command-token extraction edge permutations are covered by integration command-parser tests */\n/**\n * Implements extract referenced pm item ids from command for the public runtime surface of this module.\n */\nexport function extractReferencedPmItemIdsFromCommand(command: string, idPrefix = \"pm\"): string[] {\n const normalizedCommand = normalizeCommandForValidation(command);\n const ids = new Set<string>();\n for (const segment of splitNormalizedCommandSegments(normalizedCommand)) {\n const invocationArgs = extractPmInvocationArgsFromSegment(segment);\n if (!invocationArgs) {\n continue;\n }\n const context = resolvePmSubcommandContext(invocationArgs);\n if (!context) {\n continue;\n }\n if (!PM_SUBCOMMANDS_WITH_ITEM_REFERENCE.has(context.subcommand)) {\n continue;\n }\n const candidate = firstPositionalToken(context.remaining);\n if (!candidate) {\n continue;\n }\n if (looksLikePrefixedItemId(candidate, idPrefix)) {\n ids.add(candidate);\n }\n }\n return [...ids].sort((left, right) => left.localeCompare(right));\n}\n/* c8 ignore stop */\n\nfunction resolveDirectRunnerSubcommand(parsed: { subcommand: string; args: string[] } | null): string | undefined {\n if (!parsed) {\n return undefined;\n }\n if (!SCRIPT_RUN_SUBCOMMANDS.has(parsed.subcommand)) {\n return parsed.subcommand;\n }\n return parseLauncherSubcommand(parsed.args, SCRIPT_RUN_FLAGS_WITH_VALUE)?.subcommand;\n}\n\nfunction firstDirectTestRunnerSubcommand(executable: string, args: string[]): string | undefined {\n if (executable === \"npx\" || executable === \"bunx\") {\n return parseNpxCommand(args)?.command;\n }\n if (executable === \"pnpm\") {\n return resolveDirectRunnerSubcommand(parseLauncherSubcommand(args, PNPM_GLOBAL_FLAGS_WITH_VALUE));\n }\n if (executable === \"npm\") {\n return resolveDirectRunnerSubcommand(parseLauncherSubcommand(args, NPM_GLOBAL_FLAGS_WITH_VALUE));\n }\n if (executable === \"yarn\") {\n return resolveDirectRunnerSubcommand(parseLauncherSubcommand(args, YARN_GLOBAL_FLAGS_WITH_VALUE));\n }\n if (executable === \"bun\") {\n return resolveDirectRunnerSubcommand(parseLauncherSubcommand(args, BUN_GLOBAL_FLAGS_WITH_VALUE));\n }\n return undefined;\n}\n\nfunction isDirectTestRunnerSubcommand(token: string | undefined): boolean {\n if (!token) {\n return false;\n }\n return token === \"vitest\" || token === \"test\" || token.startsWith(\"test:\");\n}\n\nfunction parsedLauncherInvokesRecursiveTestAll(parsed: { command: string; args: string[] } | null): boolean {\n if (!parsed) {\n return false;\n }\n if (!isPmExecutableToken(parsed.command) && !isPmCliPackageToken(parsed.command)) {\n return false;\n }\n return firstPmSubcommand(parsed.args) === \"test-all\";\n}\n\nfunction segmentInvokesRecursiveTestAll(segment: string): boolean {\n const rawTokens = segment.split(\" \").filter((token) => token.length > 0);\n const tokens = stripLeadingEnvAssignments(rawTokens);\n if (tokens.length === 0) {\n return false;\n }\n\n const [executable, ...args] = tokens;\n if (isPmExecutableToken(executable) || isPmCliScriptToken(executable)) {\n return firstPmSubcommand(args) === \"test-all\";\n }\n\n if (executable === \"node\" && args.length > 0 && isPmCliScriptToken(args[0])) {\n return firstPmSubcommand(args.slice(1)) === \"test-all\";\n }\n\n if (executable === \"npx\" || executable === \"bunx\") {\n return parsedLauncherInvokesRecursiveTestAll(parseNpxCommand(args));\n }\n\n if (executable === \"pnpm\") {\n return parsedLauncherInvokesRecursiveTestAll(parsePnpmDlxCommand(args));\n }\n\n if (executable === \"npm\") {\n return parsedLauncherInvokesRecursiveTestAll(parseNpmExecCommand(args));\n }\n\n return false;\n}\n\nfunction invokesRecursiveTestAllCommand(command: string): boolean {\n const normalized = normalizeCommandForValidation(command);\n return splitNormalizedCommandSegments(normalized).some((segment) => segmentInvokesRecursiveTestAll(segment));\n}\n\nfunction assertNoRecursiveTestAllCommand(command: string): void {\n if (!invokesRecursiveTestAllCommand(command)) return;\n throw new PmCliError(\n 'Linked test commands must not invoke \"pm test-all\"; this creates recursive orchestration.',\n EXIT_CODE.USAGE,\n );\n}\n\nfunction normalizeCommandForValidation(command: string): string {\n return command\n .trim()\n .replaceAll(\"\\\\\", \"/\")\n .replaceAll('\"', \"\")\n .replaceAll(\"'\", \"\")\n .replaceAll(/\\s+/g, \" \")\n .toLowerCase();\n}\n\nfunction commandUsesSandboxRunner(normalizedCommand: string): boolean {\n return (\n normalizedCommand.includes(\"node scripts/run-tests.mjs \") ||\n normalizedCommand.endsWith(\"node scripts/run-tests.mjs\") ||\n normalizedCommand.includes(\"node ./scripts/run-tests.mjs \") ||\n normalizedCommand.endsWith(\"node ./scripts/run-tests.mjs\")\n );\n}\n\nfunction segmentHasExplicitSandboxEnv(normalizedSegment: string): boolean {\n const hasExplicitPmPath = /\\bpm_path\\s*=/.test(normalizedSegment) || /\\$env:pm_path\\s*=/.test(normalizedSegment);\n const hasExplicitPmGlobalPath =\n /\\bpm_global_path\\s*=/.test(normalizedSegment) || /\\$env:pm_global_path\\s*=/.test(normalizedSegment);\n return hasExplicitPmPath && hasExplicitPmGlobalPath;\n}\n\nfunction segmentInvokesUnsafeDirectTestRunner(normalizedSegment: string): boolean {\n const rawTokens = normalizedSegment.split(\" \").filter((token) => token.length > 0);\n const tokens = stripLeadingEnvAssignments(rawTokens);\n if (tokens.length === 0) {\n return false;\n }\n const [executable, ...args] = tokens;\n if (executable === \"vitest\" || executable.endsWith(\"/vitest\") || executable.endsWith(\"/vitest.mjs\")) {\n return true;\n }\n if (executable === \"node\") {\n return (\n args.includes(\"--test\") ||\n args.some((arg) => arg === \"vitest\" || arg === \"vitest.mjs\" || arg.endsWith(\"/vitest\") || arg.endsWith(\"/vitest.mjs\"))\n );\n }\n if (executable === \"npx\" || executable === \"bunx\") {\n return isDirectTestRunnerSubcommand(parseNpxCommand(args)?.command);\n }\n if (executable === \"pnpm\") {\n const dlx = parsePnpmDlxCommand(args);\n if (isDirectTestRunnerSubcommand(dlx?.command)) {\n return true;\n }\n return firstDirectTestRunnerSubcommand(executable, args) === \"vitest\";\n }\n if (executable === \"npm\") {\n const exec = parseNpmExecCommand(args);\n if (isDirectTestRunnerSubcommand(exec?.command)) {\n return true;\n }\n return firstDirectTestRunnerSubcommand(executable, args) === \"vitest\";\n }\n if (executable === \"yarn\" || executable === \"bun\") {\n return firstDirectTestRunnerSubcommand(executable, args) === \"vitest\";\n }\n return false;\n}\n\nfunction assertSandboxSafeTestRunnerCommand(command: string): void {\n const normalized = normalizeCommandForValidation(command);\n const segments = splitNormalizedCommandSegments(normalized);\n const hasUnsafeDirectRunnerSegment = segments.some(\n (segment) =>\n !commandUsesSandboxRunner(segment) &&\n segmentInvokesUnsafeDirectTestRunner(segment) &&\n !segmentHasExplicitSandboxEnv(segment),\n );\n\n if (!hasUnsafeDirectRunnerSegment) {\n return;\n }\n\n throw new PmCliError(\n 'Linked test runner commands must be sandbox-safe: use \"node scripts/run-tests.mjs <test|coverage>\", use a package-manager script such as \"pnpm test\", or include PM_PATH=... PM_GLOBAL_PATH=... INLINE in the command string (exporting them in your shell environment is not checked). Example: \"PM_PATH=/tmp/pm-x PM_GLOBAL_PATH=/tmp/pm-x-g vitest run\".',\n EXIT_CODE.USAGE,\n );\n}\n\nfunction getRuntimeSafetySkipReason(command: string): string | undefined {\n if (!invokesRecursiveTestAllCommand(command)) return undefined;\n return 'Linked test command skipped: Linked test commands must not invoke \"pm test-all\"; this creates recursive orchestration.';\n}\n\nfunction parseAddEntries(raw: string[] | undefined): LinkedTest[] {\n if (!raw) return [];\n return raw.map((entry) => {\n const trimmed = entry.trim();\n const kv = looksLikeStructuredLinkedTestEntry(trimmed)\n ? normalizeStructuredLinkedTestEntry(parseCsvKv(entry, \"--add\"), \"--add\")\n : { command: trimmed };\n const command = kv.command?.trim() || undefined;\n const filePath = kv.path?.trim() || undefined;\n if (!command) {\n throw new PmCliError(\"--add requires command=<value> or a bare command (path=<value> is optional metadata)\", EXIT_CODE.USAGE);\n }\n const sharedHostSafe = parseLinkedTestBooleanValue(kv.shared_host_safe?.trim(), \"--add\", \"shared_host_safe\");\n /* c8 ignore start -- command is guaranteed present after the non-empty guard above */\n if (command) {\n assertNoRecursiveTestAllCommand(command);\n assertSandboxSafeTestRunnerCommand(command);\n }\n /* c8 ignore stop */\n const timeoutSecondsRaw = kv.timeout_seconds?.trim();\n const timeoutAliasRaw = kv.timeout?.trim();\n if (timeoutSecondsRaw && timeoutAliasRaw && timeoutSecondsRaw !== timeoutAliasRaw) {\n throw new PmCliError(\"--add timeout and timeout_seconds must match when both are provided\", EXIT_CODE.USAGE);\n }\n const timeoutRaw = timeoutSecondsRaw ?? timeoutAliasRaw;\n const timeoutSeconds =\n timeoutRaw === undefined ? undefined : Math.floor(parseOptionalNumber(timeoutRaw, \"timeout_seconds\"));\n const envSet = parseLinkedTestEnvSetValue(kv.env_set?.trim(), \"--add\");\n const envClear = parseLinkedTestEnvClearValue(kv.env_clear?.trim(), \"--add\");\n const pmContextMode = parseLinkedTestContextModeValue(kv.pm_context_mode?.trim(), \"--add\");\n return {\n command,\n path: filePath,\n scope: ensureScope(kv.scope),\n timeout_seconds: timeoutSeconds,\n pm_context_mode: pmContextMode,\n env_set: envSet,\n env_clear: envClear,\n shared_host_safe: sharedHostSafe,\n assert_stdout_contains: parseLinkedTestStringList(kv.assert_stdout_contains?.trim()),\n assert_stdout_regex: parseLinkedTestRegexList(kv.assert_stdout_regex?.trim(), \"--add\", \"assert_stdout_regex\"),\n assert_stderr_contains: parseLinkedTestStringList(kv.assert_stderr_contains?.trim()),\n assert_stderr_regex: parseLinkedTestRegexList(kv.assert_stderr_regex?.trim(), \"--add\", \"assert_stderr_regex\"),\n assert_stdout_min_lines: parseLinkedTestMinLines(kv.assert_stdout_min_lines?.trim(), \"--add\"),\n assert_json_field_equals: parseLinkedTestAssertionEqualsMap(kv.assert_json_field_equals?.trim(), \"--add\"),\n assert_json_field_gte: parseLinkedTestAssertionGteMap(kv.assert_json_field_gte?.trim(), \"--add\"),\n note: kv.note?.trim() || undefined,\n };\n });\n}\n\n/* c8 ignore start -- add-json validation matrix is covered by linked-test parser integration suites */\nfunction parseAddJsonEntries(raw: string[] | undefined): LinkedTest[] {\n if (!raw) return [];\n return raw.flatMap((entry) => {\n const parsed = parseLinkedTestJsonEntries(entry, \"--add-json\");\n for (const linkedTest of parsed) {\n const command = linkedTest.command;\n if (!command) {\n throw new PmCliError(\"--add-json requires a non-empty command string\", EXIT_CODE.USAGE);\n }\n assertNoRecursiveTestAllCommand(command);\n assertSandboxSafeTestRunnerCommand(command);\n }\n return parsed;\n });\n}\n/* c8 ignore stop */\n\nfunction parseRemoveEntries(raw: string[] | undefined): string[] {\n if (!raw) return [];\n return raw.map((entry) => {\n const trimmed = entry.trim();\n if (!trimmed) {\n throw new PmCliError(\"--remove requires command or path value\", EXIT_CODE.USAGE);\n }\n if (\n trimmed.includes(\"=\") ||\n /^(?:[-*+]\\s+)?(?:path|command)\\s*[:=]/i.test(trimmed) ||\n trimmed.startsWith(\"```\")\n ) {\n const kv = parseCsvKv(trimmed, \"--remove\");\n const value = kv.path ?? kv.command;\n if (!value?.trim()) {\n throw new PmCliError(\"--remove requires command=<value> and/or path=<value>\", EXIT_CODE.USAGE);\n }\n return value.trim();\n }\n return trimmed;\n });\n}\n\nfunction closeLinkedTestStdin(child: ChildProcess): void {\n // Force EOF on child stdin so non-interactive runs do not wait on input.\n try {\n child.stdin?.end();\n } catch {\n // Child stdin can already be closed depending on command startup timing.\n }\n}\n\nfunction summarizeLinkedTestCommand(command: string): string {\n const normalized = command.trim().replaceAll(/\\s+/g, \" \");\n if (normalized.length <= MAX_LINKED_TEST_COMMAND_LABEL_LENGTH) {\n return normalized;\n }\n return `${normalized.slice(0, MAX_LINKED_TEST_COMMAND_LABEL_LENGTH - 3)}...`;\n}\n\nfunction shouldEmitLinkedTestProgress(mode: LinkedTestProgressMode): boolean {\n /* c8 ignore start -- reserved for future explicit \"off\" mode wiring. */\n if (mode === \"off\") {\n return false;\n }\n /* c8 ignore stop */\n if (mode === \"always\") {\n return true;\n }\n return process.stderr.isTTY === true;\n}\n\nfunction emitLinkedTestProgress(message: string): void {\n try {\n process.stderr.write(`${message}\\n`);\n } catch {\n // Ignore transient stderr write failures.\n }\n}\n\nfunction beginLinkedTestProgress(context: LinkedTestProgressContext, mode: LinkedTestProgressMode): NodeJS.Timeout | null {\n if (!shouldEmitLinkedTestProgress(mode)) {\n return null;\n }\n const commandLabel = summarizeLinkedTestCommand(context.command);\n const startAt = Date.now();\n emitLinkedTestProgress(\n `[pm test] linked-test ${context.index}/${context.total} start timeout_ms=${context.timeoutMs} command=\"${commandLabel}\"`,\n );\n const heartbeat = setInterval(() => {\n const elapsedMs = Date.now() - startAt;\n emitLinkedTestProgress(\n `[pm test] linked-test ${context.index}/${context.total} running elapsed_ms=${elapsedMs} command=\"${commandLabel}\"`,\n );\n }, linkedTestHeartbeatIntervalMs());\n heartbeat.unref?.();\n return heartbeat;\n}\n\nfunction endLinkedTestProgress(\n context: LinkedTestProgressContext,\n executionResult: Pick<LinkedTestExecutionResult, \"timedOut\" | \"maxBufferExceeded\" | \"exitCode\" | \"signal\">,\n startedAt: number,\n mode: LinkedTestProgressMode,\n): void {\n if (!shouldEmitLinkedTestProgress(mode)) {\n return;\n }\n const commandLabel = summarizeLinkedTestCommand(context.command);\n const elapsedMs = Date.now() - startedAt;\n const failed = executionResult.timedOut || executionResult.maxBufferExceeded || executionResult.exitCode !== 0;\n const statusLabel = failed ? \"failed\" : \"passed\";\n const reasonTokens: string[] = [];\n if (executionResult.timedOut) {\n reasonTokens.push(\"reason=timeout\");\n }\n if (executionResult.maxBufferExceeded) {\n reasonTokens.push(\"reason=max_buffer\");\n }\n if (executionResult.signal) {\n reasonTokens.push(`signal=${executionResult.signal}`);\n }\n const exitLabel = executionResult.exitCode === null ? \"null\" : String(executionResult.exitCode);\n const reasonSuffix = reasonTokens.length > 0 ? ` ${reasonTokens.join(\" \")}` : \"\";\n emitLinkedTestProgress(\n `[pm test] linked-test ${context.index}/${context.total} end status=${statusLabel} exit_code=${exitLabel} elapsed_ms=${elapsedMs}${reasonSuffix} command=\"${commandLabel}\"`,\n );\n}\n\n/* c8 ignore start -- process-tree teardown paths are highly platform-dependent. */\nasync function killProcessTree(pid: number): Promise<void> {\n if (!Number.isInteger(pid) || pid <= 0) {\n return;\n }\n if (process.platform === \"win32\") {\n await new Promise<void>((resolve) => {\n const killer = spawn(\"taskkill\", [\"/pid\", String(pid), \"/T\", \"/F\"], {\n stdio: \"ignore\",\n windowsHide: true,\n });\n killer.on(\"error\", () => resolve());\n killer.on(\"close\", () => resolve());\n });\n return;\n }\n try {\n process.kill(-pid, \"SIGKILL\");\n return;\n } catch {\n // Fall back to direct child kill when no process group is available.\n }\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {\n // The process can already be gone.\n }\n}\n/* c8 ignore stop */\n\n/* c8 ignore start -- process lifecycle timing/error race branches are covered by cross-platform integration runners */\nasync function runLinkedTestCommand(\n command: string,\n timeoutMs: number,\n env: NodeJS.ProcessEnv,\n progressContext: LinkedTestProgressContext,\n progressMode: LinkedTestProgressMode,\n): Promise<LinkedTestExecutionResult> {\n const startedAt = Date.now();\n const heartbeat = beginLinkedTestProgress(progressContext, progressMode);\n const child = spawn(command, {\n cwd: process.cwd(),\n env,\n shell: true,\n windowsHide: true,\n detached: process.platform !== \"win32\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n closeLinkedTestStdin(child);\n\n let stdout = \"\";\n let stderr = \"\";\n let stdoutBytes = 0;\n let stderrBytes = 0;\n let timedOut = false;\n let maxBufferExceeded = false;\n let spawnError: string | undefined;\n let forceKillTimer: NodeJS.Timeout | null = null;\n let timedOutTimer: NodeJS.Timeout | null = null;\n let terminationRequested = false;\n\n const clearTimers = (): void => {\n if (heartbeat) {\n clearInterval(heartbeat);\n }\n if (timedOutTimer) {\n clearTimeout(timedOutTimer);\n timedOutTimer = null;\n }\n if (forceKillTimer) {\n clearTimeout(forceKillTimer);\n forceKillTimer = null;\n }\n };\n\n /* c8 ignore start -- timeout termination branches depend on scheduler/process-group timing. */\n const requestTermination = async (): Promise<void> => {\n if (terminationRequested) {\n return;\n }\n terminationRequested = true;\n const pid = child.pid;\n if (!pid || pid <= 0) {\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // Child can already be closed.\n }\n return;\n }\n if (process.platform === \"win32\") {\n await killProcessTree(pid);\n return;\n }\n try {\n process.kill(-pid, \"SIGTERM\");\n } catch {\n /* c8 ignore next 4 -- platform-specific process-group fallback path. */\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // Child can already be closed.\n }\n }\n /* c8 ignore next 3 -- exercised only when timeout escalation triggers force-kill fallback. */\n forceKillTimer = setTimeout(() => {\n void killProcessTree(pid);\n }, linkedTestTimeoutForceKillDelayMs());\n forceKillTimer.unref?.();\n };\n /* c8 ignore stop */\n\n const appendChunk = (chunk: Buffer | string, target: \"stdout\" | \"stderr\"): void => {\n const text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n const bytes = Buffer.byteLength(text);\n if (target === \"stdout\") {\n stdoutBytes += bytes;\n if (stdoutBytes <= TEST_OUTPUT_MAX_BUFFER_BYTES) {\n stdout += text;\n }\n } else {\n stderrBytes += bytes;\n if (stderrBytes <= TEST_OUTPUT_MAX_BUFFER_BYTES) {\n stderr += text;\n }\n }\n if (!maxBufferExceeded && (stdoutBytes > TEST_OUTPUT_MAX_BUFFER_BYTES || stderrBytes > TEST_OUTPUT_MAX_BUFFER_BYTES)) {\n maxBufferExceeded = true;\n void requestTermination();\n }\n };\n\n child.stdout?.on(\"data\", (chunk) => appendChunk(chunk, \"stdout\"));\n child.stderr?.on(\"data\", (chunk) => appendChunk(chunk, \"stderr\"));\n /* c8 ignore next 5 -- shell spawn error callbacks are non-deterministic across platforms. */\n child.on(\"error\", (error) => {\n spawnError = error.message;\n });\n\n /* c8 ignore next 4 -- callback scheduling timing is non-deterministic under coverage instrumentation. */\n timedOutTimer = setTimeout(() => {\n timedOut = true;\n void requestTermination();\n }, timeoutMs);\n timedOutTimer.unref?.();\n\n const { code, signal } = await new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve) => {\n let settled = false;\n let pipeCloseGraceTimer: NodeJS.Timeout | null = null;\n const settle = (value: { code: number | null; signal: NodeJS.Signals | null }, destroyPipes = false): void => {\n if (settled) {\n return;\n }\n settled = true;\n if (pipeCloseGraceTimer) {\n clearTimeout(pipeCloseGraceTimer);\n pipeCloseGraceTimer = null;\n }\n if (destroyPipes) {\n child.stdin?.destroy();\n child.stdout?.destroy();\n child.stderr?.destroy();\n }\n resolve(value);\n };\n child.on(\"exit\", (exitCode, exitSignal) => {\n if (settled) {\n return;\n }\n pipeCloseGraceTimer = setTimeout(() => {\n settle({\n code: exitCode,\n signal: exitSignal,\n }, true);\n }, linkedTestPipeCloseGraceMs());\n pipeCloseGraceTimer.unref?.();\n });\n child.on(\"close\", (closeCode, closeSignal) => {\n settle({\n code: closeCode,\n signal: closeSignal,\n });\n });\n });\n clearTimers();\n const executionResult: LinkedTestExecutionResult = {\n stdout,\n stderr,\n exitCode: code,\n signal,\n timedOut,\n maxBufferExceeded,\n spawnError,\n };\n endLinkedTestProgress(progressContext, executionResult, startedAt, progressMode);\n return executionResult;\n}\n/* c8 ignore stop */\n\nfunction formatLinkedTestExecutionError(result: LinkedTestExecutionResult, timeoutMs: number): string {\n const details: string[] = [];\n if (result.maxBufferExceeded) {\n details.push(\n `Linked test output exceeded maxBuffer=${TEST_OUTPUT_MAX_BUFFER_BYTES} bytes. Reduce output volume or split the command.`,\n );\n }\n if (result.timedOut && timeoutMs > 0) {\n details.push(`Linked test timed out after ${timeoutMs}ms.`);\n }\n const signalMessage = result.signal ? `Linked test command terminated by signal ${result.signal}.` : undefined;\n const baseMessage = result.spawnError?.trim() || signalMessage || \"Linked test command failed.\";\n if (details.length === 0) {\n return baseMessage;\n }\n return `${baseMessage} ${details.join(\" \")}`;\n}\n\nfunction hasInfraCollisionSignal(result: Pick<LinkedTestExecutionResult, \"stdout\" | \"stderr\" | \"spawnError\">): boolean {\n const combined = [result.spawnError ?? \"\", result.stderr, result.stdout].join(\"\\n\");\n return LINKED_TEST_INFRA_COLLISION_PATTERNS.some((pattern) => pattern.test(combined));\n}\n\n/**\n * Implements classify linked test failure for the public runtime surface of this module.\n */\nexport function classifyLinkedTestFailure(\n result: Pick<LinkedTestExecutionResult, \"stdout\" | \"stderr\" | \"spawnError\" | \"signal\" | \"timedOut\" | \"maxBufferExceeded\">,\n): LinkedTestFailureCategory {\n if (hasInfraCollisionSignal(result)) {\n return \"infra_collision\";\n }\n if (result.timedOut) {\n return \"timeout\";\n }\n if (result.maxBufferExceeded) {\n return \"max_buffer\";\n }\n if (result.spawnError) {\n return \"spawn_error\";\n }\n if (result.signal) {\n return \"signal\";\n }\n return \"assertion_failure\";\n}\n\nfunction createEmptyFailureCategoryCounts(): Record<LinkedTestFailureCategory, number> {\n return {\n infra_collision: 0,\n assertion_failure: 0,\n empty_run: 0,\n timeout: 0,\n max_buffer: 0,\n spawn_error: 0,\n signal: 0,\n };\n}\n\n/**\n * Implements count failure categories for the public runtime surface of this module.\n */\nexport function countFailureCategories(runResults: TestRunResult[]): Record<LinkedTestFailureCategory, number> {\n const counts = createEmptyFailureCategoryCounts();\n for (const result of runResults) {\n if (result.status !== \"failed\" || !result.failure_category) {\n continue;\n }\n counts[result.failure_category] += 1;\n }\n return counts;\n}\n\nfunction applyEnvDirectiveStage(env: NodeJS.ProcessEnv, directives: Pick<LinkedTestRuntimeDirectives, \"env_set\" | \"env_clear\">): void {\n for (const [key, value] of Object.entries(directives.env_set)) {\n if (LINKED_TEST_PROTECTED_ENV_KEYS.has(key.toUpperCase())) {\n continue;\n }\n env[key] = value;\n }\n for (const key of directives.env_clear) {\n if (LINKED_TEST_PROTECTED_ENV_KEYS.has(key.toUpperCase())) {\n continue;\n }\n delete env[key];\n }\n}\n\nfunction applySharedHostSafeDefaults(env: NodeJS.ProcessEnv): void {\n if (env.PORT === undefined) {\n env.PORT = \"0\";\n }\n if (env.HOST === undefined) {\n env.HOST = \"127.0.0.1\";\n }\n if (env.PM_SHARED_HOST_SAFE === undefined) {\n env.PM_SHARED_HOST_SAFE = \"1\";\n }\n if (env.PLAYWRIGHT_HTML_OPEN === undefined) {\n env.PLAYWRIGHT_HTML_OPEN = \"never\";\n }\n if (env.PW_TEST_HTML_REPORT_OPEN === undefined) {\n env.PW_TEST_HTML_REPORT_OPEN = \"never\";\n }\n}\n\nfunction resolveEffectiveLinkedTestDirectives(\n runtimeDirectives: LinkedTestRuntimeDirectives,\n linkedTest: LinkedTest,\n): LinkedTestRuntimeDirectives {\n const envSet = { ...runtimeDirectives.env_set, ...linkedTest.env_set };\n const envClear = [...new Set([...runtimeDirectives.env_clear, ...(linkedTest.env_clear ?? [])])];\n const sharedHostSafe = linkedTest.shared_host_safe ?? runtimeDirectives.shared_host_safe;\n return {\n env_set: envSet,\n env_clear: envClear,\n shared_host_safe: sharedHostSafe,\n };\n}\n\nfunction resolveRuntimeDirectives(\n envSetEntries: string[] | undefined,\n envClearEntries: string[] | undefined,\n sharedHostSafe: boolean | undefined,\n): LinkedTestRuntimeDirectives {\n return {\n env_set: mergeEnvSetDirectives(envSetEntries, \"--env-set\"),\n env_clear: mergeEnvClearDirectives(envClearEntries, \"--env-clear\"),\n shared_host_safe: sharedHostSafe === true,\n };\n}\n\n/* c8 ignore start -- sandbox copy race/path permutations are covered by filesystem integration suites */\nasync function copyIntoSandboxIfPresent(sourcePath: string, targetPath: string, recursive = false): Promise<void> {\n if (!(await pathExists(sourcePath))) {\n return;\n }\n await mkdir(path.dirname(targetPath), { recursive: true });\n try {\n if (recursive) {\n await cp(sourcePath, targetPath, { recursive: true, force: true });\n return;\n }\n await cp(sourcePath, targetPath, { force: true });\n } catch (error: unknown) {\n if (typeof error === \"object\" && error !== null && \"code\" in error && (error as { code?: string }).code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n}\n/* c8 ignore stop */\n\nasync function seedLinkedTestSandbox(\n sandboxPmPath: string,\n sandboxGlobalPath: string,\n sourceRoots: LinkedTestSandboxSourceRoots,\n): Promise<void> {\n await copyIntoSandboxIfPresent(getSettingsPath(sourceRoots.projectPmRoot), getSettingsPath(sandboxPmPath));\n await copyIntoSandboxIfPresent(\n path.join(sourceRoots.projectPmRoot, \"extensions\"),\n path.join(sandboxPmPath, \"extensions\"),\n true,\n );\n await copyIntoSandboxIfPresent(getSettingsPath(sourceRoots.globalPmRoot), getSettingsPath(sandboxGlobalPath));\n await copyIntoSandboxIfPresent(\n path.join(sourceRoots.globalPmRoot, \"extensions\"),\n path.join(sandboxGlobalPath, \"extensions\"),\n true,\n );\n}\n\nasync function seedLinkedTestTrackerData(sourceRoot: string, sandboxRoot: string): Promise<void> {\n if (!(await pathExists(sourceRoot))) {\n return;\n }\n const entries = await readdir(sourceRoot, { withFileTypes: true });\n for (const entry of entries) {\n if (LINKED_TEST_TRACKER_DIRS_TO_SKIP.has(entry.name)) {\n continue;\n }\n const sourcePath = path.join(sourceRoot, entry.name);\n const targetPath = path.join(sandboxRoot, entry.name);\n if (entry.isDirectory()) {\n await copyIntoSandboxIfPresent(sourcePath, targetPath, true);\n continue;\n }\n if (entry.isFile()) {\n await copyIntoSandboxIfPresent(sourcePath, targetPath);\n }\n }\n}\n\nasync function countLinkedTestItemFiles(pmRoot: string): Promise<number> {\n if (!(await pathExists(pmRoot))) {\n return 0;\n }\n let total = 0;\n const entries = await readdir(pmRoot, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() || LINKED_TEST_ITEM_COUNT_DIRS_TO_SKIP.has(entry.name)) {\n continue;\n }\n const folderPath = path.join(pmRoot, entry.name);\n let files;\n try {\n files = await readdir(folderPath, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const file of files) {\n if (!file.isFile()) {\n continue;\n }\n if (ITEM_FILE_EXTENSIONS.some((extension) => file.name.toLowerCase().endsWith(extension))) {\n total += 1;\n }\n }\n }\n return total;\n}\n\n/**\n * Implements resolve linked test failure exit code for the public runtime surface of this module.\n */\nexport function resolveLinkedTestFailureExitCode(\n execution: Pick<LinkedTestExecutionResult, \"exitCode\" | \"timedOut\" | \"maxBufferExceeded\">,\n): number {\n const rawExitCode = typeof execution.exitCode === \"number\" ? execution.exitCode : 1;\n if ((execution.timedOut || execution.maxBufferExceeded) && rawExitCode === 0) {\n return 1;\n }\n return rawExitCode;\n}\n\nfunction splitJsonPathSegments(fieldPath: string): Array<string | number> {\n const segments: Array<string | number> = [];\n const tokens = fieldPath.match(/[^.[\\]]+|\\[\\d+\\]/g) ?? [];\n for (const token of tokens) {\n if (token.startsWith(\"[\") && token.endsWith(\"]\")) {\n const parsedIndex = Number.parseInt(token.slice(1, -1), 10);\n if (!Number.isInteger(parsedIndex) || parsedIndex < 0) {\n return [];\n }\n segments.push(parsedIndex);\n continue;\n }\n segments.push(token);\n }\n return segments;\n}\n\nfunction readJsonPathValue(root: unknown, fieldPath: string): { found: boolean; value: unknown } {\n const normalizedPath = fieldPath.trim();\n if (normalizedPath.length === 0) {\n return { found: false, value: undefined };\n }\n const segments = splitJsonPathSegments(normalizedPath);\n if (segments.length === 0) {\n return { found: false, value: undefined };\n }\n let current: unknown = root;\n for (const segment of segments) {\n if (typeof segment === \"number\") {\n if (!Array.isArray(current) || segment >= current.length) {\n return { found: false, value: undefined };\n }\n current = current[segment];\n continue;\n }\n if (typeof current !== \"object\" || current === null || !(segment in current)) {\n return { found: false, value: undefined };\n }\n current = (current as Record<string, unknown>)[segment];\n }\n return { found: true, value: current };\n}\n\n/* c8 ignore start -- assertion-literal parsing edge cases are validated by assertion integration suites */\nfunction parseAssertionLiteral(raw: string): unknown {\n const trimmed = raw.trim();\n if (trimmed === \"true\") {\n return true;\n }\n if (trimmed === \"false\") {\n return false;\n }\n if (trimmed === \"null\") {\n return null;\n }\n const numeric = Number(trimmed);\n if (trimmed.length > 0 && Number.isFinite(numeric)) {\n return numeric;\n }\n if ((trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) || (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))) {\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n // Fall back to string comparison for malformed JSON literals.\n }\n }\n return trimmed;\n}\n/* c8 ignore stop */\n\nfunction compareAssertionValues(actual: unknown, expected: unknown): boolean {\n if (\n typeof actual === \"object\" &&\n actual !== null &&\n typeof expected === \"object\" &&\n expected !== null\n ) {\n return stableValueEquals(actual, expected);\n }\n return Object.is(actual, expected);\n}\n\n/* c8 ignore start -- assertion failure-path permutations are covered by linked-test integration fixtures */\nfunction evaluateLinkedTestAssertions(linkedTest: LinkedTest, stdout: string, stderr: string): string[] {\n const failures: string[] = [];\n for (const expected of linkedTest.assert_stdout_contains ?? []) {\n if (!stdout.includes(expected)) {\n failures.push(`stdout missing required text: \"${expected}\"`);\n }\n }\n for (const pattern of linkedTest.assert_stdout_regex ?? []) {\n try {\n const regex = new RegExp(pattern, \"m\");\n if (!regex.test(stdout)) {\n failures.push(`stdout failed regex assertion: /${pattern}/m`);\n }\n } catch (error: unknown) {\n failures.push(`stdout regex assertion is invalid: /${pattern}/ (${error instanceof Error ? error.message : String(error)})`);\n }\n }\n for (const expected of linkedTest.assert_stderr_contains ?? []) {\n if (!stderr.includes(expected)) {\n failures.push(`stderr missing required text: \"${expected}\"`);\n }\n }\n for (const pattern of linkedTest.assert_stderr_regex ?? []) {\n try {\n const regex = new RegExp(pattern, \"m\");\n if (!regex.test(stderr)) {\n failures.push(`stderr failed regex assertion: /${pattern}/m`);\n }\n } catch (error: unknown) {\n failures.push(`stderr regex assertion is invalid: /${pattern}/ (${error instanceof Error ? error.message : String(error)})`);\n }\n }\n if (typeof linkedTest.assert_stdout_min_lines === \"number\") {\n const lineCount = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0).length;\n if (lineCount < linkedTest.assert_stdout_min_lines) {\n failures.push(`stdout line count ${lineCount} is below required minimum ${linkedTest.assert_stdout_min_lines}`);\n }\n }\n\n const jsonEqualsAssertions = linkedTest.assert_json_field_equals ?? {};\n const jsonGteAssertions = linkedTest.assert_json_field_gte ?? {};\n const needsJsonAssertions = Object.keys(jsonEqualsAssertions).length > 0 || Object.keys(jsonGteAssertions).length > 0;\n if (!needsJsonAssertions) {\n return failures;\n }\n\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(stdout);\n } catch (error: unknown) {\n failures.push(\n `stdout is not valid JSON for assert_json_field_* checks: ${error instanceof Error ? error.message : String(error)}`,\n );\n return failures;\n }\n\n for (const [fieldPath, expectedRaw] of Object.entries(jsonEqualsAssertions)) {\n const resolved = readJsonPathValue(parsedJson, fieldPath);\n if (!resolved.found) {\n failures.push(`assert_json_field_equals missing path \"${fieldPath}\"`);\n continue;\n }\n const expected = parseAssertionLiteral(expectedRaw);\n if (!compareAssertionValues(resolved.value, expected)) {\n failures.push(\n `assert_json_field_equals mismatch at \"${fieldPath}\" (expected=${JSON.stringify(expected)} actual=${JSON.stringify(resolved.value)})`,\n );\n }\n }\n\n for (const [fieldPath, expectedMinimum] of Object.entries(jsonGteAssertions)) {\n const resolved = readJsonPathValue(parsedJson, fieldPath);\n if (!resolved.found) {\n failures.push(`assert_json_field_gte missing path \"${fieldPath}\"`);\n continue;\n }\n if (typeof resolved.value !== \"number\" || !Number.isFinite(resolved.value)) {\n failures.push(`assert_json_field_gte path \"${fieldPath}\" resolved to non-numeric value`);\n continue;\n }\n if (resolved.value < expectedMinimum) {\n failures.push(`assert_json_field_gte failed at \"${fieldPath}\" (expected >= ${expectedMinimum}, actual ${resolved.value})`);\n }\n }\n\n return failures;\n}\n/* c8 ignore stop */\n\nconst EMPTY_LINKED_TEST_RUN_PATTERNS: Array<{ code: string; regex: RegExp }> = [\n { code: \"no_projects_matched_filters\", regex: /\\bNo projects matched the filters\\b/i },\n { code: \"no_test_files_found\", regex: /\\bNo test files found\\b/i },\n { code: \"no_tests_found\", regex: /\\bNo tests found\\b/i },\n { code: \"no_matching_tests\", regex: /\\bNo matching tests?\\b/i },\n { code: \"collected_zero_items\", regex: /\\bcollected 0 items?\\b/i },\n];\n\nfunction detectEmptyLinkedTestRun(stdout: string, stderr: string): string | null {\n const combined = `${stdout}\\n${stderr}`;\n for (const pattern of EMPTY_LINKED_TEST_RUN_PATTERNS) {\n if (pattern.regex.test(combined)) {\n return pattern.code;\n }\n }\n return null;\n}\n\n/* c8 ignore start -- linked-test orchestration branch matrix is covered by end-to-end command integration runs */\n/**\n * Implements run linked tests for the public runtime surface of this module.\n */\nexport async function runLinkedTests(\n tests: LinkedTest[],\n defaultTimeoutSeconds: number | undefined,\n options?: {\n progress?: boolean;\n sourceRoots?: LinkedTestSandboxSourceRoots;\n envSet?: string[];\n envClear?: string[];\n sharedHostSafe?: boolean;\n pmContext?: string;\n overrideLinkedPmContext?: boolean;\n failOnContextMismatch?: boolean;\n failOnEmptyTestRun?: boolean;\n requireAssertionsForPm?: boolean;\n checkContext?: boolean;\n autoPmContext?: boolean;\n },\n): Promise<TestRunResult[]> {\n const results: TestRunResult[] = [];\n const sandboxRoot = await mkdtemp(path.join(tmpdir(), \"pm-linked-test-\"));\n const schemaSandboxPmPath = path.join(sandboxRoot, \"schema\", \"project\", \".agents\", \"pm\");\n const schemaSandboxGlobalPath = path.join(sandboxRoot, \"schema\", \"global\");\n const trackerSandboxPmPath = path.join(sandboxRoot, \"tracker\", \"project\", \".agents\", \"pm\");\n const trackerSandboxGlobalPath = path.join(sandboxRoot, \"tracker\", \"global\");\n const runLevelPmContextMode = parsePmContextMode(options?.pmContext);\n const progressMode: LinkedTestProgressMode = options?.progress === true ? \"always\" : \"auto\";\n const runtimeDirectives = resolveRuntimeDirectives(options?.envSet, options?.envClear, options?.sharedHostSafe);\n let sourceProjectItemCount = 0;\n let sourceGlobalItemCount = 0;\n let schemaSandboxProjectItemCount = 0;\n let schemaSandboxGlobalItemCount = 0;\n let trackerSandboxProjectItemCount = 0;\n let trackerSandboxGlobalItemCount = 0;\n const sourceRoots = options?.sourceRoots;\n const projectExtensionsSeeded = Boolean(sourceRoots);\n const globalExtensionsSeeded = Boolean(sourceRoots);\n\n try {\n await runInit(undefined, { path: schemaSandboxPmPath });\n await runInit(undefined, { path: schemaSandboxGlobalPath });\n await runInit(undefined, { path: trackerSandboxPmPath });\n await runInit(undefined, { path: trackerSandboxGlobalPath });\n if (sourceRoots) {\n await seedLinkedTestSandbox(schemaSandboxPmPath, schemaSandboxGlobalPath, sourceRoots);\n await seedLinkedTestSandbox(trackerSandboxPmPath, trackerSandboxGlobalPath, sourceRoots);\n await seedLinkedTestTrackerData(sourceRoots.projectPmRoot, trackerSandboxPmPath);\n await seedLinkedTestTrackerData(sourceRoots.globalPmRoot, trackerSandboxGlobalPath);\n sourceProjectItemCount = await countLinkedTestItemFiles(sourceRoots.projectPmRoot);\n sourceGlobalItemCount = await countLinkedTestItemFiles(sourceRoots.globalPmRoot);\n }\n schemaSandboxProjectItemCount = await countLinkedTestItemFiles(schemaSandboxPmPath);\n schemaSandboxGlobalItemCount = await countLinkedTestItemFiles(schemaSandboxGlobalPath);\n trackerSandboxProjectItemCount = await countLinkedTestItemFiles(trackerSandboxPmPath);\n trackerSandboxGlobalItemCount = await countLinkedTestItemFiles(trackerSandboxGlobalPath);\n\n const buildExecutionContext = (\n isPmCommand: boolean,\n isPmTrackerReadCommand: boolean,\n requestedPmContextMode: LinkedTestPmContextMode,\n effectivePmContextMode: ResolvedLinkedTestPmContextMode,\n autoPmContextApplied: boolean,\n ): NonNullable<TestRunResult[\"execution_context\"]> => {\n const selectedSandboxProjectPmPath = effectivePmContextMode === \"tracker\" ? trackerSandboxPmPath : schemaSandboxPmPath;\n const selectedSandboxGlobalPmPath =\n effectivePmContextMode === \"tracker\" ? trackerSandboxGlobalPath : schemaSandboxGlobalPath;\n const selectedSandboxProjectItemCount =\n effectivePmContextMode === \"tracker\" ? trackerSandboxProjectItemCount : schemaSandboxProjectItemCount;\n const selectedSandboxGlobalItemCount =\n effectivePmContextMode === \"tracker\" ? trackerSandboxGlobalItemCount : schemaSandboxGlobalItemCount;\n const mismatchDetected = isPmCommand && sourceProjectItemCount !== selectedSandboxProjectItemCount;\n return {\n requested_pm_context_mode: requestedPmContextMode,\n pm_context_mode: effectivePmContextMode,\n auto_pm_context_applied: autoPmContextApplied,\n is_pm_command: isPmCommand,\n is_pm_tracker_read_command: isPmTrackerReadCommand,\n source_project_pm_path: sourceRoots?.projectPmRoot ?? \"\",\n sandbox_project_pm_path: selectedSandboxProjectPmPath,\n source_global_pm_path: sourceRoots?.globalPmRoot ?? \"\",\n sandbox_global_pm_path: selectedSandboxGlobalPmPath,\n source_project_item_count: sourceProjectItemCount,\n sandbox_project_item_count: selectedSandboxProjectItemCount,\n source_global_item_count: sourceGlobalItemCount,\n sandbox_global_item_count: selectedSandboxGlobalItemCount,\n mismatch_detected: mismatchDetected,\n project_extensions_seeded: projectExtensionsSeeded,\n global_extensions_seeded: globalExtensionsSeeded,\n };\n };\n\n for (let index = 0; index < tests.length; index += 1) {\n const linkedTest = tests[index];\n const linkedOverridePmContextMode =\n typeof linkedTest.pm_context_mode === \"string\" && linkedTest.pm_context_mode.trim().length > 0\n ? parsePmContextMode(linkedTest.pm_context_mode)\n : undefined;\n const isPmCommand =\n typeof linkedTest.command === \"string\" && linkedTest.command.length > 0\n ? commandInvokesPmCli(linkedTest.command)\n : false;\n const isPmTrackerReadCommand =\n isPmCommand && typeof linkedTest.command === \"string\" && linkedTest.command.length > 0\n ? commandInvokesPmTrackerReadCommand(linkedTest.command)\n : false;\n const autoPmContextApplied = options?.autoPmContext === true && isPmTrackerReadCommand;\n const requestedPmContextMode = autoPmContextApplied\n ? \"auto\"\n : resolveLinkedTestRequestedContextMode(linkedTest, runLevelPmContextMode, options?.overrideLinkedPmContext === true);\n const effectivePmContextMode = resolveLinkedTestEffectiveContextMode(requestedPmContextMode, isPmTrackerReadCommand);\n const executionContext = buildExecutionContext(\n isPmCommand,\n isPmTrackerReadCommand,\n requestedPmContextMode,\n effectivePmContextMode,\n autoPmContextApplied,\n );\n if (!linkedTest.command) {\n results.push({\n command: linkedTest.command,\n path: linkedTest.path,\n status: \"skipped\",\n execution_context: executionContext,\n error: \"No command configured for this linked test.\",\n });\n continue;\n }\n const runtimeSafetySkipReason = getRuntimeSafetySkipReason(linkedTest.command);\n if (runtimeSafetySkipReason) {\n results.push({\n command: linkedTest.command,\n path: linkedTest.path,\n status: \"skipped\",\n execution_context: executionContext,\n error: runtimeSafetySkipReason,\n });\n continue;\n }\n const failOnMismatchByDefault =\n executionContext.pm_context_mode === \"schema\" &&\n executionContext.is_pm_tracker_read_command &&\n executionContext.mismatch_detected;\n const failOnMismatchByFlag =\n options?.failOnContextMismatch === true && executionContext.is_pm_command && executionContext.mismatch_detected;\n if (failOnMismatchByDefault || failOnMismatchByFlag) {\n const mismatchHint = buildPmContextMismatchHint({\n executionContext,\n runLevelPmContextMode,\n linkedOverridePmContextMode,\n });\n const mismatchPrefix = options?.checkContext === true ? \"Linked test preflight PM context mismatch detected\" : \"Linked test PM context mismatch detected\";\n results.push({\n command: linkedTest.command,\n path: linkedTest.path,\n status: \"failed\",\n exit_code: 1,\n failure_category: \"assertion_failure\",\n execution_context: executionContext,\n error:\n `${mismatchPrefix} (source_project_items=${executionContext.source_project_item_count}, ` +\n `sandbox_project_items=${executionContext.sandbox_project_item_count}).${mismatchHint}`,\n });\n continue;\n }\n if (options?.requireAssertionsForPm === true && executionContext.is_pm_command && !hasLinkedTestAssertions(linkedTest)) {\n results.push({\n command: linkedTest.command,\n path: linkedTest.path,\n status: \"failed\",\n exit_code: 1,\n failure_category: \"assertion_failure\",\n execution_context: executionContext,\n error: \"Linked PM command requires assertions when --require-assertions-for-pm is enabled.\",\n });\n continue;\n }\n const timeoutMs = ((linkedTest.timeout_seconds ?? defaultTimeoutSeconds ?? 120) * 1000);\n const effectiveDirectives = resolveEffectiveLinkedTestDirectives(runtimeDirectives, linkedTest);\n const executionEnv: NodeJS.ProcessEnv = { ...process.env };\n applyEnvDirectiveStage(executionEnv, runtimeDirectives);\n applyEnvDirectiveStage(executionEnv, {\n env_set: linkedTest.env_set ?? {},\n env_clear: linkedTest.env_clear ?? [],\n });\n if (effectiveDirectives.shared_host_safe) {\n applySharedHostSafeDefaults(executionEnv);\n }\n executionEnv.FORCE_COLOR = \"0\";\n executionEnv.PM_PATH = executionContext.sandbox_project_pm_path;\n executionEnv.PM_GLOBAL_PATH = executionContext.sandbox_global_pm_path;\n const execution = await runLinkedTestCommand(\n linkedTest.command,\n timeoutMs,\n executionEnv,\n {\n index: index + 1,\n total: tests.length,\n timeoutMs,\n command: linkedTest.command,\n },\n progressMode,\n );\n const passed = execution.exitCode === 0 && !execution.timedOut && !execution.maxBufferExceeded;\n if (passed) {\n if (options?.failOnEmptyTestRun === true) {\n const emptyRunSignal = detectEmptyLinkedTestRun(execution.stdout, execution.stderr);\n if (emptyRunSignal) {\n results.push({\n command: linkedTest.command,\n path: linkedTest.path,\n status: \"failed\",\n exit_code: 1,\n failure_category: \"empty_run\",\n execution_context: executionContext,\n stdout: execution.stdout,\n stderr: execution.stderr,\n error:\n `Linked test reported an empty test run (${emptyRunSignal}) while --fail-on-empty-test-run is enabled. ` +\n \"Update test selection or disable --fail-on-empty-test-run for this run.\",\n });\n continue;\n }\n }\n const assertionFailures = evaluateLinkedTestAssertions(linkedTest, execution.stdout, execution.stderr);\n if (assertionFailures.length > 0) {\n results.push({\n command: linkedTest.command,\n path: linkedTest.path,\n status: \"failed\",\n exit_code: 1,\n failure_category: \"assertion_failure\",\n execution_context: executionContext,\n stdout: execution.stdout,\n stderr: execution.stderr,\n error: `Linked test assertion(s) failed: ${assertionFailures.join(\"; \")}`,\n });\n continue;\n }\n results.push({\n command: linkedTest.command,\n path: linkedTest.path,\n status: \"passed\",\n exit_code: 0,\n execution_context: executionContext,\n stdout: execution.stdout,\n stderr: execution.stderr,\n });\n continue;\n }\n const failureCategory = classifyLinkedTestFailure(execution);\n results.push({\n command: linkedTest.command,\n path: linkedTest.path,\n status: \"failed\",\n exit_code: resolveLinkedTestFailureExitCode(execution),\n failure_category: failureCategory,\n execution_context: executionContext,\n stdout: execution.stdout,\n stderr: execution.stderr,\n error: formatLinkedTestExecutionError(execution, timeoutMs),\n });\n }\n } finally {\n await rm(sandboxRoot, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });\n }\n return results;\n}\n\n/**\n * Implements run test for the public runtime surface of this module.\n */\nexport async function runTest(id: string, options: TestCommandOptions, global: GlobalOptions): Promise<TestResult> {\n const stdinResolver = createStdinTokenResolver();\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const resolvedAdds = await stdinResolver.resolveList(options.add, \"--add\");\n const resolvedAddJsons = await stdinResolver.resolveList(options.addJson, \"--add-json\");\n const resolvedRemoves = await stdinResolver.resolveList(options.remove, \"--remove\");\n const adds = [...parseAddEntries(resolvedAdds), ...parseAddJsonEntries(resolvedAddJsons)];\n const removes = parseRemoveEntries(resolvedRemoves);\n const shouldMutate = adds.length > 0 || removes.length > 0;\n\n let tests: LinkedTest[] = [];\n let itemId: string;\n let changed = false;\n\n if (shouldMutate) {\n const author = resolveAuthor(options.author, settings.author_default);\n const result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: \"tests_add\",\n author,\n message: options.message,\n force: options.force,\n skipNoop: true,\n mutate(document) {\n const previous = document.metadata.tests ?? [];\n const next = [...(document.metadata.tests ?? [])];\n for (const add of adds) {\n const exists = next.some(\n (entry) =>\n entry.command === add.command &&\n entry.path === add.path &&\n entry.scope === add.scope &&\n entry.pm_context_mode === add.pm_context_mode,\n );\n if (!exists) {\n next.push(add);\n }\n }\n if (removes.length > 0) {\n for (let i = next.length - 1; i >= 0; i -= 1) {\n const entry = next[i];\n if (removes.includes(entry.path ?? \"\") || removes.includes(entry.command ?? \"\")) {\n next.splice(i, 1);\n }\n }\n }\n document.metadata.tests = next;\n return { changedFields: stableValueEquals(previous, next) ? [] : [\"tests\"] };\n },\n });\n tests = result.item.tests ?? [];\n itemId = result.item.id;\n changed = result.changedFields.length > 0;\n } else {\n const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);\n if (!located) {\n throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);\n }\n itemId = located.id;\n const loaded = await readLocatedItem(located, { schema: settings.schema });\n tests = loaded.document.metadata.tests ?? [];\n }\n\n let defaultTimeoutSeconds: number | undefined;\n if (options.timeout !== undefined) {\n defaultTimeoutSeconds = parseOptionalNumber(options.timeout, \"timeout\");\n }\n const pmContextMode = parsePmContextMode(options.pmContext);\n const hasRuntimeDirectiveFlags =\n (options.envSet?.length ?? 0) > 0 ||\n (options.envClear?.length ?? 0) > 0 ||\n options.sharedHostSafe === true ||\n options.pmContext !== undefined ||\n options.overrideLinkedPmContext === true ||\n options.failOnContextMismatch === true ||\n options.failOnSkipped === true ||\n options.failOnEmptyTestRun === true ||\n options.requireAssertionsForPm === true ||\n options.checkContext === true ||\n options.autoPmContext === true;\n if (hasRuntimeDirectiveFlags && options.run !== true) {\n throw new PmCliError(\n \"--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\",\n EXIT_CODE.USAGE,\n );\n }\n const hasSelectorFlags = options.match !== undefined || options.onlyIndex !== undefined || options.onlyLast === true;\n if (hasSelectorFlags && options.run !== true) {\n throw new PmCliError(\"--match, --only-index, and --only-last require --run\", EXIT_CODE.USAGE);\n }\n const selectorInput = {\n match: options.match,\n onlyIndex: options.onlyIndex === undefined ? undefined : parseOnlyIndexValue(options.onlyIndex),\n onlyLast: options.onlyLast,\n };\n const runSelection = options.run === true ? resolveLinkedTestRunSelection(tests, selectorInput) : undefined;\n const testsToRun = runSelection?.selected ?? tests;\n\n const runStartedAt = options.run === true ? nowIso() : undefined;\n const runResults = options.run === true\n ? await runLinkedTests(testsToRun, defaultTimeoutSeconds, {\n progress: options.progress,\n envSet: options.envSet,\n envClear: options.envClear,\n sharedHostSafe: options.sharedHostSafe,\n pmContext: pmContextMode,\n overrideLinkedPmContext: options.overrideLinkedPmContext,\n failOnContextMismatch: options.failOnContextMismatch,\n failOnEmptyTestRun: options.failOnEmptyTestRun,\n requireAssertionsForPm: options.requireAssertionsForPm,\n checkContext: options.checkContext,\n autoPmContext: options.autoPmContext,\n sourceRoots: {\n projectPmRoot: pmRoot,\n globalPmRoot: resolveGlobalPmRoot(process.cwd()),\n },\n })\n : [];\n const failureCategories = countFailureCategories(runResults);\n const failOnSkippedTriggered =\n options.run === true && options.failOnSkipped === true && runResults.some((entry) => entry.status === \"skipped\");\n const warnings: string[] = [];\n if (runSelection && runSelection.selector !== null) {\n warnings.push(\n `linked_test_selection:${runSelection.selector}=${runSelection.requested};selected=${runSelection.selected_count};skipped=${runSelection.skipped_count};indexes=${runSelection.selected_indexes.join(\",\")}`,\n );\n }\n if (options.run === true && options.checkContext === true) {\n const preflight = summarizeContextPreflight(runResults);\n warnings.push(\n `context_preflight:checked_pm_commands=${preflight.checked_pm_commands};` +\n `tracker_read_commands=${preflight.tracker_read_commands};` +\n `mismatches=${preflight.mismatches};` +\n `auto_remediated=${preflight.auto_remediated}`,\n );\n }\n\n if (options.run === true && runStartedAt && settings.testing.record_results_to_items === true) {\n const summary = summarizeRunResultStatuses(runResults);\n const trackedRunId = resolveTrackedRunId(\"test\");\n const attemptRaw = process.env.PM_BACKGROUND_TEST_RUN_ATTEMPT?.trim();\n const parsedAttempt = attemptRaw ? Number.parseInt(attemptRaw, 10) : Number.NaN;\n const resumedFrom = process.env.PM_BACKGROUND_TEST_RUN_RESUMED_FROM?.trim();\n try {\n await appendTrackedTestRunSummary({\n pmRoot,\n settings,\n itemId,\n author: resolveAuthor(options.author, settings.author_default),\n message: `Track test run summary (${trackedRunId})`,\n entry: {\n run_id: trackedRunId,\n kind: \"test\",\n status: summary.failed > 0 || failOnSkippedTriggered === true ? \"failed\" : \"passed\",\n started_at: runStartedAt,\n finished_at: nowIso(),\n recorded_at: nowIso(),\n attempt: Number.isFinite(parsedAttempt) && parsedAttempt >= 1 ? parsedAttempt : undefined,\n resumed_from: resumedFrom && resumedFrom.length > 0 ? resumedFrom : undefined,\n passed: summary.passed,\n failed: summary.failed,\n skipped: summary.skipped,\n fail_on_skipped_triggered: failOnSkippedTriggered ? true : undefined,\n },\n });\n } catch (error: unknown) {\n warnings.push(`test_result_tracking_failed:${itemId}:${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return {\n ok: runResults.every((entry) => entry.status !== \"failed\") && failOnSkippedTriggered !== true,\n id: itemId,\n tests,\n run_results: runResults,\n failure_categories: failureCategories,\n selection: runSelection\n ? {\n selector: runSelection.selector,\n requested: runSelection.requested,\n selected_indexes: runSelection.selected_indexes,\n selected_count: runSelection.selected_count,\n skipped_count: runSelection.skipped_count,\n }\n : undefined,\n fail_on_skipped_triggered: failOnSkippedTriggered ? true : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n changed,\n count: tests.length,\n };\n}\n/* c8 ignore stop */\n\nexport const _testOnlyTestCommand = {\n buildPmContextMismatchHint,\n commandInvokesPmCli,\n commandInvokesPmTrackerReadCommand,\n copyIntoSandboxIfPresent,\n countLinkedTestItemFiles,\n ensureScope,\n evaluateLinkedTestAssertions,\n extractPmInvocationArgsFromSegment,\n firstDirectTestRunnerSubcommand,\n hasLinkedTestAssertions,\n parseAddJsonEntries,\n parsePmContextMode,\n readJsonPathValue,\n resolveAuthor,\n resolveDirectRunnerSubcommand,\n resolveLinkedTestEffectiveContextMode,\n resolveLinkedTestFailureExitCode,\n resolveLinkedTestRequestedContextMode,\n resolveTrackedRunId,\n runLinkedTestCommand,\n seedLinkedTestSandbox,\n seedLinkedTestTrackerData,\n splitJsonPathSegments,\n summarizeRunResultStatuses,\n};\n", "/**\n * @module core/test/item-test-run-tracking\n *\n * Runs and records linked-test orchestration for Item Test Run Tracking.\n */\nimport { mutateItem } from \"../store/item-store.js\";\nimport { compareTimestampStrings } from \"../shared/time.js\";\nimport type { ItemTestRunSummary, PmSettings } from \"../../types/index.js\";\n\nconst DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT = 20;\n\nfunction trackedTestRunHistoryLimit(): number {\n const raw = process.env.PM_TRACKED_TEST_RUN_HISTORY_LIMIT;\n if (!raw || raw.trim().length === 0) {\n return DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT;\n }\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT;\n }\n return parsed;\n}\n\nfunction normalizeTrackedTestRunSummaries(entries: ItemTestRunSummary[]): ItemTestRunSummary[] {\n return [...entries]\n .filter((entry) =>\n entry.run_id.trim().length > 0 &&\n entry.started_at.trim().length > 0 &&\n entry.finished_at.trim().length > 0 &&\n entry.recorded_at.trim().length > 0\n )\n .sort((left, right) => {\n const byRecorded = compareTimestampStrings(left.recorded_at, right.recorded_at);\n if (byRecorded !== 0) return byRecorded;\n const byRunId = left.run_id.localeCompare(right.run_id);\n if (byRunId !== 0) return byRunId;\n return left.kind.localeCompare(right.kind);\n });\n}\n\n/**\n * Implements append tracked test run summary for the public runtime surface of this module.\n */\nexport async function appendTrackedTestRunSummary(options: {\n pmRoot: string;\n settings: PmSettings;\n itemId: string;\n author: string;\n entry: ItemTestRunSummary;\n message?: string;\n}): Promise<void> {\n const historyLimit = trackedTestRunHistoryLimit();\n await mutateItem({\n pmRoot: options.pmRoot,\n settings: options.settings,\n id: options.itemId,\n op: \"test_run_track\",\n author: options.author,\n message: options.message,\n force: false,\n mutate(document) {\n const current = document.metadata.test_runs ?? [];\n const next = normalizeTrackedTestRunSummaries([...current, options.entry]);\n const bounded = next.length > historyLimit ? next.slice(next.length - historyLimit) : next;\n document.metadata.test_runs = bounded;\n return { changedFields: [\"test_runs\"] };\n },\n });\n}\n", "/**\n * @module core/test/run-selectors\n *\n * Runs and records linked-test orchestration for Run Selectors.\n */\nimport { EXIT_CODE } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\nimport type { LinkedTest } from \"../../types.js\";\n\n/**\n * Pure selection logic for `pm test --run` selectors (pm-p86h / GitHub #194).\n *\n * Selectors pick WHICH linked tests execute without mutating item metadata:\n * - `--match <substring>`: case-insensitive substring on command/path.\n * - `--only-index <n>`: 1-based index into the `--list` order.\n * - `--only-last`: most recently added entry (last in `--list` order).\n */\n\nexport type LinkedTestSelectorKind = \"match\" | \"only-index\" | \"only-last\";\n\n/**\n * Documents the linked test run selector payload exchanged by command, SDK, and package integrations.\n */\nexport interface LinkedTestRunSelector {\n match?: string;\n onlyIndex?: number;\n onlyLast?: boolean;\n}\n\n/**\n * Documents the linked test run selection payload exchanged by command, SDK, and package integrations.\n */\nexport interface LinkedTestRunSelection {\n selector: LinkedTestSelectorKind | null;\n requested: string | null;\n selected: LinkedTest[];\n /** 1-based positions of selected entries in the original `--list` order. */\n selected_indexes: number[];\n selected_count: number;\n skipped_count: number;\n}\n\nconst MAX_SELECTOR_ENTRY_LABEL_LENGTH = 100;\n\n/**\n * Implements parse only index value for the public runtime surface of this module.\n */\nexport function parseOnlyIndexValue(raw: string | number, optionName = \"--only-index\"): number {\n const value = typeof raw === \"number\" ? raw : Number(String(raw).trim());\n if (!Number.isInteger(value) || value < 1) {\n throw new PmCliError(\n `${optionName} requires a 1-based integer index into the linked-test list (got \"${raw}\"). Use pm test <id> --list to inspect positions.`,\n EXIT_CODE.USAGE,\n );\n }\n return value;\n}\n\nfunction summarizeSelectorEntry(entry: LinkedTest): string {\n const label = entry.command ?? entry.path ?? \"<no command>\";\n const normalized = label.replaceAll(/\\s+/g, \" \").trim() || \"<no command>\";\n if (normalized.length <= MAX_SELECTOR_ENTRY_LABEL_LENGTH) {\n return normalized;\n }\n return `${normalized.slice(0, MAX_SELECTOR_ENTRY_LABEL_LENGTH - 3)}...`;\n}\n\n/**\n * Implements describe linked test entries for the public runtime surface of this module.\n */\nexport function describeLinkedTestEntries(tests: LinkedTest[]): string {\n return tests.map((entry, index) => `${index + 1}. ${summarizeSelectorEntry(entry)}`).join(\"; \");\n}\n\nfunction activeSelectorKinds(selector: LinkedTestRunSelector): LinkedTestSelectorKind[] {\n const kinds: LinkedTestSelectorKind[] = [];\n if (selector.match !== undefined) {\n kinds.push(\"match\");\n }\n if (selector.onlyIndex !== undefined) {\n kinds.push(\"only-index\");\n }\n if (selector.onlyLast === true) {\n kinds.push(\"only-last\");\n }\n return kinds;\n}\n\nfunction entryMatchesSubstring(entry: LinkedTest, needle: string): boolean {\n const command = entry.command?.toLowerCase() ?? \"\";\n const entryPath = entry.path?.toLowerCase() ?? \"\";\n return command.includes(needle) || entryPath.includes(needle);\n}\n\n/**\n * Implements resolve linked test run selection for the public runtime surface of this module.\n */\nexport function resolveLinkedTestRunSelection(tests: LinkedTest[], selector: LinkedTestRunSelector): LinkedTestRunSelection {\n const kinds = activeSelectorKinds(selector);\n if (kinds.length === 0) {\n return {\n selector: null,\n requested: null,\n selected: tests,\n selected_indexes: tests.map((_, index) => index + 1),\n selected_count: tests.length,\n skipped_count: 0,\n };\n }\n if (kinds.length > 1) {\n throw new PmCliError(\n `Combine at most one linked-test selector per run: ${kinds.map((kind) => `--${kind}`).join(\" and \")} were provided. Pick one of --match, --only-index, --only-last.`,\n EXIT_CODE.USAGE,\n );\n }\n const kind = kinds[0];\n if (tests.length === 0) {\n throw new PmCliError(\n `--${kind} matched no linked tests because this item has none. Add one first with --add, --command, or --add-json.`,\n EXIT_CODE.USAGE,\n );\n }\n if (kind === \"match\") {\n // kind is \"match\" only when selector.match is defined (see activeSelectorKinds).\n const needle = (selector.match as string).trim().toLowerCase();\n if (needle.length === 0) {\n throw new PmCliError(\"--match requires a non-empty substring to match against linked-test command/path values\", EXIT_CODE.USAGE);\n }\n const selectedIndexes: number[] = [];\n const selected: LinkedTest[] = [];\n for (let index = 0; index < tests.length; index += 1) {\n if (entryMatchesSubstring(tests[index], needle)) {\n selected.push(tests[index]);\n selectedIndexes.push(index + 1);\n }\n }\n if (selected.length === 0) {\n throw new PmCliError(\n `--match \"${selector.match}\" matched none of the ${tests.length} linked test(s). Available entries: ${describeLinkedTestEntries(tests)}`,\n EXIT_CODE.USAGE,\n );\n }\n return {\n selector: \"match\",\n requested: selector.match as string,\n selected,\n selected_indexes: selectedIndexes,\n selected_count: selected.length,\n skipped_count: tests.length - selected.length,\n };\n }\n if (kind === \"only-index\") {\n const index = parseOnlyIndexValue(selector.onlyIndex as number);\n if (index > tests.length) {\n throw new PmCliError(\n `--only-index ${index} is out of range: this item has ${tests.length} linked test(s). Available entries: ${describeLinkedTestEntries(tests)}`,\n EXIT_CODE.USAGE,\n );\n }\n return {\n selector: \"only-index\",\n requested: String(index),\n selected: [tests[index - 1]],\n selected_indexes: [index],\n selected_count: 1,\n skipped_count: tests.length - 1,\n };\n }\n return {\n selector: \"only-last\",\n requested: \"last\",\n selected: [tests[tests.length - 1]],\n selected_indexes: [tests.length],\n selected_count: 1,\n skipped_count: tests.length - 1,\n };\n}\n", "/**\n * @module cli/commands/test/linked-command-detection\n *\n * Parses linked-test command invocations for sandbox and context-safety checks.\n */\n// Pure, leaf-level helpers for detecting how linked-test shell commands invoke\n// the pm CLI (directly, via npx/pnpm/npm exec, or a launcher subcommand) and for\n// pulling structured context (subcommand, referenced item ids, runner) out of a\n// normalized command string. Extracted from test.ts to keep that command file\n// under the per-file LOC budget; consumers re-export these from test.ts so no\n// caller outside test.ts changes.\n\nexport const PM_GLOBAL_FLAGS_WITH_VALUE = new Set([\"--path\"]);\nexport const NPX_FLAGS_WITH_VALUE = new Set([\"-p\", \"--package\", \"-c\", \"--call\"]);\nexport const PNPM_GLOBAL_FLAGS_WITH_VALUE = new Set([\n \"-c\",\n \"-C\",\n \"--config\",\n \"--dir\",\n \"--filter\",\n \"--workspace-dir\",\n]);\nexport const NPM_GLOBAL_FLAGS_WITH_VALUE = new Set([\"-C\", \"--prefix\", \"--userconfig\", \"--cache\"]);\nexport const YARN_GLOBAL_FLAGS_WITH_VALUE = new Set([\"--cwd\"]);\nexport const BUN_GLOBAL_FLAGS_WITH_VALUE = new Set([\"--cwd\"]);\nexport const NPM_EXEC_SUBCOMMANDS = new Set([\"exec\", \"x\"]);\nexport const SCRIPT_RUN_SUBCOMMANDS = new Set([\"run\", \"run-script\"]);\nexport const SCRIPT_RUN_FLAGS_WITH_VALUE = new Set([\"-C\", \"--dir\", \"--cwd\", \"-w\", \"--workspace\", \"--filter\"]);\n\n/**\n * Implements split normalized command segments for the public runtime surface of this module.\n */\nexport function splitNormalizedCommandSegments(normalizedCommand: string): string[] {\n return normalizedCommand\n .split(/&&|\\|\\||\\||;/)\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0);\n}\n\n/**\n * Implements strip leading env assignments for the public runtime surface of this module.\n */\nexport function stripLeadingEnvAssignments(tokens: string[]): string[] {\n let start = 0;\n if (tokens[start] === \"env\") {\n start += 1;\n }\n while (start < tokens.length) {\n const token = tokens[start];\n if (/^(?:[a-z_][a-z0-9_]*|\\$env:[a-z_][a-z0-9_]*)=.*/.test(token)) {\n start += 1;\n continue;\n }\n break;\n }\n return tokens.slice(start);\n}\n\n/**\n * Implements first pm subcommand for the public runtime surface of this module.\n */\nexport function firstPmSubcommand(args: string[]): string | undefined {\n let index = 0;\n while (index < args.length) {\n const token = args[index];\n if (token === \"--\") {\n index += 1;\n continue;\n }\n if (token.startsWith(\"-\")) {\n if (PM_GLOBAL_FLAGS_WITH_VALUE.has(token)) {\n index += 2;\n continue;\n }\n index += 1;\n continue;\n }\n return token;\n }\n return undefined;\n}\n\n/**\n * Implements check whether pm executable token for the public runtime surface of this module.\n */\nexport function isPmExecutableToken(token: string): boolean {\n return (\n token === \"pm\" ||\n token === \"pm.cmd\" ||\n token === \"pm.exe\" ||\n token.endsWith(\"/pm\") ||\n token.endsWith(\"/pm.cmd\") ||\n token.endsWith(\"/pm.exe\")\n );\n}\n\n/**\n * Implements normalize package specifier for the public runtime surface of this module.\n */\nexport function normalizePackageSpecifier(token: string): string {\n const trimmed = token.trim();\n if (!trimmed.startsWith(\"@\")) {\n const versionSeparator = trimmed.indexOf(\"@\");\n return versionSeparator === -1 ? trimmed : trimmed.slice(0, versionSeparator);\n }\n const scopeSeparator = trimmed.indexOf(\"/\");\n if (scopeSeparator === -1) {\n return trimmed;\n }\n const versionSeparator = trimmed.indexOf(\"@\", scopeSeparator + 1);\n return versionSeparator === -1 ? trimmed : trimmed.slice(0, versionSeparator);\n}\n\n/**\n * Implements check whether pm cli package token for the public runtime surface of this module.\n */\nexport function isPmCliPackageToken(token: string): boolean {\n const normalizedSpecifier = normalizePackageSpecifier(token);\n return (\n normalizedSpecifier === \"pm-cli\" ||\n normalizedSpecifier.endsWith(\"/pm-cli\") ||\n token === \"pm-cli\" ||\n token.endsWith(\"/pm-cli\")\n );\n}\n\n/**\n * Implements check whether pm cli script token for the public runtime surface of this module.\n */\nexport function isPmCliScriptToken(token: string): boolean {\n return token === \"dist/cli.js\" || token === \"./dist/cli.js\" || token.endsWith(\"/dist/cli.js\");\n}\n\n/**\n * Implements parse npx command for the public runtime surface of this module.\n */\nexport function parseNpxCommand(tokens: string[]): { command: string; args: string[] } | null {\n let index = 0;\n while (index < tokens.length) {\n const token = tokens[index];\n if (token === \"--\") {\n index += 1;\n break;\n }\n if (!token.startsWith(\"-\")) {\n break;\n }\n if (token.includes(\"=\")) {\n index += 1;\n continue;\n }\n if (NPX_FLAGS_WITH_VALUE.has(token)) {\n index += 2;\n continue;\n }\n index += 1;\n }\n const command = tokens[index];\n if (!command) {\n return null;\n }\n return {\n command,\n args: tokens.slice(index + 1),\n };\n}\n\n/**\n * Implements parse launcher subcommand for the public runtime surface of this module.\n */\nexport function parseLauncherSubcommand(\n tokens: string[],\n flagsWithValue: Set<string>,\n): { subcommand: string; args: string[] } | null {\n let index = 0;\n while (index < tokens.length) {\n const token = tokens[index];\n if (token === \"--\") {\n index += 1;\n continue;\n }\n if (token.startsWith(\"-\")) {\n if (token.includes(\"=\")) {\n index += 1;\n continue;\n }\n if (flagsWithValue.has(token)) {\n index += 2;\n continue;\n }\n index += 1;\n continue;\n }\n return {\n subcommand: token,\n args: tokens.slice(index + 1),\n };\n }\n return null;\n}\n\n/**\n * Implements parse pnpm dlx command for the public runtime surface of this module.\n */\nexport function parsePnpmDlxCommand(tokens: string[]): { command: string; args: string[] } | null {\n const parsed = parseLauncherSubcommand(tokens, PNPM_GLOBAL_FLAGS_WITH_VALUE);\n if (parsed?.subcommand !== \"dlx\") {\n return null;\n }\n return parseNpxCommand(parsed.args);\n}\n\n/**\n * Implements parse npm exec command for the public runtime surface of this module.\n */\nexport function parseNpmExecCommand(tokens: string[]): { command: string; args: string[] } | null {\n const parsed = parseLauncherSubcommand(tokens, NPM_GLOBAL_FLAGS_WITH_VALUE);\n if (!parsed || !NPM_EXEC_SUBCOMMANDS.has(parsed.subcommand)) {\n return null;\n }\n return parseNpxCommand(parsed.args);\n}\n\n/**\n * Implements resolve pm subcommand context for the public runtime surface of this module.\n */\nexport function resolvePmSubcommandContext(args: string[]): { subcommand: string; remaining: string[] } | null {\n let index = 0;\n while (index < args.length) {\n const token = args[index];\n if (token === \"--\") {\n index += 1;\n continue;\n }\n if (token.startsWith(\"-\")) {\n if (PM_GLOBAL_FLAGS_WITH_VALUE.has(token)) {\n index += 2;\n continue;\n }\n index += 1;\n continue;\n }\n return {\n subcommand: token,\n remaining: args.slice(index + 1),\n };\n }\n return null;\n}\n\n/**\n * Implements first positional token for the public runtime surface of this module.\n */\nexport function firstPositionalToken(tokens: string[]): string | undefined {\n for (const token of tokens) {\n if (!token.startsWith(\"-\")) {\n return token;\n }\n }\n return undefined;\n}\n"],
5
- "mappings": "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",
6
- "names": ["kind", "versionSeparator", "global"]
7
- }
@@ -1,118 +0,0 @@
1
- import {
2
- EXIT_CODE,
3
- PmCliError,
4
- isPathWithinDirectory,
5
- pathExists
6
- } from "./chunk-SNUK7H5J.js";
7
-
8
- // dist/cli/commands/extension/shared.js
9
- import fs from "node:fs/promises";
10
- import path from "node:path";
11
- !(function() {
12
- try {
13
- var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
14
- n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "c751d14c-1c20-52ed-9418-886d9e85f3ed");
15
- } catch (e2) {
16
- }
17
- })();
18
- var DEFAULT_EXTENSION_PRIORITY = 100;
19
- function normalizeStringList(values) {
20
- return [...new Set(values.map((value) => value.trim()).filter((value) => value.length > 0))].sort((left, right) => left.localeCompare(right));
21
- }
22
- function normalizeExtensionNameForMatch(value) {
23
- return value.trim().toLowerCase();
24
- }
25
- function normalizeManagedDirectoryName(name) {
26
- const normalized = name.trim().toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
27
- if (normalized.length === 0) {
28
- throw new PmCliError("Extension manifest name must resolve to a non-empty directory name.", EXIT_CODE.USAGE);
29
- }
30
- if (normalized === "." || normalized === "..") {
31
- throw new PmCliError('Extension manifest name must not resolve to "." or "..".', EXIT_CODE.USAGE);
32
- }
33
- return normalized;
34
- }
35
- function parseExtensionManifest(raw) {
36
- if (typeof raw !== "object" || raw === null) {
37
- return null;
38
- }
39
- const candidate = raw;
40
- if (typeof candidate.name !== "string" || candidate.name.trim().length === 0) {
41
- return null;
42
- }
43
- if (typeof candidate.version !== "string" || candidate.version.trim().length === 0) {
44
- return null;
45
- }
46
- if (typeof candidate.entry !== "string" || candidate.entry.trim().length === 0) {
47
- return null;
48
- }
49
- let priority = DEFAULT_EXTENSION_PRIORITY;
50
- if (candidate.priority !== void 0 && candidate.priority !== null) {
51
- if (typeof candidate.priority !== "number" || !Number.isInteger(candidate.priority)) {
52
- return null;
53
- }
54
- priority = candidate.priority;
55
- }
56
- let capabilities = [];
57
- if (candidate.capabilities !== void 0 && candidate.capabilities !== null) {
58
- if (!Array.isArray(candidate.capabilities) || candidate.capabilities.some((value) => typeof value !== "string")) {
59
- return null;
60
- }
61
- capabilities = normalizeStringList(candidate.capabilities.map((value) => String(value).toLowerCase()));
62
- }
63
- return {
64
- name: candidate.name.trim(),
65
- version: candidate.version.trim(),
66
- entry: candidate.entry.trim(),
67
- priority,
68
- capabilities
69
- };
70
- }
71
- async function isCanonicalPathWithinDirectory(directory, targetPath) {
72
- const [resolvedDirectory, resolvedTargetPath] = await Promise.all([fs.realpath(directory), fs.realpath(targetPath)]);
73
- return isPathWithinDirectory(resolvedDirectory, resolvedTargetPath);
74
- }
75
- async function validateExtensionDirectory(directory) {
76
- const manifestPath = path.join(directory, "manifest.json");
77
- if (!await pathExists(manifestPath)) {
78
- throw new PmCliError(`Extension manifest is missing at "${manifestPath}".`, EXIT_CODE.USAGE);
79
- }
80
- let parsedManifest;
81
- try {
82
- parsedManifest = JSON.parse(await fs.readFile(manifestPath, "utf8"));
83
- } catch (error) {
84
- throw new PmCliError(`Failed to parse extension manifest at "${manifestPath}": ${formatManifestReadError(error)}`, EXIT_CODE.USAGE);
85
- }
86
- const manifest = parseExtensionManifest(parsedManifest);
87
- if (!manifest) {
88
- throw new PmCliError(`Extension manifest at "${manifestPath}" is invalid.`, EXIT_CODE.USAGE);
89
- }
90
- const entryPath = path.resolve(directory, manifest.entry);
91
- if (!isPathWithinDirectory(directory, entryPath)) {
92
- throw new PmCliError(`Extension entry "${manifest.entry}" resolves outside extension directory "${directory}".`, EXIT_CODE.USAGE);
93
- }
94
- if (!await pathExists(entryPath)) {
95
- throw new PmCliError(`Extension entry file is missing at "${entryPath}".`, EXIT_CODE.USAGE);
96
- }
97
- if (!await isCanonicalPathWithinDirectory(directory, entryPath)) {
98
- throw new PmCliError(`Extension entry "${manifest.entry}" resolves outside extension directory after symlink resolution.`, EXIT_CODE.USAGE);
99
- }
100
- return {
101
- directory,
102
- manifest_path: manifestPath,
103
- entry_path: entryPath,
104
- manifest
105
- };
106
- }
107
- function formatManifestReadError(error) {
108
- return error instanceof Error ? error.message : String(error);
109
- }
110
-
111
- export {
112
- normalizeStringList,
113
- normalizeExtensionNameForMatch,
114
- normalizeManagedDirectoryName,
115
- parseExtensionManifest,
116
- validateExtensionDirectory
117
- };
118
- //# sourceMappingURL=chunk-F6VH3LFC.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../../cli/commands/extension/shared.ts"],
4
- "sourcesContent": ["/**\n * @module cli/commands/extension/shared\n *\n * Implements extension package-management support for Shared.\n */\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathExists } from \"../../../core/fs/fs-utils.js\";\nimport { isPathWithinDirectory } from \"../../../core/fs/path-utils.js\";\nimport { EXIT_CODE } from \"../../../core/shared/constants.js\";\nimport { PmCliError } from \"../../../core/shared/errors.js\";\nimport type { ExtensionManifest } from \"../../../core/extensions/loader.js\";\n\nexport const DEFAULT_EXTENSION_PRIORITY = 100;\n\n/**\n * Documents the validated extension directory payload exchanged by command, SDK, and package integrations.\n */\nexport interface ValidatedExtensionDirectory {\n directory: string;\n manifest_path: string;\n entry_path: string;\n manifest: ExtensionManifest;\n}\n\n/**\n * Implements normalize string list for the public runtime surface of this module.\n */\nexport function normalizeStringList(values: readonly string[]): string[] {\n return [...new Set(values.map((value) => value.trim()).filter((value) => value.length > 0))].sort((left, right) =>\n left.localeCompare(right),\n );\n}\n\n/**\n * Implements normalize extension name for match for the public runtime surface of this module.\n */\nexport function normalizeExtensionNameForMatch(value: string): string {\n return value.trim().toLowerCase();\n}\n\n/**\n * Implements normalize managed directory name for the public runtime surface of this module.\n */\nexport function normalizeManagedDirectoryName(name: string): string {\n const normalized = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n if (normalized.length === 0) {\n throw new PmCliError(\"Extension manifest name must resolve to a non-empty directory name.\", EXIT_CODE.USAGE);\n }\n if (normalized === \".\" || normalized === \"..\") {\n // Manifest-controlled input must resolve to a dedicated child directory, never\n // the extensions root itself or its parent (path-traversal guard).\n throw new PmCliError(\"Extension manifest name must not resolve to \\\".\\\" or \\\"..\\\".\", EXIT_CODE.USAGE);\n }\n return normalized;\n}\n\n/**\n * Implements parse extension manifest for the public runtime surface of this module.\n */\nexport function parseExtensionManifest(raw: unknown): ExtensionManifest | null {\n if (typeof raw !== \"object\" || raw === null) {\n return null;\n }\n const candidate = raw as Record<string, unknown>;\n if (typeof candidate.name !== \"string\" || candidate.name.trim().length === 0) {\n return null;\n }\n if (typeof candidate.version !== \"string\" || candidate.version.trim().length === 0) {\n return null;\n }\n if (typeof candidate.entry !== \"string\" || candidate.entry.trim().length === 0) {\n return null;\n }\n\n let priority = DEFAULT_EXTENSION_PRIORITY;\n if (candidate.priority !== undefined && candidate.priority !== null) {\n if (typeof candidate.priority !== \"number\" || !Number.isInteger(candidate.priority)) {\n return null;\n }\n priority = candidate.priority;\n }\n\n let capabilities: string[] = [];\n if (candidate.capabilities !== undefined && candidate.capabilities !== null) {\n if (!Array.isArray(candidate.capabilities) || candidate.capabilities.some((value) => typeof value !== \"string\")) {\n return null;\n }\n capabilities = normalizeStringList(candidate.capabilities.map((value) => String(value).toLowerCase()));\n }\n\n return {\n name: candidate.name.trim(),\n version: candidate.version.trim(),\n entry: candidate.entry.trim(),\n priority,\n capabilities,\n };\n}\n\n/**\n * Implements check whether canonical path within directory for the public runtime surface of this module.\n */\nexport async function isCanonicalPathWithinDirectory(directory: string, targetPath: string): Promise<boolean> {\n const [resolvedDirectory, resolvedTargetPath] = await Promise.all([fs.realpath(directory), fs.realpath(targetPath)]);\n return isPathWithinDirectory(resolvedDirectory, resolvedTargetPath);\n}\n\n/**\n * Implements validate extension directory for the public runtime surface of this module.\n */\nexport async function validateExtensionDirectory(directory: string): Promise<ValidatedExtensionDirectory> {\n const manifestPath = path.join(directory, \"manifest.json\");\n if (!(await pathExists(manifestPath))) {\n throw new PmCliError(`Extension manifest is missing at \"${manifestPath}\".`, EXIT_CODE.USAGE);\n }\n\n let parsedManifest: unknown;\n try {\n parsedManifest = JSON.parse(await fs.readFile(manifestPath, \"utf8\")) as unknown;\n } catch (error: unknown) {\n throw new PmCliError(\n `Failed to parse extension manifest at \"${manifestPath}\": ${formatManifestReadError(error)}`,\n EXIT_CODE.USAGE,\n );\n }\n\n const manifest = parseExtensionManifest(parsedManifest);\n if (!manifest) {\n throw new PmCliError(`Extension manifest at \"${manifestPath}\" is invalid.`, EXIT_CODE.USAGE);\n }\n\n const entryPath = path.resolve(directory, manifest.entry);\n if (!isPathWithinDirectory(directory, entryPath)) {\n throw new PmCliError(\n `Extension entry \"${manifest.entry}\" resolves outside extension directory \"${directory}\".`,\n EXIT_CODE.USAGE,\n );\n }\n if (!(await pathExists(entryPath))) {\n throw new PmCliError(`Extension entry file is missing at \"${entryPath}\".`, EXIT_CODE.USAGE);\n }\n if (!(await isCanonicalPathWithinDirectory(directory, entryPath))) {\n throw new PmCliError(\n `Extension entry \"${manifest.entry}\" resolves outside extension directory after symlink resolution.`,\n EXIT_CODE.USAGE,\n );\n }\n\n return {\n directory,\n manifest_path: manifestPath,\n entry_path: entryPath,\n manifest,\n };\n}\n\nfunction formatManifestReadError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport const _testOnlyExtensionShared = {\n formatManifestReadError,\n};\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../../../core/governance/metadata-coverage.ts"],"sourcesContent":["/**\n * Metadata governance & coverage observability primitives.\n *\n * One dependency-light module that powers the whole metadata-governance\n * surface: missing-field selection (pm list / pm update-many), coverage\n * percentages (pm stats --metadata-coverage / pm validate), and grouped\n * lifecycle breakdowns (pm stats --by-assignee/--by-tag/--by-priority,\n * pm aggregate explicit labels).\n *\n * The module is pure: it performs no IO and imports no heavy runtime\n * dependencies. Lifecycle semantics are injected via a {@link LifecycleClassifier}\n * so callers map their runtime status registry to lifecycle buckets while the\n * pure logic here stays trivially testable with a fake classifier.\n */\n\nimport { toNonEmptyStringOrUndefined } from \"../shared/primitives.js\";\n\n/** Minimal structural shape this module needs from an item's front matter. */\nexport interface CoverageItem {\n type: string;\n status: string;\n assignee?: string;\n tags?: string[];\n parent?: string;\n priority?: number;\n acceptance_criteria?: string;\n estimated_minutes?: number;\n resolution?: string;\n reviewer?: string;\n risk?: string;\n /** Confidence is a string-like enum or a numeric score depending on workspace. */\n confidence?: string | number;\n sprint?: string;\n release?: string;\n [key: string]: unknown;\n}\n\n/** Lifecycle buckets used by grouped breakdowns and distributions. */\nexport type LifecycleBucket =\n | \"open\"\n | \"in_progress\"\n | \"blocked\"\n | \"draft\"\n | \"closed\"\n | \"canceled\"\n | \"other\";\n\n/** Stable rendering order for lifecycle buckets. */\nexport const LIFECYCLE_BUCKET_ORDER: readonly LifecycleBucket[] = [\n \"open\",\n \"in_progress\",\n \"blocked\",\n \"draft\",\n \"closed\",\n \"canceled\",\n \"other\",\n] as const;\n\n/**\n * Classifies a raw status string into a lifecycle bucket and reports whether a\n * status is terminal (closed/canceled). Callers build this from their resolved\n * runtime status registry via {@link lifecycleClassifierFromStatusRegistry}.\n */\nexport interface LifecycleClassifier {\n classify(status: string): LifecycleBucket;\n isTerminal(status: string): boolean;\n}\n\n/** The subset of a resolved runtime status registry this module consumes. */\nexport interface StatusRegistryLike {\n alias_to_id: Map<string, string>;\n terminal_statuses: Set<string>;\n terminal_canceled_statuses: Set<string>;\n blocked_statuses: Set<string>;\n draft_statuses: Set<string>;\n active_statuses: Set<string>;\n open_status: string;\n}\n\nfunction normalizeStatus(status: string, registry: StatusRegistryLike): string {\n const trimmed = status.trim().toLowerCase();\n return registry.alias_to_id.get(trimmed) ?? trimmed;\n}\n\n/**\n * Adapt a resolved runtime status registry into a {@link LifecycleClassifier}.\n *\n * Precedence is deliberate and disjoint: canceled → closed → blocked → draft →\n * open → in_progress (active but not the default open status) → other.\n */\nexport function lifecycleClassifierFromStatusRegistry(registry: StatusRegistryLike): LifecycleClassifier {\n return {\n isTerminal(status: string): boolean {\n return registry.terminal_statuses.has(normalizeStatus(status, registry));\n },\n classify(status: string): LifecycleBucket {\n const id = normalizeStatus(status, registry);\n if (registry.terminal_canceled_statuses.has(id)) {\n return \"canceled\";\n }\n if (registry.terminal_statuses.has(id)) {\n return \"closed\";\n }\n if (registry.blocked_statuses.has(id)) {\n return \"blocked\";\n }\n if (registry.draft_statuses.has(id)) {\n return \"draft\";\n }\n if (id === registry.open_status) {\n return \"open\";\n }\n if (registry.active_statuses.has(id)) {\n return \"in_progress\";\n }\n return \"other\";\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Missing-metadata predicates\n// ---------------------------------------------------------------------------\n\n/** True when an item has no non-empty acceptance_criteria. */\nexport function isAcMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.acceptance_criteria) === undefined;\n}\n\n/** True when an item has no finite estimated_minutes. */\nexport function isEstimateMissing(item: CoverageItem): boolean {\n return !Number.isFinite(item.estimated_minutes);\n}\n\n/**\n * True when a terminal (closed/canceled) item has no non-empty resolution.\n * Resolution is only expected on terminal items, so open items are never\n * considered \"resolution-missing\".\n */\nexport function isResolutionMissing(item: CoverageItem, classifier: LifecycleClassifier): boolean {\n if (!classifier.isTerminal(item.status)) {\n return false;\n }\n return toNonEmptyStringOrUndefined(item.resolution) === undefined;\n}\n\n/** True when an item has no non-empty reviewer. */\nexport function isReviewerMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.reviewer) === undefined;\n}\n\n/** True when an item has no non-empty risk level. */\nexport function isRiskMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.risk) === undefined;\n}\n\n/**\n * True when an item has no confidence value. Confidence is a string-like enum\n * or a numeric score depending on workspace, so a finite number counts as\n * present and only blank/absent values are treated as missing.\n */\nexport function isConfidenceMissing(item: CoverageItem): boolean {\n if (typeof item.confidence === \"number\") {\n return !Number.isFinite(item.confidence);\n }\n return toNonEmptyStringOrUndefined(item.confidence) === undefined;\n}\n\n/** True when an item has no non-empty sprint. */\nexport function isSprintMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.sprint) === undefined;\n}\n\n/** True when an item has no non-empty release. */\nexport function isReleaseMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.release) === undefined;\n}\n\n/** Selection flags for {@link filterMissingMetadata}. */\nexport interface MissingMetadataFilters {\n acMissing?: boolean;\n estimatesMissing?: boolean;\n resolutionMissing?: boolean;\n reviewerMissing?: boolean;\n riskMissing?: boolean;\n confidenceMissing?: boolean;\n sprintMissing?: boolean;\n releaseMissing?: boolean;\n /** Match items missing ANY of the tracked metadata fields (union). */\n metadataMissing?: boolean;\n}\n\n/** True when any missing-metadata filter is requested. */\nexport function hasMissingMetadataFilter(filters: MissingMetadataFilters): boolean {\n return Boolean(\n filters.acMissing ||\n filters.estimatesMissing ||\n filters.resolutionMissing ||\n filters.reviewerMissing ||\n filters.riskMissing ||\n filters.confidenceMissing ||\n filters.sprintMissing ||\n filters.releaseMissing ||\n filters.metadataMissing,\n );\n}\n\n/**\n * Does a single item satisfy the requested missing-metadata filters?\n *\n * Specific flags (acMissing/estimatesMissing/resolutionMissing plus the\n * governance flags reviewerMissing/riskMissing/confidenceMissing/sprintMissing/\n * releaseMissing) are ANDed together so callers can narrow precisely.\n * `metadataMissing` is ORed in as a union shortcut for \"missing any of the\n * core tracked fields\" (acceptance_criteria/estimated_minutes/resolution); it\n * deliberately excludes the governance fields so the long-standing flag keeps\n * its original meaning. When no filter is requested the item passes.\n */\nexport function itemMatchesMissingMetadata(\n item: CoverageItem,\n filters: MissingMetadataFilters,\n classifier: LifecycleClassifier,\n): boolean {\n if (!hasMissingMetadataFilter(filters)) {\n return true;\n }\n if (filters.acMissing && !isAcMissing(item)) {\n return false;\n }\n if (filters.estimatesMissing && !isEstimateMissing(item)) {\n return false;\n }\n if (filters.resolutionMissing && !isResolutionMissing(item, classifier)) {\n return false;\n }\n if (filters.reviewerMissing && !isReviewerMissing(item)) {\n return false;\n }\n if (filters.riskMissing && !isRiskMissing(item)) {\n return false;\n }\n if (filters.confidenceMissing && !isConfidenceMissing(item)) {\n return false;\n }\n if (filters.sprintMissing && !isSprintMissing(item)) {\n return false;\n }\n if (filters.releaseMissing && !isReleaseMissing(item)) {\n return false;\n }\n if (filters.metadataMissing) {\n const anyMissing =\n isAcMissing(item) || isEstimateMissing(item) || isResolutionMissing(item, classifier);\n if (!anyMissing) {\n return false;\n }\n }\n return true;\n}\n\n/** Filter a list of items by the requested missing-metadata predicates. */\nexport function filterMissingMetadata<T extends CoverageItem>(\n items: readonly T[],\n filters: MissingMetadataFilters,\n classifier: LifecycleClassifier,\n): T[] {\n if (!hasMissingMetadataFilter(filters)) {\n return [...items];\n }\n return items.filter((item) => itemMatchesMissingMetadata(item, filters, classifier));\n}\n\n// ---------------------------------------------------------------------------\n// Metadata coverage percentages\n// ---------------------------------------------------------------------------\n\n/** Coverage-tracked metadata fields. */\nexport type CoverageField =\n | \"acceptance_criteria\"\n | \"estimated_minutes\"\n | \"resolution\"\n | \"tags\"\n | \"parent\";\n\n/** Stable ordering of coverage fields for rendering. */\nexport const COVERAGE_FIELD_ORDER: readonly CoverageField[] = [\n \"acceptance_criteria\",\n \"estimated_minutes\",\n \"resolution\",\n \"tags\",\n \"parent\",\n] as const;\n\n/** Coverage of a single field: present vs applicable, with a rounded percent. */\nexport interface FieldCoverage {\n present: number;\n /** Items for which the field is expected (all items, except resolution = terminal only). */\n applicable: number;\n /** present/applicable * 100, rounded to one decimal; 100 when applicable is 0. */\n percent: number;\n}\n\n/**\n * Documents the metadata coverage report payload exchanged by command, SDK, and package integrations.\n */\nexport interface MetadataCoverageReport {\n overall: Record<CoverageField, FieldCoverage>;\n by_type: Record<string, Record<CoverageField, FieldCoverage>>;\n}\n\nfunction isFieldPresent(item: CoverageItem, field: CoverageField): boolean {\n switch (field) {\n case \"acceptance_criteria\":\n return !isAcMissing(item);\n case \"estimated_minutes\":\n return !isEstimateMissing(item);\n case \"resolution\":\n return toNonEmptyStringOrUndefined(item.resolution) !== undefined;\n case \"tags\":\n return Array.isArray(item.tags) && item.tags.length > 0;\n default:\n return toNonEmptyStringOrUndefined(item.parent) !== undefined;\n }\n}\n\n/** Whether a field applies to a given item (resolution only applies to terminal items). */\nfunction isFieldApplicable(item: CoverageItem, field: CoverageField, classifier: LifecycleClassifier): boolean {\n if (field === \"resolution\") {\n return classifier.isTerminal(item.status);\n }\n return true;\n}\n\nfunction roundPercent(present: number, applicable: number): number {\n if (applicable === 0) {\n return 100;\n }\n return Math.round((present / applicable) * 1000) / 10;\n}\n\nfunction emptyFieldCoverage(): Record<CoverageField, FieldCoverage> {\n const record = {} as Record<CoverageField, FieldCoverage>;\n for (const field of COVERAGE_FIELD_ORDER) {\n record[field] = { present: 0, applicable: 0, percent: 100 };\n }\n return record;\n}\n\nfunction accumulateCoverage(\n target: Record<CoverageField, FieldCoverage>,\n item: CoverageItem,\n classifier: LifecycleClassifier,\n): void {\n for (const field of COVERAGE_FIELD_ORDER) {\n if (!isFieldApplicable(item, field, classifier)) {\n continue;\n }\n const entry = target[field];\n entry.applicable += 1;\n if (isFieldPresent(item, field)) {\n entry.present += 1;\n }\n }\n}\n\nfunction finalizePercentages(record: Record<CoverageField, FieldCoverage>): void {\n for (const field of COVERAGE_FIELD_ORDER) {\n const entry = record[field];\n entry.percent = roundPercent(entry.present, entry.applicable);\n }\n}\n\n/**\n * Compute metadata coverage overall and per item type. For each tracked field\n * we report present/applicable counts and a rounded percentage. Resolution is\n * scoped to terminal items (its only applicable population).\n */\nexport function computeMetadataCoverage(\n items: readonly CoverageItem[],\n classifier: LifecycleClassifier,\n): MetadataCoverageReport {\n const overall = emptyFieldCoverage();\n const byType: Record<string, Record<CoverageField, FieldCoverage>> = {};\n for (const item of items) {\n accumulateCoverage(overall, item, classifier);\n const typeRecord = byType[item.type] ?? (byType[item.type] = emptyFieldCoverage());\n accumulateCoverage(typeRecord, item, classifier);\n }\n finalizePercentages(overall);\n for (const typeRecord of Object.values(byType)) {\n finalizePercentages(typeRecord);\n }\n return { overall, by_type: byType };\n}\n\n// ---------------------------------------------------------------------------\n// Grouped lifecycle breakdowns\n// ---------------------------------------------------------------------------\n\n/** Dimensions a breakdown can group by. */\nexport type GroupDimension = \"assignee\" | \"priority\" | \"tag\" | \"parent\" | \"type\" | \"status\";\n\n/** Explicit labels for empty/blank group keys, by dimension. */\nconst EMPTY_GROUP_LABELS: Record<GroupDimension, string> = {\n assignee: \"(unassigned)\",\n priority: \"(no priority)\",\n tag: \"(untagged)\",\n parent: \"(unparented)\",\n type: \"(untyped)\",\n status: \"(no status)\",\n};\n\n/** Explicit label for an empty/blank group value for a given dimension. */\nexport function emptyGroupLabel(dimension: GroupDimension): string {\n return EMPTY_GROUP_LABELS[dimension];\n}\n\n/**\n * Documents the group row payload exchanged by command, SDK, and package integrations.\n */\nexport interface GroupRow {\n /** Display label; explicit \"(unassigned)\"-style label for blank keys. */\n label: string;\n /** Stable structured key (null for the empty/blank group). */\n key: string | null;\n buckets: Record<LifecycleBucket, number>;\n total: number;\n}\n\n/**\n * Documents the grouped breakdown payload exchanged by command, SDK, and package integrations.\n */\nexport interface GroupedBreakdown {\n dimension: GroupDimension;\n rows: GroupRow[];\n /** Distinct items observed (an item can contribute to multiple tag rows). */\n total_items: number;\n}\n\n/**\n * Documents the group options payload exchanged by command, SDK, and package integrations.\n */\nexport interface GroupOptions {\n /** For dimension=\"tag\": only consider tags starting with this prefix. */\n tagPrefix?: string;\n}\n\nfunction emptyBuckets(): Record<LifecycleBucket, number> {\n return {\n open: 0,\n in_progress: 0,\n blocked: 0,\n draft: 0,\n closed: 0,\n canceled: 0,\n other: 0,\n };\n}\n\n/**\n * Resolve the group keys an item belongs to for a dimension. Most dimensions\n * yield exactly one key (possibly null for blank); tag yields one key per\n * matching tag (or [null] when none match), so an item can span multiple rows.\n */\nfunction groupKeysForItem(item: CoverageItem, dimension: GroupDimension, options: GroupOptions): (string | null)[] {\n switch (dimension) {\n case \"assignee\":\n return [toNonEmptyStringOrUndefined(item.assignee) ?? null];\n case \"parent\":\n return [toNonEmptyStringOrUndefined(item.parent) ?? null];\n case \"type\":\n return [toNonEmptyStringOrUndefined(item.type) ?? null];\n case \"status\":\n return [toNonEmptyStringOrUndefined(item.status) ?? null];\n case \"priority\":\n return [typeof item.priority === \"number\" ? `P${item.priority}` : null];\n default: {\n const prefix = options.tagPrefix?.trim();\n const tags = Array.isArray(item.tags) ? item.tags : [];\n const matching = tags.filter(\n (tag) => typeof tag === \"string\" && tag.length > 0 && (!prefix || tag.startsWith(prefix)),\n );\n return matching.length > 0 ? matching : [null];\n }\n }\n}\n\n/**\n * Group items by a dimension into lifecycle-bucketed rows. Blank keys render\n * with an explicit \"(unassigned)\"-style label. Rows are sorted by total\n * descending, then label ascending, with the empty group sorted last on ties.\n */\nexport function groupItemsByDimension(\n items: readonly CoverageItem[],\n dimension: GroupDimension,\n classifier: LifecycleClassifier,\n options: GroupOptions = {},\n): GroupedBreakdown {\n const rows = new Map<string, GroupRow>();\n let totalItems = 0;\n for (const item of items) {\n totalItems += 1;\n const bucket = classifier.classify(item.status);\n for (const key of groupKeysForItem(item, dimension, options)) {\n const mapKey = key ?? \"\u0000empty\";\n let row = rows.get(mapKey);\n if (!row) {\n row = {\n label: key ?? emptyGroupLabel(dimension),\n key,\n buckets: emptyBuckets(),\n total: 0,\n };\n rows.set(mapKey, row);\n }\n row.buckets[bucket] += 1;\n row.total += 1;\n }\n }\n const sorted = [...rows.values()].sort((left, right) => {\n if (right.total !== left.total) {\n return right.total - left.total;\n }\n // All blank-key items collapse into a single row per dimension, so at most\n // one row has key === null; it sorts last on ties.\n if (left.key === null) {\n return 1;\n }\n if (right.key === null) {\n return -1;\n }\n return left.label.localeCompare(right.label);\n });\n return { dimension, rows: sorted, total_items: totalItems };\n}\n\n/** Lifecycle-bucket distribution across all items (for stats lifecycle section). */\nexport function computeLifecycleDistribution(\n items: readonly CoverageItem[],\n classifier: LifecycleClassifier,\n): Record<LifecycleBucket, number> {\n const buckets = emptyBuckets();\n for (const item of items) {\n buckets[classifier.classify(item.status)] += 1;\n }\n return buckets;\n}\n"],"names":[],"mappings":"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","debugId":"b4e4ec6f-75b8-5083-b9b2-aab7e7028e85"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../../cli/commands/restore.ts"],
4
- "sourcesContent": ["/**\n * @module cli/commands/restore\n *\n * Implements the pm restore command surface and its agent-facing runtime behavior.\n */\nimport jsonPatch from \"fast-json-patch\";\nimport fs from \"node:fs/promises\";\nimport { pathExists, readFileIfExists, writeFileAtomic } from \"../../core/fs/fs-utils.js\";\nimport { appendHistoryEntry, createHistoryEntry } from \"../../core/history/history.js\";\nimport {\n EMPTY_REPLAY_DOCUMENT,\n normalizeReplayPatchOps,\n replayHash,\n replayToCanonicalItemDocument,\n replayToItemDocument,\n toReplayDocument,\n type ReplayDocument as CanonicalReplayDocument,\n} from \"../../core/history/replay.js\";\nimport { enforceHistoryStreamPolicyForItem } from \"../../core/history/history-stream-policy.js\";\nimport { normalizeItemId, normalizeRawItemId } from \"../../core/item/id.js\";\nimport { canonicalDocument, serializeItemDocument } from \"../../core/item/item-format.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { acquireLock } from \"../../core/lock/lock.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { nowIso } from \"../../core/shared/time.js\";\nimport {\n getActiveExtensionRegistrations,\n projectAfterCommandItemSnapshot,\n recordAfterCommandAffectedItem,\n runActiveOnWriteHooks,\n} from \"../../core/extensions/index.js\";\nimport { locateItem, readLocatedItem } from \"../../core/store/item-store.js\";\nimport { getHistoryPath, getItemPath, getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport { resolveAuthor } from \"../../core/shared/author.js\";\nimport type { HistoryEntry, HistoryPatchOp, ItemDocument, ItemMetadata } from \"../../types/index.js\";\nimport { readHistoryEntries } from \"./history.js\";\n\ninterface ResolvedRestoreTarget {\n kind: \"version\" | \"timestamp\";\n raw: string;\n historyIndex: number;\n}\n\ninterface ResolvedRestoreSubject {\n id: string;\n historyPath: string;\n located: Awaited<ReturnType<typeof locateItem>>;\n historyPolicyWarnings: string[];\n}\n\n/**\n * Documents the restore command options payload exchanged by command, SDK, and package integrations.\n */\nexport interface RestoreCommandOptions {\n author?: string;\n message?: string;\n force?: boolean;\n}\n\n/**\n * Documents the restore result payload exchanged by command, SDK, and package integrations.\n */\nexport interface RestoreResult {\n item: ItemMetadata;\n restored_from: {\n kind: \"version\" | \"timestamp\";\n target: string;\n history_index: number;\n entry_ts: string;\n entry_op: string;\n };\n changed_fields: string[];\n warnings: string[];\n}\n\nfunction ensureReplayTarget(target: string, history: HistoryEntry[]): ResolvedRestoreTarget {\n const trimmed = target.trim();\n if (!trimmed) {\n throw new PmCliError(\"Missing restore target. Use a timestamp or version number.\", EXIT_CODE.USAGE);\n }\n\n if (/^\\d+$/.test(trimmed)) {\n const version = Number(trimmed);\n if (!Number.isSafeInteger(version) || version < 1 || version > history.length) {\n throw new PmCliError(\n `Restore version must be between 1 and ${history.length} for this item.`,\n EXIT_CODE.USAGE,\n );\n }\n return {\n kind: \"version\",\n raw: trimmed,\n historyIndex: version - 1,\n };\n }\n\n const parsedTarget = Date.parse(trimmed);\n if (!Number.isFinite(parsedTarget)) {\n throw new PmCliError(\n `Invalid restore target \"${target}\". Use a positive version number or ISO timestamp.`,\n EXIT_CODE.USAGE,\n );\n }\n\n let index = -1;\n for (let i = 0; i < history.length; i += 1) {\n const entryTimestamp = Date.parse(history[i].ts);\n if (!Number.isFinite(entryTimestamp)) {\n throw new PmCliError(\n `History for this item contains invalid timestamp at entry ${i + 1}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n if (entryTimestamp <= parsedTarget) {\n index = i;\n }\n }\n\n if (index < 0) {\n throw new PmCliError(`No history entries exist at or before timestamp ${trimmed}.`, EXIT_CODE.USAGE);\n }\n\n return {\n kind: \"timestamp\",\n raw: trimmed,\n historyIndex: index,\n };\n}\n\nfunction extractPatchFailureContext(\n patch: HistoryPatchOp[],\n error: unknown,\n): { patchIndex?: number; op?: string; path?: string; from?: string; reason?: string } {\n const context: { patchIndex?: number; op?: string; path?: string; from?: string; reason?: string } = {};\n if (error instanceof Error && error.message.trim().length > 0) {\n context.reason = error.message.trim();\n }\n if (typeof error !== \"object\" || error === null) {\n return context;\n }\n const candidate = error as {\n index?: unknown;\n operation?: unknown;\n };\n /* c8 ignore start -- parser-generated patch errors may omit index metadata in current fixtures. */\n if (typeof candidate.index === \"number\" && Number.isInteger(candidate.index) && candidate.index >= 0) {\n context.patchIndex = candidate.index;\n }\n /* c8 ignore stop */\n /* c8 ignore start -- operation payload metadata is optional in upstream json-patch failures. */\n const operationRecord =\n typeof candidate.operation === \"object\" && candidate.operation !== null\n ? (candidate.operation as { op?: unknown; path?: unknown; from?: unknown })\n : null;\n /* c8 ignore stop */\n if (operationRecord && typeof operationRecord.op === \"string\") {\n context.op = operationRecord.op;\n }\n if (operationRecord && typeof operationRecord.path === \"string\") {\n context.path = operationRecord.path;\n }\n if (operationRecord && typeof operationRecord.from === \"string\") {\n context.from = operationRecord.from;\n }\n if ((context.op === undefined || context.path === undefined) && context.patchIndex !== undefined) {\n const fallback = patch[context.patchIndex];\n /* c8 ignore start -- fallback enrichment paths are only exercised by malformed patch telemetry payloads. */\n if (fallback) {\n context.op = context.op ?? fallback.op;\n context.path = context.path ?? fallback.path;\n context.from = context.from ?? fallback.from;\n }\n /* c8 ignore stop */\n }\n return context;\n}\n\nfunction applyHistoryPatch(\n current: CanonicalReplayDocument,\n patch: HistoryPatchOp[],\n entryNumber: number,\n entryOp: string,\n): CanonicalReplayDocument {\n try {\n const normalizedPatch = normalizeReplayPatchOps(patch);\n const applied = jsonPatch.applyPatch(\n structuredClone(current),\n normalizedPatch as jsonPatch.Operation[],\n true,\n false,\n ).newDocument as unknown;\n if (\n typeof applied !== \"object\" ||\n applied === null ||\n !(\"metadata\" in applied) ||\n !(\"body\" in applied) ||\n typeof (applied as { body: unknown }).body !== \"string\" ||\n typeof (applied as { metadata: unknown }).metadata !== \"object\" ||\n (applied as { metadata: unknown }).metadata === null\n ) {\n throw new PmCliError(\n `History replay produced an invalid document shape at entry ${entryNumber}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n const replay = applied as { metadata: Record<string, unknown>; body: string };\n return {\n metadata: replay.metadata,\n body: replay.body,\n };\n } catch (error: unknown) {\n if (error instanceof PmCliError) {\n throw error;\n }\n const failureContext = extractPatchFailureContext(patch, error);\n const contextTokens = [\n `history_op=${entryOp}`,\n /* c8 ignore next -- contextual fields are best-effort and may be absent depending on patch failure shape. */\n failureContext.patchIndex !== undefined ? `patch_index=${failureContext.patchIndex}` : null,\n /* c8 ignore next -- contextual fields are best-effort and may be absent depending on patch failure shape. */\n failureContext.op ? `op=${failureContext.op}` : null,\n /* c8 ignore next -- contextual fields are best-effort and may be absent depending on patch failure shape. */\n failureContext.path ? `path=${failureContext.path}` : null,\n /* c8 ignore next -- contextual fields are best-effort and may be absent depending on patch failure shape. */\n failureContext.from ? `from=${failureContext.from}` : null,\n ].filter((token): token is string => token !== null);\n /* c8 ignore start -- jsonPatch/structuredClone/normalizeReplayPatchOps always throw Error instances with non-empty messages here, so extractPatchFailureContext always sets reason; the empty-suffix fallback is unreachable through applyHistoryPatch. */\n const reasonSuffix = failureContext.reason ? ` ${failureContext.reason}` : \"\";\n /* c8 ignore stop */\n throw new PmCliError(\n `Failed to apply history patch at entry ${entryNumber} (${contextTokens.join(\", \")}).${reasonSuffix}`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n}\n\nfunction replayToTarget(history: HistoryEntry[], targetIndex: number): CanonicalReplayDocument {\n let document: CanonicalReplayDocument = structuredClone(EMPTY_REPLAY_DOCUMENT);\n\n for (let i = 0; i <= targetIndex; i += 1) {\n const entry = history[i];\n const beforeHash = replayHash(document);\n if (beforeHash !== entry.before_hash) {\n throw new PmCliError(\n `History hash mismatch before replay at entry ${i + 1}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n\n document = applyHistoryPatch(document, entry.patch, i + 1, entry.op);\n\n const afterHash = replayHash(document);\n if (afterHash !== entry.after_hash) {\n throw new PmCliError(\n `History hash mismatch after replay at entry ${i + 1}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n }\n\n return document;\n}\n\nfunction ensureMaterializedRestoreTarget(\n replayDocument: CanonicalReplayDocument,\n target: ResolvedRestoreTarget,\n): CanonicalReplayDocument {\n if (Object.keys(replayDocument.metadata).length > 0) {\n return replayDocument;\n }\n throw new PmCliError(\n `Restore target ${target.raw} resolves to a deleted state; choose a version or timestamp where the item exists.`,\n EXIT_CODE.USAGE,\n );\n}\n\nfunction replayCurrentDocument(history: HistoryEntry[]): ItemDocument {\n const currentReplay = replayToTarget(history, history.length - 1);\n if (Object.keys(currentReplay.metadata).length === 0) {\n return {\n metadata: {} as ItemMetadata,\n body: currentReplay.body,\n };\n }\n return canonicalDocument(replayToItemDocument(currentReplay));\n}\n\nasync function resolveRestoreSubject(\n pmRoot: string,\n id: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n typeToFolder: Record<string, string>,\n): Promise<ResolvedRestoreSubject> {\n const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeToFolder);\n if (located) {\n const historyPath = getHistoryPath(pmRoot, located.id);\n const historyPolicy = await enforceHistoryStreamPolicyForItem({\n pmRoot,\n settings,\n itemId: located.id,\n commandLabel: \"restore\",\n });\n return {\n id: located.id,\n historyPath,\n located,\n historyPolicyWarnings: historyPolicy.warnings,\n };\n }\n\n const normalizedId = normalizeItemId(id, settings.id_prefix);\n const rawNormalizedId = normalizeRawItemId(id);\n /* c8 ignore start -- raw-id fallback is covered by normalize-item-id utility tests. */\n const candidateIds = normalizedId === rawNormalizedId ? [normalizedId] : [normalizedId, rawNormalizedId];\n /* c8 ignore stop */\n for (const candidateId of candidateIds) {\n const historyPath = getHistoryPath(pmRoot, candidateId);\n if (await pathExists(historyPath)) {\n return {\n id: candidateId,\n historyPath,\n located: null,\n historyPolicyWarnings: [],\n };\n }\n }\n\n throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);\n}\n\nfunction changedFields(beforeDocument: ItemDocument, afterDocument: ItemDocument): string[] {\n const beforeReplay = toReplayDocument(beforeDocument);\n const afterReplay = toReplayDocument(afterDocument);\n const patch = jsonPatch.compare(beforeReplay, afterReplay) as HistoryPatchOp[];\n const fields = new Set<string>();\n\n for (const op of patch) {\n if (op.path === \"/body\" || op.path.startsWith(\"/body/\")) {\n fields.add(\"body\");\n continue;\n }\n const segment = op.path.replace(/^\\/(?:metadata|front_matter)\\/?/, \"\").split(\"/\")[0];\n fields.add(segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"));\n }\n\n return Array.from(fields).sort((a, b) => a.localeCompare(b));\n}\n\n/**\n * Implements run restore for the public runtime surface of this module.\n */\nexport async function runRestore(\n id: string,\n target: string,\n options: RestoreCommandOptions,\n global: GlobalOptions,\n): Promise<RestoreResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const subject = await resolveRestoreSubject(pmRoot, id, settings, typeRegistry.type_to_folder);\n const resolvedId = subject.id;\n const historyRawBeforeLock = await readFileIfExists(subject.historyPath);\n const history = await readHistoryEntries(subject.historyPath, resolvedId);\n if (history.length === 0) {\n throw new PmCliError(`No history exists for ${resolvedId}; restore is unavailable.`, EXIT_CODE.NOT_FOUND);\n }\n\n const resolvedTarget = ensureReplayTarget(target, history);\n const replayDocument = ensureMaterializedRestoreTarget(replayToTarget(history, resolvedTarget.historyIndex), resolvedTarget);\n const restoredDocument = replayToCanonicalItemDocument(replayDocument, { schema: settings.schema });\n\n if (restoredDocument.metadata.id !== resolvedId) {\n throw new PmCliError(\n `Restore target resolved to item ${restoredDocument.metadata.id}, expected ${resolvedId}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n const loadedItemBeforeLock = subject.located ? await readLocatedItem(subject.located, { schema: settings.schema }) : null;\n const currentItemRawBeforeLock = loadedItemBeforeLock?.raw ?? null;\n\n const author = resolveAuthor(options.author, settings.author_default);\n const releaseLock = await acquireLock(\n pmRoot,\n resolvedId,\n settings.locks.ttl_seconds,\n author,\n Boolean(options.force),\n settings.governance.force_required_for_stale_lock,\n );\n\n try {\n const historyRawUnderLock = await readFileIfExists(subject.historyPath);\n if (historyRawUnderLock !== historyRawBeforeLock) {\n throw new PmCliError(\n `History for ${resolvedId} changed while waiting for lock; retry restore.`,\n EXIT_CODE.CONFLICT,\n );\n }\n const locatedUnderLock = await locateItem(\n pmRoot,\n resolvedId,\n settings.id_prefix,\n settings.item_format,\n typeRegistry.type_to_folder,\n );\n const loadedItemUnderLock = locatedUnderLock ? await readLocatedItem(locatedUnderLock, { schema: settings.schema }) : null;\n if ((loadedItemUnderLock?.raw ?? null) !== currentItemRawBeforeLock) {\n throw new PmCliError(`Item ${resolvedId} changed while waiting for lock; retry restore.`, EXIT_CODE.CONFLICT);\n }\n\n const existingItemPath = locatedUnderLock?.itemPath ?? null;\n const itemFormat = \"toon\";\n let resolvedCurrentDocument: ItemDocument;\n let resolvedOriginalRaw: string | null = null;\n if (loadedItemUnderLock) {\n resolvedCurrentDocument = loadedItemUnderLock.document;\n resolvedOriginalRaw = loadedItemUnderLock.raw;\n } else {\n resolvedCurrentDocument = replayCurrentDocument(history);\n }\n const assigned = resolvedCurrentDocument.metadata.assignee?.trim();\n const ownershipWarnings: string[] = [];\n const hasOwnershipConflict = assigned && assigned !== author && !options.force;\n if (hasOwnershipConflict) {\n if (settings.governance.ownership_enforcement === \"strict\") {\n throw new PmCliError(\n `Item ${resolvedId} is assigned to ${assigned}. Use --force to override.`,\n EXIT_CODE.CONFLICT,\n );\n }\n if (settings.governance.ownership_enforcement === \"warn\") {\n ownershipWarnings.push(`ownership_warning:assignee_conflict:${resolvedId}:${assigned}`);\n }\n }\n\n const serializedRestore = serializeItemDocument(restoredDocument, { format: itemFormat, schema: settings.schema });\n /* c8 ignore next -- restored item path typing is exercised in restore integration workflows. */\n const restoredItemPath = getItemPath(\n pmRoot,\n restoredDocument.metadata.type,\n resolvedId,\n itemFormat,\n typeRegistry.type_to_folder,\n );\n await writeFileAtomic(restoredItemPath, serializedRestore);\n if (existingItemPath && restoredItemPath !== existingItemPath) {\n await fs.rm(existingItemPath);\n }\n\n const historyEntry = createHistoryEntry({\n nowIso: nowIso(),\n author,\n op: \"restore\",\n before: resolvedCurrentDocument,\n after: restoredDocument,\n message: options.message,\n });\n\n try {\n await appendHistoryEntry(subject.historyPath, historyEntry);\n } catch (error: unknown) {\n if (existingItemPath && resolvedOriginalRaw !== null && restoredItemPath !== existingItemPath) {\n await writeFileAtomic(existingItemPath, resolvedOriginalRaw);\n await fs.rm(restoredItemPath, { force: true });\n } else if (existingItemPath && resolvedOriginalRaw !== null) {\n await writeFileAtomic(existingItemPath, resolvedOriginalRaw);\n } else {\n await fs.rm(restoredItemPath, { force: true });\n }\n throw error;\n }\n const restoreChangedFields = changedFields(resolvedCurrentDocument, restoredDocument);\n const hookWarnings = [\n ...(await runActiveOnWriteHooks({\n path: restoredItemPath,\n scope: \"project\",\n op: \"restore\",\n item_id: restoredDocument.metadata.id,\n item_type: restoredDocument.metadata.type,\n before: resolvedCurrentDocument,\n after: restoredDocument,\n changed_fields: [\"restored\"],\n })),\n ...(await runActiveOnWriteHooks({\n path: subject.historyPath,\n scope: \"project\",\n op: \"restore:history\",\n item_id: restoredDocument.metadata.id,\n item_type: restoredDocument.metadata.type,\n before: resolvedCurrentDocument,\n after: restoredDocument,\n changed_fields: [\"restored\"],\n })),\n ];\n recordAfterCommandAffectedItem({\n id: restoredDocument.metadata.id,\n op: \"restore\",\n item_type: restoredDocument.metadata.type,\n previous_status: resolvedCurrentDocument.metadata.status,\n status: restoredDocument.metadata.status,\n previous: projectAfterCommandItemSnapshot(resolvedCurrentDocument.metadata, restoreChangedFields),\n current: projectAfterCommandItemSnapshot(restoredDocument.metadata, restoreChangedFields),\n changed_fields: restoreChangedFields,\n });\n\n const targetEntry = history[resolvedTarget.historyIndex];\n return {\n item: restoredDocument.metadata,\n restored_from: {\n kind: resolvedTarget.kind,\n target: resolvedTarget.raw,\n history_index: resolvedTarget.historyIndex + 1,\n entry_ts: targetEntry.ts,\n entry_op: targetEntry.op,\n },\n changed_fields: restoreChangedFields,\n warnings: [...subject.historyPolicyWarnings, ...ownershipWarnings, ...hookWarnings],\n };\n } finally {\n await releaseLock();\n }\n}\n\nexport const _testOnlyRestoreCommand = {\n applyHistoryPatch,\n changedFields,\n ensureMaterializedRestoreTarget,\n ensureReplayTarget,\n extractPatchFailureContext,\n replayCurrentDocument,\n replayToTarget,\n resolveRestoreSubject,\n};\n"],
5
- "mappings": "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",
6
- "names": ["global"]
7
- }