@specverse/engines 6.0.23 → 6.0.25
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/analyse-prepass/community-detection.d.ts +46 -0
- package/dist/analyse-prepass/community-detection.d.ts.map +1 -0
- package/dist/analyse-prepass/community-detection.js +227 -0
- package/dist/analyse-prepass/community-detection.js.map +1 -0
- package/dist/analyse-prepass/index.d.ts +11 -0
- package/dist/analyse-prepass/index.d.ts.map +1 -1
- package/dist/analyse-prepass/index.js +11 -0
- package/dist/analyse-prepass/index.js.map +1 -1
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/index.js +37 -1
- package/dist/parser/index.js.map +1 -1
- package/package.json +3 -1
|
@@ -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;
|
|
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":"AA4BA,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,aAAa,GAEd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,uBAAuB,GAKxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAoB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyse-prepass/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EACV,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,YAAY,EACV,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,SAAS,EACT,cAAc,EACd,WAAW,EACX,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,aAAa,EACb,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACf,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzF,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EACV,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,YAAY,EACV,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,SAAS,EACT,cAAc,EACd,WAAW,EACX,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,aAAa,EACb,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACf,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzF,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAQ/D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,6CAMtE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,6CAG9D;AAMD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE5F,cAAM,qBAAsB,YAAW,YAAY;IACjD,IAAI,SAAY;IAChB,OAAO,SAAW;IAClB,YAAY,WAAuE;IAEnF,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,WAAW,CAAS;IAEtB,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1D,OAAO,IAAI,UAAU;IAIrB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW;IAKvD,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;CAI3F;AA8BD,6DAA6D;AAC7D,eAAO,MAAM,MAAM,uBAA8B,CAAC;AAClD,eAAe,MAAM,CAAC"}
|
package/dist/parser/index.js
CHANGED
|
@@ -14,6 +14,8 @@ export { parseNamespace, parseReference, validateNamespace } from './namespace-u
|
|
|
14
14
|
export { ImportResolver } from './import-resolver/resolver.js';
|
|
15
15
|
// Re-export for convenience
|
|
16
16
|
import fs from 'fs';
|
|
17
|
+
import path from 'path';
|
|
18
|
+
import { createRequire } from 'module';
|
|
17
19
|
import { UnifiedSpecVerseParser } from './unified-parser.js';
|
|
18
20
|
/**
|
|
19
21
|
* Parse a SpecVerse YAML file
|
|
@@ -38,7 +40,17 @@ class SpecVerseParserEngine {
|
|
|
38
40
|
parser = null;
|
|
39
41
|
initialized = false;
|
|
40
42
|
async initialize(config) {
|
|
41
|
-
|
|
43
|
+
// Load the canonical SpecVerse schema from @specverse/entities by default.
|
|
44
|
+
// Initialising with `{}` (the prior behaviour) made AJV a no-op — every
|
|
45
|
+
// caller that went through EngineRegistry was running parses without
|
|
46
|
+
// schema validation. That masked schema-invalid output (e.g. controllers/
|
|
47
|
+
// services/caches inside deployments blocks) for months. Bug discovered
|
|
48
|
+
// 2026-04-29; this is the fix.
|
|
49
|
+
let schema = config?.schema;
|
|
50
|
+
if (!schema || (typeof schema === 'object' && Object.keys(schema).length === 0)) {
|
|
51
|
+
schema = loadDefaultSchema();
|
|
52
|
+
}
|
|
53
|
+
this.parser = new UnifiedSpecVerseParser(schema);
|
|
42
54
|
this.initialized = true;
|
|
43
55
|
}
|
|
44
56
|
getInfo() {
|
|
@@ -55,6 +67,30 @@ class SpecVerseParserEngine {
|
|
|
55
67
|
return this.parser.parseFileWithImports(filePath, options);
|
|
56
68
|
}
|
|
57
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Resolve and load `@specverse/entities/schema/SPECVERSE-SCHEMA.json`.
|
|
72
|
+
* Used by `SpecVerseParserEngine.initialize()` when no schema is provided.
|
|
73
|
+
* Throws a clear error if entities isn't installed alongside engines —
|
|
74
|
+
* better than silently no-op'ing schema validation.
|
|
75
|
+
*/
|
|
76
|
+
function loadDefaultSchema() {
|
|
77
|
+
const require = createRequire(import.meta.url);
|
|
78
|
+
let entitiesPkg;
|
|
79
|
+
try {
|
|
80
|
+
entitiesPkg = require.resolve('@specverse/entities/package.json');
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
throw new Error(`SpecVerseParserEngine: could not resolve @specverse/entities to load default schema. ` +
|
|
84
|
+
`Either install @specverse/entities alongside @specverse/engines, or pass an explicit ` +
|
|
85
|
+
`schema to .initialize({ schema }).`);
|
|
86
|
+
}
|
|
87
|
+
const schemaPath = path.join(path.dirname(entitiesPkg), 'schema', 'SPECVERSE-SCHEMA.json');
|
|
88
|
+
if (!fs.existsSync(schemaPath)) {
|
|
89
|
+
throw new Error(`SpecVerseParserEngine: default schema not found at ${schemaPath}. ` +
|
|
90
|
+
`Install a recent @specverse/entities or pass schema explicitly.`);
|
|
91
|
+
}
|
|
92
|
+
return JSON.parse(fs.readFileSync(schemaPath, 'utf8'));
|
|
93
|
+
}
|
|
58
94
|
/** Singleton engine instance for EngineRegistry discovery */
|
|
59
95
|
export const engine = new SpecVerseParserEngine();
|
|
60
96
|
export default engine;
|
package/dist/parser/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAwB;AACxB,OAAO,EACL,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAW7B,uCAAuC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAsBhE,sBAAsB;AACtB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzF,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,4BAA4B;AAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,UAAkB;IACrE,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAE/D,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,MAAW;IAC7D,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC;AAQD,MAAM,qBAAqB;IACzB,IAAI,GAAG,QAAQ,CAAC;IAChB,OAAO,GAAG,OAAO,CAAC;IAClB,YAAY,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,mBAAmB,CAAC,CAAC;IAE3E,MAAM,GAAkC,IAAI,CAAC;IAC7C,WAAW,GAAG,KAAK,CAAC;IAE5B,KAAK,CAAC,UAAU,CAAC,MAAyB;QACxC,IAAI,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/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.
|
|
3
|
+
"version": "6.0.25",
|
|
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",
|