@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
@@ -0,0 +1,162 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
4
+ import { dirname } from 'node:path';
5
+ import { createSpinner } from '../utils/spinner.js';
6
+ import { createLogger } from '../utils/logger.js';
7
+ import { pathExists, resolvePath } from '../utils/fs.js';
8
+ import { getApiKey } from '../config/index.js';
9
+ import { createAIClient } from '../ai/index.js';
10
+ import { loadManifestsForUpgrade, matchManifestsToProject, generatePlan, analyzeEntriesWithAI, } from '../planning/index.js';
11
+ import { DocsClient } from '../docs/index.js';
12
+ import { getCommandConfig } from '../utils/command-helpers.js';
13
+ /**
14
+ * Format an upgrade plan for CLI display.
15
+ *
16
+ * @param plan - The upgrade plan to format
17
+ * @returns Formatted string for terminal output
18
+ */
19
+ function formatPlanForDisplay(plan) {
20
+ const lines = [];
21
+ lines.push('');
22
+ lines.push(chalk.bold('='.repeat(65)));
23
+ lines.push(chalk.bold(` Upgrade Plan: ${plan.fromVersion} -> ${plan.toVersion}`));
24
+ lines.push(chalk.bold('='.repeat(65)));
25
+ const { summary } = plan;
26
+ lines.push(` Automated (${summary.automatedSteps}) ` +
27
+ `AI-Assisted (${summary.aiAssistedSteps}) ` +
28
+ `Manual (${summary.manualSteps})`);
29
+ lines.push(chalk.bold('='.repeat(65)));
30
+ lines.push('');
31
+ for (const step of plan.steps) {
32
+ const automationIcon = step.automatable === 'true'
33
+ ? chalk.green('[AUTO]')
34
+ : step.automatable === 'partial'
35
+ ? chalk.yellow('[AI]')
36
+ : chalk.blue('[MANUAL]');
37
+ const fileInfo = step.affectedFileCount > 0
38
+ ? chalk.gray(` (${step.affectedFileCount} files)`)
39
+ : '';
40
+ lines.push(`Step ${step.stepNumber}/${plan.steps.length}: ${automationIcon} ${step.entryId}${fileInfo}`);
41
+ lines.push(chalk.gray(` ${step.description}`));
42
+ }
43
+ lines.push('');
44
+ return lines.join('\n');
45
+ }
46
+ /**
47
+ * Create the plan command for generating an upgrade plan.
48
+ *
49
+ * The plan command loads project discovery, matches upgrade manifests
50
+ * against the project, optionally runs AI analysis, and produces an
51
+ * ordered upgrade plan saved to disk.
52
+ *
53
+ * @returns Configured Commander command instance
54
+ */
55
+ export function createPlanCommand() {
56
+ const command = new Command('plan')
57
+ .description('Generate an upgrade plan by matching manifests to your project')
58
+ .requiredOption('--to <version>', 'Target brXM version to upgrade to')
59
+ .option('--discovery <path>', 'Path to discovery.json', '.brxm-upgrade/discovery.json')
60
+ .option('--output <path>', 'Output path for plan.json', '.brxm-upgrade/plan.json')
61
+ .option('--no-ai', 'Disable AI analysis for partial entries')
62
+ .option('--include-all', 'Include non-applicable entries in plan')
63
+ .action(async (options) => {
64
+ const logger = createLogger();
65
+ const spinner = createSpinner();
66
+ let docsClient;
67
+ try {
68
+ const config = await getCommandConfig(command);
69
+ const discoveryPath = resolvePath(options.discovery);
70
+ const outputPath = resolvePath(options.output);
71
+ const targetVersion = options.to;
72
+ // Verify discovery file exists
73
+ if (!(await pathExists(discoveryPath))) {
74
+ logger.error(`Discovery file not found: ${discoveryPath}`);
75
+ logger.info('Run "brxm-upgrade discover" first to analyze your project.');
76
+ process.exit(1);
77
+ }
78
+ // Load project discovery
79
+ spinner.start('Loading project discovery...');
80
+ const discoveryContent = await readFile(discoveryPath, 'utf-8');
81
+ const projectContext = JSON.parse(discoveryContent);
82
+ spinner.succeed(`Loaded discovery from ${discoveryPath}`);
83
+ const fromVersion = projectContext.build.brxmVersion;
84
+ logger.info(`Planning upgrade: ${fromVersion} -> ${targetVersion}`);
85
+ // Load upgrade manifests
86
+ const manifestOptions = {
87
+ source: config.upgrade.source,
88
+ url: config.upgrade.url,
89
+ localPath: config.upgrade.localPath,
90
+ };
91
+ spinner.start('Loading upgrade manifests...');
92
+ const manifests = await loadManifestsForUpgrade(fromVersion, targetVersion, manifestOptions);
93
+ if (manifests.length === 0) {
94
+ spinner.info('No upgrade needed - already at target version.');
95
+ return;
96
+ }
97
+ const upgradePathVersions = manifests.map((m) => m.version);
98
+ const totalEntries = manifests.reduce((sum, m) => sum + m.entries.length, 0);
99
+ spinner.succeed(`Loaded ${manifests.length} manifests (${totalEntries} entries)`);
100
+ // Match manifest entries to project
101
+ spinner.start('Matching entries to your project...');
102
+ const matches = await matchManifestsToProject(manifests, projectContext, { projectRoot: projectContext.projectRoot });
103
+ const applicableMatches = matches.filter((m) => m.applies);
104
+ spinner.succeed(`Found ${applicableMatches.length} applicable changes`);
105
+ // Optional AI analysis for partial entries
106
+ let aiAnalysisEnabled = false;
107
+ if (options.ai !== false) {
108
+ const partialEntries = applicableMatches.filter((m) => m.entry.automatable === 'partial');
109
+ if (partialEntries.length > 0) {
110
+ const apiKey = getApiKey(config.ai.provider, config.ai.apiKeyEnv);
111
+ if (apiKey) {
112
+ spinner.start(`AI analyzing ${partialEntries.length} partial entries...`);
113
+ const aiClient = createAIClient(config.ai.provider, config.ai.model, apiKey, config.ai.baseUrl);
114
+ docsClient = new DocsClient({}, config.output.verbose);
115
+ const analyses = await analyzeEntriesWithAI(partialEntries.map((m) => ({
116
+ entry: m.entry,
117
+ affectedFiles: m.affectedFiles,
118
+ })), projectContext, aiClient, (completed, total) => {
119
+ spinner.text(`AI analyzing entry ${completed}/${total}...`);
120
+ }, docsClient);
121
+ for (const match of applicableMatches) {
122
+ const analysis = analyses.get(match.entry.id);
123
+ if (analysis) {
124
+ match.aiAnalysis = analysis;
125
+ }
126
+ }
127
+ aiAnalysisEnabled = true;
128
+ spinner.succeed('AI analysis complete');
129
+ }
130
+ else {
131
+ logger.warn(`AI analysis skipped - set ${config.ai.apiKeyEnv} to enable it`);
132
+ }
133
+ }
134
+ }
135
+ // Generate the upgrade plan
136
+ spinner.start('Generating upgrade plan...');
137
+ const plan = generatePlan(options.includeAll ? matches : applicableMatches, fromVersion, targetVersion, upgradePathVersions, options.discovery, { includeNonApplicable: options.includeAll });
138
+ plan.aiAnalysisEnabled = aiAnalysisEnabled;
139
+ // Write plan to disk
140
+ const outputDir = dirname(outputPath);
141
+ if (!(await pathExists(outputDir))) {
142
+ await mkdir(outputDir, { recursive: true });
143
+ }
144
+ await writeFile(outputPath, JSON.stringify(plan, null, 2), 'utf-8');
145
+ spinner.succeed(`Plan saved to ${outputPath}`);
146
+ // Display formatted plan
147
+ // eslint-disable-next-line no-console
148
+ console.log(formatPlanForDisplay(plan));
149
+ logger.success('Ready to execute? Run: brxm-upgrade execute');
150
+ }
151
+ catch (error) {
152
+ spinner.fail('Planning failed');
153
+ logger.error(error instanceof Error ? error.message : 'Unknown error');
154
+ process.exit(1);
155
+ }
156
+ finally {
157
+ await docsClient?.disconnect();
158
+ }
159
+ });
160
+ return command;
161
+ }
162
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { Command } from 'commander';
2
+ import type { AIClient } from '../ai/types.js';
3
+ import type { ManifestEntry, UpgradeManifest } from '../planning/types.js';
4
+ import type { QARecord } from '../capture/critique-types.js';
5
+ /**
6
+ * Result of running the QA pipeline against a released manifest.
7
+ */
8
+ export interface ReviewResult {
9
+ /** Markdown quality report */
10
+ report: string;
11
+ /** All final manifest entries after QA processing (may include split entries) */
12
+ patchedEntries: ManifestEntry[];
13
+ /** QA tracking records for each original entry */
14
+ qaRecords: QARecord[];
15
+ /** Original manifest metadata preserved for writing patched output */
16
+ originalManifest: UpgradeManifest;
17
+ }
18
+ /**
19
+ * Runs the QA pipeline (critique + optional regeneration + heuristic fixes) on a
20
+ * released manifest YAML file. This enables retroactive quality improvement of
21
+ * already-published manifests.
22
+ *
23
+ * For each entry, the original change document is not available, so
24
+ * `entry.description` is used as a stand-in change doc content for the critique.
25
+ *
26
+ * @param version - The manifest version to review (e.g. "16.7.0")
27
+ * @param aiClient - AI client to use for critique and regeneration
28
+ * @param manifestDir - Optional directory override; defaults to src/manifests/released/
29
+ * @returns ReviewResult with the quality report, patched entries, and QA records
30
+ */
31
+ export declare function reviewManifest(version: string, aiClient: AIClient, manifestDir?: string): Promise<ReviewResult>;
32
+ /**
33
+ * Create the review-manifest command for running the QA pipeline against a
34
+ * released manifest.
35
+ *
36
+ * @returns Configured Commander command instance
37
+ */
38
+ export declare function createReviewManifestCommand(): Command;
39
+ //# sourceMappingURL=review-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-manifest.d.ts","sourceRoot":"","sources":["../../src/commands/review-manifest.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAK3E,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,8BAA8B,CAAC;AAW7E;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,kDAAkD;IAClD,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,sEAAsE;IACtE,gBAAgB,EAAE,eAAe,CAAC;CACnC;AASD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC,CAyFvB;AAID;;;;;GAKG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAmErD"}
@@ -0,0 +1,178 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { dirname } from 'node:path';
5
+ import * as yaml from 'js-yaml';
6
+ import { Command } from 'commander';
7
+ import chalk from 'chalk';
8
+ import { critiqueEntry } from '../capture/entry-critique.js';
9
+ import { regenerateEntry } from '../capture/entry-regeneration.js';
10
+ import { applyHeuristicFixes } from '../capture/heuristics.js';
11
+ import { generateQualityReport } from '../capture/quality-report.js';
12
+ import { createLogger } from '../utils/logger.js';
13
+ import { createSpinner } from '../utils/spinner.js';
14
+ import { writeTextFile } from '../utils/fs.js';
15
+ import { getApiKey } from '../config/index.js';
16
+ import { createAIClient } from '../ai/index.js';
17
+ import { getCommandConfig } from '../utils/command-helpers.js';
18
+ const __filename = fileURLToPath(import.meta.url);
19
+ const __dirname = dirname(__filename);
20
+ /**
21
+ * Resolves the default released manifests directory relative to this module.
22
+ */
23
+ function getDefaultManifestDir() {
24
+ return join(__dirname, '..', 'manifests', 'released');
25
+ }
26
+ /**
27
+ * Runs the QA pipeline (critique + optional regeneration + heuristic fixes) on a
28
+ * released manifest YAML file. This enables retroactive quality improvement of
29
+ * already-published manifests.
30
+ *
31
+ * For each entry, the original change document is not available, so
32
+ * `entry.description` is used as a stand-in change doc content for the critique.
33
+ *
34
+ * @param version - The manifest version to review (e.g. "16.7.0")
35
+ * @param aiClient - AI client to use for critique and regeneration
36
+ * @param manifestDir - Optional directory override; defaults to src/manifests/released/
37
+ * @returns ReviewResult with the quality report, patched entries, and QA records
38
+ */
39
+ export async function reviewManifest(version, aiClient, manifestDir) {
40
+ const logger = createLogger({ prefix: 'review-manifest' });
41
+ const dir = manifestDir ?? getDefaultManifestDir();
42
+ const manifestPath = join(dir, `${version}.yaml`);
43
+ logger.info(`Loading manifest: ${manifestPath}`);
44
+ const rawContent = await readFile(manifestPath, 'utf-8');
45
+ const manifest = yaml.load(rawContent);
46
+ if (!manifest ||
47
+ typeof manifest !== 'object' ||
48
+ !Array.isArray(manifest.entries)) {
49
+ throw new Error(`Invalid manifest structure in ${manifestPath} — expected an object with an "entries" array`);
50
+ }
51
+ const typedManifest = manifest;
52
+ const entries = typedManifest.entries ?? [];
53
+ logger.info(`Processing ${entries.length} entries from manifest ${version}`);
54
+ const qaRecords = [];
55
+ const patchedEntries = [];
56
+ for (const entry of entries) {
57
+ logger.info(` Critiquing entry: ${entry.id}`);
58
+ // Use the entry description as change doc content since originals are unavailable
59
+ const changeDocContent = entry.description;
60
+ // Step 1: AI self-critique
61
+ const critique = await critiqueEntry(entry, changeDocContent, aiClient);
62
+ // Step 2: Optionally regenerate
63
+ const needsRegeneration = critique.overallQuality === 'regenerate' || critique.shouldSplit;
64
+ let finalEntries;
65
+ let regenerated = false;
66
+ if (needsRegeneration) {
67
+ logger.info(` Regenerating entry: ${entry.id} (quality=${critique.overallQuality}, split=${critique.shouldSplit})`);
68
+ finalEntries = await regenerateEntry(entry, changeDocContent, critique, aiClient);
69
+ regenerated = true;
70
+ }
71
+ else {
72
+ finalEntries = [entry];
73
+ }
74
+ // Step 3: Heuristic fixes on every final entry
75
+ const allHeuristicFixes = [];
76
+ for (const finalEntry of finalEntries) {
77
+ const fixes = applyHeuristicFixes(finalEntry);
78
+ for (const fix of fixes) {
79
+ allHeuristicFixes.push(fix.description);
80
+ }
81
+ }
82
+ // Step 4: Determine final quality
83
+ const hasHeuristicFixes = allHeuristicFixes.length > 0;
84
+ let finalQuality;
85
+ if (critique.overallQuality === 'good' && !hasHeuristicFixes && !regenerated) {
86
+ finalQuality = 'good';
87
+ }
88
+ else {
89
+ finalQuality = 'needs_improvement';
90
+ }
91
+ // Determine split metadata
92
+ const split = critique.shouldSplit && finalEntries.length > 1;
93
+ const splitCount = split ? finalEntries.length : undefined;
94
+ const qaRecord = {
95
+ entryId: entry.id,
96
+ originalEntry: entry,
97
+ critique,
98
+ regenerated,
99
+ split,
100
+ ...(splitCount !== undefined ? { splitCount } : {}),
101
+ heuristicFixes: allHeuristicFixes,
102
+ finalQuality,
103
+ };
104
+ qaRecords.push(qaRecord);
105
+ patchedEntries.push(...finalEntries);
106
+ }
107
+ // Step 5: Generate quality report
108
+ const report = generateQualityReport(version, qaRecords);
109
+ logger.success(`Review complete: ${qaRecords.length} entries processed`);
110
+ return { report, patchedEntries, qaRecords, originalManifest: typedManifest };
111
+ }
112
+ /* eslint-disable no-console */
113
+ /**
114
+ * Create the review-manifest command for running the QA pipeline against a
115
+ * released manifest.
116
+ *
117
+ * @returns Configured Commander command instance
118
+ */
119
+ export function createReviewManifestCommand() {
120
+ const command = new Command('review-manifest')
121
+ .description('Review a released manifest for quality issues using the AI QA pipeline')
122
+ .argument('<version>', 'Manifest version to review (e.g. 15.1.0)')
123
+ .option('--output <path>', 'Write patched manifest YAML to this path')
124
+ .action(async (version, options) => {
125
+ const spinner = createSpinner();
126
+ try {
127
+ // Load configuration
128
+ spinner.start('Loading configuration...');
129
+ const config = await getCommandConfig(command);
130
+ spinner.succeed('Configuration loaded');
131
+ // Initialise AI client
132
+ spinner.start('Initializing AI provider...');
133
+ const apiKey = getApiKey(config.ai.provider, config.ai.apiKeyEnv);
134
+ if (!apiKey) {
135
+ spinner.fail(`No API key found for ${config.ai.provider}.`);
136
+ console.log('AI is required for review-manifest. Set your API key and try again.');
137
+ process.exit(1);
138
+ }
139
+ const aiClient = createAIClient(config.ai.provider, config.ai.model, apiKey, config.ai.baseUrl);
140
+ spinner.succeed(`AI provider: ${config.ai.provider} (${config.ai.model})`);
141
+ // Run the QA pipeline
142
+ spinner.start(`Reviewing manifest ${version}...`);
143
+ const result = await reviewManifest(version, aiClient);
144
+ spinner.succeed(`Review complete: ${result.qaRecords.length} entries processed`);
145
+ // Print the report
146
+ console.log('');
147
+ console.log(result.report);
148
+ // Optionally write patched YAML
149
+ if (options.output) {
150
+ spinner.start(`Writing patched manifest to ${options.output}...`);
151
+ const patchedManifest = {
152
+ schema_version: result.originalManifest.schema_version,
153
+ version,
154
+ ...(result.originalManifest.release_date !== undefined
155
+ ? { release_date: result.originalManifest.release_date }
156
+ : {}),
157
+ ...(result.originalManifest.managed_properties !== undefined
158
+ ? { managed_properties: result.originalManifest.managed_properties }
159
+ : {}),
160
+ entries: result.patchedEntries,
161
+ };
162
+ const yamlContent = yaml.dump(patchedManifest, { lineWidth: 120 });
163
+ await writeTextFile(options.output, yamlContent);
164
+ spinner.succeed(`Patched manifest written to ${options.output}`);
165
+ console.log('');
166
+ console.log(chalk.green('Patched manifest saved.'));
167
+ }
168
+ }
169
+ catch (error) {
170
+ spinner.fail('review-manifest failed');
171
+ console.error(error instanceof Error ? error.message : 'Unknown error');
172
+ process.exit(1);
173
+ }
174
+ });
175
+ return command;
176
+ }
177
+ /* eslint-enable no-console */
178
+ //# sourceMappingURL=review-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-manifest.js","sourceRoot":"","sources":["../../src/commands/review-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Create the setup-manifests command for downloading and configuring brXM upgrade manifests.
4
+ *
5
+ * The command downloads the manifest ZIP from Bloomreach Nexus via Maven,
6
+ * extracts it to a local directory, and updates the .brxmrc configuration.
7
+ * If Maven or credentials are unavailable, it prints manual fallback instructions.
8
+ *
9
+ * @returns Configured Commander command instance
10
+ */
11
+ export declare function createSetupManifestsCommand(): Command;
12
+ //# sourceMappingURL=setup-manifests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-manifests.d.ts","sourceRoot":"","sources":["../../src/commands/setup-manifests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoIpC;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAyGrD"}
@@ -0,0 +1,229 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import * as yaml from 'js-yaml';
4
+ import { execSync } from 'node:child_process';
5
+ import { readdirSync } from 'node:fs';
6
+ import { mkdtemp, readFile, writeFile } from 'node:fs/promises';
7
+ import { tmpdir, homedir } from 'node:os';
8
+ import { join, resolve } from 'node:path';
9
+ import { createSpinner } from '../utils/spinner.js';
10
+ import { pathExists, ensureDir } from '../utils/fs.js';
11
+ import { findNexusCredentials } from '../manifests/maven-settings.js';
12
+ /* eslint-disable no-console */
13
+ const MAVEN_GROUP_ID = 'com.bloomreach.xm';
14
+ const MAVEN_ARTIFACT_ID = 'brxm-upgrade-manifests';
15
+ function getManualDownloadInstructions(outputDir) {
16
+ return `
17
+ ${chalk.bold('Manual setup:')}
18
+
19
+ ${chalk.dim('# Download the manifest artifact from Nexus')}
20
+ mvn dependency:copy \\
21
+ -Dartifact=${MAVEN_GROUP_ID}:${MAVEN_ARTIFACT_ID}:RELEASE:zip \\
22
+ -DoutputDirectory=.brxm-upgrade/ \\
23
+ -Dtransitive=false -q
24
+
25
+ ${chalk.dim('# Extract to your manifests directory')}
26
+ unzip .brxm-upgrade/${MAVEN_ARTIFACT_ID}-*.zip \\
27
+ -d ${outputDir}
28
+
29
+ ${chalk.dim('# Configure the tool to use local manifests')}
30
+ ${chalk.dim('# Add to .brxmrc:')}
31
+ ${chalk.gray('upgrade:')}
32
+ ${chalk.gray(' source: local')}
33
+ ${chalk.gray(` localPath: ${outputDir}`)}
34
+ `;
35
+ }
36
+ const MAVEN_CREDENTIALS_INSTRUCTIONS = `
37
+ ${chalk.yellow('Maven credentials not found.')}
38
+
39
+ To configure Nexus credentials, add a server entry to ${chalk.cyan(`${homedir()}/.m2/settings.xml`)}:
40
+
41
+ ${chalk.gray('<settings>')}
42
+ ${chalk.gray(' <servers>')}
43
+ ${chalk.gray(' <server>')}
44
+ ${chalk.gray(' <id>bloomreach-nexus</id>')}
45
+ ${chalk.gray(' <username>YOUR_USERNAME</username>')}
46
+ ${chalk.gray(' <password>YOUR_PASSWORD</password>')}
47
+ ${chalk.gray(' </server>')}
48
+ ${chalk.gray(' </servers>')}
49
+ ${chalk.gray('</settings>')}
50
+ `;
51
+ /**
52
+ * Check if mvn is available on PATH.
53
+ */
54
+ function isMavenAvailable() {
55
+ try {
56
+ execSync('mvn --version', { stdio: 'pipe' });
57
+ return true;
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ /**
64
+ * Run a Maven dependency:copy to download the manifests ZIP.
65
+ *
66
+ * @param outputDir - Directory to place the downloaded ZIP
67
+ * @param serverId - Maven server ID for authentication
68
+ */
69
+ function downloadManifestZip(outputDir, serverId) {
70
+ const artifact = `${MAVEN_GROUP_ID}:${MAVEN_ARTIFACT_ID}:RELEASE:zip`;
71
+ const serverArg = serverId ? `-Drepository.id=${serverId}` : '';
72
+ const cmd = [
73
+ 'mvn',
74
+ 'dependency:copy',
75
+ `-Dartifact=${artifact}`,
76
+ `-DoutputDirectory=${outputDir}`,
77
+ '-Dtransitive=false',
78
+ '-q',
79
+ serverArg,
80
+ ].filter(Boolean).join(' ');
81
+ execSync(cmd, { stdio: 'pipe' });
82
+ // Maven resolves RELEASE to an actual version — find the downloaded zip dynamically
83
+ const files = readdirSync(outputDir);
84
+ const zipFile = files.find((f) => f.endsWith('.zip'));
85
+ if (!zipFile) {
86
+ throw new Error('Maven download succeeded but no zip file found in output directory');
87
+ }
88
+ return join(outputDir, zipFile);
89
+ }
90
+ /**
91
+ * Extract a ZIP file to the target directory using the system unzip command.
92
+ */
93
+ function extractZip(zipPath, targetDir) {
94
+ execSync(`unzip -o ${zipPath} -d ${targetDir}`, { stdio: 'pipe' });
95
+ }
96
+ /**
97
+ * Update (or create) the .brxmrc file with the local manifest path.
98
+ *
99
+ * @param outputDir - Absolute path to the extracted manifests directory
100
+ */
101
+ async function updateBrxmrc(outputDir) {
102
+ const rcPath = resolve(process.cwd(), '.brxmrc');
103
+ let existing = {};
104
+ if (await pathExists(rcPath)) {
105
+ const content = await readFile(rcPath, 'utf-8');
106
+ const parsed = yaml.load(content);
107
+ if (parsed != null && typeof parsed === 'object' && !Array.isArray(parsed)) {
108
+ existing = parsed;
109
+ }
110
+ }
111
+ // Deep-merge the upgrade section
112
+ const upgrade = existing['upgrade'] ?? {};
113
+ existing['upgrade'] = {
114
+ ...upgrade,
115
+ source: 'local',
116
+ localPath: outputDir,
117
+ };
118
+ await writeFile(rcPath, yaml.dump(existing), 'utf-8');
119
+ }
120
+ /**
121
+ * Create the setup-manifests command for downloading and configuring brXM upgrade manifests.
122
+ *
123
+ * The command downloads the manifest ZIP from Bloomreach Nexus via Maven,
124
+ * extracts it to a local directory, and updates the .brxmrc configuration.
125
+ * If Maven or credentials are unavailable, it prints manual fallback instructions.
126
+ *
127
+ * @returns Configured Commander command instance
128
+ */
129
+ export function createSetupManifestsCommand() {
130
+ const command = new Command('setup-manifests')
131
+ .description('Download and configure brXM upgrade manifests from Bloomreach Nexus')
132
+ .option('--output-dir <path>', 'Directory to extract manifests into', '.brxm-manifests')
133
+ .option('--skip-download', 'Print manual download instructions and exit', false)
134
+ .action(async (options) => {
135
+ console.log('');
136
+ console.log(chalk.bold('brXM Upgrade \u2014 Manifest Setup'));
137
+ console.log(chalk.gray('\u2501'.repeat(50)));
138
+ console.log('');
139
+ // --skip-download: print manual instructions and exit
140
+ if (options.skipDownload) {
141
+ console.log(getManualDownloadInstructions(options.outputDir));
142
+ return;
143
+ }
144
+ const spinner = createSpinner();
145
+ // Check Maven availability
146
+ spinner.start('Checking Maven availability...');
147
+ if (!isMavenAvailable()) {
148
+ spinner.warn('Maven (mvn) not found on PATH');
149
+ console.log('');
150
+ console.log(chalk.yellow('Cannot download manifests automatically — Maven is required.'));
151
+ console.log(getManualDownloadInstructions(options.outputDir));
152
+ return;
153
+ }
154
+ spinner.succeed('Maven is available');
155
+ // Check Nexus credentials
156
+ spinner.start('Looking for Nexus credentials in ~/.m2/settings.xml...');
157
+ const credentialsResult = await findNexusCredentials();
158
+ if (!credentialsResult.found) {
159
+ spinner.warn('Nexus credentials not found');
160
+ console.log(MAVEN_CREDENTIALS_INSTRUCTIONS);
161
+ console.log(getManualDownloadInstructions(options.outputDir));
162
+ return;
163
+ }
164
+ spinner.succeed(`Found Nexus credentials (server: ${credentialsResult.serverId})`);
165
+ // Prepare output directory
166
+ const outputDir = resolve(process.cwd(), options.outputDir);
167
+ // Download ZIP to a temporary directory
168
+ let tmpDir;
169
+ try {
170
+ tmpDir = await mkdtemp(join(tmpdir(), 'brxm-manifests-'));
171
+ }
172
+ catch (error) {
173
+ spinner.fail('Failed to create temporary directory');
174
+ console.error(error instanceof Error ? error.message : String(error));
175
+ process.exit(1);
176
+ }
177
+ let zipPath;
178
+ try {
179
+ spinner.start(`Downloading ${MAVEN_GROUP_ID}:${MAVEN_ARTIFACT_ID}...`);
180
+ zipPath = downloadManifestZip(tmpDir, credentialsResult.serverId);
181
+ spinner.succeed('Download complete');
182
+ }
183
+ catch (error) {
184
+ spinner.fail('Download failed');
185
+ const msg = error instanceof Error ? error.message : String(error);
186
+ console.log('');
187
+ console.log(chalk.red(`Maven error: ${msg}`));
188
+ console.log(getManualDownloadInstructions(options.outputDir));
189
+ return;
190
+ }
191
+ // Extract ZIP
192
+ try {
193
+ spinner.start(`Extracting manifests to ${outputDir}...`);
194
+ await ensureDir(outputDir);
195
+ extractZip(zipPath, outputDir);
196
+ spinner.succeed(`Extracted to ${outputDir}`);
197
+ }
198
+ catch (error) {
199
+ spinner.fail('Extraction failed');
200
+ const msg = error instanceof Error ? error.message : String(error);
201
+ console.log(chalk.red(`Extraction error: ${msg}`));
202
+ process.exit(1);
203
+ }
204
+ // Update .brxmrc
205
+ try {
206
+ spinner.start('Updating .brxmrc...');
207
+ await updateBrxmrc(outputDir);
208
+ spinner.succeed('.brxmrc updated');
209
+ }
210
+ catch (error) {
211
+ spinner.fail('Failed to update .brxmrc');
212
+ const msg = error instanceof Error ? error.message : String(error);
213
+ console.log(chalk.red(`Config error: ${msg}`));
214
+ process.exit(1);
215
+ }
216
+ // Success summary
217
+ console.log('');
218
+ console.log(chalk.green.bold('Manifests configured successfully!'));
219
+ console.log('');
220
+ console.log(` Location: ${chalk.cyan(outputDir)}`);
221
+ console.log(` Config: ${chalk.cyan('.brxmrc')} (upgrade.source = local)`);
222
+ console.log('');
223
+ console.log(chalk.gray(`Next step: run ${chalk.cyan('brxm-upgrade discover')} to analyze your project.`));
224
+ console.log('');
225
+ });
226
+ return command;
227
+ }
228
+ /* eslint-enable no-console */
229
+ //# sourceMappingURL=setup-manifests.js.map