Script for easily configuring, using, switching and comparing local offline coding models
1export interface TuiDef {
2 id: string;
3 name: string;
4 installCmd: string;
5 checkCmd: string;
6 launchArgs: string;
7 /** Extra args to pass when resuming a previous session. */
8 resumeArgs?: string[];
9 /** If set, launch via `ollama launch <ollamaLaunch> --model <tag>` instead of direct exec. */
10 ollamaLaunch?: string;
11}
12
13export const TUIS: TuiDef[] = [
14 {
15 id: "claude",
16 name: "Claude Code",
17 installCmd: "npm install -g @anthropic-ai/claude-code",
18 checkCmd: "claude",
19 launchArgs: '"$@"',
20 ollamaLaunch: "claude",
21 },
22 {
23 id: "codex",
24 name: "Codex CLI",
25 installCmd: "npm install -g @openai/codex",
26 checkCmd: "codex",
27 launchArgs: '"$@"',
28 ollamaLaunch: "codex",
29 },
30 {
31 id: "opencode",
32 name: "OpenCode",
33 installCmd: "npm install -g opencode-ai@latest",
34 checkCmd: "opencode",
35 launchArgs: '"$@"',
36 ollamaLaunch: "opencode",
37 },
38 {
39 id: "pi",
40 name: "Pi",
41 installCmd: "npm install -g @mariozechner/pi-coding-agent",
42 checkCmd: "pi",
43 launchArgs: '"$@"',
44 ollamaLaunch: "pi",
45 },
46 {
47 id: "cline",
48 name: "Cline",
49 installCmd: "npm install -g @anthropic-ai/cline",
50 checkCmd: "cline",
51 launchArgs: '"$@"',
52 ollamaLaunch: "cline",
53 },
54 {
55 id: "droid",
56 name: "Droid",
57 installCmd: "npm install -g droid",
58 checkCmd: "droid",
59 launchArgs: '"$@"',
60 ollamaLaunch: "droid",
61 },
62 {
63 id: "openclaw",
64 name: "OpenClaw",
65 installCmd: "npm install -g openclaw",
66 checkCmd: "openclaw",
67 launchArgs: '"$@"',
68 ollamaLaunch: "openclaw",
69 },
70 {
71 id: "aider",
72 name: "Aider",
73 installCmd: "pipx install aider-chat",
74 checkCmd: "aider",
75 launchArgs: '"$@"',
76 },
77 {
78 id: "goose",
79 name: "Goose",
80 installCmd: "brew install block-goose-cli",
81 checkCmd: "goose",
82 launchArgs: '"$@"',
83 },
84 {
85 id: "gptme",
86 name: "gptme",
87 installCmd: "pipx install gptme",
88 checkCmd: "gptme",
89 launchArgs: '"$@"',
90 resumeArgs: ["-r"],
91 },
92];
93
94export function getTuiById(id: string): TuiDef | undefined {
95 return TUIS.find((t) => t.id === id);
96}