@bloomreach/brxm-upgrade 0.1.1

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 (420) hide show
  1. package/README.md +217 -0
  2. package/dist/ai/index.d.ts +3 -0
  3. package/dist/ai/index.d.ts.map +1 -0
  4. package/dist/ai/index.js +2 -0
  5. package/dist/ai/index.js.map +1 -0
  6. package/dist/ai/providers.d.ts +27 -0
  7. package/dist/ai/providers.d.ts.map +1 -0
  8. package/dist/ai/providers.js +105 -0
  9. package/dist/ai/providers.js.map +1 -0
  10. package/dist/ai/types.d.ts +47 -0
  11. package/dist/ai/types.d.ts.map +1 -0
  12. package/dist/ai/types.js +2 -0
  13. package/dist/ai/types.js.map +1 -0
  14. package/dist/capture/change-scanner.d.ts +20 -0
  15. package/dist/capture/change-scanner.d.ts.map +1 -0
  16. package/dist/capture/change-scanner.js +71 -0
  17. package/dist/capture/change-scanner.js.map +1 -0
  18. package/dist/capture/conflict-resolver.d.ts +21 -0
  19. package/dist/capture/conflict-resolver.d.ts.map +1 -0
  20. package/dist/capture/conflict-resolver.js +45 -0
  21. package/dist/capture/conflict-resolver.js.map +1 -0
  22. package/dist/capture/critique-types.d.ts +60 -0
  23. package/dist/capture/critique-types.d.ts.map +1 -0
  24. package/dist/capture/critique-types.js +2 -0
  25. package/dist/capture/critique-types.js.map +1 -0
  26. package/dist/capture/entry-critique.d.ts +30 -0
  27. package/dist/capture/entry-critique.d.ts.map +1 -0
  28. package/dist/capture/entry-critique.js +137 -0
  29. package/dist/capture/entry-critique.js.map +1 -0
  30. package/dist/capture/entry-generator.d.ts +32 -0
  31. package/dist/capture/entry-generator.d.ts.map +1 -0
  32. package/dist/capture/entry-generator.js +209 -0
  33. package/dist/capture/entry-generator.js.map +1 -0
  34. package/dist/capture/entry-qa.d.ts +28 -0
  35. package/dist/capture/entry-qa.d.ts.map +1 -0
  36. package/dist/capture/entry-qa.js +84 -0
  37. package/dist/capture/entry-qa.js.map +1 -0
  38. package/dist/capture/entry-regeneration.d.ts +29 -0
  39. package/dist/capture/entry-regeneration.d.ts.map +1 -0
  40. package/dist/capture/entry-regeneration.js +164 -0
  41. package/dist/capture/entry-regeneration.js.map +1 -0
  42. package/dist/capture/entry-validator.d.ts +18 -0
  43. package/dist/capture/entry-validator.d.ts.map +1 -0
  44. package/dist/capture/entry-validator.js +47 -0
  45. package/dist/capture/entry-validator.js.map +1 -0
  46. package/dist/capture/heuristics.d.ts +30 -0
  47. package/dist/capture/heuristics.d.ts.map +1 -0
  48. package/dist/capture/heuristics.js +223 -0
  49. package/dist/capture/heuristics.js.map +1 -0
  50. package/dist/capture/index.d.ts +7 -0
  51. package/dist/capture/index.d.ts.map +1 -0
  52. package/dist/capture/index.js +11 -0
  53. package/dist/capture/index.js.map +1 -0
  54. package/dist/capture/quality-report.d.ts +19 -0
  55. package/dist/capture/quality-report.d.ts.map +1 -0
  56. package/dist/capture/quality-report.js +161 -0
  57. package/dist/capture/quality-report.js.map +1 -0
  58. package/dist/capture/review-flow.d.ts +37 -0
  59. package/dist/capture/review-flow.d.ts.map +1 -0
  60. package/dist/capture/review-flow.js +212 -0
  61. package/dist/capture/review-flow.js.map +1 -0
  62. package/dist/capture/types.d.ts +114 -0
  63. package/dist/capture/types.d.ts.map +1 -0
  64. package/dist/capture/types.js +2 -0
  65. package/dist/capture/types.js.map +1 -0
  66. package/dist/commands/discover.d.ts +6 -0
  67. package/dist/commands/discover.d.ts.map +1 -0
  68. package/dist/commands/discover.js +147 -0
  69. package/dist/commands/discover.js.map +1 -0
  70. package/dist/commands/execute.d.ts +12 -0
  71. package/dist/commands/execute.d.ts.map +1 -0
  72. package/dist/commands/execute.js +113 -0
  73. package/dist/commands/execute.js.map +1 -0
  74. package/dist/commands/export.d.ts +26 -0
  75. package/dist/commands/export.d.ts.map +1 -0
  76. package/dist/commands/export.js +291 -0
  77. package/dist/commands/export.js.map +1 -0
  78. package/dist/commands/finalize.d.ts +12 -0
  79. package/dist/commands/finalize.d.ts.map +1 -0
  80. package/dist/commands/finalize.js +225 -0
  81. package/dist/commands/finalize.js.map +1 -0
  82. package/dist/commands/guide.d.ts +12 -0
  83. package/dist/commands/guide.d.ts.map +1 -0
  84. package/dist/commands/guide.js +28 -0
  85. package/dist/commands/guide.js.map +1 -0
  86. package/dist/commands/index.d.ts +6 -0
  87. package/dist/commands/index.d.ts.map +1 -0
  88. package/dist/commands/index.js +22 -0
  89. package/dist/commands/index.js.map +1 -0
  90. package/dist/commands/log-change.d.ts +14 -0
  91. package/dist/commands/log-change.d.ts.map +1 -0
  92. package/dist/commands/log-change.js +243 -0
  93. package/dist/commands/log-change.js.map +1 -0
  94. package/dist/commands/plan.d.ts +12 -0
  95. package/dist/commands/plan.d.ts.map +1 -0
  96. package/dist/commands/plan.js +162 -0
  97. package/dist/commands/plan.js.map +1 -0
  98. package/dist/commands/review-manifest.d.ts +39 -0
  99. package/dist/commands/review-manifest.d.ts.map +1 -0
  100. package/dist/commands/review-manifest.js +178 -0
  101. package/dist/commands/review-manifest.js.map +1 -0
  102. package/dist/commands/setup-manifests.d.ts +12 -0
  103. package/dist/commands/setup-manifests.d.ts.map +1 -0
  104. package/dist/commands/setup-manifests.js +229 -0
  105. package/dist/commands/setup-manifests.js.map +1 -0
  106. package/dist/config/defaults.d.ts +15 -0
  107. package/dist/config/defaults.d.ts.map +1 -0
  108. package/dist/config/defaults.js +36 -0
  109. package/dist/config/defaults.js.map +1 -0
  110. package/dist/config/index.d.ts +17 -0
  111. package/dist/config/index.d.ts.map +1 -0
  112. package/dist/config/index.js +104 -0
  113. package/dist/config/index.js.map +1 -0
  114. package/dist/config/schema.d.ts +33 -0
  115. package/dist/config/schema.d.ts.map +1 -0
  116. package/dist/config/schema.js +110 -0
  117. package/dist/config/schema.js.map +1 -0
  118. package/dist/core/index.d.ts +12 -0
  119. package/dist/core/index.d.ts.map +1 -0
  120. package/dist/core/index.js +16 -0
  121. package/dist/core/index.js.map +1 -0
  122. package/dist/core/phase-manager.d.ts +53 -0
  123. package/dist/core/phase-manager.d.ts.map +1 -0
  124. package/dist/core/phase-manager.js +124 -0
  125. package/dist/core/phase-manager.js.map +1 -0
  126. package/dist/core/upgrade-state.d.ts +24 -0
  127. package/dist/core/upgrade-state.d.ts.map +1 -0
  128. package/dist/core/upgrade-state.js +32 -0
  129. package/dist/core/upgrade-state.js.map +1 -0
  130. package/dist/discovery/index.d.ts +5 -0
  131. package/dist/discovery/index.d.ts.map +1 -0
  132. package/dist/discovery/index.js +4 -0
  133. package/dist/discovery/index.js.map +1 -0
  134. package/dist/discovery/orchestrator.d.ts +46 -0
  135. package/dist/discovery/orchestrator.d.ts.map +1 -0
  136. package/dist/discovery/orchestrator.js +124 -0
  137. package/dist/discovery/orchestrator.js.map +1 -0
  138. package/dist/discovery/scanners/config-detector.d.ts +24 -0
  139. package/dist/discovery/scanners/config-detector.d.ts.map +1 -0
  140. package/dist/discovery/scanners/config-detector.js +82 -0
  141. package/dist/discovery/scanners/config-detector.js.map +1 -0
  142. package/dist/discovery/scanners/cv-scanner.d.ts +30 -0
  143. package/dist/discovery/scanners/cv-scanner.d.ts.map +1 -0
  144. package/dist/discovery/scanners/cv-scanner.js +85 -0
  145. package/dist/discovery/scanners/cv-scanner.js.map +1 -0
  146. package/dist/discovery/scanners/index.d.ts +6 -0
  147. package/dist/discovery/scanners/index.d.ts.map +1 -0
  148. package/dist/discovery/scanners/index.js +6 -0
  149. package/dist/discovery/scanners/index.js.map +1 -0
  150. package/dist/discovery/scanners/maven-scanner.d.ts +33 -0
  151. package/dist/discovery/scanners/maven-scanner.d.ts.map +1 -0
  152. package/dist/discovery/scanners/maven-scanner.js +96 -0
  153. package/dist/discovery/scanners/maven-scanner.js.map +1 -0
  154. package/dist/discovery/scanners/repo-scanner.d.ts +9 -0
  155. package/dist/discovery/scanners/repo-scanner.d.ts.map +1 -0
  156. package/dist/discovery/scanners/repo-scanner.js +80 -0
  157. package/dist/discovery/scanners/repo-scanner.js.map +1 -0
  158. package/dist/discovery/scanners/version-resolver.d.ts +45 -0
  159. package/dist/discovery/scanners/version-resolver.d.ts.map +1 -0
  160. package/dist/discovery/scanners/version-resolver.js +119 -0
  161. package/dist/discovery/scanners/version-resolver.js.map +1 -0
  162. package/dist/discovery/types.d.ts +156 -0
  163. package/dist/discovery/types.d.ts.map +1 -0
  164. package/dist/discovery/types.js +2 -0
  165. package/dist/discovery/types.js.map +1 -0
  166. package/dist/discovery/validators/index.d.ts +2 -0
  167. package/dist/discovery/validators/index.d.ts.map +1 -0
  168. package/dist/discovery/validators/index.js +2 -0
  169. package/dist/discovery/validators/index.js.map +1 -0
  170. package/dist/discovery/validators/upgrade-validator.d.ts +34 -0
  171. package/dist/discovery/validators/upgrade-validator.d.ts.map +1 -0
  172. package/dist/discovery/validators/upgrade-validator.js +135 -0
  173. package/dist/discovery/validators/upgrade-validator.js.map +1 -0
  174. package/dist/docs/docs-client.d.ts +44 -0
  175. package/dist/docs/docs-client.d.ts.map +1 -0
  176. package/dist/docs/docs-client.js +161 -0
  177. package/dist/docs/docs-client.js.map +1 -0
  178. package/dist/docs/docs-context.d.ts +23 -0
  179. package/dist/docs/docs-context.d.ts.map +1 -0
  180. package/dist/docs/docs-context.js +41 -0
  181. package/dist/docs/docs-context.js.map +1 -0
  182. package/dist/docs/index.d.ts +4 -0
  183. package/dist/docs/index.d.ts.map +1 -0
  184. package/dist/docs/index.js +3 -0
  185. package/dist/docs/index.js.map +1 -0
  186. package/dist/docs/types.d.ts +27 -0
  187. package/dist/docs/types.d.ts.map +1 -0
  188. package/dist/docs/types.js +2 -0
  189. package/dist/docs/types.js.map +1 -0
  190. package/dist/execution/diff-presenter.d.ts +52 -0
  191. package/dist/execution/diff-presenter.d.ts.map +1 -0
  192. package/dist/execution/diff-presenter.js +148 -0
  193. package/dist/execution/diff-presenter.js.map +1 -0
  194. package/dist/execution/executors/ai-assisted.d.ts +28 -0
  195. package/dist/execution/executors/ai-assisted.d.ts.map +1 -0
  196. package/dist/execution/executors/ai-assisted.js +226 -0
  197. package/dist/execution/executors/ai-assisted.js.map +1 -0
  198. package/dist/execution/executors/automated.d.ts +15 -0
  199. package/dist/execution/executors/automated.d.ts.map +1 -0
  200. package/dist/execution/executors/automated.js +37 -0
  201. package/dist/execution/executors/automated.js.map +1 -0
  202. package/dist/execution/executors/cv-gate.d.ts +23 -0
  203. package/dist/execution/executors/cv-gate.d.ts.map +1 -0
  204. package/dist/execution/executors/cv-gate.js +63 -0
  205. package/dist/execution/executors/cv-gate.js.map +1 -0
  206. package/dist/execution/executors/index.d.ts +7 -0
  207. package/dist/execution/executors/index.d.ts.map +1 -0
  208. package/dist/execution/executors/index.js +7 -0
  209. package/dist/execution/executors/index.js.map +1 -0
  210. package/dist/execution/executors/manual.d.ts +18 -0
  211. package/dist/execution/executors/manual.d.ts.map +1 -0
  212. package/dist/execution/executors/manual.js +31 -0
  213. package/dist/execution/executors/manual.js.map +1 -0
  214. package/dist/execution/executors/override-resolution.d.ts +27 -0
  215. package/dist/execution/executors/override-resolution.d.ts.map +1 -0
  216. package/dist/execution/executors/override-resolution.js +79 -0
  217. package/dist/execution/executors/override-resolution.js.map +1 -0
  218. package/dist/execution/executors/version-bump.d.ts +20 -0
  219. package/dist/execution/executors/version-bump.d.ts.map +1 -0
  220. package/dist/execution/executors/version-bump.js +65 -0
  221. package/dist/execution/executors/version-bump.js.map +1 -0
  222. package/dist/execution/file-transformer.d.ts +25 -0
  223. package/dist/execution/file-transformer.d.ts.map +1 -0
  224. package/dist/execution/file-transformer.js +74 -0
  225. package/dist/execution/file-transformer.js.map +1 -0
  226. package/dist/execution/index.d.ts +7 -0
  227. package/dist/execution/index.d.ts.map +1 -0
  228. package/dist/execution/index.js +9 -0
  229. package/dist/execution/index.js.map +1 -0
  230. package/dist/execution/state-manager.d.ts +27 -0
  231. package/dist/execution/state-manager.d.ts.map +1 -0
  232. package/dist/execution/state-manager.js +48 -0
  233. package/dist/execution/state-manager.js.map +1 -0
  234. package/dist/execution/step-executor.d.ts +68 -0
  235. package/dist/execution/step-executor.d.ts.map +1 -0
  236. package/dist/execution/step-executor.js +243 -0
  237. package/dist/execution/step-executor.js.map +1 -0
  238. package/dist/execution/types.d.ts +92 -0
  239. package/dist/execution/types.d.ts.map +1 -0
  240. package/dist/execution/types.js +2 -0
  241. package/dist/execution/types.js.map +1 -0
  242. package/dist/guide/GuideRunner.d.ts +62 -0
  243. package/dist/guide/GuideRunner.d.ts.map +1 -0
  244. package/dist/guide/GuideRunner.js +390 -0
  245. package/dist/guide/GuideRunner.js.map +1 -0
  246. package/dist/guide/chat/ChatContextBuilder.d.ts +44 -0
  247. package/dist/guide/chat/ChatContextBuilder.d.ts.map +1 -0
  248. package/dist/guide/chat/ChatContextBuilder.js +121 -0
  249. package/dist/guide/chat/ChatContextBuilder.js.map +1 -0
  250. package/dist/guide/chat/ChatLoop.d.ts +18 -0
  251. package/dist/guide/chat/ChatLoop.d.ts.map +1 -0
  252. package/dist/guide/chat/ChatLoop.js +59 -0
  253. package/dist/guide/chat/ChatLoop.js.map +1 -0
  254. package/dist/guide/chat/StepCoach.d.ts +22 -0
  255. package/dist/guide/chat/StepCoach.d.ts.map +1 -0
  256. package/dist/guide/chat/StepCoach.js +39 -0
  257. package/dist/guide/chat/StepCoach.js.map +1 -0
  258. package/dist/guide/chat/index.d.ts +4 -0
  259. package/dist/guide/chat/index.d.ts.map +1 -0
  260. package/dist/guide/chat/index.js +4 -0
  261. package/dist/guide/chat/index.js.map +1 -0
  262. package/dist/guide/index.d.ts +3 -0
  263. package/dist/guide/index.d.ts.map +1 -0
  264. package/dist/guide/index.js +2 -0
  265. package/dist/guide/index.js.map +1 -0
  266. package/dist/guide/phases/DiscoveryPhase.d.ts +30 -0
  267. package/dist/guide/phases/DiscoveryPhase.d.ts.map +1 -0
  268. package/dist/guide/phases/DiscoveryPhase.js +238 -0
  269. package/dist/guide/phases/DiscoveryPhase.js.map +1 -0
  270. package/dist/guide/phases/ExecutionPhase.d.ts +80 -0
  271. package/dist/guide/phases/ExecutionPhase.d.ts.map +1 -0
  272. package/dist/guide/phases/ExecutionPhase.js +574 -0
  273. package/dist/guide/phases/ExecutionPhase.js.map +1 -0
  274. package/dist/guide/phases/PlanPhase.d.ts +22 -0
  275. package/dist/guide/phases/PlanPhase.d.ts.map +1 -0
  276. package/dist/guide/phases/PlanPhase.js +200 -0
  277. package/dist/guide/phases/PlanPhase.js.map +1 -0
  278. package/dist/guide/phases/index.d.ts +4 -0
  279. package/dist/guide/phases/index.d.ts.map +1 -0
  280. package/dist/guide/phases/index.js +4 -0
  281. package/dist/guide/phases/index.js.map +1 -0
  282. package/dist/guide/rendering/formatters.d.ts +126 -0
  283. package/dist/guide/rendering/formatters.d.ts.map +1 -0
  284. package/dist/guide/rendering/formatters.js +340 -0
  285. package/dist/guide/rendering/formatters.js.map +1 -0
  286. package/dist/guide/rendering/index.d.ts +2 -0
  287. package/dist/guide/rendering/index.d.ts.map +1 -0
  288. package/dist/guide/rendering/index.js +2 -0
  289. package/dist/guide/rendering/index.js.map +1 -0
  290. package/dist/guide/rendering/platform-changes.d.ts +18 -0
  291. package/dist/guide/rendering/platform-changes.d.ts.map +1 -0
  292. package/dist/guide/rendering/platform-changes.js +86 -0
  293. package/dist/guide/rendering/platform-changes.js.map +1 -0
  294. package/dist/guide/types.d.ts +100 -0
  295. package/dist/guide/types.d.ts.map +1 -0
  296. package/dist/guide/types.js +2 -0
  297. package/dist/guide/types.js.map +1 -0
  298. package/dist/index.d.ts +3 -0
  299. package/dist/index.d.ts.map +1 -0
  300. package/dist/index.js +138 -0
  301. package/dist/index.js.map +1 -0
  302. package/dist/manifests/maven-settings.d.ts +7 -0
  303. package/dist/manifests/maven-settings.d.ts.map +1 -0
  304. package/dist/manifests/maven-settings.js +33 -0
  305. package/dist/manifests/maven-settings.js.map +1 -0
  306. package/dist/manifests/parent-properties.d.ts +12 -0
  307. package/dist/manifests/parent-properties.d.ts.map +1 -0
  308. package/dist/manifests/parent-properties.js +28 -0
  309. package/dist/manifests/parent-properties.js.map +1 -0
  310. package/dist/manifests/schema.json +198 -0
  311. package/dist/manifests/unreleased.yaml +3 -0
  312. package/dist/mcp/index.d.ts +3 -0
  313. package/dist/mcp/index.d.ts.map +1 -0
  314. package/dist/mcp/index.js +13 -0
  315. package/dist/mcp/index.js.map +1 -0
  316. package/dist/mcp/resources/index.d.ts +32 -0
  317. package/dist/mcp/resources/index.d.ts.map +1 -0
  318. package/dist/mcp/resources/index.js +55 -0
  319. package/dist/mcp/resources/index.js.map +1 -0
  320. package/dist/mcp/server.d.ts +9 -0
  321. package/dist/mcp/server.d.ts.map +1 -0
  322. package/dist/mcp/server.js +162 -0
  323. package/dist/mcp/server.js.map +1 -0
  324. package/dist/mcp/tools/complete-step.d.ts +26 -0
  325. package/dist/mcp/tools/complete-step.d.ts.map +1 -0
  326. package/dist/mcp/tools/complete-step.js +73 -0
  327. package/dist/mcp/tools/complete-step.js.map +1 -0
  328. package/dist/mcp/tools/create-upgrade-plan.d.ts +36 -0
  329. package/dist/mcp/tools/create-upgrade-plan.d.ts.map +1 -0
  330. package/dist/mcp/tools/create-upgrade-plan.js +143 -0
  331. package/dist/mcp/tools/create-upgrade-plan.js.map +1 -0
  332. package/dist/mcp/tools/discover-project.d.ts +33 -0
  333. package/dist/mcp/tools/discover-project.d.ts.map +1 -0
  334. package/dist/mcp/tools/discover-project.js +96 -0
  335. package/dist/mcp/tools/discover-project.js.map +1 -0
  336. package/dist/mcp/tools/get-next-step.d.ts +54 -0
  337. package/dist/mcp/tools/get-next-step.d.ts.map +1 -0
  338. package/dist/mcp/tools/get-next-step.js +110 -0
  339. package/dist/mcp/tools/get-next-step.js.map +1 -0
  340. package/dist/mcp/tools/get-upgrade-status.d.ts +25 -0
  341. package/dist/mcp/tools/get-upgrade-status.d.ts.map +1 -0
  342. package/dist/mcp/tools/get-upgrade-status.js +79 -0
  343. package/dist/mcp/tools/get-upgrade-status.js.map +1 -0
  344. package/dist/mcp/tools/upgrade-targets.d.ts +19 -0
  345. package/dist/mcp/tools/upgrade-targets.d.ts.map +1 -0
  346. package/dist/mcp/tools/upgrade-targets.js +132 -0
  347. package/dist/mcp/tools/upgrade-targets.js.map +1 -0
  348. package/dist/planning/ai-analyzer.d.ts +20 -0
  349. package/dist/planning/ai-analyzer.d.ts.map +1 -0
  350. package/dist/planning/ai-analyzer.js +97 -0
  351. package/dist/planning/ai-analyzer.js.map +1 -0
  352. package/dist/planning/index.d.ts +8 -0
  353. package/dist/planning/index.d.ts.map +1 -0
  354. package/dist/planning/index.js +13 -0
  355. package/dist/planning/index.js.map +1 -0
  356. package/dist/planning/manifest-loader.d.ts +54 -0
  357. package/dist/planning/manifest-loader.d.ts.map +1 -0
  358. package/dist/planning/manifest-loader.js +233 -0
  359. package/dist/planning/manifest-loader.js.map +1 -0
  360. package/dist/planning/manifest-schema.d.ts +41 -0
  361. package/dist/planning/manifest-schema.d.ts.map +1 -0
  362. package/dist/planning/manifest-schema.js +71 -0
  363. package/dist/planning/manifest-schema.js.map +1 -0
  364. package/dist/planning/override-analyzer.d.ts +12 -0
  365. package/dist/planning/override-analyzer.d.ts.map +1 -0
  366. package/dist/planning/override-analyzer.js +42 -0
  367. package/dist/planning/override-analyzer.js.map +1 -0
  368. package/dist/planning/plan-generator.d.ts +15 -0
  369. package/dist/planning/plan-generator.d.ts.map +1 -0
  370. package/dist/planning/plan-generator.js +250 -0
  371. package/dist/planning/plan-generator.js.map +1 -0
  372. package/dist/planning/project-matcher.d.ts +65 -0
  373. package/dist/planning/project-matcher.d.ts.map +1 -0
  374. package/dist/planning/project-matcher.js +265 -0
  375. package/dist/planning/project-matcher.js.map +1 -0
  376. package/dist/planning/types.d.ts +237 -0
  377. package/dist/planning/types.d.ts.map +1 -0
  378. package/dist/planning/types.js +2 -0
  379. package/dist/planning/types.js.map +1 -0
  380. package/dist/types/index.d.ts +90 -0
  381. package/dist/types/index.d.ts.map +1 -0
  382. package/dist/types/index.js +2 -0
  383. package/dist/types/index.js.map +1 -0
  384. package/dist/utils/command-helpers.d.ts +14 -0
  385. package/dist/utils/command-helpers.d.ts.map +1 -0
  386. package/dist/utils/command-helpers.js +18 -0
  387. package/dist/utils/command-helpers.js.map +1 -0
  388. package/dist/utils/diff.d.ts +42 -0
  389. package/dist/utils/diff.d.ts.map +1 -0
  390. package/dist/utils/diff.js +80 -0
  391. package/dist/utils/diff.js.map +1 -0
  392. package/dist/utils/error.d.ts +5 -0
  393. package/dist/utils/error.d.ts.map +1 -0
  394. package/dist/utils/error.js +8 -0
  395. package/dist/utils/error.js.map +1 -0
  396. package/dist/utils/fs.d.ts +50 -0
  397. package/dist/utils/fs.d.ts.map +1 -0
  398. package/dist/utils/fs.js +117 -0
  399. package/dist/utils/fs.js.map +1 -0
  400. package/dist/utils/index.d.ts +9 -0
  401. package/dist/utils/index.d.ts.map +1 -0
  402. package/dist/utils/index.js +9 -0
  403. package/dist/utils/index.js.map +1 -0
  404. package/dist/utils/logger.d.ts +31 -0
  405. package/dist/utils/logger.d.ts.map +1 -0
  406. package/dist/utils/logger.js +62 -0
  407. package/dist/utils/logger.js.map +1 -0
  408. package/dist/utils/output-writer.d.ts +26 -0
  409. package/dist/utils/output-writer.d.ts.map +1 -0
  410. package/dist/utils/output-writer.js +62 -0
  411. package/dist/utils/output-writer.js.map +1 -0
  412. package/dist/utils/pom-parser.d.ts +94 -0
  413. package/dist/utils/pom-parser.d.ts.map +1 -0
  414. package/dist/utils/pom-parser.js +120 -0
  415. package/dist/utils/pom-parser.js.map +1 -0
  416. package/dist/utils/spinner.d.ts +35 -0
  417. package/dist/utils/spinner.d.ts.map +1 -0
  418. package/dist/utils/spinner.js +46 -0
  419. package/dist/utils/spinner.js.map +1 -0
  420. package/package.json +75 -0
package/README.md ADDED
@@ -0,0 +1,217 @@
1
+ # brXM Upgrade Tool
2
+
3
+ AI-powered CLI tool for Bloomreach Experience Manager (brXM) version upgrades.
4
+
5
+ ## Overview
6
+
7
+ The brXM Upgrade Tool simplifies version upgrades by:
8
+ - **Analyzing** your project to understand its structure and customizations
9
+ - **Planning** upgrades based on version-specific manifests
10
+ - **Executing** transformations with AI assistance
11
+ - **Guiding** you through manual steps when needed
12
+
13
+ ## Installation
14
+
15
+ ### Via npx (recommended)
16
+
17
+ The package is published publicly on npmjs.com — no authentication or registry configuration required. Run from any brXM project directory:
18
+
19
+ ```bash
20
+ npx @bloomreach/brxm-upgrade discover
21
+ npx @bloomreach/brxm-upgrade plan
22
+ ```
23
+
24
+ To force a fresh fetch (bypass npx cache):
25
+
26
+ ```bash
27
+ npx --yes @bloomreach/brxm-upgrade@latest <command>
28
+ ```
29
+
30
+ ### MCP Server (Claude Code integration)
31
+
32
+ Add to your `.mcp.json`:
33
+
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "brxm-upgrade": {
38
+ "command": "npx",
39
+ "args": ["-p", "@bloomreach/brxm-upgrade", "brxm-upgrade-mcp"]
40
+ }
41
+ }
42
+ }
43
+ ```
44
+
45
+ ### From source (development)
46
+
47
+ ```bash
48
+ cd tools/brxm-upgrade
49
+ npm install
50
+ npm run build
51
+ ```
52
+
53
+ ## Quick Start
54
+
55
+ ```bash
56
+ # Navigate to your brXM project root
57
+ cd /path/to/your/brxm-project
58
+
59
+ # Check tool information
60
+ brxm-upgrade info
61
+
62
+ # Analyze your project
63
+ brxm-upgrade discover
64
+
65
+ # Generate upgrade plan
66
+ brxm-upgrade plan --to 16.3
67
+
68
+ # Execute the upgrade
69
+ brxm-upgrade execute
70
+ ```
71
+
72
+ ## Configuration
73
+
74
+ Create a `.brxmrc` file in your project root or home directory:
75
+
76
+ ```yaml
77
+ ai:
78
+ provider: anthropic
79
+ model: claude-sonnet-4-20250514
80
+ apiKeyEnv: ANTHROPIC_API_KEY
81
+
82
+ upgrade:
83
+ source: bundled
84
+
85
+ output:
86
+ verbose: false
87
+ color: true
88
+ exportPath: ./.brxm-upgrade
89
+ ```
90
+
91
+ See `fixtures/.brxmrc.example.yaml` for a complete example.
92
+
93
+ ## Supported AI Providers
94
+
95
+ The tool supports multiple AI providers (BYOK - Bring Your Own Key):
96
+
97
+ | Provider | Environment Variable | Default Model |
98
+ |----------|---------------------|---------------|
99
+ | Anthropic | `ANTHROPIC_API_KEY` | claude-sonnet-4-20250514 |
100
+ | OpenAI | `OPENAI_API_KEY` | gpt-4-turbo |
101
+ | Google | `GOOGLE_AI_API_KEY` | gemini-pro |
102
+
103
+ ## Commands
104
+
105
+ | Command | Description | Status |
106
+ |---------|-------------|--------|
107
+ | `info` | Display tool information | Available |
108
+ | `discover` | Analyze project structure | Available |
109
+ | `plan` | Generate upgrade plan | Available |
110
+ | `execute` | Execute upgrade steps | Available |
111
+ | `log-change` | Create manifest entries | Available |
112
+ | `finalize` | Promote unreleased manifest to versioned release | Available |
113
+ | `export` | Export for manual AI use | Available |
114
+
115
+ ## Release Manifest Generation
116
+
117
+ The `scripts/generate-release-manifests.sh` script generates upgrade manifests from git history. It can optionally enrich triage and documentation with Jira ticket data (summary, description, labels, comments).
118
+
119
+ ### Jira Enrichment (optional)
120
+
121
+ Set the following environment variables to enable Jira enrichment:
122
+
123
+ ```bash
124
+ export JIRA_BASE_URL="https://bloomreach.atlassian.net"
125
+ export JIRA_USER="your-email@bloomreach.com"
126
+ export JIRA_API_TOKEN="your-api-token"
127
+ ```
128
+
129
+ | Variable | Required | Description |
130
+ |----------|----------|-------------|
131
+ | `JIRA_BASE_URL` | Yes | Base URL of the Jira instance |
132
+ | `JIRA_API_TOKEN` | Yes | API token ([create one here](https://id.atlassian.com/manage-profile/security/api-tokens)) |
133
+ | `JIRA_USER` | For Cloud | Email address for Basic Auth. Omit for Bearer token auth (Data Center PATs). |
134
+
135
+ If these variables are not set, the script runs without Jira data — using only git context.
136
+
137
+ ### Usage
138
+
139
+ ```bash
140
+ # Full pipeline
141
+ ./scripts/generate-release-manifests.sh --from 16.6.0 --to 16.7.0
142
+
143
+ # Dry run (list JIRA groups only)
144
+ ./scripts/generate-release-manifests.sh --from 16.6.0 --to 16.7.0 --dry-run
145
+
146
+ # Generate change docs without running log-change
147
+ ./scripts/generate-release-manifests.sh --from 16.6.0 --to 16.7.0 --skip-log-change
148
+
149
+ # Verbose mode — save all AI prompts/responses and Jira data
150
+ ./scripts/generate-release-manifests.sh --from 16.6.0 --to 16.7.0 --verbose
151
+ ```
152
+
153
+ ### Verbose mode
154
+
155
+ Use `--verbose` (or `-v`) to save the full round-trip data for every ticket to `scripts/output/verbose/`:
156
+
157
+ | File | Content |
158
+ |------|---------|
159
+ | `CMS-12345.jira.json` | Fetched Jira issue data (summary, description, comments) |
160
+ | `CMS-12345.triage-prompt.txt` | Full prompt sent to Claude for triage |
161
+ | `CMS-12345.triage-response.txt` | Claude's triage response (JSON with decision/reason) |
162
+ | `CMS-12345.doc-prompt.txt` | Full prompt sent to Claude for change doc generation (includes diff) |
163
+ | `CMS-12345.doc-response.txt` | Claude's generated change document (markdown) |
164
+
165
+ The directory is cleared on each run. Files are already covered by `scripts/output/.gitignore`.
166
+
167
+ ## Publishing
168
+
169
+ Both the CLI tool and the manifests bundle are published manually. See **[docs/PUBLISHING.md](docs/PUBLISHING.md)** for the full maintainer runbook (prerequisites, step-by-step commands, verification, and rollback for both flows).
170
+
171
+ ## Development
172
+
173
+ ```bash
174
+ # Install dependencies
175
+ npm install
176
+
177
+ # Run in development mode
178
+ npm run dev
179
+
180
+ # Run tests
181
+ npm test
182
+
183
+ # Build for production
184
+ npm run build
185
+
186
+ # Lint code
187
+ npm run lint
188
+ ```
189
+
190
+ ### Running locally from anywhere
191
+
192
+ To run the tool from any directory without publishing to npm, add one of the following to your shell config (`~/.zshrc` or `~/.bashrc`), then reload with `source ~/.zshrc`.
193
+
194
+ **Option 1 — built output (recommended):**
195
+
196
+ Build once with `npm run build`, then point the alias at the compiled entry point:
197
+
198
+ ```bash
199
+ alias brxm-upgrade='node /absolute/path/to/brxm/tools/brxm-upgrade/dist/index.js'
200
+ ```
201
+
202
+ Rebuild after code changes: `cd /absolute/path/to/brxm/tools/brxm-upgrade && npm run build`
203
+
204
+ **Option 2 — TypeScript source via tsx (no build step):**
205
+
206
+ Use a shell function so the absolute path to `src/index.ts` is resolved at definition time, not at call time:
207
+
208
+ ```bash
209
+ BRXM_UPGRADE_DIR="/absolute/path/to/brxm/tools/brxm-upgrade"
210
+ brxm-upgrade() { node --import "$BRXM_UPGRADE_DIR/node_modules/tsx/dist/esm/index.mjs" "$BRXM_UPGRADE_DIR/src/index.ts" "$@"; }
211
+ ```
212
+
213
+ > **Note:** A plain `alias` with a relative path like `tsx src/index.ts` will fail when run from a different directory, because the path resolves against the current working directory rather than the tool directory.
214
+
215
+ ## License
216
+
217
+ Apache-2.0 - See LICENSE file for details.
@@ -0,0 +1,3 @@
1
+ export { createAIClient, getSupportedProviders, isProviderSupported, } from './providers.js';
2
+ export type { AIClient, AIClientFactory, GenerateOptions, GenerateResult, } from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,QAAQ,EACR,eAAe,EACf,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createAIClient, getSupportedProviders, isProviderSupported, } from './providers.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { AIProvider } from '../types/index.js';
2
+ import type { AIClient } from './types.js';
3
+ /**
4
+ * Get list of supported AI providers.
5
+ *
6
+ * @returns Array of supported provider identifiers
7
+ */
8
+ export declare function getSupportedProviders(): AIProvider[];
9
+ /**
10
+ * Check if a provider is supported.
11
+ *
12
+ * @param provider - Provider identifier to check
13
+ * @returns True if the provider is supported
14
+ */
15
+ export declare function isProviderSupported(provider: string): provider is AIProvider;
16
+ /**
17
+ * Create an AI client for the specified provider.
18
+ *
19
+ * @param provider - AI provider identifier
20
+ * @param model - Model identifier (provider-specific)
21
+ * @param apiKey - API key for authentication
22
+ * @param baseUrl - Optional base URL for API proxies or custom endpoints
23
+ * @returns Configured AI client
24
+ * @throws Error if provider is not supported
25
+ */
26
+ export declare function createAIClient(provider: AIProvider, model: string, apiKey: string, baseUrl?: string): AIClient;
27
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/ai/providers.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAmC,MAAM,YAAY,CAAC;AAoC5E;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,UAAU,EAAE,CAEpD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,IAAI,UAAU,CAE5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,UAAU,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,QAAQ,CA6DV"}
@@ -0,0 +1,105 @@
1
+ import { generateText } from 'ai';
2
+ import { createAnthropic } from '@ai-sdk/anthropic';
3
+ import { createOpenAI } from '@ai-sdk/openai';
4
+ import { createGoogleGenerativeAI } from '@ai-sdk/google';
5
+ /**
6
+ * Registry of supported AI providers.
7
+ * Each entry maps a provider to its SDK factory that accepts apiKey/baseURL configuration.
8
+ */
9
+ /**
10
+ * Resolve the Anthropic base URL, ensuring it ends with /v1.
11
+ * The SDK expects /v1 in the base URL (default: https://api.anthropic.com/v1),
12
+ * but ANTHROPIC_BASE_URL is commonly set without it (e.g., for LiteLLM proxies).
13
+ */
14
+ function resolveAnthropicBaseUrl(baseURL) {
15
+ const url = baseURL ?? process.env['ANTHROPIC_BASE_URL'];
16
+ if (!url)
17
+ return undefined;
18
+ return url.replace(/\/+$/, '').endsWith('/v1') ? url : url.replace(/\/+$/, '') + '/v1';
19
+ }
20
+ const providerRegistry = new Map([
21
+ ['anthropic', (model, config) => createAnthropic({ apiKey: config.apiKey, baseURL: resolveAnthropicBaseUrl(config.baseURL) })(model)],
22
+ ['openai', (model, config) => createOpenAI({ apiKey: config.apiKey, baseURL: config.baseURL })(model)],
23
+ ['google', (model, config) => createGoogleGenerativeAI({ apiKey: config.apiKey, baseURL: config.baseURL })(model)],
24
+ ]);
25
+ /**
26
+ * Get list of supported AI providers.
27
+ *
28
+ * @returns Array of supported provider identifiers
29
+ */
30
+ export function getSupportedProviders() {
31
+ return Array.from(providerRegistry.keys());
32
+ }
33
+ /**
34
+ * Check if a provider is supported.
35
+ *
36
+ * @param provider - Provider identifier to check
37
+ * @returns True if the provider is supported
38
+ */
39
+ export function isProviderSupported(provider) {
40
+ return providerRegistry.has(provider);
41
+ }
42
+ /**
43
+ * Create an AI client for the specified provider.
44
+ *
45
+ * @param provider - AI provider identifier
46
+ * @param model - Model identifier (provider-specific)
47
+ * @param apiKey - API key for authentication
48
+ * @param baseUrl - Optional base URL for API proxies or custom endpoints
49
+ * @returns Configured AI client
50
+ * @throws Error if provider is not supported
51
+ */
52
+ export function createAIClient(provider, model, apiKey, baseUrl) {
53
+ if (!isProviderSupported(provider)) {
54
+ throw new Error(`Unsupported AI provider: ${String(provider)}`);
55
+ }
56
+ // Safe to assert: isProviderSupported above guarantees the key exists.
57
+ const providerFactory = providerRegistry.get(provider);
58
+ const modelInstance = providerFactory(model, { apiKey, baseURL: baseUrl });
59
+ const client = {
60
+ provider,
61
+ model,
62
+ isConfigured() {
63
+ return Boolean(apiKey && apiKey.trim().length > 0);
64
+ },
65
+ async generate(prompt, options) {
66
+ if (!this.isConfigured()) {
67
+ throw new Error(`AI provider ${provider} is not configured. Missing API key.`);
68
+ }
69
+ try {
70
+ const result = await generateText({
71
+ model: modelInstance,
72
+ prompt,
73
+ maxOutputTokens: options?.maxTokens,
74
+ temperature: options?.temperature,
75
+ system: options?.system,
76
+ ...(options?.stopSequences && { stopSequences: options.stopSequences }),
77
+ });
78
+ return {
79
+ text: result.text,
80
+ usage: result.usage
81
+ ? {
82
+ inputTokens: result.usage.inputTokens,
83
+ outputTokens: result.usage.outputTokens,
84
+ totalTokens: result.usage.totalTokens,
85
+ }
86
+ : undefined,
87
+ finishReason: result.finishReason,
88
+ };
89
+ }
90
+ catch (error) {
91
+ const message = error instanceof Error ? error.message : 'Unknown error';
92
+ const details = error instanceof Error && 'cause' in error ? ` (cause: ${String(error.cause)})` : '';
93
+ const body = error != null && typeof error === 'object' && 'responseBody' in error
94
+ ? ` | response: ${String(error.responseBody)}`
95
+ : '';
96
+ const status = error != null && typeof error === 'object' && 'statusCode' in error
97
+ ? ` | status: ${String(error.statusCode)}`
98
+ : '';
99
+ throw new Error(`AI generation failed: ${message}${status}${body}${details}`);
100
+ }
101
+ },
102
+ };
103
+ return client;
104
+ }
105
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/ai/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { AIProvider } from '../types/index.js';
2
+ /**
3
+ * Options for AI text generation.
4
+ */
5
+ export interface GenerateOptions {
6
+ /** Maximum tokens to generate */
7
+ maxTokens?: number;
8
+ /** Temperature for randomness (0-1) */
9
+ temperature?: number;
10
+ /** System prompt to set context */
11
+ system?: string;
12
+ /** Stop sequences to end generation */
13
+ stopSequences?: string[];
14
+ }
15
+ /**
16
+ * Result of AI text generation.
17
+ */
18
+ export interface GenerateResult {
19
+ /** Generated text */
20
+ text: string;
21
+ /** Token usage statistics */
22
+ usage?: {
23
+ inputTokens: number | undefined;
24
+ outputTokens: number | undefined;
25
+ totalTokens: number | undefined;
26
+ };
27
+ /** Finish reason */
28
+ finishReason?: 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other' | 'unknown';
29
+ }
30
+ /**
31
+ * AI client interface for provider abstraction.
32
+ */
33
+ export interface AIClient {
34
+ /** Provider identifier */
35
+ provider: AIProvider;
36
+ /** Model being used */
37
+ model: string;
38
+ /** Generate text from a prompt */
39
+ generate: (prompt: string, options?: GenerateOptions) => Promise<GenerateResult>;
40
+ /** Check if the client is properly configured */
41
+ isConfigured: () => boolean;
42
+ }
43
+ /**
44
+ * Factory function type for creating AI clients.
45
+ */
46
+ export type AIClientFactory = (model: string, apiKey: string, baseUrl?: string) => AIClient;
47
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;QAChC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;QACjC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;KACjC,CAAC;IACF,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,gBAAgB,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;CACpG;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,0BAA0B;IAC1B,QAAQ,EAAE,UAAU,CAAC;IACrB,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACjF,iDAAiD;IACjD,YAAY,EAAE,MAAM,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import type { ChangeDocument, ChangeDocMetadata, AIContextTags } from './types.js';
2
+ /**
3
+ * Extract metadata (JIRA ticket, date, branch, author) from change document content.
4
+ */
5
+ export declare function extractMetadata(content: string): ChangeDocMetadata;
6
+ /**
7
+ * Extract AI Context Tags from the last YAML fenced code block in the content.
8
+ */
9
+ export declare function extractContextTags(content: string): AIContextTags;
10
+ /**
11
+ * Parse a single change document file into a structured ChangeDocument.
12
+ */
13
+ export declare function parseChangeDocument(filePath: string): Promise<ChangeDocument>;
14
+ /**
15
+ * Scan a directory for Markdown change documents and parse them all.
16
+ *
17
+ * @throws Error if the directory does not exist
18
+ */
19
+ export declare function scanChangeDocuments(changesDir: string): Promise<ChangeDocument[]>;
20
+ //# sourceMappingURL=change-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-scanner.d.ts","sourceRoot":"","sources":["../../src/capture/change-scanner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnF;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAYlE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAqBjE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAWnF;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAWvF"}
@@ -0,0 +1,71 @@
1
+ import { readdir } from 'node:fs/promises';
2
+ import { join, basename } from 'node:path';
3
+ import yaml from 'js-yaml';
4
+ import { readTextFile, pathExists } from '../utils/index.js';
5
+ /**
6
+ * Extract metadata (JIRA ticket, date, branch, author) from change document content.
7
+ */
8
+ export function extractMetadata(content) {
9
+ const jiraMatch = /\*\*JIRA\*\*:\s*([A-Z]+-\d+)/i.exec(content);
10
+ const dateMatch = /\*\*Date\*\*:\s*(\d{4}-\d{2}-\d{2})/i.exec(content);
11
+ const branchMatch = /\*\*Branch\*\*:\s*(.+)/i.exec(content);
12
+ const authorMatch = /\*\*Author\*\*:\s*(.+)/i.exec(content);
13
+ return {
14
+ jiraTicket: jiraMatch?.[1],
15
+ date: dateMatch?.[1],
16
+ branch: branchMatch?.[1]?.trim(),
17
+ author: authorMatch?.[1]?.trim(),
18
+ };
19
+ }
20
+ /**
21
+ * Extract AI Context Tags from the last YAML fenced code block in the content.
22
+ */
23
+ export function extractContextTags(content) {
24
+ const yamlBlockRegex = /```yaml\n([\s\S]*?)```/g;
25
+ let lastMatch = null;
26
+ let match;
27
+ while ((match = yamlBlockRegex.exec(content)) !== null) {
28
+ lastMatch = match;
29
+ }
30
+ if (!lastMatch?.[1]) {
31
+ return {};
32
+ }
33
+ try {
34
+ const parsed = yaml.load(lastMatch[1]);
35
+ if (typeof parsed !== 'object' || parsed === null) {
36
+ return {};
37
+ }
38
+ return parsed;
39
+ }
40
+ catch {
41
+ return {};
42
+ }
43
+ }
44
+ /**
45
+ * Parse a single change document file into a structured ChangeDocument.
46
+ */
47
+ export async function parseChangeDocument(filePath) {
48
+ const content = await readTextFile(filePath);
49
+ const filename = basename(filePath);
50
+ return {
51
+ filename,
52
+ filePath,
53
+ metadata: extractMetadata(content),
54
+ contextTags: extractContextTags(content),
55
+ content,
56
+ };
57
+ }
58
+ /**
59
+ * Scan a directory for Markdown change documents and parse them all.
60
+ *
61
+ * @throws Error if the directory does not exist
62
+ */
63
+ export async function scanChangeDocuments(changesDir) {
64
+ if (!(await pathExists(changesDir))) {
65
+ throw new Error(`Changes directory not found: ${changesDir}`);
66
+ }
67
+ const files = await readdir(changesDir);
68
+ const mdFiles = files.filter(f => f.endsWith('.md')).sort();
69
+ return Promise.all(mdFiles.map((file) => parseChangeDocument(join(changesDir, file))));
70
+ }
71
+ //# sourceMappingURL=change-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-scanner.js","sourceRoot":"","sources":["../../src/capture/change-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ManifestEntry, UpgradeManifest } from '../planning/types.js';
2
+ import type { ConflictCheckResult } from './types.js';
3
+ /**
4
+ * Check whether a JIRA ticket already has entries in the manifest.
5
+ *
6
+ * @param jiraTicket - JIRA ticket identifier (e.g., "CMS-18384"), or undefined
7
+ * @param manifest - The upgrade manifest to check against
8
+ * @returns Conflict check result with matching entries
9
+ */
10
+ export declare function checkConflict(jiraTicket: string | undefined, manifest: UpgradeManifest): ConflictCheckResult;
11
+ /**
12
+ * Resolve a conflict by either replacing existing entries or adding alongside them.
13
+ *
14
+ * @param manifest - The current upgrade manifest
15
+ * @param newEntry - The new manifest entry to add
16
+ * @param jiraTicket - The JIRA ticket that has a conflict
17
+ * @param decision - Whether to replace existing entries or add separately
18
+ * @returns A new manifest with the conflict resolved
19
+ */
20
+ export declare function resolveConflict(manifest: UpgradeManifest, newEntry: ManifestEntry, jiraTicket: string, decision: 'replace' | 'add_separate'): UpgradeManifest;
21
+ //# sourceMappingURL=conflict-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-resolver.d.ts","sourceRoot":"","sources":["../../src/capture/conflict-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,QAAQ,EAAE,eAAe,GACxB,mBAAmB,CAarB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,SAAS,GAAG,cAAc,GACnC,eAAe,CAqBjB"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Check whether a JIRA ticket already has entries in the manifest.
3
+ *
4
+ * @param jiraTicket - JIRA ticket identifier (e.g., "CMS-18384"), or undefined
5
+ * @param manifest - The upgrade manifest to check against
6
+ * @returns Conflict check result with matching entries
7
+ */
8
+ export function checkConflict(jiraTicket, manifest) {
9
+ if (!jiraTicket) {
10
+ return { hasConflict: false, existingEntries: [] };
11
+ }
12
+ const existing = manifest.entries.filter((e) => e.jira_ticket === jiraTicket);
13
+ return {
14
+ hasConflict: existing.length > 0,
15
+ existingEntries: existing,
16
+ };
17
+ }
18
+ /**
19
+ * Resolve a conflict by either replacing existing entries or adding alongside them.
20
+ *
21
+ * @param manifest - The current upgrade manifest
22
+ * @param newEntry - The new manifest entry to add
23
+ * @param jiraTicket - The JIRA ticket that has a conflict
24
+ * @param decision - Whether to replace existing entries or add separately
25
+ * @returns A new manifest with the conflict resolved
26
+ */
27
+ export function resolveConflict(manifest, newEntry, jiraTicket, decision) {
28
+ if (newEntry.jira_ticket && jiraTicket !== newEntry.jira_ticket) {
29
+ throw new Error(`Ticket mismatch: resolving for ${jiraTicket} but entry has ${newEntry.jira_ticket}`);
30
+ }
31
+ if (decision === 'replace') {
32
+ return {
33
+ ...manifest,
34
+ entries: [
35
+ ...manifest.entries.filter((e) => e.jira_ticket !== jiraTicket),
36
+ newEntry,
37
+ ],
38
+ };
39
+ }
40
+ return {
41
+ ...manifest,
42
+ entries: [...manifest.entries, newEntry],
43
+ };
44
+ }
45
+ //# sourceMappingURL=conflict-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-resolver.js","sourceRoot":"","sources":["../../src/capture/conflict-resolver.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,UAA8B,EAC9B,QAAyB;IAEzB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,UAAU,CACpC,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;QAChC,eAAe,EAAE,QAAQ;KAC1B,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAyB,EACzB,QAAuB,EACvB,UAAkB,EAClB,QAAoC;IAEpC,IAAI,QAAQ,CAAC,WAAW,IAAI,UAAU,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CACb,kCAAkC,UAAU,kBAAkB,QAAQ,CAAC,WAAW,EAAE,CACrF,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO;YACL,GAAG,QAAQ;YACX,OAAO,EAAE;gBACP,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,UAAU,CAAC;gBAC/D,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;KACzC,CAAC;AACJ,CAAC"}