@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.
Files changed (60) hide show
  1. package/dist/cli.js +40 -2440
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/compile.d.ts +1 -0
  4. package/dist/commands/compile.js +360 -0
  5. package/dist/commands/compile.js.map +1 -0
  6. package/dist/commands/confidence.d.ts +1 -0
  7. package/dist/commands/confidence.js +105 -0
  8. package/dist/commands/confidence.js.map +1 -0
  9. package/dist/commands/dev.d.ts +7 -0
  10. package/dist/commands/dev.js +17 -0
  11. package/dist/commands/dev.js.map +1 -0
  12. package/dist/commands/evolve/backfill.d.ts +1 -0
  13. package/dist/commands/evolve/backfill.js +80 -0
  14. package/dist/commands/evolve/backfill.js.map +1 -0
  15. package/dist/commands/evolve/discover.d.ts +1 -0
  16. package/dist/commands/evolve/discover.js +151 -0
  17. package/dist/commands/evolve/discover.js.map +1 -0
  18. package/dist/commands/evolve/index.d.ts +1 -0
  19. package/dist/commands/evolve/index.js +40 -0
  20. package/dist/commands/evolve/index.js.map +1 -0
  21. package/dist/commands/evolve/lifecycle.d.ts +8 -0
  22. package/dist/commands/evolve/lifecycle.js +190 -0
  23. package/dist/commands/evolve/lifecycle.js.map +1 -0
  24. package/dist/commands/evolve/main.d.ts +1 -0
  25. package/dist/commands/evolve/main.js +76 -0
  26. package/dist/commands/evolve/main.js.map +1 -0
  27. package/dist/commands/evolve/review-v4.d.ts +1 -0
  28. package/dist/commands/evolve/review-v4.js +181 -0
  29. package/dist/commands/evolve/review-v4.js.map +1 -0
  30. package/dist/commands/evolve/review.d.ts +1 -0
  31. package/dist/commands/evolve/review.js +63 -0
  32. package/dist/commands/evolve/review.js.map +1 -0
  33. package/dist/commands/import.d.ts +1 -0
  34. package/dist/commands/import.js +101 -0
  35. package/dist/commands/import.js.map +1 -0
  36. package/dist/commands/init.d.ts +1 -0
  37. package/dist/commands/init.js +154 -0
  38. package/dist/commands/init.js.map +1 -0
  39. package/dist/commands/review.d.ts +1 -0
  40. package/dist/commands/review.js +881 -0
  41. package/dist/commands/review.js.map +1 -0
  42. package/dist/commands/scan.d.ts +2 -0
  43. package/dist/commands/scan.js +89 -0
  44. package/dist/commands/scan.js.map +1 -0
  45. package/dist/commands/schema.d.ts +1 -0
  46. package/dist/commands/schema.js +6 -0
  47. package/dist/commands/schema.js.map +1 -0
  48. package/dist/commands/test.d.ts +1 -0
  49. package/dist/commands/test.js +184 -0
  50. package/dist/commands/test.js.map +1 -0
  51. package/dist/commands/transpile.d.ts +2 -0
  52. package/dist/commands/transpile.js +280 -0
  53. package/dist/commands/transpile.js.map +1 -0
  54. package/dist/shared.d.ts +51 -0
  55. package/dist/shared.js +459 -0
  56. package/dist/shared.js.map +1 -0
  57. package/dist/transpiler-cli.d.ts +1 -1
  58. package/dist/transpiler-cli.js +10 -9
  59. package/dist/transpiler-cli.js.map +1 -1
  60. 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>;