@jterrats/smart-deployment 1.0.5 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/README.md +3 -2
  2. package/lib/ai/wave-validation-prompt.d.ts +2 -0
  3. package/lib/ai/wave-validation-prompt.js +56 -0
  4. package/lib/ai/wave-validation-prompt.js.map +1 -0
  5. package/lib/ai/wave-validation-report.d.ts +2 -0
  6. package/lib/ai/wave-validation-report.js +96 -0
  7. package/lib/ai/wave-validation-report.js.map +1 -0
  8. package/lib/ai/wave-validation-response-parser.d.ts +8 -0
  9. package/lib/ai/wave-validation-response-parser.js +112 -0
  10. package/lib/ai/wave-validation-response-parser.js.map +1 -0
  11. package/lib/ai/wave-validation-result-synthesis.d.ts +6 -0
  12. package/lib/ai/wave-validation-result-synthesis.js +49 -0
  13. package/lib/ai/wave-validation-result-synthesis.js.map +1 -0
  14. package/lib/ai/wave-validation-service.d.ts +1 -55
  15. package/lib/ai/wave-validation-service.js +11 -359
  16. package/lib/ai/wave-validation-service.js.map +1 -1
  17. package/lib/ai/wave-validation-transport.d.ts +7 -0
  18. package/lib/ai/wave-validation-transport.js +10 -0
  19. package/lib/ai/wave-validation-transport.js.map +1 -0
  20. package/lib/analysis/analysis-reporter.d.ts +29 -0
  21. package/lib/analysis/analysis-reporter.js +84 -1
  22. package/lib/analysis/analysis-reporter.js.map +1 -1
  23. package/lib/analysis/analyze-context-service.d.ts +1 -1
  24. package/lib/analysis/analyze-context-service.js +2 -0
  25. package/lib/analysis/analyze-context-service.js.map +1 -1
  26. package/lib/analysis/project-analysis-service.d.ts +2 -0
  27. package/lib/analysis/project-analysis-service.js +2 -0
  28. package/lib/analysis/project-analysis-service.js.map +1 -1
  29. package/lib/commands/start.d.ts +1 -0
  30. package/lib/commands/start.js +14 -1
  31. package/lib/commands/start.js.map +1 -1
  32. package/lib/commands/status.d.ts +2 -0
  33. package/lib/commands/status.js +1 -0
  34. package/lib/commands/status.js.map +1 -1
  35. package/lib/commands/validate.d.ts +3 -3
  36. package/lib/commands/validate.js +4 -4
  37. package/lib/commands/validate.js.map +1 -1
  38. package/lib/constants/api-version.d.ts +2 -2
  39. package/lib/constants/api-version.js +2 -2
  40. package/lib/constants/deployment-order.js +11 -8
  41. package/lib/constants/deployment-order.js.map +1 -1
  42. package/lib/dependencies/circular-dependency-detector.d.ts +1 -31
  43. package/lib/dependencies/circular-dependency-detector.js +7 -156
  44. package/lib/dependencies/circular-dependency-detector.js.map +1 -1
  45. package/lib/dependencies/cycle-break-suggestions.d.ts +3 -0
  46. package/lib/dependencies/cycle-break-suggestions.js +63 -0
  47. package/lib/dependencies/cycle-break-suggestions.js.map +1 -0
  48. package/lib/dependencies/cycle-discovery.d.ts +16 -0
  49. package/lib/dependencies/cycle-discovery.js +70 -0
  50. package/lib/dependencies/cycle-discovery.js.map +1 -0
  51. package/lib/dependencies/dependency-graph-builder.d.ts +0 -65
  52. package/lib/dependencies/dependency-graph-builder.js +19 -233
  53. package/lib/dependencies/dependency-graph-builder.js.map +1 -1
  54. package/lib/dependencies/dependency-graph-intake.d.ts +17 -0
  55. package/lib/dependencies/dependency-graph-intake.js +20 -0
  56. package/lib/dependencies/dependency-graph-intake.js.map +1 -0
  57. package/lib/dependencies/dependency-graph-stats.d.ts +4 -0
  58. package/lib/dependencies/dependency-graph-stats.js +82 -0
  59. package/lib/dependencies/dependency-graph-stats.js.map +1 -0
  60. package/lib/dependencies/dependency-graph-validation.d.ts +16 -0
  61. package/lib/dependencies/dependency-graph-validation.js +78 -0
  62. package/lib/dependencies/dependency-graph-validation.js.map +1 -0
  63. package/lib/dependencies/dependency-impact-analyzer.d.ts +1 -22
  64. package/lib/dependencies/dependency-impact-analyzer.js +12 -110
  65. package/lib/dependencies/dependency-impact-analyzer.js.map +1 -1
  66. package/lib/dependencies/dependency-impact-scoring.d.ts +5 -0
  67. package/lib/dependencies/dependency-impact-scoring.js +24 -0
  68. package/lib/dependencies/dependency-impact-scoring.js.map +1 -0
  69. package/lib/dependencies/dependency-impact-traversal.d.ts +18 -0
  70. package/lib/dependencies/dependency-impact-traversal.js +74 -0
  71. package/lib/dependencies/dependency-impact-traversal.js.map +1 -0
  72. package/lib/dependencies/dependency-resolution-classifier.d.ts +19 -0
  73. package/lib/dependencies/dependency-resolution-classifier.js +67 -0
  74. package/lib/dependencies/dependency-resolution-classifier.js.map +1 -0
  75. package/lib/dependencies/dependency-resolver.d.ts +1 -48
  76. package/lib/dependencies/dependency-resolver.js +12 -181
  77. package/lib/dependencies/dependency-resolver.js.map +1 -1
  78. package/lib/dependencies/dynamic-query-dependency-references.d.ts +3 -0
  79. package/lib/dependencies/dynamic-query-dependency-references.js +41 -0
  80. package/lib/dependencies/dynamic-query-dependency-references.js.map +1 -0
  81. package/lib/dependencies/topological-dependency-sorter.d.ts +10 -0
  82. package/lib/dependencies/topological-dependency-sorter.js +84 -0
  83. package/lib/dependencies/topological-dependency-sorter.js.map +1 -0
  84. package/lib/deployment/cycle-remediation-runner.d.ts +1 -0
  85. package/lib/deployment/cycle-remediation-runner.js +5 -1
  86. package/lib/deployment/cycle-remediation-runner.js.map +1 -1
  87. package/lib/deployment/deployment-runner.d.ts +3 -1
  88. package/lib/deployment/deployment-runner.js +6 -1
  89. package/lib/deployment/deployment-runner.js.map +1 -1
  90. package/lib/deployment/deployment-status-service.d.ts +2 -0
  91. package/lib/deployment/deployment-status-service.js +2 -0
  92. package/lib/deployment/deployment-status-service.js.map +1 -1
  93. package/lib/deployment/deployment-validation-service.js +1 -1
  94. package/lib/deployment/deployment-validation-service.js.map +1 -1
  95. package/lib/deployment/dynamic-query-target-validator.d.ts +24 -0
  96. package/lib/deployment/dynamic-query-target-validator.js +65 -0
  97. package/lib/deployment/dynamic-query-target-validator.js.map +1 -0
  98. package/lib/deployment/sf-cli-integration.d.ts +1 -0
  99. package/lib/deployment/sf-cli-integration.js +1 -1
  100. package/lib/deployment/sf-cli-integration.js.map +1 -1
  101. package/lib/deployment/sf-cli-metadata-lookup.d.ts +4 -0
  102. package/lib/deployment/sf-cli-metadata-lookup.js +26 -0
  103. package/lib/deployment/sf-cli-metadata-lookup.js.map +1 -0
  104. package/lib/deployment/start-execution-service.d.ts +5 -0
  105. package/lib/deployment/start-execution-service.js +26 -6
  106. package/lib/deployment/start-execution-service.js.map +1 -1
  107. package/lib/deployment/wave-graph-state.d.ts +6 -0
  108. package/lib/deployment/wave-graph-state.js +89 -0
  109. package/lib/deployment/wave-graph-state.js.map +1 -0
  110. package/lib/deployment/wave-manifest-service.d.ts +1 -0
  111. package/lib/deployment/wave-manifest-service.js +1 -1
  112. package/lib/deployment/wave-manifest-service.js.map +1 -1
  113. package/lib/errors/deployment-error.js +1 -1
  114. package/lib/errors/deployment-error.js.map +1 -1
  115. package/lib/parsers/apex-class-dependencies.d.ts +4 -0
  116. package/lib/parsers/apex-class-dependencies.js +122 -0
  117. package/lib/parsers/apex-class-dependencies.js.map +1 -0
  118. package/lib/parsers/apex-class-lexical.d.ts +3 -0
  119. package/lib/parsers/apex-class-lexical.js +101 -0
  120. package/lib/parsers/apex-class-lexical.js.map +1 -0
  121. package/lib/parsers/apex-class-names.d.ts +18 -0
  122. package/lib/parsers/apex-class-names.js +93 -0
  123. package/lib/parsers/apex-class-names.js.map +1 -0
  124. package/lib/parsers/apex-class-parser-model.d.ts +59 -0
  125. package/lib/parsers/apex-class-parser-model.js +2 -0
  126. package/lib/parsers/apex-class-parser-model.js.map +1 -0
  127. package/lib/parsers/apex-class-parser.d.ts +3 -29
  128. package/lib/parsers/apex-class-parser.js +10 -395
  129. package/lib/parsers/apex-class-parser.js.map +1 -1
  130. package/lib/parsers/apex-class-symbols.d.ts +2 -0
  131. package/lib/parsers/apex-class-symbols.js +61 -0
  132. package/lib/parsers/apex-class-symbols.js.map +1 -0
  133. package/lib/parsers/apex-dynamic-query-analysis.d.ts +2 -0
  134. package/lib/parsers/apex-dynamic-query-analysis.js +150 -0
  135. package/lib/parsers/apex-dynamic-query-analysis.js.map +1 -0
  136. package/lib/parsers/custom-metadata-dynamic-query-analysis.d.ts +2 -0
  137. package/lib/parsers/custom-metadata-dynamic-query-analysis.js +50 -0
  138. package/lib/parsers/custom-metadata-dynamic-query-analysis.js.map +1 -0
  139. package/lib/parsers/custom-metadata-parser.d.ts +2 -0
  140. package/lib/parsers/custom-metadata-parser.js +3 -0
  141. package/lib/parsers/custom-metadata-parser.js.map +1 -1
  142. package/lib/parsers/custom-object-dependency-builder.d.ts +3 -0
  143. package/lib/parsers/custom-object-dependency-builder.js +103 -0
  144. package/lib/parsers/custom-object-dependency-builder.js.map +1 -0
  145. package/lib/parsers/custom-object-parser.js +1 -208
  146. package/lib/parsers/custom-object-parser.js.map +1 -1
  147. package/lib/parsers/custom-object-reference-helpers.d.ts +4 -0
  148. package/lib/parsers/custom-object-reference-helpers.js +92 -0
  149. package/lib/parsers/custom-object-reference-helpers.js.map +1 -0
  150. package/lib/parsers/dynamic-query-reference.d.ts +16 -0
  151. package/lib/parsers/dynamic-query-reference.js +65 -0
  152. package/lib/parsers/dynamic-query-reference.js.map +1 -0
  153. package/lib/parsers/layout-action-analysis.d.ts +6 -0
  154. package/lib/parsers/layout-action-analysis.js +36 -0
  155. package/lib/parsers/layout-action-analysis.js.map +1 -0
  156. package/lib/parsers/layout-parser.js +4 -272
  157. package/lib/parsers/layout-parser.js.map +1 -1
  158. package/lib/parsers/layout-reference-analysis.d.ts +9 -0
  159. package/lib/parsers/layout-reference-analysis.js +70 -0
  160. package/lib/parsers/layout-reference-analysis.js.map +1 -0
  161. package/lib/parsers/layout-result-assembly.d.ts +5 -0
  162. package/lib/parsers/layout-result-assembly.js +35 -0
  163. package/lib/parsers/layout-result-assembly.js.map +1 -0
  164. package/lib/parsers/layout-section-analysis.d.ts +7 -0
  165. package/lib/parsers/layout-section-analysis.js +9 -0
  166. package/lib/parsers/layout-section-analysis.js.map +1 -0
  167. package/lib/parsers/lwc-code-analysis.d.ts +10 -0
  168. package/lib/parsers/lwc-code-analysis.js +161 -0
  169. package/lib/parsers/lwc-code-analysis.js.map +1 -0
  170. package/lib/parsers/lwc-metadata-analysis.d.ts +6 -0
  171. package/lib/parsers/lwc-metadata-analysis.js +112 -0
  172. package/lib/parsers/lwc-metadata-analysis.js.map +1 -0
  173. package/lib/parsers/lwc-parser.d.ts +3 -27
  174. package/lib/parsers/lwc-parser.js +6 -377
  175. package/lib/parsers/lwc-parser.js.map +1 -1
  176. package/lib/parsers/lwc-result-assembly.d.ts +4 -0
  177. package/lib/parsers/lwc-result-assembly.js +47 -0
  178. package/lib/parsers/lwc-result-assembly.js.map +1 -0
  179. package/lib/presentation/status-command-presenter.d.ts +1 -0
  180. package/lib/presentation/status-command-presenter.js +20 -0
  181. package/lib/presentation/status-command-presenter.js.map +1 -1
  182. package/lib/scanner/forceignore-parser.d.ts +1 -0
  183. package/lib/scanner/forceignore-parser.js +14 -3
  184. package/lib/scanner/forceignore-parser.js.map +1 -1
  185. package/lib/scanner/structure-validator.js +1 -1
  186. package/lib/services/metadata-scanner-service.d.ts +2 -0
  187. package/lib/services/metadata-scanner-service.js +9 -2
  188. package/lib/services/metadata-scanner-service.js.map +1 -1
  189. package/lib/services/scanners/additional-metadata-scanner.d.ts +2 -0
  190. package/lib/services/scanners/additional-metadata-scanner.js +183 -0
  191. package/lib/services/scanners/additional-metadata-scanner.js.map +1 -0
  192. package/lib/services/scanners/automation-ai-metadata-scanner.d.ts +1 -0
  193. package/lib/services/scanners/automation-ai-metadata-scanner.js +11 -0
  194. package/lib/services/scanners/automation-ai-metadata-scanner.js.map +1 -1
  195. package/lib/services/scanners/code-metadata-scanner.js +14 -1
  196. package/lib/services/scanners/code-metadata-scanner.js.map +1 -1
  197. package/lib/services/scanners/data-metadata-scanner.js +24 -8
  198. package/lib/services/scanners/data-metadata-scanner.js.map +1 -1
  199. package/lib/types/metadata.d.ts +1 -1
  200. package/lib/utils/cache-entry-serializer.d.ts +7 -0
  201. package/lib/utils/cache-entry-serializer.js +15 -0
  202. package/lib/utils/cache-entry-serializer.js.map +1 -0
  203. package/lib/utils/cache-expiry-policy.d.ts +7 -0
  204. package/lib/utils/cache-expiry-policy.js +34 -0
  205. package/lib/utils/cache-expiry-policy.js.map +1 -0
  206. package/lib/utils/cache-key-derivation.d.ts +11 -0
  207. package/lib/utils/cache-key-derivation.js +28 -0
  208. package/lib/utils/cache-key-derivation.js.map +1 -0
  209. package/lib/utils/cache-lock-lifecycle.d.ts +15 -0
  210. package/lib/utils/cache-lock-lifecycle.js +84 -0
  211. package/lib/utils/cache-lock-lifecycle.js.map +1 -0
  212. package/lib/utils/cache-logger.d.ts +8 -0
  213. package/lib/utils/cache-logger.js +19 -0
  214. package/lib/utils/cache-logger.js.map +1 -0
  215. package/lib/utils/cache-manager.d.ts +1 -2
  216. package/lib/utils/cache-manager.js +7 -253
  217. package/lib/utils/cache-manager.js.map +1 -1
  218. package/lib/utils/cache-storage.d.ts +20 -0
  219. package/lib/utils/cache-storage.js +83 -0
  220. package/lib/utils/cache-storage.js.map +1 -0
  221. package/lib/validators/xml-metadata-validator.js +1 -1
  222. package/lib/waves/priority-wave-generator.js +8 -2
  223. package/lib/waves/priority-wave-generator.js.map +1 -1
  224. package/lib/waves/test-optimizer-discovery.d.ts +12 -0
  225. package/lib/waves/test-optimizer-discovery.js +46 -0
  226. package/lib/waves/test-optimizer-discovery.js.map +1 -0
  227. package/lib/waves/test-optimizer-matching.d.ts +6 -0
  228. package/lib/waves/test-optimizer-matching.js +43 -0
  229. package/lib/waves/test-optimizer-matching.js.map +1 -0
  230. package/lib/waves/test-optimizer-model.d.ts +92 -0
  231. package/lib/waves/test-optimizer-model.js +2 -0
  232. package/lib/waves/test-optimizer-model.js.map +1 -0
  233. package/lib/waves/test-optimizer-scoring.d.ts +11 -0
  234. package/lib/waves/test-optimizer-scoring.js +53 -0
  235. package/lib/waves/test-optimizer-scoring.js.map +1 -0
  236. package/lib/waves/test-optimizer.d.ts +2 -102
  237. package/lib/waves/test-optimizer.js +9 -154
  238. package/lib/waves/test-optimizer.js.map +1 -1
  239. package/lib/waves/wave-builder.d.ts +0 -11
  240. package/lib/waves/wave-builder.js +19 -193
  241. package/lib/waves/wave-builder.js.map +1 -1
  242. package/lib/waves/wave-graph.d.ts +25 -0
  243. package/lib/waves/wave-graph.js +138 -0
  244. package/lib/waves/wave-graph.js.map +1 -0
  245. package/lib/waves/wave-metadata.d.ts +4 -0
  246. package/lib/waves/wave-metadata.js +36 -0
  247. package/lib/waves/wave-metadata.js.map +1 -0
  248. package/lib/waves/wave-priority-policy.d.ts +5 -0
  249. package/lib/waves/wave-priority-policy.js +83 -0
  250. package/lib/waves/wave-priority-policy.js.map +1 -0
  251. package/lib/waves/wave-topology.d.ts +28 -0
  252. package/lib/waves/wave-topology.js +65 -0
  253. package/lib/waves/wave-topology.js.map +1 -0
  254. package/messages/start.json +5 -5
  255. package/messages/validate.json +1 -1
  256. package/npm-shrinkwrap.json +342 -751
  257. package/oclif.lock +83 -262
  258. package/oclif.manifest.json +7 -7
  259. package/package.json +6 -2
@@ -81,6 +81,7 @@ export declare class DependencyImpactAnalyzer {
81
81
  private graph;
82
82
  private reverseGraph;
83
83
  private options;
84
+ private traversal;
84
85
  constructor(graph: DependencyGraph, reverseGraph: DependencyGraph, options?: ImpactAnalysisOptions);
85
86
  /**
86
87
  * Analyze impact of changes to one or more components
@@ -94,33 +95,12 @@ export declare class DependencyImpactAnalyzer {
94
95
  * Calculate impact for a single component
95
96
  */
96
97
  private calculateImpact;
97
- private analyzeDependentTraversal;
98
- /**
99
- * Find all dependents (transitive closure) of a component using BFS
100
- */
101
- private findAllDependents;
102
- /**
103
- * Calculate impact radius (maximum distance to affected component)
104
- */
105
- private calculateImpactRadius;
106
- /**
107
- * Calculate risk score (0-100) based on number of affected components
108
- */
109
- private calculateRiskScore;
110
- /**
111
- * Get impact level based on risk score
112
- */
113
- private static getImpactLevel;
114
98
  /**
115
99
  * @ac US-032-AC-3: Identify critical components
116
100
  *
117
101
  * Find components with many dependents
118
102
  */
119
103
  private identifyCriticalComponents;
120
- /**
121
- * Calculate overall impact level from individual impacts
122
- */
123
- private calculateOverallImpactLevel;
124
104
  /**
125
105
  * @ac US-032-AC-5: Suggest test scope based on impact
126
106
  *
@@ -137,7 +117,6 @@ export declare class DependencyImpactAnalyzer {
137
117
  private findTestClass;
138
118
  private collectImpactAggregate;
139
119
  private mergeComponentImpact;
140
- private collectTraversableDependents;
141
120
  private collectCriticalComponentCandidates;
142
121
  private getDependentCount;
143
122
  private collectTestBuckets;
@@ -11,7 +11,8 @@
11
11
  * @issue #32
12
12
  */
13
13
  import { getLogger } from '../utils/logger.js';
14
- import { DEFAULT_GRAPH_DEPENDENCY_KIND, shouldTraverseDependencyKind } from './dependency-semantics.js';
14
+ import { calculateOverallImpactLevel, calculateRiskScore, getImpactLevel } from './dependency-impact-scoring.js';
15
+ import { DependencyImpactTraversal } from './dependency-impact-traversal.js';
15
16
  const logger = getLogger('DependencyImpactAnalyzer');
16
17
  /**
17
18
  * Dependency Impact Analyzer
@@ -35,6 +36,7 @@ export class DependencyImpactAnalyzer {
35
36
  graph;
36
37
  reverseGraph;
37
38
  options;
39
+ traversal;
38
40
  constructor(graph, reverseGraph, options = {}) {
39
41
  this.graph = graph;
40
42
  this.reverseGraph = reverseGraph;
@@ -43,6 +45,10 @@ export class DependencyImpactAnalyzer {
43
45
  includeTests: options.includeTests ?? true,
44
46
  criticalThreshold: options.criticalThreshold ?? 10,
45
47
  };
48
+ this.traversal = new DependencyImpactTraversal(this.reverseGraph, {
49
+ maxDepth: this.options.maxDepth,
50
+ includeTests: this.options.includeTests,
51
+ });
46
52
  logger.debug('Initialized DependencyImpactAnalyzer', {
47
53
  nodes: this.graph.size,
48
54
  criticalThreshold: this.options.criticalThreshold,
@@ -59,7 +65,7 @@ export class DependencyImpactAnalyzer {
59
65
  const startTime = Date.now();
60
66
  const aggregate = this.collectImpactAggregate(changedComponents);
61
67
  const criticalComponents = this.identifyCriticalComponents();
62
- const overallImpactLevel = this.calculateOverallImpactLevel(aggregate.impacts);
68
+ const overallImpactLevel = calculateOverallImpactLevel(aggregate.impacts);
63
69
  const testScope = this.generateTestScope(Array.from(aggregate.allAffected), aggregate.impacts);
64
70
  const duration = Date.now() - startTime;
65
71
  logger.info('Impact analysis completed', {
@@ -83,9 +89,9 @@ export class DependencyImpactAnalyzer {
83
89
  */
84
90
  calculateImpact(nodeId) {
85
91
  const directDependents = Array.from(this.reverseGraph.get(nodeId) ?? []);
86
- const traversal = this.analyzeDependentTraversal(nodeId);
87
- const riskScore = this.calculateRiskScore(directDependents.length, traversal.affected.size);
88
- const impactLevel = DependencyImpactAnalyzer.getImpactLevel(riskScore);
92
+ const traversal = this.traversal.analyzeDependents(nodeId);
93
+ const riskScore = calculateRiskScore(directDependents.length, traversal.affected.size, this.options.criticalThreshold);
94
+ const impactLevel = getImpactLevel(riskScore);
89
95
  return {
90
96
  nodeId,
91
97
  directDependents,
@@ -96,86 +102,6 @@ export class DependencyImpactAnalyzer {
96
102
  isCritical: directDependents.length >= this.options.criticalThreshold,
97
103
  };
98
104
  }
99
- analyzeDependentTraversal(nodeId) {
100
- const affected = this.findAllDependents(nodeId);
101
- return {
102
- affected,
103
- impactRadius: this.calculateImpactRadius(nodeId, affected),
104
- };
105
- }
106
- /**
107
- * Find all dependents (transitive closure) of a component using BFS
108
- */
109
- findAllDependents(nodeId) {
110
- const affected = new Set();
111
- const queue = [{ nodeId, depth: 0 }];
112
- const visited = new Set();
113
- while (queue.length > 0) {
114
- const { nodeId: current, depth } = queue.shift();
115
- if (visited.has(current) || depth > this.options.maxDepth) {
116
- continue;
117
- }
118
- visited.add(current);
119
- affected.add(current);
120
- const dependents = this.collectTraversableDependents(current);
121
- for (const dependent of dependents) {
122
- if (!visited.has(dependent)) {
123
- queue.push({ nodeId: dependent, depth: depth + 1 });
124
- }
125
- }
126
- }
127
- // Remove the original node from affected set
128
- affected.delete(nodeId);
129
- return affected;
130
- }
131
- /**
132
- * Calculate impact radius (maximum distance to affected component)
133
- */
134
- calculateImpactRadius(nodeId, affected) {
135
- let maxRadius = 0;
136
- const queue = [{ nodeId, distance: 0 }];
137
- const visited = new Set();
138
- while (queue.length > 0) {
139
- const { nodeId: current, distance } = queue.shift();
140
- if (visited.has(current)) {
141
- continue;
142
- }
143
- visited.add(current);
144
- maxRadius = Math.max(maxRadius, distance);
145
- const dependents = this.reverseGraph.get(current) ?? new Set();
146
- for (const dependent of dependents) {
147
- if (affected.has(dependent) && !visited.has(dependent)) {
148
- queue.push({ nodeId: dependent, distance: distance + 1 });
149
- }
150
- }
151
- }
152
- return maxRadius;
153
- }
154
- /**
155
- * Calculate risk score (0-100) based on number of affected components
156
- */
157
- calculateRiskScore(directDependents, totalAffected) {
158
- // Risk factors:
159
- // - Direct dependents (40% weight)
160
- // - Total affected (60% weight)
161
- const directScore = Math.min((directDependents / this.options.criticalThreshold) * 40, 40);
162
- const totalScore = Math.min((totalAffected / (this.options.criticalThreshold * 3)) * 60, 60);
163
- return Math.round(directScore + totalScore);
164
- }
165
- /**
166
- * Get impact level based on risk score
167
- */
168
- static getImpactLevel(riskScore) {
169
- if (riskScore >= 80)
170
- return 'critical';
171
- if (riskScore >= 60)
172
- return 'high';
173
- if (riskScore >= 40)
174
- return 'medium';
175
- if (riskScore >= 20)
176
- return 'low';
177
- return 'minimal';
178
- }
179
105
  /**
180
106
  * @ac US-032-AC-3: Identify critical components
181
107
  *
@@ -190,16 +116,6 @@ export class DependencyImpactAnalyzer {
190
116
  });
191
117
  return critical;
192
118
  }
193
- /**
194
- * Calculate overall impact level from individual impacts
195
- */
196
- calculateOverallImpactLevel(impacts) {
197
- let maxScore = 0;
198
- for (const impact of impacts.values()) {
199
- maxScore = Math.max(maxScore, impact.riskScore);
200
- }
201
- return DependencyImpactAnalyzer.getImpactLevel(maxScore);
202
- }
203
119
  /**
204
120
  * @ac US-032-AC-5: Suggest test scope based on impact
205
121
  *
@@ -253,25 +169,11 @@ export class DependencyImpactAnalyzer {
253
169
  const impact = this.calculateImpact(nodeId);
254
170
  impacts.set(nodeId, impact);
255
171
  allAffected.add(nodeId);
256
- const transitiveAffected = this.findAllDependents(nodeId);
172
+ const transitiveAffected = this.traversal.findAllDependents(nodeId);
257
173
  for (const affectedNode of transitiveAffected) {
258
174
  allAffected.add(affectedNode);
259
175
  }
260
176
  }
261
- collectTraversableDependents(nodeId) {
262
- const dependents = this.reverseGraph.get(nodeId) ?? new Set();
263
- const traversable = [];
264
- for (const dependent of dependents) {
265
- if (!shouldTraverseDependencyKind(DEFAULT_GRAPH_DEPENDENCY_KIND)) {
266
- continue;
267
- }
268
- if (!this.options.includeTests && this.isTestClass(dependent)) {
269
- continue;
270
- }
271
- traversable.push(dependent);
272
- }
273
- return traversable;
274
- }
275
177
  collectCriticalComponentCandidates() {
276
178
  const critical = [];
277
179
  for (const [nodeId, dependents] of this.reverseGraph.entries()) {
@@ -1 +1 @@
1
- {"version":3,"file":"dependency-impact-analyzer.js","sourceRoot":"","sources":["../../src/dependencies/dependency-impact-analyzer.ts"],"names":[],"mappings":"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"}
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,5 @@
1
+ import type { NodeId } from '../types/dependency.js';
2
+ import type { ComponentImpact, ImpactLevel } from './dependency-impact-analyzer.js';
3
+ export declare function calculateRiskScore(directDependents: number, totalAffected: number, criticalThreshold: number): number;
4
+ export declare function getImpactLevel(riskScore: number): ImpactLevel;
5
+ export declare function calculateOverallImpactLevel(impacts: ReadonlyMap<NodeId, ComponentImpact>): ImpactLevel;
@@ -0,0 +1,24 @@
1
+ export function calculateRiskScore(directDependents, totalAffected, criticalThreshold) {
2
+ const directScore = Math.min((directDependents / criticalThreshold) * 40, 40);
3
+ const totalScore = Math.min((totalAffected / (criticalThreshold * 3)) * 60, 60);
4
+ return Math.round(directScore + totalScore);
5
+ }
6
+ export function getImpactLevel(riskScore) {
7
+ if (riskScore >= 80)
8
+ return 'critical';
9
+ if (riskScore >= 60)
10
+ return 'high';
11
+ if (riskScore >= 40)
12
+ return 'medium';
13
+ if (riskScore >= 20)
14
+ return 'low';
15
+ return 'minimal';
16
+ }
17
+ export function calculateOverallImpactLevel(impacts) {
18
+ let maxScore = 0;
19
+ for (const impact of impacts.values()) {
20
+ maxScore = Math.max(maxScore, impact.riskScore);
21
+ }
22
+ return getImpactLevel(maxScore);
23
+ }
24
+ //# sourceMappingURL=dependency-impact-scoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-impact-scoring.js","sourceRoot":"","sources":["../../src/dependencies/dependency-impact-scoring.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,kBAAkB,CAAC,gBAAwB,EAAE,aAAqB,EAAE,iBAAyB;IAC3G,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,gBAAgB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,aAAa,GAAG,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAEhF,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,SAAS,IAAI,EAAE;QAAE,OAAO,UAAU,CAAC;IACvC,IAAI,SAAS,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IACnC,IAAI,SAAS,IAAI,EAAE;QAAE,OAAO,QAAQ,CAAC;IACrC,IAAI,SAAS,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAA6C;IACvF,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { DependencyGraph, NodeId } from '../types/dependency.js';
2
+ export type ImpactTraversalOptions = {
3
+ maxDepth: number;
4
+ includeTests: boolean;
5
+ };
6
+ export type ImpactTraversal = {
7
+ affected: Set<NodeId>;
8
+ impactRadius: number;
9
+ };
10
+ export declare class DependencyImpactTraversal {
11
+ private readonly reverseGraph;
12
+ private readonly options;
13
+ constructor(reverseGraph: DependencyGraph, options: ImpactTraversalOptions);
14
+ analyzeDependents(nodeId: NodeId): ImpactTraversal;
15
+ findAllDependents(nodeId: NodeId): Set<NodeId>;
16
+ private calculateImpactRadius;
17
+ private collectTraversableDependents;
18
+ }
@@ -0,0 +1,74 @@
1
+ import { DEFAULT_GRAPH_DEPENDENCY_KIND, shouldTraverseDependencyKind } from './dependency-semantics.js';
2
+ export class DependencyImpactTraversal {
3
+ reverseGraph;
4
+ options;
5
+ constructor(reverseGraph, options) {
6
+ this.reverseGraph = reverseGraph;
7
+ this.options = options;
8
+ }
9
+ analyzeDependents(nodeId) {
10
+ const affected = this.findAllDependents(nodeId);
11
+ return {
12
+ affected,
13
+ impactRadius: this.calculateImpactRadius(nodeId, affected),
14
+ };
15
+ }
16
+ findAllDependents(nodeId) {
17
+ const affected = new Set();
18
+ const queue = [{ nodeId, depth: 0 }];
19
+ const visited = new Set();
20
+ while (queue.length > 0) {
21
+ const { nodeId: current, depth } = queue.shift();
22
+ if (visited.has(current) || depth > this.options.maxDepth) {
23
+ continue;
24
+ }
25
+ visited.add(current);
26
+ affected.add(current);
27
+ for (const dependent of this.collectTraversableDependents(current)) {
28
+ if (!visited.has(dependent)) {
29
+ queue.push({ nodeId: dependent, depth: depth + 1 });
30
+ }
31
+ }
32
+ }
33
+ affected.delete(nodeId);
34
+ return affected;
35
+ }
36
+ calculateImpactRadius(nodeId, affected) {
37
+ let maxRadius = 0;
38
+ const queue = [{ nodeId, distance: 0 }];
39
+ const visited = new Set();
40
+ while (queue.length > 0) {
41
+ const { nodeId: current, distance } = queue.shift();
42
+ if (visited.has(current)) {
43
+ continue;
44
+ }
45
+ visited.add(current);
46
+ maxRadius = Math.max(maxRadius, distance);
47
+ const dependents = this.reverseGraph.get(current) ?? new Set();
48
+ for (const dependent of dependents) {
49
+ if (affected.has(dependent) && !visited.has(dependent)) {
50
+ queue.push({ nodeId: dependent, distance: distance + 1 });
51
+ }
52
+ }
53
+ }
54
+ return maxRadius;
55
+ }
56
+ collectTraversableDependents(nodeId) {
57
+ const dependents = this.reverseGraph.get(nodeId) ?? new Set();
58
+ const traversable = [];
59
+ for (const dependent of dependents) {
60
+ if (!shouldTraverseDependencyKind(DEFAULT_GRAPH_DEPENDENCY_KIND)) {
61
+ continue;
62
+ }
63
+ if (!this.options.includeTests && isTestClass(dependent)) {
64
+ continue;
65
+ }
66
+ traversable.push(dependent);
67
+ }
68
+ return traversable;
69
+ }
70
+ }
71
+ function isTestClass(nodeId) {
72
+ return nodeId.toLowerCase().includes('test');
73
+ }
74
+ //# sourceMappingURL=dependency-impact-traversal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-impact-traversal.js","sourceRoot":"","sources":["../../src/dependencies/dependency-impact-traversal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { NodeId, DependencyGraph } from '../types/dependency.js';
2
+ import type { MetadataComponent } from '../types/metadata.js';
3
+ export type DependencyFilterDecision = 'include' | 'exclude-managed' | 'exclude-optional';
4
+ export type DependencyResolutionClassifierOptions = {
5
+ includeOptional: boolean;
6
+ skipManaged: boolean;
7
+ };
8
+ export declare class DependencyResolutionClassifier {
9
+ private readonly components;
10
+ private readonly options;
11
+ constructor(components: ReadonlyMap<NodeId, MetadataComponent>, options: DependencyResolutionClassifierOptions);
12
+ shouldIncludeNode(nodeId: NodeId): boolean;
13
+ collectIncludedDependencies(nodeId: NodeId, dependencies: ReadonlySet<NodeId>): Set<NodeId>;
14
+ classifyDependency(nodeId: NodeId, dependencyId: NodeId): DependencyFilterDecision;
15
+ findOptionalDependencies(graph: DependencyGraph): NodeId[];
16
+ findManagedPackages(): NodeId[];
17
+ isManagedPackage(nodeId: NodeId): boolean;
18
+ private isOptionalDependency;
19
+ }
@@ -0,0 +1,67 @@
1
+ import { getComponentDependencyKind, isSoftDependencyKind, shouldIncludeDependencyInResolution, } from './dependency-semantics.js';
2
+ export class DependencyResolutionClassifier {
3
+ components;
4
+ options;
5
+ constructor(components, options) {
6
+ this.components = components;
7
+ this.options = options;
8
+ }
9
+ shouldIncludeNode(nodeId) {
10
+ return !(this.options.skipManaged && this.isManagedPackage(nodeId));
11
+ }
12
+ collectIncludedDependencies(nodeId, dependencies) {
13
+ const filteredDependencies = new Set();
14
+ for (const dependencyId of dependencies) {
15
+ if (this.classifyDependency(nodeId, dependencyId) === 'include') {
16
+ filteredDependencies.add(dependencyId);
17
+ }
18
+ }
19
+ return filteredDependencies;
20
+ }
21
+ classifyDependency(nodeId, dependencyId) {
22
+ if (this.options.skipManaged && this.isManagedPackage(dependencyId)) {
23
+ return 'exclude-managed';
24
+ }
25
+ if (!shouldIncludeDependencyInResolution(getComponentDependencyKind(this.components.get(nodeId), dependencyId), this.options.includeOptional)) {
26
+ return 'exclude-optional';
27
+ }
28
+ return 'include';
29
+ }
30
+ findOptionalDependencies(graph) {
31
+ if (this.options.includeOptional) {
32
+ return [];
33
+ }
34
+ const optional = [];
35
+ for (const [nodeId, deps] of graph.entries()) {
36
+ for (const dep of deps) {
37
+ if (!this.isOptionalDependency(nodeId, dep)) {
38
+ continue;
39
+ }
40
+ if (this.options.skipManaged && this.isManagedPackage(dep)) {
41
+ continue;
42
+ }
43
+ if (!optional.includes(dep)) {
44
+ optional.push(dep);
45
+ }
46
+ }
47
+ }
48
+ return optional;
49
+ }
50
+ findManagedPackages() {
51
+ const managed = [];
52
+ for (const nodeId of this.components.keys()) {
53
+ if (this.isManagedPackage(nodeId)) {
54
+ managed.push(nodeId);
55
+ }
56
+ }
57
+ return managed;
58
+ }
59
+ isManagedPackage(nodeId) {
60
+ return nodeId.includes('__') || (this.components.get(nodeId)?.name.includes('__') ?? false);
61
+ }
62
+ isOptionalDependency(nodeId, dependencyId) {
63
+ const component = this.components.get(nodeId);
64
+ return isSoftDependencyKind(getComponentDependencyKind(component, dependencyId));
65
+ }
66
+ }
67
+ //# sourceMappingURL=dependency-resolution-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-resolution-classifier.js","sourceRoot":"","sources":["../../src/dependencies/dependency-resolution-classifier.ts"],"names":[],"mappings":"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"}
@@ -88,6 +88,7 @@ export declare class DependencyResolver {
88
88
  private graph;
89
89
  private components;
90
90
  private options;
91
+ private classifier;
91
92
  private cachedResult?;
92
93
  constructor(graph: DependencyGraph, components: Map<NodeId, MetadataComponent>, options?: ResolverOptions);
93
94
  /**
@@ -110,63 +111,15 @@ export declare class DependencyResolver {
110
111
  * Stage 2: apply manual ordering constraints after filtering.
111
112
  */
112
113
  private applyOrderingConstraints;
113
- /**
114
- * Stage 3: perform topological ordering on the filtered graph.
115
- */
116
- private topologicalSort;
117
114
  /**
118
115
  * Stage 4: project the deployment order into resolved entries.
119
116
  */
120
117
  private buildResolvedMap;
121
- /**
122
- * Create the mutable state used by Kahn's topological traversal.
123
- */
124
- private createTopologicalTraversalState;
125
- /**
126
- * Drain the topological queue and update in-degree state.
127
- */
128
- private processTopologicalQueue;
129
- /**
130
- * Lower in-degree counts after resolving one node and enqueue newly unblocked nodes.
131
- */
132
- private releaseResolvedDependencies;
133
- /**
134
- * Collect nodes that remain blocked after traversal.
135
- */
136
- private collectUnresolvedNodes;
137
- /**
138
- * Find missing dependencies for a node
139
- */
140
- private findMissingDependencies;
141
- /**
142
- * @ac US-033-AC-3: Handle optional dependencies
143
- * Note: Current MetadataComponent doesn't track dependency types
144
- */
145
- private findOptionalDependencies;
146
- /**
147
- * @ac US-033-AC-4: Skip managed package dependencies
148
- */
149
- private findManagedPackages;
150
- /**
151
- * Check if a component is from a managed package
152
- */
153
- private isManagedPackage;
154
- /**
155
- * Check if a dependency is optional (soft dependency)
156
- * Note: Current MetadataComponent uses Set<string> for dependencies
157
- * For now, we'll return false as type info is not available
158
- */
159
- private isOptionalDependency;
160
118
  /**
161
119
  * @ac US-033-AC-6: Generate dependency report
162
120
  */
163
121
  private generateReport;
164
122
  private calculateDeploymentLevels;
165
- private shouldIncludeNode;
166
- private collectIncludedDependencies;
167
- private classifyDependency;
168
- private calculateInDegree;
169
- private collectZeroDegreeNodes;
170
123
  /**
171
124
  * Get resolution status for a specific component
172
125
  */