@kernlang/review 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/dist/differ.d.ts +11 -0
- package/dist/differ.js +132 -0
- package/dist/differ.js.map +1 -0
- package/dist/external-tools.d.ts +32 -0
- package/dist/external-tools.js +173 -0
- package/dist/external-tools.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/inferrer.d.ts +15 -0
- package/dist/inferrer.js +502 -0
- package/dist/inferrer.js.map +1 -0
- package/dist/llm-review.d.ts +24 -0
- package/dist/llm-review.js +197 -0
- package/dist/llm-review.js.map +1 -0
- package/dist/quality-rules.d.ts +12 -0
- package/dist/quality-rules.js +28 -0
- package/dist/quality-rules.js.map +1 -0
- package/dist/reporter.d.ts +15 -0
- package/dist/reporter.js +217 -0
- package/dist/reporter.js.map +1 -0
- package/dist/rules/base.d.ts +10 -0
- package/dist/rules/base.js +556 -0
- package/dist/rules/base.js.map +1 -0
- package/dist/rules/express.d.ts +9 -0
- package/dist/rules/express.js +107 -0
- package/dist/rules/express.js.map +1 -0
- package/dist/rules/index.d.ts +16 -0
- package/dist/rules/index.js +38 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/nextjs.d.ts +9 -0
- package/dist/rules/nextjs.js +128 -0
- package/dist/rules/nextjs.js.map +1 -0
- package/dist/rules/react.d.ts +9 -0
- package/dist/rules/react.js +252 -0
- package/dist/rules/react.js.map +1 -0
- package/dist/rules/vue.d.ts +9 -0
- package/dist/rules/vue.js +198 -0
- package/dist/rules/vue.js.map +1 -0
- package/dist/template-detector.d.ts +12 -0
- package/dist/template-detector.js +225 -0
- package/dist/template-detector.js.map +1 -0
- package/dist/types.d.ts +152 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/package.json +23 -0
package/dist/inferrer.js
ADDED
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TS → .kern Inferrer — scans TypeScript AST and infers KERN IR nodes.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1 (deterministic): type, interface, fn, error, import, const
|
|
5
|
+
* Phase 2 (composite): machine, config, event, module
|
|
6
|
+
*
|
|
7
|
+
* v2: Adds stable nodeId, promptAlias, sourceSpans to InferResult.
|
|
8
|
+
*/
|
|
9
|
+
import { Project, SyntaxKind, } from 'ts-morph';
|
|
10
|
+
import { countTokens } from '@kernlang/core';
|
|
11
|
+
// ── Create Project ───────────────────────────────────────────────────────
|
|
12
|
+
export function createProject() {
|
|
13
|
+
return new Project({
|
|
14
|
+
compilerOptions: { strict: true, target: 99 /* Latest */ },
|
|
15
|
+
useInMemoryFileSystem: false,
|
|
16
|
+
skipAddingFilesFromTsConfig: true,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function createInMemoryProject() {
|
|
20
|
+
return new Project({
|
|
21
|
+
compilerOptions: { strict: true, target: 99 },
|
|
22
|
+
useInMemoryFileSystem: true,
|
|
23
|
+
skipAddingFilesFromTsConfig: true,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
// ── Main Inference Function ──────────────────────────────────────────────
|
|
27
|
+
export function inferFromSource(source, filePath = 'input.ts') {
|
|
28
|
+
const project = createInMemoryProject();
|
|
29
|
+
const sourceFile = project.createSourceFile(filePath, source);
|
|
30
|
+
return inferFromSourceFile(sourceFile);
|
|
31
|
+
}
|
|
32
|
+
export function inferFromFile(filePath) {
|
|
33
|
+
const project = createProject();
|
|
34
|
+
const sourceFile = project.addSourceFileAtPath(filePath);
|
|
35
|
+
return inferFromSourceFile(sourceFile);
|
|
36
|
+
}
|
|
37
|
+
export function inferFromSourceFile(sourceFile) {
|
|
38
|
+
const results = [];
|
|
39
|
+
// Phase 1: Deterministic matchers
|
|
40
|
+
results.push(...inferTypes(sourceFile));
|
|
41
|
+
results.push(...inferInterfaces(sourceFile));
|
|
42
|
+
results.push(...inferFunctions(sourceFile));
|
|
43
|
+
results.push(...inferErrors(sourceFile));
|
|
44
|
+
results.push(...inferImports(sourceFile));
|
|
45
|
+
results.push(...inferConsts(sourceFile));
|
|
46
|
+
// Phase 2: Composite patterns
|
|
47
|
+
results.push(...inferMachines(sourceFile, results));
|
|
48
|
+
results.push(...inferConfigs(sourceFile, results));
|
|
49
|
+
results.push(...inferEvents(sourceFile, results));
|
|
50
|
+
// Sort by line number
|
|
51
|
+
results.sort((a, b) => a.startLine - b.startLine);
|
|
52
|
+
// Assign sequential prompt aliases after sorting (stable per file)
|
|
53
|
+
for (let i = 0; i < results.length; i++) {
|
|
54
|
+
results[i].promptAlias = `N${i + 1}`;
|
|
55
|
+
}
|
|
56
|
+
return results;
|
|
57
|
+
}
|
|
58
|
+
// ── Helpers ──────────────────────────────────────────────────────────────
|
|
59
|
+
function getSpan(sourceFile, startOffset, endOffset) {
|
|
60
|
+
const filePath = sourceFile.getFilePath() || 'input.ts';
|
|
61
|
+
const startPos = sourceFile.getLineAndColumnAtPos(startOffset);
|
|
62
|
+
const endPos = sourceFile.getLineAndColumnAtPos(endOffset);
|
|
63
|
+
return {
|
|
64
|
+
file: filePath,
|
|
65
|
+
startLine: startPos.line,
|
|
66
|
+
startCol: startPos.column,
|
|
67
|
+
endLine: endPos.line,
|
|
68
|
+
endCol: endPos.column,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, summary, confidence, confidencePct, originalText) {
|
|
72
|
+
const filePath = sourceFile.getFilePath() || 'input.ts';
|
|
73
|
+
const name = node.props?.name || 'anon';
|
|
74
|
+
const nodeId = `${filePath}#${node.type}:${name}@${startOffset}`;
|
|
75
|
+
const kernRepr = serializeKernNode(node);
|
|
76
|
+
const kernTokens = countTokens(kernRepr);
|
|
77
|
+
const tsTokens = countTokens(originalText);
|
|
78
|
+
return {
|
|
79
|
+
node,
|
|
80
|
+
nodeId,
|
|
81
|
+
promptAlias: '', // assigned after sort in inferFromSourceFile
|
|
82
|
+
startLine,
|
|
83
|
+
endLine,
|
|
84
|
+
sourceSpans: [getSpan(sourceFile, startOffset, endOffset)],
|
|
85
|
+
summary,
|
|
86
|
+
confidence,
|
|
87
|
+
confidencePct,
|
|
88
|
+
kernTokens,
|
|
89
|
+
tsTokens,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function serializeKernNode(node) {
|
|
93
|
+
const parts = [node.type];
|
|
94
|
+
if (node.props) {
|
|
95
|
+
for (const [k, v] of Object.entries(node.props)) {
|
|
96
|
+
if (typeof v === 'string')
|
|
97
|
+
parts.push(`${k}=${v}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (node.children) {
|
|
101
|
+
for (const child of node.children) {
|
|
102
|
+
parts.push(' ' + serializeKernNode(child));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return parts.join(' ');
|
|
106
|
+
}
|
|
107
|
+
// ── Phase 1: Type Aliases ────────────────────────────────────────────────
|
|
108
|
+
function inferTypes(sourceFile) {
|
|
109
|
+
const results = [];
|
|
110
|
+
for (const decl of sourceFile.getTypeAliases()) {
|
|
111
|
+
const name = decl.getName();
|
|
112
|
+
const typeNode = decl.getTypeNode();
|
|
113
|
+
if (!typeNode)
|
|
114
|
+
continue;
|
|
115
|
+
const text = typeNode.getText();
|
|
116
|
+
const startLine = decl.getStartLineNumber();
|
|
117
|
+
const endLine = decl.getEndLineNumber();
|
|
118
|
+
const originalText = decl.getText();
|
|
119
|
+
const startOffset = decl.getStart();
|
|
120
|
+
const endOffset = decl.getEnd();
|
|
121
|
+
// Union of string literals → type name=X values="a|b|c"
|
|
122
|
+
if (typeNode.getKind() === SyntaxKind.UnionType) {
|
|
123
|
+
const unionMembers = text.split('|').map(s => s.trim());
|
|
124
|
+
const allLiterals = unionMembers.every(m => m.startsWith("'") || m.startsWith('"'));
|
|
125
|
+
if (allLiterals) {
|
|
126
|
+
const values = unionMembers.map(m => m.replace(/['"]/g, '')).join('|');
|
|
127
|
+
const node = { type: 'type', props: { name, values } };
|
|
128
|
+
results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `type ${name} = ${values.split('|').map(v => `'${v}'`).join(' | ')}`, 'high', 98, originalText));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// Type alias union (non-literal)
|
|
132
|
+
const node = { type: 'type', props: { name, alias: text } };
|
|
133
|
+
results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `type ${name} = ${text}`, 'high', 95, originalText));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// Simple type alias
|
|
138
|
+
const node = { type: 'type', props: { name, alias: text } };
|
|
139
|
+
results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `type ${name} = ${text}`, 'high', 95, originalText));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return results;
|
|
143
|
+
}
|
|
144
|
+
// ── Phase 1: Interfaces ──────────────────────────────────────────────────
|
|
145
|
+
function inferInterfaces(sourceFile) {
|
|
146
|
+
const results = [];
|
|
147
|
+
for (const decl of sourceFile.getInterfaces()) {
|
|
148
|
+
const name = decl.getName();
|
|
149
|
+
const startLine = decl.getStartLineNumber();
|
|
150
|
+
const endLine = decl.getEndLineNumber();
|
|
151
|
+
const originalText = decl.getText();
|
|
152
|
+
const startOffset = decl.getStart();
|
|
153
|
+
const endOffset = decl.getEnd();
|
|
154
|
+
const extendsClause = decl.getExtends().map(e => e.getText()).join(', ') || undefined;
|
|
155
|
+
const children = [];
|
|
156
|
+
for (const prop of decl.getProperties()) {
|
|
157
|
+
const fieldName = prop.getName();
|
|
158
|
+
const fieldType = prop.getType().getText(prop);
|
|
159
|
+
const optional = prop.hasQuestionToken();
|
|
160
|
+
children.push({
|
|
161
|
+
type: 'field',
|
|
162
|
+
props: {
|
|
163
|
+
name: fieldName,
|
|
164
|
+
type: fieldType,
|
|
165
|
+
...(optional ? { optional: 'true' } : {}),
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
const node = {
|
|
170
|
+
type: 'interface',
|
|
171
|
+
props: {
|
|
172
|
+
name,
|
|
173
|
+
...(extendsClause ? { extends: extendsClause } : {}),
|
|
174
|
+
},
|
|
175
|
+
children,
|
|
176
|
+
};
|
|
177
|
+
results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `interface ${name} (${children.length} fields)`, 'high', 97, originalText));
|
|
178
|
+
}
|
|
179
|
+
return results;
|
|
180
|
+
}
|
|
181
|
+
// ── Phase 1: Functions ───────────────────────────────────────────────────
|
|
182
|
+
function inferFunctions(sourceFile) {
|
|
183
|
+
const inferResults = [];
|
|
184
|
+
for (const decl of sourceFile.getFunctions()) {
|
|
185
|
+
if (!decl.getName())
|
|
186
|
+
continue;
|
|
187
|
+
const name = decl.getName();
|
|
188
|
+
const startLine = decl.getStartLineNumber();
|
|
189
|
+
const endLine = decl.getEndLineNumber();
|
|
190
|
+
const originalText = decl.getText();
|
|
191
|
+
const startOffset = decl.getStart();
|
|
192
|
+
const endOffset = decl.getEnd();
|
|
193
|
+
const params = decl.getParameters()
|
|
194
|
+
.map(p => `${p.getName()}:${p.getType().getText(p)}`)
|
|
195
|
+
.join(',');
|
|
196
|
+
const returnType = decl.getReturnType().getText(decl);
|
|
197
|
+
const isAsync = decl.isAsync();
|
|
198
|
+
const isExported = decl.isExported();
|
|
199
|
+
const body = decl.getBody()?.getText() || '';
|
|
200
|
+
const node = {
|
|
201
|
+
type: 'fn',
|
|
202
|
+
props: {
|
|
203
|
+
name,
|
|
204
|
+
...(params ? { params } : {}),
|
|
205
|
+
...(returnType && returnType !== 'void' ? { returns: returnType } : {}),
|
|
206
|
+
...(isAsync ? { async: 'true' } : {}),
|
|
207
|
+
...(isExported ? {} : { export: 'false' }),
|
|
208
|
+
},
|
|
209
|
+
children: body ? [{ type: 'handler', props: { code: body.slice(1, -1).trim() } }] : [],
|
|
210
|
+
};
|
|
211
|
+
inferResults.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `fn ${name}(${params}) → ${returnType}`, 'high', 95, originalText));
|
|
212
|
+
}
|
|
213
|
+
return inferResults;
|
|
214
|
+
}
|
|
215
|
+
// ── Phase 1: Error Classes ───────────────────────────────────────────────
|
|
216
|
+
function inferErrors(sourceFile) {
|
|
217
|
+
const results = [];
|
|
218
|
+
for (const decl of sourceFile.getClasses()) {
|
|
219
|
+
const name = decl.getName();
|
|
220
|
+
if (!name)
|
|
221
|
+
continue;
|
|
222
|
+
// Check if extends Error (or any *Error class)
|
|
223
|
+
const extendsExpr = decl.getExtends();
|
|
224
|
+
if (!extendsExpr)
|
|
225
|
+
continue;
|
|
226
|
+
const baseClass = extendsExpr.getText();
|
|
227
|
+
if (!baseClass.includes('Error'))
|
|
228
|
+
continue;
|
|
229
|
+
const startLine = decl.getStartLineNumber();
|
|
230
|
+
const endLine = decl.getEndLineNumber();
|
|
231
|
+
const originalText = decl.getText();
|
|
232
|
+
const startOffset = decl.getStart();
|
|
233
|
+
const endOffset = decl.getEnd();
|
|
234
|
+
// Extract constructor fields
|
|
235
|
+
const children = [];
|
|
236
|
+
const ctor = decl.getConstructors()[0];
|
|
237
|
+
if (ctor) {
|
|
238
|
+
for (const param of ctor.getParameters()) {
|
|
239
|
+
const paramName = param.getName();
|
|
240
|
+
const paramType = param.getType().getText(param);
|
|
241
|
+
if (paramName === 'message' && paramType === 'string') {
|
|
242
|
+
children.push({ type: 'field', props: { name: 'message', type: 'string' } });
|
|
243
|
+
}
|
|
244
|
+
else if (param.isReadonly() || param.hasModifier(SyntaxKind.PublicKeyword)) {
|
|
245
|
+
children.push({ type: 'field', props: { name: paramName, type: paramType } });
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const node = {
|
|
250
|
+
type: 'error',
|
|
251
|
+
props: { name, extends: baseClass },
|
|
252
|
+
children,
|
|
253
|
+
};
|
|
254
|
+
results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `error ${name} extends ${baseClass}`, 'high', 96, originalText));
|
|
255
|
+
}
|
|
256
|
+
return results;
|
|
257
|
+
}
|
|
258
|
+
// ── Phase 1: Imports ─────────────────────────────────────────────────────
|
|
259
|
+
function inferImports(sourceFile) {
|
|
260
|
+
const results = [];
|
|
261
|
+
for (const decl of sourceFile.getImportDeclarations()) {
|
|
262
|
+
const from = decl.getModuleSpecifierValue();
|
|
263
|
+
const startLine = decl.getStartLineNumber();
|
|
264
|
+
const endLine = decl.getEndLineNumber();
|
|
265
|
+
const originalText = decl.getText();
|
|
266
|
+
const startOffset = decl.getStart();
|
|
267
|
+
const endOffset = decl.getEnd();
|
|
268
|
+
const defaultImport = decl.getDefaultImport()?.getText();
|
|
269
|
+
const namedImports = decl.getNamedImports().map(n => n.getName());
|
|
270
|
+
const isTypeOnly = decl.isTypeOnly();
|
|
271
|
+
const props = { from };
|
|
272
|
+
if (defaultImport)
|
|
273
|
+
props.default = defaultImport;
|
|
274
|
+
if (namedImports.length > 0)
|
|
275
|
+
props.names = namedImports.join(',');
|
|
276
|
+
if (isTypeOnly)
|
|
277
|
+
props.types = 'true';
|
|
278
|
+
const node = { type: 'import', props };
|
|
279
|
+
results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `import ${namedImports.length > 0 ? `{ ${namedImports.join(', ')} }` : defaultImport || '*'} from '${from}'`, 'high', 99, originalText));
|
|
280
|
+
}
|
|
281
|
+
return results;
|
|
282
|
+
}
|
|
283
|
+
// ── Phase 1: Const Declarations ──────────────────────────────────────────
|
|
284
|
+
function inferConsts(sourceFile) {
|
|
285
|
+
const results = [];
|
|
286
|
+
for (const stmt of sourceFile.getVariableStatements()) {
|
|
287
|
+
const isExported = stmt.isExported();
|
|
288
|
+
const startOffset = stmt.getStart();
|
|
289
|
+
const endOffset = stmt.getEnd();
|
|
290
|
+
for (const decl of stmt.getDeclarations()) {
|
|
291
|
+
const name = decl.getName();
|
|
292
|
+
const startLine = stmt.getStartLineNumber();
|
|
293
|
+
const endLine = stmt.getEndLineNumber();
|
|
294
|
+
const originalText = stmt.getText();
|
|
295
|
+
const typeNode = decl.getTypeNode();
|
|
296
|
+
const typeName = typeNode?.getText();
|
|
297
|
+
const initializer = decl.getInitializer()?.getText();
|
|
298
|
+
// Skip if it's a function expression or arrow function
|
|
299
|
+
if (initializer && (initializer.startsWith('(') ||
|
|
300
|
+
initializer.startsWith('function') ||
|
|
301
|
+
initializer.startsWith('async') ||
|
|
302
|
+
initializer.includes('=>'))) {
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
const props = { name };
|
|
306
|
+
if (typeName)
|
|
307
|
+
props.type = typeName;
|
|
308
|
+
if (initializer)
|
|
309
|
+
props.value = initializer;
|
|
310
|
+
if (!isExported)
|
|
311
|
+
props.export = 'false';
|
|
312
|
+
const node = { type: 'const', props };
|
|
313
|
+
results.push(makeResult(node, sourceFile, startOffset, endOffset, startLine, endLine, `const ${name}${typeName ? ': ' + typeName : ''} = ${initializer || '...'}`, 'high', 90, originalText));
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return results;
|
|
317
|
+
}
|
|
318
|
+
// ── Phase 2: Machine Detection ───────────────────────────────────────────
|
|
319
|
+
// Pattern: XState type + XStateError class + transition functions
|
|
320
|
+
function inferMachines(sourceFile, existing) {
|
|
321
|
+
const results = [];
|
|
322
|
+
const filePath = sourceFile.getFilePath() || 'input.ts';
|
|
323
|
+
// Look for *State type aliases that are string literal unions
|
|
324
|
+
const stateTypes = existing.filter(r => r.node.type === 'type' &&
|
|
325
|
+
r.node.props?.name &&
|
|
326
|
+
r.node.props.name.endsWith('State') &&
|
|
327
|
+
r.node.props.values);
|
|
328
|
+
for (const stateResult of stateTypes) {
|
|
329
|
+
const stateName = stateResult.node.props.name;
|
|
330
|
+
const baseName = stateName.replace(/State$/, '');
|
|
331
|
+
const values = stateResult.node.props.values.split('|');
|
|
332
|
+
// Check for matching XStateError class
|
|
333
|
+
const errorResult = existing.find(r => r.node.type === 'error' &&
|
|
334
|
+
r.node.props?.name === `${baseName}StateError`);
|
|
335
|
+
// Check for transition functions matching the pattern: verbBaseName
|
|
336
|
+
const transitionFns = existing.filter(r => r.node.type === 'fn' &&
|
|
337
|
+
r.node.props?.name &&
|
|
338
|
+
r.node.props.name.endsWith(baseName));
|
|
339
|
+
// Need at least the state type + 1 transition OR state type + error
|
|
340
|
+
if (!errorResult && transitionFns.length === 0)
|
|
341
|
+
continue;
|
|
342
|
+
const startLine = stateResult.startLine;
|
|
343
|
+
const endLine = Math.max(errorResult?.endLine || startLine, ...transitionFns.map(f => f.endLine));
|
|
344
|
+
// Build machine node
|
|
345
|
+
const children = [];
|
|
346
|
+
// States
|
|
347
|
+
for (let i = 0; i < values.length; i++) {
|
|
348
|
+
children.push({
|
|
349
|
+
type: 'state',
|
|
350
|
+
props: { name: values[i], ...(i === 0 ? { initial: 'true' } : {}) },
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
// Transitions (inferred from function names)
|
|
354
|
+
for (const fn of transitionFns) {
|
|
355
|
+
const fnName = fn.node.props.name;
|
|
356
|
+
const verb = fnName.replace(new RegExp(`${baseName}$`), '');
|
|
357
|
+
if (!verb)
|
|
358
|
+
continue;
|
|
359
|
+
children.push({
|
|
360
|
+
type: 'transition',
|
|
361
|
+
props: { name: verb },
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
const allOriginalText = [stateResult, errorResult, ...transitionFns]
|
|
365
|
+
.filter(Boolean)
|
|
366
|
+
.map(r => r.tsTokens)
|
|
367
|
+
.reduce((a, b) => a + b, 0);
|
|
368
|
+
const node = {
|
|
369
|
+
type: 'machine',
|
|
370
|
+
props: { name: baseName },
|
|
371
|
+
children,
|
|
372
|
+
};
|
|
373
|
+
// Collect sourceSpans from all component results
|
|
374
|
+
const componentSpans = [
|
|
375
|
+
...stateResult.sourceSpans,
|
|
376
|
+
...(errorResult?.sourceSpans || []),
|
|
377
|
+
...transitionFns.flatMap(fn => fn.sourceSpans),
|
|
378
|
+
];
|
|
379
|
+
const confidence = errorResult && transitionFns.length > 0 ? 90 : 75;
|
|
380
|
+
results.push({
|
|
381
|
+
node,
|
|
382
|
+
nodeId: `${filePath}#machine:${baseName}@L${startLine}`,
|
|
383
|
+
promptAlias: '', // assigned after sort
|
|
384
|
+
startLine,
|
|
385
|
+
endLine,
|
|
386
|
+
sourceSpans: componentSpans,
|
|
387
|
+
summary: `machine ${baseName} (${values.length} states, ${transitionFns.length} transitions)`,
|
|
388
|
+
confidence: confidence >= 85 ? 'high' : 'medium',
|
|
389
|
+
confidencePct: confidence,
|
|
390
|
+
kernTokens: countTokens(serializeKernNode(node)),
|
|
391
|
+
tsTokens: allOriginalText,
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
return results;
|
|
395
|
+
}
|
|
396
|
+
// ── Phase 2: Config Detection ────────────────────────────────────────────
|
|
397
|
+
// Pattern: XConfig interface + DEFAULT_X_CONFIG const
|
|
398
|
+
function inferConfigs(sourceFile, existing) {
|
|
399
|
+
const results = [];
|
|
400
|
+
const filePath = sourceFile.getFilePath() || 'input.ts';
|
|
401
|
+
const configInterfaces = existing.filter(r => r.node.type === 'interface' &&
|
|
402
|
+
r.node.props?.name &&
|
|
403
|
+
r.node.props.name.endsWith('Config'));
|
|
404
|
+
for (const ifaceResult of configInterfaces) {
|
|
405
|
+
const name = ifaceResult.node.props.name;
|
|
406
|
+
// Look for DEFAULT_X_CONFIG or DEFAULT_XCONFIG or defaultXConfig
|
|
407
|
+
const upperName = name.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase();
|
|
408
|
+
const defaultConst = existing.find(r => r.node.type === 'const' &&
|
|
409
|
+
r.node.props?.name &&
|
|
410
|
+
(r.node.props.name === `DEFAULT_${upperName}` ||
|
|
411
|
+
r.node.props.name.toUpperCase().includes(upperName)));
|
|
412
|
+
if (!defaultConst)
|
|
413
|
+
continue;
|
|
414
|
+
const startLine = Math.min(ifaceResult.startLine, defaultConst.startLine);
|
|
415
|
+
const endLine = Math.max(ifaceResult.endLine, defaultConst.endLine);
|
|
416
|
+
// Build config node from interface fields
|
|
417
|
+
const children = (ifaceResult.node.children || []).map(field => {
|
|
418
|
+
return { ...field };
|
|
419
|
+
});
|
|
420
|
+
const node = {
|
|
421
|
+
type: 'config',
|
|
422
|
+
props: { name },
|
|
423
|
+
children,
|
|
424
|
+
};
|
|
425
|
+
const componentSpans = [
|
|
426
|
+
...ifaceResult.sourceSpans,
|
|
427
|
+
...defaultConst.sourceSpans,
|
|
428
|
+
];
|
|
429
|
+
results.push({
|
|
430
|
+
node,
|
|
431
|
+
nodeId: `${filePath}#config:${name}@L${startLine}`,
|
|
432
|
+
promptAlias: '',
|
|
433
|
+
startLine,
|
|
434
|
+
endLine,
|
|
435
|
+
sourceSpans: componentSpans,
|
|
436
|
+
summary: `config ${name} (${children.length} fields + defaults)`,
|
|
437
|
+
confidence: 'medium',
|
|
438
|
+
confidencePct: 85,
|
|
439
|
+
kernTokens: countTokens(serializeKernNode(node)),
|
|
440
|
+
tsTokens: ifaceResult.tsTokens + defaultConst.tsTokens,
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
return results;
|
|
444
|
+
}
|
|
445
|
+
// ── Phase 2: Event Detection ─────────────────────────────────────────────
|
|
446
|
+
// Pattern: XEventType union + XEvent interface + XEventMap
|
|
447
|
+
function inferEvents(sourceFile, existing) {
|
|
448
|
+
const results = [];
|
|
449
|
+
const filePath = sourceFile.getFilePath() || 'input.ts';
|
|
450
|
+
// Find *EventType type aliases
|
|
451
|
+
const eventTypes = existing.filter(r => r.node.type === 'type' &&
|
|
452
|
+
r.node.props?.name &&
|
|
453
|
+
r.node.props.name.endsWith('EventType') &&
|
|
454
|
+
r.node.props.values);
|
|
455
|
+
for (const eventTypeResult of eventTypes) {
|
|
456
|
+
const typeName = eventTypeResult.node.props.name;
|
|
457
|
+
const baseName = typeName.replace(/Type$/, '');
|
|
458
|
+
// Look for matching XEvent interface
|
|
459
|
+
const eventInterface = existing.find(r => r.node.type === 'interface' &&
|
|
460
|
+
r.node.props?.name === baseName);
|
|
461
|
+
// Look for matching XEventMap interface
|
|
462
|
+
const eventMap = existing.find(r => r.node.type === 'interface' &&
|
|
463
|
+
r.node.props?.name === `${baseName}Map`);
|
|
464
|
+
if (!eventInterface)
|
|
465
|
+
continue;
|
|
466
|
+
const startLine = Math.min(eventTypeResult.startLine, eventInterface.startLine);
|
|
467
|
+
const endLine = Math.max(eventTypeResult.endLine, eventInterface.endLine, eventMap?.endLine || 0);
|
|
468
|
+
const values = eventTypeResult.node.props.values.split('|');
|
|
469
|
+
const children = values.map(v => ({
|
|
470
|
+
type: 'type',
|
|
471
|
+
props: { name: v, value: v },
|
|
472
|
+
}));
|
|
473
|
+
const node = {
|
|
474
|
+
type: 'event',
|
|
475
|
+
props: { name: baseName },
|
|
476
|
+
children,
|
|
477
|
+
};
|
|
478
|
+
const componentSpans = [
|
|
479
|
+
...eventTypeResult.sourceSpans,
|
|
480
|
+
...eventInterface.sourceSpans,
|
|
481
|
+
...(eventMap?.sourceSpans || []),
|
|
482
|
+
];
|
|
483
|
+
const totalTokens = eventTypeResult.tsTokens +
|
|
484
|
+
eventInterface.tsTokens +
|
|
485
|
+
(eventMap?.tsTokens || 0);
|
|
486
|
+
results.push({
|
|
487
|
+
node,
|
|
488
|
+
nodeId: `${filePath}#event:${baseName}@L${startLine}`,
|
|
489
|
+
promptAlias: '',
|
|
490
|
+
startLine,
|
|
491
|
+
endLine,
|
|
492
|
+
sourceSpans: componentSpans,
|
|
493
|
+
summary: `event ${baseName} (${values.length} types)`,
|
|
494
|
+
confidence: eventMap ? 'high' : 'medium',
|
|
495
|
+
confidencePct: eventMap ? 88 : 75,
|
|
496
|
+
kernTokens: countTokens(serializeKernNode(node)),
|
|
497
|
+
tsTokens: totalTokens,
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
return results;
|
|
501
|
+
}
|
|
502
|
+
//# sourceMappingURL=inferrer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inferrer.js","sourceRoot":"","sources":["../src/inferrer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Review — structured prompt builder and response parser.
|
|
3
|
+
*
|
|
4
|
+
* Builds a KERN IR prompt with short aliases (N1, N2, ...) for LLM review.
|
|
5
|
+
* Parses strict JSON schema responses, validates nodeIds, rejects unknowns.
|
|
6
|
+
*
|
|
7
|
+
* Phase 4 of the review pipeline.
|
|
8
|
+
*/
|
|
9
|
+
import type { InferResult, TemplateMatch, ReviewFinding } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Export KERN IR with prompt aliases for AI review.
|
|
12
|
+
* v2: Includes nodeId aliases and handler bodies.
|
|
13
|
+
*/
|
|
14
|
+
export declare function exportKernIR(inferred: InferResult[], templateMatches: TemplateMatch[]): string;
|
|
15
|
+
/**
|
|
16
|
+
* Build a structured prompt with short aliases for LLM code review.
|
|
17
|
+
* Handler bodies are included so the LLM can review actual logic.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildLLMPrompt(inferred: InferResult[], templateMatches: TemplateMatch[]): string;
|
|
20
|
+
/**
|
|
21
|
+
* Parse strict JSON response from LLM, validate nodeIds, reject unknowns.
|
|
22
|
+
* Returns unified ReviewFinding[] mapped back to TS source spans.
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseLLMResponse(response: string, inferred: InferResult[]): ReviewFinding[];
|