@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.
Files changed (104) hide show
  1. package/LICENSE +661 -0
  2. package/dist/concept-gap-adapter.d.ts +17 -0
  3. package/dist/concept-gap-adapter.js +43 -0
  4. package/dist/concept-gap-adapter.js.map +1 -0
  5. package/dist/detector-registry.d.ts +31 -0
  6. package/dist/detector-registry.js +89 -0
  7. package/dist/detector-registry.js.map +1 -0
  8. package/dist/detectors/animation.d.ts +5 -0
  9. package/dist/detectors/animation.js +67 -0
  10. package/dist/detectors/animation.js.map +1 -0
  11. package/dist/detectors/data-fetching.d.ts +5 -0
  12. package/dist/detectors/data-fetching.js +117 -0
  13. package/dist/detectors/data-fetching.js.map +1 -0
  14. package/dist/detectors/express-middleware.d.ts +5 -0
  15. package/dist/detectors/express-middleware.js +52 -0
  16. package/dist/detectors/express-middleware.js.map +1 -0
  17. package/dist/detectors/react-forms.d.ts +5 -0
  18. package/dist/detectors/react-forms.js +89 -0
  19. package/dist/detectors/react-forms.js.map +1 -0
  20. package/dist/detectors/schema-validation.d.ts +5 -0
  21. package/dist/detectors/schema-validation.js +92 -0
  22. package/dist/detectors/schema-validation.js.map +1 -0
  23. package/dist/detectors/state-mgmt.d.ts +5 -0
  24. package/dist/detectors/state-mgmt.js +102 -0
  25. package/dist/detectors/state-mgmt.js.map +1 -0
  26. package/dist/detectors/structural.d.ts +10 -0
  27. package/dist/detectors/structural.js +271 -0
  28. package/dist/detectors/structural.js.map +1 -0
  29. package/dist/detectors/testing.d.ts +5 -0
  30. package/dist/detectors/testing.js +56 -0
  31. package/dist/detectors/testing.js.map +1 -0
  32. package/dist/detectors/vue-composables.d.ts +5 -0
  33. package/dist/detectors/vue-composables.js +57 -0
  34. package/dist/detectors/vue-composables.js.map +1 -0
  35. package/dist/evolve-dedup.d.ts +12 -0
  36. package/dist/evolve-dedup.js +50 -0
  37. package/dist/evolve-dedup.js.map +1 -0
  38. package/dist/evolve-rollback.d.ts +58 -0
  39. package/dist/evolve-rollback.js +242 -0
  40. package/dist/evolve-rollback.js.map +1 -0
  41. package/dist/evolve-runner.d.ts +22 -0
  42. package/dist/evolve-runner.js +183 -0
  43. package/dist/evolve-runner.js.map +1 -0
  44. package/dist/evolve-validator-v4.d.ts +11 -0
  45. package/dist/evolve-validator-v4.js +253 -0
  46. package/dist/evolve-validator-v4.js.map +1 -0
  47. package/dist/evolved-node-loader.d.ts +61 -0
  48. package/dist/evolved-node-loader.js +228 -0
  49. package/dist/evolved-node-loader.js.map +1 -0
  50. package/dist/evolved-types.d.ts +110 -0
  51. package/dist/evolved-types.js +8 -0
  52. package/dist/evolved-types.js.map +1 -0
  53. package/dist/expressibility-scorer.d.ts +19 -0
  54. package/dist/expressibility-scorer.js +78 -0
  55. package/dist/expressibility-scorer.js.map +1 -0
  56. package/dist/gap-detector.d.ts +26 -0
  57. package/dist/gap-detector.js +141 -0
  58. package/dist/gap-detector.js.map +1 -0
  59. package/dist/golden-test-runner.d.ts +27 -0
  60. package/dist/golden-test-runner.js +120 -0
  61. package/dist/golden-test-runner.js.map +1 -0
  62. package/dist/graduation.d.ts +36 -0
  63. package/dist/graduation.js +175 -0
  64. package/dist/graduation.js.map +1 -0
  65. package/dist/index.d.ts +40 -0
  66. package/dist/index.js +58 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/llm-discovery.d.ts +55 -0
  69. package/dist/llm-discovery.js +352 -0
  70. package/dist/llm-discovery.js.map +1 -0
  71. package/dist/llm-provider.d.ts +35 -0
  72. package/dist/llm-provider.js +143 -0
  73. package/dist/llm-provider.js.map +1 -0
  74. package/dist/node-governance.d.ts +23 -0
  75. package/dist/node-governance.js +45 -0
  76. package/dist/node-governance.js.map +1 -0
  77. package/dist/node-proposer.d.ts +27 -0
  78. package/dist/node-proposer.js +127 -0
  79. package/dist/node-proposer.js.map +1 -0
  80. package/dist/node-validator.d.ts +16 -0
  81. package/dist/node-validator.js +74 -0
  82. package/dist/node-validator.js.map +1 -0
  83. package/dist/pattern-analyzer.d.ts +28 -0
  84. package/dist/pattern-analyzer.js +181 -0
  85. package/dist/pattern-analyzer.js.map +1 -0
  86. package/dist/quality-scorer.d.ts +16 -0
  87. package/dist/quality-scorer.js +79 -0
  88. package/dist/quality-scorer.js.map +1 -0
  89. package/dist/sandboxed-generator.d.ts +26 -0
  90. package/dist/sandboxed-generator.js +133 -0
  91. package/dist/sandboxed-generator.js.map +1 -0
  92. package/dist/staging.d.ts +81 -0
  93. package/dist/staging.js +414 -0
  94. package/dist/staging.js.map +1 -0
  95. package/dist/template-proposer.d.ts +24 -0
  96. package/dist/template-proposer.js +103 -0
  97. package/dist/template-proposer.js.map +1 -0
  98. package/dist/template-validator.d.ts +18 -0
  99. package/dist/template-validator.js +174 -0
  100. package/dist/template-validator.js.map +1 -0
  101. package/dist/types.d.ts +169 -0
  102. package/dist/types.js +7 -0
  103. package/dist/types.js.map +1 -0
  104. 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
+ }