@kernlang/cli 3.1.6 → 3.1.8
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/dist/cli.js +40 -2440
- package/dist/cli.js.map +1 -1
- package/dist/commands/compile.d.ts +1 -0
- package/dist/commands/compile.js +360 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/confidence.d.ts +1 -0
- package/dist/commands/confidence.js +105 -0
- package/dist/commands/confidence.js.map +1 -0
- package/dist/commands/dev.d.ts +7 -0
- package/dist/commands/dev.js +17 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/evolve/backfill.d.ts +1 -0
- package/dist/commands/evolve/backfill.js +80 -0
- package/dist/commands/evolve/backfill.js.map +1 -0
- package/dist/commands/evolve/discover.d.ts +1 -0
- package/dist/commands/evolve/discover.js +151 -0
- package/dist/commands/evolve/discover.js.map +1 -0
- package/dist/commands/evolve/index.d.ts +1 -0
- package/dist/commands/evolve/index.js +40 -0
- package/dist/commands/evolve/index.js.map +1 -0
- package/dist/commands/evolve/lifecycle.d.ts +8 -0
- package/dist/commands/evolve/lifecycle.js +190 -0
- package/dist/commands/evolve/lifecycle.js.map +1 -0
- package/dist/commands/evolve/main.d.ts +1 -0
- package/dist/commands/evolve/main.js +76 -0
- package/dist/commands/evolve/main.js.map +1 -0
- package/dist/commands/evolve/review-v4.d.ts +1 -0
- package/dist/commands/evolve/review-v4.js +181 -0
- package/dist/commands/evolve/review-v4.js.map +1 -0
- package/dist/commands/evolve/review.d.ts +1 -0
- package/dist/commands/evolve/review.js +63 -0
- package/dist/commands/evolve/review.js.map +1 -0
- package/dist/commands/import.d.ts +1 -0
- package/dist/commands/import.js +101 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +154 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/review.d.ts +1 -0
- package/dist/commands/review.js +881 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/scan.d.ts +2 -0
- package/dist/commands/scan.js +89 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/schema.d.ts +1 -0
- package/dist/commands/schema.js +6 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/test.d.ts +1 -0
- package/dist/commands/test.js +184 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/transpile.d.ts +2 -0
- package/dist/commands/transpile.js +280 -0
- package/dist/commands/transpile.js.map +1 -0
- package/dist/shared.d.ts +51 -0
- package/dist/shared.js +459 -0
- package/dist/shared.js.map +1 -0
- package/dist/transpiler-cli.d.ts +1 -1
- package/dist/transpiler-cli.js +10 -9
- package/dist/transpiler-cli.js.map +1 -1
- package/package.json +13 -13
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { importTypeScript } from '@kernlang/core';
|
|
2
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'fs';
|
|
3
|
+
import { basename, dirname, relative, resolve } from 'path';
|
|
4
|
+
import { hasFlag, parseFlag } from '../shared.js';
|
|
5
|
+
function findTsFiles(dir) {
|
|
6
|
+
const files = [];
|
|
7
|
+
for (const entry of readdirSync(dir)) {
|
|
8
|
+
const full = resolve(dir, entry);
|
|
9
|
+
if (entry === 'node_modules' || entry === 'dist' || entry === '.git' || entry === 'generated')
|
|
10
|
+
continue;
|
|
11
|
+
const stat = statSync(full);
|
|
12
|
+
if (stat.isDirectory()) {
|
|
13
|
+
files.push(...findTsFiles(full));
|
|
14
|
+
}
|
|
15
|
+
else if (entry.endsWith('.ts') || entry.endsWith('.tsx')) {
|
|
16
|
+
// Skip .d.ts files
|
|
17
|
+
if (entry.endsWith('.d.ts'))
|
|
18
|
+
continue;
|
|
19
|
+
files.push(full);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return files;
|
|
23
|
+
}
|
|
24
|
+
export function runImport(args) {
|
|
25
|
+
const input = args[1];
|
|
26
|
+
if (!input) {
|
|
27
|
+
console.error('Usage: kern import <file.ts|dir> [--outdir=<dir>] [--dry-run]');
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
const inputPath = resolve(input);
|
|
31
|
+
if (!existsSync(inputPath)) {
|
|
32
|
+
console.error(`Not found: ${input}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const outDir = parseFlag(args, '--outdir');
|
|
36
|
+
const dryRun = hasFlag(args, '--dry-run');
|
|
37
|
+
const stat = statSync(inputPath);
|
|
38
|
+
const files = stat.isDirectory() ? findTsFiles(inputPath) : [inputPath];
|
|
39
|
+
if (files.length === 0) {
|
|
40
|
+
console.log('No .ts/.tsx files found.');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
console.log(`\n KERN import — converting ${files.length} TypeScript file(s)\n`);
|
|
44
|
+
const totalStats = { types: 0, interfaces: 0, functions: 0, classes: 0, imports: 0, constants: 0, enums: 0 };
|
|
45
|
+
let totalUnmapped = 0;
|
|
46
|
+
for (const file of files) {
|
|
47
|
+
const source = readFileSync(file, 'utf-8');
|
|
48
|
+
const relFile = relative(process.cwd(), file);
|
|
49
|
+
const result = importTypeScript(source, basename(file));
|
|
50
|
+
// Accumulate stats
|
|
51
|
+
for (const key of Object.keys(totalStats)) {
|
|
52
|
+
totalStats[key] += result.stats[key];
|
|
53
|
+
}
|
|
54
|
+
totalUnmapped += result.unmapped.length;
|
|
55
|
+
const kernFileName = basename(file).replace(/\.tsx?$/, '.kern');
|
|
56
|
+
const kernOutDir = outDir ? resolve(outDir) : dirname(file);
|
|
57
|
+
const kernPath = resolve(kernOutDir, kernFileName);
|
|
58
|
+
if (dryRun) {
|
|
59
|
+
console.log(` ${relFile} → ${relative(process.cwd(), kernPath)}`);
|
|
60
|
+
console.log(` types: ${result.stats.types}, interfaces: ${result.stats.interfaces}, functions: ${result.stats.functions}, classes: ${result.stats.classes}`);
|
|
61
|
+
if (result.unmapped.length > 0) {
|
|
62
|
+
console.log(` unmapped: ${result.unmapped.length}`);
|
|
63
|
+
for (const u of result.unmapped.slice(0, 3)) {
|
|
64
|
+
console.log(` - ${u}`);
|
|
65
|
+
}
|
|
66
|
+
if (result.unmapped.length > 3) {
|
|
67
|
+
console.log(` ... and ${result.unmapped.length - 3} more`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
console.log('');
|
|
71
|
+
console.log(result.kern);
|
|
72
|
+
console.log('---');
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
mkdirSync(kernOutDir, { recursive: true });
|
|
76
|
+
writeFileSync(kernPath, result.kern);
|
|
77
|
+
const parts = [];
|
|
78
|
+
if (result.stats.types)
|
|
79
|
+
parts.push(`${result.stats.types} types`);
|
|
80
|
+
if (result.stats.interfaces)
|
|
81
|
+
parts.push(`${result.stats.interfaces} interfaces`);
|
|
82
|
+
if (result.stats.functions)
|
|
83
|
+
parts.push(`${result.stats.functions} functions`);
|
|
84
|
+
if (result.stats.classes)
|
|
85
|
+
parts.push(`${result.stats.classes} classes`);
|
|
86
|
+
if (result.stats.constants)
|
|
87
|
+
parts.push(`${result.stats.constants} constants`);
|
|
88
|
+
if (result.stats.imports)
|
|
89
|
+
parts.push(`${result.stats.imports} imports`);
|
|
90
|
+
console.log(` ${relFile} → ${kernFileName} (${parts.join(', ')})`);
|
|
91
|
+
if (result.unmapped.length > 0) {
|
|
92
|
+
console.log(` ⚠ ${result.unmapped.length} unmapped construct(s)`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
console.log(`\n Total: ${totalStats.types + totalStats.interfaces + totalStats.functions + totalStats.classes + totalStats.constants} declarations imported`);
|
|
97
|
+
if (totalUnmapped > 0) {
|
|
98
|
+
console.log(` ${totalUnmapped} unmapped construct(s) — check comments in output`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runInit(args: string[]): void;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
2
|
+
import { basename, resolve } from 'path';
|
|
3
|
+
import { hasFlag, parseFlag } from '../shared.js';
|
|
4
|
+
// ── MCP Templates ───────────────────────────────────────────────────────
|
|
5
|
+
const TEMPLATES = {
|
|
6
|
+
'file-tools': {
|
|
7
|
+
description: 'File operations MCP server with path safety guards',
|
|
8
|
+
content: `mcp name=FileTools version=1.0
|
|
9
|
+
|
|
10
|
+
tool name=readFile
|
|
11
|
+
description text="Read a file's contents within allowed directories"
|
|
12
|
+
param name=filePath type=string required=true description="Path to the file"
|
|
13
|
+
guard type=pathContainment param=filePath allowlist=/data,/home
|
|
14
|
+
handler <<<
|
|
15
|
+
const fs = await import('node:fs/promises');
|
|
16
|
+
const content = await fs.readFile(params.filePath as string, 'utf-8');
|
|
17
|
+
return { content: [{ type: "text", text: content }] };
|
|
18
|
+
>>>
|
|
19
|
+
|
|
20
|
+
tool name=listFiles
|
|
21
|
+
description text="List files in a directory"
|
|
22
|
+
param name=directory type=string required=true description="Directory to list"
|
|
23
|
+
guard type=pathContainment param=directory allowlist=/data,/home
|
|
24
|
+
handler <<<
|
|
25
|
+
const fs = await import('node:fs/promises');
|
|
26
|
+
const files = await fs.readdir(params.directory as string);
|
|
27
|
+
return { content: [{ type: "text", text: files.join('\\n') }] };
|
|
28
|
+
>>>
|
|
29
|
+
|
|
30
|
+
tool name=searchFiles
|
|
31
|
+
description text="Search for files matching a pattern"
|
|
32
|
+
param name=query type=string required=true description="Search query"
|
|
33
|
+
param name=maxResults type=number default=50 description="Maximum results to return"
|
|
34
|
+
guard type=sanitize param=query
|
|
35
|
+
guard type=validate param=maxResults min=1 max=500
|
|
36
|
+
handler <<<
|
|
37
|
+
// TODO: Implement file search logic
|
|
38
|
+
return { content: [{ type: "text", text: "Search results for: " + params.query }] };
|
|
39
|
+
>>>
|
|
40
|
+
`,
|
|
41
|
+
},
|
|
42
|
+
'api-gateway': {
|
|
43
|
+
description: 'HTTP API gateway MCP server with auth and rate limiting',
|
|
44
|
+
content: `mcp name=APIGateway version=1.0 transport=stdio
|
|
45
|
+
|
|
46
|
+
tool name=apiRequest
|
|
47
|
+
description text="Make an authenticated API request"
|
|
48
|
+
param name=url type=string required=true description="API endpoint URL"
|
|
49
|
+
param name=method type=string default=GET description="HTTP method"
|
|
50
|
+
param name=body type=string required=false description="Request body (JSON)"
|
|
51
|
+
guard type=sanitize param=url
|
|
52
|
+
guard type=auth envVar=API_AUTH_TOKEN
|
|
53
|
+
guard type=rateLimit maxRequests=60 windowMs=60000
|
|
54
|
+
handler <<<
|
|
55
|
+
const response = await fetch(params.url as string, {
|
|
56
|
+
method: (params.method as string) || 'GET',
|
|
57
|
+
headers: {
|
|
58
|
+
'Content-Type': 'application/json',
|
|
59
|
+
'Authorization': \\\`Bearer \\\${process.env.API_AUTH_TOKEN}\\\`,
|
|
60
|
+
},
|
|
61
|
+
...(params.body ? { body: params.body as string } : {}),
|
|
62
|
+
});
|
|
63
|
+
const data = await response.text();
|
|
64
|
+
return { content: [{ type: "text", text: data }] };
|
|
65
|
+
>>>
|
|
66
|
+
|
|
67
|
+
resource name=apiStatus uri="status://health"
|
|
68
|
+
description text="API gateway health status"
|
|
69
|
+
handler <<<
|
|
70
|
+
return {
|
|
71
|
+
contents: [{
|
|
72
|
+
uri: uri.href,
|
|
73
|
+
mimeType: 'application/json',
|
|
74
|
+
text: JSON.stringify({ status: 'ok', timestamp: new Date().toISOString() }),
|
|
75
|
+
}],
|
|
76
|
+
};
|
|
77
|
+
>>>
|
|
78
|
+
`,
|
|
79
|
+
},
|
|
80
|
+
'database-tools': {
|
|
81
|
+
description: 'Database query MCP server with input validation',
|
|
82
|
+
content: `mcp name=DatabaseTools version=1.0
|
|
83
|
+
|
|
84
|
+
tool name=query
|
|
85
|
+
description text="Run a read-only database query"
|
|
86
|
+
param name=sql type=string required=true description="SQL query (SELECT only)"
|
|
87
|
+
param name=limit type=number default=100 description="Row limit"
|
|
88
|
+
guard type=sanitize param=sql
|
|
89
|
+
guard type=validate param=limit min=1 max=1000
|
|
90
|
+
handler <<<
|
|
91
|
+
// Enforce read-only queries
|
|
92
|
+
const normalized = (params.sql as string).trim().toUpperCase();
|
|
93
|
+
if (!normalized.startsWith('SELECT')) {
|
|
94
|
+
throw new Error('Only SELECT queries are allowed');
|
|
95
|
+
}
|
|
96
|
+
// TODO: Connect to your database
|
|
97
|
+
return { content: [{ type: "text", text: "Query results would appear here" }] };
|
|
98
|
+
>>>
|
|
99
|
+
|
|
100
|
+
tool name=listTables
|
|
101
|
+
description text="List available database tables"
|
|
102
|
+
handler <<<
|
|
103
|
+
// TODO: Connect to your database and list tables
|
|
104
|
+
return { content: [{ type: "text", text: "Tables: users, posts, comments" }] };
|
|
105
|
+
>>>
|
|
106
|
+
|
|
107
|
+
tool name=describeTable
|
|
108
|
+
description text="Show columns and types for a table"
|
|
109
|
+
param name=tableName type=string required=true description="Table name"
|
|
110
|
+
guard type=sanitize param=tableName
|
|
111
|
+
handler <<<
|
|
112
|
+
// TODO: Connect to your database
|
|
113
|
+
return { content: [{ type: "text", text: "Columns for: " + params.tableName }] };
|
|
114
|
+
>>>
|
|
115
|
+
`,
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
// ── Init command ─────────────────────────────────────────────────────────
|
|
119
|
+
export function runInit(args) {
|
|
120
|
+
const isMcp = hasFlag(args, '--mcp');
|
|
121
|
+
const template = parseFlag(args, '--template') || 'file-tools';
|
|
122
|
+
const outArg = args.find((a) => !a.startsWith('--') && a !== 'init');
|
|
123
|
+
if (!isMcp) {
|
|
124
|
+
console.error('Usage: kern init --mcp [--template=<name>] [output.kern]');
|
|
125
|
+
console.error('');
|
|
126
|
+
console.error('Templates:');
|
|
127
|
+
for (const [name, tmpl] of Object.entries(TEMPLATES)) {
|
|
128
|
+
console.error(` ${name.padEnd(16)} ${tmpl.description}`);
|
|
129
|
+
}
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
const tmpl = TEMPLATES[template];
|
|
133
|
+
if (!tmpl) {
|
|
134
|
+
console.error(`Unknown template: '${template}'`);
|
|
135
|
+
console.error(`Available: ${Object.keys(TEMPLATES).join(', ')}`);
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
const outFile = resolve(outArg || `${template}.kern`);
|
|
139
|
+
const outDir = resolve(outFile, '..');
|
|
140
|
+
if (existsSync(outFile)) {
|
|
141
|
+
console.error(`File already exists: ${basename(outFile)}`);
|
|
142
|
+
console.error('Remove it first or choose a different name.');
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
mkdirSync(outDir, { recursive: true });
|
|
146
|
+
writeFileSync(outFile, tmpl.content);
|
|
147
|
+
console.log(` Created ${basename(outFile)} (template: ${template})`);
|
|
148
|
+
console.log('');
|
|
149
|
+
console.log(' Next steps:');
|
|
150
|
+
console.log(` kern compile ${basename(outFile)} --target=mcp --outdir=generated`);
|
|
151
|
+
console.log(' # or watch for changes:');
|
|
152
|
+
console.log(` kern compile ${basename(outFile)} --target=mcp --outdir=generated --watch`);
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runReview(args: string[]): Promise<void>;
|