@jterrats/smart-deployment 1.0.3 → 1.0.4

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 (257) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +6 -0
  3. package/lib/ai/wave-validation-service.d.ts +21 -0
  4. package/lib/ai/wave-validation-service.js +189 -114
  5. package/lib/ai/wave-validation-service.js.map +1 -1
  6. package/lib/analysis/analysis-reporter.d.ts +12 -0
  7. package/lib/analysis/analysis-reporter.js +61 -0
  8. package/lib/analysis/analysis-reporter.js.map +1 -1
  9. package/lib/analysis/analyze-artifact-service.d.ts +25 -0
  10. package/lib/analysis/analyze-artifact-service.js +50 -0
  11. package/lib/analysis/analyze-artifact-service.js.map +1 -0
  12. package/lib/analysis/analyze-context-service.d.ts +25 -0
  13. package/lib/analysis/analyze-context-service.js +28 -0
  14. package/lib/analysis/analyze-context-service.js.map +1 -0
  15. package/lib/analysis/project-analysis-service.d.ts +48 -0
  16. package/lib/analysis/project-analysis-service.js +134 -0
  17. package/lib/analysis/project-analysis-service.js.map +1 -0
  18. package/lib/commands/analyze.d.ts +0 -2
  19. package/lib/commands/analyze.js +31 -162
  20. package/lib/commands/analyze.js.map +1 -1
  21. package/lib/commands/config.d.ts +0 -4
  22. package/lib/commands/config.js +25 -95
  23. package/lib/commands/config.js.map +1 -1
  24. package/lib/commands/resume.js +6 -16
  25. package/lib/commands/resume.js.map +1 -1
  26. package/lib/commands/start.d.ts +0 -11
  27. package/lib/commands/start.js +38 -550
  28. package/lib/commands/start.js.map +1 -1
  29. package/lib/commands/status.js +36 -12
  30. package/lib/commands/status.js.map +1 -1
  31. package/lib/commands/validate.d.ts +3 -0
  32. package/lib/commands/validate.js +5 -7
  33. package/lib/commands/validate.js.map +1 -1
  34. package/lib/config/config-mutation-service.d.ts +21 -0
  35. package/lib/config/config-mutation-service.js +61 -0
  36. package/lib/config/config-mutation-service.js.map +1 -0
  37. package/lib/dependencies/circular-dependency-detector.d.ts +5 -0
  38. package/lib/dependencies/circular-dependency-detector.js +67 -72
  39. package/lib/dependencies/circular-dependency-detector.js.map +1 -1
  40. package/lib/dependencies/dependency-depth-calculator.d.ts +28 -0
  41. package/lib/dependencies/dependency-depth-calculator.js +86 -39
  42. package/lib/dependencies/dependency-depth-calculator.js.map +1 -1
  43. package/lib/dependencies/dependency-graph-builder.d.ts +45 -13
  44. package/lib/dependencies/dependency-graph-builder.js +228 -123
  45. package/lib/dependencies/dependency-graph-builder.js.map +1 -1
  46. package/lib/dependencies/dependency-impact-analyzer.d.ts +13 -0
  47. package/lib/dependencies/dependency-impact-analyzer.js +146 -102
  48. package/lib/dependencies/dependency-impact-analyzer.js.map +1 -1
  49. package/lib/dependencies/dependency-merger.d.ts +10 -0
  50. package/lib/dependencies/dependency-merger.js +123 -61
  51. package/lib/dependencies/dependency-merger.js.map +1 -1
  52. package/lib/dependencies/dependency-resolver.d.ts +34 -9
  53. package/lib/dependencies/dependency-resolver.js +181 -112
  54. package/lib/dependencies/dependency-resolver.js.map +1 -1
  55. package/lib/dependencies/dependency-semantics.d.ts +20 -0
  56. package/lib/dependencies/dependency-semantics.js +55 -0
  57. package/lib/dependencies/dependency-semantics.js.map +1 -0
  58. package/lib/dependencies/graph-visualizer.d.ts +6 -1
  59. package/lib/dependencies/graph-visualizer.js +38 -4
  60. package/lib/dependencies/graph-visualizer.js.map +1 -1
  61. package/lib/dependencies/heuristic-inference.d.ts +2 -53
  62. package/lib/dependencies/heuristic-inference.js +8 -317
  63. package/lib/dependencies/heuristic-inference.js.map +1 -1
  64. package/lib/dependencies/heuristic-patterns.d.ts +14 -0
  65. package/lib/dependencies/heuristic-patterns.js +247 -0
  66. package/lib/dependencies/heuristic-patterns.js.map +1 -0
  67. package/lib/deployment/cycle-remediation-runner.d.ts +36 -0
  68. package/lib/deployment/cycle-remediation-runner.js +262 -0
  69. package/lib/deployment/cycle-remediation-runner.js.map +1 -0
  70. package/lib/deployment/deployment-context-service.d.ts +24 -0
  71. package/lib/deployment/deployment-context-service.js +17 -0
  72. package/lib/deployment/deployment-context-service.js.map +1 -0
  73. package/lib/deployment/deployment-runner.d.ts +37 -0
  74. package/lib/deployment/deployment-runner.js +94 -0
  75. package/lib/deployment/deployment-runner.js.map +1 -0
  76. package/lib/deployment/deployment-status-service.d.ts +5 -0
  77. package/lib/deployment/deployment-status-service.js +39 -18
  78. package/lib/deployment/deployment-status-service.js.map +1 -1
  79. package/lib/deployment/deployment-validation-service.d.ts +5 -2
  80. package/lib/deployment/deployment-validation-service.js +48 -45
  81. package/lib/deployment/deployment-validation-service.js.map +1 -1
  82. package/lib/deployment/resume-deployment-service.d.ts +14 -0
  83. package/lib/deployment/resume-deployment-service.js +25 -0
  84. package/lib/deployment/resume-deployment-service.js.map +1 -0
  85. package/lib/deployment/start-execution-service.d.ts +44 -0
  86. package/lib/deployment/start-execution-service.js +94 -0
  87. package/lib/deployment/start-execution-service.js.map +1 -0
  88. package/lib/deployment/test-executor.d.ts +60 -1
  89. package/lib/deployment/test-executor.js +180 -12
  90. package/lib/deployment/test-executor.js.map +1 -1
  91. package/lib/deployment/test-plan-service.d.ts +8 -0
  92. package/lib/deployment/test-plan-service.js +26 -0
  93. package/lib/deployment/test-plan-service.js.map +1 -0
  94. package/lib/deployment/wave-manifest-service.d.ts +11 -0
  95. package/lib/deployment/wave-manifest-service.js +41 -0
  96. package/lib/deployment/wave-manifest-service.js.map +1 -0
  97. package/lib/parsers/apex-class-parser.js +180 -98
  98. package/lib/parsers/apex-class-parser.js.map +1 -1
  99. package/lib/parsers/apex-trigger-parser.js +56 -7
  100. package/lib/parsers/apex-trigger-parser.js.map +1 -1
  101. package/lib/parsers/aura-parser.js +2 -2
  102. package/lib/parsers/aura-parser.js.map +1 -1
  103. package/lib/parsers/bot-parser.js +31 -4
  104. package/lib/parsers/bot-parser.js.map +1 -1
  105. package/lib/parsers/custom-metadata-parser.js +37 -3
  106. package/lib/parsers/custom-metadata-parser.js.map +1 -1
  107. package/lib/parsers/custom-object-parser.js +284 -150
  108. package/lib/parsers/custom-object-parser.js.map +1 -1
  109. package/lib/parsers/email-template-parser.js +115 -58
  110. package/lib/parsers/email-template-parser.js.map +1 -1
  111. package/lib/parsers/flexipage-parser.js +41 -16
  112. package/lib/parsers/flexipage-parser.js.map +1 -1
  113. package/lib/parsers/flow-parser.js +73 -63
  114. package/lib/parsers/flow-parser.js.map +1 -1
  115. package/lib/parsers/genai-prompt-parser.js +16 -4
  116. package/lib/parsers/genai-prompt-parser.js.map +1 -1
  117. package/lib/parsers/layout-parser.d.ts +11 -0
  118. package/lib/parsers/layout-parser.js +143 -68
  119. package/lib/parsers/layout-parser.js.map +1 -1
  120. package/lib/parsers/lwc-parser.d.ts +0 -9
  121. package/lib/parsers/lwc-parser.js +245 -100
  122. package/lib/parsers/lwc-parser.js.map +1 -1
  123. package/lib/parsers/parser-utils.d.ts +3 -0
  124. package/lib/parsers/parser-utils.js +16 -0
  125. package/lib/parsers/parser-utils.js.map +1 -0
  126. package/lib/parsers/permission-set-parser.d.ts +6 -0
  127. package/lib/parsers/permission-set-parser.js +31 -40
  128. package/lib/parsers/permission-set-parser.js.map +1 -1
  129. package/lib/parsers/profile-parser.d.ts +13 -0
  130. package/lib/parsers/profile-parser.js +39 -34
  131. package/lib/parsers/profile-parser.js.map +1 -1
  132. package/lib/parsers/visualforce-parser.js +2 -1
  133. package/lib/parsers/visualforce-parser.js.map +1 -1
  134. package/lib/presentation/analyze-command-presenter.d.ts +10 -0
  135. package/lib/presentation/analyze-command-presenter.js +30 -0
  136. package/lib/presentation/analyze-command-presenter.js.map +1 -0
  137. package/lib/presentation/config-command-presenter.d.ts +15 -0
  138. package/lib/presentation/config-command-presenter.js +50 -0
  139. package/lib/presentation/config-command-presenter.js.map +1 -0
  140. package/lib/presentation/project-analysis-presenter.d.ts +9 -0
  141. package/lib/presentation/project-analysis-presenter.js +9 -0
  142. package/lib/presentation/project-analysis-presenter.js.map +1 -0
  143. package/lib/presentation/resume-command-presenter.d.ts +7 -0
  144. package/lib/presentation/resume-command-presenter.js +12 -0
  145. package/lib/presentation/resume-command-presenter.js.map +1 -0
  146. package/lib/presentation/start-command-presenter.d.ts +15 -0
  147. package/lib/presentation/start-command-presenter.js +29 -0
  148. package/lib/presentation/start-command-presenter.js.map +1 -0
  149. package/lib/presentation/status-command-presenter.d.ts +7 -0
  150. package/lib/presentation/status-command-presenter.js +16 -0
  151. package/lib/presentation/status-command-presenter.js.map +1 -0
  152. package/lib/presentation/validate-command-presenter.d.ts +9 -0
  153. package/lib/presentation/validate-command-presenter.js +50 -0
  154. package/lib/presentation/validate-command-presenter.js.map +1 -0
  155. package/lib/services/metadata-scanner-service.d.ts +8 -12
  156. package/lib/services/metadata-scanner-service.js +55 -533
  157. package/lib/services/metadata-scanner-service.js.map +1 -1
  158. package/lib/services/scanners/automation-ai-metadata-scanner.d.ts +4 -0
  159. package/lib/services/scanners/automation-ai-metadata-scanner.js +61 -0
  160. package/lib/services/scanners/automation-ai-metadata-scanner.js.map +1 -0
  161. package/lib/services/scanners/code-metadata-scanner.d.ts +23 -0
  162. package/lib/services/scanners/code-metadata-scanner.js +149 -0
  163. package/lib/services/scanners/code-metadata-scanner.js.map +1 -0
  164. package/lib/services/scanners/data-metadata-scanner.d.ts +3 -0
  165. package/lib/services/scanners/data-metadata-scanner.js +82 -0
  166. package/lib/services/scanners/data-metadata-scanner.js.map +1 -0
  167. package/lib/services/scanners/experience-metadata-scanner.d.ts +5 -0
  168. package/lib/services/scanners/experience-metadata-scanner.js +123 -0
  169. package/lib/services/scanners/experience-metadata-scanner.js.map +1 -0
  170. package/lib/services/scanners/scanner-runtime.d.ts +11 -0
  171. package/lib/services/scanners/scanner-runtime.js +115 -0
  172. package/lib/services/scanners/scanner-runtime.js.map +1 -0
  173. package/lib/services/scanners/security-metadata-scanner.d.ts +3 -0
  174. package/lib/services/scanners/security-metadata-scanner.js +71 -0
  175. package/lib/services/scanners/security-metadata-scanner.js.map +1 -0
  176. package/lib/types/dependency.d.ts +11 -1
  177. package/lib/types/metadata.d.ts +17 -0
  178. package/lib/types/salesforce/flow/actions.d.ts +108 -0
  179. package/lib/types/salesforce/flow/actions.js +2 -0
  180. package/lib/types/salesforce/flow/actions.js.map +1 -0
  181. package/lib/types/salesforce/flow/common.d.ts +36 -0
  182. package/lib/types/salesforce/flow/common.js +5 -0
  183. package/lib/types/salesforce/flow/common.js.map +1 -0
  184. package/lib/types/salesforce/flow/metadata.d.ts +37 -0
  185. package/lib/types/salesforce/flow/metadata.js +2 -0
  186. package/lib/types/salesforce/flow/metadata.js.map +1 -0
  187. package/lib/types/salesforce/flow/records.d.ts +38 -0
  188. package/lib/types/salesforce/flow/records.js +2 -0
  189. package/lib/types/salesforce/flow/records.js.map +1 -0
  190. package/lib/types/salesforce/flow/resources.d.ts +44 -0
  191. package/lib/types/salesforce/flow/resources.js +2 -0
  192. package/lib/types/salesforce/flow/resources.js.map +1 -0
  193. package/lib/types/salesforce/flow/screens.d.ts +56 -0
  194. package/lib/types/salesforce/flow/screens.js +2 -0
  195. package/lib/types/salesforce/flow/screens.js.map +1 -0
  196. package/lib/types/salesforce/flow/start.d.ts +24 -0
  197. package/lib/types/salesforce/flow/start.js +2 -0
  198. package/lib/types/salesforce/flow/start.js.map +1 -0
  199. package/lib/types/salesforce/flow.d.ts +9 -514
  200. package/lib/types/salesforce/flow.js +1 -1
  201. package/lib/types/salesforce/object/core.d.ts +68 -0
  202. package/lib/types/salesforce/object/core.js +5 -0
  203. package/lib/types/salesforce/object/core.js.map +1 -0
  204. package/lib/types/salesforce/object/field.d.ts +155 -0
  205. package/lib/types/salesforce/object/field.js +5 -0
  206. package/lib/types/salesforce/object/field.js.map +1 -0
  207. package/lib/types/salesforce/object/filter.d.ts +16 -0
  208. package/lib/types/salesforce/object/filter.js +5 -0
  209. package/lib/types/salesforce/object/filter.js.map +1 -0
  210. package/lib/types/salesforce/object/policy.d.ts +27 -0
  211. package/lib/types/salesforce/object/policy.js +5 -0
  212. package/lib/types/salesforce/object/policy.js.map +1 -0
  213. package/lib/types/salesforce/object/record.d.ts +44 -0
  214. package/lib/types/salesforce/object/record.js +5 -0
  215. package/lib/types/salesforce/object/record.js.map +1 -0
  216. package/lib/types/salesforce/object/view.d.ts +71 -0
  217. package/lib/types/salesforce/object/view.js +5 -0
  218. package/lib/types/salesforce/object/view.js.map +1 -0
  219. package/lib/types/salesforce/object/weblink.d.ts +70 -0
  220. package/lib/types/salesforce/object/weblink.js +5 -0
  221. package/lib/types/salesforce/object/weblink.js.map +1 -0
  222. package/lib/types/salesforce/object.d.ts +7 -423
  223. package/lib/types/salesforce/object.js +7 -1
  224. package/lib/types/salesforce/object.js.map +1 -1
  225. package/lib/utils/cache-manager.d.ts +16 -15
  226. package/lib/utils/cache-manager.js +290 -188
  227. package/lib/utils/cache-manager.js.map +1 -1
  228. package/lib/utils/logger.d.ts +8 -0
  229. package/lib/utils/logger.js +82 -69
  230. package/lib/utils/logger.js.map +1 -1
  231. package/lib/validators/xml/xml-reference-rules.d.ts +3 -0
  232. package/lib/validators/xml/xml-reference-rules.js +173 -0
  233. package/lib/validators/xml/xml-reference-rules.js.map +1 -0
  234. package/lib/validators/xml/xml-report-formatter.d.ts +2 -0
  235. package/lib/validators/xml/xml-report-formatter.js +47 -0
  236. package/lib/validators/xml/xml-report-formatter.js.map +1 -0
  237. package/lib/validators/xml/xml-schema-rules.d.ts +3 -0
  238. package/lib/validators/xml/xml-schema-rules.js +75 -0
  239. package/lib/validators/xml/xml-schema-rules.js.map +1 -0
  240. package/lib/validators/xml/xml-validation-types.d.ts +25 -0
  241. package/lib/validators/xml/xml-validation-types.js +2 -0
  242. package/lib/validators/xml/xml-validation-types.js.map +1 -0
  243. package/lib/validators/xml-metadata-validator.d.ts +2 -63
  244. package/lib/validators/xml-metadata-validator.js +7 -338
  245. package/lib/validators/xml-metadata-validator.js.map +1 -1
  246. package/lib/waves/test-optimizer.d.ts +13 -0
  247. package/lib/waves/test-optimizer.js +124 -63
  248. package/lib/waves/test-optimizer.js.map +1 -1
  249. package/lib/waves/wave-builder.d.ts +17 -21
  250. package/lib/waves/wave-builder.js +199 -135
  251. package/lib/waves/wave-builder.js.map +1 -1
  252. package/lib/waves/wave-splitter.d.ts +12 -8
  253. package/lib/waves/wave-splitter.js +156 -115
  254. package/lib/waves/wave-splitter.js.map +1 -1
  255. package/npm-shrinkwrap.json +2 -2
  256. package/oclif.manifest.json +1 -1
  257. package/package.json +1 -1
@@ -0,0 +1,247 @@
1
+ export function calculateConfidence(pattern, existingDeps, nameSimilarity) {
2
+ let score = 50;
3
+ const patternScores = {
4
+ 'test-suffix': 45,
5
+ 'test-prefix': 45,
6
+ 'trigger-handler': 40,
7
+ 'handler-service': 35,
8
+ 'controller-service': 35,
9
+ 'batch-service': 25,
10
+ 'queueable-service': 25,
11
+ 'selector-service': 20,
12
+ 'integration-service': 15,
13
+ };
14
+ score += patternScores[pattern] ?? 0;
15
+ score += Math.floor(nameSimilarity * 10);
16
+ score -= Math.min(existingDeps * 2, 10);
17
+ score = Math.max(0, Math.min(100, score));
18
+ if (score >= 80) {
19
+ return { confidence: 'high', score };
20
+ }
21
+ if (score >= 65) {
22
+ return { confidence: 'medium', score };
23
+ }
24
+ return { confidence: 'low', score };
25
+ }
26
+ export function inferTestClassDependencies(component, components) {
27
+ if (component.type !== 'ApexClass') {
28
+ return [];
29
+ }
30
+ const inferred = [];
31
+ const className = component.name;
32
+ if (className.endsWith('Test')) {
33
+ const productionClassName = className.slice(0, -4);
34
+ const prodNodeId = `ApexClass:${productionClassName}`;
35
+ if (components.has(prodNodeId)) {
36
+ inferred.push({
37
+ from: `ApexClass:${className}`,
38
+ to: prodNodeId,
39
+ reason: 'Test class typically tests production class',
40
+ confidence: 'high',
41
+ pattern: 'test-suffix',
42
+ score: 95,
43
+ });
44
+ }
45
+ }
46
+ if (className.startsWith('Test_')) {
47
+ const productionClassName = className.slice(5);
48
+ const prodNodeId = `ApexClass:${productionClassName}`;
49
+ if (components.has(prodNodeId)) {
50
+ inferred.push({
51
+ from: `ApexClass:${className}`,
52
+ to: prodNodeId,
53
+ reason: 'Test class typically tests production class',
54
+ confidence: 'high',
55
+ pattern: 'test-prefix',
56
+ score: 95,
57
+ });
58
+ }
59
+ }
60
+ if (className.endsWith('_Test')) {
61
+ const productionClassName = className.slice(0, -5);
62
+ const prodNodeId = `ApexClass:${productionClassName}`;
63
+ if (components.has(prodNodeId)) {
64
+ inferred.push({
65
+ from: `ApexClass:${className}`,
66
+ to: prodNodeId,
67
+ reason: 'Test class typically tests production class',
68
+ confidence: 'high',
69
+ pattern: 'test-suffix-underscore',
70
+ score: 95,
71
+ });
72
+ }
73
+ }
74
+ return inferred;
75
+ }
76
+ export function inferHandlerServicePattern(component, components) {
77
+ if (component.type !== 'ApexClass') {
78
+ return [];
79
+ }
80
+ const inferred = [];
81
+ const className = component.name;
82
+ if (className.endsWith('Handler')) {
83
+ const baseName = className.slice(0, -7);
84
+ const serviceNames = [`${baseName}Service`, `${baseName}_Service`, `${baseName}Svc`];
85
+ for (const serviceName of serviceNames) {
86
+ const serviceNodeId = `ApexClass:${serviceName}`;
87
+ if (components.has(serviceNodeId)) {
88
+ inferred.push({
89
+ from: `ApexClass:${className}`,
90
+ to: serviceNodeId,
91
+ reason: 'Handler typically calls service layer',
92
+ confidence: 'high',
93
+ pattern: 'handler-service',
94
+ score: 85,
95
+ });
96
+ }
97
+ }
98
+ }
99
+ if (className.includes('Handler')) {
100
+ const baseName = className.replace(/Handler$/, '').replace(/_Handler$/, '');
101
+ const serviceNames = [`${baseName}Service`, `${baseName}_Service`];
102
+ for (const serviceName of serviceNames) {
103
+ const serviceNodeId = `ApexClass:${serviceName}`;
104
+ if (components.has(serviceNodeId) && !inferred.some((dependency) => dependency.to === serviceNodeId)) {
105
+ inferred.push({
106
+ from: `ApexClass:${className}`,
107
+ to: serviceNodeId,
108
+ reason: 'Handler typically calls service layer',
109
+ confidence: 'medium',
110
+ pattern: 'handler-service-variant',
111
+ score: 75,
112
+ });
113
+ }
114
+ }
115
+ }
116
+ return inferred;
117
+ }
118
+ export function inferTriggerHandlerPattern(component, components) {
119
+ if (component.type !== 'ApexTrigger') {
120
+ return [];
121
+ }
122
+ const inferred = [];
123
+ const triggerName = component.name;
124
+ const handlerNames = [
125
+ `${triggerName}Handler`,
126
+ triggerName.replace(/Trigger$/, 'TriggerHandler'),
127
+ triggerName.replace(/Trigger$/, 'Handler'),
128
+ ];
129
+ for (const handlerName of handlerNames) {
130
+ const handlerNodeId = `ApexClass:${handlerName}`;
131
+ if (components.has(handlerNodeId)) {
132
+ inferred.push({
133
+ from: `ApexTrigger:${triggerName}`,
134
+ to: handlerNodeId,
135
+ reason: 'Trigger typically delegates to handler class',
136
+ confidence: 'high',
137
+ pattern: 'trigger-handler',
138
+ score: 90,
139
+ });
140
+ break;
141
+ }
142
+ }
143
+ return inferred;
144
+ }
145
+ export function inferControllerServicePattern(component, components) {
146
+ if (component.type !== 'ApexClass') {
147
+ return [];
148
+ }
149
+ const inferred = [];
150
+ const className = component.name;
151
+ if (className.endsWith('Controller') || className.includes('Controller')) {
152
+ const baseName = className
153
+ .replace(/Controller$/, '')
154
+ .replace(/_Controller$/, '')
155
+ .replace(/^LWC_/, '')
156
+ .replace(/^VF_/, '');
157
+ const serviceNames = [`${baseName}Service`, `${baseName}_Service`, `${baseName}Svc`];
158
+ for (const serviceName of serviceNames) {
159
+ const serviceNodeId = `ApexClass:${serviceName}`;
160
+ if (components.has(serviceNodeId)) {
161
+ inferred.push({
162
+ from: `ApexClass:${className}`,
163
+ to: serviceNodeId,
164
+ reason: 'Controller typically calls service layer',
165
+ confidence: 'high',
166
+ pattern: 'controller-service',
167
+ score: 85,
168
+ });
169
+ }
170
+ }
171
+ }
172
+ return inferred;
173
+ }
174
+ export function inferFromNamingConventions(component, components) {
175
+ if (component.type !== 'ApexClass') {
176
+ return [];
177
+ }
178
+ const inferred = [];
179
+ const className = component.name;
180
+ if (className.endsWith('Selector')) {
181
+ const baseName = className.slice(0, -8);
182
+ const serviceNodeId = `ApexClass:${baseName}Service`;
183
+ if (components.has(serviceNodeId)) {
184
+ inferred.push({
185
+ from: `ApexClass:${className}`,
186
+ to: serviceNodeId,
187
+ reason: 'Selector may be used by service layer',
188
+ confidence: 'medium',
189
+ pattern: 'selector-service',
190
+ score: 70,
191
+ });
192
+ }
193
+ }
194
+ if (className.endsWith('Batch')) {
195
+ const baseName = className.slice(0, -5);
196
+ const serviceNames = [`${baseName}Service`, `${baseName}`];
197
+ for (const serviceName of serviceNames) {
198
+ const serviceNodeId = `ApexClass:${serviceName}`;
199
+ if (components.has(serviceNodeId)) {
200
+ inferred.push({
201
+ from: `ApexClass:${className}`,
202
+ to: serviceNodeId,
203
+ reason: 'Batch class typically uses service layer',
204
+ confidence: 'medium',
205
+ pattern: 'batch-service',
206
+ score: 75,
207
+ });
208
+ break;
209
+ }
210
+ }
211
+ }
212
+ if (className.endsWith('Queueable') || className.includes('Queueable')) {
213
+ const baseName = className.replace(/Queueable$/, '').replace(/_Queueable/, '');
214
+ const serviceNodeId = `ApexClass:${baseName}Service`;
215
+ if (components.has(serviceNodeId)) {
216
+ inferred.push({
217
+ from: `ApexClass:${className}`,
218
+ to: serviceNodeId,
219
+ reason: 'Queueable typically uses service layer',
220
+ confidence: 'medium',
221
+ pattern: 'queueable-service',
222
+ score: 75,
223
+ });
224
+ }
225
+ }
226
+ if (className.includes('Integration')) {
227
+ const baseName = className
228
+ .replace(/Integration$/, '')
229
+ .replace(/_Integration/, '')
230
+ .replace(/^Integration/, '');
231
+ if (baseName) {
232
+ const serviceNodeId = `ApexClass:${baseName}Service`;
233
+ if (components.has(serviceNodeId)) {
234
+ inferred.push({
235
+ from: `ApexClass:${className}`,
236
+ to: serviceNodeId,
237
+ reason: 'Integration class may use service layer',
238
+ confidence: 'low',
239
+ pattern: 'integration-service',
240
+ score: 65,
241
+ });
242
+ }
243
+ }
244
+ }
245
+ return inferred;
246
+ }
247
+ //# sourceMappingURL=heuristic-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heuristic-patterns.js","sourceRoot":"","sources":["../../src/dependencies/heuristic-patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { CycleRemediationPlanner } from '../dependencies/cycle-remediation-planner.js';
2
+ import type { NodeId } from '../types/dependency.js';
3
+ import type { MetadataComponent } from '../types/metadata.js';
4
+ import { StateManager } from './state-manager.js';
5
+ import { DeploymentTracker } from './deployment-tracker.js';
6
+ import { SfCliIntegration } from './sf-cli-integration.js';
7
+ import { TestPlanService } from './test-plan-service.js';
8
+ import { WaveManifestService } from './wave-manifest-service.js';
9
+ export type CycleRemediationRunnerParams = {
10
+ deploymentId: string;
11
+ targetOrg: string;
12
+ sourcePath?: string;
13
+ stateManager: StateManager;
14
+ tracker: DeploymentTracker;
15
+ plan: ReturnType<CycleRemediationPlanner['createPlan']>;
16
+ sfCli: SfCliIntegration;
17
+ skipTests: boolean;
18
+ componentMap: ReadonlyMap<NodeId, MetadataComponent>;
19
+ log: (message: string) => void;
20
+ };
21
+ type CycleRemediationRunnerDependencies = {
22
+ testPlanService?: TestPlanService;
23
+ waveManifestService?: WaveManifestService;
24
+ };
25
+ export declare class CycleRemediationRunner {
26
+ private readonly testPlanService;
27
+ private readonly waveManifestService;
28
+ constructor(dependencies?: CycleRemediationRunnerDependencies);
29
+ execute(params: CycleRemediationRunnerParams): Promise<void>;
30
+ private createCycleEditRequest;
31
+ private restoreCycleEdits;
32
+ private buildSyntheticWave;
33
+ private collectWaveTypes;
34
+ private forEachSequentially;
35
+ }
36
+ export {};
@@ -0,0 +1,262 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { CycleSourceEditor } from './cycle-source-editor.js';
3
+ import { TestPlanService } from './test-plan-service.js';
4
+ import { WaveManifestService } from './wave-manifest-service.js';
5
+ export class CycleRemediationRunner {
6
+ testPlanService;
7
+ waveManifestService;
8
+ constructor(dependencies = {}) {
9
+ this.testPlanService = dependencies.testPlanService ?? new TestPlanService();
10
+ this.waveManifestService = dependencies.waveManifestService ?? new WaveManifestService();
11
+ }
12
+ async execute(params) {
13
+ const { deploymentId, targetOrg, sourcePath, stateManager, tracker, plan, sfCli, skipTests, componentMap, log } = params;
14
+ const editor = new CycleSourceEditor();
15
+ const startedAt = new Date().toISOString();
16
+ const editRecords = [];
17
+ const testExecutor = this.testPlanService.createExecutor([...componentMap.values()]);
18
+ const cycleId = plan.cycles.map((cycle) => cycle.id).join('||');
19
+ const phaseOneComponents = [
20
+ ...new Set(plan.cycles.flatMap((cycle) => cycle.deployPhases.find((phase) => phase.phase === 1)?.components ?? [])),
21
+ ];
22
+ const phaseTwoComponents = [
23
+ ...new Set(plan.cycles.flatMap((cycle) => cycle.deployPhases.find((phase) => phase.phase === 2)?.components ?? [])),
24
+ ];
25
+ let editsRestored = false;
26
+ let failureStateSaved = false;
27
+ try {
28
+ log('🩹 Applying conservative cycle remediation edits...');
29
+ await this.forEachSequentially(plan.cycles, async (cycle) => {
30
+ await this.forEachSequentially(cycle.edits, async (edit) => {
31
+ const request = await this.createCycleEditRequest(edit);
32
+ editRecords.push(await editor.applyEdit(request));
33
+ });
34
+ });
35
+ await stateManager.saveState({
36
+ deploymentId,
37
+ targetOrg,
38
+ timestamp: startedAt,
39
+ totalWaves: 2,
40
+ completedWaves: [],
41
+ currentWave: 1,
42
+ cycleRemediation: {
43
+ cycleId,
44
+ strategy: 'comment-reference',
45
+ activePhase: 1,
46
+ startedAt,
47
+ completedPhases: [],
48
+ editRecords,
49
+ },
50
+ });
51
+ tracker.startTracking(deploymentId, 1, 2);
52
+ log('♻️ Phase 1/2: deploying temporarily cycle-broken metadata...');
53
+ const phaseOneManifestPath = await this.waveManifestService.generateManifest({
54
+ baseDir: sourcePath ?? process.cwd(),
55
+ waveNumber: 1,
56
+ components: phaseOneComponents,
57
+ componentMap,
58
+ });
59
+ const phaseOneTestPlan = this.testPlanService.resolveTestPlan(this.buildSyntheticWave(1, phaseOneComponents, componentMap), skipTests, testExecutor);
60
+ const phaseOneResult = await sfCli.deploy({
61
+ manifestPath: phaseOneManifestPath,
62
+ targetOrg,
63
+ testLevel: phaseOneTestPlan.testLevel,
64
+ tests: phaseOneTestPlan.testLevel === 'RunSpecifiedTests' ? phaseOneTestPlan.tests : undefined,
65
+ });
66
+ if (!phaseOneResult.success) {
67
+ await stateManager.saveState({
68
+ deploymentId,
69
+ targetOrg,
70
+ timestamp: new Date().toISOString(),
71
+ totalWaves: 2,
72
+ completedWaves: [],
73
+ currentWave: 1,
74
+ failedWave: {
75
+ waveNumber: 1,
76
+ error: phaseOneResult.output,
77
+ timestamp: new Date().toISOString(),
78
+ },
79
+ cycleRemediation: {
80
+ cycleId,
81
+ strategy: 'comment-reference',
82
+ activePhase: 1,
83
+ startedAt,
84
+ completedPhases: [],
85
+ editRecords,
86
+ },
87
+ metadata: {
88
+ lastKnownStatus: phaseOneResult.status,
89
+ testsRun: phaseOneResult.testsRun,
90
+ testFailures: phaseOneResult.testFailures,
91
+ testLevel: phaseOneTestPlan.testLevel,
92
+ },
93
+ });
94
+ failureStateSaved = true;
95
+ throw new Error(`Cycle remediation phase 1 failed: ${phaseOneResult.output}`);
96
+ }
97
+ await stateManager.saveState({
98
+ deploymentId,
99
+ targetOrg,
100
+ timestamp: new Date().toISOString(),
101
+ totalWaves: 2,
102
+ completedWaves: [1],
103
+ currentWave: 2,
104
+ cycleRemediation: {
105
+ cycleId,
106
+ strategy: 'comment-reference',
107
+ activePhase: 2,
108
+ startedAt,
109
+ completedPhases: [1],
110
+ editRecords,
111
+ },
112
+ metadata: {
113
+ lastKnownStatus: phaseOneResult.status,
114
+ testsRun: phaseOneResult.testsRun,
115
+ testFailures: phaseOneResult.testFailures,
116
+ testLevel: phaseOneTestPlan.testLevel,
117
+ },
118
+ });
119
+ log('♻️ Restoring original references before phase 2...');
120
+ await this.restoreCycleEdits(editor, editRecords);
121
+ editsRestored = true;
122
+ tracker.startTracking(deploymentId, 2, 2);
123
+ log('♻️ Phase 2/2: redeploying restored metadata...');
124
+ const phaseTwoManifestPath = await this.waveManifestService.generateManifest({
125
+ baseDir: sourcePath ?? process.cwd(),
126
+ waveNumber: 2,
127
+ components: phaseTwoComponents,
128
+ componentMap,
129
+ });
130
+ const phaseTwoTestPlan = this.testPlanService.resolveTestPlan(this.buildSyntheticWave(2, phaseTwoComponents, componentMap), skipTests, testExecutor);
131
+ const phaseTwoResult = await sfCli.deploy({
132
+ manifestPath: phaseTwoManifestPath,
133
+ targetOrg,
134
+ testLevel: phaseTwoTestPlan.testLevel,
135
+ tests: phaseTwoTestPlan.testLevel === 'RunSpecifiedTests' ? phaseTwoTestPlan.tests : undefined,
136
+ });
137
+ if (!phaseTwoResult.success) {
138
+ await stateManager.saveState({
139
+ deploymentId,
140
+ targetOrg,
141
+ timestamp: new Date().toISOString(),
142
+ totalWaves: 2,
143
+ completedWaves: [1],
144
+ currentWave: 2,
145
+ failedWave: {
146
+ waveNumber: 2,
147
+ error: phaseTwoResult.output,
148
+ timestamp: new Date().toISOString(),
149
+ },
150
+ cycleRemediation: {
151
+ cycleId,
152
+ strategy: 'comment-reference',
153
+ activePhase: 2,
154
+ startedAt,
155
+ completedPhases: [1],
156
+ editRecords,
157
+ },
158
+ metadata: {
159
+ lastKnownStatus: phaseTwoResult.status,
160
+ testsRun: phaseTwoResult.testsRun,
161
+ testFailures: phaseTwoResult.testFailures,
162
+ testLevel: phaseTwoTestPlan.testLevel,
163
+ },
164
+ });
165
+ failureStateSaved = true;
166
+ throw new Error(`Cycle remediation phase 2 failed: ${phaseTwoResult.output}`);
167
+ }
168
+ await stateManager.clearState();
169
+ log('\n✅ Cycle remediation deployment completed successfully!');
170
+ }
171
+ catch (error) {
172
+ if (!editsRestored) {
173
+ await this.restoreCycleEdits(editor, editRecords, true);
174
+ }
175
+ if (!failureStateSaved) {
176
+ await stateManager.saveState({
177
+ deploymentId,
178
+ targetOrg,
179
+ timestamp: new Date().toISOString(),
180
+ totalWaves: 2,
181
+ completedWaves: [],
182
+ currentWave: 1,
183
+ failedWave: {
184
+ waveNumber: 1,
185
+ error: error instanceof Error ? error.message : String(error),
186
+ timestamp: new Date().toISOString(),
187
+ },
188
+ cycleRemediation: {
189
+ cycleId,
190
+ strategy: 'comment-reference',
191
+ activePhase: 1,
192
+ startedAt,
193
+ completedPhases: [],
194
+ editRecords,
195
+ },
196
+ });
197
+ }
198
+ throw error;
199
+ }
200
+ }
201
+ async createCycleEditRequest(edit) {
202
+ if (edit.filePath === undefined) {
203
+ throw new Error(`Cycle remediation edit for ${edit.nodeId} is missing a file path.`);
204
+ }
205
+ const content = await readFile(edit.filePath, 'utf8');
206
+ const dependencyName = edit.targetDependency.includes(':')
207
+ ? edit.targetDependency.split(':').pop() ?? edit.targetDependency
208
+ : edit.targetDependency;
209
+ const candidateLines = content.split('\n').filter((line) => {
210
+ const trimmed = line.trim();
211
+ return trimmed.length > 0 && !trimmed.startsWith('//') && line.includes(dependencyName);
212
+ });
213
+ if (candidateLines.length !== 1) {
214
+ throw new Error(`Cycle remediation for ${edit.nodeId} requires exactly one candidate source line containing ${dependencyName}; found ${candidateLines.length}.`);
215
+ }
216
+ return {
217
+ filePath: edit.filePath,
218
+ targetDescription: edit.targetDescription,
219
+ targetDependency: edit.targetDependency,
220
+ sourceSnippet: candidateLines[0],
221
+ };
222
+ }
223
+ async restoreCycleEdits(editor, editRecords, bestEffort = false) {
224
+ await this.forEachSequentially([...editRecords].reverse(), async (record) => {
225
+ const result = await editor.restoreEdit(record);
226
+ if (!result.restored && result.reason !== 'backup-missing' && !bestEffort) {
227
+ throw new Error(`Failed to restore cycle remediation edit for ${record.filePath}: ${result.reason ?? 'unknown'}.`);
228
+ }
229
+ });
230
+ }
231
+ buildSyntheticWave(waveNumber, components, componentMap) {
232
+ return {
233
+ number: waveNumber,
234
+ components,
235
+ metadata: {
236
+ componentCount: components.length,
237
+ types: this.collectWaveTypes(components, componentMap),
238
+ maxDepth: 0,
239
+ hasCircularDeps: false,
240
+ estimatedTime: 0,
241
+ },
242
+ };
243
+ }
244
+ collectWaveTypes(components, componentMap) {
245
+ const types = new Set();
246
+ for (const componentId of components) {
247
+ const component = componentMap.get(componentId);
248
+ if (component) {
249
+ types.add(component.type);
250
+ }
251
+ }
252
+ return Array.from(types);
253
+ }
254
+ async forEachSequentially(items, callback) {
255
+ let chain = Promise.resolve();
256
+ items.forEach((item, index) => {
257
+ chain = chain.then(async () => callback(item, index));
258
+ });
259
+ await chain;
260
+ }
261
+ }
262
+ //# sourceMappingURL=cycle-remediation-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cycle-remediation-runner.js","sourceRoot":"","sources":["../../src/deployment/cycle-remediation-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { ProjectAnalysisService, type ProjectAnalysisAIContext, type ProjectAnalysisMessages } from '../analysis/project-analysis-service.js';
2
+ import type { ScanResult } from '../services/metadata-scanner-service.js';
3
+ import type { Wave } from '../waves/wave-builder.js';
4
+ export type DeploymentAIContext = ProjectAnalysisAIContext;
5
+ export type DeploymentContextMessages = ProjectAnalysisMessages;
6
+ export type DeploymentContext = {
7
+ scanResult: ScanResult;
8
+ orderedWaves: Wave[];
9
+ aiContext?: DeploymentAIContext;
10
+ messages: DeploymentContextMessages;
11
+ };
12
+ export type DeploymentContextBuildOptions = {
13
+ sourcePath?: string;
14
+ useAI?: boolean;
15
+ orgType?: string;
16
+ industry?: string;
17
+ };
18
+ type DeploymentContextServiceDependencies = ConstructorParameters<typeof ProjectAnalysisService>[0];
19
+ export declare class DeploymentContextService {
20
+ private readonly projectAnalysisService;
21
+ constructor(dependencies?: DeploymentContextServiceDependencies);
22
+ buildContext(options?: DeploymentContextBuildOptions): Promise<DeploymentContext>;
23
+ }
24
+ export {};
@@ -0,0 +1,17 @@
1
+ import { ProjectAnalysisService, } from '../analysis/project-analysis-service.js';
2
+ export class DeploymentContextService {
3
+ projectAnalysisService;
4
+ constructor(dependencies = {}) {
5
+ this.projectAnalysisService = new ProjectAnalysisService(dependencies);
6
+ }
7
+ async buildContext(options = {}) {
8
+ const analysis = await this.projectAnalysisService.buildAnalysis(options);
9
+ return {
10
+ scanResult: analysis.scanResult,
11
+ orderedWaves: analysis.orderedWaves,
12
+ aiContext: analysis.aiContext,
13
+ messages: analysis.messages,
14
+ };
15
+ }
16
+ }
17
+ //# sourceMappingURL=deployment-context-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment-context-service.js","sourceRoot":"","sources":["../../src/deployment/deployment-context-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,GAGvB,MAAM,yCAAyC,CAAC;AAwBjD,MAAM,OAAO,wBAAwB;IAClB,sBAAsB,CAAyB;IAEhE,YAAmB,eAAqD,EAAE;QACxE,IAAI,CAAC,sBAAsB,GAAG,IAAI,sBAAsB,CAAC,YAAY,CAAC,CAAC;IACzE,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,UAAyC,EAAE;QACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1E,OAAO;YACL,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ import type { NodeId } from '../types/dependency.js';
2
+ import type { MetadataComponent } from '../types/metadata.js';
3
+ import type { Wave } from '../waves/wave-builder.js';
4
+ import { DeploymentTracker } from './deployment-tracker.js';
5
+ import { SfCliIntegration } from './sf-cli-integration.js';
6
+ import { StateManager } from './state-manager.js';
7
+ import { TestPlanService } from './test-plan-service.js';
8
+ import { WaveManifestService } from './wave-manifest-service.js';
9
+ import type { TestExecutor } from './test-executor.js';
10
+ import type { DeploymentAIContext } from './deployment-context-service.js';
11
+ export type DeploymentRunnerParams = {
12
+ deploymentId: string;
13
+ targetOrg: string;
14
+ sourcePath?: string;
15
+ orderedWaves: Wave[];
16
+ componentMap: ReadonlyMap<NodeId, MetadataComponent>;
17
+ skipTests: boolean;
18
+ testExecutor: TestExecutor;
19
+ tracker: DeploymentTracker;
20
+ stateManager: StateManager;
21
+ sfCli: SfCliIntegration;
22
+ aiContext?: DeploymentAIContext;
23
+ log: (message: string) => void;
24
+ };
25
+ type DeploymentRunnerDependencies = {
26
+ testPlanService?: TestPlanService;
27
+ waveManifestService?: WaveManifestService;
28
+ };
29
+ export declare class DeploymentRunner {
30
+ private readonly testPlanService;
31
+ private readonly waveManifestService;
32
+ constructor(dependencies?: DeploymentRunnerDependencies);
33
+ execute(params: DeploymentRunnerParams): Promise<void>;
34
+ private buildAIMetadata;
35
+ private forEachSequentially;
36
+ }
37
+ export {};