@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 +0,0 @@
1
- {"version":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"],"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"],"names":["kind","versionSeparator"],"mappings":"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","debugId":"423439fe-45c5-53c3-8269-8b25cd07afff"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../../../core/extensions/item-fields.ts","../../../../../../../../core/item/item-record.ts","../../../../../../../../core/history/history.ts","../../../../../../../../core/history/history-stream-policy.ts","../../../../../../../../core/lock/lock.ts","../../../../../../../../core/item/id.ts","../../../../../../../../core/store/front-matter-cache.ts","../../../../../../../../core/store/item-store.ts"],"sourcesContent":["/**\n * @module core/extensions/item-fields\n *\n * Implements extension runtime contracts and governance for Item Fields.\n */\nimport type { ExtensionRegistrationRegistry } from \"./loader.js\";\nimport { normalizeItemFieldType, type KnownItemFieldType } from \"./item-field-types.js\";\nimport { EXIT_CODE, FRONT_MATTER_KEY_ORDER } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\n\nconst RESERVED_ITEM_FIELD_NAMES = new Set(FRONT_MATTER_KEY_ORDER);\n\nfunction normalizeFieldName(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeFieldType(value: unknown): KnownItemFieldType | null {\n if (typeof value !== \"string\") {\n return null;\n }\n return normalizeItemFieldType(value);\n}\n\nfunction cloneFieldValue<T>(value: T): T {\n try {\n return structuredClone(value);\n } catch {\n return value;\n }\n}\n\nfunction parseFieldAssignment(raw: string): { key: string; value: string } {\n const trimmed = raw.trim();\n const separatorIndex = trimmed.indexOf(\"=\");\n if (separatorIndex <= 0) {\n throw new PmCliError(`--field entries must use name=value syntax, received: ${raw}`, EXIT_CODE.USAGE);\n }\n // `separatorIndex > 0` guarantees a non-`=` first character on the already\n // trimmed string, so the trimmed key is always non-empty here.\n const key = trimmed.slice(0, separatorIndex).trim();\n const value = trimmed.slice(separatorIndex + 1);\n return { key, value };\n}\n\nfunction parseJsonFieldValue(raw: string, fieldName: string, expectedType: \"array\" | \"object\"): unknown {\n try {\n const parsed = JSON.parse(raw);\n if (expectedType === \"array\" && Array.isArray(parsed)) {\n return parsed;\n }\n if (expectedType === \"object\" && typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Fall through to the typed usage error below.\n }\n throw new PmCliError(`--field ${fieldName}=... must be valid JSON ${expectedType}`, EXIT_CODE.USAGE);\n}\n\nfunction coerceRegisteredFieldValue(fieldName: string, fieldType: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\", raw: string): unknown {\n if (fieldType === \"string\") {\n return raw;\n }\n if (fieldType === \"number\") {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n throw new PmCliError(`--field ${fieldName}=... must be a number`, EXIT_CODE.USAGE);\n }\n const parsed = Number(trimmed);\n if (!Number.isFinite(parsed)) {\n throw new PmCliError(`--field ${fieldName}=... must be a number`, EXIT_CODE.USAGE);\n }\n return parsed;\n }\n if (fieldType === \"boolean\") {\n const normalized = raw.trim().toLowerCase();\n if (normalized === \"true\" || normalized === \"1\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"false\" || normalized === \"0\" || normalized === \"no\") {\n return false;\n }\n throw new PmCliError(`--field ${fieldName}=... must be one of true|false|1|0|yes|no`, EXIT_CODE.USAGE);\n }\n return parseJsonFieldValue(raw, fieldName, fieldType);\n}\n\nfunction collectRegisteredFieldDefinitions(\n registrations: ExtensionRegistrationRegistry | null,\n): Map<string, { name: string; type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\" }> {\n const definitions = new Map<string, { name: string; type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\" }>();\n if (!registrations) {\n return definitions;\n }\n for (const registration of registrations.item_fields) {\n for (const definition of registration.fields) {\n const fieldName = normalizeFieldName(definition.name);\n const fieldType = normalizeFieldType(definition.type);\n if (!fieldName || !fieldType) {\n continue;\n }\n const existing = definitions.get(fieldName);\n if (existing && existing.type !== fieldType) {\n throw new PmCliError(\n `Extension item field \"${fieldName}\" is declared with conflicting types: ${existing.type}, ${fieldType}`,\n EXIT_CODE.USAGE,\n {\n code: \"extension_item_field_type_conflict\",\n nextSteps: [\"Make every active extension declaration for this field use the same type.\"],\n },\n );\n }\n definitions.set(fieldName, { name: fieldName, type: fieldType });\n }\n }\n return definitions;\n}\n\nfunction assertNotReservedItemFieldName(fieldName: string): void {\n if (!RESERVED_ITEM_FIELD_NAMES.has(fieldName)) {\n return;\n }\n throw new PmCliError(`Extension item field \"${fieldName}\" collides with reserved item metadata`, EXIT_CODE.USAGE, {\n code: \"extension_item_field_reserved\",\n nextSteps: [\"Rename the extension item field, preferably with an extension-specific prefix.\"],\n });\n}\n\n/**\n * Implements collect registered item field names for the public runtime surface of this module.\n */\nexport function collectRegisteredItemFieldNames(registrations: ExtensionRegistrationRegistry | null): string[] {\n return [...collectRegisteredFieldDefinitions(registrations).keys()].sort((left, right) => left.localeCompare(right));\n}\n\n/**\n * Implements parse registered item field assignments for the public runtime surface of this module.\n */\nexport function parseRegisteredItemFieldAssignments(\n rawFields: string[] | undefined,\n registrations: ExtensionRegistrationRegistry | null,\n): Record<string, unknown> {\n if (!rawFields || rawFields.length === 0) {\n return {};\n }\n const definitions = collectRegisteredFieldDefinitions(registrations);\n const values: Record<string, unknown> = {};\n for (const raw of rawFields) {\n const { key, value } = parseFieldAssignment(raw);\n const definition = definitions.get(key);\n if (!definition) {\n const known = [...definitions.keys()].sort((left, right) => left.localeCompare(right));\n throw new PmCliError(`--field ${key} is not declared by an active extension item-field registration`, EXIT_CODE.USAGE, {\n code: \"extension_item_field_unknown\",\n recovery: { provided_fields: known },\n nextSteps: known.length > 0\n ? [`Use one of the declared fields: ${known.join(\", \")}`]\n : [\"Activate an extension that calls registerItemFields before setting extension fields.\"],\n });\n }\n assertNotReservedItemFieldName(definition.name);\n values[definition.name] = coerceRegisteredFieldValue(definition.name, definition.type, value);\n }\n return values;\n}\n\nfunction isValidFieldType(value: unknown, expectedType: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\"): boolean {\n if (expectedType === \"string\") {\n return typeof value === \"string\";\n }\n if (expectedType === \"number\") {\n return typeof value === \"number\" && Number.isFinite(value);\n }\n if (expectedType === \"boolean\") {\n return typeof value === \"boolean\";\n }\n if (expectedType === \"array\") {\n return Array.isArray(value);\n }\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isAllowedFieldValue(value: unknown, allowed: unknown[] | undefined): boolean {\n if (!allowed || allowed.length === 0) {\n return true;\n }\n return allowed.some((candidate) => Object.is(candidate, value));\n}\n\n/**\n * Implements apply registered item field defaults and validation for the public runtime surface of this module.\n */\nexport function applyRegisteredItemFieldDefaultsAndValidation(\n frontMatter: Record<string, unknown>,\n registrations: ExtensionRegistrationRegistry | null,\n options: { skipDefaultFields?: ReadonlySet<string> } = {},\n): void {\n if (!registrations) {\n return;\n }\n collectRegisteredFieldDefinitions(registrations);\n for (const registration of registrations.item_fields) {\n for (const definition of registration.fields) {\n const fieldName = normalizeFieldName(definition.name);\n if (!fieldName) {\n continue;\n }\n assertNotReservedItemFieldName(fieldName);\n if (\n !(fieldName in frontMatter) &&\n !options.skipDefaultFields?.has(fieldName) &&\n Object.prototype.hasOwnProperty.call(definition, \"default\")\n ) {\n frontMatter[fieldName] = cloneFieldValue(definition.default);\n }\n\n const currentValue = frontMatter[fieldName];\n if (currentValue === undefined) {\n continue;\n }\n const expectedType = normalizeFieldType(definition.type);\n if (expectedType && !isValidFieldType(currentValue, expectedType)) {\n throw new TypeError(`Item field \"${fieldName}\" must be of type ${expectedType}`);\n }\n\n const allowedValues = Array.isArray(definition.values) ? definition.values : undefined;\n if (!isAllowedFieldValue(currentValue, allowedValues)) {\n throw new TypeError(`Item field \"${fieldName}\" must match one of the configured allowed values`);\n }\n }\n }\n}\n","/**\n * @module core/item/item-record\n *\n * Defines item parsing, formatting, and lifecycle helpers for Item Record.\n */\nimport type { ItemMetadata } from \"../../types/index.js\";\n\n/**\n * Bridge a typed item record into the generic `Record<string, unknown>` shape\n * consumed by formatters, field projections, history canonicalization, and\n * JSON output paths.\n *\n * `ItemMetadata` carries an index signature, but the structural mismatch on its\n * concretely-typed fields means TypeScript still requires a double cast to widen\n * it. Centralizing that `as unknown as Record<string, unknown>` widening here\n * gives the type bridge a single, named, documented home instead of scattering\n * the cast across command and core modules.\n *\n * This is a compile-time-only widening: the returned value is the very same\n * object reference, with no runtime transformation. (It is intentionally\n * distinct from the runtime `asRecord*` guards in `core/shared/primitives.ts`,\n * which validate `typeof` at runtime.) `ItemFrontMatter` is an alias of\n * `ItemMetadata`, so front-matter values are accepted as-is.\n */\nexport function toItemRecord(item: ItemMetadata): Record<string, unknown> {\n return item as unknown as Record<string, unknown>;\n}\n","/**\n * @module core/history/history\n *\n * Implements append-only history and replay behavior for History.\n */\nimport jsonPatch from \"fast-json-patch\";\nimport { FRONT_MATTER_KEY_ORDER } from \"../shared/constants.js\";\nimport { runActiveServiceOverride } from \"../extensions/index.js\";\nimport { appendLineAtomic } from \"../fs/fs-utils.js\";\nimport { canonicalDocument } from \"../item/item-format.js\";\nimport { toItemRecord } from \"../item/item-record.js\";\nimport { orderObject, sha256Hex, stableStringify } from \"../shared/serialization.js\";\nimport { nowIso } from \"../shared/time.js\";\nimport type { HistoryEntry, HistoryPatchOp, ItemDocument } from \"../../types/index.js\";\n\nconst EMPTY_LEGACY_HASH_DOCUMENT = {\n front_matter: {},\n body: \"\",\n};\n\nfunction decodeJsonPointer(path: string): string[] {\n if (!path || path === \"/\") {\n return [];\n }\n if (!path.startsWith(\"/\")) {\n return [];\n }\n return path\n .slice(1)\n .split(\"/\")\n .map((segment) => segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"));\n}\n\nfunction isDefinedPointerPath(document: unknown, path: string): boolean {\n const segments = decodeJsonPointer(path);\n if (segments.length === 0) {\n return true;\n }\n let cursor: unknown = document;\n for (const segment of segments) {\n if (Array.isArray(cursor)) {\n if (segment === \"-\" || !/^(0|[1-9]\\d*)$/.test(segment)) {\n return false;\n }\n const index = Number(segment);\n if (!Number.isInteger(index) || index < 0 || index >= cursor.length) {\n return false;\n }\n const next = cursor[index];\n if (next === undefined) {\n return false;\n }\n cursor = next;\n continue;\n }\n if (typeof cursor !== \"object\" || cursor === null) {\n return false;\n }\n if (!Object.prototype.hasOwnProperty.call(cursor, segment)) {\n return false;\n }\n const next = (cursor as Record<string, unknown>)[segment];\n if (next === undefined) {\n return false;\n }\n cursor = next;\n }\n return true;\n}\n\nfunction normalizeHistoryPatchOps(\n beforeDocument: { metadata: Record<string, unknown>; body: string },\n patch: HistoryPatchOp[],\n): HistoryPatchOp[] {\n const normalized: HistoryPatchOp[] = [];\n let replayCursor: unknown = structuredClone(beforeDocument);\n for (const operation of patch) {\n const normalizedOperation =\n operation.op === \"replace\" && !isDefinedPointerPath(replayCursor, operation.path)\n ? ({ ...operation, op: \"add\" } as HistoryPatchOp)\n : operation;\n normalized.push(normalizedOperation);\n replayCursor = jsonPatch.applyPatch(\n replayCursor,\n [normalizedOperation as jsonPatch.Operation],\n true,\n true,\n ).newDocument as unknown;\n }\n return normalized;\n}\n\nfunction canonicalHashDocument(document: ItemDocument): { front_matter: Record<string, unknown>; body: string } {\n const hasMetadata = document.metadata && Object.keys(document.metadata).length > 0;\n if (!hasMetadata) {\n return {\n front_matter: {},\n body: document.body ?? \"\",\n };\n }\n const canonical = canonicalDocument(document);\n const orderedFrontMatter = orderObject(toItemRecord(canonical.metadata), FRONT_MATTER_KEY_ORDER);\n return {\n front_matter: orderedFrontMatter,\n body: canonical.body,\n };\n}\n\nfunction canonicalPatchDocument(document: ItemDocument): { metadata: Record<string, unknown>; body: string } {\n const hasMetadata = document.metadata && Object.keys(document.metadata).length > 0;\n if (!hasMetadata) {\n return {\n metadata: {},\n body: document.body ?? \"\",\n };\n }\n const canonical = canonicalDocument(document);\n const orderedMetadata = orderObject(toItemRecord(canonical.metadata), FRONT_MATTER_KEY_ORDER);\n return {\n metadata: orderedMetadata,\n body: canonical.body,\n };\n}\n\n/**\n * Implements hash document for the public runtime surface of this module.\n */\nexport function hashDocument(document: ItemDocument): string {\n return sha256Hex(stableStringify(canonicalHashDocument(document)));\n}\n\n/**\n * Implements hash empty document for the public runtime surface of this module.\n */\nexport function hashEmptyDocument(): string {\n return sha256Hex(stableStringify(EMPTY_LEGACY_HASH_DOCUMENT));\n}\n\n/**\n * Implements create history entry for the public runtime surface of this module.\n */\nexport function createHistoryEntry(params: {\n nowIso: string;\n author: string;\n op: string;\n before: ItemDocument;\n after: ItemDocument;\n message?: string;\n}): HistoryEntry {\n const beforeHashCanonical = canonicalHashDocument(params.before);\n const afterHashCanonical = canonicalHashDocument(params.after);\n const beforePatchCanonical = canonicalPatchDocument(params.before);\n const afterPatchCanonical = canonicalPatchDocument(params.after);\n const rawPatch = jsonPatch.compare(beforePatchCanonical, afterPatchCanonical) as HistoryPatchOp[];\n const patch = normalizeHistoryPatchOps(beforePatchCanonical, rawPatch);\n\n return {\n ts: params.nowIso,\n author: params.author,\n op: params.op,\n patch,\n before_hash: sha256Hex(stableStringify(beforeHashCanonical)),\n after_hash: sha256Hex(stableStringify(afterHashCanonical)),\n message: params.message === undefined ? undefined : params.message,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction fallbackHistoryTimestamp(entry: Pick<HistoryEntry, \"ts\">): string {\n const ts = entry.ts.trim();\n return ts.length > 0 ? ts : nowIso();\n}\n\nfunction withHistoryTimestamp(value: Record<string, unknown>, fallbackTs: string): Record<string, unknown> {\n const ts = value.ts;\n if (typeof ts === \"string\" && ts.trim().length > 0) {\n return value;\n }\n return { ...value, ts: fallbackTs };\n}\n\nfunction serializeHistoryLine(value: unknown, fallbackEntry: Pick<HistoryEntry, \"ts\">): string {\n const fallbackTs = fallbackHistoryTimestamp(fallbackEntry);\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (isRecord(parsed)) {\n return JSON.stringify(withHistoryTimestamp(parsed, fallbackTs));\n }\n } catch {\n // Non-JSON extension lines are preserved for compatibility.\n }\n return value;\n }\n if (isRecord(value)) {\n return JSON.stringify(withHistoryTimestamp(value, fallbackTs));\n }\n return JSON.stringify(value);\n}\n\n/**\n * Implements append history entry for the public runtime surface of this module.\n */\nexport async function appendHistoryEntry(historyPath: string, entry: HistoryEntry): Promise<void> {\n const override = await runActiveServiceOverride(\"history_append\", {\n history_path: historyPath,\n entry,\n });\n if (override.handled) {\n if (override.result === false) {\n return;\n }\n if (typeof override.result === \"string\") {\n await appendLineAtomic(historyPath, serializeHistoryLine(override.result, entry));\n return;\n }\n if (typeof override.result === \"object\" && override.result !== null) {\n const record = override.result as {\n history_path?: unknown;\n entry?: unknown;\n line?: unknown;\n skip?: unknown;\n };\n if (record.skip === true) {\n return;\n }\n const nextHistoryPath = typeof record.history_path === \"string\" ? record.history_path : historyPath;\n if (typeof record.line === \"string\") {\n await appendLineAtomic(nextHistoryPath, serializeHistoryLine(record.line, entry));\n return;\n }\n await appendLineAtomic(nextHistoryPath, serializeHistoryLine(record.entry ?? entry, entry));\n return;\n }\n }\n await appendLineAtomic(historyPath, serializeHistoryLine(entry, entry));\n}\n\nexport const _testOnly = {\n decodeJsonPointer,\n isDefinedPointerPath,\n};\n","/**\n * @module core/history/history-stream-policy\n *\n * Implements append-only history and replay behavior for History Stream Policy.\n */\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { runActiveOnWriteHooks } from \"../extensions/index.js\";\nimport { ensureDir, pathExists } from \"../fs/fs-utils.js\";\nimport { EXIT_CODE } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\nimport { getHistoryPath } from \"../store/paths.js\";\nimport type { PmSettings } from \"../../types/index.js\";\n\ninterface HistoryStreamPolicyParams {\n pmRoot: string;\n settings: PmSettings;\n itemId: string;\n commandLabel: string;\n}\n\ninterface HistoryStreamPolicyManyParams {\n pmRoot: string;\n settings: PmSettings;\n itemIds: string[];\n commandLabel: string;\n}\n\n/**\n * Documents the history stream policy result payload exchanged by command, SDK, and package integrations.\n */\nexport interface HistoryStreamPolicyResult {\n auto_created_ids: string[];\n warnings: string[];\n}\n\nfunction toSortedUniqueItemIds(itemIds: string[]): string[] {\n return [...new Set(itemIds.filter((value) => value.trim().length > 0))].sort((left, right) => left.localeCompare(right));\n}\n\nfunction strictMissingStreamError(itemId: string, commandLabel: string): PmCliError {\n return new PmCliError(\n `Missing history stream for ${itemId}. ${commandLabel} requires history streams when settings.history.missing_stream is strict_error.`,\n EXIT_CODE.NOT_FOUND,\n );\n}\n\nasync function createStream(historyPath: string, commandLabel: string): Promise<string[]> {\n await ensureDir(path.dirname(historyPath));\n const handle = await fs.open(historyPath, \"a\");\n await handle.close();\n return runActiveOnWriteHooks({\n path: historyPath,\n scope: \"project\",\n op: `${commandLabel}:history:auto_create`,\n });\n}\n\n/**\n * Implements enforce history stream policy for item for the public runtime surface of this module.\n */\nexport async function enforceHistoryStreamPolicyForItem(params: HistoryStreamPolicyParams): Promise<HistoryStreamPolicyResult> {\n return enforceHistoryStreamPolicyForItems({\n pmRoot: params.pmRoot,\n settings: params.settings,\n itemIds: [params.itemId],\n commandLabel: params.commandLabel,\n });\n}\n\n/**\n * Implements enforce history stream policy for items for the public runtime surface of this module.\n */\nexport async function enforceHistoryStreamPolicyForItems(\n params: HistoryStreamPolicyManyParams,\n): Promise<HistoryStreamPolicyResult> {\n const ids = toSortedUniqueItemIds(params.itemIds);\n const autoCreated: string[] = [];\n const warnings: string[] = [];\n\n for (const itemId of ids) {\n const historyPath = getHistoryPath(params.pmRoot, itemId);\n if (await pathExists(historyPath)) {\n continue;\n }\n if (params.settings.history.missing_stream === \"strict_error\") {\n throw strictMissingStreamError(itemId, params.commandLabel);\n }\n warnings.push(...(await createStream(historyPath, params.commandLabel)));\n warnings.push(`history_stream_auto_created:${itemId}`);\n autoCreated.push(itemId);\n }\n\n return {\n auto_created_ids: autoCreated,\n warnings,\n };\n}\n","/**\n * @module core/lock/lock\n *\n * Coordinates tracker lock ownership and cleanup for Lock.\n */\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { runActiveOnReadHooks, runActiveOnWriteHooks, runActiveServiceOverride } from \"../extensions/index.js\";\nimport { EXIT_CODE } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\nimport { toErrorMessage } from \"../shared/primitives.js\";\nimport { getLockPath } from \"../store/paths.js\";\nimport { nowIso } from \"../shared/time.js\";\n\ninterface LockInfo {\n id: string;\n pid: number;\n owner: string;\n created_at: string;\n ttl_seconds: number;\n}\n\ntype LockWriteOp = \"lock:create\" | \"lock:release\" | \"lock:stale_remove\";\n\ninterface LockReadResult {\n info: LockInfo | null;\n warnings: string[];\n}\n\nfunction parseLockInfo(raw: string): LockReadResult {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n return {\n info: null,\n warnings: [\"lock_info_invalid_json\"],\n };\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n return {\n info: null,\n warnings: [\"lock_info_invalid_shape\"],\n };\n }\n const candidate = parsed as Record<string, unknown>;\n const id = candidate.id;\n const pid = candidate.pid;\n const owner = candidate.owner;\n const createdAt = candidate.created_at;\n const ttlSeconds = candidate.ttl_seconds;\n if (\n typeof id !== \"string\" ||\n typeof pid !== \"number\" ||\n !Number.isFinite(pid) ||\n typeof owner !== \"string\" ||\n typeof createdAt !== \"string\" ||\n typeof ttlSeconds !== \"number\" ||\n !Number.isFinite(ttlSeconds)\n ) {\n return {\n info: null,\n warnings: [\"lock_info_invalid_shape\"],\n };\n }\n return {\n info: {\n id,\n pid,\n owner,\n created_at: createdAt,\n ttl_seconds: ttlSeconds,\n },\n warnings: [],\n };\n}\n\nasync function readLockInfo(lockPath: string): Promise<LockReadResult> {\n try {\n const raw = await fs.readFile(lockPath, \"utf8\");\n await runActiveOnReadHooks({\n path: lockPath,\n scope: \"project\",\n });\n return parseLockInfo(raw);\n } catch (error: unknown) {\n if (isErrno(error, \"ENOENT\")) {\n return {\n info: null,\n warnings: [],\n };\n }\n return {\n info: null,\n warnings: [\"lock_info_read_failed\"],\n };\n }\n}\n\nfunction isErrno(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && (error as { code?: string }).code === code;\n}\n\nasync function emitLockWriteHook(lockPath: string, op: LockWriteOp): Promise<void> {\n await runActiveOnWriteHooks({\n path: lockPath,\n scope: \"project\",\n op,\n });\n}\n\nfunction buildLockPayload(id: string, owner: string, ttlSeconds: number): LockInfo {\n return {\n id,\n pid: process.pid,\n owner,\n created_at: nowIso(),\n ttl_seconds: ttlSeconds,\n };\n}\n\nasync function createLockFile(lockPath: string, id: string, owner: string, ttlSeconds: number): Promise<void> {\n await fs.mkdir(path.dirname(lockPath), { recursive: true });\n const handle = await fs.open(lockPath, \"wx\");\n try {\n await handle.writeFile(`${JSON.stringify(buildLockPayload(id, owner, ttlSeconds), null, 2)}\\n`, \"utf8\");\n } finally {\n await handle.close();\n }\n await emitLockWriteHook(lockPath, \"lock:create\");\n}\n\nasync function unlinkLockWithHook(lockPath: string, op: \"lock:release\" | \"lock:stale_remove\"): Promise<void> {\n try {\n await fs.unlink(lockPath);\n await emitLockWriteHook(lockPath, op);\n } catch {\n // Lock cleanup is best-effort.\n }\n}\n\nfunction isStaleLock(info: LockInfo | null, ttlSeconds: number): boolean {\n const createdAtMs = info?.created_at ? Date.parse(info.created_at) : Number.NaN;\n const ageMs = Number.isFinite(createdAtMs) ? Date.now() - createdAtMs : Number.POSITIVE_INFINITY;\n return ageMs > ttlSeconds * 1000;\n}\n\nfunction lockOwnerSuffix(info: LockInfo | null): string {\n return info?.owner ? ` (owner ${info.owner})` : \"\";\n}\n\nasync function handleExistingLock(\n lockPath: string,\n id: string,\n ttlSeconds: number,\n force: boolean,\n forceRequiredForStaleLock: boolean,\n): Promise<void> {\n const lockInfo = await readLockInfo(lockPath);\n if (!isStaleLock(lockInfo.info, ttlSeconds)) {\n throw new PmCliError(`Item ${id} is locked${lockOwnerSuffix(lockInfo.info)}`, EXIT_CODE.CONFLICT);\n }\n\n if (!force && forceRequiredForStaleLock) {\n const warningSuffix = lockInfo.warnings.length > 0 ? ` (${lockInfo.warnings.join(\",\")})` : \"\";\n throw new PmCliError(\n `Item ${id} lock is stale${warningSuffix}; rerun with --force when supported for this command`,\n EXIT_CODE.CONFLICT,\n );\n }\n\n await unlinkLockWithHook(lockPath, \"lock:stale_remove\");\n}\n\nexport const _testOnly = {\n parseLockInfo,\n readLockInfo,\n isErrno,\n buildLockPayload,\n isStaleLock,\n lockOwnerSuffix,\n};\n\n\n/**\n * Implements acquire lock for the public runtime surface of this module.\n */\nexport async function acquireLock(\n pmRoot: string,\n id: string,\n ttlSeconds: number,\n owner: string,\n force = false,\n forceRequiredForStaleLock = true,\n): Promise<() => Promise<void>> {\n const lockOverride = await runActiveServiceOverride(\"lock_acquire\", {\n pm_root: pmRoot,\n id,\n ttl_seconds: ttlSeconds,\n owner,\n force,\n force_required_for_stale_lock: forceRequiredForStaleLock,\n });\n if (lockOverride.handled) {\n const releaseFromFunction = typeof lockOverride.result === \"function\" ? lockOverride.result : null;\n const releaseFromObject =\n typeof lockOverride.result === \"object\" &&\n lockOverride.result !== null &&\n \"release\" in lockOverride.result &&\n typeof (lockOverride.result as { release?: unknown }).release === \"function\"\n ? ((lockOverride.result as { release: () => Promise<void> | void }).release as () => Promise<void> | void)\n : null;\n const release = releaseFromFunction ?? releaseFromObject;\n if (release) {\n return async () => {\n await Promise.resolve(release());\n await runActiveServiceOverride(\"lock_release\", {\n pm_root: pmRoot,\n id,\n owner,\n });\n };\n }\n }\n\n const lockPath = getLockPath(pmRoot, id);\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n try {\n await createLockFile(lockPath, id, owner, ttlSeconds);\n return async () => {\n await unlinkLockWithHook(lockPath, \"lock:release\");\n await runActiveServiceOverride(\"lock_release\", {\n pm_root: pmRoot,\n id,\n owner,\n });\n };\n } catch (error: unknown) {\n if (!isErrno(error, \"EEXIST\")) {\n throw new PmCliError(`Failed to acquire lock for ${id}: ${toErrorMessage(error)}`, EXIT_CODE.GENERIC_FAILURE);\n }\n await handleExistingLock(lockPath, id, ttlSeconds, force, forceRequiredForStaleLock);\n }\n }\n\n throw new PmCliError(`Failed to acquire lock for ${id}`, EXIT_CODE.CONFLICT);\n}\n","/**\n * @module core/item/id\n *\n * Defines item parsing, formatting, and lifecycle helpers for Id.\n */\nimport crypto from \"node:crypto\";\nimport path from \"node:path\";\nimport { TYPE_TO_FOLDER } from \"../shared/constants.js\";\nimport { pathExists } from \"../fs/fs-utils.js\";\n\n/**\n * Implements normalize prefix for the public runtime surface of this module.\n */\nexport function normalizePrefix(input: string | undefined): string {\n const normalized = (input ?? \"\").trim().toLowerCase();\n if (!normalized) return \"pm-\";\n return normalized.endsWith(\"-\") ? normalized : `${normalized}-`;\n}\n\n/**\n * Implements normalize raw item id for the public runtime surface of this module.\n */\nexport function normalizeRawItemId(input: string): string {\n let normalized = input.trim().toLowerCase();\n if (normalized.startsWith(\"#\")) {\n normalized = normalized.slice(1);\n }\n return normalized;\n}\n\n/**\n * Implements normalize item id for the public runtime surface of this module.\n */\nexport function normalizeItemId(input: string, prefix: string): string {\n const canonicalPrefix = normalizePrefix(prefix);\n const normalized = normalizeRawItemId(input);\n if (normalized.startsWith(canonicalPrefix)) {\n return normalized;\n }\n return `${canonicalPrefix}${normalized}`;\n}\n\nfunction randomToken(length: number): string {\n let token = \"\";\n for (let index = 0; index < length; index += 1) {\n token += crypto.randomInt(0, 36).toString(36);\n }\n return token;\n}\n\nasync function idExists(pmRoot: string, id: string): Promise<boolean> {\n const checks = Object.values(TYPE_TO_FOLDER).flatMap((folder) => [\n path.join(pmRoot, folder, `${id}.md`),\n path.join(pmRoot, folder, `${id}.toon`),\n ]);\n for (const target of checks) {\n if (await pathExists(target)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Implements generate item id for the public runtime surface of this module.\n */\nexport async function generateItemId(pmRoot: string, prefix: string): Promise<string> {\n let tokenLength = 4;\n let attempts = 0;\n\n while (tokenLength <= 10) {\n for (let i = 0; i < 32; i += 1) {\n const id = `${normalizePrefix(prefix)}${randomToken(tokenLength)}`;\n if (!(await idExists(pmRoot, id))) {\n return id;\n }\n attempts += 1;\n }\n tokenLength += 1;\n }\n\n throw new Error(`Unable to generate unique id after ${attempts} attempts`);\n}\n","/**\n * @module core/store/front-matter-cache\n *\n * Reads and writes tracker storage with format-aware helpers for Front Matter Cache.\n */\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { getActiveExtensionRegistrations, hasActiveOnReadHooks, runActiveOnReadHooks } from \"../extensions/index.js\";\nimport { collectRegisteredItemFieldNames } from \"../extensions/item-fields.js\";\nimport { parseItemDocument } from \"../item/item-format.js\";\nimport { writeFileAtomic } from \"../fs/fs-utils.js\";\nimport { ITEM_FILE_EXTENSIONS, getItemFormatFromPath } from \"./paths.js\";\nimport type { ItemDocument, ItemFormat, ItemMetadata, ItemType, RuntimeSchemaSettings } from \"../../types/index.js\";\n\nconst CACHE_VERSION = 6;\nconst CACHE_FILENAME = \"metadata-cache.json\";\nconst BODY_CACHE_FILENAME = \"metadata-cache-bodies.json\";\nconst COLLECTIONS_CACHE_FILENAME = \"metadata-cache-collections.json\";\n\n/**\n * Heavy \"collection\" front-matter fields. These arrays dominate the on-disk cache\n * (e.g. a single item's comment thread can be hundreds of KB) yet the hot list path\n * (`pm list`, stats, deps, activity, calendar, close) never reads them. They are\n * stored in a separate collections cache that is parsed only when a caller opts in\n * (`includeCollections`), keeping the always-loaded light cache an order of magnitude\n * smaller and its JSON.parse correspondingly cheaper.\n */\nexport const HEAVY_METADATA_KEYS = [\n \"comments\",\n \"notes\",\n \"learnings\",\n \"files\",\n \"tests\",\n \"test_runs\",\n \"docs\",\n] as const;\n\nfunction resolveActiveExtensionFieldNames(): readonly string[] {\n return collectRegisteredItemFieldNames(getActiveExtensionRegistrations());\n}\n\ninterface StatSignature {\n mtime_ms: number;\n ctime_ms: number;\n size: number;\n}\n\ninterface CachedEntry extends StatSignature {\n metadata: ItemMetadata;\n body_length: number;\n}\n\ninterface CachedBody extends StatSignature {\n body: string;\n}\n\ninterface CachedCollections extends StatSignature {\n collections: Record<string, unknown>;\n}\n\ninterface CacheEnvelope {\n version: number;\n context_fingerprint: string;\n entries: Record<string, CachedEntry>;\n}\n\ninterface BodyCacheEnvelope {\n version: number;\n context_fingerprint: string;\n bodies: Record<string, CachedBody>;\n}\n\ninterface CollectionsCacheEnvelope {\n version: number;\n context_fingerprint: string;\n collections: Record<string, CachedCollections>;\n}\n\n/**\n * Split parsed front-matter into the light scalar/small fields (everything except the\n * heavy collection arrays) and the heavy collection fields. Only keys that are actually\n * present are moved, so an item without comments stays without comments in both tiers.\n */\nfunction splitHeavyMetadata(metadata: ItemMetadata): {\n light: ItemMetadata;\n heavy: Record<string, unknown>;\n} {\n const light = { ...metadata } as Record<string, unknown>;\n const heavy: Record<string, unknown> = {};\n for (const key of HEAVY_METADATA_KEYS) {\n if (key in light) {\n heavy[key] = light[key];\n delete light[key];\n }\n }\n return { light: light as ItemMetadata, heavy };\n}\n\n/**\n * Recombine light metadata with cached heavy collection fields. Key order differs from\n * the on-disk document, but every downstream hash/serialization canonicalizes and\n * sorts keys (`stableStringify`), so the merged record is byte-identical once hashed.\n */\nfunction mergeHeavyMetadata(light: ItemMetadata, heavy: Record<string, unknown> | undefined): ItemMetadata {\n if (!heavy || Object.keys(heavy).length === 0) {\n return light;\n }\n return { ...light, ...heavy } as ItemMetadata;\n}\n\n/**\n * Documents the cached document candidate payload exchanged by command, SDK, and package integrations.\n */\nexport interface CachedDocumentCandidate {\n metadata: ItemMetadata;\n body?: string;\n item_format: ItemFormat;\n item_path: string;\n}\n\nfunction computeContextFingerprint(\n preferredFormat: ItemFormat | undefined,\n typeToFolder: Record<string, string>,\n schema: RuntimeSchemaSettings | undefined,\n extensionFieldNames: readonly string[],\n): string {\n const hash = createHash(\"sha256\");\n hash.update(`format:${preferredFormat ?? \"default\"}`);\n const sortedTypes = Object.entries(typeToFolder)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([type, folder]) => `${type}=${folder}`)\n .join(\",\");\n hash.update(`|types:${sortedTypes}`);\n if (schema) {\n hash.update(`|schema:${JSON.stringify(schema)}`);\n }\n if (extensionFieldNames.length > 0) {\n hash.update(`|extension_fields:${extensionFieldNames.join(\",\")}`);\n }\n return hash.digest(\"hex\").slice(0, 16);\n}\n\nfunction getCachePath(pmRoot: string): string {\n return path.join(pmRoot, \"runtime\", CACHE_FILENAME);\n}\n\nfunction getBodyCachePath(pmRoot: string): string {\n return path.join(pmRoot, \"runtime\", BODY_CACHE_FILENAME);\n}\n\nfunction getCollectionsCachePath(pmRoot: string): string {\n return path.join(pmRoot, \"runtime\", COLLECTIONS_CACHE_FILENAME);\n}\n\nasync function loadCache(pmRoot: string): Promise<CacheEnvelope | null> {\n try {\n const raw = await fs.readFile(getCachePath(pmRoot), \"utf8\");\n const parsed = JSON.parse(raw) as CacheEnvelope;\n if (parsed.version !== CACHE_VERSION || typeof parsed.entries !== \"object\" || parsed.entries === null) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nasync function loadBodyCache(pmRoot: string): Promise<BodyCacheEnvelope | null> {\n try {\n const raw = await fs.readFile(getBodyCachePath(pmRoot), \"utf8\");\n const parsed = JSON.parse(raw) as BodyCacheEnvelope;\n if (parsed.version !== CACHE_VERSION || typeof parsed.bodies !== \"object\" || parsed.bodies === null) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nasync function loadCollectionsCache(pmRoot: string): Promise<CollectionsCacheEnvelope | null> {\n try {\n const raw = await fs.readFile(getCollectionsCachePath(pmRoot), \"utf8\");\n const parsed = JSON.parse(raw) as CollectionsCacheEnvelope;\n if (parsed.version !== CACHE_VERSION || typeof parsed.collections !== \"object\" || parsed.collections === null) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nasync function persistCache(\n cachePath: string,\n envelope: CacheEnvelope | BodyCacheEnvelope | CollectionsCacheEnvelope,\n): Promise<void> {\n await fs.mkdir(path.dirname(cachePath), { recursive: true });\n await writeFileAtomic(cachePath, JSON.stringify(envelope));\n}\n\n/**\n * Decide whether a freshly parsed document candidate should replace the one\n * already recorded for the same item id when both an explicit-format file and a\n * fallback-format file exist (e.g. `pm-x.toon` and `pm-x.md`). An explicit\n * `preferredFormat` wins; otherwise `toon` wins over any non-toon format.\n *\n * This is a pure decision so the winner is fully deterministic regardless of the\n * order in which the concurrent per-file reads resolve — the inline call site\n * populates the map as each async read completes, so without a pure rule the\n * branch taken (and thus its coverage) would race. Keep this exported and\n * unit-tested across every format combination.\n */\nexport function shouldReplaceCachedDocumentCandidate(\n existingFormat: ItemFormat,\n candidateFormat: ItemFormat,\n preferredFormat: ItemFormat | undefined,\n): boolean {\n if (preferredFormat) {\n return candidateFormat === preferredFormat && existingFormat !== preferredFormat;\n }\n return candidateFormat === \"toon\" && existingFormat !== \"toon\";\n}\n\nfunction appendWarning(warnings: string[] | undefined, warning: string): void {\n if (warnings && !warnings.includes(warning)) {\n warnings.push(warning);\n }\n}\n\nfunction statMatches(signature: StatSignature, mtimeMs: number, ctimeMs: number, size: number): boolean {\n return signature.mtime_ms === mtimeMs && signature.ctime_ms === ctimeMs && signature.size === size;\n}\n\n/**\n * Documents the list cache options payload exchanged by command, SDK, and package integrations.\n */\nexport interface ListCacheOptions {\n /**\n * When false, item bodies are neither loaded from nor written to the separate\n * body cache. Metadata-only callers (`pm list`, stats, deps, activity, …) skip\n * the large body cache entirely; only body consumers (search/reindex) pay for it.\n */\n includeBody?: boolean;\n /**\n * When false, heavy collection fields (comments/notes/learnings/files/tests/\n * test_runs/docs) are neither loaded from nor written to the separate collections\n * cache, and are absent from the returned metadata. Light-only callers (`pm list`\n * compact, stats, deps, activity, calendar, close) skip the large collections cache\n * entirely. Defaults to true so any caller that does read those fields stays correct.\n */\n includeCollections?: boolean;\n}\n\n/**\n * List all item documents using a persistent on-disk metadata cache.\n *\n * Metadata and bodies are stored in two separate cache files so the hot path\n * (`pm list` and friends, which discard bodies) never loads or rewrites the much\n * larger body payload. Each file is rewritten only when its contents actually\n * change, and per-file onRead hooks are dispatched only when an extension\n * registers one. Only files whose mtime/ctime/size changed since the last run are\n * re-parsed.\n */\nexport async function listAllDocumentCandidatesCached(\n pmRoot: string,\n preferredFormat: ItemFormat | undefined,\n typeToFolder: Record<string, string>,\n warnings: string[] | undefined,\n schema: RuntimeSchemaSettings | undefined,\n options: ListCacheOptions = {},\n): Promise<CachedDocumentCandidate[]> {\n const includeBody = options.includeBody !== false;\n const includeCollections = options.includeCollections !== false;\n const extensionFieldNames = resolveActiveExtensionFieldNames();\n const contextFingerprint = computeContextFingerprint(preferredFormat, typeToFolder, schema, extensionFieldNames);\n\n const existingCache = await loadCache(pmRoot);\n const previousEntries: Record<string, CachedEntry> =\n existingCache && existingCache.context_fingerprint === contextFingerprint ? existingCache.entries : {};\n\n const existingBodyCache = includeBody ? await loadBodyCache(pmRoot) : null;\n const previousBodies: Record<string, CachedBody> =\n existingBodyCache && existingBodyCache.context_fingerprint === contextFingerprint ? existingBodyCache.bodies : {};\n\n const existingCollectionsCache = includeCollections ? await loadCollectionsCache(pmRoot) : null;\n const previousCollections: Record<string, CachedCollections> =\n existingCollectionsCache && existingCollectionsCache.context_fingerprint === contextFingerprint\n ? existingCollectionsCache.collections\n : {};\n\n const entries = Object.entries(typeToFolder) as Array<[ItemType, string]>;\n const dirResults = await Promise.all(\n entries.map(async ([, folder]) => {\n const dirPath = path.join(pmRoot, folder);\n try {\n const files = await fs.readdir(dirPath);\n return { folder, dirPath, files };\n } catch (error: unknown) {\n if (typeof error === \"object\" && error !== null && \"code\" in error && (error as { code?: string }).code !== \"ENOENT\") {\n appendWarning(warnings, `item_list_directory_read_failed:${folder}`);\n }\n return { folder, dirPath, files: [] as string[] };\n }\n }),\n );\n\n const dispatchReadHooks = hasActiveOnReadHooks();\n const newEntries: Record<string, CachedEntry> = {};\n const newBodies: Record<string, CachedBody> = {};\n const newCollections: Record<string, CachedCollections> = {};\n const documentsById = new Map<string, { candidate: CachedDocumentCandidate; itemFormat: ItemFormat }>();\n let metadataMiss = false;\n let bodyMiss = false;\n let collectionsMiss = false;\n\n const parseTasks: Array<Promise<void>> = [];\n\n for (const { folder, dirPath, files } of dirResults) {\n for (const file of files) {\n if (!ITEM_FILE_EXTENSIONS.some((ext) => file.toLowerCase().endsWith(ext))) {\n continue;\n }\n const filePath = path.join(dirPath, file);\n const relativePath = path.relative(pmRoot, filePath);\n\n parseTasks.push(\n (async () => {\n try {\n const stat = await fs.stat(filePath);\n const mtimeMs = stat.mtimeMs;\n const ctimeMs = stat.ctimeMs;\n const { size } = stat;\n const itemFormat = getItemFormatFromPath(filePath) as ItemFormat;\n\n // Preserve onRead hook semantics even when served from cache, but only\n // when an extension actually observes reads. Surface hook warnings so\n // read-hook failures are not silently hidden.\n if (dispatchReadHooks) {\n for (const warning of await runActiveOnReadHooks({ path: filePath, scope: \"project\" })) {\n appendWarning(warnings, warning);\n }\n }\n\n const cachedEntry = previousEntries[relativePath];\n const metadataCached = cachedEntry !== undefined && statMatches(cachedEntry, mtimeMs, ctimeMs, size);\n const cachedBody = previousBodies[relativePath];\n const bodyCached = cachedBody !== undefined && statMatches(cachedBody, mtimeMs, ctimeMs, size);\n const cachedCollections = previousCollections[relativePath];\n const collectionsCached =\n cachedCollections !== undefined && statMatches(cachedCollections, mtimeMs, ctimeMs, size);\n\n const needRead =\n !metadataCached || (includeBody && !bodyCached) || (includeCollections && !collectionsCached);\n let lightMetadata: ItemMetadata;\n let heavyMetadata: Record<string, unknown> | undefined;\n let bodyLength: number;\n let body: string | undefined;\n\n if (needRead) {\n const raw = await fs.readFile(filePath, \"utf8\");\n const parsed = parseItemDocument(raw, {\n format: itemFormat,\n schema,\n extensionFieldNames,\n onWarning: (w) => appendWarning(warnings, w),\n });\n const split = splitHeavyMetadata(parsed.metadata);\n lightMetadata = metadataCached ? cachedEntry.metadata : split.light;\n bodyLength = metadataCached ? cachedEntry.body_length : parsed.body.length;\n body = includeBody ? parsed.body : undefined;\n if (includeCollections) {\n heavyMetadata = collectionsCached ? cachedCollections.collections : split.heavy;\n }\n if (!metadataCached) {\n metadataMiss = true;\n }\n if (includeBody && !bodyCached) {\n bodyMiss = true;\n }\n if (includeCollections && !collectionsCached) {\n collectionsMiss = true;\n }\n } else {\n lightMetadata = cachedEntry.metadata;\n bodyLength = cachedEntry.body_length;\n body = includeBody ? cachedBody.body : undefined;\n heavyMetadata = includeCollections && cachedCollections ? cachedCollections.collections : undefined;\n }\n\n newEntries[relativePath] = {\n mtime_ms: mtimeMs,\n ctime_ms: ctimeMs,\n size,\n metadata: lightMetadata,\n body_length: bodyLength,\n };\n if (includeBody && body !== undefined) {\n newBodies[relativePath] = { mtime_ms: mtimeMs, ctime_ms: ctimeMs, size, body };\n }\n if (includeCollections && heavyMetadata !== undefined) {\n newCollections[relativePath] = { mtime_ms: mtimeMs, ctime_ms: ctimeMs, size, collections: heavyMetadata };\n }\n\n const metadata = includeCollections ? mergeHeavyMetadata(lightMetadata, heavyMetadata) : lightMetadata;\n const existing = documentsById.get(metadata.id);\n const candidate: CachedDocumentCandidate = {\n metadata,\n body,\n item_format: itemFormat,\n item_path: filePath,\n };\n if (!existing || shouldReplaceCachedDocumentCandidate(existing.itemFormat, itemFormat, preferredFormat)) {\n documentsById.set(metadata.id, { candidate, itemFormat });\n }\n } catch {\n appendWarning(warnings, `item_list_item_read_failed:${folder}/${file}`);\n }\n })(),\n );\n }\n }\n\n await Promise.all(parseTasks);\n\n // Rewrite a cache file only when its contents changed: any re-parsed (missing or\n // stale) entry, or a different set of keys (additions/deletions).\n const metadataDirty = metadataMiss || Object.keys(previousEntries).length !== Object.keys(newEntries).length;\n if (metadataDirty || existingCache === null || existingCache.context_fingerprint !== contextFingerprint) {\n await persistCache(getCachePath(pmRoot), {\n version: CACHE_VERSION,\n context_fingerprint: contextFingerprint,\n entries: newEntries,\n }).catch(() => {});\n }\n\n if (includeBody) {\n const bodyDirty = bodyMiss || Object.keys(previousBodies).length !== Object.keys(newBodies).length;\n if (bodyDirty || existingBodyCache === null || existingBodyCache.context_fingerprint !== contextFingerprint) {\n await persistCache(getBodyCachePath(pmRoot), {\n version: CACHE_VERSION,\n context_fingerprint: contextFingerprint,\n bodies: newBodies,\n }).catch(() => {});\n }\n }\n\n if (includeCollections) {\n const collectionsDirty =\n collectionsMiss || Object.keys(previousCollections).length !== Object.keys(newCollections).length;\n if (\n collectionsDirty ||\n existingCollectionsCache === null ||\n existingCollectionsCache.context_fingerprint !== contextFingerprint\n ) {\n await persistCache(getCollectionsCachePath(pmRoot), {\n version: CACHE_VERSION,\n context_fingerprint: contextFingerprint,\n collections: newCollections,\n }).catch(() => {});\n }\n }\n\n return [...documentsById.values()]\n .sort((left, right) => left.candidate.metadata.id.localeCompare(right.candidate.metadata.id))\n .map((entry) => entry.candidate);\n}\n\n/**\n * Implements list all documents cached for the public runtime surface of this module.\n */\nexport async function listAllDocumentsCached(\n pmRoot: string,\n preferredFormat: ItemFormat | undefined,\n typeToFolder: Record<string, string>,\n warnings: string[] | undefined,\n schema: RuntimeSchemaSettings | undefined,\n): Promise<ItemDocument[]> {\n const candidates = await listAllDocumentCandidatesCached(pmRoot, preferredFormat, typeToFolder, warnings, schema, {\n includeBody: false,\n });\n return candidates.map((candidate) => ({\n metadata: candidate.metadata,\n body: candidate.body ?? \"\",\n }));\n}\n\n/**\n * Light variant of {@link listAllDocumentsCached}: returns metadata WITHOUT the heavy\n * collection fields (comments/notes/learnings/files/tests/test_runs/docs), skipping the\n * large collections cache entirely. Only safe for callers that read just the light\n * scalar/small fields (id/title/status/type/priority/parent/tags/dates/dependencies/…).\n */\nexport async function listAllDocumentsCachedLight(\n pmRoot: string,\n preferredFormat: ItemFormat | undefined,\n typeToFolder: Record<string, string>,\n warnings: string[] | undefined,\n schema: RuntimeSchemaSettings | undefined,\n): Promise<ItemDocument[]> {\n const candidates = await listAllDocumentCandidatesCached(pmRoot, preferredFormat, typeToFolder, warnings, schema, {\n includeBody: false,\n includeCollections: false,\n });\n return candidates.map((candidate) => ({\n metadata: candidate.metadata,\n body: candidate.body ?? \"\",\n }));\n}\n","/**\n * @module core/store/item-store\n *\n * Reads and writes tracker storage with format-aware helpers for Item Store.\n */\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n getActiveExtensionRegistrations,\n projectAfterCommandItemSnapshot,\n recordAfterCommandAffectedItem,\n runActiveOnReadHooks,\n runActiveOnWriteHooks,\n runActiveServiceOverride,\n} from \"../extensions/index.js\";\nimport { collectRegisteredItemFieldNames } from \"../extensions/item-fields.js\";\nimport { EMPTY_CANONICAL_DOCUMENT, EXIT_CODE, TYPE_TO_FOLDER } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\nimport { levenshteinDistanceWithinLimit } from \"../shared/levenshtein.js\";\nimport { appendHistoryEntry, createHistoryEntry } from \"../history/history.js\";\nimport { enforceHistoryStreamPolicyForItem } from \"../history/history-stream-policy.js\";\nimport { canonicalDocument, parseItemDocument, serializeItemDocument } from \"../item/item-format.js\";\nimport { resolveItemTypeRegistry } from \"../item/type-registry.js\";\nimport { acquireLock } from \"../lock/lock.js\";\nimport { writeFileAtomic } from \"../fs/fs-utils.js\";\nimport { normalizeItemId, normalizeRawItemId } from \"../item/id.js\";\nimport { listAllDocumentCandidatesCached, listAllDocumentsCached, listAllDocumentsCachedLight } from \"./front-matter-cache.js\";\nimport { getHistoryPath, getItemFormatFromPath, getItemPath, ITEM_FILE_EXTENSIONS } from \"./paths.js\";\nimport { resolveGovernanceKnobs } from \"./settings.js\";\nimport { nowIso } from \"../shared/time.js\";\nimport type { ItemDocument, ItemFormat, ItemFrontMatter, ItemType, PmSettings, RuntimeSchemaSettings } from \"../../types/index.js\";\n\n/**\n * Documents the located item payload exchanged by command, SDK, and package integrations.\n */\nexport interface LocatedItem {\n id: string;\n type: ItemType;\n itemPath: string;\n item_format: ItemFormat;\n}\n\nasync function fileExists(targetPath: string): Promise<boolean> {\n try {\n await fs.access(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isErrno(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && (error as { code?: string }).code === code;\n}\n\nfunction appendWarning(warnings: string[] | undefined, warning: string): void {\n if (!warnings) {\n return;\n }\n if (!warnings.includes(warning)) {\n warnings.push(warning);\n }\n}\n\nfunction resolveActiveExtensionFieldNames(explicit: readonly string[] | undefined): readonly string[] {\n return explicit ?? collectRegisteredItemFieldNames(getActiveExtensionRegistrations());\n}\n\nfunction resolveItemFormatSearchOrder(preferredFormat?: ItemFormat): ItemFormat[] {\n if (preferredFormat === \"toon\") {\n return [\"toon\", \"json_markdown\"];\n }\n if (preferredFormat === \"json_markdown\") {\n return [\"json_markdown\", \"toon\"];\n }\n return [\"toon\", \"json_markdown\"];\n}\n\n/**\n * Implements locate item for the public runtime surface of this module.\n */\nexport async function locateItem(\n pmRoot: string,\n rawId: string,\n idPrefix = \"pm-\",\n preferredFormat?: ItemFormat,\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n): Promise<LocatedItem | null> {\n const normalizedId = normalizeItemId(rawId, idPrefix);\n const rawNormalizedId = normalizeRawItemId(rawId);\n const candidateIds = normalizedId === rawNormalizedId ? [normalizedId] : [normalizedId, rawNormalizedId];\n const entries = Object.entries(typeToFolder) as Array<[ItemType, string]>;\n const searchOrder = resolveItemFormatSearchOrder(preferredFormat);\n for (const candidateId of candidateIds) {\n for (const [type] of entries) {\n for (const itemFormat of searchOrder) {\n const itemPath = getItemPath(pmRoot, type, candidateId, itemFormat, typeToFolder);\n if (await fileExists(itemPath)) {\n return {\n id: candidateId,\n type,\n itemPath,\n item_format: itemFormat,\n };\n }\n }\n }\n }\n return null;\n}\n\n/**\n * Implements read located item for the public runtime surface of this module.\n */\nexport async function readLocatedItem(\n item: LocatedItem,\n options: { schema?: RuntimeSchemaSettings; extensionFieldNames?: readonly string[]; warnings?: string[] } = {},\n): Promise<{ raw: string; document: ItemDocument }> {\n const raw = await fs.readFile(item.itemPath, \"utf8\");\n await runActiveOnReadHooks({\n path: item.itemPath,\n scope: \"project\",\n });\n const document = parseItemDocument(raw, {\n format: item.item_format,\n schema: options.schema,\n extensionFieldNames: resolveActiveExtensionFieldNames(options.extensionFieldNames),\n onWarning: (warning) => appendWarning(options.warnings, warning),\n });\n return { raw, document };\n}\n\n/**\n * Implements list all front matter for the public runtime surface of this module.\n */\nexport async function listAllFrontMatter(\n pmRoot: string,\n preferredFormat?: ItemFormat,\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n warnings?: string[],\n schema?: RuntimeSchemaSettings,\n): Promise<ItemFrontMatter[]> {\n const documents = await listAllDocumentsCached(pmRoot, preferredFormat, typeToFolder, warnings, schema);\n return documents.map((document) => document.metadata);\n}\n\n/**\n * Light variant of {@link listAllFrontMatter}: returns front-matter WITHOUT the heavy\n * collection fields (comments/notes/learnings/files/tests/test_runs/docs). Skips the\n * large collections cache so the hot list path stays cheap. Only use for callers that\n * read just the light scalar/small fields — see {@link listAllDocumentsCachedLight}.\n */\nexport async function listAllFrontMatterLight(\n pmRoot: string,\n preferredFormat?: ItemFormat,\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n warnings?: string[],\n schema?: RuntimeSchemaSettings,\n): Promise<ItemFrontMatter[]> {\n const documents = await listAllDocumentsCachedLight(pmRoot, preferredFormat, typeToFolder, warnings, schema);\n return documents.map((document) => document.metadata);\n}\n\n/**\n * Implements list all front matter with body for the public runtime surface of this module.\n */\nexport async function listAllFrontMatterWithBody(\n pmRoot: string,\n preferredFormat?: ItemFormat,\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n warnings?: string[],\n schema?: RuntimeSchemaSettings,\n): Promise<Array<ItemFrontMatter & { body: string }>> {\n const candidates = await listAllDocumentCandidatesCached(\n pmRoot,\n preferredFormat,\n typeToFolder,\n warnings,\n schema,\n { includeBody: true },\n );\n return candidates.map((candidate) => ({\n ...candidate.metadata,\n // includeBody:true guarantees candidate bodies are materialized.\n body: candidate.body!,\n }));\n}\n\nasync function listKnownItemIds(\n pmRoot: string,\n typeToFolder: Record<string, string>,\n): Promise<string[]> {\n const folders = new Set(Object.values(typeToFolder));\n const allIds: string[] = [];\n await Promise.all(\n [...folders].map(async (folder) => {\n try {\n const entries = await fs.readdir(path.join(pmRoot, folder));\n for (const entry of entries) {\n for (const ext of ITEM_FILE_EXTENSIONS) {\n if (entry.toLowerCase().endsWith(ext)) {\n allIds.push(entry.slice(0, -ext.length));\n break;\n }\n }\n }\n } catch {\n // ignore missing folders\n }\n }),\n );\n return allIds;\n}\n\nasync function buildDidYouMeanSuggestions(\n pmRoot: string,\n badId: string,\n idPrefix: string,\n typeToFolder: Record<string, string>,\n): Promise<string[]> {\n const normalized = normalizeItemId(badId, idPrefix);\n const ids = await listKnownItemIds(pmRoot, typeToFolder);\n if (ids.length === 0) return [];\n const limit = Math.max(3, Math.floor(normalized.length / 2));\n const scored = ids\n .map((id) => ({ id, distance: levenshteinDistanceWithinLimit(id, normalized, limit) }))\n .filter((entry): entry is { id: string; distance: number } => entry.distance !== null)\n .sort((left, right) => left.distance - right.distance)\n .slice(0, 3)\n .map((entry) => entry.id);\n return scored;\n}\n\n/**\n * Implements build item not found error for the public runtime surface of this module.\n */\nexport async function buildItemNotFoundError(\n pmRoot: string,\n badId: string,\n idPrefix: string,\n typeToFolder: Record<string, string>,\n): Promise<PmCliError> {\n const suggestions = await buildDidYouMeanSuggestions(pmRoot, badId, idPrefix, typeToFolder);\n const nextSteps: string[] = [\"Confirm the active --path/PM_PATH scope, then retry with a valid id.\"];\n if (suggestions.length > 0) {\n nextSteps.unshift(`Did you mean one of: ${suggestions.join(\", \")}?`);\n }\n return new PmCliError(`Item ${badId} not found`, EXIT_CODE.NOT_FOUND, { nextSteps });\n}\n\nfunction bypassesAssigneeConflict(\n op: string,\n bypassAssigneeConflict?: boolean,\n): boolean {\n return (\n op === \"claim\" ||\n (bypassAssigneeConflict === true &&\n (op === \"comment_add\" ||\n op === \"comment_edit\" ||\n op === \"comment_delete\" ||\n op === \"note_add\" ||\n op === \"learning_add\" ||\n op === \"release\" ||\n op === \"update\" ||\n op === \"update_audit\"))\n );\n}\n\nasync function prepareLockedItem(params: {\n pmRoot: string;\n settings: PmSettings;\n id: string;\n op: string;\n author: string;\n force?: boolean;\n bypassAssigneeConflict?: boolean;\n extensionFieldNames?: readonly string[];\n typeToFolder?: Record<string, string>;\n}): Promise<{\n typeToFolder: Record<string, string>;\n located: LocatedItem;\n originalRaw: string;\n document: ItemDocument;\n warnings: string[];\n releaseLock: () => Promise<void>;\n}> {\n const typeToFolder =\n params.typeToFolder ??\n resolveItemTypeRegistry(params.settings, getActiveExtensionRegistrations())\n .type_to_folder;\n const located = await locateItem(\n params.pmRoot,\n params.id,\n params.settings.id_prefix,\n params.settings.item_format,\n typeToFolder,\n );\n if (!located) {\n throw await buildItemNotFoundError(\n params.pmRoot,\n params.id,\n params.settings.id_prefix,\n typeToFolder,\n );\n }\n\n const releaseLock = await acquireLock(\n params.pmRoot,\n located.id,\n params.settings.locks.ttl_seconds,\n params.author,\n Boolean(params.force),\n params.settings.governance.force_required_for_stale_lock,\n );\n\n try {\n const warnings: string[] = [];\n const { raw: originalRaw, document } = await readLocatedItem(located, {\n schema: params.settings.schema,\n extensionFieldNames: params.extensionFieldNames,\n warnings,\n });\n\n const assigned = document.metadata.assignee?.trim();\n const governance = resolveGovernanceKnobs(params.settings);\n const hasOwnershipConflict =\n assigned &&\n assigned !== params.author &&\n !params.force &&\n !bypassesAssigneeConflict(params.op, params.bypassAssigneeConflict);\n if (hasOwnershipConflict) {\n if (governance.ownership_enforcement === \"strict\") {\n throw new PmCliError(\n `Item ${located.id} is assigned to ${assigned}. Use --force to override.`,\n EXIT_CODE.CONFLICT,\n );\n }\n if (governance.ownership_enforcement === \"warn\") {\n warnings.push(\n `ownership_warning:assignee_conflict:${located.id}:${assigned}`,\n );\n }\n }\n\n return {\n typeToFolder,\n located,\n originalRaw,\n document,\n warnings,\n releaseLock,\n };\n } catch (error: unknown) {\n await releaseLock();\n throw error;\n }\n}\n\n/**\n * Implements mutate item for the public runtime surface of this module.\n */\nexport async function mutateItem(params: {\n pmRoot: string;\n settings: PmSettings;\n id: string;\n op: string;\n author: string;\n message?: string;\n force?: boolean;\n bypassAssigneeConflict?: boolean;\n skipNoop?: boolean;\n extensionFieldNames?: readonly string[];\n typeToFolder?: Record<string, string>;\n mutate: (document: ItemDocument) => {\n changedFields: string[];\n warnings?: string[];\n };\n}): Promise<{\n item: ItemFrontMatter;\n body: string;\n changedFields: string[];\n warnings: string[];\n}> {\n const prepared = await prepareLockedItem({\n pmRoot: params.pmRoot,\n settings: params.settings,\n id: params.id,\n op: params.op,\n author: params.author,\n force: params.force,\n bypassAssigneeConflict: params.bypassAssigneeConflict,\n extensionFieldNames: params.extensionFieldNames,\n typeToFolder: params.typeToFolder,\n });\n const {\n typeToFolder,\n located,\n originalRaw,\n document,\n warnings: parseWarnings,\n releaseLock,\n } = prepared;\n\n try {\n const beforeDocument = canonicalDocument(document, {\n schema: params.settings.schema,\n extensionFieldNames: params.extensionFieldNames,\n });\n const mutableDocument = canonicalDocument(structuredClone(document), {\n schema: params.settings.schema,\n extensionFieldNames: params.extensionFieldNames,\n });\n const mutation = params.mutate(mutableDocument);\n if (params.skipNoop === true && mutation.changedFields.length === 0) {\n return {\n item: beforeDocument.metadata,\n body: beforeDocument.body,\n changedFields: [],\n warnings: [...parseWarnings, ...(mutation.warnings ?? [])],\n };\n }\n const historyPolicy = await enforceHistoryStreamPolicyForItem({\n pmRoot: params.pmRoot,\n settings: params.settings,\n itemId: located.id,\n commandLabel: params.op,\n });\n mutableDocument.metadata.updated_at = nowIso();\n const afterDocument = canonicalDocument(mutableDocument, {\n schema: params.settings.schema,\n extensionFieldNames: params.extensionFieldNames,\n });\n const targetItemFormat: ItemFormat = \"toon\";\n const serializedAfter = serializeItemDocument(afterDocument, {\n format: targetItemFormat,\n schema: params.settings.schema,\n extensionFieldNames: params.extensionFieldNames,\n });\n const targetItemPath = getItemPath(\n params.pmRoot,\n afterDocument.metadata.type,\n located.id,\n targetItemFormat,\n typeToFolder,\n );\n const historyPath = getHistoryPath(params.pmRoot, located.id);\n const serviceWriteOverride = await runActiveServiceOverride(\"item_store_write\", {\n op: params.op,\n pm_root: params.pmRoot,\n item_id: located.id,\n source_item_path: located.itemPath,\n target_item_path: targetItemPath,\n history_path: historyPath,\n item_format: targetItemFormat,\n before: beforeDocument,\n after: afterDocument,\n contents: serializedAfter,\n });\n let effectiveTargetItemPath = targetItemPath;\n let effectiveSerializedAfter = serializedAfter;\n let skipItemWrite = false;\n if (\n serviceWriteOverride.handled &&\n typeof serviceWriteOverride.result === \"object\" &&\n serviceWriteOverride.result !== null\n ) {\n const overrideRecord = serviceWriteOverride.result as {\n target_item_path?: unknown;\n contents?: unknown;\n skip_write?: unknown;\n };\n if (typeof overrideRecord.target_item_path === \"string\" && overrideRecord.target_item_path.trim().length > 0) {\n effectiveTargetItemPath = overrideRecord.target_item_path;\n }\n if (typeof overrideRecord.contents === \"string\") {\n effectiveSerializedAfter = overrideRecord.contents;\n }\n if (overrideRecord.skip_write === true) {\n skipItemWrite = true;\n }\n }\n\n if (!skipItemWrite) {\n await writeFileAtomic(effectiveTargetItemPath, effectiveSerializedAfter);\n }\n if (!skipItemWrite && effectiveTargetItemPath !== located.itemPath) {\n await fs.rm(located.itemPath);\n }\n const entry = createHistoryEntry({\n nowIso: afterDocument.metadata.updated_at,\n author: params.author,\n op: params.op,\n before: beforeDocument,\n after: afterDocument,\n message: params.message,\n });\n\n try {\n await appendHistoryEntry(historyPath, entry);\n } catch (error: unknown) {\n if (!skipItemWrite && effectiveTargetItemPath !== located.itemPath) {\n await writeFileAtomic(located.itemPath, originalRaw);\n await fs.rm(effectiveTargetItemPath, { force: true });\n } else if (!skipItemWrite) {\n await writeFileAtomic(located.itemPath, originalRaw);\n }\n throw error;\n }\n const hookWarnings = [\n ...(await runActiveOnWriteHooks({\n path: effectiveTargetItemPath,\n scope: \"project\",\n op: params.op,\n item_id: afterDocument.metadata.id,\n item_type: afterDocument.metadata.type,\n before: beforeDocument,\n after: afterDocument,\n changed_fields: mutation.changedFields,\n })),\n ...(await runActiveOnWriteHooks({\n path: historyPath,\n scope: \"project\",\n op: `${params.op}:history`,\n item_id: afterDocument.metadata.id,\n item_type: afterDocument.metadata.type,\n before: beforeDocument,\n after: afterDocument,\n changed_fields: mutation.changedFields,\n })),\n ];\n\n recordAfterCommandAffectedItem({\n id: afterDocument.metadata.id,\n op: params.op,\n item_type: afterDocument.metadata.type,\n previous_status: beforeDocument.metadata.status,\n status: afterDocument.metadata.status,\n previous: projectAfterCommandItemSnapshot(beforeDocument.metadata, mutation.changedFields),\n current: projectAfterCommandItemSnapshot(afterDocument.metadata, mutation.changedFields),\n changed_fields: mutation.changedFields,\n });\n\n return {\n item: afterDocument.metadata,\n body: afterDocument.body,\n changedFields: mutation.changedFields,\n warnings: [\n ...parseWarnings,\n ...(mutation.warnings ?? []),\n ...historyPolicy.warnings,\n ...serviceWriteOverride.warnings,\n ...hookWarnings,\n ],\n };\n } finally {\n await releaseLock();\n }\n}\n\nexport const itemStoreTestOnly = {\n appendWarning,\n bypassesAssigneeConflict,\n buildDidYouMeanSuggestions,\n isErrno,\n};\n\n/**\n * Implements delete item for the public runtime surface of this module.\n */\nexport async function deleteItem(params: {\n pmRoot: string;\n settings: PmSettings;\n id: string;\n author: string;\n message?: string;\n force?: boolean;\n dryRun?: boolean;\n}): Promise<{ item: ItemFrontMatter; changedFields: string[]; warnings: string[]; targetPath?: string }> {\n const prepared = await prepareLockedItem({\n pmRoot: params.pmRoot,\n settings: params.settings,\n id: params.id,\n op: \"delete\",\n author: params.author,\n force: params.force,\n });\n const { located, originalRaw, document, warnings: parseWarnings, releaseLock } = prepared;\n\n try {\n const historyPolicy = await enforceHistoryStreamPolicyForItem({\n pmRoot: params.pmRoot,\n settings: params.settings,\n itemId: located.id,\n commandLabel: \"delete\",\n });\n\n const beforeDocument = canonicalDocument(document, { schema: params.settings.schema });\n const deletionTimestamp = nowIso();\n const tombstoneDocument = EMPTY_CANONICAL_DOCUMENT as unknown as ItemDocument;\n const historyEntry = createHistoryEntry({\n nowIso: deletionTimestamp,\n author: params.author,\n op: \"delete\",\n before: beforeDocument,\n after: tombstoneDocument,\n message: params.message,\n });\n const historyPath = getHistoryPath(params.pmRoot, located.id);\n const serviceDeleteOverride = await runActiveServiceOverride(\"item_store_delete\", {\n op: \"delete\",\n pm_root: params.pmRoot,\n item_id: located.id,\n item_path: located.itemPath,\n history_path: historyPath,\n before: beforeDocument,\n });\n let effectiveItemPath = located.itemPath;\n let skipDelete = false;\n if (\n serviceDeleteOverride.handled &&\n typeof serviceDeleteOverride.result === \"object\" &&\n serviceDeleteOverride.result !== null\n ) {\n const overrideRecord = serviceDeleteOverride.result as {\n item_path?: unknown;\n skip_delete?: unknown;\n };\n if (typeof overrideRecord.item_path === \"string\" && overrideRecord.item_path.trim().length > 0) {\n effectiveItemPath = overrideRecord.item_path;\n }\n if (overrideRecord.skip_delete === true) {\n skipDelete = true;\n }\n }\n\n if (params.dryRun === true) {\n return {\n item: beforeDocument.metadata,\n changedFields: [\"deleted\"],\n targetPath: effectiveItemPath,\n warnings: [...parseWarnings, ...historyPolicy.warnings, ...serviceDeleteOverride.warnings],\n };\n }\n\n if (!skipDelete) {\n await fs.rm(effectiveItemPath);\n }\n try {\n await appendHistoryEntry(historyPath, historyEntry);\n } catch (error: unknown) {\n if (!skipDelete) {\n await writeFileAtomic(effectiveItemPath, originalRaw);\n }\n throw error;\n }\n\n const hookWarnings = [\n ...(await runActiveOnWriteHooks({\n path: effectiveItemPath,\n scope: \"project\",\n op: \"delete\",\n item_id: beforeDocument.metadata.id,\n item_type: beforeDocument.metadata.type,\n before: beforeDocument,\n after: tombstoneDocument,\n changed_fields: [\"deleted\"],\n })),\n ...(await runActiveOnWriteHooks({\n path: historyPath,\n scope: \"project\",\n op: \"delete:history\",\n item_id: beforeDocument.metadata.id,\n item_type: beforeDocument.metadata.type,\n before: beforeDocument,\n after: tombstoneDocument,\n changed_fields: [\"deleted\"],\n })),\n ];\n\n recordAfterCommandAffectedItem({\n id: beforeDocument.metadata.id,\n op: \"delete\",\n item_type: beforeDocument.metadata.type,\n previous_status: beforeDocument.metadata.status,\n previous: projectAfterCommandItemSnapshot(beforeDocument.metadata, Object.keys(beforeDocument.metadata)),\n changed_fields: [\"deleted\"],\n });\n\n return {\n item: beforeDocument.metadata,\n changedFields: [\"deleted\"],\n warnings: [...parseWarnings, ...historyPolicy.warnings, ...serviceDeleteOverride.warnings, ...hookWarnings],\n };\n } finally {\n await releaseLock();\n }\n}\n"],"names":["path","next","fs","path","fs","path","path","path","fs","path","path","fs","fs","path","fs","appendWarning","resolveActiveExtensionFieldNames","fs","path","fs"],"mappings":"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","debugId":"e03076ec-ff6f-54bb-9f98-b11fe7420523"}