@unbrained/pm-cli 2026.7.1 → 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 (563) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cli/commander-usage.d.ts +2 -0
  3. package/dist/cli/commander-usage.js +58 -47
  4. package/dist/cli/commander-usage.js.map +1 -1
  5. package/dist/cli/commands/aggregate.js +102 -79
  6. package/dist/cli/commands/aggregate.js.map +1 -1
  7. package/dist/cli/commands/calendar.js +278 -243
  8. package/dist/cli/commands/calendar.js.map +1 -1
  9. package/dist/cli/commands/close-many.js +89 -68
  10. package/dist/cli/commands/close-many.js.map +1 -1
  11. package/dist/cli/commands/close.js +157 -129
  12. package/dist/cli/commands/close.js.map +1 -1
  13. package/dist/cli/commands/comments-audit.js +50 -42
  14. package/dist/cli/commands/comments-audit.js.map +1 -1
  15. package/dist/cli/commands/config.d.ts +2 -0
  16. package/dist/cli/commands/config.js +443 -879
  17. package/dist/cli/commands/config.js.map +1 -1
  18. package/dist/cli/commands/context.js +365 -287
  19. package/dist/cli/commands/context.js.map +1 -1
  20. package/dist/cli/commands/contracts.js +352 -238
  21. package/dist/cli/commands/contracts.js.map +1 -1
  22. package/dist/cli/commands/dedupe-audit.js +46 -39
  23. package/dist/cli/commands/dedupe-audit.js.map +1 -1
  24. package/dist/cli/commands/dedupe-merge.js +88 -69
  25. package/dist/cli/commands/dedupe-merge.js.map +1 -1
  26. package/dist/cli/commands/get.js +114 -81
  27. package/dist/cli/commands/get.js.map +1 -1
  28. package/dist/cli/commands/health.d.ts +17 -0
  29. package/dist/cli/commands/health.js +446 -307
  30. package/dist/cli/commands/health.js.map +1 -1
  31. package/dist/cli/commands/history-compact.js +209 -140
  32. package/dist/cli/commands/history-compact.js.map +1 -1
  33. package/dist/cli/commands/history-redact.js +162 -119
  34. package/dist/cli/commands/history-redact.js.map +1 -1
  35. package/dist/cli/commands/history-repair.js +120 -85
  36. package/dist/cli/commands/history-repair.js.map +1 -1
  37. package/dist/cli/commands/init.d.ts +8 -2
  38. package/dist/cli/commands/init.js +263 -162
  39. package/dist/cli/commands/init.js.map +1 -1
  40. package/dist/cli/commands/list.js +152 -102
  41. package/dist/cli/commands/list.js.map +1 -1
  42. package/dist/cli/commands/next.js +49 -32
  43. package/dist/cli/commands/next.js.map +1 -1
  44. package/dist/cli/commands/plan.js +373 -298
  45. package/dist/cli/commands/plan.js.map +1 -1
  46. package/dist/cli/commands/recurrence-parsers.js +43 -25
  47. package/dist/cli/commands/recurrence-parsers.js.map +1 -1
  48. package/dist/cli/commands/reindex.d.ts +21 -5
  49. package/dist/cli/commands/reindex.js +345 -205
  50. package/dist/cli/commands/reindex.js.map +1 -1
  51. package/dist/cli/commands/restore.d.ts +8 -7
  52. package/dist/cli/commands/restore.js +105 -69
  53. package/dist/cli/commands/restore.js.map +1 -1
  54. package/dist/cli/commands/schema.js +33 -30
  55. package/dist/cli/commands/schema.js.map +1 -1
  56. package/dist/cli/commands/search.d.ts +10 -2
  57. package/dist/cli/commands/search.js +503 -470
  58. package/dist/cli/commands/search.js.map +1 -1
  59. package/dist/cli/commands/telemetry.js +98 -87
  60. package/dist/cli/commands/telemetry.js.map +1 -1
  61. package/dist/cli/commands/test-all.js +237 -168
  62. package/dist/cli/commands/test-all.js.map +1 -1
  63. package/dist/cli/commands/test.d.ts +6 -5
  64. package/dist/cli/commands/test.js +424 -344
  65. package/dist/cli/commands/test.js.map +1 -1
  66. package/dist/cli/commands/update-many.js +57 -42
  67. package/dist/cli/commands/update-many.js.map +1 -1
  68. package/dist/cli/commands/update.d.ts +1 -1
  69. package/dist/cli/commands/update.js +738 -671
  70. package/dist/cli/commands/update.js.map +1 -1
  71. package/dist/cli/commands/validate.d.ts +18 -1
  72. package/dist/cli/commands/validate.js +466 -343
  73. package/dist/cli/commands/validate.js.map +1 -1
  74. package/dist/cli/error-guidance.js +399 -357
  75. package/dist/cli/error-guidance.js.map +1 -1
  76. package/dist/cli/main.d.ts +47 -0
  77. package/dist/cli/main.js +428 -341
  78. package/dist/cli/main.js.map +1 -1
  79. package/dist/cli/migration-gates.js +22 -45
  80. package/dist/cli/migration-gates.js.map +1 -1
  81. package/dist/cli/register-list-query.js +94 -105
  82. package/dist/cli/register-list-query.js.map +1 -1
  83. package/dist/cli/register-mutation.js +400 -416
  84. package/dist/cli/register-mutation.js.map +1 -1
  85. package/dist/cli/register-operations.js +86 -66
  86. package/dist/cli/register-operations.js.map +1 -1
  87. package/dist/cli/register-setup.js +120 -101
  88. package/dist/cli/register-setup.js.map +1 -1
  89. package/dist/cli-bundle/chunks/{activity-DBLQVIP6.js → activity-CUC4JY3U.js} +9 -9
  90. package/dist/cli-bundle/chunks/activity-WEIEMM73.js +16 -0
  91. package/dist/cli-bundle/chunks/{aggregate-JTEF4BP7.js → aggregate-DKUTRY6R.js} +108 -84
  92. package/dist/cli-bundle/chunks/aggregate-DKUTRY6R.js.map +1 -0
  93. package/dist/cli-bundle/chunks/{aggregate-SDF7DUOD.js → aggregate-SW5PNGCS.js} +107 -83
  94. package/dist/cli-bundle/chunks/{aggregate-SDF7DUOD.js.map → aggregate-SW5PNGCS.js.map} +2 -2
  95. package/dist/cli-bundle/chunks/{append-QCFJSDFL.js → append-H32VOR2Y.js} +6 -6
  96. package/dist/cli-bundle/chunks/{append-LOVPGVPT.js → append-UBM632FK.js} +6 -6
  97. package/dist/cli-bundle/chunks/{chunk-RLDHZHQS.js → chunk-2227673O.js} +158 -114
  98. package/dist/cli-bundle/chunks/chunk-2227673O.js.map +1 -0
  99. package/dist/cli-bundle/chunks/{chunk-SLMUGTK3.js → chunk-2ASNV4DH.js} +4 -4
  100. package/dist/cli-bundle/chunks/{chunk-UZIWVBE6.js → chunk-2CHRYUXL.js} +2 -2
  101. package/dist/cli-bundle/chunks/{chunk-NWMZWYYB.js → chunk-2KWL5NPW.js} +42 -27
  102. package/dist/cli-bundle/chunks/chunk-2KWL5NPW.js.map +1 -0
  103. package/dist/cli-bundle/chunks/{chunk-NFDPYAIP.js → chunk-36UGKF4O.js} +21 -29
  104. package/dist/cli-bundle/chunks/chunk-36UGKF4O.js.map +7 -0
  105. package/dist/cli-bundle/chunks/{chunk-NU2UEROZ.js → chunk-3AZUFQK6.js} +6 -6
  106. package/dist/cli-bundle/chunks/{chunk-LB6TP6MC.js → chunk-3LCUASYG.js} +2 -2
  107. package/dist/cli-bundle/chunks/{chunk-HPPFYYOV.js → chunk-3Q2HBMTI.js} +2 -2
  108. package/dist/cli-bundle/chunks/{chunk-IPYBJWTE.js → chunk-4NUOWFBT.js} +109 -72
  109. package/dist/cli-bundle/chunks/chunk-4NUOWFBT.js.map +7 -0
  110. package/dist/cli-bundle/chunks/{chunk-W4ULYO7Z.js → chunk-55XRYWEG.js} +6 -6
  111. package/dist/cli-bundle/chunks/{chunk-HXTQJXWT.js → chunk-5GVTFFTC.js} +2 -2
  112. package/dist/cli-bundle/chunks/{chunk-BDTISOSD.js → chunk-5PGBHRY3.js} +41 -26
  113. package/dist/cli-bundle/chunks/chunk-5PGBHRY3.js.map +7 -0
  114. package/dist/cli-bundle/chunks/{chunk-YITK2PJ6.js → chunk-66Z3X7ZG.js} +261 -161
  115. package/dist/cli-bundle/chunks/chunk-66Z3X7ZG.js.map +7 -0
  116. package/dist/cli-bundle/chunks/{chunk-NUHHPVVS.js → chunk-6ITZLD4T.js} +712 -612
  117. package/dist/cli-bundle/chunks/chunk-6ITZLD4T.js.map +7 -0
  118. package/dist/cli-bundle/chunks/{chunk-V3NOKJF2.js → chunk-6YCYF2AI.js} +262 -162
  119. package/dist/cli-bundle/chunks/chunk-6YCYF2AI.js.map +1 -0
  120. package/dist/cli-bundle/chunks/{chunk-BZCEN4JA.js → chunk-6ZMBJRDJ.js} +492 -403
  121. package/dist/cli-bundle/chunks/chunk-6ZMBJRDJ.js.map +7 -0
  122. package/dist/cli-bundle/chunks/{chunk-CF7RL6FR.js → chunk-7MYWF4ZX.js} +110 -73
  123. package/dist/cli-bundle/chunks/chunk-7MYWF4ZX.js.map +1 -0
  124. package/dist/cli-bundle/chunks/{chunk-RVUALSJF.js → chunk-7NSPKJUS.js} +356 -285
  125. package/dist/cli-bundle/chunks/chunk-7NSPKJUS.js.map +7 -0
  126. package/dist/cli-bundle/chunks/{chunk-4DSGXSBL.js → chunk-7TH5NMVB.js} +95 -53
  127. package/dist/cli-bundle/chunks/chunk-7TH5NMVB.js.map +7 -0
  128. package/dist/cli-bundle/chunks/{chunk-ZETXE4SE.js → chunk-7W4H4K26.js} +713 -613
  129. package/dist/cli-bundle/chunks/chunk-7W4H4K26.js.map +1 -0
  130. package/dist/cli-bundle/chunks/{chunk-64HNBBFQ.js → chunk-A6VOGKBA.js} +6 -6
  131. package/dist/cli-bundle/chunks/{chunk-WYDHYJPO.js → chunk-AIAIXG7I.js} +2 -2
  132. package/dist/cli-bundle/chunks/{chunk-CWFNTKQJ.js → chunk-AJEBCRIY.js} +5 -5
  133. package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js → chunk-B4O5S7I3.js} +79 -57
  134. package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js.map → chunk-B4O5S7I3.js.map} +2 -2
  135. package/dist/cli-bundle/chunks/{chunk-NOLPZMSV.js → chunk-BTX5MIQF.js} +2 -2
  136. package/dist/cli-bundle/chunks/{chunk-RH5ZBYFD.js → chunk-BVZZN2LH.js} +3 -3
  137. package/dist/cli-bundle/chunks/{chunk-27BXPBAY.js → chunk-CYBDUHNO.js} +3 -3
  138. package/dist/cli-bundle/chunks/{chunk-A7FPBAQS.js → chunk-CZPVDLD2.js} +4 -4
  139. package/dist/cli-bundle/chunks/{chunk-3VGN2UWE.js → chunk-EMPGXBUF.js} +22 -30
  140. package/dist/cli-bundle/chunks/chunk-EMPGXBUF.js.map +1 -0
  141. package/dist/cli-bundle/chunks/{chunk-JPECA746.js → chunk-EUKTMRN3.js} +2 -2
  142. package/dist/cli-bundle/chunks/{chunk-2466X6E4.js → chunk-FFOQHGNH.js} +6 -6
  143. package/dist/cli-bundle/chunks/{chunk-JLM7BHI7.js → chunk-GFMSLORL.js} +6 -6
  144. package/dist/cli-bundle/chunks/{chunk-SDR5J34Q.js → chunk-GRRG3MCT.js} +4 -4
  145. package/dist/cli-bundle/chunks/{chunk-GJ326ZKX.js → chunk-H4GRLYJS.js} +3 -3
  146. package/dist/cli-bundle/chunks/{chunk-OGXLACHC.js → chunk-HQTPRV4D.js} +6 -6
  147. package/dist/cli-bundle/chunks/{chunk-7R4QEMZZ.js → chunk-I66WE2HE.js} +354 -283
  148. package/dist/cli-bundle/chunks/chunk-I66WE2HE.js.map +1 -0
  149. package/dist/cli-bundle/chunks/{chunk-BHO33VBQ.js → chunk-IEEJQCZ4.js} +3 -3
  150. package/dist/cli-bundle/chunks/{chunk-JMP4E6D7.js → chunk-IG5JYZGU.js} +390 -312
  151. package/dist/cli-bundle/chunks/{chunk-JMP4E6D7.js.map → chunk-IG5JYZGU.js.map} +2 -2
  152. package/dist/cli-bundle/chunks/{chunk-4DUVCVLZ.js → chunk-JMK5GCK2.js} +2 -2
  153. package/dist/cli-bundle/chunks/{chunk-3K2M5OYU.js → chunk-JXAUVO6X.js} +258 -169
  154. package/dist/cli-bundle/chunks/{chunk-3K2M5OYU.js.map → chunk-JXAUVO6X.js.map} +2 -2
  155. package/dist/cli-bundle/chunks/{chunk-AXIDKKAT.js → chunk-K2VYLVX4.js} +2 -2
  156. package/dist/cli-bundle/chunks/{chunk-EJUDVUYZ.js → chunk-KCO2EAN5.js} +3 -3
  157. package/dist/cli-bundle/chunks/{chunk-6AQZPVHQ.js → chunk-KIYCOJ63.js} +4 -4
  158. package/dist/cli-bundle/chunks/{chunk-ZRP4VG5U.js → chunk-KLXF7NCC.js} +2 -2
  159. package/dist/cli-bundle/chunks/{chunk-QCWF6IYD.js → chunk-KN3URLKS.js} +3 -3
  160. package/dist/cli-bundle/chunks/{chunk-N74UMG5H.js → chunk-LRKMWUUV.js} +2 -2
  161. package/dist/cli-bundle/chunks/{chunk-AVEE5EHK.js → chunk-LTRAF2D7.js} +3 -3
  162. package/dist/cli-bundle/chunks/{chunk-VARHOHYV.js → chunk-MNBPX5JS.js} +55 -36
  163. package/dist/cli-bundle/chunks/chunk-MNBPX5JS.js.map +7 -0
  164. package/dist/cli-bundle/chunks/{chunk-IJYK2T43.js → chunk-MRD4T5LF.js} +2 -2
  165. package/dist/cli-bundle/chunks/{chunk-G7I7DEZA.js → chunk-N2JSWVWG.js} +4 -4
  166. package/dist/cli-bundle/chunks/{chunk-5QFDBI4F.js → chunk-N3QCJS4M.js} +6 -6
  167. package/dist/cli-bundle/chunks/{chunk-JSU5P7VS.js → chunk-NRZS637N.js} +258 -169
  168. package/dist/cli-bundle/chunks/chunk-NRZS637N.js.map +1 -0
  169. package/dist/cli-bundle/chunks/{chunk-4A3BJ675.js → chunk-OTUJZKGI.js} +3 -3
  170. package/dist/cli-bundle/chunks/{chunk-5CGRF3L5.js → chunk-Q6K2OACU.js} +153 -90
  171. package/dist/cli-bundle/chunks/chunk-Q6K2OACU.js.map +1 -0
  172. package/dist/cli-bundle/chunks/{chunk-3XZCOZ5J.js → chunk-Q6NXOHS6.js} +391 -313
  173. package/dist/cli-bundle/chunks/chunk-Q6NXOHS6.js.map +1 -0
  174. package/dist/cli-bundle/chunks/{chunk-HZZEHPRG.js → chunk-QH3FSKRJ.js} +2 -2
  175. package/dist/cli-bundle/chunks/{chunk-4XOIEKSD.js → chunk-RM37OPYK.js} +56 -37
  176. package/dist/cli-bundle/chunks/chunk-RM37OPYK.js.map +1 -0
  177. package/dist/cli-bundle/chunks/{chunk-NKZAN7BD.js → chunk-S62UANU7.js} +3 -3
  178. package/dist/cli-bundle/chunks/{chunk-RMMQ74TG.js → chunk-SPM2XLWI.js} +37 -28
  179. package/dist/cli-bundle/chunks/chunk-SPM2XLWI.js.map +7 -0
  180. package/dist/cli-bundle/chunks/{chunk-3J6JRJ3I.js → chunk-SYNKD3ZG.js} +5 -5
  181. package/dist/cli-bundle/chunks/{chunk-FFMQB7WR.js → chunk-SYVUU7EK.js} +493 -404
  182. package/dist/cli-bundle/chunks/chunk-SYVUU7EK.js.map +1 -0
  183. package/dist/cli-bundle/chunks/{chunk-UYUYDGIB.js → chunk-TPOFWBMY.js} +95 -53
  184. package/dist/cli-bundle/chunks/chunk-TPOFWBMY.js.map +1 -0
  185. package/dist/cli-bundle/chunks/{chunk-OTUHB4HS.js → chunk-TTHCEV5Q.js} +92 -77
  186. package/dist/cli-bundle/chunks/chunk-TTHCEV5Q.js.map +1 -0
  187. package/dist/cli-bundle/chunks/{chunk-L5OEFZQG.js → chunk-U2BEEM2X.js} +3 -3
  188. package/dist/cli-bundle/chunks/{chunk-KNPEF7QG.js → chunk-UGLU6Q2I.js} +91 -76
  189. package/dist/cli-bundle/chunks/chunk-UGLU6Q2I.js.map +7 -0
  190. package/dist/cli-bundle/chunks/{chunk-EVMTBV6V.js → chunk-UT73HUPC.js} +3 -3
  191. package/dist/cli-bundle/chunks/{chunk-VICZWYGZ.js → chunk-UTSH5GWX.js} +4 -4
  192. package/dist/cli-bundle/chunks/{chunk-IZBR4NRW.js → chunk-UWKEJMZU.js} +157 -113
  193. package/dist/cli-bundle/chunks/chunk-UWKEJMZU.js.map +7 -0
  194. package/dist/cli-bundle/chunks/{chunk-3S2KT7NG.js → chunk-W47SML5B.js} +152 -89
  195. package/dist/cli-bundle/chunks/chunk-W47SML5B.js.map +7 -0
  196. package/dist/cli-bundle/chunks/{chunk-RGEMWD6Q.js → chunk-WJAMWAHZ.js} +157 -118
  197. package/dist/cli-bundle/chunks/chunk-WJAMWAHZ.js.map +7 -0
  198. package/dist/cli-bundle/chunks/{chunk-JWXRETDF.js → chunk-XCHUVHKU.js} +626 -484
  199. package/dist/cli-bundle/chunks/chunk-XCHUVHKU.js.map +1 -0
  200. package/dist/cli-bundle/chunks/{chunk-55SNVXRQ.js → chunk-XEWQKDYZ.js} +626 -484
  201. package/dist/cli-bundle/chunks/chunk-XEWQKDYZ.js.map +7 -0
  202. package/dist/cli-bundle/chunks/{chunk-TP5Q5ZD3.js → chunk-XTHQWXVC.js} +158 -119
  203. package/dist/cli-bundle/chunks/chunk-XTHQWXVC.js.map +1 -0
  204. package/dist/cli-bundle/chunks/{chunk-MDPEOIGN.js → chunk-XWGEMNBR.js} +2 -2
  205. package/dist/cli-bundle/chunks/{chunk-HYTGA6GI.js → chunk-Y4NRKBFW.js} +3 -3
  206. package/dist/cli-bundle/chunks/{chunk-2D4HATP2.js → chunk-YLZZ6T54.js} +38 -29
  207. package/dist/cli-bundle/chunks/chunk-YLZZ6T54.js.map +1 -0
  208. package/dist/cli-bundle/chunks/{chunk-22WKIL3H.js → chunk-YPKFV2JR.js} +6 -6
  209. package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js → chunk-Z4DGFQDH.js} +80 -58
  210. package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js.map → chunk-Z4DGFQDH.js.map} +1 -1
  211. package/dist/cli-bundle/chunks/{chunk-DDPTYJIM.js → chunk-ZNHEYCDD.js} +2 -2
  212. package/dist/cli-bundle/chunks/{chunk-MAUKX7JC.js → chunk-ZNT7KEWE.js} +2 -2
  213. package/dist/cli-bundle/chunks/{claim-T3GCKV7C.js → claim-SENTPZBN.js} +8 -8
  214. package/dist/cli-bundle/chunks/{claim-EMQLYPRW.js → claim-Z7MEQCBT.js} +8 -8
  215. package/dist/cli-bundle/chunks/{close-TQYAAFJP.js → close-424MX4CU.js} +7 -7
  216. package/dist/cli-bundle/chunks/close-YCWQQPDS.js +14 -0
  217. package/dist/cli-bundle/chunks/{close-many-LDRVEQY2.js → close-many-2IV4J2TR.js} +102 -81
  218. package/dist/cli-bundle/chunks/close-many-2IV4J2TR.js.map +1 -0
  219. package/dist/cli-bundle/chunks/{close-many-BG5QQIDQ.js → close-many-SWY34BII.js} +101 -80
  220. package/dist/cli-bundle/chunks/close-many-SWY34BII.js.map +7 -0
  221. package/dist/cli-bundle/chunks/{comments-YUXJRZPQ.js → comments-4FGNTSNV.js} +8 -8
  222. package/dist/cli-bundle/chunks/{comments-QCKR2YY2.js → comments-7YS5MY5X.js} +8 -8
  223. package/dist/cli-bundle/chunks/config-BZJKK7FZ.js +1062 -0
  224. package/dist/cli-bundle/chunks/config-BZJKK7FZ.js.map +1 -0
  225. package/dist/cli-bundle/chunks/config-G74GISC4.js +1072 -0
  226. package/dist/cli-bundle/chunks/config-G74GISC4.js.map +7 -0
  227. package/dist/cli-bundle/chunks/{context-OCZ3FJ4Z.js → context-LHVKJSPJ.js} +12 -12
  228. package/dist/cli-bundle/chunks/{context-B6275WPX.js → context-ZQY54JNS.js} +12 -12
  229. package/dist/cli-bundle/chunks/{contracts-HN7ABKLP.js → contracts-CP2EZJC7.js} +320 -199
  230. package/dist/cli-bundle/chunks/contracts-CP2EZJC7.js.map +7 -0
  231. package/dist/cli-bundle/chunks/{contracts-W4FZVVD6.js → contracts-FIZLMP7O.js} +321 -200
  232. package/dist/cli-bundle/chunks/contracts-FIZLMP7O.js.map +1 -0
  233. package/dist/cli-bundle/chunks/{copy-DEM4DATS.js → copy-GYNQQPW2.js} +5 -5
  234. package/dist/cli-bundle/chunks/{copy-BTJOSKKT.js → copy-TLW7JTQT.js} +5 -5
  235. package/dist/cli-bundle/chunks/{create-RLRJMRTM.js → create-VSKYSOCD.js} +12 -12
  236. package/dist/cli-bundle/chunks/create-XTMAPS7I.js +28 -0
  237. package/dist/cli-bundle/chunks/{delete-LSVHAB4Y.js → delete-4W5JYCEG.js} +5 -5
  238. package/dist/cli-bundle/chunks/{delete-BHK7VB2Z.js → delete-ANTOTI2I.js} +5 -5
  239. package/dist/cli-bundle/chunks/{deps-XHYXWEPT.js → deps-HPPE6MJN.js} +5 -5
  240. package/dist/cli-bundle/chunks/{deps-4UDFJRUA.js → deps-ZQZN54EZ.js} +5 -5
  241. package/dist/cli-bundle/chunks/{docs-GYZNVS26.js → docs-RPOVFMP3.js} +7 -7
  242. package/dist/cli-bundle/chunks/{docs-26S44RXU.js → docs-XJNYBJGE.js} +7 -7
  243. package/dist/cli-bundle/chunks/{eval-PGRVIJQU.js → eval-DM6JBZTS.js} +10 -10
  244. package/dist/cli-bundle/chunks/{eval-UYF3ZPVO.js → eval-RFBI5FGS.js} +10 -10
  245. package/dist/cli-bundle/chunks/{extension-CPSLJQVE.js → extension-B3YY4WY5.js} +11 -11
  246. package/dist/cli-bundle/chunks/{extension-CXJ6RELI.js → extension-TTSEFQTS.js} +11 -11
  247. package/dist/cli-bundle/chunks/{files-NQHEXUZD.js → files-5D65CHGE.js} +7 -7
  248. package/dist/cli-bundle/chunks/{files-MBNICQFM.js → files-GPIG77EN.js} +7 -7
  249. package/dist/cli-bundle/chunks/{focus-XZW5423D.js → focus-C3PEJV2C.js} +6 -6
  250. package/dist/cli-bundle/chunks/{focus-DWYIG7GU.js → focus-ZHN7WIGX.js} +6 -6
  251. package/dist/cli-bundle/chunks/{gc-LPVMKJQJ.js → gc-D4JQ6OWN.js} +3 -3
  252. package/dist/cli-bundle/chunks/{gc-7GQYOS2G.js → gc-VZIXDL32.js} +3 -3
  253. package/dist/cli-bundle/chunks/{get-DSDEKJ3L.js → get-GIBRUUOP.js} +121 -81
  254. package/dist/cli-bundle/chunks/get-GIBRUUOP.js.map +1 -0
  255. package/dist/cli-bundle/chunks/{get-A7MAOHCU.js → get-IOVAN6RU.js} +120 -80
  256. package/dist/cli-bundle/chunks/get-IOVAN6RU.js.map +7 -0
  257. package/dist/cli-bundle/chunks/{health-3IPFLKXB.js → health-L2U3AFKV.js} +437 -265
  258. package/dist/cli-bundle/chunks/health-L2U3AFKV.js.map +1 -0
  259. package/dist/cli-bundle/chunks/{health-GZXGBZ36.js → health-MM7AWXYF.js} +436 -264
  260. package/dist/cli-bundle/chunks/health-MM7AWXYF.js.map +7 -0
  261. package/dist/cli-bundle/chunks/history-DD7L7BNL.js +18 -0
  262. package/dist/cli-bundle/chunks/{history-NERDJNUB.js → history-IL7XCEX2.js} +8 -8
  263. package/dist/cli-bundle/chunks/{history-compact-HR7BB4LR.js → history-compact-HALOTOU7.js} +214 -135
  264. package/dist/cli-bundle/chunks/history-compact-HALOTOU7.js.map +1 -0
  265. package/dist/cli-bundle/chunks/{history-compact-2WRZ2WK4.js → history-compact-MV25P7DM.js} +213 -134
  266. package/dist/cli-bundle/chunks/history-compact-MV25P7DM.js.map +7 -0
  267. package/dist/cli-bundle/chunks/history-redact-IX4YEWMY.js +19 -0
  268. package/dist/cli-bundle/chunks/{history-redact-O3NBCNWC.js → history-redact-VYCWQFK7.js} +9 -9
  269. package/dist/cli-bundle/chunks/{history-repair-XA3LC4GA.js → history-repair-44MODPQF.js} +124 -84
  270. package/dist/cli-bundle/chunks/history-repair-44MODPQF.js.map +1 -0
  271. package/dist/cli-bundle/chunks/{history-repair-LCMOS45X.js → history-repair-CPNAOCNF.js} +123 -83
  272. package/dist/cli-bundle/chunks/history-repair-CPNAOCNF.js.map +7 -0
  273. package/dist/cli-bundle/chunks/{init-64XDLQJB.js → init-F27NHENZ.js} +12 -12
  274. package/dist/cli-bundle/chunks/init-HHVQQP6C.js +22 -0
  275. package/dist/cli-bundle/chunks/{learnings-LPKCSJX7.js → learnings-HJVDQIGY.js} +8 -8
  276. package/dist/cli-bundle/chunks/{learnings-JR6MA5TI.js → learnings-XSFSUUWK.js} +8 -8
  277. package/dist/cli-bundle/chunks/{list-G5Y65VF6.js → list-HPMEKCAA.js} +8 -8
  278. package/dist/cli-bundle/chunks/{list-DNBJVO3E.js → list-VMPWTURB.js} +8 -8
  279. package/dist/cli-bundle/chunks/{next-BCERKDUR.js → next-ETXF2ZCN.js} +59 -37
  280. package/dist/cli-bundle/chunks/next-ETXF2ZCN.js.map +7 -0
  281. package/dist/cli-bundle/chunks/{next-FYTQF6HG.js → next-QM6YJIIS.js} +60 -38
  282. package/dist/cli-bundle/chunks/next-QM6YJIIS.js.map +1 -0
  283. package/dist/cli-bundle/chunks/{notes-2BMU3VVQ.js → notes-GDZIKGR6.js} +8 -8
  284. package/dist/cli-bundle/chunks/{notes-6KTGO2OJ.js → notes-WDDBPC4D.js} +8 -8
  285. package/dist/cli-bundle/chunks/{plan-RKZHQVXR.js → plan-BGDR73Z6.js} +373 -279
  286. package/dist/cli-bundle/chunks/plan-BGDR73Z6.js.map +1 -0
  287. package/dist/cli-bundle/chunks/{plan-4WXEQCTN.js → plan-C5IMM335.js} +372 -278
  288. package/dist/cli-bundle/chunks/plan-C5IMM335.js.map +7 -0
  289. package/dist/cli-bundle/chunks/{profile-QLER5ENE.js → profile-CCOKZ2IQ.js} +9 -9
  290. package/dist/cli-bundle/chunks/{profile-4OMM32CD.js → profile-HUCENIEQ.js} +9 -9
  291. package/dist/cli-bundle/chunks/{register-list-query-7LV46VAU.js → register-list-query-ROSNIL52.js} +80 -83
  292. package/dist/cli-bundle/chunks/register-list-query-ROSNIL52.js.map +1 -0
  293. package/dist/cli-bundle/chunks/{register-list-query-SNG5PGA4.js → register-list-query-XN4ZRHSV.js} +79 -82
  294. package/dist/cli-bundle/chunks/register-list-query-XN4ZRHSV.js.map +7 -0
  295. package/dist/cli-bundle/chunks/{register-mutation-ENNDUAZG.js → register-mutation-CFSB2MS3.js} +403 -382
  296. package/dist/cli-bundle/chunks/register-mutation-CFSB2MS3.js.map +1 -0
  297. package/dist/cli-bundle/chunks/{register-mutation-KK7PHYYU.js → register-mutation-KRLAHEL2.js} +402 -381
  298. package/dist/cli-bundle/chunks/register-mutation-KRLAHEL2.js.map +7 -0
  299. package/dist/cli-bundle/chunks/{register-operations-HZ6XERQG.js → register-operations-4PASGJDB.js} +112 -93
  300. package/dist/cli-bundle/chunks/register-operations-4PASGJDB.js.map +7 -0
  301. package/dist/cli-bundle/chunks/{register-operations-C6OWLDSH.js → register-operations-MBN4KGUM.js} +113 -94
  302. package/dist/cli-bundle/chunks/register-operations-MBN4KGUM.js.map +1 -0
  303. package/dist/cli-bundle/chunks/{register-setup-P67EMBDJ.js → register-setup-VIAWYFP5.js} +129 -104
  304. package/dist/cli-bundle/chunks/register-setup-VIAWYFP5.js.map +1 -0
  305. package/dist/cli-bundle/chunks/{register-setup-ZKJ53RS7.js → register-setup-ZCGKHDKL.js} +128 -103
  306. package/dist/cli-bundle/chunks/register-setup-ZCGKHDKL.js.map +7 -0
  307. package/dist/cli-bundle/chunks/{restore-4MHZFJ2E.js → restore-4CBWUMCX.js} +9 -9
  308. package/dist/cli-bundle/chunks/restore-5UEAGG3W.js +17 -0
  309. package/dist/cli-bundle/chunks/{scheduling-shortcuts-LB6DOLRL.js → scheduling-shortcuts-6VFKNKCM.js} +12 -12
  310. package/dist/cli-bundle/chunks/{scheduling-shortcuts-UTOYKLXQ.js → scheduling-shortcuts-ERHCVTEM.js} +12 -12
  311. package/dist/cli-bundle/chunks/{schema-73HR2OJW.js → schema-TDGK6N3I.js} +7 -7
  312. package/dist/cli-bundle/chunks/{schema-U6LJKSIR.js → schema-UE5KKAUX.js} +7 -7
  313. package/dist/cli-bundle/chunks/{search-KILGT37L.js → search-FP7MEU4S.js} +10 -10
  314. package/dist/cli-bundle/chunks/{search-AXPXKZER.js → search-K4CFLQ5S.js} +10 -10
  315. package/dist/cli-bundle/chunks/{stats-PSYVVTNZ.js → stats-NJJCALEZ.js} +6 -6
  316. package/dist/cli-bundle/chunks/{stats-W5KNVJWQ.js → stats-XT6QRKQY.js} +6 -6
  317. package/dist/cli-bundle/chunks/{telemetry-GAHHQTOS.js → telemetry-5SQ5UDXC.js} +84 -70
  318. package/dist/cli-bundle/chunks/telemetry-5SQ5UDXC.js.map +7 -0
  319. package/dist/cli-bundle/chunks/{telemetry-BZUF6H7G.js → telemetry-HVXFZA2U.js} +85 -71
  320. package/dist/cli-bundle/chunks/telemetry-HVXFZA2U.js.map +1 -0
  321. package/dist/cli-bundle/chunks/{test-ACD52Z3S.js → test-UFSJ5YIO.js} +15 -15
  322. package/dist/cli-bundle/chunks/{test-PWDIZ255.js → test-YCDAUBWF.js} +15 -15
  323. package/dist/cli-bundle/chunks/test-all-2BWKY3GQ.js +427 -0
  324. package/dist/cli-bundle/chunks/test-all-2BWKY3GQ.js.map +1 -0
  325. package/dist/cli-bundle/chunks/test-all-PM7UYN42.js +430 -0
  326. package/dist/cli-bundle/chunks/test-all-PM7UYN42.js.map +7 -0
  327. package/dist/cli-bundle/chunks/{test-runs-UXIXPDKU.js → test-runs-FK5E75AA.js} +185 -147
  328. package/dist/cli-bundle/chunks/test-runs-FK5E75AA.js.map +1 -0
  329. package/dist/cli-bundle/chunks/{test-runs-PLRAZEFW.js → test-runs-H4TGWGRN.js} +184 -146
  330. package/dist/cli-bundle/chunks/test-runs-H4TGWGRN.js.map +7 -0
  331. package/dist/cli-bundle/chunks/update-MTCFES6X.js +24 -0
  332. package/dist/cli-bundle/chunks/{update-KFX2SIAC.js → update-Y5WQVT5O.js} +15 -15
  333. package/dist/cli-bundle/chunks/{update-many-Z5GJS5LC.js → update-many-6YAYYRLE.js} +82 -67
  334. package/dist/cli-bundle/chunks/{update-many-Z5GJS5LC.js.map → update-many-6YAYYRLE.js.map} +2 -2
  335. package/dist/cli-bundle/chunks/{update-many-RNSBX2TA.js → update-many-JTKKSA7Y.js} +83 -68
  336. package/dist/cli-bundle/chunks/{update-many-RNSBX2TA.js.map → update-many-JTKKSA7Y.js.map} +1 -1
  337. package/dist/cli-bundle/chunks/{upgrade-HAK6JG2O.js → upgrade-DTAHZ236.js} +11 -11
  338. package/dist/cli-bundle/chunks/{upgrade-BRL6KCOJ.js → upgrade-JUDU7YL4.js} +11 -11
  339. package/dist/cli-bundle/chunks/{validate-MTUVL5VC.js → validate-732RWS5W.js} +440 -320
  340. package/dist/cli-bundle/chunks/validate-732RWS5W.js.map +7 -0
  341. package/dist/cli-bundle/chunks/{validate-X5W76YJL.js → validate-W7H5TEDC.js} +441 -321
  342. package/dist/cli-bundle/chunks/validate-W7H5TEDC.js.map +1 -0
  343. package/dist/cli-bundle/main.js +945 -812
  344. package/dist/cli-bundle/main.js.map +3 -3
  345. package/dist/core/config/nested-settings.js +89 -67
  346. package/dist/core/config/nested-settings.js.map +1 -1
  347. package/dist/core/governance/metadata-coverage.js +20 -28
  348. package/dist/core/governance/metadata-coverage.js.map +1 -1
  349. package/dist/core/history/drift-scan.js +93 -81
  350. package/dist/core/history/drift-scan.js.map +1 -1
  351. package/dist/core/item/item-type-definition.js +14 -14
  352. package/dist/core/item/item-type-definition.js.map +1 -1
  353. package/dist/core/item/type-registry.js +87 -82
  354. package/dist/core/item/type-registry.js.map +1 -1
  355. package/dist/core/output/mutation-projection.js +42 -26
  356. package/dist/core/output/mutation-projection.js.map +1 -1
  357. package/dist/core/schema/runtime-schema.js +34 -28
  358. package/dist/core/schema/runtime-schema.js.map +1 -1
  359. package/dist/core/search/semantic-defaults.js +64 -37
  360. package/dist/core/search/semantic-defaults.js.map +1 -1
  361. package/dist/core/search/vector-stores.js +32 -17
  362. package/dist/core/search/vector-stores.js.map +1 -1
  363. package/dist/core/sentry/helpers.js +31 -28
  364. package/dist/core/sentry/helpers.js.map +1 -1
  365. package/dist/core/sentry/instrument.js +54 -43
  366. package/dist/core/sentry/instrument.js.map +1 -1
  367. package/dist/core/store/front-matter-cache.js +239 -153
  368. package/dist/core/store/front-matter-cache.js.map +1 -1
  369. package/dist/core/store/item-store.js +33 -26
  370. package/dist/core/store/item-store.js.map +1 -1
  371. package/dist/core/store/settings.js +247 -203
  372. package/dist/core/store/settings.js.map +1 -1
  373. package/dist/core/test/background-runs.js +189 -160
  374. package/dist/core/test/background-runs.js.map +1 -1
  375. package/package.json +2 -2
  376. package/packages/pm-beads/extensions/beads/runtime.ts +240 -167
  377. package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +65 -58
  378. package/packages/pm-todos/extensions/todos/runtime.ts +65 -42
  379. package/dist/cli-bundle/chunks/activity-AW6XVFH6.js +0 -16
  380. package/dist/cli-bundle/chunks/aggregate-JTEF4BP7.js.map +0 -1
  381. package/dist/cli-bundle/chunks/chunk-2D4HATP2.js.map +0 -1
  382. package/dist/cli-bundle/chunks/chunk-3S2KT7NG.js.map +0 -7
  383. package/dist/cli-bundle/chunks/chunk-3VGN2UWE.js.map +0 -1
  384. package/dist/cli-bundle/chunks/chunk-3XZCOZ5J.js.map +0 -1
  385. package/dist/cli-bundle/chunks/chunk-4DSGXSBL.js.map +0 -7
  386. package/dist/cli-bundle/chunks/chunk-4XOIEKSD.js.map +0 -1
  387. package/dist/cli-bundle/chunks/chunk-55SNVXRQ.js.map +0 -7
  388. package/dist/cli-bundle/chunks/chunk-5CGRF3L5.js.map +0 -1
  389. package/dist/cli-bundle/chunks/chunk-7R4QEMZZ.js.map +0 -1
  390. package/dist/cli-bundle/chunks/chunk-BDTISOSD.js.map +0 -7
  391. package/dist/cli-bundle/chunks/chunk-BZCEN4JA.js.map +0 -7
  392. package/dist/cli-bundle/chunks/chunk-CF7RL6FR.js.map +0 -1
  393. package/dist/cli-bundle/chunks/chunk-FFMQB7WR.js.map +0 -1
  394. package/dist/cli-bundle/chunks/chunk-IPYBJWTE.js.map +0 -7
  395. package/dist/cli-bundle/chunks/chunk-IZBR4NRW.js.map +0 -7
  396. package/dist/cli-bundle/chunks/chunk-JSU5P7VS.js.map +0 -1
  397. package/dist/cli-bundle/chunks/chunk-JWXRETDF.js.map +0 -1
  398. package/dist/cli-bundle/chunks/chunk-KNPEF7QG.js.map +0 -7
  399. package/dist/cli-bundle/chunks/chunk-NFDPYAIP.js.map +0 -7
  400. package/dist/cli-bundle/chunks/chunk-NUHHPVVS.js.map +0 -7
  401. package/dist/cli-bundle/chunks/chunk-NWMZWYYB.js.map +0 -1
  402. package/dist/cli-bundle/chunks/chunk-OTUHB4HS.js.map +0 -1
  403. package/dist/cli-bundle/chunks/chunk-RGEMWD6Q.js.map +0 -7
  404. package/dist/cli-bundle/chunks/chunk-RLDHZHQS.js.map +0 -1
  405. package/dist/cli-bundle/chunks/chunk-RMMQ74TG.js.map +0 -7
  406. package/dist/cli-bundle/chunks/chunk-RVUALSJF.js.map +0 -7
  407. package/dist/cli-bundle/chunks/chunk-TP5Q5ZD3.js.map +0 -1
  408. package/dist/cli-bundle/chunks/chunk-UYUYDGIB.js.map +0 -1
  409. package/dist/cli-bundle/chunks/chunk-V3NOKJF2.js.map +0 -1
  410. package/dist/cli-bundle/chunks/chunk-VARHOHYV.js.map +0 -7
  411. package/dist/cli-bundle/chunks/chunk-YITK2PJ6.js.map +0 -7
  412. package/dist/cli-bundle/chunks/chunk-ZETXE4SE.js.map +0 -1
  413. package/dist/cli-bundle/chunks/close-E6ZZGCJY.js +0 -14
  414. package/dist/cli-bundle/chunks/close-many-BG5QQIDQ.js.map +0 -7
  415. package/dist/cli-bundle/chunks/close-many-LDRVEQY2.js.map +0 -1
  416. package/dist/cli-bundle/chunks/config-DMSU64QO.js +0 -1541
  417. package/dist/cli-bundle/chunks/config-DMSU64QO.js.map +0 -7
  418. package/dist/cli-bundle/chunks/config-QH2DICD6.js +0 -1531
  419. package/dist/cli-bundle/chunks/config-QH2DICD6.js.map +0 -1
  420. package/dist/cli-bundle/chunks/contracts-HN7ABKLP.js.map +0 -7
  421. package/dist/cli-bundle/chunks/contracts-W4FZVVD6.js.map +0 -1
  422. package/dist/cli-bundle/chunks/create-OH3BDGBB.js +0 -28
  423. package/dist/cli-bundle/chunks/get-A7MAOHCU.js.map +0 -7
  424. package/dist/cli-bundle/chunks/get-DSDEKJ3L.js.map +0 -1
  425. package/dist/cli-bundle/chunks/health-3IPFLKXB.js.map +0 -1
  426. package/dist/cli-bundle/chunks/health-GZXGBZ36.js.map +0 -7
  427. package/dist/cli-bundle/chunks/history-WSZHY3PN.js +0 -18
  428. package/dist/cli-bundle/chunks/history-compact-2WRZ2WK4.js.map +0 -7
  429. package/dist/cli-bundle/chunks/history-compact-HR7BB4LR.js.map +0 -1
  430. package/dist/cli-bundle/chunks/history-redact-MP6CH7U5.js +0 -19
  431. package/dist/cli-bundle/chunks/history-repair-LCMOS45X.js.map +0 -7
  432. package/dist/cli-bundle/chunks/history-repair-XA3LC4GA.js.map +0 -1
  433. package/dist/cli-bundle/chunks/init-PAX32BJA.js +0 -22
  434. package/dist/cli-bundle/chunks/next-BCERKDUR.js.map +0 -7
  435. package/dist/cli-bundle/chunks/next-FYTQF6HG.js.map +0 -1
  436. package/dist/cli-bundle/chunks/plan-4WXEQCTN.js.map +0 -7
  437. package/dist/cli-bundle/chunks/plan-RKZHQVXR.js.map +0 -1
  438. package/dist/cli-bundle/chunks/register-list-query-7LV46VAU.js.map +0 -1
  439. package/dist/cli-bundle/chunks/register-list-query-SNG5PGA4.js.map +0 -7
  440. package/dist/cli-bundle/chunks/register-mutation-ENNDUAZG.js.map +0 -1
  441. package/dist/cli-bundle/chunks/register-mutation-KK7PHYYU.js.map +0 -7
  442. package/dist/cli-bundle/chunks/register-operations-C6OWLDSH.js.map +0 -1
  443. package/dist/cli-bundle/chunks/register-operations-HZ6XERQG.js.map +0 -7
  444. package/dist/cli-bundle/chunks/register-setup-P67EMBDJ.js.map +0 -1
  445. package/dist/cli-bundle/chunks/register-setup-ZKJ53RS7.js.map +0 -7
  446. package/dist/cli-bundle/chunks/restore-YALDGTQR.js +0 -17
  447. package/dist/cli-bundle/chunks/telemetry-BZUF6H7G.js.map +0 -1
  448. package/dist/cli-bundle/chunks/telemetry-GAHHQTOS.js.map +0 -7
  449. package/dist/cli-bundle/chunks/test-all-L2MDDUCA.js +0 -358
  450. package/dist/cli-bundle/chunks/test-all-L2MDDUCA.js.map +0 -1
  451. package/dist/cli-bundle/chunks/test-all-RBZ6DLU2.js +0 -361
  452. package/dist/cli-bundle/chunks/test-all-RBZ6DLU2.js.map +0 -7
  453. package/dist/cli-bundle/chunks/test-runs-PLRAZEFW.js.map +0 -7
  454. package/dist/cli-bundle/chunks/test-runs-UXIXPDKU.js.map +0 -1
  455. package/dist/cli-bundle/chunks/update-AMRSOIWP.js +0 -24
  456. package/dist/cli-bundle/chunks/validate-MTUVL5VC.js.map +0 -7
  457. package/dist/cli-bundle/chunks/validate-X5W76YJL.js.map +0 -1
  458. /package/dist/cli-bundle/chunks/{activity-DBLQVIP6.js.map → activity-CUC4JY3U.js.map} +0 -0
  459. /package/dist/cli-bundle/chunks/{activity-AW6XVFH6.js.map → activity-WEIEMM73.js.map} +0 -0
  460. /package/dist/cli-bundle/chunks/{append-QCFJSDFL.js.map → append-H32VOR2Y.js.map} +0 -0
  461. /package/dist/cli-bundle/chunks/{append-LOVPGVPT.js.map → append-UBM632FK.js.map} +0 -0
  462. /package/dist/cli-bundle/chunks/{chunk-SLMUGTK3.js.map → chunk-2ASNV4DH.js.map} +0 -0
  463. /package/dist/cli-bundle/chunks/{chunk-UZIWVBE6.js.map → chunk-2CHRYUXL.js.map} +0 -0
  464. /package/dist/cli-bundle/chunks/{chunk-NU2UEROZ.js.map → chunk-3AZUFQK6.js.map} +0 -0
  465. /package/dist/cli-bundle/chunks/{chunk-LB6TP6MC.js.map → chunk-3LCUASYG.js.map} +0 -0
  466. /package/dist/cli-bundle/chunks/{chunk-HPPFYYOV.js.map → chunk-3Q2HBMTI.js.map} +0 -0
  467. /package/dist/cli-bundle/chunks/{chunk-W4ULYO7Z.js.map → chunk-55XRYWEG.js.map} +0 -0
  468. /package/dist/cli-bundle/chunks/{chunk-HXTQJXWT.js.map → chunk-5GVTFFTC.js.map} +0 -0
  469. /package/dist/cli-bundle/chunks/{chunk-64HNBBFQ.js.map → chunk-A6VOGKBA.js.map} +0 -0
  470. /package/dist/cli-bundle/chunks/{chunk-WYDHYJPO.js.map → chunk-AIAIXG7I.js.map} +0 -0
  471. /package/dist/cli-bundle/chunks/{chunk-CWFNTKQJ.js.map → chunk-AJEBCRIY.js.map} +0 -0
  472. /package/dist/cli-bundle/chunks/{chunk-NOLPZMSV.js.map → chunk-BTX5MIQF.js.map} +0 -0
  473. /package/dist/cli-bundle/chunks/{chunk-RH5ZBYFD.js.map → chunk-BVZZN2LH.js.map} +0 -0
  474. /package/dist/cli-bundle/chunks/{chunk-27BXPBAY.js.map → chunk-CYBDUHNO.js.map} +0 -0
  475. /package/dist/cli-bundle/chunks/{chunk-A7FPBAQS.js.map → chunk-CZPVDLD2.js.map} +0 -0
  476. /package/dist/cli-bundle/chunks/{chunk-JPECA746.js.map → chunk-EUKTMRN3.js.map} +0 -0
  477. /package/dist/cli-bundle/chunks/{chunk-2466X6E4.js.map → chunk-FFOQHGNH.js.map} +0 -0
  478. /package/dist/cli-bundle/chunks/{chunk-JLM7BHI7.js.map → chunk-GFMSLORL.js.map} +0 -0
  479. /package/dist/cli-bundle/chunks/{chunk-SDR5J34Q.js.map → chunk-GRRG3MCT.js.map} +0 -0
  480. /package/dist/cli-bundle/chunks/{chunk-GJ326ZKX.js.map → chunk-H4GRLYJS.js.map} +0 -0
  481. /package/dist/cli-bundle/chunks/{chunk-OGXLACHC.js.map → chunk-HQTPRV4D.js.map} +0 -0
  482. /package/dist/cli-bundle/chunks/{chunk-BHO33VBQ.js.map → chunk-IEEJQCZ4.js.map} +0 -0
  483. /package/dist/cli-bundle/chunks/{chunk-4DUVCVLZ.js.map → chunk-JMK5GCK2.js.map} +0 -0
  484. /package/dist/cli-bundle/chunks/{chunk-AXIDKKAT.js.map → chunk-K2VYLVX4.js.map} +0 -0
  485. /package/dist/cli-bundle/chunks/{chunk-EJUDVUYZ.js.map → chunk-KCO2EAN5.js.map} +0 -0
  486. /package/dist/cli-bundle/chunks/{chunk-6AQZPVHQ.js.map → chunk-KIYCOJ63.js.map} +0 -0
  487. /package/dist/cli-bundle/chunks/{chunk-ZRP4VG5U.js.map → chunk-KLXF7NCC.js.map} +0 -0
  488. /package/dist/cli-bundle/chunks/{chunk-QCWF6IYD.js.map → chunk-KN3URLKS.js.map} +0 -0
  489. /package/dist/cli-bundle/chunks/{chunk-N74UMG5H.js.map → chunk-LRKMWUUV.js.map} +0 -0
  490. /package/dist/cli-bundle/chunks/{chunk-AVEE5EHK.js.map → chunk-LTRAF2D7.js.map} +0 -0
  491. /package/dist/cli-bundle/chunks/{chunk-IJYK2T43.js.map → chunk-MRD4T5LF.js.map} +0 -0
  492. /package/dist/cli-bundle/chunks/{chunk-G7I7DEZA.js.map → chunk-N2JSWVWG.js.map} +0 -0
  493. /package/dist/cli-bundle/chunks/{chunk-5QFDBI4F.js.map → chunk-N3QCJS4M.js.map} +0 -0
  494. /package/dist/cli-bundle/chunks/{chunk-4A3BJ675.js.map → chunk-OTUJZKGI.js.map} +0 -0
  495. /package/dist/cli-bundle/chunks/{chunk-HZZEHPRG.js.map → chunk-QH3FSKRJ.js.map} +0 -0
  496. /package/dist/cli-bundle/chunks/{chunk-NKZAN7BD.js.map → chunk-S62UANU7.js.map} +0 -0
  497. /package/dist/cli-bundle/chunks/{chunk-3J6JRJ3I.js.map → chunk-SYNKD3ZG.js.map} +0 -0
  498. /package/dist/cli-bundle/chunks/{chunk-L5OEFZQG.js.map → chunk-U2BEEM2X.js.map} +0 -0
  499. /package/dist/cli-bundle/chunks/{chunk-EVMTBV6V.js.map → chunk-UT73HUPC.js.map} +0 -0
  500. /package/dist/cli-bundle/chunks/{chunk-VICZWYGZ.js.map → chunk-UTSH5GWX.js.map} +0 -0
  501. /package/dist/cli-bundle/chunks/{chunk-MDPEOIGN.js.map → chunk-XWGEMNBR.js.map} +0 -0
  502. /package/dist/cli-bundle/chunks/{chunk-HYTGA6GI.js.map → chunk-Y4NRKBFW.js.map} +0 -0
  503. /package/dist/cli-bundle/chunks/{chunk-22WKIL3H.js.map → chunk-YPKFV2JR.js.map} +0 -0
  504. /package/dist/cli-bundle/chunks/{chunk-DDPTYJIM.js.map → chunk-ZNHEYCDD.js.map} +0 -0
  505. /package/dist/cli-bundle/chunks/{chunk-MAUKX7JC.js.map → chunk-ZNT7KEWE.js.map} +0 -0
  506. /package/dist/cli-bundle/chunks/{claim-T3GCKV7C.js.map → claim-SENTPZBN.js.map} +0 -0
  507. /package/dist/cli-bundle/chunks/{claim-EMQLYPRW.js.map → claim-Z7MEQCBT.js.map} +0 -0
  508. /package/dist/cli-bundle/chunks/{close-TQYAAFJP.js.map → close-424MX4CU.js.map} +0 -0
  509. /package/dist/cli-bundle/chunks/{close-E6ZZGCJY.js.map → close-YCWQQPDS.js.map} +0 -0
  510. /package/dist/cli-bundle/chunks/{comments-YUXJRZPQ.js.map → comments-4FGNTSNV.js.map} +0 -0
  511. /package/dist/cli-bundle/chunks/{comments-QCKR2YY2.js.map → comments-7YS5MY5X.js.map} +0 -0
  512. /package/dist/cli-bundle/chunks/{context-OCZ3FJ4Z.js.map → context-LHVKJSPJ.js.map} +0 -0
  513. /package/dist/cli-bundle/chunks/{context-B6275WPX.js.map → context-ZQY54JNS.js.map} +0 -0
  514. /package/dist/cli-bundle/chunks/{copy-DEM4DATS.js.map → copy-GYNQQPW2.js.map} +0 -0
  515. /package/dist/cli-bundle/chunks/{copy-BTJOSKKT.js.map → copy-TLW7JTQT.js.map} +0 -0
  516. /package/dist/cli-bundle/chunks/{create-RLRJMRTM.js.map → create-VSKYSOCD.js.map} +0 -0
  517. /package/dist/cli-bundle/chunks/{create-OH3BDGBB.js.map → create-XTMAPS7I.js.map} +0 -0
  518. /package/dist/cli-bundle/chunks/{delete-LSVHAB4Y.js.map → delete-4W5JYCEG.js.map} +0 -0
  519. /package/dist/cli-bundle/chunks/{delete-BHK7VB2Z.js.map → delete-ANTOTI2I.js.map} +0 -0
  520. /package/dist/cli-bundle/chunks/{deps-XHYXWEPT.js.map → deps-HPPE6MJN.js.map} +0 -0
  521. /package/dist/cli-bundle/chunks/{deps-4UDFJRUA.js.map → deps-ZQZN54EZ.js.map} +0 -0
  522. /package/dist/cli-bundle/chunks/{docs-GYZNVS26.js.map → docs-RPOVFMP3.js.map} +0 -0
  523. /package/dist/cli-bundle/chunks/{docs-26S44RXU.js.map → docs-XJNYBJGE.js.map} +0 -0
  524. /package/dist/cli-bundle/chunks/{eval-PGRVIJQU.js.map → eval-DM6JBZTS.js.map} +0 -0
  525. /package/dist/cli-bundle/chunks/{eval-UYF3ZPVO.js.map → eval-RFBI5FGS.js.map} +0 -0
  526. /package/dist/cli-bundle/chunks/{extension-CPSLJQVE.js.map → extension-B3YY4WY5.js.map} +0 -0
  527. /package/dist/cli-bundle/chunks/{extension-CXJ6RELI.js.map → extension-TTSEFQTS.js.map} +0 -0
  528. /package/dist/cli-bundle/chunks/{files-NQHEXUZD.js.map → files-5D65CHGE.js.map} +0 -0
  529. /package/dist/cli-bundle/chunks/{files-MBNICQFM.js.map → files-GPIG77EN.js.map} +0 -0
  530. /package/dist/cli-bundle/chunks/{focus-XZW5423D.js.map → focus-C3PEJV2C.js.map} +0 -0
  531. /package/dist/cli-bundle/chunks/{focus-DWYIG7GU.js.map → focus-ZHN7WIGX.js.map} +0 -0
  532. /package/dist/cli-bundle/chunks/{gc-LPVMKJQJ.js.map → gc-D4JQ6OWN.js.map} +0 -0
  533. /package/dist/cli-bundle/chunks/{gc-7GQYOS2G.js.map → gc-VZIXDL32.js.map} +0 -0
  534. /package/dist/cli-bundle/chunks/{history-WSZHY3PN.js.map → history-DD7L7BNL.js.map} +0 -0
  535. /package/dist/cli-bundle/chunks/{history-NERDJNUB.js.map → history-IL7XCEX2.js.map} +0 -0
  536. /package/dist/cli-bundle/chunks/{history-redact-MP6CH7U5.js.map → history-redact-IX4YEWMY.js.map} +0 -0
  537. /package/dist/cli-bundle/chunks/{history-redact-O3NBCNWC.js.map → history-redact-VYCWQFK7.js.map} +0 -0
  538. /package/dist/cli-bundle/chunks/{init-64XDLQJB.js.map → init-F27NHENZ.js.map} +0 -0
  539. /package/dist/cli-bundle/chunks/{init-PAX32BJA.js.map → init-HHVQQP6C.js.map} +0 -0
  540. /package/dist/cli-bundle/chunks/{learnings-LPKCSJX7.js.map → learnings-HJVDQIGY.js.map} +0 -0
  541. /package/dist/cli-bundle/chunks/{learnings-JR6MA5TI.js.map → learnings-XSFSUUWK.js.map} +0 -0
  542. /package/dist/cli-bundle/chunks/{list-G5Y65VF6.js.map → list-HPMEKCAA.js.map} +0 -0
  543. /package/dist/cli-bundle/chunks/{list-DNBJVO3E.js.map → list-VMPWTURB.js.map} +0 -0
  544. /package/dist/cli-bundle/chunks/{notes-2BMU3VVQ.js.map → notes-GDZIKGR6.js.map} +0 -0
  545. /package/dist/cli-bundle/chunks/{notes-6KTGO2OJ.js.map → notes-WDDBPC4D.js.map} +0 -0
  546. /package/dist/cli-bundle/chunks/{profile-QLER5ENE.js.map → profile-CCOKZ2IQ.js.map} +0 -0
  547. /package/dist/cli-bundle/chunks/{profile-4OMM32CD.js.map → profile-HUCENIEQ.js.map} +0 -0
  548. /package/dist/cli-bundle/chunks/{restore-4MHZFJ2E.js.map → restore-4CBWUMCX.js.map} +0 -0
  549. /package/dist/cli-bundle/chunks/{restore-YALDGTQR.js.map → restore-5UEAGG3W.js.map} +0 -0
  550. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-LB6DOLRL.js.map → scheduling-shortcuts-6VFKNKCM.js.map} +0 -0
  551. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-UTOYKLXQ.js.map → scheduling-shortcuts-ERHCVTEM.js.map} +0 -0
  552. /package/dist/cli-bundle/chunks/{schema-73HR2OJW.js.map → schema-TDGK6N3I.js.map} +0 -0
  553. /package/dist/cli-bundle/chunks/{schema-U6LJKSIR.js.map → schema-UE5KKAUX.js.map} +0 -0
  554. /package/dist/cli-bundle/chunks/{search-KILGT37L.js.map → search-FP7MEU4S.js.map} +0 -0
  555. /package/dist/cli-bundle/chunks/{search-AXPXKZER.js.map → search-K4CFLQ5S.js.map} +0 -0
  556. /package/dist/cli-bundle/chunks/{stats-PSYVVTNZ.js.map → stats-NJJCALEZ.js.map} +0 -0
  557. /package/dist/cli-bundle/chunks/{stats-W5KNVJWQ.js.map → stats-XT6QRKQY.js.map} +0 -0
  558. /package/dist/cli-bundle/chunks/{test-ACD52Z3S.js.map → test-UFSJ5YIO.js.map} +0 -0
  559. /package/dist/cli-bundle/chunks/{test-PWDIZ255.js.map → test-YCDAUBWF.js.map} +0 -0
  560. /package/dist/cli-bundle/chunks/{update-AMRSOIWP.js.map → update-MTCFES6X.js.map} +0 -0
  561. /package/dist/cli-bundle/chunks/{update-KFX2SIAC.js.map → update-Y5WQVT5O.js.map} +0 -0
  562. /package/dist/cli-bundle/chunks/{upgrade-HAK6JG2O.js.map → upgrade-DTAHZ236.js.map} +0 -0
  563. /package/dist/cli-bundle/chunks/{upgrade-BRL6KCOJ.js.map → upgrade-JUDU7YL4.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../../core/item/status-filter.ts", "../../../../../../../../core/schema/runtime-field-filters.ts", "../../../../../../../../cli/commands/list.ts"],
4
- "sourcesContent": ["/**\n * @module core/item/status-filter\n *\n * Defines item parsing, formatting, and lifecycle helpers for Status Filter.\n */\nimport { EXIT_CODE } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\nimport { levenshteinDistanceWithinLimit } from \"../shared/levenshtein.js\";\nimport type { RuntimeStatusRegistry } from \"../schema/runtime-schema.js\";\nimport type { ItemStatus } from \"../../types/index.js\";\nimport { normalizeStatusInput } from \"./status.js\";\n\n// Workflow-group aliases shared by every status-filter consumer so that the\n// agent-friendly `open`/`closed`/`canceled` shorthands resolve to whatever the\n// runtime workflow has configured as its open/close/cancel anchors, rather than\n// hardcoding the built-in status ids. `cancelled` is accepted as a spelling\n// variant of `canceled`.\nconst STATUS_GROUP_ALIASES: Readonly<Record<string, \"open_status\" | \"close_status\" | \"canceled_status\">> = {\n open: \"open_status\",\n closed: \"close_status\",\n canceled: \"canceled_status\",\n cancelled: \"canceled_status\",\n};\n\nconst STATUS_ALL_SENTINEL = \"all\";\n\n/** Return true when a status-filter input is the standalone all-status sentinel. */\nexport function isStatusAllFilterInput(raw: unknown): boolean {\n if (typeof raw !== \"string\") {\n return false;\n }\n const tokens = raw\n .split(\",\")\n .map((entry) => entry.trim().toLowerCase())\n .filter((entry) => entry.length > 0);\n return tokens.length === 1 && tokens[0] === STATUS_ALL_SENTINEL;\n}\n\n/**\n * Resolve a single status-filter token to a concrete runtime status id.\n *\n * Returns `undefined` when the token is not a recognized workflow-group alias\n * (open/closed/canceled) and does not normalize to a known registry status.\n * Callers decide whether an unrecognized token is an error (strict mode) or is\n * passed through verbatim (lenient mode) — see {@link parseStatusFilterCsv}.\n */\nexport function resolveStatusFilterToken(\n token: string,\n registry: RuntimeStatusRegistry,\n): ItemStatus | undefined {\n const trimmed = token.trim().toLowerCase();\n if (trimmed.length === 0) {\n return undefined;\n }\n const group = STATUS_GROUP_ALIASES[trimmed];\n if (group) {\n return registry[group] as ItemStatus;\n }\n return normalizeStatusInput(token, registry);\n}\n\nfunction collectStatusSuggestionCandidates(registry: RuntimeStatusRegistry): string[] {\n const candidates = new Set<string>(Object.keys(STATUS_GROUP_ALIASES));\n for (const definition of registry.definitions) {\n candidates.add(definition.id);\n for (const alias of definition.aliases) {\n candidates.add(alias);\n }\n }\n return [...candidates];\n}\n\nfunction suggestClosestStatus(value: string, registry: RuntimeStatusRegistry): string | undefined {\n // Only ever called for an unresolved, already-non-empty token (parseStatusFilterCsv\n // filters blanks first), so no empty-input guard is needed here.\n const normalized = value.trim().toLowerCase();\n let best: string | undefined;\n let bestDistance = Number.POSITIVE_INFINITY;\n for (const candidate of collectStatusSuggestionCandidates(registry)) {\n const distance = levenshteinDistanceWithinLimit(normalized, candidate.toLowerCase(), 2);\n if (distance !== null && distance < bestDistance) {\n best = candidate;\n bestDistance = distance;\n }\n }\n return best;\n}\n\n/**\n * Documents the parse status filter options payload exchanged by command, SDK, and package integrations.\n */\nexport interface ParseStatusFilterOptions {\n /**\n * When true, an unrecognized token throws a USAGE error with a did-you-mean\n * hint. When false (default), an unrecognized token is passed through\n * verbatim so custom/unknown statuses still compare against item values by\n * their raw string — preserving the long-standing lenient `pm list` behavior.\n */\n strict?: boolean;\n /** Flag label used in error messages (default: \"--status\"). */\n flagLabel?: string;\n}\n\n/**\n * Parse a comma-separated status filter into a de-duplicated list of concrete\n * status ids. A standalone `all` sentinel intentionally resolves to no filter\n * so duplicate-discovery loops can search every lifecycle bucket with the same\n * `--status` flag shape. Shared by `pm list` (lenient) and `pm search`\n * (strict, with a did-you-mean hint on typos) so both surfaces resolve the\n * open/closed/canceled workflow-group aliases identically.\n */\nexport function parseStatusFilterCsv(\n raw: unknown,\n registry: RuntimeStatusRegistry,\n options?: ParseStatusFilterOptions,\n): ItemStatus[] | undefined {\n if (typeof raw !== \"string\") {\n return undefined;\n }\n const strict = options?.strict === true;\n const flagLabel = options?.flagLabel ?? \"--status\";\n const tokens = raw\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n if (tokens.length === 0) {\n return undefined;\n }\n const allTokenCount = tokens.filter((token) => token.trim().toLowerCase() === STATUS_ALL_SENTINEL).length;\n if (allTokenCount > 0) {\n if (tokens.length === 1) {\n return undefined;\n }\n throw new PmCliError(\n `Invalid ${flagLabel} value \"all\". Use it by itself, or omit ${flagLabel} to search every status.`,\n EXIT_CODE.USAGE,\n );\n }\n const resolved: ItemStatus[] = [];\n for (const token of tokens) {\n const status = resolveStatusFilterToken(token, registry);\n if (status === undefined) {\n if (strict) {\n const suggestion = suggestClosestStatus(token, registry);\n throw new PmCliError(\n `Invalid ${flagLabel} value \"${token}\". Use open|closed|canceled or a configured status id${\n suggestion ? `. Did you mean \"${suggestion}\"?` : \".\"\n }`,\n EXIT_CODE.USAGE,\n );\n }\n resolved.push(token as ItemStatus);\n continue;\n }\n resolved.push(status);\n }\n return [...new Set(resolved)];\n}\n", "/**\n * @module core/schema/runtime-field-filters\n *\n * Resolves configurable schema, fields, statuses, and workflows for Runtime Field Filters.\n */\nimport { coerceRuntimeFieldValue, readRuntimeFieldOptionValue } from \"./runtime-field-values.js\";\nimport type { RuntimeFieldCommand, RuntimeFieldRegistry } from \"./runtime-schema.js\";\nimport { stableValueEquals } from \"../shared/serialization.js\";\n\nfunction valuesEqual(left: unknown, right: unknown): boolean {\n return stableValueEquals(left, right);\n}\n\n/**\n * Implements collect runtime filter values for the public runtime surface of this module.\n */\nexport function collectRuntimeFilterValues(\n options: Record<string, unknown>,\n fieldRegistry: RuntimeFieldRegistry,\n command: RuntimeFieldCommand,\n): Record<string, unknown> {\n const filters: Record<string, unknown> = {};\n for (const definition of fieldRegistry.command_to_fields.get(command) ?? []) {\n const rawValue = readRuntimeFieldOptionValue(options, definition);\n if (rawValue === undefined) {\n continue;\n }\n filters[definition.metadata_key] = coerceRuntimeFieldValue(definition, rawValue);\n }\n return filters;\n}\n\n/**\n * Implements matches runtime filters for the public runtime surface of this module.\n */\nexport function matchesRuntimeFilters(item: Record<string, unknown>, filters: Record<string, unknown>): boolean {\n for (const [fieldKey, expectedValue] of Object.entries(filters)) {\n const actualValue = item[fieldKey];\n if (Array.isArray(expectedValue)) {\n if (Array.isArray(actualValue)) {\n const normalizedActual = actualValue.map((value) => String(value));\n const normalizedExpected = expectedValue.map((value) => String(value));\n if (!normalizedExpected.every((value) => normalizedActual.includes(value))) {\n return false;\n }\n continue;\n }\n if (!valuesEqual(actualValue, expectedValue[expectedValue.length - 1])) {\n return false;\n }\n continue;\n }\n if (!valuesEqual(actualValue, expectedValue)) {\n return false;\n }\n }\n return true;\n}\n", "/**\n * @module cli/commands/list\n *\n * Implements the pm list command surface and its agent-facing runtime behavior.\n */\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { getActiveExtensionRegistrations } from \"../../core/extensions/index.js\";\nimport { toItemRecord } from \"../../core/item/item-record.js\";\nimport { isTerminalStatus } from \"../../core/item/status.js\";\nimport { isStatusAllFilterInput, parseStatusFilterCsv } from \"../../core/item/status-filter.js\";\nimport { resolveItemTypeRegistry, type ItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { parseIntegerLimit, parsePriority, parseType } from \"../shared-parsers.js\";\nimport { collectRuntimeFilterValues, matchesRuntimeFilters } from \"../../core/schema/runtime-field-filters.js\";\nimport {\n hasMissingMetadataFilter,\n itemMatchesMissingMetadata,\n lifecycleClassifierFromStatusRegistry,\n type MissingMetadataFilters,\n} from \"../../core/governance/metadata-coverage.js\";\nimport {\n contentFiltersNeedBody,\n contentFiltersNeedCollections,\n hasContentFieldFilter,\n itemMatchesContentFilters,\n type ContentField,\n type ContentFieldFilters,\n} from \"../../core/governance/content-fields.js\";\nimport {\n resolveRuntimeFieldRegistry,\n resolveRuntimeStatusRegistry,\n type RuntimeStatusRegistry,\n} from \"../../core/schema/runtime-schema.js\";\nimport { EXIT_CODE, FRONT_MATTER_KEY_ORDER } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { compareTimestampStrings, nowIso, resolveIsoOrRelative } from \"../../core/shared/time.js\";\nimport { listAllFrontMatter, listAllFrontMatterLight, listAllFrontMatterWithBody } from \"../../core/store/item-store.js\";\nimport { HEAVY_METADATA_KEYS } from \"../../core/store/front-matter-cache.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemFrontMatter, ItemStatus, ItemType } from \"../../types/index.js\";\nimport type { SharedItemFilterOptions } from \"./item-filter-options.js\";\n\n/**\n * Documents the list options payload exchanged by command, SDK, and package integrations.\n */\nexport interface ListOptions extends SharedItemFilterOptions {\n ids?: string;\n assigneeFilter?: string;\n limit?: string;\n offset?: string;\n noTruncate?: boolean;\n includeBody?: boolean;\n compact?: boolean;\n brief?: boolean;\n full?: boolean;\n fields?: string;\n sort?: string;\n order?: string;\n tree?: boolean;\n treeDepth?: string;\n excludeTerminal?: boolean;\n filterAcMissing?: boolean;\n filterEstimatesMissing?: boolean;\n filterResolutionMissing?: boolean;\n filterMetadataMissing?: boolean;\n}\n\n/** Extract the missing-metadata selection filters from list/update-many options. */\nexport function resolveMissingMetadataFilters(options: {\n filterAcMissing?: boolean;\n filterEstimatesMissing?: boolean;\n filterResolutionMissing?: boolean;\n filterMetadataMissing?: boolean;\n filterReviewerMissing?: boolean;\n filterRiskMissing?: boolean;\n filterConfidenceMissing?: boolean;\n filterSprintMissing?: boolean;\n filterReleaseMissing?: boolean;\n}): MissingMetadataFilters {\n return {\n acMissing: options.filterAcMissing === true,\n estimatesMissing: options.filterEstimatesMissing === true,\n resolutionMissing: options.filterResolutionMissing === true,\n metadataMissing: options.filterMetadataMissing === true,\n reviewerMissing: options.filterReviewerMissing === true,\n riskMissing: options.filterRiskMissing === true,\n confidenceMissing: options.filterConfidenceMissing === true,\n sprintMissing: options.filterSprintMissing === true,\n releaseMissing: options.filterReleaseMissing === true,\n };\n}\n\n/** Per content field: the present flag and the absence flag on the options shape. */\ninterface ContentFieldFlagMapping {\n field: ContentField;\n presentKey: string;\n absentKey: string;\n /** Human flag names used in the conflict error message. */\n presentFlag: string;\n absentFlag: string;\n}\n\nconst CONTENT_FIELD_FLAG_MAPPINGS: readonly ContentFieldFlagMapping[] = [\n { field: \"notes\", presentKey: \"hasNotes\", absentKey: \"noNotes\", presentFlag: \"--has-notes\", absentFlag: \"--no-notes\" },\n { field: \"learnings\", presentKey: \"hasLearnings\", absentKey: \"noLearnings\", presentFlag: \"--has-learnings\", absentFlag: \"--no-learnings\" },\n { field: \"files\", presentKey: \"hasFiles\", absentKey: \"noFiles\", presentFlag: \"--has-files\", absentFlag: \"--no-files\" },\n { field: \"docs\", presentKey: \"hasDocs\", absentKey: \"noDocs\", presentFlag: \"--has-docs\", absentFlag: \"--no-docs\" },\n { field: \"tests\", presentKey: \"hasTests\", absentKey: \"noTests\", presentFlag: \"--has-tests\", absentFlag: \"--no-tests\" },\n { field: \"comments\", presentKey: \"hasComments\", absentKey: \"noComments\", presentFlag: \"--has-comments\", absentFlag: \"--no-comments\" },\n { field: \"deps\", presentKey: \"hasDeps\", absentKey: \"noDeps\", presentFlag: \"--has-deps\", absentFlag: \"--no-deps\" },\n { field: \"body\", presentKey: \"hasBody\", absentKey: \"emptyBody\", presentFlag: \"--has-body\", absentFlag: \"--empty-body\" },\n { field: \"linked_command\", presentKey: \"hasLinkedCommand\", absentKey: \"noLinkedCommand\", presentFlag: \"--has-linked-command\", absentFlag: \"--no-linked-command\" },\n] as const;\n\n/**\n * Resolve the content-field presence/absence selections from list/search\n * options. A field requested both present AND absent is a usage error (the two\n * selections are mutually exclusive). Returns an empty object when no\n * content-field filter is active.\n */\nexport function resolveContentFieldFilters(options: Record<string, unknown>): ContentFieldFilters {\n const filters: ContentFieldFilters = {};\n for (const mapping of CONTENT_FIELD_FLAG_MAPPINGS) {\n const present = options[mapping.presentKey] === true;\n const absent = options[mapping.absentKey] === true;\n if (present && absent) {\n throw new PmCliError(\n `Cannot combine ${mapping.presentFlag} with ${mapping.absentFlag} for the same field.`,\n EXIT_CODE.USAGE,\n );\n }\n if (present) {\n filters[mapping.field] = \"present\";\n } else if (absent) {\n filters[mapping.field] = \"absent\";\n }\n }\n return filters;\n}\n\n/**\n * Restricts listed item values accepted by command, SDK, and storage contracts.\n */\nexport type ListedItem = ItemFrontMatter | (ItemFrontMatter & { body: string });\n\ntype ListProjectionMode = \"full\" | \"compact\" | \"fields\";\n\ninterface ListProjectionConfig {\n mode: ListProjectionMode;\n fields: string[];\n}\n\nexport const LIST_SORT_FIELDS = [\"priority\", \"deadline\", \"updated_at\", \"created_at\", \"title\", \"parent\"] as const;\n/**\n * Restricts list sort field values accepted by command, SDK, and storage contracts.\n */\nexport type ListSortField = (typeof LIST_SORT_FIELDS)[number];\n\nexport const LIST_SORT_ORDER_VALUES = [\"asc\", \"desc\"] as const;\n/**\n * Restricts list sort order values accepted by command, SDK, and storage contracts.\n */\nexport type ListSortOrder = (typeof LIST_SORT_ORDER_VALUES)[number];\n\nconst DEFAULT_COMPACT_LIST_FIELDS = [\"id\", \"title\", \"status\", \"type\", \"priority\", \"parent\", \"updated_at\"] as const;\nconst BRIEF_LIST_FIELDS = [\"id\", \"status\", \"type\", \"title\"] as const;\nconst TREE_METADATA_FIELDS = [\"tree_depth\", \"tree_parent\", \"tree_children\", \"tree_title\"] as const;\n\n// A projection that selects any heavy collection field (or `--full`, which returns\n// items verbatim) must load the full metadata; everything else takes the light path.\n// Sourced from the single HEAVY_METADATA_KEYS definition in the cache layer so the\n// light/heavy split can never drift between the cache and the projection routing.\nconst HEAVY_PROJECTION_FIELDS: ReadonlySet<string> = new Set<string>(HEAVY_METADATA_KEYS);\n\ninterface ListResultBase {\n items: ListedItem[];\n count: number;\n // Total rows matched before pagination; only emitted when --limit/--offset\n // omitted rows, so agents know how many remain (GH-154).\n total?: number;\n warnings?: string[];\n}\n\n/**\n * Documents the list compact result payload exchanged by command, SDK, and package integrations.\n */\nexport interface ListCompactResult extends ListResultBase {\n filters: Record<string, unknown>;\n projection?: undefined;\n sorting?: undefined;\n now?: undefined;\n}\n\n/**\n * Documents the list verbose result payload exchanged by command, SDK, and package integrations.\n */\nexport interface ListVerboseResult extends ListResultBase {\n filters: Record<string, unknown>;\n projection: {\n mode: ListProjectionMode;\n fields: string[] | null;\n };\n sorting: {\n sort: ListSortField | \"default\";\n order: ListSortOrder;\n };\n now: string;\n}\n\n/**\n * Restricts list result values accepted by command, SDK, and storage contracts.\n */\nexport type ListResult = ListCompactResult | ListVerboseResult;\n\nfunction isNonEmptyRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && Object.keys(value).length > 0;\n}\n\n// Active content-field filter flags, keyed by the options dest and the snake_case\n// summary key emitted in the filters echo (GH-242). Presence and absence are\n// distinct echo keys (has_notes vs no_notes; has_body vs empty_body).\nconst CONTENT_FILTER_ECHO_ENTRIES: ReadonlyArray<{ key: string; summaryKey: string }> = [\n { key: \"hasNotes\", summaryKey: \"has_notes\" },\n { key: \"hasLearnings\", summaryKey: \"has_learnings\" },\n { key: \"hasFiles\", summaryKey: \"has_files\" },\n { key: \"hasDocs\", summaryKey: \"has_docs\" },\n { key: \"hasTests\", summaryKey: \"has_tests\" },\n { key: \"hasComments\", summaryKey: \"has_comments\" },\n { key: \"hasDeps\", summaryKey: \"has_deps\" },\n { key: \"hasBody\", summaryKey: \"has_body\" },\n { key: \"hasLinkedCommand\", summaryKey: \"has_linked_command\" },\n { key: \"noNotes\", summaryKey: \"no_notes\" },\n { key: \"noLearnings\", summaryKey: \"no_learnings\" },\n { key: \"noFiles\", summaryKey: \"no_files\" },\n { key: \"noDocs\", summaryKey: \"no_docs\" },\n { key: \"noTests\", summaryKey: \"no_tests\" },\n { key: \"noComments\", summaryKey: \"no_comments\" },\n { key: \"noDeps\", summaryKey: \"no_deps\" },\n { key: \"emptyBody\", summaryKey: \"empty_body\" },\n { key: \"noLinkedCommand\", summaryKey: \"no_linked_command\" },\n] as const;\n\n// Active governance-missing filter flags (GH-236), keyed by options dest and the\n// snake_case summary key emitted in the filters echo.\nconst GOVERNANCE_MISSING_ECHO_ENTRIES: ReadonlyArray<{ key: string; summaryKey: string }> = [\n { key: \"filterReviewerMissing\", summaryKey: \"filter_reviewer_missing\" },\n { key: \"filterRiskMissing\", summaryKey: \"filter_risk_missing\" },\n { key: \"filterConfidenceMissing\", summaryKey: \"filter_confidence_missing\" },\n { key: \"filterSprintMissing\", summaryKey: \"filter_sprint_missing\" },\n { key: \"filterReleaseMissing\", summaryKey: \"filter_release_missing\" },\n] as const;\n\nfunction applyContentFilterEcho(filters: Record<string, unknown>, options: Record<string, unknown>): void {\n for (const entry of CONTENT_FILTER_ECHO_ENTRIES) {\n if (options[entry.key] === true) {\n filters[entry.summaryKey] = true;\n }\n }\n}\n\nfunction applyGovernanceMissingFilterEcho(filters: Record<string, unknown>, options: Record<string, unknown>): void {\n for (const entry of GOVERNANCE_MISSING_ECHO_ENTRIES) {\n if (options[entry.key] === true) {\n filters[entry.summaryKey] = true;\n }\n }\n}\n\ninterface FilterValueEchoEntry {\n optionKey: string;\n summaryKey: string;\n normalize?: (value: unknown) => unknown;\n}\n\n/**\n * Copies user-supplied option values into compact filter summaries.\n *\n * Compact list/search responses are optimized for agent context: they echo only\n * filters the caller actually supplied. Keeping this helper shared prevents the\n * list and search command summaries from drifting as new scalar filters are\n * added.\n */\nexport function applyFilterValueEcho(\n filters: Record<string, unknown>,\n options: Record<string, unknown>,\n entries: ReadonlyArray<FilterValueEchoEntry>,\n): void {\n for (const entry of entries) {\n const value = options[entry.optionKey];\n if (value !== undefined) {\n filters[entry.summaryKey] = entry.normalize ? entry.normalize(value) : value;\n }\n }\n}\n\n/**\n * Implements build content filter echo for the public runtime surface of this module.\n */\nexport function buildContentFilterEcho(options: Record<string, unknown>): Record<string, true> {\n const echo: Record<string, true> = {};\n applyContentFilterEcho(echo, options);\n return echo;\n}\n\n/**\n * Implements build governance missing filter echo for the public runtime surface of this module.\n */\nexport function buildGovernanceMissingFilterEcho(options: Record<string, unknown>): Record<string, true> {\n const echo: Record<string, true> = {};\n applyGovernanceMissingFilterEcho(echo, options);\n return echo;\n}\n\nconst COMPACT_LIST_VALUE_FILTER_ECHO_ENTRIES: ReadonlyArray<FilterValueEchoEntry> = [\n { optionKey: \"type\", summaryKey: \"type\" },\n { optionKey: \"tag\", summaryKey: \"tag\" },\n { optionKey: \"priority\", summaryKey: \"priority\" },\n { optionKey: \"deadlineBefore\", summaryKey: \"deadline_before\" },\n { optionKey: \"deadlineAfter\", summaryKey: \"deadline_after\" },\n { optionKey: \"updatedAfter\", summaryKey: \"updated_after\" },\n { optionKey: \"updatedBefore\", summaryKey: \"updated_before\" },\n { optionKey: \"createdAfter\", summaryKey: \"created_after\" },\n { optionKey: \"createdBefore\", summaryKey: \"created_before\" },\n { optionKey: \"ids\", summaryKey: \"ids\" },\n { optionKey: \"assignee\", summaryKey: \"assignee\" },\n { optionKey: \"assigneeFilter\", summaryKey: \"assignee_filter\" },\n { optionKey: \"parent\", summaryKey: \"parent\" },\n { optionKey: \"sprint\", summaryKey: \"sprint\" },\n { optionKey: \"release\", summaryKey: \"release\" },\n] as const;\n\nfunction buildCompactListFilterSummary(params: {\n filtersStatus: string | string[] | null;\n options: ListOptions;\n treeEnabled: boolean;\n treeDepth: number | undefined;\n sortField: ListSortField | undefined;\n sortOrder: ListSortOrder;\n runtimeFieldFilters: Record<string, unknown>;\n}): Record<string, unknown> {\n const {\n filtersStatus,\n options,\n treeEnabled,\n treeDepth,\n sortField,\n sortOrder,\n runtimeFieldFilters,\n } = params;\n const filters: Record<string, unknown> = {};\n if (filtersStatus !== null) {\n filters.status = filtersStatus;\n }\n applyFilterValueEcho(filters, options, COMPACT_LIST_VALUE_FILTER_ECHO_ENTRIES);\n if (options.filterAcMissing === true) {\n filters.filter_ac_missing = true;\n }\n if (options.filterEstimatesMissing === true) {\n filters.filter_estimates_missing = true;\n }\n if (options.filterResolutionMissing === true) {\n filters.filter_resolution_missing = true;\n }\n if (options.filterMetadataMissing === true) {\n filters.filter_metadata_missing = true;\n }\n applyGovernanceMissingFilterEcho(filters, options);\n applyContentFilterEcho(filters, options);\n if (options.limit !== undefined) {\n filters.limit = options.limit;\n }\n if (options.offset !== undefined) {\n filters.offset = options.offset;\n }\n if (options.includeBody === true) {\n filters.include_body = true;\n }\n if (options.fields !== undefined) {\n filters.fields = options.fields;\n }\n if (treeEnabled) {\n filters.tree = true;\n if (treeDepth !== undefined) {\n filters.tree_depth = treeDepth;\n }\n }\n if (sortField !== undefined) {\n filters.sort = sortField;\n filters.order = sortOrder;\n }\n if (isNonEmptyRecord(runtimeFieldFilters)) {\n filters.runtime_filters = runtimeFieldFilters;\n }\n return filters;\n}\n\nfunction compareDefaultSort(left: ListedItem, right: ListedItem, statusRegistry: RuntimeStatusRegistry): number {\n const leftTerminal = isTerminalStatus(left.status, statusRegistry);\n const rightTerminal = isTerminalStatus(right.status, statusRegistry);\n if (leftTerminal !== rightTerminal) {\n return leftTerminal ? 1 : -1;\n }\n const byPriority = left.priority - right.priority;\n if (byPriority !== 0) {\n return byPriority;\n }\n const byUpdated = compareTimestampStrings(right.updated_at, left.updated_at);\n if (byUpdated !== 0) {\n return byUpdated;\n }\n return (left.id ?? \"\").localeCompare(right.id ?? \"\");\n}\n\nfunction sortItemsDefault(items: ListedItem[], statusRegistry: RuntimeStatusRegistry): ListedItem[] {\n return [...items].sort((left, right) => compareDefaultSort(left, right, statusRegistry));\n}\n\nfunction parseDeadline(raw: string | undefined, fieldLabel: string): string | undefined {\n if (raw === undefined) return undefined;\n return resolveIsoOrRelative(raw, new Date(), fieldLabel);\n}\n\n// updated/created date-window filters share the deadline ISO+relative resolver\n// so agents doing incremental \"what changed since my last context window\" syncs\n// can pass either an ISO timestamp (the common case — feed back the previous\n// run's `now`) or a SIGNED relative offset where \"-2h\"/\"-7d\" reach into the\n// past and \"+1d\" into the future (units h/d/w/m, m = months — there is no\n// minutes unit, matching the deadline resolver).\nfunction parseTimestampWindow(raw: unknown, fieldLabel: string): string | undefined {\n if (raw == null) return undefined;\n const value = String(raw).trim();\n if (value.length === 0) return undefined;\n return resolveIsoOrRelative(value, new Date(), fieldLabel);\n}\n\nfunction parseIdsFilter(raw: unknown): Set<string> | undefined {\n if (raw == null) return undefined;\n const value = String(raw).trim();\n if (value.length === 0) {\n throw new PmCliError(\"--ids requires at least one non-empty item ID\", EXIT_CODE.USAGE);\n }\n const ids = value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n if (ids.length === 0) {\n throw new PmCliError(\"--ids requires at least one non-empty item ID\", EXIT_CODE.USAGE);\n }\n return new Set(ids);\n}\n\nfunction parseOffset(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new PmCliError(\"Offset filter must be a non-negative integer\", EXIT_CODE.USAGE);\n }\n return parsed;\n}\n\nfunction parseFieldSelectors(raw: string | undefined): string[] | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const selectors = raw\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n if (selectors.length === 0) {\n throw new PmCliError(\"List --fields requires a comma-separated list of field names\", EXIT_CODE.USAGE);\n }\n return [...new Set(selectors)];\n}\n\nfunction parseProjectionConfig(options: ListOptions): ListProjectionConfig {\n const compactRequested = options.compact === true;\n const briefRequested = options.brief === true;\n const fullRequested = options.full === true;\n const fieldSelectors = parseFieldSelectors(options.fields);\n const enabledModes =\n Number(compactRequested) + Number(briefRequested) + Number(fullRequested) + Number(fieldSelectors !== undefined);\n if (enabledModes > 1) {\n throw new PmCliError(\n \"List projection options are mutually exclusive. Use one of --compact, --brief, --full, or --fields.\",\n EXIT_CODE.USAGE,\n );\n }\n if (fullRequested) {\n return {\n mode: \"full\",\n fields: [],\n };\n }\n if (briefRequested) {\n return {\n mode: \"compact\",\n fields: [...BRIEF_LIST_FIELDS],\n };\n }\n if (compactRequested) {\n return {\n mode: \"compact\",\n fields: [...DEFAULT_COMPACT_LIST_FIELDS],\n };\n }\n if (fieldSelectors) {\n return {\n mode: \"fields\",\n fields: fieldSelectors,\n };\n }\n return {\n mode: \"full\",\n fields: [],\n };\n}\n\nfunction normalizeProjectionField(field: string): string {\n return field.startsWith(\"item.\") ? field.slice(\"item.\".length) : field;\n}\n\nfunction validateListProjectionFields(projection: ListProjectionConfig, runtimeMetadataKeys: Iterable<string>): void {\n if (projection.mode !== \"fields\") {\n return;\n }\n const allowed = new Set([...FRONT_MATTER_KEY_ORDER, \"body\", ...TREE_METADATA_FIELDS, ...runtimeMetadataKeys]);\n const unknown = projection.fields.filter((field) => !allowed.has(normalizeProjectionField(field)));\n if (unknown.length > 0) {\n throw new PmCliError(`Unknown list --fields value(s): ${unknown.join(\", \")}`, EXIT_CODE.USAGE, {\n code: \"unknown_field_projection\",\n examples: [\n \"pm list-open --fields id,title,status,type,updated_at\",\n \"pm list --fields id,title,parent,priority --limit 10\",\n \"pm list-all --fields id,title,body --limit 5\",\n ],\n });\n }\n}\n\n// Convenience aliases so agents/humans who reach for the bare verb form\n// (e.g. `--sort updated`) land on the canonical timestamp fields instead of an error.\n// A Map (not a plain object) avoids prototype-chain lookups for keys like \"__proto__\".\nconst LIST_SORT_FIELD_ALIASES: ReadonlyMap<string, ListSortField> = new Map<string, ListSortField>([\n [\"updated\", \"updated_at\"],\n [\"update\", \"updated_at\"],\n [\"modified\", \"updated_at\"],\n [\"created\", \"created_at\"],\n [\"create\", \"created_at\"],\n]);\n\nfunction parseSortField(raw: string | undefined): ListSortField | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const normalized = raw.trim().toLowerCase();\n const aliased = LIST_SORT_FIELD_ALIASES.get(normalized);\n if (aliased) {\n return aliased;\n }\n if (!LIST_SORT_FIELDS.includes(normalized as ListSortField)) {\n throw new PmCliError(\n `Sort field must be one of ${LIST_SORT_FIELDS.join(\"|\")} (aliases: updated->updated_at, created->created_at)`,\n EXIT_CODE.USAGE,\n );\n }\n return normalized as ListSortField;\n}\n\nfunction parseSortOrder(raw: string | undefined): ListSortOrder | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const normalized = raw.trim().toLowerCase();\n if (!LIST_SORT_ORDER_VALUES.includes(normalized as ListSortOrder)) {\n throw new PmCliError(`Sort order must be one of ${LIST_SORT_ORDER_VALUES.join(\"|\")}`, EXIT_CODE.USAGE);\n }\n return normalized as ListSortOrder;\n}\n\nfunction parseTreeDepth(raw: string | undefined): number | undefined {\n return parseIntegerLimit(raw, \"--tree-depth\");\n}\n\nfunction parseAssigneeFilter(raw: string | undefined): \"assigned\" | \"unassigned\" | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const normalized = raw.trim().toLowerCase();\n if (!normalized) {\n throw new PmCliError(\"Assignee filter must be one of assigned|unassigned\", EXIT_CODE.USAGE);\n }\n if (normalized !== \"assigned\" && normalized !== \"unassigned\") {\n throw new PmCliError(`Invalid assignee filter \"${raw}\". Allowed: assigned|unassigned`, EXIT_CODE.USAGE);\n }\n return normalized;\n}\n\n// `pm list` keeps lenient status parsing (an unknown token is passed through\n// verbatim and simply matches nothing) so custom/unknown statuses never error;\n// the shared CSV parser resolves the open/closed/canceled workflow-group aliases.\nfunction resolveStatusFilter(\n status: ItemStatus | undefined,\n statusRegistry: RuntimeStatusRegistry,\n): ItemStatus[] | undefined {\n return parseStatusFilterCsv(status, statusRegistry, { strict: false });\n}\n\ninterface ListFilterSet {\n idsFilter: Set<string> | undefined;\n statusSet: Set<ItemStatus> | undefined;\n excludeTerminal: boolean;\n typeFilter: ItemType | undefined;\n tagFilter: string | undefined;\n priorityFilter: number | undefined;\n deadlineBefore: string | undefined;\n deadlineAfter: string | undefined;\n updatedAfter: string | undefined;\n updatedBefore: string | undefined;\n createdAfter: string | undefined;\n createdBefore: string | undefined;\n assigneeFilter: string | undefined;\n assigneeModeFilter: \"assigned\" | \"unassigned\" | undefined;\n parentFilter: string | undefined;\n treeEnabled: boolean;\n sprintFilter: string | undefined;\n releaseFilter: string | undefined;\n missingMetadataFilters: MissingMetadataFilters;\n missingMetadataActive: boolean;\n lifecycleClassifier: ReturnType<typeof lifecycleClassifierFromStatusRegistry>;\n contentFieldFilters: ContentFieldFilters;\n contentFiltersActive: boolean;\n}\n\nfunction assertListAssigneeFilters(\n assigneeFilter: string | undefined,\n assigneeModeFilter: \"assigned\" | \"unassigned\" | undefined,\n): void {\n if (assigneeFilter && (assigneeFilter.toLowerCase() === \"none\" || assigneeFilter.toLowerCase() === \"null\")) {\n throw new PmCliError(\n '--assignee no longer accepts \"none\" or \"null\". Use --assignee-filter unassigned.',\n EXIT_CODE.USAGE,\n );\n }\n if (assigneeFilter !== undefined && assigneeModeFilter === \"unassigned\") {\n throw new PmCliError(\"Cannot combine --assignee with --assignee-filter unassigned\", EXIT_CODE.USAGE);\n }\n}\n\nfunction resolveListFilterSet(\n status: ItemStatus[] | undefined,\n options: ListOptions,\n typeRegistry: ItemTypeRegistry,\n statusRegistry: RuntimeStatusRegistry,\n): ListFilterSet {\n const assigneeFilter = options.assignee?.trim();\n const assigneeModeFilter = parseAssigneeFilter(options.assigneeFilter);\n assertListAssigneeFilters(assigneeFilter, assigneeModeFilter);\n const missingMetadataFilters = resolveMissingMetadataFilters(options);\n const contentFieldFilters = resolveContentFieldFilters(options as Record<string, unknown>);\n return {\n idsFilter: parseIdsFilter(options.ids),\n statusSet: status && status.length > 0 ? new Set<ItemStatus>(status) : undefined,\n excludeTerminal: options.excludeTerminal === true,\n typeFilter: parseType(options.type, typeRegistry),\n tagFilter: options.tag?.trim().toLowerCase(),\n priorityFilter: parsePriority(options.priority),\n deadlineBefore: parseDeadline(options.deadlineBefore, \"deadline-before\"),\n deadlineAfter: parseDeadline(options.deadlineAfter, \"deadline-after\"),\n updatedAfter: parseTimestampWindow(options.updatedAfter, \"updated-after\"),\n updatedBefore: parseTimestampWindow(options.updatedBefore, \"updated-before\"),\n createdAfter: parseTimestampWindow(options.createdAfter, \"created-after\"),\n createdBefore: parseTimestampWindow(options.createdBefore, \"created-before\"),\n assigneeFilter,\n assigneeModeFilter,\n parentFilter: options.parent?.trim(),\n treeEnabled: options.tree === true,\n sprintFilter: options.sprint?.trim(),\n releaseFilter: options.release?.trim(),\n missingMetadataFilters,\n missingMetadataActive: hasMissingMetadataFilter(missingMetadataFilters),\n lifecycleClassifier: lifecycleClassifierFromStatusRegistry(statusRegistry),\n contentFieldFilters,\n contentFiltersActive: hasContentFieldFilter(contentFieldFilters),\n };\n}\n\nfunction matchesListScalarFilters(\n item: ListedItem,\n filters: ListFilterSet,\n statusRegistry: RuntimeStatusRegistry,\n): boolean {\n if (filters.idsFilter && !filters.idsFilter.has(item.id)) return false;\n if (filters.statusSet && !filters.statusSet.has(item.status)) return false;\n if (filters.excludeTerminal && isTerminalStatus(item.status, statusRegistry)) return false;\n if (filters.typeFilter && item.type !== filters.typeFilter) return false;\n if (filters.tagFilter && !item.tags.includes(filters.tagFilter)) return false;\n if (filters.priorityFilter !== undefined && item.priority !== filters.priorityFilter) return false;\n if (filters.deadlineBefore && (!item.deadline || compareTimestampStrings(item.deadline, filters.deadlineBefore) > 0)) return false;\n if (filters.deadlineAfter && (!item.deadline || compareTimestampStrings(item.deadline, filters.deadlineAfter) < 0)) return false;\n if (filters.updatedAfter && compareTimestampStrings(item.updated_at, filters.updatedAfter) < 0) return false;\n if (filters.updatedBefore && compareTimestampStrings(item.updated_at, filters.updatedBefore) > 0) return false;\n if (filters.createdAfter && compareTimestampStrings(item.created_at, filters.createdAfter) < 0) return false;\n if (filters.createdBefore && compareTimestampStrings(item.created_at, filters.createdBefore) > 0) return false;\n if (filters.assigneeModeFilter === \"assigned\" && !item.assignee) return false;\n if (filters.assigneeModeFilter === \"unassigned\" && item.assignee) return false;\n if (filters.assigneeFilter !== undefined && item.assignee !== filters.assigneeFilter) return false;\n if (filters.parentFilter !== undefined && !filters.treeEnabled && item.parent !== filters.parentFilter) return false;\n if (filters.sprintFilter !== undefined && item.sprint !== filters.sprintFilter) return false;\n if (filters.releaseFilter !== undefined && item.release !== filters.releaseFilter) return false;\n return true;\n}\n\nfunction matchesListFilterSet(\n item: ListedItem,\n filters: ListFilterSet,\n statusRegistry: RuntimeStatusRegistry,\n runtimeFieldFilters: Record<string, unknown>,\n): boolean {\n if (!matchesListScalarFilters(item, filters, statusRegistry)) {\n return false;\n }\n if (filters.missingMetadataActive && !itemMatchesMissingMetadata(item, filters.missingMetadataFilters, filters.lifecycleClassifier)) {\n return false;\n }\n if (filters.contentFiltersActive && !itemMatchesContentFilters(item, filters.contentFieldFilters)) {\n return false;\n }\n if (!matchesRuntimeFilters(item as Record<string, unknown>, runtimeFieldFilters)) {\n return false;\n }\n return true;\n}\n\nfunction applyFilters(\n items: ListedItem[],\n status: ItemStatus[] | undefined,\n options: ListOptions,\n typeRegistry: ItemTypeRegistry,\n statusRegistry: RuntimeStatusRegistry,\n runtimeFieldFilters: Record<string, unknown>,\n): ListedItem[] {\n const filters = resolveListFilterSet(status, options, typeRegistry, statusRegistry);\n return items.filter((item) => matchesListFilterSet(item, filters, statusRegistry, runtimeFieldFilters));\n}\n\nfunction trimNonEmpty(value: string | undefined): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction withTreeMetadata(item: ListedItem, depth: number, childCount: number): ListedItem {\n const itemRecord = toItemRecord(item);\n const title = typeof itemRecord.title === \"string\" ? itemRecord.title : \"\";\n const parent = trimNonEmpty(typeof itemRecord.parent === \"string\" ? itemRecord.parent : undefined) ?? null;\n return {\n ...item,\n tree_depth: depth,\n tree_parent: parent,\n tree_children: childCount,\n tree_title: `${\" \".repeat(depth)}${title}`,\n } as ListedItem;\n}\n\nfunction orderItemsAsTree(\n sortedItems: ListedItem[],\n parentRoot: string | undefined,\n maxDepth: number | undefined,\n): ListedItem[] {\n const byId = new Map<string, ListedItem>();\n const childrenByParent = new Map<string, ListedItem[]>();\n for (const item of sortedItems) {\n byId.set(item.id, item);\n const parentId = trimNonEmpty(item.parent);\n if (!parentId) {\n continue;\n }\n const bucket = childrenByParent.get(parentId);\n if (bucket) {\n bucket.push(item);\n } else {\n childrenByParent.set(parentId, [item]);\n }\n }\n\n const roots = parentRoot\n ? [...(childrenByParent.get(parentRoot) ?? [])]\n : sortedItems.filter((item) => {\n const parentId = trimNonEmpty(item.parent);\n return !parentId || !byId.has(parentId);\n });\n const ordered: ListedItem[] = [];\n const visited = new Set<string>();\n const pushNode = (node: ListedItem, depth: number): void => {\n if (visited.has(node.id)) {\n return;\n }\n visited.add(node.id);\n const children = childrenByParent.get(node.id) ?? [];\n ordered.push(withTreeMetadata(node, depth, children.length));\n if (maxDepth !== undefined && depth >= maxDepth) {\n return;\n }\n for (const child of children) {\n pushNode(child, depth + 1);\n }\n };\n for (const root of roots) {\n pushNode(root, 0);\n }\n return ordered;\n}\n\nfunction compareNullableString(left: string | null, right: string | null): number {\n if (left === right) {\n return 0;\n }\n if (left === null) {\n return 1;\n }\n if (right === null) {\n return -1;\n }\n return left.localeCompare(right);\n}\n\nfunction compareNullableTimestamp(left: string | null, right: string | null): number {\n if (left === right) {\n return 0;\n }\n if (left === null) {\n return 1;\n }\n if (right === null) {\n return -1;\n }\n return compareTimestampStrings(left, right);\n}\n\nfunction compareBySortField(left: ListedItem, right: ListedItem, field: ListSortField): number {\n switch (field) {\n case \"priority\":\n return left.priority - right.priority;\n case \"deadline\":\n return compareNullableTimestamp(left.deadline ?? null, right.deadline ?? null);\n case \"updated_at\":\n return compareTimestampStrings(left.updated_at, right.updated_at);\n case \"created_at\":\n return compareTimestampStrings(left.created_at, right.created_at);\n case \"title\":\n return (left.title ?? \"\").localeCompare(right.title ?? \"\");\n case \"parent\":\n return compareNullableString(left.parent ?? null, right.parent ?? null);\n default:\n return 0;\n }\n}\n\nfunction sortItems(\n items: ListedItem[],\n sortField: ListSortField | undefined,\n sortOrder: ListSortOrder,\n statusRegistry: RuntimeStatusRegistry,\n): ListedItem[] {\n if (!sortField) {\n return sortItemsDefault(items, statusRegistry);\n }\n return [...items].sort((left, right) => {\n const byField = compareBySortField(left, right, sortField);\n if (byField !== 0) {\n return sortOrder === \"desc\" ? -byField : byField;\n }\n const fallback = compareDefaultSort(left, right, statusRegistry);\n return sortOrder === \"desc\" ? -fallback : fallback;\n });\n}\n\nfunction readListFieldValue(item: ListedItem, field: string, treeMode = false): unknown {\n const normalized = normalizeProjectionField(field.trim());\n if (normalized.length === 0) {\n return null;\n }\n const itemRecord = toItemRecord(item);\n if (treeMode && normalized === \"title\" && typeof itemRecord.tree_title === \"string\") {\n return itemRecord.tree_title;\n }\n if (Object.prototype.hasOwnProperty.call(itemRecord, normalized)) {\n return itemRecord[normalized] ?? null;\n }\n return null;\n}\n\nfunction projectListItems(items: ListedItem[], projection: ListProjectionConfig, treeMode = false): ListedItem[] {\n if (projection.mode === \"full\") {\n return items;\n }\n return items.map((item) => {\n const projected: Record<string, unknown> = {};\n for (const field of projection.fields) {\n projected[field] = readListFieldValue(item, field, treeMode);\n }\n return projected as unknown as ListedItem;\n });\n}\n\nfunction runtimeMetadataKeysForProjection(definitions: Array<{ metadata_key: string }>): string[] {\n const keys: string[] = [];\n for (const field of definitions) {\n keys.push(field.metadata_key);\n }\n return keys;\n}\n\n/**\n * Implements run list for the public runtime surface of this module.\n */\nexport async function runList(status: ItemStatus | undefined, options: ListOptions, global: GlobalOptions): Promise<ListResult> {\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 statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const runtimeFieldRegistry = resolveRuntimeFieldRegistry(settings.schema);\n const runtimeFieldFilters = collectRuntimeFilterValues(options as Record<string, unknown>, runtimeFieldRegistry, \"list\");\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const projection = parseProjectionConfig(options);\n const runtimeMetadataKeys = runtimeMetadataKeysForProjection(runtimeFieldRegistry.definitions);\n validateListProjectionFields(projection, runtimeMetadataKeys);\n const listWarnings: string[] = [];\n const projectionNeedsBody = projection.fields.some((field) => normalizeProjectionField(field) === \"body\");\n // The heavy collection fields are only emitted by `--full` (verbatim items) or an\n // explicit `--fields <heavy>` selection. Every other projection (default brief,\n // `--compact`, light `--fields`) reads only light scalar fields, so it takes the\n // light path that skips the large collections cache (the hot-path JSON.parse win).\n const projectionNeedsCollections =\n projection.mode === \"full\" ||\n projection.fields.some((field) => HEAVY_PROJECTION_FIELDS.has(normalizeProjectionField(field)));\n // Content-field filters (GH-242) inspect the heavy collection arrays and/or the\n // body, so they force the matching load path even when the projection alone\n // would take the light path. notes/learnings/files/docs/tests/comments/deps/\n // linked_command live in the heavy collections; body needs the body load.\n const contentFieldFilters = resolveContentFieldFilters(options as Record<string, unknown>);\n const contentNeedsCollections = contentFiltersNeedCollections(contentFieldFilters);\n const contentNeedsBody = contentFiltersNeedBody(contentFieldFilters);\n let items: ListedItem[];\n if (options.includeBody || projectionNeedsBody || contentNeedsBody) {\n items = await listAllFrontMatterWithBody(pmRoot, settings.item_format, typeRegistry.type_to_folder, listWarnings, settings.schema);\n } else if (projectionNeedsCollections || contentNeedsCollections) {\n items = await listAllFrontMatter(pmRoot, settings.item_format, typeRegistry.type_to_folder, listWarnings, settings.schema);\n } else {\n items = await listAllFrontMatterLight(pmRoot, settings.item_format, typeRegistry.type_to_folder, listWarnings, settings.schema);\n }\n const sortField = parseSortField(options.sort);\n const sortOrder = parseSortOrder(options.order) ?? \"asc\";\n const treeEnabled = options.tree === true;\n if (!treeEnabled && options.treeDepth !== undefined) {\n throw new PmCliError(\"List --tree-depth requires --tree\", EXIT_CODE.USAGE);\n }\n const treeDepth = treeEnabled ? parseTreeDepth(options.treeDepth) : undefined;\n const parentRoot = treeEnabled ? trimNonEmpty(options.parent) : undefined;\n if (!sortField && options.order !== undefined) {\n throw new PmCliError(\"List --order requires --sort\", EXIT_CODE.USAGE);\n }\n const explicitStatus = resolveStatusFilter(options.status as ItemStatus | undefined, statusRegistry);\n const resolvedStatus = explicitStatus ?? resolveStatusFilter(status, statusRegistry);\n const explicitAllStatuses = isStatusAllFilterInput(options.status);\n const effectiveOptions = explicitStatus || explicitAllStatuses ? { ...options, excludeTerminal: false } : options;\n const filtered = applyFilters(items, resolvedStatus, effectiveOptions, typeRegistry, statusRegistry, runtimeFieldFilters);\n const filtersStatus =\n explicitAllStatuses\n ? \"all\"\n : resolvedStatus === undefined\n ? null\n : resolvedStatus.length === 1\n ? resolvedStatus[0]\n : resolvedStatus;\n const sorted = sortItems(filtered, sortField, sortOrder, statusRegistry);\n const ordered = treeEnabled ? orderItemsAsTree(sorted, parentRoot, treeDepth) : sorted;\n // --no-truncate (alias --all) forces full results, overriding any --limit so an\n // agent can pull the entire matched set in one call (GH-154).\n const noTruncate = options.noTruncate === true;\n const limit = noTruncate ? undefined : parseIntegerLimit(options.limit);\n const offset = parseOffset(options.offset) ?? 0;\n const limited = limit === undefined ? ordered.slice(offset) : ordered.slice(offset, offset + limit);\n const projected = projectListItems(limited, projection, treeEnabled);\n const totalMatched = ordered.length;\n // Surface the pre-pagination total only when rows were actually omitted.\n const truncationExtras = projected.length < totalMatched ? { total: totalMatched } : {};\n const now = nowIso();\n const warnings = [...new Set(listWarnings)].sort((left, right) => left.localeCompare(right));\n const projectionFields = projection.mode === \"full\" ? null : [...projection.fields];\n // pm-vhx6: compact-mode list output is primarily consumed by agents. Keep the\n // metadata trailer token-light by returning only active/user-supplied filters\n // and omitting projection/sorting/now boilerplate in this path.\n const compactSummaryMode = projection.mode === \"compact\" && options.compact === true;\n if (compactSummaryMode) {\n const compactFilters = buildCompactListFilterSummary({\n filtersStatus,\n options,\n treeEnabled,\n treeDepth,\n sortField,\n sortOrder,\n runtimeFieldFilters,\n });\n return {\n items: projected,\n count: projected.length,\n ...truncationExtras,\n filters: compactFilters,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n return {\n items: projected,\n count: projected.length,\n ...truncationExtras,\n filters: {\n status: filtersStatus,\n type: options.type ?? null,\n tag: options.tag ?? null,\n priority: options.priority ?? null,\n deadline_before: options.deadlineBefore ?? null,\n deadline_after: options.deadlineAfter ?? null,\n updated_after: options.updatedAfter ?? null,\n updated_before: options.updatedBefore ?? null,\n created_after: options.createdAfter ?? null,\n created_before: options.createdBefore ?? null,\n ids: options.ids ?? null,\n assignee: options.assignee ?? null,\n assignee_filter: options.assigneeFilter ?? null,\n parent: options.parent ?? null,\n sprint: options.sprint ?? null,\n release: options.release ?? null,\n ...(options.filterAcMissing === true ? { filter_ac_missing: true } : {}),\n ...(options.filterEstimatesMissing === true ? { filter_estimates_missing: true } : {}),\n ...(options.filterResolutionMissing === true ? { filter_resolution_missing: true } : {}),\n ...(options.filterMetadataMissing === true ? { filter_metadata_missing: true } : {}),\n ...buildGovernanceMissingFilterEcho(options),\n ...buildContentFilterEcho(options),\n limit: options.limit ?? null,\n offset: options.offset ?? null,\n ...(noTruncate ? { no_truncate: true } : {}),\n include_body: options.includeBody ?? null,\n compact: options.compact ?? null,\n fields: options.fields ?? null,\n ...(treeEnabled ? { tree: true, tree_depth: treeDepth ?? null } : {}),\n sort: sortField ?? null,\n order: sortField ? sortOrder : null,\n runtime_filters: runtimeFieldFilters,\n },\n projection: {\n mode: projection.mode,\n fields: projectionFields,\n },\n sorting: {\n sort: sortField ?? \"default\",\n order: sortField ? sortOrder : \"asc\",\n },\n now,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n}\n\nexport const _testOnly = {\n applyFilters,\n buildCompactListFilterSummary,\n buildContentFilterEcho,\n buildGovernanceMissingFilterEcho,\n resolveContentFieldFilters,\n resolveMissingMetadataFilters,\n compareBySortField,\n compareDefaultSort,\n compareNullableString,\n compareNullableTimestamp,\n normalizeProjectionField,\n parseAssigneeFilter,\n parseFieldSelectors,\n parseIdsFilter,\n parseOffset,\n parseProjectionConfig,\n parseSortField,\n parseSortOrder,\n orderItemsAsTree,\n projectListItems,\n readListFieldValue,\n runtimeMetadataKeysForProjection,\n sortItems,\n trimNonEmpty,\n withTreeMetadata,\n};\n"],
5
- "mappings": "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",
6
- "names": ["global"]
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../../../core/governance/metadata-coverage.ts"],"sourcesContent":["/**\n * Metadata governance & coverage observability primitives.\n *\n * One dependency-light module that powers the whole metadata-governance\n * surface: missing-field selection (pm list / pm update-many), coverage\n * percentages (pm stats --metadata-coverage / pm validate), and grouped\n * lifecycle breakdowns (pm stats --by-assignee/--by-tag/--by-priority,\n * pm aggregate explicit labels).\n *\n * The module is pure: it performs no IO and imports no heavy runtime\n * dependencies. Lifecycle semantics are injected via a {@link LifecycleClassifier}\n * so callers map their runtime status registry to lifecycle buckets while the\n * pure logic here stays trivially testable with a fake classifier.\n */\n\nimport { toNonEmptyStringOrUndefined } from \"../shared/primitives.js\";\n\n/** Minimal structural shape this module needs from an item's front matter. */\nexport interface CoverageItem {\n type: string;\n status: string;\n assignee?: string;\n tags?: string[];\n parent?: string;\n priority?: number;\n acceptance_criteria?: string;\n estimated_minutes?: number;\n resolution?: string;\n reviewer?: string;\n risk?: string;\n /** Confidence is a string-like enum or a numeric score depending on workspace. */\n confidence?: string | number;\n sprint?: string;\n release?: string;\n [key: string]: unknown;\n}\n\n/** Lifecycle buckets used by grouped breakdowns and distributions. */\nexport type LifecycleBucket =\n | \"open\"\n | \"in_progress\"\n | \"blocked\"\n | \"draft\"\n | \"closed\"\n | \"canceled\"\n | \"other\";\n\n/** Stable rendering order for lifecycle buckets. */\nexport const LIFECYCLE_BUCKET_ORDER: readonly LifecycleBucket[] = [\n \"open\",\n \"in_progress\",\n \"blocked\",\n \"draft\",\n \"closed\",\n \"canceled\",\n \"other\",\n] as const;\n\n/**\n * Classifies a raw status string into a lifecycle bucket and reports whether a\n * status is terminal (closed/canceled). Callers build this from their resolved\n * runtime status registry via {@link lifecycleClassifierFromStatusRegistry}.\n */\nexport interface LifecycleClassifier {\n classify(status: string): LifecycleBucket;\n isTerminal(status: string): boolean;\n}\n\n/** The subset of a resolved runtime status registry this module consumes. */\nexport interface StatusRegistryLike {\n alias_to_id: Map<string, string>;\n terminal_statuses: Set<string>;\n terminal_canceled_statuses: Set<string>;\n blocked_statuses: Set<string>;\n draft_statuses: Set<string>;\n active_statuses: Set<string>;\n open_status: string;\n}\n\nfunction normalizeStatus(status: string, registry: StatusRegistryLike): string {\n const trimmed = status.trim().toLowerCase();\n return registry.alias_to_id.get(trimmed) ?? trimmed;\n}\n\n/**\n * Adapt a resolved runtime status registry into a {@link LifecycleClassifier}.\n *\n * Precedence is deliberate and disjoint: canceled → closed → blocked → draft →\n * open → in_progress (active but not the default open status) → other.\n */\nexport function lifecycleClassifierFromStatusRegistry(registry: StatusRegistryLike): LifecycleClassifier {\n return {\n isTerminal(status: string): boolean {\n return registry.terminal_statuses.has(normalizeStatus(status, registry));\n },\n classify(status: string): LifecycleBucket {\n const id = normalizeStatus(status, registry);\n if (registry.terminal_canceled_statuses.has(id)) {\n return \"canceled\";\n }\n if (registry.terminal_statuses.has(id)) {\n return \"closed\";\n }\n if (registry.blocked_statuses.has(id)) {\n return \"blocked\";\n }\n if (registry.draft_statuses.has(id)) {\n return \"draft\";\n }\n if (id === registry.open_status) {\n return \"open\";\n }\n if (registry.active_statuses.has(id)) {\n return \"in_progress\";\n }\n return \"other\";\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Missing-metadata predicates\n// ---------------------------------------------------------------------------\n\n/** True when an item has no non-empty acceptance_criteria. */\nexport function isAcMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.acceptance_criteria) === undefined;\n}\n\n/** True when an item has no finite estimated_minutes. */\nexport function isEstimateMissing(item: CoverageItem): boolean {\n return !Number.isFinite(item.estimated_minutes);\n}\n\n/**\n * True when a terminal (closed/canceled) item has no non-empty resolution.\n * Resolution is only expected on terminal items, so open items are never\n * considered \"resolution-missing\".\n */\nexport function isResolutionMissing(item: CoverageItem, classifier: LifecycleClassifier): boolean {\n if (!classifier.isTerminal(item.status)) {\n return false;\n }\n return toNonEmptyStringOrUndefined(item.resolution) === undefined;\n}\n\n/** True when an item has no non-empty reviewer. */\nexport function isReviewerMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.reviewer) === undefined;\n}\n\n/** True when an item has no non-empty risk level. */\nexport function isRiskMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.risk) === undefined;\n}\n\n/**\n * True when an item has no confidence value. Confidence is a string-like enum\n * or a numeric score depending on workspace, so a finite number counts as\n * present and only blank/absent values are treated as missing.\n */\nexport function isConfidenceMissing(item: CoverageItem): boolean {\n if (typeof item.confidence === \"number\") {\n return !Number.isFinite(item.confidence);\n }\n return toNonEmptyStringOrUndefined(item.confidence) === undefined;\n}\n\n/** True when an item has no non-empty sprint. */\nexport function isSprintMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.sprint) === undefined;\n}\n\n/** True when an item has no non-empty release. */\nexport function isReleaseMissing(item: CoverageItem): boolean {\n return toNonEmptyStringOrUndefined(item.release) === undefined;\n}\n\n/** Selection flags for {@link filterMissingMetadata}. */\nexport interface MissingMetadataFilters {\n acMissing?: boolean;\n estimatesMissing?: boolean;\n resolutionMissing?: boolean;\n reviewerMissing?: boolean;\n riskMissing?: boolean;\n confidenceMissing?: boolean;\n sprintMissing?: boolean;\n releaseMissing?: boolean;\n /** Match items missing ANY of the tracked metadata fields (union). */\n metadataMissing?: boolean;\n}\n\n/** True when any missing-metadata filter is requested. */\nexport function hasMissingMetadataFilter(filters: MissingMetadataFilters): boolean {\n return Boolean(\n filters.acMissing ||\n filters.estimatesMissing ||\n filters.resolutionMissing ||\n filters.reviewerMissing ||\n filters.riskMissing ||\n filters.confidenceMissing ||\n filters.sprintMissing ||\n filters.releaseMissing ||\n filters.metadataMissing,\n );\n}\n\n/**\n * Does a single item satisfy the requested missing-metadata filters?\n *\n * Specific flags (acMissing/estimatesMissing/resolutionMissing plus the\n * governance flags reviewerMissing/riskMissing/confidenceMissing/sprintMissing/\n * releaseMissing) are ANDed together so callers can narrow precisely.\n * `metadataMissing` is ORed in as a union shortcut for \"missing any of the\n * core tracked fields\" (acceptance_criteria/estimated_minutes/resolution); it\n * deliberately excludes the governance fields so the long-standing flag keeps\n * its original meaning. When no filter is requested the item passes.\n */\nexport function itemMatchesMissingMetadata(\n item: CoverageItem,\n filters: MissingMetadataFilters,\n classifier: LifecycleClassifier,\n): boolean {\n if (!hasMissingMetadataFilter(filters)) {\n return true;\n }\n if (filters.acMissing && !isAcMissing(item)) {\n return false;\n }\n if (filters.estimatesMissing && !isEstimateMissing(item)) {\n return false;\n }\n if (filters.resolutionMissing && !isResolutionMissing(item, classifier)) {\n return false;\n }\n if (filters.reviewerMissing && !isReviewerMissing(item)) {\n return false;\n }\n if (filters.riskMissing && !isRiskMissing(item)) {\n return false;\n }\n if (filters.confidenceMissing && !isConfidenceMissing(item)) {\n return false;\n }\n if (filters.sprintMissing && !isSprintMissing(item)) {\n return false;\n }\n if (filters.releaseMissing && !isReleaseMissing(item)) {\n return false;\n }\n if (filters.metadataMissing) {\n const anyMissing =\n isAcMissing(item) || isEstimateMissing(item) || isResolutionMissing(item, classifier);\n if (!anyMissing) {\n return false;\n }\n }\n return true;\n}\n\n/** Filter a list of items by the requested missing-metadata predicates. */\nexport function filterMissingMetadata<T extends CoverageItem>(\n items: readonly T[],\n filters: MissingMetadataFilters,\n classifier: LifecycleClassifier,\n): T[] {\n if (!hasMissingMetadataFilter(filters)) {\n return [...items];\n }\n return items.filter((item) => itemMatchesMissingMetadata(item, filters, classifier));\n}\n\n// ---------------------------------------------------------------------------\n// Metadata coverage percentages\n// ---------------------------------------------------------------------------\n\n/** Coverage-tracked metadata fields. */\nexport type CoverageField =\n | \"acceptance_criteria\"\n | \"estimated_minutes\"\n | \"resolution\"\n | \"tags\"\n | \"parent\";\n\n/** Stable ordering of coverage fields for rendering. */\nexport const COVERAGE_FIELD_ORDER: readonly CoverageField[] = [\n \"acceptance_criteria\",\n \"estimated_minutes\",\n \"resolution\",\n \"tags\",\n \"parent\",\n] as const;\n\n/** Coverage of a single field: present vs applicable, with a rounded percent. */\nexport interface FieldCoverage {\n present: number;\n /** Items for which the field is expected (all items, except resolution = terminal only). */\n applicable: number;\n /** present/applicable * 100, rounded to one decimal; 100 when applicable is 0. */\n percent: number;\n}\n\n/**\n * Documents the metadata coverage report payload exchanged by command, SDK, and package integrations.\n */\nexport interface MetadataCoverageReport {\n overall: Record<CoverageField, FieldCoverage>;\n by_type: Record<string, Record<CoverageField, FieldCoverage>>;\n}\n\nfunction isFieldPresent(item: CoverageItem, field: CoverageField): boolean {\n switch (field) {\n case \"acceptance_criteria\":\n return !isAcMissing(item);\n case \"estimated_minutes\":\n return !isEstimateMissing(item);\n case \"resolution\":\n return toNonEmptyStringOrUndefined(item.resolution) !== undefined;\n case \"tags\":\n return Array.isArray(item.tags) && item.tags.length > 0;\n default:\n return toNonEmptyStringOrUndefined(item.parent) !== undefined;\n }\n}\n\n/** Whether a field applies to a given item (resolution only applies to terminal items). */\nfunction isFieldApplicable(item: CoverageItem, field: CoverageField, classifier: LifecycleClassifier): boolean {\n if (field === \"resolution\") {\n return classifier.isTerminal(item.status);\n }\n return true;\n}\n\nfunction roundPercent(present: number, applicable: number): number {\n if (applicable === 0) {\n return 100;\n }\n return Math.round((present / applicable) * 1000) / 10;\n}\n\nfunction emptyFieldCoverage(): Record<CoverageField, FieldCoverage> {\n const record = {} as Record<CoverageField, FieldCoverage>;\n for (const field of COVERAGE_FIELD_ORDER) {\n record[field] = { present: 0, applicable: 0, percent: 100 };\n }\n return record;\n}\n\nfunction accumulateCoverage(\n target: Record<CoverageField, FieldCoverage>,\n item: CoverageItem,\n classifier: LifecycleClassifier,\n): void {\n for (const field of COVERAGE_FIELD_ORDER) {\n if (!isFieldApplicable(item, field, classifier)) {\n continue;\n }\n const entry = target[field];\n entry.applicable += 1;\n if (isFieldPresent(item, field)) {\n entry.present += 1;\n }\n }\n}\n\nfunction finalizePercentages(record: Record<CoverageField, FieldCoverage>): void {\n for (const field of COVERAGE_FIELD_ORDER) {\n const entry = record[field];\n entry.percent = roundPercent(entry.present, entry.applicable);\n }\n}\n\n/**\n * Compute metadata coverage overall and per item type. For each tracked field\n * we report present/applicable counts and a rounded percentage. Resolution is\n * scoped to terminal items (its only applicable population).\n */\nexport function computeMetadataCoverage(\n items: readonly CoverageItem[],\n classifier: LifecycleClassifier,\n): MetadataCoverageReport {\n const overall = emptyFieldCoverage();\n const byType: Record<string, Record<CoverageField, FieldCoverage>> = {};\n for (const item of items) {\n accumulateCoverage(overall, item, classifier);\n const typeRecord = byType[item.type] ?? (byType[item.type] = emptyFieldCoverage());\n accumulateCoverage(typeRecord, item, classifier);\n }\n finalizePercentages(overall);\n for (const typeRecord of Object.values(byType)) {\n finalizePercentages(typeRecord);\n }\n return { overall, by_type: byType };\n}\n\n// ---------------------------------------------------------------------------\n// Grouped lifecycle breakdowns\n// ---------------------------------------------------------------------------\n\n/** Dimensions a breakdown can group by. */\nexport type GroupDimension = \"assignee\" | \"priority\" | \"tag\" | \"parent\" | \"type\" | \"status\";\n\n/** Explicit labels for empty/blank group keys, by dimension. */\nconst EMPTY_GROUP_LABELS: Record<GroupDimension, string> = {\n assignee: \"(unassigned)\",\n priority: \"(no priority)\",\n tag: \"(untagged)\",\n parent: \"(unparented)\",\n type: \"(untyped)\",\n status: \"(no status)\",\n};\n\n/** Explicit label for an empty/blank group value for a given dimension. */\nexport function emptyGroupLabel(dimension: GroupDimension): string {\n return EMPTY_GROUP_LABELS[dimension];\n}\n\n/**\n * Documents the group row payload exchanged by command, SDK, and package integrations.\n */\nexport interface GroupRow {\n /** Display label; explicit \"(unassigned)\"-style label for blank keys. */\n label: string;\n /** Stable structured key (null for the empty/blank group). */\n key: string | null;\n buckets: Record<LifecycleBucket, number>;\n total: number;\n}\n\n/**\n * Documents the grouped breakdown payload exchanged by command, SDK, and package integrations.\n */\nexport interface GroupedBreakdown {\n dimension: GroupDimension;\n rows: GroupRow[];\n /** Distinct items observed (an item can contribute to multiple tag rows). */\n total_items: number;\n}\n\n/**\n * Documents the group options payload exchanged by command, SDK, and package integrations.\n */\nexport interface GroupOptions {\n /** For dimension=\"tag\": only consider tags starting with this prefix. */\n tagPrefix?: string;\n}\n\nfunction emptyBuckets(): Record<LifecycleBucket, number> {\n return {\n open: 0,\n in_progress: 0,\n blocked: 0,\n draft: 0,\n closed: 0,\n canceled: 0,\n other: 0,\n };\n}\n\n/**\n * Resolve the group keys an item belongs to for a dimension. Most dimensions\n * yield exactly one key (possibly null for blank); tag yields one key per\n * matching tag (or [null] when none match), so an item can span multiple rows.\n */\nfunction groupKeysForItem(item: CoverageItem, dimension: GroupDimension, options: GroupOptions): (string | null)[] {\n switch (dimension) {\n case \"assignee\":\n return [toNonEmptyStringOrUndefined(item.assignee) ?? null];\n case \"parent\":\n return [toNonEmptyStringOrUndefined(item.parent) ?? null];\n case \"type\":\n return [toNonEmptyStringOrUndefined(item.type) ?? null];\n case \"status\":\n return [toNonEmptyStringOrUndefined(item.status) ?? null];\n case \"priority\":\n return [typeof item.priority === \"number\" ? `P${item.priority}` : null];\n default: {\n const prefix = options.tagPrefix?.trim();\n const tags = Array.isArray(item.tags) ? item.tags : [];\n const matching = tags.filter(\n (tag) => typeof tag === \"string\" && tag.length > 0 && (!prefix || tag.startsWith(prefix)),\n );\n return matching.length > 0 ? matching : [null];\n }\n }\n}\n\n/**\n * Group items by a dimension into lifecycle-bucketed rows. Blank keys render\n * with an explicit \"(unassigned)\"-style label. Rows are sorted by total\n * descending, then label ascending, with the empty group sorted last on ties.\n */\nexport function groupItemsByDimension(\n items: readonly CoverageItem[],\n dimension: GroupDimension,\n classifier: LifecycleClassifier,\n options: GroupOptions = {},\n): GroupedBreakdown {\n const rows = new Map<string, GroupRow>();\n let totalItems = 0;\n for (const item of items) {\n totalItems += 1;\n const bucket = classifier.classify(item.status);\n for (const key of groupKeysForItem(item, dimension, options)) {\n const mapKey = key ?? \"\u0000empty\";\n let row = rows.get(mapKey);\n if (!row) {\n row = {\n label: key ?? emptyGroupLabel(dimension),\n key,\n buckets: emptyBuckets(),\n total: 0,\n };\n rows.set(mapKey, row);\n }\n row.buckets[bucket] += 1;\n row.total += 1;\n }\n }\n const sorted = [...rows.values()].sort((left, right) => {\n if (right.total !== left.total) {\n return right.total - left.total;\n }\n // All blank-key items collapse into a single row per dimension, so at most\n // one row has key === null; it sorts last on ties.\n if (left.key === null) {\n return 1;\n }\n if (right.key === null) {\n return -1;\n }\n return left.label.localeCompare(right.label);\n });\n return { dimension, rows: sorted, total_items: totalItems };\n}\n\n/** Lifecycle-bucket distribution across all items (for stats lifecycle section). */\nexport function computeLifecycleDistribution(\n items: readonly CoverageItem[],\n classifier: LifecycleClassifier,\n): Record<LifecycleBucket, number> {\n const buckets = emptyBuckets();\n for (const item of items) {\n buckets[classifier.classify(item.status)] += 1;\n }\n return buckets;\n}\n"],"names":[],"mappings":"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","debugId":"b4e4ec6f-75b8-5083-b9b2-aab7e7028e85"}
@@ -1 +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 return extractPackageManagerPmInvocationArgs(executable, args);\n}\n\nfunction extractPackageManagerPmInvocationArgs(executable: string, args: string[]): string[] | null {\n const parsed = parsePackageManagerPmInvocation(executable, args);\n if (!parsed || (!isPmExecutableToken(parsed.command) && !isPmCliPackageToken(parsed.command))) {\n return null;\n }\n return parsed.args;\n}\n\nfunction parsePackageManagerPmInvocation(executable: string, args: string[]): { command: string; args: string[] } | null {\n if (executable === \"npx\" || executable === \"bunx\") {\n return parseNpxCommand(args);\n }\n if (executable === \"pnpm\") {\n return parsePnpmDlxCommand(args);\n }\n if (executable === \"npm\") {\n return parseNpmExecCommand(args);\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 nodeArgsInvokeUnsafeDirectTestRunner(args);\n }\n return packageManagerInvokesUnsafeDirectTestRunner(executable, args);\n}\n\nfunction nodeArgsInvokeUnsafeDirectTestRunner(args: string[]): boolean {\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\nfunction packageManagerInvokesUnsafeDirectTestRunner(executable: string, args: string[]): boolean {\n if (executable === \"npx\" || executable === \"bunx\") {\n return isDirectTestRunnerSubcommand(parseNpxCommand(args)?.command);\n }\n if (executable === \"pnpm\" || executable === \"npm\") {\n return (\n isDirectTestRunnerSubcommand(parsePackageManagerPmInvocation(executable, args)?.command) ||\n firstDirectTestRunnerSubcommand(executable, args) === \"vitest\"\n );\n }\n return (executable === \"yarn\" || executable === \"bun\") && firstDirectTestRunnerSubcommand(executable, args) === \"vitest\";\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(parseAddEntry);\n}\n\nfunction parseAddEntry(entry: string): LinkedTest {\n const trimmed = entry.trim();\n const kv = looksLikeStructuredLinkedTestEntry(trimmed)\n ? normalizeStructuredLinkedTestEntry(parseCsvKv(entry, \"--add\"), \"--add\")\n : { command: trimmed };\n const command = trimLinkedTestEntryField(kv.command);\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 assertNoRecursiveTestAllCommand(command);\n assertSandboxSafeTestRunnerCommand(command);\n return {\n command,\n path: trimLinkedTestEntryField(kv.path),\n scope: ensureScope(kv.scope),\n timeout_seconds: parseLinkedTestTimeoutSeconds(\n trimLinkedTestEntryField(kv.timeout_seconds),\n trimLinkedTestEntryField(kv.timeout),\n ),\n pm_context_mode: parseLinkedTestContextModeValue(trimLinkedTestEntryField(kv.pm_context_mode), \"--add\"),\n env_set: parseLinkedTestEnvSetValue(trimLinkedTestEntryField(kv.env_set), \"--add\"),\n env_clear: parseLinkedTestEnvClearValue(trimLinkedTestEntryField(kv.env_clear), \"--add\"),\n shared_host_safe: parseLinkedTestBooleanValue(trimLinkedTestEntryField(kv.shared_host_safe), \"--add\", \"shared_host_safe\"),\n assert_stdout_contains: parseLinkedTestStringList(trimLinkedTestEntryField(kv.assert_stdout_contains)),\n assert_stdout_regex: parseLinkedTestRegexList(trimLinkedTestEntryField(kv.assert_stdout_regex), \"--add\", \"assert_stdout_regex\"),\n assert_stderr_contains: parseLinkedTestStringList(trimLinkedTestEntryField(kv.assert_stderr_contains)),\n assert_stderr_regex: parseLinkedTestRegexList(trimLinkedTestEntryField(kv.assert_stderr_regex), \"--add\", \"assert_stderr_regex\"),\n assert_stdout_min_lines: parseLinkedTestMinLines(trimLinkedTestEntryField(kv.assert_stdout_min_lines), \"--add\"),\n assert_json_field_equals: parseLinkedTestAssertionEqualsMap(trimLinkedTestEntryField(kv.assert_json_field_equals), \"--add\"),\n assert_json_field_gte: parseLinkedTestAssertionGteMap(trimLinkedTestEntryField(kv.assert_json_field_gte), \"--add\"),\n note: trimLinkedTestEntryField(kv.note),\n };\n}\n\nfunction trimLinkedTestEntryField(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction parseLinkedTestTimeoutSeconds(timeoutSecondsRaw: string | undefined, timeoutAliasRaw: string | undefined): number | undefined {\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 return timeoutRaw === undefined ? undefined : Math.floor(parseOptionalNumber(timeoutRaw, \"timeout_seconds\"));\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 failures.push(...evaluateContainsAssertions(\"stdout\", stdout, linkedTest.assert_stdout_contains));\n failures.push(...evaluateRegexAssertions(\"stdout\", stdout, linkedTest.assert_stdout_regex));\n failures.push(...evaluateContainsAssertions(\"stderr\", stderr, linkedTest.assert_stderr_contains));\n failures.push(...evaluateRegexAssertions(\"stderr\", stderr, linkedTest.assert_stderr_regex));\n failures.push(...evaluateStdoutLineCountAssertion(stdout, linkedTest.assert_stdout_min_lines));\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\nfunction evaluateContainsAssertions(streamName: \"stdout\" | \"stderr\", output: string, expectedValues: string[] | undefined): string[] {\n const failures: string[] = [];\n for (const expected of expectedValues ?? []) {\n if (!output.includes(expected)) {\n failures.push(`${streamName} missing required text: \"${expected}\"`);\n }\n }\n return failures;\n}\n\nfunction evaluateRegexAssertions(streamName: \"stdout\" | \"stderr\", output: string, patterns: string[] | undefined): string[] {\n const failures: string[] = [];\n for (const pattern of patterns ?? []) {\n try {\n const regex = new RegExp(pattern, \"m\");\n if (!regex.test(output)) {\n failures.push(`${streamName} failed regex assertion: /${pattern}/m`);\n }\n } catch (error: unknown) {\n failures.push(`${streamName} regex assertion is invalid: /${pattern}/ (${error instanceof Error ? error.message : String(error)})`);\n }\n }\n return failures;\n}\n\nfunction evaluateStdoutLineCountAssertion(stdout: string, minimum: number | undefined): string[] {\n if (typeof minimum !== \"number\") {\n return [];\n }\n const lineCount = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0).length;\n return lineCount < minimum ? [`stdout line count ${lineCount} is below required minimum ${minimum}`] : [];\n}\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":"a2588018-8995-5c3e-b957-a7afc236729b"}