@unbrained/pm-cli 2026.6.9 → 2026.6.11

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 (529) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +59 -0
  3. package/README.md +1 -1
  4. package/dist/cli/bootstrap-args.d.ts +11 -0
  5. package/dist/cli/bootstrap-args.js +90 -4
  6. package/dist/cli/bootstrap-args.js.map +1 -1
  7. package/dist/cli/commands/aggregate.d.ts +7 -0
  8. package/dist/cli/commands/aggregate.js +53 -12
  9. package/dist/cli/commands/aggregate.js.map +1 -1
  10. package/dist/cli/commands/close.d.ts +1 -0
  11. package/dist/cli/commands/close.js +106 -3
  12. package/dist/cli/commands/close.js.map +1 -1
  13. package/dist/cli/commands/completion.js +20 -7
  14. package/dist/cli/commands/completion.js.map +1 -1
  15. package/dist/cli/commands/context.d.ts +9 -0
  16. package/dist/cli/commands/context.js +149 -20
  17. package/dist/cli/commands/context.js.map +1 -1
  18. package/dist/cli/commands/contracts.d.ts +2 -0
  19. package/dist/cli/commands/contracts.js +9 -2
  20. package/dist/cli/commands/contracts.js.map +1 -1
  21. package/dist/cli/commands/create.d.ts +1 -0
  22. package/dist/cli/commands/create.js +5 -3
  23. package/dist/cli/commands/create.js.map +1 -1
  24. package/dist/cli/commands/extension.js +4 -2
  25. package/dist/cli/commands/extension.js.map +1 -1
  26. package/dist/cli/commands/health.js +44 -6
  27. package/dist/cli/commands/health.js.map +1 -1
  28. package/dist/cli/commands/history.js +6 -5
  29. package/dist/cli/commands/history.js.map +1 -1
  30. package/dist/cli/commands/linked-test-parsers.d.ts +1 -0
  31. package/dist/cli/commands/linked-test-parsers.js +289 -2
  32. package/dist/cli/commands/linked-test-parsers.js.map +1 -1
  33. package/dist/cli/commands/reindex.d.ts +1 -0
  34. package/dist/cli/commands/reindex.js +33 -4
  35. package/dist/cli/commands/reindex.js.map +1 -1
  36. package/dist/cli/commands/test.d.ts +6 -0
  37. package/dist/cli/commands/test.js +46 -5
  38. package/dist/cli/commands/test.js.map +1 -1
  39. package/dist/cli/error-guidance.d.ts +8 -0
  40. package/dist/cli/error-guidance.js +102 -2
  41. package/dist/cli/error-guidance.js.map +1 -1
  42. package/dist/cli/extension-command-help.d.ts +1 -0
  43. package/dist/cli/extension-command-help.js +42 -2
  44. package/dist/cli/extension-command-help.js.map +1 -1
  45. package/dist/cli/extension-command-options.d.ts +2 -0
  46. package/dist/cli/extension-command-options.js +51 -2
  47. package/dist/cli/extension-command-options.js.map +1 -1
  48. package/dist/cli/main.js +26 -26
  49. package/dist/cli/main.js.map +1 -1
  50. package/dist/cli/register-list-query.js +3 -2
  51. package/dist/cli/register-list-query.js.map +1 -1
  52. package/dist/cli/register-mutation.js +4 -2
  53. package/dist/cli/register-mutation.js.map +1 -1
  54. package/dist/cli/register-operations.js +15 -6
  55. package/dist/cli/register-operations.js.map +1 -1
  56. package/dist/cli/registration-helpers.js +9 -2
  57. package/dist/cli/registration-helpers.js.map +1 -1
  58. package/dist/cli-bundle/chunks/{activity-RUJATACW.js → activity-XADJOG6G.js} +11 -11
  59. package/dist/cli-bundle/chunks/activity-XZIUPGZH.js +16 -0
  60. package/dist/cli-bundle/chunks/{aggregate-TT7OCHHT.js → aggregate-6OTS3AOO.js} +65 -24
  61. package/dist/cli-bundle/chunks/aggregate-6OTS3AOO.js.map +1 -0
  62. package/dist/cli-bundle/chunks/{aggregate-IQ27NFBI.js → aggregate-OD36DJU5.js} +64 -23
  63. package/dist/cli-bundle/chunks/aggregate-OD36DJU5.js.map +7 -0
  64. package/dist/cli-bundle/chunks/{append-E7AJ5RTR.js → append-JYWO4P7W.js} +8 -8
  65. package/dist/cli-bundle/chunks/{append-CWQZBUWV.js → append-KG55G7S3.js} +8 -8
  66. package/dist/cli-bundle/chunks/{chunk-LF2VNLEZ.js → chunk-3KLPFWZ4.js} +8 -8
  67. package/dist/cli-bundle/chunks/{chunk-LF2VNLEZ.js.map → chunk-3KLPFWZ4.js.map} +2 -2
  68. package/dist/cli-bundle/chunks/{chunk-ENCVPOID.js → chunk-3SLOMKCJ.js} +12 -12
  69. package/dist/cli-bundle/chunks/chunk-4HFU4UO2.js +518 -0
  70. package/dist/cli-bundle/chunks/chunk-4HFU4UO2.js.map +1 -0
  71. package/dist/cli-bundle/chunks/{chunk-F2REA7VW.js → chunk-4JCSYR6F.js} +3 -3
  72. package/dist/cli-bundle/chunks/{chunk-CAXUGAAF.js → chunk-4YFAGDRH.js} +8 -8
  73. package/dist/cli-bundle/chunks/{chunk-U3Z4OCZC.js → chunk-5SCT2JCT.js} +2 -2
  74. package/dist/cli-bundle/chunks/{chunk-NHRZSYAA.js → chunk-73ZPG2I3.js} +3 -3
  75. package/dist/cli-bundle/chunks/{chunk-D5D7VKIC.js → chunk-7IYFN5R7.js} +6 -5
  76. package/dist/cli-bundle/chunks/chunk-7IYFN5R7.js.map +1 -0
  77. package/dist/cli-bundle/chunks/{chunk-A5342JVL.js → chunk-7RIT3OCD.js} +12 -12
  78. package/dist/cli-bundle/chunks/{chunk-LU54Z4QI.js → chunk-7UGSRQCL.js} +76 -74
  79. package/dist/cli-bundle/chunks/{chunk-LU54Z4QI.js.map → chunk-7UGSRQCL.js.map} +3 -3
  80. package/dist/cli-bundle/chunks/{chunk-5JF76OJF.js → chunk-A6LXQFO7.js} +290 -25
  81. package/dist/cli-bundle/chunks/chunk-A6LXQFO7.js.map +1 -0
  82. package/dist/cli-bundle/chunks/{chunk-7CR4GAYN.js → chunk-ATEES5SX.js} +2 -2
  83. package/dist/cli-bundle/chunks/{chunk-FHUI7AXS.js → chunk-AVGHVVF7.js} +3 -3
  84. package/dist/cli-bundle/chunks/{chunk-T7B5VAKD.js → chunk-B65UUCGQ.js} +13 -6
  85. package/dist/cli-bundle/chunks/chunk-B65UUCGQ.js.map +7 -0
  86. package/dist/cli-bundle/chunks/{chunk-42IULX44.js → chunk-CCX4RSYZ.js} +2 -2
  87. package/dist/cli-bundle/chunks/{chunk-EFRHTZO4.js → chunk-CW6E4NAT.js} +8 -8
  88. package/dist/cli-bundle/chunks/{chunk-JN3BT7UY.js → chunk-DY6C42S6.js} +9 -9
  89. package/dist/cli-bundle/chunks/{chunk-PUSOAQCR.js → chunk-E5DUIJA4.js} +5 -5
  90. package/dist/cli-bundle/chunks/{chunk-E7LOIIFP.js → chunk-ESANVZF4.js} +3 -3
  91. package/dist/cli-bundle/chunks/{chunk-WQZCEEQN.js → chunk-EWFY7SLA.js} +157 -12
  92. package/dist/cli-bundle/chunks/chunk-EWFY7SLA.js.map +1 -0
  93. package/dist/cli-bundle/chunks/{chunk-YI6W2DBN.js → chunk-F75JSIOZ.js} +6 -6
  94. package/dist/cli-bundle/chunks/{chunk-6IGTNFE3.js → chunk-FDH2X65L.js} +2 -2
  95. package/dist/cli-bundle/chunks/{chunk-GPOSGWCN.js → chunk-FXRU333M.js} +68 -7
  96. package/dist/cli-bundle/chunks/chunk-FXRU333M.js.map +1 -0
  97. package/dist/cli-bundle/chunks/{chunk-C72IQIBT.js → chunk-FY4SPXSC.js} +302 -30
  98. package/dist/cli-bundle/chunks/chunk-FY4SPXSC.js.map +7 -0
  99. package/dist/cli-bundle/chunks/{chunk-TLD3UYGY.js → chunk-GKIZW7SM.js} +5 -4
  100. package/dist/cli-bundle/chunks/chunk-GKIZW7SM.js.map +7 -0
  101. package/dist/cli-bundle/chunks/{chunk-YSANBZAE.js → chunk-GWZSYR6X.js} +12 -5
  102. package/dist/cli-bundle/chunks/chunk-GWZSYR6X.js.map +7 -0
  103. package/dist/cli-bundle/chunks/{chunk-FJNJEWU4.js → chunk-HGLC63AU.js} +14 -12
  104. package/dist/cli-bundle/chunks/chunk-HGLC63AU.js.map +1 -0
  105. package/dist/cli-bundle/chunks/{chunk-RLVI7KDW.js → chunk-HHHJ2GI3.js} +163 -11
  106. package/dist/cli-bundle/chunks/chunk-HHHJ2GI3.js.map +7 -0
  107. package/dist/cli-bundle/chunks/{chunk-AVGOVJGV.js → chunk-HI7STVF2.js} +9 -9
  108. package/dist/cli-bundle/chunks/{chunk-AVGOVJGV.js.map → chunk-HI7STVF2.js.map} +1 -1
  109. package/dist/cli-bundle/chunks/{chunk-ANKG2JKL.js → chunk-I2IJY2NL.js} +12 -5
  110. package/dist/cli-bundle/chunks/chunk-I2IJY2NL.js.map +1 -0
  111. package/dist/cli-bundle/chunks/{chunk-ZPXDD6RQ.js → chunk-I53JBTJW.js} +6 -6
  112. package/dist/cli-bundle/chunks/{chunk-23WNCJBA.js → chunk-I7NYDZDV.js} +2 -2
  113. package/dist/cli-bundle/chunks/{chunk-EQ6N6IDR.js → chunk-IGVJRZ6H.js} +13 -11
  114. package/dist/cli-bundle/chunks/chunk-IGVJRZ6H.js.map +7 -0
  115. package/dist/cli-bundle/chunks/{chunk-JVMAOD54.js → chunk-IH4MBKK7.js} +14 -7
  116. package/dist/cli-bundle/chunks/chunk-IH4MBKK7.js.map +1 -0
  117. package/dist/cli-bundle/chunks/{chunk-BIRVSIM2.js → chunk-IKOH24GZ.js} +14 -14
  118. package/dist/cli-bundle/chunks/chunk-IKOH24GZ.js.map +7 -0
  119. package/dist/cli-bundle/chunks/{chunk-SAUXUI6U.js → chunk-IUKD4W6Z.js} +2 -2
  120. package/dist/cli-bundle/chunks/{chunk-3RHE76G6.js → chunk-J3GD64J2.js} +15 -15
  121. package/dist/cli-bundle/chunks/chunk-J3GD64J2.js.map +1 -0
  122. package/dist/cli-bundle/chunks/{chunk-OT6XAMO5.js → chunk-KWAXVAXX.js} +7 -5
  123. package/dist/cli-bundle/chunks/{chunk-OT6XAMO5.js.map → chunk-KWAXVAXX.js.map} +2 -2
  124. package/dist/cli-bundle/chunks/{chunk-SD6H3RLA.js → chunk-LCSCXBGT.js} +15 -5
  125. package/dist/cli-bundle/chunks/{chunk-SD6H3RLA.js.map → chunk-LCSCXBGT.js.map} +2 -2
  126. package/dist/cli-bundle/chunks/{chunk-RKCJ2JMA.js → chunk-OASDW5UI.js} +7 -7
  127. package/dist/cli-bundle/chunks/{chunk-JEGFLKSI.js → chunk-OLKBSY4N.js} +2 -2
  128. package/dist/cli-bundle/chunks/{chunk-4LRVXVJK.js → chunk-P2PSODAQ.js} +70 -9
  129. package/dist/cli-bundle/chunks/chunk-P2PSODAQ.js.map +7 -0
  130. package/dist/cli-bundle/chunks/{chunk-XEOO6K5J.js → chunk-P5BJOMBB.js} +9 -9
  131. package/dist/cli-bundle/chunks/{chunk-P2NVFE4L.js → chunk-P5U5EOMA.js} +3 -3
  132. package/dist/cli-bundle/chunks/{chunk-AM2AXVFS.js → chunk-PSD7F7DX.js} +5 -5
  133. package/dist/cli-bundle/chunks/{chunk-VDVVOLR6.js → chunk-QJMGRZO2.js} +3 -3
  134. package/dist/cli-bundle/chunks/{chunk-7YTWXGE3.js → chunk-QKW5D45B.js} +112 -7
  135. package/dist/cli-bundle/chunks/chunk-QKW5D45B.js.map +1 -0
  136. package/dist/cli-bundle/chunks/{chunk-T7NWFVOA.js → chunk-QNJSITCX.js} +7 -7
  137. package/dist/cli-bundle/chunks/{chunk-MNXJ6YDO.js → chunk-RXAP6JL5.js} +9 -9
  138. package/dist/cli-bundle/chunks/{chunk-5MMLINZB.js → chunk-S26FESD4.js} +3 -3
  139. package/dist/cli-bundle/chunks/{chunk-I26E6XA7.js → chunk-S2ZLDYGS.js} +8 -6
  140. package/dist/cli-bundle/chunks/chunk-S2ZLDYGS.js.map +1 -0
  141. package/dist/cli-bundle/chunks/chunk-SXKNJPQ7.js +528 -0
  142. package/dist/cli-bundle/chunks/chunk-SXKNJPQ7.js.map +7 -0
  143. package/dist/cli-bundle/chunks/{chunk-OPYA2HIU.js → chunk-TK5VZFHY.js} +7 -7
  144. package/dist/cli-bundle/chunks/{chunk-4TJWRPIH.js → chunk-TNAP7EJX.js} +2 -2
  145. package/dist/cli-bundle/chunks/{chunk-I4FGL3K2.js → chunk-UOO6BYIA.js} +16 -6
  146. package/dist/cli-bundle/chunks/chunk-UOO6BYIA.js.map +1 -0
  147. package/dist/cli-bundle/chunks/{chunk-5ATRWEZO.js → chunk-UUWGCWBU.js} +3 -3
  148. package/dist/cli-bundle/chunks/{chunk-YX5LAKFJ.js → chunk-VAOUX6TK.js} +2 -2
  149. package/dist/cli-bundle/chunks/{chunk-RMTI5R76.js → chunk-VFUZV5EB.js} +111 -6
  150. package/dist/cli-bundle/chunks/chunk-VFUZV5EB.js.map +7 -0
  151. package/dist/cli-bundle/chunks/{chunk-WCWIDJII.js → chunk-VPEAS7PS.js} +2 -2
  152. package/dist/cli-bundle/chunks/{chunk-RE2JQJZJ.js → chunk-VSRZRLG3.js} +3 -3
  153. package/dist/cli-bundle/chunks/{chunk-PW7C262O.js → chunk-WUNFKP7M.js} +2 -2
  154. package/dist/cli-bundle/chunks/{chunk-BACSNVWE.js → chunk-XJDGS74Y.js} +71 -69
  155. package/dist/cli-bundle/chunks/{chunk-BACSNVWE.js.map → chunk-XJDGS74Y.js.map} +1 -1
  156. package/dist/cli-bundle/chunks/{chunk-H37YPWLM.js → chunk-XMBI6TNW.js} +13 -7
  157. package/dist/cli-bundle/chunks/chunk-XMBI6TNW.js.map +7 -0
  158. package/dist/cli-bundle/chunks/{chunk-NUGAWYEN.js → chunk-XTKJSVWH.js} +2 -2
  159. package/dist/cli-bundle/chunks/{chunk-KDX6VC3P.js → chunk-XUC4C4PT.js} +3 -3
  160. package/dist/cli-bundle/chunks/{chunk-44JP4PYY.js → chunk-Y3YKK7CY.js} +2 -2
  161. package/dist/cli-bundle/chunks/{chunk-KTVXLI54.js → chunk-YW6Q3RYZ.js} +7 -7
  162. package/dist/cli-bundle/chunks/{chunk-I3UILOUU.js → chunk-ZLMIWZUG.js} +2 -2
  163. package/dist/cli-bundle/chunks/{chunk-FKH7K6YP.js → chunk-ZMW77VWV.js} +9 -9
  164. package/dist/cli-bundle/chunks/{chunk-NJRZIJ4N.js → chunk-ZYNJNPYD.js} +14 -8
  165. package/dist/cli-bundle/chunks/chunk-ZYNJNPYD.js.map +1 -0
  166. package/dist/cli-bundle/chunks/{claim-UXFGCF3P.js → claim-2RDYMCTP.js} +10 -10
  167. package/dist/cli-bundle/chunks/{claim-RV6WYUF7.js → claim-MJ7DZFC3.js} +10 -10
  168. package/dist/cli-bundle/chunks/close-4FMAPEMY.js +13 -0
  169. package/dist/cli-bundle/chunks/{close-O4JK2JKD.js → close-XLEKIQSW.js} +8 -8
  170. package/dist/cli-bundle/chunks/{close-many-EQO4TPIE.js → close-many-AOD4HSAZ.js} +15 -15
  171. package/dist/cli-bundle/chunks/{close-many-SRDBV3SI.js → close-many-XKAQY5CQ.js} +15 -15
  172. package/dist/cli-bundle/chunks/{comments-TTZUIB2O.js → comments-B4RWWDJT.js} +10 -10
  173. package/dist/cli-bundle/chunks/{comments-OMB7YE27.js → comments-RN5TG4ZN.js} +10 -10
  174. package/dist/cli-bundle/chunks/{config-5VPR42A6.js → config-3JXJ3XZ7.js} +8 -8
  175. package/dist/cli-bundle/chunks/{config-NNLXVGVC.js → config-FZ4UDC4B.js} +8 -8
  176. package/dist/cli-bundle/chunks/{context-4QK6GRXO.js → context-L36PIN35.js} +146 -33
  177. package/dist/cli-bundle/chunks/{context-4QK6GRXO.js.map → context-L36PIN35.js.map} +2 -2
  178. package/dist/cli-bundle/chunks/{context-4N7GYTVQ.js → context-QBPO3BFM.js} +147 -34
  179. package/dist/cli-bundle/chunks/context-QBPO3BFM.js.map +1 -0
  180. package/dist/cli-bundle/chunks/{contracts-DXCWXOSP.js → contracts-3NKWYKKU.js} +309 -6
  181. package/dist/cli-bundle/chunks/contracts-3NKWYKKU.js.map +1 -0
  182. package/dist/cli-bundle/chunks/{contracts-AOBNEBVT.js → contracts-MIXBWJIB.js} +315 -5
  183. package/dist/cli-bundle/chunks/contracts-MIXBWJIB.js.map +7 -0
  184. package/dist/cli-bundle/chunks/{copy-5NM3SVJA.js → copy-ALU5WMHA.js} +7 -7
  185. package/dist/cli-bundle/chunks/{copy-XSYEQTLA.js → copy-FWIVTLBO.js} +7 -7
  186. package/dist/cli-bundle/chunks/{create-FCCAATQV.js → create-IFA26O2I.js} +13 -13
  187. package/dist/cli-bundle/chunks/create-JVXYHYH4.js +27 -0
  188. package/dist/cli-bundle/chunks/{delete-5JFP6OG7.js → delete-IYTIYAJS.js} +7 -7
  189. package/dist/cli-bundle/chunks/{delete-PQXJQXQ7.js → delete-Y2SGJBGY.js} +7 -7
  190. package/dist/cli-bundle/chunks/{deps-S5322EOQ.js → deps-6TSPOSGU.js} +7 -7
  191. package/dist/cli-bundle/chunks/{deps-XXKBOQUA.js → deps-CZ4PTVXU.js} +7 -7
  192. package/dist/cli-bundle/chunks/{docs-C7CCVWAJ.js → docs-5WMBVQT2.js} +9 -9
  193. package/dist/cli-bundle/chunks/{docs-DZRPAW5S.js → docs-MB53UJAJ.js} +9 -9
  194. package/dist/cli-bundle/chunks/{extension-CSHP6FZX.js → extension-Q34OEWO5.js} +5 -5
  195. package/dist/cli-bundle/chunks/{extension-XNNVUVAY.js → extension-WH2FOIOZ.js} +5 -5
  196. package/dist/cli-bundle/chunks/{files-UPCNKEIZ.js → files-DLB5LJEP.js} +9 -9
  197. package/dist/cli-bundle/chunks/{files-OBWYYPKM.js → files-GVMNVLCB.js} +9 -9
  198. package/dist/cli-bundle/chunks/{gc-FA2ONELT.js → gc-2WEPW6D6.js} +3 -3
  199. package/dist/cli-bundle/chunks/{gc-KXK6KBRN.js → gc-4Z3IKHAZ.js} +3 -3
  200. package/dist/cli-bundle/chunks/{get-PNTSONGB.js → get-PCHS7RA6.js} +11 -11
  201. package/dist/cli-bundle/chunks/{get-FLHYTOBA.js → get-QARTE6BL.js} +11 -11
  202. package/dist/cli-bundle/chunks/{health-CS5RNTJX.js → health-4ZYB3IYQ.js} +47 -19
  203. package/dist/cli-bundle/chunks/health-4ZYB3IYQ.js.map +1 -0
  204. package/dist/cli-bundle/chunks/{health-KCRVYIYY.js → health-YO5LRWN4.js} +46 -18
  205. package/dist/cli-bundle/chunks/health-YO5LRWN4.js.map +7 -0
  206. package/dist/cli-bundle/chunks/{history-COQTPBEU.js → history-7WUAEWHW.js} +10 -10
  207. package/dist/cli-bundle/chunks/history-L2FQFRTU.js +20 -0
  208. package/dist/cli-bundle/chunks/{history-compact-PVS2A3FS.js → history-compact-3EJ3L2O7.js} +11 -11
  209. package/dist/cli-bundle/chunks/{history-compact-66PSRYL3.js → history-compact-LW27IPFK.js} +11 -11
  210. package/dist/cli-bundle/chunks/{history-redact-DCXAWGTF.js → history-redact-G72A4EJ4.js} +11 -11
  211. package/dist/cli-bundle/chunks/history-redact-QWQCX5DZ.js +19 -0
  212. package/dist/cli-bundle/chunks/{history-repair-SEQDFTGW.js → history-repair-KVPFJKOS.js} +11 -11
  213. package/dist/cli-bundle/chunks/{history-repair-TA3NRIFO.js → history-repair-RUGKD3YR.js} +11 -11
  214. package/dist/cli-bundle/chunks/init-4BKRHGWW.js +17 -0
  215. package/dist/cli-bundle/chunks/{init-IQJE3EKJ.js → init-S5WEGUJY.js} +9 -9
  216. package/dist/cli-bundle/chunks/{learnings-XC6EMW5E.js → learnings-HQXSSKZ5.js} +10 -10
  217. package/dist/cli-bundle/chunks/{learnings-RJPGH2ME.js → learnings-XK3P4ZDR.js} +10 -10
  218. package/dist/cli-bundle/chunks/{list-NJV6WBT4.js → list-6CL3XFT6.js} +10 -10
  219. package/dist/cli-bundle/chunks/list-BYNN4ZEO.js +19 -0
  220. package/dist/cli-bundle/chunks/{notes-2KWHADK3.js → notes-5T6P7C5V.js} +10 -10
  221. package/dist/cli-bundle/chunks/{notes-FNCDMZW2.js → notes-U5FZCSBT.js} +10 -10
  222. package/dist/cli-bundle/chunks/{plan-CYK2P5PD.js → plan-FQLMJRLZ.js} +13 -13
  223. package/dist/cli-bundle/chunks/{plan-MQO5JTSV.js → plan-VNUG3WZZ.js} +13 -13
  224. package/dist/cli-bundle/chunks/{register-list-query-6RA24SIZ.js → register-list-query-NPE3ECJQ.js} +21 -21
  225. package/dist/cli-bundle/chunks/register-list-query-NPE3ECJQ.js.map +1 -0
  226. package/dist/cli-bundle/chunks/{register-list-query-IO3RR5K6.js → register-list-query-VHDXWEPP.js} +20 -20
  227. package/dist/cli-bundle/chunks/register-list-query-VHDXWEPP.js.map +7 -0
  228. package/dist/cli-bundle/chunks/{register-mutation-VV2SC2KL.js → register-mutation-DG53FCBV.js} +36 -35
  229. package/dist/cli-bundle/chunks/register-mutation-DG53FCBV.js.map +1 -0
  230. package/dist/cli-bundle/chunks/{register-mutation-KVFUXCAZ.js → register-mutation-EAYNLGOS.js} +35 -34
  231. package/dist/cli-bundle/chunks/register-mutation-EAYNLGOS.js.map +7 -0
  232. package/dist/cli-bundle/chunks/{register-operations-DFNVRSJ5.js → register-operations-AM6KTWB6.js} +42 -37
  233. package/dist/cli-bundle/chunks/register-operations-AM6KTWB6.js.map +1 -0
  234. package/dist/cli-bundle/chunks/{register-operations-TAUUTRJ4.js → register-operations-FWFE64JG.js} +41 -36
  235. package/dist/cli-bundle/chunks/register-operations-FWFE64JG.js.map +7 -0
  236. package/dist/cli-bundle/chunks/{register-setup-X2R5CFDV.js → register-setup-G4QYI3RX.js} +15 -15
  237. package/dist/cli-bundle/chunks/{register-setup-GAQZZRUA.js → register-setup-IKX5524L.js} +15 -15
  238. package/dist/cli-bundle/chunks/restore-CHIOQAQL.js +17 -0
  239. package/dist/cli-bundle/chunks/{restore-E3GZKRRK.js → restore-M6AFHMV4.js} +11 -11
  240. package/dist/cli-bundle/chunks/{schema-3CPFLDAY.js → schema-76HDZJCC.js} +8 -8
  241. package/dist/cli-bundle/chunks/{schema-7EHBPNXM.js → schema-AINZ2IMM.js} +8 -8
  242. package/dist/cli-bundle/chunks/{search-OBZVYJJ2.js → search-JMLFQEPJ.js} +10 -10
  243. package/dist/cli-bundle/chunks/{search-2T3NCCUR.js → search-NL3TSCYB.js} +10 -10
  244. package/dist/cli-bundle/chunks/{stats-6LVK4JER.js → stats-BKXCBIGT.js} +7 -7
  245. package/dist/cli-bundle/chunks/{stats-ULGQACF7.js → stats-UBD56TGK.js} +7 -7
  246. package/dist/cli-bundle/chunks/{telemetry-HHKRTMZA.js → telemetry-N454RHG5.js} +4 -4
  247. package/dist/cli-bundle/chunks/{telemetry-6G27FLCP.js → telemetry-ZJXK3H7X.js} +4 -4
  248. package/dist/cli-bundle/chunks/{test-2PP4YBV6.js → test-BQAKIXAT.js} +14 -14
  249. package/dist/cli-bundle/chunks/test-O74JFUH5.js +32 -0
  250. package/dist/cli-bundle/chunks/{test-all-6Z272JRI.js → test-all-7LV3I6S5.js} +14 -14
  251. package/dist/cli-bundle/chunks/{test-all-NETGVNM6.js → test-all-TDYCCBA4.js} +14 -14
  252. package/dist/cli-bundle/chunks/{test-runs-M24WA6TI.js → test-runs-E64M6XS3.js} +5 -5
  253. package/dist/cli-bundle/chunks/{test-runs-CRPQVMMG.js → test-runs-LXZLULCI.js} +5 -5
  254. package/dist/cli-bundle/chunks/update-2EVXOC7V.js +21 -0
  255. package/dist/cli-bundle/chunks/update-5A2B6QYB.js +25 -0
  256. package/dist/cli-bundle/chunks/{update-many-JSRF5EH5.js → update-many-TUGU5YXQ.js} +22 -22
  257. package/dist/cli-bundle/chunks/{update-many-Y3HOL7WA.js → update-many-V4LA3C4H.js} +22 -22
  258. package/dist/cli-bundle/chunks/{upgrade-5RTQVKKE.js → upgrade-37F7JKES.js} +5 -5
  259. package/dist/cli-bundle/chunks/{upgrade-ECB6GH3M.js → upgrade-L32JA4TZ.js} +5 -5
  260. package/dist/cli-bundle/chunks/{validate-MCNMAXVA.js → validate-EQTT6WVX.js} +16 -16
  261. package/dist/cli-bundle/chunks/{validate-J6Q444SD.js → validate-XN4I4DPL.js} +16 -16
  262. package/dist/cli-bundle/main.js +276 -47
  263. package/dist/cli-bundle/main.js.map +2 -2
  264. package/dist/core/diagnostics/remediation.js +12 -2
  265. package/dist/core/diagnostics/remediation.js.map +1 -1
  266. package/dist/core/extensions/extension-policy.d.ts +14 -1
  267. package/dist/core/extensions/extension-policy.js +38 -3
  268. package/dist/core/extensions/extension-policy.js.map +1 -1
  269. package/dist/core/extensions/extension-types.d.ts +40 -1
  270. package/dist/core/extensions/extension-types.js +28 -2
  271. package/dist/core/extensions/extension-types.js.map +1 -1
  272. package/dist/core/extensions/loader.d.ts +6 -4
  273. package/dist/core/extensions/loader.js +67 -14
  274. package/dist/core/extensions/loader.js.map +1 -1
  275. package/dist/core/history/replay.d.ts +1 -1
  276. package/dist/core/history/replay.js +13 -4
  277. package/dist/core/history/replay.js.map +1 -1
  278. package/dist/core/output/mutation-projection.d.ts +2 -0
  279. package/dist/core/output/mutation-projection.js +9 -2
  280. package/dist/core/output/mutation-projection.js.map +1 -1
  281. package/dist/core/output/output.d.ts +2 -0
  282. package/dist/core/output/output.js +7 -3
  283. package/dist/core/output/output.js.map +1 -1
  284. package/dist/core/output/query-summary.d.ts +31 -0
  285. package/dist/core/output/query-summary.js +62 -0
  286. package/dist/core/output/query-summary.js.map +1 -0
  287. package/dist/core/shared/command-types.d.ts +1 -0
  288. package/dist/core/shared/command-types.js +2 -2
  289. package/dist/core/shared/command-types.js.map +1 -1
  290. package/dist/core/shared/constants.js +8 -4
  291. package/dist/core/shared/constants.js.map +1 -1
  292. package/dist/core/store/item-store.d.ts +1 -1
  293. package/dist/core/store/item-store.js +3 -3
  294. package/dist/core/store/item-store.js.map +1 -1
  295. package/dist/core/store/settings-read-cache.d.ts +15 -0
  296. package/dist/core/store/settings-read-cache.js +72 -0
  297. package/dist/core/store/settings-read-cache.js.map +1 -0
  298. package/dist/core/store/settings-validator.d.ts +4 -1
  299. package/dist/core/store/settings-validator.js +14 -2
  300. package/dist/core/store/settings-validator.js.map +1 -1
  301. package/dist/core/store/settings.js +166 -16
  302. package/dist/core/store/settings.js.map +1 -1
  303. package/dist/core/telemetry/runtime.d.ts +1 -0
  304. package/dist/core/telemetry/runtime.js +3 -3
  305. package/dist/core/telemetry/runtime.js.map +1 -1
  306. package/dist/core/test/run-selectors.d.ts +27 -0
  307. package/dist/core/test/run-selectors.js +110 -0
  308. package/dist/core/test/run-selectors.js.map +1 -0
  309. package/dist/mcp/server.js +76 -262
  310. package/dist/mcp/server.js.map +1 -1
  311. package/dist/mcp/tool-definitions.d.ts +27 -0
  312. package/dist/mcp/tool-definitions.js +330 -0
  313. package/dist/mcp/tool-definitions.js.map +1 -0
  314. package/dist/sdk/cli-contracts/commander-mutation-options.js +3 -2
  315. package/dist/sdk/cli-contracts/commander-mutation-options.js.map +1 -1
  316. package/dist/sdk/cli-contracts/tool-option-contracts.js +3 -2
  317. package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -1
  318. package/dist/sdk/cli-contracts/tool-parameter-tables.js +29 -2
  319. package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
  320. package/dist/sdk/cli-contracts.js +37 -5
  321. package/dist/sdk/cli-contracts.js.map +1 -1
  322. package/dist/sdk/index.d.ts +1 -1
  323. package/dist/sdk/index.js +2 -2
  324. package/dist/sdk/index.js.map +1 -1
  325. package/dist/sdk/runtime.d.ts +6 -0
  326. package/dist/sdk/runtime.js +51 -3
  327. package/dist/sdk/runtime.js.map +1 -1
  328. package/dist/types.d.ts +4 -1
  329. package/dist/types.js +4 -2
  330. package/dist/types.js.map +1 -1
  331. package/docs/AGENT_GUIDE.md +7 -1
  332. package/docs/ARCHITECTURE.md +7 -0
  333. package/docs/CLAUDE_CODE_PLUGIN.md +2 -2
  334. package/docs/COMMANDS.md +38 -3
  335. package/docs/CONFIGURATION.md +1 -1
  336. package/docs/EXTENSIONS.md +55 -53
  337. package/docs/SDK.md +8 -2
  338. package/docs/TESTING.md +60 -0
  339. package/docs/schemas/extension-manifest.schema.json +120 -0
  340. package/marketplace.json +1 -1
  341. package/package.json +2 -2
  342. package/packages/pm-beads/extensions/beads/manifest.json +10 -0
  343. package/packages/pm-calendar/extensions/calendar/manifest.json +10 -0
  344. package/packages/pm-command-kit/README.md +72 -0
  345. package/packages/pm-command-kit/extensions/command-kit/index.js +181 -0
  346. package/packages/pm-command-kit/extensions/command-kit/index.ts +176 -0
  347. package/packages/pm-command-kit/extensions/command-kit/manifest.json +22 -0
  348. package/packages/pm-command-kit/package.json +53 -0
  349. package/packages/pm-governance-audit/extensions/governance-audit/manifest.json +10 -0
  350. package/packages/pm-guide-shell/extensions/guide-shell/manifest.json +10 -0
  351. package/packages/pm-lifecycle-hooks/extensions/lifecycle-hooks/manifest.json +10 -0
  352. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/manifest.json +10 -0
  353. package/packages/pm-search-advanced/extensions/search-advanced/index.js +6 -0
  354. package/packages/pm-search-advanced/extensions/search-advanced/index.ts +6 -0
  355. package/packages/pm-search-advanced/extensions/search-advanced/manifest.json +10 -0
  356. package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +1 -0
  357. package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +1 -0
  358. package/packages/pm-templates/extensions/templates/manifest.json +10 -0
  359. package/packages/pm-todos/extensions/todos/manifest.json +10 -0
  360. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  361. package/plugins/pm-claude/README.md +7 -3
  362. package/plugins/pm-claude/commands/pm-init.md +1 -1
  363. package/plugins/pm-codex/README.md +2 -2
  364. package/dist/cli-bundle/chunks/activity-HF3VJYKH.js +0 -16
  365. package/dist/cli-bundle/chunks/aggregate-IQ27NFBI.js.map +0 -7
  366. package/dist/cli-bundle/chunks/aggregate-TT7OCHHT.js.map +0 -1
  367. package/dist/cli-bundle/chunks/chunk-3RHE76G6.js.map +0 -1
  368. package/dist/cli-bundle/chunks/chunk-4LRVXVJK.js.map +0 -7
  369. package/dist/cli-bundle/chunks/chunk-5JF76OJF.js.map +0 -1
  370. package/dist/cli-bundle/chunks/chunk-7YTWXGE3.js.map +0 -1
  371. package/dist/cli-bundle/chunks/chunk-ANKG2JKL.js.map +0 -1
  372. package/dist/cli-bundle/chunks/chunk-BIRVSIM2.js.map +0 -7
  373. package/dist/cli-bundle/chunks/chunk-C72IQIBT.js.map +0 -7
  374. package/dist/cli-bundle/chunks/chunk-D5D7VKIC.js.map +0 -1
  375. package/dist/cli-bundle/chunks/chunk-EQ6N6IDR.js.map +0 -7
  376. package/dist/cli-bundle/chunks/chunk-FJNJEWU4.js.map +0 -1
  377. package/dist/cli-bundle/chunks/chunk-GPOSGWCN.js.map +0 -1
  378. package/dist/cli-bundle/chunks/chunk-H37YPWLM.js.map +0 -7
  379. package/dist/cli-bundle/chunks/chunk-I26E6XA7.js.map +0 -1
  380. package/dist/cli-bundle/chunks/chunk-I4FGL3K2.js.map +0 -1
  381. package/dist/cli-bundle/chunks/chunk-JVMAOD54.js.map +0 -1
  382. package/dist/cli-bundle/chunks/chunk-LU2HE272.js +0 -242
  383. package/dist/cli-bundle/chunks/chunk-LU2HE272.js.map +0 -1
  384. package/dist/cli-bundle/chunks/chunk-NJRZIJ4N.js.map +0 -1
  385. package/dist/cli-bundle/chunks/chunk-O4L7Z6LB.js +0 -252
  386. package/dist/cli-bundle/chunks/chunk-O4L7Z6LB.js.map +0 -7
  387. package/dist/cli-bundle/chunks/chunk-RLVI7KDW.js.map +0 -7
  388. package/dist/cli-bundle/chunks/chunk-RMTI5R76.js.map +0 -7
  389. package/dist/cli-bundle/chunks/chunk-T7B5VAKD.js.map +0 -7
  390. package/dist/cli-bundle/chunks/chunk-TLD3UYGY.js.map +0 -7
  391. package/dist/cli-bundle/chunks/chunk-WQZCEEQN.js.map +0 -1
  392. package/dist/cli-bundle/chunks/chunk-YSANBZAE.js.map +0 -7
  393. package/dist/cli-bundle/chunks/close-JTTGW7TS.js +0 -13
  394. package/dist/cli-bundle/chunks/context-4N7GYTVQ.js.map +0 -1
  395. package/dist/cli-bundle/chunks/contracts-AOBNEBVT.js.map +0 -7
  396. package/dist/cli-bundle/chunks/contracts-DXCWXOSP.js.map +0 -1
  397. package/dist/cli-bundle/chunks/create-JAPLFDGJ.js +0 -27
  398. package/dist/cli-bundle/chunks/health-CS5RNTJX.js.map +0 -1
  399. package/dist/cli-bundle/chunks/health-KCRVYIYY.js.map +0 -7
  400. package/dist/cli-bundle/chunks/history-6624XISO.js +0 -20
  401. package/dist/cli-bundle/chunks/history-redact-ZRQTI7NB.js +0 -19
  402. package/dist/cli-bundle/chunks/init-ZVE2HMKK.js +0 -17
  403. package/dist/cli-bundle/chunks/list-OO5P472O.js +0 -19
  404. package/dist/cli-bundle/chunks/register-list-query-6RA24SIZ.js.map +0 -1
  405. package/dist/cli-bundle/chunks/register-list-query-IO3RR5K6.js.map +0 -7
  406. package/dist/cli-bundle/chunks/register-mutation-KVFUXCAZ.js.map +0 -7
  407. package/dist/cli-bundle/chunks/register-mutation-VV2SC2KL.js.map +0 -1
  408. package/dist/cli-bundle/chunks/register-operations-DFNVRSJ5.js.map +0 -1
  409. package/dist/cli-bundle/chunks/register-operations-TAUUTRJ4.js.map +0 -7
  410. package/dist/cli-bundle/chunks/restore-F4ALFV4D.js +0 -17
  411. package/dist/cli-bundle/chunks/test-PPOLRIBA.js +0 -32
  412. package/dist/cli-bundle/chunks/update-MCPCPMHV.js +0 -25
  413. package/dist/cli-bundle/chunks/update-O7TBOUVQ.js +0 -21
  414. /package/dist/cli-bundle/chunks/{activity-RUJATACW.js.map → activity-XADJOG6G.js.map} +0 -0
  415. /package/dist/cli-bundle/chunks/{activity-HF3VJYKH.js.map → activity-XZIUPGZH.js.map} +0 -0
  416. /package/dist/cli-bundle/chunks/{append-E7AJ5RTR.js.map → append-JYWO4P7W.js.map} +0 -0
  417. /package/dist/cli-bundle/chunks/{append-CWQZBUWV.js.map → append-KG55G7S3.js.map} +0 -0
  418. /package/dist/cli-bundle/chunks/{chunk-ENCVPOID.js.map → chunk-3SLOMKCJ.js.map} +0 -0
  419. /package/dist/cli-bundle/chunks/{chunk-F2REA7VW.js.map → chunk-4JCSYR6F.js.map} +0 -0
  420. /package/dist/cli-bundle/chunks/{chunk-CAXUGAAF.js.map → chunk-4YFAGDRH.js.map} +0 -0
  421. /package/dist/cli-bundle/chunks/{chunk-U3Z4OCZC.js.map → chunk-5SCT2JCT.js.map} +0 -0
  422. /package/dist/cli-bundle/chunks/{chunk-NHRZSYAA.js.map → chunk-73ZPG2I3.js.map} +0 -0
  423. /package/dist/cli-bundle/chunks/{chunk-A5342JVL.js.map → chunk-7RIT3OCD.js.map} +0 -0
  424. /package/dist/cli-bundle/chunks/{chunk-7CR4GAYN.js.map → chunk-ATEES5SX.js.map} +0 -0
  425. /package/dist/cli-bundle/chunks/{chunk-FHUI7AXS.js.map → chunk-AVGHVVF7.js.map} +0 -0
  426. /package/dist/cli-bundle/chunks/{chunk-42IULX44.js.map → chunk-CCX4RSYZ.js.map} +0 -0
  427. /package/dist/cli-bundle/chunks/{chunk-EFRHTZO4.js.map → chunk-CW6E4NAT.js.map} +0 -0
  428. /package/dist/cli-bundle/chunks/{chunk-JN3BT7UY.js.map → chunk-DY6C42S6.js.map} +0 -0
  429. /package/dist/cli-bundle/chunks/{chunk-PUSOAQCR.js.map → chunk-E5DUIJA4.js.map} +0 -0
  430. /package/dist/cli-bundle/chunks/{chunk-E7LOIIFP.js.map → chunk-ESANVZF4.js.map} +0 -0
  431. /package/dist/cli-bundle/chunks/{chunk-YI6W2DBN.js.map → chunk-F75JSIOZ.js.map} +0 -0
  432. /package/dist/cli-bundle/chunks/{chunk-6IGTNFE3.js.map → chunk-FDH2X65L.js.map} +0 -0
  433. /package/dist/cli-bundle/chunks/{chunk-ZPXDD6RQ.js.map → chunk-I53JBTJW.js.map} +0 -0
  434. /package/dist/cli-bundle/chunks/{chunk-23WNCJBA.js.map → chunk-I7NYDZDV.js.map} +0 -0
  435. /package/dist/cli-bundle/chunks/{chunk-SAUXUI6U.js.map → chunk-IUKD4W6Z.js.map} +0 -0
  436. /package/dist/cli-bundle/chunks/{chunk-RKCJ2JMA.js.map → chunk-OASDW5UI.js.map} +0 -0
  437. /package/dist/cli-bundle/chunks/{chunk-JEGFLKSI.js.map → chunk-OLKBSY4N.js.map} +0 -0
  438. /package/dist/cli-bundle/chunks/{chunk-XEOO6K5J.js.map → chunk-P5BJOMBB.js.map} +0 -0
  439. /package/dist/cli-bundle/chunks/{chunk-P2NVFE4L.js.map → chunk-P5U5EOMA.js.map} +0 -0
  440. /package/dist/cli-bundle/chunks/{chunk-AM2AXVFS.js.map → chunk-PSD7F7DX.js.map} +0 -0
  441. /package/dist/cli-bundle/chunks/{chunk-VDVVOLR6.js.map → chunk-QJMGRZO2.js.map} +0 -0
  442. /package/dist/cli-bundle/chunks/{chunk-T7NWFVOA.js.map → chunk-QNJSITCX.js.map} +0 -0
  443. /package/dist/cli-bundle/chunks/{chunk-MNXJ6YDO.js.map → chunk-RXAP6JL5.js.map} +0 -0
  444. /package/dist/cli-bundle/chunks/{chunk-5MMLINZB.js.map → chunk-S26FESD4.js.map} +0 -0
  445. /package/dist/cli-bundle/chunks/{chunk-OPYA2HIU.js.map → chunk-TK5VZFHY.js.map} +0 -0
  446. /package/dist/cli-bundle/chunks/{chunk-4TJWRPIH.js.map → chunk-TNAP7EJX.js.map} +0 -0
  447. /package/dist/cli-bundle/chunks/{chunk-5ATRWEZO.js.map → chunk-UUWGCWBU.js.map} +0 -0
  448. /package/dist/cli-bundle/chunks/{chunk-YX5LAKFJ.js.map → chunk-VAOUX6TK.js.map} +0 -0
  449. /package/dist/cli-bundle/chunks/{chunk-WCWIDJII.js.map → chunk-VPEAS7PS.js.map} +0 -0
  450. /package/dist/cli-bundle/chunks/{chunk-RE2JQJZJ.js.map → chunk-VSRZRLG3.js.map} +0 -0
  451. /package/dist/cli-bundle/chunks/{chunk-PW7C262O.js.map → chunk-WUNFKP7M.js.map} +0 -0
  452. /package/dist/cli-bundle/chunks/{chunk-NUGAWYEN.js.map → chunk-XTKJSVWH.js.map} +0 -0
  453. /package/dist/cli-bundle/chunks/{chunk-KDX6VC3P.js.map → chunk-XUC4C4PT.js.map} +0 -0
  454. /package/dist/cli-bundle/chunks/{chunk-44JP4PYY.js.map → chunk-Y3YKK7CY.js.map} +0 -0
  455. /package/dist/cli-bundle/chunks/{chunk-KTVXLI54.js.map → chunk-YW6Q3RYZ.js.map} +0 -0
  456. /package/dist/cli-bundle/chunks/{chunk-I3UILOUU.js.map → chunk-ZLMIWZUG.js.map} +0 -0
  457. /package/dist/cli-bundle/chunks/{chunk-FKH7K6YP.js.map → chunk-ZMW77VWV.js.map} +0 -0
  458. /package/dist/cli-bundle/chunks/{claim-UXFGCF3P.js.map → claim-2RDYMCTP.js.map} +0 -0
  459. /package/dist/cli-bundle/chunks/{claim-RV6WYUF7.js.map → claim-MJ7DZFC3.js.map} +0 -0
  460. /package/dist/cli-bundle/chunks/{close-JTTGW7TS.js.map → close-4FMAPEMY.js.map} +0 -0
  461. /package/dist/cli-bundle/chunks/{close-O4JK2JKD.js.map → close-XLEKIQSW.js.map} +0 -0
  462. /package/dist/cli-bundle/chunks/{close-many-EQO4TPIE.js.map → close-many-AOD4HSAZ.js.map} +0 -0
  463. /package/dist/cli-bundle/chunks/{close-many-SRDBV3SI.js.map → close-many-XKAQY5CQ.js.map} +0 -0
  464. /package/dist/cli-bundle/chunks/{comments-TTZUIB2O.js.map → comments-B4RWWDJT.js.map} +0 -0
  465. /package/dist/cli-bundle/chunks/{comments-OMB7YE27.js.map → comments-RN5TG4ZN.js.map} +0 -0
  466. /package/dist/cli-bundle/chunks/{config-5VPR42A6.js.map → config-3JXJ3XZ7.js.map} +0 -0
  467. /package/dist/cli-bundle/chunks/{config-NNLXVGVC.js.map → config-FZ4UDC4B.js.map} +0 -0
  468. /package/dist/cli-bundle/chunks/{copy-5NM3SVJA.js.map → copy-ALU5WMHA.js.map} +0 -0
  469. /package/dist/cli-bundle/chunks/{copy-XSYEQTLA.js.map → copy-FWIVTLBO.js.map} +0 -0
  470. /package/dist/cli-bundle/chunks/{create-FCCAATQV.js.map → create-IFA26O2I.js.map} +0 -0
  471. /package/dist/cli-bundle/chunks/{create-JAPLFDGJ.js.map → create-JVXYHYH4.js.map} +0 -0
  472. /package/dist/cli-bundle/chunks/{delete-5JFP6OG7.js.map → delete-IYTIYAJS.js.map} +0 -0
  473. /package/dist/cli-bundle/chunks/{delete-PQXJQXQ7.js.map → delete-Y2SGJBGY.js.map} +0 -0
  474. /package/dist/cli-bundle/chunks/{deps-S5322EOQ.js.map → deps-6TSPOSGU.js.map} +0 -0
  475. /package/dist/cli-bundle/chunks/{deps-XXKBOQUA.js.map → deps-CZ4PTVXU.js.map} +0 -0
  476. /package/dist/cli-bundle/chunks/{docs-C7CCVWAJ.js.map → docs-5WMBVQT2.js.map} +0 -0
  477. /package/dist/cli-bundle/chunks/{docs-DZRPAW5S.js.map → docs-MB53UJAJ.js.map} +0 -0
  478. /package/dist/cli-bundle/chunks/{extension-CSHP6FZX.js.map → extension-Q34OEWO5.js.map} +0 -0
  479. /package/dist/cli-bundle/chunks/{extension-XNNVUVAY.js.map → extension-WH2FOIOZ.js.map} +0 -0
  480. /package/dist/cli-bundle/chunks/{files-UPCNKEIZ.js.map → files-DLB5LJEP.js.map} +0 -0
  481. /package/dist/cli-bundle/chunks/{files-OBWYYPKM.js.map → files-GVMNVLCB.js.map} +0 -0
  482. /package/dist/cli-bundle/chunks/{gc-FA2ONELT.js.map → gc-2WEPW6D6.js.map} +0 -0
  483. /package/dist/cli-bundle/chunks/{gc-KXK6KBRN.js.map → gc-4Z3IKHAZ.js.map} +0 -0
  484. /package/dist/cli-bundle/chunks/{get-PNTSONGB.js.map → get-PCHS7RA6.js.map} +0 -0
  485. /package/dist/cli-bundle/chunks/{get-FLHYTOBA.js.map → get-QARTE6BL.js.map} +0 -0
  486. /package/dist/cli-bundle/chunks/{history-COQTPBEU.js.map → history-7WUAEWHW.js.map} +0 -0
  487. /package/dist/cli-bundle/chunks/{history-6624XISO.js.map → history-L2FQFRTU.js.map} +0 -0
  488. /package/dist/cli-bundle/chunks/{history-compact-PVS2A3FS.js.map → history-compact-3EJ3L2O7.js.map} +0 -0
  489. /package/dist/cli-bundle/chunks/{history-compact-66PSRYL3.js.map → history-compact-LW27IPFK.js.map} +0 -0
  490. /package/dist/cli-bundle/chunks/{history-redact-DCXAWGTF.js.map → history-redact-G72A4EJ4.js.map} +0 -0
  491. /package/dist/cli-bundle/chunks/{history-redact-ZRQTI7NB.js.map → history-redact-QWQCX5DZ.js.map} +0 -0
  492. /package/dist/cli-bundle/chunks/{history-repair-SEQDFTGW.js.map → history-repair-KVPFJKOS.js.map} +0 -0
  493. /package/dist/cli-bundle/chunks/{history-repair-TA3NRIFO.js.map → history-repair-RUGKD3YR.js.map} +0 -0
  494. /package/dist/cli-bundle/chunks/{init-ZVE2HMKK.js.map → init-4BKRHGWW.js.map} +0 -0
  495. /package/dist/cli-bundle/chunks/{init-IQJE3EKJ.js.map → init-S5WEGUJY.js.map} +0 -0
  496. /package/dist/cli-bundle/chunks/{learnings-XC6EMW5E.js.map → learnings-HQXSSKZ5.js.map} +0 -0
  497. /package/dist/cli-bundle/chunks/{learnings-RJPGH2ME.js.map → learnings-XK3P4ZDR.js.map} +0 -0
  498. /package/dist/cli-bundle/chunks/{list-NJV6WBT4.js.map → list-6CL3XFT6.js.map} +0 -0
  499. /package/dist/cli-bundle/chunks/{list-OO5P472O.js.map → list-BYNN4ZEO.js.map} +0 -0
  500. /package/dist/cli-bundle/chunks/{notes-2KWHADK3.js.map → notes-5T6P7C5V.js.map} +0 -0
  501. /package/dist/cli-bundle/chunks/{notes-FNCDMZW2.js.map → notes-U5FZCSBT.js.map} +0 -0
  502. /package/dist/cli-bundle/chunks/{plan-CYK2P5PD.js.map → plan-FQLMJRLZ.js.map} +0 -0
  503. /package/dist/cli-bundle/chunks/{plan-MQO5JTSV.js.map → plan-VNUG3WZZ.js.map} +0 -0
  504. /package/dist/cli-bundle/chunks/{register-setup-X2R5CFDV.js.map → register-setup-G4QYI3RX.js.map} +0 -0
  505. /package/dist/cli-bundle/chunks/{register-setup-GAQZZRUA.js.map → register-setup-IKX5524L.js.map} +0 -0
  506. /package/dist/cli-bundle/chunks/{restore-F4ALFV4D.js.map → restore-CHIOQAQL.js.map} +0 -0
  507. /package/dist/cli-bundle/chunks/{restore-E3GZKRRK.js.map → restore-M6AFHMV4.js.map} +0 -0
  508. /package/dist/cli-bundle/chunks/{schema-3CPFLDAY.js.map → schema-76HDZJCC.js.map} +0 -0
  509. /package/dist/cli-bundle/chunks/{schema-7EHBPNXM.js.map → schema-AINZ2IMM.js.map} +0 -0
  510. /package/dist/cli-bundle/chunks/{search-OBZVYJJ2.js.map → search-JMLFQEPJ.js.map} +0 -0
  511. /package/dist/cli-bundle/chunks/{search-2T3NCCUR.js.map → search-NL3TSCYB.js.map} +0 -0
  512. /package/dist/cli-bundle/chunks/{stats-6LVK4JER.js.map → stats-BKXCBIGT.js.map} +0 -0
  513. /package/dist/cli-bundle/chunks/{stats-ULGQACF7.js.map → stats-UBD56TGK.js.map} +0 -0
  514. /package/dist/cli-bundle/chunks/{telemetry-HHKRTMZA.js.map → telemetry-N454RHG5.js.map} +0 -0
  515. /package/dist/cli-bundle/chunks/{telemetry-6G27FLCP.js.map → telemetry-ZJXK3H7X.js.map} +0 -0
  516. /package/dist/cli-bundle/chunks/{test-2PP4YBV6.js.map → test-BQAKIXAT.js.map} +0 -0
  517. /package/dist/cli-bundle/chunks/{test-PPOLRIBA.js.map → test-O74JFUH5.js.map} +0 -0
  518. /package/dist/cli-bundle/chunks/{test-all-6Z272JRI.js.map → test-all-7LV3I6S5.js.map} +0 -0
  519. /package/dist/cli-bundle/chunks/{test-all-NETGVNM6.js.map → test-all-TDYCCBA4.js.map} +0 -0
  520. /package/dist/cli-bundle/chunks/{test-runs-M24WA6TI.js.map → test-runs-E64M6XS3.js.map} +0 -0
  521. /package/dist/cli-bundle/chunks/{test-runs-CRPQVMMG.js.map → test-runs-LXZLULCI.js.map} +0 -0
  522. /package/dist/cli-bundle/chunks/{update-O7TBOUVQ.js.map → update-2EVXOC7V.js.map} +0 -0
  523. /package/dist/cli-bundle/chunks/{update-MCPCPMHV.js.map → update-5A2B6QYB.js.map} +0 -0
  524. /package/dist/cli-bundle/chunks/{update-many-JSRF5EH5.js.map → update-many-TUGU5YXQ.js.map} +0 -0
  525. /package/dist/cli-bundle/chunks/{update-many-Y3HOL7WA.js.map → update-many-V4LA3C4H.js.map} +0 -0
  526. /package/dist/cli-bundle/chunks/{upgrade-5RTQVKKE.js.map → upgrade-37F7JKES.js.map} +0 -0
  527. /package/dist/cli-bundle/chunks/{upgrade-ECB6GH3M.js.map → upgrade-L32JA4TZ.js.map} +0 -0
  528. /package/dist/cli-bundle/chunks/{validate-MCNMAXVA.js.map → validate-EQTT6WVX.js.map} +0 -0
  529. /package/dist/cli-bundle/chunks/{validate-J6Q444SD.js.map → validate-XN4I4DPL.js.map} +0 -0
@@ -1,15 +1,15 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a07f6898-1c0c-5eb9-98f9-4f8aef2001f5")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="5597e7ea-39ad-5bd4-9a7a-5a7428ea5e27")}catch(e){}}();
3
3
  import {
4
4
  verifyHistoryChain
5
- } from "./chunk-NJRZIJ4N.js";
5
+ } from "./chunk-ZYNJNPYD.js";
6
6
  import {
7
7
  hashDocument
8
- } from "./chunk-AVGOVJGV.js";
8
+ } from "./chunk-HI7STVF2.js";
9
9
  import {
10
10
  getHistoryPath,
11
11
  writeFileAtomic
12
- } from "./chunk-5JF76OJF.js";
12
+ } from "./chunk-A6LXQFO7.js";
13
13
 
14
14
  // dist/core/history/drift-scan.js
15
15
  import fs from "fs/promises";
@@ -230,6 +230,11 @@ var REMEDIATION_REGISTRY = Object.freeze([
230
230
  command: "pm health --check-telemetry",
231
231
  summary: "Telemetry events are queued; they flush automatically on the next reachable command. Advisory only."
232
232
  },
233
+ {
234
+ code: "telemetry_queue_high_retries",
235
+ command: "pm telemetry flush",
236
+ summary: "Some queued telemetry events are near retry exhaustion; flush now and verify endpoint reachability before entries are dropped."
237
+ },
233
238
  {
234
239
  code: "telemetry_endpoint_probe_failed",
235
240
  command: "pm health --check-telemetry",
@@ -303,6 +308,11 @@ var REMEDIATION_REGISTRY = Object.freeze([
303
308
  command: "pm health --refresh-vectors",
304
309
  summary: "Some items have stale embeddings; refresh vectors so semantic search results stay current."
305
310
  },
311
+ {
312
+ code: "vectorization_embedding_identity_changed",
313
+ command: "pm reindex --mode semantic",
314
+ summary: "Embedding provider/model changed since the last index; run a semantic reindex to rebuild vectors."
315
+ },
306
316
  // --- pm validate: metadata ---
307
317
  // Note: validate_metadata_missing_author has no entry on purpose. `pm update
308
318
  // --author` sets the mutation/audit author (history), not the item's
@@ -461,6 +471,6 @@ export {
461
471
  buildRemediationMap,
462
472
  buildRemediationCommands
463
473
  };
464
- //# sourceMappingURL=chunk-I4FGL3K2.js.map
474
+ //# sourceMappingURL=chunk-UOO6BYIA.js.map
465
475
 
466
- //# debugId=a07f6898-1c0c-5eb9-98f9-4f8aef2001f5
476
+ //# debugId=5597e7ea-39ad-5bd4-9a7a-5a7428ea5e27
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../core/history/drift-scan.ts","../../../../../../../../core/diagnostics/remediation.ts"],"sourcesContent":["import fs from \"fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport path from \"node:path\";\nimport { getHistoryPath } from \"../store/paths.js\";\nimport { writeFileAtomic } from \"../fs/fs-utils.js\";\nimport { hashDocument } from \"./history.js\";\nimport { verifyHistoryChain } from \"./replay.js\";\nimport type { HistoryEntry, ItemMetadata } from \"../../types/index.js\";\n\nexport interface DriftScanResult {\n missingStreams: string[];\n unreadableStreams: string[];\n hashMismatches: string[];\n chainMismatches: string[];\n driftedItems: string[];\n}\n\nconst DRIFT_CACHE_VERSION = 2;\nconst DRIFT_CACHE_FILENAME = \"history-drift-cache.json\";\n\ninterface DriftCacheEntry {\n mtime_ms: number;\n ctime_ms: number;\n size: number;\n content_hash: string;\n latest_after_hash: string;\n chain_ok: boolean;\n}\n\ninterface DriftCacheEnvelope {\n version: number;\n entries: Record<string, DriftCacheEntry>;\n}\n\nfunction getDriftCachePath(pmRoot: string): string {\n return path.join(pmRoot, \"runtime\", DRIFT_CACHE_FILENAME);\n}\n\nasync function loadDriftCache(pmRoot: string): Promise<DriftCacheEnvelope | null> {\n try {\n const raw = await fs.readFile(getDriftCachePath(pmRoot), \"utf8\");\n const parsed = JSON.parse(raw) as DriftCacheEnvelope;\n if (parsed.version !== DRIFT_CACHE_VERSION || typeof parsed.entries !== \"object\" || parsed.entries === null) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction isErrno(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && (error as { code?: string }).code === code;\n}\n\ninterface StreamVerification {\n latestAfterHash: string;\n chainOk: boolean;\n contentHash: string;\n}\n\nfunction hashContent(raw: string): string {\n return createHash(\"sha256\").update(raw).digest(\"hex\");\n}\n\nasync function readHistoryContentHash(historyPath: string): Promise<string> {\n const raw = await fs.readFile(historyPath, \"utf8\");\n return hashContent(raw);\n}\n\n/**\n * Read and fully verify one history stream's hash chain. Returns null for an\n * empty/missing stream (caller records it as a missing stream).\n */\nasync function verifyHistoryStream(historyPath: string): Promise<StreamVerification | null> {\n const raw = await fs.readFile(historyPath, \"utf8\");\n const contentHash = hashContent(raw);\n if (raw.trim().length === 0) {\n return null;\n }\n const entries: HistoryEntry[] = [];\n let latestAfterHash: string | null = null;\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n continue;\n }\n const parsed = JSON.parse(trimmed) as HistoryEntry;\n if (typeof parsed.after_hash !== \"string\" || parsed.after_hash.trim().length === 0) {\n throw new Error(\"missing after_hash\");\n }\n entries.push(parsed);\n latestAfterHash = parsed.after_hash;\n }\n /* c8 ignore start -- defensive guard for future history schema changes. */\n if (!latestAfterHash) {\n return null;\n }\n /* c8 ignore stop */\n return {\n latestAfterHash,\n chainOk: verifyHistoryChain(entries).ok,\n contentHash,\n };\n}\n\n/**\n * Scan every item's history stream for drift (missing/unreadable streams, broken\n * hash chains, and item/history hash mismatches).\n *\n * Full chain re-verification of a 17MB+ history tree is the dominant cost of\n * `pm health`. We cache the per-stream verification keyed by the history file's\n * mtime/ctime/size + content hash: metadata-stable replacements (same stat tuple)\n * can still happen, so each metadata hit recomputes a content hash guard before\n * trusting the cached chain/hash verification.\n */\nexport async function scanHistoryDrift(\n pmRoot: string,\n items: Array<ItemMetadata & { body: string }>,\n): Promise<DriftScanResult> {\n const missingStreams: string[] = [];\n const unreadableStreams: string[] = [];\n const hashMismatches: string[] = [];\n const chainMismatches: string[] = [];\n\n const cache = await loadDriftCache(pmRoot);\n const previousEntries: Record<string, DriftCacheEntry> = cache?.entries ?? {};\n const nextEntries: Record<string, DriftCacheEntry> = {};\n let cacheDirty = false;\n\n for (const item of items) {\n const historyPath = getHistoryPath(pmRoot, item.id);\n\n let stat: Awaited<ReturnType<typeof fs.stat>>;\n try {\n stat = await fs.stat(historyPath);\n } catch (error: unknown) {\n if (isErrno(error, \"ENOENT\")) {\n missingStreams.push(item.id);\n } else {\n unreadableStreams.push(item.id);\n }\n continue;\n }\n\n const loadStreamVerification = async (): Promise<StreamVerification | null | \"unreadable\"> => {\n try {\n return await verifyHistoryStream(historyPath);\n } catch {\n return \"unreadable\";\n }\n };\n\n const loadFreshVerification = async (): Promise<StreamVerification | null> => {\n const loaded = await loadStreamVerification();\n if (loaded === \"unreadable\") {\n unreadableStreams.push(item.id);\n return null;\n }\n if (!loaded) {\n missingStreams.push(item.id);\n return null;\n }\n return loaded;\n };\n\n const cached = previousEntries[item.id];\n let verification: StreamVerification;\n const metadataMatchesCache =\n cached !== undefined &&\n cached.mtime_ms === stat.mtimeMs &&\n cached.ctime_ms === stat.ctimeMs &&\n cached.size === stat.size;\n const cachedContentHash =\n typeof cached?.content_hash === \"string\" && cached.content_hash.length > 0 ? cached.content_hash : undefined;\n const canUseCache = metadataMatchesCache && cachedContentHash !== undefined;\n if (canUseCache && cached) {\n let currentContentHash: string;\n try {\n currentContentHash = await readHistoryContentHash(historyPath);\n } catch {\n unreadableStreams.push(item.id);\n continue;\n }\n if (currentContentHash === cachedContentHash) {\n verification = {\n latestAfterHash: cached.latest_after_hash,\n chainOk: cached.chain_ok,\n contentHash: currentContentHash,\n };\n } else {\n cacheDirty = true;\n const refreshed = await loadFreshVerification();\n if (!refreshed) {\n continue;\n }\n verification = refreshed;\n }\n } else {\n cacheDirty = true;\n const refreshed = await loadFreshVerification();\n if (!refreshed) {\n continue;\n }\n verification = refreshed;\n }\n\n if (!verification.chainOk) {\n chainMismatches.push(item.id);\n }\n nextEntries[item.id] = {\n mtime_ms: stat.mtimeMs,\n ctime_ms: stat.ctimeMs,\n size: stat.size,\n content_hash: verification.contentHash,\n latest_after_hash: verification.latestAfterHash,\n chain_ok: verification.chainOk,\n };\n\n const { body, ...frontMatter } = item;\n const currentHash = hashDocument({\n metadata: frontMatter as ItemMetadata,\n body,\n });\n if (currentHash !== verification.latestAfterHash) {\n hashMismatches.push(item.id);\n }\n }\n\n if (cacheDirty || Object.keys(previousEntries).length !== Object.keys(nextEntries).length) {\n const cachePath = getDriftCachePath(pmRoot);\n try {\n await fs.mkdir(path.dirname(cachePath), { recursive: true });\n await writeFileAtomic(cachePath, JSON.stringify({ version: DRIFT_CACHE_VERSION, entries: nextEntries }));\n } catch {\n // Best-effort cache write: a failed persist must never fail a health scan.\n }\n }\n\n const driftedItems = [...new Set([...missingStreams, ...unreadableStreams, ...hashMismatches, ...chainMismatches])].sort((a, b) =>\n a.localeCompare(b),\n );\n return { missingStreams, unreadableStreams, hashMismatches, chainMismatches, driftedItems };\n}\n","/**\n * Shared machine-executable remediation registry.\n *\n * `pm health` and `pm validate` both emit stable, colon-delimited warning tokens\n * (for example `history_drift_missing_stream:pm-abcd` or\n * `validate_resolution_missing_fields:3`). Agents that gate on these commands\n * previously had to hardcode the mapping from a warning code to the `pm` command\n * that fixes it. This module is the single source of truth for that mapping so\n * `pm health --json` (per-check `remediation_map`) and `pm validate --fix-hints`\n * (per-check `fix_hints`) can both surface executable remediation without any\n * duplicated, drift-prone lookup tables.\n *\n * Semantics of {@link RemediationEntry.command}: the suggested next `pm` command\n * an operator/agent should run to resolve findings with that code. Per-item\n * findings use an `<id>` placeholder (callers that have the concrete id may\n * substitute it); findings whose only fix is a manual file edit point at the\n * most useful diagnostic/repair command and describe the manual step in\n * {@link RemediationEntry.summary}.\n */\n\nexport interface RemediationEntry {\n /**\n * Stable warning-code prefix this entry resolves. A warning matches when it\n * equals this code or begins with `<code>:`. Registry codes are mutually\n * exclusive under that colon-boundary rule (no code is a `:`-delimited prefix\n * of another — e.g. `settings:id_prefix_empty` is distinct from a bare\n * `settings`, which is intentionally not registered), so `resolveRemediation`\n * uses first-match with no ordering dependency.\n */\n readonly code: string;\n /** Executable `pm` command (or imperative) that resolves the finding. May contain an `<id>` placeholder. */\n readonly command: string;\n /** One-line description of what the command does / which manual step it covers. */\n readonly summary: string;\n}\n\n/**\n * Registry of every non-extension `pm health` / `pm validate` warning code and\n * its remediation. Extension findings keep their richer, contextual\n * `details.triage.remediation` produced by the extension health triage and are\n * intentionally excluded here (see pm-0hnu: \"all non-extension checks\").\n */\nexport const REMEDIATION_REGISTRY: readonly RemediationEntry[] = Object.freeze([\n // --- pm health: directories ---\n {\n code: \"missing_directory\",\n command: \"pm init\",\n summary: \"Recreate missing tracker directories (pm init is idempotent and restores the scaffold).\",\n },\n // --- pm health: settings (read/parse) ---\n {\n code: \"settings_read_invalid_json\",\n command: \"pm config list --json\",\n summary:\n \"settings.json is not valid JSON and pm fell back to defaults; fix the syntax error in the reported path, then re-run.\",\n },\n {\n code: \"settings_read_invalid_schema\",\n command: \"pm config list --json\",\n summary:\n \"settings.json failed schema validation and pm fell back to defaults; correct the reported key in the file, then re-run.\",\n },\n {\n code: \"settings_read_merge_failed\",\n command: \"pm config list --json\",\n summary: \"Global/project settings could not be merged; reconcile the conflicting keys in the reported settings files.\",\n },\n // --- pm health: settings_values ---\n {\n code: \"settings:id_prefix_empty\",\n command: \"pm config list --json\",\n summary: 'id_prefix is empty; set a non-empty \"id_prefix\" in settings.json so generated item ids are well-formed.',\n },\n {\n code: \"settings:locks_ttl_non_positive\",\n command: \"pm config list --json\",\n summary: 'locks.ttl_seconds must be positive; set a positive \"locks.ttl_seconds\" in settings.json.',\n },\n // --- pm health: telemetry (advisory) ---\n {\n code: \"telemetry_state_invalid_json\",\n command: \"pm health --check-telemetry\",\n summary: \"Local telemetry state file is corrupt; pm recreates it on the next flush. Advisory only.\",\n },\n {\n code: \"telemetry_queue_invalid_rows\",\n command: \"pm health --check-telemetry\",\n summary: \"The telemetry queue has unparseable rows; they are skipped on the next flush. Advisory only.\",\n },\n {\n code: \"telemetry_queue_pending\",\n command: \"pm health --check-telemetry\",\n summary: \"Telemetry events are queued; they flush automatically on the next reachable command. Advisory only.\",\n },\n {\n code: \"telemetry_queue_high_retries\",\n command: \"pm telemetry flush\",\n summary:\n \"Some queued telemetry events are near retry exhaustion; flush now and verify endpoint reachability before entries are dropped.\",\n },\n {\n code: \"telemetry_endpoint_probe_failed\",\n command: \"pm health --check-telemetry\",\n summary: \"The telemetry endpoint is unreachable; events stay queued until it recovers. Advisory only.\",\n },\n {\n code: \"telemetry_endpoint_probe_http_status\",\n command: \"pm health --check-telemetry\",\n summary: \"The telemetry endpoint returned a non-success status; events stay queued until it recovers. Advisory only.\",\n },\n {\n code: \"telemetry_schema_version_behind\",\n command: \"pm health --check-telemetry\",\n summary: \"Client schema is behind server; upgrade pm-cli to emit the latest event shape.\",\n },\n // --- pm health: integrity ---\n {\n code: \"integrity_item_unreadable\",\n command: \"pm validate --check-files --verbose-diagnostics\",\n summary: \"An item file could not be read; restore or repair the file at the reported path.\",\n },\n {\n code: \"integrity_item_parse_failed\",\n command: \"pm validate --check-files --verbose-diagnostics\",\n summary: \"An item file failed to parse; fix the malformed front matter at the reported path.\",\n },\n {\n code: \"integrity_item_conflict_marker\",\n command: \"pm validate --check-files --verbose-diagnostics\",\n summary: \"An item file contains Git conflict markers; resolve the <<<<<<< / >>>>>>> markers at the reported line.\",\n },\n {\n code: \"integrity_history_unreadable\",\n command: \"pm history-repair <id>\",\n summary: \"A history stream could not be read; re-anchor the affected item's history chain.\",\n },\n {\n code: \"integrity_history_invalid_json\",\n command: \"pm history-repair <id>\",\n summary: \"A history stream contains invalid JSON; re-anchor the affected item's history chain.\",\n },\n {\n code: \"integrity_history_conflict_marker\",\n command: \"pm history-repair <id>\",\n summary: \"A history stream contains Git conflict markers; resolve the markers, then re-anchor the chain.\",\n },\n // --- pm health: history_drift ---\n {\n code: \"history_drift_missing_stream\",\n command: \"pm history-repair <id>\",\n summary: \"The item has no history stream; re-anchor the chain to rebuild it.\",\n },\n {\n code: \"history_drift_unreadable_stream\",\n command: \"pm history-repair <id>\",\n summary: \"The item's history stream is unreadable; re-anchor the chain.\",\n },\n {\n code: \"history_drift_hash_mismatch\",\n command: \"pm history-repair <id>\",\n summary: \"The item's content hash no longer matches its history; re-anchor the chain.\",\n },\n {\n code: \"history_drift_chain_mismatch\",\n command: \"pm history-repair <id>\",\n summary: \"The item's history chain is broken; re-anchor the chain.\",\n },\n // --- pm health: vectorization ---\n {\n code: \"vectorization_stale_items_remaining\",\n command: \"pm health --refresh-vectors\",\n summary: \"Some items have stale embeddings; refresh vectors so semantic search results stay current.\",\n },\n {\n code: \"vectorization_embedding_identity_changed\",\n command: \"pm reindex --mode semantic\",\n summary: \"Embedding provider/model changed since the last index; run a semantic reindex to rebuild vectors.\",\n },\n // --- pm validate: metadata ---\n // Note: validate_metadata_missing_author has no entry on purpose. `pm update\n // --author` sets the mutation/audit author (history), not the item's\n // `metadata.author` front-matter field, and there is no CLI flag that writes\n // that field — so emitting a command here would record an audit entry without\n // clearing the finding. A missing item author must be restored at the source.\n {\n code: \"validate_metadata_missing_acceptance_criteria\",\n command: 'pm update <id> --acceptance-criteria \"<criteria>\"',\n summary: \"Backfill the missing acceptance criteria on the reported item(s).\",\n },\n {\n code: \"validate_metadata_missing_estimate\",\n command: 'pm update <id> --estimate \"<estimate>\"',\n summary: \"Backfill the missing estimate on the reported item(s).\",\n },\n {\n code: \"validate_metadata_missing_close_reason\",\n command: 'pm update <id> --close-reason \"<reason>\"',\n summary: \"Backfill the missing close reason on the reported closed item(s).\",\n },\n {\n code: \"validate_metadata_missing_reviewer\",\n command: 'pm update <id> --reviewer \"<name>\"',\n summary: \"Backfill the missing reviewer on the reported item(s).\",\n },\n {\n code: \"validate_metadata_missing_risk\",\n command: 'pm update <id> --risk \"<level>\"',\n summary: \"Backfill the missing risk on the reported item(s).\",\n },\n {\n code: \"validate_metadata_missing_confidence\",\n command: 'pm update <id> --confidence \"<level>\"',\n summary: \"Backfill the missing confidence on the reported item(s).\",\n },\n {\n code: \"validate_metadata_missing_sprint\",\n command: 'pm update <id> --sprint \"<sprint>\"',\n summary: \"Backfill the missing sprint on the reported item(s).\",\n },\n {\n code: \"validate_metadata_missing_release\",\n command: 'pm update <id> --release \"<release>\"',\n summary: \"Backfill the missing release on the reported item(s).\",\n },\n {\n code: \"validate_metadata_custom_profile_missing_required_fields\",\n command: 'pm config set metadata-required-fields --criterion \"<field>\"',\n summary:\n \"Config-driven finding: the custom metadata profile has no required fields configured and falls back to core, so configure the fields rather than mutating items.\",\n },\n // --- pm validate: resolution ---\n {\n code: \"validate_resolution_missing_fields\",\n command: 'pm update <id> --resolution \"<how resolved>\"',\n summary: \"Backfill resolution / expected_result / actual_result on the reported closed item(s).\",\n },\n // --- pm validate: lifecycle ---\n {\n code: \"validate_lifecycle_active_closure_like_metadata\",\n command: \"pm update <id> --unset <closure-like-field>\",\n summary:\n \"Clear the closure-like field the validator flags on this active item — the detail row names it (resolution / actual-result / blocked-reason) — or close the item if it is actually done.\",\n },\n {\n code: \"validate_lifecycle_active_terminal_parent\",\n command: \"pm update <id> --parent <active-parent-id>\",\n summary: \"Reopen the terminal parent or move the active child under a non-terminal parent.\",\n },\n {\n code: \"validate_lifecycle_stale_blockers\",\n command: \"pm update <id> --unset blocked-by --unset blocked-reason\",\n summary:\n \"Resolve the stale blocker the validator flags: clear blocked-by/blocked-reason when they linger on a non-blocked item or report a resolved blocker; if instead a blocked item is missing blocker context, add the context or move it out of a blocked status.\",\n },\n {\n code: \"validate_lifecycle_dependency_cycles_error\",\n command: \"pm update <id> --dep-remove <dep-id>\",\n summary: \"Break the dependency cycle by removing one edge from the reported cycle.\",\n },\n {\n code: \"validate_lifecycle_dependency_cycles\",\n command: \"pm update <id> --dep-remove <dep-id>\",\n summary: \"Break the dependency cycle by removing one edge from the reported cycle.\",\n },\n // --- pm validate: files ---\n {\n code: \"validate_files_missing_linked_paths\",\n command: \"pm <files|docs> <id> --remove <path>\",\n summary:\n \"The check spans both item.files and item.docs under one code: restore the missing linked artifact, or unlink it with pm files (linked file) or pm docs (linked doc).\",\n },\n {\n code: \"validate_files_orphaned_paths\",\n command: \"pm <files|docs> <id> --add <path>\",\n summary:\n \"Link the orphaned artifact with pm files (file) or pm docs (doc), or remove it from the workspace.\",\n },\n {\n code: \"validate_files_tracked_all_strict_forces_pm_internals\",\n command: \"pm validate --check-files --include-pm-internals\",\n summary: \"tracked-all-strict scan flagged pm internals; re-run with --include-pm-internals or a softer --scan-mode.\",\n },\n // --- pm validate: history_drift ---\n {\n code: \"validate_history_drift_missing_streams\",\n command: \"pm history-repair <id>\",\n summary: \"Re-anchor the history chains of the items missing a history stream.\",\n },\n {\n code: \"validate_history_drift_unreadable_streams\",\n command: \"pm history-repair <id>\",\n summary: \"Re-anchor the history chains of the items with an unreadable history stream.\",\n },\n {\n code: \"validate_history_drift_hash_mismatches\",\n command: \"pm history-repair <id>\",\n summary: \"Re-anchor the history chains of the items whose content hash drifted.\",\n },\n {\n code: \"validate_history_drift_chain_mismatches\",\n command: \"pm history-repair <id>\",\n summary: \"Re-anchor the history chains of the items with a broken history chain.\",\n },\n // --- pm validate: command_references ---\n {\n code: \"validate_command_references_stale_pm_ids\",\n command: 'pm update <id> --replace-tests --test \"command=<corrected-command>\" [--test ...]',\n summary:\n \"Correct the stale pm-ID inside the item's linked test command (the check scans tests[].command, not the body). --replace-tests overwrites the entire tests list, so re-include the item's other linked tests in the same call.\",\n },\n]);\n\n/**\n * Resolve the remediation entry for a warning token, or `undefined` when no\n * entry is registered. A warning matches an entry when it equals the entry code\n * or begins with `<code>:` (the colon boundary keeps sibling codes such as\n * `validate_lifecycle_dependency_cycles` and\n * `validate_lifecycle_dependency_cycles_error` disjoint).\n *\n * First match is intentional and correct: registry codes are mutually exclusive\n * under the colon-boundary rule, so at most one entry can ever match a warning\n * and order is irrelevant. That invariant is enforced by a test (see\n * remediation-registry.spec.ts \"keeps every registry code mutually exclusive\"),\n * which is why this stays a simple linear scan rather than a longest-prefix\n * search — a longest-prefix tie-break is unreachable with disjoint codes.\n *\n * Accepts unknown input defensively (this is an exported helper SDK consumers\n * may call from untyped JS): a non-string `warning` resolves to `undefined`.\n */\nexport function resolveRemediation(warning: string): RemediationEntry | undefined {\n if (typeof warning !== \"string\") {\n return undefined;\n }\n const normalized = warning.trim();\n for (const entry of REMEDIATION_REGISTRY) {\n if (normalized === entry.code || normalized.startsWith(`${entry.code}:`)) {\n return entry;\n }\n }\n return undefined;\n}\n\n/**\n * Build a compact `remediation_map` (code -> command) for a set of warning\n * tokens. First match wins per code; unknown codes are skipped. Used by\n * `pm health --json` per-check details and as the source of deduped executable\n * commands for `pm validate --fix-hints`.\n */\nexport function buildRemediationMap(warnings: Iterable<string>): Record<string, string> {\n const map: Record<string, string> = {};\n for (const warning of warnings) {\n const entry = resolveRemediation(warning);\n if (entry !== undefined && !Object.prototype.hasOwnProperty.call(map, entry.code)) {\n map[entry.code] = entry.command;\n }\n }\n return map;\n}\n\n/**\n * Build a deduped, ordered list of executable remediation commands for a set of\n * warning tokens (one command per distinct matched code). Used by\n * `pm validate --fix-hints` for checks that do not already emit per-row\n * remediation commands.\n */\nexport function buildRemediationCommands(warnings: Iterable<string>): string[] {\n return Object.values(buildRemediationMap(warnings));\n}\n"],"names":[],"mappings":"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","debugId":"5597e7ea-39ad-5bd4-9a7a-5a7428ea5e27"}
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  compareTimestampStrings,
5
5
  isTimestampLiteral
6
- } from "./chunk-PW7C262O.js";
6
+ } from "./chunk-WUNFKP7M.js";
7
7
  import {
8
8
  CONFIDENCE_TEXT_VALUES,
9
9
  EXIT_CODE,
@@ -19,7 +19,7 @@ import {
19
19
  resolveRuntimeStatusRegistry,
20
20
  runtimeFieldOptionTarget,
21
21
  weekdayOrderIndex
22
- } from "./chunk-5JF76OJF.js";
22
+ } from "./chunk-A6LXQFO7.js";
23
23
 
24
24
  // dist/core/schema/runtime-field-values.js
25
25
  function toCamelToken(value) {
@@ -1324,6 +1324,6 @@ export {
1324
1324
  serializeItemDocument,
1325
1325
  canonicalDocument
1326
1326
  };
1327
- //# sourceMappingURL=chunk-5ATRWEZO.js.map
1327
+ //# sourceMappingURL=chunk-UUWGCWBU.js.map
1328
1328
 
1329
1329
  //# debugId=8e6380db-298c-5343-b79e-9939444e8ad2
@@ -5,7 +5,7 @@ import {
5
5
  PmCliError,
6
6
  isPathWithinDirectory,
7
7
  pathExists
8
- } from "./chunk-5JF76OJF.js";
8
+ } from "./chunk-A6LXQFO7.js";
9
9
 
10
10
  // dist/cli/commands/extension/shared.js
11
11
  import fs from "node:fs/promises";
@@ -107,6 +107,6 @@ export {
107
107
  parseExtensionManifest,
108
108
  validateExtensionDirectory
109
109
  };
110
- //# sourceMappingURL=chunk-YX5LAKFJ.js.map
110
+ //# sourceMappingURL=chunk-VAOUX6TK.js.map
111
111
 
112
112
  //# debugId=537a6d63-6806-5bdc-ae0f-3e84cf25eb7e
@@ -1,14 +1,16 @@
1
1
  import {
2
2
  listAllFrontMatterLight,
3
+ locateItem,
3
4
  mutateItem,
5
+ readLocatedItem,
4
6
  toItemRecord
5
- } from "./chunk-LF2VNLEZ.js";
7
+ } from "./chunk-3KLPFWZ4.js";
6
8
  import {
7
9
  isTerminalStatus
8
- } from "./chunk-NHRZSYAA.js";
10
+ } from "./chunk-73ZPG2I3.js";
9
11
  import {
10
12
  resolveItemTypeRegistry
11
- } from "./chunk-U3Z4OCZC.js";
13
+ } from "./chunk-5SCT2JCT.js";
12
14
  import {
13
15
  EXIT_CODE,
14
16
  PmCliError,
@@ -17,13 +19,13 @@ import {
17
19
  readSettings,
18
20
  resolvePmRoot,
19
21
  resolveRuntimeStatusRegistry
20
- } from "./chunk-C72IQIBT.js";
22
+ } from "./chunk-FY4SPXSC.js";
21
23
 
22
24
  // dist/cli/commands/close.js
23
25
  !(function() {
24
26
  try {
25
27
  var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
26
- n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "96f50581-e721-5ccd-b360-651ab15f5cca");
28
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "3c2738c8-5226-561a-b6c6-e321597f6658");
27
29
  } catch (e2) {
28
30
  }
29
31
  })();
@@ -85,6 +87,77 @@ function findMissingCloseValidationFields(frontMatter) {
85
87
  }
86
88
  return missing;
87
89
  }
90
+ async function duplicateChainReferencesClosingItem(loadItemById, initialDuplicateOf, closingId) {
91
+ const visited = /* @__PURE__ */ new Set();
92
+ let current = initialDuplicateOf;
93
+ while (typeof current === "string" && current.trim().length > 0) {
94
+ const currentId = current.trim();
95
+ if (currentId === closingId) {
96
+ return true;
97
+ }
98
+ if (visited.has(currentId)) {
99
+ return false;
100
+ }
101
+ visited.add(currentId);
102
+ current = (await loadItemById(currentId))?.duplicate_of;
103
+ }
104
+ return false;
105
+ }
106
+ function shouldApplyDuplicateFallback(value) {
107
+ return typeof value !== "string" || value.trim().length === 0;
108
+ }
109
+ async function assertDuplicateTargetExists(pmRoot, settings, duplicateOf, closingId) {
110
+ const rawTarget = duplicateOf?.trim();
111
+ if (!rawTarget) {
112
+ return void 0;
113
+ }
114
+ if (rawTarget === closingId) {
115
+ throw new PmCliError("An item cannot be closed as a duplicate of itself.", EXIT_CODE.USAGE, {
116
+ code: "duplicate_target_self",
117
+ why: "--duplicate-of must identify the canonical item that should remain open or already represent the work."
118
+ });
119
+ }
120
+ const typeRegistry = resolveItemTypeRegistry(settings);
121
+ const itemCache = /* @__PURE__ */ new Map();
122
+ const loadItemById = async (id) => {
123
+ if (itemCache.has(id)) {
124
+ return itemCache.get(id) ?? null;
125
+ }
126
+ const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);
127
+ if (!located) {
128
+ itemCache.set(id, null);
129
+ return null;
130
+ }
131
+ const { document } = await readLocatedItem(located, { schema: settings.schema });
132
+ itemCache.set(id, document.metadata);
133
+ return document.metadata;
134
+ };
135
+ const target = await loadItemById(rawTarget);
136
+ if (!target) {
137
+ throw new PmCliError(`Duplicate target "${rawTarget}" was not found. Create or locate the canonical item first.`, EXIT_CODE.USAGE, {
138
+ code: "duplicate_target_missing",
139
+ why: "Duplicate closure should point at a real canonical pm item so future dedupe and changelog tooling can trace the relationship.",
140
+ examples: [`pm close ${closingId} "Duplicate of ${rawTarget}" --duplicate-of ${rawTarget}`],
141
+ nextSteps: ["Run pm search/list to find the canonical item, then retry with --duplicate-of <id>."]
142
+ });
143
+ }
144
+ if (await duplicateChainReferencesClosingItem(loadItemById, target.duplicate_of, closingId)) {
145
+ throw new PmCliError(`Circular duplicate reference detected. Target "${rawTarget}" points back to "${closingId}".`, EXIT_CODE.USAGE, {
146
+ code: "duplicate_target_circular",
147
+ why: "Circular duplicate relationships create loops for dedupe and status propagation tooling.",
148
+ nextSteps: ["Choose the existing canonical item, or clear the target duplicate_of metadata before closing this item as a duplicate."]
149
+ });
150
+ }
151
+ if (typeof target.duplicate_of === "string" && target.duplicate_of.trim().length > 0) {
152
+ throw new PmCliError(`Duplicate target "${rawTarget}" is already marked as a duplicate of "${target.duplicate_of.trim()}".`, EXIT_CODE.USAGE, {
153
+ code: "duplicate_target_is_duplicate",
154
+ why: "Duplicate closure should point directly at the canonical item, not another duplicate.",
155
+ examples: [`pm close ${closingId} "Duplicate of ${target.duplicate_of.trim()}" --duplicate-of ${target.duplicate_of.trim()}`],
156
+ nextSteps: ["Use the canonical item referenced by duplicate_of as the --duplicate-of target."]
157
+ });
158
+ }
159
+ return target.id;
160
+ }
88
161
  async function findActiveChildIds(pmRoot, settings, parentId, statusRegistry) {
89
162
  const typeRegistry = resolveItemTypeRegistry(settings);
90
163
  const items = await listAllFrontMatterLight(pmRoot, settings.item_format, typeRegistry.type_to_folder, void 0, settings.schema);
@@ -99,6 +172,7 @@ async function runClose(id, closeReasonText, options, global2) {
99
172
  const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);
100
173
  const author = toAuthor(options.author, settings.author_default);
101
174
  const closeReason = normalizeCloseReason(closeReasonText, settings.governance.require_close_reason);
175
+ const duplicateOf = await assertDuplicateTargetExists(pmRoot, settings, options.duplicateOf, id);
102
176
  const validateCloseMode = parseValidateCloseMode(options.validateClose) ?? settings.governance.close_validation_default;
103
177
  const activeChildIds = await findActiveChildIds(pmRoot, settings, id, statusRegistry);
104
178
  const result = await mutateItem({
@@ -119,6 +193,7 @@ async function runClose(id, closeReasonText, options, global2) {
119
193
  { option: options.expectedResult, key: "expected_result" },
120
194
  { option: options.actualResult, key: "actual_result" }
121
195
  ];
196
+ const duplicateFallbackFields = [];
122
197
  for (const { option, key } of inlineCloseFields) {
123
198
  if (typeof option !== "string")
124
199
  continue;
@@ -127,6 +202,24 @@ async function runClose(id, closeReasonText, options, global2) {
127
202
  continue;
128
203
  document.metadata[key] = trimmed;
129
204
  }
205
+ if (duplicateOf !== void 0) {
206
+ document.metadata.duplicate_of = duplicateOf;
207
+ const duplicateResolution = `Duplicate of ${duplicateOf}`;
208
+ const duplicateExpectedResult = `Canonical item ${duplicateOf} tracks the work.`;
209
+ const duplicateActualResult = `Closed as duplicate of ${duplicateOf}.`;
210
+ if (shouldApplyDuplicateFallback(document.metadata.resolution)) {
211
+ document.metadata.resolution = duplicateResolution;
212
+ duplicateFallbackFields.push("resolution");
213
+ }
214
+ if (shouldApplyDuplicateFallback(document.metadata.expected_result)) {
215
+ document.metadata.expected_result = duplicateExpectedResult;
216
+ duplicateFallbackFields.push("expected_result");
217
+ }
218
+ if (shouldApplyDuplicateFallback(document.metadata.actual_result)) {
219
+ document.metadata.actual_result = duplicateActualResult;
220
+ duplicateFallbackFields.push("actual_result");
221
+ }
222
+ }
130
223
  if (validateCloseMode !== "off") {
131
224
  const missingFields = findMissingCloseValidationFields(document.metadata);
132
225
  if (missingFields.length > 0) {
@@ -158,6 +251,18 @@ async function runClose(id, closeReasonText, options, global2) {
158
251
  changedFields.push(key);
159
252
  }
160
253
  }
254
+ if (duplicateOf !== void 0) {
255
+ changedFields.push("duplicate_of");
256
+ if (duplicateFallbackFields.includes("resolution") && !changedFields.includes("resolution")) {
257
+ changedFields.push("resolution");
258
+ }
259
+ if (duplicateFallbackFields.includes("expected_result") && !changedFields.includes("expected_result")) {
260
+ changedFields.push("expected_result");
261
+ }
262
+ if (duplicateFallbackFields.includes("actual_result") && !changedFields.includes("actual_result")) {
263
+ changedFields.push("actual_result");
264
+ }
265
+ }
161
266
  if (document.metadata.assignee !== void 0) {
162
267
  delete document.metadata.assignee;
163
268
  changedFields.push("assignee");
@@ -203,4 +308,4 @@ async function runClose(id, closeReasonText, options, global2) {
203
308
  export {
204
309
  runClose
205
310
  };
206
- //# sourceMappingURL=chunk-RMTI5R76.js.map
311
+ //# sourceMappingURL=chunk-VFUZV5EB.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../../cli/commands/close.ts"],
4
+ "sourcesContent": ["import { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { toItemRecord } from \"../../core/item/item-record.js\";\nimport { isTerminalStatus } from \"../../core/item/status.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { resolveRuntimeStatusRegistry, type RuntimeStatusRegistry } from \"../../core/schema/runtime-schema.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 { listAllFrontMatterLight, locateItem, mutateItem, readLocatedItem } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemFrontMatter } from \"../../types/index.js\";\n\nexport interface CloseCommandOptions {\n author?: string;\n message?: string;\n validateClose?: string;\n force?: boolean;\n // pm-fl0c #11 (2026-05-28): allow setting the three closure validation\n // fields inline on `pm close` so agents do not have to issue a prior\n // `pm update` just to satisfy --validate-close warn|strict. These map 1:1\n // to ItemFrontMatter.{resolution,expected_result,actual_result}.\n resolution?: string;\n expectedResult?: string;\n actualResult?: string;\n duplicateOf?: string;\n}\n\nexport interface CloseResult {\n item: Record<string, unknown>;\n changed_fields: string[];\n warnings: string[];\n}\n\nfunction toAuthor(candidate: string | undefined, defaultAuthor: string): string {\n const resolved = candidate ?? process.env.PM_AUTHOR ?? defaultAuthor;\n const trimmed = resolved.trim();\n return trimmed || \"unknown\";\n}\n\nfunction normalizeCloseReason(reasonText: string | undefined, required: boolean): string | undefined {\n const reason = (reasonText ?? \"\").trim();\n if (reason.length > 0) {\n return reason;\n }\n if (required) {\n throw new PmCliError(\n \"Close reason text is required because governance.require_close_reason is enabled\",\n EXIT_CODE.USAGE,\n {\n code: \"close_reason_required\",\n required: \"Provide a one-line closing summary as the positional text or via --reason.\",\n why: \"governance.require_close_reason is enabled, so every close must record why the item is done.\",\n examples: [\n 'pm close <id> \"Done: <what changed and why>\"',\n 'pm close <id> --reason \"<closing summary>\"',\n ],\n nextSteps: [\n \"Re-run the close with a closing summary.\",\n \"To stop requiring reasons, run: pm config set governance-require-close-reason --policy disabled\",\n ],\n },\n );\n }\n return undefined;\n}\n\ntype ValidateCloseMode = \"off\" | \"warn\" | \"strict\";\n\nconst CLOSE_VALIDATION_FIELDS: Array<{ key: keyof Pick<ItemFrontMatter, \"resolution\" | \"expected_result\" | \"actual_result\">; label: string }> = [\n { key: \"resolution\", label: \"resolution\" },\n { key: \"expected_result\", label: \"expected_result\" },\n { key: \"actual_result\", label: \"actual_result\" },\n];\n\nfunction parseValidateCloseMode(raw: string | undefined): ValidateCloseMode | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const normalized = raw.trim().toLowerCase();\n if (normalized.length === 0 || normalized === \"warn\") {\n return \"warn\";\n }\n if (normalized === \"off\" || normalized === \"none\" || normalized === \"disabled\") {\n return \"off\";\n }\n if (normalized === \"strict\") {\n return \"strict\";\n }\n throw new PmCliError(`Invalid --validate-close mode \"${raw}\" (expected \"off\", \"warn\", or \"strict\")`, EXIT_CODE.USAGE);\n}\n\nfunction findMissingCloseValidationFields(frontMatter: ItemFrontMatter): string[] {\n const missing: string[] = [];\n for (const field of CLOSE_VALIDATION_FIELDS) {\n const rawValue = frontMatter[field.key];\n if (typeof rawValue !== \"string\" || rawValue.trim().length === 0) {\n missing.push(field.label);\n }\n }\n return missing;\n}\n\nasync function duplicateChainReferencesClosingItem(\n loadItemById: (id: string) => Promise<ItemFrontMatter | null>,\n initialDuplicateOf: unknown,\n closingId: string,\n): Promise<boolean> {\n const visited = new Set<string>();\n let current = initialDuplicateOf;\n while (typeof current === \"string\" && current.trim().length > 0) {\n const currentId = current.trim();\n if (currentId === closingId) {\n return true;\n }\n if (visited.has(currentId)) {\n return false;\n }\n visited.add(currentId);\n current = (await loadItemById(currentId))?.duplicate_of;\n }\n return false;\n}\n\nfunction shouldApplyDuplicateFallback(value: unknown): boolean {\n return typeof value !== \"string\" || value.trim().length === 0;\n}\n\nasync function assertDuplicateTargetExists(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n duplicateOf: string | undefined,\n closingId: string,\n): Promise<string | undefined> {\n const rawTarget = duplicateOf?.trim();\n if (!rawTarget) {\n return undefined;\n }\n if (rawTarget === closingId) {\n throw new PmCliError(\"An item cannot be closed as a duplicate of itself.\", EXIT_CODE.USAGE, {\n code: \"duplicate_target_self\",\n why: \"--duplicate-of must identify the canonical item that should remain open or already represent the work.\",\n });\n }\n const typeRegistry = resolveItemTypeRegistry(settings);\n const itemCache = new Map<string, ItemFrontMatter | null>();\n const loadItemById = async (id: string): Promise<ItemFrontMatter | null> => {\n if (itemCache.has(id)) {\n return itemCache.get(id) ?? null;\n }\n const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);\n if (!located) {\n itemCache.set(id, null);\n return null;\n }\n const { document } = await readLocatedItem(located, { schema: settings.schema });\n itemCache.set(id, document.metadata);\n return document.metadata;\n };\n const target = await loadItemById(rawTarget);\n if (!target) {\n throw new PmCliError(`Duplicate target \"${rawTarget}\" was not found. Create or locate the canonical item first.`, EXIT_CODE.USAGE, {\n code: \"duplicate_target_missing\",\n why: \"Duplicate closure should point at a real canonical pm item so future dedupe and changelog tooling can trace the relationship.\",\n examples: [`pm close ${closingId} \"Duplicate of ${rawTarget}\" --duplicate-of ${rawTarget}`],\n nextSteps: [\"Run pm search/list to find the canonical item, then retry with --duplicate-of <id>.\"],\n });\n }\n if (await duplicateChainReferencesClosingItem(loadItemById, target.duplicate_of, closingId)) {\n throw new PmCliError(`Circular duplicate reference detected. Target \"${rawTarget}\" points back to \"${closingId}\".`, EXIT_CODE.USAGE, {\n code: \"duplicate_target_circular\",\n why: \"Circular duplicate relationships create loops for dedupe and status propagation tooling.\",\n nextSteps: [\"Choose the existing canonical item, or clear the target duplicate_of metadata before closing this item as a duplicate.\"],\n });\n }\n if (typeof target.duplicate_of === \"string\" && target.duplicate_of.trim().length > 0) {\n throw new PmCliError(`Duplicate target \"${rawTarget}\" is already marked as a duplicate of \"${target.duplicate_of.trim()}\".`, EXIT_CODE.USAGE, {\n code: \"duplicate_target_is_duplicate\",\n why: \"Duplicate closure should point directly at the canonical item, not another duplicate.\",\n examples: [`pm close ${closingId} \"Duplicate of ${target.duplicate_of.trim()}\" --duplicate-of ${target.duplicate_of.trim()}`],\n nextSteps: [\"Use the canonical item referenced by duplicate_of as the --duplicate-of target.\"],\n });\n }\n return target.id;\n}\n\nasync function findActiveChildIds(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n parentId: string,\n statusRegistry: RuntimeStatusRegistry,\n): Promise<string[]> {\n const typeRegistry = resolveItemTypeRegistry(settings);\n const items = await listAllFrontMatterLight(\n pmRoot,\n settings.item_format,\n typeRegistry.type_to_folder,\n undefined,\n settings.schema,\n );\n return items\n .filter((item) => item.parent === parentId && !isTerminalStatus(item.status, statusRegistry))\n .map((item) => item.id)\n .sort((left, right) => left.localeCompare(right));\n}\n\nexport async function runClose(\n id: string,\n closeReasonText: string | undefined,\n options: CloseCommandOptions,\n global: GlobalOptions,\n): Promise<CloseResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n\n const settings = await readSettings(pmRoot);\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const author = toAuthor(options.author, settings.author_default);\n const closeReason = normalizeCloseReason(closeReasonText, settings.governance.require_close_reason);\n const duplicateOf = await assertDuplicateTargetExists(pmRoot, settings, options.duplicateOf, id);\n const validateCloseMode = parseValidateCloseMode(options.validateClose) ?? settings.governance.close_validation_default;\n // C3 (pm-fu5d): scan for active children even under minimal governance so\n // closing a parent is never silently orphaning — off mode emits an\n // informational note instead of the warn/strict validation warning.\n const activeChildIds = await findActiveChildIds(pmRoot, settings, id, statusRegistry);\n\n const result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: \"close\",\n author,\n message: options.message,\n force: options.force,\n mutate(document) {\n if (isTerminalStatus(document.metadata.status, statusRegistry) && !options.force) {\n throw new PmCliError(`Item ${document.metadata.id} is already terminal; use --force to close again.`, EXIT_CODE.CONFLICT);\n }\n const mutationWarnings: string[] = [];\n // pm-fl0c #11: apply inline closure fields BEFORE the validation pass so\n // a single `pm close <id> \"reason\" --resolution \"...\"` call satisfies\n // strict validation without a prior pm update. Only meaningful trimmed\n // text writes; an empty/whitespace value is a no-op rather than a clear.\n const inlineCloseFields: Array<{ option: string | undefined; key: \"resolution\" | \"expected_result\" | \"actual_result\" }> = [\n { option: options.resolution, key: \"resolution\" },\n { option: options.expectedResult, key: \"expected_result\" },\n { option: options.actualResult, key: \"actual_result\" },\n ];\n const duplicateFallbackFields: Array<\"resolution\" | \"expected_result\" | \"actual_result\"> = [];\n for (const { option, key } of inlineCloseFields) {\n if (typeof option !== \"string\") continue;\n const trimmed = option.trim();\n if (trimmed.length === 0) continue;\n document.metadata[key] = trimmed;\n }\n if (duplicateOf !== undefined) {\n document.metadata.duplicate_of = duplicateOf;\n const duplicateResolution = `Duplicate of ${duplicateOf}`;\n const duplicateExpectedResult = `Canonical item ${duplicateOf} tracks the work.`;\n const duplicateActualResult = `Closed as duplicate of ${duplicateOf}.`;\n if (shouldApplyDuplicateFallback(document.metadata.resolution)) {\n document.metadata.resolution = duplicateResolution;\n duplicateFallbackFields.push(\"resolution\");\n }\n if (shouldApplyDuplicateFallback(document.metadata.expected_result)) {\n document.metadata.expected_result = duplicateExpectedResult;\n duplicateFallbackFields.push(\"expected_result\");\n }\n if (shouldApplyDuplicateFallback(document.metadata.actual_result)) {\n document.metadata.actual_result = duplicateActualResult;\n duplicateFallbackFields.push(\"actual_result\");\n }\n }\n if (validateCloseMode !== \"off\") {\n const missingFields = findMissingCloseValidationFields(document.metadata);\n if (missingFields.length > 0) {\n if (validateCloseMode === \"strict\") {\n throw new PmCliError(\n `Cannot close item ${document.metadata.id}: missing ${missingFields.join(\", \")}. Populate fields or use --validate-close warn.`,\n EXIT_CODE.USAGE,\n );\n }\n mutationWarnings.push(`close_validation_missing_fields:${document.metadata.id}:${missingFields.join(\",\")}`);\n }\n if (activeChildIds.length > 0) {\n if (validateCloseMode === \"strict\") {\n throw new PmCliError(\n `Cannot close item ${document.metadata.id}: active child items remain open (${activeChildIds.join(\", \")}). Close, cancel, or re-parent them first, or use --validate-close warn.`,\n EXIT_CODE.USAGE,\n );\n }\n mutationWarnings.push(`close_validation_active_children:${document.metadata.id}:${activeChildIds.join(\",\")}`);\n }\n } else if (activeChildIds.length > 0) {\n // C3: minimal governance (validate-close off) should still tell the\n // agent it just closed a parent with open children, without blocking.\n mutationWarnings.push(`closed_with_active_children:${document.metadata.id}:${activeChildIds.join(\",\")}`);\n }\n\n document.metadata.status = statusRegistry.close_status;\n const changedFields = [\"status\"];\n if (closeReason !== undefined) {\n document.metadata.close_reason = closeReason;\n changedFields.push(\"close_reason\");\n } else if (document.metadata.close_reason !== undefined) {\n delete document.metadata.close_reason;\n changedFields.push(\"close_reason\");\n }\n for (const { option, key } of inlineCloseFields) {\n if (typeof option === \"string\" && option.trim().length > 0) {\n changedFields.push(key);\n }\n }\n if (duplicateOf !== undefined) {\n changedFields.push(\"duplicate_of\");\n if (duplicateFallbackFields.includes(\"resolution\") && !changedFields.includes(\"resolution\")) {\n changedFields.push(\"resolution\");\n }\n if (duplicateFallbackFields.includes(\"expected_result\") && !changedFields.includes(\"expected_result\")) {\n changedFields.push(\"expected_result\");\n }\n if (duplicateFallbackFields.includes(\"actual_result\") && !changedFields.includes(\"actual_result\")) {\n changedFields.push(\"actual_result\");\n }\n }\n if (document.metadata.assignee !== undefined) {\n delete document.metadata.assignee;\n changedFields.push(\"assignee\");\n }\n\n // C4 (pm-fu5d): a terminal item is no longer blocked. Clear every active\n // blocker signal independently — scalar blocked_by, blocked_reason, and the\n // blocked_by dependency edges (kept consistent with the kyd6 invariant) —\n // even if only some are present (e.g. an orphaned edge or a stale\n // blocked_reason left by manual edits), so closed work stops surfacing in\n // blockers views, and annotate the cleanup.\n const previousBlockedBy =\n typeof document.metadata.blocked_by === \"string\" ? document.metadata.blocked_by.trim() : \"\";\n const existingDeps = document.metadata.dependencies ?? [];\n const blockedByEdge = existingDeps.find((dep) => dep.kind === \"blocked_by\");\n const hadBlockedReason = document.metadata.blocked_reason !== undefined;\n if (previousBlockedBy.length > 0 || blockedByEdge !== undefined || hadBlockedReason) {\n if (previousBlockedBy.length > 0) {\n delete document.metadata.blocked_by;\n changedFields.push(\"blocked_by\");\n }\n if (hadBlockedReason) {\n delete document.metadata.blocked_reason;\n changedFields.push(\"blocked_reason\");\n }\n if (blockedByEdge !== undefined) {\n const remainingDeps = existingDeps.filter((dep) => dep.kind !== \"blocked_by\");\n if (remainingDeps.length > 0) {\n document.metadata.dependencies = remainingDeps;\n } else {\n delete document.metadata.dependencies;\n }\n changedFields.push(\"dependencies\");\n }\n const reportedBlocker = previousBlockedBy || blockedByEdge?.id || \"unknown\";\n mutationWarnings.push(`closed_cleared_blocked_by:${document.metadata.id}:${reportedBlocker}`);\n }\n\n return {\n changedFields,\n ...(mutationWarnings.length > 0 ? { warnings: mutationWarnings } : {}),\n };\n },\n });\n\n return {\n item: toItemRecord(result.item),\n changed_fields: result.changedFields,\n warnings: result.warnings,\n };\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,SAAS,SAAS,WAA+B,eAAqB;AACpE,QAAM,WAAW,aAAa,QAAQ,IAAI,aAAa;AACvD,QAAM,UAAU,SAAS,KAAI;AAC7B,SAAO,WAAW;AACpB;AAEA,SAAS,qBAAqB,YAAgC,UAAiB;AAC7E,QAAM,UAAU,cAAc,IAAI,KAAI;AACtC,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO;EACT;AACA,MAAI,UAAU;AACZ,UAAM,IAAI,WACR,oFACA,UAAU,OACV;MACE,MAAM;MACN,UAAU;MACV,KAAK;MACL,UAAU;QACR;QACA;;MAEF,WAAW;QACT;QACA;;KAEH;EAEL;AACA,SAAO;AACT;AAIA,IAAM,0BAA0I;EAC9I,EAAE,KAAK,cAAc,OAAO,aAAY;EACxC,EAAE,KAAK,mBAAmB,OAAO,kBAAiB;EAClD,EAAE,KAAK,iBAAiB,OAAO,gBAAe;;AAGhD,SAAS,uBAAuB,KAAuB;AACrD,MAAI,QAAQ,QAAW;AACrB,WAAO;EACT;AACA,QAAM,aAAa,IAAI,KAAI,EAAG,YAAW;AACzC,MAAI,WAAW,WAAW,KAAK,eAAe,QAAQ;AACpD,WAAO;EACT;AACA,MAAI,eAAe,SAAS,eAAe,UAAU,eAAe,YAAY;AAC9E,WAAO;EACT;AACA,MAAI,eAAe,UAAU;AAC3B,WAAO;EACT;AACA,QAAM,IAAI,WAAW,kCAAkC,GAAG,2CAA2C,UAAU,KAAK;AACtH;AAEA,SAAS,iCAAiC,aAA4B;AACpE,QAAM,UAAoB,CAAA;AAC1B,aAAW,SAAS,yBAAyB;AAC3C,UAAM,WAAW,YAAY,MAAM,GAAG;AACtC,QAAI,OAAO,aAAa,YAAY,SAAS,KAAI,EAAG,WAAW,GAAG;AAChE,cAAQ,KAAK,MAAM,KAAK;IAC1B;EACF;AACA,SAAO;AACT;AAEA,eAAe,oCACb,cACA,oBACA,WAAiB;AAEjB,QAAM,UAAU,oBAAI,IAAG;AACvB,MAAI,UAAU;AACd,SAAO,OAAO,YAAY,YAAY,QAAQ,KAAI,EAAG,SAAS,GAAG;AAC/D,UAAM,YAAY,QAAQ,KAAI;AAC9B,QAAI,cAAc,WAAW;AAC3B,aAAO;IACT;AACA,QAAI,QAAQ,IAAI,SAAS,GAAG;AAC1B,aAAO;IACT;AACA,YAAQ,IAAI,SAAS;AACrB,eAAW,MAAM,aAAa,SAAS,IAAI;EAC7C;AACA,SAAO;AACT;AAEA,SAAS,6BAA6B,OAAc;AAClD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAI,EAAG,WAAW;AAC9D;AAEA,eAAe,4BACb,QACA,UACA,aACA,WAAiB;AAEjB,QAAM,YAAY,aAAa,KAAI;AACnC,MAAI,CAAC,WAAW;AACd,WAAO;EACT;AACA,MAAI,cAAc,WAAW;AAC3B,UAAM,IAAI,WAAW,sDAAsD,UAAU,OAAO;MAC1F,MAAM;MACN,KAAK;KACN;EACH;AACA,QAAM,eAAe,wBAAwB,QAAQ;AACrD,QAAM,YAAY,oBAAI,IAAG;AACzB,QAAM,eAAe,OAAO,OAA+C;AACzE,QAAI,UAAU,IAAI,EAAE,GAAG;AACrB,aAAO,UAAU,IAAI,EAAE,KAAK;IAC9B;AACA,UAAM,UAAU,MAAM,WAAW,QAAQ,IAAI,SAAS,WAAW,SAAS,aAAa,aAAa,cAAc;AAClH,QAAI,CAAC,SAAS;AACZ,gBAAU,IAAI,IAAI,IAAI;AACtB,aAAO;IACT;AACA,UAAM,EAAE,SAAQ,IAAK,MAAM,gBAAgB,SAAS,EAAE,QAAQ,SAAS,OAAM,CAAE;AAC/E,cAAU,IAAI,IAAI,SAAS,QAAQ;AACnC,WAAO,SAAS;EAClB;AACA,QAAM,SAAS,MAAM,aAAa,SAAS;AAC3C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,WAAW,qBAAqB,SAAS,+DAA+D,UAAU,OAAO;MACjI,MAAM;MACN,KAAK;MACL,UAAU,CAAC,YAAY,SAAS,kBAAkB,SAAS,oBAAoB,SAAS,EAAE;MAC1F,WAAW,CAAC,qFAAqF;KAClG;EACH;AACA,MAAI,MAAM,oCAAoC,cAAc,OAAO,cAAc,SAAS,GAAG;AAC3F,UAAM,IAAI,WAAW,kDAAkD,SAAS,qBAAqB,SAAS,MAAM,UAAU,OAAO;MACnI,MAAM;MACN,KAAK;MACL,WAAW,CAAC,wHAAwH;KACrI;EACH;AACA,MAAI,OAAO,OAAO,iBAAiB,YAAY,OAAO,aAAa,KAAI,EAAG,SAAS,GAAG;AACpF,UAAM,IAAI,WAAW,qBAAqB,SAAS,0CAA0C,OAAO,aAAa,KAAI,CAAE,MAAM,UAAU,OAAO;MAC5I,MAAM;MACN,KAAK;MACL,UAAU,CAAC,YAAY,SAAS,kBAAkB,OAAO,aAAa,KAAI,CAAE,oBAAoB,OAAO,aAAa,KAAI,CAAE,EAAE;MAC5H,WAAW,CAAC,iFAAiF;KAC9F;EACH;AACA,SAAO,OAAO;AAChB;AAEA,eAAe,mBACb,QACA,UACA,UACA,gBAAqC;AAErC,QAAM,eAAe,wBAAwB,QAAQ;AACrD,QAAM,QAAQ,MAAM,wBAClB,QACA,SAAS,aACT,aAAa,gBACb,QACA,SAAS,MAAM;AAEjB,SAAO,MACJ,OAAO,CAAC,SAAS,KAAK,WAAW,YAAY,CAAC,iBAAiB,KAAK,QAAQ,cAAc,CAAC,EAC3F,IAAI,CAAC,SAAS,KAAK,EAAE,EACrB,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AACpD;AAEA,eAAsB,SACpB,IACA,iBACA,SACAA,SAAqB;AAErB,QAAM,SAAS,cAAc,QAAQ,IAAG,GAAIA,QAAO,IAAI;AACvD,MAAI,CAAE,MAAM,WAAW,gBAAgB,MAAM,CAAC,GAAI;AAChD,UAAM,IAAI,WAAW,iCAAiC,MAAM,wBAAwB,UAAU,SAAS;EACzG;AAEA,QAAM,WAAW,MAAM,aAAa,MAAM;AAC1C,QAAM,iBAAiB,6BAA6B,SAAS,MAAM;AACnE,QAAM,SAAS,SAAS,QAAQ,QAAQ,SAAS,cAAc;AAC/D,QAAM,cAAc,qBAAqB,iBAAiB,SAAS,WAAW,oBAAoB;AAClG,QAAM,cAAc,MAAM,4BAA4B,QAAQ,UAAU,QAAQ,aAAa,EAAE;AAC/F,QAAM,oBAAoB,uBAAuB,QAAQ,aAAa,KAAK,SAAS,WAAW;AAI/F,QAAM,iBAAiB,MAAM,mBAAmB,QAAQ,UAAU,IAAI,cAAc;AAEpF,QAAM,SAAS,MAAM,WAAW;IAC9B;IACA;IACA;IACA,IAAI;IACJ;IACA,SAAS,QAAQ;IACjB,OAAO,QAAQ;IACf,OAAO,UAAQ;AACb,UAAI,iBAAiB,SAAS,SAAS,QAAQ,cAAc,KAAK,CAAC,QAAQ,OAAO;AAChF,cAAM,IAAI,WAAW,QAAQ,SAAS,SAAS,EAAE,qDAAqD,UAAU,QAAQ;MAC1H;AACA,YAAM,mBAA6B,CAAA;AAKnC,YAAM,oBAAoH;QACxH,EAAE,QAAQ,QAAQ,YAAY,KAAK,aAAY;QAC/C,EAAE,QAAQ,QAAQ,gBAAgB,KAAK,kBAAiB;QACxD,EAAE,QAAQ,QAAQ,cAAc,KAAK,gBAAe;;AAEtD,YAAM,0BAAqF,CAAA;AAC3F,iBAAW,EAAE,QAAQ,IAAG,KAAM,mBAAmB;AAC/C,YAAI,OAAO,WAAW;AAAU;AAChC,cAAM,UAAU,OAAO,KAAI;AAC3B,YAAI,QAAQ,WAAW;AAAG;AAC1B,iBAAS,SAAS,GAAG,IAAI;MAC3B;AACA,UAAI,gBAAgB,QAAW;AAC7B,iBAAS,SAAS,eAAe;AACjC,cAAM,sBAAsB,gBAAgB,WAAW;AACvD,cAAM,0BAA0B,kBAAkB,WAAW;AAC7D,cAAM,wBAAwB,0BAA0B,WAAW;AACnE,YAAI,6BAA6B,SAAS,SAAS,UAAU,GAAG;AAC9D,mBAAS,SAAS,aAAa;AAC/B,kCAAwB,KAAK,YAAY;QAC3C;AACA,YAAI,6BAA6B,SAAS,SAAS,eAAe,GAAG;AACnE,mBAAS,SAAS,kBAAkB;AACpC,kCAAwB,KAAK,iBAAiB;QAChD;AACA,YAAI,6BAA6B,SAAS,SAAS,aAAa,GAAG;AACjE,mBAAS,SAAS,gBAAgB;AAClC,kCAAwB,KAAK,eAAe;QAC9C;MACF;AACA,UAAI,sBAAsB,OAAO;AAC/B,cAAM,gBAAgB,iCAAiC,SAAS,QAAQ;AACxE,YAAI,cAAc,SAAS,GAAG;AAC5B,cAAI,sBAAsB,UAAU;AAClC,kBAAM,IAAI,WACR,qBAAqB,SAAS,SAAS,EAAE,aAAa,cAAc,KAAK,IAAI,CAAC,mDAC9E,UAAU,KAAK;UAEnB;AACA,2BAAiB,KAAK,mCAAmC,SAAS,SAAS,EAAE,IAAI,cAAc,KAAK,GAAG,CAAC,EAAE;QAC5G;AACA,YAAI,eAAe,SAAS,GAAG;AAC7B,cAAI,sBAAsB,UAAU;AAClC,kBAAM,IAAI,WACR,qBAAqB,SAAS,SAAS,EAAE,qCAAqC,eAAe,KAAK,IAAI,CAAC,4EACvG,UAAU,KAAK;UAEnB;AACA,2BAAiB,KAAK,oCAAoC,SAAS,SAAS,EAAE,IAAI,eAAe,KAAK,GAAG,CAAC,EAAE;QAC9G;MACF,WAAW,eAAe,SAAS,GAAG;AAGpC,yBAAiB,KAAK,+BAA+B,SAAS,SAAS,EAAE,IAAI,eAAe,KAAK,GAAG,CAAC,EAAE;MACzG;AAEA,eAAS,SAAS,SAAS,eAAe;AAC1C,YAAM,gBAAgB,CAAC,QAAQ;AAC/B,UAAI,gBAAgB,QAAW;AAC7B,iBAAS,SAAS,eAAe;AACjC,sBAAc,KAAK,cAAc;MACnC,WAAW,SAAS,SAAS,iBAAiB,QAAW;AACvD,eAAO,SAAS,SAAS;AACzB,sBAAc,KAAK,cAAc;MACnC;AACA,iBAAW,EAAE,QAAQ,IAAG,KAAM,mBAAmB;AAC/C,YAAI,OAAO,WAAW,YAAY,OAAO,KAAI,EAAG,SAAS,GAAG;AAC1D,wBAAc,KAAK,GAAG;QACxB;MACF;AACA,UAAI,gBAAgB,QAAW;AAC7B,sBAAc,KAAK,cAAc;AACjC,YAAI,wBAAwB,SAAS,YAAY,KAAK,CAAC,cAAc,SAAS,YAAY,GAAG;AAC3F,wBAAc,KAAK,YAAY;QACjC;AACA,YAAI,wBAAwB,SAAS,iBAAiB,KAAK,CAAC,cAAc,SAAS,iBAAiB,GAAG;AACrG,wBAAc,KAAK,iBAAiB;QACtC;AACA,YAAI,wBAAwB,SAAS,eAAe,KAAK,CAAC,cAAc,SAAS,eAAe,GAAG;AACjG,wBAAc,KAAK,eAAe;QACpC;MACF;AACA,UAAI,SAAS,SAAS,aAAa,QAAW;AAC5C,eAAO,SAAS,SAAS;AACzB,sBAAc,KAAK,UAAU;MAC/B;AAQA,YAAM,oBACJ,OAAO,SAAS,SAAS,eAAe,WAAW,SAAS,SAAS,WAAW,KAAI,IAAK;AAC3F,YAAM,eAAe,SAAS,SAAS,gBAAgB,CAAA;AACvD,YAAM,gBAAgB,aAAa,KAAK,CAAC,QAAQ,IAAI,SAAS,YAAY;AAC1E,YAAM,mBAAmB,SAAS,SAAS,mBAAmB;AAC9D,UAAI,kBAAkB,SAAS,KAAK,kBAAkB,UAAa,kBAAkB;AACnF,YAAI,kBAAkB,SAAS,GAAG;AAChC,iBAAO,SAAS,SAAS;AACzB,wBAAc,KAAK,YAAY;QACjC;AACA,YAAI,kBAAkB;AACpB,iBAAO,SAAS,SAAS;AACzB,wBAAc,KAAK,gBAAgB;QACrC;AACA,YAAI,kBAAkB,QAAW;AAC/B,gBAAM,gBAAgB,aAAa,OAAO,CAAC,QAAQ,IAAI,SAAS,YAAY;AAC5E,cAAI,cAAc,SAAS,GAAG;AAC5B,qBAAS,SAAS,eAAe;UACnC,OAAO;AACL,mBAAO,SAAS,SAAS;UAC3B;AACA,wBAAc,KAAK,cAAc;QACnC;AACA,cAAM,kBAAkB,qBAAqB,eAAe,MAAM;AAClE,yBAAiB,KAAK,6BAA6B,SAAS,SAAS,EAAE,IAAI,eAAe,EAAE;MAC9F;AAEA,aAAO;QACL;QACA,GAAI,iBAAiB,SAAS,IAAI,EAAE,UAAU,iBAAgB,IAAK,CAAA;;IAEvE;GACD;AAED,SAAO;IACL,MAAM,aAAa,OAAO,IAAI;IAC9B,gBAAgB,OAAO;IACvB,UAAU,OAAO;;AAErB;",
6
+ "names": ["global"]
7
+ }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  TYPE_TO_FOLDER,
3
3
  pathExists
4
- } from "./chunk-C72IQIBT.js";
4
+ } from "./chunk-FY4SPXSC.js";
5
5
 
6
6
  // dist/core/item/id.js
7
7
  import crypto from "node:crypto";
@@ -75,4 +75,4 @@ export {
75
75
  normalizeItemId,
76
76
  generateItemId
77
77
  };
78
- //# sourceMappingURL=chunk-WCWIDJII.js.map
78
+ //# sourceMappingURL=chunk-VPEAS7PS.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  parseItemDocument,
3
3
  serializeItemDocument
4
- } from "./chunk-NHRZSYAA.js";
4
+ } from "./chunk-73ZPG2I3.js";
5
5
  import {
6
6
  TYPE_TO_FOLDER,
7
7
  getItemFormatFromPath,
@@ -10,7 +10,7 @@ import {
10
10
  removeFileIfExists,
11
11
  runActiveOnWriteHooks,
12
12
  writeFileAtomic
13
- } from "./chunk-C72IQIBT.js";
13
+ } from "./chunk-FY4SPXSC.js";
14
14
 
15
15
  // dist/core/store/item-format-migration.js
16
16
  import fs from "node:fs/promises";
@@ -119,4 +119,4 @@ async function migrateItemFilesToFormat(pmRoot, targetFormat, op = "item_format:
119
119
  export {
120
120
  migrateItemFilesToFormat
121
121
  };
122
- //# sourceMappingURL=chunk-RE2JQJZJ.js.map
122
+ //# sourceMappingURL=chunk-VSRZRLG3.js.map
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  EXIT_CODE,
5
5
  PmCliError
6
- } from "./chunk-5JF76OJF.js";
6
+ } from "./chunk-A6LXQFO7.js";
7
7
 
8
8
  // dist/core/shared/time.js
9
9
  var RELATIVE_DEADLINE = /^([+-]?)(\d+)([hdwm])$/i;
@@ -199,6 +199,6 @@ export {
199
199
  compareTimestampStrings,
200
200
  resolveIsoOrRelative
201
201
  };
202
- //# sourceMappingURL=chunk-PW7C262O.js.map
202
+ //# sourceMappingURL=chunk-WUNFKP7M.js.map
203
203
 
204
204
  //# debugId=849dc628-ad6f-57cc-974c-36ea67ca2d07
@@ -1,15 +1,15 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="751da009-c89c-5d1c-b5cc-ae7e1dbf5866")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e3de33e9-9ffc-5384-b87e-e2dc2457b37e")}catch(e){}}();
3
3
  import {
4
4
  locateItem,
5
5
  readLocatedItem
6
- } from "./chunk-AVGOVJGV.js";
6
+ } from "./chunk-HI7STVF2.js";
7
7
  import {
8
8
  resolveItemTypeRegistry
9
- } from "./chunk-42IULX44.js";
9
+ } from "./chunk-CCX4RSYZ.js";
10
10
  import {
11
11
  nowIso
12
- } from "./chunk-PW7C262O.js";
12
+ } from "./chunk-WUNFKP7M.js";
13
13
  import {
14
14
  coercePositiveInteger,
15
15
  getActiveExtensionRegistrations,
@@ -24,7 +24,7 @@ import {
24
24
  toNonEmptyString,
25
25
  trimTrailingSlashes,
26
26
  writeFileAtomic
27
- } from "./chunk-5JF76OJF.js";
27
+ } from "./chunk-A6LXQFO7.js";
28
28
 
29
29
  // dist/core/search/http-client.js
30
30
  var DEFAULT_SEARCH_HTTP_TIMEOUT_MS = 3e4;
@@ -1101,6 +1101,68 @@ async function executeVectorDelete(store, ids, options = {}) {
1101
1101
  return normalizeQdrantUpsertResponse(payload);
1102
1102
  }
1103
1103
 
1104
+ // dist/core/search/vectorization-metadata.js
1105
+ function buildVectorizationEmbeddingIdentity(provider, model) {
1106
+ const normalizedProvider = toNonEmptyString(provider);
1107
+ const normalizedModel = toNonEmptyString(model);
1108
+ if (!normalizedProvider || !normalizedModel) {
1109
+ return null;
1110
+ }
1111
+ return {
1112
+ provider: normalizedProvider,
1113
+ model: normalizedModel
1114
+ };
1115
+ }
1116
+ function normalizeVectorizationEmbeddingMetadata(value) {
1117
+ if (value === void 0 || value === null) {
1118
+ return null;
1119
+ }
1120
+ if (typeof value !== "object" || Array.isArray(value)) {
1121
+ throw new Error("Vectorization embedding metadata must be an object when set");
1122
+ }
1123
+ const identity = buildVectorizationEmbeddingIdentity(value.provider, value.model);
1124
+ const vectorDimension = value.vector_dimension;
1125
+ if (!identity || typeof vectorDimension !== "number" || !Number.isInteger(vectorDimension) || vectorDimension <= 0) {
1126
+ throw new Error("Vectorization embedding metadata must include provider, model, and positive vector_dimension");
1127
+ }
1128
+ return {
1129
+ ...identity,
1130
+ vector_dimension: vectorDimension
1131
+ };
1132
+ }
1133
+ function buildVectorizationEmbeddingMetadata(identity, vectorDimension) {
1134
+ if (!Number.isInteger(vectorDimension) || vectorDimension <= 0) {
1135
+ throw new Error("Vectorization embedding metadata requires a positive vector dimension");
1136
+ }
1137
+ return {
1138
+ provider: identity.provider,
1139
+ model: identity.model,
1140
+ vector_dimension: vectorDimension
1141
+ };
1142
+ }
1143
+ function hasVectorizationEmbeddingIdentityChanged(metadata, identity) {
1144
+ return !metadata || metadata.provider !== identity.provider || metadata.model !== identity.model;
1145
+ }
1146
+ function hasVectorizationVectorDimensionChanged(metadata, vectorDimension) {
1147
+ return Boolean(metadata && metadata.vector_dimension !== vectorDimension);
1148
+ }
1149
+ function inferConsistentVectorDimension(vectors, context) {
1150
+ if (vectors.length === 0) {
1151
+ throw new Error(`${context} returned no vectors`);
1152
+ }
1153
+ const firstVector = vectors[0];
1154
+ const dimension = firstVector.length;
1155
+ if (!Number.isInteger(dimension) || dimension <= 0) {
1156
+ throw new Error(`${context} returned an empty vector`);
1157
+ }
1158
+ for (let index = 1; index < vectors.length; index += 1) {
1159
+ if (vectors[index]?.length !== dimension) {
1160
+ throw new Error(`${context} returned mixed vector dimensions`);
1161
+ }
1162
+ }
1163
+ return dimension;
1164
+ }
1165
+
1104
1166
  // dist/core/search/cache.js
1105
1167
  import path2 from "node:path";
1106
1168
 
@@ -1384,68 +1446,6 @@ async function scheduleBackgroundSemanticRefresh(pmRoot, itemIds) {
1384
1446
  dispatchRefreshChild(pmRoot);
1385
1447
  }
1386
1448
 
1387
- // dist/core/search/vectorization-metadata.js
1388
- function buildVectorizationEmbeddingIdentity(provider, model) {
1389
- const normalizedProvider = toNonEmptyString(provider);
1390
- const normalizedModel = toNonEmptyString(model);
1391
- if (!normalizedProvider || !normalizedModel) {
1392
- return null;
1393
- }
1394
- return {
1395
- provider: normalizedProvider,
1396
- model: normalizedModel
1397
- };
1398
- }
1399
- function normalizeVectorizationEmbeddingMetadata(value) {
1400
- if (value === void 0 || value === null) {
1401
- return null;
1402
- }
1403
- if (typeof value !== "object" || Array.isArray(value)) {
1404
- throw new Error("Vectorization embedding metadata must be an object when set");
1405
- }
1406
- const identity = buildVectorizationEmbeddingIdentity(value.provider, value.model);
1407
- const vectorDimension = value.vector_dimension;
1408
- if (!identity || typeof vectorDimension !== "number" || !Number.isInteger(vectorDimension) || vectorDimension <= 0) {
1409
- throw new Error("Vectorization embedding metadata must include provider, model, and positive vector_dimension");
1410
- }
1411
- return {
1412
- ...identity,
1413
- vector_dimension: vectorDimension
1414
- };
1415
- }
1416
- function buildVectorizationEmbeddingMetadata(identity, vectorDimension) {
1417
- if (!Number.isInteger(vectorDimension) || vectorDimension <= 0) {
1418
- throw new Error("Vectorization embedding metadata requires a positive vector dimension");
1419
- }
1420
- return {
1421
- provider: identity.provider,
1422
- model: identity.model,
1423
- vector_dimension: vectorDimension
1424
- };
1425
- }
1426
- function hasVectorizationEmbeddingIdentityChanged(metadata, identity) {
1427
- return !metadata || metadata.provider !== identity.provider || metadata.model !== identity.model;
1428
- }
1429
- function hasVectorizationVectorDimensionChanged(metadata, vectorDimension) {
1430
- return Boolean(metadata && metadata.vector_dimension !== vectorDimension);
1431
- }
1432
- function inferConsistentVectorDimension(vectors, context) {
1433
- if (vectors.length === 0) {
1434
- throw new Error(`${context} returned no vectors`);
1435
- }
1436
- const firstVector = vectors[0];
1437
- const dimension = firstVector.length;
1438
- if (!Number.isInteger(dimension) || dimension <= 0) {
1439
- throw new Error(`${context} returned an empty vector`);
1440
- }
1441
- for (let index = 1; index < vectors.length; index += 1) {
1442
- if (vectors[index]?.length !== dimension) {
1443
- throw new Error(`${context} returned mixed vector dimensions`);
1444
- }
1445
- }
1446
- return dimension;
1447
- }
1448
-
1449
1449
  // dist/core/search/cache.js
1450
1450
  var SEARCH_CACHE_ARTIFACT_PATHS = ["index/manifest.json", "search/embeddings.jsonl"];
1451
1451
  var VECTORIZATION_STATUS_LEDGER_PATH = "search/vectorization-status.json";
@@ -1847,10 +1847,12 @@ export {
1847
1847
  shouldRunSearchRefreshInForeground,
1848
1848
  resolveVectorStores,
1849
1849
  executeVectorQuery,
1850
+ buildVectorizationEmbeddingIdentity,
1851
+ hasVectorizationEmbeddingIdentityChanged,
1850
1852
  readVectorizationStatusLedger,
1851
1853
  refreshSemanticEmbeddingsForMutatedItems,
1852
1854
  refreshSearchArtifactsForMutation
1853
1855
  };
1854
- //# sourceMappingURL=chunk-BACSNVWE.js.map
1856
+ //# sourceMappingURL=chunk-XJDGS74Y.js.map
1855
1857
 
1856
- //# debugId=751da009-c89c-5d1c-b5cc-ae7e1dbf5866
1858
+ //# debugId=e3de33e9-9ffc-5384-b87e-e2dc2457b37e