@specverse/engines 6.0.6 → 6.0.8
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/adapters/index.d.ts +9 -0
- package/dist/analyse-prepass/adapters/index.d.ts.map +1 -0
- package/dist/analyse-prepass/adapters/index.js +9 -0
- package/dist/analyse-prepass/adapters/index.js.map +1 -0
- package/dist/analyse-prepass/adapters/typescript-prisma.d.ts +67 -0
- package/dist/analyse-prepass/adapters/typescript-prisma.d.ts.map +1 -0
- package/dist/analyse-prepass/adapters/typescript-prisma.js +167 -0
- package/dist/analyse-prepass/adapters/typescript-prisma.js.map +1 -0
- package/dist/analyse-prepass/backends/codegraph.d.ts +56 -0
- package/dist/analyse-prepass/backends/codegraph.d.ts.map +1 -0
- package/dist/analyse-prepass/backends/codegraph.js +303 -0
- package/dist/analyse-prepass/backends/codegraph.js.map +1 -0
- package/dist/analyse-prepass/backends/grep-only.d.ts +33 -0
- package/dist/analyse-prepass/backends/grep-only.d.ts.map +1 -0
- package/dist/analyse-prepass/backends/grep-only.js +377 -0
- package/dist/analyse-prepass/backends/grep-only.js.map +1 -0
- package/dist/analyse-prepass/backends/index.d.ts +20 -0
- package/dist/analyse-prepass/backends/index.d.ts.map +1 -0
- package/dist/analyse-prepass/backends/index.js +27 -0
- package/dist/analyse-prepass/backends/index.js.map +1 -0
- package/dist/analyse-prepass/backends/method-patterns.d.ts +27 -0
- package/dist/analyse-prepass/backends/method-patterns.d.ts.map +1 -0
- package/dist/analyse-prepass/backends/method-patterns.js +177 -0
- package/dist/analyse-prepass/backends/method-patterns.js.map +1 -0
- package/dist/analyse-prepass/backends/walk.d.ts +7 -0
- package/dist/analyse-prepass/backends/walk.d.ts.map +1 -0
- package/dist/analyse-prepass/backends/walk.js +105 -0
- package/dist/analyse-prepass/backends/walk.js.map +1 -0
- package/dist/analyse-prepass/index.d.ts +76 -0
- package/dist/analyse-prepass/index.d.ts.map +1 -0
- package/dist/analyse-prepass/index.js +114 -0
- package/dist/analyse-prepass/index.js.map +1 -0
- package/dist/analyse-prepass/interface.d.ts +222 -0
- package/dist/analyse-prepass/interface.d.ts.map +1 -0
- package/dist/analyse-prepass/interface.js +20 -0
- package/dist/analyse-prepass/interface.js.map +1 -0
- package/dist/inference/index.d.ts.map +1 -1
- package/dist/inference/index.js +27 -5
- package/dist/inference/index.js.map +1 -1
- package/dist/libs/instance-factories/orms/templates/prisma/schema-generator.js +25 -4
- package/libs/instance-factories/orms/templates/prisma/schema-generator.ts +43 -5
- package/package.json +5 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StructuralPrepass — pluggable backend interface for analyse pre-pass.
|
|
3
|
+
*
|
|
4
|
+
* The pre-pass extracts deterministic structural facts from a source codebase
|
|
5
|
+
* (entities / relationships / lifecycle state literals / etc.) BEFORE the LLM
|
|
6
|
+
* sees it, so the LLM can focus on semantic interpretation rather than
|
|
7
|
+
* structural discovery.
|
|
8
|
+
*
|
|
9
|
+
* Backends: grep-only (zero deps, fallback for tests/CI), codegraph
|
|
10
|
+
* (recommended default), gitnexus (alternative for multi-component cases
|
|
11
|
+
* where Leiden community detection adds value).
|
|
12
|
+
*
|
|
13
|
+
* Adapters: per-framework translators (typescript-prisma first, then
|
|
14
|
+
* typescript-typeorm / python-sqlalchemy / go-gorm / etc.) that consume
|
|
15
|
+
* this interface and produce SpecVerse-vocabulary facts.
|
|
16
|
+
*
|
|
17
|
+
* Design rationale: see specverse-self/docs/proposals/STRUCTURAL-PREPASS-FOR-ANALYSE.md
|
|
18
|
+
*/
|
|
19
|
+
/** A symbol detected by tree-sitter (or grep heuristics) — class / function / method / etc. */
|
|
20
|
+
export interface Symbol {
|
|
21
|
+
kind: 'class' | 'function' | 'method' | 'interface' | 'type_alias' | 'constant' | 'enum';
|
|
22
|
+
name: string;
|
|
23
|
+
/** Fully-qualified name where applicable (e.g. "PollController.evolve"). */
|
|
24
|
+
qualifiedName: string;
|
|
25
|
+
filePath: string;
|
|
26
|
+
startLine: number;
|
|
27
|
+
endLine: number;
|
|
28
|
+
/** Function/method signature, e.g. "(id: string, data: any): Promise<any>" */
|
|
29
|
+
signature?: string;
|
|
30
|
+
/** Leading docstring or JSDoc, if present */
|
|
31
|
+
docstring?: string;
|
|
32
|
+
/** Whether the symbol is exported from its module */
|
|
33
|
+
isExported?: boolean;
|
|
34
|
+
/** Decorators on the symbol (TypeScript / Python / Java) */
|
|
35
|
+
decorators?: string[];
|
|
36
|
+
/** Source-level language (typescript, javascript, python, go, ...) */
|
|
37
|
+
language: string;
|
|
38
|
+
}
|
|
39
|
+
/** An import edge — file imports symbols from target module. */
|
|
40
|
+
export interface Import {
|
|
41
|
+
fromFile: string;
|
|
42
|
+
toModule: string;
|
|
43
|
+
symbols: string[];
|
|
44
|
+
}
|
|
45
|
+
/** Capability flags — adapters check before using optional methods. */
|
|
46
|
+
export interface Capabilities {
|
|
47
|
+
/** Backend can resolve callers/callees of a symbol via call graph. */
|
|
48
|
+
callGraph: boolean;
|
|
49
|
+
/** Backend resolves cross-file references (vs single-file regex). */
|
|
50
|
+
crossFileResolution: boolean;
|
|
51
|
+
/** Backend has community-detection clustering (e.g. Leiden in GitNexus). */
|
|
52
|
+
componentClustering: boolean;
|
|
53
|
+
/** Backend supports full-text search across source. */
|
|
54
|
+
fullTextSearch: boolean;
|
|
55
|
+
/** Backend automatically syncs as files change (e.g. CodeGraph file watchers). */
|
|
56
|
+
fileWatching: boolean;
|
|
57
|
+
}
|
|
58
|
+
export interface FileFilter {
|
|
59
|
+
dir?: string;
|
|
60
|
+
lang?: string;
|
|
61
|
+
glob?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface ClassFilter {
|
|
64
|
+
dir?: string;
|
|
65
|
+
namePattern?: RegExp;
|
|
66
|
+
}
|
|
67
|
+
export interface MethodFilter {
|
|
68
|
+
/** Class qualified-name (e.g. "OrderProcessorController") */
|
|
69
|
+
class?: string;
|
|
70
|
+
/** Names to filter to — e.g. ['evolve', 'create', 'validate'] */
|
|
71
|
+
nameIn?: string[];
|
|
72
|
+
}
|
|
73
|
+
export interface InterfaceFilter {
|
|
74
|
+
dir?: string;
|
|
75
|
+
namePattern?: RegExp;
|
|
76
|
+
}
|
|
77
|
+
export interface IndexResult {
|
|
78
|
+
files: number;
|
|
79
|
+
symbols: number;
|
|
80
|
+
durationMs: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Per-method fact sheet for behavior extraction.
|
|
84
|
+
*
|
|
85
|
+
* The structural pre-pass surfaces these facts from a method's body via
|
|
86
|
+
* tree-sitter call graph (where available) + regex heuristics for common
|
|
87
|
+
* patterns (event emission, DB writes, throws, async boundaries). The
|
|
88
|
+
* SpecVerse adapter layer (and downstream behavior-extraction prompt)
|
|
89
|
+
* consumes these to translate procedural code into spec-vocabulary
|
|
90
|
+
* `behaviors:` blocks with `steps:` decomposition.
|
|
91
|
+
*
|
|
92
|
+
* Design rationale: see specverse-self/docs/proposals/BEHAVIOR-EXTRACTION-FOR-ANALYSE.md
|
|
93
|
+
* — per-method fact sheets shrink the LLM's job from "summarize 200 lines
|
|
94
|
+
* of code" to "given this structured fact sheet, write a SpecVerse behavior
|
|
95
|
+
* block". Smaller cognitive load → smaller variance surface.
|
|
96
|
+
*/
|
|
97
|
+
export interface MethodFactSheet {
|
|
98
|
+
qualifiedName: string;
|
|
99
|
+
signature: string;
|
|
100
|
+
/** Raw source body (the function body — between { and }). */
|
|
101
|
+
body: string;
|
|
102
|
+
filePath: string;
|
|
103
|
+
startLine: number;
|
|
104
|
+
endLine: number;
|
|
105
|
+
language: string;
|
|
106
|
+
/**
|
|
107
|
+
* Methods/functions this one invokes (call graph).
|
|
108
|
+
* From CodeGraph: SQL on edges table (kind='call').
|
|
109
|
+
* From grep-only: regex for `(\w+)\(` calls within the body.
|
|
110
|
+
*/
|
|
111
|
+
calls: Symbol[];
|
|
112
|
+
/**
|
|
113
|
+
* Event names emitted from this method's body.
|
|
114
|
+
* Patterns matched: emit() / dispatchEvent() / .next() (RxJS) /
|
|
115
|
+
* eventBus.publish() / pubsub.publish() / send() with first-arg literal.
|
|
116
|
+
*/
|
|
117
|
+
emits: string[];
|
|
118
|
+
/**
|
|
119
|
+
* Persisted-state writes detected in the body (per ORM heuristic).
|
|
120
|
+
* Prisma: prisma.X.create() / .update() / .delete() / .upsert().
|
|
121
|
+
* TypeORM: repository.save() / .update() / .remove().
|
|
122
|
+
* SQLAlchemy: session.add() / .delete() / commit-tracked mutations.
|
|
123
|
+
* For arbitrary code, populated only when the adapter knows the ORM.
|
|
124
|
+
*/
|
|
125
|
+
dbWrites: Array<{
|
|
126
|
+
entity: string;
|
|
127
|
+
field?: string;
|
|
128
|
+
op: 'create' | 'update' | 'delete' | 'upsert' | 'unknown';
|
|
129
|
+
}>;
|
|
130
|
+
/**
|
|
131
|
+
* External system calls detected in the body.
|
|
132
|
+
* Patterns: fetch() / axios.X() / http.request() (HTTP),
|
|
133
|
+
* kafka.send() / rabbit.publish() (queue), redis.set() / cache.set() (cache).
|
|
134
|
+
*/
|
|
135
|
+
externalCalls: Array<{
|
|
136
|
+
kind: 'http' | 'queue' | 'cache' | 'unknown';
|
|
137
|
+
target?: string;
|
|
138
|
+
}>;
|
|
139
|
+
/**
|
|
140
|
+
* Explicit throw statements with their error type. `throw new BadRequestError(...)`
|
|
141
|
+
* → `BadRequestError`. Useful for inferring preconditions / error states.
|
|
142
|
+
*/
|
|
143
|
+
throws: string[];
|
|
144
|
+
/**
|
|
145
|
+
* Async boundaries — locations where the method awaits, runs in parallel,
|
|
146
|
+
* or races. Useful for distinguishing sequential from parallel steps.
|
|
147
|
+
*/
|
|
148
|
+
asyncBoundaries: Array<{
|
|
149
|
+
type: 'await' | 'promise.all' | 'promise.race' | 'promise.allSettled';
|
|
150
|
+
line: number;
|
|
151
|
+
}>;
|
|
152
|
+
/**
|
|
153
|
+
* Cyclomatic complexity proxy: count of branch points (if/else/switch/catch/ternary).
|
|
154
|
+
* High values suggest the LLM should look for branching steps in spec.
|
|
155
|
+
*/
|
|
156
|
+
branchPoints: number;
|
|
157
|
+
/**
|
|
158
|
+
* For SpecVerse-realized backends: the body has comment-delineated regions
|
|
159
|
+
* (PRECONDITIONS / EXECUTE / POSTCONDITIONS / EVENTS). When detected, the
|
|
160
|
+
* regions are sliced out for the verify-behavior pass to cross-check spec
|
|
161
|
+
* preconditions/postconditions/events against source-side markers.
|
|
162
|
+
*
|
|
163
|
+
* For arbitrary backends, all fields here are undefined.
|
|
164
|
+
*/
|
|
165
|
+
bodyTextSliced?: {
|
|
166
|
+
preconditions?: string;
|
|
167
|
+
execute?: string;
|
|
168
|
+
postconditions?: string;
|
|
169
|
+
events?: string;
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Pluggable backend for structural extraction. Implementations:
|
|
174
|
+
* - backends/grep-only.ts — no external tools, regex per language
|
|
175
|
+
* - backends/codegraph.ts — tree-sitter via CodeGraph CLI + SQLite
|
|
176
|
+
* - backends/gitnexus.ts — tree-sitter via GitNexus MCP + LadybugDB
|
|
177
|
+
*/
|
|
178
|
+
export interface StructuralPrepass {
|
|
179
|
+
/** Initialize the backend on a source directory. */
|
|
180
|
+
init(sourceDir: string): Promise<void>;
|
|
181
|
+
/** Build / refresh the index. Returns stats. May be a no-op on grep-only. */
|
|
182
|
+
index(): Promise<IndexResult>;
|
|
183
|
+
/** List files in scope, optionally filtered. */
|
|
184
|
+
listFiles(filter?: FileFilter): Promise<string[]>;
|
|
185
|
+
/** List classes (or class-like declarations across languages). */
|
|
186
|
+
listClasses(filter?: ClassFilter): Promise<Symbol[]>;
|
|
187
|
+
/** List methods on classes. Class membership encoded in qualifiedName. */
|
|
188
|
+
listMethods(filter?: MethodFilter): Promise<Symbol[]>;
|
|
189
|
+
/** List interfaces / type-defs. */
|
|
190
|
+
listInterfaces(filter?: InterfaceFilter): Promise<Symbol[]>;
|
|
191
|
+
/** List imports for a single file. */
|
|
192
|
+
listImports(file: string): Promise<Import[]>;
|
|
193
|
+
/** Read raw source text. Adapters use this for regex extraction of literals. */
|
|
194
|
+
fileSourceText(file: string): Promise<string>;
|
|
195
|
+
/**
|
|
196
|
+
* Optional: callers/callees graph traversal.
|
|
197
|
+
* Throws if `capabilities.callGraph === false`.
|
|
198
|
+
*/
|
|
199
|
+
callers?(symbol: string): Promise<Symbol[]>;
|
|
200
|
+
callees?(symbol: string): Promise<Symbol[]>;
|
|
201
|
+
/**
|
|
202
|
+
* Get the per-method fact sheet for a single method (by qualified name,
|
|
203
|
+
* e.g. "OrderProcessorController.processOrder"). Returns null if the
|
|
204
|
+
* method isn't found or isn't analyseable.
|
|
205
|
+
*
|
|
206
|
+
* All backends implement this — grep-only via regex over the method body,
|
|
207
|
+
* CodeGraph via SQL on the edges table for call data + regex for everything
|
|
208
|
+
* else (events, dbWrites, etc. aren't tree-sitter symbols, they're patterns).
|
|
209
|
+
*/
|
|
210
|
+
getMethodDetails(qualifiedName: string): Promise<MethodFactSheet | null>;
|
|
211
|
+
/**
|
|
212
|
+
* Optional: cluster files into communities (Leiden / similar).
|
|
213
|
+
* Throws if `capabilities.componentClustering === false`.
|
|
214
|
+
*/
|
|
215
|
+
clusterFiles?(): Promise<Array<{
|
|
216
|
+
id: string;
|
|
217
|
+
files: string[];
|
|
218
|
+
}>>;
|
|
219
|
+
/** Capability flags — adapters check before calling optional methods. */
|
|
220
|
+
capabilities: Capabilities;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/analyse-prepass/interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StructuralPrepass — pluggable backend interface for analyse pre-pass.
|
|
3
|
+
*
|
|
4
|
+
* The pre-pass extracts deterministic structural facts from a source codebase
|
|
5
|
+
* (entities / relationships / lifecycle state literals / etc.) BEFORE the LLM
|
|
6
|
+
* sees it, so the LLM can focus on semantic interpretation rather than
|
|
7
|
+
* structural discovery.
|
|
8
|
+
*
|
|
9
|
+
* Backends: grep-only (zero deps, fallback for tests/CI), codegraph
|
|
10
|
+
* (recommended default), gitnexus (alternative for multi-component cases
|
|
11
|
+
* where Leiden community detection adds value).
|
|
12
|
+
*
|
|
13
|
+
* Adapters: per-framework translators (typescript-prisma first, then
|
|
14
|
+
* typescript-typeorm / python-sqlalchemy / go-gorm / etc.) that consume
|
|
15
|
+
* this interface and produce SpecVerse-vocabulary facts.
|
|
16
|
+
*
|
|
17
|
+
* Design rationale: see specverse-self/docs/proposals/STRUCTURAL-PREPASS-FOR-ANALYSE.md
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/analyse-prepass/interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/inference/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,iBAAiB,CAAC;AAGhC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,YAAY,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAG9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAS9D,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACrJ,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,wBAAwB,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC9M,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAMvG,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGzH,cAAM,wBAAyB,YAAW,eAAe;IACvD,IAAI,SAAe;IACnB,OAAO,SAAW;IAClB,YAAY,WAAyE;IAErF,OAAO,CAAC,OAAO,CAA6C;IAEtD,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5E,OAAO,IAAI,UAAU;IAIf,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAKtC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/inference/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,iBAAiB,CAAC;AAGhC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,YAAY,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAG9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAS9D,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACrJ,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,wBAAwB,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC9M,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAMvG,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGzH,cAAM,wBAAyB,YAAW,eAAe;IACvD,IAAI,SAAe;IACnB,OAAO,SAAW;IAClB,YAAY,WAAyE;IAErF,OAAO,CAAC,OAAO,CAA6C;IAEtD,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5E,OAAO,IAAI,UAAU;IAIf,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAKtC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;CAuM5E;AAED,eAAO,MAAM,MAAM,0BAAiC,CAAC;AACrD,eAAe,MAAM,CAAC"}
|
package/dist/inference/index.js
CHANGED
|
@@ -129,6 +129,24 @@ class SpecVerseInferenceEngine {
|
|
|
129
129
|
// - For non-map sections (deployments, conventions, etc.) preserve the
|
|
130
130
|
// prior behavior: inferred takes priority unless empty.
|
|
131
131
|
const MAP_SECTIONS = new Set(['controllers', 'services', 'views', 'events']);
|
|
132
|
+
// The parser emits map-shaped sections (controllers/services/views/events)
|
|
133
|
+
// as arrays of { name, ...rest } in the AST, while the inference engine
|
|
134
|
+
// emits them as name-keyed objects. Normalize arrays to objects before
|
|
135
|
+
// merging so user-declared entries (with different names from inferred ones)
|
|
136
|
+
// survive into the final component.
|
|
137
|
+
const normalizeToMap = (v) => {
|
|
138
|
+
if (!v)
|
|
139
|
+
return null;
|
|
140
|
+
if (Array.isArray(v)) {
|
|
141
|
+
const out = {};
|
|
142
|
+
for (const item of v) {
|
|
143
|
+
if (item && item.name)
|
|
144
|
+
out[item.name] = item;
|
|
145
|
+
}
|
|
146
|
+
return out;
|
|
147
|
+
}
|
|
148
|
+
return (typeof v === 'object') ? v : null;
|
|
149
|
+
};
|
|
132
150
|
for (const [key, value] of Object.entries(targetComp)) {
|
|
133
151
|
if (key === 'name' || key === 'models' || value == null)
|
|
134
152
|
continue;
|
|
@@ -138,11 +156,15 @@ class SpecVerseInferenceEngine {
|
|
|
138
156
|
if (isEmpty) {
|
|
139
157
|
inferredComponent[key] = value;
|
|
140
158
|
}
|
|
141
|
-
else if (MAP_SECTIONS.has(key)
|
|
142
|
-
|
|
143
|
-
// Merge
|
|
144
|
-
//
|
|
145
|
-
|
|
159
|
+
else if (MAP_SECTIONS.has(key)) {
|
|
160
|
+
// Both arrays-of-named-items and name-keyed objects normalize to a map.
|
|
161
|
+
// Merge user keys + inferred keys. On collision, user wins (the spec is
|
|
162
|
+
// the source of truth; inferred is a default-fill).
|
|
163
|
+
const userMap = normalizeToMap(value);
|
|
164
|
+
const existingMap = normalizeToMap(existing);
|
|
165
|
+
if (userMap && existingMap) {
|
|
166
|
+
inferredComponent[key] = { ...existingMap, ...userMap };
|
|
167
|
+
}
|
|
146
168
|
}
|
|
147
169
|
}
|
|
148
170
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/inference/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/inference/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,12 +17,24 @@ function generatePrismaSchema(context) {
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
const header = generateHeader(implType);
|
|
20
|
+
const enumCollector = /* @__PURE__ */ new Map();
|
|
20
21
|
const modelSchemas = allModels.map(
|
|
21
|
-
(model) => generateModelSchema(model, relationMap, backRefs, hasOneTargets, allModels)
|
|
22
|
+
(model) => generateModelSchema(model, relationMap, backRefs, hasOneTargets, allModels, enumCollector)
|
|
22
23
|
).join("\n\n");
|
|
24
|
+
let enumBlock = "";
|
|
25
|
+
if (enumCollector.size > 0) {
|
|
26
|
+
const enumDecls = [];
|
|
27
|
+
for (const [enumName, values] of enumCollector) {
|
|
28
|
+
const body = values.map((v) => ` ${v}`).join("\n");
|
|
29
|
+
enumDecls.push(`enum ${enumName} {
|
|
30
|
+
${body}
|
|
31
|
+
}`);
|
|
32
|
+
}
|
|
33
|
+
enumBlock = enumDecls.join("\n\n") + "\n\n";
|
|
34
|
+
}
|
|
23
35
|
return `${header}
|
|
24
36
|
|
|
25
|
-
${modelSchemas}`;
|
|
37
|
+
${enumBlock}${modelSchemas}`;
|
|
26
38
|
}
|
|
27
39
|
function buildRelationMap(allModels) {
|
|
28
40
|
const targetRefs = /* @__PURE__ */ new Map();
|
|
@@ -148,7 +160,7 @@ datasource db {
|
|
|
148
160
|
url = ${provider === "sqlite" ? '"file:./dev.db"' : 'env("DATABASE_URL")'}
|
|
149
161
|
}`;
|
|
150
162
|
}
|
|
151
|
-
function generateModelSchema(model, relationMap, backRefs, hasOneTargets, allModels) {
|
|
163
|
+
function generateModelSchema(model, relationMap, backRefs, hasOneTargets, allModels, enumCollector) {
|
|
152
164
|
const modelName = model.name;
|
|
153
165
|
let schema = `model ${modelName} {
|
|
154
166
|
`;
|
|
@@ -158,6 +170,7 @@ function generateModelSchema(model, relationMap, backRefs, hasOneTargets, allMod
|
|
|
158
170
|
schema += ` ${generateField(attr, model)}
|
|
159
171
|
`;
|
|
160
172
|
});
|
|
173
|
+
const ENUM_VALUE_REGEX = /^[a-zA-Z][a-zA-Z0-9_]*$/;
|
|
161
174
|
const rawLifecycles = model.lifecycles || [];
|
|
162
175
|
const lifecycleList = Array.isArray(rawLifecycles) ? rawLifecycles : Object.entries(rawLifecycles).map(([name, lc]) => ({ name, ...typeof lc === "object" ? lc : {} }));
|
|
163
176
|
for (const lifecycle of lifecycleList) {
|
|
@@ -166,8 +179,16 @@ function generateModelSchema(model, relationMap, backRefs, hasOneTargets, allMod
|
|
|
166
179
|
if (!exists && lifecycle.states?.length > 0) {
|
|
167
180
|
const defaultState = lifecycle.states[0];
|
|
168
181
|
const padding = " ".repeat(Math.max(1, 15 - fieldName.length));
|
|
169
|
-
|
|
182
|
+
const allValid = lifecycle.states.every((s) => ENUM_VALUE_REGEX.test(s));
|
|
183
|
+
if (allValid && enumCollector) {
|
|
184
|
+
const enumName = `${modelName}${fieldName.charAt(0).toUpperCase()}${fieldName.slice(1)}`;
|
|
185
|
+
enumCollector.set(enumName, lifecycle.states);
|
|
186
|
+
schema += ` ${fieldName}${padding}${enumName} @default(${defaultState})
|
|
170
187
|
`;
|
|
188
|
+
} else {
|
|
189
|
+
schema += ` ${fieldName}${padding}String @default("${defaultState}")
|
|
190
|
+
`;
|
|
191
|
+
}
|
|
171
192
|
}
|
|
172
193
|
}
|
|
173
194
|
relationships.forEach((rel) => {
|
|
@@ -42,12 +42,28 @@ export default function generatePrismaSchema(context: TemplateContext): string {
|
|
|
42
42
|
// Generate header
|
|
43
43
|
const header = generateHeader(implType);
|
|
44
44
|
|
|
45
|
+
// Collector for Prisma enum declarations derived from model lifecycles.
|
|
46
|
+
// Generated as a side-effect of generateModelSchema and emitted at the
|
|
47
|
+
// top level (Prisma requires enums declared OUTSIDE model blocks).
|
|
48
|
+
const enumCollector = new Map<string, string[]>();
|
|
49
|
+
|
|
45
50
|
// Generate models
|
|
46
51
|
const modelSchemas = allModels.map((model: any) =>
|
|
47
|
-
generateModelSchema(model, relationMap, backRefs, hasOneTargets, allModels)
|
|
52
|
+
generateModelSchema(model, relationMap, backRefs, hasOneTargets, allModels, enumCollector)
|
|
48
53
|
).join('\n\n');
|
|
49
54
|
|
|
50
|
-
|
|
55
|
+
// Emit collected enums before models, so models can reference them.
|
|
56
|
+
let enumBlock = '';
|
|
57
|
+
if (enumCollector.size > 0) {
|
|
58
|
+
const enumDecls: string[] = [];
|
|
59
|
+
for (const [enumName, values] of enumCollector) {
|
|
60
|
+
const body = values.map((v) => ` ${v}`).join('\n');
|
|
61
|
+
enumDecls.push(`enum ${enumName} {\n${body}\n}`);
|
|
62
|
+
}
|
|
63
|
+
enumBlock = enumDecls.join('\n\n') + '\n\n';
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return `${header}\n\n${enumBlock}${modelSchemas}`;
|
|
51
67
|
}
|
|
52
68
|
|
|
53
69
|
/**
|
|
@@ -285,7 +301,8 @@ function generateModelSchema(
|
|
|
285
301
|
relationMap: Map<string, string | null>,
|
|
286
302
|
backRefs: Map<string, string[]>,
|
|
287
303
|
hasOneTargets: Set<string>,
|
|
288
|
-
allModels?: any[]
|
|
304
|
+
allModels?: any[],
|
|
305
|
+
enumCollector?: Map<string, string[]>,
|
|
289
306
|
): string {
|
|
290
307
|
const modelName = model.name;
|
|
291
308
|
let schema = `model ${modelName} {\n`;
|
|
@@ -305,7 +322,19 @@ function generateModelSchema(
|
|
|
305
322
|
schema += ` ${generateField(attr, model)}\n`;
|
|
306
323
|
});
|
|
307
324
|
|
|
308
|
-
// Add lifecycle status fields (if model has lifecycles)
|
|
325
|
+
// Add lifecycle status fields (if model has lifecycles).
|
|
326
|
+
//
|
|
327
|
+
// Each lifecycle's state literals become a Prisma `enum` declared at the
|
|
328
|
+
// schema's top level. The field's type is the enum, not a plain `String`.
|
|
329
|
+
// This preserves the state vocabulary in source so the realize→analyse
|
|
330
|
+
// round-trip oracle can recover lifecycle states (previously, only the
|
|
331
|
+
// default state survived — the others were silently dropped).
|
|
332
|
+
//
|
|
333
|
+
// Prisma enum value identifier rules: `^[a-zA-Z][a-zA-Z0-9_]*$`. SpecVerse
|
|
334
|
+
// states are already snake_case (enforced by the convention prompt) so they
|
|
335
|
+
// satisfy this without transformation. If a state somehow contains an
|
|
336
|
+
// illegal char, fall back to plain String so we don't emit an invalid schema.
|
|
337
|
+
const ENUM_VALUE_REGEX = /^[a-zA-Z][a-zA-Z0-9_]*$/;
|
|
309
338
|
const rawLifecycles = model.lifecycles || [];
|
|
310
339
|
const lifecycleList = Array.isArray(rawLifecycles)
|
|
311
340
|
? rawLifecycles
|
|
@@ -316,7 +345,16 @@ function generateModelSchema(
|
|
|
316
345
|
if (!exists && lifecycle.states?.length > 0) {
|
|
317
346
|
const defaultState = lifecycle.states[0];
|
|
318
347
|
const padding = ' '.repeat(Math.max(1, 15 - fieldName.length));
|
|
319
|
-
|
|
348
|
+
const allValid = lifecycle.states.every((s: string) => ENUM_VALUE_REGEX.test(s));
|
|
349
|
+
if (allValid && enumCollector) {
|
|
350
|
+
const enumName = `${modelName}${fieldName.charAt(0).toUpperCase()}${fieldName.slice(1)}`;
|
|
351
|
+
enumCollector.set(enumName, lifecycle.states);
|
|
352
|
+
schema += ` ${fieldName}${padding}${enumName} @default(${defaultState})\n`;
|
|
353
|
+
} else {
|
|
354
|
+
// Fallback for invalid identifiers or when no collector — preserves the
|
|
355
|
+
// pre-fix behavior so downstream code never sees an undefined enum ref.
|
|
356
|
+
schema += ` ${fieldName}${padding}String @default("${defaultState}")\n`;
|
|
357
|
+
}
|
|
320
358
|
}
|
|
321
359
|
}
|
|
322
360
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@specverse/engines",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.8",
|
|
4
4
|
"description": "SpecVerse toolchain — parser, inference, realize, generators, AI, registry, bundles",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
"types": "./dist/inference/index.d.ts",
|
|
20
20
|
"import": "./dist/inference/index.js"
|
|
21
21
|
},
|
|
22
|
+
"./analyse-prepass": {
|
|
23
|
+
"types": "./dist/analyse-prepass/index.d.ts",
|
|
24
|
+
"import": "./dist/analyse-prepass/index.js"
|
|
25
|
+
},
|
|
22
26
|
"./realize": {
|
|
23
27
|
"types": "./dist/realize/index.d.ts",
|
|
24
28
|
"import": "./dist/realize/index.js"
|