@kernlang/evolve 3.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/concept-gap-adapter.d.ts +17 -0
- package/dist/concept-gap-adapter.js +43 -0
- package/dist/concept-gap-adapter.js.map +1 -0
- package/dist/detector-registry.d.ts +31 -0
- package/dist/detector-registry.js +89 -0
- package/dist/detector-registry.js.map +1 -0
- package/dist/detectors/animation.d.ts +5 -0
- package/dist/detectors/animation.js +67 -0
- package/dist/detectors/animation.js.map +1 -0
- package/dist/detectors/data-fetching.d.ts +5 -0
- package/dist/detectors/data-fetching.js +117 -0
- package/dist/detectors/data-fetching.js.map +1 -0
- package/dist/detectors/express-middleware.d.ts +5 -0
- package/dist/detectors/express-middleware.js +52 -0
- package/dist/detectors/express-middleware.js.map +1 -0
- package/dist/detectors/react-forms.d.ts +5 -0
- package/dist/detectors/react-forms.js +89 -0
- package/dist/detectors/react-forms.js.map +1 -0
- package/dist/detectors/schema-validation.d.ts +5 -0
- package/dist/detectors/schema-validation.js +92 -0
- package/dist/detectors/schema-validation.js.map +1 -0
- package/dist/detectors/state-mgmt.d.ts +5 -0
- package/dist/detectors/state-mgmt.js +102 -0
- package/dist/detectors/state-mgmt.js.map +1 -0
- package/dist/detectors/structural.d.ts +10 -0
- package/dist/detectors/structural.js +271 -0
- package/dist/detectors/structural.js.map +1 -0
- package/dist/detectors/testing.d.ts +5 -0
- package/dist/detectors/testing.js +56 -0
- package/dist/detectors/testing.js.map +1 -0
- package/dist/detectors/vue-composables.d.ts +5 -0
- package/dist/detectors/vue-composables.js +57 -0
- package/dist/detectors/vue-composables.js.map +1 -0
- package/dist/evolve-dedup.d.ts +12 -0
- package/dist/evolve-dedup.js +50 -0
- package/dist/evolve-dedup.js.map +1 -0
- package/dist/evolve-rollback.d.ts +58 -0
- package/dist/evolve-rollback.js +242 -0
- package/dist/evolve-rollback.js.map +1 -0
- package/dist/evolve-runner.d.ts +22 -0
- package/dist/evolve-runner.js +183 -0
- package/dist/evolve-runner.js.map +1 -0
- package/dist/evolve-validator-v4.d.ts +11 -0
- package/dist/evolve-validator-v4.js +253 -0
- package/dist/evolve-validator-v4.js.map +1 -0
- package/dist/evolved-node-loader.d.ts +61 -0
- package/dist/evolved-node-loader.js +228 -0
- package/dist/evolved-node-loader.js.map +1 -0
- package/dist/evolved-types.d.ts +110 -0
- package/dist/evolved-types.js +8 -0
- package/dist/evolved-types.js.map +1 -0
- package/dist/expressibility-scorer.d.ts +19 -0
- package/dist/expressibility-scorer.js +78 -0
- package/dist/expressibility-scorer.js.map +1 -0
- package/dist/gap-detector.d.ts +26 -0
- package/dist/gap-detector.js +141 -0
- package/dist/gap-detector.js.map +1 -0
- package/dist/golden-test-runner.d.ts +27 -0
- package/dist/golden-test-runner.js +120 -0
- package/dist/golden-test-runner.js.map +1 -0
- package/dist/graduation.d.ts +36 -0
- package/dist/graduation.js +175 -0
- package/dist/graduation.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-discovery.d.ts +55 -0
- package/dist/llm-discovery.js +352 -0
- package/dist/llm-discovery.js.map +1 -0
- package/dist/llm-provider.d.ts +35 -0
- package/dist/llm-provider.js +143 -0
- package/dist/llm-provider.js.map +1 -0
- package/dist/node-governance.d.ts +23 -0
- package/dist/node-governance.js +45 -0
- package/dist/node-governance.js.map +1 -0
- package/dist/node-proposer.d.ts +27 -0
- package/dist/node-proposer.js +127 -0
- package/dist/node-proposer.js.map +1 -0
- package/dist/node-validator.d.ts +16 -0
- package/dist/node-validator.js +74 -0
- package/dist/node-validator.js.map +1 -0
- package/dist/pattern-analyzer.d.ts +28 -0
- package/dist/pattern-analyzer.js +181 -0
- package/dist/pattern-analyzer.js.map +1 -0
- package/dist/quality-scorer.d.ts +16 -0
- package/dist/quality-scorer.js +79 -0
- package/dist/quality-scorer.js.map +1 -0
- package/dist/sandboxed-generator.d.ts +26 -0
- package/dist/sandboxed-generator.js +133 -0
- package/dist/sandboxed-generator.js.map +1 -0
- package/dist/staging.d.ts +81 -0
- package/dist/staging.js +414 -0
- package/dist/staging.js.map +1 -0
- package/dist/template-proposer.d.ts +24 -0
- package/dist/template-proposer.js +103 -0
- package/dist/template-proposer.js.map +1 -0
- package/dist/template-validator.d.ts +18 -0
- package/dist/template-validator.js +174 -0
- package/dist/template-validator.js.map +1 -0
- package/dist/types.d.ts +169 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +27 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evolve v4 Validation Pipeline — 9-step validation for node proposals.
|
|
3
|
+
*
|
|
4
|
+
* Steps: schema → keyword → parse → codegen compile → codegen run →
|
|
5
|
+
* typescript check → golden diff → dedup → (LLM retry on failure)
|
|
6
|
+
*/
|
|
7
|
+
import { parse } from '@kernlang/core';
|
|
8
|
+
import { KERN_RESERVED, registerParserHints, unregisterParserHints } from '@kernlang/core';
|
|
9
|
+
import { ts } from 'ts-morph';
|
|
10
|
+
import { compileSandboxedGenerator } from './sandboxed-generator.js';
|
|
11
|
+
import { checkDedup } from './evolve-dedup.js';
|
|
12
|
+
import { compareGoldenOutput } from './golden-test-runner.js';
|
|
13
|
+
/**
|
|
14
|
+
* Run the full 9-step validation pipeline on a node proposal.
|
|
15
|
+
*/
|
|
16
|
+
export function validateEvolveProposal(proposal, existingKeywords) {
|
|
17
|
+
const result = {
|
|
18
|
+
schemaOk: false,
|
|
19
|
+
keywordOk: false,
|
|
20
|
+
parseOk: false,
|
|
21
|
+
codegenCompileOk: false,
|
|
22
|
+
codegenRunOk: false,
|
|
23
|
+
typescriptOk: false,
|
|
24
|
+
goldenDiffOk: false,
|
|
25
|
+
dedupOk: false,
|
|
26
|
+
errors: [],
|
|
27
|
+
retryCount: 0,
|
|
28
|
+
};
|
|
29
|
+
// Step 1: Schema check
|
|
30
|
+
result.schemaOk = validateSchema(proposal, result.errors);
|
|
31
|
+
if (!result.schemaOk)
|
|
32
|
+
return result;
|
|
33
|
+
// Step 2: Keyword check
|
|
34
|
+
result.keywordOk = validateKeyword(proposal.keyword, result.errors, existingKeywords);
|
|
35
|
+
if (!result.keywordOk)
|
|
36
|
+
return result;
|
|
37
|
+
// Step 3: Parse check
|
|
38
|
+
result.parseOk = validateParse(proposal, result.errors);
|
|
39
|
+
// Step 4: Codegen compile
|
|
40
|
+
let generator = null;
|
|
41
|
+
try {
|
|
42
|
+
generator = compileSandboxedGenerator(wrapAsCommonJS(proposal.codegenSource));
|
|
43
|
+
result.codegenCompileOk = true;
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
result.errors.push(`Codegen compile failed: ${err.message}`);
|
|
47
|
+
result.codegenCompileOk = false;
|
|
48
|
+
}
|
|
49
|
+
// Step 5: Codegen dry-run
|
|
50
|
+
if (generator && result.parseOk) {
|
|
51
|
+
result.codegenRunOk = validateCodegenRun(proposal, generator, result.errors);
|
|
52
|
+
}
|
|
53
|
+
// Step 6: TypeScript syntax check
|
|
54
|
+
if (result.codegenRunOk && generator) {
|
|
55
|
+
result.typescriptOk = validateTypeScript(proposal, generator, result.errors);
|
|
56
|
+
}
|
|
57
|
+
// Step 7: Golden diff
|
|
58
|
+
if (result.codegenRunOk && generator) {
|
|
59
|
+
result.goldenDiffOk = validateGoldenDiff(proposal, generator, result.errors);
|
|
60
|
+
}
|
|
61
|
+
// Step 8: Dedup check
|
|
62
|
+
result.dedupOk = checkDedup(proposal, existingKeywords || []);
|
|
63
|
+
if (!result.dedupOk) {
|
|
64
|
+
result.errors.push(`Duplicate: keyword '${proposal.keyword}' is too similar to an existing node`);
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
// ── Step implementations ─────────────────────────────────────────────────
|
|
69
|
+
function validateSchema(proposal, errors) {
|
|
70
|
+
if (!proposal.keyword || typeof proposal.keyword !== 'string') {
|
|
71
|
+
errors.push('Missing or invalid keyword');
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
if (!/^[a-z][a-z0-9-]*$/.test(proposal.keyword)) {
|
|
75
|
+
errors.push(`Keyword '${proposal.keyword}' must be lowercase alphanumeric with hyphens`);
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
if (!proposal.kernExample || typeof proposal.kernExample !== 'string') {
|
|
79
|
+
errors.push('Missing kernExample');
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
if (!proposal.codegenSource || typeof proposal.codegenSource !== 'string') {
|
|
83
|
+
errors.push('Missing codegenSource');
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
if (!proposal.expectedOutput || typeof proposal.expectedOutput !== 'string') {
|
|
87
|
+
errors.push('Missing expectedOutput');
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
if (!proposal.reason || typeof proposal.reason.observation !== 'string') {
|
|
91
|
+
errors.push('Missing or invalid reason');
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
if (!Array.isArray(proposal.props)) {
|
|
95
|
+
errors.push('Missing props array');
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
function validateKeyword(keyword, errors, existing) {
|
|
101
|
+
if (KERN_RESERVED.has(keyword)) {
|
|
102
|
+
errors.push(`Keyword '${keyword}' is a reserved KERN core type`);
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
if (existing?.includes(keyword)) {
|
|
106
|
+
errors.push(`Keyword '${keyword}' is already graduated`);
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
function validateParse(proposal, errors) {
|
|
112
|
+
// Temporarily register parser hints if provided
|
|
113
|
+
if (proposal.parserHints) {
|
|
114
|
+
registerParserHints(proposal.keyword, proposal.parserHints);
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
const ast = parse(proposal.kernExample);
|
|
118
|
+
if (!ast || !ast.type) {
|
|
119
|
+
errors.push('kernExample parsed to empty AST');
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
// Root node should match the proposed keyword
|
|
123
|
+
if (ast.type !== proposal.keyword) {
|
|
124
|
+
errors.push(`kernExample root type '${ast.type}' does not match keyword '${proposal.keyword}'`);
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
errors.push(`Parse failed: ${err.message}`);
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
if (proposal.parserHints) {
|
|
135
|
+
unregisterParserHints(proposal.keyword);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function validateCodegenRun(proposal, generator, errors) {
|
|
140
|
+
if (proposal.parserHints) {
|
|
141
|
+
registerParserHints(proposal.keyword, proposal.parserHints);
|
|
142
|
+
}
|
|
143
|
+
try {
|
|
144
|
+
const ast = parse(proposal.kernExample);
|
|
145
|
+
const output = generator(ast);
|
|
146
|
+
if (!Array.isArray(output) || output.length === 0) {
|
|
147
|
+
errors.push('Codegen produced empty output');
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
errors.push(`Codegen run failed: ${err.message}`);
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
if (proposal.parserHints) {
|
|
158
|
+
unregisterParserHints(proposal.keyword);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function validateTypeScript(proposal, generator, errors) {
|
|
163
|
+
if (proposal.parserHints) {
|
|
164
|
+
registerParserHints(proposal.keyword, proposal.parserHints);
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
const ast = parse(proposal.kernExample);
|
|
168
|
+
const output = generator(ast).join('\n');
|
|
169
|
+
// Real TypeScript syntax validation via ts.transpileModule
|
|
170
|
+
// Enable JSX since KERN generates React/JSX output for frontend targets
|
|
171
|
+
const result = ts.transpileModule(output, {
|
|
172
|
+
compilerOptions: {
|
|
173
|
+
target: ts.ScriptTarget.ES2022,
|
|
174
|
+
module: ts.ModuleKind.ES2022,
|
|
175
|
+
jsx: ts.JsxEmit.ReactJSX,
|
|
176
|
+
strict: false,
|
|
177
|
+
noEmit: false,
|
|
178
|
+
skipLibCheck: true,
|
|
179
|
+
},
|
|
180
|
+
reportDiagnostics: true,
|
|
181
|
+
fileName: 'evolved-output.tsx',
|
|
182
|
+
});
|
|
183
|
+
const diagnostics = result.diagnostics || [];
|
|
184
|
+
// Only fail on syntax errors (category 1 = Error), not semantic warnings
|
|
185
|
+
const syntaxErrors = diagnostics.filter(d => d.category === ts.DiagnosticCategory.Error);
|
|
186
|
+
if (syntaxErrors.length > 0) {
|
|
187
|
+
for (const d of syntaxErrors.slice(0, 3)) {
|
|
188
|
+
const msg = ts.flattenDiagnosticMessageText(d.messageText, '\n');
|
|
189
|
+
errors.push(`TypeScript syntax error: ${msg}`);
|
|
190
|
+
}
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
errors.push(`TypeScript check failed: ${err.message}`);
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
if (proposal.parserHints) {
|
|
201
|
+
unregisterParserHints(proposal.keyword);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function validateGoldenDiff(proposal, generator, errors) {
|
|
206
|
+
if (proposal.parserHints) {
|
|
207
|
+
registerParserHints(proposal.keyword, proposal.parserHints);
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const ast = parse(proposal.kernExample);
|
|
211
|
+
const actual = generator(ast).join('\n');
|
|
212
|
+
const match = compareGoldenOutput(actual, proposal.expectedOutput);
|
|
213
|
+
if (!match) {
|
|
214
|
+
errors.push('Golden diff mismatch: codegen output differs from expectedOutput');
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
errors.push(`Golden diff failed: ${err.message}`);
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
if (proposal.parserHints) {
|
|
225
|
+
unregisterParserHints(proposal.keyword);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Wrap raw generator source as CommonJS for the sandbox.
|
|
231
|
+
* Handles both "export default function..." and plain "function generate..." patterns.
|
|
232
|
+
*/
|
|
233
|
+
function wrapAsCommonJS(source) {
|
|
234
|
+
// Already CommonJS
|
|
235
|
+
if (source.includes('module.exports'))
|
|
236
|
+
return source;
|
|
237
|
+
// ES module: export default function(node, helpers) { ... }
|
|
238
|
+
let wrapped = source
|
|
239
|
+
.replace(/^export\s+default\s+/m, 'module.exports = ')
|
|
240
|
+
.replace(/^export\s+function\s+(\w+)/m, 'module.exports = function $1');
|
|
241
|
+
// If still no module.exports, wrap the whole thing
|
|
242
|
+
if (!wrapped.includes('module.exports')) {
|
|
243
|
+
wrapped = `module.exports = ${wrapped}`;
|
|
244
|
+
}
|
|
245
|
+
// Strip TypeScript type annotations for the sandbox (runs as JS)
|
|
246
|
+
wrapped = wrapped
|
|
247
|
+
.replace(/:\s*IRNode/g, '')
|
|
248
|
+
.replace(/:\s*string\[\]/g, '')
|
|
249
|
+
.replace(/:\s*CodegenHelpers/g, '')
|
|
250
|
+
.replace(/import\s+.*?from\s+['"].*?['"];?\n?/g, '');
|
|
251
|
+
return wrapped;
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=evolve-validator-v4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evolve-validator-v4.js","sourceRoot":"","sources":["../src/evolve-validator-v4.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evolved Node Loader — reads .kern/evolved/ at startup, registers types + generators.
|
|
3
|
+
*
|
|
4
|
+
* Called once before any parsing/codegen. Makes graduated nodes available
|
|
5
|
+
* to the parser (via dynamic types + hints) and codegen (via generator map).
|
|
6
|
+
*/
|
|
7
|
+
import type { IRNode } from '@kernlang/core';
|
|
8
|
+
import type { EvolvedManifest, EvolvedNodeDefinition, ParserHints } from './evolved-types.js';
|
|
9
|
+
/** Get the generator for an evolved node type. */
|
|
10
|
+
export declare function getEvolvedGenerator(type: string): ((node: IRNode) => string[]) | undefined;
|
|
11
|
+
/** Get parser hints for an evolved node type. */
|
|
12
|
+
export declare function getParserHints(type: string): ParserHints | undefined;
|
|
13
|
+
/** Check if any evolved nodes are loaded. */
|
|
14
|
+
export declare function hasEvolvedNodes(): boolean;
|
|
15
|
+
/** Get count of loaded evolved nodes. */
|
|
16
|
+
export declare function evolvedNodeCount(): number;
|
|
17
|
+
/** Get all evolved keywords. */
|
|
18
|
+
export declare function getEvolvedKeywords(): string[];
|
|
19
|
+
/** Clear all loaded evolved nodes (for test isolation). */
|
|
20
|
+
export declare function clearEvolvedNodes(): void;
|
|
21
|
+
export interface LoadResult {
|
|
22
|
+
loaded: number;
|
|
23
|
+
errors: Array<{
|
|
24
|
+
keyword: string;
|
|
25
|
+
error: string;
|
|
26
|
+
}>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Load all evolved nodes from .kern/evolved/ directory.
|
|
30
|
+
*
|
|
31
|
+
* Reads the manifest, verifies hashes, loads sandboxed generators,
|
|
32
|
+
* registers types in spec.ts's dynamic set, and stores parser hints.
|
|
33
|
+
*
|
|
34
|
+
* @param baseDir — project root (defaults to cwd)
|
|
35
|
+
* @param verify — check SHA256 hashes (recommended for CI)
|
|
36
|
+
*/
|
|
37
|
+
export declare function loadEvolvedNodes(baseDir?: string, verify?: boolean): LoadResult;
|
|
38
|
+
/**
|
|
39
|
+
* Read the manifest without loading generators (for listing/inspection).
|
|
40
|
+
*/
|
|
41
|
+
export declare function readManifest(baseDir?: string): EvolvedManifest | null;
|
|
42
|
+
/**
|
|
43
|
+
* Read a single node's full definition.
|
|
44
|
+
*/
|
|
45
|
+
export declare function readNodeDefinition(keyword: string, baseDir?: string): EvolvedNodeDefinition | null;
|
|
46
|
+
export interface RebuildResult {
|
|
47
|
+
rebuilt: number;
|
|
48
|
+
errors: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Rebuild manifest.json from disk by scanning .kern/evolved/ subdirectories.
|
|
52
|
+
*
|
|
53
|
+
* Reads each subdirectory's definition.json, extracts manifest-level fields,
|
|
54
|
+
* and writes a fresh manifest.json. Skips .trash/ and any directory missing
|
|
55
|
+
* a valid definition.json.
|
|
56
|
+
*
|
|
57
|
+
* Use when the manifest is out of sync, corrupted, or missing.
|
|
58
|
+
*
|
|
59
|
+
* @param baseDir — project root (defaults to cwd)
|
|
60
|
+
*/
|
|
61
|
+
export declare function rebuildManifest(baseDir?: string): RebuildResult;
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evolved Node Loader — reads .kern/evolved/ at startup, registers types + generators.
|
|
3
|
+
*
|
|
4
|
+
* Called once before any parsing/codegen. Makes graduated nodes available
|
|
5
|
+
* to the parser (via dynamic types + hints) and codegen (via generator map).
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync, statSync } from 'fs';
|
|
8
|
+
import { resolve, join } from 'path';
|
|
9
|
+
import { createHash } from 'crypto';
|
|
10
|
+
import { registerEvolvedType, registerEvolvedGenerator as registerCoreEvolvedGenerator, registerEvolvedTargetGenerator, KERN_RESERVED } from '@kernlang/core';
|
|
11
|
+
import { loadSandboxedGenerator } from './sandboxed-generator.js';
|
|
12
|
+
// ── Runtime registries (populated at startup) ────────────────────────────
|
|
13
|
+
const _evolvedGenerators = new Map();
|
|
14
|
+
const _parserHints = new Map();
|
|
15
|
+
let _loaded = false;
|
|
16
|
+
/** Get the generator for an evolved node type. */
|
|
17
|
+
export function getEvolvedGenerator(type) {
|
|
18
|
+
return _evolvedGenerators.get(type);
|
|
19
|
+
}
|
|
20
|
+
/** Get parser hints for an evolved node type. */
|
|
21
|
+
export function getParserHints(type) {
|
|
22
|
+
return _parserHints.get(type);
|
|
23
|
+
}
|
|
24
|
+
/** Check if any evolved nodes are loaded. */
|
|
25
|
+
export function hasEvolvedNodes() {
|
|
26
|
+
return _evolvedGenerators.size > 0;
|
|
27
|
+
}
|
|
28
|
+
/** Get count of loaded evolved nodes. */
|
|
29
|
+
export function evolvedNodeCount() {
|
|
30
|
+
return _evolvedGenerators.size;
|
|
31
|
+
}
|
|
32
|
+
/** Get all evolved keywords. */
|
|
33
|
+
export function getEvolvedKeywords() {
|
|
34
|
+
return Array.from(_evolvedGenerators.keys());
|
|
35
|
+
}
|
|
36
|
+
/** Clear all loaded evolved nodes (for test isolation). */
|
|
37
|
+
export function clearEvolvedNodes() {
|
|
38
|
+
_evolvedGenerators.clear();
|
|
39
|
+
_parserHints.clear();
|
|
40
|
+
_loaded = false;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Load all evolved nodes from .kern/evolved/ directory.
|
|
44
|
+
*
|
|
45
|
+
* Reads the manifest, verifies hashes, loads sandboxed generators,
|
|
46
|
+
* registers types in spec.ts's dynamic set, and stores parser hints.
|
|
47
|
+
*
|
|
48
|
+
* @param baseDir — project root (defaults to cwd)
|
|
49
|
+
* @param verify — check SHA256 hashes (recommended for CI)
|
|
50
|
+
*/
|
|
51
|
+
export function loadEvolvedNodes(baseDir = process.cwd(), verify = false) {
|
|
52
|
+
if (_loaded)
|
|
53
|
+
return { loaded: _evolvedGenerators.size, errors: [] };
|
|
54
|
+
const evolvedDir = resolve(baseDir, '.kern', 'evolved');
|
|
55
|
+
const manifestPath = join(evolvedDir, 'manifest.json');
|
|
56
|
+
if (!existsSync(manifestPath)) {
|
|
57
|
+
_loaded = true;
|
|
58
|
+
return { loaded: 0, errors: [] };
|
|
59
|
+
}
|
|
60
|
+
let manifest;
|
|
61
|
+
try {
|
|
62
|
+
manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
_loaded = true;
|
|
66
|
+
return { loaded: 0, errors: [{ keyword: '*', error: 'Failed to parse manifest.json' }] };
|
|
67
|
+
}
|
|
68
|
+
const errors = [];
|
|
69
|
+
let loaded = 0;
|
|
70
|
+
for (const [keyword, entry] of Object.entries(manifest.nodes)) {
|
|
71
|
+
try {
|
|
72
|
+
loadSingleNode(evolvedDir, keyword, entry, verify);
|
|
73
|
+
loaded++;
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
errors.push({ keyword, error: err.message });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
_loaded = true;
|
|
80
|
+
return { loaded, errors };
|
|
81
|
+
}
|
|
82
|
+
function loadSingleNode(evolvedDir, keyword, entry, verify) {
|
|
83
|
+
// Safety: cannot shadow core types
|
|
84
|
+
if (KERN_RESERVED.has(keyword)) {
|
|
85
|
+
throw new Error(`Evolved keyword '${keyword}' conflicts with core KERN type`);
|
|
86
|
+
}
|
|
87
|
+
const nodeDir = join(evolvedDir, keyword);
|
|
88
|
+
const codegenPath = join(nodeDir, 'codegen.js');
|
|
89
|
+
if (!existsSync(codegenPath)) {
|
|
90
|
+
throw new Error(`Missing codegen.js for evolved node '${keyword}'`);
|
|
91
|
+
}
|
|
92
|
+
// Hash verification
|
|
93
|
+
if (verify) {
|
|
94
|
+
const content = readFileSync(codegenPath, 'utf-8');
|
|
95
|
+
const hash = 'sha256:' + createHash('sha256').update(content).digest('hex');
|
|
96
|
+
if (hash !== entry.hash) {
|
|
97
|
+
throw new Error(`Hash mismatch for '${keyword}': expected ${entry.hash}, got ${hash}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Load sandboxed generator
|
|
101
|
+
const generator = loadSandboxedGenerator(codegenPath);
|
|
102
|
+
_evolvedGenerators.set(keyword, generator);
|
|
103
|
+
// Also register in codegen-core so generateCoreNode() can dispatch
|
|
104
|
+
registerCoreEvolvedGenerator(keyword, generator);
|
|
105
|
+
// Register type in spec
|
|
106
|
+
registerEvolvedType(keyword);
|
|
107
|
+
for (const child of entry.childTypes || []) {
|
|
108
|
+
registerEvolvedType(child);
|
|
109
|
+
}
|
|
110
|
+
// Store parser hints
|
|
111
|
+
if (entry.parserHints) {
|
|
112
|
+
_parserHints.set(keyword, entry.parserHints);
|
|
113
|
+
}
|
|
114
|
+
// Load target-specific overrides from targets/ directory
|
|
115
|
+
const targetsDir = join(nodeDir, 'targets');
|
|
116
|
+
if (existsSync(targetsDir)) {
|
|
117
|
+
try {
|
|
118
|
+
for (const file of readdirSync(targetsDir)) {
|
|
119
|
+
if (!file.endsWith('.js'))
|
|
120
|
+
continue;
|
|
121
|
+
const targetName = file.replace(/\.js$/, '');
|
|
122
|
+
const targetPath = join(targetsDir, file);
|
|
123
|
+
const targetGenerator = loadSandboxedGenerator(targetPath);
|
|
124
|
+
registerEvolvedTargetGenerator(keyword, targetName, targetGenerator);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch { // file may not exist
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Read the manifest without loading generators (for listing/inspection).
|
|
133
|
+
*/
|
|
134
|
+
export function readManifest(baseDir = process.cwd()) {
|
|
135
|
+
const manifestPath = resolve(baseDir, '.kern', 'evolved', 'manifest.json');
|
|
136
|
+
if (!existsSync(manifestPath))
|
|
137
|
+
return null;
|
|
138
|
+
try {
|
|
139
|
+
return JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Read a single node's full definition.
|
|
147
|
+
*/
|
|
148
|
+
export function readNodeDefinition(keyword, baseDir = process.cwd()) {
|
|
149
|
+
const defPath = resolve(baseDir, '.kern', 'evolved', keyword, 'definition.json');
|
|
150
|
+
if (!existsSync(defPath))
|
|
151
|
+
return null;
|
|
152
|
+
try {
|
|
153
|
+
return JSON.parse(readFileSync(defPath, 'utf-8'));
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Rebuild manifest.json from disk by scanning .kern/evolved/ subdirectories.
|
|
161
|
+
*
|
|
162
|
+
* Reads each subdirectory's definition.json, extracts manifest-level fields,
|
|
163
|
+
* and writes a fresh manifest.json. Skips .trash/ and any directory missing
|
|
164
|
+
* a valid definition.json.
|
|
165
|
+
*
|
|
166
|
+
* Use when the manifest is out of sync, corrupted, or missing.
|
|
167
|
+
*
|
|
168
|
+
* @param baseDir — project root (defaults to cwd)
|
|
169
|
+
*/
|
|
170
|
+
export function rebuildManifest(baseDir = process.cwd()) {
|
|
171
|
+
const evolvedDir = resolve(baseDir, '.kern', 'evolved');
|
|
172
|
+
const errors = [];
|
|
173
|
+
if (!existsSync(evolvedDir)) {
|
|
174
|
+
return { rebuilt: 0, errors: ['No .kern/evolved/ directory found'] };
|
|
175
|
+
}
|
|
176
|
+
const entries = readdirSync(evolvedDir);
|
|
177
|
+
const nodes = {};
|
|
178
|
+
let rebuilt = 0;
|
|
179
|
+
for (const entry of entries) {
|
|
180
|
+
// Skip manifest.json itself, .trash, and hidden dirs
|
|
181
|
+
if (entry === 'manifest.json' || entry === '.trash' || entry.startsWith('.')) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const entryPath = join(evolvedDir, entry);
|
|
185
|
+
// Only process directories
|
|
186
|
+
try {
|
|
187
|
+
if (!statSync(entryPath).isDirectory())
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const defPath = join(entryPath, 'definition.json');
|
|
194
|
+
if (!existsSync(defPath)) {
|
|
195
|
+
errors.push(`${entry}: missing definition.json, skipped`);
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
let def;
|
|
199
|
+
try {
|
|
200
|
+
def = JSON.parse(readFileSync(defPath, 'utf-8'));
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
errors.push(`${entry}: failed to parse definition.json — ${err.message}`);
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
// Build manifest entry from definition
|
|
207
|
+
const manifestEntry = {
|
|
208
|
+
keyword: def.keyword,
|
|
209
|
+
displayName: def.displayName,
|
|
210
|
+
codegenTier: 1, // default; definition.json doesn't store tier
|
|
211
|
+
childTypes: def.childTypes,
|
|
212
|
+
parserHints: def.parserHints,
|
|
213
|
+
hash: def.hash,
|
|
214
|
+
graduatedBy: def.graduatedBy,
|
|
215
|
+
graduatedAt: def.graduatedAt,
|
|
216
|
+
evolveRunId: def.evolveRunId,
|
|
217
|
+
kernVersion: def.kernVersion,
|
|
218
|
+
};
|
|
219
|
+
nodes[def.keyword] = manifestEntry;
|
|
220
|
+
rebuilt++;
|
|
221
|
+
}
|
|
222
|
+
// Write the fresh manifest
|
|
223
|
+
const manifest = { version: 1, nodes };
|
|
224
|
+
mkdirSync(evolvedDir, { recursive: true });
|
|
225
|
+
writeFileSync(join(evolvedDir, 'manifest.json'), JSON.stringify(manifest, null, 2));
|
|
226
|
+
return { rebuilt, errors };
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=evolved-node-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evolved-node-loader.js","sourceRoot":"","sources":["../src/evolved-node-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evolve v4 Types — Self-Extending IR
|
|
3
|
+
*
|
|
4
|
+
* These types define the schema for evolved nodes: proposals from LLM discovery,
|
|
5
|
+
* graduated node definitions on disk, parser hints, and validation results.
|
|
6
|
+
*/
|
|
7
|
+
export interface ParserHints {
|
|
8
|
+
/** Positional args consumed before key=value props.
|
|
9
|
+
* e.g. ["method", "path"] → "api-route GET /users" → props.method="GET", props.path="/users" */
|
|
10
|
+
positionalArgs?: string[];
|
|
11
|
+
/** A bare word consumed as a named prop.
|
|
12
|
+
* e.g. "name" → "auth-guard admin" → props.name="admin" */
|
|
13
|
+
bareWord?: string;
|
|
14
|
+
/** Registers this node type for <<<...>>> multiline block parsing.
|
|
15
|
+
* The value is the prop name that receives the block content.
|
|
16
|
+
* e.g. "code" → "my-node <<<...>>>" → props.code="..." */
|
|
17
|
+
multilineBlock?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface EvolvedNodeDefinition {
|
|
20
|
+
keyword: string;
|
|
21
|
+
displayName: string;
|
|
22
|
+
description: string;
|
|
23
|
+
props: EvolvedNodeProp[];
|
|
24
|
+
childTypes: string[];
|
|
25
|
+
parserHints?: ParserHints;
|
|
26
|
+
reason: EvolvedNodeReason;
|
|
27
|
+
hash: string;
|
|
28
|
+
graduatedBy: string;
|
|
29
|
+
graduatedAt: string;
|
|
30
|
+
evolveRunId: string;
|
|
31
|
+
kernVersion: string;
|
|
32
|
+
}
|
|
33
|
+
export interface EvolvedNodeProp {
|
|
34
|
+
name: string;
|
|
35
|
+
type: 'string' | 'boolean' | 'number' | 'expression';
|
|
36
|
+
required: boolean;
|
|
37
|
+
description: string;
|
|
38
|
+
}
|
|
39
|
+
export interface EvolvedNodeReason {
|
|
40
|
+
observation: string;
|
|
41
|
+
inefficiency: string;
|
|
42
|
+
kernBenefit: string;
|
|
43
|
+
frequency: number;
|
|
44
|
+
avgLines: number;
|
|
45
|
+
instances: string[];
|
|
46
|
+
}
|
|
47
|
+
export interface EvolvedManifest {
|
|
48
|
+
version: number;
|
|
49
|
+
nodes: Record<string, EvolvedManifestEntry>;
|
|
50
|
+
}
|
|
51
|
+
export interface EvolvedManifestEntry {
|
|
52
|
+
keyword: string;
|
|
53
|
+
displayName: string;
|
|
54
|
+
codegenTier: 1 | 2;
|
|
55
|
+
childTypes: string[];
|
|
56
|
+
parserHints?: ParserHints;
|
|
57
|
+
hash: string;
|
|
58
|
+
graduatedBy: string;
|
|
59
|
+
graduatedAt: string;
|
|
60
|
+
evolveRunId: string;
|
|
61
|
+
kernVersion: string;
|
|
62
|
+
}
|
|
63
|
+
export interface EvolveNodeProposal {
|
|
64
|
+
id: string;
|
|
65
|
+
keyword: string;
|
|
66
|
+
displayName: string;
|
|
67
|
+
description: string;
|
|
68
|
+
props: EvolvedNodeProp[];
|
|
69
|
+
childTypes: string[];
|
|
70
|
+
kernExample: string;
|
|
71
|
+
expectedOutput: string;
|
|
72
|
+
codegenSource: string;
|
|
73
|
+
parserHints?: ParserHints;
|
|
74
|
+
targetOverrides?: Record<string, string>;
|
|
75
|
+
reason: EvolvedNodeReason;
|
|
76
|
+
codegenTier: 1 | 2;
|
|
77
|
+
proposedAt: string;
|
|
78
|
+
evolveRunId: string;
|
|
79
|
+
}
|
|
80
|
+
export interface EvolveV4ValidationResult {
|
|
81
|
+
schemaOk: boolean;
|
|
82
|
+
keywordOk: boolean;
|
|
83
|
+
parseOk: boolean;
|
|
84
|
+
codegenCompileOk: boolean;
|
|
85
|
+
codegenRunOk: boolean;
|
|
86
|
+
typescriptOk: boolean;
|
|
87
|
+
goldenDiffOk: boolean;
|
|
88
|
+
dedupOk: boolean;
|
|
89
|
+
errors: string[];
|
|
90
|
+
retryCount: number;
|
|
91
|
+
}
|
|
92
|
+
export type EvolveV4ProposalStatus = 'pending' | 'approved' | 'rejected';
|
|
93
|
+
export interface StagedEvolveProposal {
|
|
94
|
+
id: string;
|
|
95
|
+
proposal: EvolveNodeProposal;
|
|
96
|
+
validation: EvolveV4ValidationResult;
|
|
97
|
+
status: EvolveV4ProposalStatus;
|
|
98
|
+
stagedAt: string;
|
|
99
|
+
reviewedAt?: string;
|
|
100
|
+
}
|
|
101
|
+
export interface CodegenHelpers {
|
|
102
|
+
capitalize: (s: string) => string;
|
|
103
|
+
parseParamList: (params: string) => string;
|
|
104
|
+
dedent: (code: string) => string;
|
|
105
|
+
kids: (node: any, type?: string) => any[];
|
|
106
|
+
firstChild: (node: any, type: string) => any | undefined;
|
|
107
|
+
p: (node: any) => Record<string, unknown>;
|
|
108
|
+
handlerCode: (node: any) => string;
|
|
109
|
+
exportPrefix: (node: any) => string;
|
|
110
|
+
}
|