@jterrats/smart-deployment 1.0.3
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 +193 -0
- package/lib/ai/agentforce-error-handler.d.ts +81 -0
- package/lib/ai/agentforce-error-handler.js +196 -0
- package/lib/ai/agentforce-error-handler.js.map +1 -0
- package/lib/ai/agentforce-priority-service.d.ts +82 -0
- package/lib/ai/agentforce-priority-service.js +257 -0
- package/lib/ai/agentforce-priority-service.js.map +1 -0
- package/lib/ai/agentforce-service.d.ts +99 -0
- package/lib/ai/agentforce-service.js +300 -0
- package/lib/ai/agentforce-service.js.map +1 -0
- package/lib/ai/circuit-breaker.d.ts +115 -0
- package/lib/ai/circuit-breaker.js +277 -0
- package/lib/ai/circuit-breaker.js.map +1 -0
- package/lib/ai/dependency-inference-service.d.ts +76 -0
- package/lib/ai/dependency-inference-service.js +220 -0
- package/lib/ai/dependency-inference-service.js.map +1 -0
- package/lib/ai/llm-provider-factory.d.ts +15 -0
- package/lib/ai/llm-provider-factory.js +36 -0
- package/lib/ai/llm-provider-factory.js.map +1 -0
- package/lib/ai/llm-provider.d.ts +27 -0
- package/lib/ai/llm-provider.js +2 -0
- package/lib/ai/llm-provider.js.map +1 -0
- package/lib/ai/openai-service.d.ts +20 -0
- package/lib/ai/openai-service.js +89 -0
- package/lib/ai/openai-service.js.map +1 -0
- package/lib/ai/prompt-builder.d.ts +79 -0
- package/lib/ai/prompt-builder.js +180 -0
- package/lib/ai/prompt-builder.js.map +1 -0
- package/lib/ai/response-parser.d.ts +67 -0
- package/lib/ai/response-parser.js +234 -0
- package/lib/ai/response-parser.js.map +1 -0
- package/lib/ai/wave-validation-service.d.ts +111 -0
- package/lib/ai/wave-validation-service.js +381 -0
- package/lib/ai/wave-validation-service.js.map +1 -0
- package/lib/analysis/analysis-reporter.d.ts +56 -0
- package/lib/analysis/analysis-reporter.js +170 -0
- package/lib/analysis/analysis-reporter.js.map +1 -0
- package/lib/analytics/error-analytics.d.ts +80 -0
- package/lib/analytics/error-analytics.js +162 -0
- package/lib/analytics/error-analytics.js.map +1 -0
- package/lib/commands/analyze.d.ts +49 -0
- package/lib/commands/analyze.js +232 -0
- package/lib/commands/analyze.js.map +1 -0
- package/lib/commands/config.d.ts +42 -0
- package/lib/commands/config.js +219 -0
- package/lib/commands/config.js.map +1 -0
- package/lib/commands/resume.d.ts +26 -0
- package/lib/commands/resume.js +69 -0
- package/lib/commands/resume.js.map +1 -0
- package/lib/commands/start.d.ts +70 -0
- package/lib/commands/start.js +659 -0
- package/lib/commands/start.js.map +1 -0
- package/lib/commands/status.d.ts +37 -0
- package/lib/commands/status.js +69 -0
- package/lib/commands/status.js.map +1 -0
- package/lib/commands/validate.d.ts +33 -0
- package/lib/commands/validate.js +66 -0
- package/lib/commands/validate.js.map +1 -0
- package/lib/config/repo-config.d.ts +22 -0
- package/lib/config/repo-config.js +31 -0
- package/lib/config/repo-config.js.map +1 -0
- package/lib/constants/agentforce-limits.d.ts +174 -0
- package/lib/constants/agentforce-limits.js +262 -0
- package/lib/constants/agentforce-limits.js.map +1 -0
- package/lib/constants/api-version.d.ts +70 -0
- package/lib/constants/api-version.js +122 -0
- package/lib/constants/api-version.js.map +1 -0
- package/lib/constants/deployment-order.d.ts +68 -0
- package/lib/constants/deployment-order.js +162 -0
- package/lib/constants/deployment-order.js.map +1 -0
- package/lib/constants/salesforce-limits.d.ts +107 -0
- package/lib/constants/salesforce-limits.js +104 -0
- package/lib/constants/salesforce-limits.js.map +1 -0
- package/lib/dependencies/circular-dependency-detector.d.ts +137 -0
- package/lib/dependencies/circular-dependency-detector.js +329 -0
- package/lib/dependencies/circular-dependency-detector.js.map +1 -0
- package/lib/dependencies/cycle-remediation-planner.d.ts +50 -0
- package/lib/dependencies/cycle-remediation-planner.js +192 -0
- package/lib/dependencies/cycle-remediation-planner.js.map +1 -0
- package/lib/dependencies/dependency-cache.d.ts +134 -0
- package/lib/dependencies/dependency-cache.js +303 -0
- package/lib/dependencies/dependency-cache.js.map +1 -0
- package/lib/dependencies/dependency-depth-calculator.d.ts +145 -0
- package/lib/dependencies/dependency-depth-calculator.js +368 -0
- package/lib/dependencies/dependency-depth-calculator.js.map +1 -0
- package/lib/dependencies/dependency-graph-builder.d.ts +151 -0
- package/lib/dependencies/dependency-graph-builder.js +411 -0
- package/lib/dependencies/dependency-graph-builder.js.map +1 -0
- package/lib/dependencies/dependency-impact-analyzer.d.ts +145 -0
- package/lib/dependencies/dependency-impact-analyzer.js +330 -0
- package/lib/dependencies/dependency-impact-analyzer.js.map +1 -0
- package/lib/dependencies/dependency-merger.d.ts +122 -0
- package/lib/dependencies/dependency-merger.js +245 -0
- package/lib/dependencies/dependency-merger.js.map +1 -0
- package/lib/dependencies/dependency-resolver.d.ts +157 -0
- package/lib/dependencies/dependency-resolver.js +298 -0
- package/lib/dependencies/dependency-resolver.js.map +1 -0
- package/lib/dependencies/dependency-validator.d.ts +123 -0
- package/lib/dependencies/dependency-validator.js +291 -0
- package/lib/dependencies/dependency-validator.js.map +1 -0
- package/lib/dependencies/graph-visualizer.d.ts +110 -0
- package/lib/dependencies/graph-visualizer.js +262 -0
- package/lib/dependencies/graph-visualizer.js.map +1 -0
- package/lib/dependencies/heuristic-inference.d.ts +136 -0
- package/lib/dependencies/heuristic-inference.js +430 -0
- package/lib/dependencies/heuristic-inference.js.map +1 -0
- package/lib/deployment/cycle-source-editor.d.ts +34 -0
- package/lib/deployment/cycle-source-editor.js +121 -0
- package/lib/deployment/cycle-source-editor.js.map +1 -0
- package/lib/deployment/deployment-error-handler.d.ts +38 -0
- package/lib/deployment/deployment-error-handler.js +79 -0
- package/lib/deployment/deployment-error-handler.js.map +1 -0
- package/lib/deployment/deployment-reporter.d.ts +63 -0
- package/lib/deployment/deployment-reporter.js +150 -0
- package/lib/deployment/deployment-reporter.js.map +1 -0
- package/lib/deployment/deployment-state-summary.d.ts +38 -0
- package/lib/deployment/deployment-state-summary.js +209 -0
- package/lib/deployment/deployment-state-summary.js.map +1 -0
- package/lib/deployment/deployment-status-service.d.ts +36 -0
- package/lib/deployment/deployment-status-service.js +128 -0
- package/lib/deployment/deployment-status-service.js.map +1 -0
- package/lib/deployment/deployment-tracker.d.ts +42 -0
- package/lib/deployment/deployment-tracker.js +79 -0
- package/lib/deployment/deployment-tracker.js.map +1 -0
- package/lib/deployment/deployment-validation-service.d.ts +28 -0
- package/lib/deployment/deployment-validation-service.js +161 -0
- package/lib/deployment/deployment-validation-service.js.map +1 -0
- package/lib/deployment/retry-handler.d.ts +37 -0
- package/lib/deployment/retry-handler.js +86 -0
- package/lib/deployment/retry-handler.js.map +1 -0
- package/lib/deployment/sf-cli-integration.d.ts +42 -0
- package/lib/deployment/sf-cli-integration.js +105 -0
- package/lib/deployment/sf-cli-integration.js.map +1 -0
- package/lib/deployment/state-manager.d.ts +61 -0
- package/lib/deployment/state-manager.js +83 -0
- package/lib/deployment/state-manager.js.map +1 -0
- package/lib/deployment/test-executor.d.ts +41 -0
- package/lib/deployment/test-executor.js +87 -0
- package/lib/deployment/test-executor.js.map +1 -0
- package/lib/errors/base-error.d.ts +24 -0
- package/lib/errors/base-error.js +66 -0
- package/lib/errors/base-error.js.map +1 -0
- package/lib/errors/dependency-error.d.ts +37 -0
- package/lib/errors/dependency-error.js +76 -0
- package/lib/errors/dependency-error.js.map +1 -0
- package/lib/errors/deployment-error.d.ts +55 -0
- package/lib/errors/deployment-error.js +132 -0
- package/lib/errors/deployment-error.js.map +1 -0
- package/lib/errors/index.d.ts +45 -0
- package/lib/errors/index.js +71 -0
- package/lib/errors/index.js.map +1 -0
- package/lib/errors/network-error.d.ts +53 -0
- package/lib/errors/network-error.js +111 -0
- package/lib/errors/network-error.js.map +1 -0
- package/lib/errors/parsing-error.d.ts +41 -0
- package/lib/errors/parsing-error.js +69 -0
- package/lib/errors/parsing-error.js.map +1 -0
- package/lib/errors/validation-error-reporter.d.ts +34 -0
- package/lib/errors/validation-error-reporter.js +99 -0
- package/lib/errors/validation-error-reporter.js.map +1 -0
- package/lib/errors/validation-error.d.ts +58 -0
- package/lib/errors/validation-error.js +131 -0
- package/lib/errors/validation-error.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/monitoring/performance-monitor.d.ts +98 -0
- package/lib/monitoring/performance-monitor.js +260 -0
- package/lib/monitoring/performance-monitor.js.map +1 -0
- package/lib/parsers/apex-class-parser.d.ts +47 -0
- package/lib/parsers/apex-class-parser.js +368 -0
- package/lib/parsers/apex-class-parser.js.map +1 -0
- package/lib/parsers/apex-trigger-parser.d.ts +48 -0
- package/lib/parsers/apex-trigger-parser.js +229 -0
- package/lib/parsers/apex-trigger-parser.js.map +1 -0
- package/lib/parsers/aura-parser.d.ts +55 -0
- package/lib/parsers/aura-parser.js +229 -0
- package/lib/parsers/aura-parser.js.map +1 -0
- package/lib/parsers/bot-parser.d.ts +65 -0
- package/lib/parsers/bot-parser.js +225 -0
- package/lib/parsers/bot-parser.js.map +1 -0
- package/lib/parsers/custom-metadata-parser.d.ts +94 -0
- package/lib/parsers/custom-metadata-parser.js +199 -0
- package/lib/parsers/custom-metadata-parser.js.map +1 -0
- package/lib/parsers/custom-object-parser.d.ts +62 -0
- package/lib/parsers/custom-object-parser.js +297 -0
- package/lib/parsers/custom-object-parser.js.map +1 -0
- package/lib/parsers/email-template-parser.d.ts +64 -0
- package/lib/parsers/email-template-parser.js +238 -0
- package/lib/parsers/email-template-parser.js.map +1 -0
- package/lib/parsers/error-resilient-parser.d.ts +110 -0
- package/lib/parsers/error-resilient-parser.js +277 -0
- package/lib/parsers/error-resilient-parser.js.map +1 -0
- package/lib/parsers/flexipage-parser.d.ts +64 -0
- package/lib/parsers/flexipage-parser.js +196 -0
- package/lib/parsers/flexipage-parser.js.map +1 -0
- package/lib/parsers/flow-parser.d.ts +54 -0
- package/lib/parsers/flow-parser.js +287 -0
- package/lib/parsers/flow-parser.js.map +1 -0
- package/lib/parsers/genai-prompt-parser.d.ts +67 -0
- package/lib/parsers/genai-prompt-parser.js +160 -0
- package/lib/parsers/genai-prompt-parser.js.map +1 -0
- package/lib/parsers/layout-parser.d.ts +64 -0
- package/lib/parsers/layout-parser.js +267 -0
- package/lib/parsers/layout-parser.js.map +1 -0
- package/lib/parsers/lwc-parser.d.ts +60 -0
- package/lib/parsers/lwc-parser.js +264 -0
- package/lib/parsers/lwc-parser.js.map +1 -0
- package/lib/parsers/permission-set-parser.d.ts +86 -0
- package/lib/parsers/permission-set-parser.js +152 -0
- package/lib/parsers/permission-set-parser.js.map +1 -0
- package/lib/parsers/profile-parser.d.ts +81 -0
- package/lib/parsers/profile-parser.js +141 -0
- package/lib/parsers/profile-parser.js.map +1 -0
- package/lib/parsers/visualforce-parser.d.ts +47 -0
- package/lib/parsers/visualforce-parser.js +180 -0
- package/lib/parsers/visualforce-parser.js.map +1 -0
- package/lib/provisioning/data-provisioner.d.ts +88 -0
- package/lib/provisioning/data-provisioner.js +257 -0
- package/lib/provisioning/data-provisioner.js.map +1 -0
- package/lib/scanner/custom-structure-scanner.d.ts +66 -0
- package/lib/scanner/custom-structure-scanner.js +229 -0
- package/lib/scanner/custom-structure-scanner.js.map +1 -0
- package/lib/scanner/forceignore-parser.d.ts +69 -0
- package/lib/scanner/forceignore-parser.js +195 -0
- package/lib/scanner/forceignore-parser.js.map +1 -0
- package/lib/scanner/metadata-format-scanner.d.ts +77 -0
- package/lib/scanner/metadata-format-scanner.js +282 -0
- package/lib/scanner/metadata-format-scanner.js.map +1 -0
- package/lib/scanner/monorepo-scanner.d.ts +71 -0
- package/lib/scanner/monorepo-scanner.js +225 -0
- package/lib/scanner/monorepo-scanner.js.map +1 -0
- package/lib/scanner/project-validator.d.ts +55 -0
- package/lib/scanner/project-validator.js +235 -0
- package/lib/scanner/project-validator.js.map +1 -0
- package/lib/scanner/sfdx-project-detector.d.ts +86 -0
- package/lib/scanner/sfdx-project-detector.js +240 -0
- package/lib/scanner/sfdx-project-detector.js.map +1 -0
- package/lib/scanner/structure-validator.d.ts +64 -0
- package/lib/scanner/structure-validator.js +296 -0
- package/lib/scanner/structure-validator.js.map +1 -0
- package/lib/services/metadata-scanner-service.d.ts +64 -0
- package/lib/services/metadata-scanner-service.js +651 -0
- package/lib/services/metadata-scanner-service.js.map +1 -0
- package/lib/types/agentforce.d.ts +157 -0
- package/lib/types/agentforce.js +2 -0
- package/lib/types/agentforce.js.map +1 -0
- package/lib/types/dependency.d.ts +98 -0
- package/lib/types/dependency.js +5 -0
- package/lib/types/dependency.js.map +1 -0
- package/lib/types/deployment-plan.d.ts +81 -0
- package/lib/types/deployment-plan.js +6 -0
- package/lib/types/deployment-plan.js.map +1 -0
- package/lib/types/deployment.d.ts +88 -0
- package/lib/types/deployment.js +5 -0
- package/lib/types/deployment.js.map +1 -0
- package/lib/types/graph.d.ts +35 -0
- package/lib/types/graph.js +5 -0
- package/lib/types/graph.js.map +1 -0
- package/lib/types/index.d.ts +12 -0
- package/lib/types/index.js +17 -0
- package/lib/types/index.js.map +1 -0
- package/lib/types/metadata.d.ts +101 -0
- package/lib/types/metadata.js +13 -0
- package/lib/types/metadata.js.map +1 -0
- package/lib/types/project.d.ts +156 -0
- package/lib/types/project.js +56 -0
- package/lib/types/project.js.map +1 -0
- package/lib/types/salesforce/apex.d.ts +94 -0
- package/lib/types/salesforce/apex.js +6 -0
- package/lib/types/salesforce/apex.js.map +1 -0
- package/lib/types/salesforce/aura.d.ts +150 -0
- package/lib/types/salesforce/aura.js +6 -0
- package/lib/types/salesforce/aura.js.map +1 -0
- package/lib/types/salesforce/bot.d.ts +293 -0
- package/lib/types/salesforce/bot.js +6 -0
- package/lib/types/salesforce/bot.js.map +1 -0
- package/lib/types/salesforce/common.d.ts +15 -0
- package/lib/types/salesforce/common.js +5 -0
- package/lib/types/salesforce/common.js.map +1 -0
- package/lib/types/salesforce/custom-metadata.d.ts +92 -0
- package/lib/types/salesforce/custom-metadata.js +6 -0
- package/lib/types/salesforce/custom-metadata.js.map +1 -0
- package/lib/types/salesforce/email.d.ts +56 -0
- package/lib/types/salesforce/email.js +6 -0
- package/lib/types/salesforce/email.js.map +1 -0
- package/lib/types/salesforce/flexipage.d.ts +149 -0
- package/lib/types/salesforce/flexipage.js +6 -0
- package/lib/types/salesforce/flexipage.js.map +1 -0
- package/lib/types/salesforce/flow.d.ts +516 -0
- package/lib/types/salesforce/flow.js +6 -0
- package/lib/types/salesforce/flow.js.map +1 -0
- package/lib/types/salesforce/genai.d.ts +67 -0
- package/lib/types/salesforce/genai.js +6 -0
- package/lib/types/salesforce/genai.js.map +1 -0
- package/lib/types/salesforce/index.d.ts +27 -0
- package/lib/types/salesforce/index.js +43 -0
- package/lib/types/salesforce/index.js.map +1 -0
- package/lib/types/salesforce/layout.d.ts +236 -0
- package/lib/types/salesforce/layout.js +6 -0
- package/lib/types/salesforce/layout.js.map +1 -0
- package/lib/types/salesforce/lwc.d.ts +123 -0
- package/lib/types/salesforce/lwc.js +6 -0
- package/lib/types/salesforce/lwc.js.map +1 -0
- package/lib/types/salesforce/object.d.ts +427 -0
- package/lib/types/salesforce/object.js +6 -0
- package/lib/types/salesforce/object.js.map +1 -0
- package/lib/types/salesforce/parser-types.d.ts +79 -0
- package/lib/types/salesforce/parser-types.js +80 -0
- package/lib/types/salesforce/parser-types.js.map +1 -0
- package/lib/types/salesforce/permission.d.ts +289 -0
- package/lib/types/salesforce/permission.js +6 -0
- package/lib/types/salesforce/permission.js.map +1 -0
- package/lib/types/salesforce/resource.d.ts +93 -0
- package/lib/types/salesforce/resource.js +6 -0
- package/lib/types/salesforce/resource.js.map +1 -0
- package/lib/types/salesforce/visualforce.d.ts +70 -0
- package/lib/types/salesforce/visualforce.js +6 -0
- package/lib/types/salesforce/visualforce.js.map +1 -0
- package/lib/utils/cache-manager.d.ts +158 -0
- package/lib/utils/cache-manager.js +429 -0
- package/lib/utils/cache-manager.js.map +1 -0
- package/lib/utils/deployment-plan-manager.d.ts +40 -0
- package/lib/utils/deployment-plan-manager.js +183 -0
- package/lib/utils/deployment-plan-manager.js.map +1 -0
- package/lib/utils/error-aggregator.d.ts +117 -0
- package/lib/utils/error-aggregator.js +268 -0
- package/lib/utils/error-aggregator.js.map +1 -0
- package/lib/utils/file-system.d.ts +62 -0
- package/lib/utils/file-system.js +167 -0
- package/lib/utils/file-system.js.map +1 -0
- package/lib/utils/functional.d.ts +52 -0
- package/lib/utils/functional.js +61 -0
- package/lib/utils/functional.js.map +1 -0
- package/lib/utils/graph-algorithms.d.ts +53 -0
- package/lib/utils/graph-algorithms.js +177 -0
- package/lib/utils/graph-algorithms.js.map +1 -0
- package/lib/utils/logger.d.ts +154 -0
- package/lib/utils/logger.js +327 -0
- package/lib/utils/logger.js.map +1 -0
- package/lib/utils/network-handler.d.ts +64 -0
- package/lib/utils/network-handler.js +147 -0
- package/lib/utils/network-handler.js.map +1 -0
- package/lib/utils/performance.d.ts +148 -0
- package/lib/utils/performance.js +294 -0
- package/lib/utils/performance.js.map +1 -0
- package/lib/utils/string.d.ts +197 -0
- package/lib/utils/string.js +331 -0
- package/lib/utils/string.js.map +1 -0
- package/lib/utils/xml.d.ts +97 -0
- package/lib/utils/xml.js +227 -0
- package/lib/utils/xml.js.map +1 -0
- package/lib/validators/xml-metadata-validator.d.ts +106 -0
- package/lib/validators/xml-metadata-validator.js +509 -0
- package/lib/validators/xml-metadata-validator.js.map +1 -0
- package/lib/waves/priority-wave-generator-ai.d.ts +85 -0
- package/lib/waves/priority-wave-generator-ai.js +191 -0
- package/lib/waves/priority-wave-generator-ai.js.map +1 -0
- package/lib/waves/priority-wave-generator.d.ts +47 -0
- package/lib/waves/priority-wave-generator.js +88 -0
- package/lib/waves/priority-wave-generator.js.map +1 -0
- package/lib/waves/test-optimizer.d.ts +155 -0
- package/lib/waves/test-optimizer.js +290 -0
- package/lib/waves/test-optimizer.js.map +1 -0
- package/lib/waves/wave-builder.d.ts +147 -0
- package/lib/waves/wave-builder.js +286 -0
- package/lib/waves/wave-builder.js.map +1 -0
- package/lib/waves/wave-diff-generator.d.ts +17 -0
- package/lib/waves/wave-diff-generator.js +6 -0
- package/lib/waves/wave-diff-generator.js.map +1 -0
- package/lib/waves/wave-executor.d.ts +33 -0
- package/lib/waves/wave-executor.js +50 -0
- package/lib/waves/wave-executor.js.map +1 -0
- package/lib/waves/wave-merger.d.ts +96 -0
- package/lib/waves/wave-merger.js +181 -0
- package/lib/waves/wave-merger.js.map +1 -0
- package/lib/waves/wave-metadata-generator.d.ts +13 -0
- package/lib/waves/wave-metadata-generator.js +12 -0
- package/lib/waves/wave-metadata-generator.js.map +1 -0
- package/lib/waves/wave-splitter.d.ts +154 -0
- package/lib/waves/wave-splitter.js +307 -0
- package/lib/waves/wave-splitter.js.map +1 -0
- package/lib/waves/wave-validator.d.ts +17 -0
- package/lib/waves/wave-validator.js +15 -0
- package/lib/waves/wave-validator.js.map +1 -0
- package/messages/analyze.json +18 -0
- package/messages/config.json +29 -0
- package/messages/resume.json +9 -0
- package/messages/start.json +24 -0
- package/messages/status.json +8 -0
- package/messages/validate.json +9 -0
- package/npm-shrinkwrap.json +25676 -0
- package/oclif.lock +11988 -0
- package/oclif.manifest.json +589 -0
- package/package.json +224 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Impact Analyzer
|
|
3
|
+
* Analyzes the impact of changes to components in the dependency graph
|
|
4
|
+
*
|
|
5
|
+
* @ac US-032-AC-1: Given a component, find all dependents
|
|
6
|
+
* @ac US-032-AC-2: Calculate impact radius
|
|
7
|
+
* @ac US-032-AC-3: Identify critical components
|
|
8
|
+
* @ac US-032-AC-4: Generate impact report
|
|
9
|
+
* @ac US-032-AC-5: Suggest test scope based on impact
|
|
10
|
+
*
|
|
11
|
+
* @issue #32
|
|
12
|
+
*/
|
|
13
|
+
import { getLogger } from '../utils/logger.js';
|
|
14
|
+
const logger = getLogger('DependencyImpactAnalyzer');
|
|
15
|
+
/**
|
|
16
|
+
* Dependency Impact Analyzer
|
|
17
|
+
*
|
|
18
|
+
* Analyzes the impact of changes to determine:
|
|
19
|
+
* - Which components are affected
|
|
20
|
+
* - Impact radius and severity
|
|
21
|
+
* - Critical components
|
|
22
|
+
* - Test scope recommendations
|
|
23
|
+
*
|
|
24
|
+
* Performance: O(V + E) using BFS
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* const analyzer = new DependencyImpactAnalyzer(graph, reverseGraph);
|
|
28
|
+
* const result = analyzer.analyze(['ApexClass:AccountService']);
|
|
29
|
+
* console.log(`Total affected: ${result.totalAffected}`);
|
|
30
|
+
* console.log(`Impact level: ${result.overallImpactLevel}`);
|
|
31
|
+
* console.log(`Tests required: ${result.testScope.requiredTests.length}`);
|
|
32
|
+
*/
|
|
33
|
+
export class DependencyImpactAnalyzer {
|
|
34
|
+
graph;
|
|
35
|
+
reverseGraph;
|
|
36
|
+
options;
|
|
37
|
+
constructor(graph, reverseGraph, options = {}) {
|
|
38
|
+
this.graph = graph;
|
|
39
|
+
this.reverseGraph = reverseGraph;
|
|
40
|
+
this.options = {
|
|
41
|
+
maxDepth: options.maxDepth ?? Number.POSITIVE_INFINITY,
|
|
42
|
+
includeTests: options.includeTests ?? true,
|
|
43
|
+
criticalThreshold: options.criticalThreshold ?? 10,
|
|
44
|
+
};
|
|
45
|
+
logger.debug('Initialized DependencyImpactAnalyzer', {
|
|
46
|
+
nodes: this.graph.size,
|
|
47
|
+
criticalThreshold: this.options.criticalThreshold,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Analyze impact of changes to one or more components
|
|
52
|
+
*
|
|
53
|
+
* @ac US-032-AC-1: Given a component, find all dependents
|
|
54
|
+
* @ac US-032-AC-2: Calculate impact radius
|
|
55
|
+
* @ac US-032-AC-4: Generate impact report
|
|
56
|
+
*/
|
|
57
|
+
analyze(changedComponents) {
|
|
58
|
+
const startTime = Date.now();
|
|
59
|
+
// Calculate impact for each changed component
|
|
60
|
+
const impacts = new Map();
|
|
61
|
+
const allAffected = new Set();
|
|
62
|
+
for (const nodeId of changedComponents) {
|
|
63
|
+
const impact = this.calculateImpact(nodeId);
|
|
64
|
+
impacts.set(nodeId, impact);
|
|
65
|
+
// Collect all affected components (including transitive)
|
|
66
|
+
allAffected.add(nodeId);
|
|
67
|
+
const transitiveAffected = this.findAllDependents(nodeId);
|
|
68
|
+
for (const affected of transitiveAffected) {
|
|
69
|
+
allAffected.add(affected);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Find critical components
|
|
73
|
+
const criticalComponents = this.identifyCriticalComponents();
|
|
74
|
+
// Calculate overall impact level
|
|
75
|
+
const overallImpactLevel = this.calculateOverallImpactLevel(impacts);
|
|
76
|
+
// Generate test scope recommendations
|
|
77
|
+
const testScope = this.generateTestScope(Array.from(allAffected), impacts);
|
|
78
|
+
const duration = Date.now() - startTime;
|
|
79
|
+
logger.info('Impact analysis completed', {
|
|
80
|
+
changedComponents: changedComponents.length,
|
|
81
|
+
totalAffected: allAffected.size,
|
|
82
|
+
impactLevel: overallImpactLevel,
|
|
83
|
+
criticalComponents: criticalComponents.length,
|
|
84
|
+
durationMs: duration,
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
changedComponents,
|
|
88
|
+
impacts,
|
|
89
|
+
totalAffected: allAffected.size,
|
|
90
|
+
overallImpactLevel,
|
|
91
|
+
criticalComponents,
|
|
92
|
+
testScope,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Calculate impact for a single component
|
|
97
|
+
*/
|
|
98
|
+
calculateImpact(nodeId) {
|
|
99
|
+
const directDependents = Array.from(this.reverseGraph.get(nodeId) ?? []);
|
|
100
|
+
const allAffected = this.findAllDependents(nodeId);
|
|
101
|
+
const impactRadius = this.calculateImpactRadius(nodeId, allAffected);
|
|
102
|
+
const riskScore = this.calculateRiskScore(directDependents.length, allAffected.size);
|
|
103
|
+
const impactLevel = DependencyImpactAnalyzer.getImpactLevel(riskScore);
|
|
104
|
+
return {
|
|
105
|
+
nodeId,
|
|
106
|
+
directDependents,
|
|
107
|
+
totalAffected: allAffected.size,
|
|
108
|
+
impactRadius,
|
|
109
|
+
impactLevel,
|
|
110
|
+
riskScore,
|
|
111
|
+
isCritical: directDependents.length >= this.options.criticalThreshold,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Find all dependents (transitive closure) of a component using BFS
|
|
116
|
+
*/
|
|
117
|
+
findAllDependents(nodeId) {
|
|
118
|
+
const affected = new Set();
|
|
119
|
+
const queue = [{ nodeId, depth: 0 }];
|
|
120
|
+
const visited = new Set();
|
|
121
|
+
while (queue.length > 0) {
|
|
122
|
+
const { nodeId: current, depth } = queue.shift();
|
|
123
|
+
if (visited.has(current) || depth > this.options.maxDepth) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
visited.add(current);
|
|
127
|
+
affected.add(current);
|
|
128
|
+
const dependents = this.reverseGraph.get(current) ?? new Set();
|
|
129
|
+
for (const dependent of dependents) {
|
|
130
|
+
// Filter out test classes if configured
|
|
131
|
+
if (!this.options.includeTests && this.isTestClass(dependent)) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (!visited.has(dependent)) {
|
|
135
|
+
queue.push({ nodeId: dependent, depth: depth + 1 });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Remove the original node from affected set
|
|
140
|
+
affected.delete(nodeId);
|
|
141
|
+
return affected;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Calculate impact radius (maximum distance to affected component)
|
|
145
|
+
*/
|
|
146
|
+
calculateImpactRadius(nodeId, affected) {
|
|
147
|
+
let maxRadius = 0;
|
|
148
|
+
const queue = [{ nodeId, distance: 0 }];
|
|
149
|
+
const visited = new Set();
|
|
150
|
+
while (queue.length > 0) {
|
|
151
|
+
const { nodeId: current, distance } = queue.shift();
|
|
152
|
+
if (visited.has(current)) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
visited.add(current);
|
|
156
|
+
maxRadius = Math.max(maxRadius, distance);
|
|
157
|
+
const dependents = this.reverseGraph.get(current) ?? new Set();
|
|
158
|
+
for (const dependent of dependents) {
|
|
159
|
+
if (affected.has(dependent) && !visited.has(dependent)) {
|
|
160
|
+
queue.push({ nodeId: dependent, distance: distance + 1 });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return maxRadius;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Calculate risk score (0-100) based on number of affected components
|
|
168
|
+
*/
|
|
169
|
+
calculateRiskScore(directDependents, totalAffected) {
|
|
170
|
+
// Risk factors:
|
|
171
|
+
// - Direct dependents (40% weight)
|
|
172
|
+
// - Total affected (60% weight)
|
|
173
|
+
const directScore = Math.min((directDependents / this.options.criticalThreshold) * 40, 40);
|
|
174
|
+
const totalScore = Math.min((totalAffected / (this.options.criticalThreshold * 3)) * 60, 60);
|
|
175
|
+
return Math.round(directScore + totalScore);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get impact level based on risk score
|
|
179
|
+
*/
|
|
180
|
+
static getImpactLevel(riskScore) {
|
|
181
|
+
if (riskScore >= 80)
|
|
182
|
+
return 'critical';
|
|
183
|
+
if (riskScore >= 60)
|
|
184
|
+
return 'high';
|
|
185
|
+
if (riskScore >= 40)
|
|
186
|
+
return 'medium';
|
|
187
|
+
if (riskScore >= 20)
|
|
188
|
+
return 'low';
|
|
189
|
+
return 'minimal';
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* @ac US-032-AC-3: Identify critical components
|
|
193
|
+
*
|
|
194
|
+
* Find components with many dependents
|
|
195
|
+
*/
|
|
196
|
+
identifyCriticalComponents() {
|
|
197
|
+
const critical = [];
|
|
198
|
+
for (const [nodeId, dependents] of this.reverseGraph.entries()) {
|
|
199
|
+
if (dependents.size >= this.options.criticalThreshold) {
|
|
200
|
+
critical.push(nodeId);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Sort by number of dependents (descending)
|
|
204
|
+
critical.sort((a, b) => {
|
|
205
|
+
const aCount = this.reverseGraph.get(a)?.size ?? 0;
|
|
206
|
+
const bCount = this.reverseGraph.get(b)?.size ?? 0;
|
|
207
|
+
return bCount - aCount;
|
|
208
|
+
});
|
|
209
|
+
logger.info('Critical components identified', {
|
|
210
|
+
count: critical.length,
|
|
211
|
+
threshold: this.options.criticalThreshold,
|
|
212
|
+
});
|
|
213
|
+
return critical;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Calculate overall impact level from individual impacts
|
|
217
|
+
*/
|
|
218
|
+
calculateOverallImpactLevel(impacts) {
|
|
219
|
+
let maxScore = 0;
|
|
220
|
+
for (const impact of impacts.values()) {
|
|
221
|
+
maxScore = Math.max(maxScore, impact.riskScore);
|
|
222
|
+
}
|
|
223
|
+
return DependencyImpactAnalyzer.getImpactLevel(maxScore);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* @ac US-032-AC-5: Suggest test scope based on impact
|
|
227
|
+
*
|
|
228
|
+
* Generate test scope recommendations
|
|
229
|
+
*/
|
|
230
|
+
generateTestScope(affectedComponents, impacts) {
|
|
231
|
+
const requiredTests = [];
|
|
232
|
+
const recommendedTests = [];
|
|
233
|
+
const optionalTests = [];
|
|
234
|
+
for (const nodeId of affectedComponents) {
|
|
235
|
+
// Check if it's a test class
|
|
236
|
+
if (this.isTestClass(nodeId)) {
|
|
237
|
+
// Direct changes to test classes are required
|
|
238
|
+
if (impacts.has(nodeId)) {
|
|
239
|
+
requiredTests.push(nodeId);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
recommendedTests.push(nodeId);
|
|
243
|
+
}
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
// Find associated test class
|
|
247
|
+
const testClass = this.findTestClass(nodeId);
|
|
248
|
+
if (testClass) {
|
|
249
|
+
const impact = impacts.get(nodeId);
|
|
250
|
+
if (impact) {
|
|
251
|
+
// High/critical impact = required
|
|
252
|
+
if (impact.impactLevel === 'high' || impact.impactLevel === 'critical') {
|
|
253
|
+
requiredTests.push(testClass);
|
|
254
|
+
}
|
|
255
|
+
else if (impact.impactLevel === 'medium') {
|
|
256
|
+
recommendedTests.push(testClass);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
optionalTests.push(testClass);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// Affected but not directly changed
|
|
264
|
+
recommendedTests.push(testClass);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// Determine priority
|
|
269
|
+
let priority = 'low';
|
|
270
|
+
const totalTests = requiredTests.length + recommendedTests.length;
|
|
271
|
+
if (requiredTests.length >= 1 && affectedComponents.length > 15) {
|
|
272
|
+
priority = 'high';
|
|
273
|
+
}
|
|
274
|
+
else if (requiredTests.length > 10 || impacts.size > 5) {
|
|
275
|
+
priority = 'high';
|
|
276
|
+
}
|
|
277
|
+
else if (requiredTests.length > 3 || totalTests > 10) {
|
|
278
|
+
priority = 'medium';
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
requiredTests: Array.from(new Set(requiredTests)),
|
|
282
|
+
recommendedTests: Array.from(new Set(recommendedTests)),
|
|
283
|
+
optionalTests: Array.from(new Set(optionalTests)),
|
|
284
|
+
estimatedTestCount: requiredTests.length + recommendedTests.length,
|
|
285
|
+
priority,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Check if a component is a test class
|
|
290
|
+
*/
|
|
291
|
+
isTestClass(nodeId) {
|
|
292
|
+
return nodeId.toLowerCase().includes('test');
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Find associated test class for a component
|
|
296
|
+
*/
|
|
297
|
+
findTestClass(nodeId) {
|
|
298
|
+
// Extract component name
|
|
299
|
+
const parts = nodeId.split(':');
|
|
300
|
+
if (parts.length !== 2)
|
|
301
|
+
return undefined;
|
|
302
|
+
const [type, name] = parts;
|
|
303
|
+
// Common test naming patterns
|
|
304
|
+
const testPatterns = [
|
|
305
|
+
`${type}:${name}Test`,
|
|
306
|
+
`${type}:Test${name}`,
|
|
307
|
+
`${type}:${name}_Test`,
|
|
308
|
+
`${type}:${name}Tests`,
|
|
309
|
+
];
|
|
310
|
+
for (const pattern of testPatterns) {
|
|
311
|
+
if (this.graph.has(pattern)) {
|
|
312
|
+
return pattern;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return undefined;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Get impact for a specific component
|
|
319
|
+
*/
|
|
320
|
+
getImpact(nodeId) {
|
|
321
|
+
return this.calculateImpact(nodeId);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Get all critical components
|
|
325
|
+
*/
|
|
326
|
+
getCriticalComponents() {
|
|
327
|
+
return this.identifyCriticalComponents();
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=dependency-impact-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-impact-analyzer.js","sourceRoot":"","sources":["../../src/dependencies/dependency-impact-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Merger
|
|
3
|
+
* Merges static parser dependencies with AI-inferred dependencies
|
|
4
|
+
*
|
|
5
|
+
* @ac US-037-AC-1: Merge static parser dependencies
|
|
6
|
+
* @ac US-037-AC-2: Merge AI-inferred dependencies
|
|
7
|
+
* @ac US-037-AC-3: Resolve conflicts (prefer static)
|
|
8
|
+
* @ac US-037-AC-4: Track dependency source
|
|
9
|
+
* @ac US-037-AC-5: Report merged dependencies
|
|
10
|
+
* @ac US-037-AC-6: Confidence scoring
|
|
11
|
+
*
|
|
12
|
+
* @issue #37
|
|
13
|
+
*/
|
|
14
|
+
import type { NodeId, DependencyGraph, InferredDependency } from '../types/dependency.js';
|
|
15
|
+
import type { MetadataComponent } from '../types/metadata.js';
|
|
16
|
+
/**
|
|
17
|
+
* Dependency source
|
|
18
|
+
*/
|
|
19
|
+
export type DependencySource = 'static' | 'inferred' | 'merged';
|
|
20
|
+
/**
|
|
21
|
+
* Merged dependency information
|
|
22
|
+
*/
|
|
23
|
+
export type MergedDependency = {
|
|
24
|
+
from: NodeId;
|
|
25
|
+
to: NodeId;
|
|
26
|
+
source: DependencySource;
|
|
27
|
+
confidence: number;
|
|
28
|
+
reasons: string[];
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Merge result
|
|
32
|
+
*/
|
|
33
|
+
export type MergeResult = {
|
|
34
|
+
graph: DependencyGraph;
|
|
35
|
+
dependencies: MergedDependency[];
|
|
36
|
+
stats: MergeStats;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Merge statistics
|
|
40
|
+
*/
|
|
41
|
+
export type MergeStats = {
|
|
42
|
+
totalDependencies: number;
|
|
43
|
+
staticDependencies: number;
|
|
44
|
+
inferredDependencies: number;
|
|
45
|
+
mergedDependencies: number;
|
|
46
|
+
conflicts: number;
|
|
47
|
+
avgConfidence: number;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Merger options
|
|
51
|
+
*/
|
|
52
|
+
export type MergerOptions = {
|
|
53
|
+
/** Minimum confidence threshold for inferred dependencies (0-1) */
|
|
54
|
+
minConfidence?: number;
|
|
55
|
+
/** Prefer static over inferred in conflicts */
|
|
56
|
+
preferStatic?: boolean;
|
|
57
|
+
/** Include low confidence inferences */
|
|
58
|
+
includeLowConfidence?: boolean;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Dependency Merger
|
|
62
|
+
*
|
|
63
|
+
* Merges dependencies from multiple sources:
|
|
64
|
+
* 1. Static parser dependencies (from metadata files)
|
|
65
|
+
* 2. AI-inferred dependencies (from heuristics/patterns)
|
|
66
|
+
*
|
|
67
|
+
* Conflict Resolution:
|
|
68
|
+
* - Static dependencies always take precedence
|
|
69
|
+
* - Inferred dependencies are added if not in static
|
|
70
|
+
* - Confidence scores help prioritize inferences
|
|
71
|
+
*
|
|
72
|
+
* Performance: O(V + E)
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* const merger = new DependencyMerger({
|
|
76
|
+
* minConfidence: 0.7,
|
|
77
|
+
* preferStatic: true
|
|
78
|
+
* });
|
|
79
|
+
*
|
|
80
|
+
* const result = merger.merge(components, inferences);
|
|
81
|
+
* console.log(`Merged ${result.stats.totalDependencies} dependencies`);
|
|
82
|
+
*/
|
|
83
|
+
export declare class DependencyMerger {
|
|
84
|
+
private options;
|
|
85
|
+
constructor(options?: MergerOptions);
|
|
86
|
+
/**
|
|
87
|
+
* @ac US-037-AC-1: Merge static parser dependencies
|
|
88
|
+
* @ac US-037-AC-2: Merge AI-inferred dependencies
|
|
89
|
+
* @ac US-037-AC-3: Resolve conflicts (prefer static)
|
|
90
|
+
* @ac US-037-AC-4: Track dependency source
|
|
91
|
+
* @ac US-037-AC-5: Report merged dependencies
|
|
92
|
+
*/
|
|
93
|
+
merge(components: Map<NodeId, MetadataComponent>, inferences: InferredDependency[]): MergeResult;
|
|
94
|
+
/**
|
|
95
|
+
* Filter dependencies by confidence
|
|
96
|
+
*/
|
|
97
|
+
filterByConfidence(dependencies: MergedDependency[], minConfidence: number): MergedDependency[];
|
|
98
|
+
/**
|
|
99
|
+
* Get dependencies by source
|
|
100
|
+
*/
|
|
101
|
+
getDependenciesBySource(dependencies: MergedDependency[], source: DependencySource): MergedDependency[];
|
|
102
|
+
/**
|
|
103
|
+
* Get low confidence dependencies (potential false positives)
|
|
104
|
+
*/
|
|
105
|
+
getLowConfidenceDependencies(dependencies: MergedDependency[], threshold?: number): MergedDependency[];
|
|
106
|
+
/**
|
|
107
|
+
* @ac US-037-AC-6: Confidence scoring
|
|
108
|
+
*/
|
|
109
|
+
calculateOverallConfidence(dependencies: MergedDependency[]): number;
|
|
110
|
+
/**
|
|
111
|
+
* Get conflicts (dependencies that exist in both static and inferred)
|
|
112
|
+
*/
|
|
113
|
+
getConflicts(staticDeps: Set<string>, inferences: InferredDependency[]): Array<{
|
|
114
|
+
from: NodeId;
|
|
115
|
+
to: NodeId;
|
|
116
|
+
confidence: number;
|
|
117
|
+
}>;
|
|
118
|
+
/**
|
|
119
|
+
* Generate merge report
|
|
120
|
+
*/
|
|
121
|
+
generateReport(result: MergeResult): string;
|
|
122
|
+
}
|