kern-lang 1.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 (67) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +304 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +244 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config.d.ts +46 -0
  7. package/dist/config.js +54 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/context-export.d.ts +11 -0
  10. package/dist/context-export.js +121 -0
  11. package/dist/context-export.js.map +1 -0
  12. package/dist/decompiler.d.ts +2 -0
  13. package/dist/decompiler.js +44 -0
  14. package/dist/decompiler.js.map +1 -0
  15. package/dist/draft-protocol.d.ts +27 -0
  16. package/dist/draft-protocol.js +135 -0
  17. package/dist/draft-protocol.js.map +1 -0
  18. package/dist/errors.d.ts +12 -0
  19. package/dist/errors.js +40 -0
  20. package/dist/errors.js.map +1 -0
  21. package/dist/index.d.ts +28 -0
  22. package/dist/index.js +33 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/metrics.d.ts +30 -0
  25. package/dist/metrics.js +182 -0
  26. package/dist/metrics.js.map +1 -0
  27. package/dist/parser.d.ts +4 -0
  28. package/dist/parser.js +361 -0
  29. package/dist/parser.js.map +1 -0
  30. package/dist/spec.d.ts +17 -0
  31. package/dist/spec.js +86 -0
  32. package/dist/spec.js.map +1 -0
  33. package/dist/styles-react.d.ts +3 -0
  34. package/dist/styles-react.js +20 -0
  35. package/dist/styles-react.js.map +1 -0
  36. package/dist/styles-tailwind.d.ts +8 -0
  37. package/dist/styles-tailwind.js +197 -0
  38. package/dist/styles-tailwind.js.map +1 -0
  39. package/dist/transpiler-cli.d.ts +3 -0
  40. package/dist/transpiler-cli.js +279 -0
  41. package/dist/transpiler-cli.js.map +1 -0
  42. package/dist/transpiler-express.d.ts +3 -0
  43. package/dist/transpiler-express.js +612 -0
  44. package/dist/transpiler-express.js.map +1 -0
  45. package/dist/transpiler-nextjs.d.ts +21 -0
  46. package/dist/transpiler-nextjs.js +400 -0
  47. package/dist/transpiler-nextjs.js.map +1 -0
  48. package/dist/transpiler-tailwind.d.ts +3 -0
  49. package/dist/transpiler-tailwind.js +594 -0
  50. package/dist/transpiler-tailwind.js.map +1 -0
  51. package/dist/transpiler-terminal.d.ts +3 -0
  52. package/dist/transpiler-terminal.js +522 -0
  53. package/dist/transpiler-terminal.js.map +1 -0
  54. package/dist/transpiler-web.d.ts +3 -0
  55. package/dist/transpiler-web.js +218 -0
  56. package/dist/transpiler-web.js.map +1 -0
  57. package/dist/transpiler.d.ts +3 -0
  58. package/dist/transpiler.js +218 -0
  59. package/dist/transpiler.js.map +1 -0
  60. package/dist/types.d.ts +76 -0
  61. package/dist/types.js +11 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/utils.d.ts +5 -0
  64. package/dist/utils.js +36 -0
  65. package/dist/utils.js.map +1 -0
  66. package/kern.config.ts +61 -0
  67. package/package.json +64 -0
package/README.md ADDED
@@ -0,0 +1,304 @@
1
+ # Kern
2
+
3
+ **Write one `.kern` file. Ship 7 targets. Save 70% tokens.**
4
+
5
+ Kern is the language LLMs think in. A high-leverage authoring language that transpiles to production stacks you already use — and cuts AI token costs by 70% when used as a communication protocol between competing AI engines.
6
+
7
+ ### Why Kern exists
8
+
9
+ LLMs are expensive. Every token costs money. When an AI generates a React component, it outputs 500+ tokens of boilerplate — imports, StyleSheet, JSX, types. When two AIs discuss an implementation, they burn thousands of tokens on verbose natural language.
10
+
11
+ Kern solves both problems:
12
+
13
+ | Use case | Without Kern | With Kern | Savings |
14
+ |---|---|---|---|
15
+ | Generate a dashboard UI | 500+ tokens (React/TS) | 40 tokens (.kern) | **92%** |
16
+ | AI proposes an approach | 800+ tokens (natural language) | 80 tokens (draft block) | **90%** |
17
+ | 3 AIs brainstorm | 2,400+ tokens | 320 tokens | **87%** |
18
+ | Express API with 4 routes | 400+ tokens | 40 tokens | **90%** |
19
+
20
+ **For developers:** Write less, ship to more targets.
21
+ **For AI systems:** Communicate in structured blocks instead of verbose prose.
22
+ **For your wallet:** 70-90% fewer tokens = 70-90% lower API costs.
23
+
24
+ ```
25
+ screen name=Dashboard {bg:#F8F9FA}
26
+ row {p:16,jc:sb,ai:center}
27
+ text value=FITVT {fs:24,fw:bold}
28
+ image src=avatar {w:40,h:40,br:20}
29
+ card {p:16,br:12,bg:#FFF,m:16}
30
+ progress label=Calories current=1840 target=2200 color=#FF6B6B
31
+ progress label=Protein current=96 target=140 color=#4ECDC4
32
+ button text="Log Meal" {w:full,br:8,bg:#007AFF,p:16}
33
+ ```
34
+
35
+ That's 10 lines. Kern turns it into a complete React component with Tailwind classes, source maps, and token efficiency metrics. Or a Next.js page. Or a React Native screen. Or an Express API. Or a CLI. Or a terminal UI. Same source, 7 targets.
36
+
37
+ ## Targets
38
+
39
+ | Target | Command | Generates |
40
+ |---|---|---|
41
+ | **Next.js** | `kern file.kern --target=nextjs` | App Router pages with metadata, `next/link`, `next/image` |
42
+ | **Tailwind** | `kern file.kern --target=tailwind` | React + Tailwind CSS with `useState`, `useTranslation` |
43
+ | **Web** | `kern file.kern --target=web` | React with inline CSS styles |
44
+ | **React Native** | `kern file.kern --target=native` | React Native with `StyleSheet.create()` |
45
+ | **Express** | `kern file.kern --target=express` | Typed Express routes with SSE streaming, child process spawn, timeouts |
46
+ | **CLI** | `kern file.kern --target=cli` | Commander.js with typed args, flags, `parseAsync()` |
47
+ | **Terminal** | `kern file.kern --target=terminal` | ANSI terminal UI — tables, spinners, progress bars, gradients |
48
+
49
+ ## Install
50
+
51
+ ```bash
52
+ npm install kern-lang
53
+ ```
54
+
55
+ Global install for CLI usage:
56
+
57
+ ```bash
58
+ npm install -g kern-lang
59
+ ```
60
+
61
+ ## Quick Start
62
+
63
+ ```bash
64
+ # Transpile to Next.js
65
+ kern dashboard.kern --target=nextjs
66
+
67
+ # Transpile to Express API
68
+ kern api.kern --target=express
69
+
70
+ # Transpile to CLI app
71
+ kern mycli.kern --target=cli
72
+
73
+ # Transpile to terminal UI
74
+ kern ui.kern --target=terminal
75
+
76
+ # Show language metrics
77
+ kern dashboard.kern --metrics
78
+ ```
79
+
80
+ Or without global install:
81
+
82
+ ```bash
83
+ npx kern dashboard.kern --target=nextjs
84
+ ```
85
+
86
+ ## Express Backend Example
87
+
88
+ ```
89
+ server name=API port=3001
90
+ middleware name=cors
91
+ middleware name=json
92
+
93
+ route method=post path=/api/review
94
+ schema body="{diff: string}"
95
+ stream
96
+ handler <<<
97
+ const results = await analyze(req.body.diff);
98
+ for (const r of results) emit(r);
99
+ >>>
100
+
101
+ route method=get path=/health
102
+ handler <<<
103
+ res.json({ ok: true });
104
+ >>>
105
+ ```
106
+
107
+ Generates typed Express routes with SSE streaming, `AbortController` lifecycle, heartbeat keep-alive, and schema validation. Multi-file output via `GeneratedArtifact[]`.
108
+
109
+ ## CLI Example
110
+
111
+ ```
112
+ cli name=mytool version=1.0.0 description="My CLI tool"
113
+ command name=build
114
+ arg name=target type=string required=true
115
+ flag name=watch alias=w type=boolean description="Watch mode"
116
+ flag name=timeout type=number default=30
117
+ import from="./build.js" names=runBuild
118
+ handler <<<
119
+ await runBuild(target, opts);
120
+ >>>
121
+ ```
122
+
123
+ Generates Commander.js with `parseAsync()`, `parseFloat` coercion for number flags, `requiredOption()` for required flags, per-command files.
124
+
125
+ ## Terminal UI Example
126
+
127
+ ```
128
+ screen name=Dashboard
129
+ gradient text="MY APP" colors=[208,214,220,226,228]
130
+ separator width=48
131
+ scoreboard title="Results" winner="engine-1"
132
+ metric name=Score values=["89","74","71"]
133
+ metric name=Time values=["45s","52s","38s"]
134
+ spinner message="Processing..." color=214
135
+ progress value=75 max=100 color=214
136
+ ```
137
+
138
+ Generates pure Node.js ANSI escape codes — no dependencies. Tables, spinners, progress bars, gradients, boxes.
139
+
140
+ ## Metrics
141
+
142
+ ```bash
143
+ npx kern examples/dashboard.kern --metrics
144
+ ```
145
+
146
+ ```
147
+ Metrics: examples/dashboard.kern
148
+ Nodes: 23 (10 types)
149
+ Styles: 18 declarations
150
+ Mapped: 18 (100%)
151
+ Escaped: 0 (0%)
152
+ Shorthand: 94% coverage
153
+ Theme refs: 4
154
+ ```
155
+
156
+ The metrics engine tells you exactly how much of your design system Kern handles natively vs. needs escape hatches.
157
+
158
+ ## Configuration
159
+
160
+ ```typescript
161
+ // kern.config.ts
162
+ const config: KernConfig = {
163
+ target: 'nextjs',
164
+ i18n: { enabled: true, hookName: 'useTranslation' },
165
+ components: { uiLibrary: '@components/ui' },
166
+ colors: {
167
+ '#18181b': 'zinc-900',
168
+ '#f97316': 'orange-500',
169
+ // your design system colors
170
+ },
171
+ };
172
+ ```
173
+
174
+ Config loaded via `jiti` (same as Tailwind CSS, Nuxt). CLI flags override config values.
175
+
176
+ ## API
177
+
178
+ ```typescript
179
+ import {
180
+ parse,
181
+ transpileTailwind,
182
+ transpileNextjs,
183
+ transpileExpress,
184
+ transpileCliApp,
185
+ transpileTerminal,
186
+ collectLanguageMetrics,
187
+ resolveConfig,
188
+ } from 'kern-lang';
189
+
190
+ const ast = parse(kernSource);
191
+ const result = transpileTailwind(ast, resolveConfig({ colors: myColors }));
192
+ console.log(result.code);
193
+ ```
194
+
195
+ ## How It Was Built
196
+
197
+ Kern was designed by three AI architectures — Claude (Anthropic), Codex (OpenAI), and Gemini (Google) — through competitive forge, brainstorm, and tribunal processes. Each feature was:
198
+
199
+ 1. **Brainstormed** — all 3 AIs propose approaches in Kern draft format
200
+ 2. **Forged** — all 3 implement independently, scored by automated fitness tests
201
+ 3. **Reviewed** — losing AIs critique the winner, bugs are fixed
202
+
203
+ The Express target was forged in a 3-way competition. Codex won with typed generics and schema validation. Claude and Gemini's review caught 5 additional bugs. Every review found real issues — 9 review passes, 9 bugs caught and fixed.
204
+
205
+ 94 tests across 6 test suites. Zero type errors. Every commit verified.
206
+
207
+ ## Draft Protocol
208
+
209
+ Kern isn't just a transpiler — it's a communication protocol between AI engines. The Draft Protocol lets competing AIs exchange structured proposals:
210
+
211
+ ```
212
+ draft {
213
+ approach: "Use middleware chain with JWT validation"
214
+ reasoning: "Standard pattern, battle-tested"
215
+ tradeoffs: "adds latency", "requires secret management"
216
+ confidence: 82
217
+ keyFiles: "src/auth.ts", "src/middleware.ts"
218
+ steps {
219
+ 1: "Add jsonwebtoken dependency"
220
+ 2: "Create verifyToken middleware"
221
+ 3: "Wire into Express app.use()"
222
+ }
223
+ }
224
+ ```
225
+
226
+ 70% fewer tokens than natural language. Structured. Rankable. Engines speak Kern.
227
+
228
+ ## Token Savings — The Real Story
229
+
230
+ Kern was born from a real problem: running 3 AI engines in parallel is expensive. Every brainstorm session, every forge competition, every code review burns tokens. At scale, this is the #1 cost driver for multi-AI systems.
231
+
232
+ **Before Kern (natural language):**
233
+ ```
234
+ I think we should implement this using a middleware chain pattern with JWT
235
+ validation. The reasoning is that this is a standard, battle-tested approach
236
+ that works well with Express. The main tradeoffs are that it adds latency
237
+ per request and requires proper secret management. I'm about 82% confident
238
+ this is the right approach. The key files we'd need to modify are
239
+ src/auth.ts and src/middleware.ts. Here are the steps: first, add the
240
+ jsonwebtoken dependency, then create a verifyToken middleware function,
241
+ and finally wire it into the Express app.use() chain.
242
+ ```
243
+ **~120 tokens**
244
+
245
+ **After Kern (draft block):**
246
+ ```
247
+ draft {
248
+ approach: "Use middleware chain with JWT validation"
249
+ reasoning: "Standard pattern, battle-tested"
250
+ tradeoffs: "adds latency", "requires secret management"
251
+ confidence: 82
252
+ keyFiles: "src/auth.ts", "src/middleware.ts"
253
+ steps {
254
+ 1: "Add jsonwebtoken dependency"
255
+ 2: "Create verifyToken middleware"
256
+ 3: "Wire into Express app.use()"
257
+ }
258
+ }
259
+ ```
260
+ **~40 tokens** — same information, structured, parseable, rankable.
261
+
262
+ **Real-world numbers from Agon (competitive AI orchestration):**
263
+
264
+ | Operation | Old (natural language) | New (Kern) | Saved |
265
+ |---|---|---|---|
266
+ | 3-engine brainstorm | 2,400 tokens | 320 tokens | $0.02/call |
267
+ | Forge plan review | 1,600 tokens | 240 tokens | $0.01/call |
268
+ | Context injection | 800 tokens | 200 tokens | $0.005/call |
269
+ | **Daily (50 operations)** | **~240K tokens** | **~38K tokens** | **~$2/day** |
270
+ | **Monthly** | **~7.2M tokens** | **~1.1M tokens** | **~$60/month** |
271
+
272
+ For a solo dev running multi-AI tools, that's the difference between affordable and not. For a company running thousands of operations, it's the difference between viable and bankrupt.
273
+
274
+ Kern isn't just a language. It's a compression algorithm for AI communication.
275
+
276
+ ## License
277
+
278
+ **AGPL-3.0-or-later** — You are free to use, modify, and distribute Kern under the terms of the [GNU Affero General Public License v3.0](LICENSE). This means:
279
+
280
+ - If you modify Kern or build software that incorporates it, and you distribute that software or make it available over a network, you must release your source code under the same AGPL-3.0 terms.
281
+ - This applies equally to individuals, companies, and organizations.
282
+
283
+ **Commercial license:** If you want to use Kern in proprietary/closed-source software without the AGPL's source-sharing requirements, a commercial license is available. Contact [cukas](https://github.com/cukas) for details.
284
+
285
+ **In practice:** Solo developers, students, and open-source projects can use Kern freely. Companies building closed-source products need a commercial license — or they can open-source their code.
286
+
287
+ See [LICENSE](LICENSE) for the full text.
288
+
289
+ ---
290
+
291
+ ## Contributors
292
+
293
+ | Role | Who |
294
+ |---|---|
295
+ | **Creator & Director** | [cukas](https://github.com/cukas) |
296
+ | **Co-Architect** | Claude (Anthropic) — Opus 4.6 |
297
+ | **Co-Architect** | Codex (OpenAI) — GPT-5.4 |
298
+ | **Co-Architect** | Gemini (Google) |
299
+
300
+ Every feature was brainstormed by all 3 AIs, forged competitively, and cross-reviewed. 9 review passes, 9 bugs caught. The Express target was won by Codex in a 3-way forge. Engines speak Kern.
301
+
302
+ ---
303
+
304
+ **Swiss-engineered. AI-designed. Human-directed.**
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,244 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
3
+ import { resolve, basename, dirname } from 'path';
4
+ import { createJiti } from 'jiti';
5
+ import { parse } from './parser.js';
6
+ import { transpile } from './transpiler.js';
7
+ import { transpileWeb } from './transpiler-web.js';
8
+ import { transpileTailwind } from './transpiler-tailwind.js';
9
+ import { transpileNextjs } from './transpiler-nextjs.js';
10
+ import { transpileExpress } from './transpiler-express.js';
11
+ import { transpileCliApp } from './transpiler-cli.js';
12
+ import { transpileTerminal } from './transpiler-terminal.js';
13
+ import { decompile } from './decompiler.js';
14
+ import { resolveConfig, VALID_TARGETS } from './config.js';
15
+ import { collectLanguageMetrics } from './metrics.js';
16
+ const args = process.argv.slice(2);
17
+ const inputFile = args.find(a => !a.startsWith('--'));
18
+ if (!inputFile) {
19
+ console.log('Usage: kern <file.kern> [--target=nextjs|tailwind|web|native|express|cli] [options]');
20
+ console.log('');
21
+ console.log('Targets:');
22
+ console.log(' nextjs Next.js App Router (default)');
23
+ console.log(' tailwind React + Tailwind CSS');
24
+ console.log(' web React with inline styles');
25
+ console.log(' native React Native component');
26
+ console.log(' express Express TypeScript backend');
27
+ console.log(' cli Commander.js CLI app');
28
+ console.log(' terminal ANSI terminal rendering');
29
+ console.log('');
30
+ console.log('Options:');
31
+ console.log(' --decompile Output human-readable pseudocode');
32
+ console.log(' --minify Output minified single-line Kern (LLM wire format)');
33
+ console.log(' --pretty Expand minified Kern back to indented format');
34
+ console.log(' --metrics Show language metrics (escape ratio, coverage, etc.)');
35
+ process.exit(1);
36
+ }
37
+ // ── Load config via jiti (supports .ts config at runtime) ────────────────
38
+ let config;
39
+ const configPath = resolve(process.cwd(), 'kern.config.ts');
40
+ if (existsSync(configPath)) {
41
+ try {
42
+ const jiti = createJiti(import.meta.url);
43
+ const userConfig = jiti(configPath).default ?? jiti(configPath);
44
+ config = resolveConfig(userConfig);
45
+ }
46
+ catch (err) {
47
+ console.error(`Warning: Failed to load kern.config.ts: ${err.message}`);
48
+ config = resolveConfig({});
49
+ }
50
+ }
51
+ else {
52
+ config = resolveConfig({});
53
+ }
54
+ // CLI flags override config — target
55
+ const cliTarget = args.find(a => a.startsWith('--target='))?.split('=')[1];
56
+ if (cliTarget) {
57
+ if (!VALID_TARGETS.includes(cliTarget)) {
58
+ console.error(`Unknown target: '${cliTarget}'. Valid targets: ${VALID_TARGETS.join(', ')}`);
59
+ process.exit(1);
60
+ }
61
+ config = { ...config, target: cliTarget };
62
+ }
63
+ const target = config.target;
64
+ const irSource = readFileSync(resolve(inputFile), 'utf-8');
65
+ const ast = parse(irSource);
66
+ const ext = inputFile.endsWith('.kern') ? '.kern' : '.ir';
67
+ const name = basename(inputFile, ext);
68
+ // ── Minify: indented Kern → single-line wire format ─────────────────────
69
+ if (args.includes('--minify')) {
70
+ const minified = minifyKern(ast);
71
+ const outFile = resolve(dirname(inputFile), `${name}.min.kern`);
72
+ writeFileSync(outFile, minified);
73
+ const savings = Math.round((1 - minified.length / irSource.length) * 100);
74
+ console.log(`Minified: ${inputFile} → ${outFile}`);
75
+ console.log(`Chars: ${irSource.length} → ${minified.length} (${savings}% smaller)`);
76
+ process.exit(0);
77
+ }
78
+ // ── Pretty: re-indent (useful after minify or messy edits) ──────────────
79
+ if (args.includes('--pretty')) {
80
+ const pretty = prettyKern(ast);
81
+ const outFile = resolve(dirname(inputFile), `${name}.kern`);
82
+ writeFileSync(outFile, pretty);
83
+ console.log(`Formatted: ${inputFile} → ${outFile}`);
84
+ process.exit(0);
85
+ }
86
+ // ── Decompile: Kern → human-readable pseudocode ─────────────────────────
87
+ if (args.includes('--decompile')) {
88
+ const result = decompile(ast);
89
+ console.log(result.code);
90
+ process.exit(0);
91
+ }
92
+ // ── Metrics: analyze language coverage ────────────────────────────────────
93
+ if (args.includes('--metrics')) {
94
+ const metrics = collectLanguageMetrics(ast);
95
+ console.log(`Metrics: ${inputFile}`);
96
+ console.log(` Nodes: ${metrics.nodeCount} (${metrics.nodeTypes.length} types)`);
97
+ console.log(` Styles: ${metrics.styleMetrics.totalStyleDecls} declarations`);
98
+ console.log(` Mapped: ${metrics.styleMetrics.mappedStyleDecls} (${Math.round((1 - metrics.styleMetrics.escapeRatio) * 100)}%)`);
99
+ console.log(` Escaped: ${metrics.styleMetrics.escapedStyleDecls} (${Math.round(metrics.styleMetrics.escapeRatio * 100)}%)`);
100
+ if (metrics.styleMetrics.escapedKeys.length > 0) {
101
+ console.log(` Escape keys: ${metrics.styleMetrics.escapedKeys.join(', ')}`);
102
+ }
103
+ console.log(` Shorthand: ${Math.round(metrics.shorthandCoverage * 100)}% coverage`);
104
+ console.log(` Theme refs: ${metrics.themeRefCount}`);
105
+ console.log(` Pseudo: ${metrics.pseudoStyleCount}`);
106
+ if (metrics.unknownNodeCount > 0) {
107
+ console.log(` Unknown nodes: ${metrics.unknownNodeCount}`);
108
+ }
109
+ console.log('');
110
+ console.log(' Node types:');
111
+ for (const nt of metrics.nodeTypes.slice(0, 10)) {
112
+ console.log(` ${nt.type}: ${nt.count} (${nt.styleDecls} styles)`);
113
+ }
114
+ process.exit(0);
115
+ }
116
+ // ── Transpile: Kern → target code ───────────────────────────────────────
117
+ const result = target === 'native'
118
+ ? transpile(ast, config)
119
+ : target === 'web'
120
+ ? transpileWeb(ast, config)
121
+ : target === 'tailwind'
122
+ ? transpileTailwind(ast, config)
123
+ : target === 'express'
124
+ ? transpileExpress(ast, config)
125
+ : target === 'cli'
126
+ ? transpileCliApp(ast, config)
127
+ : target === 'terminal'
128
+ ? transpileTerminal(ast, config)
129
+ : transpileNextjs(ast, config);
130
+ const outDir = resolve(dirname(inputFile), config.output.outDir);
131
+ const outExt = (target === 'express' || target === 'cli' || target === 'terminal') ? '.ts' : '.tsx';
132
+ const outFile = resolve(outDir, `${name}${outExt}`);
133
+ mkdirSync(dirname(outFile), { recursive: true });
134
+ writeFileSync(outFile, result.code);
135
+ if (result.artifacts) {
136
+ for (const artifact of result.artifacts) {
137
+ const artifactPath = resolve(outDir, artifact.path);
138
+ mkdirSync(dirname(artifactPath), { recursive: true });
139
+ writeFileSync(artifactPath, artifact.content);
140
+ }
141
+ }
142
+ console.log(`Transpiled: ${inputFile} → ${outFile}`);
143
+ const targetNames = { native: 'React Native', web: 'React (inline)', tailwind: 'React + Tailwind', nextjs: 'Next.js App Router', express: 'Express TypeScript', cli: 'Commander.js CLI', terminal: 'ANSI Terminal' };
144
+ console.log(`Target: ${targetNames[target] || target}`);
145
+ console.log(`IR tokens: ${result.irTokenCount}`);
146
+ console.log(`TS tokens: ${result.tsTokenCount}`);
147
+ console.log(`Reduction: ${result.tokenReduction}%`);
148
+ console.log(`Source map: ${result.sourceMap.length} entries`);
149
+ if (result.artifacts) {
150
+ console.log(`Artifacts: ${result.artifacts.length}`);
151
+ }
152
+ // ── Minify/Pretty implementations ───────────────────────────────────────
153
+ function minifyKern(node) {
154
+ const type = node.type;
155
+ const props = node.props || {};
156
+ let head = type;
157
+ // Serialize props (theme name is bare word, not key=value)
158
+ for (const [k, v] of Object.entries(props)) {
159
+ if (['styles', 'pseudoStyles', 'themeRefs'].includes(k))
160
+ continue;
161
+ if (type === 'theme' && k === 'name') {
162
+ head += ` ${v}`;
163
+ continue;
164
+ }
165
+ if (typeof v === 'object' && v !== null && '__expr' in v) {
166
+ head += ` ${k}={{ ${v.code} }}`;
167
+ continue;
168
+ }
169
+ const val = typeof v === 'string' && v.includes(' ') ? `"${v}"` : String(v);
170
+ head += ` ${k}=${val}`;
171
+ }
172
+ // Serialize styles
173
+ if (props.styles) {
174
+ const pairs = Object.entries(props.styles)
175
+ .map(([k, v]) => v.includes(' ') || v.includes(',') ? `"${k}":"${v}"` : `${k}:${v}`);
176
+ head += ` {${pairs.join(',')}}`;
177
+ }
178
+ // Serialize pseudo styles
179
+ if (props.pseudoStyles) {
180
+ const pseudo = props.pseudoStyles;
181
+ for (const [state, styles] of Object.entries(pseudo)) {
182
+ for (const [k, v] of Object.entries(styles)) {
183
+ head += ` {:${state}:${k}:${v}}`;
184
+ }
185
+ }
186
+ }
187
+ // Theme refs
188
+ if (props.themeRefs) {
189
+ for (const ref of props.themeRefs) {
190
+ head += ` $${ref}`;
191
+ }
192
+ }
193
+ // Children → S-expression style
194
+ if (node.children && node.children.length > 0) {
195
+ const kids = node.children.map(c => minifyKern(c)).join(',');
196
+ return `${head}(${kids})`;
197
+ }
198
+ return head;
199
+ }
200
+ function prettyKern(node, indent = '') {
201
+ const type = node.type;
202
+ const props = node.props || {};
203
+ let line = `${indent}${type}`;
204
+ for (const [k, v] of Object.entries(props)) {
205
+ if (['styles', 'pseudoStyles', 'themeRefs'].includes(k))
206
+ continue;
207
+ if (type === 'theme' && k === 'name') {
208
+ line += ` ${v}`;
209
+ continue;
210
+ }
211
+ if (typeof v === 'object' && v !== null && '__expr' in v) {
212
+ line += ` ${k}={{ ${v.code} }}`;
213
+ continue;
214
+ }
215
+ const val = typeof v === 'string' && v.includes(' ') ? `"${v}"` : String(v);
216
+ line += ` ${k}=${val}`;
217
+ }
218
+ if (props.styles) {
219
+ const pairs = Object.entries(props.styles)
220
+ .map(([k, v]) => v.includes(' ') || v.includes(',') ? `"${k}":"${v}"` : `${k}:${v}`);
221
+ line += ` {${pairs.join(',')}}`;
222
+ }
223
+ if (props.pseudoStyles) {
224
+ const pseudo = props.pseudoStyles;
225
+ for (const [state, styles] of Object.entries(pseudo)) {
226
+ for (const [k, v] of Object.entries(styles)) {
227
+ line += `,${`:${state}:${k}:${v}`}`;
228
+ }
229
+ }
230
+ }
231
+ if (props.themeRefs) {
232
+ for (const ref of props.themeRefs) {
233
+ line += ` $${ref}`;
234
+ }
235
+ }
236
+ let result = line + '\n';
237
+ if (node.children) {
238
+ for (const child of node.children) {
239
+ result += prettyKern(child, indent + ' ');
240
+ }
241
+ }
242
+ return result;
243
+ }
244
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Kern Configuration Types
3
+ */
4
+ export type KernTarget = 'nextjs' | 'tailwind' | 'web' | 'native' | 'express' | 'cli' | 'terminal';
5
+ export declare const VALID_TARGETS: KernTarget[];
6
+ export interface KernConfig {
7
+ target?: KernTarget;
8
+ i18n?: {
9
+ enabled?: boolean;
10
+ hookName?: string;
11
+ importPath?: string;
12
+ };
13
+ components?: {
14
+ uiLibrary?: string;
15
+ componentRoot?: string;
16
+ mappings?: Record<string, string>;
17
+ };
18
+ colors?: Record<string, string>;
19
+ output?: {
20
+ outDir?: string;
21
+ sourceMaps?: boolean;
22
+ };
23
+ }
24
+ /** Fully resolved config — all fields required, no optionals */
25
+ export interface ResolvedKernConfig {
26
+ target: KernTarget;
27
+ i18n: {
28
+ enabled: boolean;
29
+ hookName: string;
30
+ importPath: string;
31
+ };
32
+ components: {
33
+ uiLibrary: string;
34
+ componentRoot: string;
35
+ mappings: Record<string, string>;
36
+ };
37
+ colors: Record<string, string>;
38
+ output: {
39
+ outDir: string;
40
+ sourceMaps: boolean;
41
+ };
42
+ }
43
+ export declare const DEFAULT_CONFIG: ResolvedKernConfig;
44
+ export declare function resolveConfig(user?: Partial<KernConfig>): ResolvedKernConfig;
45
+ /** @deprecated Use resolveConfig instead */
46
+ export declare function mergeConfig(user: Partial<KernConfig>): KernConfig;
package/dist/config.js ADDED
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Kern Configuration Types
3
+ */
4
+ import { DEFAULT_COLORS } from './styles-tailwind.js';
5
+ export const VALID_TARGETS = ['nextjs', 'tailwind', 'web', 'native', 'express', 'cli', 'terminal'];
6
+ export const DEFAULT_CONFIG = {
7
+ target: 'nextjs',
8
+ i18n: {
9
+ enabled: true,
10
+ hookName: 'useTranslation',
11
+ importPath: 'react-i18next',
12
+ },
13
+ components: {
14
+ uiLibrary: '@components/ui',
15
+ componentRoot: '@/components',
16
+ mappings: {},
17
+ },
18
+ colors: { ...DEFAULT_COLORS },
19
+ output: {
20
+ outDir: '.',
21
+ sourceMaps: false,
22
+ },
23
+ };
24
+ export function resolveConfig(user) {
25
+ if (!user)
26
+ return { ...DEFAULT_CONFIG };
27
+ // Validate target
28
+ if (user.target && !VALID_TARGETS.includes(user.target)) {
29
+ throw new Error(`Unknown target: '${user.target}'. Valid targets: ${VALID_TARGETS.join(', ')}`);
30
+ }
31
+ return {
32
+ target: user.target || DEFAULT_CONFIG.target,
33
+ i18n: {
34
+ enabled: user.i18n?.enabled ?? DEFAULT_CONFIG.i18n.enabled,
35
+ hookName: user.i18n?.hookName ?? DEFAULT_CONFIG.i18n.hookName,
36
+ importPath: user.i18n?.importPath ?? DEFAULT_CONFIG.i18n.importPath,
37
+ },
38
+ components: {
39
+ uiLibrary: user.components?.uiLibrary ?? DEFAULT_CONFIG.components.uiLibrary,
40
+ componentRoot: user.components?.componentRoot ?? DEFAULT_CONFIG.components.componentRoot,
41
+ mappings: { ...DEFAULT_CONFIG.components.mappings, ...user.components?.mappings },
42
+ },
43
+ colors: { ...DEFAULT_CONFIG.colors, ...user.colors },
44
+ output: {
45
+ outDir: user.output?.outDir ?? DEFAULT_CONFIG.output.outDir,
46
+ sourceMaps: user.output?.sourceMaps ?? DEFAULT_CONFIG.output.sourceMaps,
47
+ },
48
+ };
49
+ }
50
+ /** @deprecated Use resolveConfig instead */
51
+ export function mergeConfig(user) {
52
+ return resolveConfig(user);
53
+ }
54
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,MAAM,CAAC,MAAM,aAAa,GAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AAiDjH,MAAM,CAAC,MAAM,cAAc,GAAuB;IAChD,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,gBAAgB;QAC1B,UAAU,EAAE,eAAe;KAC5B;IACD,UAAU,EAAE;QACV,SAAS,EAAE,gBAAgB;QAC3B,aAAa,EAAE,cAAc;QAC7B,QAAQ,EAAE,EAAE;KACb;IACD,MAAM,EAAE,EAAE,GAAG,cAAc,EAAE;IAC7B,MAAM,EAAE;QACN,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,KAAK;KAClB;CACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAA0B;IACtD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAExC,kBAAkB;IAClB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,MAAM,qBAAqB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM;QAC5C,IAAI,EAAE;YACJ,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO;YAC1D,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ;YAC7D,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,IAAI,cAAc,CAAC,IAAI,CAAC,UAAU;SACpE;QACD,UAAU,EAAE;YACV,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,IAAI,cAAc,CAAC,UAAU,CAAC,SAAS;YAC5E,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,IAAI,cAAc,CAAC,UAAU,CAAC,aAAa;YACxF,QAAQ,EAAE,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE;SAClF;QACD,MAAM,EAAE,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;QACpD,MAAM,EAAE;YACN,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM;YAC3D,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,IAAI,cAAc,CAAC,MAAM,CAAC,UAAU;SACxE;KACF,CAAC;AACJ,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,WAAW,CAAC,IAAyB;IACnD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}