@unbrained/pm-cli 2026.5.30 → 2026.6.5

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 (578) hide show
  1. package/CHANGELOG.md +152 -0
  2. package/dist/cli/argv-utils.js +7 -3
  3. package/dist/cli/argv-utils.js.map +1 -1
  4. package/dist/cli/bootstrap-args.d.ts +1 -0
  5. package/dist/cli/bootstrap-args.js +23 -3
  6. package/dist/cli/bootstrap-args.js.map +1 -1
  7. package/dist/cli/commands/calendar.js +96 -10
  8. package/dist/cli/commands/calendar.js.map +1 -1
  9. package/dist/cli/commands/close-many.d.ts +63 -0
  10. package/dist/cli/commands/close-many.js +302 -0
  11. package/dist/cli/commands/close-many.js.map +1 -0
  12. package/dist/cli/commands/completion.d.ts +1 -0
  13. package/dist/cli/commands/completion.js +241 -27
  14. package/dist/cli/commands/completion.js.map +1 -1
  15. package/dist/cli/commands/config.d.ts +4 -4
  16. package/dist/cli/commands/config.js +115 -3
  17. package/dist/cli/commands/config.js.map +1 -1
  18. package/dist/cli/commands/contracts.js +191 -162
  19. package/dist/cli/commands/contracts.js.map +1 -1
  20. package/dist/cli/commands/create.d.ts +1 -0
  21. package/dist/cli/commands/create.js +109 -116
  22. package/dist/cli/commands/create.js.map +1 -1
  23. package/dist/cli/commands/extension/doctor.d.ts +12 -0
  24. package/dist/cli/commands/extension/doctor.js +97 -2
  25. package/dist/cli/commands/extension/doctor.js.map +1 -1
  26. package/dist/cli/commands/extension/install-sources.d.ts +2 -0
  27. package/dist/cli/commands/extension/install-sources.js +11 -4
  28. package/dist/cli/commands/extension/install-sources.js.map +1 -1
  29. package/dist/cli/commands/extension/scaffold.js +49 -48
  30. package/dist/cli/commands/extension/scaffold.js.map +1 -1
  31. package/dist/cli/commands/extension.js +51 -23
  32. package/dist/cli/commands/extension.js.map +1 -1
  33. package/dist/cli/commands/get.js +7 -7
  34. package/dist/cli/commands/get.js.map +1 -1
  35. package/dist/cli/commands/health.js +38 -3
  36. package/dist/cli/commands/health.js.map +1 -1
  37. package/dist/cli/commands/index.d.ts +2 -1
  38. package/dist/cli/commands/index.js +4 -3
  39. package/dist/cli/commands/index.js.map +1 -1
  40. package/dist/cli/commands/init.d.ts +10 -0
  41. package/dist/cli/commands/init.js +107 -4
  42. package/dist/cli/commands/init.js.map +1 -1
  43. package/dist/cli/commands/list.d.ts +5 -0
  44. package/dist/cli/commands/list.js +58 -26
  45. package/dist/cli/commands/list.js.map +1 -1
  46. package/dist/cli/commands/reindex.js +164 -48
  47. package/dist/cli/commands/reindex.js.map +1 -1
  48. package/dist/cli/commands/repeatable-metadata-parsers.d.ts +15 -0
  49. package/dist/cli/commands/repeatable-metadata-parsers.js +120 -0
  50. package/dist/cli/commands/repeatable-metadata-parsers.js.map +1 -0
  51. package/dist/cli/commands/restore.js +25 -4
  52. package/dist/cli/commands/restore.js.map +1 -1
  53. package/dist/cli/commands/schema.d.ts +122 -1
  54. package/dist/cli/commands/schema.js +536 -6
  55. package/dist/cli/commands/schema.js.map +1 -1
  56. package/dist/cli/commands/search.d.ts +18 -0
  57. package/dist/cli/commands/search.js +56 -12
  58. package/dist/cli/commands/search.js.map +1 -1
  59. package/dist/cli/commands/test.js +4 -3
  60. package/dist/cli/commands/test.js.map +1 -1
  61. package/dist/cli/commands/update-many.js +69 -140
  62. package/dist/cli/commands/update-many.js.map +1 -1
  63. package/dist/cli/commands/update.d.ts +2 -0
  64. package/dist/cli/commands/update.js +138 -119
  65. package/dist/cli/commands/update.js.map +1 -1
  66. package/dist/cli/commands/validate.d.ts +1 -0
  67. package/dist/cli/commands/validate.js +63 -33
  68. package/dist/cli/commands/validate.js.map +1 -1
  69. package/dist/cli/error-guidance.js +26 -3
  70. package/dist/cli/error-guidance.js.map +1 -1
  71. package/dist/cli/help-content.js +82 -3
  72. package/dist/cli/help-content.js.map +1 -1
  73. package/dist/cli/main.js +377 -23
  74. package/dist/cli/main.js.map +1 -1
  75. package/dist/cli/register-list-query.js +16 -12
  76. package/dist/cli/register-list-query.js.map +1 -1
  77. package/dist/cli/register-mutation.js +217 -47
  78. package/dist/cli/register-mutation.js.map +1 -1
  79. package/dist/cli/register-operations.js +34 -25
  80. package/dist/cli/register-operations.js.map +1 -1
  81. package/dist/cli/register-setup.js +8 -8
  82. package/dist/cli/register-setup.js.map +1 -1
  83. package/dist/cli/registration-helpers.js +35 -5
  84. package/dist/cli/registration-helpers.js.map +1 -1
  85. package/dist/cli/search-refresh.d.ts +2 -0
  86. package/dist/cli/search-refresh.js +13 -0
  87. package/dist/cli/search-refresh.js.map +1 -0
  88. package/dist/cli-bundle/chunks/activity-3RWRRNOW.js +20 -0
  89. package/dist/cli-bundle/chunks/activity-3RWRRNOW.js.map +1 -0
  90. package/dist/cli-bundle/chunks/activity-P5BUMWP3.js +16 -0
  91. package/dist/cli-bundle/chunks/activity-P5BUMWP3.js.map +7 -0
  92. package/dist/cli-bundle/chunks/aggregate-J35K7WZB.js +206 -0
  93. package/dist/cli-bundle/chunks/aggregate-J35K7WZB.js.map +1 -0
  94. package/dist/cli-bundle/chunks/aggregate-OOAGKWRG.js +209 -0
  95. package/dist/cli-bundle/chunks/aggregate-OOAGKWRG.js.map +7 -0
  96. package/dist/cli-bundle/chunks/append-5JE3YGXU.js +72 -0
  97. package/dist/cli-bundle/chunks/append-5JE3YGXU.js.map +7 -0
  98. package/dist/cli-bundle/chunks/append-PNN6UIBZ.js +69 -0
  99. package/dist/cli-bundle/chunks/append-PNN6UIBZ.js.map +1 -0
  100. package/dist/cli-bundle/chunks/chunk-26KTVXJW.js +218 -0
  101. package/dist/cli-bundle/chunks/chunk-26KTVXJW.js.map +1 -0
  102. package/dist/cli-bundle/chunks/chunk-3HUE7XOF.js +27 -0
  103. package/dist/cli-bundle/chunks/chunk-3HUE7XOF.js.map +7 -0
  104. package/dist/cli-bundle/chunks/chunk-3OH4DAEB.js +761 -0
  105. package/dist/cli-bundle/chunks/chunk-3OH4DAEB.js.map +7 -0
  106. package/dist/cli-bundle/chunks/chunk-4LTBNUYT.js +5553 -0
  107. package/dist/cli-bundle/chunks/chunk-4LTBNUYT.js.map +1 -0
  108. package/dist/cli-bundle/chunks/chunk-4PJQSECJ.js +634 -0
  109. package/dist/cli-bundle/chunks/chunk-4PJQSECJ.js.map +7 -0
  110. package/dist/cli-bundle/chunks/chunk-4QCR4QW3.js +1832 -0
  111. package/dist/cli-bundle/chunks/chunk-4QCR4QW3.js.map +1 -0
  112. package/dist/cli-bundle/chunks/chunk-5IRA6IYD.js +1891 -0
  113. package/dist/cli-bundle/chunks/chunk-5IRA6IYD.js.map +7 -0
  114. package/dist/cli-bundle/chunks/chunk-5KB4X7YY.js +412 -0
  115. package/dist/cli-bundle/chunks/chunk-5KB4X7YY.js.map +1 -0
  116. package/dist/cli-bundle/chunks/chunk-5PAOPUZX.js +182 -0
  117. package/dist/cli-bundle/chunks/chunk-5PAOPUZX.js.map +1 -0
  118. package/dist/cli-bundle/chunks/chunk-7K24QB23.js +698 -0
  119. package/dist/cli-bundle/chunks/chunk-7K24QB23.js.map +1 -0
  120. package/dist/cli-bundle/chunks/chunk-A6PEXMYN.js +380 -0
  121. package/dist/cli-bundle/chunks/chunk-A6PEXMYN.js.map +1 -0
  122. package/dist/cli-bundle/chunks/chunk-ASQM3IF5.js +230 -0
  123. package/dist/cli-bundle/chunks/chunk-ASQM3IF5.js.map +1 -0
  124. package/dist/cli-bundle/chunks/chunk-ATBVS6WW.js +185 -0
  125. package/dist/cli-bundle/chunks/chunk-ATBVS6WW.js.map +7 -0
  126. package/dist/cli-bundle/chunks/chunk-AXXKLVTW.js +332 -0
  127. package/dist/cli-bundle/chunks/chunk-AXXKLVTW.js.map +1 -0
  128. package/dist/cli-bundle/chunks/chunk-B3N4TKNL.js +1681 -0
  129. package/dist/cli-bundle/chunks/chunk-B3N4TKNL.js.map +7 -0
  130. package/dist/cli-bundle/chunks/{chunk-PB2YU2E3.js → chunk-BNL6S7QH.js} +28 -70
  131. package/dist/cli-bundle/chunks/chunk-BNL6S7QH.js.map +7 -0
  132. package/dist/cli-bundle/chunks/chunk-CCUFLH4J.js +154 -0
  133. package/dist/cli-bundle/chunks/chunk-CCUFLH4J.js.map +1 -0
  134. package/dist/cli-bundle/chunks/chunk-CJDQB2ED.js +341 -0
  135. package/dist/cli-bundle/chunks/chunk-CJDQB2ED.js.map +7 -0
  136. package/dist/cli-bundle/chunks/chunk-CWT53EYT.js +1340 -0
  137. package/dist/cli-bundle/chunks/chunk-CWT53EYT.js.map +1 -0
  138. package/dist/cli-bundle/chunks/chunk-D3WUNETC.js +349 -0
  139. package/dist/cli-bundle/chunks/chunk-D3WUNETC.js.map +7 -0
  140. package/dist/cli-bundle/chunks/chunk-D5X7N6FI.js +1714 -0
  141. package/dist/cli-bundle/chunks/chunk-D5X7N6FI.js.map +7 -0
  142. package/dist/cli-bundle/chunks/chunk-DFIZGAI5.js +550 -0
  143. package/dist/cli-bundle/chunks/chunk-DFIZGAI5.js.map +7 -0
  144. package/dist/cli-bundle/chunks/chunk-DFUSXJDE.js +1704 -0
  145. package/dist/cli-bundle/chunks/chunk-DFUSXJDE.js.map +1 -0
  146. package/dist/cli-bundle/chunks/chunk-EAOG77HM.js +56 -0
  147. package/dist/cli-bundle/chunks/chunk-EAOG77HM.js.map +7 -0
  148. package/dist/cli-bundle/chunks/chunk-EHXPIKKP.js +2988 -0
  149. package/dist/cli-bundle/chunks/chunk-EHXPIKKP.js.map +1 -0
  150. package/dist/cli-bundle/chunks/chunk-FVXM3GKS.js +128 -0
  151. package/dist/cli-bundle/chunks/chunk-FVXM3GKS.js.map +1 -0
  152. package/dist/cli-bundle/chunks/chunk-G5BACLYH.js +454 -0
  153. package/dist/cli-bundle/chunks/chunk-G5BACLYH.js.map +1 -0
  154. package/dist/cli-bundle/chunks/chunk-GCAVRLGE.js +383 -0
  155. package/dist/cli-bundle/chunks/chunk-GCAVRLGE.js.map +7 -0
  156. package/dist/cli-bundle/chunks/chunk-GFWHHMVV.js +57 -0
  157. package/dist/cli-bundle/chunks/chunk-GFWHHMVV.js.map +1 -0
  158. package/dist/cli-bundle/chunks/chunk-GNHVV4SY.js +3860 -0
  159. package/dist/cli-bundle/chunks/chunk-GNHVV4SY.js.map +1 -0
  160. package/dist/cli-bundle/chunks/chunk-GPGAYASV.js +346 -0
  161. package/dist/cli-bundle/chunks/chunk-GPGAYASV.js.map +1 -0
  162. package/dist/cli-bundle/chunks/chunk-HPH6X4ZZ.js +1356 -0
  163. package/dist/cli-bundle/chunks/chunk-HPH6X4ZZ.js.map +7 -0
  164. package/dist/cli-bundle/chunks/chunk-HZOS2UG5.js +342 -0
  165. package/dist/cli-bundle/chunks/chunk-HZOS2UG5.js.map +7 -0
  166. package/dist/cli-bundle/chunks/chunk-IUV734HF.js +17 -0
  167. package/dist/cli-bundle/chunks/chunk-IUV734HF.js.map +1 -0
  168. package/dist/cli-bundle/chunks/chunk-J27KIHTG.js +15 -0
  169. package/dist/cli-bundle/chunks/chunk-J27KIHTG.js.map +1 -0
  170. package/dist/cli-bundle/chunks/chunk-JB4RGL4V.js +185 -0
  171. package/dist/cli-bundle/chunks/chunk-JB4RGL4V.js.map +7 -0
  172. package/dist/cli-bundle/chunks/chunk-JQI2HE55.js +130 -0
  173. package/dist/cli-bundle/chunks/chunk-JQI2HE55.js.map +1 -0
  174. package/dist/cli-bundle/chunks/chunk-K47WAYQV.js +60 -0
  175. package/dist/cli-bundle/chunks/chunk-K47WAYQV.js.map +7 -0
  176. package/dist/cli-bundle/chunks/chunk-KA24HME7.js +79 -0
  177. package/dist/cli-bundle/chunks/chunk-KA24HME7.js.map +7 -0
  178. package/dist/cli-bundle/chunks/chunk-KBG47ZOY.js +1325 -0
  179. package/dist/cli-bundle/chunks/chunk-KBG47ZOY.js.map +1 -0
  180. package/dist/cli-bundle/chunks/chunk-KCMIYKTA.js +242 -0
  181. package/dist/cli-bundle/chunks/chunk-KCMIYKTA.js.map +1 -0
  182. package/dist/cli-bundle/chunks/chunk-KK6YPGH3.js +221 -0
  183. package/dist/cli-bundle/chunks/chunk-KK6YPGH3.js.map +7 -0
  184. package/dist/cli-bundle/chunks/chunk-LDJK7SHN.js +157 -0
  185. package/dist/cli-bundle/chunks/chunk-LDJK7SHN.js.map +7 -0
  186. package/dist/cli-bundle/chunks/chunk-LXYVKYMQ.js +24 -0
  187. package/dist/cli-bundle/chunks/chunk-LXYVKYMQ.js.map +1 -0
  188. package/dist/cli-bundle/chunks/chunk-MISYRLEP.js +80 -0
  189. package/dist/cli-bundle/chunks/chunk-MISYRLEP.js.map +1 -0
  190. package/dist/cli-bundle/chunks/chunk-N5YF3VFN.js +457 -0
  191. package/dist/cli-bundle/chunks/chunk-N5YF3VFN.js.map +7 -0
  192. package/dist/cli-bundle/chunks/chunk-NQP3ECKF.js +173 -0
  193. package/dist/cli-bundle/chunks/chunk-NQP3ECKF.js.map +1 -0
  194. package/dist/cli-bundle/chunks/chunk-O5IBJE6S.js +338 -0
  195. package/dist/cli-bundle/chunks/chunk-O5IBJE6S.js.map +1 -0
  196. package/dist/cli-bundle/chunks/chunk-O7IWB35H.js +18 -0
  197. package/dist/cli-bundle/chunks/chunk-O7IWB35H.js.map +7 -0
  198. package/dist/cli-bundle/chunks/chunk-OIQIXTNB.js +3040 -0
  199. package/dist/cli-bundle/chunks/chunk-OIQIXTNB.js.map +7 -0
  200. package/dist/cli-bundle/chunks/chunk-ORTLYVA4.js +751 -0
  201. package/dist/cli-bundle/chunks/chunk-ORTLYVA4.js.map +1 -0
  202. package/dist/cli-bundle/chunks/chunk-OUF3ARDX.js +1861 -0
  203. package/dist/cli-bundle/chunks/chunk-OUF3ARDX.js.map +7 -0
  204. package/dist/cli-bundle/chunks/chunk-QAJBIGRA.js +20 -0
  205. package/dist/cli-bundle/chunks/chunk-QAJBIGRA.js.map +7 -0
  206. package/dist/cli-bundle/chunks/chunk-RANZIID5.js +176 -0
  207. package/dist/cli-bundle/chunks/chunk-RANZIID5.js.map +7 -0
  208. package/dist/cli-bundle/chunks/chunk-RQAWLSUU.js +140 -0
  209. package/dist/cli-bundle/chunks/chunk-RQAWLSUU.js.map +7 -0
  210. package/dist/cli-bundle/chunks/chunk-S3CV7JGJ.js +233 -0
  211. package/dist/cli-bundle/chunks/chunk-S3CV7JGJ.js.map +7 -0
  212. package/dist/cli-bundle/chunks/chunk-SRVKTWPR.js +5705 -0
  213. package/dist/cli-bundle/chunks/chunk-SRVKTWPR.js.map +7 -0
  214. package/dist/cli-bundle/chunks/chunk-SSFMJCPF.js +76 -0
  215. package/dist/cli-bundle/chunks/chunk-SSFMJCPF.js.map +1 -0
  216. package/dist/cli-bundle/chunks/chunk-SZQCER6S.js +631 -0
  217. package/dist/cli-bundle/chunks/chunk-SZQCER6S.js.map +1 -0
  218. package/dist/cli-bundle/chunks/chunk-T2ORWB6D.js +540 -0
  219. package/dist/cli-bundle/chunks/chunk-T2ORWB6D.js.map +1 -0
  220. package/dist/cli-bundle/chunks/chunk-TBQVUNVH.js +422 -0
  221. package/dist/cli-bundle/chunks/chunk-TBQVUNVH.js.map +7 -0
  222. package/dist/cli-bundle/chunks/{chunk-RJONRNXN.js → chunk-TK633IVD.js} +51 -32
  223. package/dist/cli-bundle/chunks/chunk-TK633IVD.js.map +7 -0
  224. package/dist/cli-bundle/chunks/chunk-TQ3ZK6VD.js +131 -0
  225. package/dist/cli-bundle/chunks/chunk-TQ3ZK6VD.js.map +7 -0
  226. package/dist/cli-bundle/chunks/chunk-UFCG3SWR.js +119 -0
  227. package/dist/cli-bundle/chunks/chunk-UFCG3SWR.js.map +1 -0
  228. package/dist/cli-bundle/chunks/chunk-UOVLWB47.js +1664 -0
  229. package/dist/cli-bundle/chunks/chunk-UOVLWB47.js.map +1 -0
  230. package/dist/cli-bundle/chunks/chunk-V3JQ4IPL.js +186 -0
  231. package/dist/cli-bundle/chunks/chunk-V3JQ4IPL.js.map +1 -0
  232. package/dist/cli-bundle/chunks/chunk-VGO2T3TY.js +182 -0
  233. package/dist/cli-bundle/chunks/chunk-VGO2T3TY.js.map +1 -0
  234. package/dist/cli-bundle/chunks/chunk-WIKR7KFL.js +189 -0
  235. package/dist/cli-bundle/chunks/chunk-WIKR7KFL.js.map +7 -0
  236. package/dist/cli-bundle/chunks/chunk-XG7RJYHV.js +1385 -0
  237. package/dist/cli-bundle/chunks/chunk-XG7RJYHV.js.map +7 -0
  238. package/dist/cli-bundle/chunks/chunk-XSLQSXAH.js +53 -0
  239. package/dist/cli-bundle/chunks/chunk-XSLQSXAH.js.map +1 -0
  240. package/dist/cli-bundle/chunks/chunk-XX5LRINW.js +90 -0
  241. package/dist/cli-bundle/chunks/chunk-XX5LRINW.js.map +7 -0
  242. package/dist/cli-bundle/chunks/chunk-Y2AKE2HS.js +252 -0
  243. package/dist/cli-bundle/chunks/chunk-Y2AKE2HS.js.map +7 -0
  244. package/dist/cli-bundle/chunks/chunk-ZQ4F6EC4.js +3898 -0
  245. package/dist/cli-bundle/chunks/chunk-ZQ4F6EC4.js.map +7 -0
  246. package/dist/cli-bundle/chunks/chunk-ZRVSMOMR.js +1809 -0
  247. package/dist/cli-bundle/chunks/chunk-ZRVSMOMR.js.map +1 -0
  248. package/dist/cli-bundle/chunks/claim-AZLP7YFO.js +132 -0
  249. package/dist/cli-bundle/chunks/claim-AZLP7YFO.js.map +7 -0
  250. package/dist/cli-bundle/chunks/claim-ZFA7HKU4.js +129 -0
  251. package/dist/cli-bundle/chunks/claim-ZFA7HKU4.js.map +1 -0
  252. package/dist/cli-bundle/chunks/close-65DFYAVS.js +17 -0
  253. package/dist/cli-bundle/chunks/close-65DFYAVS.js.map +1 -0
  254. package/dist/cli-bundle/chunks/close-RMHQ3KWH.js +13 -0
  255. package/dist/cli-bundle/chunks/close-RMHQ3KWH.js.map +7 -0
  256. package/dist/cli-bundle/chunks/close-many-AKPZNSGI.js +311 -0
  257. package/dist/cli-bundle/chunks/close-many-AKPZNSGI.js.map +1 -0
  258. package/dist/cli-bundle/chunks/close-many-UKZSQGM7.js +314 -0
  259. package/dist/cli-bundle/chunks/close-many-UKZSQGM7.js.map +7 -0
  260. package/dist/cli-bundle/chunks/comments-AGBNSJJH.js +103 -0
  261. package/dist/cli-bundle/chunks/comments-AGBNSJJH.js.map +7 -0
  262. package/dist/cli-bundle/chunks/comments-CJWXQI7X.js +100 -0
  263. package/dist/cli-bundle/chunks/comments-CJWXQI7X.js.map +1 -0
  264. package/dist/cli-bundle/chunks/config-5ON3ADRH.js +1688 -0
  265. package/dist/cli-bundle/chunks/config-5ON3ADRH.js.map +7 -0
  266. package/dist/cli-bundle/chunks/config-DDPYIA6J.js +1671 -0
  267. package/dist/cli-bundle/chunks/config-DDPYIA6J.js.map +1 -0
  268. package/dist/cli-bundle/chunks/context-E6U3DWVM.js +1471 -0
  269. package/dist/cli-bundle/chunks/context-E6U3DWVM.js.map +7 -0
  270. package/dist/cli-bundle/chunks/context-ZOJEN5VT.js +1461 -0
  271. package/dist/cli-bundle/chunks/context-ZOJEN5VT.js.map +1 -0
  272. package/dist/cli-bundle/chunks/contracts-CXSFM45B.js +1277 -0
  273. package/dist/cli-bundle/chunks/contracts-CXSFM45B.js.map +7 -0
  274. package/dist/cli-bundle/chunks/contracts-LCSX5R53.js +1274 -0
  275. package/dist/cli-bundle/chunks/contracts-LCSX5R53.js.map +1 -0
  276. package/dist/cli-bundle/chunks/create-ATONSAZW.js +27 -0
  277. package/dist/cli-bundle/chunks/create-ATONSAZW.js.map +7 -0
  278. package/dist/cli-bundle/chunks/create-WYFKN2U4.js +31 -0
  279. package/dist/cli-bundle/chunks/create-WYFKN2U4.js.map +1 -0
  280. package/dist/cli-bundle/chunks/delete-RONNH4F4.js +58 -0
  281. package/dist/cli-bundle/chunks/delete-RONNH4F4.js.map +7 -0
  282. package/dist/cli-bundle/chunks/delete-ZXWC56WO.js +55 -0
  283. package/dist/cli-bundle/chunks/delete-ZXWC56WO.js.map +1 -0
  284. package/dist/cli-bundle/chunks/deps-EHXIFOZR.js +225 -0
  285. package/dist/cli-bundle/chunks/deps-EHXIFOZR.js.map +1 -0
  286. package/dist/cli-bundle/chunks/deps-WII3O4HB.js +228 -0
  287. package/dist/cli-bundle/chunks/deps-WII3O4HB.js.map +7 -0
  288. package/dist/cli-bundle/chunks/docs-JMVCFNHH.js +34 -0
  289. package/dist/cli-bundle/chunks/docs-JMVCFNHH.js.map +7 -0
  290. package/dist/cli-bundle/chunks/docs-PDREIMLS.js +31 -0
  291. package/dist/cli-bundle/chunks/docs-PDREIMLS.js.map +1 -0
  292. package/dist/cli-bundle/chunks/extension-B4ROVWJD.js +28 -0
  293. package/dist/cli-bundle/chunks/extension-B4ROVWJD.js.map +1 -0
  294. package/dist/cli-bundle/chunks/extension-G6UXSM5S.js +24 -0
  295. package/dist/cli-bundle/chunks/extension-G6UXSM5S.js.map +7 -0
  296. package/dist/cli-bundle/chunks/files-2PN7UM2D.js +282 -0
  297. package/dist/cli-bundle/chunks/files-2PN7UM2D.js.map +1 -0
  298. package/dist/cli-bundle/chunks/files-MXYS5W4M.js +285 -0
  299. package/dist/cli-bundle/chunks/files-MXYS5W4M.js.map +7 -0
  300. package/dist/cli-bundle/chunks/gc-GT552UJH.js +178 -0
  301. package/dist/cli-bundle/chunks/gc-GT552UJH.js.map +1 -0
  302. package/dist/cli-bundle/chunks/gc-QNBRJG6H.js +181 -0
  303. package/dist/cli-bundle/chunks/gc-QNBRJG6H.js.map +7 -0
  304. package/dist/cli-bundle/chunks/get-CINFEUIY.js +197 -0
  305. package/dist/cli-bundle/chunks/get-CINFEUIY.js.map +7 -0
  306. package/dist/cli-bundle/chunks/get-WXMLRG7M.js +194 -0
  307. package/dist/cli-bundle/chunks/get-WXMLRG7M.js.map +1 -0
  308. package/dist/cli-bundle/chunks/health-5VPOJQ53.js +1258 -0
  309. package/dist/cli-bundle/chunks/health-5VPOJQ53.js.map +1 -0
  310. package/dist/cli-bundle/chunks/health-IT5DBPRJ.js +1261 -0
  311. package/dist/cli-bundle/chunks/health-IT5DBPRJ.js.map +7 -0
  312. package/dist/cli-bundle/chunks/history-6FC4H6HI.js +20 -0
  313. package/dist/cli-bundle/chunks/history-6FC4H6HI.js.map +7 -0
  314. package/dist/cli-bundle/chunks/history-FLZIP7PM.js +24 -0
  315. package/dist/cli-bundle/chunks/history-FLZIP7PM.js.map +1 -0
  316. package/dist/cli-bundle/chunks/history-redact-SSZBAD76.js +23 -0
  317. package/dist/cli-bundle/chunks/history-redact-SSZBAD76.js.map +1 -0
  318. package/dist/cli-bundle/chunks/history-redact-XKYEZDBL.js +19 -0
  319. package/dist/cli-bundle/chunks/history-redact-XKYEZDBL.js.map +7 -0
  320. package/dist/cli-bundle/chunks/history-repair-KC5ZOJRZ.js +196 -0
  321. package/dist/cli-bundle/chunks/history-repair-KC5ZOJRZ.js.map +7 -0
  322. package/dist/cli-bundle/chunks/history-repair-X7CO5JJZ.js +193 -0
  323. package/dist/cli-bundle/chunks/history-repair-X7CO5JJZ.js.map +1 -0
  324. package/dist/cli-bundle/chunks/init-6MRFVOLH.js +20 -0
  325. package/dist/cli-bundle/chunks/init-6MRFVOLH.js.map +1 -0
  326. package/dist/cli-bundle/chunks/init-KHX3FEEM.js +16 -0
  327. package/dist/cli-bundle/chunks/init-KHX3FEEM.js.map +7 -0
  328. package/dist/cli-bundle/chunks/learnings-A3CLB5CO.js +47 -0
  329. package/dist/cli-bundle/chunks/learnings-A3CLB5CO.js.map +7 -0
  330. package/dist/cli-bundle/chunks/learnings-DCX55BNX.js +44 -0
  331. package/dist/cli-bundle/chunks/learnings-DCX55BNX.js.map +1 -0
  332. package/dist/cli-bundle/chunks/list-53LZ2AEO.js +20 -0
  333. package/dist/cli-bundle/chunks/list-53LZ2AEO.js.map +7 -0
  334. package/dist/cli-bundle/chunks/list-DBRECOG4.js +24 -0
  335. package/dist/cli-bundle/chunks/list-DBRECOG4.js.map +1 -0
  336. package/dist/cli-bundle/chunks/notes-42LIC3UE.js +47 -0
  337. package/dist/cli-bundle/chunks/notes-42LIC3UE.js.map +7 -0
  338. package/dist/cli-bundle/chunks/notes-P5O3VMQ3.js +44 -0
  339. package/dist/cli-bundle/chunks/notes-P5O3VMQ3.js.map +1 -0
  340. package/dist/cli-bundle/chunks/plan-HDQXEUKD.js +1174 -0
  341. package/dist/cli-bundle/chunks/plan-HDQXEUKD.js.map +7 -0
  342. package/dist/cli-bundle/chunks/plan-IGTE3WOJ.js +1171 -0
  343. package/dist/cli-bundle/chunks/plan-IGTE3WOJ.js.map +1 -0
  344. package/dist/cli-bundle/chunks/{register-list-query-EIVQ5FMR.js → register-list-query-AG3XKXWL.js} +25 -18
  345. package/dist/cli-bundle/chunks/register-list-query-AG3XKXWL.js.map +7 -0
  346. package/dist/cli-bundle/chunks/register-list-query-EMNSIUO4.js +227 -0
  347. package/dist/cli-bundle/chunks/register-list-query-EMNSIUO4.js.map +1 -0
  348. package/dist/cli-bundle/chunks/register-mutation-M3YS6XDO.js +813 -0
  349. package/dist/cli-bundle/chunks/register-mutation-M3YS6XDO.js.map +1 -0
  350. package/dist/cli-bundle/chunks/{register-mutation-RSZNPSGI.js → register-mutation-RSMT6DPK.js} +160 -39
  351. package/dist/cli-bundle/chunks/register-mutation-RSMT6DPK.js.map +7 -0
  352. package/dist/cli-bundle/chunks/register-operations-KYUOOOOD.js +370 -0
  353. package/dist/cli-bundle/chunks/register-operations-KYUOOOOD.js.map +1 -0
  354. package/dist/cli-bundle/chunks/{register-operations-APUSYDMR.js → register-operations-Q54JQZUN.js} +50 -32
  355. package/dist/cli-bundle/chunks/register-operations-Q54JQZUN.js.map +7 -0
  356. package/dist/cli-bundle/chunks/register-setup-DI6P7X75.js +242 -0
  357. package/dist/cli-bundle/chunks/register-setup-DI6P7X75.js.map +1 -0
  358. package/dist/cli-bundle/chunks/{register-setup-OZOKSMPJ.js → register-setup-YJKIQRKA.js} +21 -13
  359. package/dist/cli-bundle/chunks/register-setup-YJKIQRKA.js.map +7 -0
  360. package/dist/cli-bundle/chunks/restore-2XVTBLKQ.js +21 -0
  361. package/dist/cli-bundle/chunks/restore-2XVTBLKQ.js.map +1 -0
  362. package/dist/cli-bundle/chunks/restore-JL5QIH7H.js +17 -0
  363. package/dist/cli-bundle/chunks/restore-JL5QIH7H.js.map +7 -0
  364. package/dist/cli-bundle/chunks/schema-LVXZWFGY.js +770 -0
  365. package/dist/cli-bundle/chunks/schema-LVXZWFGY.js.map +1 -0
  366. package/dist/cli-bundle/chunks/schema-V6BX65Q2.js +780 -0
  367. package/dist/cli-bundle/chunks/schema-V6BX65Q2.js.map +7 -0
  368. package/dist/cli-bundle/chunks/search-5A3BMFA7.js +1144 -0
  369. package/dist/cli-bundle/chunks/search-5A3BMFA7.js.map +7 -0
  370. package/dist/cli-bundle/chunks/search-C7NPB7G7.js +1127 -0
  371. package/dist/cli-bundle/chunks/search-C7NPB7G7.js.map +1 -0
  372. package/dist/cli-bundle/chunks/stats-FNLYVXTB.js +120 -0
  373. package/dist/cli-bundle/chunks/stats-FNLYVXTB.js.map +1 -0
  374. package/dist/cli-bundle/chunks/stats-Y2CBTZSL.js +123 -0
  375. package/dist/cli-bundle/chunks/stats-Y2CBTZSL.js.map +7 -0
  376. package/dist/cli-bundle/chunks/test-OFYONO3C.js +35 -0
  377. package/dist/cli-bundle/chunks/test-OFYONO3C.js.map +1 -0
  378. package/dist/cli-bundle/chunks/test-RJ4ZF35X.js +31 -0
  379. package/dist/cli-bundle/chunks/test-RJ4ZF35X.js.map +7 -0
  380. package/dist/cli-bundle/chunks/test-all-EEMKNTGU.js +331 -0
  381. package/dist/cli-bundle/chunks/test-all-EEMKNTGU.js.map +7 -0
  382. package/dist/cli-bundle/chunks/test-all-OJE6CIO7.js +328 -0
  383. package/dist/cli-bundle/chunks/test-all-OJE6CIO7.js.map +1 -0
  384. package/dist/cli-bundle/chunks/test-runs-IPOPFOAF.js +929 -0
  385. package/dist/cli-bundle/chunks/test-runs-IPOPFOAF.js.map +1 -0
  386. package/dist/cli-bundle/chunks/test-runs-L2M7WKH7.js +939 -0
  387. package/dist/cli-bundle/chunks/test-runs-L2M7WKH7.js.map +7 -0
  388. package/dist/cli-bundle/chunks/update-6YEHPVXH.js +25 -0
  389. package/dist/cli-bundle/chunks/update-6YEHPVXH.js.map +1 -0
  390. package/dist/cli-bundle/chunks/update-PYLVHMRD.js +21 -0
  391. package/dist/cli-bundle/chunks/update-PYLVHMRD.js.map +7 -0
  392. package/dist/cli-bundle/chunks/update-many-322CCH2L.js +608 -0
  393. package/dist/cli-bundle/chunks/update-many-322CCH2L.js.map +7 -0
  394. package/dist/cli-bundle/chunks/update-many-DYWGW57M.js +605 -0
  395. package/dist/cli-bundle/chunks/update-many-DYWGW57M.js.map +1 -0
  396. package/dist/cli-bundle/chunks/upgrade-2U727SAM.js +269 -0
  397. package/dist/cli-bundle/chunks/upgrade-2U727SAM.js.map +7 -0
  398. package/dist/cli-bundle/chunks/upgrade-3W3RVSNM.js +266 -0
  399. package/dist/cli-bundle/chunks/upgrade-3W3RVSNM.js.map +1 -0
  400. package/dist/cli-bundle/chunks/validate-GZ24NYHO.js +1120 -0
  401. package/dist/cli-bundle/chunks/validate-GZ24NYHO.js.map +1 -0
  402. package/dist/cli-bundle/chunks/validate-ZFVWPEEN.js +1123 -0
  403. package/dist/cli-bundle/chunks/validate-ZFVWPEEN.js.map +7 -0
  404. package/dist/cli-bundle/main.js +615 -121
  405. package/dist/cli-bundle/main.js.map +4 -4
  406. package/dist/core/checkpoint/mutation-checkpoint.d.ts +44 -0
  407. package/dist/core/checkpoint/mutation-checkpoint.js +119 -0
  408. package/dist/core/checkpoint/mutation-checkpoint.js.map +1 -0
  409. package/dist/core/config/positional-value.js +4 -2
  410. package/dist/core/config/positional-value.js.map +1 -1
  411. package/dist/core/diagnostics/remediation.d.ts +73 -0
  412. package/dist/core/diagnostics/remediation.js +328 -0
  413. package/dist/core/diagnostics/remediation.js.map +1 -0
  414. package/dist/core/extensions/extension-hook-runtime.js +9 -2
  415. package/dist/core/extensions/extension-hook-runtime.js.map +1 -1
  416. package/dist/core/extensions/extension-types.d.ts +60 -4
  417. package/dist/core/extensions/extension-types.js +2 -2
  418. package/dist/core/extensions/extension-types.js.map +1 -1
  419. package/dist/core/extensions/index.d.ts +5 -1
  420. package/dist/core/extensions/index.js +61 -2
  421. package/dist/core/extensions/index.js.map +1 -1
  422. package/dist/core/extensions/item-fields.d.ts +5 -1
  423. package/dist/core/extensions/item-fields.js +126 -4
  424. package/dist/core/extensions/item-fields.js.map +1 -1
  425. package/dist/core/extensions/loader.js +283 -8
  426. package/dist/core/extensions/loader.js.map +1 -1
  427. package/dist/core/item/item-format.d.ts +3 -2
  428. package/dist/core/item/item-format.js +15 -10
  429. package/dist/core/item/item-format.js.map +1 -1
  430. package/dist/core/item/item-type-definition.js +6 -2
  431. package/dist/core/item/item-type-definition.js.map +1 -1
  432. package/dist/core/item/status-filter.d.ts +29 -0
  433. package/dist/core/item/status-filter.js +97 -0
  434. package/dist/core/item/status-filter.js.map +1 -0
  435. package/dist/core/item/type-registry.d.ts +4 -0
  436. package/dist/core/item/type-registry.js +12 -2
  437. package/dist/core/item/type-registry.js.map +1 -1
  438. package/dist/core/output/output.js +17 -5
  439. package/dist/core/output/output.js.map +1 -1
  440. package/dist/core/schema/item-types-file.d.ts +15 -0
  441. package/dist/core/schema/item-types-file.js +27 -2
  442. package/dist/core/schema/item-types-file.js.map +1 -1
  443. package/dist/core/schema/runtime-field-filters.js +4 -3
  444. package/dist/core/schema/runtime-field-filters.js.map +1 -1
  445. package/dist/core/schema/runtime-field-values.d.ts +1 -1
  446. package/dist/core/schema/runtime-field-values.js +10 -4
  447. package/dist/core/schema/runtime-field-values.js.map +1 -1
  448. package/dist/core/schema/runtime-schema.js +75 -2
  449. package/dist/core/schema/runtime-schema.js.map +1 -1
  450. package/dist/core/schema/status-defs-file.d.ts +113 -0
  451. package/dist/core/schema/status-defs-file.js +260 -0
  452. package/dist/core/schema/status-defs-file.js.map +1 -0
  453. package/dist/core/schema/type-workflows.d.ts +64 -0
  454. package/dist/core/schema/type-workflows.js +98 -0
  455. package/dist/core/schema/type-workflows.js.map +1 -0
  456. package/dist/core/search/background-refresh.d.ts +53 -0
  457. package/dist/core/search/background-refresh.js +286 -0
  458. package/dist/core/search/background-refresh.js.map +1 -0
  459. package/dist/core/search/cache.d.ts +23 -2
  460. package/dist/core/search/cache.js +135 -30
  461. package/dist/core/search/cache.js.map +1 -1
  462. package/dist/core/search/http-client.d.ts +2 -2
  463. package/dist/core/search/http-client.js +2 -2
  464. package/dist/core/search/http-client.js.map +1 -1
  465. package/dist/core/search/vector-stores.d.ts +1 -0
  466. package/dist/core/search/vector-stores.js +69 -15
  467. package/dist/core/search/vector-stores.js.map +1 -1
  468. package/dist/core/search/vectorization-metadata.d.ts +13 -0
  469. package/dist/core/search/vectorization-metadata.js +65 -0
  470. package/dist/core/search/vectorization-metadata.js.map +1 -0
  471. package/dist/core/shared/constants.d.ts +2 -2
  472. package/dist/core/shared/constants.js +2 -3
  473. package/dist/core/shared/constants.js.map +1 -1
  474. package/dist/core/shared/serialization.d.ts +1 -0
  475. package/dist/core/shared/serialization.js +86 -2
  476. package/dist/core/shared/serialization.js.map +1 -1
  477. package/dist/core/store/front-matter-cache.js +14 -5
  478. package/dist/core/store/front-matter-cache.js.map +1 -1
  479. package/dist/core/store/item-format-migration.js +25 -15
  480. package/dist/core/store/item-format-migration.js.map +1 -1
  481. package/dist/core/store/item-store.d.ts +2 -0
  482. package/dist/core/store/item-store.js +61 -6
  483. package/dist/core/store/item-store.js.map +1 -1
  484. package/dist/core/store/settings-validator.js +22 -2
  485. package/dist/core/store/settings-validator.js.map +1 -1
  486. package/dist/core/store/settings.js +40 -5
  487. package/dist/core/store/settings.js.map +1 -1
  488. package/dist/core/telemetry/consent.js +3 -3
  489. package/dist/core/telemetry/consent.js.map +1 -1
  490. package/dist/core/telemetry/observability.js +4 -3
  491. package/dist/core/telemetry/observability.js.map +1 -1
  492. package/dist/core/telemetry/runtime.d.ts +10 -0
  493. package/dist/core/telemetry/runtime.js +86 -2
  494. package/dist/core/telemetry/runtime.js.map +1 -1
  495. package/dist/mcp/server.js +221 -12
  496. package/dist/mcp/server.js.map +1 -1
  497. package/dist/sdk/cli-contracts/commander-mutation-options.js +16 -2
  498. package/dist/sdk/cli-contracts/commander-mutation-options.js.map +1 -1
  499. package/dist/sdk/cli-contracts/commander-types.js +7 -2
  500. package/dist/sdk/cli-contracts/commander-types.js.map +1 -1
  501. package/dist/sdk/cli-contracts/enum-contracts.d.ts +2 -2
  502. package/dist/sdk/cli-contracts/enum-contracts.js +4 -2
  503. package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -1
  504. package/dist/sdk/cli-contracts/tool-option-contracts.d.ts +1 -0
  505. package/dist/sdk/cli-contracts/tool-option-contracts.js +53 -3
  506. package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -1
  507. package/dist/sdk/cli-contracts/tool-parameter-tables.js +37 -8
  508. package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
  509. package/dist/sdk/cli-contracts.d.ts +19 -1
  510. package/dist/sdk/cli-contracts.js +211 -18
  511. package/dist/sdk/cli-contracts.js.map +1 -1
  512. package/dist/sdk/errors.d.ts +22 -0
  513. package/dist/sdk/errors.js +46 -0
  514. package/dist/sdk/errors.js.map +1 -0
  515. package/dist/sdk/index.d.ts +2 -1
  516. package/dist/sdk/index.js +3 -2
  517. package/dist/sdk/index.js.map +1 -1
  518. package/dist/sdk/package-import-adapters.js +14 -3
  519. package/dist/sdk/package-import-adapters.js.map +1 -1
  520. package/dist/sdk/runtime.d.ts +1 -0
  521. package/dist/sdk/runtime.js +3 -2
  522. package/dist/sdk/runtime.js.map +1 -1
  523. package/dist/sdk/testing.d.ts +77 -0
  524. package/dist/sdk/testing.js +239 -0
  525. package/dist/sdk/testing.js.map +1 -0
  526. package/dist/types.d.ts +26 -1
  527. package/dist/types.js +3 -2
  528. package/dist/types.js.map +1 -1
  529. package/docs/AGENT_GUIDE.md +21 -2
  530. package/docs/COMMANDS.md +85 -5
  531. package/docs/CONFIGURATION.md +49 -2
  532. package/docs/EXTENSIONS.md +118 -6
  533. package/docs/QUICKSTART.md +2 -0
  534. package/docs/RELEASING.md +3 -3
  535. package/docs/SDK.md +273 -1
  536. package/docs/TESTING.md +17 -0
  537. package/docs/examples/policy-restricted-extension/manifest.json +1 -0
  538. package/docs/examples/starter-extension/index.js +9 -1
  539. package/docs/examples/starter-extension/manifest.json +1 -0
  540. package/package.json +12 -7
  541. package/packages/pm-beads/extensions/beads/index.js +2 -4
  542. package/packages/pm-beads/extensions/beads/index.ts +43 -33
  543. package/packages/pm-beads/extensions/beads/manifest.json +12 -1
  544. package/packages/pm-calendar/README.md +6 -0
  545. package/packages/pm-calendar/extensions/calendar/index.js +6 -1
  546. package/packages/pm-calendar/extensions/calendar/index.ts +6 -1
  547. package/packages/pm-calendar/extensions/calendar/manifest.json +6 -1
  548. package/packages/pm-governance-audit/extensions/governance-audit/manifest.json +6 -1
  549. package/packages/pm-guide-shell/README.md +4 -0
  550. package/packages/pm-guide-shell/extensions/guide-shell/index.js +22 -0
  551. package/packages/pm-guide-shell/extensions/guide-shell/index.ts +22 -0
  552. package/packages/pm-guide-shell/extensions/guide-shell/manifest.json +6 -1
  553. package/packages/pm-guide-shell/extensions/guide-shell/runtime.js +74 -3
  554. package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +84 -4
  555. package/packages/pm-lifecycle-hooks/README.md +29 -0
  556. package/packages/pm-lifecycle-hooks/extensions/lifecycle-hooks/index.js +18 -0
  557. package/packages/pm-lifecycle-hooks/extensions/lifecycle-hooks/index.ts +20 -0
  558. package/packages/pm-lifecycle-hooks/extensions/lifecycle-hooks/manifest.json +9 -0
  559. package/packages/pm-lifecycle-hooks/package.json +52 -0
  560. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/manifest.json +13 -1
  561. package/packages/pm-search-advanced/extensions/search-advanced/index.js +69 -1
  562. package/packages/pm-search-advanced/extensions/search-advanced/index.ts +91 -2
  563. package/packages/pm-search-advanced/extensions/search-advanced/manifest.json +13 -1
  564. package/packages/pm-templates/extensions/templates/manifest.json +6 -1
  565. package/packages/pm-todos/extensions/todos/index.js +3 -7
  566. package/packages/pm-todos/extensions/todos/index.ts +55 -42
  567. package/packages/pm-todos/extensions/todos/manifest.json +13 -1
  568. package/scripts/bundle-cli.mjs +121 -17
  569. package/dist/cli-bundle/chunks/chunk-PB2YU2E3.js.map +0 -7
  570. package/dist/cli-bundle/chunks/chunk-RJONRNXN.js.map +0 -7
  571. package/dist/cli-bundle/chunks/chunk-SW5BMMCU.js +0 -13864
  572. package/dist/cli-bundle/chunks/chunk-SW5BMMCU.js.map +0 -7
  573. package/dist/cli-bundle/chunks/commands-XJ4TJ5UN.js +0 -24225
  574. package/dist/cli-bundle/chunks/commands-XJ4TJ5UN.js.map +0 -7
  575. package/dist/cli-bundle/chunks/register-list-query-EIVQ5FMR.js.map +0 -7
  576. package/dist/cli-bundle/chunks/register-mutation-RSZNPSGI.js.map +0 -7
  577. package/dist/cli-bundle/chunks/register-operations-APUSYDMR.js.map +0 -7
  578. package/dist/cli-bundle/chunks/register-setup-OZOKSMPJ.js.map +0 -7
@@ -0,0 +1,1123 @@
1
+ import {
2
+ extractReferencedPmItemIdsFromCommand
3
+ } from "./chunk-B3N4TKNL.js";
4
+ import {
5
+ buildRemediationCommands,
6
+ scanHistoryDrift
7
+ } from "./chunk-TBQVUNVH.js";
8
+ import "./chunk-S3CV7JGJ.js";
9
+ import "./chunk-Y2AKE2HS.js";
10
+ import "./chunk-CJDQB2ED.js";
11
+ import "./chunk-3OH4DAEB.js";
12
+ import "./chunk-KK6YPGH3.js";
13
+ import "./chunk-OIQIXTNB.js";
14
+ import "./chunk-3HUE7XOF.js";
15
+ import {
16
+ listAllFrontMatterWithBody
17
+ } from "./chunk-XG7RJYHV.js";
18
+ import "./chunk-KA24HME7.js";
19
+ import {
20
+ normalizeStatusInput
21
+ } from "./chunk-HPH6X4ZZ.js";
22
+ import {
23
+ resolveItemTypeRegistry
24
+ } from "./chunk-4PJQSECJ.js";
25
+ import {
26
+ nowIso
27
+ } from "./chunk-RANZIID5.js";
28
+ import {
29
+ DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS,
30
+ DEFAULT_VALIDATE_STALE_BLOCKER_REASON_PATTERNS,
31
+ EXIT_CODE,
32
+ PM_DIRNAME,
33
+ PmCliError,
34
+ getActiveExtensionRegistrations,
35
+ getSettingsPath,
36
+ pathExists,
37
+ readSettings,
38
+ resolvePmRoot,
39
+ resolveRuntimeStatusRegistry,
40
+ toNonEmptyStringOrUndefined
41
+ } from "./chunk-SRVKTWPR.js";
42
+
43
+ // dist/cli/commands/validate.js
44
+ import fs from "node:fs/promises";
45
+ import { realpathSync } from "node:fs";
46
+ import { execFile } from "node:child_process";
47
+ import path from "node:path";
48
+ import { promisify } from "node:util";
49
+ !(function() {
50
+ try {
51
+ var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
52
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "776e2ca9-52d6-5274-9230-4d9b961456e5");
53
+ } catch (e2) {
54
+ }
55
+ })();
56
+ var FILE_SCAN_DIRECTORIES = ["src", "tests", "docs"];
57
+ var FILE_SCAN_ROOT_FILES = [
58
+ "README.md",
59
+ "PRD.md",
60
+ "CHANGELOG.md",
61
+ "AGENTS.md",
62
+ "CONTRIBUTING.md",
63
+ "SECURITY.md",
64
+ "CODE_OF_CONDUCT.md",
65
+ "LICENSE"
66
+ ];
67
+ var DIRECTORY_IGNORE_SET = /* @__PURE__ */ new Set(["node_modules", ".git", ".cursor", ".agents", "dist", "coverage"]);
68
+ var RESOLUTION_FIELD_KEYS = ["resolution", "expected_result", "actual_result"];
69
+ var VALIDATE_FILE_SCAN_MODES = ["default", "tracked-all", "tracked-all-strict"];
70
+ var VALIDATE_METADATA_PROFILE_VALUES = ["core", "strict", "custom"];
71
+ var VALIDATE_DEPENDENCY_CYCLE_SEVERITY_VALUES = ["off", "warn", "error"];
72
+ var CORE_METADATA_REQUIRED_FIELDS = ["author", "acceptance_criteria", "estimated_minutes", "close_reason"];
73
+ var STRICT_METADATA_REQUIRED_FIELDS = [
74
+ ...CORE_METADATA_REQUIRED_FIELDS,
75
+ "reviewer",
76
+ "risk",
77
+ "confidence",
78
+ "sprint",
79
+ "release"
80
+ ];
81
+ var SUPPORTED_METADATA_REQUIRED_FIELDS = [
82
+ .../* @__PURE__ */ new Set([...STRICT_METADATA_REQUIRED_FIELDS])
83
+ ];
84
+ var METADATA_REQUIRED_FIELD_ALIASES = {
85
+ author: "author",
86
+ acceptance_criteria: "acceptance_criteria",
87
+ "acceptance-criteria": "acceptance_criteria",
88
+ estimated_minutes: "estimated_minutes",
89
+ "estimated-minutes": "estimated_minutes",
90
+ estimate: "estimated_minutes",
91
+ close_reason: "close_reason",
92
+ "close-reason": "close_reason",
93
+ reviewer: "reviewer",
94
+ risk: "risk",
95
+ confidence: "confidence",
96
+ sprint: "sprint",
97
+ release: "release"
98
+ };
99
+ var METADATA_WARNING_TOKEN_BY_FIELD = {
100
+ author: "validate_metadata_missing_author",
101
+ acceptance_criteria: "validate_metadata_missing_acceptance_criteria",
102
+ estimated_minutes: "validate_metadata_missing_estimate",
103
+ close_reason: "validate_metadata_missing_close_reason",
104
+ reviewer: "validate_metadata_missing_reviewer",
105
+ risk: "validate_metadata_missing_risk",
106
+ confidence: "validate_metadata_missing_confidence",
107
+ sprint: "validate_metadata_missing_sprint",
108
+ release: "validate_metadata_missing_release"
109
+ };
110
+ var METADATA_COUNT_KEY_BY_FIELD = {
111
+ author: "missing_author",
112
+ acceptance_criteria: "missing_acceptance_criteria",
113
+ estimated_minutes: "missing_estimated_minutes",
114
+ close_reason: "closed_missing_close_reason",
115
+ reviewer: "missing_reviewer",
116
+ risk: "missing_risk",
117
+ confidence: "missing_confidence",
118
+ sprint: "missing_sprint",
119
+ release: "missing_release"
120
+ };
121
+ var METADATA_ITEM_IDS_KEY_BY_FIELD = {
122
+ author: "missing_author_item_ids",
123
+ acceptance_criteria: "missing_acceptance_criteria_item_ids",
124
+ estimated_minutes: "missing_estimated_minutes_item_ids",
125
+ close_reason: "closed_missing_close_reason_item_ids",
126
+ reviewer: "missing_reviewer_item_ids",
127
+ risk: "missing_risk_item_ids",
128
+ confidence: "missing_confidence_item_ids",
129
+ sprint: "missing_sprint_item_ids",
130
+ release: "missing_release_item_ids"
131
+ };
132
+ var METADATA_TRUNCATED_KEY_BY_FIELD = {
133
+ author: "missing_author_truncated",
134
+ acceptance_criteria: "missing_acceptance_criteria_truncated",
135
+ estimated_minutes: "missing_estimated_minutes_truncated",
136
+ close_reason: "closed_missing_close_reason_truncated",
137
+ reviewer: "missing_reviewer_truncated",
138
+ risk: "missing_risk_truncated",
139
+ confidence: "missing_confidence_truncated",
140
+ sprint: "missing_sprint_truncated",
141
+ release: "missing_release_truncated"
142
+ };
143
+ var GIT_LS_FILES_MAX_BUFFER = 32 * 1024 * 1024;
144
+ var FILE_LIST_SUMMARY_LIMIT = 40;
145
+ var DIAGNOSTIC_LIST_SUMMARY_LIMIT = 5;
146
+ var execFileAsync = promisify(execFile);
147
+ function normalizeRelativePath(value) {
148
+ return value.replaceAll("\\", "/").replace(/^\.\/+/, "").replace(/^\/+/, "");
149
+ }
150
+ function normalizeRelativeDirectoryPath(value) {
151
+ const normalized = normalizeRelativePath(value);
152
+ return normalized.replace(/\/+$/, "");
153
+ }
154
+ function toMeaningfulString(value) {
155
+ const normalized = toNonEmptyStringOrUndefined(value);
156
+ if (!normalized) {
157
+ return void 0;
158
+ }
159
+ const lowered = normalized.toLowerCase();
160
+ if (lowered === "none" || lowered === "null" || lowered === "n/a" || lowered === "na") {
161
+ return void 0;
162
+ }
163
+ return normalized;
164
+ }
165
+ function normalizeStatusForRegistry(status, statusRegistry) {
166
+ return normalizeStatusInput(status, statusRegistry) ?? status;
167
+ }
168
+ function isTerminalStatus(status, statusRegistry) {
169
+ return statusRegistry.terminal_statuses.has(normalizeStatusForRegistry(status, statusRegistry));
170
+ }
171
+ function normalizeLifecyclePatternList(values) {
172
+ return [...new Set((values ?? []).map((value) => value.trim().toLowerCase()).filter((value) => value.length > 0))].sort((left, right) => left.localeCompare(right));
173
+ }
174
+ function areSortedStringListsEqual(left, right) {
175
+ if (left.length !== right.length) {
176
+ return false;
177
+ }
178
+ return left.every((value, index) => value === right[index]);
179
+ }
180
+ function resolveLifecyclePatternPolicy(settings) {
181
+ const defaultStalePatterns = normalizeLifecyclePatternList(DEFAULT_VALIDATE_STALE_BLOCKER_REASON_PATTERNS);
182
+ const defaultClosureLikePatterns = {
183
+ blocked_reason: normalizeLifecyclePatternList(DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS.blocked_reason),
184
+ resolution: normalizeLifecyclePatternList(DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS.resolution),
185
+ actual_result: normalizeLifecyclePatternList(DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS.actual_result)
186
+ };
187
+ const staleBlockerReasonPatterns = normalizeLifecyclePatternList(settings.validation.lifecycle_stale_blocker_reason_patterns);
188
+ const closureLikePatterns = {
189
+ blocked_reason: normalizeLifecyclePatternList(settings.validation.lifecycle_closure_like_blocked_reason_patterns),
190
+ resolution: normalizeLifecyclePatternList(settings.validation.lifecycle_closure_like_resolution_patterns),
191
+ actual_result: normalizeLifecyclePatternList(settings.validation.lifecycle_closure_like_actual_result_patterns)
192
+ };
193
+ return {
194
+ stale_blocker_reason_patterns: staleBlockerReasonPatterns,
195
+ stale_blocker_reason_pattern_source: areSortedStringListsEqual(staleBlockerReasonPatterns, defaultStalePatterns) ? "default" : "settings",
196
+ closure_like_metadata_field_patterns: closureLikePatterns,
197
+ closure_like_metadata_field_pattern_sources: {
198
+ blocked_reason: areSortedStringListsEqual(closureLikePatterns.blocked_reason, defaultClosureLikePatterns.blocked_reason) ? "default" : "settings",
199
+ resolution: areSortedStringListsEqual(closureLikePatterns.resolution, defaultClosureLikePatterns.resolution) ? "default" : "settings",
200
+ actual_result: areSortedStringListsEqual(closureLikePatterns.actual_result, defaultClosureLikePatterns.actual_result) ? "default" : "settings"
201
+ }
202
+ };
203
+ }
204
+ function resolveValidateMetadataProfile(value) {
205
+ const normalized = value?.trim().toLowerCase();
206
+ if (!normalized || normalized.length === 0) {
207
+ return "core";
208
+ }
209
+ if (VALIDATE_METADATA_PROFILE_VALUES.includes(normalized)) {
210
+ return normalized;
211
+ }
212
+ throw new PmCliError(`Unknown --metadata-profile value "${value}". Supported values: ${VALIDATE_METADATA_PROFILE_VALUES.join(", ")}.`, EXIT_CODE.USAGE);
213
+ }
214
+ function resolveDependencyCycleSeverity(value) {
215
+ const normalized = value?.trim().toLowerCase();
216
+ if (!normalized || normalized.length === 0) {
217
+ return "warn";
218
+ }
219
+ if (VALIDATE_DEPENDENCY_CYCLE_SEVERITY_VALUES.includes(normalized)) {
220
+ return normalized;
221
+ }
222
+ throw new PmCliError(`Unknown --dependency-cycle-severity value "${value}". Supported values: ${VALIDATE_DEPENDENCY_CYCLE_SEVERITY_VALUES.join(", ")}.`, EXIT_CODE.USAGE);
223
+ }
224
+ function normalizeMetadataRequiredFieldsFromSettings(values) {
225
+ const normalized = [...new Set((values ?? []).map((value) => value.trim().toLowerCase().replaceAll("-", "_")))];
226
+ return normalized.map((value) => METADATA_REQUIRED_FIELD_ALIASES[value]).filter((value) => value !== void 0).sort((left, right) => left.localeCompare(right));
227
+ }
228
+ function resolveValidateMetadataPolicy(profile, profileSource, configuredCustomFields) {
229
+ const normalizedCustomFields = normalizeMetadataRequiredFieldsFromSettings(configuredCustomFields);
230
+ if (profile === "core") {
231
+ return {
232
+ profile,
233
+ profile_source: profileSource,
234
+ required_fields: [...CORE_METADATA_REQUIRED_FIELDS],
235
+ configured_custom_fields: normalizedCustomFields,
236
+ fallback_to_core: false,
237
+ warnings: []
238
+ };
239
+ }
240
+ if (profile === "strict") {
241
+ return {
242
+ profile,
243
+ profile_source: profileSource,
244
+ required_fields: [...STRICT_METADATA_REQUIRED_FIELDS],
245
+ configured_custom_fields: normalizedCustomFields,
246
+ fallback_to_core: false,
247
+ warnings: []
248
+ };
249
+ }
250
+ if (normalizedCustomFields.length > 0) {
251
+ return {
252
+ profile,
253
+ profile_source: profileSource,
254
+ required_fields: normalizedCustomFields,
255
+ configured_custom_fields: normalizedCustomFields,
256
+ fallback_to_core: false,
257
+ warnings: []
258
+ };
259
+ }
260
+ return {
261
+ profile,
262
+ profile_source: profileSource,
263
+ required_fields: [...CORE_METADATA_REQUIRED_FIELDS],
264
+ configured_custom_fields: normalizedCustomFields,
265
+ fallback_to_core: true,
266
+ warnings: ["validate_metadata_custom_profile_missing_required_fields:0"]
267
+ };
268
+ }
269
+ function isMetadataFieldMissing(item, field, statusRegistry) {
270
+ if (field === "author") {
271
+ return !toNonEmptyStringOrUndefined(item.author);
272
+ }
273
+ if (field === "acceptance_criteria") {
274
+ return !toNonEmptyStringOrUndefined(item.acceptance_criteria);
275
+ }
276
+ if (field === "estimated_minutes") {
277
+ return !Number.isFinite(item.estimated_minutes);
278
+ }
279
+ if (field === "close_reason") {
280
+ return normalizeStatusForRegistry(item.status, statusRegistry) === statusRegistry.close_status && !toNonEmptyStringOrUndefined(item.close_reason);
281
+ }
282
+ if (field === "reviewer") {
283
+ return !toNonEmptyStringOrUndefined(item.reviewer);
284
+ }
285
+ if (field === "risk") {
286
+ return !toNonEmptyStringOrUndefined(item.risk);
287
+ }
288
+ if (field === "confidence") {
289
+ if (typeof item.confidence === "number") {
290
+ return !Number.isFinite(item.confidence);
291
+ }
292
+ return !toNonEmptyStringOrUndefined(item.confidence);
293
+ }
294
+ if (field === "sprint") {
295
+ return !toNonEmptyStringOrUndefined(item.sprint);
296
+ }
297
+ return !toNonEmptyStringOrUndefined(item.release);
298
+ }
299
+ function resolveFileScanMode(scanMode) {
300
+ if (scanMode === void 0) {
301
+ return "default";
302
+ }
303
+ const normalized = scanMode.trim().toLowerCase();
304
+ if (normalized.length === 0) {
305
+ return "default";
306
+ }
307
+ if (normalized === "default") {
308
+ return "default";
309
+ }
310
+ if (normalized === "tracked-all" || normalized === "tracked_all") {
311
+ return "tracked-all";
312
+ }
313
+ if (normalized === "tracked-all-strict" || normalized === "tracked_all_strict") {
314
+ return "tracked-all-strict";
315
+ }
316
+ throw new PmCliError(`Unknown --scan-mode value "${scanMode}". Supported values: ${VALIDATE_FILE_SCAN_MODES.join(", ")}.`, EXIT_CODE.USAGE);
317
+ }
318
+ function resolveWorkspaceRoot(pmRoot) {
319
+ const resolvedPmRoot = path.resolve(pmRoot);
320
+ const normalizedPmRoot = resolvedPmRoot.replaceAll("\\", "/");
321
+ if (normalizedPmRoot.endsWith("/.agents/pm")) {
322
+ return path.dirname(path.dirname(resolvedPmRoot));
323
+ }
324
+ const resolvedCwd = path.resolve(process.cwd());
325
+ const canonicalPmRoot = realpathForWorkspaceRoot(resolvedPmRoot);
326
+ const canonicalCwd = realpathForWorkspaceRoot(resolvedCwd);
327
+ const relativeFromPmRoot = path.relative(canonicalPmRoot, canonicalCwd);
328
+ const cwdInsidePmRoot = relativeFromPmRoot.length === 0 || !relativeFromPmRoot.startsWith("..") && !path.isAbsolute(relativeFromPmRoot);
329
+ if (cwdInsidePmRoot) {
330
+ return resolvedPmRoot;
331
+ }
332
+ return resolvedCwd;
333
+ }
334
+ function realpathForWorkspaceRoot(inputPath) {
335
+ try {
336
+ return realpathSync.native(inputPath);
337
+ } catch {
338
+ return path.resolve(inputPath);
339
+ }
340
+ }
341
+ async function listFilesRecursive(basePath, relativePath, output) {
342
+ const targetDirectory = relativePath.length > 0 ? path.join(basePath, relativePath) : basePath;
343
+ let entries;
344
+ try {
345
+ entries = await fs.readdir(targetDirectory, { withFileTypes: true });
346
+ } catch (error) {
347
+ if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") {
348
+ return;
349
+ }
350
+ throw error;
351
+ }
352
+ for (const entry of entries) {
353
+ if (entry.name.startsWith(".")) {
354
+ continue;
355
+ }
356
+ const childRelative = relativePath.length > 0 ? path.join(relativePath, entry.name) : entry.name;
357
+ if (entry.isDirectory()) {
358
+ if (DIRECTORY_IGNORE_SET.has(entry.name)) {
359
+ continue;
360
+ }
361
+ await listFilesRecursive(basePath, childRelative, output);
362
+ continue;
363
+ }
364
+ if (!entry.isFile()) {
365
+ continue;
366
+ }
367
+ output.push(normalizeRelativePath(childRelative));
368
+ }
369
+ }
370
+ async function collectDefaultProjectFileCandidates(workspaceRoot) {
371
+ const discovered = [];
372
+ for (const directory of FILE_SCAN_DIRECTORIES) {
373
+ await listFilesRecursive(workspaceRoot, directory, discovered);
374
+ }
375
+ for (const candidate of FILE_SCAN_ROOT_FILES) {
376
+ const absolute = path.join(workspaceRoot, candidate);
377
+ try {
378
+ const stats = await fs.stat(absolute);
379
+ if (stats.isFile()) {
380
+ discovered.push(normalizeRelativePath(candidate));
381
+ }
382
+ } catch {
383
+ }
384
+ }
385
+ return [...new Set(discovered)].sort((left, right) => left.localeCompare(right));
386
+ }
387
+ async function collectTrackedGitFileCandidates(workspaceRoot) {
388
+ try {
389
+ const { stdout } = await execFileAsync("git", ["ls-files", "-z"], {
390
+ cwd: workspaceRoot,
391
+ encoding: "utf8",
392
+ maxBuffer: GIT_LS_FILES_MAX_BUFFER,
393
+ windowsHide: true
394
+ });
395
+ const discovered = stdout.split("\0").map((value) => normalizeRelativePath(value)).filter((value) => value.length > 0);
396
+ return [...new Set(discovered)].sort((left, right) => left.localeCompare(right));
397
+ } catch {
398
+ return null;
399
+ }
400
+ }
401
+ function resolvePmInternalCandidatePrefixes(pmRoot, workspaceRoot) {
402
+ const prefixes = /* @__PURE__ */ new Set();
403
+ const configuredDefault = normalizeRelativeDirectoryPath(PM_DIRNAME);
404
+ if (configuredDefault.length > 0) {
405
+ prefixes.add(configuredDefault);
406
+ }
407
+ const relativePmRoot = normalizeRelativeDirectoryPath(path.relative(workspaceRoot, pmRoot));
408
+ if (relativePmRoot.length > 0 && !relativePmRoot.startsWith("..")) {
409
+ prefixes.add(relativePmRoot);
410
+ }
411
+ return [...prefixes].sort((left, right) => left.localeCompare(right));
412
+ }
413
+ function hasPathPrefix(candidate, prefixes) {
414
+ for (const prefix of prefixes) {
415
+ if (candidate === prefix || candidate.startsWith(`${prefix}/`)) {
416
+ return true;
417
+ }
418
+ }
419
+ return false;
420
+ }
421
+ async function collectProjectFileCandidates(workspaceRoot, scanMode) {
422
+ if (scanMode === "tracked-all" || scanMode === "tracked-all-strict") {
423
+ const trackedCandidates = await collectTrackedGitFileCandidates(workspaceRoot);
424
+ if (trackedCandidates) {
425
+ return {
426
+ requestedMode: scanMode,
427
+ appliedMode: scanMode,
428
+ source: "tracked-git",
429
+ candidateFiles: trackedCandidates,
430
+ candidateTotal: trackedCandidates.length,
431
+ candidateScanned: trackedCandidates.length
432
+ };
433
+ }
434
+ const fallbackCandidates = await collectDefaultProjectFileCandidates(workspaceRoot);
435
+ return {
436
+ requestedMode: scanMode,
437
+ appliedMode: "default",
438
+ source: "tracked-all-fallback-default",
439
+ candidateFiles: fallbackCandidates,
440
+ candidateTotal: fallbackCandidates.length,
441
+ candidateScanned: fallbackCandidates.length
442
+ };
443
+ }
444
+ const defaultCandidates = await collectDefaultProjectFileCandidates(workspaceRoot);
445
+ return {
446
+ requestedMode: scanMode,
447
+ appliedMode: "default",
448
+ source: "default-curated",
449
+ candidateFiles: defaultCandidates,
450
+ candidateTotal: defaultCandidates.length,
451
+ candidateScanned: defaultCandidates.length
452
+ };
453
+ }
454
+ function summarizeList(values, limit = DIAGNOSTIC_LIST_SUMMARY_LIMIT) {
455
+ if (values.length <= limit) {
456
+ return { values, truncated: false };
457
+ }
458
+ return {
459
+ values: values.slice(0, limit),
460
+ truncated: true
461
+ };
462
+ }
463
+ function summarizeFileList(values, verboseFileLists) {
464
+ if (verboseFileLists) {
465
+ return {
466
+ values,
467
+ truncated: false,
468
+ total: values.length
469
+ };
470
+ }
471
+ const summary = summarizeList(values, FILE_LIST_SUMMARY_LIMIT);
472
+ return {
473
+ values: summary.values,
474
+ truncated: summary.truncated,
475
+ total: values.length
476
+ };
477
+ }
478
+ var RESOLUTION_REMEDIATION_FLAG_BY_FIELD = {
479
+ resolution: "--resolution",
480
+ expected_result: "--expected-result",
481
+ actual_result: "--actual-result"
482
+ };
483
+ var RESOLUTION_REMEDIATION_PLACEHOLDER_BY_FIELD = {
484
+ resolution: "Describe how this item was resolved",
485
+ expected_result: "Describe the expected result",
486
+ actual_result: "Describe the actual result"
487
+ };
488
+ function buildResolutionRemediationCommand(row) {
489
+ const fieldArguments = row.missing_fields.map((field) => `${RESOLUTION_REMEDIATION_FLAG_BY_FIELD[field]} "${RESOLUTION_REMEDIATION_PLACEHOLDER_BY_FIELD[field]}"`).join(" ");
490
+ return `pm update ${row.id} ${fieldArguments} --message "Backfill resolution metadata"`;
491
+ }
492
+ function attachValidateFixHints(check, checkWarnings) {
493
+ const existingResolutionHints = check.details?.missing_resolution_remediation_hints;
494
+ const aliasedResolution = Array.isArray(existingResolutionHints) && existingResolutionHints.length > 0;
495
+ const fixHints = aliasedResolution ? existingResolutionHints.filter((hint) => typeof hint === "string") : buildRemediationCommands(checkWarnings);
496
+ if (fixHints.length === 0) {
497
+ return;
498
+ }
499
+ const truncated = aliasedResolution && check.details?.missing_resolution_remediation_hints_truncated === true;
500
+ check.details = {
501
+ ...check.details,
502
+ fix_hints: fixHints,
503
+ ...truncated ? { fix_hints_truncated: true } : {}
504
+ };
505
+ }
506
+ function resolveRequestedChecks(options) {
507
+ const requested = /* @__PURE__ */ new Set();
508
+ if (options.checkMetadata) {
509
+ requested.add("metadata");
510
+ }
511
+ if (options.checkResolution) {
512
+ requested.add("resolution");
513
+ }
514
+ if (options.checkLifecycle || options.checkStaleBlockers) {
515
+ requested.add("lifecycle");
516
+ }
517
+ if (options.checkFiles) {
518
+ requested.add("files");
519
+ }
520
+ if (options.checkHistoryDrift) {
521
+ requested.add("history_drift");
522
+ }
523
+ if (options.checkCommandReferences) {
524
+ requested.add("command_references");
525
+ }
526
+ if (requested.size === 0) {
527
+ requested.add("metadata");
528
+ requested.add("resolution");
529
+ requested.add("lifecycle");
530
+ requested.add("files");
531
+ requested.add("command_references");
532
+ requested.add("history_drift");
533
+ }
534
+ return requested;
535
+ }
536
+ function buildMetadataCheck(items, metadataPolicy, statusRegistry, verboseDiagnostics) {
537
+ const missingByField = Object.fromEntries(SUPPORTED_METADATA_REQUIRED_FIELDS.map((field) => [field, []]));
538
+ for (const item of items) {
539
+ for (const field of SUPPORTED_METADATA_REQUIRED_FIELDS) {
540
+ if (!isMetadataFieldMissing(item, field, statusRegistry)) {
541
+ continue;
542
+ }
543
+ missingByField[field].push(item.id);
544
+ }
545
+ }
546
+ const warningTokens = [...metadataPolicy.warnings];
547
+ for (const field of metadataPolicy.required_fields) {
548
+ const missingItems = missingByField[field];
549
+ if (missingItems.length === 0) {
550
+ continue;
551
+ }
552
+ warningTokens.push(`${METADATA_WARNING_TOKEN_BY_FIELD[field]}:${missingItems.length}`);
553
+ }
554
+ const counts = {};
555
+ for (const field of metadataPolicy.required_fields) {
556
+ const value = missingByField[field]?.length ?? 0;
557
+ const countKey = METADATA_COUNT_KEY_BY_FIELD[field];
558
+ if (value > 0 && countKey) {
559
+ counts[countKey] = value;
560
+ }
561
+ }
562
+ const details = {
563
+ checked_items: items.length,
564
+ metadata_profile: metadataPolicy.profile,
565
+ metadata_profile_source: metadataPolicy.profile_source,
566
+ metadata_profile_fallback_to_core: metadataPolicy.fallback_to_core,
567
+ required_fields: [...metadataPolicy.required_fields],
568
+ supported_required_fields: [...SUPPORTED_METADATA_REQUIRED_FIELDS],
569
+ counts
570
+ };
571
+ if (metadataPolicy.configured_custom_fields.length > 0) {
572
+ details.configured_custom_required_fields = [...metadataPolicy.configured_custom_fields];
573
+ }
574
+ for (const field of metadataPolicy.required_fields) {
575
+ const missing = missingByField[field];
576
+ if (!missing || missing.length === 0) {
577
+ continue;
578
+ }
579
+ const idsKey = METADATA_ITEM_IDS_KEY_BY_FIELD[field];
580
+ const truncatedKey = METADATA_TRUNCATED_KEY_BY_FIELD[field];
581
+ if (!idsKey || !truncatedKey) {
582
+ continue;
583
+ }
584
+ const summarized = summarizeList(missing, verboseDiagnostics ? missing.length : DIAGNOSTIC_LIST_SUMMARY_LIMIT);
585
+ details[idsKey] = summarized.values;
586
+ details[truncatedKey] = summarized.truncated;
587
+ }
588
+ return {
589
+ check: {
590
+ name: "metadata",
591
+ status: warningTokens.length === 0 ? "ok" : "warn",
592
+ details
593
+ },
594
+ warnings: warningTokens
595
+ };
596
+ }
597
+ function buildResolutionCheck(items, statusRegistry, verboseDiagnostics) {
598
+ const terminalDoneStatuses = new Set(statusRegistry.terminal_done_statuses);
599
+ terminalDoneStatuses.add(statusRegistry.close_status);
600
+ const closedItems = items.filter((item) => terminalDoneStatuses.has(normalizeStatusForRegistry(item.status, statusRegistry)));
601
+ const missingResolutionRows = [];
602
+ for (const item of closedItems) {
603
+ const missingFields = RESOLUTION_FIELD_KEYS.filter((field) => !toNonEmptyStringOrUndefined(item[field]));
604
+ if (missingFields.length === 0) {
605
+ continue;
606
+ }
607
+ missingResolutionRows.push({
608
+ id: item.id,
609
+ missing_fields: missingFields
610
+ });
611
+ }
612
+ const warnings = missingResolutionRows.length > 0 ? [`validate_resolution_missing_fields:${missingResolutionRows.length}`] : [];
613
+ const diagnosticLimit = verboseDiagnostics ? Number.POSITIVE_INFINITY : DIAGNOSTIC_LIST_SUMMARY_LIMIT;
614
+ const summarizedRows = summarizeList(missingResolutionRows.map((row) => `${row.id}:${row.missing_fields.join(",")}`), diagnosticLimit);
615
+ const remediationHints = missingResolutionRows.map((row) => buildResolutionRemediationCommand(row));
616
+ const summarizedHints = summarizeList(remediationHints, diagnosticLimit);
617
+ return {
618
+ check: {
619
+ name: "resolution",
620
+ status: warnings.length === 0 ? "ok" : "warn",
621
+ details: {
622
+ checked_closed_items: closedItems.length,
623
+ missing_resolution_items: missingResolutionRows.length,
624
+ missing_resolution_rows: summarizedRows.values,
625
+ missing_resolution_rows_truncated: summarizedRows.truncated,
626
+ missing_resolution_remediation_hints: summarizedHints.values,
627
+ missing_resolution_remediation_hints_truncated: summarizedHints.truncated
628
+ }
629
+ },
630
+ warnings
631
+ };
632
+ }
633
+ function buildLifecycleDependencyGraph(activeItems) {
634
+ const activeItemIds = new Set(activeItems.map((item) => item.id));
635
+ const graph = /* @__PURE__ */ new Map();
636
+ const sortedItems = [...activeItems].sort((left, right) => left.id.localeCompare(right.id));
637
+ for (const item of sortedItems) {
638
+ const edges = /* @__PURE__ */ new Set();
639
+ for (const dependency of item.dependencies ?? []) {
640
+ const dependencyId = toMeaningfulString(dependency.id);
641
+ if (!dependencyId || !activeItemIds.has(dependencyId)) {
642
+ continue;
643
+ }
644
+ edges.add(dependencyId);
645
+ }
646
+ graph.set(item.id, [...edges].sort((left, right) => left.localeCompare(right)));
647
+ }
648
+ return graph;
649
+ }
650
+ function findLifecycleDependencyCycleComponents(graph) {
651
+ let nextIndex = 0;
652
+ const indexById = /* @__PURE__ */ new Map();
653
+ const lowLinkById = /* @__PURE__ */ new Map();
654
+ const stack = [];
655
+ const inStack = /* @__PURE__ */ new Set();
656
+ const components = [];
657
+ const visit = (id) => {
658
+ indexById.set(id, nextIndex);
659
+ lowLinkById.set(id, nextIndex);
660
+ nextIndex += 1;
661
+ stack.push(id);
662
+ inStack.add(id);
663
+ for (const dependencyId of graph.get(id) ?? []) {
664
+ if (!indexById.has(dependencyId)) {
665
+ visit(dependencyId);
666
+ lowLinkById.set(id, Math.min(lowLinkById.get(id), lowLinkById.get(dependencyId)));
667
+ } else if (inStack.has(dependencyId)) {
668
+ lowLinkById.set(id, Math.min(lowLinkById.get(id), indexById.get(dependencyId)));
669
+ }
670
+ }
671
+ if (lowLinkById.get(id) !== indexById.get(id)) {
672
+ return;
673
+ }
674
+ const component = [];
675
+ while (stack.length > 0) {
676
+ const member = stack.pop();
677
+ inStack.delete(member);
678
+ component.push(member);
679
+ if (member === id) {
680
+ break;
681
+ }
682
+ }
683
+ component.sort((left, right) => left.localeCompare(right));
684
+ components.push(component);
685
+ };
686
+ const sortedNodeIds = [...graph.keys()].sort((left, right) => left.localeCompare(right));
687
+ for (const id of sortedNodeIds) {
688
+ if (!indexById.has(id)) {
689
+ visit(id);
690
+ }
691
+ }
692
+ const cycleComponents = components.filter((component) => {
693
+ if (component.length > 1) {
694
+ return true;
695
+ }
696
+ const selfId = component[0];
697
+ return (graph.get(selfId) ?? []).includes(selfId);
698
+ });
699
+ return cycleComponents.sort((left, right) => left[0].localeCompare(right[0]) || left.length - right.length || left.join(",").localeCompare(right.join(",")));
700
+ }
701
+ function resolveLifecycleDependencyCycleSamplePath(component, graph) {
702
+ const start = component[0];
703
+ if (component.length === 1) {
704
+ return [start, start];
705
+ }
706
+ const componentSet = new Set(component);
707
+ const path2 = [start];
708
+ const visited = /* @__PURE__ */ new Set([start]);
709
+ const search = (current) => {
710
+ const neighbors = (graph.get(current) ?? []).filter((candidate) => componentSet.has(candidate));
711
+ for (const next of neighbors) {
712
+ if (next === start && path2.length > 1) {
713
+ path2.push(start);
714
+ return true;
715
+ }
716
+ if (visited.has(next)) {
717
+ continue;
718
+ }
719
+ visited.add(next);
720
+ path2.push(next);
721
+ if (search(next)) {
722
+ return true;
723
+ }
724
+ path2.pop();
725
+ visited.delete(next);
726
+ }
727
+ return false;
728
+ };
729
+ if (search(start)) {
730
+ return [...path2];
731
+ }
732
+ return [...component, start];
733
+ }
734
+ function detectLifecycleDependencyCycles(activeItems) {
735
+ const graph = buildLifecycleDependencyGraph(activeItems);
736
+ const cycleComponents = findLifecycleDependencyCycleComponents(graph);
737
+ const cycleItemIds = [...new Set(cycleComponents.flat())].sort((left, right) => left.localeCompare(right));
738
+ const cycleSamplePaths = cycleComponents.map((component) => resolveLifecycleDependencyCycleSamplePath(component, graph).join("->"));
739
+ return {
740
+ cycle_count: cycleComponents.length,
741
+ cycle_item_ids: cycleItemIds,
742
+ cycle_sample_paths: cycleSamplePaths
743
+ };
744
+ }
745
+ function buildLifecycleCheck(items, includeStaleBlockers, dependencyCycleSeverity, statusRegistry, lifecyclePatternPolicy, verboseDiagnostics) {
746
+ const itemsById = new Map(items.map((item) => [item.id, item]));
747
+ const blockedStatuses = statusRegistry.blocked_statuses.size > 0 ? statusRegistry.blocked_statuses : /* @__PURE__ */ new Set(["blocked"]);
748
+ const activeItems = items.filter((item) => !isTerminalStatus(item.status, statusRegistry));
749
+ const closureLikeRows = [];
750
+ const terminalParentRows = [];
751
+ const staleBlockerRows = [];
752
+ for (const item of activeItems) {
753
+ const closureLikeFields = Object.entries(lifecyclePatternPolicy.closure_like_metadata_field_patterns).filter(([field, patterns]) => {
754
+ const value = toMeaningfulString(item[field]);
755
+ if (!value) {
756
+ return false;
757
+ }
758
+ const normalized = value.toLowerCase();
759
+ return patterns.some((pattern) => normalized.includes(pattern));
760
+ }).map(([field]) => field).sort((left, right) => left.localeCompare(right));
761
+ if (closureLikeFields.length > 0) {
762
+ closureLikeRows.push({
763
+ id: item.id,
764
+ fields: closureLikeFields
765
+ });
766
+ }
767
+ const parentId = toMeaningfulString(item.parent);
768
+ if (parentId) {
769
+ const parent = itemsById.get(parentId);
770
+ if (parent && isTerminalStatus(parent.status, statusRegistry)) {
771
+ terminalParentRows.push({
772
+ id: item.id,
773
+ parent_id: parent.id,
774
+ parent_status: parent.status
775
+ });
776
+ }
777
+ }
778
+ if (includeStaleBlockers) {
779
+ const blockedBy = toMeaningfulString(item.blocked_by);
780
+ const blockedReason = toMeaningfulString(item.blocked_reason);
781
+ const blockedReasonNormalized = blockedReason?.toLowerCase();
782
+ const reasons = [];
783
+ const normalizedStatus = normalizeStatusForRegistry(item.status, statusRegistry);
784
+ if (!blockedStatuses.has(normalizedStatus)) {
785
+ if (blockedBy) {
786
+ reasons.push("non_blocked_status_has_blocked_by");
787
+ }
788
+ if (blockedReason) {
789
+ reasons.push("non_blocked_status_has_blocked_reason");
790
+ }
791
+ } else {
792
+ if (!blockedBy && !blockedReason) {
793
+ reasons.push("blocked_status_missing_blocker_context");
794
+ }
795
+ if (blockedReasonNormalized?.includes("no active blocker")) {
796
+ reasons.push("blocked_status_reason_reports_no_active_blocker");
797
+ }
798
+ if (blockedReasonNormalized && lifecyclePatternPolicy.stale_blocker_reason_patterns.some((pattern) => blockedReasonNormalized.includes(pattern))) {
799
+ reasons.push("blocked_status_reason_matches_stale_pattern");
800
+ }
801
+ }
802
+ if (reasons.length > 0) {
803
+ staleBlockerRows.push({
804
+ id: item.id,
805
+ status: item.status,
806
+ reasons: [...new Set(reasons)].sort((left, right) => left.localeCompare(right))
807
+ });
808
+ }
809
+ }
810
+ }
811
+ closureLikeRows.sort((left, right) => left.id.localeCompare(right.id));
812
+ terminalParentRows.sort((left, right) => left.id.localeCompare(right.id) || left.parent_id.localeCompare(right.parent_id));
813
+ staleBlockerRows.sort((left, right) => left.id.localeCompare(right.id));
814
+ const dependencyCycleDiagnostics = detectLifecycleDependencyCycles(activeItems);
815
+ const warnings = [];
816
+ if (closureLikeRows.length > 0) {
817
+ warnings.push(`validate_lifecycle_active_closure_like_metadata:${closureLikeRows.length}`);
818
+ }
819
+ if (terminalParentRows.length > 0) {
820
+ warnings.push(`validate_lifecycle_active_terminal_parent:${terminalParentRows.length}`);
821
+ }
822
+ if (includeStaleBlockers && staleBlockerRows.length > 0) {
823
+ warnings.push(`validate_lifecycle_stale_blockers:${staleBlockerRows.length}`);
824
+ }
825
+ if (dependencyCycleDiagnostics.cycle_count > 0 && dependencyCycleSeverity !== "off") {
826
+ warnings.push(`${dependencyCycleSeverity === "error" ? "validate_lifecycle_dependency_cycles_error" : "validate_lifecycle_dependency_cycles"}:${dependencyCycleDiagnostics.cycle_count}`);
827
+ }
828
+ const diagnosticLimit = verboseDiagnostics ? Number.POSITIVE_INFINITY : DIAGNOSTIC_LIST_SUMMARY_LIMIT;
829
+ const summarizedClosureLikeRows = summarizeList(closureLikeRows.map((row) => `${row.id}:${row.fields.join(",")}`), diagnosticLimit);
830
+ const summarizedTerminalParentRows = summarizeList(terminalParentRows.map((row) => `${row.id}:${row.parent_id}:${row.parent_status}`), diagnosticLimit);
831
+ const summarizedStaleBlockerRows = summarizeList(staleBlockerRows.map((row) => `${row.id}:${row.status}:${row.reasons.join(",")}`), diagnosticLimit);
832
+ const summarizedDependencyCycleItemIds = summarizeList(dependencyCycleDiagnostics.cycle_item_ids, diagnosticLimit);
833
+ const summarizedDependencyCycleSamplePaths = summarizeList(dependencyCycleDiagnostics.cycle_sample_paths, diagnosticLimit);
834
+ return {
835
+ check: {
836
+ name: "lifecycle",
837
+ status: dependencyCycleDiagnostics.cycle_count > 0 && dependencyCycleSeverity === "error" ? "error" : warnings.length === 0 ? "ok" : "warn",
838
+ details: {
839
+ checked_active_items: activeItems.length,
840
+ active_closure_like_metadata_items: closureLikeRows.length,
841
+ active_closure_like_metadata_rows: summarizedClosureLikeRows.values,
842
+ active_closure_like_metadata_rows_truncated: summarizedClosureLikeRows.truncated,
843
+ active_terminal_parent_items: terminalParentRows.length,
844
+ active_terminal_parent_rows: summarizedTerminalParentRows.values,
845
+ active_terminal_parent_rows_truncated: summarizedTerminalParentRows.truncated,
846
+ stale_blocker_checks_enabled: includeStaleBlockers,
847
+ stale_blocker_items: staleBlockerRows.length,
848
+ stale_blocker_rows: summarizedStaleBlockerRows.values,
849
+ stale_blocker_rows_truncated: summarizedStaleBlockerRows.truncated,
850
+ dependency_cycle_severity_policy: dependencyCycleSeverity,
851
+ dependency_cycle_count: dependencyCycleDiagnostics.cycle_count,
852
+ dependency_cycle_item_count: dependencyCycleDiagnostics.cycle_item_ids.length,
853
+ dependency_cycle_item_ids: summarizedDependencyCycleItemIds.values,
854
+ dependency_cycle_item_ids_truncated: summarizedDependencyCycleItemIds.truncated,
855
+ dependency_cycle_sample_paths: summarizedDependencyCycleSamplePaths.values,
856
+ dependency_cycle_sample_paths_truncated: summarizedDependencyCycleSamplePaths.truncated,
857
+ stale_blocker_reason_patterns: [...lifecyclePatternPolicy.stale_blocker_reason_patterns],
858
+ stale_blocker_reason_pattern_source: lifecyclePatternPolicy.stale_blocker_reason_pattern_source,
859
+ closure_like_blocked_reason_patterns: [
860
+ ...lifecyclePatternPolicy.closure_like_metadata_field_patterns.blocked_reason
861
+ ],
862
+ closure_like_blocked_reason_pattern_source: lifecyclePatternPolicy.closure_like_metadata_field_pattern_sources.blocked_reason,
863
+ closure_like_resolution_patterns: [...lifecyclePatternPolicy.closure_like_metadata_field_patterns.resolution],
864
+ closure_like_resolution_pattern_source: lifecyclePatternPolicy.closure_like_metadata_field_pattern_sources.resolution,
865
+ closure_like_actual_result_patterns: [...lifecyclePatternPolicy.closure_like_metadata_field_patterns.actual_result],
866
+ closure_like_actual_result_pattern_source: lifecyclePatternPolicy.closure_like_metadata_field_pattern_sources.actual_result
867
+ }
868
+ },
869
+ warnings
870
+ };
871
+ }
872
+ async function buildFilesCheck(items, workspaceRoot, pmRoot, fileScanMode, includePmInternals, verboseFileLists) {
873
+ const linkedProjectPaths = /* @__PURE__ */ new Set();
874
+ const missingLinkedPaths = [];
875
+ for (const item of items) {
876
+ const linkedArtifacts = [...item.files ?? [], ...item.docs ?? []];
877
+ for (const artifact of linkedArtifacts) {
878
+ if (artifact.scope !== "project") {
879
+ continue;
880
+ }
881
+ const normalizedPath = normalizeRelativePath(artifact.path);
882
+ if (normalizedPath.length === 0) {
883
+ continue;
884
+ }
885
+ linkedProjectPaths.add(normalizedPath);
886
+ const absolutePath = path.isAbsolute(artifact.path) ? artifact.path : path.resolve(workspaceRoot, artifact.path);
887
+ try {
888
+ const stats = await fs.stat(absolutePath);
889
+ if (!stats.isFile()) {
890
+ missingLinkedPaths.push(normalizedPath);
891
+ }
892
+ } catch {
893
+ missingLinkedPaths.push(normalizedPath);
894
+ }
895
+ }
896
+ }
897
+ const uniqueMissingLinkedPaths = [...new Set(missingLinkedPaths)].sort((left, right) => left.localeCompare(right));
898
+ const fileCandidates = await collectProjectFileCandidates(workspaceRoot, fileScanMode);
899
+ const strictTrackedAllMode = fileScanMode === "tracked-all-strict";
900
+ const strictModeForcesPmInternals = strictTrackedAllMode && !includePmInternals;
901
+ const includePmInternalsEffective = includePmInternals || strictTrackedAllMode;
902
+ const pmInternalCandidatePrefixes = includePmInternalsEffective ? [] : resolvePmInternalCandidatePrefixes(pmRoot, workspaceRoot);
903
+ const excludedPmInternalPaths = pmInternalCandidatePrefixes.length === 0 ? [] : fileCandidates.candidateFiles.filter((candidate) => hasPathPrefix(candidate, pmInternalCandidatePrefixes));
904
+ const candidateFiles = pmInternalCandidatePrefixes.length === 0 ? fileCandidates.candidateFiles : fileCandidates.candidateFiles.filter((candidate) => !hasPathPrefix(candidate, pmInternalCandidatePrefixes));
905
+ const excludedPmInternalCount = excludedPmInternalPaths.length;
906
+ const excludedByReason = {};
907
+ if (excludedPmInternalCount > 0) {
908
+ const summarizedPmInternalPaths = summarizeFileList(excludedPmInternalPaths, verboseFileLists);
909
+ excludedByReason.pm_internals = {
910
+ count: excludedPmInternalCount,
911
+ paths: summarizedPmInternalPaths.values,
912
+ paths_truncated: summarizedPmInternalPaths.truncated,
913
+ paths_total: summarizedPmInternalPaths.total
914
+ };
915
+ }
916
+ const orphanedFiles = candidateFiles.filter((candidate) => !linkedProjectPaths.has(candidate));
917
+ const warnings = [];
918
+ if (strictModeForcesPmInternals) {
919
+ warnings.push("validate_files_tracked_all_strict_forces_pm_internals");
920
+ }
921
+ if (uniqueMissingLinkedPaths.length > 0) {
922
+ warnings.push(`validate_files_missing_linked_paths:${uniqueMissingLinkedPaths.length}`);
923
+ }
924
+ if (orphanedFiles.length > 0) {
925
+ warnings.push(`validate_files_orphaned_paths:${orphanedFiles.length}`);
926
+ }
927
+ const summarizedMissing = summarizeFileList(uniqueMissingLinkedPaths, verboseFileLists);
928
+ const summarizedOrphaned = summarizeFileList(orphanedFiles, verboseFileLists);
929
+ return {
930
+ check: {
931
+ name: "files",
932
+ status: warnings.length === 0 ? "ok" : "warn",
933
+ details: {
934
+ workspace_root: workspaceRoot,
935
+ scan_mode_requested: fileCandidates.requestedMode,
936
+ scan_mode_applied: fileCandidates.appliedMode,
937
+ strict_tracked_all_mode: strictTrackedAllMode,
938
+ strict_mode_forces_pm_internals: strictModeForcesPmInternals,
939
+ strict_mode_forces_pm_internals_notice: strictModeForcesPmInternals ? "tracked-all-strict force-enables PM internals; pass --include-pm-internals to make inclusion explicit." : null,
940
+ file_list_detail_mode: verboseFileLists ? "full" : "summary",
941
+ file_list_summary_limit: FILE_LIST_SUMMARY_LIMIT,
942
+ candidate_scan_source: fileCandidates.source,
943
+ include_pm_internals: includePmInternalsEffective,
944
+ include_pm_internals_requested: includePmInternals,
945
+ pm_internal_candidate_prefixes: pmInternalCandidatePrefixes,
946
+ pm_internal_excluded_count: excludedPmInternalCount,
947
+ excluded_total: excludedPmInternalCount,
948
+ excluded_by_reason: excludedByReason,
949
+ linked_project_paths: linkedProjectPaths.size,
950
+ candidate_total_raw: fileCandidates.candidateTotal,
951
+ candidate_scanned_raw: fileCandidates.candidateScanned,
952
+ candidate_total: candidateFiles.length,
953
+ candidate_scanned: candidateFiles.length,
954
+ scanned_candidate_files: candidateFiles.length,
955
+ missing_linked_paths_count: uniqueMissingLinkedPaths.length,
956
+ missing_linked_paths_total: summarizedMissing.total,
957
+ missing_linked_paths: summarizedMissing.values,
958
+ missing_linked_paths_truncated: summarizedMissing.truncated,
959
+ orphaned_paths_count: orphanedFiles.length,
960
+ orphaned_paths_total: summarizedOrphaned.total,
961
+ orphaned_paths: summarizedOrphaned.values,
962
+ orphaned_paths_truncated: summarizedOrphaned.truncated
963
+ }
964
+ },
965
+ warnings
966
+ };
967
+ }
968
+ async function buildHistoryDriftCheck(pmRoot, items, verboseDiagnostics) {
969
+ const { missingStreams, unreadableStreams, hashMismatches, chainMismatches, driftedItems } = await scanHistoryDrift(pmRoot, items);
970
+ const warnings = [];
971
+ if (missingStreams.length > 0) {
972
+ warnings.push(`validate_history_drift_missing_streams:${missingStreams.length}`);
973
+ }
974
+ if (unreadableStreams.length > 0) {
975
+ warnings.push(`validate_history_drift_unreadable_streams:${unreadableStreams.length}`);
976
+ }
977
+ if (hashMismatches.length > 0) {
978
+ warnings.push(`validate_history_drift_hash_mismatches:${hashMismatches.length}`);
979
+ }
980
+ if (chainMismatches.length > 0) {
981
+ warnings.push(`validate_history_drift_chain_mismatches:${chainMismatches.length}`);
982
+ }
983
+ const diagnosticLimit = verboseDiagnostics ? Number.POSITIVE_INFINITY : DIAGNOSTIC_LIST_SUMMARY_LIMIT;
984
+ const summarizedDrifted = summarizeList(driftedItems, diagnosticLimit);
985
+ return {
986
+ check: {
987
+ name: "history_drift",
988
+ status: warnings.length === 0 ? "ok" : "warn",
989
+ details: {
990
+ checked_items: items.length,
991
+ drifted_items_count: driftedItems.length,
992
+ drifted_items: summarizedDrifted.values,
993
+ drifted_items_truncated: summarizedDrifted.truncated,
994
+ counts: {
995
+ missing_streams: missingStreams.length,
996
+ unreadable_streams: unreadableStreams.length,
997
+ hash_mismatches: hashMismatches.length,
998
+ chain_mismatches: chainMismatches.length
999
+ }
1000
+ }
1001
+ },
1002
+ warnings
1003
+ };
1004
+ }
1005
+ function summarizeCommandReferenceRow(ownerId, referencedId, command) {
1006
+ const normalizedCommand = command.trim().replaceAll(/\s+/g, " ");
1007
+ const commandPreview = normalizedCommand.length > 120 ? `${normalizedCommand.slice(0, 117)}...` : normalizedCommand;
1008
+ return `${ownerId}:${referencedId}:${commandPreview}`;
1009
+ }
1010
+ function buildCommandReferencesCheck(items, idPrefix, verboseDiagnostics) {
1011
+ const knownIds = new Set(items.map((item) => item.id.toLowerCase()));
1012
+ let linkedCommandsScanned = 0;
1013
+ let referencedPmIdCount = 0;
1014
+ const referencedPmIds = /* @__PURE__ */ new Set();
1015
+ const staleReferenceRows = [];
1016
+ for (const item of items) {
1017
+ for (const linkedTest of item.tests ?? []) {
1018
+ if (typeof linkedTest.command !== "string" || linkedTest.command.trim().length === 0) {
1019
+ continue;
1020
+ }
1021
+ linkedCommandsScanned += 1;
1022
+ const referencedIds = extractReferencedPmItemIdsFromCommand(linkedTest.command, idPrefix);
1023
+ if (referencedIds.length === 0) {
1024
+ continue;
1025
+ }
1026
+ referencedPmIdCount += referencedIds.length;
1027
+ for (const referencedId of referencedIds) {
1028
+ referencedPmIds.add(referencedId);
1029
+ if (!knownIds.has(referencedId.toLowerCase())) {
1030
+ staleReferenceRows.push(summarizeCommandReferenceRow(item.id, referencedId, linkedTest.command));
1031
+ }
1032
+ }
1033
+ }
1034
+ }
1035
+ const uniqueStaleReferenceRows = [...new Set(staleReferenceRows)].sort((left, right) => left.localeCompare(right));
1036
+ const stalePmIds = [...new Set(uniqueStaleReferenceRows.map((row) => row.split(":")[1] ?? ""))].filter((value) => value.length > 0).sort((left, right) => left.localeCompare(right));
1037
+ const warnings = uniqueStaleReferenceRows.length > 0 ? [`validate_command_references_stale_pm_ids:${uniqueStaleReferenceRows.length}`] : [];
1038
+ const diagnosticLimit = verboseDiagnostics ? Number.POSITIVE_INFINITY : DIAGNOSTIC_LIST_SUMMARY_LIMIT;
1039
+ const summarizedRows = summarizeList(uniqueStaleReferenceRows, diagnosticLimit);
1040
+ const summarizedStalePmIds = summarizeList(stalePmIds, diagnosticLimit);
1041
+ const summarizedReferencedPmIds = summarizeList([...referencedPmIds].sort((left, right) => left.localeCompare(right)), diagnosticLimit);
1042
+ return {
1043
+ check: {
1044
+ name: "command_references",
1045
+ status: warnings.length === 0 ? "ok" : "warn",
1046
+ details: {
1047
+ checked_items: items.length,
1048
+ linked_commands_scanned: linkedCommandsScanned,
1049
+ referenced_pm_ids_count: referencedPmIdCount,
1050
+ unique_referenced_pm_ids_count: referencedPmIds.size,
1051
+ unique_referenced_pm_ids: summarizedReferencedPmIds.values,
1052
+ unique_referenced_pm_ids_truncated: summarizedReferencedPmIds.truncated,
1053
+ stale_pm_id_references_count: uniqueStaleReferenceRows.length,
1054
+ stale_pm_ids_count: stalePmIds.length,
1055
+ stale_pm_ids: summarizedStalePmIds.values,
1056
+ stale_pm_ids_truncated: summarizedStalePmIds.truncated,
1057
+ stale_pm_id_reference_rows: summarizedRows.values,
1058
+ stale_pm_id_reference_rows_truncated: summarizedRows.truncated
1059
+ }
1060
+ },
1061
+ warnings
1062
+ };
1063
+ }
1064
+ async function runValidate(options, global2) {
1065
+ const pmRoot = resolvePmRoot(process.cwd(), global2.path);
1066
+ if (!await pathExists(getSettingsPath(pmRoot))) {
1067
+ throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
1068
+ }
1069
+ const settings = await readSettings(pmRoot);
1070
+ const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);
1071
+ const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
1072
+ const itemReadWarnings = [];
1073
+ const items = await listAllFrontMatterWithBody(pmRoot, settings.item_format, typeRegistry.type_to_folder, itemReadWarnings, settings.schema);
1074
+ const requestedChecks = resolveRequestedChecks(options);
1075
+ const metadataProfileSource = typeof options.metadataProfile === "string" ? "option" : "settings";
1076
+ const metadataProfile = resolveValidateMetadataProfile(typeof options.metadataProfile === "string" ? options.metadataProfile : settings.validation.metadata_profile);
1077
+ const metadataPolicy = resolveValidateMetadataPolicy(metadataProfile, metadataProfileSource, settings.validation.metadata_required_fields);
1078
+ const lifecyclePatternPolicy = resolveLifecyclePatternPolicy(settings);
1079
+ const dependencyCycleSeverity = resolveDependencyCycleSeverity(options.dependencyCycleSeverity);
1080
+ const fileScanMode = resolveFileScanMode(options.scanMode);
1081
+ const workspaceRoot = resolveWorkspaceRoot(pmRoot);
1082
+ const checks = [];
1083
+ const warnings = [...new Set(itemReadWarnings)];
1084
+ const fixHintsEnabled = options.fixHints === true;
1085
+ const record = (built) => {
1086
+ if (fixHintsEnabled) {
1087
+ attachValidateFixHints(built.check, built.warnings);
1088
+ }
1089
+ checks.push(built.check);
1090
+ warnings.push(...built.warnings);
1091
+ };
1092
+ if (requestedChecks.has("metadata")) {
1093
+ record(buildMetadataCheck(items, metadataPolicy, statusRegistry, Boolean(options.verboseDiagnostics)));
1094
+ }
1095
+ if (requestedChecks.has("resolution")) {
1096
+ record(buildResolutionCheck(items, statusRegistry, Boolean(options.verboseDiagnostics)));
1097
+ }
1098
+ if (requestedChecks.has("lifecycle")) {
1099
+ record(buildLifecycleCheck(items, Boolean(options.checkStaleBlockers), dependencyCycleSeverity, statusRegistry, lifecyclePatternPolicy, Boolean(options.verboseDiagnostics)));
1100
+ }
1101
+ if (requestedChecks.has("files")) {
1102
+ record(await buildFilesCheck(items, workspaceRoot, pmRoot, fileScanMode, Boolean(options.includePmInternals), Boolean(options.verboseFileLists)));
1103
+ }
1104
+ if (requestedChecks.has("command_references")) {
1105
+ record(buildCommandReferencesCheck(items, settings.id_prefix, Boolean(options.verboseDiagnostics)));
1106
+ }
1107
+ if (requestedChecks.has("history_drift")) {
1108
+ record(await buildHistoryDriftCheck(pmRoot, items, Boolean(options.verboseDiagnostics)));
1109
+ }
1110
+ const normalizedWarnings = [...new Set(warnings)].sort((left, right) => left.localeCompare(right));
1111
+ const hasErrors = checks.some((check) => check.status === "error");
1112
+ return {
1113
+ ok: !hasErrors,
1114
+ has_warnings: normalizedWarnings.length > 0,
1115
+ checks,
1116
+ warnings: normalizedWarnings,
1117
+ generated_at: nowIso()
1118
+ };
1119
+ }
1120
+ export {
1121
+ runValidate
1122
+ };
1123
+ //# sourceMappingURL=validate-ZFVWPEEN.js.map