@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
package/README.md
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# brXM Upgrade Tool
|
|
2
|
+
|
|
3
|
+
AI-powered CLI tool for Bloomreach Experience Manager (brXM) version upgrades.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The brXM Upgrade Tool simplifies version upgrades by:
|
|
8
|
+
- **Analyzing** your project to understand its structure and customizations
|
|
9
|
+
- **Planning** upgrades based on version-specific manifests
|
|
10
|
+
- **Executing** transformations with AI assistance
|
|
11
|
+
- **Guiding** you through manual steps when needed
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
### Via npx (recommended)
|
|
16
|
+
|
|
17
|
+
The package is published publicly on npmjs.com — no authentication or registry configuration required. Run from any brXM project directory:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npx @bloomreach/brxm-upgrade discover
|
|
21
|
+
npx @bloomreach/brxm-upgrade plan
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
To force a fresh fetch (bypass npx cache):
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npx --yes @bloomreach/brxm-upgrade@latest <command>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### MCP Server (Claude Code integration)
|
|
31
|
+
|
|
32
|
+
Add to your `.mcp.json`:
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"mcpServers": {
|
|
37
|
+
"brxm-upgrade": {
|
|
38
|
+
"command": "npx",
|
|
39
|
+
"args": ["-p", "@bloomreach/brxm-upgrade", "brxm-upgrade-mcp"]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### From source (development)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
cd tools/brxm-upgrade
|
|
49
|
+
npm install
|
|
50
|
+
npm run build
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Quick Start
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Navigate to your brXM project root
|
|
57
|
+
cd /path/to/your/brxm-project
|
|
58
|
+
|
|
59
|
+
# Check tool information
|
|
60
|
+
brxm-upgrade info
|
|
61
|
+
|
|
62
|
+
# Analyze your project
|
|
63
|
+
brxm-upgrade discover
|
|
64
|
+
|
|
65
|
+
# Generate upgrade plan
|
|
66
|
+
brxm-upgrade plan --to 16.3
|
|
67
|
+
|
|
68
|
+
# Execute the upgrade
|
|
69
|
+
brxm-upgrade execute
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Configuration
|
|
73
|
+
|
|
74
|
+
Create a `.brxmrc` file in your project root or home directory:
|
|
75
|
+
|
|
76
|
+
```yaml
|
|
77
|
+
ai:
|
|
78
|
+
provider: anthropic
|
|
79
|
+
model: claude-sonnet-4-20250514
|
|
80
|
+
apiKeyEnv: ANTHROPIC_API_KEY
|
|
81
|
+
|
|
82
|
+
upgrade:
|
|
83
|
+
source: bundled
|
|
84
|
+
|
|
85
|
+
output:
|
|
86
|
+
verbose: false
|
|
87
|
+
color: true
|
|
88
|
+
exportPath: ./.brxm-upgrade
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
See `fixtures/.brxmrc.example.yaml` for a complete example.
|
|
92
|
+
|
|
93
|
+
## Supported AI Providers
|
|
94
|
+
|
|
95
|
+
The tool supports multiple AI providers (BYOK - Bring Your Own Key):
|
|
96
|
+
|
|
97
|
+
| Provider | Environment Variable | Default Model |
|
|
98
|
+
|----------|---------------------|---------------|
|
|
99
|
+
| Anthropic | `ANTHROPIC_API_KEY` | claude-sonnet-4-20250514 |
|
|
100
|
+
| OpenAI | `OPENAI_API_KEY` | gpt-4-turbo |
|
|
101
|
+
| Google | `GOOGLE_AI_API_KEY` | gemini-pro |
|
|
102
|
+
|
|
103
|
+
## Commands
|
|
104
|
+
|
|
105
|
+
| Command | Description | Status |
|
|
106
|
+
|---------|-------------|--------|
|
|
107
|
+
| `info` | Display tool information | Available |
|
|
108
|
+
| `discover` | Analyze project structure | Available |
|
|
109
|
+
| `plan` | Generate upgrade plan | Available |
|
|
110
|
+
| `execute` | Execute upgrade steps | Available |
|
|
111
|
+
| `log-change` | Create manifest entries | Available |
|
|
112
|
+
| `finalize` | Promote unreleased manifest to versioned release | Available |
|
|
113
|
+
| `export` | Export for manual AI use | Available |
|
|
114
|
+
|
|
115
|
+
## Release Manifest Generation
|
|
116
|
+
|
|
117
|
+
The `scripts/generate-release-manifests.sh` script generates upgrade manifests from git history. It can optionally enrich triage and documentation with Jira ticket data (summary, description, labels, comments).
|
|
118
|
+
|
|
119
|
+
### Jira Enrichment (optional)
|
|
120
|
+
|
|
121
|
+
Set the following environment variables to enable Jira enrichment:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
export JIRA_BASE_URL="https://bloomreach.atlassian.net"
|
|
125
|
+
export JIRA_USER="your-email@bloomreach.com"
|
|
126
|
+
export JIRA_API_TOKEN="your-api-token"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
| Variable | Required | Description |
|
|
130
|
+
|----------|----------|-------------|
|
|
131
|
+
| `JIRA_BASE_URL` | Yes | Base URL of the Jira instance |
|
|
132
|
+
| `JIRA_API_TOKEN` | Yes | API token ([create one here](https://id.atlassian.com/manage-profile/security/api-tokens)) |
|
|
133
|
+
| `JIRA_USER` | For Cloud | Email address for Basic Auth. Omit for Bearer token auth (Data Center PATs). |
|
|
134
|
+
|
|
135
|
+
If these variables are not set, the script runs without Jira data — using only git context.
|
|
136
|
+
|
|
137
|
+
### Usage
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
# Full pipeline
|
|
141
|
+
./scripts/generate-release-manifests.sh --from 16.6.0 --to 16.7.0
|
|
142
|
+
|
|
143
|
+
# Dry run (list JIRA groups only)
|
|
144
|
+
./scripts/generate-release-manifests.sh --from 16.6.0 --to 16.7.0 --dry-run
|
|
145
|
+
|
|
146
|
+
# Generate change docs without running log-change
|
|
147
|
+
./scripts/generate-release-manifests.sh --from 16.6.0 --to 16.7.0 --skip-log-change
|
|
148
|
+
|
|
149
|
+
# Verbose mode — save all AI prompts/responses and Jira data
|
|
150
|
+
./scripts/generate-release-manifests.sh --from 16.6.0 --to 16.7.0 --verbose
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Verbose mode
|
|
154
|
+
|
|
155
|
+
Use `--verbose` (or `-v`) to save the full round-trip data for every ticket to `scripts/output/verbose/`:
|
|
156
|
+
|
|
157
|
+
| File | Content |
|
|
158
|
+
|------|---------|
|
|
159
|
+
| `CMS-12345.jira.json` | Fetched Jira issue data (summary, description, comments) |
|
|
160
|
+
| `CMS-12345.triage-prompt.txt` | Full prompt sent to Claude for triage |
|
|
161
|
+
| `CMS-12345.triage-response.txt` | Claude's triage response (JSON with decision/reason) |
|
|
162
|
+
| `CMS-12345.doc-prompt.txt` | Full prompt sent to Claude for change doc generation (includes diff) |
|
|
163
|
+
| `CMS-12345.doc-response.txt` | Claude's generated change document (markdown) |
|
|
164
|
+
|
|
165
|
+
The directory is cleared on each run. Files are already covered by `scripts/output/.gitignore`.
|
|
166
|
+
|
|
167
|
+
## Publishing
|
|
168
|
+
|
|
169
|
+
Both the CLI tool and the manifests bundle are published manually. See **[docs/PUBLISHING.md](docs/PUBLISHING.md)** for the full maintainer runbook (prerequisites, step-by-step commands, verification, and rollback for both flows).
|
|
170
|
+
|
|
171
|
+
## Development
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# Install dependencies
|
|
175
|
+
npm install
|
|
176
|
+
|
|
177
|
+
# Run in development mode
|
|
178
|
+
npm run dev
|
|
179
|
+
|
|
180
|
+
# Run tests
|
|
181
|
+
npm test
|
|
182
|
+
|
|
183
|
+
# Build for production
|
|
184
|
+
npm run build
|
|
185
|
+
|
|
186
|
+
# Lint code
|
|
187
|
+
npm run lint
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Running locally from anywhere
|
|
191
|
+
|
|
192
|
+
To run the tool from any directory without publishing to npm, add one of the following to your shell config (`~/.zshrc` or `~/.bashrc`), then reload with `source ~/.zshrc`.
|
|
193
|
+
|
|
194
|
+
**Option 1 — built output (recommended):**
|
|
195
|
+
|
|
196
|
+
Build once with `npm run build`, then point the alias at the compiled entry point:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
alias brxm-upgrade='node /absolute/path/to/brxm/tools/brxm-upgrade/dist/index.js'
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Rebuild after code changes: `cd /absolute/path/to/brxm/tools/brxm-upgrade && npm run build`
|
|
203
|
+
|
|
204
|
+
**Option 2 — TypeScript source via tsx (no build step):**
|
|
205
|
+
|
|
206
|
+
Use a shell function so the absolute path to `src/index.ts` is resolved at definition time, not at call time:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
BRXM_UPGRADE_DIR="/absolute/path/to/brxm/tools/brxm-upgrade"
|
|
210
|
+
brxm-upgrade() { node --import "$BRXM_UPGRADE_DIR/node_modules/tsx/dist/esm/index.mjs" "$BRXM_UPGRADE_DIR/src/index.ts" "$@"; }
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
> **Note:** A plain `alias` with a relative path like `tsx src/index.ts` will fail when run from a different directory, because the path resolves against the current working directory rather than the tool directory.
|
|
214
|
+
|
|
215
|
+
## License
|
|
216
|
+
|
|
217
|
+
Apache-2.0 - See LICENSE file for details.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,QAAQ,EACR,eAAe,EACf,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/ai/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AIProvider } from '../types/index.js';
|
|
2
|
+
import type { AIClient } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get list of supported AI providers.
|
|
5
|
+
*
|
|
6
|
+
* @returns Array of supported provider identifiers
|
|
7
|
+
*/
|
|
8
|
+
export declare function getSupportedProviders(): AIProvider[];
|
|
9
|
+
/**
|
|
10
|
+
* Check if a provider is supported.
|
|
11
|
+
*
|
|
12
|
+
* @param provider - Provider identifier to check
|
|
13
|
+
* @returns True if the provider is supported
|
|
14
|
+
*/
|
|
15
|
+
export declare function isProviderSupported(provider: string): provider is AIProvider;
|
|
16
|
+
/**
|
|
17
|
+
* Create an AI client for the specified provider.
|
|
18
|
+
*
|
|
19
|
+
* @param provider - AI provider identifier
|
|
20
|
+
* @param model - Model identifier (provider-specific)
|
|
21
|
+
* @param apiKey - API key for authentication
|
|
22
|
+
* @param baseUrl - Optional base URL for API proxies or custom endpoints
|
|
23
|
+
* @returns Configured AI client
|
|
24
|
+
* @throws Error if provider is not supported
|
|
25
|
+
*/
|
|
26
|
+
export declare function createAIClient(provider: AIProvider, model: string, apiKey: string, baseUrl?: string): AIClient;
|
|
27
|
+
//# sourceMappingURL=providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/ai/providers.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAmC,MAAM,YAAY,CAAC;AAoC5E;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,UAAU,EAAE,CAEpD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,IAAI,UAAU,CAE5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,UAAU,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,QAAQ,CA6DV"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { generateText } from 'ai';
|
|
2
|
+
import { createAnthropic } from '@ai-sdk/anthropic';
|
|
3
|
+
import { createOpenAI } from '@ai-sdk/openai';
|
|
4
|
+
import { createGoogleGenerativeAI } from '@ai-sdk/google';
|
|
5
|
+
/**
|
|
6
|
+
* Registry of supported AI providers.
|
|
7
|
+
* Each entry maps a provider to its SDK factory that accepts apiKey/baseURL configuration.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Resolve the Anthropic base URL, ensuring it ends with /v1.
|
|
11
|
+
* The SDK expects /v1 in the base URL (default: https://api.anthropic.com/v1),
|
|
12
|
+
* but ANTHROPIC_BASE_URL is commonly set without it (e.g., for LiteLLM proxies).
|
|
13
|
+
*/
|
|
14
|
+
function resolveAnthropicBaseUrl(baseURL) {
|
|
15
|
+
const url = baseURL ?? process.env['ANTHROPIC_BASE_URL'];
|
|
16
|
+
if (!url)
|
|
17
|
+
return undefined;
|
|
18
|
+
return url.replace(/\/+$/, '').endsWith('/v1') ? url : url.replace(/\/+$/, '') + '/v1';
|
|
19
|
+
}
|
|
20
|
+
const providerRegistry = new Map([
|
|
21
|
+
['anthropic', (model, config) => createAnthropic({ apiKey: config.apiKey, baseURL: resolveAnthropicBaseUrl(config.baseURL) })(model)],
|
|
22
|
+
['openai', (model, config) => createOpenAI({ apiKey: config.apiKey, baseURL: config.baseURL })(model)],
|
|
23
|
+
['google', (model, config) => createGoogleGenerativeAI({ apiKey: config.apiKey, baseURL: config.baseURL })(model)],
|
|
24
|
+
]);
|
|
25
|
+
/**
|
|
26
|
+
* Get list of supported AI providers.
|
|
27
|
+
*
|
|
28
|
+
* @returns Array of supported provider identifiers
|
|
29
|
+
*/
|
|
30
|
+
export function getSupportedProviders() {
|
|
31
|
+
return Array.from(providerRegistry.keys());
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if a provider is supported.
|
|
35
|
+
*
|
|
36
|
+
* @param provider - Provider identifier to check
|
|
37
|
+
* @returns True if the provider is supported
|
|
38
|
+
*/
|
|
39
|
+
export function isProviderSupported(provider) {
|
|
40
|
+
return providerRegistry.has(provider);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create an AI client for the specified provider.
|
|
44
|
+
*
|
|
45
|
+
* @param provider - AI provider identifier
|
|
46
|
+
* @param model - Model identifier (provider-specific)
|
|
47
|
+
* @param apiKey - API key for authentication
|
|
48
|
+
* @param baseUrl - Optional base URL for API proxies or custom endpoints
|
|
49
|
+
* @returns Configured AI client
|
|
50
|
+
* @throws Error if provider is not supported
|
|
51
|
+
*/
|
|
52
|
+
export function createAIClient(provider, model, apiKey, baseUrl) {
|
|
53
|
+
if (!isProviderSupported(provider)) {
|
|
54
|
+
throw new Error(`Unsupported AI provider: ${String(provider)}`);
|
|
55
|
+
}
|
|
56
|
+
// Safe to assert: isProviderSupported above guarantees the key exists.
|
|
57
|
+
const providerFactory = providerRegistry.get(provider);
|
|
58
|
+
const modelInstance = providerFactory(model, { apiKey, baseURL: baseUrl });
|
|
59
|
+
const client = {
|
|
60
|
+
provider,
|
|
61
|
+
model,
|
|
62
|
+
isConfigured() {
|
|
63
|
+
return Boolean(apiKey && apiKey.trim().length > 0);
|
|
64
|
+
},
|
|
65
|
+
async generate(prompt, options) {
|
|
66
|
+
if (!this.isConfigured()) {
|
|
67
|
+
throw new Error(`AI provider ${provider} is not configured. Missing API key.`);
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const result = await generateText({
|
|
71
|
+
model: modelInstance,
|
|
72
|
+
prompt,
|
|
73
|
+
maxOutputTokens: options?.maxTokens,
|
|
74
|
+
temperature: options?.temperature,
|
|
75
|
+
system: options?.system,
|
|
76
|
+
...(options?.stopSequences && { stopSequences: options.stopSequences }),
|
|
77
|
+
});
|
|
78
|
+
return {
|
|
79
|
+
text: result.text,
|
|
80
|
+
usage: result.usage
|
|
81
|
+
? {
|
|
82
|
+
inputTokens: result.usage.inputTokens,
|
|
83
|
+
outputTokens: result.usage.outputTokens,
|
|
84
|
+
totalTokens: result.usage.totalTokens,
|
|
85
|
+
}
|
|
86
|
+
: undefined,
|
|
87
|
+
finishReason: result.finishReason,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
92
|
+
const details = error instanceof Error && 'cause' in error ? ` (cause: ${String(error.cause)})` : '';
|
|
93
|
+
const body = error != null && typeof error === 'object' && 'responseBody' in error
|
|
94
|
+
? ` | response: ${String(error.responseBody)}`
|
|
95
|
+
: '';
|
|
96
|
+
const status = error != null && typeof error === 'object' && 'statusCode' in error
|
|
97
|
+
? ` | status: ${String(error.statusCode)}`
|
|
98
|
+
: '';
|
|
99
|
+
throw new Error(`AI generation failed: ${message}${status}${body}${details}`);
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
return client;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/ai/providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { AIProvider } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Options for AI text generation.
|
|
4
|
+
*/
|
|
5
|
+
export interface GenerateOptions {
|
|
6
|
+
/** Maximum tokens to generate */
|
|
7
|
+
maxTokens?: number;
|
|
8
|
+
/** Temperature for randomness (0-1) */
|
|
9
|
+
temperature?: number;
|
|
10
|
+
/** System prompt to set context */
|
|
11
|
+
system?: string;
|
|
12
|
+
/** Stop sequences to end generation */
|
|
13
|
+
stopSequences?: string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Result of AI text generation.
|
|
17
|
+
*/
|
|
18
|
+
export interface GenerateResult {
|
|
19
|
+
/** Generated text */
|
|
20
|
+
text: string;
|
|
21
|
+
/** Token usage statistics */
|
|
22
|
+
usage?: {
|
|
23
|
+
inputTokens: number | undefined;
|
|
24
|
+
outputTokens: number | undefined;
|
|
25
|
+
totalTokens: number | undefined;
|
|
26
|
+
};
|
|
27
|
+
/** Finish reason */
|
|
28
|
+
finishReason?: 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other' | 'unknown';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* AI client interface for provider abstraction.
|
|
32
|
+
*/
|
|
33
|
+
export interface AIClient {
|
|
34
|
+
/** Provider identifier */
|
|
35
|
+
provider: AIProvider;
|
|
36
|
+
/** Model being used */
|
|
37
|
+
model: string;
|
|
38
|
+
/** Generate text from a prompt */
|
|
39
|
+
generate: (prompt: string, options?: GenerateOptions) => Promise<GenerateResult>;
|
|
40
|
+
/** Check if the client is properly configured */
|
|
41
|
+
isConfigured: () => boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Factory function type for creating AI clients.
|
|
45
|
+
*/
|
|
46
|
+
export type AIClientFactory = (model: string, apiKey: string, baseUrl?: string) => AIClient;
|
|
47
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;QAChC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;QACjC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;KACjC,CAAC;IACF,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,gBAAgB,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;CACpG;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,0BAA0B;IAC1B,QAAQ,EAAE,UAAU,CAAC;IACrB,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACjF,iDAAiD;IACjD,YAAY,EAAE,MAAM,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,QAAQ,CAAC"}
|
package/dist/ai/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ChangeDocument, ChangeDocMetadata, AIContextTags } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extract metadata (JIRA ticket, date, branch, author) from change document content.
|
|
4
|
+
*/
|
|
5
|
+
export declare function extractMetadata(content: string): ChangeDocMetadata;
|
|
6
|
+
/**
|
|
7
|
+
* Extract AI Context Tags from the last YAML fenced code block in the content.
|
|
8
|
+
*/
|
|
9
|
+
export declare function extractContextTags(content: string): AIContextTags;
|
|
10
|
+
/**
|
|
11
|
+
* Parse a single change document file into a structured ChangeDocument.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseChangeDocument(filePath: string): Promise<ChangeDocument>;
|
|
14
|
+
/**
|
|
15
|
+
* Scan a directory for Markdown change documents and parse them all.
|
|
16
|
+
*
|
|
17
|
+
* @throws Error if the directory does not exist
|
|
18
|
+
*/
|
|
19
|
+
export declare function scanChangeDocuments(changesDir: string): Promise<ChangeDocument[]>;
|
|
20
|
+
//# sourceMappingURL=change-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-scanner.d.ts","sourceRoot":"","sources":["../../src/capture/change-scanner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnF;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAYlE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAqBjE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAWnF;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAWvF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { readdir } from 'node:fs/promises';
|
|
2
|
+
import { join, basename } from 'node:path';
|
|
3
|
+
import yaml from 'js-yaml';
|
|
4
|
+
import { readTextFile, pathExists } from '../utils/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Extract metadata (JIRA ticket, date, branch, author) from change document content.
|
|
7
|
+
*/
|
|
8
|
+
export function extractMetadata(content) {
|
|
9
|
+
const jiraMatch = /\*\*JIRA\*\*:\s*([A-Z]+-\d+)/i.exec(content);
|
|
10
|
+
const dateMatch = /\*\*Date\*\*:\s*(\d{4}-\d{2}-\d{2})/i.exec(content);
|
|
11
|
+
const branchMatch = /\*\*Branch\*\*:\s*(.+)/i.exec(content);
|
|
12
|
+
const authorMatch = /\*\*Author\*\*:\s*(.+)/i.exec(content);
|
|
13
|
+
return {
|
|
14
|
+
jiraTicket: jiraMatch?.[1],
|
|
15
|
+
date: dateMatch?.[1],
|
|
16
|
+
branch: branchMatch?.[1]?.trim(),
|
|
17
|
+
author: authorMatch?.[1]?.trim(),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extract AI Context Tags from the last YAML fenced code block in the content.
|
|
22
|
+
*/
|
|
23
|
+
export function extractContextTags(content) {
|
|
24
|
+
const yamlBlockRegex = /```yaml\n([\s\S]*?)```/g;
|
|
25
|
+
let lastMatch = null;
|
|
26
|
+
let match;
|
|
27
|
+
while ((match = yamlBlockRegex.exec(content)) !== null) {
|
|
28
|
+
lastMatch = match;
|
|
29
|
+
}
|
|
30
|
+
if (!lastMatch?.[1]) {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const parsed = yaml.load(lastMatch[1]);
|
|
35
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
36
|
+
return {};
|
|
37
|
+
}
|
|
38
|
+
return parsed;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return {};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Parse a single change document file into a structured ChangeDocument.
|
|
46
|
+
*/
|
|
47
|
+
export async function parseChangeDocument(filePath) {
|
|
48
|
+
const content = await readTextFile(filePath);
|
|
49
|
+
const filename = basename(filePath);
|
|
50
|
+
return {
|
|
51
|
+
filename,
|
|
52
|
+
filePath,
|
|
53
|
+
metadata: extractMetadata(content),
|
|
54
|
+
contextTags: extractContextTags(content),
|
|
55
|
+
content,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Scan a directory for Markdown change documents and parse them all.
|
|
60
|
+
*
|
|
61
|
+
* @throws Error if the directory does not exist
|
|
62
|
+
*/
|
|
63
|
+
export async function scanChangeDocuments(changesDir) {
|
|
64
|
+
if (!(await pathExists(changesDir))) {
|
|
65
|
+
throw new Error(`Changes directory not found: ${changesDir}`);
|
|
66
|
+
}
|
|
67
|
+
const files = await readdir(changesDir);
|
|
68
|
+
const mdFiles = files.filter(f => f.endsWith('.md')).sort();
|
|
69
|
+
return Promise.all(mdFiles.map((file) => parseChangeDocument(join(changesDir, file))));
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=change-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-scanner.js","sourceRoot":"","sources":["../../src/capture/change-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ManifestEntry, UpgradeManifest } from '../planning/types.js';
|
|
2
|
+
import type { ConflictCheckResult } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Check whether a JIRA ticket already has entries in the manifest.
|
|
5
|
+
*
|
|
6
|
+
* @param jiraTicket - JIRA ticket identifier (e.g., "CMS-18384"), or undefined
|
|
7
|
+
* @param manifest - The upgrade manifest to check against
|
|
8
|
+
* @returns Conflict check result with matching entries
|
|
9
|
+
*/
|
|
10
|
+
export declare function checkConflict(jiraTicket: string | undefined, manifest: UpgradeManifest): ConflictCheckResult;
|
|
11
|
+
/**
|
|
12
|
+
* Resolve a conflict by either replacing existing entries or adding alongside them.
|
|
13
|
+
*
|
|
14
|
+
* @param manifest - The current upgrade manifest
|
|
15
|
+
* @param newEntry - The new manifest entry to add
|
|
16
|
+
* @param jiraTicket - The JIRA ticket that has a conflict
|
|
17
|
+
* @param decision - Whether to replace existing entries or add separately
|
|
18
|
+
* @returns A new manifest with the conflict resolved
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveConflict(manifest: UpgradeManifest, newEntry: ManifestEntry, jiraTicket: string, decision: 'replace' | 'add_separate'): UpgradeManifest;
|
|
21
|
+
//# sourceMappingURL=conflict-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-resolver.d.ts","sourceRoot":"","sources":["../../src/capture/conflict-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,QAAQ,EAAE,eAAe,GACxB,mBAAmB,CAarB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,SAAS,GAAG,cAAc,GACnC,eAAe,CAqBjB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check whether a JIRA ticket already has entries in the manifest.
|
|
3
|
+
*
|
|
4
|
+
* @param jiraTicket - JIRA ticket identifier (e.g., "CMS-18384"), or undefined
|
|
5
|
+
* @param manifest - The upgrade manifest to check against
|
|
6
|
+
* @returns Conflict check result with matching entries
|
|
7
|
+
*/
|
|
8
|
+
export function checkConflict(jiraTicket, manifest) {
|
|
9
|
+
if (!jiraTicket) {
|
|
10
|
+
return { hasConflict: false, existingEntries: [] };
|
|
11
|
+
}
|
|
12
|
+
const existing = manifest.entries.filter((e) => e.jira_ticket === jiraTicket);
|
|
13
|
+
return {
|
|
14
|
+
hasConflict: existing.length > 0,
|
|
15
|
+
existingEntries: existing,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Resolve a conflict by either replacing existing entries or adding alongside them.
|
|
20
|
+
*
|
|
21
|
+
* @param manifest - The current upgrade manifest
|
|
22
|
+
* @param newEntry - The new manifest entry to add
|
|
23
|
+
* @param jiraTicket - The JIRA ticket that has a conflict
|
|
24
|
+
* @param decision - Whether to replace existing entries or add separately
|
|
25
|
+
* @returns A new manifest with the conflict resolved
|
|
26
|
+
*/
|
|
27
|
+
export function resolveConflict(manifest, newEntry, jiraTicket, decision) {
|
|
28
|
+
if (newEntry.jira_ticket && jiraTicket !== newEntry.jira_ticket) {
|
|
29
|
+
throw new Error(`Ticket mismatch: resolving for ${jiraTicket} but entry has ${newEntry.jira_ticket}`);
|
|
30
|
+
}
|
|
31
|
+
if (decision === 'replace') {
|
|
32
|
+
return {
|
|
33
|
+
...manifest,
|
|
34
|
+
entries: [
|
|
35
|
+
...manifest.entries.filter((e) => e.jira_ticket !== jiraTicket),
|
|
36
|
+
newEntry,
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
...manifest,
|
|
42
|
+
entries: [...manifest.entries, newEntry],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=conflict-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-resolver.js","sourceRoot":"","sources":["../../src/capture/conflict-resolver.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,UAA8B,EAC9B,QAAyB;IAEzB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,UAAU,CACpC,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;QAChC,eAAe,EAAE,QAAQ;KAC1B,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAyB,EACzB,QAAuB,EACvB,UAAkB,EAClB,QAAoC;IAEpC,IAAI,QAAQ,CAAC,WAAW,IAAI,UAAU,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CACb,kCAAkC,UAAU,kBAAkB,QAAQ,CAAC,WAAW,EAAE,CACrF,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO;YACL,GAAG,QAAQ;YACX,OAAO,EAAE;gBACP,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,UAAU,CAAC;gBAC/D,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;KACzC,CAAC;AACJ,CAAC"}
|