@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,500 @@
|
|
|
1
|
+
// Seed specialist profiles — the 33-spec council expressed as CLI
|
|
2
|
+
// profiles. Six are hand-crafted (the ones we use most often: code,
|
|
3
|
+
// legal, finance, design, research, writing); the rest are
|
|
4
|
+
// auto-generated baselines from per-domain templates that the council
|
|
5
|
+
// can iteratively improve.
|
|
6
|
+
//
|
|
7
|
+
// Adding a new specialist: drop a profile object in here, wire its
|
|
8
|
+
// verifier slugs in verifiers/index.ts (or fall back to the
|
|
9
|
+
// domain-class default), and it shows up in `/mode list`.
|
|
10
|
+
//
|
|
11
|
+
// Why bundle them as a const array vs. fetching from the server on
|
|
12
|
+
// every launch:
|
|
13
|
+
// - The CLI ships with a known-good baseline that works OFFLINE.
|
|
14
|
+
// - The server can OVERRIDE / extend this list at runtime via the
|
|
15
|
+
// `GET /api/theron/specs` endpoint — the registry merges remote +
|
|
16
|
+
// local with remote winning. Hot-update specs without a CLI
|
|
17
|
+
// reinstall.
|
|
18
|
+
//
|
|
19
|
+
// The 33 baseline specs map onto the full Vext council (theron-base
|
|
20
|
+
// + 30 LoRA adapters + 2 newer ones). Order here = order shown in
|
|
21
|
+
// /mode list.
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Shared building blocks
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Verifier-set defaults by domain class. A profile that doesn't
|
|
26
|
+
// specify `verifiers` inherits from its `domainClass`.
|
|
27
|
+
const VERIFIERS = {
|
|
28
|
+
CODE: ["typecheck", "lint", "test_smoke"],
|
|
29
|
+
WRITING: ["style_lint", "ai_ism_check"],
|
|
30
|
+
CITED: ["citation_presence", "claim_grounding"],
|
|
31
|
+
NUMERIC: ["arithmetic_recheck", "unit_consistency"],
|
|
32
|
+
DESIGN: ["component_states_complete", "token_lint"],
|
|
33
|
+
STRATEGY: ["claim_grounding", "ai_ism_check"],
|
|
34
|
+
GENERAL: ["ai_ism_check"],
|
|
35
|
+
};
|
|
36
|
+
// Tool sets — most profiles allow the full file-tool kit + Stoa
|
|
37
|
+
// (the cap proxy for SaaS integrations); some restrict it.
|
|
38
|
+
// ALL_FILE / CODE_AND_RUN — full toolset, Stoa included
|
|
39
|
+
// READ_AND_WRITE — no Bash, but Stoa included (calling
|
|
40
|
+
// external SaaS doesn't run shell)
|
|
41
|
+
// READ_ONLY — strict read-only: no Write/Edit/Bash/Stoa
|
|
42
|
+
// (used by medical/therapy where any side
|
|
43
|
+
// effect is the wrong call)
|
|
44
|
+
const TOOLS = {
|
|
45
|
+
ALL_FILE: ["Read", "Write", "Edit", "Bash", "Glob", "Grep", "LS", "Stoa"],
|
|
46
|
+
READ_AND_WRITE: ["Read", "Write", "Edit", "Glob", "Grep", "LS", "Stoa"],
|
|
47
|
+
READ_ONLY: ["Read", "Glob", "Grep", "LS"],
|
|
48
|
+
CODE_AND_RUN: ["Read", "Write", "Edit", "Bash", "Glob", "Grep", "LS", "Stoa"],
|
|
49
|
+
};
|
|
50
|
+
// Base voice every profile inherits (this is appended AFTER the base
|
|
51
|
+
// /api/cli/chat system prompt, BEFORE the per-profile addendum).
|
|
52
|
+
const BASE_VOICE = `You are Theron — one entity, many specialist faces. Right now you are operating in {{LABEL}} mode. Stay in this voice for the whole turn.`;
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Hand-crafted core six — the profiles we know we'll get right out of
|
|
55
|
+
// the gate. Each has rigorously-tuned system_prompt_append, verifiers,
|
|
56
|
+
// prompt_starters.
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
const CORE_SIX = [
|
|
59
|
+
{
|
|
60
|
+
slug: "code",
|
|
61
|
+
label: "Code",
|
|
62
|
+
description: "Read-first, edit-precisely, verify-after. The default Theron mode.",
|
|
63
|
+
welcome: "Code mode — I'll read before editing, run tests after, and ship small changes.",
|
|
64
|
+
accentHex: "#FFAE00",
|
|
65
|
+
systemPromptAppend: [
|
|
66
|
+
BASE_VOICE,
|
|
67
|
+
``,
|
|
68
|
+
`CODE-SPECIFIC BEHAVIOR:`,
|
|
69
|
+
`- Always Read a file before Editing it. Match the exact existing indentation, casing, and import style.`,
|
|
70
|
+
`- After any Write/Edit on a .ts/.tsx/.js/.jsx file, run \`tsc --noEmit\` (or the project's typecheck script). Surface failures inline.`,
|
|
71
|
+
`- After any Write/Edit on a .py file, run \`pytest -q\` if a tests/ dir exists.`,
|
|
72
|
+
`- Prefer Edit (one substring swap) over Write (whole-file rewrite). Use Write only for new files or full rewrites.`,
|
|
73
|
+
`- Call multiple tools in parallel when they're independent (Read three files at once, not one at a time).`,
|
|
74
|
+
`- No comments unless the WHY is non-obvious. Don't restate what the code does.`,
|
|
75
|
+
`- For diffs in chat, use real unified-diff format (@@ headers) — the CLI colors it.`,
|
|
76
|
+
].join("\n"),
|
|
77
|
+
toolAllow: TOOLS.CODE_AND_RUN,
|
|
78
|
+
hiveSpecs: ["code"],
|
|
79
|
+
verifiers: VERIFIERS.CODE,
|
|
80
|
+
promptStarters: [
|
|
81
|
+
"fix the failing test in <file>",
|
|
82
|
+
"refactor <fn> to use async/await",
|
|
83
|
+
"add a typed interface for the response in api/foo.ts",
|
|
84
|
+
"explain how X is wired through the codebase",
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
slug: "legal",
|
|
89
|
+
label: "Legal",
|
|
90
|
+
description: "Cite source clauses verbatim; never invent citations.",
|
|
91
|
+
welcome: "Legal mode — I'll cite source clauses verbatim, mark every assumption, and never invent case law.",
|
|
92
|
+
accentHex: "#A78BFA",
|
|
93
|
+
systemPromptAppend: [
|
|
94
|
+
BASE_VOICE,
|
|
95
|
+
``,
|
|
96
|
+
`LEGAL-SPECIFIC BEHAVIOR:`,
|
|
97
|
+
`- Citations: every legal claim must point to a specific clause, statute, or case. Use the format [Source §X.Y or Case Name v. X, 123 U.S. 456 (1900)]. Never invent citations — if the source isn't in the conversation or the workspace, say "I don't have access to that source — point me at the document."`,
|
|
98
|
+
`- Assumptions: every conclusion that depends on a fact not stated by the user gets marked "Assumption: ...". Don't hide assumptions in prose.`,
|
|
99
|
+
`- Don't give legal advice. You're a research assistant. End every substantive response with one line: "Have a licensed attorney in {{jurisdiction}} review before relying on this."`,
|
|
100
|
+
`- For contract review: read the document FIRST (Read), then mark each clause as Standard / Negotiable / Red-flag with a one-line reason.`,
|
|
101
|
+
`- For statute / case research: prefer Grep over Bash. Never run untrusted code on the user's machine for legal work.`,
|
|
102
|
+
`- Tone: precise, neutral, exhaustive. No marketing language.`,
|
|
103
|
+
].join("\n"),
|
|
104
|
+
toolAllow: TOOLS.READ_AND_WRITE,
|
|
105
|
+
toolDeny: ["Bash"],
|
|
106
|
+
hiveSpecs: ["legal", "research"],
|
|
107
|
+
verifiers: [...VERIFIERS.CITED, "assumption_marked", "advice_disclaimer"],
|
|
108
|
+
promptStarters: [
|
|
109
|
+
"review this NDA — flag red-flag clauses",
|
|
110
|
+
"compare these two privacy policies side by side",
|
|
111
|
+
"what are the standard reps and warranties in a SaaS MSA?",
|
|
112
|
+
"summarize the key obligations under <regulation> for a US-based SaaS",
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
slug: "finance",
|
|
117
|
+
label: "Finance",
|
|
118
|
+
description: "Show every arithmetic step; never round silently.",
|
|
119
|
+
welcome: "Finance mode — I'll show every arithmetic step, mark assumptions, and double-check totals.",
|
|
120
|
+
accentHex: "#34D399",
|
|
121
|
+
systemPromptAppend: [
|
|
122
|
+
BASE_VOICE,
|
|
123
|
+
``,
|
|
124
|
+
`FINANCE-SPECIFIC BEHAVIOR:`,
|
|
125
|
+
`- Show every arithmetic step. Never round silently. If you round, state the precision explicitly ("rounded to nearest $1,000").`,
|
|
126
|
+
`- Units: always include currency, units, and time periods. "$1.2M ARR" not "$1.2M". "12% YoY" not "12%".`,
|
|
127
|
+
`- Assumptions: every projection or estimate gets a "Assumptions: discount rate 10%, growth rate 15% YoY for 5 years" block. No hidden inputs.`,
|
|
128
|
+
`- For models: prefer creating/editing a CSV or markdown table. After any numeric table, re-add the column totals and verify they match.`,
|
|
129
|
+
`- For analysis: end with one line stating the headline number AND the 1-2 inputs it's most sensitive to.`,
|
|
130
|
+
`- Bash is OK but limit it to \`python3 -c "..."\` style calculator calls (no destructive ops).`,
|
|
131
|
+
`- Tone: rigorous, decisive, no hedging on math. "The IRR is 14.3%" not "The IRR is approximately 14%-ish".`,
|
|
132
|
+
].join("\n"),
|
|
133
|
+
toolAllow: TOOLS.CODE_AND_RUN,
|
|
134
|
+
hiveSpecs: ["finance", "data"],
|
|
135
|
+
verifiers: [...VERIFIERS.NUMERIC, "assumption_marked"],
|
|
136
|
+
promptStarters: [
|
|
137
|
+
"build a 3-year ARR projection at 15% YoY growth, 80% gross margin",
|
|
138
|
+
"what's the LTV/CAC for a $50/mo SaaS with 4% monthly churn and $300 CAC?",
|
|
139
|
+
"compare these two term sheets side by side — which is better for founders?",
|
|
140
|
+
"explain the difference between a SAFE and a convertible note",
|
|
141
|
+
],
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
slug: "design",
|
|
145
|
+
label: "Design",
|
|
146
|
+
description: "Specify component, props, tokens, states. Produce TSX or Figma-spec markdown.",
|
|
147
|
+
welcome: "Design mode — I'll spec components with all required states and produce TSX or Figma-ready markdown.",
|
|
148
|
+
accentHex: "#F472B6",
|
|
149
|
+
systemPromptAppend: [
|
|
150
|
+
BASE_VOICE,
|
|
151
|
+
``,
|
|
152
|
+
`DESIGN-SPECIFIC BEHAVIOR:`,
|
|
153
|
+
`- For component specs: ALWAYS include all required states — default, hover, focus, focus-visible, active, disabled, error, loading. A spec that's missing a state is incomplete.`,
|
|
154
|
+
`- Tokens, not raw values. Use design tokens (theme.colors.amber.500, theme.spacing.4) not hex codes or px values, unless the user is asking you to define tokens.`,
|
|
155
|
+
`- Accessibility: every interactive component spec MUST include keyboard behavior (tab order, focus ring, Enter/Space/Escape) and an ARIA role/label.`,
|
|
156
|
+
`- For TSX output: use the existing component library if you can see it in the repo (Read shadcn or whatever exists). Don't reinvent.`,
|
|
157
|
+
`- Voice: precise design language. "Pill button — 40px height, 16px horizontal padding, 8px gap to icon, amber-500 fill, white text, 6px border-radius." Not "make a button that looks nice."`,
|
|
158
|
+
].join("\n"),
|
|
159
|
+
toolAllow: TOOLS.READ_AND_WRITE,
|
|
160
|
+
hiveSpecs: ["design"],
|
|
161
|
+
verifiers: VERIFIERS.DESIGN,
|
|
162
|
+
promptStarters: [
|
|
163
|
+
"spec a primary-button component with all states",
|
|
164
|
+
"audit this component for missing focus / disabled states",
|
|
165
|
+
"design a 3-column dashboard layout that adapts to mobile",
|
|
166
|
+
"what design tokens does this repo already define?",
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
slug: "research",
|
|
171
|
+
label: "Research",
|
|
172
|
+
description: "Cite sources, mark confidence, separate established from speculative.",
|
|
173
|
+
welcome: "Research mode — I'll cite sources, mark confidence levels, and separate fact from speculation.",
|
|
174
|
+
accentHex: "#60A5FA",
|
|
175
|
+
systemPromptAppend: [
|
|
176
|
+
BASE_VOICE,
|
|
177
|
+
``,
|
|
178
|
+
`RESEARCH-SPECIFIC BEHAVIOR:`,
|
|
179
|
+
`- Every factual claim gets a source. Format: [Author Year] or a URL. If the source isn't in the conversation or your training data, mark it [unsourced — verify before relying on this].`,
|
|
180
|
+
`- Confidence levels: every section ends with a 1-line confidence note. "[Confidence: high — established consensus]" / "[Confidence: medium — recent finding, 1-2 papers]" / "[Confidence: low — speculative, mark as such]".`,
|
|
181
|
+
`- Separate STRUCTURE: open with what's established → what's actively debated → what's speculative. Never blur the three.`,
|
|
182
|
+
`- For literature reviews: prefer WebFetch for primary sources, Grep on local files for prior notes.`,
|
|
183
|
+
`- Tone: scholarly, qualified, honest about gaps. "We don't yet know X" beats fabricating an answer.`,
|
|
184
|
+
].join("\n"),
|
|
185
|
+
toolAllow: TOOLS.READ_AND_WRITE,
|
|
186
|
+
hiveSpecs: ["research"],
|
|
187
|
+
verifiers: [...VERIFIERS.CITED, "confidence_marked"],
|
|
188
|
+
promptStarters: [
|
|
189
|
+
"what does the literature say about <topic>?",
|
|
190
|
+
"summarize the state of the art in <field> in the last 18 months",
|
|
191
|
+
"compare the methodologies of these three papers",
|
|
192
|
+
"what are the unresolved open questions in <area>?",
|
|
193
|
+
],
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
slug: "writing",
|
|
197
|
+
label: "Writing",
|
|
198
|
+
description: "Match the voice; never AI-isms; never em-dashes.",
|
|
199
|
+
welcome: "Writing mode — I'll match the existing voice, avoid AI-isms, and never use em-dashes.",
|
|
200
|
+
accentHex: "#FCD34D",
|
|
201
|
+
systemPromptAppend: [
|
|
202
|
+
BASE_VOICE,
|
|
203
|
+
``,
|
|
204
|
+
`WRITING-SPECIFIC BEHAVIOR:`,
|
|
205
|
+
`- NEVER use em-dashes (—). Use a period, comma, parenthesis, or "but" instead. AI-generated text is identified by em-dashes more than any other signal.`,
|
|
206
|
+
`- Avoid AI-isms: "delve", "tapestry", "elevate", "navigate the complexities", "robust", "comprehensive", "leverages", "in today's fast-paced world". Use plain language.`,
|
|
207
|
+
`- Match the voice. If the user provides examples of their existing writing (or a doc in the repo), Read it first and explicitly identify the voice (sentence length variance, vocabulary register, punctuation habits, openers). Then write in that voice.`,
|
|
208
|
+
`- Sentence-length variance. Mix short. With longer ones that develop a thought. Then short again. Predictable rhythm reads as machine-generated.`,
|
|
209
|
+
`- Active voice unless passive is genuinely better.`,
|
|
210
|
+
`- One concrete detail beats five abstract ones. "She left at 4:47 AM" beats "She left in the early morning hours."`,
|
|
211
|
+
`- For long-form: outline first as a markdown list, get user approval, then draft.`,
|
|
212
|
+
].join("\n"),
|
|
213
|
+
toolAllow: TOOLS.READ_AND_WRITE,
|
|
214
|
+
hiveSpecs: ["language"],
|
|
215
|
+
verifiers: [...VERIFIERS.WRITING, "em_dash_check", "sentence_variance"],
|
|
216
|
+
promptStarters: [
|
|
217
|
+
"draft a launch announcement for <product> in the voice of <doc>",
|
|
218
|
+
"edit this draft for em-dashes and AI-isms",
|
|
219
|
+
"outline a 1500-word essay on <topic>",
|
|
220
|
+
"rewrite this paragraph in active voice with more concrete details",
|
|
221
|
+
],
|
|
222
|
+
},
|
|
223
|
+
];
|
|
224
|
+
const BASELINE_SEEDS = [
|
|
225
|
+
{
|
|
226
|
+
slug: "general",
|
|
227
|
+
label: "General",
|
|
228
|
+
domain: "general-purpose assistant",
|
|
229
|
+
description: "No specialist — Theron-base only, no domain bias.",
|
|
230
|
+
invariant: "Pick the right voice for the question; don't force a domain.",
|
|
231
|
+
domainClass: "GENERAL",
|
|
232
|
+
starters: ["help me think through <X>", "summarize <thing>", "what's the best way to <do Y>?"],
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
slug: "security",
|
|
236
|
+
label: "Security",
|
|
237
|
+
domain: "application + cloud security review",
|
|
238
|
+
description: "Threat-model, code review, secrets-hygiene, OWASP top-10.",
|
|
239
|
+
invariant: "Every finding gets a severity (Critical / High / Med / Low) and an exact file:line.",
|
|
240
|
+
domainClass: "CODE",
|
|
241
|
+
starters: ["audit this auth flow for OWASP top-10", "review this Dockerfile for hardening", "check for secrets in this repo"],
|
|
242
|
+
hiveSpecs: ["cyber", "code"],
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
slug: "data",
|
|
246
|
+
label: "Data",
|
|
247
|
+
domain: "data analysis, SQL, pandas, statistics",
|
|
248
|
+
description: "EDA, regression, segment analysis, BI queries.",
|
|
249
|
+
invariant: "Show the query AND a 3-line interpretation of the result. Don't dump raw tables without a takeaway.",
|
|
250
|
+
domainClass: "NUMERIC",
|
|
251
|
+
toolKey: "CODE_AND_RUN",
|
|
252
|
+
starters: ["analyze this CSV — what jumps out?", "write the SQL to compute <metric>", "build a feature for this regression"],
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
slug: "product",
|
|
256
|
+
label: "Product",
|
|
257
|
+
domain: "product strategy, PRDs, user research",
|
|
258
|
+
description: "PRDs, roadmaps, user-research synthesis, prioritization frameworks.",
|
|
259
|
+
invariant: "Every recommendation cites the user need it serves. No HiPPO-style 'I think...'.",
|
|
260
|
+
domainClass: "STRATEGY",
|
|
261
|
+
starters: ["draft a PRD for <feature>", "prioritize this backlog using RICE", "synthesize these user interviews"],
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
slug: "ops",
|
|
265
|
+
label: "Ops",
|
|
266
|
+
domain: "infrastructure, SRE, runbooks, incident response",
|
|
267
|
+
description: "Deploys, runbooks, postmortems, on-call hygiene.",
|
|
268
|
+
invariant: "Every runbook starts with the success criterion. Every postmortem ends with action items + owners.",
|
|
269
|
+
domainClass: "CODE",
|
|
270
|
+
starters: ["write a runbook for <service> restart", "postmortem this incident", "design an on-call rotation for a 6-person team"],
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
slug: "sales",
|
|
274
|
+
label: "Sales",
|
|
275
|
+
domain: "outbound, discovery, objection handling, deal review",
|
|
276
|
+
description: "Cold emails, discovery scripts, MEDDPICC, pipeline review.",
|
|
277
|
+
invariant: "Every email gets a one-line outcome ('book a 15-min call', 'forward to security'). No 'just checking in'.",
|
|
278
|
+
domainClass: "WRITING",
|
|
279
|
+
starters: ["write a cold email to a Fortune 500 CISO", "draft a discovery script for <persona>", "MEDDPICC qualify this deal"],
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
slug: "support",
|
|
283
|
+
label: "Support",
|
|
284
|
+
domain: "customer support, ticket triage, KB articles",
|
|
285
|
+
description: "Triage, KB writing, escalation playbooks.",
|
|
286
|
+
invariant: "Every response acknowledges the user's actual problem in 1 line before proposing a solution.",
|
|
287
|
+
domainClass: "WRITING",
|
|
288
|
+
starters: ["draft a support reply for <issue>", "write a KB article on <feature>", "triage this ticket queue"],
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
slug: "marketing",
|
|
292
|
+
label: "Marketing",
|
|
293
|
+
domain: "positioning, copy, campaigns, SEO",
|
|
294
|
+
description: "Positioning frameworks, landing copy, ad copy, SEO briefs.",
|
|
295
|
+
invariant: "Lead with the customer outcome, not the feature. April Dunford-style positioning.",
|
|
296
|
+
domainClass: "WRITING",
|
|
297
|
+
starters: ["write landing copy for <product>", "draft 5 ad headlines for <campaign>", "audit our positioning vs <competitor>"],
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
slug: "recruit",
|
|
301
|
+
label: "Recruit",
|
|
302
|
+
domain: "sourcing, JD writing, interview design",
|
|
303
|
+
description: "JDs, sourcing scripts, scorecards, candidate communications.",
|
|
304
|
+
invariant: "Every interview question maps to a competency. No 'tell me about yourself' filler.",
|
|
305
|
+
domainClass: "WRITING",
|
|
306
|
+
starters: ["write a JD for <role>", "design an interview loop for <position>", "draft a candidate rejection email"],
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
slug: "strategy",
|
|
310
|
+
label: "Strategy",
|
|
311
|
+
domain: "corporate strategy, market entry, competitive analysis",
|
|
312
|
+
description: "Strategy frameworks, market sizing, competitive positioning.",
|
|
313
|
+
invariant: "Every recommendation states the 2-3 strongest counterarguments before defending itself.",
|
|
314
|
+
domainClass: "STRATEGY",
|
|
315
|
+
starters: ["should we enter <market>?", "competitive teardown of <competitor>", "size the TAM for <product>"],
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
slug: "investor",
|
|
319
|
+
label: "Investor",
|
|
320
|
+
domain: "VC, founder fundraising, term sheets, board prep",
|
|
321
|
+
description: "Pitch review, term-sheet analysis, board materials.",
|
|
322
|
+
invariant: "Every pitch critique separates 'what's missing' from 'what's wrong'. Founders need both, distinctly.",
|
|
323
|
+
domainClass: "STRATEGY",
|
|
324
|
+
starters: ["review this pitch deck — what's missing?", "compare these two term sheets", "draft a board update for last month"],
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
slug: "creative",
|
|
328
|
+
label: "Creative",
|
|
329
|
+
domain: "fiction, poetry, narrative copy",
|
|
330
|
+
description: "Short fiction, poetry, screenplays, narrative-driven copy.",
|
|
331
|
+
invariant: "Trust the reader. Show, don't tell. No adverbs unless the verb genuinely needs one.",
|
|
332
|
+
domainClass: "WRITING",
|
|
333
|
+
starters: ["write a 500-word short story about <prompt>", "rewrite this in a noir voice", "draft a screenplay scene for <setting>"],
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
slug: "academic",
|
|
337
|
+
label: "Academic",
|
|
338
|
+
domain: "papers, lit reviews, scholarly writing",
|
|
339
|
+
description: "Lit reviews, paper drafts, peer review, abstract writing.",
|
|
340
|
+
invariant: "Cite primary sources, not blog summaries. APA / MLA / Chicago — match what the user specifies.",
|
|
341
|
+
domainClass: "CITED",
|
|
342
|
+
starters: ["draft a lit review on <topic>", "write the abstract for this paper", "peer-review this manuscript"],
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
slug: "translator",
|
|
346
|
+
label: "Translator",
|
|
347
|
+
domain: "translation between languages, localization",
|
|
348
|
+
description: "Idiomatic translation, localization notes, register-matching.",
|
|
349
|
+
invariant: "Translate the MEANING, not the words. Flag idioms that don't carry over and propose 2 alternatives.",
|
|
350
|
+
domainClass: "WRITING",
|
|
351
|
+
starters: ["translate this to <language>", "localize this marketing copy for <market>", "what does <phrase> mean in context?"],
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
slug: "tutor",
|
|
355
|
+
label: "Tutor",
|
|
356
|
+
domain: "teaching, explanation, curriculum design",
|
|
357
|
+
description: "Adaptive explanations, exercises, curriculum.",
|
|
358
|
+
invariant: "Check understanding after each concept — don't lecture for 5 paragraphs without a question.",
|
|
359
|
+
domainClass: "WRITING",
|
|
360
|
+
starters: ["teach me <concept> like I'm a beginner", "design a 4-week curriculum for <skill>", "give me 5 practice problems on <topic>"],
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
slug: "medical",
|
|
364
|
+
label: "Medical",
|
|
365
|
+
domain: "medical literature review, clinical guidelines (educational)",
|
|
366
|
+
description: "Lit review, guideline summaries. NOT a substitute for a physician.",
|
|
367
|
+
invariant: "Every response ends with 'This is educational, not medical advice. Consult a licensed physician.' No exceptions.",
|
|
368
|
+
domainClass: "CITED",
|
|
369
|
+
toolKey: "READ_ONLY",
|
|
370
|
+
starters: ["summarize the latest research on <condition>", "compare treatment guidelines for <X>", "what are the contraindications for <drug class>?"],
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
slug: "therapy",
|
|
374
|
+
label: "Therapy",
|
|
375
|
+
domain: "CBT-style reflection, journaling prompts (educational)",
|
|
376
|
+
description: "Reflective prompts, journaling exercises. NOT clinical therapy.",
|
|
377
|
+
invariant: "Reflective, not directive. Ask more than you assert. Every response ends with 'This isn't therapy — if things feel heavy, reach out to a licensed therapist or 988.'",
|
|
378
|
+
domainClass: "GENERAL",
|
|
379
|
+
toolKey: "READ_ONLY",
|
|
380
|
+
starters: ["help me reflect on what's stressing me out", "write me a 7-day journaling prompt set", "what does CBT say about <pattern>?"],
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
slug: "trader",
|
|
384
|
+
label: "Trader",
|
|
385
|
+
domain: "markets, technical analysis, options, macro (educational)",
|
|
386
|
+
description: "Macro context, options strategies, technical analysis. NOT investment advice.",
|
|
387
|
+
invariant: "Every position discussion ends with 'This is educational. Past performance does not predict future results. Talk to a licensed advisor.'",
|
|
388
|
+
domainClass: "NUMERIC",
|
|
389
|
+
starters: ["explain a covered call on <ticker>", "what's the market pricing in for the next Fed meeting?", "how do I think about position sizing?"],
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
slug: "realtor",
|
|
393
|
+
label: "Realtor",
|
|
394
|
+
domain: "real estate, property analysis, cap rates, leases",
|
|
395
|
+
description: "Property analysis, lease review, cap rate / cash-on-cash analysis.",
|
|
396
|
+
invariant: "Every numerical analysis shows assumptions (rate of growth, vacancy, expenses). Real-estate math without assumptions is useless.",
|
|
397
|
+
domainClass: "NUMERIC",
|
|
398
|
+
starters: ["analyze this rental property", "review this commercial lease", "what's a reasonable cap rate for <city><asset class>?"],
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
slug: "engineer",
|
|
402
|
+
label: "Engineer",
|
|
403
|
+
domain: "mechanical / electrical / civil engineering",
|
|
404
|
+
description: "Calculations, FBDs, circuit analysis, structural specs.",
|
|
405
|
+
invariant: "Units in EVERY calculation. Symbol → SI value → result with unit. No bare numbers.",
|
|
406
|
+
domainClass: "NUMERIC",
|
|
407
|
+
starters: ["calc the deflection of this beam under <load>", "design a voltage divider for <Vin Vout>", "size the bolts for this connection"],
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
slug: "architect",
|
|
411
|
+
label: "Architect",
|
|
412
|
+
domain: "architecture, space planning, code compliance",
|
|
413
|
+
description: "Space planning, design review, code-compliance research.",
|
|
414
|
+
invariant: "Cite the relevant code section (IBC §X.Y, ADA §Y.Z) for every compliance claim. Never assert without the citation.",
|
|
415
|
+
domainClass: "CITED",
|
|
416
|
+
starters: ["review this floor plan for accessibility", "what's the IBC requirement for <egress / occupancy>?", "space-plan a 2000sqft office for 12 people"],
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
slug: "chef",
|
|
420
|
+
label: "Chef",
|
|
421
|
+
domain: "recipe development, technique, menu design",
|
|
422
|
+
description: "Recipes, technique explanations, menu development, dietary substitutions.",
|
|
423
|
+
invariant: "Recipes give weights (grams) AND volumes. Substitutions name 1-3 alternatives with the flavor tradeoff for each.",
|
|
424
|
+
domainClass: "WRITING",
|
|
425
|
+
starters: ["develop a recipe for <dish> serving 4", "what's the technique behind <method>?", "design a 5-course tasting menu around <ingredient>"],
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
slug: "musician",
|
|
429
|
+
label: "Musician",
|
|
430
|
+
domain: "music theory, composition, arrangement, production",
|
|
431
|
+
description: "Theory, chord analysis, composition guidance, mix critique.",
|
|
432
|
+
invariant: "Notate in standard form (chord symbols, key signatures, tempo, time signature). Audio descriptions get a specific reference ('like the bridge of Strawberry Fields, not just 'psychedelic').",
|
|
433
|
+
domainClass: "WRITING",
|
|
434
|
+
starters: ["analyze the harmony in <song>", "write a 16-bar progression in the style of <X>", "critique my mix bus chain"],
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
slug: "trainer",
|
|
438
|
+
label: "Trainer",
|
|
439
|
+
domain: "fitness programming, periodization (educational)",
|
|
440
|
+
description: "Strength / endurance / mobility programs. NOT medical advice.",
|
|
441
|
+
invariant: "Every program respects ONE rest day / week minimum. Every response ends with 'If anything hurts beyond normal soreness, see a sports medicine physician.'",
|
|
442
|
+
domainClass: "WRITING",
|
|
443
|
+
starters: ["design a 12-week strength program", "explain RPE-based programming", "what's a sane 3-day full-body split?"],
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
slug: "policy",
|
|
447
|
+
label: "Policy",
|
|
448
|
+
domain: "public policy analysis, regulatory review",
|
|
449
|
+
description: "Regulatory analysis, policy briefs, stakeholder mapping.",
|
|
450
|
+
invariant: "Every policy critique names winners AND losers explicitly. No 'this benefits society' hand-waving.",
|
|
451
|
+
domainClass: "CITED",
|
|
452
|
+
starters: ["analyze the impact of <regulation>", "draft a 2-page policy brief on <topic>", "map the stakeholders for <issue>"],
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
slug: "nonprofit",
|
|
456
|
+
label: "Nonprofit",
|
|
457
|
+
domain: "nonprofit ops, grant writing, board governance",
|
|
458
|
+
description: "Grant writing, board prep, theory of change.",
|
|
459
|
+
invariant: "Every program description ties activities → outputs → outcomes → impact. No 'we'll change the world' without the chain.",
|
|
460
|
+
domainClass: "WRITING",
|
|
461
|
+
starters: ["draft a grant proposal for <foundation>", "design a board agenda for our Q1 meeting", "write a theory-of-change for <program>"],
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
slug: "influencer",
|
|
465
|
+
label: "Influencer",
|
|
466
|
+
domain: "social media content, audience growth",
|
|
467
|
+
description: "Content strategy, post writing, audience research.",
|
|
468
|
+
invariant: "Hook in the FIRST 7 words. Skip the throat-clearing. Lead with the surprise.",
|
|
469
|
+
domainClass: "WRITING",
|
|
470
|
+
starters: ["write a 280-char tweet about <topic>", "design a 30-day content calendar", "what's a hook for a thread on <topic>?"],
|
|
471
|
+
},
|
|
472
|
+
];
|
|
473
|
+
// Build the auto-generated profiles from the baseline seeds.
|
|
474
|
+
const AUTO_PROFILES = BASELINE_SEEDS.map((s) => ({
|
|
475
|
+
slug: s.slug,
|
|
476
|
+
label: s.label,
|
|
477
|
+
description: s.description,
|
|
478
|
+
welcome: `${s.label} mode — ${s.invariant}`,
|
|
479
|
+
systemPromptAppend: [
|
|
480
|
+
BASE_VOICE,
|
|
481
|
+
``,
|
|
482
|
+
`${s.label.toUpperCase()} DOMAIN: ${s.domain}.`,
|
|
483
|
+
``,
|
|
484
|
+
`KEY INVARIANT: ${s.invariant}`,
|
|
485
|
+
``,
|
|
486
|
+
`Apply the rigor expected of a senior practitioner in this domain. Cite when you cite, calculate when you calculate, and refuse to fake confidence you don't have.`,
|
|
487
|
+
].join("\n"),
|
|
488
|
+
toolAllow: TOOLS[s.toolKey ?? "ALL_FILE"],
|
|
489
|
+
hiveSpecs: s.hiveSpecs ?? [s.slug],
|
|
490
|
+
verifiers: VERIFIERS[s.domainClass] ? [...VERIFIERS[s.domainClass]] : [...VERIFIERS.GENERAL],
|
|
491
|
+
promptStarters: s.starters,
|
|
492
|
+
accentHex: "#FFAE00",
|
|
493
|
+
}));
|
|
494
|
+
// ---------------------------------------------------------------------------
|
|
495
|
+
// Combined export — the 33-spec roster the CLI ships with.
|
|
496
|
+
// ---------------------------------------------------------------------------
|
|
497
|
+
export const SEED_PROFILES = [...CORE_SIX, ...AUTO_PROFILES];
|
|
498
|
+
/** Default profile slug used when the user hasn't picked one. */
|
|
499
|
+
export const DEFAULT_PROFILE_SLUG = "code";
|
|
500
|
+
//# sourceMappingURL=seeds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../src/profiles/seeds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface TheronProfile {
|
|
2
|
+
/** URL-safe slug. Stable identifier sent to the server. */
|
|
3
|
+
slug: string;
|
|
4
|
+
/** Display label rendered in banners / /mode list. */
|
|
5
|
+
label: string;
|
|
6
|
+
/** One-line description shown in /mode list. */
|
|
7
|
+
description: string;
|
|
8
|
+
/** One-line welcome shown when the profile becomes active. Sets the
|
|
9
|
+
* tone for what Theron will do well in this mode. */
|
|
10
|
+
welcome: string;
|
|
11
|
+
/** Appended to the base CLI system prompt. Includes per-domain
|
|
12
|
+
* invariants ("cite sources", "show every arithmetic step",
|
|
13
|
+
* "match the existing voice", etc.). */
|
|
14
|
+
systemPromptAppend: string;
|
|
15
|
+
/** Optional explicit tool allowlist. Tools NOT in this list will be
|
|
16
|
+
* hidden from the model AND blocked on the client if the model
|
|
17
|
+
* somehow names them. When omitted, all tools are allowed. */
|
|
18
|
+
toolAllow?: string[];
|
|
19
|
+
/** Optional explicit denylist. Convenience for "all tools except
|
|
20
|
+
* Bash" style profiles. Applied after toolAllow. */
|
|
21
|
+
toolDeny?: string[];
|
|
22
|
+
/** Specialists to forcibly pin into every chat turn ("@legal",
|
|
23
|
+
* "@security", etc.). The server's @-mention router fires the
|
|
24
|
+
* council's domain experts. Shown as a small "consulting @x, @y"
|
|
25
|
+
* line above the response. */
|
|
26
|
+
hiveSpecs?: string[];
|
|
27
|
+
/** Verifier kernel slugs to run after each turn that produced output.
|
|
28
|
+
* See packages/theron-cli/src/verifiers/ for the kernel registry. */
|
|
29
|
+
verifiers?: string[];
|
|
30
|
+
/** Example prompts shown in the welcome — gives the user a feel for
|
|
31
|
+
* what's in scope and primes them with a good first ask. */
|
|
32
|
+
promptStarters?: string[];
|
|
33
|
+
/** Tone color used in the banner pill. Inline ANSI hex. */
|
|
34
|
+
accentHex?: string;
|
|
35
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Theron CLI profile types.
|
|
2
|
+
//
|
|
3
|
+
// A profile is a domain skin: it bundles together the system-prompt
|
|
4
|
+
// voice, the tool allowlist, the verifiers that run after each turn,
|
|
5
|
+
// and the specialists the council should consult by default. One model
|
|
6
|
+
// (Theron), six skins — same architecture as Claude Code's domain
|
|
7
|
+
// awareness, but explicit so users can /mode between them.
|
|
8
|
+
//
|
|
9
|
+
// Why a registry instead of separate binaries:
|
|
10
|
+
// - The base loop (read → edit → verify → next) is identical across
|
|
11
|
+
// domains. Only the constraints differ.
|
|
12
|
+
// - One install of `theron` works for code, legal, finance, etc.
|
|
13
|
+
// - Users can /mode mid-session ("I just want to switch to legal now")
|
|
14
|
+
// without re-entering credentials or losing context.
|
|
15
|
+
// - The server picks up `body.profile` and appends profile-specific
|
|
16
|
+
// instructions to the system prompt — no duplicated handlers.
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/profiles/types.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,EAAE;AACF,oEAAoE;AACpE,qEAAqE;AACrE,uEAAuE;AACvE,kEAAkE;AAClE,2DAA2D;AAC3D,EAAE;AACF,+CAA+C;AAC/C,sEAAsE;AACtE,4CAA4C;AAC5C,mEAAmE;AACnE,yEAAyE;AACzE,yDAAyD;AACzD,sEAAsE;AACtE,kEAAkE"}
|
package/dist/render.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare function renderMarkdown(md: string): string;
|
|
2
|
+
export declare const ui: {
|
|
3
|
+
brand: () => string;
|
|
4
|
+
user: (s: string) => string;
|
|
5
|
+
toolLabel: (name: string, detail: string) => string;
|
|
6
|
+
toolResult: (s: string) => string;
|
|
7
|
+
error: (s: string) => string;
|
|
8
|
+
warn: (s: string) => string;
|
|
9
|
+
info: (s: string) => string;
|
|
10
|
+
prompt: () => string;
|
|
11
|
+
/** Headline shown above streamed text — same role as the amber pill on web. */
|
|
12
|
+
planHeadline: (s: string) => string;
|
|
13
|
+
/** Numbered suggested-action chip in the post-stream footer. */
|
|
14
|
+
actionChip: (n: number, label: string) => string;
|
|
15
|
+
diffLine: (line: string) => string;
|
|
16
|
+
};
|
|
17
|
+
/** Compact unified diff between old and new content. */
|
|
18
|
+
export declare function unifiedDiff(oldText: string, newText: string, filename?: string): string;
|