@specverse/engines 6.0.23 → 6.0.24

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.
@@ -0,0 +1,46 @@
1
+ export interface ComponentSuggestion {
2
+ /** Heuristic name based on dominant entity prefix or shared substring; "Component-N" if no clear name emerges. */
3
+ suggestedName: string;
4
+ /** Member entity names. */
5
+ entities: string[];
6
+ /** Cross-edges to OTHER communities — these are the candidate event boundaries. */
7
+ crossEdges: Array<{
8
+ to: string;
9
+ targetCommunity: number;
10
+ type: string;
11
+ }>;
12
+ /** Internal edges (within the community). For diagnostic visibility. */
13
+ internalEdgeCount: number;
14
+ }
15
+ export interface SuggestOptions {
16
+ /** Resolution param for Louvain — higher = more, smaller communities. Default 1.0. */
17
+ resolution?: number;
18
+ /** Random seed for deterministic clustering. Default 42. */
19
+ seed?: number;
20
+ /** Min community size to emit; smaller communities are kept but flagged. Default 2. */
21
+ minSize?: number;
22
+ }
23
+ interface MinimalEntity {
24
+ name: string;
25
+ }
26
+ interface MinimalRelationship {
27
+ from: string;
28
+ to: string;
29
+ type: string;
30
+ }
31
+ /**
32
+ * Run Louvain community detection on the model graph.
33
+ *
34
+ * Treats the relationship list as undirected (an edge between A and B regardless
35
+ * of direction). This matches the diagnostic methodology and produces stable
36
+ * communities — directed Louvain doesn't add value at this granularity since
37
+ * a `belongsTo` relationship co-domains its `hasMany` counterpart.
38
+ */
39
+ export declare function detectModelCommunities(entities: MinimalEntity[], relationships: MinimalRelationship[], opts?: SuggestOptions): ComponentSuggestion[];
40
+ /**
41
+ * Format ComponentSuggestions as a markdown block to splice into facts.md.
42
+ * The LLM consumes this section to learn proposed component boundaries.
43
+ */
44
+ export declare function formatSuggestionsAsMarkdown(suggestions: ComponentSuggestion[]): string;
45
+ export {};
46
+ //# sourceMappingURL=community-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community-detection.d.ts","sourceRoot":"","sources":["../../src/analyse-prepass/community-detection.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,mBAAmB;IAClC,kHAAkH;IAClH,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,mFAAmF;IACnF,UAAU,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,wEAAwE;IACxE,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AACD,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,aAAa,EAAE,EACzB,aAAa,EAAE,mBAAmB,EAAE,EACpC,IAAI,GAAE,cAAmB,GACxB,mBAAmB,EAAE,CAwFvB;AA6DD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAuCtF"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Model-graph community detection — surfaces candidate SpecVerse component
3
+ * boundaries by clustering entities on declared relationships.
4
+ *
5
+ * **Why this is here**: a single mega-component spec (cal-com case,
6
+ * 100 entities, 3000 lines) is fragile under LLM emission and ignores the
7
+ * INVOCATION DISCIPLINE shape SpecVerse encourages. Splitting the entity
8
+ * graph into communities — using Louvain modularity optimisation on the
9
+ * data graph (NOT the call graph) — produces DOMAIN-shaped clusters that
10
+ * map cleanly to component boundaries.
11
+ *
12
+ * Diagnostic on cal-com (2026-04-28):
13
+ * 100 models / 155 relationships → 8 communities of size 3-18
14
+ * each community = a recognisable domain (Auth / Booking / EventType / ...)
15
+ *
16
+ * Reference: `specverse-self/docs/proposals/COMPONENT-SUGGESTION-FROM-MODEL-GRAPH.md`.
17
+ */
18
+ // graphology + graphology-communities-louvain ship as CJS; Node16 module
19
+ // resolution + esModuleInterop confuse TS about which form is the constructor /
20
+ // callable. Cast to `any` once at the import boundary; the runtime shape is
21
+ // well-known and tested via the diagnostic on cal-com.
22
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
+ import * as graphologyModule from 'graphology';
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+ import * as louvainModule from 'graphology-communities-louvain';
26
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
+ const Graph = graphologyModule.default ?? graphologyModule;
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
+ const louvain = louvainModule.default ?? louvainModule;
30
+ /**
31
+ * Run Louvain community detection on the model graph.
32
+ *
33
+ * Treats the relationship list as undirected (an edge between A and B regardless
34
+ * of direction). This matches the diagnostic methodology and produces stable
35
+ * communities — directed Louvain doesn't add value at this granularity since
36
+ * a `belongsTo` relationship co-domains its `hasMany` counterpart.
37
+ */
38
+ export function detectModelCommunities(entities, relationships, opts = {}) {
39
+ const resolution = opts.resolution ?? 1.0;
40
+ const minSize = opts.minSize ?? 2;
41
+ if (entities.length < 5) {
42
+ // Too few entities for community detection to be meaningful.
43
+ return [];
44
+ }
45
+ // Build undirected graph. Use addUndirectedEdge so we don't accidentally
46
+ // get duplicate directed edges from `A belongsTo B` + `B hasMany A`.
47
+ const g = new Graph({ type: 'undirected', allowSelfLoops: false });
48
+ for (const ent of entities) {
49
+ if (!g.hasNode(ent.name))
50
+ g.addNode(ent.name);
51
+ }
52
+ for (const rel of relationships) {
53
+ if (!g.hasNode(rel.from) || !g.hasNode(rel.to))
54
+ continue;
55
+ if (rel.from === rel.to)
56
+ continue;
57
+ if (!g.hasEdge(rel.from, rel.to)) {
58
+ g.addUndirectedEdge(rel.from, rel.to);
59
+ }
60
+ }
61
+ if (g.order === 0 || g.size === 0)
62
+ return [];
63
+ // Run Louvain. graphology-communities-louvain returns a node→community-id map.
64
+ const communityMap = louvain(g, { resolution });
65
+ // Group entities by community id.
66
+ const grouped = new Map();
67
+ for (const [node, communityId] of Object.entries(communityMap)) {
68
+ const members = grouped.get(communityId) ?? [];
69
+ members.push(node);
70
+ grouped.set(communityId, members);
71
+ }
72
+ // Sort communities by size descending — bigger first is more useful for
73
+ // human inspection and for the LLM (sets the dominant domains first).
74
+ // Singletons (size 1, ie. isolated entities with no relationships) are
75
+ // dropped from the suggestion list — they're noise. The LLM is told to
76
+ // place isolated entities wherever appropriate.
77
+ const sortedCommunities = Array.from(grouped.entries())
78
+ .map(([id, members]) => ({ id, members: members.sort() }))
79
+ .filter((c) => c.members.length >= minSize)
80
+ .sort((a, b) => b.members.length - a.members.length);
81
+ // Map original community id → final 1-indexed display number (after sort)
82
+ const idToDisplayNum = new Map();
83
+ sortedCommunities.forEach((comm, idx) => idToDisplayNum.set(comm.id, idx + 1));
84
+ // Build the result list with cross-edges + name.
85
+ const suggestions = [];
86
+ for (const comm of sortedCommunities) {
87
+ const memberSet = new Set(comm.members);
88
+ let internalEdgeCount = 0;
89
+ const crossEdges = [];
90
+ // Walk the original (directed) relationship list. For each edge
91
+ // determine if it's internal (both endpoints in this community) or
92
+ // cross (other endpoint in another community).
93
+ for (const rel of relationships) {
94
+ if (rel.from === rel.to)
95
+ continue;
96
+ const fromIn = memberSet.has(rel.from);
97
+ const toIn = memberSet.has(rel.to);
98
+ if (fromIn && toIn) {
99
+ internalEdgeCount++;
100
+ }
101
+ else if (fromIn && !toIn) {
102
+ const targetCommunityId = communityMap[rel.to];
103
+ if (targetCommunityId === undefined)
104
+ continue;
105
+ crossEdges.push({
106
+ to: rel.to,
107
+ targetCommunity: idToDisplayNum.get(targetCommunityId) ?? -1,
108
+ type: rel.type,
109
+ });
110
+ }
111
+ // if `!fromIn && toIn`, we'll catch the symmetric edge when iterating
112
+ // for the OTHER community; skip to avoid duplicates.
113
+ }
114
+ suggestions.push({
115
+ suggestedName: deriveName(comm.members, g, idToDisplayNum.get(comm.id) ?? 0),
116
+ entities: comm.members,
117
+ crossEdges,
118
+ internalEdgeCount: internalEdgeCount / 2, // each undirected edge counted twice in the loop
119
+ });
120
+ }
121
+ return suggestions;
122
+ }
123
+ /**
124
+ * Heuristic component naming.
125
+ *
126
+ * Strategy ladder:
127
+ * 1. Common entity prefix that's at least 4 chars (`EventType*` → `EventTypeDomain`).
128
+ * 2. Hub-entity strategy: highest-degree node in the community with a name
129
+ * that's a "root" word — name without obvious suffix words like
130
+ * `Detail`, `Setting`, etc. Suffix with `Domain`.
131
+ * 3. Single member: use the member name + `Domain`.
132
+ * 4. Fallback: `Component-N` (1-indexed).
133
+ *
134
+ * The LLM is told these are SUGGESTIONS — it may rename to fit the
135
+ * domain it sees in the source.
136
+ */
137
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
138
+ function deriveName(members, graph, displayNum) {
139
+ if (members.length === 0)
140
+ return `Component-${displayNum}`;
141
+ if (members.length === 1)
142
+ return members[0] + 'Domain';
143
+ // Strategy 1 — common prefix at least 4 chars
144
+ const commonPrefix = longestCommonPrefix(members);
145
+ if (commonPrefix.length >= 4 && /^[A-Z]/.test(commonPrefix)) {
146
+ return commonPrefix + 'Domain';
147
+ }
148
+ // Strategy 2 — pick the highest-degree node within the community as the
149
+ // "hub" naming basis. The hub is the entity with the most incoming edges
150
+ // from other community members; this typically picks `User` for an
151
+ // identity cluster, `Booking` for a booking cluster, etc.
152
+ let bestNode = members[0];
153
+ let bestDegree = 0;
154
+ for (const m of members) {
155
+ if (!graph.hasNode(m))
156
+ continue;
157
+ const degree = graph.degree(m);
158
+ if (degree > bestDegree) {
159
+ bestDegree = degree;
160
+ bestNode = m;
161
+ }
162
+ }
163
+ if (bestDegree > 0) {
164
+ return bestNode + 'Domain';
165
+ }
166
+ // Strategy 4 — fallback by community number
167
+ return `Component-${displayNum}`;
168
+ }
169
+ function longestCommonPrefix(strs) {
170
+ if (strs.length === 0)
171
+ return '';
172
+ let prefix = strs[0];
173
+ for (let i = 1; i < strs.length; i++) {
174
+ while (strs[i].indexOf(prefix) !== 0) {
175
+ prefix = prefix.slice(0, -1);
176
+ if (!prefix)
177
+ return '';
178
+ }
179
+ }
180
+ return prefix;
181
+ }
182
+ /**
183
+ * Format ComponentSuggestions as a markdown block to splice into facts.md.
184
+ * The LLM consumes this section to learn proposed component boundaries.
185
+ */
186
+ export function formatSuggestionsAsMarkdown(suggestions) {
187
+ if (suggestions.length === 0)
188
+ return '';
189
+ const lines = [];
190
+ lines.push('');
191
+ lines.push('## Component candidates');
192
+ lines.push('');
193
+ lines.push('The structural pre-pass detected the following candidate component boundaries by');
194
+ lines.push('clustering entities on declared relationships (Louvain community detection). Use these');
195
+ lines.push('as your component boundaries unless you have a strong reason to merge or split them.');
196
+ lines.push('');
197
+ lines.push('When a relationship spans communities (listed under "Cross-component edges"), model it');
198
+ lines.push('as an event publish/subscribe rather than a direct relationship — this preserves');
199
+ lines.push('SpecVerse\'s INVOCATION DISCIPLINE.');
200
+ lines.push('');
201
+ for (let i = 0; i < suggestions.length; i++) {
202
+ const s = suggestions[i];
203
+ lines.push(`### Component ${i + 1}: ${s.suggestedName} (${s.entities.length} entities, suggested)`);
204
+ lines.push('');
205
+ // Render members 6 per line for readability
206
+ for (let j = 0; j < s.entities.length; j += 6) {
207
+ lines.push(' ' + s.entities.slice(j, j + 6).join(', '));
208
+ }
209
+ lines.push('');
210
+ if (s.crossEdges.length > 0) {
211
+ lines.push(`Cross-component edges from this component (${s.crossEdges.length} total):`);
212
+ // Group by target community
213
+ const byTarget = new Map();
214
+ for (const ce of s.crossEdges) {
215
+ const list = byTarget.get(ce.targetCommunity) ?? [];
216
+ list.push(`${ce.to} (${ce.type})`);
217
+ byTarget.set(ce.targetCommunity, list);
218
+ }
219
+ for (const [target, refs] of [...byTarget.entries()].sort((a, b) => a[0] - b[0])) {
220
+ lines.push(` → Component ${target}: ${refs.slice(0, 8).join(', ')}${refs.length > 8 ? `, +${refs.length - 8} more` : ''}`);
221
+ }
222
+ lines.push('');
223
+ }
224
+ }
225
+ return lines.join('\n');
226
+ }
227
+ //# sourceMappingURL=community-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community-detection.js","sourceRoot":"","sources":["../../src/analyse-prepass/community-detection.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,8 @@ export { GrepOnlyBackend, CodeGraphBackend, GitNexusBackend, selectBackend, type
18
18
  export { extractTypeScriptPrisma, type PrismaFacts, type PrismaEntity, type PrismaField, type PrismaRelation, } from './adapters/index.js';
19
19
  import { type BackendName } from './backends/index.js';
20
20
  import type { StructuralPrepass } from './interface.js';
21
+ import type { ComponentSuggestion } from './community-detection.js';
22
+ export type { ComponentSuggestion } from './community-detection.js';
21
23
  export interface SpecVerseFacts {
22
24
  /** Detected entities (model candidates). */
23
25
  entities: Array<{
@@ -46,6 +48,13 @@ export interface SpecVerseFacts {
46
48
  sourceDir: string;
47
49
  durationMs: number;
48
50
  };
51
+ /**
52
+ * Optional component-boundary suggestions from Louvain on the entity graph.
53
+ * Populated when the entity graph is large enough to benefit (≥5 entities)
54
+ * and `suggestComponents !== false` in options. See
55
+ * `specverse-self/docs/proposals/COMPONENT-SUGGESTION-FROM-MODEL-GRAPH.md`.
56
+ */
57
+ suggestedComponents?: ComponentSuggestion[];
49
58
  }
50
59
  export interface RunPrepassOptions {
51
60
  /** Backend to use; defaults to 'auto' (CodeGraph if available, else grep-only). */
@@ -54,6 +63,8 @@ export interface RunPrepassOptions {
54
63
  prepass?: StructuralPrepass;
55
64
  /** Skip adapter selection and run only the named ones. Default = all detected. */
56
65
  adapters?: Array<'typescript-prisma'>;
66
+ /** Run model-graph community detection to suggest component boundaries. Default true. */
67
+ suggestComponents?: boolean;
57
68
  }
58
69
  /**
59
70
  * Run the structural pre-pass on a source directory.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyse-prepass/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,YAAY,EACV,iBAAiB,EACjB,MAAM,EACN,MAAM,EACN,YAAY,EACZ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,WAAW,EACX,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,KAAK,WAAW,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,uBAAuB,EACvB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC,CAAC;IACH,+CAA+C;IAC/C,aAAa,EAAE,KAAK,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;QACxD,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,kFAAkF;IAClF,UAAU,EAAE,KAAK,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC,CAAC;IACH,+DAA+D;IAC/D,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,qEAAqE;IACrE,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;CACvC;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CAqF5G;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CA2CnE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyse-prepass/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,YAAY,EACV,iBAAiB,EACjB,MAAM,EACN,MAAM,EACN,YAAY,EACZ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,WAAW,EACX,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,KAAK,WAAW,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,uBAAuB,EACvB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC,CAAC;IACH,+CAA+C;IAC/C,aAAa,EAAE,KAAK,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;QACxD,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,kFAAkF;IAClF,UAAU,EAAE,KAAK,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC,CAAC;IACH,+DAA+D;IAC/D,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,mBAAmB,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,qEAAqE;IACrE,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACtC,yFAAyF;IACzF,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CAiG5G;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CA+CnE"}
@@ -2,6 +2,7 @@ export { GrepOnlyBackend, CodeGraphBackend, GitNexusBackend, selectBackend, } fr
2
2
  export { extractTypeScriptPrisma, } from './adapters/index.js';
3
3
  import { selectBackend } from './backends/index.js';
4
4
  import { extractTypeScriptPrisma } from './adapters/index.js';
5
+ import { formatSuggestionsAsMarkdown } from './community-detection.js';
5
6
  /**
6
7
  * Run the structural pre-pass on a source directory.
7
8
  *
@@ -89,6 +90,13 @@ export async function runPrepass(sourceDir, options = {}) {
89
90
  // Each detects its applicability and produces higher-precision output
90
91
  // than the generic fallback.
91
92
  facts.meta.adaptersRun = adaptersRun;
93
+ // ── Component suggestions via model-graph community detection ──
94
+ // Off if the schema is too small (< 5 entities) since Louvain is
95
+ // meaningless on tiny graphs.
96
+ if (options.suggestComponents !== false && facts.entities.length >= 5) {
97
+ const { detectModelCommunities } = await import('./community-detection.js');
98
+ facts.suggestedComponents = detectModelCommunities(facts.entities, facts.relationships);
99
+ }
92
100
  facts.meta.durationMs = Date.now() - start;
93
101
  return facts;
94
102
  }
@@ -136,6 +144,9 @@ export function formatFactsAsMarkdown(facts) {
136
144
  }
137
145
  lines.push('');
138
146
  }
147
+ if (facts.suggestedComponents && facts.suggestedComponents.length > 0) {
148
+ lines.push(formatSuggestionsAsMarkdown(facts.suggestedComponents));
149
+ }
139
150
  return lines.join('\n');
140
151
  }
141
152
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyse-prepass/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyse-prepass/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@specverse/engines",
3
- "version": "6.0.23",
3
+ "version": "6.0.24",
4
4
  "description": "SpecVerse toolchain — parser, inference, realize, generators, AI, registry, bundles",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -61,6 +61,8 @@
61
61
  "ajv": "^8.17.0",
62
62
  "ajv-formats": "^2.1.0",
63
63
  "glob": "^10.0.0",
64
+ "graphology": "^0.26.0",
65
+ "graphology-communities-louvain": "^2.0.2",
64
66
  "handlebars": "^4.7.9",
65
67
  "js-yaml": "^4.1.0",
66
68
  "semver": "^7.0.0",