@jterrats/smart-deployment 1.2.6 → 1.4.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 (171) hide show
  1. package/README.md +69 -1
  2. package/lib/analysis/metadata-capability-definitions.d.ts +2 -0
  3. package/lib/analysis/metadata-capability-definitions.js +260 -0
  4. package/lib/analysis/metadata-capability-definitions.js.map +1 -0
  5. package/lib/analysis/metadata-capability-registry.d.ts +11 -0
  6. package/lib/analysis/metadata-capability-registry.js +142 -0
  7. package/lib/analysis/metadata-capability-registry.js.map +1 -0
  8. package/lib/analysis/metadata-gap-analysis-service.d.ts +51 -0
  9. package/lib/analysis/metadata-gap-analysis-service.js +277 -0
  10. package/lib/analysis/metadata-gap-analysis-service.js.map +1 -0
  11. package/lib/analysis/project-analysis-service.d.ts +5 -0
  12. package/lib/analysis/project-analysis-service.js +18 -0
  13. package/lib/analysis/project-analysis-service.js.map +1 -1
  14. package/lib/commands/ci/preset.d.ts +25 -0
  15. package/lib/commands/ci/preset.js +125 -0
  16. package/lib/commands/ci/preset.js.map +1 -0
  17. package/lib/commands/ci-publish.d.ts +6 -2
  18. package/lib/commands/ci-publish.js +23 -8
  19. package/lib/commands/ci-publish.js.map +1 -1
  20. package/lib/commands/graph/export.d.ts +20 -0
  21. package/lib/commands/graph/export.js +107 -0
  22. package/lib/commands/graph/export.js.map +1 -0
  23. package/lib/commands/impact.d.ts +18 -0
  24. package/lib/commands/impact.js +105 -0
  25. package/lib/commands/impact.js.map +1 -0
  26. package/lib/commands/init.d.ts +19 -0
  27. package/lib/commands/init.js +83 -0
  28. package/lib/commands/init.js.map +1 -0
  29. package/lib/commands/metadata/gaps.d.ts +15 -0
  30. package/lib/commands/metadata/gaps.js +84 -0
  31. package/lib/commands/metadata/gaps.js.map +1 -0
  32. package/lib/commands/plan/explain.d.ts +14 -0
  33. package/lib/commands/plan/explain.js +134 -0
  34. package/lib/commands/plan/explain.js.map +1 -0
  35. package/lib/commands/resume.d.ts +1 -0
  36. package/lib/commands/resume.js +19 -4
  37. package/lib/commands/resume.js.map +1 -1
  38. package/lib/commands/retrieve.d.ts +20 -0
  39. package/lib/commands/retrieve.js +111 -0
  40. package/lib/commands/retrieve.js.map +1 -0
  41. package/lib/commands/start.d.ts +27 -0
  42. package/lib/commands/start.js +159 -20
  43. package/lib/commands/start.js.map +1 -1
  44. package/lib/commands/status.d.ts +1 -0
  45. package/lib/commands/status.js +19 -4
  46. package/lib/commands/status.js.map +1 -1
  47. package/lib/commands/validate.d.ts +15 -0
  48. package/lib/commands/validate.js +37 -1
  49. package/lib/commands/validate.js.map +1 -1
  50. package/lib/config/init-config-generation-service.d.ts +27 -0
  51. package/lib/config/init-config-generation-service.js +88 -0
  52. package/lib/config/init-config-generation-service.js.map +1 -0
  53. package/lib/config/repo-config.d.ts +25 -0
  54. package/lib/config/repo-config.js.map +1 -1
  55. package/lib/constants/deployment-order.js +1 -0
  56. package/lib/constants/deployment-order.js.map +1 -1
  57. package/lib/dependencies/impact-analysis-service.d.ts +77 -0
  58. package/lib/dependencies/impact-analysis-service.js +234 -0
  59. package/lib/dependencies/impact-analysis-service.js.map +1 -0
  60. package/lib/deployment/ci-preset-service.d.ts +44 -0
  61. package/lib/deployment/ci-preset-service.js +65 -0
  62. package/lib/deployment/ci-preset-service.js.map +1 -0
  63. package/lib/deployment/commit-scope-service.d.ts +50 -0
  64. package/lib/deployment/commit-scope-service.js +292 -0
  65. package/lib/deployment/commit-scope-service.js.map +1 -0
  66. package/lib/deployment/deployment-context-service.d.ts +3 -0
  67. package/lib/deployment/deployment-context-service.js +1 -0
  68. package/lib/deployment/deployment-context-service.js.map +1 -1
  69. package/lib/deployment/deployment-error-diagnostics.d.ts +11 -0
  70. package/lib/deployment/deployment-error-diagnostics.js +187 -0
  71. package/lib/deployment/deployment-error-diagnostics.js.map +1 -0
  72. package/lib/deployment/deployment-runner.d.ts +1 -0
  73. package/lib/deployment/deployment-runner.js +37 -16
  74. package/lib/deployment/deployment-runner.js.map +1 -1
  75. package/lib/deployment/deployment-status-service.d.ts +10 -2
  76. package/lib/deployment/deployment-status-service.js +74 -3
  77. package/lib/deployment/deployment-status-service.js.map +1 -1
  78. package/lib/deployment/deployment-validation-service.d.ts +5 -0
  79. package/lib/deployment/deployment-validation-service.js +34 -4
  80. package/lib/deployment/deployment-validation-service.js.map +1 -1
  81. package/lib/deployment/plan-explain-service.d.ts +88 -0
  82. package/lib/deployment/plan-explain-service.js +171 -0
  83. package/lib/deployment/plan-explain-service.js.map +1 -0
  84. package/lib/deployment/resume-deployment-service.d.ts +7 -2
  85. package/lib/deployment/resume-deployment-service.js +24 -3
  86. package/lib/deployment/resume-deployment-service.js.map +1 -1
  87. package/lib/deployment/retrieve-forceignore-service.d.ts +51 -0
  88. package/lib/deployment/retrieve-forceignore-service.js +139 -0
  89. package/lib/deployment/retrieve-forceignore-service.js.map +1 -0
  90. package/lib/deployment/rollback-planning-service.d.ts +49 -0
  91. package/lib/deployment/rollback-planning-service.js +178 -0
  92. package/lib/deployment/rollback-planning-service.js.map +1 -0
  93. package/lib/deployment/sf-cli-integration.d.ts +7 -0
  94. package/lib/deployment/sf-cli-integration.js +35 -3
  95. package/lib/deployment/sf-cli-integration.js.map +1 -1
  96. package/lib/deployment/special-deployment-plan.js +36 -49
  97. package/lib/deployment/special-deployment-plan.js.map +1 -1
  98. package/lib/deployment/start-execution-service.d.ts +1 -0
  99. package/lib/deployment/start-execution-service.js +14 -8
  100. package/lib/deployment/start-execution-service.js.map +1 -1
  101. package/lib/deployment/wave-manifest-service.d.ts +8 -0
  102. package/lib/deployment/wave-manifest-service.js +39 -20
  103. package/lib/deployment/wave-manifest-service.js.map +1 -1
  104. package/lib/presentation/plan-explain-presenter.d.ts +9 -0
  105. package/lib/presentation/plan-explain-presenter.js +40 -0
  106. package/lib/presentation/plan-explain-presenter.js.map +1 -0
  107. package/lib/presentation/release-report-presenter.d.ts +10 -0
  108. package/lib/presentation/release-report-presenter.js +35 -0
  109. package/lib/presentation/release-report-presenter.js.map +1 -0
  110. package/lib/presentation/start-command-presenter.d.ts +4 -0
  111. package/lib/presentation/start-command-presenter.js +4 -0
  112. package/lib/presentation/start-command-presenter.js.map +1 -1
  113. package/lib/presentation/validate-command-presenter.js +13 -0
  114. package/lib/presentation/validate-command-presenter.js.map +1 -1
  115. package/lib/reports/deployment-plan-report-service.d.ts +76 -0
  116. package/lib/reports/deployment-plan-report-service.js +234 -0
  117. package/lib/reports/deployment-plan-report-service.js.map +1 -0
  118. package/lib/reports/graph-export-service.d.ts +85 -0
  119. package/lib/reports/graph-export-service.js +296 -0
  120. package/lib/reports/graph-export-service.js.map +1 -0
  121. package/lib/reports/release-report-builder.d.ts +6 -0
  122. package/lib/reports/release-report-builder.js +115 -0
  123. package/lib/reports/release-report-builder.js.map +1 -0
  124. package/lib/reports/release-report-command-adapter.d.ts +14 -0
  125. package/lib/reports/release-report-command-adapter.js +28 -0
  126. package/lib/reports/release-report-command-adapter.js.map +1 -0
  127. package/lib/reports/release-report-facts-factory.d.ts +14 -0
  128. package/lib/reports/release-report-facts-factory.js +140 -0
  129. package/lib/reports/release-report-facts-factory.js.map +1 -0
  130. package/lib/reports/release-report-sanitizer.d.ts +5 -0
  131. package/lib/reports/release-report-sanitizer.js +120 -0
  132. package/lib/reports/release-report-sanitizer.js.map +1 -0
  133. package/lib/reports/release-report-service.d.ts +43 -0
  134. package/lib/reports/release-report-service.js +80 -0
  135. package/lib/reports/release-report-service.js.map +1 -0
  136. package/lib/reports/release-report-store.d.ts +30 -0
  137. package/lib/reports/release-report-store.js +57 -0
  138. package/lib/reports/release-report-store.js.map +1 -0
  139. package/lib/reports/start-release-report-coordinator.d.ts +15 -0
  140. package/lib/reports/start-release-report-coordinator.js +23 -0
  141. package/lib/reports/start-release-report-coordinator.js.map +1 -0
  142. package/lib/services/metadata-scanner-service.js +14 -2
  143. package/lib/services/metadata-scanner-service.js.map +1 -1
  144. package/lib/services/scanners/automation-ai-metadata-scanner.d.ts +3 -1
  145. package/lib/services/scanners/automation-ai-metadata-scanner.js +87 -0
  146. package/lib/services/scanners/automation-ai-metadata-scanner.js.map +1 -1
  147. package/lib/types/index.d.ts +2 -0
  148. package/lib/types/index.js +2 -0
  149. package/lib/types/index.js.map +1 -1
  150. package/lib/types/metadata-capability.d.ts +39 -0
  151. package/lib/types/metadata-capability.js +2 -0
  152. package/lib/types/metadata-capability.js.map +1 -0
  153. package/lib/types/metadata.d.ts +7 -1
  154. package/lib/types/release-report.d.ts +89 -0
  155. package/lib/types/release-report.js +42 -0
  156. package/lib/types/release-report.js.map +1 -0
  157. package/messages/ci.preset.json +22 -0
  158. package/messages/graph.export.json +20 -0
  159. package/messages/impact.json +18 -0
  160. package/messages/init.json +16 -0
  161. package/messages/metadata.gaps.json +12 -0
  162. package/messages/plan.explain.json +20 -0
  163. package/messages/resume.json +1 -0
  164. package/messages/retrieve.json +26 -0
  165. package/messages/start.json +18 -2
  166. package/messages/status.json +1 -0
  167. package/messages/validate.json +5 -1
  168. package/npm-shrinkwrap.json +436 -945
  169. package/oclif.lock +446 -746
  170. package/oclif.manifest.json +975 -116
  171. package/package.json +26 -21
@@ -0,0 +1,85 @@
1
+ import type { DeploymentContext } from '../deployment/deployment-context-service.js';
2
+ import type { CircularDependency, DependencyEdge, NodeId } from '../types/dependency.js';
3
+ export type GraphExportFormat = 'mermaid' | 'dot' | 'json' | 'html';
4
+ export type GraphExportOptions = {
5
+ format: GraphExportFormat;
6
+ outputPath?: string;
7
+ reportDir?: string;
8
+ };
9
+ export type GraphExportResult = {
10
+ success: boolean;
11
+ format: GraphExportFormat;
12
+ path: string;
13
+ report: GraphExportReport;
14
+ };
15
+ export type GraphExportReport = {
16
+ generatedAt: string;
17
+ projectRoot: string;
18
+ summary: {
19
+ components: number;
20
+ dependencyEdges: number;
21
+ waves: number;
22
+ cycles: number;
23
+ isolatedComponents: number;
24
+ };
25
+ components: GraphExportComponent[];
26
+ edges: GraphExportEdge[];
27
+ waves: GraphExportWave[];
28
+ cycles: GraphExportCycle[];
29
+ };
30
+ export type GraphExportComponent = {
31
+ id: NodeId;
32
+ type: string;
33
+ name: string;
34
+ filePath?: string;
35
+ dependencies: NodeId[];
36
+ dependents: NodeId[];
37
+ wave?: number;
38
+ inCycle: boolean;
39
+ isolated: boolean;
40
+ };
41
+ export type GraphExportEdge = {
42
+ from: NodeId;
43
+ to: NodeId;
44
+ type: DependencyEdge['type'];
45
+ source?: DependencyEdge['source'];
46
+ reason?: string;
47
+ confidence?: number;
48
+ fromWave?: number;
49
+ toWave?: number;
50
+ crossesWave: boolean;
51
+ inCycle: boolean;
52
+ };
53
+ export type GraphExportWave = {
54
+ number: number;
55
+ componentCount: number;
56
+ types: string[];
57
+ maxDepth: number;
58
+ estimatedTimeSeconds: number;
59
+ hasCircularDependencies: boolean;
60
+ components: NodeId[];
61
+ };
62
+ export type GraphExportCycle = {
63
+ cycle: NodeId[];
64
+ severity: CircularDependency['severity'];
65
+ message: string;
66
+ };
67
+ export declare class GraphExportService {
68
+ generate(context: DeploymentContext, options: GraphExportOptions): Promise<GraphExportResult>;
69
+ createReport(context: DeploymentContext): GraphExportReport;
70
+ render(report: GraphExportReport, format: GraphExportFormat): string;
71
+ toMermaid(report: GraphExportReport): string;
72
+ toDot(report: GraphExportReport): string;
73
+ toHtml(report: GraphExportReport): string;
74
+ private resolveOutputPath;
75
+ private createComponents;
76
+ private createEdges;
77
+ private createWave;
78
+ private createWaveIndex;
79
+ private createCycleEdgeSet;
80
+ private toMermaidNode;
81
+ private toMermaidId;
82
+ private componentLabel;
83
+ private toComponentRow;
84
+ private toEdgeRow;
85
+ }
@@ -0,0 +1,296 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ const DEFAULT_REPORT_DIR = '.smart-deployment/reports/graph-export';
4
+ const FILE_NAMES = {
5
+ mermaid: 'dependency-graph.mmd',
6
+ dot: 'dependency-graph.dot',
7
+ json: 'dependency-graph.json',
8
+ html: 'dependency-graph.html',
9
+ };
10
+ export class GraphExportService {
11
+ async generate(context, options) {
12
+ const report = this.createReport(context);
13
+ const outputPath = this.resolveOutputPath(context, options);
14
+ const content = this.render(report, options.format);
15
+ await mkdir(path.dirname(outputPath), { recursive: true });
16
+ await writeFile(outputPath, content, 'utf8');
17
+ return { success: true, format: options.format, path: outputPath, report };
18
+ }
19
+ createReport(context) {
20
+ const waveByComponent = this.createWaveIndex(context.orderedWaves);
21
+ const cycles = context.scanResult.dependencyResult.circularDependencies.map((cycle) => ({
22
+ cycle: [...cycle.cycle],
23
+ severity: cycle.severity,
24
+ message: cycle.message,
25
+ }));
26
+ const cycleEdges = this.createCycleEdgeSet(cycles);
27
+ const cycleNodes = new Set(cycles.flatMap((cycle) => cycle.cycle));
28
+ const components = this.createComponents(context, waveByComponent, cycleNodes);
29
+ const edges = this.createEdges(context.scanResult.dependencyResult.edges, waveByComponent, cycleEdges);
30
+ return {
31
+ generatedAt: new Date().toISOString(),
32
+ projectRoot: context.scanResult.projectRoot,
33
+ summary: {
34
+ components: components.length,
35
+ dependencyEdges: edges.length,
36
+ waves: context.orderedWaves.length,
37
+ cycles: cycles.length,
38
+ isolatedComponents: components.filter((component) => component.isolated).length,
39
+ },
40
+ components,
41
+ edges,
42
+ waves: context.orderedWaves.map((wave) => this.createWave(wave)),
43
+ cycles,
44
+ };
45
+ }
46
+ render(report, format) {
47
+ if (format === 'mermaid')
48
+ return `${this.toMermaid(report)}\n`;
49
+ if (format === 'dot')
50
+ return `${this.toDot(report)}\n`;
51
+ if (format === 'html')
52
+ return this.toHtml(report);
53
+ return `${JSON.stringify(report, null, 2)}\n`;
54
+ }
55
+ toMermaid(report) {
56
+ const lines = ['graph TD'];
57
+ const nodesByWave = new Map();
58
+ for (const component of report.components) {
59
+ const key = component.wave ?? 'unplaced';
60
+ const group = nodesByWave.get(key) ?? [];
61
+ group.push(component);
62
+ nodesByWave.set(key, group);
63
+ }
64
+ for (const [waveNumber, components] of nodesByWave.entries()) {
65
+ const label = waveNumber === 'unplaced' ? 'Unplaced components' : `Wave ${waveNumber}`;
66
+ lines.push(` subgraph ${this.toMermaidId(`wave:${waveNumber}`)}["${escapeMermaidText(label)}"]`);
67
+ for (const component of components) {
68
+ lines.push(` ${this.toMermaidNode(component)}`);
69
+ }
70
+ lines.push(' end');
71
+ }
72
+ for (const edge of report.edges) {
73
+ const label = edge.inCycle ? 'cycle' : edge.type;
74
+ lines.push(` ${this.toMermaidId(edge.from)} -->|"${escapeMermaidText(label)}"| ${this.toMermaidId(edge.to)}`);
75
+ }
76
+ if (report.components.length === 0) {
77
+ lines.push(' empty["No components found"]');
78
+ }
79
+ lines.push(' classDef cycle fill:#fee2e2,stroke:#dc2626,stroke-width:2px');
80
+ lines.push(' classDef normal fill:#eff6ff,stroke:#2563eb,stroke-width:1px');
81
+ for (const component of report.components) {
82
+ lines.push(` class ${this.toMermaidId(component.id)} ${component.inCycle ? 'cycle' : 'normal'}`);
83
+ }
84
+ return lines.join('\n');
85
+ }
86
+ toDot(report) {
87
+ const lines = ['digraph Dependencies {', ' rankdir=LR;', ' node [shape=box, style="rounded,filled"];'];
88
+ const clustered = new Set();
89
+ for (const wave of report.waves) {
90
+ lines.push(` subgraph cluster_wave_${wave.number} {`);
91
+ lines.push(` label="${escapeDot(`Wave ${wave.number}`)}";`);
92
+ for (const componentId of wave.components) {
93
+ const component = report.components.find((candidate) => candidate.id === componentId);
94
+ if (component) {
95
+ clustered.add(component.id);
96
+ lines.push(` "${escapeDot(component.id)}" [label="${escapeDot(this.componentLabel(component))}"];`);
97
+ }
98
+ }
99
+ lines.push(' }');
100
+ }
101
+ for (const component of report.components.filter((candidate) => !clustered.has(candidate.id))) {
102
+ lines.push(` "${escapeDot(component.id)}" [label="${escapeDot(this.componentLabel(component))}", fillcolor="${component.inCycle ? '#fee2e2' : '#eff6ff'}"];`);
103
+ }
104
+ for (const edge of report.edges) {
105
+ const attributes = [
106
+ `label="${escapeDot(edge.inCycle ? 'cycle' : edge.type)}"`,
107
+ edge.inCycle ? 'color="#dc2626"' : undefined,
108
+ edge.type === 'soft' ? 'style=dashed' : undefined,
109
+ ].filter((attribute) => attribute !== undefined);
110
+ lines.push(` "${escapeDot(edge.from)}" -> "${escapeDot(edge.to)}" [${attributes.join(', ')}];`);
111
+ }
112
+ lines.push('}');
113
+ return lines.join('\n');
114
+ }
115
+ toHtml(report) {
116
+ const componentRows = report.components.length > 0
117
+ ? report.components.map((component) => this.toComponentRow(component)).join('')
118
+ : '<tr><td colspan="6">No components found.</td></tr>';
119
+ const edgeRows = report.edges.length > 0
120
+ ? report.edges.map((edge) => this.toEdgeRow(edge)).join('')
121
+ : '<tr><td colspan="6">No dependency edges found.</td></tr>';
122
+ const mermaid = this.toMermaid(report);
123
+ const dot = this.toDot(report);
124
+ return `
125
+ <!DOCTYPE html>
126
+ <html lang="en">
127
+ <head>
128
+ <meta charset="utf-8">
129
+ <title>Dependency Graph Export</title>
130
+ <style>
131
+ body { font-family: Arial, sans-serif; margin: 24px; color: #1f2937; }
132
+ table { border-collapse: collapse; width: 100%; margin-top: 1rem; }
133
+ th, td { border: 1px solid #d1d5db; padding: 8px; text-align: left; vertical-align: top; }
134
+ th { background: #f3f4f6; }
135
+ pre { background: #f9fafb; border: 1px solid #d1d5db; padding: 12px; overflow: auto; }
136
+ code { white-space: nowrap; }
137
+ .summary { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 12px; }
138
+ .card { border: 1px solid #d1d5db; border-radius: 8px; padding: 12px; background: #fff; }
139
+ </style>
140
+ </head>
141
+ <body>
142
+ <h1>Dependency Graph Export</h1>
143
+ <p>Generated at ${escapeHtml(report.generatedAt)}</p>
144
+ <p>Project root: <code>${escapeHtml(report.projectRoot)}</code></p>
145
+ <div class="summary">
146
+ <div class="card"><strong>Components</strong><br>${report.summary.components}</div>
147
+ <div class="card"><strong>Edges</strong><br>${report.summary.dependencyEdges}</div>
148
+ <div class="card"><strong>Waves</strong><br>${report.summary.waves}</div>
149
+ <div class="card"><strong>Cycles</strong><br>${report.summary.cycles}</div>
150
+ <div class="card"><strong>Isolated</strong><br>${report.summary.isolatedComponents}</div>
151
+ </div>
152
+ <h2>Components</h2>
153
+ <table><thead><tr><th>ID</th><th>Type</th><th>Name</th><th>Wave</th><th>Cycle</th><th>File</th></tr></thead><tbody>${componentRows}</tbody></table>
154
+ <h2>Dependency Edges</h2>
155
+ <table><thead><tr><th>From</th><th>To</th><th>Type</th><th>Source</th><th>Waves</th><th>Cycle</th></tr></thead><tbody>${edgeRows}</tbody></table>
156
+ <h2>Mermaid</h2><pre>${escapeHtml(mermaid)}</pre>
157
+ <h2>DOT</h2><pre>${escapeHtml(dot)}</pre>
158
+ <h2>JSON</h2><pre>${escapeHtml(JSON.stringify(report, null, 2))}</pre>
159
+ </body>
160
+ </html>
161
+ `.trim();
162
+ }
163
+ resolveOutputPath(context, options) {
164
+ if (options.outputPath)
165
+ return path.resolve(options.outputPath);
166
+ const reportDir = options.reportDir ?? path.join(context.scanResult.projectRoot, DEFAULT_REPORT_DIR);
167
+ return path.join(reportDir, FILE_NAMES[options.format]);
168
+ }
169
+ createComponents(context, waveByComponent, cycleNodes) {
170
+ const graphNodes = new Set(context.scanResult.dependencyResult.graph.keys());
171
+ for (const dependencies of context.scanResult.dependencyResult.graph.values()) {
172
+ for (const dependency of dependencies)
173
+ graphNodes.add(dependency);
174
+ }
175
+ for (const nodeId of context.scanResult.dependencyResult.components.keys())
176
+ graphNodes.add(nodeId);
177
+ return [...graphNodes]
178
+ .sort((left, right) => left.localeCompare(right))
179
+ .map((nodeId) => {
180
+ const component = context.scanResult.dependencyResult.components.get(nodeId);
181
+ const dependencies = [...(context.scanResult.dependencyResult.graph.get(nodeId) ?? [])].sort((left, right) => left.localeCompare(right));
182
+ const dependents = [...(context.scanResult.dependencyResult.reverseGraph.get(nodeId) ?? [])].sort((left, right) => left.localeCompare(right));
183
+ const parsed = parseNodeId(nodeId, component);
184
+ return {
185
+ id: nodeId,
186
+ type: parsed.type,
187
+ name: parsed.name,
188
+ filePath: component?.filePath,
189
+ dependencies,
190
+ dependents,
191
+ wave: waveByComponent.get(nodeId),
192
+ inCycle: cycleNodes.has(nodeId),
193
+ isolated: dependencies.length === 0 && dependents.length === 0,
194
+ };
195
+ });
196
+ }
197
+ createEdges(edges, waveByComponent, cycleEdges) {
198
+ return [...edges]
199
+ .sort((left, right) => `${left.from}->${left.to}`.localeCompare(`${right.from}->${right.to}`))
200
+ .map((edge) => {
201
+ const fromWave = waveByComponent.get(edge.from);
202
+ const toWave = waveByComponent.get(edge.to);
203
+ return {
204
+ from: edge.from,
205
+ to: edge.to,
206
+ type: edge.type,
207
+ source: edge.source,
208
+ reason: edge.reason,
209
+ confidence: edge.confidence,
210
+ fromWave,
211
+ toWave,
212
+ crossesWave: fromWave !== undefined && toWave !== undefined && fromWave !== toWave,
213
+ inCycle: cycleEdges.has(edgeKey(edge.from, edge.to)),
214
+ };
215
+ });
216
+ }
217
+ createWave(wave) {
218
+ return {
219
+ number: wave.number,
220
+ componentCount: wave.metadata.componentCount,
221
+ types: [...wave.metadata.types].sort((left, right) => left.localeCompare(right)),
222
+ maxDepth: wave.metadata.maxDepth,
223
+ estimatedTimeSeconds: wave.metadata.estimatedTime,
224
+ hasCircularDependencies: wave.metadata.hasCircularDeps,
225
+ components: [...wave.components].sort((left, right) => left.localeCompare(right)),
226
+ };
227
+ }
228
+ createWaveIndex(waves) {
229
+ const waveByComponent = new Map();
230
+ for (const wave of waves) {
231
+ for (const component of wave.components)
232
+ waveByComponent.set(component, wave.number);
233
+ }
234
+ return waveByComponent;
235
+ }
236
+ createCycleEdgeSet(cycles) {
237
+ const cycleEdges = new Set();
238
+ for (const cycle of cycles) {
239
+ for (let index = 0; index < cycle.cycle.length; index += 1) {
240
+ const from = cycle.cycle[index];
241
+ const to = cycle.cycle[(index + 1) % cycle.cycle.length];
242
+ if (from && to)
243
+ cycleEdges.add(edgeKey(from, to));
244
+ }
245
+ }
246
+ return cycleEdges;
247
+ }
248
+ toMermaidNode(component) {
249
+ return `${this.toMermaidId(component.id)}["${escapeMermaidText(this.componentLabel(component))}"]`;
250
+ }
251
+ toMermaidId(value) {
252
+ return `n_${value.replace(/[^a-zA-Z0-9_]/g, '_')}`;
253
+ }
254
+ componentLabel(component) {
255
+ const markers = [
256
+ component.wave === undefined ? 'unplaced' : `wave ${component.wave}`,
257
+ component.inCycle ? 'cycle' : '',
258
+ ]
259
+ .filter(Boolean)
260
+ .join(', ');
261
+ return markers ? `${component.type}:${component.name} (${markers})` : `${component.type}:${component.name}`;
262
+ }
263
+ toComponentRow(component) {
264
+ return `<tr><td><code>${escapeHtml(component.id)}</code></td><td>${escapeHtml(component.type)}</td><td>${escapeHtml(component.name)}</td><td>${component.wave ?? 'Unplaced'}</td><td>${component.inCycle ? 'Yes' : 'No'}</td><td><code>${escapeHtml(component.filePath ?? '')}</code></td></tr>`;
265
+ }
266
+ toEdgeRow(edge) {
267
+ const waves = edge.fromWave === undefined || edge.toWave === undefined ? 'Unplaced' : `${edge.fromWave} -> ${edge.toWave}`;
268
+ return `<tr><td><code>${escapeHtml(edge.from)}</code></td><td><code>${escapeHtml(edge.to)}</code></td><td>${escapeHtml(edge.type)}</td><td>${escapeHtml(edge.source ?? '')}</td><td>${escapeHtml(waves)}</td><td>${edge.inCycle ? 'Yes' : 'No'}</td></tr>`;
269
+ }
270
+ }
271
+ function parseNodeId(nodeId, component) {
272
+ if (component)
273
+ return { type: component.type, name: component.name };
274
+ const separatorIndex = nodeId.indexOf(':');
275
+ if (separatorIndex === -1)
276
+ return { type: 'Unknown', name: nodeId };
277
+ return { type: nodeId.slice(0, separatorIndex), name: nodeId.slice(separatorIndex + 1) };
278
+ }
279
+ function edgeKey(from, to) {
280
+ return `${from}->${to}`;
281
+ }
282
+ function escapeMermaidText(value) {
283
+ return value.replaceAll('&', '&amp;').replaceAll('"', '&quot;').replaceAll('[', '(').replaceAll(']', ')');
284
+ }
285
+ function escapeDot(value) {
286
+ return value.replaceAll('\\', '\\\\').replaceAll('"', '\\"').replaceAll('\n', '\\n');
287
+ }
288
+ function escapeHtml(value) {
289
+ return value
290
+ .replaceAll('&', '&amp;')
291
+ .replaceAll('<', '&lt;')
292
+ .replaceAll('>', '&gt;')
293
+ .replaceAll('"', '&quot;')
294
+ .replaceAll("'", '&#39;');
295
+ }
296
+ //# sourceMappingURL=graph-export-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-export-service.js","sourceRoot":"","sources":["../../src/reports/graph-export-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type ReleaseReportClock, type ReleaseReportFacts, type ReleaseReportV1 } from '../types/release-report.js';
2
+ export declare class ReleaseReportBuilder {
3
+ private readonly clock;
4
+ constructor(clock?: ReleaseReportClock);
5
+ build(facts: ReleaseReportFacts): ReleaseReportV1;
6
+ }
@@ -0,0 +1,115 @@
1
+ import { RELEASE_PHASE_ORDER, RELEASE_REPORT_SCHEMA_VERSION, RELEASE_ROUTE_ORDER, } from '../types/release-report.js';
2
+ const SYSTEM_CLOCK = {
3
+ now: () => new Date(),
4
+ };
5
+ export class ReleaseReportBuilder {
6
+ clock;
7
+ constructor(clock = SYSTEM_CLOCK) {
8
+ this.clock = clock;
9
+ }
10
+ build(facts) {
11
+ const phases = facts.phases.map(toPhase).sort(comparePhases);
12
+ const items = facts.items.map(toItem).sort(compareItems);
13
+ return {
14
+ schemaVersion: RELEASE_REPORT_SCHEMA_VERSION,
15
+ generatedAt: this.clock.now().toISOString(),
16
+ command: facts.command,
17
+ targetOrg: facts.targetOrg,
18
+ analysisMode: facts.analysisMode,
19
+ enrichment: {
20
+ status: facts.enrichment.status,
21
+ warnings: sortedUnique(facts.enrichment.warnings),
22
+ },
23
+ outcome: facts.outcome,
24
+ summary: summarize(items),
25
+ phases,
26
+ items,
27
+ reportWarnings: sortedUnique(facts.reportWarnings) ?? [],
28
+ };
29
+ }
30
+ }
31
+ function toPhase(phase) {
32
+ return {
33
+ ...phase,
34
+ status: normalizeStatus(phase.status),
35
+ evidence: sortEvidence(phase.evidence),
36
+ remediation: sortedUnique(phase.remediation),
37
+ };
38
+ }
39
+ function toItem(item) {
40
+ return {
41
+ ...item,
42
+ status: normalizeStatus(item.status),
43
+ evidenceReferences: sortedUnique(item.evidenceReferences),
44
+ remediation: sortedUnique(item.remediation),
45
+ };
46
+ }
47
+ function normalizeStatus(status) {
48
+ if (status === 'unknown')
49
+ return 'needs_review';
50
+ if (status === 'inapplicable')
51
+ return 'skipped';
52
+ return status;
53
+ }
54
+ function comparePhases(left, right) {
55
+ return (RELEASE_PHASE_ORDER[left.id] - RELEASE_PHASE_ORDER[right.id] ||
56
+ RELEASE_ROUTE_ORDER[left.route] - RELEASE_ROUTE_ORDER[right.route] ||
57
+ lexicalCompare(left.operation, right.operation));
58
+ }
59
+ function compareItems(left, right) {
60
+ return (RELEASE_PHASE_ORDER[left.phaseId] - RELEASE_PHASE_ORDER[right.phaseId] ||
61
+ RELEASE_ROUTE_ORDER[left.route] - RELEASE_ROUTE_ORDER[right.route] ||
62
+ lexicalCompare(left.metadataType, right.metadataType) ||
63
+ lexicalCompare(left.fullName, right.fullName) ||
64
+ lexicalCompare(left.targetOrg ?? '', right.targetOrg ?? ''));
65
+ }
66
+ function sortEvidence(evidence) {
67
+ if (!evidence)
68
+ return undefined;
69
+ const byKey = new Map();
70
+ for (const entry of evidence) {
71
+ const copy = { ...entry };
72
+ byKey.set(JSON.stringify(copy), copy);
73
+ }
74
+ return [...byKey.values()].sort((left, right) => lexicalCompare(left.tool, right.tool) ||
75
+ lexicalCompare(left.operationId, right.operationId) ||
76
+ lexicalCompare(left.deploymentId ?? '', right.deploymentId ?? '') ||
77
+ lexicalCompare(left.artifact ?? '', right.artifact ?? '') ||
78
+ (left.exitCode ?? -1) - (right.exitCode ?? -1));
79
+ }
80
+ function summarize(items) {
81
+ let succeeded = 0;
82
+ let failed = 0;
83
+ let skipped = 0;
84
+ let needsReview = 0;
85
+ for (const item of items) {
86
+ if (item.status === 'succeeded')
87
+ succeeded += 1;
88
+ else if (item.status === 'failed')
89
+ failed += 1;
90
+ else if (item.status === 'skipped')
91
+ skipped += 1;
92
+ else
93
+ needsReview += 1;
94
+ }
95
+ return {
96
+ total: items.length,
97
+ succeeded,
98
+ failed,
99
+ skipped,
100
+ needsReview,
101
+ };
102
+ }
103
+ function sortedUnique(values) {
104
+ if (!values)
105
+ return undefined;
106
+ return [...new Set(values)].sort(lexicalCompare);
107
+ }
108
+ function lexicalCompare(left, right) {
109
+ if (left < right)
110
+ return -1;
111
+ if (left > right)
112
+ return 1;
113
+ return 0;
114
+ }
115
+ //# sourceMappingURL=release-report-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-report-builder.js","sourceRoot":"","sources":["../../src/reports/release-report-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { ReleaseReportPresenter, type ReleaseReportPresenterIO } from '../presentation/release-report-presenter.js';
2
+ import type { ReleaseReportFacts, ReleaseReportV1 } from '../types/release-report.js';
3
+ import { ReleaseReportService, type ReleaseReportServiceOptions, type UnderlyingOperationResult } from './release-report-service.js';
4
+ export type ReleaseReportCommandOutput = {
5
+ releaseReport?: ReleaseReportV1;
6
+ releaseReportPath?: string;
7
+ releaseReportWarning?: string;
8
+ };
9
+ export declare class ReleaseReportCommandAdapter {
10
+ private readonly service;
11
+ private readonly presenter;
12
+ constructor(service?: ReleaseReportService, presenter?: ReleaseReportPresenter);
13
+ finalize<T>(io: ReleaseReportPresenterIO, underlying: UnderlyingOperationResult<T>, facts: ReleaseReportFacts, options: ReleaseReportServiceOptions): Promise<ReleaseReportCommandOutput>;
14
+ }
@@ -0,0 +1,28 @@
1
+ import { ReleaseReportPresenter } from '../presentation/release-report-presenter.js';
2
+ import { ReleaseReportService, } from './release-report-service.js';
3
+ export class ReleaseReportCommandAdapter {
4
+ service;
5
+ presenter;
6
+ constructor(service = new ReleaseReportService(), presenter = new ReleaseReportPresenter()) {
7
+ this.service = service;
8
+ this.presenter = presenter;
9
+ }
10
+ async finalize(io, underlying, facts, options) {
11
+ const finalized = await this.service.finalize(underlying, facts, options);
12
+ this.presenter.presentFinalization(io, finalized.report);
13
+ if (finalized.report.kind === 'unavailable') {
14
+ if (finalized.report.report)
15
+ this.presenter.present(io, finalized.report.report);
16
+ return {
17
+ releaseReport: finalized.report.report,
18
+ releaseReportWarning: finalized.report.warning,
19
+ };
20
+ }
21
+ this.presenter.present(io, finalized.report.report);
22
+ return {
23
+ releaseReport: finalized.report.report,
24
+ releaseReportPath: finalized.report.path,
25
+ };
26
+ }
27
+ }
28
+ //# sourceMappingURL=release-report-command-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-report-command-adapter.js","sourceRoot":"","sources":["../../src/reports/release-report-command-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAiC,MAAM,6CAA6C,CAAC;AAEpH,OAAO,EACL,oBAAoB,GAGrB,MAAM,6BAA6B,CAAC;AAQrC,MAAM,OAAO,2BAA2B;IAEnB;IACA;IAFnB,YACmB,UAAU,IAAI,oBAAoB,EAAE,EACpC,YAAY,IAAI,sBAAsB,EAAE;QADxC,YAAO,GAAP,OAAO,CAA6B;QACpC,cAAS,GAAT,SAAS,CAA+B;IACxD,CAAC;IAEG,KAAK,CAAC,QAAQ,CACnB,EAA4B,EAC5B,UAAwC,EACxC,KAAyB,EACzB,OAAoC;QAEpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAEzD,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAC5C,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM;gBAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACjF,OAAO;gBACL,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM;gBACtC,oBAAoB,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO;aAC/C,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO;YACL,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM;YACtC,iBAAiB,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI;SACzC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { DeploymentValidationSummary } from '../deployment/deployment-validation-service.js';
2
+ import type { DeploymentContext } from '../deployment/deployment-context-service.js';
3
+ import type { SpecialDeploymentExecutionResult } from '../deployment/special-deployment-executor.js';
4
+ import type { SpecialDeploymentPlan } from '../deployment/special-deployment-plan.js';
5
+ import type { ReleaseReportFacts } from '../types/release-report.js';
6
+ export declare function buildCiPublishReportFacts(plan: SpecialDeploymentPlan, execution?: SpecialDeploymentExecutionResult): ReleaseReportFacts;
7
+ export declare function buildValidationReportFacts(summary: DeploymentValidationSummary, targetOrg: string | undefined, useAI: boolean): ReleaseReportFacts;
8
+ export declare function buildStartReportFacts(context: DeploymentContext, options: {
9
+ targetOrg?: string;
10
+ dryRun: boolean;
11
+ validateOnly: boolean;
12
+ failed?: boolean;
13
+ warning?: string;
14
+ }): ReleaseReportFacts;