@znemz/cfn-include 4.4.1 → 4.5.1
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/dist/cli.js +15 -1
- package/dist/cli.js.map +1 -1
- package/dist/lib/analysis.d.ts +64 -0
- package/dist/lib/analysis.d.ts.map +1 -0
- package/dist/lib/analysis.js +161 -0
- package/dist/lib/analysis.js.map +1 -0
- package/dist/lib/clustering.d.ts +49 -0
- package/dist/lib/clustering.d.ts.map +1 -0
- package/dist/lib/clustering.js +436 -0
- package/dist/lib/clustering.js.map +1 -0
- package/dist/lib/split.d.ts +12 -0
- package/dist/lib/split.d.ts.map +1 -1
- package/dist/lib/split.js +12 -1
- package/dist/lib/split.js.map +1 -1
- package/dist/lib/suggestions.d.ts +63 -0
- package/dist/lib/suggestions.d.ts.map +1 -0
- package/dist/lib/suggestions.js +330 -0
- package/dist/lib/suggestions.js.map +1 -0
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -10,7 +10,8 @@ import Client from './lib/cfnclient.js';
|
|
|
10
10
|
import replaceEnv from './lib/replaceEnv.js';
|
|
11
11
|
import { computeStats, checkThresholds, formatStatsReport } from './lib/stats.js';
|
|
12
12
|
import { buildDependencyGraph } from './lib/graph.js';
|
|
13
|
-
import { suggestSplit, autoSplit, formatSplitReport } from './lib/split.js';
|
|
13
|
+
import { suggestSplit, autoSplit, formatSplitReport, suggestSplitV2 } from './lib/split.js';
|
|
14
|
+
import { formatDetailedReport } from './lib/suggestions.js';
|
|
14
15
|
const __filename = fileURLToPath(import.meta.url);
|
|
15
16
|
const __dirname = path.dirname(__filename);
|
|
16
17
|
// Read package.json using fs instead of import assertion
|
|
@@ -93,6 +94,11 @@ const opts = yargs(hideBin(process.argv))
|
|
|
93
94
|
default: false,
|
|
94
95
|
boolean: true,
|
|
95
96
|
},
|
|
97
|
+
'suggest-split-detailed': {
|
|
98
|
+
desc: 'show detailed split analysis with multiple strategies (Phase 4.2)',
|
|
99
|
+
default: false,
|
|
100
|
+
boolean: true,
|
|
101
|
+
},
|
|
96
102
|
'auto-split': {
|
|
97
103
|
desc: 'split template into multiple stacks and write to the specified output directory',
|
|
98
104
|
string: true,
|
|
@@ -214,6 +220,14 @@ promise
|
|
|
214
220
|
}
|
|
215
221
|
console.error('');
|
|
216
222
|
}
|
|
223
|
+
// Suggest split (detailed)
|
|
224
|
+
if (opts['suggest-split-detailed']) {
|
|
225
|
+
const graph = buildDependencyGraph(template);
|
|
226
|
+
const suggestion = suggestSplitV2(template, graph);
|
|
227
|
+
console.error(formatDetailedReport(suggestion));
|
|
228
|
+
console.error('');
|
|
229
|
+
process.exit(0);
|
|
230
|
+
}
|
|
217
231
|
// Suggest split
|
|
218
232
|
if (opts['suggest-split'] || opts['auto-split']) {
|
|
219
233
|
const graph = buildDependencyGraph(template);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,CAAC,MAAM,QAAQ,CAAC;AAEvB,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Graph Analysis (Phase 4.2 of #90)
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - Connection strength analysis between resources
|
|
6
|
+
* - Cluster quality scoring (cohesion vs coupling)
|
|
7
|
+
* - Strongly-connected component detection (Tarjan's algorithm)
|
|
8
|
+
*
|
|
9
|
+
* Used by clustering.ts to make smart grouping decisions.
|
|
10
|
+
*/
|
|
11
|
+
import type { DependencyGraph } from './graph.js';
|
|
12
|
+
/**
|
|
13
|
+
* Connectivity strength between two resources.
|
|
14
|
+
* Higher score = more reasons to keep together.
|
|
15
|
+
*/
|
|
16
|
+
export interface ConnectionStrength {
|
|
17
|
+
source: string;
|
|
18
|
+
target: string;
|
|
19
|
+
/** Number of different dependency edges (Ref + GetAtt + DependsOn) */
|
|
20
|
+
edgeCount: number;
|
|
21
|
+
/** Bidirectional dependencies are stronger */
|
|
22
|
+
isBidirectional: boolean;
|
|
23
|
+
/** Shared condition usage */
|
|
24
|
+
sharedConditions: string[];
|
|
25
|
+
/** Overall strength score (0-100) */
|
|
26
|
+
score: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Metrics for evaluating cluster quality.
|
|
30
|
+
*/
|
|
31
|
+
export interface ClusterScore {
|
|
32
|
+
clusterId: string;
|
|
33
|
+
/** Intra-cluster connections (higher is better) */
|
|
34
|
+
cohesion: number;
|
|
35
|
+
/** Cross-cluster connections (lower is better) */
|
|
36
|
+
coupling: number;
|
|
37
|
+
/** Resource count and % of limit */
|
|
38
|
+
size: number;
|
|
39
|
+
sizePercent: number;
|
|
40
|
+
/** Overall quality score (cohesion - coupling, normalized) */
|
|
41
|
+
quality: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A strongly-connected component in the graph.
|
|
45
|
+
*/
|
|
46
|
+
export interface StrongComponent {
|
|
47
|
+
resourceIds: string[];
|
|
48
|
+
/** True if component forms a dependency cycle */
|
|
49
|
+
isCyclic: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Compute connection strength between all resource pairs.
|
|
53
|
+
*/
|
|
54
|
+
export declare function analyzeConnectivity(graph: DependencyGraph): Map<string, ConnectionStrength>;
|
|
55
|
+
/**
|
|
56
|
+
* Score a cluster's quality based on internal/external dependencies.
|
|
57
|
+
*/
|
|
58
|
+
export declare function scoreCluster(clusterId: string, resourceIds: string[], graph: DependencyGraph, allClusters: Map<string, string[]>): ClusterScore;
|
|
59
|
+
/**
|
|
60
|
+
* Find strongly-connected components (Tarjan's algorithm).
|
|
61
|
+
* Resources in cyclic components must stay in same stack.
|
|
62
|
+
*/
|
|
63
|
+
export declare function detectStronglyConnectedComponents(graph: DependencyGraph): StrongComponent[];
|
|
64
|
+
//# sourceMappingURL=analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/lib/analysis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,YAAY,CAAC;AAIlE;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,eAAe,EAAE,OAAO,CAAC;IACzB,6BAA6B;IAC7B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iDAAiD;IACjD,QAAQ,EAAE,OAAO,CAAC;CACnB;AASD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAwD3F;AAID;;GAEG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACjC,YAAY,CAyCd;AAID;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,eAAe,GACrB,eAAe,EAAE,CAmDnB"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Graph Analysis (Phase 4.2 of #90)
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - Connection strength analysis between resources
|
|
6
|
+
* - Cluster quality scoring (cohesion vs coupling)
|
|
7
|
+
* - Strongly-connected component detection (Tarjan's algorithm)
|
|
8
|
+
*
|
|
9
|
+
* Used by clustering.ts to make smart grouping decisions.
|
|
10
|
+
*/
|
|
11
|
+
// ── Constants ────────────────────────────────────────────────────────────────
|
|
12
|
+
/** CloudFormation resource limit per stack. */
|
|
13
|
+
const CFN_RESOURCE_LIMIT = 500;
|
|
14
|
+
// ── Connection Strength Analysis ─────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Compute connection strength between all resource pairs.
|
|
17
|
+
*/
|
|
18
|
+
export function analyzeConnectivity(graph) {
|
|
19
|
+
const strengths = new Map();
|
|
20
|
+
// Build strength map from edges
|
|
21
|
+
for (const edge of graph.edges) {
|
|
22
|
+
const key = `${edge.source}:${edge.target}`;
|
|
23
|
+
let strength = strengths.get(key);
|
|
24
|
+
if (!strength) {
|
|
25
|
+
strength = {
|
|
26
|
+
source: edge.source,
|
|
27
|
+
target: edge.target,
|
|
28
|
+
edgeCount: 0,
|
|
29
|
+
isBidirectional: false,
|
|
30
|
+
sharedConditions: [],
|
|
31
|
+
score: 0,
|
|
32
|
+
};
|
|
33
|
+
strengths.set(key, strength);
|
|
34
|
+
}
|
|
35
|
+
strength.edgeCount++;
|
|
36
|
+
}
|
|
37
|
+
// Check bidirectionality
|
|
38
|
+
for (const [key, strength] of strengths) {
|
|
39
|
+
const reverseKey = `${strength.target}:${strength.source}`;
|
|
40
|
+
if (strengths.has(reverseKey)) {
|
|
41
|
+
strength.isBidirectional = true;
|
|
42
|
+
strengths.get(reverseKey).isBidirectional = true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Check shared conditions
|
|
46
|
+
for (const [condName, resourceSet] of graph.conditionUsage) {
|
|
47
|
+
const resources = Array.from(resourceSet);
|
|
48
|
+
for (let i = 0; i < resources.length; i++) {
|
|
49
|
+
for (let j = i + 1; j < resources.length; j++) {
|
|
50
|
+
const key1 = `${resources[i]}:${resources[j]}`;
|
|
51
|
+
const key2 = `${resources[j]}:${resources[i]}`;
|
|
52
|
+
const strength1 = strengths.get(key1);
|
|
53
|
+
const strength2 = strengths.get(key2);
|
|
54
|
+
if (strength1)
|
|
55
|
+
strength1.sharedConditions.push(condName);
|
|
56
|
+
if (strength2)
|
|
57
|
+
strength2.sharedConditions.push(condName);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Calculate scores
|
|
62
|
+
for (const strength of strengths.values()) {
|
|
63
|
+
let score = strength.edgeCount * 20; // Base: 20 points per edge
|
|
64
|
+
if (strength.isBidirectional)
|
|
65
|
+
score += 30; // Bidirectional bonus
|
|
66
|
+
score += strength.sharedConditions.length * 15; // Condition bonus
|
|
67
|
+
strength.score = Math.min(100, score);
|
|
68
|
+
}
|
|
69
|
+
return strengths;
|
|
70
|
+
}
|
|
71
|
+
// ── Cluster Quality Scoring ──────────────────────────────────────────────────
|
|
72
|
+
/**
|
|
73
|
+
* Score a cluster's quality based on internal/external dependencies.
|
|
74
|
+
*/
|
|
75
|
+
export function scoreCluster(clusterId, resourceIds, graph, allClusters) {
|
|
76
|
+
const resourceSet = new Set(resourceIds);
|
|
77
|
+
const resourceToCluster = new Map();
|
|
78
|
+
for (const [cId, rIds] of allClusters) {
|
|
79
|
+
for (const rId of rIds) {
|
|
80
|
+
resourceToCluster.set(rId, cId);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
let internalEdges = 0;
|
|
84
|
+
let externalEdges = 0;
|
|
85
|
+
for (const edge of graph.edges) {
|
|
86
|
+
const sourceCluster = resourceToCluster.get(edge.source);
|
|
87
|
+
const targetCluster = resourceToCluster.get(edge.target);
|
|
88
|
+
if (sourceCluster === clusterId && targetCluster === clusterId) {
|
|
89
|
+
internalEdges++;
|
|
90
|
+
}
|
|
91
|
+
else if (sourceCluster === clusterId || targetCluster === clusterId) {
|
|
92
|
+
externalEdges++;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Cohesion: normalize by average graph density (not theoretical max)
|
|
96
|
+
// Typical CFN templates have ~2-4 deps per resource, not full mesh
|
|
97
|
+
const avgDepsPerResource = graph.edges.length / Math.max(1, graph.resourceIds.size);
|
|
98
|
+
const expectedInternalEdges = resourceIds.length * avgDepsPerResource * 0.7; // 70% internal is realistic
|
|
99
|
+
const cohesion = resourceIds.length > 1 && expectedInternalEdges > 0
|
|
100
|
+
? Math.min(1, internalEdges / expectedInternalEdges)
|
|
101
|
+
: 0;
|
|
102
|
+
const coupling = externalEdges / Math.max(1, resourceIds.length);
|
|
103
|
+
const size = resourceIds.length;
|
|
104
|
+
const sizePercent = (size / CFN_RESOURCE_LIMIT) * 100;
|
|
105
|
+
// Quality = cohesion (0-1) minus coupling penalty
|
|
106
|
+
const quality = Math.max(0, cohesion - coupling * 0.5);
|
|
107
|
+
return { clusterId, cohesion, coupling, size, sizePercent, quality };
|
|
108
|
+
}
|
|
109
|
+
// ── Strongly-Connected Components (Tarjan's Algorithm) ───────────────────────
|
|
110
|
+
/**
|
|
111
|
+
* Find strongly-connected components (Tarjan's algorithm).
|
|
112
|
+
* Resources in cyclic components must stay in same stack.
|
|
113
|
+
*/
|
|
114
|
+
export function detectStronglyConnectedComponents(graph) {
|
|
115
|
+
const resourceIds = Array.from(graph.resourceIds);
|
|
116
|
+
const indexMap = new Map();
|
|
117
|
+
const lowLinkMap = new Map();
|
|
118
|
+
const onStack = new Set();
|
|
119
|
+
const stack = [];
|
|
120
|
+
const components = [];
|
|
121
|
+
let index = 0;
|
|
122
|
+
function strongConnect(v) {
|
|
123
|
+
indexMap.set(v, index);
|
|
124
|
+
lowLinkMap.set(v, index);
|
|
125
|
+
index++;
|
|
126
|
+
stack.push(v);
|
|
127
|
+
onStack.add(v);
|
|
128
|
+
const node = graph.nodes.get(v);
|
|
129
|
+
if (node) {
|
|
130
|
+
for (const w of node.dependsOn) {
|
|
131
|
+
if (!indexMap.has(w)) {
|
|
132
|
+
strongConnect(w);
|
|
133
|
+
lowLinkMap.set(v, Math.min(lowLinkMap.get(v), lowLinkMap.get(w)));
|
|
134
|
+
}
|
|
135
|
+
else if (onStack.has(w)) {
|
|
136
|
+
lowLinkMap.set(v, Math.min(lowLinkMap.get(v), indexMap.get(w)));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// If v is a root node, pop the stack and create an SCC
|
|
141
|
+
if (lowLinkMap.get(v) === indexMap.get(v)) {
|
|
142
|
+
const component = [];
|
|
143
|
+
let w;
|
|
144
|
+
do {
|
|
145
|
+
w = stack.pop();
|
|
146
|
+
onStack.delete(w);
|
|
147
|
+
component.push(w);
|
|
148
|
+
} while (w !== v);
|
|
149
|
+
// A component is cyclic if it has more than 1 resource
|
|
150
|
+
const isCyclic = component.length > 1;
|
|
151
|
+
components.push({ resourceIds: component.sort(), isCyclic });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
for (const v of resourceIds) {
|
|
155
|
+
if (!indexMap.has(v)) {
|
|
156
|
+
strongConnect(v);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return components;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/lib/analysis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgDH,gFAAgF;AAEhF,+CAA+C;AAC/C,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAsB;IACxD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA8B,CAAC;IAExD,gCAAgC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5C,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG;gBACT,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,SAAS,EAAE,CAAC;gBACZ,eAAe,EAAE,KAAK;gBACtB,gBAAgB,EAAE,EAAE;gBACpB,KAAK,EAAE,CAAC;aACT,CAAC;YACF,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAED,QAAQ,CAAC,SAAS,EAAE,CAAC;IACvB,CAAC;IAED,yBAAyB;IACzB,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3D,IAAI,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC;YAChC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,eAAe,GAAG,IAAI,CAAC;QACpD,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,KAAK,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,MAAM,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACtC,IAAI,SAAS;oBAAE,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzD,IAAI,SAAS;oBAAE,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1C,IAAI,KAAK,GAAG,QAAQ,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,2BAA2B;QAChE,IAAI,QAAQ,CAAC,eAAe;YAAE,KAAK,IAAI,EAAE,CAAC,CAAC,sBAAsB;QACjE,KAAK,IAAI,QAAQ,CAAC,gBAAgB,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,kBAAkB;QAClE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,WAAqB,EACrB,KAAsB,EACtB,WAAkC;IAElC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEpD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC;QACtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEzD,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAC/D,aAAa,EAAE,CAAC;QAClB,CAAC;aAAM,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YACtE,aAAa,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,mEAAmE;IACnE,MAAM,kBAAkB,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACpF,MAAM,qBAAqB,GAAG,WAAW,CAAC,MAAM,GAAG,kBAAkB,GAAG,GAAG,CAAC,CAAC,4BAA4B;IACzG,MAAM,QAAQ,GACZ,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,qBAAqB,GAAG,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,qBAAqB,CAAC;QACpD,CAAC,CAAC,CAAC,CAAC;IAER,MAAM,QAAQ,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC;IAChC,MAAM,WAAW,GAAG,CAAC,IAAI,GAAG,kBAAkB,CAAC,GAAG,GAAG,CAAC;IAEtD,kDAAkD;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,GAAG,CAAC,CAAC;IAEvD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AACvE,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAC/C,KAAsB;IAEtB,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAsB,EAAE,CAAC;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,SAAS,aAAa,CAAC,CAAS;QAC9B,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACvB,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACzB,KAAK,EAAE,CAAC;QACR,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEf,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrB,aAAa,CAAC,CAAC,CAAC,CAAC;oBACjB,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;gBACtE,CAAC;qBAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1B,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,IAAI,CAAS,CAAC;YACd,GAAG,CAAC;gBACF,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAClB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAElB,uDAAuD;YACvD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,aAAa,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Resource Clustering (Phase 4.2 of #90)
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - Hybrid clustering algorithm (connectivity + semantic)
|
|
6
|
+
* - Cluster optimization via resource moves
|
|
7
|
+
* - Size constraint enforcement
|
|
8
|
+
*
|
|
9
|
+
* Uses analysis from analysis.ts to make intelligent grouping decisions.
|
|
10
|
+
*/
|
|
11
|
+
import type { TemplateDocument } from '../types/template.js';
|
|
12
|
+
import type { DependencyGraph } from './graph.js';
|
|
13
|
+
import { type ConnectionStrength, type ClusterScore } from './analysis.js';
|
|
14
|
+
/**
|
|
15
|
+
* Options for clustering algorithm.
|
|
16
|
+
*/
|
|
17
|
+
export interface ClusteringOptions {
|
|
18
|
+
/** Maximum resources per cluster (default: 400, 80% of limit) */
|
|
19
|
+
maxClusterSize?: number;
|
|
20
|
+
/** Minimum cluster quality score to accept (0-1, default: 0.3) */
|
|
21
|
+
minQuality?: number;
|
|
22
|
+
/** Strategy: 'connectivity' | 'semantic' | 'hybrid' */
|
|
23
|
+
strategy?: 'connectivity' | 'semantic' | 'hybrid';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A resource cluster with metadata.
|
|
27
|
+
*/
|
|
28
|
+
export interface ResourceCluster {
|
|
29
|
+
id: string;
|
|
30
|
+
name: string;
|
|
31
|
+
category: string;
|
|
32
|
+
resourceIds: string[];
|
|
33
|
+
resourceTypes: Record<string, number>;
|
|
34
|
+
score: ClusterScore;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Cluster resources using dependency analysis + semantic grouping.
|
|
38
|
+
* Returns optimized clusters ready for stack splitting.
|
|
39
|
+
*/
|
|
40
|
+
export declare function clusterResources(template: TemplateDocument, graph: DependencyGraph, options?: ClusteringOptions): ResourceCluster[];
|
|
41
|
+
/**
|
|
42
|
+
* Refine clusters to improve quality scores and satisfy constraints.
|
|
43
|
+
*/
|
|
44
|
+
export declare function optimizeClusters(clusters: ResourceCluster[], graph: DependencyGraph, connectivity: Map<string, ConnectionStrength>): ResourceCluster[];
|
|
45
|
+
/**
|
|
46
|
+
* Enforce size constraints by splitting oversized clusters.
|
|
47
|
+
*/
|
|
48
|
+
export declare function enforceConstraints(clusters: ResourceCluster[], graph: DependencyGraph, maxSize: number): ResourceCluster[];
|
|
49
|
+
//# sourceMappingURL=clustering.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clustering.d.ts","sourceRoot":"","sources":["../../src/lib/clustering.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,YAAY,EAElB,MAAM,eAAe,CAAC;AAKvB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,cAAc,GAAG,UAAU,GAAG,QAAQ,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,KAAK,EAAE,YAAY,CAAC;CACrB;AAWD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,eAAe,EAAE,CAwCnB;AA2QD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,EAAE,EAC3B,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAC5C,eAAe,EAAE,CA2CnB;AA4DD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,EAAE,EAC3B,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,MAAM,GACd,eAAe,EAAE,CAcnB"}
|