@unbrained/pm-cli 2026.7.20 → 2026.7.21

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 (421) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +11 -0
  3. package/dist/cli/commander-usage.d.ts +1 -1
  4. package/dist/cli/commander-usage.js +5 -5
  5. package/dist/cli/commander-usage.js.map +1 -1
  6. package/dist/cli/commands/completion.js +13 -5
  7. package/dist/cli/commands/completion.js.map +1 -1
  8. package/dist/cli/commands/contracts.js +4 -3
  9. package/dist/cli/commands/contracts.js.map +1 -1
  10. package/dist/cli/error-guidance.d.ts +2 -0
  11. package/dist/cli/error-guidance.js +7 -2
  12. package/dist/cli/error-guidance.js.map +1 -1
  13. package/dist/cli/main.d.ts +1 -5
  14. package/dist/cli/main.js +12 -50
  15. package/dist/cli/main.js.map +1 -1
  16. package/dist/cli/register-list-query.js +13 -3
  17. package/dist/cli/register-list-query.js.map +1 -1
  18. package/dist/cli/register-mutation.js +45 -3
  19. package/dist/cli/register-mutation.js.map +1 -1
  20. package/dist/cli/register-structured-mutation.d.ts +14 -0
  21. package/dist/cli/register-structured-mutation.js +62 -0
  22. package/dist/cli/register-structured-mutation.js.map +1 -0
  23. package/dist/cli/registration-helpers.js +5 -3
  24. package/dist/cli/registration-helpers.js.map +1 -1
  25. package/dist/cli-bundle/bundle-manifest.json +280 -296
  26. package/dist/cli-bundle/chunks/{append-E6V54WOQ.js → append-7OVFYR3C.js} +3 -3
  27. package/dist/cli-bundle/chunks/{append-NNJ3EFIT.js → append-DFETHAZL.js} +3 -3
  28. package/dist/cli-bundle/chunks/{chunk-C3KD7U3T.js → chunk-2L6ZP22J.js} +241 -10
  29. package/dist/cli-bundle/chunks/chunk-2L6ZP22J.js.map +7 -0
  30. package/dist/cli-bundle/chunks/{chunk-KZEANWJS.js → chunk-4PUUNQDV.js} +98 -30
  31. package/dist/cli-bundle/chunks/chunk-4PUUNQDV.js.map +7 -0
  32. package/dist/cli-bundle/chunks/{chunk-RDV4ZFYS.js → chunk-4QOB7L7I.js} +7 -9
  33. package/dist/cli-bundle/chunks/{chunk-RDV4ZFYS.js.map → chunk-4QOB7L7I.js.map} +1 -1
  34. package/dist/cli-bundle/chunks/{chunk-3LPFHE3P.js → chunk-4QSQ6XDK.js} +62 -20
  35. package/dist/cli-bundle/chunks/chunk-4QSQ6XDK.js.map +1 -0
  36. package/dist/cli-bundle/chunks/{chunk-QJKL5PHS.js → chunk-7656MAUL.js} +2 -2
  37. package/dist/cli-bundle/chunks/{chunk-3AO5VSDR.js → chunk-7RW4JCU2.js} +328 -6
  38. package/dist/cli-bundle/chunks/chunk-7RW4JCU2.js.map +7 -0
  39. package/dist/cli-bundle/chunks/{chunk-X6K5XTTN.js → chunk-7W2UAXXT.js} +5 -5
  40. package/dist/cli-bundle/chunks/{chunk-SSKOQNMS.js → chunk-ABWCF646.js} +9 -11
  41. package/dist/cli-bundle/chunks/{chunk-SSKOQNMS.js.map → chunk-ABWCF646.js.map} +1 -1
  42. package/dist/cli-bundle/chunks/{chunk-WVA4DVNV.js → chunk-ADBTSVGK.js} +71 -33
  43. package/dist/cli-bundle/chunks/chunk-ADBTSVGK.js.map +7 -0
  44. package/dist/cli-bundle/chunks/{chunk-J4FBIFU6.js → chunk-AELMUANP.js} +12 -6
  45. package/dist/cli-bundle/chunks/chunk-AELMUANP.js.map +1 -0
  46. package/dist/cli-bundle/chunks/{chunk-4F6BWJ4J.js → chunk-AMJPSANK.js} +57 -36
  47. package/dist/cli-bundle/chunks/chunk-AMJPSANK.js.map +7 -0
  48. package/dist/cli-bundle/chunks/{chunk-6VIJ7UA5.js → chunk-AS4SAZ5R.js} +850 -819
  49. package/dist/cli-bundle/chunks/chunk-AS4SAZ5R.js.map +7 -0
  50. package/dist/cli-bundle/chunks/{chunk-SG74J6MV.js → chunk-ATBCUC7Y.js} +574 -5
  51. package/dist/cli-bundle/chunks/chunk-ATBCUC7Y.js.map +1 -0
  52. package/dist/cli-bundle/chunks/{chunk-5OK4UGFV.js → chunk-BXNDKOR2.js} +3 -3
  53. package/dist/cli-bundle/chunks/{chunk-KSPWRNVP.js → chunk-CPX275C6.js} +2 -2
  54. package/dist/cli-bundle/chunks/{chunk-JH2ZSLO3.js → chunk-DZRV2OPA.js} +2 -2
  55. package/dist/cli-bundle/chunks/{chunk-L7BH7IWU.js → chunk-E5XMKOSB.js} +2 -2
  56. package/dist/cli-bundle/chunks/{chunk-CQTQKUUV.js → chunk-EWJWSNRU.js} +3 -3
  57. package/dist/cli-bundle/chunks/{chunk-DAQ45GCS.js → chunk-F2LBF7XJ.js} +22 -15
  58. package/dist/cli-bundle/chunks/chunk-F2LBF7XJ.js.map +7 -0
  59. package/dist/cli-bundle/chunks/{chunk-6XMUURSS.js → chunk-FJIFFBJX.js} +64 -33
  60. package/dist/cli-bundle/chunks/chunk-FJIFFBJX.js.map +1 -0
  61. package/dist/cli-bundle/chunks/{chunk-E7ICD63T.js → chunk-FO6OSVEN.js} +4 -6
  62. package/dist/cli-bundle/chunks/{chunk-E7ICD63T.js.map → chunk-FO6OSVEN.js.map} +1 -1
  63. package/dist/cli-bundle/chunks/{chunk-3MCTMJXI.js → chunk-FPBMLYPI.js} +2 -2
  64. package/dist/cli-bundle/chunks/{chunk-UZDQXNUB.js → chunk-FSE2IKJQ.js} +46 -5
  65. package/dist/cli-bundle/chunks/chunk-FSE2IKJQ.js.map +1 -0
  66. package/dist/cli-bundle/chunks/{chunk-IX677TRO.js → chunk-GKX4NJ7U.js} +8 -10
  67. package/dist/cli-bundle/chunks/{chunk-IX677TRO.js.map → chunk-GKX4NJ7U.js.map} +1 -1
  68. package/dist/cli-bundle/chunks/{chunk-DVDBQA3B.js → chunk-GTK4DTEW.js} +5 -5
  69. package/dist/cli-bundle/chunks/chunk-H7EAER5L.js +974 -0
  70. package/dist/cli-bundle/chunks/chunk-H7EAER5L.js.map +1 -0
  71. package/dist/cli-bundle/chunks/{chunk-5UX66S6U.js → chunk-ICDAQ4TD.js} +316 -8
  72. package/dist/cli-bundle/chunks/chunk-ICDAQ4TD.js.map +1 -0
  73. package/dist/cli-bundle/chunks/{chunk-YQQNAKW3.js → chunk-JFD5LPMI.js} +6 -8
  74. package/dist/cli-bundle/chunks/{chunk-YQQNAKW3.js.map → chunk-JFD5LPMI.js.map} +1 -1
  75. package/dist/cli-bundle/chunks/{chunk-QANSTTC7.js → chunk-JXCW2TI2.js} +6 -8
  76. package/dist/cli-bundle/chunks/{chunk-QANSTTC7.js.map → chunk-JXCW2TI2.js.map} +1 -1
  77. package/dist/cli-bundle/chunks/{chunk-GSJSM5BJ.js → chunk-K36WV5J6.js} +76 -13
  78. package/dist/cli-bundle/chunks/chunk-K36WV5J6.js.map +1 -0
  79. package/dist/cli-bundle/chunks/{chunk-GVI6FAFG.js → chunk-K55VMLSS.js} +7 -5
  80. package/dist/cli-bundle/chunks/chunk-K55VMLSS.js.map +7 -0
  81. package/dist/cli-bundle/chunks/{chunk-GIQSU6S2.js → chunk-KBLZ3AA5.js} +2 -2
  82. package/dist/cli-bundle/chunks/{chunk-XJF7CDNH.js → chunk-KH44WBAT.js} +2 -2
  83. package/dist/cli-bundle/chunks/{chunk-GV2262OF.js → chunk-LAV26CQG.js} +2 -2
  84. package/dist/cli-bundle/chunks/{chunk-VDO2JMD4.js → chunk-LVC72YRD.js} +2 -2
  85. package/dist/cli-bundle/chunks/{chunk-3VY6MIEO.js → chunk-LZYP423P.js} +35 -6
  86. package/dist/cli-bundle/chunks/chunk-LZYP423P.js.map +7 -0
  87. package/dist/cli-bundle/chunks/{chunk-ZYPFOO3L.js → chunk-MATHDCGG.js} +3 -3
  88. package/dist/cli-bundle/chunks/{chunk-OV7MSW3I.js → chunk-MWQ2HC2A.js} +99 -31
  89. package/dist/cli-bundle/chunks/chunk-MWQ2HC2A.js.map +1 -0
  90. package/dist/cli-bundle/chunks/{chunk-NHT3F4WZ.js → chunk-NUF7ROFH.js} +840 -816
  91. package/dist/cli-bundle/chunks/chunk-NUF7ROFH.js.map +1 -0
  92. package/dist/cli-bundle/chunks/{chunk-AOEOYL3S.js → chunk-O4BCOJTZ.js} +3 -3
  93. package/dist/cli-bundle/chunks/{chunk-RJO3YAFM.js → chunk-OCUBRA6D.js} +2 -2
  94. package/dist/cli-bundle/chunks/{chunk-5IZJWSDB.js → chunk-OG5DVFMA.js} +22 -15
  95. package/dist/cli-bundle/chunks/chunk-OG5DVFMA.js.map +1 -0
  96. package/dist/cli-bundle/chunks/{chunk-I577UHC7.js → chunk-OR42SO64.js} +2 -2
  97. package/dist/cli-bundle/chunks/{chunk-ZOJ3LR7O.js → chunk-OY7DMU5P.js} +2 -2
  98. package/dist/cli-bundle/chunks/{chunk-HEWM6CEN.js → chunk-P7MTHPJQ.js} +50 -9
  99. package/dist/cli-bundle/chunks/chunk-P7MTHPJQ.js.map +7 -0
  100. package/dist/cli-bundle/chunks/{chunk-2BO4CA46.js → chunk-PFNHX655.js} +236 -12
  101. package/dist/cli-bundle/chunks/{chunk-2BO4CA46.js.map → chunk-PFNHX655.js.map} +1 -1
  102. package/dist/cli-bundle/chunks/{chunk-ZV2NTVMJ.js → chunk-PONKZPCJ.js} +2 -2
  103. package/dist/cli-bundle/chunks/{chunk-THAOZG4U.js → chunk-PQSEQD6E.js} +8 -6
  104. package/dist/cli-bundle/chunks/chunk-PQSEQD6E.js.map +1 -0
  105. package/dist/cli-bundle/chunks/chunk-PWDEHT3L.js +991 -0
  106. package/dist/cli-bundle/chunks/chunk-PWDEHT3L.js.map +7 -0
  107. package/dist/cli-bundle/chunks/{chunk-UX6SSO2I.js → chunk-PZC2FUOQ.js} +2 -2
  108. package/dist/cli-bundle/chunks/{chunk-WUVEBQW6.js → chunk-QG4GFLQ6.js} +3 -5
  109. package/dist/cli-bundle/chunks/{chunk-WUVEBQW6.js.map → chunk-QG4GFLQ6.js.map} +1 -1
  110. package/dist/cli-bundle/chunks/{chunk-VQIHNHMJ.js → chunk-QIH77CAG.js} +2 -2
  111. package/dist/cli-bundle/chunks/{chunk-R3EWPG4A.js → chunk-QJIKE24M.js} +2 -2
  112. package/dist/cli-bundle/chunks/{chunk-QLZ643FM.js → chunk-QOOTOD3W.js} +10 -12
  113. package/dist/cli-bundle/chunks/{chunk-QLZ643FM.js.map → chunk-QOOTOD3W.js.map} +1 -1
  114. package/dist/cli-bundle/chunks/{chunk-MYSS5H2A.js → chunk-R3P6FZJW.js} +5 -7
  115. package/dist/cli-bundle/chunks/{chunk-MYSS5H2A.js.map → chunk-R3P6FZJW.js.map} +1 -1
  116. package/dist/cli-bundle/chunks/{chunk-G3COA6GS.js → chunk-RNPZYNHS.js} +56 -35
  117. package/dist/cli-bundle/chunks/chunk-RNPZYNHS.js.map +1 -0
  118. package/dist/cli-bundle/chunks/{chunk-T44FMVRL.js → chunk-RPESLSO5.js} +62 -20
  119. package/dist/cli-bundle/chunks/chunk-RPESLSO5.js.map +7 -0
  120. package/dist/cli-bundle/chunks/{chunk-INSTSQNZ.js → chunk-SY4SFZSD.js} +595 -3
  121. package/dist/cli-bundle/chunks/chunk-SY4SFZSD.js.map +7 -0
  122. package/dist/cli-bundle/chunks/{chunk-HB3P4M52.js → chunk-TRSHFPRZ.js} +2 -2
  123. package/dist/cli-bundle/chunks/{chunk-HRW7GF6T.js → chunk-UCBDQI5E.js} +2 -2
  124. package/dist/cli-bundle/chunks/{chunk-4U4Z6AHI.js → chunk-V22ZPOKN.js} +2 -2
  125. package/dist/cli-bundle/chunks/{chunk-JM6YAXTR.js → chunk-VHXHVTUU.js} +2 -2
  126. package/dist/cli-bundle/chunks/{chunk-LPEYZRUR.js → chunk-VJQG4BIM.js} +35 -6
  127. package/dist/cli-bundle/chunks/chunk-VJQG4BIM.js.map +1 -0
  128. package/dist/cli-bundle/chunks/{chunk-D6NXDNP3.js → chunk-VLRGDBLY.js} +2 -2
  129. package/dist/cli-bundle/chunks/{chunk-JAPE62Y5.js → chunk-VNTCM3VW.js} +3 -3
  130. package/dist/cli-bundle/chunks/{chunk-FDHPAVVB.js → chunk-VXOOB6YX.js} +2 -2
  131. package/dist/cli-bundle/chunks/{chunk-GFQP7HAZ.js → chunk-VZIZB6QH.js} +3 -5
  132. package/dist/cli-bundle/chunks/{chunk-GFQP7HAZ.js.map → chunk-VZIZB6QH.js.map} +1 -1
  133. package/dist/cli-bundle/chunks/{chunk-HQ3SB4CN.js → chunk-X3W65QK3.js} +2 -2
  134. package/dist/cli-bundle/chunks/{chunk-RZJLNXFG.js → chunk-XJTABV3X.js} +3 -3
  135. package/dist/cli-bundle/chunks/{chunk-GVT754PX.js → chunk-YCIUJJOD.js} +11 -5
  136. package/dist/cli-bundle/chunks/chunk-YCIUJJOD.js.map +7 -0
  137. package/dist/cli-bundle/chunks/{chunk-IJNK6WW2.js → chunk-Z75ONV25.js} +75 -12
  138. package/dist/cli-bundle/chunks/chunk-Z75ONV25.js.map +7 -0
  139. package/dist/cli-bundle/chunks/{chunk-4L23AGQ7.js → chunk-Z7VWXXJM.js} +5 -7
  140. package/dist/cli-bundle/chunks/{chunk-4L23AGQ7.js.map → chunk-Z7VWXXJM.js.map} +1 -1
  141. package/dist/cli-bundle/chunks/{chunk-YBT7O4KT.js → chunk-ZTVA4KLN.js} +4 -6
  142. package/dist/cli-bundle/chunks/{chunk-YBT7O4KT.js.map → chunk-ZTVA4KLN.js.map} +1 -1
  143. package/dist/cli-bundle/chunks/{chunk-TYHJDFYW.js → chunk-ZVZGXPQ5.js} +2 -2
  144. package/dist/cli-bundle/chunks/{close-many-SDA426VT.js → close-many-5RZXVN4J.js} +5 -6
  145. package/dist/cli-bundle/chunks/{close-many-UTZANOCQ.js → close-many-RZVTUGBG.js} +5 -6
  146. package/dist/cli-bundle/chunks/{comments-LZN6FXXC.js → comments-TPU7QRBL.js} +4 -4
  147. package/dist/cli-bundle/chunks/{comments-VBQ345ND.js → comments-Z4KV6FU3.js} +4 -4
  148. package/dist/cli-bundle/chunks/{create-GG4RBCGC.js → create-EIFBIVNQ.js} +6 -6
  149. package/dist/cli-bundle/chunks/{create-JBC5KUW6.js → create-RGSPN5GD.js} +6 -6
  150. package/dist/cli-bundle/chunks/{deps-FI4O6NQS.js → deps-UH5EQQUY.js} +3 -3
  151. package/dist/cli-bundle/chunks/{deps-DELOO4TL.js → deps-YG7UF3VR.js} +3 -3
  152. package/dist/cli-bundle/chunks/{docs-6Z2MP526.js → docs-G32TK6XS.js} +4 -4
  153. package/dist/cli-bundle/chunks/{docs-2UYBP5D6.js → docs-JWWNRC27.js} +4 -4
  154. package/dist/cli-bundle/chunks/{files-HKEAN5MA.js → files-3H32UQ4K.js} +4 -4
  155. package/dist/cli-bundle/chunks/{files-HEUGSJZL.js → files-4ALMCSKB.js} +4 -4
  156. package/dist/cli-bundle/chunks/{history-compact-7NDVP3PT.js → history-compact-77BT2LUB.js} +3 -4
  157. package/dist/cli-bundle/chunks/{history-compact-65YVN5DB.js → history-compact-VCKGTX64.js} +3 -4
  158. package/dist/cli-bundle/chunks/{history-redact-7YBL4XSG.js → history-redact-LJPZPNFA.js} +2 -3
  159. package/dist/cli-bundle/chunks/{history-redact-IZGNJBU4.js → history-redact-PWTTJ3XS.js} +2 -3
  160. package/dist/cli-bundle/chunks/{history-repair-7M4PYQUH.js → history-repair-I7CBNCV3.js} +5 -6
  161. package/dist/cli-bundle/chunks/{history-repair-GNGETJLI.js → history-repair-YTDZRK5E.js} +5 -6
  162. package/dist/cli-bundle/chunks/{learnings-3YXDRWFT.js → learnings-CYNOICKR.js} +4 -4
  163. package/dist/cli-bundle/chunks/{learnings-ALC6IMNL.js → learnings-KTYW3AL7.js} +4 -4
  164. package/dist/cli-bundle/chunks/{notes-7JMLQ447.js → notes-FGO63FXL.js} +4 -4
  165. package/dist/cli-bundle/chunks/{notes-JFCLTC5C.js → notes-ZERD3KB2.js} +4 -4
  166. package/dist/cli-bundle/chunks/{plan-T3XB3WTK.js → plan-OFJUBIM5.js} +7 -7
  167. package/dist/cli-bundle/chunks/{plan-KOIPWVOZ.js → plan-SGCDDTYR.js} +7 -7
  168. package/dist/cli-bundle/chunks/{profile-OILJHKUW.js → profile-3THJPIQY.js} +4 -5
  169. package/dist/cli-bundle/chunks/{profile-RJXA7PGS.js → profile-XEZAMMBW.js} +4 -5
  170. package/dist/cli-bundle/chunks/{register-list-query-CFVG75P3.js → register-list-query-BR435Q2H.js} +19 -16
  171. package/dist/cli-bundle/chunks/register-list-query-BR435Q2H.js.map +1 -0
  172. package/dist/cli-bundle/chunks/{register-list-query-E7UVY4TN.js → register-list-query-RWTWLOBE.js} +18 -15
  173. package/dist/cli-bundle/chunks/register-list-query-RWTWLOBE.js.map +7 -0
  174. package/dist/cli-bundle/chunks/{register-mutation-IQ55E25C.js → register-mutation-HLWC2WNP.js} +167 -31
  175. package/dist/cli-bundle/chunks/register-mutation-HLWC2WNP.js.map +1 -0
  176. package/dist/cli-bundle/chunks/{register-mutation-4VJTXBZW.js → register-mutation-ZJX5AZM5.js} +173 -30
  177. package/dist/cli-bundle/chunks/register-mutation-ZJX5AZM5.js.map +7 -0
  178. package/dist/cli-bundle/chunks/{register-operations-AR7RMX4W.js → register-operations-744YBJMV.js} +23 -25
  179. package/dist/cli-bundle/chunks/{register-operations-AR7RMX4W.js.map → register-operations-744YBJMV.js.map} +1 -1
  180. package/dist/cli-bundle/chunks/{register-operations-NOLZGORC.js → register-operations-UEBJH6AN.js} +21 -23
  181. package/dist/cli-bundle/chunks/{register-operations-NOLZGORC.js.map → register-operations-UEBJH6AN.js.map} +1 -1
  182. package/dist/cli-bundle/chunks/{register-setup-EYZ7VTPZ.js → register-setup-5DA4UZXI.js} +7 -8
  183. package/dist/cli-bundle/chunks/{register-setup-EYZ7VTPZ.js.map → register-setup-5DA4UZXI.js.map} +1 -1
  184. package/dist/cli-bundle/chunks/{register-setup-BB77VUEE.js → register-setup-6H25M3BH.js} +9 -10
  185. package/dist/cli-bundle/chunks/{register-setup-BB77VUEE.js.map → register-setup-6H25M3BH.js.map} +1 -1
  186. package/dist/cli-bundle/chunks/{restore-ZH65GZFB.js → restore-6TDVSATY.js} +4 -5
  187. package/dist/cli-bundle/chunks/{restore-L6IAGOD7.js → restore-RSL7C7LO.js} +4 -5
  188. package/dist/cli-bundle/chunks/{schema-4ERWM5QJ.js → schema-HFXFSGPG.js} +2 -3
  189. package/dist/cli-bundle/chunks/{schema-55DL3Q52.js → schema-TPVTIJPO.js} +2 -3
  190. package/dist/cli-bundle/chunks/{update-FW6FKDOP.js → update-LJZCL5SI.js} +7 -7
  191. package/dist/cli-bundle/chunks/{update-TJHSPRPT.js → update-SIA7LH5Y.js} +7 -7
  192. package/dist/cli-bundle/chunks/{update-many-PWXX5WHO.js → update-many-BDBZVGQL.js} +11 -12
  193. package/dist/cli-bundle/chunks/{update-many-NNALYQCN.js → update-many-MOY3A5B3.js} +11 -12
  194. package/dist/cli-bundle/main.js +60 -85
  195. package/dist/cli-bundle/main.js.map +2 -2
  196. package/dist/cli-bundle/sdk-runtime.js +37 -37
  197. package/dist/cli-bundle/sdk.js +126 -291
  198. package/dist/cli-bundle/sdk.js.map +4 -4
  199. package/dist/core/item/parse.d.ts +1 -1
  200. package/dist/core/item/parse.js +13 -7
  201. package/dist/core/item/parse.js.map +1 -1
  202. package/dist/core/output/mutation-projection.d.ts +2 -0
  203. package/dist/core/output/mutation-projection.js +33 -2
  204. package/dist/core/output/mutation-projection.js.map +1 -1
  205. package/dist/core/output/output.d.ts +4 -0
  206. package/dist/core/output/output.js +18 -13
  207. package/dist/core/output/output.js.map +1 -1
  208. package/dist/core/shared/command-types.d.ts +4 -0
  209. package/dist/core/shared/command-types.js +2 -2
  210. package/dist/core/shared/command-types.js.map +1 -1
  211. package/dist/mcp/server.js +39 -4
  212. package/dist/mcp/server.js.map +1 -1
  213. package/dist/mcp/tool-definitions.js +45 -4
  214. package/dist/mcp/tool-definitions.js.map +1 -1
  215. package/dist/sdk/cli-bootstrap.d.ts +2 -0
  216. package/dist/sdk/cli-bootstrap.js +20 -27
  217. package/dist/sdk/cli-bootstrap.js.map +1 -1
  218. package/dist/sdk/cli-contracts/enum-contracts.d.ts +2 -2
  219. package/dist/sdk/cli-contracts/enum-contracts.js +7 -2
  220. package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -1
  221. package/dist/sdk/cli-contracts/flag-contracts.d.ts +2 -0
  222. package/dist/sdk/cli-contracts/flag-contracts.js +21 -2
  223. package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -1
  224. package/dist/sdk/cli-contracts/tool-option-contracts.js +10 -2
  225. package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -1
  226. package/dist/sdk/cli-contracts/tool-parameter-tables.js +16 -3
  227. package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
  228. package/dist/sdk/cli-contracts/tool-schema.js +6 -2
  229. package/dist/sdk/cli-contracts/tool-schema.js.map +1 -1
  230. package/dist/sdk/cli-contracts.d.ts +1 -1
  231. package/dist/sdk/cli-contracts.js +3 -3
  232. package/dist/sdk/cli-contracts.js.map +1 -1
  233. package/dist/sdk/cli-program.js +4 -2
  234. package/dist/sdk/cli-program.js.map +1 -1
  235. package/dist/sdk/dependencies.d.ts +3 -2
  236. package/dist/sdk/dependencies.js +13 -12
  237. package/dist/sdk/dependencies.js.map +1 -1
  238. package/dist/sdk/error-runtime.d.ts +10 -0
  239. package/dist/sdk/error-runtime.js +59 -0
  240. package/dist/sdk/error-runtime.js.map +1 -0
  241. package/dist/sdk/graph/analytics.d.ts +9 -0
  242. package/dist/sdk/graph/analytics.js +24 -13
  243. package/dist/sdk/graph/analytics.js.map +1 -1
  244. package/dist/sdk/graph/assembly.d.ts +39 -0
  245. package/dist/sdk/graph/assembly.js +92 -12
  246. package/dist/sdk/graph/assembly.js.map +1 -1
  247. package/dist/sdk/graph/cache.d.ts +4 -1
  248. package/dist/sdk/graph/cache.js +17 -4
  249. package/dist/sdk/graph/cache.js.map +1 -1
  250. package/dist/sdk/graph/centrality.d.ts +82 -0
  251. package/dist/sdk/graph/centrality.js +259 -0
  252. package/dist/sdk/graph/centrality.js.map +1 -0
  253. package/dist/sdk/graph/durable-cache.d.ts +71 -0
  254. package/dist/sdk/graph/durable-cache.js +205 -0
  255. package/dist/sdk/graph/durable-cache.js.map +1 -0
  256. package/dist/sdk/graph/governance.d.ts +69 -1
  257. package/dist/sdk/graph/governance.js +143 -35
  258. package/dist/sdk/graph/governance.js.map +1 -1
  259. package/dist/sdk/graph/index.d.ts +7 -4
  260. package/dist/sdk/graph/index.js +8 -5
  261. package/dist/sdk/graph/index.js.map +1 -1
  262. package/dist/sdk/graph/mutation-advisory.d.ts +35 -4
  263. package/dist/sdk/graph/mutation-advisory.js +124 -35
  264. package/dist/sdk/graph/mutation-advisory.js.map +1 -1
  265. package/dist/sdk/graph/remediation.js +12 -2
  266. package/dist/sdk/graph/remediation.js.map +1 -1
  267. package/dist/sdk/graph/run.d.ts +133 -2
  268. package/dist/sdk/graph/run.js +217 -8
  269. package/dist/sdk/graph/run.js.map +1 -1
  270. package/dist/sdk/graph/scheduling.d.ts +59 -0
  271. package/dist/sdk/graph/scheduling.js +125 -0
  272. package/dist/sdk/graph/scheduling.js.map +1 -0
  273. package/dist/sdk/graph/traversal.d.ts +11 -0
  274. package/dist/sdk/graph/traversal.js +16 -2
  275. package/dist/sdk/graph/traversal.js.map +1 -1
  276. package/dist/sdk/index.d.ts +4 -0
  277. package/dist/sdk/index.js +6 -2
  278. package/dist/sdk/index.js.map +1 -1
  279. package/dist/sdk/runtime-input.js +7 -2
  280. package/dist/sdk/runtime-input.js.map +1 -1
  281. package/dist/sdk/runtime-primitives.d.ts +10 -0
  282. package/dist/sdk/runtime-primitives.js +14 -0
  283. package/dist/sdk/runtime-primitives.js.map +1 -0
  284. package/dist/sdk/runtime.d.ts +15 -0
  285. package/dist/sdk/runtime.js +16 -3
  286. package/dist/sdk/runtime.js.map +1 -1
  287. package/dist/sdk/structured-mutations.d.ts +21 -0
  288. package/dist/sdk/structured-mutations.js +375 -0
  289. package/dist/sdk/structured-mutations.js.map +1 -0
  290. package/docs/COMMANDS.md +85 -5
  291. package/docs/RELATIONSHIP_GRAPH.md +48 -7
  292. package/docs/SDK.md +78 -3
  293. package/marketplace.json +2 -2
  294. package/package.json +1 -1
  295. package/packages/pm-beads/package.json +1 -1
  296. package/packages/pm-calendar/package.json +1 -1
  297. package/packages/pm-command-kit/package.json +1 -1
  298. package/packages/pm-governance-audit/package.json +1 -1
  299. package/packages/pm-guide-shell/package.json +1 -1
  300. package/packages/pm-kanban/package.json +1 -1
  301. package/packages/pm-lifecycle-hooks/package.json +1 -1
  302. package/packages/pm-linked-test-adapters/package.json +1 -1
  303. package/packages/pm-search-advanced/package.json +1 -1
  304. package/packages/pm-templates/package.json +1 -1
  305. package/packages/pm-todos/package.json +1 -1
  306. package/packages/pm-vcs/package.json +1 -1
  307. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  308. package/plugins/pm-claude/README.md +5 -3
  309. package/plugins/pm-claude/commands/pm-init.md +1 -1
  310. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  311. package/dist/cli-bundle/chunks/chunk-3AO5VSDR.js.map +0 -7
  312. package/dist/cli-bundle/chunks/chunk-3LPFHE3P.js.map +0 -1
  313. package/dist/cli-bundle/chunks/chunk-3VY6MIEO.js.map +0 -7
  314. package/dist/cli-bundle/chunks/chunk-4F6BWJ4J.js.map +0 -7
  315. package/dist/cli-bundle/chunks/chunk-5IZJWSDB.js.map +0 -1
  316. package/dist/cli-bundle/chunks/chunk-5UX66S6U.js.map +0 -1
  317. package/dist/cli-bundle/chunks/chunk-6C2ZZX5Z.js +0 -286
  318. package/dist/cli-bundle/chunks/chunk-6C2ZZX5Z.js.map +0 -1
  319. package/dist/cli-bundle/chunks/chunk-6VIJ7UA5.js.map +0 -7
  320. package/dist/cli-bundle/chunks/chunk-6XMUURSS.js.map +0 -1
  321. package/dist/cli-bundle/chunks/chunk-C3KD7U3T.js.map +0 -7
  322. package/dist/cli-bundle/chunks/chunk-CFHAODHQ.js +0 -334
  323. package/dist/cli-bundle/chunks/chunk-CFHAODHQ.js.map +0 -1
  324. package/dist/cli-bundle/chunks/chunk-DAQ45GCS.js.map +0 -7
  325. package/dist/cli-bundle/chunks/chunk-E6LEMURX.js +0 -249
  326. package/dist/cli-bundle/chunks/chunk-E6LEMURX.js.map +0 -7
  327. package/dist/cli-bundle/chunks/chunk-G3COA6GS.js.map +0 -1
  328. package/dist/cli-bundle/chunks/chunk-GSJSM5BJ.js.map +0 -1
  329. package/dist/cli-bundle/chunks/chunk-GVI6FAFG.js.map +0 -7
  330. package/dist/cli-bundle/chunks/chunk-GVT754PX.js.map +0 -7
  331. package/dist/cli-bundle/chunks/chunk-HEWM6CEN.js.map +0 -7
  332. package/dist/cli-bundle/chunks/chunk-IJNK6WW2.js.map +0 -7
  333. package/dist/cli-bundle/chunks/chunk-INSTSQNZ.js.map +0 -7
  334. package/dist/cli-bundle/chunks/chunk-J4FBIFU6.js.map +0 -1
  335. package/dist/cli-bundle/chunks/chunk-KZEANWJS.js.map +0 -7
  336. package/dist/cli-bundle/chunks/chunk-LPEYZRUR.js.map +0 -1
  337. package/dist/cli-bundle/chunks/chunk-NHT3F4WZ.js.map +0 -1
  338. package/dist/cli-bundle/chunks/chunk-OV7MSW3I.js.map +0 -1
  339. package/dist/cli-bundle/chunks/chunk-P7JTWYLH.js +0 -246
  340. package/dist/cli-bundle/chunks/chunk-P7JTWYLH.js.map +0 -1
  341. package/dist/cli-bundle/chunks/chunk-R5U2VZ3K.js +0 -344
  342. package/dist/cli-bundle/chunks/chunk-R5U2VZ3K.js.map +0 -7
  343. package/dist/cli-bundle/chunks/chunk-SG74J6MV.js.map +0 -1
  344. package/dist/cli-bundle/chunks/chunk-T44FMVRL.js.map +0 -7
  345. package/dist/cli-bundle/chunks/chunk-THAOZG4U.js.map +0 -1
  346. package/dist/cli-bundle/chunks/chunk-UQLXSG72.js +0 -289
  347. package/dist/cli-bundle/chunks/chunk-UQLXSG72.js.map +0 -7
  348. package/dist/cli-bundle/chunks/chunk-UZDQXNUB.js.map +0 -1
  349. package/dist/cli-bundle/chunks/chunk-WVA4DVNV.js.map +0 -7
  350. package/dist/cli-bundle/chunks/register-list-query-CFVG75P3.js.map +0 -1
  351. package/dist/cli-bundle/chunks/register-list-query-E7UVY4TN.js.map +0 -7
  352. package/dist/cli-bundle/chunks/register-mutation-4VJTXBZW.js.map +0 -7
  353. package/dist/cli-bundle/chunks/register-mutation-IQ55E25C.js.map +0 -1
  354. /package/dist/cli-bundle/chunks/{append-E6V54WOQ.js.map → append-7OVFYR3C.js.map} +0 -0
  355. /package/dist/cli-bundle/chunks/{append-NNJ3EFIT.js.map → append-DFETHAZL.js.map} +0 -0
  356. /package/dist/cli-bundle/chunks/{chunk-QJKL5PHS.js.map → chunk-7656MAUL.js.map} +0 -0
  357. /package/dist/cli-bundle/chunks/{chunk-X6K5XTTN.js.map → chunk-7W2UAXXT.js.map} +0 -0
  358. /package/dist/cli-bundle/chunks/{chunk-5OK4UGFV.js.map → chunk-BXNDKOR2.js.map} +0 -0
  359. /package/dist/cli-bundle/chunks/{chunk-KSPWRNVP.js.map → chunk-CPX275C6.js.map} +0 -0
  360. /package/dist/cli-bundle/chunks/{chunk-JH2ZSLO3.js.map → chunk-DZRV2OPA.js.map} +0 -0
  361. /package/dist/cli-bundle/chunks/{chunk-L7BH7IWU.js.map → chunk-E5XMKOSB.js.map} +0 -0
  362. /package/dist/cli-bundle/chunks/{chunk-CQTQKUUV.js.map → chunk-EWJWSNRU.js.map} +0 -0
  363. /package/dist/cli-bundle/chunks/{chunk-3MCTMJXI.js.map → chunk-FPBMLYPI.js.map} +0 -0
  364. /package/dist/cli-bundle/chunks/{chunk-DVDBQA3B.js.map → chunk-GTK4DTEW.js.map} +0 -0
  365. /package/dist/cli-bundle/chunks/{chunk-GIQSU6S2.js.map → chunk-KBLZ3AA5.js.map} +0 -0
  366. /package/dist/cli-bundle/chunks/{chunk-XJF7CDNH.js.map → chunk-KH44WBAT.js.map} +0 -0
  367. /package/dist/cli-bundle/chunks/{chunk-GV2262OF.js.map → chunk-LAV26CQG.js.map} +0 -0
  368. /package/dist/cli-bundle/chunks/{chunk-VDO2JMD4.js.map → chunk-LVC72YRD.js.map} +0 -0
  369. /package/dist/cli-bundle/chunks/{chunk-ZYPFOO3L.js.map → chunk-MATHDCGG.js.map} +0 -0
  370. /package/dist/cli-bundle/chunks/{chunk-AOEOYL3S.js.map → chunk-O4BCOJTZ.js.map} +0 -0
  371. /package/dist/cli-bundle/chunks/{chunk-RJO3YAFM.js.map → chunk-OCUBRA6D.js.map} +0 -0
  372. /package/dist/cli-bundle/chunks/{chunk-I577UHC7.js.map → chunk-OR42SO64.js.map} +0 -0
  373. /package/dist/cli-bundle/chunks/{chunk-ZOJ3LR7O.js.map → chunk-OY7DMU5P.js.map} +0 -0
  374. /package/dist/cli-bundle/chunks/{chunk-ZV2NTVMJ.js.map → chunk-PONKZPCJ.js.map} +0 -0
  375. /package/dist/cli-bundle/chunks/{chunk-UX6SSO2I.js.map → chunk-PZC2FUOQ.js.map} +0 -0
  376. /package/dist/cli-bundle/chunks/{chunk-VQIHNHMJ.js.map → chunk-QIH77CAG.js.map} +0 -0
  377. /package/dist/cli-bundle/chunks/{chunk-R3EWPG4A.js.map → chunk-QJIKE24M.js.map} +0 -0
  378. /package/dist/cli-bundle/chunks/{chunk-HB3P4M52.js.map → chunk-TRSHFPRZ.js.map} +0 -0
  379. /package/dist/cli-bundle/chunks/{chunk-HRW7GF6T.js.map → chunk-UCBDQI5E.js.map} +0 -0
  380. /package/dist/cli-bundle/chunks/{chunk-4U4Z6AHI.js.map → chunk-V22ZPOKN.js.map} +0 -0
  381. /package/dist/cli-bundle/chunks/{chunk-JM6YAXTR.js.map → chunk-VHXHVTUU.js.map} +0 -0
  382. /package/dist/cli-bundle/chunks/{chunk-D6NXDNP3.js.map → chunk-VLRGDBLY.js.map} +0 -0
  383. /package/dist/cli-bundle/chunks/{chunk-JAPE62Y5.js.map → chunk-VNTCM3VW.js.map} +0 -0
  384. /package/dist/cli-bundle/chunks/{chunk-FDHPAVVB.js.map → chunk-VXOOB6YX.js.map} +0 -0
  385. /package/dist/cli-bundle/chunks/{chunk-HQ3SB4CN.js.map → chunk-X3W65QK3.js.map} +0 -0
  386. /package/dist/cli-bundle/chunks/{chunk-RZJLNXFG.js.map → chunk-XJTABV3X.js.map} +0 -0
  387. /package/dist/cli-bundle/chunks/{chunk-TYHJDFYW.js.map → chunk-ZVZGXPQ5.js.map} +0 -0
  388. /package/dist/cli-bundle/chunks/{close-many-SDA426VT.js.map → close-many-5RZXVN4J.js.map} +0 -0
  389. /package/dist/cli-bundle/chunks/{close-many-UTZANOCQ.js.map → close-many-RZVTUGBG.js.map} +0 -0
  390. /package/dist/cli-bundle/chunks/{comments-LZN6FXXC.js.map → comments-TPU7QRBL.js.map} +0 -0
  391. /package/dist/cli-bundle/chunks/{comments-VBQ345ND.js.map → comments-Z4KV6FU3.js.map} +0 -0
  392. /package/dist/cli-bundle/chunks/{create-GG4RBCGC.js.map → create-EIFBIVNQ.js.map} +0 -0
  393. /package/dist/cli-bundle/chunks/{create-JBC5KUW6.js.map → create-RGSPN5GD.js.map} +0 -0
  394. /package/dist/cli-bundle/chunks/{deps-FI4O6NQS.js.map → deps-UH5EQQUY.js.map} +0 -0
  395. /package/dist/cli-bundle/chunks/{deps-DELOO4TL.js.map → deps-YG7UF3VR.js.map} +0 -0
  396. /package/dist/cli-bundle/chunks/{docs-6Z2MP526.js.map → docs-G32TK6XS.js.map} +0 -0
  397. /package/dist/cli-bundle/chunks/{docs-2UYBP5D6.js.map → docs-JWWNRC27.js.map} +0 -0
  398. /package/dist/cli-bundle/chunks/{files-HKEAN5MA.js.map → files-3H32UQ4K.js.map} +0 -0
  399. /package/dist/cli-bundle/chunks/{files-HEUGSJZL.js.map → files-4ALMCSKB.js.map} +0 -0
  400. /package/dist/cli-bundle/chunks/{history-compact-7NDVP3PT.js.map → history-compact-77BT2LUB.js.map} +0 -0
  401. /package/dist/cli-bundle/chunks/{history-compact-65YVN5DB.js.map → history-compact-VCKGTX64.js.map} +0 -0
  402. /package/dist/cli-bundle/chunks/{history-redact-7YBL4XSG.js.map → history-redact-LJPZPNFA.js.map} +0 -0
  403. /package/dist/cli-bundle/chunks/{history-redact-IZGNJBU4.js.map → history-redact-PWTTJ3XS.js.map} +0 -0
  404. /package/dist/cli-bundle/chunks/{history-repair-7M4PYQUH.js.map → history-repair-I7CBNCV3.js.map} +0 -0
  405. /package/dist/cli-bundle/chunks/{history-repair-GNGETJLI.js.map → history-repair-YTDZRK5E.js.map} +0 -0
  406. /package/dist/cli-bundle/chunks/{learnings-3YXDRWFT.js.map → learnings-CYNOICKR.js.map} +0 -0
  407. /package/dist/cli-bundle/chunks/{learnings-ALC6IMNL.js.map → learnings-KTYW3AL7.js.map} +0 -0
  408. /package/dist/cli-bundle/chunks/{notes-7JMLQ447.js.map → notes-FGO63FXL.js.map} +0 -0
  409. /package/dist/cli-bundle/chunks/{notes-JFCLTC5C.js.map → notes-ZERD3KB2.js.map} +0 -0
  410. /package/dist/cli-bundle/chunks/{plan-T3XB3WTK.js.map → plan-OFJUBIM5.js.map} +0 -0
  411. /package/dist/cli-bundle/chunks/{plan-KOIPWVOZ.js.map → plan-SGCDDTYR.js.map} +0 -0
  412. /package/dist/cli-bundle/chunks/{profile-OILJHKUW.js.map → profile-3THJPIQY.js.map} +0 -0
  413. /package/dist/cli-bundle/chunks/{profile-RJXA7PGS.js.map → profile-XEZAMMBW.js.map} +0 -0
  414. /package/dist/cli-bundle/chunks/{restore-ZH65GZFB.js.map → restore-6TDVSATY.js.map} +0 -0
  415. /package/dist/cli-bundle/chunks/{restore-L6IAGOD7.js.map → restore-RSL7C7LO.js.map} +0 -0
  416. /package/dist/cli-bundle/chunks/{schema-4ERWM5QJ.js.map → schema-HFXFSGPG.js.map} +0 -0
  417. /package/dist/cli-bundle/chunks/{schema-55DL3Q52.js.map → schema-TPVTIJPO.js.map} +0 -0
  418. /package/dist/cli-bundle/chunks/{update-FW6FKDOP.js.map → update-LJZCL5SI.js.map} +0 -0
  419. /package/dist/cli-bundle/chunks/{update-TJHSPRPT.js.map → update-SIA7LH5Y.js.map} +0 -0
  420. /package/dist/cli-bundle/chunks/{update-many-PWXX5WHO.js.map → update-many-BDBZVGQL.js.map} +0 -0
  421. /package/dist/cli-bundle/chunks/{update-many-NNALYQCN.js.map → update-many-MOY3A5B3.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../../../sdk/cli-bootstrap.ts","../../../../../../../../sdk/invocation-author.ts","../../../../../../../../sdk/cli-program.ts"],"sourcesContent":["/**\n * @module sdk/cli-bootstrap\n *\n * Provides public bootstrap argument normalization for embedded CLI hosts.\n */\nimport {\n EXECUTABLE_COMMAND_ALIASES,\n resolveSubcommandFlagContractsForCommand,\n type CliFlagContract,\n} from \"./cli-contracts.js\";\nexport { EXECUTABLE_COMMAND_ALIASES };\nimport { levenshteinDistanceWithinLimit } from \"../core/shared/levenshtein.js\";\n\nconst GLOBAL_VALUE_CONSUMING_FLAGS = new Set<string>([\n \"--pm-path\",\n \"--path\",\n \"--author\",\n]);\n\n/** Whether a global value-consuming flag uses its inline `--flag=value` form. */\nconst isInlineGlobalValueToken = (token: string): boolean => {\n const equalsIndex = token.indexOf(\"=\");\n return (\n equalsIndex > 0 &&\n GLOBAL_VALUE_CONSUMING_FLAGS.has(token.slice(0, equalsIndex))\n );\n};\n\n/** Whether optional bootstrap author syntax consumes the following token. */\nconst consumesBootstrapAuthorValue = (next: string | undefined): boolean => {\n return typeof next === \"string\" && !next.startsWith(\"-\");\n};\n\nfunction parseBootstrapPathToken(\n token: string,\n next: string | undefined,\n): { consumed: number; pathValue?: string; preferred: boolean } | null {\n if (token === \"--path\" || token === \"--pm-path\") {\n if (typeof next === \"string\" && next.length > 0) {\n return {\n consumed: 2,\n pathValue: next,\n preferred: token === \"--pm-path\",\n };\n }\n return {\n consumed: 1,\n preferred: token === \"--pm-path\",\n };\n }\n\n const inlinePrefix = token.startsWith(\"--path=\")\n ? \"--path=\"\n : token.startsWith(\"--pm-path=\")\n ? \"--pm-path=\"\n : undefined;\n if (!inlinePrefix) {\n return null;\n }\n\n const value = token.slice(inlinePrefix.length);\n if (value.length > 0) {\n return {\n consumed: 1,\n pathValue: value,\n preferred: inlinePrefix === \"--pm-path=\",\n };\n }\n return {\n consumed: 1,\n preferred: inlinePrefix === \"--pm-path=\",\n };\n}\n\n/** Documents the bootstrap global options payload exchanged by command, SDK, and package integrations. */\nexport interface BootstrapGlobalOptions {\n /** Filesystem path used for path resolution. */\n path?: string;\n /** Value that configures or reports no extensions for this contract. */\n noExtensions: boolean;\n /** Value that configures or reports no pager for this contract. */\n noPager: boolean;\n /** Value that configures or reports json for this contract. */\n json: boolean;\n /** Value that configures or reports quiet for this contract. */\n quiet: boolean;\n /** Invocation-wide mutation author override. */\n author?: string;\n /** Whether `--author` was present without its required value. */\n authorMissingValue?: true;\n}\n\n/** Implements parse bootstrap global options for the public runtime surface of this module. */\nexport function parseBootstrapGlobalOptions(\n argv: string[],\n): BootstrapGlobalOptions {\n let legacyPathValue: string | undefined;\n let pmPathValue: string | undefined;\n let noExtensions = false;\n let noPager = false;\n let json = false;\n let quiet = false;\n let author: string | undefined;\n let index = 0;\n while (index < argv.length) {\n const token = argv[index];\n if (token === \"--\") {\n break;\n }\n if (token === \"--no-extensions\") {\n noExtensions = true;\n index += 1;\n continue;\n }\n if (token === \"--no-pager\") {\n noPager = true;\n index += 1;\n continue;\n }\n if (token === \"--json\") {\n json = true;\n index += 1;\n continue;\n }\n if (token === \"--quiet\") {\n quiet = true;\n index += 1;\n continue;\n }\n const parsedPath = parseBootstrapPathToken(token, argv[index + 1]);\n if (parsedPath) {\n if (parsedPath.pathValue !== undefined) {\n if (parsedPath.preferred) {\n pmPathValue = parsedPath.pathValue;\n } else {\n legacyPathValue = parsedPath.pathValue;\n }\n }\n index += parsedPath.consumed;\n continue;\n }\n if (token === \"--author\") {\n if (consumesBootstrapAuthorValue(argv[index + 1])) {\n author = argv[index + 1];\n index += 2;\n } else {\n author = \"\";\n index += 1;\n }\n continue;\n }\n if (token.startsWith(\"--author=\")) {\n author = token.slice(\"--author=\".length);\n index += 1;\n continue;\n }\n index += 1;\n }\n return {\n path: pmPathValue ?? legacyPathValue,\n noExtensions,\n noPager,\n json,\n quiet,\n ...(author === \"\"\n ? { authorMissingValue: true }\n : author !== undefined\n ? { author }\n : {}),\n };\n}\n\n/** Implements strip global bootstrap tokens for the public runtime surface of this module. */\nexport function stripGlobalBootstrapTokens(argv: string[]): string[] {\n const remaining: string[] = [];\n let index = 0;\n while (index < argv.length) {\n const token = argv[index];\n if (token === \"--\") {\n break;\n }\n if (\n token === \"--json\" ||\n token === \"--quiet\" ||\n token === \"--no-extensions\" ||\n token === \"--no-pager\" ||\n token === \"--profile\" ||\n token === \"--id-only\" ||\n token === \"--explain\"\n ) {\n index += 1;\n continue;\n }\n if (token === \"--author\") {\n index += consumesBootstrapAuthorValue(argv[index + 1]) ? 2 : 1;\n continue;\n }\n if (GLOBAL_VALUE_CONSUMING_FLAGS.has(token)) {\n index += 2;\n continue;\n }\n if (isInlineGlobalValueToken(token)) {\n index += 1;\n continue;\n }\n remaining.push(token);\n index += 1;\n }\n return remaining;\n}\n\n/** Documents the bootstrap help request payload exchanged by command, SDK, and package integrations. */\nexport interface BootstrapHelpRequest {\n /** Value that configures or reports requested for this contract. */\n requested: boolean;\n /** Value that configures or reports command path tokens for this contract. */\n commandPathTokens: string[];\n}\n\n/** Implements parse bootstrap help request for the public runtime surface of this module. */\nexport function parseBootstrapHelpRequest(\n argv: string[],\n): BootstrapHelpRequest {\n const stripped = stripGlobalBootstrapTokens(argv);\n const first = stripped[0]?.trim().toLowerCase();\n if (first === \"help\") {\n const commandPathTokens: string[] = [];\n for (let index = 1; index < stripped.length; index += 1) {\n const token = stripped[index];\n if (token.startsWith(\"-\")) {\n break;\n }\n commandPathTokens.push(token.trim().toLowerCase());\n }\n return {\n requested: true,\n commandPathTokens,\n };\n }\n\n const helpFlagIndex = stripped.findIndex(\n (token) => token === \"--help\" || token === \"-h\",\n );\n if (helpFlagIndex < 0) {\n return {\n requested: false,\n commandPathTokens: [],\n };\n }\n\n const commandPathTokens: string[] = [];\n for (const token of stripped) {\n if (token.startsWith(\"-\")) {\n break;\n }\n commandPathTokens.push(token.trim().toLowerCase());\n }\n return {\n requested: true,\n commandPathTokens,\n };\n}\n\n/**\n * Index of the command token in argv — the first non-flag token, skipping the\n * value-consuming/global bootstrap flags. Returns undefined when there is none\n * (bare invocation, only global flags, or a leading `--`). Single source of truth\n * for command-position scanning shared by {@link parseBootstrapCommandName} and the\n * command-alias rewrite so their precedence rules can never drift apart.\n */\nfunction findCommandTokenIndex(argv: string[]): number | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === \"--\") {\n return undefined;\n }\n if (token === \"--author\") {\n index += consumesBootstrapAuthorValue(argv[index + 1]) ? 1 : 0;\n continue;\n }\n if (GLOBAL_VALUE_CONSUMING_FLAGS.has(token)) {\n index += 1;\n continue;\n }\n if (\n isInlineGlobalValueToken(token) ||\n token === \"--json\" ||\n token === \"--quiet\" ||\n token === \"--no-extensions\" ||\n token === \"--no-pager\" ||\n token === \"--profile\" ||\n token === \"--id-only\" ||\n token === \"--explain\"\n ) {\n continue;\n }\n if (token.startsWith(\"-\")) {\n continue;\n }\n return index;\n }\n return undefined;\n}\n\n/** Implements parse bootstrap command name for the public runtime surface of this module. */\nexport function parseBootstrapCommandName(argv: string[]): string | undefined {\n const index = findCommandTokenIndex(argv);\n return index === undefined ? undefined : argv[index].trim().toLowerCase();\n}\n\nfunction shouldDisablePagerForInvocation(\n argv: string[],\n bootstrapGlobal: BootstrapGlobalOptions,\n): boolean {\n if (bootstrapGlobal.noPager) {\n return true;\n }\n if (process.stdout.isTTY === true) {\n return false;\n }\n const helpRequest = parseBootstrapHelpRequest(argv);\n return helpRequest.requested;\n}\n\n/** Implements apply bootstrap pager policy for the public runtime surface of this module. */\nexport function applyBootstrapPagerPolicy(argv: string[]): () => void {\n const pagerEnvironmentKeys = [\n \"PAGER\",\n \"MANPAGER\",\n \"GIT_PAGER\",\n \"LESS\",\n ] as const;\n const previousValues = pagerEnvironmentKeys.map((key) => process.env[key]);\n const restore = (): void => {\n for (const [index, key] of pagerEnvironmentKeys.entries()) {\n const value = previousValues[index];\n if (value === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n }\n };\n const bootstrapGlobal = parseBootstrapGlobalOptions(argv);\n if (!shouldDisablePagerForInvocation(argv, bootstrapGlobal)) {\n return restore;\n }\n process.env.PAGER = \"cat\";\n process.env.MANPAGER = \"cat\";\n process.env.GIT_PAGER = \"cat\";\n if (\n typeof process.env.LESS !== \"string\" ||\n process.env.LESS.trim().length === 0\n ) {\n process.env.LESS = \"FRX\";\n }\n return restore;\n}\n\ntype ExtensionSubcommandAction =\n | \"init\"\n | \"install\"\n | \"uninstall\"\n | \"explore\"\n | \"manage\"\n | \"doctor\"\n | \"adopt\"\n | \"adopt-all\"\n | \"activate\"\n | \"deactivate\";\n\nconst EXTENSION_ACTION_SYNTAX_TOKENS = new Set<ExtensionSubcommandAction>([\n \"install\",\n \"uninstall\",\n \"explore\",\n \"manage\",\n \"doctor\",\n \"adopt\",\n \"adopt-all\",\n \"activate\",\n \"deactivate\",\n]);\n\n/** Implements normalize legacy extension action syntax for the public runtime surface of this module. */\nexport function normalizeLegacyExtensionActionSyntax(argv: string[]): string[] {\n const extensionIndex = findCommandTokenIndex(argv);\n if (extensionIndex === undefined || argv[extensionIndex] !== \"extension\") {\n return [...argv];\n }\n const actionToken = argv[extensionIndex + 1];\n if (!actionToken || actionToken.startsWith(\"-\")) {\n return [...argv];\n }\n if (\n !EXTENSION_ACTION_SYNTAX_TOKENS.has(\n actionToken as ExtensionSubcommandAction,\n )\n ) {\n return [...argv];\n }\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n return [...argv];\n }\n const forcedActionFlag = `--${actionToken}`;\n if (argv.includes(forcedActionFlag)) {\n return [...argv];\n }\n return [\n ...argv.slice(0, extensionIndex + 1),\n forcedActionFlag,\n ...argv.slice(extensionIndex + 2),\n ];\n}\n\ntype BootstrapNormalizationReason =\n | \"legacy_extension_action\"\n | \"command_alias\"\n | \"flag_alias\"\n | \"flag_typo\"\n | \"bare_key_value\"\n | \"list_merge\";\ntype BootstrapNormalizationConfidence = \"high\" | \"medium\";\n\n/** Executable command aliases: a leading command token here is rewritten to its canonical command BEFORE commander parses, so the alias actually runs instead of merely being suggested. These are the highest-frequency aliases real agents type (telemetry: `pm show <id>` alone is the single most common unknown-command) and each target takes the same positional/flags as the alias (with `--comment`/ `--note`/`--learning` flag-aliased to `--add` on the target command). Keeping this in one place means the alias is consistent across registration, commander dispatch, telemetry, and error handling — all of which read the normalized argv. */\n/**\n * Rewrite a leading command-alias token (e.g. `show` -> `get`) in place. Only the\n * command position is considered — the same token appearing later as an argument\n * (`pm get show`) is left untouched — and only when it is not preceded by `--` or a\n * value-consuming global flag, mirroring {@link parseBootstrapCommandName}.\n */\nfunction rewriteCommandAlias(\n argv: string[],\n trace: BootstrapNormalizationEvent[],\n): string[] {\n const index = findCommandTokenIndex(argv);\n if (index === undefined) {\n return argv;\n }\n const token = argv[index];\n const canonical = EXECUTABLE_COMMAND_ALIASES[token.trim().toLowerCase()];\n if (!canonical) {\n return argv;\n }\n const rewritten = [...argv];\n rewritten[index] = canonical;\n trace.push({\n from: token,\n to: [canonical],\n reason: \"command_alias\",\n confidence: \"high\",\n });\n return rewritten;\n}\n\n/** Documents the bootstrap normalization event payload exchanged by command, SDK, and package integrations. */\nexport interface BootstrapNormalizationEvent {\n /** Value that configures or reports from for this contract. */\n from: string;\n /** Value that configures or reports to for this contract. */\n to: string[];\n /** Value that configures or reports reason for this contract. */\n reason: BootstrapNormalizationReason;\n /** Value that configures or reports confidence for this contract. */\n confidence: BootstrapNormalizationConfidence;\n}\n\n/** Documents the bootstrap invocation normalization result payload exchanged by command, SDK, and package integrations. */\nexport interface BootstrapInvocationNormalizationResult {\n /** Value that configures or reports argv for this contract. */\n argv: string[];\n /** Value that configures or reports command name for this contract. */\n commandName: string | undefined;\n /** Value that configures or reports trace for this contract. */\n trace: BootstrapNormalizationEvent[];\n}\n\ninterface FlagLookup {\n canonicalByNormalized: Map<string, string | null>;\n canonicalByCompact: Map<string, string | null>;\n canonicalComparables: Array<{ canonicalFlag: string; comparable: string }>;\n listCanonicalFlags: Set<string>;\n}\n\nfunction normalizeFlagKeyToken(raw: string): string {\n const withoutPrefix = raw.replace(/^--?/, \"\");\n return withoutPrefix\n .replace(/_/g, \"-\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\nfunction toComparableFlagKey(raw: string): string {\n return normalizeFlagKeyToken(raw).replace(/-/g, \"\");\n}\n\nfunction markUnambiguousFlag(\n map: Map<string, string | null>,\n key: string,\n canonicalFlag: string,\n): void {\n const existing = map.get(key);\n if (existing === undefined) {\n map.set(key, canonicalFlag);\n return;\n }\n if (existing !== canonicalFlag) {\n map.set(key, null);\n }\n}\n\nfunction collectLongFlagCandidates(contract: CliFlagContract): string[] {\n const candidates: string[] = [];\n const pushLongFlag = (value: string | undefined): void => {\n if (typeof value !== \"string\") {\n return;\n }\n if (!value.startsWith(\"--\")) {\n return;\n }\n candidates.push(value);\n };\n pushLongFlag(contract.flag);\n for (const alias of contract.aliases ?? []) {\n pushLongFlag(alias);\n }\n return candidates;\n}\n\nfunction buildFlagLookup(\n commandName: string | undefined,\n contractsOverride?: CliFlagContract[],\n): FlagLookup {\n const contracts =\n contractsOverride ?? resolveSubcommandFlagContractsForCommand(commandName);\n const canonicalByNormalized = new Map<string, string | null>();\n const canonicalByCompact = new Map<string, string | null>();\n const canonicalComparablesMap = new Map<string, string>();\n const listCanonicalFlags = new Set<string>();\n for (const contract of contracts) {\n const longCandidates = collectLongFlagCandidates(contract);\n if (longCandidates.length === 0) {\n continue;\n }\n const canonicalFlag = `--${normalizeFlagKeyToken(longCandidates[0])}`;\n for (const candidate of longCandidates) {\n markUnambiguousFlag(\n canonicalByNormalized,\n normalizeFlagKeyToken(candidate),\n canonicalFlag,\n );\n markUnambiguousFlag(\n canonicalByCompact,\n toComparableFlagKey(candidate),\n canonicalFlag,\n );\n }\n const comparable = toComparableFlagKey(canonicalFlag);\n if (!canonicalComparablesMap.has(canonicalFlag)) {\n canonicalComparablesMap.set(canonicalFlag, comparable);\n }\n if (contract.list === true) {\n listCanonicalFlags.add(canonicalFlag);\n }\n }\n return {\n canonicalByNormalized,\n canonicalByCompact,\n canonicalComparables: [...canonicalComparablesMap.entries()].map(\n ([canonicalFlag, comparable]) => ({\n canonicalFlag,\n comparable,\n }),\n ),\n listCanonicalFlags,\n };\n}\n\nfunction resolveCanonicalFlag(\n rawKey: string,\n lookup: FlagLookup,\n): {\n flag: string;\n reason: \"flag_alias\" | \"flag_typo\";\n confidence: BootstrapNormalizationConfidence;\n} | null {\n const normalizedKey = normalizeFlagKeyToken(rawKey);\n const direct = lookup.canonicalByNormalized.get(normalizedKey);\n if (typeof direct === \"string\") {\n return {\n flag: direct,\n reason: \"flag_alias\",\n confidence: \"high\",\n };\n }\n const comparableKey = normalizedKey.replace(/-/g, \"\");\n const compactMatch = lookup.canonicalByCompact.get(comparableKey);\n if (typeof compactMatch === \"string\") {\n return {\n flag: compactMatch,\n reason: \"flag_alias\",\n confidence: \"high\",\n };\n }\n const maxDistance = comparableKey.length >= 8 ? 2 : 1;\n let bestDistance = Number.POSITIVE_INFINITY;\n let bestFlag: string | undefined;\n let tied = false;\n for (const candidate of lookup.canonicalComparables) {\n const distance = levenshteinDistanceWithinLimit(\n comparableKey,\n candidate.comparable,\n maxDistance,\n );\n if (distance === null) {\n continue;\n }\n if (distance < bestDistance) {\n bestDistance = distance;\n bestFlag = candidate.canonicalFlag;\n tied = false;\n continue;\n }\n if (distance === bestDistance && bestFlag !== candidate.canonicalFlag) {\n tied = true;\n }\n }\n if (\n !bestFlag ||\n tied ||\n !Number.isFinite(bestDistance) ||\n bestDistance <= 0\n ) {\n return null;\n }\n return {\n flag: bestFlag,\n reason: \"flag_typo\",\n confidence: bestDistance >= 2 ? \"medium\" : \"high\",\n };\n}\n\n/** Implements list alias plural keys for the public runtime surface of this module. */\nexport function listAliasPluralKeys(normalizedKey: string): string[] {\n const candidates = [`${normalizedKey}s`];\n if (normalizedKey.endsWith(\"y\") && normalizedKey.length > 1) {\n candidates.push(`${normalizedKey.slice(0, -1)}ies`);\n }\n return candidates;\n}\n\nfunction parseBareKeyValueToken(\n token: string,\n preserve = false,\n): { key: string; value: string } | null {\n if (preserve || token.includes(\"://\")) {\n return null;\n }\n const match = token.match(/^([A-Za-z][A-Za-z0-9_-]{1,63})([:=])(.*)$/);\n if (!match) {\n return null;\n }\n const key = match[1];\n const value = match[3];\n if (value.length === 0) {\n return null;\n }\n return {\n key,\n value,\n };\n}\n\nfunction normalizeLongOptionToken(\n token: string,\n lookup: FlagLookup,\n preserve = false,\n): { tokens: string[]; event?: BootstrapNormalizationEvent } {\n if (preserve || !token.startsWith(\"--\")) {\n return { tokens: [token] };\n }\n const equalsIndex = token.indexOf(\"=\");\n const key = equalsIndex >= 0 ? token.slice(0, equalsIndex) : token;\n const inlineValue =\n equalsIndex >= 0 ? token.slice(equalsIndex + 1) : undefined;\n const resolution = resolveCanonicalFlag(key, lookup);\n if (!resolution) {\n return { tokens: [token] };\n }\n const normalizedToken =\n inlineValue === undefined\n ? resolution.flag\n : `${resolution.flag}=${inlineValue}`;\n if (normalizedToken === token) {\n return { tokens: [token] };\n }\n return {\n tokens: [normalizedToken],\n event: {\n from: token,\n to: [normalizedToken],\n reason: resolution.reason,\n confidence: resolution.confidence,\n },\n };\n}\n\n/** Locate global path-value tokens that normalization must preserve literally. */\nfunction collectBootstrapPathValueIndices(argv: string[]): Set<number> {\n const indices = new Set<number>();\n let expectsValue = false;\n for (let index = 0; index < argv.length; index += 1) {\n if (expectsValue) {\n indices.add(index);\n expectsValue = false;\n continue;\n }\n const token = argv[index];\n expectsValue = token === \"--path\" || token === \"--pm-path\";\n }\n return indices;\n}\n\n// Global option flags whose value may legitimately begin with \"--\" (commander\n// accepts such values). Their value token must not be reinterpreted as a list\n// flag during coalescing. `--pm-path <dir>` and its legacy `--path <dir>`\n// alias are the documented cases; other globals\n// (--json/--quiet/--no-extensions/--no-pager/--profile) are boolean.\nfunction splitCanonicalListToken(\n token: string,\n): { flag: string; inlineValue?: string } | null {\n if (!token.startsWith(\"--\")) {\n return null;\n }\n const equalsIndex = token.indexOf(\"=\");\n if (equalsIndex < 0) {\n return { flag: token };\n }\n return {\n flag: token.slice(0, equalsIndex),\n inlineValue: token.slice(equalsIndex + 1),\n };\n}\n\ninterface ListFlagSlot {\n outputIndex: number;\n originalTokens: string[];\n values: string[];\n occurrences: number;\n}\n\ninterface ListFlagOccurrence {\n originalTokens: string[];\n value: string | undefined;\n consumed: number;\n}\n\ninterface ValuedListFlagOccurrence {\n originalTokens: string[];\n value: string;\n}\n\nfunction copyValueConsumingFlag(\n argv: string[],\n index: number,\n result: (string | null)[],\n): number {\n result.push(argv[index]);\n const next = argv[index + 1];\n if (typeof next === \"string\" && next !== \"--\") {\n result.push(next);\n return index + 2;\n }\n return index + 1;\n}\n\nfunction readListFlagOccurrence(\n argv: string[],\n index: number,\n parsed: { flag: string; inlineValue?: string },\n multiValueListFlags: Set<string>,\n): ListFlagOccurrence {\n if (parsed.inlineValue !== undefined) {\n return {\n originalTokens: [argv[index]],\n value: parsed.inlineValue,\n consumed: 1,\n };\n }\n\n const values: string[] = [];\n let valueIndex = index + 1;\n while (\n valueIndex < argv.length &&\n argv[valueIndex] !== \"--\" &&\n !argv[valueIndex].startsWith(\"-\") &&\n (values.length === 0 || multiValueListFlags.has(parsed.flag))\n ) {\n values.push(argv[valueIndex]);\n valueIndex += 1;\n }\n\n const consumed = values.length === 0 ? 1 : 1 + values.length;\n return {\n originalTokens: argv.slice(index, index + consumed),\n value: values.length === 0 ? undefined : values.join(\",\"),\n consumed,\n };\n}\n\nfunction recordListFlagOccurrence(\n slots: Map<string, ListFlagSlot>,\n result: (string | null)[],\n flag: string,\n occurrence: ValuedListFlagOccurrence,\n): void {\n const existing = slots.get(flag);\n if (existing) {\n existing.values.push(occurrence.value);\n existing.occurrences += 1;\n return;\n }\n\n slots.set(flag, {\n outputIndex: result.length,\n originalTokens: occurrence.originalTokens,\n values: [occurrence.value],\n occurrences: 1,\n });\n // Reserve the anchor position; finalized after the walk so we know the full\n // merged value or can restore the original token form for single uses.\n result.push(null);\n}\n\nfunction buildListFlagCoalescingSplices(\n slots: Map<string, ListFlagSlot>,\n multiValueListFlags: Set<string>,\n): {\n events: BootstrapNormalizationEvent[];\n splices: Array<{ outputIndex: number; tokens: string[] }>;\n} {\n const events: BootstrapNormalizationEvent[] = [];\n const splices: Array<{ outputIndex: number; tokens: string[] }> = [];\n for (const [flag, slot] of slots) {\n const shouldMerge =\n slot.occurrences >= 2 ||\n (multiValueListFlags.has(flag) && slot.originalTokens.length > 2);\n if (!shouldMerge) {\n splices.push({\n outputIndex: slot.outputIndex,\n tokens: slot.originalTokens,\n });\n continue;\n }\n const mergedToken = `${flag}=${slot.values.join(\",\")}`;\n splices.push({ outputIndex: slot.outputIndex, tokens: [mergedToken] });\n events.push({\n from: `${flag} (x${slot.occurrences})`,\n to: [mergedToken],\n reason: \"list_merge\",\n confidence: \"high\",\n });\n }\n return { events, splices };\n}\n\nfunction applyListFlagSplices(\n result: (string | null)[],\n splices: Array<{ outputIndex: number; tokens: string[] }>,\n): void {\n splices.sort((a, b) => b.outputIndex - a.outputIndex);\n for (const splice of splices) {\n result.splice(splice.outputIndex, 1, ...splice.tokens);\n }\n}\n\n/**\n * Coalesce repeated occurrences of comma-separated list flags into a single\n * `--flag=v1,v2,v3` token anchored at the FIRST occurrence. Without this,\n * Commander treats these flags as scalars and silently keeps only the last\n * value (data loss). Both `--flag value` and `--flag=value` forms are merged;\n * a value-less occurrence is preserved untouched, and a `--` terminator stops\n * coalescing (remainder is passed through verbatim).\n *\n * `valueConsumingFlags` lists option flags (e.g. global `--pm-path`) whose value\n * may itself begin with `--`. Their value token is emitted verbatim so a\n * list-flag-looking value (`--path --tags`) is never reinterpreted as a flag\n * nor allowed to swallow the following command/positional token.\n */\nexport function coalesceRepeatedListFlags(\n argv: string[],\n listFlags: Set<string>,\n valueConsumingFlags: Set<string> = new Set(),\n multiValueListFlags: Set<string> = new Set(),\n): { argv: string[]; events: BootstrapNormalizationEvent[] } {\n if (listFlags.size === 0) {\n return { argv: [...argv], events: [] };\n }\n\n const result: (string | null)[] = [];\n const slots = new Map<string, ListFlagSlot>();\n let index = 0;\n while (index < argv.length) {\n const token = argv[index];\n if (token === \"--\") {\n result.push(...argv.slice(index));\n break;\n }\n // A value-consuming option in space form owns the next token as its value,\n // even when that value begins with \"--\". Emit both verbatim so the value is\n // never misread as a list-flag occurrence.\n if (valueConsumingFlags.has(token)) {\n index = copyValueConsumingFlag(argv, index, result);\n continue;\n }\n const parsed = splitCanonicalListToken(token);\n if (!parsed || !listFlags.has(parsed.flag)) {\n result.push(token);\n index += 1;\n continue;\n }\n\n const occurrence = readListFlagOccurrence(\n argv,\n index,\n parsed,\n multiValueListFlags,\n );\n if (occurrence.value === undefined) {\n // Value-less occurrence: leave untouched, do not coalesce.\n result.push(token);\n index += occurrence.consumed;\n continue;\n }\n\n recordListFlagOccurrence(slots, result, parsed.flag, {\n originalTokens: occurrence.originalTokens,\n value: occurrence.value,\n });\n index += occurrence.consumed;\n }\n\n // Apply anchor splices from the end so earlier indices stay valid when a\n // single-occurrence anchor expands back into two tokens.\n const { events, splices } = buildListFlagCoalescingSplices(\n slots,\n multiValueListFlags,\n );\n applyListFlagSplices(result, splices);\n\n return { argv: result as string[], events };\n}\n\n/** Linked-test entry keys accepted in the two-token form `pm test <id> --add command \"npm test -- parser\"` (GH-191). Only entry-identity keys are merged: `command`/`cmd` name the shell command and `path` names the test file, so a single key=value entry is meaningful for them. Other structured keys (scope, env_set, assertions, ...) cannot form a valid standalone entry and are left for the normal parser to reject. `--remove` matches existing entries by `command=`/`path=` only, so `cmd` is excluded there. Key names mirror STRUCTURED_LINKED_TEST_KEYS in src/cli/commands/linked-test-entry.ts. */\nconst LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG: ReadonlyMap<\n string,\n ReadonlySet<string>\n> = new Map([\n [\"--add\", new Set([\"command\", \"cmd\", \"path\"])],\n [\"--remove\", new Set([\"command\", \"path\"])],\n]);\n\n/** Sandbox-safe linked-test commands legitimately start with env assignments (`PM_PATH=... PM_GLOBAL_PATH=... vitest run -- parser`), which look like bare key=value settings tokens. When the two preceding tokens are a linked-test flag plus a bare two-token key (`--add command <value>`), the value must be left intact for mergeLinkedTestTwoTokenEntries instead of being rewritten into a canonical flag (e.g. PM_PATH= -> --pm-path), which would silently corrupt the command into `--add command --pm-path ...`. */\nfunction isLinkedTestTwoTokenValuePosition(\n commandName: string | undefined,\n emittedTokens: readonly string[],\n): boolean {\n if (commandName !== \"test\" || emittedTokens.length < 2) {\n return false;\n }\n const key = emittedTokens[emittedTokens.length - 1];\n const flag = emittedTokens[emittedTokens.length - 2];\n const keys = LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG.get(flag);\n return keys !== undefined && keys.has(key);\n}\n\nfunction shouldPreserveBareKeyValueToken(\n commandName: string | undefined,\n emittedTokens: readonly string[],\n): boolean {\n return (\n commandName === \"search\" ||\n isLinkedTestTwoTokenValuePosition(commandName, emittedTokens)\n );\n}\n\n/** Accept the two-token linked-test form `pm test <id> --add command \"npm test -- parser\"` by merging the bare key token and its single quoted value into the documented `--add command=...` shape. Without this merge Commander binds the bare key as the option value and treats the quoted command as an excess positional, failing with \"too many arguments\" (GH-191). The merge only fires when EXACTLY ONE non-flag token follows the bare key, i.e. the value was quoted into one shell token — an unquoted multi-token value stays ambiguous (it may swallow the item id), still fails fast, and is routed to targeted quoting guidance by the commander error classifier instead. */\nexport function mergeLinkedTestTwoTokenEntries(\n argv: string[],\n commandName: string | undefined,\n trace: BootstrapNormalizationEvent[],\n): string[] {\n if (commandName !== \"test\") {\n return argv;\n }\n const result: string[] = [];\n let index = 0;\n while (index < argv.length) {\n const token = argv[index];\n if (token === \"--\") {\n result.push(...argv.slice(index));\n return result;\n }\n const keys = LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG.get(token);\n const key = keys ? argv[index + 1] : undefined;\n if (!keys || typeof key !== \"string\" || !keys.has(key)) {\n result.push(token);\n index += 1;\n continue;\n }\n let runEnd = index + 2;\n while (runEnd < argv.length && !argv[runEnd].startsWith(\"-\")) {\n runEnd += 1;\n }\n if (runEnd - (index + 2) !== 1) {\n result.push(token);\n index += 1;\n continue;\n }\n const value = argv[index + 2];\n const mergedValue = `${key}=${value}`;\n result.push(token, mergedValue);\n trace.push({\n from: `${token} ${key} ${value}`,\n to: [token, mergedValue],\n reason: \"bare_key_value\",\n confidence: \"high\",\n });\n index += 3;\n }\n return result;\n}\n\n/** Implements normalize bootstrap invocation for the public runtime surface of this module. */\nexport function normalizeBootstrapInvocation(\n argv: string[],\n): BootstrapInvocationNormalizationResult {\n const trace: BootstrapNormalizationEvent[] = [];\n const legacyNormalized = normalizeLegacyExtensionActionSyntax(argv);\n if (\n legacyNormalized.length !== argv.length ||\n legacyNormalized.some((token, index) => token !== argv[index])\n ) {\n trace.push({\n from: argv.join(\" \"),\n to: [...legacyNormalized],\n reason: \"legacy_extension_action\",\n confidence: \"high\",\n });\n }\n const aliasNormalized = rewriteCommandAlias(legacyNormalized, trace);\n const commandName = parseBootstrapCommandName(aliasNormalized);\n const commandPathName = parseBootstrapCommandPathName(aliasNormalized);\n const lookup = buildFlagLookup(commandPathName ?? commandName);\n const normalizedArgv: string[] = [];\n const pathValueIndices = collectBootstrapPathValueIndices(aliasNormalized);\n for (let index = 0; index < aliasNormalized.length; index += 1) {\n const token = aliasNormalized[index];\n if (token === \"--\") {\n normalizedArgv.push(...aliasNormalized.slice(index));\n break;\n }\n const preserveCurrentToken = pathValueIndices.has(index);\n const previous = normalizedArgv[normalizedArgv.length - 1];\n if (token.startsWith(\"--\")) {\n const normalizedToken = normalizeLongOptionToken(\n token,\n lookup,\n preserveCurrentToken,\n );\n normalizedArgv.push(...normalizedToken.tokens);\n if (normalizedToken.event) {\n trace.push(normalizedToken.event);\n }\n continue;\n }\n const bareKeyValue = parseBareKeyValueToken(token, preserveCurrentToken);\n if (\n bareKeyValue &&\n !(typeof previous === \"string\" && previous.startsWith(\"-\")) &&\n !shouldPreserveBareKeyValueToken(commandName, normalizedArgv)\n ) {\n const resolution = resolveCanonicalFlag(bareKeyValue.key, lookup);\n if (resolution) {\n const replacement = [resolution.flag, bareKeyValue.value];\n normalizedArgv.push(...replacement);\n trace.push({\n from: token,\n to: replacement,\n reason: \"bare_key_value\",\n confidence: resolution.confidence,\n });\n continue;\n }\n }\n normalizedArgv.push(token);\n }\n const linkedTestNormalized = mergeLinkedTestTwoTokenEntries(\n normalizedArgv,\n commandName,\n trace,\n );\n const coalesced = coalesceRepeatedListFlags(\n linkedTestNormalized,\n lookup.listCanonicalFlags,\n GLOBAL_VALUE_CONSUMING_FLAGS,\n commandName === \"create\" ? new Set([\"--tags\"]) : new Set(),\n );\n for (const event of coalesced.events) {\n trace.push(event);\n }\n return {\n argv: coalesced.argv,\n commandName,\n trace,\n };\n}\n\nfunction parseBootstrapCommandPathName(argv: string[]): string | undefined {\n const stripped = stripGlobalBootstrapTokens(argv);\n const first = stripped[0]?.trim().toLowerCase();\n const second = stripped[1]?.trim().toLowerCase();\n if (\n (first === \"extension\" || first === \"package\" || first === \"packages\") &&\n typeof second === \"string\" &&\n second.length > 0 &&\n !second.startsWith(\"-\")\n ) {\n return `${first} ${second}`;\n }\n return first;\n}\n\n/** Implements parse bootstrap type value for the public runtime surface of this module. */\nexport function parseBootstrapTypeValue(argv: string[]): string | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === \"--\") {\n break;\n }\n if (token === \"--type\") {\n const candidate = argv[index + 1];\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n return candidate.trim();\n }\n continue;\n }\n if (token.startsWith(\"--type=\")) {\n const candidate = token.slice(\"--type=\".length).trim();\n if (candidate.length > 0) {\n return candidate;\n }\n }\n }\n return undefined;\n}\n\n/** Public contract for test only, shared by SDK and presentation-layer consumers. */\nexport const _testOnly = {\n buildFlagLookup,\n collectBootstrapPathValueIndices,\n collectLongFlagCandidates,\n markUnambiguousFlag,\n normalizeLongOptionToken,\n resolveCanonicalFlag,\n};\n","/**\n * @module sdk/invocation-author\n *\n * Safely scopes invocation-wide mutation authors for one-shot and embedded CLI hosts.\n */\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\n\n/** Apply an optional author override and return an idempotent environment restorer. */\nexport function applyInvocationAuthorOverride(\n author: string | undefined,\n): () => void {\n if (author === undefined) {\n return () => {};\n }\n const normalizedAuthor = author.trim();\n if (normalizedAuthor.length === 0) {\n throw new PmCliError(\n \"--author requires a non-empty value.\",\n EXIT_CODE.USAGE,\n {\n code: \"missing_required_argument\",\n nextSteps: [\"Pass an explicit author identifier with --author <id>.\"],\n },\n );\n }\n const previousAuthor = process.env.PM_AUTHOR;\n process.env.PM_AUTHOR = normalizedAuthor;\n let restored = false;\n return () => {\n if (restored) {\n return;\n }\n restored = true;\n if (previousAuthor === undefined) {\n delete process.env.PM_AUTHOR;\n } else {\n process.env.PM_AUTHOR = previousAuthor;\n }\n };\n}\n","/**\n * @module sdk/cli-program\n *\n * Builds the reusable Commander root that embeds pm's universal global contracts.\n */\nimport { Command } from \"commander\";\nimport { writeStdout } from \"../core/output/output.js\";\n\n/** Create a fresh pm root program suitable for one-shot CLI or embedded hosts. */\nexport function createPmCliProgram(version: string): Command {\n return new Command()\n .name(\"pm\")\n .description(\n \"Universal, flexible, extensible, agent-optimized project management CLI for any project or programming language.\",\n )\n .version(version)\n .showHelpAfterError(false)\n .allowExcessArguments(false)\n .allowUnknownOption(false)\n .configureOutput({\n writeOut: (value) => {\n writeStdout(value);\n },\n writeErr: () => {},\n })\n .option(\"--json\", \"Output JSON instead of TOON\")\n .option(\"--quiet\", \"Suppress stdout output\")\n .option(\n \"--no-changed-fields\",\n \"Omit the changed_fields array from mutation output (keeps changed_field_count)\",\n )\n .option(\n \"--id-only\",\n \"Print only id and status for single-item mutation output\",\n )\n .option(\n \"--pm-path <dir>\",\n \"Explicit tracker storage path for this command (preferred over --path)\",\n )\n .option(\n \"--path <dir>\",\n \"Backward-compatible alias for --pm-path; this is the tracker storage path, not a workspace cwd\",\n )\n .option(\"--no-extensions\", \"Disable extension loading\")\n .option(\"--no-pager\", \"Disable pager integration for help and long output\")\n .option(\n \"--explain\",\n \"Render extended rationale and examples in help output\",\n )\n .option(\"--profile\", \"Print deterministic timing diagnostics\")\n .option(\"--author <id>\", \"Override mutation author for this invocation\")\n .exitOverride();\n}\n"],"names":["commandPathTokens"],"mappings":"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","debugId":"420c0ea0-d7a8-520d-aa8e-aa08edbdcca6"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../../core/history/projection.ts", "../../../../../../../../core/history/read.ts", "../../../../../../../../sdk/history-redact.ts", "../../../../../../../../core/history/history-rewrite.ts"],
4
- "sourcesContent": ["/**\n * @module core/history/projection\n *\n * Reconstructs verified point-in-time item states from hash-chained history.\n * Restore, SDK reads, and future VCS-style integrations share this single\n * replay kernel so read and write paths cannot disagree about a version.\n */\nimport { EXIT_CODE } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\nimport type { HistoryEntry, HistoryPatchOp } from \"../../types/index.js\";\nimport {\n EMPTY_REPLAY_DOCUMENT,\n replayHash,\n tryApplyReplayPatch,\n type ReplayDocument,\n} from \"./replay.js\";\n\n/** Describes the normalized version or timestamp selected from a history stream. */\nexport interface ResolvedHistoryTarget {\n /** Target syntax selected by the caller. */\n kind: \"version\" | \"timestamp\";\n /** Original normalized target text. */\n raw: string;\n /** Zero-based history entry selected for reconstruction. */\n historyIndex: number;\n}\n\n/** Controls caller-specific target diagnostics and future timestamp policy. */\nexport interface ResolveHistoryTargetOptions {\n /** Command concept named in agent-facing validation errors. */\n errorSubject?: \"history\" | \"restore\";\n /** Allow a timestamp after the final entry to select that final entry. */\n allowFutureTimestamp?: boolean;\n}\n\ninterface PatchFailureContext {\n patchIndex?: number;\n op?: string;\n path?: string;\n from?: string;\n reason?: string;\n}\n\n/** Find the final history entry recorded at or before a parsed timestamp. */\nfunction findHistoryIndexAtTimestamp(\n history: readonly HistoryEntry[],\n parsedTarget: number,\n): number {\n let historyIndex = -1;\n history.forEach((entry, index) => {\n const entryTimestamp = Date.parse(entry.ts);\n if (!Number.isFinite(entryTimestamp)) {\n throw new PmCliError(\n `History for this item contains invalid timestamp at entry ${index + 1}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n if (entryTimestamp <= parsedTarget) {\n historyIndex = index;\n }\n });\n return historyIndex;\n}\n\n/** Build structured target-range guidance once for every resolver error path. */\nfunction buildHistoryTargetGuidance(history: readonly HistoryEntry[]) {\n const firstTimestamp = history[0]?.ts ?? null;\n const lastTimestamp = history.at(-1)?.ts ?? null;\n const guidance = {\n code: \"history_target_out_of_range\",\n required: \"Choose a target within the available item history.\",\n why: \"Point-in-time reads and restores can only reconstruct recorded versions.\",\n examples: [] as string[],\n nextSteps: [\n \"Run pm history <id> to inspect available versions and timestamps.\",\n ],\n valid_range: {\n first_version: null as number | null,\n last_version: null as number | null,\n first_timestamp: firstTimestamp,\n last_timestamp: lastTimestamp,\n },\n };\n if (lastTimestamp !== null) {\n guidance.examples = [\"1\", String(history.length), lastTimestamp];\n guidance.valid_range.first_version = 1;\n guidance.valid_range.last_version = history.length;\n }\n return { guidance, lastTimestamp };\n}\n\n/** Extract best-effort JSON Patch position details for replay diagnostics. */\nexport function extractPatchFailureContext(\n patch: HistoryPatchOp[],\n error: unknown,\n): PatchFailureContext {\n const failure: PatchFailureContext = {};\n if (error instanceof Error && error.message.trim().length > 0) {\n failure.reason = error.message.trim();\n }\n if (typeof error !== \"object\" || error === null) {\n return failure;\n }\n const candidate = error as { index?: unknown; operation?: unknown };\n if (\n typeof candidate.index === \"number\" &&\n Number.isInteger(candidate.index) &&\n candidate.index >= 0\n ) {\n failure.patchIndex = candidate.index;\n }\n if (typeof candidate.operation === \"object\" && candidate.operation !== null) {\n const operation = candidate.operation as Record<string, unknown>;\n Object.assign(\n failure,\n Object.fromEntries(\n ([\"op\", \"path\", \"from\"] as const).flatMap((field) => {\n const value = operation[field];\n return typeof value === \"string\" ? [[field, value]] : [];\n }),\n ),\n );\n }\n if (failure.patchIndex !== undefined) {\n const fallback = patch[failure.patchIndex];\n if (fallback) {\n failure.op ??= fallback.op;\n failure.path ??= fallback.path;\n failure.from ??= fallback.from;\n }\n }\n return failure;\n}\n\n/**\n * Resolve a one-based version or ISO timestamp into a concrete history entry.\n * Errors include structured valid-range metadata for agent and SDK callers.\n */\nexport function resolveHistoryTarget(\n target: string,\n history: readonly HistoryEntry[],\n options: ResolveHistoryTargetOptions = {},\n): ResolvedHistoryTarget {\n const trimmed = target.trim();\n const errorSubject = options.errorSubject ?? \"history\";\n const errorSubjectTitle = errorSubject === \"restore\" ? \"Restore\" : \"History\";\n const { guidance, lastTimestamp } = buildHistoryTargetGuidance(history);\n if (!trimmed) {\n throw new PmCliError(\n `Missing ${errorSubject} target. Use a timestamp or version number.`,\n EXIT_CODE.USAGE,\n guidance,\n );\n }\n if (/^\\d+$/.test(trimmed)) {\n const version = Number(trimmed);\n if (\n !Number.isSafeInteger(version) ||\n version < 1 ||\n version > history.length\n ) {\n throw new PmCliError(\n `${errorSubjectTitle} version must be between 1 and ${history.length} for this item.`,\n EXIT_CODE.USAGE,\n guidance,\n );\n }\n return { kind: \"version\", raw: trimmed, historyIndex: version - 1 };\n }\n const parsedTarget = Date.parse(trimmed);\n if (!Number.isFinite(parsedTarget)) {\n throw new PmCliError(\n `Invalid ${errorSubject} target \"${target}\". Use a positive version number or ISO timestamp.`,\n EXIT_CODE.USAGE,\n guidance,\n );\n }\n const historyIndex = findHistoryIndexAtTimestamp(history, parsedTarget);\n if (\n historyIndex < 0 ||\n (options.allowFutureTimestamp !== true &&\n parsedTarget > Date.parse(lastTimestamp as string))\n ) {\n throw new PmCliError(\n errorSubject === \"restore\"\n ? `No history entries exist at or before timestamp ${trimmed}.`\n : `No history entry exists at timestamp ${trimmed}.`,\n EXIT_CODE.USAGE,\n guidance,\n );\n }\n return { kind: \"timestamp\", raw: trimmed, historyIndex };\n}\n\n/** Apply one normalized JSON Patch entry and retain actionable failure context. */\nexport function applyHistoryPatch(\n current: ReplayDocument,\n patch: HistoryPatchOp[],\n entryNumber: number,\n entryOp: string,\n): ReplayDocument {\n const applied = tryApplyReplayPatch(current, patch);\n if (applied.ok) {\n return applied.document;\n }\n const failure = extractPatchFailureContext(patch, applied.error);\n const tokens = [\n `history_op=${entryOp}`,\n failure.patchIndex === undefined\n ? null\n : `patch_index=${failure.patchIndex}`,\n failure.op ? `op=${failure.op}` : null,\n failure.path ? `path=${failure.path}` : null,\n failure.from ? `from=${failure.from}` : null,\n ].filter((token): token is string => token !== null);\n throw new PmCliError(\n `Failed to apply history patch at entry ${entryNumber} (${tokens.join(\", \")}). ${failure.reason ?? String(applied.error)}`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n}\n\n/** Replay and hash-verify a history stream through a zero-based target entry. */\nexport function replayHistoryToTarget(\n history: readonly HistoryEntry[],\n targetIndex: number,\n): ReplayDocument {\n let document: ReplayDocument = structuredClone(EMPTY_REPLAY_DOCUMENT);\n for (let index = 0; index <= targetIndex; index += 1) {\n const entry = history[index];\n if (!entry) {\n throw new PmCliError(\n `History target entry ${index + 1} does not exist.`,\n EXIT_CODE.USAGE,\n );\n }\n if (replayHash(document) !== entry.before_hash) {\n throw new PmCliError(\n `History hash mismatch before replay at entry ${index + 1}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n document = applyHistoryPatch(document, entry.patch, index + 1, entry.op);\n if (replayHash(document) !== entry.after_hash) {\n throw new PmCliError(\n `History hash mismatch after replay at entry ${index + 1}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n }\n return document;\n}\n\n/** Reject a version whose reconstructed state represents a deleted item. */\nexport function ensureMaterializedHistoryTarget(\n replayDocument: ReplayDocument,\n target: ResolvedHistoryTarget,\n): ReplayDocument {\n if (Object.keys(replayDocument.metadata).length > 0) {\n return replayDocument;\n }\n throw new PmCliError(\n `History target ${target.raw} resolves to a deleted state; choose a version or timestamp where the item exists.`,\n EXIT_CODE.USAGE,\n );\n}\n", "/**\n * @module core/history/read\n *\n * Reads append-only item history streams with conflict-marker detection,\n * extension read hooks, and line-specific JSONL diagnostics. Keeping this\n * storage primitive below both the CLI and SDK prevents public history\n * maintenance APIs from depending on presentation-layer modules.\n */\nimport { readFileIfExists } from \"../fs/fs-utils.js\";\nimport { runActiveOnReadHooks } from \"../extensions/index.js\";\nimport { EXIT_CODE } from \"../shared/constants.js\";\nimport { findFirstMergeConflictMarker } from \"../shared/conflict-markers.js\";\nimport { PmCliError } from \"../shared/errors.js\";\nimport type { HistoryEntry } from \"../../types/index.js\";\n\n/** Read and validate one item's JSONL history stream without mutating it. */\nexport async function readHistoryEntries(\n historyPath: string,\n itemId: string,\n): Promise<HistoryEntry[]> {\n const raw = await readFileIfExists(historyPath);\n if (raw === null) {\n return [];\n }\n await runActiveOnReadHooks({ path: historyPath, scope: \"project\" });\n if (raw.trim() === \"\") {\n return [];\n }\n const conflictMarker = findFirstMergeConflictMarker(raw);\n if (conflictMarker) {\n throw new PmCliError(\n `History for ${itemId} contains merge conflict markers at line ${conflictMarker.line} (${conflictMarker.marker}). Resolve <<<<<<< ======= >>>>>>> markers and retry.`,\n EXIT_CODE.GENERIC_FAILURE,\n {\n code: \"history_merge_conflict_markers_detected\",\n required: \"Repair the history stream by resolving merge-conflict markers.\",\n why: \"Conflict markers break JSONL parsing and invalidate deterministic audit history.\",\n examples: [\n `pm history ${itemId}`,\n `pm restore ${itemId} <timestamp-or-version>`,\n ],\n nextSteps: [\"Resolve or restore the history file, then rerun the command.\"],\n },\n );\n }\n\n const entries: HistoryEntry[] = [];\n for (const [index, rawLine] of raw.split(/\\r?\\n/).entries()) {\n const line = rawLine.trim();\n if (!line) {\n continue;\n }\n try {\n entries.push(JSON.parse(line) as HistoryEntry);\n } catch {\n throw new PmCliError(\n `History for ${itemId} contains invalid JSON at line ${index + 1}. Repair or restore the history stream and retry.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n }\n return entries;\n}\n", "/**\n * @module sdk/history-redact\n *\n * Implements the pm history redact command surface and its agent-facing runtime behavior.\n */\nimport fs from \"node:fs/promises\";\nimport {\n pathExists,\n readFileIfExists,\n writeFileAtomic,\n} from \"../core/fs/fs-utils.js\";\nimport { createHistoryEntry } from \"../core/history/history.js\";\nimport { executeHistoryRewrite } from \"../core/history/history-rewrite.js\";\nimport {\n EMPTY_REPLAY_DOCUMENT,\n historyEntriesToRaw,\n replayHash,\n replayToItemDocument,\n verifyHistoryChain,\n type ReplayDocument,\n} from \"../core/history/replay.js\";\nimport { applyHistoryPatch } from \"../core/history/projection.js\";\nimport { readHistoryEntries } from \"../core/history/read.js\";\nimport { normalizeItemId, normalizeRawItemId } from \"../core/item/id.js\";\nimport {\n canonicalDocument,\n serializeItemDocument,\n} from \"../core/item/item-format.js\";\nimport { resolveItemTypeRegistry } from \"../core/item/type-registry.js\";\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../core/shared/command-types.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\nimport { nowIso } from \"../core/shared/time.js\";\nimport {\n getActiveExtensionRegistrations,\n runActiveOnWriteHooks,\n} from \"../core/extensions/index.js\";\nimport { locateItem, readLocatedItem } from \"../core/store/item-store.js\";\nimport {\n getHistoryPath,\n getItemPath,\n getSettingsPath,\n resolvePmRoot,\n} from \"../core/store/paths.js\";\nimport { readSettings } from \"../core/store/settings.js\";\nimport { resolveAuthor } from \"../core/shared/author.js\";\nimport type { HistoryEntry, ItemDocument } from \"../types/index.js\";\n\n/** Documents the history redact command options payload exchanged by command, SDK, and package integrations. */\nexport interface HistoryRedactCommandOptions {\n /** Value that configures or reports literal for this contract. */\n literal?: string[] | string;\n /** Value that configures or reports regex for this contract. */\n regex?: string[] | string;\n /** Value that configures or reports replacement for this contract. */\n replacement?: string;\n /** Value that configures or reports dry run for this contract. */\n dryRun?: boolean;\n /** Value that configures or reports author for this contract. */\n author?: string;\n /** Human-readable explanation suitable for logs and agent-facing output. */\n message?: string;\n /** Value that configures or reports force for this contract. */\n force?: boolean;\n}\n\ninterface RegexRule {\n kind: \"regex\";\n source: string;\n flags: string;\n label: string;\n}\n\ninterface LiteralRule {\n kind: \"literal\";\n value: string;\n label: string;\n}\n\ntype RedactionRule = RegexRule | LiteralRule;\n\ninterface RedactionRewriteResult {\n entries: HistoryEntry[];\n finalDocument: ReplayDocument;\n entriesChanged: number;\n replacements: number;\n}\n\ninterface HistoryIntegritySnapshot {\n hashMismatchesBefore: number;\n hashMismatchesAfter: number;\n finalDocument: ReplayDocument;\n}\n\ninterface HistoryRedactCurrentItem {\n raw: string | null;\n path: string | null;\n document: ItemDocument | null;\n}\n\ninterface HistoryRedactNextItem {\n raw: string | null;\n path: string | null;\n document: ItemDocument | null;\n}\n\n/** Documents the history subject payload exchanged by command, SDK, and package integrations. */\nexport interface HistorySubject {\n /** Stable identifier used to reference this record across commands and storage. */\n id: string;\n /** Filesystem path used for history resolution. */\n historyPath: string;\n /** Value that configures or reports located for this contract. */\n located: Awaited<ReturnType<typeof locateItem>>;\n}\n\n/** Documents the history redact result payload exchanged by command, SDK, and package integrations. */\nexport interface HistoryRedactResult {\n /** Stable identifier used to reference this record across commands and storage. */\n id: string;\n /** Value that configures or reports dry run for this contract. */\n dry_run: boolean;\n /** Value that configures or reports changed for this contract. */\n changed: boolean;\n /** Value that configures or reports patterns for this contract. */\n patterns: {\n literals: string[];\n regex: string[];\n replacement: string;\n };\n /** Value that configures or reports history for this contract. */\n history: {\n path: string;\n entries_scanned: number;\n entries_changed: number;\n replacements: number;\n hash_mismatches_before: number;\n hash_mismatches_after: number;\n preexisting_hash_mismatches: number;\n audit_entry_added: boolean;\n verify_ok: boolean;\n verify_errors: string[];\n };\n /** Value that configures or reports item for this contract. */\n item: {\n existed_before: boolean;\n exists_after: boolean;\n path_before: string | null;\n path_after: string | null;\n changed: boolean;\n };\n /** Value that configures or reports warnings for this contract. */\n warnings: string[];\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\nfunction normalizeStringArrayInput(\n value: string[] | string | undefined,\n): string[] {\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n return [value];\n }\n return [];\n}\n\nfunction normalizeRegexFlags(flags: string): string {\n const unique: string[] = [];\n for (const token of flags) {\n if (!unique.includes(token)) {\n unique.push(token);\n }\n }\n if (!unique.includes(\"g\")) {\n unique.push(\"g\");\n }\n return unique.join(\"\");\n}\n\nfunction parseRegexRule(spec: string): RegexRule {\n const trimmed = spec.trim();\n if (trimmed.length === 0) {\n throw new PmCliError(\n \"history-redact --regex requires a non-empty pattern.\",\n EXIT_CODE.USAGE,\n );\n }\n\n let source = trimmed;\n let flags = \"g\";\n if (trimmed.startsWith(\"/\") && trimmed.length > 1) {\n /* c8 ignore start -- bare-slash regex literals are rejected earlier in argument validation. */\n const slashIndex = trimmed.lastIndexOf(\"/\");\n if (slashIndex > 0) {\n source = trimmed.slice(1, slashIndex);\n flags = normalizeRegexFlags(trimmed.slice(slashIndex + 1));\n }\n /* c8 ignore stop */\n }\n if (source.length === 0) {\n throw new PmCliError(\n \"history-redact --regex cannot use an empty pattern.\",\n EXIT_CODE.USAGE,\n );\n }\n try {\n new RegExp(source, flags);\n } catch (error) {\n /* c8 ignore start -- RegExp constructor failures are normalized in higher-level parser tests. */\n throw new PmCliError(\n `Invalid --regex value \"${spec}\": ${error instanceof Error ? error.message : String(error)}`,\n EXIT_CODE.USAGE,\n );\n /* c8 ignore stop */\n }\n\n return {\n kind: \"regex\",\n source,\n flags,\n label: `/${source}/${flags}`,\n };\n}\n\nfunction buildRedactionRules(\n literalInput: string[] | string | undefined,\n regexInput: string[] | string | undefined,\n): RedactionRule[] {\n const literalRules = [\n ...new Set(\n normalizeStringArrayInput(literalInput).map((entry) => entry.trim()),\n ),\n ]\n .filter((entry) => entry.length > 0)\n .map<LiteralRule>((entry) => ({\n kind: \"literal\",\n value: entry,\n label: entry,\n }));\n const regexRules = [\n ...new Set(\n normalizeStringArrayInput(regexInput).map((entry) => entry.trim()),\n ),\n ]\n .filter((entry) => entry.length > 0)\n .map(parseRegexRule);\n\n const rules = [...literalRules, ...regexRules];\n if (rules.length === 0) {\n throw new PmCliError(\n \"history-redact requires at least one matcher via --literal or --regex.\",\n EXIT_CODE.USAGE,\n {\n code: \"missing_required_argument\",\n required: \"Provide --literal <value> and/or --regex <pattern>.\",\n examples: [\n 'pm history-redact pm-a1b2 --literal \"[redacted_path_prefix]/private\"',\n 'pm history-redact pm-a1b2 --regex \"/192\\\\\\\\.168\\\\\\\\.[0-9.]+/g\" --replacement \"[scrubbed_ip]\"',\n ],\n },\n );\n }\n return rules;\n}\n\nfunction applyLiteralRule(\n value: string,\n literal: string,\n replacement: string,\n): { value: string; replacements: number } {\n if (literal.length === 0) {\n return { value, replacements: 0 };\n }\n let cursor = 0;\n let replacements = 0;\n while (cursor <= value.length) {\n const index = value.indexOf(literal, cursor);\n if (index === -1) {\n break;\n }\n replacements += 1;\n cursor = index + Math.max(1, literal.length);\n }\n if (replacements === 0) {\n return { value, replacements: 0 };\n }\n return {\n value: value.split(literal).join(replacement),\n replacements,\n };\n}\n\nfunction applyRegexRule(\n value: string,\n rule: RegexRule,\n replacement: string,\n): { value: string; replacements: number } {\n const regex = new RegExp(rule.source, rule.flags);\n const matches = [...value.matchAll(regex)];\n if (matches.length === 0) {\n return { value, replacements: 0 };\n }\n return {\n value: value.replace(regex, replacement),\n replacements: matches.length,\n };\n}\n\nfunction redactStringValue(\n value: string,\n rules: RedactionRule[],\n replacement: string,\n): { value: string; replacements: number } {\n let next = value;\n let replacements = 0;\n for (const rule of rules) {\n const result =\n rule.kind === \"literal\"\n ? applyLiteralRule(next, rule.value, replacement)\n : applyRegexRule(next, rule, replacement);\n next = result.value;\n replacements += result.replacements;\n }\n return {\n value: next,\n replacements,\n };\n}\n\nfunction redactUnknownValue(\n value: unknown,\n rules: RedactionRule[],\n replacement: string,\n): { value: unknown; replacements: number } {\n if (typeof value === \"string\") {\n return redactStringValue(value, rules, replacement);\n }\n if (Array.isArray(value)) {\n let replacements = 0;\n const nextValues = value.map((entry) => {\n const redacted = redactUnknownValue(entry, rules, replacement);\n replacements += redacted.replacements;\n return redacted.value;\n });\n return {\n value: nextValues,\n replacements,\n };\n }\n if (typeof value === \"object\" && value !== null) {\n let replacements = 0;\n const nextRecord: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n const redacted = redactUnknownValue(entry, rules, replacement);\n replacements += redacted.replacements;\n nextRecord[key] = redacted.value;\n }\n return {\n value: nextRecord,\n replacements,\n };\n }\n return {\n value,\n replacements: 0,\n };\n}\n\nfunction inspectHistoryIntegrity(\n entries: HistoryEntry[],\n): HistoryIntegritySnapshot {\n let replay = structuredClone(EMPTY_REPLAY_DOCUMENT);\n let hashMismatchesBefore = 0;\n let hashMismatchesAfter = 0;\n for (let index = 0; index < entries.length; index += 1) {\n const entry = entries[index];\n if (replayHash(replay) !== entry.before_hash) {\n hashMismatchesBefore += 1;\n }\n replay = applyHistoryPatch(replay, entry.patch, index + 1, entry.op);\n /* c8 ignore start -- after-hash mismatch branch is exercised in dedicated history integrity tests. */\n if (replayHash(replay) !== entry.after_hash) {\n hashMismatchesAfter += 1;\n }\n /* c8 ignore stop */\n }\n return {\n hashMismatchesBefore,\n hashMismatchesAfter,\n finalDocument: replay,\n };\n}\n\nfunction redactHistoryEntry(\n entry: HistoryEntry,\n rules: RedactionRule[],\n replacement: string,\n): {\n entry: HistoryEntry;\n replacements: number;\n changed: boolean;\n} {\n let replacements = 0;\n let changed = false;\n let nextMessage = entry.message;\n\n if (typeof entry.message === \"string\") {\n const redactedMessage = redactStringValue(\n entry.message,\n rules,\n replacement,\n );\n nextMessage = redactedMessage.value;\n replacements += redactedMessage.replacements;\n if (redactedMessage.replacements > 0) {\n changed = true;\n }\n }\n\n const nextPatch = entry.patch.map((operation) => {\n /* c8 ignore start -- patch operations without `value` are covered in lower-level patch adapters. */\n if (!Object.prototype.hasOwnProperty.call(operation, \"value\")) {\n return operation;\n }\n /* c8 ignore stop */\n const redactedValue = redactUnknownValue(\n operation.value,\n rules,\n replacement,\n );\n replacements += redactedValue.replacements;\n if (redactedValue.replacements > 0) {\n changed = true;\n return {\n ...operation,\n value: redactedValue.value,\n };\n }\n return operation;\n });\n\n return {\n entry: {\n ...entry,\n message: nextMessage,\n patch: nextPatch,\n },\n replacements,\n changed,\n };\n}\n\nfunction rewriteHistoryEntries(\n entries: HistoryEntry[],\n rules: RedactionRule[],\n replacement: string,\n): RedactionRewriteResult {\n let replay = structuredClone(EMPTY_REPLAY_DOCUMENT);\n let entriesChanged = 0;\n let replacements = 0;\n const rewrittenEntries: HistoryEntry[] = [];\n\n for (let index = 0; index < entries.length; index += 1) {\n const redacted = redactHistoryEntry(entries[index], rules, replacement);\n replacements += redacted.replacements;\n if (redacted.changed) {\n entriesChanged += 1;\n }\n const beforeHash = replayHash(replay);\n replay = applyHistoryPatch(\n replay,\n redacted.entry.patch,\n index + 1,\n redacted.entry.op,\n );\n const afterHash = replayHash(replay);\n rewrittenEntries.push({\n ...redacted.entry,\n before_hash: beforeHash,\n after_hash: afterHash,\n });\n }\n\n return {\n entries: rewrittenEntries,\n finalDocument: replay,\n entriesChanged,\n replacements,\n };\n}\n\nfunction hasItemMetadata(replay: ReplayDocument): boolean {\n return Object.keys(replay.metadata).length > 0;\n}\n\nasync function loadHistoryRedactCurrentItem(\n subject: HistorySubject,\n settings: Awaited<ReturnType<typeof readSettings>>,\n): Promise<HistoryRedactCurrentItem> {\n const currentItemPath = subject.located?.itemPath ?? null;\n if (!subject.located) {\n return { raw: null, path: currentItemPath, document: null };\n }\n const loaded = await readLocatedItem(subject.located, {\n schema: settings.schema,\n });\n return { raw: loaded.raw, path: currentItemPath, document: loaded.document };\n}\n\nfunction resolveHistoryRedactNextItem(params: {\n pmRoot: string;\n subject: HistorySubject;\n settings: Awaited<ReturnType<typeof readSettings>>;\n typeToFolder: Record<string, string>;\n finalDocument: ReplayDocument;\n}): HistoryRedactNextItem {\n if (!hasItemMetadata(params.finalDocument)) {\n return { raw: null, path: null, document: null };\n }\n const canonical = canonicalDocument(\n replayToItemDocument(params.finalDocument),\n { schema: params.settings.schema },\n );\n if (canonical.metadata.id !== params.subject.id) {\n throw new PmCliError(\n `history-redact would change item id from ${params.subject.id} to ${canonical.metadata.id}; narrow your patterns.`,\n EXIT_CODE.USAGE,\n );\n }\n return {\n document: canonical,\n path: getItemPath(\n params.pmRoot,\n canonical.metadata.type,\n params.subject.id,\n \"toon\",\n params.typeToFolder,\n ),\n raw: serializeItemDocument(canonical, {\n format: \"toon\",\n schema: params.settings.schema,\n }),\n };\n}\n\n/* v8 ignore start -- message passthrough/plural formatting is deterministic around covered redaction outcomes */\nfunction buildHistoryRedactMessage(\n options: HistoryRedactCommandOptions,\n rewritten: RedactionRewriteResult,\n): string {\n if (\n typeof options.message === \"string\" &&\n options.message.trim().length > 0\n ) {\n return options.message;\n }\n return `history-redact replaced ${rewritten.replacements} match(es) across ${rewritten.entriesChanged} entr${\n rewritten.entriesChanged === 1 ? \"y\" : \"ies\"\n }.`;\n}\n/* v8 ignore stop */\n\nfunction buildHistoryRedactEntries(params: {\n rewritten: RedactionRewriteResult;\n dryRun: boolean;\n changed: boolean;\n nextItemDocument: ItemDocument | null;\n author: string;\n message: string;\n}): { rewrittenEntries: HistoryEntry[]; auditEntryAdded: boolean } {\n const rewrittenEntries = [...params.rewritten.entries];\n if (params.dryRun || !params.changed) {\n return { rewrittenEntries, auditEntryAdded: false };\n }\n /* c8 ignore next -- fallback replay-to-item conversion runs only when rewritten final metadata is absent. */\n const finalDocument =\n params.nextItemDocument ??\n replayToItemDocument(params.rewritten.finalDocument);\n rewrittenEntries.push(\n createHistoryEntry({\n nowIso: nowIso(),\n author: params.author,\n op: \"history_redact\",\n before: finalDocument,\n after: finalDocument,\n message: params.message,\n }),\n );\n return { rewrittenEntries, auditEntryAdded: true };\n}\n\nasync function applyHistoryRedactRewrite(params: {\n pmRoot: string;\n subject: HistorySubject;\n settings: Awaited<ReturnType<typeof readSettings>>;\n typeRegistry: ReturnType<typeof resolveItemTypeRegistry>;\n historyRawBeforeLock: string | null;\n currentItem: HistoryRedactCurrentItem;\n nextItem: HistoryRedactNextItem;\n author: string;\n force: boolean | undefined;\n rewrittenEntries: HistoryEntry[];\n}): Promise<string[]> {\n return executeHistoryRewrite({\n pmRoot: params.pmRoot,\n subject: params.subject,\n settings: params.settings,\n typeRegistry: params.typeRegistry,\n historyRawBeforeLock: params.historyRawBeforeLock,\n currentItemRawBeforeLock: params.currentItem.raw,\n operation: \"history-redact\",\n author: params.author,\n force: params.force,\n itemDocument: params.currentItem.document,\n applyRewrite: async ({ historyRawUnderLock }) => {\n const affectedItemPaths = new Set<string>();\n if (params.currentItem.path) {\n affectedItemPaths.add(params.currentItem.path);\n }\n if (params.nextItem.path) {\n affectedItemPaths.add(params.nextItem.path);\n }\n const itemSnapshots = new Map<string, string>();\n if (params.currentItem.path && params.currentItem.raw !== null) {\n itemSnapshots.set(params.currentItem.path, params.currentItem.raw);\n }\n try {\n /* c8 ignore next -- item-write diff branch requires path and content divergence under lock races. */\n if (\n params.nextItem.path &&\n params.nextItem.raw !== null &&\n params.nextItem.raw !== params.currentItem.raw\n ) {\n await writeFileAtomic(params.nextItem.path, params.nextItem.raw);\n }\n if (\n params.currentItem.path &&\n (!params.nextItem.path ||\n params.nextItem.path !== params.currentItem.path)\n ) {\n await fs.rm(params.currentItem.path, { force: true });\n }\n await writeFileAtomic(\n params.subject.historyPath,\n historyEntriesToRaw(params.rewrittenEntries),\n );\n } catch (error) {\n await rollbackHistoryRedactRewrite(\n params.subject.historyPath,\n historyRawUnderLock,\n affectedItemPaths,\n itemSnapshots,\n );\n throw error;\n }\n },\n applyPostRewrite: async () =>\n runHistoryRedactWriteHooks(params.subject.historyPath, [\n params.nextItem.path,\n params.currentItem.path,\n ]),\n });\n}\n\nasync function rollbackHistoryRedactRewrite(\n historyPath: string,\n historyRawUnderLock: string | null,\n affectedItemPaths: Set<string>,\n itemSnapshots: Map<string, string>,\n): Promise<void> {\n /* c8 ignore start -- no-history-under-lock rollback path is exercised in lock-race integration tests. */\n if (historyRawUnderLock === null) {\n await fs.rm(historyPath, { force: true });\n } else {\n await writeFileAtomic(historyPath, historyRawUnderLock);\n }\n /* c8 ignore stop */\n for (const itemPath of affectedItemPaths) {\n const snapshot = itemSnapshots.get(itemPath);\n /* c8 ignore start -- missing snapshot rollback occurs only for create/delete race permutations. */\n if (snapshot === undefined) {\n await fs.rm(itemPath, { force: true });\n } else {\n await writeFileAtomic(itemPath, snapshot);\n }\n /* c8 ignore stop */\n }\n}\n\nasync function runHistoryRedactWriteHooks(\n historyPath: string,\n itemHookPaths: Array<string | null>,\n): Promise<string[]> {\n const hookWarnings: string[] = [];\n const uniqueItemHookPaths = new Set(\n itemHookPaths.filter((itemPath): itemPath is string => itemPath !== null),\n );\n for (const itemHookPath of uniqueItemHookPaths) {\n hookWarnings.push(\n ...(await runActiveOnWriteHooks({\n path: itemHookPath,\n scope: \"project\",\n op: \"history_redact\",\n })),\n );\n }\n hookWarnings.push(\n ...(await runActiveOnWriteHooks({\n path: historyPath,\n scope: \"project\",\n op: \"history_redact:history\",\n })),\n );\n return hookWarnings;\n}\n\n/** Implements resolve history subject for the public runtime surface of this module. */\nexport async function resolveHistorySubject(\n pmRoot: string,\n id: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n typeToFolder: Record<string, string>,\n): Promise<HistorySubject> {\n const located = await locateItem(\n pmRoot,\n id,\n settings.id_prefix,\n settings.item_format,\n typeToFolder,\n );\n if (located) {\n return {\n id: located.id,\n historyPath: getHistoryPath(pmRoot, located.id),\n located,\n };\n }\n\n const normalizedId = normalizeItemId(id, settings.id_prefix);\n const rawNormalizedId = normalizeRawItemId(id);\n const candidateIds =\n normalizedId === rawNormalizedId\n ? [normalizedId]\n : [normalizedId, rawNormalizedId];\n for (const candidateId of candidateIds) {\n const historyPath = getHistoryPath(pmRoot, candidateId);\n if (await pathExists(historyPath)) {\n return {\n id: candidateId,\n historyPath,\n located: null,\n };\n }\n }\n throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);\n}\n\n/** Implements run history redact for the public runtime surface of this module. */\nexport async function runHistoryRedact(\n id: string,\n options: HistoryRedactCommandOptions,\n global: GlobalOptions,\n): Promise<HistoryRedactResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(\n `Tracker is not initialized at ${pmRoot}. Run pm init first.`,\n EXIT_CODE.NOT_FOUND,\n );\n }\n\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(\n settings,\n getActiveExtensionRegistrations(),\n );\n const replacement =\n typeof options.replacement === \"string\" && options.replacement.length > 0\n ? options.replacement\n : \"[redacted]\";\n const rules = buildRedactionRules(options.literal, options.regex);\n const subject = await resolveHistorySubject(\n pmRoot,\n id,\n settings,\n typeRegistry.type_to_folder,\n );\n\n if (!(await pathExists(subject.historyPath))) {\n throw new PmCliError(\n `No history stream exists for ${subject.id}.`,\n EXIT_CODE.NOT_FOUND,\n );\n }\n const historyRawBeforeLock = await readFileIfExists(subject.historyPath);\n const historyEntries = await readHistoryEntries(\n subject.historyPath,\n subject.id,\n );\n if (historyEntries.length === 0) {\n throw new PmCliError(\n `No history entries exist for ${subject.id}; nothing to redact.`,\n EXIT_CODE.USAGE,\n );\n }\n\n const integritySnapshot = inspectHistoryIntegrity(historyEntries);\n const rewritten = rewriteHistoryEntries(historyEntries, rules, replacement);\n const preexistingHashMismatches =\n integritySnapshot.hashMismatchesBefore +\n integritySnapshot.hashMismatchesAfter;\n const dryRun = Boolean(options.dryRun);\n const changed = rewritten.replacements > 0;\n const warnings: string[] = [];\n if (preexistingHashMismatches > 0) {\n warnings.push(\n `history_redact_preexisting_hash_mismatches:${preexistingHashMismatches}`,\n );\n }\n if (!changed) {\n warnings.push(\"history_redact_no_matches\");\n }\n\n const currentItem = await loadHistoryRedactCurrentItem(subject, settings);\n const nextItem = resolveHistoryRedactNextItem({\n pmRoot,\n subject,\n settings,\n typeToFolder: typeRegistry.type_to_folder,\n finalDocument: rewritten.finalDocument,\n });\n\n const itemChanged =\n /* c8 ignore next -- null-coalescing item-path comparison branch is exercised in broader command integration coverage. */\n (currentItem.path ?? null) !== (nextItem.path ?? null) ||\n /* c8 ignore next -- null-coalescing item-content comparison branch is exercised in broader command integration coverage. */\n (currentItem.raw ?? null) !== (nextItem.raw ?? null);\n\n const author = resolveAuthor(options.author, settings.author_default);\n const redactionMessage = buildHistoryRedactMessage(options, rewritten);\n const { rewrittenEntries, auditEntryAdded } = buildHistoryRedactEntries({\n rewritten,\n dryRun,\n changed,\n nextItemDocument: nextItem.document,\n author,\n message: redactionMessage,\n });\n const historyVerify = verifyHistoryChain(rewrittenEntries);\n /* c8 ignore start -- invalid rewritten chains are covered by history verification unit tests. */\n if (!historyVerify.ok) {\n throw new PmCliError(\n `history-redact produced an invalid rewritten chain (${historyVerify.errors.join(\", \")}).`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n /* c8 ignore stop */\n\n if (!dryRun && changed) {\n warnings.push(\n ...(await applyHistoryRedactRewrite({\n pmRoot,\n subject,\n settings,\n typeRegistry,\n historyRawBeforeLock,\n currentItem,\n nextItem,\n author,\n force: options.force,\n rewrittenEntries,\n })),\n );\n }\n\n return {\n id: subject.id,\n dry_run: dryRun,\n changed,\n patterns: {\n literals: rules\n .filter((rule): rule is LiteralRule => rule.kind === \"literal\")\n .map((rule) => rule.value),\n regex: rules\n .filter((rule): rule is RegexRule => rule.kind === \"regex\")\n .map((rule) => `/${rule.source}/${rule.flags}`),\n replacement,\n },\n history: {\n path: subject.historyPath,\n entries_scanned: historyEntries.length,\n entries_changed: rewritten.entriesChanged,\n replacements: rewritten.replacements,\n hash_mismatches_before: integritySnapshot.hashMismatchesBefore,\n hash_mismatches_after: integritySnapshot.hashMismatchesAfter,\n preexisting_hash_mismatches: preexistingHashMismatches,\n audit_entry_added: auditEntryAdded,\n verify_ok: historyVerify.ok,\n verify_errors: historyVerify.errors,\n },\n item: {\n existed_before: currentItem.path !== null,\n exists_after: nextItem.path !== null,\n path_before: currentItem.path,\n path_after: nextItem.path,\n changed: itemChanged,\n },\n /* c8 ignore next -- warning dedupe ordering is covered indirectly by command-level smoke tests. */\n warnings: [...new Set(warnings)].sort((left, right) =>\n left.localeCompare(right),\n ),\n generated_at: nowIso(),\n };\n}\n\n/** Public contract for test only, shared by SDK and presentation-layer consumers. */\nexport const _testOnly = {\n applyLiteralRule,\n applyRegexRule,\n buildRedactionRules,\n hasItemMetadata,\n normalizeRegexFlags,\n normalizeStringArrayInput,\n parseRegexRule,\n redactStringValue,\n redactUnknownValue,\n};\n", "/**\n * @module core/history/history-rewrite\n *\n * Implements append-only history and replay behavior for History Rewrite.\n */\nimport fs from \"node:fs/promises\";\nimport { readFileIfExists, writeFileAtomic } from \"../fs/fs-utils.js\";\nimport type { ItemTypeRegistry } from \"../item/type-registry.js\";\nimport { acquireLock } from \"../lock/lock.js\";\nimport { EXIT_CODE } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\nimport { locateItem, readLocatedItem } from \"../store/item-store.js\";\nimport { resolveGovernanceKnobs } from \"../store/settings.js\";\nimport type { ItemDocument, PmSettings } from \"../../types/index.js\";\n\ntype LoadedItem = Awaited<ReturnType<typeof readLocatedItem>>;\ntype HistoryRawWriter = (filePath: string, content: string) => Promise<void>;\n\n/** Documents the history rewrite subject payload exchanged by command, SDK, and package integrations. */\nexport interface HistoryRewriteSubject {\n /** Stable identifier used to reference this record across commands and storage. */\n id: string;\n /** Filesystem path used for history resolution. */\n historyPath: string;\n}\n\n/** Documents the history rewrite ownership params payload exchanged by command, SDK, and package integrations. */\nexport interface HistoryRewriteOwnershipParams {\n /** Value that configures or reports item document for this contract. */\n itemDocument: ItemDocument | null;\n /** Value that configures or reports subject id for this contract. */\n subjectId: string;\n /** Value that configures or reports author for this contract. */\n author: string;\n /** Value that configures or reports force for this contract. */\n force: boolean | undefined;\n /** Value that configures or reports settings for this contract. */\n settings: PmSettings;\n}\n\n/** Apply ownership_enforcement governance to a history-rewriting operation. Returns the warning(s) the caller should append (empty when no conflict or strict-throws). Throws PmCliError(CONFLICT) in strict mode when the assignee conflicts and --force is not set. */\nexport function checkHistoryRewriteOwnership(\n params: HistoryRewriteOwnershipParams,\n): string[] {\n if (!params.itemDocument) return [];\n const assigned = params.itemDocument.metadata?.assignee?.trim();\n if (!assigned || assigned === params.author || params.force) return [];\n\n const governance = resolveGovernanceKnobs(params.settings);\n if (governance.ownership_enforcement === \"strict\") {\n throw new PmCliError(\n `Item ${params.subjectId} is assigned to ${assigned}. Use --force to override.`,\n EXIT_CODE.CONFLICT,\n );\n }\n if (governance.ownership_enforcement === \"warn\") {\n return [\n `ownership_warning:assignee_conflict:${params.subjectId}:${assigned}`,\n ];\n }\n return [];\n}\n\n/** Documents the verify history rewrite drift params payload exchanged by command, SDK, and package integrations. */\nexport interface VerifyHistoryRewriteDriftParams {\n /** Value that configures or reports pm root for this contract. */\n pmRoot: string;\n /** Value that configures or reports subject for this contract. */\n subject: HistoryRewriteSubject;\n /** Value that configures or reports settings for this contract. */\n settings: PmSettings;\n /** Value that configures or reports type registry for this contract. */\n typeRegistry: ItemTypeRegistry;\n /** Value that configures or reports history raw before lock for this contract. */\n historyRawBeforeLock: string | null;\n /** Value that configures or reports current item raw before lock for this contract. */\n currentItemRawBeforeLock: string | null;\n /** Short operation name used in the conflict message (e.g. \"history-redact\"). */\n operation: string;\n}\n\n/** Documents the verified history rewrite state payload exchanged by command, SDK, and package integrations. */\nexport interface VerifiedHistoryRewriteState {\n /** Value that configures or reports history raw under lock for this contract. */\n historyRawUnderLock: string | null;\n /** Value that configures or reports located under lock for this contract. */\n locatedUnderLock: Awaited<ReturnType<typeof locateItem>>;\n /** Value that configures or reports loaded item under lock for this contract. */\n loadedItemUnderLock: LoadedItem | null;\n}\n\n/** Re-read the history stream and the located item document under the acquired lock and compare both with the pre-lock raw snapshots. Throws PmCliError(CONFLICT) if either diverged while waiting for the lock so the caller surfaces an actionable retry. */\nexport async function verifyHistoryRewriteNoDrift(\n params: VerifyHistoryRewriteDriftParams,\n): Promise<VerifiedHistoryRewriteState> {\n const historyRawUnderLock = await readFileIfExists(\n params.subject.historyPath,\n );\n if (historyRawUnderLock !== params.historyRawBeforeLock) {\n throw new PmCliError(\n `History for ${params.subject.id} changed while waiting for lock; retry ${params.operation}.`,\n EXIT_CODE.CONFLICT,\n );\n }\n const locatedUnderLock = await locateItem(\n params.pmRoot,\n params.subject.id,\n params.settings.id_prefix,\n params.settings.item_format,\n params.typeRegistry.type_to_folder,\n );\n const loadedItemUnderLock = locatedUnderLock\n ? await readLocatedItem(locatedUnderLock, {\n schema: params.settings.schema,\n })\n : null;\n if (\n (loadedItemUnderLock?.raw ?? null) !==\n (params.currentItemRawBeforeLock ?? null)\n ) {\n throw new PmCliError(\n `Item ${params.subject.id} changed while waiting for lock; retry ${params.operation}.`,\n EXIT_CODE.CONFLICT,\n );\n }\n return { historyRawUnderLock, locatedUnderLock, loadedItemUnderLock };\n}\n\n/** Documents the execute history rewrite params payload exchanged by command, SDK, and package integrations. */\nexport interface ExecuteHistoryRewriteParams {\n /** Value that configures or reports pm root for this contract. */\n pmRoot: string;\n /** Value that configures or reports subject for this contract. */\n subject: HistoryRewriteSubject;\n /** Value that configures or reports settings for this contract. */\n settings: PmSettings;\n /** Value that configures or reports type registry for this contract. */\n typeRegistry: ItemTypeRegistry;\n /** Value that configures or reports history raw before lock for this contract. */\n historyRawBeforeLock: string | null;\n /** Value that configures or reports current item raw before lock for this contract. */\n currentItemRawBeforeLock: string | null;\n /** Short operation name used in conflict guidance (e.g. \"history-redact\"). */\n operation: string;\n /** Value that configures or reports author for this contract. */\n author: string;\n /** Value that configures or reports force for this contract. */\n force: boolean | undefined;\n /** Value that configures or reports item document for this contract. */\n itemDocument: ItemDocument | null;\n /** Value that configures or reports apply rewrite for this contract. */\n applyRewrite: (verified: VerifiedHistoryRewriteState) => Promise<void>;\n /** Value that configures or reports apply post rewrite for this contract. */\n applyPostRewrite?: (\n verified: VerifiedHistoryRewriteState,\n ) => Promise<string[]>;\n}\n\n/** Writes the rewritten history stream and restores the under-lock snapshot on failure. */\nexport async function writeHistoryRawWithRollback(params: {\n historyPath: string;\n nextHistoryRaw: string;\n historyRawUnderLock: string | null;\n writeHistoryRaw?: HistoryRawWriter;\n}): Promise<void> {\n const writeHistoryRaw = params.writeHistoryRaw ?? writeFileAtomic;\n try {\n await writeHistoryRaw(params.historyPath, params.nextHistoryRaw);\n } catch (error) {\n try {\n if (params.historyRawUnderLock === null) {\n await fs.rm(params.historyPath, { force: true });\n } else {\n await writeHistoryRaw(params.historyPath, params.historyRawUnderLock);\n }\n } catch (rollbackError) {\n throw new AggregateError(\n [error, rollbackError],\n `History rewrite failed and rollback also failed: ${String(error)}`,\n );\n }\n throw error;\n }\n}\n\n/** Shared lock/verify/ownership orchestration for history-rewrite commands. Callers provide the operation-specific write/rollback logic and optional post-write hook execution while this helper enforces the common governance + lock sequencing contract. */\nexport async function executeHistoryRewrite(\n params: ExecuteHistoryRewriteParams,\n): Promise<string[]> {\n const warnings = [\n ...checkHistoryRewriteOwnership({\n itemDocument: params.itemDocument,\n subjectId: params.subject.id,\n author: params.author,\n force: params.force,\n settings: params.settings,\n }),\n ];\n const releaseLock = await acquireLock(\n params.pmRoot,\n params.subject.id,\n params.settings.locks.ttl_seconds,\n params.author,\n Boolean(params.force),\n params.settings.governance.force_required_for_stale_lock,\n params.settings.locks.wait_ms,\n );\n try {\n const verified = await verifyHistoryRewriteNoDrift({\n pmRoot: params.pmRoot,\n subject: params.subject,\n settings: params.settings,\n typeRegistry: params.typeRegistry,\n historyRawBeforeLock: params.historyRawBeforeLock,\n currentItemRawBeforeLock: params.currentItemRawBeforeLock,\n operation: params.operation,\n });\n await params.applyRewrite(verified);\n if (params.applyPostRewrite) {\n warnings.push(...(await params.applyPostRewrite(verified)));\n }\n return warnings;\n } finally {\n await releaseLock();\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["fs", "fs", "global"]
7
- }
@@ -1,334 +0,0 @@
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]="85f534fd-62b4-5641-8729-6dcd58b50e94")}catch(e){}}();
3
- import {
4
- acquireLock,
5
- getActiveExtensionRegistrations,
6
- nowIso,
7
- readSettings,
8
- resolveGovernanceKnobs
9
- } from "./chunk-POG76WWZ.js";
10
- import {
11
- EXIT_CODE,
12
- PmCliError,
13
- getSettingsPath,
14
- pathExists,
15
- resolveItemTypeRegistry,
16
- resolvePmRoot
17
- } from "./chunk-HYW67VJ5.js";
18
-
19
- // dist/sdk/workspace.js
20
- import { readFile, writeFile } from "node:fs/promises";
21
- import path from "node:path";
22
- var PM_GITIGNORE_START = "# pm-cli:runtime-cache:start";
23
- var PM_GITIGNORE_END = "# pm-cli:runtime-cache:end";
24
- var PM_GITIGNORE_DEFAULT_TRACKER_ROOT = ".agents/pm";
25
- var PM_GITIGNORE_RUNTIME_DIRECTORIES = [
26
- "runtime/",
27
- "search/",
28
- "locks/",
29
- "transactions/",
30
- "checkpoints/"
31
- ];
32
- function normalizeTrackerRelativeRoot(trackerRelativeRoot) {
33
- return trackerRelativeRoot.replaceAll("\\", "/").replace(/^\.\/+/, "").replace(/\/+$/, "");
34
- }
35
- function isPathOutsideRoot(relativePath) {
36
- const normalized = relativePath.replaceAll("\\", "/");
37
- return path.isAbsolute(relativePath) || normalized === ".." || normalized.startsWith("../");
38
- }
39
- function getPmGitignoreBlock(trackerRelativeRoot = PM_GITIGNORE_DEFAULT_TRACKER_ROOT) {
40
- const root = normalizeTrackerRelativeRoot(trackerRelativeRoot);
41
- return [
42
- PM_GITIGNORE_START,
43
- ...PM_GITIGNORE_RUNTIME_DIRECTORIES.map((directory) => `${root}/${directory}`),
44
- PM_GITIGNORE_END
45
- ].join("\n");
46
- }
47
- async function ensurePmGitignore(workspaceRoot, options = {}) {
48
- const gitignorePath = path.join(workspaceRoot, ".gitignore");
49
- let trackerRelativeRoot = PM_GITIGNORE_DEFAULT_TRACKER_ROOT;
50
- if (options.pmRoot !== void 0) {
51
- const relative = normalizeTrackerRelativeRoot(path.relative(path.resolve(workspaceRoot), path.resolve(options.pmRoot)));
52
- if (isPathOutsideRoot(relative)) {
53
- return { path: gitignorePath, changed: false };
54
- }
55
- if (relative.length > 0) {
56
- trackerRelativeRoot = relative;
57
- }
58
- }
59
- let current = "";
60
- try {
61
- current = await readFile(gitignorePath, "utf8");
62
- } catch (error) {
63
- if (!(error instanceof Error && "code" in error && error.code === "ENOENT")) {
64
- throw error;
65
- }
66
- }
67
- const start = current.indexOf(PM_GITIGNORE_START);
68
- const end = current.indexOf(PM_GITIGNORE_END);
69
- const withoutManagedBlock = start >= 0 && end >= start ? `${current.slice(0, start)}${current.slice(end + PM_GITIGNORE_END.length)}` : current;
70
- const prefix = withoutManagedBlock.trimEnd();
71
- const next = `${prefix.length > 0 ? `${prefix}
72
-
73
- ` : ""}${getPmGitignoreBlock(trackerRelativeRoot)}
74
- `;
75
- if (next === current) {
76
- return { path: gitignorePath, changed: false };
77
- }
78
- await writeFile(gitignorePath, next, "utf8");
79
- return { path: gitignorePath, changed: true };
80
- }
81
-
82
- // dist/sdk/merge/install.js
83
- import { readFile as readFile2, writeFile as writeFile2 } from "node:fs/promises";
84
- import { execFile } from "node:child_process";
85
- import path2 from "node:path";
86
- import { promisify } from "node:util";
87
- var execFileAsync = promisify(execFile);
88
- var PM_GITATTRIBUTES_START = "# pm-cli:merge-drivers:start";
89
- var PM_GITATTRIBUTES_END = "# pm-cli:merge-drivers:end";
90
- var MERGE_FENCE_LOCK_ID = "merge-fence";
91
- var MERGE_DRIVER_DEFINITIONS = [
92
- {
93
- key: "pm-item-toon",
94
- name: "pm field-aware TOON item document merge",
95
- artifact: "item",
96
- itemPath: "item.toon"
97
- },
98
- {
99
- key: "pm-item-markdown",
100
- name: "pm field-aware JSON-markdown item document merge",
101
- artifact: "item",
102
- itemPath: "item.md"
103
- },
104
- {
105
- key: "pm-history",
106
- name: "pm append-only history stream merge",
107
- artifact: "history",
108
- itemPath: void 0
109
- },
110
- {
111
- key: "pm-relationship",
112
- name: "pm append-only relationship event store merge",
113
- artifact: "relationship",
114
- itemPath: void 0
115
- },
116
- {
117
- key: "pm-json",
118
- name: "pm key-level JSON config merge",
119
- artifact: "json",
120
- itemPath: void 0
121
- }
122
- ];
123
- async function resolveGitWorkspaceRoot(cwd) {
124
- try {
125
- const { stdout } = await execFileAsync("git", ["rev-parse", "--show-toplevel"], { cwd, encoding: "utf8", windowsHide: true, timeout: 1e4 });
126
- return stdout.trim();
127
- } catch {
128
- throw new PmCliError("pm merge install requires a git repository (merge drivers are git configuration).", EXIT_CODE.USAGE);
129
- }
130
- }
131
- function toPosixRelative(fromPath, toPath) {
132
- return path2.relative(fromPath, toPath).replaceAll("\\", "/");
133
- }
134
- function quoteGitAttributePattern(value) {
135
- return `"${value.replaceAll("\\", "\\\\").replaceAll('"', '\\"')}"`;
136
- }
137
- function buildMergeAttributePatterns(trackerRelativeRoot, typeFolders) {
138
- const prefix = trackerRelativeRoot.length > 0 ? `${trackerRelativeRoot}/` : "";
139
- const patterns = [];
140
- for (const folder of typeFolders) {
141
- patterns.push(`${quoteGitAttributePattern(`${prefix}${folder}/*.toon`)} merge=pm-item-toon`);
142
- patterns.push(`${quoteGitAttributePattern(`${prefix}${folder}/*.md`)} merge=pm-item-markdown`);
143
- }
144
- patterns.push(`${quoteGitAttributePattern(`${prefix}**/*.jsonl`)} merge=pm-relationship`);
145
- patterns.push(`${quoteGitAttributePattern(`${prefix}history/*.jsonl`)} merge=pm-history`);
146
- patterns.push(`${quoteGitAttributePattern(`${prefix}settings.json`)} merge=pm-json`);
147
- patterns.push(`${quoteGitAttributePattern(`${prefix}schema/*.json`)} merge=pm-json`);
148
- return patterns;
149
- }
150
- async function reconcileGitattributesBlock(workspaceRoot, patterns, dryRun) {
151
- const gitattributesPath = path2.join(workspaceRoot, ".gitattributes");
152
- let current = "";
153
- try {
154
- current = await readFile2(gitattributesPath, "utf8");
155
- } catch (error) {
156
- if (!(error instanceof Error && "code" in error && error.code === "ENOENT")) {
157
- throw error;
158
- }
159
- }
160
- const block = [
161
- PM_GITATTRIBUTES_START,
162
- ...patterns,
163
- PM_GITATTRIBUTES_END
164
- ].join("\n");
165
- const start = current.indexOf(PM_GITATTRIBUTES_START);
166
- const end = current.indexOf(PM_GITATTRIBUTES_END);
167
- const withoutManagedBlock = start >= 0 && end > start ? `${current.slice(0, start)}${current.slice(end + PM_GITATTRIBUTES_END.length)}` : current.replace(PM_GITATTRIBUTES_START, "").replace(PM_GITATTRIBUTES_END, "");
168
- const prefix = withoutManagedBlock.trimEnd();
169
- const next = `${prefix.length > 0 ? `${prefix}
170
-
171
- ` : ""}${block}
172
- `;
173
- if (next === current) {
174
- return { path: gitattributesPath, changed: false };
175
- }
176
- if (!dryRun) {
177
- await writeFile2(gitattributesPath, next, "utf8");
178
- }
179
- return { path: gitattributesPath, changed: true };
180
- }
181
- async function auditMergeAttributeFence(pmRoot, typeFolders) {
182
- const resolvedRoot = path2.resolve(pmRoot);
183
- let fenceDirectory = null;
184
- let fenceContent = "";
185
- let directory = resolvedRoot;
186
- for (let depth = 0; depth < 8; depth += 1) {
187
- const candidate = path2.join(directory, ".gitattributes");
188
- try {
189
- const raw = await readFile2(candidate, "utf8");
190
- if (raw.includes(PM_GITATTRIBUTES_START)) {
191
- fenceDirectory = directory;
192
- fenceContent = raw;
193
- break;
194
- }
195
- } catch {
196
- }
197
- const parent = path2.dirname(directory);
198
- if (parent === directory) {
199
- break;
200
- }
201
- directory = parent;
202
- }
203
- if (fenceDirectory === null) {
204
- return { status: "not_installed", missing_patterns: [], stale_patterns: [] };
205
- }
206
- const fencePath = path2.join(fenceDirectory, ".gitattributes");
207
- const start = fenceContent.indexOf(PM_GITATTRIBUTES_START);
208
- const end = fenceContent.indexOf(PM_GITATTRIBUTES_END);
209
- const committed = end > start ? fenceContent.slice(start + PM_GITATTRIBUTES_START.length, end).split("\n").map((line) => line.trim()).filter((line) => line.length > 0) : [];
210
- const expected = buildMergeAttributePatterns(toPosixRelative(fenceDirectory, resolvedRoot), typeFolders);
211
- const committedSet = new Set(committed);
212
- const expectedSet = new Set(expected);
213
- const missing = expected.filter((line) => !committedSet.has(line));
214
- const stale = committed.filter((line) => !expectedSet.has(line));
215
- return {
216
- status: missing.length > 0 || stale.length > 0 ? "drift" : "ok",
217
- path: fencePath,
218
- missing_patterns: missing,
219
- stale_patterns: stale
220
- };
221
- }
222
- async function refreshMergeAttributeFenceIfInstalled(pmRoot) {
223
- let workspaceRoot;
224
- try {
225
- workspaceRoot = await resolveGitWorkspaceRoot(path2.resolve(pmRoot));
226
- } catch {
227
- return { status: "no_git" };
228
- }
229
- const trackerRelativeRoot = toPosixRelative(workspaceRoot, path2.resolve(pmRoot));
230
- const lockSettings = await readSettings(pmRoot);
231
- const owner = (process.env.PM_AUTHOR ?? lockSettings.author_default).trim();
232
- const releaseLock = await acquireLock(pmRoot, MERGE_FENCE_LOCK_ID, lockSettings.locks.ttl_seconds, owner.length > 0 ? owner : "unknown", false, resolveGovernanceKnobs(lockSettings).force_required_for_stale_lock, lockSettings.locks.wait_ms);
233
- try {
234
- const gitattributesPath = path2.join(workspaceRoot, ".gitattributes");
235
- let current;
236
- try {
237
- current = await readFile2(gitattributesPath, "utf8");
238
- } catch (error) {
239
- if (error instanceof Error && "code" in error && error.code === "ENOENT") {
240
- return { status: "not_installed", path: gitattributesPath };
241
- }
242
- throw error;
243
- }
244
- if (!current.includes(PM_GITATTRIBUTES_START)) {
245
- return { status: "not_installed", path: gitattributesPath };
246
- }
247
- const settings = await readSettings(pmRoot);
248
- const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
249
- const typeFolders = [
250
- ...new Set(Object.values(typeRegistry.type_to_folder))
251
- ].sort((left, right) => left.localeCompare(right));
252
- const outcome = await reconcileGitattributesBlock(workspaceRoot, buildMergeAttributePatterns(trackerRelativeRoot, typeFolders), false);
253
- return {
254
- status: outcome.changed ? "refreshed" : "unchanged",
255
- path: outcome.path
256
- };
257
- } finally {
258
- await releaseLock();
259
- }
260
- }
261
- async function runMergeInstall(options, global) {
262
- const pmRoot = resolvePmRoot(process.cwd(), global.path);
263
- if (!await pathExists(getSettingsPath(pmRoot))) {
264
- throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
265
- }
266
- const dryRun = options.dryRun === true;
267
- const workspaceRoot = await resolveGitWorkspaceRoot(process.cwd());
268
- const trackerRelativeRoot = toPosixRelative(workspaceRoot, path2.resolve(pmRoot));
269
- if (isPathOutsideRoot(trackerRelativeRoot)) {
270
- throw new PmCliError(`Tracker root ${pmRoot} is outside the git repository ${workspaceRoot}; there is nothing to configure for this repository.`, EXIT_CODE.USAGE);
271
- }
272
- const settings = await readSettings(pmRoot);
273
- const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
274
- const typeFolders = [
275
- ...new Set(Object.values(typeRegistry.type_to_folder))
276
- ].sort((left, right) => left.localeCompare(right));
277
- const patterns = buildMergeAttributePatterns(trackerRelativeRoot, typeFolders);
278
- const gitattributes = await reconcileGitattributesBlock(workspaceRoot, patterns, dryRun);
279
- const gitConfigEntries = [];
280
- for (const definition of MERGE_DRIVER_DEFINITIONS) {
281
- gitConfigEntries.push({
282
- key: `merge.${definition.key}.name`,
283
- value: definition.name
284
- });
285
- gitConfigEntries.push({
286
- key: `merge.${definition.key}.driver`,
287
- value: `pm merge driver ${definition.artifact} "%O" "%A" "%B"${definition.itemPath === void 0 ? "" : ` --item-path ${definition.itemPath}`}`
288
- });
289
- }
290
- if (!dryRun) {
291
- for (const entry of gitConfigEntries) {
292
- await execFileAsync("git", ["config", entry.key, entry.value], {
293
- cwd: workspaceRoot,
294
- encoding: "utf8",
295
- windowsHide: true,
296
- timeout: 1e4
297
- });
298
- }
299
- }
300
- return {
301
- ok: true,
302
- dry_run: dryRun,
303
- workspace_root: workspaceRoot,
304
- gitattributes: {
305
- path: gitattributes.path,
306
- changed: gitattributes.changed,
307
- patterns
308
- },
309
- git_config: gitConfigEntries,
310
- guidance: [
311
- "Commit .gitattributes so every branch and collaborator shares the merge mapping.",
312
- 'git config is per-clone: each collaborator (and each fresh worktree/clone) runs "pm merge install" once.',
313
- 'After merging branches, run "pm validate" and, if history drift is reported, "pm history-repair --all" to reconcile item state with merged history.',
314
- "Custom item types registered later refresh this fence automatically (pm schema add-type/remove-type); rerun pm merge install only after out-of-band type-folder edits."
315
- ],
316
- generated_at: nowIso()
317
- };
318
- }
319
-
320
- export {
321
- PM_GITIGNORE_START,
322
- PM_GITIGNORE_END,
323
- getPmGitignoreBlock,
324
- ensurePmGitignore,
325
- PM_GITATTRIBUTES_START,
326
- PM_GITATTRIBUTES_END,
327
- buildMergeAttributePatterns,
328
- auditMergeAttributeFence,
329
- refreshMergeAttributeFenceIfInstalled,
330
- runMergeInstall
331
- };
332
- //# sourceMappingURL=chunk-CFHAODHQ.js.map
333
-
334
- //# debugId=85f534fd-62b4-5641-8729-6dcd58b50e94