@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.
- package/README.md +217 -0
- package/dist/ai/index.d.ts +3 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +2 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/providers.d.ts +27 -0
- package/dist/ai/providers.d.ts.map +1 -0
- package/dist/ai/providers.js +105 -0
- package/dist/ai/providers.js.map +1 -0
- package/dist/ai/types.d.ts +47 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +2 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/capture/change-scanner.d.ts +20 -0
- package/dist/capture/change-scanner.d.ts.map +1 -0
- package/dist/capture/change-scanner.js +71 -0
- package/dist/capture/change-scanner.js.map +1 -0
- package/dist/capture/conflict-resolver.d.ts +21 -0
- package/dist/capture/conflict-resolver.d.ts.map +1 -0
- package/dist/capture/conflict-resolver.js +45 -0
- package/dist/capture/conflict-resolver.js.map +1 -0
- package/dist/capture/critique-types.d.ts +60 -0
- package/dist/capture/critique-types.d.ts.map +1 -0
- package/dist/capture/critique-types.js +2 -0
- package/dist/capture/critique-types.js.map +1 -0
- package/dist/capture/entry-critique.d.ts +30 -0
- package/dist/capture/entry-critique.d.ts.map +1 -0
- package/dist/capture/entry-critique.js +137 -0
- package/dist/capture/entry-critique.js.map +1 -0
- package/dist/capture/entry-generator.d.ts +32 -0
- package/dist/capture/entry-generator.d.ts.map +1 -0
- package/dist/capture/entry-generator.js +209 -0
- package/dist/capture/entry-generator.js.map +1 -0
- package/dist/capture/entry-qa.d.ts +28 -0
- package/dist/capture/entry-qa.d.ts.map +1 -0
- package/dist/capture/entry-qa.js +84 -0
- package/dist/capture/entry-qa.js.map +1 -0
- package/dist/capture/entry-regeneration.d.ts +29 -0
- package/dist/capture/entry-regeneration.d.ts.map +1 -0
- package/dist/capture/entry-regeneration.js +164 -0
- package/dist/capture/entry-regeneration.js.map +1 -0
- package/dist/capture/entry-validator.d.ts +18 -0
- package/dist/capture/entry-validator.d.ts.map +1 -0
- package/dist/capture/entry-validator.js +47 -0
- package/dist/capture/entry-validator.js.map +1 -0
- package/dist/capture/heuristics.d.ts +30 -0
- package/dist/capture/heuristics.d.ts.map +1 -0
- package/dist/capture/heuristics.js +223 -0
- package/dist/capture/heuristics.js.map +1 -0
- package/dist/capture/index.d.ts +7 -0
- package/dist/capture/index.d.ts.map +1 -0
- package/dist/capture/index.js +11 -0
- package/dist/capture/index.js.map +1 -0
- package/dist/capture/quality-report.d.ts +19 -0
- package/dist/capture/quality-report.d.ts.map +1 -0
- package/dist/capture/quality-report.js +161 -0
- package/dist/capture/quality-report.js.map +1 -0
- package/dist/capture/review-flow.d.ts +37 -0
- package/dist/capture/review-flow.d.ts.map +1 -0
- package/dist/capture/review-flow.js +212 -0
- package/dist/capture/review-flow.js.map +1 -0
- package/dist/capture/types.d.ts +114 -0
- package/dist/capture/types.d.ts.map +1 -0
- package/dist/capture/types.js +2 -0
- package/dist/capture/types.js.map +1 -0
- package/dist/commands/discover.d.ts +6 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +147 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/execute.d.ts +12 -0
- package/dist/commands/execute.d.ts.map +1 -0
- package/dist/commands/execute.js +113 -0
- package/dist/commands/execute.js.map +1 -0
- package/dist/commands/export.d.ts +26 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +291 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/finalize.d.ts +12 -0
- package/dist/commands/finalize.d.ts.map +1 -0
- package/dist/commands/finalize.js +225 -0
- package/dist/commands/finalize.js.map +1 -0
- package/dist/commands/guide.d.ts +12 -0
- package/dist/commands/guide.d.ts.map +1 -0
- package/dist/commands/guide.js +28 -0
- package/dist/commands/guide.js.map +1 -0
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +22 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/log-change.d.ts +14 -0
- package/dist/commands/log-change.d.ts.map +1 -0
- package/dist/commands/log-change.js +243 -0
- package/dist/commands/log-change.js.map +1 -0
- package/dist/commands/plan.d.ts +12 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +162 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/review-manifest.d.ts +39 -0
- package/dist/commands/review-manifest.d.ts.map +1 -0
- package/dist/commands/review-manifest.js +178 -0
- package/dist/commands/review-manifest.js.map +1 -0
- package/dist/commands/setup-manifests.d.ts +12 -0
- package/dist/commands/setup-manifests.d.ts.map +1 -0
- package/dist/commands/setup-manifests.js +229 -0
- package/dist/commands/setup-manifests.js.map +1 -0
- package/dist/config/defaults.d.ts +15 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +36 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +17 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +104 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +33 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +110 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +16 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/phase-manager.d.ts +53 -0
- package/dist/core/phase-manager.d.ts.map +1 -0
- package/dist/core/phase-manager.js +124 -0
- package/dist/core/phase-manager.js.map +1 -0
- package/dist/core/upgrade-state.d.ts +24 -0
- package/dist/core/upgrade-state.d.ts.map +1 -0
- package/dist/core/upgrade-state.js +32 -0
- package/dist/core/upgrade-state.js.map +1 -0
- package/dist/discovery/index.d.ts +5 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +4 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/orchestrator.d.ts +46 -0
- package/dist/discovery/orchestrator.d.ts.map +1 -0
- package/dist/discovery/orchestrator.js +124 -0
- package/dist/discovery/orchestrator.js.map +1 -0
- package/dist/discovery/scanners/config-detector.d.ts +24 -0
- package/dist/discovery/scanners/config-detector.d.ts.map +1 -0
- package/dist/discovery/scanners/config-detector.js +82 -0
- package/dist/discovery/scanners/config-detector.js.map +1 -0
- package/dist/discovery/scanners/cv-scanner.d.ts +30 -0
- package/dist/discovery/scanners/cv-scanner.d.ts.map +1 -0
- package/dist/discovery/scanners/cv-scanner.js +85 -0
- package/dist/discovery/scanners/cv-scanner.js.map +1 -0
- package/dist/discovery/scanners/index.d.ts +6 -0
- package/dist/discovery/scanners/index.d.ts.map +1 -0
- package/dist/discovery/scanners/index.js +6 -0
- package/dist/discovery/scanners/index.js.map +1 -0
- package/dist/discovery/scanners/maven-scanner.d.ts +33 -0
- package/dist/discovery/scanners/maven-scanner.d.ts.map +1 -0
- package/dist/discovery/scanners/maven-scanner.js +96 -0
- package/dist/discovery/scanners/maven-scanner.js.map +1 -0
- package/dist/discovery/scanners/repo-scanner.d.ts +9 -0
- package/dist/discovery/scanners/repo-scanner.d.ts.map +1 -0
- package/dist/discovery/scanners/repo-scanner.js +80 -0
- package/dist/discovery/scanners/repo-scanner.js.map +1 -0
- package/dist/discovery/scanners/version-resolver.d.ts +45 -0
- package/dist/discovery/scanners/version-resolver.d.ts.map +1 -0
- package/dist/discovery/scanners/version-resolver.js +119 -0
- package/dist/discovery/scanners/version-resolver.js.map +1 -0
- package/dist/discovery/types.d.ts +156 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +2 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/discovery/validators/index.d.ts +2 -0
- package/dist/discovery/validators/index.d.ts.map +1 -0
- package/dist/discovery/validators/index.js +2 -0
- package/dist/discovery/validators/index.js.map +1 -0
- package/dist/discovery/validators/upgrade-validator.d.ts +34 -0
- package/dist/discovery/validators/upgrade-validator.d.ts.map +1 -0
- package/dist/discovery/validators/upgrade-validator.js +135 -0
- package/dist/discovery/validators/upgrade-validator.js.map +1 -0
- package/dist/docs/docs-client.d.ts +44 -0
- package/dist/docs/docs-client.d.ts.map +1 -0
- package/dist/docs/docs-client.js +161 -0
- package/dist/docs/docs-client.js.map +1 -0
- package/dist/docs/docs-context.d.ts +23 -0
- package/dist/docs/docs-context.d.ts.map +1 -0
- package/dist/docs/docs-context.js +41 -0
- package/dist/docs/docs-context.js.map +1 -0
- package/dist/docs/index.d.ts +4 -0
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +3 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/docs/types.d.ts +27 -0
- package/dist/docs/types.d.ts.map +1 -0
- package/dist/docs/types.js +2 -0
- package/dist/docs/types.js.map +1 -0
- package/dist/execution/diff-presenter.d.ts +52 -0
- package/dist/execution/diff-presenter.d.ts.map +1 -0
- package/dist/execution/diff-presenter.js +148 -0
- package/dist/execution/diff-presenter.js.map +1 -0
- package/dist/execution/executors/ai-assisted.d.ts +28 -0
- package/dist/execution/executors/ai-assisted.d.ts.map +1 -0
- package/dist/execution/executors/ai-assisted.js +226 -0
- package/dist/execution/executors/ai-assisted.js.map +1 -0
- package/dist/execution/executors/automated.d.ts +15 -0
- package/dist/execution/executors/automated.d.ts.map +1 -0
- package/dist/execution/executors/automated.js +37 -0
- package/dist/execution/executors/automated.js.map +1 -0
- package/dist/execution/executors/cv-gate.d.ts +23 -0
- package/dist/execution/executors/cv-gate.d.ts.map +1 -0
- package/dist/execution/executors/cv-gate.js +63 -0
- package/dist/execution/executors/cv-gate.js.map +1 -0
- package/dist/execution/executors/index.d.ts +7 -0
- package/dist/execution/executors/index.d.ts.map +1 -0
- package/dist/execution/executors/index.js +7 -0
- package/dist/execution/executors/index.js.map +1 -0
- package/dist/execution/executors/manual.d.ts +18 -0
- package/dist/execution/executors/manual.d.ts.map +1 -0
- package/dist/execution/executors/manual.js +31 -0
- package/dist/execution/executors/manual.js.map +1 -0
- package/dist/execution/executors/override-resolution.d.ts +27 -0
- package/dist/execution/executors/override-resolution.d.ts.map +1 -0
- package/dist/execution/executors/override-resolution.js +79 -0
- package/dist/execution/executors/override-resolution.js.map +1 -0
- package/dist/execution/executors/version-bump.d.ts +20 -0
- package/dist/execution/executors/version-bump.d.ts.map +1 -0
- package/dist/execution/executors/version-bump.js +65 -0
- package/dist/execution/executors/version-bump.js.map +1 -0
- package/dist/execution/file-transformer.d.ts +25 -0
- package/dist/execution/file-transformer.d.ts.map +1 -0
- package/dist/execution/file-transformer.js +74 -0
- package/dist/execution/file-transformer.js.map +1 -0
- package/dist/execution/index.d.ts +7 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +9 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/state-manager.d.ts +27 -0
- package/dist/execution/state-manager.d.ts.map +1 -0
- package/dist/execution/state-manager.js +48 -0
- package/dist/execution/state-manager.js.map +1 -0
- package/dist/execution/step-executor.d.ts +68 -0
- package/dist/execution/step-executor.d.ts.map +1 -0
- package/dist/execution/step-executor.js +243 -0
- package/dist/execution/step-executor.js.map +1 -0
- package/dist/execution/types.d.ts +92 -0
- package/dist/execution/types.d.ts.map +1 -0
- package/dist/execution/types.js +2 -0
- package/dist/execution/types.js.map +1 -0
- package/dist/guide/GuideRunner.d.ts +62 -0
- package/dist/guide/GuideRunner.d.ts.map +1 -0
- package/dist/guide/GuideRunner.js +390 -0
- package/dist/guide/GuideRunner.js.map +1 -0
- package/dist/guide/chat/ChatContextBuilder.d.ts +44 -0
- package/dist/guide/chat/ChatContextBuilder.d.ts.map +1 -0
- package/dist/guide/chat/ChatContextBuilder.js +121 -0
- package/dist/guide/chat/ChatContextBuilder.js.map +1 -0
- package/dist/guide/chat/ChatLoop.d.ts +18 -0
- package/dist/guide/chat/ChatLoop.d.ts.map +1 -0
- package/dist/guide/chat/ChatLoop.js +59 -0
- package/dist/guide/chat/ChatLoop.js.map +1 -0
- package/dist/guide/chat/StepCoach.d.ts +22 -0
- package/dist/guide/chat/StepCoach.d.ts.map +1 -0
- package/dist/guide/chat/StepCoach.js +39 -0
- package/dist/guide/chat/StepCoach.js.map +1 -0
- package/dist/guide/chat/index.d.ts +4 -0
- package/dist/guide/chat/index.d.ts.map +1 -0
- package/dist/guide/chat/index.js +4 -0
- package/dist/guide/chat/index.js.map +1 -0
- package/dist/guide/index.d.ts +3 -0
- package/dist/guide/index.d.ts.map +1 -0
- package/dist/guide/index.js +2 -0
- package/dist/guide/index.js.map +1 -0
- package/dist/guide/phases/DiscoveryPhase.d.ts +30 -0
- package/dist/guide/phases/DiscoveryPhase.d.ts.map +1 -0
- package/dist/guide/phases/DiscoveryPhase.js +238 -0
- package/dist/guide/phases/DiscoveryPhase.js.map +1 -0
- package/dist/guide/phases/ExecutionPhase.d.ts +80 -0
- package/dist/guide/phases/ExecutionPhase.d.ts.map +1 -0
- package/dist/guide/phases/ExecutionPhase.js +574 -0
- package/dist/guide/phases/ExecutionPhase.js.map +1 -0
- package/dist/guide/phases/PlanPhase.d.ts +22 -0
- package/dist/guide/phases/PlanPhase.d.ts.map +1 -0
- package/dist/guide/phases/PlanPhase.js +200 -0
- package/dist/guide/phases/PlanPhase.js.map +1 -0
- package/dist/guide/phases/index.d.ts +4 -0
- package/dist/guide/phases/index.d.ts.map +1 -0
- package/dist/guide/phases/index.js +4 -0
- package/dist/guide/phases/index.js.map +1 -0
- package/dist/guide/rendering/formatters.d.ts +126 -0
- package/dist/guide/rendering/formatters.d.ts.map +1 -0
- package/dist/guide/rendering/formatters.js +340 -0
- package/dist/guide/rendering/formatters.js.map +1 -0
- package/dist/guide/rendering/index.d.ts +2 -0
- package/dist/guide/rendering/index.d.ts.map +1 -0
- package/dist/guide/rendering/index.js +2 -0
- package/dist/guide/rendering/index.js.map +1 -0
- package/dist/guide/rendering/platform-changes.d.ts +18 -0
- package/dist/guide/rendering/platform-changes.d.ts.map +1 -0
- package/dist/guide/rendering/platform-changes.js +86 -0
- package/dist/guide/rendering/platform-changes.js.map +1 -0
- package/dist/guide/types.d.ts +100 -0
- package/dist/guide/types.d.ts.map +1 -0
- package/dist/guide/types.js +2 -0
- package/dist/guide/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +138 -0
- package/dist/index.js.map +1 -0
- package/dist/manifests/maven-settings.d.ts +7 -0
- package/dist/manifests/maven-settings.d.ts.map +1 -0
- package/dist/manifests/maven-settings.js +33 -0
- package/dist/manifests/maven-settings.js.map +1 -0
- package/dist/manifests/parent-properties.d.ts +12 -0
- package/dist/manifests/parent-properties.d.ts.map +1 -0
- package/dist/manifests/parent-properties.js +28 -0
- package/dist/manifests/parent-properties.js.map +1 -0
- package/dist/manifests/schema.json +198 -0
- package/dist/manifests/unreleased.yaml +3 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +13 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/resources/index.d.ts +32 -0
- package/dist/mcp/resources/index.d.ts.map +1 -0
- package/dist/mcp/resources/index.js +55 -0
- package/dist/mcp/resources/index.js.map +1 -0
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +162 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/complete-step.d.ts +26 -0
- package/dist/mcp/tools/complete-step.d.ts.map +1 -0
- package/dist/mcp/tools/complete-step.js +73 -0
- package/dist/mcp/tools/complete-step.js.map +1 -0
- package/dist/mcp/tools/create-upgrade-plan.d.ts +36 -0
- package/dist/mcp/tools/create-upgrade-plan.d.ts.map +1 -0
- package/dist/mcp/tools/create-upgrade-plan.js +143 -0
- package/dist/mcp/tools/create-upgrade-plan.js.map +1 -0
- package/dist/mcp/tools/discover-project.d.ts +33 -0
- package/dist/mcp/tools/discover-project.d.ts.map +1 -0
- package/dist/mcp/tools/discover-project.js +96 -0
- package/dist/mcp/tools/discover-project.js.map +1 -0
- package/dist/mcp/tools/get-next-step.d.ts +54 -0
- package/dist/mcp/tools/get-next-step.d.ts.map +1 -0
- package/dist/mcp/tools/get-next-step.js +110 -0
- package/dist/mcp/tools/get-next-step.js.map +1 -0
- package/dist/mcp/tools/get-upgrade-status.d.ts +25 -0
- package/dist/mcp/tools/get-upgrade-status.d.ts.map +1 -0
- package/dist/mcp/tools/get-upgrade-status.js +79 -0
- package/dist/mcp/tools/get-upgrade-status.js.map +1 -0
- package/dist/mcp/tools/upgrade-targets.d.ts +19 -0
- package/dist/mcp/tools/upgrade-targets.d.ts.map +1 -0
- package/dist/mcp/tools/upgrade-targets.js +132 -0
- package/dist/mcp/tools/upgrade-targets.js.map +1 -0
- package/dist/planning/ai-analyzer.d.ts +20 -0
- package/dist/planning/ai-analyzer.d.ts.map +1 -0
- package/dist/planning/ai-analyzer.js +97 -0
- package/dist/planning/ai-analyzer.js.map +1 -0
- package/dist/planning/index.d.ts +8 -0
- package/dist/planning/index.d.ts.map +1 -0
- package/dist/planning/index.js +13 -0
- package/dist/planning/index.js.map +1 -0
- package/dist/planning/manifest-loader.d.ts +54 -0
- package/dist/planning/manifest-loader.d.ts.map +1 -0
- package/dist/planning/manifest-loader.js +233 -0
- package/dist/planning/manifest-loader.js.map +1 -0
- package/dist/planning/manifest-schema.d.ts +41 -0
- package/dist/planning/manifest-schema.d.ts.map +1 -0
- package/dist/planning/manifest-schema.js +71 -0
- package/dist/planning/manifest-schema.js.map +1 -0
- package/dist/planning/override-analyzer.d.ts +12 -0
- package/dist/planning/override-analyzer.d.ts.map +1 -0
- package/dist/planning/override-analyzer.js +42 -0
- package/dist/planning/override-analyzer.js.map +1 -0
- package/dist/planning/plan-generator.d.ts +15 -0
- package/dist/planning/plan-generator.d.ts.map +1 -0
- package/dist/planning/plan-generator.js +250 -0
- package/dist/planning/plan-generator.js.map +1 -0
- package/dist/planning/project-matcher.d.ts +65 -0
- package/dist/planning/project-matcher.d.ts.map +1 -0
- package/dist/planning/project-matcher.js +265 -0
- package/dist/planning/project-matcher.js.map +1 -0
- package/dist/planning/types.d.ts +237 -0
- package/dist/planning/types.d.ts.map +1 -0
- package/dist/planning/types.js +2 -0
- package/dist/planning/types.js.map +1 -0
- package/dist/types/index.d.ts +90 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/command-helpers.d.ts +14 -0
- package/dist/utils/command-helpers.d.ts.map +1 -0
- package/dist/utils/command-helpers.js +18 -0
- package/dist/utils/command-helpers.js.map +1 -0
- package/dist/utils/diff.d.ts +42 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +80 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/error.d.ts +5 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +8 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/fs.d.ts +50 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +117 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +31 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +62 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/output-writer.d.ts +26 -0
- package/dist/utils/output-writer.d.ts.map +1 -0
- package/dist/utils/output-writer.js +62 -0
- package/dist/utils/output-writer.js.map +1 -0
- package/dist/utils/pom-parser.d.ts +94 -0
- package/dist/utils/pom-parser.d.ts.map +1 -0
- package/dist/utils/pom-parser.js +120 -0
- package/dist/utils/pom-parser.js.map +1 -0
- package/dist/utils/spinner.d.ts +35 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +46 -0
- package/dist/utils/spinner.js.map +1 -0
- 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
|