@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 @@
1
+ {"version":3,"file":"vue-composables.js","sourceRoot":"","sources":["../../src/detectors/vue-composables.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,cAAc,GAAiB;IACnC,EAAE,EAAE,mBAAmB;IACvB,WAAW,EAAE,QAAQ;IACrB,YAAY,EAAE,CAAC,cAAc,EAAE,sBAAsB,CAAC;IACtD,WAAW,EAAE,YAAY;IACzB,MAAM,CAAC,UAAsB,EAAE,QAAgB;QAC7C,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,wDAAwD;QACxD,yEAAyE;QACzE,MAAM,YAAY,GAAG,qDAAqD,CAAC;QAC3E,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACtD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YAExE,yBAAyB;YACzB,IAAI,GAAG,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACxC,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,OAAO,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC/C,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG;oBAAE,UAAU,EAAE,CAAC;gBACxC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG;oBAAE,UAAU,EAAE,CAAC;gBACxC,GAAG,EAAE,CAAC;YACR,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YAE9D,qDAAqD;YACrD,MAAM,aAAa,GAAG,UAAU,CAAC,qBAAqB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBACpE,MAAM,GAAG,GAAG,GAAG,CAAC,uBAAuB,EAAE,CAAC;gBAC1C,OAAO,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAEzC,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CACjD,GAAG,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAC5C,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAExC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAE1C,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YAElE,OAAO,CAAC,IAAI,CAAC;gBACX,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;gBAC/B,SAAS;gBACT,OAAO;gBACP,OAAO;gBACP,eAAe,EAAE;oBACf,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;oBAClF,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE;iBAC7F;gBACD,aAAa,EAAE,EAAE;aAClB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAmB,CAAC,cAAc,CAAC,CAAC"}
@@ -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":"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"}
@@ -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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,UAAU,EAAwB,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAY3D;;GAEG;AACH,MAAM,UAAU,MAAM,CACpB,SAAiB,EACjB,UAAyB,EAAE;IAE3B,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,UAAU,GAAsB;QACpC,GAAG,kBAAkB;QACrB,GAAG,OAAO,CAAC,UAAU;KACtB,CAAC;IAEF,mBAAmB;IACnB,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC;IAC3E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC9E,CAAC;IAED,yCAAyC;IACzC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;QAC1B,2BAA2B,EAAE,IAAI;QACjC,gBAAgB,EAAE,OAAO,CAAC,YAAY;KACvC,CAAC,CAAC;IAEH,wCAAwC;IACxC,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC,CAAC,qBAAqB;QAC/B,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAEtD,6BAA6B;IAC7B,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE7C,8BAA8B;IAC9B,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3C,QAAQ;QACR,UAAU,EAAE,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC;KAC7D,CAAC,CAAC,CAAC;IAEJ,2DAA2D;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO;QAC5B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,SAAS;aACN,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;aACxF,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzE,uDAAuD;IACvD,IAAI,aAAyC,CAAC;IAC9C,IAAI,aAAmH,CAAC;IACxH,IAAI,WAAkE,CAAC;IAEvE,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,gDAAgD;QAChD,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAE1E,sDAAsD;QACtD,MAAM,aAAa,GAAG,IAAI,GAAG,EAA+B,CAAC;QAC7D,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,OAAO;iBACrB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;iBAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,mBAAmB,CAC/B,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAClD,QAAQ,CACT,CAAC;YACF,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QAED,4DAA4D;QAC5D,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACtD,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;YAClD,OAAO,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,aAAa,GAAG,YAAY,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QAE/D,oCAAoC;QACpC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAErE,yCAAyC;QACzC,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAClC,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC;SACrC,CAAC,CAAC,CAAC;QAEJ,6CAA6C;QAC7C,WAAW,GAAG,OAAO,CAAC,OAAO;YAC3B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,aAAa;iBACV,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC;iBAC3D,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAO;QACb,QAAQ;QACR,SAAS;QACT,SAAS;QACT,MAAM;QACN,cAAc,EAAE,mBAAmB,CAAC,OAAO,CAAC;QAC5C,aAAa;QACb,aAAa;QACb,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,QAAQ,GAAG,UAAU,EACrB,UAAyB,EAAE;IAE3B,MAAM,UAAU,GAAsB;QACpC,GAAG,kBAAkB;QACrB,GAAG,OAAO,CAAC,UAAU;KACtB,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,2BAA2B,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnF,UAAU;IACV,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE9C,UAAU;IACV,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEnD,UAAU;IACV,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE7C,UAAU;IACV,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3C,QAAQ;QACR,UAAU,EAAE,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC;KAC7D,CAAC,CAAC,CAAC;IAEJ,yCAAyC;IACzC,OAAO;QACL,IAAI;QACJ,QAAQ;QACR,SAAS;QACT,SAAS;QACT,MAAM,EAAE,EAAE;QACV,cAAc,EAAE,mBAAmB,CAAC,IAAI,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAkB;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,YAAY,CAAC,CAAC;IACrE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE/C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IACjF,MAAM,SAAS,GAAG,oBAAoB,WAAW,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAEjF,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,SAAkB;IAC3D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAClB,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxG,OAAO,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YAC3G,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACxJ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -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;