@vextlabs/theron-cli 0.1.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 (111) hide show
  1. package/LICENSE +15 -0
  2. package/LICENSE.txt +190 -0
  3. package/README.md +98 -0
  4. package/bin/theron +22 -0
  5. package/bin/theron.js +25 -0
  6. package/dist/api.d.ts +111 -0
  7. package/dist/api.js +328 -0
  8. package/dist/api.js.map +1 -0
  9. package/dist/auth.d.ts +15 -0
  10. package/dist/auth.js +92 -0
  11. package/dist/auth.js.map +1 -0
  12. package/dist/banner.d.ts +29 -0
  13. package/dist/banner.js +191 -0
  14. package/dist/banner.js.map +1 -0
  15. package/dist/cap_config.d.ts +28 -0
  16. package/dist/cap_config.js +83 -0
  17. package/dist/cap_config.js.map +1 -0
  18. package/dist/config.d.ts +18 -0
  19. package/dist/config.js +65 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/connections.d.ts +3 -0
  22. package/dist/connections.js +105 -0
  23. package/dist/connections.js.map +1 -0
  24. package/dist/import_claude.d.ts +3 -0
  25. package/dist/import_claude.js +268 -0
  26. package/dist/import_claude.js.map +1 -0
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.js +237 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/onboard.d.ts +3 -0
  31. package/dist/onboard.js +234 -0
  32. package/dist/onboard.js.map +1 -0
  33. package/dist/profile_match.d.ts +15 -0
  34. package/dist/profile_match.js +107 -0
  35. package/dist/profile_match.js.map +1 -0
  36. package/dist/profiles/index.d.ts +20 -0
  37. package/dist/profiles/index.js +56 -0
  38. package/dist/profiles/index.js.map +1 -0
  39. package/dist/profiles/seeds.d.ts +4 -0
  40. package/dist/profiles/seeds.js +500 -0
  41. package/dist/profiles/seeds.js.map +1 -0
  42. package/dist/profiles/types.d.ts +35 -0
  43. package/dist/profiles/types.js +18 -0
  44. package/dist/profiles/types.js.map +1 -0
  45. package/dist/render.d.ts +18 -0
  46. package/dist/render.js +82 -0
  47. package/dist/render.js.map +1 -0
  48. package/dist/repl.d.ts +13 -0
  49. package/dist/repl.js +821 -0
  50. package/dist/repl.js.map +1 -0
  51. package/dist/streaming.d.ts +28 -0
  52. package/dist/streaming.js +118 -0
  53. package/dist/streaming.js.map +1 -0
  54. package/dist/tools/bash.d.ts +8 -0
  55. package/dist/tools/bash.js +57 -0
  56. package/dist/tools/bash.js.map +1 -0
  57. package/dist/tools/edit.d.ts +9 -0
  58. package/dist/tools/edit.js +42 -0
  59. package/dist/tools/edit.js.map +1 -0
  60. package/dist/tools/glob.d.ts +7 -0
  61. package/dist/tools/glob.js +40 -0
  62. package/dist/tools/glob.js.map +1 -0
  63. package/dist/tools/grep.d.ts +9 -0
  64. package/dist/tools/grep.js +73 -0
  65. package/dist/tools/grep.js.map +1 -0
  66. package/dist/tools/index.d.ts +31 -0
  67. package/dist/tools/index.js +180 -0
  68. package/dist/tools/index.js.map +1 -0
  69. package/dist/tools/ls.d.ts +6 -0
  70. package/dist/tools/ls.js +25 -0
  71. package/dist/tools/ls.js.map +1 -0
  72. package/dist/tools/read.d.ts +8 -0
  73. package/dist/tools/read.js +43 -0
  74. package/dist/tools/read.js.map +1 -0
  75. package/dist/tools/stoa.d.ts +34 -0
  76. package/dist/tools/stoa.js +103 -0
  77. package/dist/tools/stoa.js.map +1 -0
  78. package/dist/tools/write.d.ts +7 -0
  79. package/dist/tools/write.js +15 -0
  80. package/dist/tools/write.js.map +1 -0
  81. package/dist/verifiers/ai_ism_check.d.ts +2 -0
  82. package/dist/verifiers/ai_ism_check.js +48 -0
  83. package/dist/verifiers/ai_ism_check.js.map +1 -0
  84. package/dist/verifiers/arithmetic_recheck.d.ts +2 -0
  85. package/dist/verifiers/arithmetic_recheck.js +74 -0
  86. package/dist/verifiers/arithmetic_recheck.js.map +1 -0
  87. package/dist/verifiers/citation_presence.d.ts +2 -0
  88. package/dist/verifiers/citation_presence.js +42 -0
  89. package/dist/verifiers/citation_presence.js.map +1 -0
  90. package/dist/verifiers/em_dash_check.d.ts +2 -0
  91. package/dist/verifiers/em_dash_check.js +23 -0
  92. package/dist/verifiers/em_dash_check.js.map +1 -0
  93. package/dist/verifiers/index.d.ts +16 -0
  94. package/dist/verifiers/index.js +123 -0
  95. package/dist/verifiers/index.js.map +1 -0
  96. package/dist/verifiers/lint.d.ts +2 -0
  97. package/dist/verifiers/lint.js +90 -0
  98. package/dist/verifiers/lint.js.map +1 -0
  99. package/dist/verifiers/style_lint.d.ts +2 -0
  100. package/dist/verifiers/style_lint.js +115 -0
  101. package/dist/verifiers/style_lint.js.map +1 -0
  102. package/dist/verifiers/test_smoke.d.ts +2 -0
  103. package/dist/verifiers/test_smoke.js +94 -0
  104. package/dist/verifiers/test_smoke.js.map +1 -0
  105. package/dist/verifiers/typecheck.d.ts +2 -0
  106. package/dist/verifiers/typecheck.js +98 -0
  107. package/dist/verifiers/typecheck.js.map +1 -0
  108. package/dist/verifiers/types.d.ts +33 -0
  109. package/dist/verifiers/types.js +23 -0
  110. package/dist/verifiers/types.js.map +1 -0
  111. package/package.json +60 -0
@@ -0,0 +1,268 @@
1
+ // `theron import-claude <path-to-data-export.zip>` — ingest a Claude
2
+ // data export into Theron long-term memory.
3
+ //
4
+ // Anna 2026-05-10: "Import your Claude conversation history so the
5
+ // memory follows you."
6
+ //
7
+ // What Claude's "Download Data" gives you: a zip with a top-level
8
+ // `conversations.json` (array of conversations) + `account.json`
9
+ // (settings). Each conversation has messages with role + text.
10
+ //
11
+ // What we extract (NOT the full conversations — that would be too
12
+ // noisy + privacy-sensitive). Three signals worth carrying over:
13
+ //
14
+ // 1. Voice / writing preferences — recurring style notes you gave
15
+ // Claude ("no em-dashes", "match my voice", "be concise").
16
+ // 2. Project context — recurring proper nouns + project names.
17
+ // 3. Recurring decisions — facts about you / your work that came
18
+ // up multiple times (occupation, location, tools, frameworks).
19
+ //
20
+ // Output: a structured PREFERENCES file uploaded to the Theron
21
+ // account memory (POST /api/memory/preferences/import). Raw
22
+ // conversations stay local — they don't leave the user's machine.
23
+ import fs from "node:fs";
24
+ import path from "node:path";
25
+ import os from "node:os";
26
+ import { execSync } from "node:child_process";
27
+ import chalk from "chalk";
28
+ import { loadCredentials } from "./auth.js";
29
+ const AMBER = "#FFAE00";
30
+ export async function importClaudeCommand(zipPath, opts = {}) {
31
+ if (!zipPath) {
32
+ console.error("usage: theron import-claude <path-to-data-export.zip>");
33
+ return 2;
34
+ }
35
+ const abs = path.resolve(zipPath);
36
+ if (!fs.existsSync(abs)) {
37
+ console.error(`File not found: ${abs}`);
38
+ return 2;
39
+ }
40
+ banner();
41
+ // ── 1. Unzip to a temp dir ─────────────────────────────────────
42
+ console.log(` reading: ${abs}`);
43
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "theron-import-"));
44
+ try {
45
+ execSync(`unzip -q -o "${abs}" -d "${tmp}"`, { stdio: 'ignore' });
46
+ }
47
+ catch (err) {
48
+ // Two distinct failure modes worth separating: (a) unzip binary
49
+ // missing from PATH (common on minimal Windows/Linux installs);
50
+ // (b) unzip ran but the file wasn't a valid zip. The shell error
51
+ // surface for missing binaries differs per platform — check ENOENT
52
+ // and the stderr "not found" pattern.
53
+ const msg = err instanceof Error ? err.message : String(err);
54
+ const code = err.code;
55
+ if (code === "ENOENT" || /not found|command not found|no such file/i.test(msg)) {
56
+ console.error(" ✗ `unzip` not found on PATH.");
57
+ console.error(" macOS: preinstalled (this shouldn't happen — try /usr/bin/unzip directly)");
58
+ console.error(" Linux: apt-get install unzip · yum install unzip · apk add unzip");
59
+ console.error(" Windows: install via winget (`winget install GnuWin32.UnZip`) or use WSL");
60
+ }
61
+ else {
62
+ console.error(` ✗ unzip failed: ${msg}`);
63
+ console.error(" Make sure the file is a Claude data export (zip).");
64
+ }
65
+ fs.rmSync(tmp, { recursive: true, force: true });
66
+ return 1;
67
+ }
68
+ // ── 2. Parse conversations.json ───────────────────────────────
69
+ const conversationsPath = path.join(tmp, "conversations.json");
70
+ if (!fs.existsSync(conversationsPath)) {
71
+ console.error(" ✗ conversations.json not in the zip. This may not be a Claude export.");
72
+ fs.rmSync(tmp, { recursive: true, force: true });
73
+ return 1;
74
+ }
75
+ let conversations;
76
+ try {
77
+ conversations = JSON.parse(fs.readFileSync(conversationsPath, "utf8"));
78
+ }
79
+ catch (e) {
80
+ console.error(` ✗ couldn't parse conversations.json: ${e instanceof Error ? e.message : String(e)}`);
81
+ fs.rmSync(tmp, { recursive: true, force: true });
82
+ return 1;
83
+ }
84
+ if (!Array.isArray(conversations)) {
85
+ console.error(" ✗ conversations.json wasn't an array. Format may have changed.");
86
+ fs.rmSync(tmp, { recursive: true, force: true });
87
+ return 1;
88
+ }
89
+ console.log(` ✓ found ${conversations.length} conversations`);
90
+ // ── 3. Extract signals (all local — nothing leaves yet) ───────
91
+ const preferences = extractPreferences(conversations);
92
+ const projects = extractProjectContext(conversations);
93
+ const facts = extractFacts(conversations);
94
+ console.log();
95
+ console.log(chalk.dim(" extracted signals (local-only, not uploaded yet):"));
96
+ console.log(` • ${preferences.length} writing/voice preferences`);
97
+ console.log(` • ${projects.length} project / recurring-noun signals`);
98
+ console.log(` • ${facts.length} recurring facts`);
99
+ // Show samples so the user knows what's about to ship.
100
+ if (preferences.length > 0) {
101
+ console.log();
102
+ console.log(chalk.dim(" sample preferences:"));
103
+ for (const p of preferences.slice(0, 4))
104
+ console.log(` – ${p}`);
105
+ }
106
+ if (projects.length > 0) {
107
+ console.log();
108
+ console.log(chalk.dim(" sample projects:"));
109
+ for (const p of projects.slice(0, 4))
110
+ console.log(` – ${p}`);
111
+ }
112
+ // ── 4. Confirm + upload ───────────────────────────────────────
113
+ console.log();
114
+ console.log(chalk.dim(" upload these signals to your Theron account memory?"));
115
+ const readline = await import("node:readline");
116
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
117
+ const a = await new Promise((res) => rl.question(" [Y/n] ", res));
118
+ rl.close();
119
+ if (a.trim().toLowerCase() === 'n' || a.trim().toLowerCase() === 'no') {
120
+ console.log(" skipped. Raw conversations not uploaded.");
121
+ fs.rmSync(tmp, { recursive: true, force: true });
122
+ return 0;
123
+ }
124
+ const creds = await loadCredentials();
125
+ if (!creds.api_key) {
126
+ console.error(" ✗ not signed in. Run `theron login` first.");
127
+ fs.rmSync(tmp, { recursive: true, force: true });
128
+ return 2;
129
+ }
130
+ const apiUrl = opts.apiUrl ?? creds.api_url ?? "https://tryvext.com";
131
+ const body = { preferences, projects, facts, source: "claude_export", imported_at: new Date().toISOString() };
132
+ try {
133
+ const r = await fetch(`${apiUrl.replace(/\/$/, '')}/api/memory/preferences/import`, {
134
+ method: "POST",
135
+ headers: { "content-type": "application/json", authorization: `Bearer ${creds.api_key}` },
136
+ body: JSON.stringify(body),
137
+ });
138
+ if (!r.ok) {
139
+ const detail = (await r.text()).slice(0, 300);
140
+ console.error(` ✗ upload failed: HTTP ${r.status}: ${detail}`);
141
+ fs.rmSync(tmp, { recursive: true, force: true });
142
+ return 1;
143
+ }
144
+ }
145
+ catch (e) {
146
+ console.error(` ✗ upload network error: ${e instanceof Error ? e.message : String(e)}`);
147
+ fs.rmSync(tmp, { recursive: true, force: true });
148
+ return 1;
149
+ }
150
+ console.log();
151
+ console.log(" " + chalk.hex(AMBER)("✓ uploaded to your Theron memory."));
152
+ console.log(" Theron will use these preferences when it answers you, across every surface.");
153
+ console.log();
154
+ // Clean up temp dir.
155
+ fs.rmSync(tmp, { recursive: true, force: true });
156
+ return 0;
157
+ }
158
+ function banner() {
159
+ console.log();
160
+ console.log(chalk.hex(AMBER).bold(" Theron · Claude-export import"));
161
+ console.log(chalk.dim(" extracting signals — raw conversations stay on your machine."));
162
+ console.log();
163
+ }
164
+ // ── Signal extractors ─────────────────────────────────────────────
165
+ //
166
+ // All extractors run LOCALLY. They look at user-sent messages only
167
+ // (not assistant responses — we don't want to seed Theron with
168
+ // Claude's writing voice). Heuristic-based; no LLM call.
169
+ function userTexts(conversations) {
170
+ const out = [];
171
+ for (const c of conversations) {
172
+ for (const m of c.chat_messages ?? []) {
173
+ if (m.sender !== 'human')
174
+ continue;
175
+ const text = extractMessageText(m);
176
+ if (text)
177
+ out.push(text);
178
+ }
179
+ }
180
+ return out;
181
+ }
182
+ function extractMessageText(m) {
183
+ if (typeof m.content === 'string')
184
+ return m.content;
185
+ if (Array.isArray(m.content)) {
186
+ return m.content.map((c) => c.text ?? '').join(' ').trim();
187
+ }
188
+ return m.text ?? '';
189
+ }
190
+ // Recurring style notes — phrases like "don't use", "I prefer", "match
191
+ // my voice", "no em-dashes". We pull out the surrounding sentence
192
+ // and dedupe.
193
+ function extractPreferences(conversations) {
194
+ const PATTERNS = [
195
+ /\b(don'?t|do not)\s+\w[\w\s]{2,80}/gi,
196
+ /\bi (prefer|like|hate|always|never)\s+\w[\w\s]{2,80}/gi,
197
+ /\b(use|avoid|match|copy)\s+(my\s+)?(voice|tone|style)[\s\S]{0,80}/gi,
198
+ /\b(no|never use)\s+(em.?dashes?|emoji|markdown|code blocks?|ai-?isms?)/gi,
199
+ /\b(be|stay|keep it)\s+(concise|terse|brief|short|direct)[^.]*/gi,
200
+ ];
201
+ const found = new Set();
202
+ for (const text of userTexts(conversations)) {
203
+ for (const re of PATTERNS) {
204
+ re.lastIndex = 0;
205
+ const matches = text.matchAll(re);
206
+ for (const m of matches) {
207
+ const phrase = m[0].trim().slice(0, 120);
208
+ if (phrase.length > 8)
209
+ found.add(phrase);
210
+ }
211
+ }
212
+ }
213
+ return Array.from(found).slice(0, 40);
214
+ }
215
+ // Project + recurring-noun signals — proper nouns that appear in ≥3
216
+ // conversations.
217
+ function extractProjectContext(conversations) {
218
+ const counts = new Map();
219
+ for (const c of conversations) {
220
+ const seen = new Set();
221
+ for (const m of c.chat_messages ?? []) {
222
+ if (m.sender !== 'human')
223
+ continue;
224
+ const text = extractMessageText(m);
225
+ // Match Capitalized-or-CamelCase 1-3 word phrases.
226
+ const matches = text.matchAll(/\b([A-Z][a-zA-Z0-9]{2,}(?:[\s-][A-Z][a-zA-Z0-9]{2,}){0,2})\b/g);
227
+ for (const m of matches) {
228
+ const noun = m[1];
229
+ // Skip common leading-sentence words.
230
+ if (/^(I|The|We|My|Our|Yes|No|This|That|It|And|But|For|At|In|On)\b/.test(noun))
231
+ continue;
232
+ if (noun.length > 60)
233
+ continue;
234
+ seen.add(noun);
235
+ }
236
+ }
237
+ for (const noun of seen)
238
+ counts.set(noun, (counts.get(noun) ?? 0) + 1);
239
+ }
240
+ return Array.from(counts.entries())
241
+ .filter(([, n]) => n >= 3)
242
+ .sort((a, b) => b[1] - a[1])
243
+ .slice(0, 30)
244
+ .map(([noun, n]) => `${noun} (mentioned in ${n} conversations)`);
245
+ }
246
+ // First-person facts: "I'm a <X>", "I work at <Y>", "my <Z> is <W>".
247
+ // Dedupe canonical-form on extraction.
248
+ function extractFacts(conversations) {
249
+ const PATTERNS = [
250
+ /\bi'?m (a |an |the )?(\w[\w\s]{2,60})/gi,
251
+ /\bi (work|live|run|founded|own)\s+(\w[\w\s]{2,60})/gi,
252
+ /\bmy (team|company|role|job|title|focus|stack|repo|project|background)\s+(is|are|uses?|on|in|at)\s+(\w[\w\s]{2,60})/gi,
253
+ ];
254
+ const found = new Set();
255
+ for (const text of userTexts(conversations)) {
256
+ for (const re of PATTERNS) {
257
+ re.lastIndex = 0;
258
+ const matches = text.matchAll(re);
259
+ for (const m of matches) {
260
+ const phrase = m[0].trim().slice(0, 120);
261
+ if (phrase.length > 8)
262
+ found.add(phrase);
263
+ }
264
+ }
265
+ }
266
+ return Array.from(found).slice(0, 30);
267
+ }
268
+ //# sourceMappingURL=import_claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import_claude.js","sourceRoot":"","sources":["../src/import_claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function main(argv: string[]): Promise<number>;
package/dist/index.js ADDED
@@ -0,0 +1,237 @@
1
+ // Theron CLI — main entry. Parses argv, dispatches to subcommand
2
+ // (login/logout/onboard/import-claude/connections) or starts the REPL.
3
+ //
4
+ // Usage:
5
+ // theron start interactive chat
6
+ // theron "<prompt>" one-shot mode (run prompt, exit)
7
+ // theron login interactive sign-in
8
+ // theron logout clear stored credentials
9
+ // theron --yes auto-approve all tool calls
10
+ // theron --cwd <dir> override working directory
11
+ // theron --help
12
+ import process from "node:process";
13
+ import path from "node:path";
14
+ import { promises as fs } from "node:fs";
15
+ import { fileURLToPath } from "node:url";
16
+ import { runRepl } from "./repl.js";
17
+ import { loadCredentials, loginCommand, logoutCommand } from "./auth.js";
18
+ import { onboardCommand } from "./onboard.js";
19
+ import { importClaudeCommand } from "./import_claude.js";
20
+ import { connectionsCommand } from "./connections.js";
21
+ const HELP = `theron — agentic coding assistant from Vext Labs
22
+
23
+ USAGE
24
+ theron start interactive chat in current directory
25
+ theron "fix the bug in foo" one-shot prompt, exits when done
26
+ theron onboard one-command migration wizard (cl alias, OAuth,
27
+ Office add-in, top-3 specialists, Claude history)
28
+ theron import-claude <zip> ingest a Claude data export into your memory
29
+ theron connections list connected SaaS accounts (also: integrations)
30
+ theron login sign in (stores key in ~/.theron/credentials)
31
+ theron logout clear stored credentials
32
+ theron --version print version
33
+ theron --help this screen
34
+
35
+ OPTIONS
36
+ --yes, -y auto-approve every tool call (yolo mode)
37
+ --cwd <dir> use <dir> as the working directory (default: $PWD)
38
+ --mode, --profile <slug> start in a domain profile (code | legal | finance |
39
+ design | research | writing | …33 total). Default: code.
40
+ Switch mid-session with /mode <slug>. /mode list to see all.
41
+ --api-key <key> override stored API key (single use; not persisted)
42
+ --api-url <url> override default API URL
43
+
44
+ ENVIRONMENT
45
+ THERON_API_KEY same as --api-key (env beats file, flag beats env)
46
+ THERON_API_URL same as --api-url
47
+ THERON_AE_OS_URL AE OS deep-link base for /design /deck /draft /research
48
+ THERON_STOA_BASE Stoa cap proxy base (default https://tryvext.com)
49
+ THERON_ADMIN_TOKEN required for /innovate (admin-gated driver tick)
50
+ NO_COLOR disable ANSI color output
51
+
52
+ EXIT CODES
53
+ 0 success
54
+ 1 runtime error (network, auth required, tool/import crash)
55
+ 2 usage error (unknown flag, missing arg, file not found)
56
+ 130 user pressed Ctrl-C during an interactive prompt
57
+
58
+ The CLI streams from theron.tryvext.com. The model can read, edit, and run
59
+ code in the cwd via Read / Write / Edit / Bash / Glob / Grep / LS tools.
60
+ Write / Edit / Bash / Stoa ask for confirmation before executing — pass
61
+ --yes to skip those prompts when you trust the run.
62
+
63
+ Docs: https://tryvext.com · Issues: https://github.com/Vext-Labs-Inc/sucrityflash/issues
64
+ `;
65
+ /** Read a flag value safely. Returns the value or sets a parse error
66
+ * so main() can exit 2 with a friendly message instead of swallowing
67
+ * the next positional arg as the value. */
68
+ function readFlagValue(out, flag, argv, i) {
69
+ const v = argv[i + 1];
70
+ if (v === undefined || v.startsWith("-")) {
71
+ out.parseError = { code: 2, message: `Flag ${flag} requires a value. Run \`theron --help\`.` };
72
+ return null;
73
+ }
74
+ return v;
75
+ }
76
+ function parseArgs(argv) {
77
+ const out = { yolo: false, showHelp: false };
78
+ const positional = [];
79
+ for (let i = 0; i < argv.length; i++) {
80
+ const a = argv[i];
81
+ if (a === "--yes" || a === "-y") {
82
+ out.yolo = true;
83
+ }
84
+ else if (a === "--cwd") {
85
+ const v = readFlagValue(out, a, argv, i);
86
+ if (v == null)
87
+ return out;
88
+ out.cwd = v;
89
+ i++;
90
+ }
91
+ else if (a === "--mode" || a === "--profile") {
92
+ const v = readFlagValue(out, a, argv, i);
93
+ if (v == null)
94
+ return out;
95
+ out.profile = v;
96
+ i++;
97
+ }
98
+ else if (a === "--api-key") {
99
+ const v = readFlagValue(out, a, argv, i);
100
+ if (v == null)
101
+ return out;
102
+ out.apiKey = v;
103
+ i++;
104
+ }
105
+ else if (a === "--api-url") {
106
+ const v = readFlagValue(out, a, argv, i);
107
+ if (v == null)
108
+ return out;
109
+ out.apiUrl = v;
110
+ i++;
111
+ }
112
+ else if (a === "--help" || a === "-h") {
113
+ out.showHelp = true;
114
+ }
115
+ else if (a === "--version" || a === "-v") {
116
+ out.command = "version";
117
+ }
118
+ else if (a === "login" && i === 0) {
119
+ out.command = "login";
120
+ }
121
+ else if (a === "logout" && i === 0) {
122
+ out.command = "logout";
123
+ }
124
+ else if (a === "onboard" && i === 0) {
125
+ out.command = "onboard";
126
+ }
127
+ else if (a === "import-claude" && i === 0) {
128
+ out.command = "import-claude";
129
+ const v = argv[i + 1];
130
+ if (v === undefined) {
131
+ out.parseError = { code: 2, message: "usage: theron import-claude <path-to-data-export.zip>" };
132
+ return out;
133
+ }
134
+ out.commandArg = v;
135
+ i++;
136
+ }
137
+ else if ((a === "connections" || a === "integrations") && i === 0) {
138
+ out.command = "connections";
139
+ }
140
+ else if (a.startsWith("-")) {
141
+ out.parseError = { code: 2, message: `Unknown flag: ${a}. Run \`theron --help\`.` };
142
+ return out;
143
+ }
144
+ else {
145
+ positional.push(a);
146
+ }
147
+ }
148
+ if (positional.length > 0)
149
+ out.prompt = positional.join(" ");
150
+ return out;
151
+ }
152
+ /** Read the package version from the on-disk package.json so
153
+ * --version stays honest after a `npm version <bump>` without a
154
+ * source edit. */
155
+ async function readPackageVersion() {
156
+ try {
157
+ // bin/theron.js → ../package.json. From dist/index.js the relative
158
+ // hop is the same (dist sits next to bin in the published package).
159
+ const here = path.dirname(fileURLToPath(import.meta.url));
160
+ const pkgPath = path.resolve(here, "..", "package.json");
161
+ const raw = await fs.readFile(pkgPath, "utf8");
162
+ const pkg = JSON.parse(raw);
163
+ return typeof pkg.version === "string" ? pkg.version : "0.0.0";
164
+ }
165
+ catch {
166
+ // Worst case (bundled / weird install layout) — never crash on a
167
+ // version print. Returns the build-time fallback.
168
+ return "0.0.0";
169
+ }
170
+ }
171
+ export async function main(argv) {
172
+ const args = parseArgs(argv);
173
+ if (args.parseError) {
174
+ process.stderr.write(args.parseError.message + "\n");
175
+ return args.parseError.code;
176
+ }
177
+ if (args.showHelp) {
178
+ process.stdout.write(HELP);
179
+ return 0;
180
+ }
181
+ if (args.command === "version") {
182
+ const v = await readPackageVersion();
183
+ process.stdout.write(`theron ${v}\n`);
184
+ return 0;
185
+ }
186
+ if (args.command === "login")
187
+ return await loginCommand();
188
+ if (args.command === "logout")
189
+ return await logoutCommand();
190
+ if (args.command === "onboard")
191
+ return await onboardCommand({ apiUrl: args.apiUrl });
192
+ if (args.command === "import-claude")
193
+ return await importClaudeCommand(args.commandArg ?? "", { apiUrl: args.apiUrl });
194
+ if (args.command === "connections")
195
+ return await connectionsCommand({ apiUrl: args.apiUrl });
196
+ // Resolve credentials. Priority (first wins):
197
+ // 1. --api-key <key> — explicit per-invocation override
198
+ // 2. THERON_API_KEY env var — persistent for the shell session
199
+ // 3. ~/.theron/credentials — saved by `theron login`
200
+ // loadCredentials() already collapses (2) and (3); --api-key beats both.
201
+ const stored = await loadCredentials();
202
+ const apiKey = args.apiKey ?? stored.api_key;
203
+ const apiUrl = args.apiUrl ?? stored.api_url ?? "https://theron.tryvext.com";
204
+ // Validate --cwd at parse time (once) instead of letting tools fail
205
+ // later with cryptic ENOENT messages on every Read.
206
+ let cwd = process.cwd();
207
+ if (args.cwd) {
208
+ const resolved = path.resolve(args.cwd);
209
+ try {
210
+ const st = await fs.stat(resolved);
211
+ if (!st.isDirectory()) {
212
+ process.stderr.write(`--cwd ${args.cwd}: not a directory.\n`);
213
+ return 2;
214
+ }
215
+ cwd = resolved;
216
+ }
217
+ catch {
218
+ process.stderr.write(`--cwd ${args.cwd}: directory not found.\n`);
219
+ return 2;
220
+ }
221
+ }
222
+ if (!apiKey && !process.env.THERON_API_KEY && !args.prompt) {
223
+ // Anonymous calls work — auth just unlocks higher rate limits +
224
+ // saved history. Quiet info line on interactive launch only;
225
+ // one-shot mode keeps stdout clean for piping.
226
+ process.stderr.write("Running anonymous — `theron login` for higher rate limits + saved history.\n");
227
+ }
228
+ return await runRepl({
229
+ apiUrl,
230
+ apiKey,
231
+ cwd,
232
+ yolo: args.yolo,
233
+ oneShot: args.prompt,
234
+ profile: args.profile,
235
+ });
236
+ }
237
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function onboardCommand(opts?: {
2
+ apiUrl?: string;
3
+ }): Promise<number>;