@osanoai/multicli 1.5.4 → 1.5.6
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/README.md +53 -26
- package/dist/modelCatalog.d.ts.map +1 -1
- package/dist/modelCatalog.generated.json +78 -0
- package/dist/modelCatalog.js +116 -76
- package/dist/modelCatalog.js.map +1 -1
- package/dist/tierConfig.d.ts +14 -0
- package/dist/tierConfig.d.ts.map +1 -0
- package/dist/tierConfig.js +55 -0
- package/dist/tierConfig.js.map +1 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Multi-CLI MCP
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@osanoai/multicli)
|
|
4
4
|
[](https://github.com/osanoai/multicli/actions/workflows/tests.yml)
|
|
@@ -7,9 +7,7 @@
|
|
|
7
7
|
[](https://www.npmjs.com/package/@osanoai/multicli)
|
|
8
8
|
[](https://www.typescriptlang.org/)
|
|
9
9
|
|
|
10
|
-
**
|
|
11
|
-
|
|
12
|
-
An MCP server that lets Claude, Gemini, and Codex call each other as tools. Because why argue about which AI is best when you can make them work together?
|
|
10
|
+
**An MCP server that lets Claude, Gemini, and Codex call each other as tools.**
|
|
13
11
|
|
|
14
12
|
```
|
|
15
13
|
Claude: "Hey Gemini, what do you think about this code?"
|
|
@@ -17,6 +15,18 @@ Gemini: "It's mass. Let me ask Codex for a second opinion."
|
|
|
17
15
|
Codex: "You're both wrong. Here's the fix."
|
|
18
16
|
```
|
|
19
17
|
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## One-Line Install
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
curl -fsSL https://raw.githubusercontent.com/osanoai/multicli/main/install.sh | bash
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Detects which AI CLIs you have installed and configures Multi-CLI for all of them automatically. No config files, no API keys, no environment variables. If it's on your PATH, it works.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
20
30
|
## What It Does
|
|
21
31
|
|
|
22
32
|
Multi-CLI sits between your AI clients and bridges them via the [Model Context Protocol](https://modelcontextprotocol.io/). Install it once, and whichever AI you're talking to gains the ability to call the others.
|
|
@@ -27,41 +37,55 @@ Multi-CLI sits between your AI clients and bridges them via the [Model Context P
|
|
|
27
37
|
- Each client's own tools are hidden (no talking to yourself, that's weird)
|
|
28
38
|
- Auto-detects which CLIs you have installed — only shows what's available
|
|
29
39
|
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## The Meta Part
|
|
43
|
+
|
|
44
|
+
This tool was built by the very AIs it connects.
|
|
45
|
+
|
|
46
|
+
Claude, Gemini, and Codex wrote the code. Claude, Gemini, and Codex maintain it. Every night, a CI job queries the latest stable release of each CLI for its current model list, diffs the results against what's in the repo, and automatically publishes a new version if anything changed. New model releases get picked up within 24 hours. Deprecated models get cleaned out. The repo stays current without anyone touching it.
|
|
47
|
+
|
|
48
|
+
Because all install commands use `@latest`, your MCP client pulls the newest version every time it starts — no manual updates, no stale model lists, no maintenance.
|
|
49
|
+
|
|
50
|
+
Most MCP tools go stale within weeks. This one is self-maintaining by design.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
30
54
|
## Prerequisites
|
|
31
55
|
|
|
32
56
|
You need **Node.js >= 20** and at least **two** of these CLIs installed:
|
|
33
57
|
|
|
34
58
|
| CLI | Install |
|
|
35
59
|
|-----|---------|
|
|
36
|
-
| [Gemini CLI](https://github.com/google-gemini/gemini-cli) | `npm install -g @google/gemini-cli` |
|
|
37
60
|
| [Claude Code](https://docs.anthropic.com/en/docs/claude-code/overview) | `npm install -g @anthropic-ai/claude-code` |
|
|
61
|
+
| [Gemini CLI](https://github.com/google-gemini/gemini-cli) | `npm install -g @google/gemini-cli` |
|
|
38
62
|
| [Codex CLI](https://github.com/openai/codex) | `npm install -g @openai/codex` |
|
|
39
63
|
|
|
40
64
|
> Why two? Because one AI talking to itself is a monologue, not a collaboration.
|
|
41
65
|
|
|
42
66
|
---
|
|
43
67
|
|
|
44
|
-
## Installation
|
|
68
|
+
## Manual Installation
|
|
69
|
+
|
|
70
|
+
Prefer to install per-client yourself? Each command is one line.
|
|
45
71
|
|
|
46
72
|
### Claude Code
|
|
47
73
|
|
|
48
74
|
```bash
|
|
49
|
-
claude mcp add Multi-CLI -- npx -y @osanoai/multicli
|
|
75
|
+
claude mcp add Multi-CLI -- npx -y @osanoai/multicli@latest
|
|
50
76
|
```
|
|
51
77
|
|
|
52
|
-
That's it. Restart Claude Code and Gemini + Codex tools appear automatically.
|
|
53
|
-
|
|
54
78
|
<details>
|
|
55
79
|
<summary>Claude Desktop (JSON config)</summary>
|
|
56
80
|
|
|
57
|
-
Add to
|
|
81
|
+
Add to `~/Library/Application Support/Claude/claude_desktop_config.json` on macOS:
|
|
58
82
|
|
|
59
83
|
```json
|
|
60
84
|
{
|
|
61
85
|
"mcpServers": {
|
|
62
86
|
"Multi-CLI": {
|
|
63
87
|
"command": "npx",
|
|
64
|
-
"args": ["-y", "@osanoai/multicli"]
|
|
88
|
+
"args": ["-y", "@osanoai/multicli@latest"]
|
|
65
89
|
}
|
|
66
90
|
}
|
|
67
91
|
}
|
|
@@ -75,11 +99,9 @@ Restart Claude Desktop completely after saving.
|
|
|
75
99
|
### Gemini CLI
|
|
76
100
|
|
|
77
101
|
```bash
|
|
78
|
-
gemini mcp add --scope user Multi-CLI npx -y @osanoai/multicli
|
|
102
|
+
gemini mcp add --scope user Multi-CLI npx -y @osanoai/multicli@latest
|
|
79
103
|
```
|
|
80
104
|
|
|
81
|
-
Restart the Gemini CLI and Claude + Codex tools will be available.
|
|
82
|
-
|
|
83
105
|
<details>
|
|
84
106
|
<summary>Manual config (~/.gemini/settings.json)</summary>
|
|
85
107
|
|
|
@@ -88,7 +110,7 @@ Restart the Gemini CLI and Claude + Codex tools will be available.
|
|
|
88
110
|
"mcpServers": {
|
|
89
111
|
"Multi-CLI": {
|
|
90
112
|
"command": "npx",
|
|
91
|
-
"args": ["-y", "@osanoai/multicli"]
|
|
113
|
+
"args": ["-y", "@osanoai/multicli@latest"]
|
|
92
114
|
}
|
|
93
115
|
}
|
|
94
116
|
}
|
|
@@ -100,11 +122,9 @@ Restart the Gemini CLI and Claude + Codex tools will be available.
|
|
|
100
122
|
### Codex CLI
|
|
101
123
|
|
|
102
124
|
```bash
|
|
103
|
-
codex mcp add Multi-CLI -- npx -y @osanoai/multicli
|
|
125
|
+
codex mcp add Multi-CLI -- npx -y @osanoai/multicli@latest
|
|
104
126
|
```
|
|
105
127
|
|
|
106
|
-
Restart Codex and Claude + Gemini tools will be available.
|
|
107
|
-
|
|
108
128
|
<details>
|
|
109
129
|
<summary>Manual config (~/.codex/config.toml) or pass --mcp-config</summary>
|
|
110
130
|
|
|
@@ -119,7 +139,7 @@ Where `mcp.json` contains:
|
|
|
119
139
|
"mcpServers": {
|
|
120
140
|
"Multi-CLI": {
|
|
121
141
|
"command": "npx",
|
|
122
|
-
"args": ["-y", "@osanoai/multicli"]
|
|
142
|
+
"args": ["-y", "@osanoai/multicli@latest"]
|
|
123
143
|
}
|
|
124
144
|
}
|
|
125
145
|
}
|
|
@@ -133,7 +153,7 @@ Where `mcp.json` contains:
|
|
|
133
153
|
Multi-CLI uses standard stdio transport. If your client supports MCP, point it at:
|
|
134
154
|
|
|
135
155
|
```
|
|
136
|
-
npx -y @osanoai/multicli
|
|
156
|
+
npx -y @osanoai/multicli@latest
|
|
137
157
|
```
|
|
138
158
|
|
|
139
159
|
---
|
|
@@ -155,6 +175,8 @@ Once connected, your AI client gains access to tools for the *other* CLIs (never
|
|
|
155
175
|
| `Ask Claude` | Ask Claude a question or give it a task |
|
|
156
176
|
| `Claude Help` | Get Claude Code CLI help info |
|
|
157
177
|
|
|
178
|
+
---
|
|
179
|
+
|
|
158
180
|
## Usage Examples
|
|
159
181
|
|
|
160
182
|
Once installed, just talk naturally to your AI:
|
|
@@ -173,13 +195,15 @@ Or get a second opinion on anything:
|
|
|
173
195
|
ask Gemini and Codex what they'd do differently"
|
|
174
196
|
```
|
|
175
197
|
|
|
198
|
+
---
|
|
199
|
+
|
|
176
200
|
## How It Works
|
|
177
201
|
|
|
178
202
|
```
|
|
179
|
-
┌─────────────┐ MCP (stdio)
|
|
180
|
-
│ Your AI │ ◄──────────────────► │
|
|
181
|
-
│ Client │ │ server │
|
|
182
|
-
└─────────────┘ └──────────────┘
|
|
203
|
+
┌─────────────┐ MCP (stdio) ┌──────────────┐ CLI calls ┌─────────────┐
|
|
204
|
+
│ Your AI │ ◄──────────────────► │ Multi-CLI │ ───────────────► │ Other AIs │
|
|
205
|
+
│ Client │ │ server │ │ (CLI tools) │
|
|
206
|
+
└─────────────┘ └──────────────┘ └─────────────┘
|
|
183
207
|
|
|
184
208
|
1. Your AI client connects to Multi-CLI via MCP
|
|
185
209
|
2. Multi-CLI detects which CLIs are installed on your system
|
|
@@ -188,6 +212,8 @@ Or get a second opinion on anything:
|
|
|
188
212
|
5. Results flow back through MCP to your AI client
|
|
189
213
|
```
|
|
190
214
|
|
|
215
|
+
---
|
|
216
|
+
|
|
191
217
|
## Troubleshooting
|
|
192
218
|
|
|
193
219
|
**"No usable AI CLIs detected"**
|
|
@@ -201,9 +227,11 @@ If only your own CLI is installed, Multi-CLI hides it (no self-calls). Install a
|
|
|
201
227
|
|
|
202
228
|
**MCP server not responding?**
|
|
203
229
|
1. Check that Node.js >= 20 is installed
|
|
204
|
-
2. Run `npx @osanoai/multicli` directly to see if it starts
|
|
230
|
+
2. Run `npx @osanoai/multicli@latest` directly to see if it starts
|
|
205
231
|
3. Restart your AI client completely
|
|
206
232
|
|
|
233
|
+
---
|
|
234
|
+
|
|
207
235
|
## Development
|
|
208
236
|
|
|
209
237
|
```bash
|
|
@@ -213,4 +241,3 @@ npm install
|
|
|
213
241
|
npm run build
|
|
214
242
|
npm run dev
|
|
215
243
|
```
|
|
216
|
-
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelCatalog.d.ts","sourceRoot":"","sources":["../src/modelCatalog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"modelCatalog.d.ts","sourceRoot":"","sources":["../src/modelCatalog.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACnC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAqJD,wBAAgB,UAAU,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAEzE;AAOD,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAgBxE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"generatedAt": "2026-03-03T23:54:04.100Z",
|
|
3
|
+
"catalogs": {
|
|
4
|
+
"claude": {
|
|
5
|
+
"cli": "claude",
|
|
6
|
+
"tiers": [
|
|
7
|
+
{
|
|
8
|
+
"tier": "fast",
|
|
9
|
+
"models": [
|
|
10
|
+
"claude-haiku-4-5-20251001"
|
|
11
|
+
]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"tier": "balanced",
|
|
15
|
+
"models": [
|
|
16
|
+
"claude-sonnet-4-6"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"tier": "powerful",
|
|
21
|
+
"models": [
|
|
22
|
+
"claude-opus-4-6"
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
"gemini": {
|
|
28
|
+
"cli": "gemini",
|
|
29
|
+
"tiers": [
|
|
30
|
+
{
|
|
31
|
+
"tier": "fast",
|
|
32
|
+
"models": [
|
|
33
|
+
"gemini-2.5-flash",
|
|
34
|
+
"gemini-2.5-flash-lite"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"tier": "balanced",
|
|
39
|
+
"models": [
|
|
40
|
+
"gemini-3-flash-preview"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"tier": "powerful",
|
|
45
|
+
"models": [
|
|
46
|
+
"gemini-3.1-pro-preview",
|
|
47
|
+
"gemini-2.5-pro"
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"codex": {
|
|
53
|
+
"cli": "codex",
|
|
54
|
+
"tiers": [
|
|
55
|
+
{
|
|
56
|
+
"tier": "fast",
|
|
57
|
+
"models": [
|
|
58
|
+
"gpt-5.1-codex-mini"
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"tier": "balanced",
|
|
63
|
+
"models": [
|
|
64
|
+
"gpt-5.2-codex"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"tier": "powerful",
|
|
69
|
+
"models": [
|
|
70
|
+
"gpt-5.3-codex",
|
|
71
|
+
"gpt-5.1-codex-max",
|
|
72
|
+
"gpt-5.2"
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
package/dist/modelCatalog.js
CHANGED
|
@@ -1,80 +1,120 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { TIER_CONFIG, CLI_NOTES } from './tierConfig.js';
|
|
3
|
+
let generatedData = null;
|
|
4
|
+
try {
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
generatedData = require('./modelCatalog.generated.json');
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
// Generated file doesn't exist yet — will use hardcoded fallback
|
|
10
|
+
}
|
|
11
|
+
// ── Hardcoded fallback catalogs ──────────────────────────────────────────────
|
|
12
|
+
const FALLBACK_CATALOGS = {
|
|
13
|
+
gemini: {
|
|
14
|
+
cli: 'gemini',
|
|
15
|
+
tiers: [
|
|
16
|
+
{
|
|
17
|
+
tier: 'fast',
|
|
18
|
+
label: 'Flash (DEFAULT)',
|
|
19
|
+
models: ['gemini-2.5-flash', 'gemini-2.5-flash-lite'],
|
|
20
|
+
useWhen: 'Simple questions, math, lookups, summaries, short code, trivial tasks. USE THIS BY DEFAULT.',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
tier: 'balanced',
|
|
24
|
+
label: 'Flash Preview',
|
|
25
|
+
models: ['gemini-3-flash-preview'],
|
|
26
|
+
useWhen: 'Moderate tasks needing newer capabilities but still fast. Multi-step but not deeply complex.',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
tier: 'powerful',
|
|
30
|
+
label: 'Pro',
|
|
31
|
+
models: ['gemini-3.1-pro-preview', 'gemini-2.5-pro'],
|
|
32
|
+
useWhen: 'ONLY for: complex analysis, deep reasoning, large codebase understanding, nuanced opinions, architectural decisions.',
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
note: 'Run Gemini Help for the latest CLI options. Model IDs may change as Google releases new versions.',
|
|
36
|
+
},
|
|
37
|
+
codex: {
|
|
38
|
+
cli: 'codex',
|
|
39
|
+
tiers: [
|
|
40
|
+
{
|
|
41
|
+
tier: 'fast',
|
|
42
|
+
label: 'Codex Mini (DEFAULT)',
|
|
43
|
+
models: ['gpt-5.1-codex-mini'],
|
|
44
|
+
useWhen: 'Simple questions, math, lookups, short code snippets, trivial tasks. USE THIS BY DEFAULT.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
tier: 'balanced',
|
|
48
|
+
label: 'Codex',
|
|
49
|
+
models: ['gpt-5.2-codex'],
|
|
50
|
+
useWhen: 'Moderate coding tasks, multi-file changes, debugging, code review.',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
tier: 'powerful',
|
|
54
|
+
label: 'Codex Max / GPT',
|
|
55
|
+
models: ['gpt-5.3-codex', 'gpt-5.1-codex-max', 'gpt-5.2'],
|
|
56
|
+
useWhen: 'ONLY for: complex architecture, large refactors, deep reasoning, nuanced analysis, multi-step planning.',
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
note: 'Run Codex Help for the latest CLI options. Model IDs may change as OpenAI releases new versions.',
|
|
60
|
+
},
|
|
61
|
+
claude: {
|
|
62
|
+
cli: 'claude',
|
|
63
|
+
tiers: [
|
|
64
|
+
{
|
|
65
|
+
tier: 'fast',
|
|
66
|
+
label: 'Haiku (DEFAULT)',
|
|
67
|
+
models: ['claude-haiku-4-5-20251001'],
|
|
68
|
+
useWhen: 'Simple questions, math, lookups, summaries, short code, trivial tasks. USE THIS BY DEFAULT.',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
tier: 'balanced',
|
|
72
|
+
label: 'Sonnet',
|
|
73
|
+
models: ['claude-sonnet-4-6'],
|
|
74
|
+
useWhen: 'Moderate coding, analysis, multi-step tasks, following detailed instructions.',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
tier: 'powerful',
|
|
78
|
+
label: 'Opus',
|
|
79
|
+
models: ['claude-opus-4-6'],
|
|
80
|
+
useWhen: 'ONLY for: complex reasoning, nuanced analysis, difficult multi-step tasks, architectural decisions.',
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
note: 'Run Claude Help for the latest CLI options.',
|
|
84
|
+
},
|
|
77
85
|
};
|
|
86
|
+
// ── Build catalog from generated data ────────────────────────────────────────
|
|
87
|
+
function buildFromGenerated(cliName) {
|
|
88
|
+
const entry = generatedData?.catalogs[cliName];
|
|
89
|
+
if (!entry?.tiers?.length)
|
|
90
|
+
return null;
|
|
91
|
+
const tiers = [];
|
|
92
|
+
for (const genTier of entry.tiers) {
|
|
93
|
+
const tierName = genTier.tier;
|
|
94
|
+
const config = TIER_CONFIG[cliName]?.[tierName];
|
|
95
|
+
if (!config || !Array.isArray(genTier.models) || !genTier.models.length)
|
|
96
|
+
continue;
|
|
97
|
+
tiers.push({
|
|
98
|
+
tier: tierName,
|
|
99
|
+
label: config.label,
|
|
100
|
+
models: genTier.models,
|
|
101
|
+
useWhen: config.useWhen,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (tiers.length === 0)
|
|
105
|
+
return null;
|
|
106
|
+
return {
|
|
107
|
+
cli: cliName,
|
|
108
|
+
tiers,
|
|
109
|
+
note: CLI_NOTES[cliName],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// ── Resolved catalogs ────────────────────────────────────────────────────────
|
|
113
|
+
const CATALOGS = {};
|
|
114
|
+
for (const cli of ['gemini', 'codex', 'claude']) {
|
|
115
|
+
CATALOGS[cli] = buildFromGenerated(cli) ?? FALLBACK_CATALOGS[cli];
|
|
116
|
+
}
|
|
117
|
+
// ── Public API (unchanged signatures) ────────────────────────────────────────
|
|
78
118
|
export function getCatalog(cli) {
|
|
79
119
|
return CATALOGS[cli];
|
|
80
120
|
}
|
package/dist/modelCatalog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelCatalog.js","sourceRoot":"","sources":["../src/modelCatalog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"modelCatalog.js","sourceRoot":"","sources":["../src/modelCatalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-curated tier display labels and usage guidance.
|
|
3
|
+
* These change rarely — only when we want to rename a tier or update guidance text.
|
|
4
|
+
* The model IDs within each tier are managed by the generated catalog.
|
|
5
|
+
*/
|
|
6
|
+
export interface TierDisplayConfig {
|
|
7
|
+
label: string;
|
|
8
|
+
useWhen: string;
|
|
9
|
+
}
|
|
10
|
+
export type TierName = 'fast' | 'balanced' | 'powerful';
|
|
11
|
+
export type CLIName = 'claude' | 'gemini' | 'codex';
|
|
12
|
+
export declare const TIER_CONFIG: Record<CLIName, Record<TierName, TierDisplayConfig>>;
|
|
13
|
+
export declare const CLI_NOTES: Record<CLIName, string>;
|
|
14
|
+
//# sourceMappingURL=tierConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tierConfig.d.ts","sourceRoot":"","sources":["../src/tierConfig.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AACxD,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEpD,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAkD5E,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAK7C,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-curated tier display labels and usage guidance.
|
|
3
|
+
* These change rarely — only when we want to rename a tier or update guidance text.
|
|
4
|
+
* The model IDs within each tier are managed by the generated catalog.
|
|
5
|
+
*/
|
|
6
|
+
export const TIER_CONFIG = {
|
|
7
|
+
claude: {
|
|
8
|
+
fast: {
|
|
9
|
+
label: 'Haiku (DEFAULT)',
|
|
10
|
+
useWhen: 'Simple questions, math, lookups, summaries, short code, trivial tasks. USE THIS BY DEFAULT.',
|
|
11
|
+
},
|
|
12
|
+
balanced: {
|
|
13
|
+
label: 'Sonnet',
|
|
14
|
+
useWhen: 'Moderate coding, analysis, multi-step tasks, following detailed instructions.',
|
|
15
|
+
},
|
|
16
|
+
powerful: {
|
|
17
|
+
label: 'Opus',
|
|
18
|
+
useWhen: 'ONLY for: complex reasoning, nuanced analysis, difficult multi-step tasks, architectural decisions.',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
gemini: {
|
|
22
|
+
fast: {
|
|
23
|
+
label: 'Flash (DEFAULT)',
|
|
24
|
+
useWhen: 'Simple questions, math, lookups, summaries, short code, trivial tasks. USE THIS BY DEFAULT.',
|
|
25
|
+
},
|
|
26
|
+
balanced: {
|
|
27
|
+
label: 'Flash Preview',
|
|
28
|
+
useWhen: 'Moderate tasks needing newer capabilities but still fast. Multi-step but not deeply complex.',
|
|
29
|
+
},
|
|
30
|
+
powerful: {
|
|
31
|
+
label: 'Pro',
|
|
32
|
+
useWhen: 'ONLY for: complex analysis, deep reasoning, large codebase understanding, nuanced opinions, architectural decisions.',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
codex: {
|
|
36
|
+
fast: {
|
|
37
|
+
label: 'Codex Mini (DEFAULT)',
|
|
38
|
+
useWhen: 'Simple questions, math, lookups, short code snippets, trivial tasks. USE THIS BY DEFAULT.',
|
|
39
|
+
},
|
|
40
|
+
balanced: {
|
|
41
|
+
label: 'Codex',
|
|
42
|
+
useWhen: 'Moderate coding tasks, multi-file changes, debugging, code review.',
|
|
43
|
+
},
|
|
44
|
+
powerful: {
|
|
45
|
+
label: 'Codex Max / GPT',
|
|
46
|
+
useWhen: 'ONLY for: complex architecture, large refactors, deep reasoning, nuanced analysis, multi-step planning.',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
export const CLI_NOTES = {
|
|
51
|
+
claude: 'Run Claude Help for the latest CLI options.',
|
|
52
|
+
gemini: 'Run Gemini Help for the latest CLI options. Model IDs may change as Google releases new versions.',
|
|
53
|
+
codex: 'Run Codex Help for the latest CLI options. Model IDs may change as OpenAI releases new versions.',
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=tierConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tierConfig.js","sourceRoot":"","sources":["../src/tierConfig.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,MAAM,CAAC,MAAM,WAAW,GAAyD;IAC/E,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,KAAK,EAAE,iBAAiB;YACxB,OAAO,EACL,6FAA6F;SAChG;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,+EAA+E;SACzF;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,MAAM;YACb,OAAO,EACL,qGAAqG;SACxG;KACF;IACD,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,KAAK,EAAE,iBAAiB;YACxB,OAAO,EACL,6FAA6F;SAChG;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,eAAe;YACtB,OAAO,EACL,8FAA8F;SACjG;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,KAAK;YACZ,OAAO,EACL,sHAAsH;SACzH;KACF;IACD,KAAK,EAAE;QACL,IAAI,EAAE;YACJ,KAAK,EAAE,sBAAsB;YAC7B,OAAO,EACL,2FAA2F;SAC9F;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,oEAAoE;SAC9E;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,iBAAiB;YACxB,OAAO,EACL,yGAAyG;SAC5G;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAA4B;IAChD,MAAM,EAAE,6CAA6C;IACrD,MAAM,EACJ,mGAAmG;IACrG,KAAK,EAAE,kGAAkG;CAC1G,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@osanoai/multicli",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.6",
|
|
4
4
|
"description": "MCP server for Multiple CLI coding agent integration (Claude + Gemini + Codex)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"multicli": "dist/index.js"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
|
-
"build": "tsc",
|
|
11
|
+
"build": "tsc && cp -f src/modelCatalog.generated.json dist/ 2>/dev/null || true",
|
|
12
12
|
"start": "node dist/index.js",
|
|
13
13
|
"dev": "tsc && node dist/index.js",
|
|
14
14
|
"test": "vitest run",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"test:coverage": "vitest run --coverage",
|
|
17
17
|
"lint": "tsc --noEmit",
|
|
18
18
|
"prepublishOnly": "echo '⚠️ Remember to test locally first!' && npm run build",
|
|
19
|
+
"refresh-catalog": "npx tsx scripts/refresh-catalog.ts",
|
|
19
20
|
"changeset": "changeset",
|
|
20
21
|
"version-packages": "changeset version",
|
|
21
22
|
"prepare": "husky || true"
|