@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 @@
|
|
|
1
|
+
{"version":3,"file":"vue-composables.js","sourceRoot":"","sources":["../../src/detectors/vue-composables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evolve Dedup — structural similarity checking for node proposals.
|
|
3
|
+
*
|
|
4
|
+
* Prevents duplicates by checking keyword similarity and prop-schema overlap
|
|
5
|
+
* against existing core and evolved node types.
|
|
6
|
+
*/
|
|
7
|
+
import type { EvolveNodeProposal } from './evolved-types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Check if a proposal is a duplicate of an existing node.
|
|
10
|
+
* Returns true if the proposal is NOT a duplicate (passes the check).
|
|
11
|
+
*/
|
|
12
|
+
export declare function checkDedup(proposal: EvolveNodeProposal, existingKeywords: string[]): boolean;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evolve Dedup — structural similarity checking for node proposals.
|
|
3
|
+
*
|
|
4
|
+
* Prevents duplicates by checking keyword similarity and prop-schema overlap
|
|
5
|
+
* against existing core and evolved node types.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if a proposal is a duplicate of an existing node.
|
|
9
|
+
* Returns true if the proposal is NOT a duplicate (passes the check).
|
|
10
|
+
*/
|
|
11
|
+
export function checkDedup(proposal, existingKeywords) {
|
|
12
|
+
// Exact keyword match
|
|
13
|
+
if (existingKeywords.includes(proposal.keyword))
|
|
14
|
+
return false;
|
|
15
|
+
// Similarity check — keywords that are too close
|
|
16
|
+
for (const existing of existingKeywords) {
|
|
17
|
+
const sim = keywordSimilarity(proposal.keyword, existing);
|
|
18
|
+
if (sim > 0.85)
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Normalized Levenshtein similarity between two keywords.
|
|
25
|
+
* Returns 0-1 where 1 = identical.
|
|
26
|
+
*/
|
|
27
|
+
function keywordSimilarity(a, b) {
|
|
28
|
+
const distance = levenshtein(a, b);
|
|
29
|
+
const maxLen = Math.max(a.length, b.length);
|
|
30
|
+
if (maxLen === 0)
|
|
31
|
+
return 1;
|
|
32
|
+
return 1 - distance / maxLen;
|
|
33
|
+
}
|
|
34
|
+
function levenshtein(a, b) {
|
|
35
|
+
const m = a.length;
|
|
36
|
+
const n = b.length;
|
|
37
|
+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
|
|
38
|
+
for (let i = 0; i <= m; i++)
|
|
39
|
+
dp[i][0] = i;
|
|
40
|
+
for (let j = 0; j <= n; j++)
|
|
41
|
+
dp[0][j] = j;
|
|
42
|
+
for (let i = 1; i <= m; i++) {
|
|
43
|
+
for (let j = 1; j <= n; j++) {
|
|
44
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
45
|
+
dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return dp[m][n];
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=evolve-dedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evolve-dedup.js","sourceRoot":"","sources":["../src/evolve-dedup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,QAA4B,EAC5B,gBAA0B;IAE1B,sBAAsB;IACtB,IAAI,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9D,iDAAiD;IACjD,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC1D,IAAI,GAAG,GAAG,IAAI;YAAE,OAAO,KAAK,CAAC;IAC/B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,CAAS,EAAE,CAAS;IAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,EAAE,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CACjB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAChB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAChB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CACxB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evolve Rollback — remove or restore graduated nodes.
|
|
3
|
+
*
|
|
4
|
+
* Moves to .trash/ for recovery instead of deleting permanently.
|
|
5
|
+
*/
|
|
6
|
+
export interface RollbackResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
error?: string;
|
|
9
|
+
usageFiles?: string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Check if a keyword is used in any .kern files under the project.
|
|
13
|
+
*/
|
|
14
|
+
export declare function findUsages(keyword: string, baseDir?: string): string[];
|
|
15
|
+
/**
|
|
16
|
+
* Rollback a graduated node. Moves to .trash/ (recoverable).
|
|
17
|
+
*
|
|
18
|
+
* @param force — skip usage check
|
|
19
|
+
*/
|
|
20
|
+
export declare function rollbackNode(keyword: string, baseDir?: string, force?: boolean): RollbackResult;
|
|
21
|
+
export interface PruneResult {
|
|
22
|
+
keyword: string;
|
|
23
|
+
daysUnused: number;
|
|
24
|
+
pruned: boolean;
|
|
25
|
+
error?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Prune evolved nodes that haven't been used in any .kern files
|
|
29
|
+
* and are older than the given threshold (default: 90 days).
|
|
30
|
+
*
|
|
31
|
+
* @param dryRun — if true, just report what would be pruned
|
|
32
|
+
*/
|
|
33
|
+
export declare function pruneNodes(baseDir?: string, thresholdDays?: number, dryRun?: boolean): PruneResult[];
|
|
34
|
+
export interface CollisionInfo {
|
|
35
|
+
keyword: string;
|
|
36
|
+
displayName: string;
|
|
37
|
+
graduatedAt: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Detect keyword collisions between evolved nodes and core NODE_TYPES.
|
|
41
|
+
* Called when KERN is upgraded and new core types may have been added.
|
|
42
|
+
*/
|
|
43
|
+
export declare function detectCollisions(coreTypes: readonly string[], baseDir?: string): CollisionInfo[];
|
|
44
|
+
/**
|
|
45
|
+
* Rename an evolved node's keyword.
|
|
46
|
+
* Updates the manifest, directory name, and definition.json.
|
|
47
|
+
*/
|
|
48
|
+
export declare function renameEvolvedNode(oldKeyword: string, newKeyword: string, baseDir?: string): {
|
|
49
|
+
success: boolean;
|
|
50
|
+
error?: string;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Restore a previously rolled-back node from .trash/.
|
|
54
|
+
*/
|
|
55
|
+
export declare function restoreNode(keyword: string, baseDir?: string): {
|
|
56
|
+
success: boolean;
|
|
57
|
+
error?: string;
|
|
58
|
+
};
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evolve Rollback — remove or restore graduated nodes.
|
|
3
|
+
*
|
|
4
|
+
* Moves to .trash/ for recovery instead of deleting permanently.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, renameSync, rmSync } from 'fs';
|
|
7
|
+
import { resolve, join } from 'path';
|
|
8
|
+
import { removeFromManifest } from './graduation.js';
|
|
9
|
+
/**
|
|
10
|
+
* Check if a keyword is used in any .kern files under the project.
|
|
11
|
+
*/
|
|
12
|
+
export function findUsages(keyword, baseDir = process.cwd()) {
|
|
13
|
+
const usages = [];
|
|
14
|
+
function walk(dir) {
|
|
15
|
+
try {
|
|
16
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
17
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist')
|
|
18
|
+
continue;
|
|
19
|
+
const full = join(dir, entry.name);
|
|
20
|
+
if (entry.isDirectory()) {
|
|
21
|
+
walk(full);
|
|
22
|
+
}
|
|
23
|
+
else if (entry.name.endsWith('.kern')) {
|
|
24
|
+
try {
|
|
25
|
+
const content = readFileSync(full, 'utf-8');
|
|
26
|
+
// Check if any line starts with this keyword (at any indent level)
|
|
27
|
+
const escaped = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
28
|
+
const re = new RegExp(`^\\s*${escaped}\\b`, 'm');
|
|
29
|
+
if (re.test(content)) {
|
|
30
|
+
usages.push(full);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch { // file may not exist
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch { // file may not exist
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
walk(baseDir);
|
|
42
|
+
return usages;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Rollback a graduated node. Moves to .trash/ (recoverable).
|
|
46
|
+
*
|
|
47
|
+
* @param force — skip usage check
|
|
48
|
+
*/
|
|
49
|
+
export function rollbackNode(keyword, baseDir = process.cwd(), force = false) {
|
|
50
|
+
const evolvedDir = resolve(baseDir, '.kern', 'evolved');
|
|
51
|
+
const nodeDir = join(evolvedDir, keyword);
|
|
52
|
+
if (!existsSync(nodeDir)) {
|
|
53
|
+
return { success: false, error: `Node '${keyword}' is not graduated` };
|
|
54
|
+
}
|
|
55
|
+
// Check usage unless forced
|
|
56
|
+
if (!force) {
|
|
57
|
+
const usages = findUsages(keyword, baseDir);
|
|
58
|
+
if (usages.length > 0) {
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
error: `Node '${keyword}' is used in ${usages.length} file(s). Use --force to rollback anyway.`,
|
|
62
|
+
usageFiles: usages,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
// Move to .trash/
|
|
68
|
+
const trashDir = join(evolvedDir, '.trash');
|
|
69
|
+
mkdirSync(trashDir, { recursive: true });
|
|
70
|
+
const trashDest = join(trashDir, keyword);
|
|
71
|
+
// Remove previous trash if exists
|
|
72
|
+
if (existsSync(trashDest)) {
|
|
73
|
+
rmSync(trashDest, { recursive: true });
|
|
74
|
+
}
|
|
75
|
+
renameSync(nodeDir, trashDest);
|
|
76
|
+
// Update manifest
|
|
77
|
+
removeFromManifest(evolvedDir, keyword);
|
|
78
|
+
return { success: true };
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
return { success: false, error: err.message };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Prune evolved nodes that haven't been used in any .kern files
|
|
86
|
+
* and are older than the given threshold (default: 90 days).
|
|
87
|
+
*
|
|
88
|
+
* @param dryRun — if true, just report what would be pruned
|
|
89
|
+
*/
|
|
90
|
+
export function pruneNodes(baseDir = process.cwd(), thresholdDays = 90, dryRun = false) {
|
|
91
|
+
const evolvedDir = resolve(baseDir, '.kern', 'evolved');
|
|
92
|
+
const manifestPath = join(evolvedDir, 'manifest.json');
|
|
93
|
+
if (!existsSync(manifestPath))
|
|
94
|
+
return [];
|
|
95
|
+
let manifest;
|
|
96
|
+
try {
|
|
97
|
+
manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
const now = Date.now();
|
|
103
|
+
const thresholdMs = thresholdDays * 24 * 60 * 60 * 1000;
|
|
104
|
+
const results = [];
|
|
105
|
+
for (const [keyword, entry] of Object.entries(manifest.nodes)) {
|
|
106
|
+
const graduatedAt = new Date(entry.graduatedAt).getTime();
|
|
107
|
+
const ageMs = now - graduatedAt;
|
|
108
|
+
const daysOld = Math.floor(ageMs / (24 * 60 * 60 * 1000));
|
|
109
|
+
if (ageMs < thresholdMs)
|
|
110
|
+
continue; // Too young to prune
|
|
111
|
+
// Check if used anywhere
|
|
112
|
+
const usages = findUsages(keyword, baseDir);
|
|
113
|
+
if (usages.length > 0)
|
|
114
|
+
continue; // Still in use
|
|
115
|
+
if (dryRun) {
|
|
116
|
+
results.push({ keyword, daysUnused: daysOld, pruned: false });
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
const rollResult = rollbackNode(keyword, baseDir, true);
|
|
120
|
+
results.push({
|
|
121
|
+
keyword,
|
|
122
|
+
daysUnused: daysOld,
|
|
123
|
+
pruned: rollResult.success,
|
|
124
|
+
error: rollResult.error,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return results;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Detect keyword collisions between evolved nodes and core NODE_TYPES.
|
|
132
|
+
* Called when KERN is upgraded and new core types may have been added.
|
|
133
|
+
*/
|
|
134
|
+
export function detectCollisions(coreTypes, baseDir = process.cwd()) {
|
|
135
|
+
const evolvedDir = resolve(baseDir, '.kern', 'evolved');
|
|
136
|
+
const manifestPath = join(evolvedDir, 'manifest.json');
|
|
137
|
+
if (!existsSync(manifestPath))
|
|
138
|
+
return [];
|
|
139
|
+
let manifest;
|
|
140
|
+
try {
|
|
141
|
+
manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
const collisions = [];
|
|
147
|
+
const coreSet = new Set(coreTypes);
|
|
148
|
+
for (const [keyword, entry] of Object.entries(manifest.nodes)) {
|
|
149
|
+
if (coreSet.has(keyword)) {
|
|
150
|
+
collisions.push({
|
|
151
|
+
keyword,
|
|
152
|
+
displayName: entry.displayName,
|
|
153
|
+
graduatedAt: entry.graduatedAt,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return collisions;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Rename an evolved node's keyword.
|
|
161
|
+
* Updates the manifest, directory name, and definition.json.
|
|
162
|
+
*/
|
|
163
|
+
export function renameEvolvedNode(oldKeyword, newKeyword, baseDir = process.cwd()) {
|
|
164
|
+
const evolvedDir = resolve(baseDir, '.kern', 'evolved');
|
|
165
|
+
const oldDir = join(evolvedDir, oldKeyword);
|
|
166
|
+
const newDir = join(evolvedDir, newKeyword);
|
|
167
|
+
if (!existsSync(oldDir)) {
|
|
168
|
+
return { success: false, error: `Node '${oldKeyword}' not found` };
|
|
169
|
+
}
|
|
170
|
+
if (existsSync(newDir)) {
|
|
171
|
+
return { success: false, error: `Node '${newKeyword}' already exists` };
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
// Rename directory
|
|
175
|
+
renameSync(oldDir, newDir);
|
|
176
|
+
// Update definition.json
|
|
177
|
+
const defPath = join(newDir, 'definition.json');
|
|
178
|
+
if (existsSync(defPath)) {
|
|
179
|
+
const def = JSON.parse(readFileSync(defPath, 'utf-8'));
|
|
180
|
+
def.keyword = newKeyword;
|
|
181
|
+
writeFileSync(defPath, JSON.stringify(def, null, 2));
|
|
182
|
+
}
|
|
183
|
+
// Update manifest
|
|
184
|
+
const manifestPath = join(evolvedDir, 'manifest.json');
|
|
185
|
+
if (existsSync(manifestPath)) {
|
|
186
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
187
|
+
if (manifest.nodes[oldKeyword]) {
|
|
188
|
+
manifest.nodes[newKeyword] = { ...manifest.nodes[oldKeyword], keyword: newKeyword };
|
|
189
|
+
delete manifest.nodes[oldKeyword];
|
|
190
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return { success: true };
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
return { success: false, error: err.message };
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Restore a previously rolled-back node from .trash/.
|
|
201
|
+
*/
|
|
202
|
+
export function restoreNode(keyword, baseDir = process.cwd()) {
|
|
203
|
+
const evolvedDir = resolve(baseDir, '.kern', 'evolved');
|
|
204
|
+
const trashDir = join(evolvedDir, '.trash', keyword);
|
|
205
|
+
const nodeDir = join(evolvedDir, keyword);
|
|
206
|
+
if (!existsSync(trashDir)) {
|
|
207
|
+
return { success: false, error: `No trashed node '${keyword}' found` };
|
|
208
|
+
}
|
|
209
|
+
if (existsSync(nodeDir)) {
|
|
210
|
+
return { success: false, error: `Node '${keyword}' already exists. Rollback it first.` };
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
renameSync(trashDir, nodeDir);
|
|
214
|
+
// Re-add to manifest from definition.json
|
|
215
|
+
const defPath = join(nodeDir, 'definition.json');
|
|
216
|
+
if (existsSync(defPath)) {
|
|
217
|
+
const def = JSON.parse(readFileSync(defPath, 'utf-8'));
|
|
218
|
+
const manifestPath = join(evolvedDir, 'manifest.json');
|
|
219
|
+
const manifest = existsSync(manifestPath)
|
|
220
|
+
? JSON.parse(readFileSync(manifestPath, 'utf-8'))
|
|
221
|
+
: { version: 1, nodes: {} };
|
|
222
|
+
manifest.nodes[keyword] = {
|
|
223
|
+
keyword: def.keyword,
|
|
224
|
+
displayName: def.displayName,
|
|
225
|
+
codegenTier: 1,
|
|
226
|
+
childTypes: def.childTypes || [],
|
|
227
|
+
parserHints: def.parserHints,
|
|
228
|
+
hash: def.hash,
|
|
229
|
+
graduatedBy: def.graduatedBy,
|
|
230
|
+
graduatedAt: def.graduatedAt,
|
|
231
|
+
evolveRunId: def.evolveRunId,
|
|
232
|
+
kernVersion: def.kernVersion,
|
|
233
|
+
};
|
|
234
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
|
|
235
|
+
}
|
|
236
|
+
return { success: true };
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
return { success: false, error: err.message };
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=evolve-rollback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evolve-rollback.js","sourceRoot":"","sources":["../src/evolve-rollback.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACzG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AASrD;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,UAAkB,OAAO,CAAC,GAAG,EAAE;IACzE,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,SAAS,IAAI,CAAC,GAAW;QACvB,IAAI,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC9D,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;oBAAE,SAAS;gBACnG,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,IAAI,CAAC,IAAI,CAAC,CAAC;gBACb,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxC,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBAC5C,mEAAmE;wBACnE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;wBAC/D,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,QAAQ,OAAO,KAAK,EAAE,GAAG,CAAC,CAAC;wBACjD,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;4BACrB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACpB,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC,CAAC,qBAAqB;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,qBAAqB;QAC/B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,CAAC;IACd,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,UAAkB,OAAO,CAAC,GAAG,EAAE,EAC/B,KAAK,GAAG,KAAK;IAEb,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAE1C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,OAAO,oBAAoB,EAAE,CAAC;IACzE,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,SAAS,OAAO,gBAAgB,MAAM,CAAC,MAAM,2CAA2C;gBAC/F,UAAU,EAAE,MAAM;aACnB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,kBAAkB;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC5C,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE1C,kCAAkC;QAClC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAE/B,kBAAkB;QAClB,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAExC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;IAC3D,CAAC;AACH,CAAC;AAWD;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CACxB,UAAkB,OAAO,CAAC,GAAG,EAAE,EAC/B,aAAa,GAAG,EAAE,EAClB,MAAM,GAAG,KAAK;IAEd,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAEvD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAC;IAEzC,IAAI,QAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,WAAW,GAAG,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACxD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,GAAG,GAAG,WAAW,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAE1D,IAAI,KAAK,GAAG,WAAW;YAAE,SAAS,CAAC,qBAAqB;QAExD,yBAAyB;QACzB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS,CAAC,eAAe;QAEhD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC;gBACX,OAAO;gBACP,UAAU,EAAE,OAAO;gBACnB,MAAM,EAAE,UAAU,CAAC,OAAO;gBAC1B,KAAK,EAAE,UAAU,CAAC,KAAK;aACxB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAUD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAA4B,EAC5B,UAAkB,OAAO,CAAC,GAAG,EAAE;IAE/B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAEvD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAC;IAEzC,IAAI,QAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,UAAU,GAAoB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAEnC,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC;gBACd,OAAO;gBACP,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,UAAkB,EAClB,UAAkB,EAClB,UAAkB,OAAO,CAAC,GAAG,EAAE;IAE/B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAE5C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,UAAU,aAAa,EAAE,CAAC;IACrE,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,UAAU,kBAAkB,EAAE,CAAC;IAC1E,CAAC;IAED,IAAI,CAAC;QACH,mBAAmB;QACnB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE3B,yBAAyB;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAChD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACvD,GAAG,CAAC,OAAO,GAAG,UAAU,CAAC;YACzB,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,kBAAkB;QAClB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QACvD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;YACjE,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;gBACpF,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAClC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;IAC3D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,OAAe,EACf,UAAkB,OAAO,CAAC,GAAG,EAAE;IAE/B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAE1C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,OAAO,SAAS,EAAE,CAAC;IACzE,CAAC;IAED,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,OAAO,sCAAsC,EAAE,CAAC;IAC3F,CAAC;IAED,IAAI,CAAC;QACH,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE9B,0CAA0C;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACjD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACvD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,CAAC;gBACvC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACjD,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAC9B,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;gBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,WAAW,EAAE,CAAC;gBACd,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE;gBAChC,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;aAC7B,CAAC;YACF,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;IAC3D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evolve Runner — orchestrator for the full evolve pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline: scan → gap-detect → analyze → propose → validate → stage
|
|
5
|
+
*/
|
|
6
|
+
import type { EvolveConfig, EvolveResult, QualityThresholds } from './types.js';
|
|
7
|
+
export interface EvolveOptions {
|
|
8
|
+
recursive?: boolean;
|
|
9
|
+
preview?: boolean;
|
|
10
|
+
thresholds?: Partial<QualityThresholds>;
|
|
11
|
+
tsconfigPath?: string;
|
|
12
|
+
config?: Partial<EvolveConfig>;
|
|
13
|
+
enableNodeProposals?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Run the full evolve pipeline on a directory or file.
|
|
17
|
+
*/
|
|
18
|
+
export declare function evolve(inputPath: string, options?: EvolveOptions): EvolveResult;
|
|
19
|
+
/**
|
|
20
|
+
* Run evolve on a source string (useful for testing and single-file analysis).
|
|
21
|
+
*/
|
|
22
|
+
export declare function evolveSource(source: string, filePath?: string, options?: EvolveOptions): EvolveResult;
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evolve Runner — orchestrator for the full evolve pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline: scan → gap-detect → analyze → propose → validate → stage
|
|
5
|
+
*/
|
|
6
|
+
import { readdirSync, statSync, existsSync } from 'fs';
|
|
7
|
+
import { resolve, join } from 'path';
|
|
8
|
+
import { Project } from 'ts-morph';
|
|
9
|
+
import { detectGaps } from './gap-detector.js';
|
|
10
|
+
import { analyzePatterns, analyzeStructuralPatterns } from './pattern-analyzer.js';
|
|
11
|
+
import { proposeTemplates } from './template-proposer.js';
|
|
12
|
+
import { validateProposal } from './template-validator.js';
|
|
13
|
+
import { stageProposal, stageNodeProposal } from './staging.js';
|
|
14
|
+
import { DEFAULT_THRESHOLDS } from './quality-scorer.js';
|
|
15
|
+
import { scoreExpressibility, isNodeCandidate } from './expressibility-scorer.js';
|
|
16
|
+
import { proposeNodes } from './node-proposer.js';
|
|
17
|
+
import { governanceGate } from './node-governance.js';
|
|
18
|
+
import { validateNodeProposal } from './node-validator.js';
|
|
19
|
+
/**
|
|
20
|
+
* Run the full evolve pipeline on a directory or file.
|
|
21
|
+
*/
|
|
22
|
+
export function evolve(inputPath, options = {}) {
|
|
23
|
+
const resolvedPath = resolve(inputPath);
|
|
24
|
+
const thresholds = {
|
|
25
|
+
...DEFAULT_THRESHOLDS,
|
|
26
|
+
...options.thresholds,
|
|
27
|
+
};
|
|
28
|
+
// Collect TS files
|
|
29
|
+
const filePaths = collectTsFiles(resolvedPath, options.recursive ?? false);
|
|
30
|
+
if (filePaths.length === 0) {
|
|
31
|
+
return { gaps: [], analyzed: [], proposals: [], validated: [], staged: [] };
|
|
32
|
+
}
|
|
33
|
+
// Create a ts-morph project for analysis
|
|
34
|
+
const project = new Project({
|
|
35
|
+
skipAddingFilesFromTsConfig: true,
|
|
36
|
+
tsConfigFilePath: options.tsconfigPath,
|
|
37
|
+
});
|
|
38
|
+
// Phase 1: Detect gaps across all files
|
|
39
|
+
const allGaps = [];
|
|
40
|
+
for (const filePath of filePaths) {
|
|
41
|
+
try {
|
|
42
|
+
const sourceFile = project.addSourceFileAtPath(filePath);
|
|
43
|
+
const gaps = detectGaps(sourceFile, filePath);
|
|
44
|
+
allGaps.push(...gaps);
|
|
45
|
+
}
|
|
46
|
+
catch { // file may not exist
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Phase 2: Analyze and group patterns (v2 template path)
|
|
50
|
+
const analyzed = analyzePatterns(allGaps, thresholds);
|
|
51
|
+
// Phase 3: Propose templates
|
|
52
|
+
const proposals = proposeTemplates(analyzed);
|
|
53
|
+
// Phase 4: Validate proposals
|
|
54
|
+
const validated = proposals.map(proposal => ({
|
|
55
|
+
proposal,
|
|
56
|
+
validation: validateProposal(proposal, options.tsconfigPath),
|
|
57
|
+
}));
|
|
58
|
+
// Phase 5: Stage validated proposals (unless preview mode)
|
|
59
|
+
const staged = options.preview
|
|
60
|
+
? []
|
|
61
|
+
: validated
|
|
62
|
+
.filter(v => v.validation.parseOk && v.validation.registerOk && v.validation.expansionOk)
|
|
63
|
+
.map(v => stageProposal(v.proposal, v.validation, options.config));
|
|
64
|
+
// ── v3 branch: Node proposals from structural gaps ──
|
|
65
|
+
let nodeProposals;
|
|
66
|
+
let nodeValidated;
|
|
67
|
+
let stagedNodes;
|
|
68
|
+
if (options.enableNodeProposals) {
|
|
69
|
+
// Phase 2.5: Analyze structural gaps separately
|
|
70
|
+
const structuralAnalyzed = analyzeStructuralPatterns(allGaps, thresholds);
|
|
71
|
+
// Phase 2.6: Score expressibility for structural gaps
|
|
72
|
+
const expressScores = new Map();
|
|
73
|
+
for (const pattern of structuralAnalyzed) {
|
|
74
|
+
const snippets = allGaps
|
|
75
|
+
.filter(g => pattern.gapIds.includes(g.id))
|
|
76
|
+
.map(g => g.snippet);
|
|
77
|
+
const score = scoreExpressibility(allGaps.filter(g => pattern.gapIds.includes(g.id)), snippets);
|
|
78
|
+
expressScores.set(pattern.structuralHash, score);
|
|
79
|
+
}
|
|
80
|
+
// Phase 2.7: Propose nodes for high-expressibility patterns
|
|
81
|
+
const candidatePatterns = structuralAnalyzed.filter(p => {
|
|
82
|
+
const score = expressScores.get(p.structuralHash);
|
|
83
|
+
return score && isNodeCandidate(score);
|
|
84
|
+
});
|
|
85
|
+
nodeProposals = proposeNodes(candidatePatterns, expressScores);
|
|
86
|
+
// Phase 2.8: Governance gate filter
|
|
87
|
+
const governed = nodeProposals.filter(np => governanceGate(np).pass);
|
|
88
|
+
// Phase 2.9: Validate governed proposals
|
|
89
|
+
nodeValidated = governed.map(np => ({
|
|
90
|
+
proposal: np,
|
|
91
|
+
validation: validateNodeProposal(np),
|
|
92
|
+
}));
|
|
93
|
+
// Phase 2.10: Stage validated node proposals
|
|
94
|
+
stagedNodes = options.preview
|
|
95
|
+
? []
|
|
96
|
+
: nodeValidated
|
|
97
|
+
.filter(v => v.validation.parseOk && v.validation.codegenOk)
|
|
98
|
+
.map(v => stageNodeProposal(v.proposal, v.validation, options.config));
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
gaps: allGaps,
|
|
102
|
+
analyzed,
|
|
103
|
+
proposals,
|
|
104
|
+
validated,
|
|
105
|
+
staged,
|
|
106
|
+
conceptSummary: buildConceptSummary(allGaps),
|
|
107
|
+
nodeProposals,
|
|
108
|
+
nodeValidated,
|
|
109
|
+
stagedNodes,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Run evolve on a source string (useful for testing and single-file analysis).
|
|
114
|
+
*/
|
|
115
|
+
export function evolveSource(source, filePath = 'input.ts', options = {}) {
|
|
116
|
+
const thresholds = {
|
|
117
|
+
...DEFAULT_THRESHOLDS,
|
|
118
|
+
...options.thresholds,
|
|
119
|
+
};
|
|
120
|
+
const project = new Project({ skipAddingFilesFromTsConfig: true });
|
|
121
|
+
const sourceFile = project.createSourceFile(filePath, source, { overwrite: true });
|
|
122
|
+
// Phase 1
|
|
123
|
+
const gaps = detectGaps(sourceFile, filePath);
|
|
124
|
+
// Phase 2
|
|
125
|
+
const analyzed = analyzePatterns(gaps, thresholds);
|
|
126
|
+
// Phase 3
|
|
127
|
+
const proposals = proposeTemplates(analyzed);
|
|
128
|
+
// Phase 4
|
|
129
|
+
const validated = proposals.map(proposal => ({
|
|
130
|
+
proposal,
|
|
131
|
+
validation: validateProposal(proposal, options.tsconfigPath),
|
|
132
|
+
}));
|
|
133
|
+
// Phase 5 (skip staging for source mode)
|
|
134
|
+
return {
|
|
135
|
+
gaps,
|
|
136
|
+
analyzed,
|
|
137
|
+
proposals,
|
|
138
|
+
validated,
|
|
139
|
+
staged: [],
|
|
140
|
+
conceptSummary: buildConceptSummary(gaps),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function buildConceptSummary(gaps) {
|
|
144
|
+
const conceptGaps = gaps.filter(g => g.libraryName === 'structural');
|
|
145
|
+
if (conceptGaps.length === 0)
|
|
146
|
+
return undefined;
|
|
147
|
+
const byRule = {};
|
|
148
|
+
for (const g of conceptGaps) {
|
|
149
|
+
const rule = g.detectorId.replace(/^concept-/, '');
|
|
150
|
+
byRule[rule] = (byRule[rule] || 0) + 1;
|
|
151
|
+
}
|
|
152
|
+
const parts = Object.entries(byRule).map(([rule, count]) => `${rule}: ${count}`);
|
|
153
|
+
const formatted = `Structural gaps: ${conceptGaps.length} (${parts.join(', ')})`;
|
|
154
|
+
return { total: conceptGaps.length, byRule, formatted };
|
|
155
|
+
}
|
|
156
|
+
function collectTsFiles(inputPath, recursive) {
|
|
157
|
+
if (!existsSync(inputPath))
|
|
158
|
+
return [];
|
|
159
|
+
const stat = statSync(inputPath);
|
|
160
|
+
if (stat.isFile()) {
|
|
161
|
+
if (inputPath.endsWith('.ts') || inputPath.endsWith('.tsx')) {
|
|
162
|
+
if (!inputPath.endsWith('.d.ts') && !inputPath.endsWith('.test.ts') && !inputPath.endsWith('.test.tsx')) {
|
|
163
|
+
return [inputPath];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
if (!stat.isDirectory())
|
|
169
|
+
return [];
|
|
170
|
+
const files = [];
|
|
171
|
+
for (const entry of readdirSync(inputPath)) {
|
|
172
|
+
const full = join(inputPath, entry);
|
|
173
|
+
const s = statSync(full);
|
|
174
|
+
if (s.isDirectory() && recursive && !entry.startsWith('.') && entry !== 'node_modules' && entry !== 'dist') {
|
|
175
|
+
files.push(...collectTsFiles(full, true));
|
|
176
|
+
}
|
|
177
|
+
else if ((entry.endsWith('.ts') || entry.endsWith('.tsx')) && !entry.endsWith('.d.ts') && !entry.endsWith('.test.ts') && !entry.endsWith('.test.tsx')) {
|
|
178
|
+
files.push(full);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return files;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=evolve-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evolve-runner.js","sourceRoot":"","sources":["../src/evolve-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
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 type { EvolveNodeProposal, EvolveV4ValidationResult } from './evolved-types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Run the full 9-step validation pipeline on a node proposal.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateEvolveProposal(proposal: EvolveNodeProposal, existingKeywords?: string[]): EvolveV4ValidationResult;
|