@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,250 @@
|
|
|
1
|
+
import semver from 'semver';
|
|
2
|
+
import { createLogger } from '../utils/logger.js';
|
|
3
|
+
const logger = createLogger({ prefix: 'plan-generator' });
|
|
4
|
+
/**
|
|
5
|
+
* Deduplicate matches by entry ID, keeping the first (earliest version) occurrence.
|
|
6
|
+
* Logs a warning for each duplicate found.
|
|
7
|
+
*/
|
|
8
|
+
function deduplicateMatches(matches) {
|
|
9
|
+
const seen = new Map();
|
|
10
|
+
const result = [];
|
|
11
|
+
for (const match of matches) {
|
|
12
|
+
const id = match.entry.id;
|
|
13
|
+
const existing = seen.get(id);
|
|
14
|
+
if (existing) {
|
|
15
|
+
logger.warn(`Duplicate entry "${id}" in ${match.fromVersion} (already in ${existing}), skipping`);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
seen.set(id, match.fromVersion);
|
|
19
|
+
result.push(match);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Topologically sort matches by their dependencies.
|
|
26
|
+
* Uses Kahn's algorithm for topological sorting.
|
|
27
|
+
* Deduplicates entries by ID before sorting.
|
|
28
|
+
*/
|
|
29
|
+
export function orderStepsByDependency(matches) {
|
|
30
|
+
const deduplicated = deduplicateMatches(matches);
|
|
31
|
+
const entryMap = new Map();
|
|
32
|
+
const inDegree = new Map();
|
|
33
|
+
const dependents = new Map();
|
|
34
|
+
for (const match of deduplicated) {
|
|
35
|
+
const id = match.entry.id;
|
|
36
|
+
entryMap.set(id, match);
|
|
37
|
+
inDegree.set(id, 0);
|
|
38
|
+
dependents.set(id, []);
|
|
39
|
+
}
|
|
40
|
+
// Calculate in-degrees and build reverse dependency map
|
|
41
|
+
for (const match of deduplicated) {
|
|
42
|
+
const id = match.entry.id;
|
|
43
|
+
const deps = match.entry.depends_on ?? [];
|
|
44
|
+
for (const dep of deps) {
|
|
45
|
+
if (entryMap.has(dep)) {
|
|
46
|
+
inDegree.set(id, (inDegree.get(id) ?? 0) + 1);
|
|
47
|
+
dependents.get(dep)?.push(id);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Kahn's algorithm
|
|
52
|
+
const queue = [];
|
|
53
|
+
const result = [];
|
|
54
|
+
for (const [id, degree] of inDegree.entries()) {
|
|
55
|
+
if (degree === 0) {
|
|
56
|
+
queue.push(id);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Sort queue by version for consistent ordering
|
|
60
|
+
queue.sort((a, b) => {
|
|
61
|
+
const matchA = entryMap.get(a);
|
|
62
|
+
const matchB = entryMap.get(b);
|
|
63
|
+
return semver.compare(matchA.fromVersion, matchB.fromVersion);
|
|
64
|
+
});
|
|
65
|
+
while (queue.length > 0) {
|
|
66
|
+
const id = queue.shift();
|
|
67
|
+
const match = entryMap.get(id);
|
|
68
|
+
if (match) {
|
|
69
|
+
result.push(match);
|
|
70
|
+
// Decrease in-degree of dependents
|
|
71
|
+
for (const dependent of dependents.get(id) ?? []) {
|
|
72
|
+
const newDegree = (inDegree.get(dependent) ?? 1) - 1;
|
|
73
|
+
inDegree.set(dependent, newDegree);
|
|
74
|
+
if (newDegree === 0) {
|
|
75
|
+
// Insert in sorted position to maintain deterministic version ordering
|
|
76
|
+
const depMatch = entryMap.get(dependent);
|
|
77
|
+
const insertIdx = queue.findIndex((q) => {
|
|
78
|
+
const qMatch = entryMap.get(q);
|
|
79
|
+
return semver.compare(depMatch.fromVersion, qMatch.fromVersion) < 0;
|
|
80
|
+
});
|
|
81
|
+
if (insertIdx === -1) {
|
|
82
|
+
queue.push(dependent);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
queue.splice(insertIdx, 0, dependent);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Detect circular dependencies
|
|
92
|
+
if (result.length !== deduplicated.length) {
|
|
93
|
+
const orderedIds = new Set(result.map((m) => m.entry.id));
|
|
94
|
+
const remaining = deduplicated.filter((m) => !orderedIds.has(m.entry.id));
|
|
95
|
+
const cycleIds = remaining.map((m) => `${m.entry.id} (${m.fromVersion})`).join(', ');
|
|
96
|
+
throw new Error(`Circular dependency detected in manifest entries: ${cycleIds}. ` +
|
|
97
|
+
`Fix the depends_on fields before generating a plan.`);
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Create a plan step from an entry match.
|
|
103
|
+
*/
|
|
104
|
+
function createPlanStep(match, stepNumber) {
|
|
105
|
+
return {
|
|
106
|
+
stepNumber,
|
|
107
|
+
entryId: match.entry.id,
|
|
108
|
+
fromVersion: match.fromVersion,
|
|
109
|
+
description: match.entry.description,
|
|
110
|
+
type: match.entry.type,
|
|
111
|
+
automatable: match.entry.automatable,
|
|
112
|
+
affectedFiles: match.affectedFiles,
|
|
113
|
+
affectedFileCount: match.affectedFileCount,
|
|
114
|
+
status: 'pending',
|
|
115
|
+
analysis: match.aiAnalysis,
|
|
116
|
+
detectionPatterns: match.entry.detection_patterns,
|
|
117
|
+
aiGuidance: match.entry.ai_guidance,
|
|
118
|
+
documentationUrl: match.entry.documentation_url,
|
|
119
|
+
manualSteps: match.entry.manual_steps,
|
|
120
|
+
riskLevel: match.entry.risk_level ?? 2,
|
|
121
|
+
patterns: match.entry.patterns,
|
|
122
|
+
fileGlobs: match.entry.file_globs,
|
|
123
|
+
docSearchKeywords: match.entry.doc_search_keywords,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Calculate plan summary statistics.
|
|
128
|
+
*/
|
|
129
|
+
function calculateSummary(steps) {
|
|
130
|
+
const automatedSteps = steps.filter((s) => s.automatable === 'true').length;
|
|
131
|
+
const aiAssistedSteps = steps.filter((s) => s.automatable === 'partial').length;
|
|
132
|
+
const manualSteps = steps.filter((s) => s.automatable === 'false').length;
|
|
133
|
+
const totalFilesAffected = steps.reduce((sum, s) => sum + s.affectedFileCount, 0);
|
|
134
|
+
const totalRisk = steps.reduce((sum, s) => sum + s.riskLevel, 0);
|
|
135
|
+
const averageRiskLevel = steps.length > 0 ? totalRisk / steps.length : 0;
|
|
136
|
+
return {
|
|
137
|
+
totalSteps: steps.length,
|
|
138
|
+
automatedSteps,
|
|
139
|
+
aiAssistedSteps,
|
|
140
|
+
manualSteps,
|
|
141
|
+
totalFilesAffected,
|
|
142
|
+
averageRiskLevel: Math.round(averageRiskLevel * 10) / 10,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Manual steps for Configuration Verifier gate steps.
|
|
147
|
+
*/
|
|
148
|
+
const cvManualSteps = [
|
|
149
|
+
'Run: mvn -P cargo.run,verify-configuration -Drepo.path=./storage',
|
|
150
|
+
'Wait for the CMS to start and the verifier to complete',
|
|
151
|
+
'Check configuration-verifier-output/ for delta files',
|
|
152
|
+
];
|
|
153
|
+
/**
|
|
154
|
+
* Generate a complete upgrade plan from matched entries.
|
|
155
|
+
*/
|
|
156
|
+
export function generatePlan(matches, fromVersion, toVersion, upgradePathVersions, discoveryFile, options) {
|
|
157
|
+
const applicableMatches = options?.includeNonApplicable
|
|
158
|
+
? matches
|
|
159
|
+
: matches.filter((m) => m.applies);
|
|
160
|
+
const orderedMatches = orderStepsByDependency(applicableMatches);
|
|
161
|
+
// Partition: separate informational entries from actionable ones
|
|
162
|
+
const actionableMatches = orderedMatches.filter((m) => !m.entry.informational);
|
|
163
|
+
const informationalEntries = orderedMatches
|
|
164
|
+
.filter((m) => m.entry.informational)
|
|
165
|
+
.map((m) => m.entry);
|
|
166
|
+
const steps = [];
|
|
167
|
+
// Prepend a synthetic Configuration Verifier pre-check step.
|
|
168
|
+
// This captures a baseline before any upgrade steps are applied.
|
|
169
|
+
steps.push({
|
|
170
|
+
stepNumber: steps.length + 1,
|
|
171
|
+
entryId: 'cv-pre-check',
|
|
172
|
+
fromVersion,
|
|
173
|
+
description: 'Run Configuration Verifier (pre-upgrade baseline)',
|
|
174
|
+
type: 'verification_gate',
|
|
175
|
+
automatable: 'false',
|
|
176
|
+
affectedFiles: [],
|
|
177
|
+
affectedFileCount: 0,
|
|
178
|
+
status: 'pending',
|
|
179
|
+
riskLevel: 1,
|
|
180
|
+
manualSteps: cvManualSteps,
|
|
181
|
+
});
|
|
182
|
+
// Inject override resolution step if there are conflicts or redundant overrides
|
|
183
|
+
const classifications = options?.overrideClassifications ?? [];
|
|
184
|
+
const actionableOverrides = classifications.filter((c) => c.category === 'conflict' || c.category === 'redundant');
|
|
185
|
+
if (actionableOverrides.length > 0) {
|
|
186
|
+
const pomFiles = [...new Set(actionableOverrides.map((c) => c.file))];
|
|
187
|
+
steps.push({
|
|
188
|
+
stepNumber: steps.length + 1,
|
|
189
|
+
entryId: 'override-resolution',
|
|
190
|
+
fromVersion,
|
|
191
|
+
description: `Resolve ${String(actionableOverrides.length)} version override(s) before bumping the parent version`,
|
|
192
|
+
type: 'override_resolution',
|
|
193
|
+
automatable: 'true',
|
|
194
|
+
affectedFiles: pomFiles,
|
|
195
|
+
affectedFileCount: pomFiles.length,
|
|
196
|
+
status: 'pending',
|
|
197
|
+
riskLevel: 2,
|
|
198
|
+
// Format: "<property>: <action>" — parsed by OverrideResolutionExecutor
|
|
199
|
+
manualSteps: actionableOverrides.map((c) => `${c.property}: ${c.action}`),
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
// Add a synthetic version bump immediately after the pre-check (and optional
|
|
203
|
+
// override resolution) so subsequent upgrade steps run against the updated
|
|
204
|
+
// dependency set.
|
|
205
|
+
steps.push({
|
|
206
|
+
stepNumber: steps.length + 1,
|
|
207
|
+
entryId: 'version-bump',
|
|
208
|
+
fromVersion,
|
|
209
|
+
toVersion,
|
|
210
|
+
description: `Bump brXM parent version from ${fromVersion} to ${toVersion} in pom.xml`,
|
|
211
|
+
type: 'version_bump',
|
|
212
|
+
automatable: 'true',
|
|
213
|
+
affectedFiles: ['pom.xml'],
|
|
214
|
+
affectedFileCount: 1,
|
|
215
|
+
status: 'pending',
|
|
216
|
+
riskLevel: 1,
|
|
217
|
+
});
|
|
218
|
+
// Add manifest-sourced steps (actionable only) with dynamic numbering based on current steps array length.
|
|
219
|
+
for (let i = 0; i < actionableMatches.length; i++) {
|
|
220
|
+
steps.push(createPlanStep(actionableMatches[i], steps.length + 1));
|
|
221
|
+
}
|
|
222
|
+
// Append a synthetic Configuration Verifier post-check step.
|
|
223
|
+
// This validates the upgrade by comparing against the pre-upgrade baseline.
|
|
224
|
+
steps.push({
|
|
225
|
+
stepNumber: steps.length + 1,
|
|
226
|
+
entryId: 'cv-post-check',
|
|
227
|
+
fromVersion,
|
|
228
|
+
description: 'Run Configuration Verifier (post-upgrade validation)',
|
|
229
|
+
type: 'verification_gate',
|
|
230
|
+
automatable: 'false',
|
|
231
|
+
affectedFiles: [],
|
|
232
|
+
affectedFileCount: 0,
|
|
233
|
+
status: 'pending',
|
|
234
|
+
riskLevel: 1,
|
|
235
|
+
manualSteps: cvManualSteps,
|
|
236
|
+
});
|
|
237
|
+
const summary = calculateSummary(steps);
|
|
238
|
+
return {
|
|
239
|
+
generatedAt: new Date().toISOString(),
|
|
240
|
+
fromVersion,
|
|
241
|
+
toVersion,
|
|
242
|
+
upgradePathVersions,
|
|
243
|
+
summary,
|
|
244
|
+
steps,
|
|
245
|
+
aiAnalysisEnabled: false,
|
|
246
|
+
discoveryFile,
|
|
247
|
+
informationalEntries,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=plan-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-generator.js","sourceRoot":"","sources":["../../src/planning/plan-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { ManifestEntry, EntryMatch, UpgradeManifest } from './types.js';
|
|
2
|
+
import type { ProjectContext } from '../discovery/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Options for matching entries to a project.
|
|
5
|
+
*/
|
|
6
|
+
export interface MatchOptions {
|
|
7
|
+
/** Project root directory */
|
|
8
|
+
projectRoot: string;
|
|
9
|
+
/** Enable verbose logging */
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Pre-scanned list of all project text files, used by partial entries for
|
|
13
|
+
* detection pattern matching. When provided, avoids redundant glob scans
|
|
14
|
+
* across multiple entries. Populated automatically by matchManifestsToProject.
|
|
15
|
+
*/
|
|
16
|
+
allProjectFiles?: string[];
|
|
17
|
+
/**
|
|
18
|
+
* Cached file contents keyed by relative path. When provided, avoids redundant
|
|
19
|
+
* file reads across multiple manifest entries. Populated automatically by
|
|
20
|
+
* matchManifestsToProject.
|
|
21
|
+
*/
|
|
22
|
+
fileContentCache?: Map<string, string>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Match a single manifest entry against a project to determine if it applies.
|
|
26
|
+
*
|
|
27
|
+
* The matching strategy depends on the entry's `automatable` level:
|
|
28
|
+
* - `'true'` (fully automated): Scans files matching `file_globs` for `patterns`.
|
|
29
|
+
* Applies only if at least one file contains a matching pattern.
|
|
30
|
+
* - `'partial'` (AI-assisted): Checks for `detection_patterns` in project files.
|
|
31
|
+
* If no detection patterns are specified, assumes the entry applies.
|
|
32
|
+
* - `'false'` (manual): Always applies; the user must review manually.
|
|
33
|
+
*
|
|
34
|
+
* @param entry - The manifest entry to evaluate
|
|
35
|
+
* @param fromVersion - The version this entry belongs to
|
|
36
|
+
* @param _context - The discovered project context (reserved for future use)
|
|
37
|
+
* @param options - Match options including project root
|
|
38
|
+
* @returns An {@link EntryMatch} describing whether and how the entry applies
|
|
39
|
+
*/
|
|
40
|
+
export declare function matchEntryToProject(entry: ManifestEntry, fromVersion: string, _context: ProjectContext, options: MatchOptions): Promise<EntryMatch>;
|
|
41
|
+
/**
|
|
42
|
+
* Match all entries in a manifest against a project.
|
|
43
|
+
*
|
|
44
|
+
* @param manifest - The upgrade manifest to evaluate
|
|
45
|
+
* @param context - The discovered project context
|
|
46
|
+
* @param options - Match options including project root
|
|
47
|
+
* @returns Array of {@link EntryMatch} results, one per manifest entry
|
|
48
|
+
*/
|
|
49
|
+
export declare function matchManifestToProject(manifest: UpgradeManifest, context: ProjectContext, options: MatchOptions): Promise<EntryMatch[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Match entries from multiple manifests against a project.
|
|
52
|
+
*
|
|
53
|
+
* This is useful when upgrading across several versions, where each version
|
|
54
|
+
* has its own manifest of changes.
|
|
55
|
+
*
|
|
56
|
+
* Pre-scans text files once and shares a content cache across all manifests
|
|
57
|
+
* so that each file is read from disk at most once.
|
|
58
|
+
*
|
|
59
|
+
* @param manifests - The upgrade manifests to evaluate (in version order)
|
|
60
|
+
* @param context - The discovered project context
|
|
61
|
+
* @param options - Match options including project root
|
|
62
|
+
* @returns Flat array of {@link EntryMatch} results across all manifests
|
|
63
|
+
*/
|
|
64
|
+
export declare function matchManifestsToProject(manifests: UpgradeManifest[], context: ProjectContext, options: MatchOptions): Promise<EntryMatch[]>;
|
|
65
|
+
//# sourceMappingURL=project-matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-matcher.d.ts","sourceRoot":"","sources":["../../src/planning/project-matcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,eAAe,EAEhB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM5D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAyKD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,UAAU,CAAC,CAsDrB;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,UAAU,EAAE,CAAC,CAsBvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,eAAe,EAAE,EAC5B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,UAAU,EAAE,CAAC,CA0BvB"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { glob } from 'glob';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { createLogger } from '../utils/logger.js';
|
|
5
|
+
import { applyPatternsToContent } from '../execution/file-transformer.js';
|
|
6
|
+
const logger = createLogger({ prefix: 'project-matcher' });
|
|
7
|
+
/** Directory patterns to exclude when scanning project files. */
|
|
8
|
+
const IGNORE_PATTERNS = ['**/node_modules/**', '**/target/**', '**/.git/**', '**/configuration-verifier-output/**'];
|
|
9
|
+
/**
|
|
10
|
+
* Glob patterns for text files relevant to brXM project detection.
|
|
11
|
+
* These cover source code, configuration, and build files where
|
|
12
|
+
* detection patterns (Java imports, Maven properties, etc.) would appear.
|
|
13
|
+
*/
|
|
14
|
+
const TEXT_FILE_GLOBS = [
|
|
15
|
+
'**/*.java',
|
|
16
|
+
'**/*.xml',
|
|
17
|
+
'**/*.properties',
|
|
18
|
+
'**/*.yaml',
|
|
19
|
+
'**/*.yml',
|
|
20
|
+
'**/*.json',
|
|
21
|
+
'**/*.jsp',
|
|
22
|
+
'**/*.jspx',
|
|
23
|
+
'**/*.js',
|
|
24
|
+
'**/*.ts',
|
|
25
|
+
'**/*.tsx',
|
|
26
|
+
'**/*.jsx',
|
|
27
|
+
'**/*.groovy',
|
|
28
|
+
'**/*.ftl',
|
|
29
|
+
'**/*.html',
|
|
30
|
+
'**/*.css',
|
|
31
|
+
'**/*.scss',
|
|
32
|
+
'**/*.xsd',
|
|
33
|
+
'**/*.cfg',
|
|
34
|
+
'**/*.conf',
|
|
35
|
+
'**/*.gradle',
|
|
36
|
+
'**/*.kt',
|
|
37
|
+
'**/*.scala',
|
|
38
|
+
'**/*.sh',
|
|
39
|
+
];
|
|
40
|
+
/**
|
|
41
|
+
* Find files matching the given glob patterns in the project.
|
|
42
|
+
*
|
|
43
|
+
* @param patterns - Glob patterns to match
|
|
44
|
+
* @param projectRoot - Root directory to search from
|
|
45
|
+
* @returns Array of relative file paths that match
|
|
46
|
+
*/
|
|
47
|
+
async function findMatchingFiles(patterns, projectRoot) {
|
|
48
|
+
const allFiles = new Set();
|
|
49
|
+
for (const pattern of patterns) {
|
|
50
|
+
const matches = await glob(pattern, {
|
|
51
|
+
cwd: projectRoot,
|
|
52
|
+
absolute: false,
|
|
53
|
+
nodir: true,
|
|
54
|
+
ignore: IGNORE_PATTERNS,
|
|
55
|
+
});
|
|
56
|
+
for (const f of matches) {
|
|
57
|
+
allFiles.add(f);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return Array.from(allFiles);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Find text files in the project suitable for detection pattern scanning.
|
|
64
|
+
* Filters to known text file extensions to avoid reading binary files.
|
|
65
|
+
*
|
|
66
|
+
* @param projectRoot - Root directory to search from
|
|
67
|
+
* @returns Array of relative file paths
|
|
68
|
+
*/
|
|
69
|
+
async function findTextFiles(projectRoot) {
|
|
70
|
+
return findMatchingFiles(TEXT_FILE_GLOBS, projectRoot);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Read the content of a file, using the cache if available.
|
|
74
|
+
* Returns `undefined` if the file cannot be read.
|
|
75
|
+
*/
|
|
76
|
+
async function readFileContent(file, projectRoot, cache) {
|
|
77
|
+
if (cache?.has(file)) {
|
|
78
|
+
return cache.get(file);
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const content = await readFile(join(projectRoot, file), 'utf-8');
|
|
82
|
+
cache?.set(file, content);
|
|
83
|
+
return content;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Check if a string matches a pattern. Patterns wrapped in slashes (e.g. `/regex/`)
|
|
91
|
+
* are treated as regular expressions; all others use literal string matching.
|
|
92
|
+
*/
|
|
93
|
+
function matchesPattern(content, pattern) {
|
|
94
|
+
if (pattern.startsWith('/') && pattern.endsWith('/') && pattern.length > 2) {
|
|
95
|
+
try {
|
|
96
|
+
return new RegExp(pattern.slice(1, -1)).test(content);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return content.includes(pattern);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if any of the given files contain at least one of the detection patterns.
|
|
106
|
+
*
|
|
107
|
+
* @param files - Relative file paths to scan
|
|
108
|
+
* @param patterns - String patterns to search for in file contents
|
|
109
|
+
* @param projectRoot - Root directory to resolve file paths against
|
|
110
|
+
* @param cache - Optional content cache to avoid redundant reads
|
|
111
|
+
* @returns `true` if at least one file contains at least one pattern
|
|
112
|
+
*/
|
|
113
|
+
async function filesContainPatterns(files, patterns, projectRoot, cache) {
|
|
114
|
+
for (const file of files) {
|
|
115
|
+
const content = await readFileContent(file, projectRoot, cache);
|
|
116
|
+
if (content === undefined)
|
|
117
|
+
continue;
|
|
118
|
+
for (const pattern of patterns) {
|
|
119
|
+
if (matchesPattern(content, pattern)) {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Count files that would be affected by a set of transformation patterns.
|
|
128
|
+
*
|
|
129
|
+
* @param fileGlobs - Glob patterns for candidate files
|
|
130
|
+
* @param patterns - Transformation patterns whose `match` field is checked
|
|
131
|
+
* @param projectRoot - Root directory to resolve file paths against
|
|
132
|
+
* @param cache - Optional content cache to avoid redundant reads
|
|
133
|
+
* @returns Object with affected file paths and count
|
|
134
|
+
*/
|
|
135
|
+
async function countAffectedFiles(fileGlobs, patterns, projectRoot, cache) {
|
|
136
|
+
const matchingFiles = await findMatchingFiles(fileGlobs, projectRoot);
|
|
137
|
+
const affectedFiles = [];
|
|
138
|
+
for (const file of matchingFiles) {
|
|
139
|
+
const content = await readFileContent(file, projectRoot, cache);
|
|
140
|
+
if (content === undefined)
|
|
141
|
+
continue;
|
|
142
|
+
const transformResult = applyPatternsToContent(content, patterns);
|
|
143
|
+
if (transformResult.hasChanges) {
|
|
144
|
+
affectedFiles.push(file);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return { files: affectedFiles, count: affectedFiles.length };
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Match a single manifest entry against a project to determine if it applies.
|
|
151
|
+
*
|
|
152
|
+
* The matching strategy depends on the entry's `automatable` level:
|
|
153
|
+
* - `'true'` (fully automated): Scans files matching `file_globs` for `patterns`.
|
|
154
|
+
* Applies only if at least one file contains a matching pattern.
|
|
155
|
+
* - `'partial'` (AI-assisted): Checks for `detection_patterns` in project files.
|
|
156
|
+
* If no detection patterns are specified, assumes the entry applies.
|
|
157
|
+
* - `'false'` (manual): Always applies; the user must review manually.
|
|
158
|
+
*
|
|
159
|
+
* @param entry - The manifest entry to evaluate
|
|
160
|
+
* @param fromVersion - The version this entry belongs to
|
|
161
|
+
* @param _context - The discovered project context (reserved for future use)
|
|
162
|
+
* @param options - Match options including project root
|
|
163
|
+
* @returns An {@link EntryMatch} describing whether and how the entry applies
|
|
164
|
+
*/
|
|
165
|
+
export async function matchEntryToProject(entry, fromVersion, _context, options) {
|
|
166
|
+
const match = {
|
|
167
|
+
entry,
|
|
168
|
+
fromVersion,
|
|
169
|
+
applies: false,
|
|
170
|
+
affectedFiles: [],
|
|
171
|
+
affectedFileCount: 0,
|
|
172
|
+
};
|
|
173
|
+
if (entry.automatable === 'true') {
|
|
174
|
+
// For automated entries, check if patterns match any files
|
|
175
|
+
if (entry.patterns && entry.file_globs) {
|
|
176
|
+
const { files, count } = await countAffectedFiles(entry.file_globs, entry.patterns, options.projectRoot, options.fileContentCache);
|
|
177
|
+
match.affectedFiles = files;
|
|
178
|
+
match.affectedFileCount = count;
|
|
179
|
+
match.applies = count > 0;
|
|
180
|
+
match.reason =
|
|
181
|
+
count > 0
|
|
182
|
+
? `Found ${count} file${count === 1 ? '' : 's'} with matching patterns`
|
|
183
|
+
: 'No files match the transformation patterns';
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
match.reason = 'Automated entry missing patterns or file_globs';
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else if (entry.automatable === 'partial') {
|
|
190
|
+
// For partial entries, check if detection patterns are found
|
|
191
|
+
if (entry.detection_patterns && entry.detection_patterns.length > 0) {
|
|
192
|
+
const allFiles = options.allProjectFiles ?? await findTextFiles(options.projectRoot);
|
|
193
|
+
const hasPatterns = await filesContainPatterns(allFiles, entry.detection_patterns, options.projectRoot, options.fileContentCache);
|
|
194
|
+
match.applies = hasPatterns;
|
|
195
|
+
match.reason = hasPatterns
|
|
196
|
+
? 'Detection patterns found in project'
|
|
197
|
+
: 'Detection patterns not found';
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
// If no detection patterns, assume it applies
|
|
201
|
+
match.applies = true;
|
|
202
|
+
match.reason = 'No detection patterns specified, assuming applicable';
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
// Manual entries always apply (user must review)
|
|
207
|
+
match.applies = true;
|
|
208
|
+
match.reason = 'Manual review required for all projects';
|
|
209
|
+
}
|
|
210
|
+
return match;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Match all entries in a manifest against a project.
|
|
214
|
+
*
|
|
215
|
+
* @param manifest - The upgrade manifest to evaluate
|
|
216
|
+
* @param context - The discovered project context
|
|
217
|
+
* @param options - Match options including project root
|
|
218
|
+
* @returns Array of {@link EntryMatch} results, one per manifest entry
|
|
219
|
+
*/
|
|
220
|
+
export async function matchManifestToProject(manifest, context, options) {
|
|
221
|
+
const needsFullScan = manifest.entries.some((e) => e.automatable === 'partial' && e.detection_patterns && e.detection_patterns.length > 0);
|
|
222
|
+
const enrichedOptions = needsFullScan && !options.allProjectFiles
|
|
223
|
+
? { ...options, allProjectFiles: await findTextFiles(options.projectRoot) }
|
|
224
|
+
: options;
|
|
225
|
+
const matches = [];
|
|
226
|
+
for (const entry of manifest.entries) {
|
|
227
|
+
const match = await matchEntryToProject(entry, manifest.version, context, enrichedOptions);
|
|
228
|
+
matches.push(match);
|
|
229
|
+
}
|
|
230
|
+
return matches;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Match entries from multiple manifests against a project.
|
|
234
|
+
*
|
|
235
|
+
* This is useful when upgrading across several versions, where each version
|
|
236
|
+
* has its own manifest of changes.
|
|
237
|
+
*
|
|
238
|
+
* Pre-scans text files once and shares a content cache across all manifests
|
|
239
|
+
* so that each file is read from disk at most once.
|
|
240
|
+
*
|
|
241
|
+
* @param manifests - The upgrade manifests to evaluate (in version order)
|
|
242
|
+
* @param context - The discovered project context
|
|
243
|
+
* @param options - Match options including project root
|
|
244
|
+
* @returns Flat array of {@link EntryMatch} results across all manifests
|
|
245
|
+
*/
|
|
246
|
+
export async function matchManifestsToProject(manifests, context, options) {
|
|
247
|
+
// Check if any manifest needs a full text-file scan for detection patterns
|
|
248
|
+
const needsFullScan = manifests.some((m) => m.entries.some((e) => e.automatable === 'partial' && e.detection_patterns && e.detection_patterns.length > 0));
|
|
249
|
+
// Pre-scan text files once across all manifests and create a shared content cache
|
|
250
|
+
const enrichedOptions = { ...options };
|
|
251
|
+
if (needsFullScan && !options.allProjectFiles) {
|
|
252
|
+
enrichedOptions.allProjectFiles = await findTextFiles(options.projectRoot);
|
|
253
|
+
logger.info(`Scanning ${enrichedOptions.allProjectFiles.length} text files for detection patterns`);
|
|
254
|
+
}
|
|
255
|
+
if (!options.fileContentCache) {
|
|
256
|
+
enrichedOptions.fileContentCache = new Map();
|
|
257
|
+
}
|
|
258
|
+
const allMatches = [];
|
|
259
|
+
for (const manifest of manifests) {
|
|
260
|
+
const matches = await matchManifestToProject(manifest, context, enrichedOptions);
|
|
261
|
+
allMatches.push(...matches);
|
|
262
|
+
}
|
|
263
|
+
return allMatches;
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=project-matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-matcher.js","sourceRoot":"","sources":["../../src/planning/project-matcher.ts"],"names":[],"mappings":"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"}
|