@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
package/dist/staging.js
ADDED
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Staging — Phase 5 of the evolve pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Per-proposal file staging + approval workflow.
|
|
5
|
+
* Each proposal gets its own JSON file to avoid merge conflicts in teams.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, unlinkSync } from 'fs';
|
|
8
|
+
import { resolve } from 'path';
|
|
9
|
+
const DEFAULT_STAGING_DIR = '.kern/evolve/staged';
|
|
10
|
+
const DEFAULT_PROMOTED_DIR = '.kern/evolve/promoted';
|
|
11
|
+
const DEFAULT_NODE_STAGING_DIR = '.kern/evolve/staged-nodes';
|
|
12
|
+
const DEFAULT_V4_STAGING_DIR = '.kern/evolve/staged-v4';
|
|
13
|
+
/**
|
|
14
|
+
* Stage a validated proposal for human review.
|
|
15
|
+
*/
|
|
16
|
+
export function stageProposal(proposal, validation, config) {
|
|
17
|
+
const stagingDir = resolve(process.cwd(), config?.stagingDir || DEFAULT_STAGING_DIR);
|
|
18
|
+
mkdirSync(stagingDir, { recursive: true });
|
|
19
|
+
const staged = {
|
|
20
|
+
id: proposal.id,
|
|
21
|
+
proposal,
|
|
22
|
+
validation,
|
|
23
|
+
status: 'pending',
|
|
24
|
+
stagedAt: new Date().toISOString(),
|
|
25
|
+
};
|
|
26
|
+
const filePath = resolve(stagingDir, `${proposal.id}.json`);
|
|
27
|
+
writeFileSync(filePath, JSON.stringify(staged, null, 2));
|
|
28
|
+
return staged;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* List all staged proposals.
|
|
32
|
+
*/
|
|
33
|
+
export function listStaged(config) {
|
|
34
|
+
const stagingDir = resolve(process.cwd(), config?.stagingDir || DEFAULT_STAGING_DIR);
|
|
35
|
+
if (!existsSync(stagingDir))
|
|
36
|
+
return [];
|
|
37
|
+
const files = readdirSync(stagingDir).filter(f => f.endsWith('.json'));
|
|
38
|
+
const proposals = [];
|
|
39
|
+
for (const file of files) {
|
|
40
|
+
try {
|
|
41
|
+
const content = readFileSync(resolve(stagingDir, file), 'utf-8');
|
|
42
|
+
proposals.push(JSON.parse(content));
|
|
43
|
+
}
|
|
44
|
+
catch { // file may not exist
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return proposals.sort((a, b) => (b.proposal.qualityScore.overallScore) - (a.proposal.qualityScore.overallScore));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get a single staged proposal by ID.
|
|
51
|
+
*/
|
|
52
|
+
export function getStaged(id, config) {
|
|
53
|
+
const stagingDir = resolve(process.cwd(), config?.stagingDir || DEFAULT_STAGING_DIR);
|
|
54
|
+
const filePath = resolve(stagingDir, `${id}.json`);
|
|
55
|
+
if (!existsSync(filePath))
|
|
56
|
+
return undefined;
|
|
57
|
+
try {
|
|
58
|
+
return JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Update the status of a staged proposal.
|
|
66
|
+
*/
|
|
67
|
+
export function updateStagedStatus(id, status, config) {
|
|
68
|
+
const stagingDir = resolve(process.cwd(), config?.stagingDir || DEFAULT_STAGING_DIR);
|
|
69
|
+
const filePath = resolve(stagingDir, `${id}.json`);
|
|
70
|
+
if (!existsSync(filePath))
|
|
71
|
+
return undefined;
|
|
72
|
+
try {
|
|
73
|
+
const staged = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
74
|
+
staged.status = status;
|
|
75
|
+
staged.reviewedAt = new Date().toISOString();
|
|
76
|
+
writeFileSync(filePath, JSON.stringify(staged, null, 2));
|
|
77
|
+
return staged;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Promote approved proposals to project-local templates directory.
|
|
85
|
+
*/
|
|
86
|
+
export function promoteLocal(config) {
|
|
87
|
+
const stagingDir = resolve(process.cwd(), config?.stagingDir || DEFAULT_STAGING_DIR);
|
|
88
|
+
const promotedDir = resolve(process.cwd(), config?.promotedDir || DEFAULT_PROMOTED_DIR);
|
|
89
|
+
const templatesDir = resolve(process.cwd(), config?.templatesDir || 'templates');
|
|
90
|
+
mkdirSync(promotedDir, { recursive: true });
|
|
91
|
+
mkdirSync(templatesDir, { recursive: true });
|
|
92
|
+
const staged = listStaged(config);
|
|
93
|
+
const approved = staged.filter(s => s.status === 'approved');
|
|
94
|
+
const promoted = [];
|
|
95
|
+
for (const s of approved) {
|
|
96
|
+
// Write the .kern template file
|
|
97
|
+
const kernFileName = `${s.proposal.templateName}.kern`;
|
|
98
|
+
const kernFilePath = resolve(templatesDir, kernFileName);
|
|
99
|
+
writeFileSync(kernFilePath, s.proposal.kernSource + '\n');
|
|
100
|
+
// Move to promoted directory
|
|
101
|
+
const stagedPath = resolve(stagingDir, `${s.id}.json`);
|
|
102
|
+
const promotedPath = resolve(promotedDir, `${s.id}.json`);
|
|
103
|
+
writeFileSync(promotedPath, JSON.stringify({ ...s, status: 'approved' }, null, 2));
|
|
104
|
+
// Remove from staging
|
|
105
|
+
if (existsSync(stagedPath)) {
|
|
106
|
+
unlinkSync(stagedPath);
|
|
107
|
+
}
|
|
108
|
+
promoted.push(kernFileName);
|
|
109
|
+
}
|
|
110
|
+
return promoted;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Remove rejected proposals from staging.
|
|
114
|
+
*/
|
|
115
|
+
export function cleanRejected(config) {
|
|
116
|
+
const stagingDir = resolve(process.cwd(), config?.stagingDir || DEFAULT_STAGING_DIR);
|
|
117
|
+
if (!existsSync(stagingDir))
|
|
118
|
+
return 0;
|
|
119
|
+
const staged = listStaged(config);
|
|
120
|
+
const rejected = staged.filter(s => s.status === 'rejected');
|
|
121
|
+
let cleaned = 0;
|
|
122
|
+
for (const s of rejected) {
|
|
123
|
+
const filePath = resolve(stagingDir, `${s.id}.json`);
|
|
124
|
+
if (existsSync(filePath)) {
|
|
125
|
+
unlinkSync(filePath);
|
|
126
|
+
cleaned++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return cleaned;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Format a staged proposal for split-view display.
|
|
133
|
+
*/
|
|
134
|
+
export function formatSplitView(staged) {
|
|
135
|
+
const { proposal, validation } = staged;
|
|
136
|
+
const lines = [];
|
|
137
|
+
const nameLen = Math.max(proposal.templateName.length + proposal.namespace.length + 3, 40);
|
|
138
|
+
const border = '\u2500'.repeat(nameLen + 18);
|
|
139
|
+
lines.push(`\u250C${border}\u2510`);
|
|
140
|
+
lines.push(`\u2502 ${proposal.templateName} (${proposal.namespace})${' '.repeat(Math.max(0, nameLen - proposal.templateName.length - proposal.namespace.length - 3))} \u2502`);
|
|
141
|
+
lines.push(`\u2502 Score: ${proposal.qualityScore.overallScore} | Instances: ${proposal.instanceCount} | Status: ${staged.status}${' '.repeat(Math.max(0, nameLen + 5 - `Score: ${proposal.qualityScore.overallScore} | Instances: ${proposal.instanceCount} | Status: ${staged.status}`.length))} \u2502`);
|
|
142
|
+
lines.push(`\u251C${'─'.repeat(Math.floor(border.length / 2))}\u252C${'─'.repeat(Math.ceil(border.length / 2))}\u2524`);
|
|
143
|
+
// Left: Original TS, Right: Proposed KERN
|
|
144
|
+
const origLines = proposal.representativeSnippet.split('\n').slice(0, 12);
|
|
145
|
+
const kernLines = proposal.kernSource.split('\n').slice(0, 12);
|
|
146
|
+
const maxLines = Math.max(origLines.length, kernLines.length);
|
|
147
|
+
const halfWidth = Math.floor(border.length / 2);
|
|
148
|
+
lines.push(`\u2502 ${'Original TypeScript'.padEnd(halfWidth - 1)}\u2502 ${'Proposed KERN Template'.padEnd(halfWidth - 2)}\u2502`);
|
|
149
|
+
lines.push(`\u251C${'─'.repeat(halfWidth)}\u253C${'─'.repeat(halfWidth)}\u2524`);
|
|
150
|
+
for (let i = 0; i < maxLines; i++) {
|
|
151
|
+
const left = (origLines[i] || '').substring(0, halfWidth - 2).padEnd(halfWidth - 1);
|
|
152
|
+
const right = (kernLines[i] || '').substring(0, halfWidth - 3).padEnd(halfWidth - 2);
|
|
153
|
+
lines.push(`\u2502 ${left}\u2502 ${right}\u2502`);
|
|
154
|
+
}
|
|
155
|
+
// Validation status
|
|
156
|
+
lines.push(`\u251C${'─'.repeat(border.length)}\u2524`);
|
|
157
|
+
const checks = [
|
|
158
|
+
validation.parseOk ? '\u2713 Parse' : '\u2717 Parse',
|
|
159
|
+
validation.registerOk ? '\u2713 Register' : '\u2717 Register',
|
|
160
|
+
validation.expansionOk ? '\u2713 Expansion' : '\u2717 Expansion',
|
|
161
|
+
validation.goldenDiffOk ? '\u2713 Golden diff' : '\u2717 Golden diff',
|
|
162
|
+
validation.typecheckOk ? '\u2713 Typecheck' : '\u2717 Typecheck',
|
|
163
|
+
];
|
|
164
|
+
lines.push(`\u2502 ${checks.join(' | ').padEnd(border.length - 1)}\u2502`);
|
|
165
|
+
lines.push(`\u2514${border}\u2518`);
|
|
166
|
+
lines.push('');
|
|
167
|
+
lines.push(' [a]pprove [r]eject [s]kip [d]etail');
|
|
168
|
+
return lines.join('\n');
|
|
169
|
+
}
|
|
170
|
+
// ── Node Staging (v3) ────────────────────────────────────────────────────
|
|
171
|
+
/**
|
|
172
|
+
* Stage a validated node proposal for human review.
|
|
173
|
+
*/
|
|
174
|
+
export function stageNodeProposal(proposal, validation, config) {
|
|
175
|
+
const stagingDir = resolve(process.cwd(), config?.stagingDir ? `${config.stagingDir}-nodes` : DEFAULT_NODE_STAGING_DIR);
|
|
176
|
+
mkdirSync(stagingDir, { recursive: true });
|
|
177
|
+
const staged = {
|
|
178
|
+
id: proposal.id,
|
|
179
|
+
proposal,
|
|
180
|
+
validation,
|
|
181
|
+
status: 'pending',
|
|
182
|
+
stagedAt: new Date().toISOString(),
|
|
183
|
+
};
|
|
184
|
+
const filePath = resolve(stagingDir, `${proposal.id}.json`);
|
|
185
|
+
writeFileSync(filePath, JSON.stringify(staged, null, 2));
|
|
186
|
+
return staged;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* List all staged node proposals.
|
|
190
|
+
*/
|
|
191
|
+
export function listStagedNodes(config) {
|
|
192
|
+
const stagingDir = resolve(process.cwd(), config?.stagingDir ? `${config.stagingDir}-nodes` : DEFAULT_NODE_STAGING_DIR);
|
|
193
|
+
if (!existsSync(stagingDir))
|
|
194
|
+
return [];
|
|
195
|
+
const files = readdirSync(stagingDir).filter(f => f.endsWith('.json'));
|
|
196
|
+
const proposals = [];
|
|
197
|
+
for (const file of files) {
|
|
198
|
+
try {
|
|
199
|
+
const content = readFileSync(resolve(stagingDir, file), 'utf-8');
|
|
200
|
+
proposals.push(JSON.parse(content));
|
|
201
|
+
}
|
|
202
|
+
catch { // file may not exist
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return proposals.sort((a, b) => b.proposal.qualityScore - a.proposal.qualityScore);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Update the status of a staged node proposal.
|
|
209
|
+
*/
|
|
210
|
+
export function updateStagedNodeStatus(id, status, config) {
|
|
211
|
+
const stagingDir = resolve(process.cwd(), config?.stagingDir ? `${config.stagingDir}-nodes` : DEFAULT_NODE_STAGING_DIR);
|
|
212
|
+
const filePath = resolve(stagingDir, `${id}.json`);
|
|
213
|
+
if (!existsSync(filePath))
|
|
214
|
+
return undefined;
|
|
215
|
+
try {
|
|
216
|
+
const staged = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
217
|
+
staged.status = status;
|
|
218
|
+
staged.reviewedAt = new Date().toISOString();
|
|
219
|
+
writeFileSync(filePath, JSON.stringify(staged, null, 2));
|
|
220
|
+
return staged;
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Format a staged node proposal for split-view display.
|
|
228
|
+
*/
|
|
229
|
+
export function formatNodeSplitView(staged) {
|
|
230
|
+
const { proposal, validation } = staged;
|
|
231
|
+
const lines = [];
|
|
232
|
+
const nameLen = Math.max(proposal.nodeName.length + 20, 40);
|
|
233
|
+
const border = '\u2500'.repeat(nameLen + 18);
|
|
234
|
+
lines.push(`\u250C${border}\u2510`);
|
|
235
|
+
lines.push(`\u2502 NODE: ${proposal.nodeName}${' '.repeat(Math.max(0, nameLen - proposal.nodeName.length - 6))} \u2502`);
|
|
236
|
+
lines.push(`\u2502 Score: ${proposal.qualityScore} | Freq: ${proposal.frequency} | Express: ${proposal.expressibilityScore.overall} | ${staged.status}${' '.repeat(Math.max(0, 10))} \u2502`);
|
|
237
|
+
lines.push(`\u251C${'─'.repeat(Math.floor(border.length / 2))}\u252C${'─'.repeat(Math.ceil(border.length / 2))}\u2524`);
|
|
238
|
+
// Left: KERN Syntax, Right: Codegen Stub
|
|
239
|
+
const kernLines = proposal.kernSyntax.split('\n').slice(0, 12);
|
|
240
|
+
const codeLines = proposal.codegenStub.split('\n').slice(0, 12);
|
|
241
|
+
const maxLines = Math.max(kernLines.length, codeLines.length);
|
|
242
|
+
const halfWidth = Math.floor(border.length / 2);
|
|
243
|
+
lines.push(`\u2502 ${'KERN Syntax'.padEnd(halfWidth - 1)}\u2502 ${'Codegen Stub'.padEnd(halfWidth - 2)}\u2502`);
|
|
244
|
+
lines.push(`\u251C${'─'.repeat(halfWidth)}\u253C${'─'.repeat(halfWidth)}\u2524`);
|
|
245
|
+
for (let i = 0; i < maxLines; i++) {
|
|
246
|
+
const left = (kernLines[i] || '').substring(0, halfWidth - 2).padEnd(halfWidth - 1);
|
|
247
|
+
const right = (codeLines[i] || '').substring(0, halfWidth - 3).padEnd(halfWidth - 2);
|
|
248
|
+
lines.push(`\u2502 ${left}\u2502 ${right}\u2502`);
|
|
249
|
+
}
|
|
250
|
+
lines.push(`\u251C${'─'.repeat(border.length)}\u2524`);
|
|
251
|
+
const checks = [
|
|
252
|
+
validation.parseOk ? '\u2713 Parse' : '\u2717 Parse',
|
|
253
|
+
validation.codegenOk ? '\u2713 Codegen' : '\u2717 Codegen',
|
|
254
|
+
`Targets: ${validation.targetCoverage}/11`,
|
|
255
|
+
];
|
|
256
|
+
lines.push(`\u2502 ${checks.join(' | ').padEnd(border.length - 1)}\u2502`);
|
|
257
|
+
lines.push(`\u2514${border}\u2518`);
|
|
258
|
+
lines.push('');
|
|
259
|
+
lines.push(' [a]pprove [r]eject [s]kip [d]etail');
|
|
260
|
+
return lines.join('\n');
|
|
261
|
+
}
|
|
262
|
+
// ── Evolve v4 Staging ─────────────────────────────────────────────────────
|
|
263
|
+
/**
|
|
264
|
+
* Stage a validated v4 proposal for human review.
|
|
265
|
+
*/
|
|
266
|
+
export function stageEvolveV4Proposal(proposal, validation) {
|
|
267
|
+
const stagingDir = resolve(process.cwd(), DEFAULT_V4_STAGING_DIR);
|
|
268
|
+
mkdirSync(stagingDir, { recursive: true });
|
|
269
|
+
const staged = {
|
|
270
|
+
id: proposal.id || `${proposal.keyword}-${Date.now()}`,
|
|
271
|
+
proposal,
|
|
272
|
+
validation,
|
|
273
|
+
status: 'pending',
|
|
274
|
+
stagedAt: new Date().toISOString(),
|
|
275
|
+
};
|
|
276
|
+
const filePath = resolve(stagingDir, `${staged.id}.json`);
|
|
277
|
+
writeFileSync(filePath, JSON.stringify(staged, null, 2));
|
|
278
|
+
return staged;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* List all staged v4 proposals.
|
|
282
|
+
*/
|
|
283
|
+
export function listStagedEvolveV4() {
|
|
284
|
+
const stagingDir = resolve(process.cwd(), DEFAULT_V4_STAGING_DIR);
|
|
285
|
+
if (!existsSync(stagingDir))
|
|
286
|
+
return [];
|
|
287
|
+
const files = readdirSync(stagingDir).filter(f => f.endsWith('.json'));
|
|
288
|
+
const proposals = [];
|
|
289
|
+
for (const file of files) {
|
|
290
|
+
try {
|
|
291
|
+
const content = readFileSync(resolve(stagingDir, file), 'utf-8');
|
|
292
|
+
proposals.push(JSON.parse(content));
|
|
293
|
+
}
|
|
294
|
+
catch { // file may not exist
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return proposals.sort((a, b) => (b.proposal.reason.frequency) - (a.proposal.reason.frequency));
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Get a single staged v4 proposal by ID.
|
|
301
|
+
*/
|
|
302
|
+
export function getStagedEvolveV4(id) {
|
|
303
|
+
const stagingDir = resolve(process.cwd(), DEFAULT_V4_STAGING_DIR);
|
|
304
|
+
const filePath = resolve(stagingDir, `${id}.json`);
|
|
305
|
+
if (!existsSync(filePath))
|
|
306
|
+
return undefined;
|
|
307
|
+
try {
|
|
308
|
+
return JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
return undefined;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Update the status of a staged v4 proposal.
|
|
316
|
+
*/
|
|
317
|
+
export function updateStagedEvolveV4Status(id, status) {
|
|
318
|
+
const stagingDir = resolve(process.cwd(), DEFAULT_V4_STAGING_DIR);
|
|
319
|
+
const filePath = resolve(stagingDir, `${id}.json`);
|
|
320
|
+
if (!existsSync(filePath))
|
|
321
|
+
return undefined;
|
|
322
|
+
try {
|
|
323
|
+
const staged = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
324
|
+
staged.status = status;
|
|
325
|
+
staged.reviewedAt = new Date().toISOString();
|
|
326
|
+
writeFileSync(filePath, JSON.stringify(staged, null, 2));
|
|
327
|
+
return staged;
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
return undefined;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Remove rejected v4 proposals from staging.
|
|
335
|
+
*/
|
|
336
|
+
export function cleanRejectedEvolveV4() {
|
|
337
|
+
const stagingDir = resolve(process.cwd(), DEFAULT_V4_STAGING_DIR);
|
|
338
|
+
if (!existsSync(stagingDir))
|
|
339
|
+
return 0;
|
|
340
|
+
const staged = listStagedEvolveV4();
|
|
341
|
+
const rejected = staged.filter(s => s.status === 'rejected');
|
|
342
|
+
let cleaned = 0;
|
|
343
|
+
for (const s of rejected) {
|
|
344
|
+
const filePath = resolve(stagingDir, `${s.id}.json`);
|
|
345
|
+
if (existsSync(filePath)) {
|
|
346
|
+
unlinkSync(filePath);
|
|
347
|
+
cleaned++;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return cleaned;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Remove approved v4 proposals from staging (after graduation).
|
|
354
|
+
*/
|
|
355
|
+
export function cleanApprovedEvolveV4(id) {
|
|
356
|
+
const stagingDir = resolve(process.cwd(), DEFAULT_V4_STAGING_DIR);
|
|
357
|
+
const filePath = resolve(stagingDir, `${id}.json`);
|
|
358
|
+
if (!existsSync(filePath))
|
|
359
|
+
return false;
|
|
360
|
+
unlinkSync(filePath);
|
|
361
|
+
return true;
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Format a staged v4 proposal for split-view display.
|
|
365
|
+
* Matches the design doc UX: KERN syntax | Generated TypeScript, validation badges, reason.
|
|
366
|
+
*/
|
|
367
|
+
export function formatEvolveV4SplitView(staged) {
|
|
368
|
+
const { proposal, validation } = staged;
|
|
369
|
+
const lines = [];
|
|
370
|
+
const width = 60;
|
|
371
|
+
const border = '\u2500'.repeat(width);
|
|
372
|
+
lines.push(` \u250C${border}\u2510`);
|
|
373
|
+
lines.push(` \u2502 PROPOSED NODE: ${proposal.keyword.padEnd(width - 17)}\u2502`);
|
|
374
|
+
lines.push(` \u2502 Freq: ${String(proposal.reason.frequency).padEnd(4)} files | Saves: ~${proposal.reason.avgLines} lines/instance${' '.repeat(Math.max(0, width - 45 - String(proposal.reason.frequency).length - String(proposal.reason.avgLines).length))}\u2502`);
|
|
375
|
+
lines.push(` \u251C${'─'.repeat(Math.floor(width / 2))}\u252C${'─'.repeat(Math.ceil(width / 2))}\u2524`);
|
|
376
|
+
// Left: KERN Syntax, Right: Generated TypeScript
|
|
377
|
+
const kernLines = proposal.kernExample.split('\n').slice(0, 10);
|
|
378
|
+
const tsLines = proposal.expectedOutput.split('\n').slice(0, 10);
|
|
379
|
+
const maxLines = Math.max(kernLines.length, tsLines.length);
|
|
380
|
+
const halfWidth = Math.floor(width / 2);
|
|
381
|
+
lines.push(` \u2502 ${'KERN Syntax'.padEnd(halfWidth - 1)}\u2502 ${'Generated TypeScript'.padEnd(halfWidth - 1)}\u2502`);
|
|
382
|
+
lines.push(` \u251C${'─'.repeat(halfWidth)}\u253C${'─'.repeat(halfWidth)}\u2524`);
|
|
383
|
+
for (let i = 0; i < maxLines; i++) {
|
|
384
|
+
const left = (kernLines[i] || '').substring(0, halfWidth - 2).padEnd(halfWidth - 1);
|
|
385
|
+
const right = (tsLines[i] || '').substring(0, halfWidth - 2).padEnd(halfWidth - 1);
|
|
386
|
+
lines.push(` \u2502 ${left}\u2502 ${right}\u2502`);
|
|
387
|
+
}
|
|
388
|
+
// Reason
|
|
389
|
+
lines.push(` \u251C${'─'.repeat(width)}\u2524`);
|
|
390
|
+
lines.push(` \u2502 REASON:${' '.repeat(width - 8)}\u2502`);
|
|
391
|
+
const reasonLines = [
|
|
392
|
+
`Observation: ${proposal.reason.observation}`,
|
|
393
|
+
`Inefficiency: ${proposal.reason.inefficiency}`,
|
|
394
|
+
`Benefit: ${proposal.reason.kernBenefit}`,
|
|
395
|
+
];
|
|
396
|
+
for (const r of reasonLines) {
|
|
397
|
+
lines.push(` \u2502 ${r.substring(0, width - 4).padEnd(width - 3)}\u2502`);
|
|
398
|
+
}
|
|
399
|
+
// Validation badges
|
|
400
|
+
lines.push(` \u251C${'─'.repeat(width)}\u2524`);
|
|
401
|
+
const checks = [
|
|
402
|
+
validation.schemaOk ? '\u2713 Schema' : '\u2717 Schema',
|
|
403
|
+
validation.parseOk ? '\u2713 Parse' : '\u2717 Parse',
|
|
404
|
+
validation.codegenCompileOk ? '\u2713 Codegen' : '\u2717 Codegen',
|
|
405
|
+
validation.codegenRunOk ? '\u2713 Run' : '\u2717 Run',
|
|
406
|
+
validation.goldenDiffOk ? '\u2713 Golden' : '\u2717 Golden',
|
|
407
|
+
validation.dedupOk ? '\u2713 Dedup' : '\u2717 Dedup',
|
|
408
|
+
];
|
|
409
|
+
lines.push(` \u2502 ${checks.join(' ').substring(0, width - 2).padEnd(width - 1)}\u2502`);
|
|
410
|
+
lines.push(` \u2514${border}\u2518`);
|
|
411
|
+
lines.push(` [a]pprove --approve=${staged.id} [r]eject --reject=${staged.id}`);
|
|
412
|
+
return lines.join('\n');
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=staging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staging.js","sourceRoot":"","sources":["../src/staging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Proposer — Phase 3 of the evolve pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Generates .kern template source from analyzed patterns.
|
|
5
|
+
* This is the hardest part: converting TS code patterns into valid
|
|
6
|
+
* .kern template syntax with typed slots.
|
|
7
|
+
*/
|
|
8
|
+
import type { AnalyzedPattern, TemplateProposal } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Generate .kern template source from an analyzed pattern.
|
|
11
|
+
*
|
|
12
|
+
* Output format follows the KERN template syntax:
|
|
13
|
+
* template name=<name>
|
|
14
|
+
* slot name=<name> type=<type> [optional=true] [default=<value>]
|
|
15
|
+
* import from=<pkg> names=<names>
|
|
16
|
+
* body <<<
|
|
17
|
+
* <template body with {{slotName}} placeholders>
|
|
18
|
+
* >>>
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateKernSource(pattern: AnalyzedPattern): string;
|
|
21
|
+
/**
|
|
22
|
+
* Generate template proposals from analyzed patterns.
|
|
23
|
+
*/
|
|
24
|
+
export declare function proposeTemplates(patterns: AnalyzedPattern[]): TemplateProposal[];
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Proposer — Phase 3 of the evolve pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Generates .kern template source from analyzed patterns.
|
|
5
|
+
* This is the hardest part: converting TS code patterns into valid
|
|
6
|
+
* .kern template syntax with typed slots.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Generate a proposal ID from the template name and structural hash.
|
|
10
|
+
*/
|
|
11
|
+
function generateProposalId(templateName, structuralHash) {
|
|
12
|
+
return `${templateName}-${structuralHash.substring(0, 6)}`;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate .kern template source from an analyzed pattern.
|
|
16
|
+
*
|
|
17
|
+
* Output format follows the KERN template syntax:
|
|
18
|
+
* template name=<name>
|
|
19
|
+
* slot name=<name> type=<type> [optional=true] [default=<value>]
|
|
20
|
+
* import from=<pkg> names=<names>
|
|
21
|
+
* body <<<
|
|
22
|
+
* <template body with {{slotName}} placeholders>
|
|
23
|
+
* >>>
|
|
24
|
+
*/
|
|
25
|
+
export function generateKernSource(pattern) {
|
|
26
|
+
const lines = [];
|
|
27
|
+
// Template declaration
|
|
28
|
+
lines.push(`template name=${pattern.templateName}`);
|
|
29
|
+
// Slots
|
|
30
|
+
for (const slot of pattern.slots) {
|
|
31
|
+
let slotLine = ` slot name=${slot.name} type=${slot.slotType}`;
|
|
32
|
+
if (slot.optional) {
|
|
33
|
+
slotLine += ' optional=true';
|
|
34
|
+
if (slot.value) {
|
|
35
|
+
slotLine += ` default=${slot.value.includes(' ') ? `"${slot.value}"` : slot.value}`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
lines.push(slotLine);
|
|
39
|
+
}
|
|
40
|
+
// Imports
|
|
41
|
+
for (const imp of pattern.imports) {
|
|
42
|
+
const names = imp.names.join(',');
|
|
43
|
+
lines.push(` import from=${imp.from} names=${names}`);
|
|
44
|
+
}
|
|
45
|
+
// Body — transform the representative snippet into a template body
|
|
46
|
+
const body = buildTemplateBody(pattern);
|
|
47
|
+
lines.push(' body <<<');
|
|
48
|
+
for (const bodyLine of body.split('\n')) {
|
|
49
|
+
lines.push(` ${bodyLine}`);
|
|
50
|
+
}
|
|
51
|
+
lines.push(' >>>');
|
|
52
|
+
return lines.join('\n');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Transform a code snippet into a template body with {{slot}} placeholders.
|
|
56
|
+
*/
|
|
57
|
+
function buildTemplateBody(pattern) {
|
|
58
|
+
let body = pattern.representativeSnippet;
|
|
59
|
+
// Replace extracted param values with {{slotName}} placeholders
|
|
60
|
+
// Sort params by value length (longest first) to avoid partial replacements
|
|
61
|
+
const sortedSlots = [...pattern.slots]
|
|
62
|
+
.filter(s => s.value && s.value !== 'any' && s.value !== 'unknown')
|
|
63
|
+
.sort((a, b) => b.value.length - a.value.length);
|
|
64
|
+
for (const slot of sortedSlots) {
|
|
65
|
+
// Replace literal value occurrences with {{slotName}}
|
|
66
|
+
const escaped = escapeRegExp(slot.value);
|
|
67
|
+
const re = new RegExp(escaped, 'g');
|
|
68
|
+
body = body.replace(re, `{{${slot.name}}}`);
|
|
69
|
+
}
|
|
70
|
+
// Ensure the body has proper export
|
|
71
|
+
if (!body.startsWith('export')) {
|
|
72
|
+
body = `export ${body}`;
|
|
73
|
+
}
|
|
74
|
+
return body;
|
|
75
|
+
}
|
|
76
|
+
function escapeRegExp(str) {
|
|
77
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Generate template proposals from analyzed patterns.
|
|
81
|
+
*/
|
|
82
|
+
export function proposeTemplates(patterns) {
|
|
83
|
+
const proposals = [];
|
|
84
|
+
for (const pattern of patterns) {
|
|
85
|
+
const kernSource = generateKernSource(pattern);
|
|
86
|
+
const id = generateProposalId(pattern.templateName, pattern.structuralHash);
|
|
87
|
+
proposals.push({
|
|
88
|
+
id,
|
|
89
|
+
templateName: pattern.templateName,
|
|
90
|
+
namespace: pattern.namespace,
|
|
91
|
+
kernSource,
|
|
92
|
+
slots: pattern.slots,
|
|
93
|
+
imports: pattern.imports,
|
|
94
|
+
goldenExample: pattern.goldenExample,
|
|
95
|
+
qualityScore: pattern.qualityScore,
|
|
96
|
+
structuralHash: pattern.structuralHash,
|
|
97
|
+
instanceCount: pattern.instanceCount,
|
|
98
|
+
representativeSnippet: pattern.representativeSnippet,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return proposals;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=template-proposer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-proposer.js","sourceRoot":"","sources":["../src/template-proposer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Validator — Phase 4 of the evolve pipeline.
|
|
3
|
+
*
|
|
4
|
+
* 5-step validation:
|
|
5
|
+
* 1. Parse: Is the .kern source valid syntax?
|
|
6
|
+
* 2. Register: Can the template be registered?
|
|
7
|
+
* 3. Expand: Does the template expand with real slot values?
|
|
8
|
+
* 4. Golden diff: Does the expansion match the original TS structure?
|
|
9
|
+
* 5. Typecheck: Does the expanded TypeScript pass type checking? (tsconfig-aware)
|
|
10
|
+
*/
|
|
11
|
+
import type { TemplateProposal, ValidationResult } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Validate a template proposal through the 5-step pipeline.
|
|
14
|
+
*
|
|
15
|
+
* Uses REAL values extracted from source, not synthetic placeholders.
|
|
16
|
+
* Each call operates on an isolated template registry (cleared before and after).
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateProposal(proposal: TemplateProposal, tsconfigPath?: string): ValidationResult;
|