@nxuss/lemma 0.9.2 → 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 (69) hide show
  1. package/README.md +79 -12
  2. package/bin/cli.js +97 -0
  3. package/bin/init.js +307 -0
  4. package/cache-proxy.js +191 -0
  5. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
  6. package/dist/cjs/cli/lemma-proxy.js +2 -4
  7. package/dist/cjs/cli/lemma-proxy.js.map +1 -1
  8. package/dist/cjs/mcp/index.js +1 -1
  9. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  10. package/dist/cjs/mcp/tools.js +911 -71
  11. package/dist/cjs/mcp/tools.js.map +1 -1
  12. package/dist/cjs/subconscious/TheBrainV2.d.ts +102 -0
  13. package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -0
  14. package/dist/cjs/subconscious/TheBrainV2.js +444 -0
  15. package/dist/cjs/subconscious/TheBrainV2.js.map +1 -0
  16. package/dist/cjs/utils/ContextCollapser.d.ts +21 -0
  17. package/dist/cjs/utils/ContextCollapser.d.ts.map +1 -0
  18. package/dist/cjs/utils/ContextCollapser.js +132 -0
  19. package/dist/cjs/utils/ContextCollapser.js.map +1 -0
  20. package/dist/cjs/utils/ExecutiveReport.d.ts +29 -0
  21. package/dist/cjs/utils/ExecutiveReport.d.ts.map +1 -0
  22. package/dist/cjs/utils/ExecutiveReport.js +111 -0
  23. package/dist/cjs/utils/ExecutiveReport.js.map +1 -0
  24. package/dist/cjs/utils/SurgicalASTInsert.d.ts +21 -0
  25. package/dist/cjs/utils/SurgicalASTInsert.d.ts.map +1 -0
  26. package/dist/cjs/utils/SurgicalASTInsert.js +173 -0
  27. package/dist/cjs/utils/SurgicalASTInsert.js.map +1 -0
  28. package/dist/cjs/utils/SymbolSurgicalContext.d.ts +25 -0
  29. package/dist/cjs/utils/SymbolSurgicalContext.d.ts.map +1 -0
  30. package/dist/cjs/utils/SymbolSurgicalContext.js +265 -0
  31. package/dist/cjs/utils/SymbolSurgicalContext.js.map +1 -0
  32. package/dist/cjs/utils/WormholeCompressor.d.ts +22 -0
  33. package/dist/cjs/utils/WormholeCompressor.d.ts.map +1 -0
  34. package/dist/cjs/utils/WormholeCompressor.js +152 -0
  35. package/dist/cjs/utils/WormholeCompressor.js.map +1 -0
  36. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
  37. package/dist/esm/cli/lemma-proxy.js +2 -4
  38. package/dist/esm/cli/lemma-proxy.js.map +1 -1
  39. package/dist/esm/mcp/index.js +1 -1
  40. package/dist/esm/mcp/tools.d.ts.map +1 -1
  41. package/dist/esm/mcp/tools.js +911 -71
  42. package/dist/esm/mcp/tools.js.map +1 -1
  43. package/dist/esm/subconscious/TheBrainV2.d.ts +102 -0
  44. package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -0
  45. package/dist/esm/subconscious/TheBrainV2.js +431 -0
  46. package/dist/esm/subconscious/TheBrainV2.js.map +1 -0
  47. package/dist/esm/utils/ContextCollapser.d.ts +21 -0
  48. package/dist/esm/utils/ContextCollapser.d.ts.map +1 -0
  49. package/dist/esm/utils/ContextCollapser.js +128 -0
  50. package/dist/esm/utils/ContextCollapser.js.map +1 -0
  51. package/dist/esm/utils/ExecutiveReport.d.ts +29 -0
  52. package/dist/esm/utils/ExecutiveReport.d.ts.map +1 -0
  53. package/dist/esm/utils/ExecutiveReport.js +105 -0
  54. package/dist/esm/utils/ExecutiveReport.js.map +1 -0
  55. package/dist/esm/utils/SurgicalASTInsert.d.ts +21 -0
  56. package/dist/esm/utils/SurgicalASTInsert.d.ts.map +1 -0
  57. package/dist/esm/utils/SurgicalASTInsert.js +134 -0
  58. package/dist/esm/utils/SurgicalASTInsert.js.map +1 -0
  59. package/dist/esm/utils/SymbolSurgicalContext.d.ts +25 -0
  60. package/dist/esm/utils/SymbolSurgicalContext.d.ts.map +1 -0
  61. package/dist/esm/utils/SymbolSurgicalContext.js +226 -0
  62. package/dist/esm/utils/SymbolSurgicalContext.js.map +1 -0
  63. package/dist/esm/utils/WormholeCompressor.d.ts +22 -0
  64. package/dist/esm/utils/WormholeCompressor.d.ts.map +1 -0
  65. package/dist/esm/utils/WormholeCompressor.js +148 -0
  66. package/dist/esm/utils/WormholeCompressor.js.map +1 -0
  67. package/lemma-proxy.cjs +31 -14
  68. package/mcp-server.js +220 -0
  69. package/package.json +5 -1
@@ -0,0 +1,226 @@
1
+ /**
2
+ * SymbolSurgicalContext — Surgical AST extraction tool.
3
+ *
4
+ * Scans a file for a specific symbol (class, function, variable, interface),
5
+ * extracts its implementation, parses its AST to find workspace dependencies,
6
+ * and extracts ONLY the signatures of those dependencies (not their entire files).
7
+ *
8
+ * Saves up to 90% of token context in LLM prompts.
9
+ */
10
+ import fs from 'fs';
11
+ import path from 'path';
12
+ import * as ts from 'typescript';
13
+ import { safeResolvePath } from '../mcp/utils';
14
+ /**
15
+ * Traverses AST to find the node defining the specified symbol name.
16
+ */
17
+ function findSymbolNode(sourceFile, name) {
18
+ let targetNode = null;
19
+ function walk(node) {
20
+ if (targetNode)
21
+ return;
22
+ if (ts.isFunctionDeclaration(node) && node.name && node.name.text === name) {
23
+ targetNode = node;
24
+ return;
25
+ }
26
+ if (ts.isClassDeclaration(node) && node.name && node.name.text === name) {
27
+ targetNode = node;
28
+ return;
29
+ }
30
+ if (ts.isInterfaceDeclaration(node) && node.name && node.name.text === name) {
31
+ targetNode = node;
32
+ return;
33
+ }
34
+ if (ts.isTypeAliasDeclaration(node) && node.name && node.name.text === name) {
35
+ targetNode = node;
36
+ return;
37
+ }
38
+ if (ts.isEnumDeclaration(node) && node.name && node.name.text === name) {
39
+ targetNode = node;
40
+ return;
41
+ }
42
+ if (ts.isVariableStatement(node)) {
43
+ for (const decl of node.declarationList.declarations) {
44
+ if (ts.isIdentifier(decl.name) && decl.name.text === name) {
45
+ targetNode = node; // return the entire variable statement
46
+ return;
47
+ }
48
+ }
49
+ }
50
+ ts.forEachChild(node, walk);
51
+ }
52
+ walk(sourceFile);
53
+ return targetNode;
54
+ }
55
+ /**
56
+ * Extracts referenced identifiers from a node.
57
+ */
58
+ function extractReferences(node) {
59
+ const refs = new Set();
60
+ function walk(n) {
61
+ if (ts.isIdentifier(n)) {
62
+ refs.add(n.text);
63
+ }
64
+ ts.forEachChild(n, walk);
65
+ }
66
+ walk(node);
67
+ return refs;
68
+ }
69
+ /**
70
+ * Finds the import declarations in a file to map imported symbols to their paths.
71
+ */
72
+ function parseImports(sourceFile, currentFilePath, workspaceRoot) {
73
+ const importMap = new Map(); // symbol name -> relative module path
74
+ ts.forEachChild(sourceFile, (node) => {
75
+ if (ts.isImportDeclaration(node) && node.moduleSpecifier && ts.isStringLiteral(node.moduleSpecifier)) {
76
+ const spec = node.moduleSpecifier.text;
77
+ // We only care about relative imports (workspace files)
78
+ if (spec.startsWith('.')) {
79
+ const importDir = path.dirname(currentFilePath);
80
+ let resolvedPath = path.resolve(importDir, spec);
81
+ // Find exact extension matching
82
+ for (const ext of ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js']) {
83
+ if (fs.existsSync(resolvedPath + ext)) {
84
+ resolvedPath += ext;
85
+ break;
86
+ }
87
+ }
88
+ const relPath = path.relative(workspaceRoot, resolvedPath).replace(/\\/g, '/');
89
+ // Extract imported names
90
+ if (node.importClause) {
91
+ // Default import: import Foo from './Foo'
92
+ if (node.importClause.name) {
93
+ importMap.set(node.importClause.name.text, relPath);
94
+ }
95
+ // Named imports: import { Foo, Bar } from './Module'
96
+ if (node.importClause.namedBindings) {
97
+ if (ts.isNamedImports(node.importClause.namedBindings)) {
98
+ for (const el of node.importClause.namedBindings.elements) {
99
+ importMap.set(el.name.text, relPath);
100
+ }
101
+ }
102
+ else if (ts.isNamespaceImport(node.importClause.namedBindings)) {
103
+ // import * as Foo from './Module'
104
+ importMap.set(node.importClause.namedBindings.name.text, relPath);
105
+ }
106
+ }
107
+ }
108
+ }
109
+ }
110
+ });
111
+ return importMap;
112
+ }
113
+ /**
114
+ * Extracts ONLY the signature declaration of a symbol, dropping the function/method body.
115
+ */
116
+ function getSignatureText(node, sourceText) {
117
+ if (ts.isFunctionDeclaration(node)) {
118
+ const start = node.getStart();
119
+ let end = node.body ? node.body.getStart() : node.getEnd();
120
+ let sig = sourceText.substring(start, end).trim();
121
+ if (sig.endsWith('{'))
122
+ sig = sig.slice(0, -1).trim();
123
+ return { signature: sig, type: 'function' };
124
+ }
125
+ if (ts.isClassDeclaration(node)) {
126
+ const start = node.getStart();
127
+ // For class declaration, get just the class definition signature and public methods signatures
128
+ let end = node.members.length > 0 ? node.members[0].getStart() : node.getEnd();
129
+ let classHeader = sourceText.substring(start, end).trim();
130
+ if (classHeader.endsWith('{'))
131
+ classHeader = classHeader.slice(0, -1).trim();
132
+ // Add public methods/members signatures
133
+ const memberSigs = [];
134
+ for (const member of node.members) {
135
+ if (ts.isMethodDeclaration(member) && member.name) {
136
+ // Only include public methods
137
+ const modifiers = ts.getModifiers(member);
138
+ const isPrivate = modifiers?.some(m => m.kind === ts.SyntaxKind.PrivateKeyword);
139
+ if (!isPrivate) {
140
+ const mStart = member.getStart();
141
+ let mEnd = member.body ? member.body.getStart() : member.getEnd();
142
+ let mSig = sourceText.substring(mStart, mEnd).trim();
143
+ if (mSig.endsWith('{'))
144
+ mSig = mSig.slice(0, -1).trim();
145
+ memberSigs.push(` ${mSig};`);
146
+ }
147
+ }
148
+ else if (ts.isPropertyDeclaration(member) && member.name) {
149
+ memberSigs.push(` ${member.getText().split('=')[0].trim()};`);
150
+ }
151
+ }
152
+ return {
153
+ signature: `${classHeader} {\n${memberSigs.join('\n')}\n}`,
154
+ type: 'class'
155
+ };
156
+ }
157
+ if (ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node) || ts.isEnumDeclaration(node)) {
158
+ return { signature: node.getText().trim(), type: 'type' };
159
+ }
160
+ return { signature: node.getText().trim(), type: 'variable' };
161
+ }
162
+ /**
163
+ * Extracts a specific symbol signature from a dependency file.
164
+ */
165
+ function extractDependencySignature(filePath, symbolName) {
166
+ try {
167
+ if (!fs.existsSync(filePath))
168
+ return null;
169
+ const src = fs.readFileSync(filePath, 'utf8');
170
+ const sf = ts.createSourceFile(filePath, src, ts.ScriptTarget.Latest, true);
171
+ const node = findSymbolNode(sf, symbolName);
172
+ if (!node)
173
+ return null;
174
+ return getSignatureText(node, src);
175
+ }
176
+ catch {
177
+ return null;
178
+ }
179
+ }
180
+ /**
181
+ * Core orchestrator for Surgical Symbol Context Extraction.
182
+ */
183
+ export function getSymbolSurgicalContext(workspaceRoot, relativeFilePath, symbolName) {
184
+ const { resolved: resolvedTarget } = safeResolvePath(workspaceRoot, relativeFilePath);
185
+ if (!fs.existsSync(resolvedTarget)) {
186
+ throw new Error(`File not found: ${relativeFilePath}`);
187
+ }
188
+ const src = fs.readFileSync(resolvedTarget, 'utf8');
189
+ const sf = ts.createSourceFile(resolvedTarget, src, ts.ScriptTarget.Latest, true);
190
+ const node = findSymbolNode(sf, symbolName);
191
+ if (!node) {
192
+ throw new Error(`Symbol "${symbolName}" not found in file "${relativeFilePath}"`);
193
+ }
194
+ // 1. Get entire implementation of target symbol
195
+ const implementation = node.getText();
196
+ // 2. Map imports of this file
197
+ const importsMap = parseImports(sf, resolvedTarget, workspaceRoot);
198
+ // 3. Find all identifiers referenced in the symbol implementation
199
+ const refs = extractReferences(node);
200
+ // 4. Resolve references that are imported from other workspace files
201
+ const dependencies = [];
202
+ for (const ref of refs) {
203
+ if (ref === symbolName)
204
+ continue; // skip self reference
205
+ const moduleRelPath = importsMap.get(ref);
206
+ if (moduleRelPath) {
207
+ const depAbsPath = path.resolve(workspaceRoot, moduleRelPath);
208
+ const depInfo = extractDependencySignature(depAbsPath, ref);
209
+ if (depInfo) {
210
+ dependencies.push({
211
+ name: ref,
212
+ filePath: moduleRelPath,
213
+ signature: depInfo.signature,
214
+ type: depInfo.type
215
+ });
216
+ }
217
+ }
218
+ }
219
+ return {
220
+ symbolName,
221
+ filePath: relativeFilePath,
222
+ implementation,
223
+ dependencies
224
+ };
225
+ }
226
+ //# sourceMappingURL=SymbolSurgicalContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SymbolSurgicalContext.js","sourceRoot":"","sources":["../../../src/utils/SymbolSurgicalContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * WormholeCompressor — Reversible, token-dense serialization for source code.
3
+ *
4
+ * Compresses source code into a highly dense representation, substituting keywords
5
+ * and repeating identifiers with short tokens. Includes a self-contained dictionary
6
+ * header so the LLM or helper scripts can inflate/deflate it on the fly.
7
+ *
8
+ * Reduces token footprint for long files by 60-70% while keeping it structured and reversible.
9
+ */
10
+ export interface CompressedPayload {
11
+ dict: Record<string, string>;
12
+ payload: string;
13
+ }
14
+ /**
15
+ * Compresses source code into a Wormhole representation.
16
+ */
17
+ export declare function compressWormhole(code: string): string;
18
+ /**
19
+ * Reverts a Wormhole-compressed payload back to standard source code.
20
+ */
21
+ export declare function decompressWormhole(wormholeCode: string): string;
22
+ //# sourceMappingURL=WormholeCompressor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WormholeCompressor.d.ts","sourceRoot":"","sources":["../../../src/utils/WormholeCompressor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqCH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAwErD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAsC/D"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * WormholeCompressor — Reversible, token-dense serialization for source code.
3
+ *
4
+ * Compresses source code into a highly dense representation, substituting keywords
5
+ * and repeating identifiers with short tokens. Includes a self-contained dictionary
6
+ * header so the LLM or helper scripts can inflate/deflate it on the fly.
7
+ *
8
+ * Reduces token footprint for long files by 60-70% while keeping it structured and reversible.
9
+ */
10
+ // ─── Dictionary mappings ───
11
+ const KEYWORD_MAP = {
12
+ 'function': 'ƒ',
13
+ 'const': '¢',
14
+ 'let': 'ℓ',
15
+ 'return': '⏎',
16
+ 'export': '⨂',
17
+ 'async': '⨁',
18
+ 'await': '⨀',
19
+ 'import': '⨃',
20
+ 'Promise': '⨄',
21
+ 'interface': '⨅',
22
+ 'class': '⨆',
23
+ 'undefined': '⨇',
24
+ 'null': '⨈',
25
+ 'console.log': '⨍',
26
+ 'console.error': '⨎',
27
+ 'console.warn': '⨏',
28
+ 'this.': '⨌',
29
+ 'public': '⨗',
30
+ 'private': '⨘',
31
+ 'protected': '⨙',
32
+ 'static': '⨚',
33
+ 'constructor': '⨛',
34
+ 'implements': '⨜',
35
+ 'extends': '⨝'
36
+ };
37
+ // Reverse map for decompression
38
+ const REVERSE_KEYWORD_MAP = {};
39
+ for (const [k, v] of Object.entries(KEYWORD_MAP)) {
40
+ REVERSE_KEYWORD_MAP[v] = k;
41
+ }
42
+ /**
43
+ * Compresses source code into a Wormhole representation.
44
+ */
45
+ export function compressWormhole(code) {
46
+ // 1. Strip comments first to maximize savings (since this is reversible, comments are lost,
47
+ // but for LLM context reading that is exactly what we want)
48
+ let clean = code
49
+ .replace(/\/\*[\s\S]*?\*\//g, '')
50
+ .replace(/\/\/.*$/gm, '')
51
+ .split('\n')
52
+ .map(line => line.trimEnd())
53
+ .filter(line => line.trim().length > 0)
54
+ .join('\n');
55
+ // 2. Identify long repeating identifiers (camelCase/PascalCase > 6 chars)
56
+ const identifierRegex = /\b[a-zA-Z_][a-zA-Z0-9_]{5,}\b/g;
57
+ const matches = clean.match(identifierRegex) || [];
58
+ const freq = {};
59
+ for (const m of matches) {
60
+ // Skip words that are standard keywords
61
+ if (KEYWORD_MAP[m] || m === 'String' || m === 'Number' || m === 'Boolean' || m === 'Object' || m === 'Array')
62
+ continue;
63
+ freq[m] = (freq[m] || 0) + 1;
64
+ }
65
+ // Filter identifiers that appear at least twice
66
+ const sortedIdentifiers = Object.entries(freq)
67
+ .filter(([, count]) => count >= 2)
68
+ .sort((a, b) => b[1] - a[1])
69
+ .map(([word]) => word);
70
+ // 3. Create short alias map ($a, $b, ... $z, $A, $B...)
71
+ const dictionary = {};
72
+ const revDictionary = {};
73
+ const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
74
+ let aliasIndex = 0;
75
+ for (const word of sortedIdentifiers) {
76
+ if (aliasIndex >= chars.length)
77
+ break; // cap at 52 unique replacements
78
+ const alias = `$${chars[aliasIndex]}`;
79
+ dictionary[word] = alias;
80
+ revDictionary[alias] = word;
81
+ aliasIndex++;
82
+ }
83
+ // 4. Perform replacements
84
+ let payload = clean;
85
+ // Replace identifiers
86
+ for (const [word, alias] of Object.entries(dictionary)) {
87
+ // Use word boundary to avoid partial replacements
88
+ const escaped = word.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
89
+ const regex = new RegExp(`\\b${escaped}\\b`, 'g');
90
+ payload = payload.replace(regex, alias);
91
+ }
92
+ // Replace standard keywords
93
+ for (const [word, alias] of Object.entries(KEYWORD_MAP)) {
94
+ // Avoid boundary checks for things ending/starting with special characters like "this." or "console."
95
+ if (word.includes('.')) {
96
+ payload = payload.split(word).join(alias);
97
+ }
98
+ else {
99
+ const regex = new RegExp(`\\b${word}\\b`, 'g');
100
+ payload = payload.replace(regex, alias);
101
+ }
102
+ }
103
+ // Collapse extra whitespace/consecutive spaces
104
+ payload = payload.replace(/[ \t]+/g, ' ');
105
+ // 5. Serialize with Dictionary Header
106
+ const dictHeader = Object.entries(revDictionary)
107
+ .map(([alias, word]) => `${alias}=${word}`)
108
+ .join(',');
109
+ return `⸎WORMHOLE;DICT:[${dictHeader}]\n${payload}`;
110
+ }
111
+ /**
112
+ * Reverts a Wormhole-compressed payload back to standard source code.
113
+ */
114
+ export function decompressWormhole(wormholeCode) {
115
+ if (!wormholeCode.startsWith('⸎WORMHOLE;DICT:[')) {
116
+ return wormholeCode; // Not a wormhole payload
117
+ }
118
+ const headerEnd = wormholeCode.indexOf(']\n');
119
+ if (headerEnd === -1)
120
+ return wormholeCode;
121
+ const header = wormholeCode.substring('⸎WORMHOLE;DICT:['.length, headerEnd);
122
+ let payload = wormholeCode.substring(headerEnd + 2);
123
+ // Parse dictionary
124
+ const dictionary = {};
125
+ if (header.trim().length > 0) {
126
+ const parts = header.split(',');
127
+ for (const part of parts) {
128
+ const eqIdx = part.indexOf('=');
129
+ if (eqIdx !== -1) {
130
+ const alias = part.substring(0, eqIdx);
131
+ const word = part.substring(eqIdx + 1);
132
+ dictionary[alias] = word;
133
+ }
134
+ }
135
+ }
136
+ // 1. Decompress standard keywords
137
+ for (const [alias, word] of Object.entries(REVERSE_KEYWORD_MAP)) {
138
+ payload = payload.split(alias).join(word);
139
+ }
140
+ // 2. Decompress custom identifiers
141
+ for (const [alias, word] of Object.entries(dictionary)) {
142
+ const escaped = alias.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
143
+ const regex = new RegExp(`${escaped}\\b`, 'g');
144
+ payload = payload.replace(regex, word);
145
+ }
146
+ return payload;
147
+ }
148
+ //# sourceMappingURL=WormholeCompressor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WormholeCompressor.js","sourceRoot":"","sources":["../../../src/utils/WormholeCompressor.ts"],"names":[],"mappings":"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"}
package/lemma-proxy.cjs CHANGED
@@ -3,8 +3,9 @@
3
3
 
4
4
  const fs = require('fs');
5
5
  const path = require('path');
6
+ const os = require('os');
7
+ const { spawn } = require('child_process');
6
8
 
7
- // Automatically load environment variables from the user's workspace using a zero-dependency parser
8
9
  function loadEnvFile(filePath) {
9
10
  if (fs.existsSync(filePath)) {
10
11
  try {
@@ -28,21 +29,37 @@ function loadEnvFile(filePath) {
28
29
 
29
30
  loadEnvFile(path.join(process.cwd(), '.env'));
30
31
  loadEnvFile(path.join(process.cwd(), '.env.local'));
32
+ loadEnvFile(path.join(os.homedir(), '.lemma-cache', 'env'));
31
33
 
34
+ const cmd = process.argv[2];
32
35
 
33
- // Target path in the compiled CommonJS distribution
34
- const distPath = path.join(__dirname, 'dist', 'cjs', 'cli', 'lemma-proxy.js');
35
-
36
- if (fs.existsSync(distPath)) {
37
- // Production mode: run the compiled CJS JavaScript binary
38
- require(distPath);
36
+ if (cmd === 'init') {
37
+ const initPath = path.join(__dirname, 'bin', 'init.js');
38
+ if (fs.existsSync(initPath)) require(initPath);
39
+ else { console.error('init not found. Run npm run build first.'); process.exit(1); }
40
+ } else if (cmd === 'stats') {
41
+ const cliPath = path.join(__dirname, 'bin', 'cli.js');
42
+ if (fs.existsSync(cliPath)) require(cliPath);
43
+ else { console.error('stats not found. Run npm run build first.'); process.exit(1); }
44
+ } else if (cmd === 'mcp') {
45
+ const mcpPath = path.join(__dirname, 'mcp-server.js');
46
+ if (fs.existsSync(mcpPath)) require(mcpPath);
47
+ else { console.error('mcp-server not found.'); process.exit(1); }
48
+ } else if (cmd === 'proxy') {
49
+ const proxyPath = path.join(__dirname, 'cache-proxy.js');
50
+ if (fs.existsSync(proxyPath)) require(proxyPath);
51
+ else { console.error('cache-proxy not found.'); process.exit(1); }
39
52
  } else {
40
- // Development mode: run via ts-node directly from src/
41
- try {
42
- require('ts-node/register');
43
- require('./src/cli/lemma-proxy.ts');
44
- } catch (err) {
45
- console.error('❌ Error: Could not launch Lemma. Please run "npm run build" to compile the package.');
46
- process.exit(1);
53
+ const distPath = path.join(__dirname, 'dist', 'cjs', 'cli', 'lemma-proxy.js');
54
+ if (fs.existsSync(distPath)) {
55
+ require(distPath);
56
+ } else {
57
+ try {
58
+ require('ts-node/register');
59
+ require('./src/cli/lemma-proxy.ts');
60
+ } catch (err) {
61
+ console.error('Error: Could not launch Lemma. Run "npm run build" to compile.');
62
+ process.exit(1);
63
+ }
47
64
  }
48
65
  }