@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.
- package/LICENSE +15 -0
- package/LICENSE.txt +190 -0
- package/README.md +98 -0
- package/bin/theron +22 -0
- package/bin/theron.js +25 -0
- package/dist/api.d.ts +111 -0
- package/dist/api.js +328 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +15 -0
- package/dist/auth.js +92 -0
- package/dist/auth.js.map +1 -0
- package/dist/banner.d.ts +29 -0
- package/dist/banner.js +191 -0
- package/dist/banner.js.map +1 -0
- package/dist/cap_config.d.ts +28 -0
- package/dist/cap_config.js +83 -0
- package/dist/cap_config.js.map +1 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.js +65 -0
- package/dist/config.js.map +1 -0
- package/dist/connections.d.ts +3 -0
- package/dist/connections.js +105 -0
- package/dist/connections.js.map +1 -0
- package/dist/import_claude.d.ts +3 -0
- package/dist/import_claude.js +268 -0
- package/dist/import_claude.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +237 -0
- package/dist/index.js.map +1 -0
- package/dist/onboard.d.ts +3 -0
- package/dist/onboard.js +234 -0
- package/dist/onboard.js.map +1 -0
- package/dist/profile_match.d.ts +15 -0
- package/dist/profile_match.js +107 -0
- package/dist/profile_match.js.map +1 -0
- package/dist/profiles/index.d.ts +20 -0
- package/dist/profiles/index.js +56 -0
- package/dist/profiles/index.js.map +1 -0
- package/dist/profiles/seeds.d.ts +4 -0
- package/dist/profiles/seeds.js +500 -0
- package/dist/profiles/seeds.js.map +1 -0
- package/dist/profiles/types.d.ts +35 -0
- package/dist/profiles/types.js +18 -0
- package/dist/profiles/types.js.map +1 -0
- package/dist/render.d.ts +18 -0
- package/dist/render.js +82 -0
- package/dist/render.js.map +1 -0
- package/dist/repl.d.ts +13 -0
- package/dist/repl.js +821 -0
- package/dist/repl.js.map +1 -0
- package/dist/streaming.d.ts +28 -0
- package/dist/streaming.js +118 -0
- package/dist/streaming.js.map +1 -0
- package/dist/tools/bash.d.ts +8 -0
- package/dist/tools/bash.js +57 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +9 -0
- package/dist/tools/edit.js +42 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/glob.d.ts +7 -0
- package/dist/tools/glob.js +40 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +9 -0
- package/dist/tools/grep.js +73 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +31 -0
- package/dist/tools/index.js +180 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/ls.d.ts +6 -0
- package/dist/tools/ls.js +25 -0
- package/dist/tools/ls.js.map +1 -0
- package/dist/tools/read.d.ts +8 -0
- package/dist/tools/read.js +43 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/stoa.d.ts +34 -0
- package/dist/tools/stoa.js +103 -0
- package/dist/tools/stoa.js.map +1 -0
- package/dist/tools/write.d.ts +7 -0
- package/dist/tools/write.js +15 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/verifiers/ai_ism_check.d.ts +2 -0
- package/dist/verifiers/ai_ism_check.js +48 -0
- package/dist/verifiers/ai_ism_check.js.map +1 -0
- package/dist/verifiers/arithmetic_recheck.d.ts +2 -0
- package/dist/verifiers/arithmetic_recheck.js +74 -0
- package/dist/verifiers/arithmetic_recheck.js.map +1 -0
- package/dist/verifiers/citation_presence.d.ts +2 -0
- package/dist/verifiers/citation_presence.js +42 -0
- package/dist/verifiers/citation_presence.js.map +1 -0
- package/dist/verifiers/em_dash_check.d.ts +2 -0
- package/dist/verifiers/em_dash_check.js +23 -0
- package/dist/verifiers/em_dash_check.js.map +1 -0
- package/dist/verifiers/index.d.ts +16 -0
- package/dist/verifiers/index.js +123 -0
- package/dist/verifiers/index.js.map +1 -0
- package/dist/verifiers/lint.d.ts +2 -0
- package/dist/verifiers/lint.js +90 -0
- package/dist/verifiers/lint.js.map +1 -0
- package/dist/verifiers/style_lint.d.ts +2 -0
- package/dist/verifiers/style_lint.js +115 -0
- package/dist/verifiers/style_lint.js.map +1 -0
- package/dist/verifiers/test_smoke.d.ts +2 -0
- package/dist/verifiers/test_smoke.js +94 -0
- package/dist/verifiers/test_smoke.js.map +1 -0
- package/dist/verifiers/typecheck.d.ts +2 -0
- package/dist/verifiers/typecheck.js +98 -0
- package/dist/verifiers/typecheck.js.map +1 -0
- package/dist/verifiers/types.d.ts +33 -0
- package/dist/verifiers/types.js +23 -0
- package/dist/verifiers/types.js.map +1 -0
- 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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|