@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.
- package/LICENSE +29 -0
- package/README.md +6 -0
- package/lib/ai/wave-validation-service.d.ts +21 -0
- package/lib/ai/wave-validation-service.js +189 -114
- package/lib/ai/wave-validation-service.js.map +1 -1
- package/lib/analysis/analysis-reporter.d.ts +12 -0
- package/lib/analysis/analysis-reporter.js +61 -0
- package/lib/analysis/analysis-reporter.js.map +1 -1
- package/lib/analysis/analyze-artifact-service.d.ts +25 -0
- package/lib/analysis/analyze-artifact-service.js +50 -0
- package/lib/analysis/analyze-artifact-service.js.map +1 -0
- package/lib/analysis/analyze-context-service.d.ts +25 -0
- package/lib/analysis/analyze-context-service.js +28 -0
- package/lib/analysis/analyze-context-service.js.map +1 -0
- package/lib/analysis/project-analysis-service.d.ts +48 -0
- package/lib/analysis/project-analysis-service.js +134 -0
- package/lib/analysis/project-analysis-service.js.map +1 -0
- package/lib/commands/analyze.d.ts +0 -2
- package/lib/commands/analyze.js +31 -162
- package/lib/commands/analyze.js.map +1 -1
- package/lib/commands/config.d.ts +0 -4
- package/lib/commands/config.js +25 -95
- package/lib/commands/config.js.map +1 -1
- package/lib/commands/resume.js +6 -16
- package/lib/commands/resume.js.map +1 -1
- package/lib/commands/start.d.ts +0 -11
- package/lib/commands/start.js +38 -550
- package/lib/commands/start.js.map +1 -1
- package/lib/commands/status.js +36 -12
- package/lib/commands/status.js.map +1 -1
- package/lib/commands/validate.d.ts +3 -0
- package/lib/commands/validate.js +5 -7
- package/lib/commands/validate.js.map +1 -1
- package/lib/config/config-mutation-service.d.ts +21 -0
- package/lib/config/config-mutation-service.js +61 -0
- package/lib/config/config-mutation-service.js.map +1 -0
- package/lib/dependencies/circular-dependency-detector.d.ts +5 -0
- package/lib/dependencies/circular-dependency-detector.js +67 -72
- package/lib/dependencies/circular-dependency-detector.js.map +1 -1
- package/lib/dependencies/dependency-depth-calculator.d.ts +28 -0
- package/lib/dependencies/dependency-depth-calculator.js +86 -39
- package/lib/dependencies/dependency-depth-calculator.js.map +1 -1
- package/lib/dependencies/dependency-graph-builder.d.ts +45 -13
- package/lib/dependencies/dependency-graph-builder.js +228 -123
- package/lib/dependencies/dependency-graph-builder.js.map +1 -1
- package/lib/dependencies/dependency-impact-analyzer.d.ts +13 -0
- package/lib/dependencies/dependency-impact-analyzer.js +146 -102
- package/lib/dependencies/dependency-impact-analyzer.js.map +1 -1
- package/lib/dependencies/dependency-merger.d.ts +10 -0
- package/lib/dependencies/dependency-merger.js +123 -61
- package/lib/dependencies/dependency-merger.js.map +1 -1
- package/lib/dependencies/dependency-resolver.d.ts +34 -9
- package/lib/dependencies/dependency-resolver.js +181 -112
- package/lib/dependencies/dependency-resolver.js.map +1 -1
- package/lib/dependencies/dependency-semantics.d.ts +20 -0
- package/lib/dependencies/dependency-semantics.js +55 -0
- package/lib/dependencies/dependency-semantics.js.map +1 -0
- package/lib/dependencies/graph-visualizer.d.ts +6 -1
- package/lib/dependencies/graph-visualizer.js +38 -4
- package/lib/dependencies/graph-visualizer.js.map +1 -1
- package/lib/dependencies/heuristic-inference.d.ts +2 -53
- package/lib/dependencies/heuristic-inference.js +8 -317
- package/lib/dependencies/heuristic-inference.js.map +1 -1
- package/lib/dependencies/heuristic-patterns.d.ts +14 -0
- package/lib/dependencies/heuristic-patterns.js +247 -0
- package/lib/dependencies/heuristic-patterns.js.map +1 -0
- package/lib/deployment/cycle-remediation-runner.d.ts +36 -0
- package/lib/deployment/cycle-remediation-runner.js +262 -0
- package/lib/deployment/cycle-remediation-runner.js.map +1 -0
- package/lib/deployment/deployment-context-service.d.ts +24 -0
- package/lib/deployment/deployment-context-service.js +17 -0
- package/lib/deployment/deployment-context-service.js.map +1 -0
- package/lib/deployment/deployment-runner.d.ts +37 -0
- package/lib/deployment/deployment-runner.js +94 -0
- package/lib/deployment/deployment-runner.js.map +1 -0
- package/lib/deployment/deployment-status-service.d.ts +5 -0
- package/lib/deployment/deployment-status-service.js +39 -18
- package/lib/deployment/deployment-status-service.js.map +1 -1
- package/lib/deployment/deployment-validation-service.d.ts +5 -2
- package/lib/deployment/deployment-validation-service.js +48 -45
- package/lib/deployment/deployment-validation-service.js.map +1 -1
- package/lib/deployment/resume-deployment-service.d.ts +14 -0
- package/lib/deployment/resume-deployment-service.js +25 -0
- package/lib/deployment/resume-deployment-service.js.map +1 -0
- package/lib/deployment/start-execution-service.d.ts +44 -0
- package/lib/deployment/start-execution-service.js +94 -0
- package/lib/deployment/start-execution-service.js.map +1 -0
- package/lib/deployment/test-executor.d.ts +60 -1
- package/lib/deployment/test-executor.js +180 -12
- package/lib/deployment/test-executor.js.map +1 -1
- package/lib/deployment/test-plan-service.d.ts +8 -0
- package/lib/deployment/test-plan-service.js +26 -0
- package/lib/deployment/test-plan-service.js.map +1 -0
- package/lib/deployment/wave-manifest-service.d.ts +11 -0
- package/lib/deployment/wave-manifest-service.js +41 -0
- package/lib/deployment/wave-manifest-service.js.map +1 -0
- package/lib/parsers/apex-class-parser.js +180 -98
- package/lib/parsers/apex-class-parser.js.map +1 -1
- package/lib/parsers/apex-trigger-parser.js +56 -7
- package/lib/parsers/apex-trigger-parser.js.map +1 -1
- package/lib/parsers/aura-parser.js +2 -2
- package/lib/parsers/aura-parser.js.map +1 -1
- package/lib/parsers/bot-parser.js +31 -4
- package/lib/parsers/bot-parser.js.map +1 -1
- package/lib/parsers/custom-metadata-parser.js +37 -3
- package/lib/parsers/custom-metadata-parser.js.map +1 -1
- package/lib/parsers/custom-object-parser.js +284 -150
- package/lib/parsers/custom-object-parser.js.map +1 -1
- package/lib/parsers/email-template-parser.js +115 -58
- package/lib/parsers/email-template-parser.js.map +1 -1
- package/lib/parsers/flexipage-parser.js +41 -16
- package/lib/parsers/flexipage-parser.js.map +1 -1
- package/lib/parsers/flow-parser.js +73 -63
- package/lib/parsers/flow-parser.js.map +1 -1
- package/lib/parsers/genai-prompt-parser.js +16 -4
- package/lib/parsers/genai-prompt-parser.js.map +1 -1
- package/lib/parsers/layout-parser.d.ts +11 -0
- package/lib/parsers/layout-parser.js +143 -68
- package/lib/parsers/layout-parser.js.map +1 -1
- package/lib/parsers/lwc-parser.d.ts +0 -9
- package/lib/parsers/lwc-parser.js +245 -100
- package/lib/parsers/lwc-parser.js.map +1 -1
- package/lib/parsers/parser-utils.d.ts +3 -0
- package/lib/parsers/parser-utils.js +16 -0
- package/lib/parsers/parser-utils.js.map +1 -0
- package/lib/parsers/permission-set-parser.d.ts +6 -0
- package/lib/parsers/permission-set-parser.js +31 -40
- package/lib/parsers/permission-set-parser.js.map +1 -1
- package/lib/parsers/profile-parser.d.ts +13 -0
- package/lib/parsers/profile-parser.js +39 -34
- package/lib/parsers/profile-parser.js.map +1 -1
- package/lib/parsers/visualforce-parser.js +2 -1
- package/lib/parsers/visualforce-parser.js.map +1 -1
- package/lib/presentation/analyze-command-presenter.d.ts +10 -0
- package/lib/presentation/analyze-command-presenter.js +30 -0
- package/lib/presentation/analyze-command-presenter.js.map +1 -0
- package/lib/presentation/config-command-presenter.d.ts +15 -0
- package/lib/presentation/config-command-presenter.js +50 -0
- package/lib/presentation/config-command-presenter.js.map +1 -0
- package/lib/presentation/project-analysis-presenter.d.ts +9 -0
- package/lib/presentation/project-analysis-presenter.js +9 -0
- package/lib/presentation/project-analysis-presenter.js.map +1 -0
- package/lib/presentation/resume-command-presenter.d.ts +7 -0
- package/lib/presentation/resume-command-presenter.js +12 -0
- package/lib/presentation/resume-command-presenter.js.map +1 -0
- package/lib/presentation/start-command-presenter.d.ts +15 -0
- package/lib/presentation/start-command-presenter.js +29 -0
- package/lib/presentation/start-command-presenter.js.map +1 -0
- package/lib/presentation/status-command-presenter.d.ts +7 -0
- package/lib/presentation/status-command-presenter.js +16 -0
- package/lib/presentation/status-command-presenter.js.map +1 -0
- package/lib/presentation/validate-command-presenter.d.ts +9 -0
- package/lib/presentation/validate-command-presenter.js +50 -0
- package/lib/presentation/validate-command-presenter.js.map +1 -0
- package/lib/services/metadata-scanner-service.d.ts +8 -12
- package/lib/services/metadata-scanner-service.js +55 -533
- package/lib/services/metadata-scanner-service.js.map +1 -1
- package/lib/services/scanners/automation-ai-metadata-scanner.d.ts +4 -0
- package/lib/services/scanners/automation-ai-metadata-scanner.js +61 -0
- package/lib/services/scanners/automation-ai-metadata-scanner.js.map +1 -0
- package/lib/services/scanners/code-metadata-scanner.d.ts +23 -0
- package/lib/services/scanners/code-metadata-scanner.js +149 -0
- package/lib/services/scanners/code-metadata-scanner.js.map +1 -0
- package/lib/services/scanners/data-metadata-scanner.d.ts +3 -0
- package/lib/services/scanners/data-metadata-scanner.js +82 -0
- package/lib/services/scanners/data-metadata-scanner.js.map +1 -0
- package/lib/services/scanners/experience-metadata-scanner.d.ts +5 -0
- package/lib/services/scanners/experience-metadata-scanner.js +123 -0
- package/lib/services/scanners/experience-metadata-scanner.js.map +1 -0
- package/lib/services/scanners/scanner-runtime.d.ts +11 -0
- package/lib/services/scanners/scanner-runtime.js +115 -0
- package/lib/services/scanners/scanner-runtime.js.map +1 -0
- package/lib/services/scanners/security-metadata-scanner.d.ts +3 -0
- package/lib/services/scanners/security-metadata-scanner.js +71 -0
- package/lib/services/scanners/security-metadata-scanner.js.map +1 -0
- package/lib/types/dependency.d.ts +11 -1
- package/lib/types/metadata.d.ts +17 -0
- package/lib/types/salesforce/flow/actions.d.ts +108 -0
- package/lib/types/salesforce/flow/actions.js +2 -0
- package/lib/types/salesforce/flow/actions.js.map +1 -0
- package/lib/types/salesforce/flow/common.d.ts +36 -0
- package/lib/types/salesforce/flow/common.js +5 -0
- package/lib/types/salesforce/flow/common.js.map +1 -0
- package/lib/types/salesforce/flow/metadata.d.ts +37 -0
- package/lib/types/salesforce/flow/metadata.js +2 -0
- package/lib/types/salesforce/flow/metadata.js.map +1 -0
- package/lib/types/salesforce/flow/records.d.ts +38 -0
- package/lib/types/salesforce/flow/records.js +2 -0
- package/lib/types/salesforce/flow/records.js.map +1 -0
- package/lib/types/salesforce/flow/resources.d.ts +44 -0
- package/lib/types/salesforce/flow/resources.js +2 -0
- package/lib/types/salesforce/flow/resources.js.map +1 -0
- package/lib/types/salesforce/flow/screens.d.ts +56 -0
- package/lib/types/salesforce/flow/screens.js +2 -0
- package/lib/types/salesforce/flow/screens.js.map +1 -0
- package/lib/types/salesforce/flow/start.d.ts +24 -0
- package/lib/types/salesforce/flow/start.js +2 -0
- package/lib/types/salesforce/flow/start.js.map +1 -0
- package/lib/types/salesforce/flow.d.ts +9 -514
- package/lib/types/salesforce/flow.js +1 -1
- package/lib/types/salesforce/object/core.d.ts +68 -0
- package/lib/types/salesforce/object/core.js +5 -0
- package/lib/types/salesforce/object/core.js.map +1 -0
- package/lib/types/salesforce/object/field.d.ts +155 -0
- package/lib/types/salesforce/object/field.js +5 -0
- package/lib/types/salesforce/object/field.js.map +1 -0
- package/lib/types/salesforce/object/filter.d.ts +16 -0
- package/lib/types/salesforce/object/filter.js +5 -0
- package/lib/types/salesforce/object/filter.js.map +1 -0
- package/lib/types/salesforce/object/policy.d.ts +27 -0
- package/lib/types/salesforce/object/policy.js +5 -0
- package/lib/types/salesforce/object/policy.js.map +1 -0
- package/lib/types/salesforce/object/record.d.ts +44 -0
- package/lib/types/salesforce/object/record.js +5 -0
- package/lib/types/salesforce/object/record.js.map +1 -0
- package/lib/types/salesforce/object/view.d.ts +71 -0
- package/lib/types/salesforce/object/view.js +5 -0
- package/lib/types/salesforce/object/view.js.map +1 -0
- package/lib/types/salesforce/object/weblink.d.ts +70 -0
- package/lib/types/salesforce/object/weblink.js +5 -0
- package/lib/types/salesforce/object/weblink.js.map +1 -0
- package/lib/types/salesforce/object.d.ts +7 -423
- package/lib/types/salesforce/object.js +7 -1
- package/lib/types/salesforce/object.js.map +1 -1
- package/lib/utils/cache-manager.d.ts +16 -15
- package/lib/utils/cache-manager.js +290 -188
- package/lib/utils/cache-manager.js.map +1 -1
- package/lib/utils/logger.d.ts +8 -0
- package/lib/utils/logger.js +82 -69
- package/lib/utils/logger.js.map +1 -1
- package/lib/validators/xml/xml-reference-rules.d.ts +3 -0
- package/lib/validators/xml/xml-reference-rules.js +173 -0
- package/lib/validators/xml/xml-reference-rules.js.map +1 -0
- package/lib/validators/xml/xml-report-formatter.d.ts +2 -0
- package/lib/validators/xml/xml-report-formatter.js +47 -0
- package/lib/validators/xml/xml-report-formatter.js.map +1 -0
- package/lib/validators/xml/xml-schema-rules.d.ts +3 -0
- package/lib/validators/xml/xml-schema-rules.js +75 -0
- package/lib/validators/xml/xml-schema-rules.js.map +1 -0
- package/lib/validators/xml/xml-validation-types.d.ts +25 -0
- package/lib/validators/xml/xml-validation-types.js +2 -0
- package/lib/validators/xml/xml-validation-types.js.map +1 -0
- package/lib/validators/xml-metadata-validator.d.ts +2 -63
- package/lib/validators/xml-metadata-validator.js +7 -338
- package/lib/validators/xml-metadata-validator.js.map +1 -1
- package/lib/waves/test-optimizer.d.ts +13 -0
- package/lib/waves/test-optimizer.js +124 -63
- package/lib/waves/test-optimizer.js.map +1 -1
- package/lib/waves/wave-builder.d.ts +17 -21
- package/lib/waves/wave-builder.js +199 -135
- package/lib/waves/wave-builder.js.map +1 -1
- package/lib/waves/wave-splitter.d.ts +12 -8
- package/lib/waves/wave-splitter.js +156 -115
- package/lib/waves/wave-splitter.js.map +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/oclif.manifest.json +1 -1
- 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 {};
|