claude-connect 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 +21 -0
- package/README.md +175 -0
- package/bin/claude-connect.js +40 -0
- package/package.json +43 -0
- package/src/data/catalog-store.js +482 -0
- package/src/gateway/constants.js +4 -0
- package/src/gateway/messages.js +362 -0
- package/src/gateway/server.js +481 -0
- package/src/gateway/state.js +104 -0
- package/src/index.js +61 -0
- package/src/lib/app-paths.js +269 -0
- package/src/lib/claude-settings.js +364 -0
- package/src/lib/oauth.js +485 -0
- package/src/lib/profile.js +104 -0
- package/src/lib/secrets.js +45 -0
- package/src/lib/terminal.js +350 -0
- package/src/lib/theme.js +44 -0
- package/src/wizard.js +887 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 wmcarlosv
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# Claude Connect
|
|
2
|
+
|
|
3
|
+
CLI en Node.js para conectar `Claude Code` con proveedores externos desde una interfaz de consola.
|
|
4
|
+
|
|
5
|
+
## Estado actual
|
|
6
|
+
|
|
7
|
+
La app ya soporta:
|
|
8
|
+
|
|
9
|
+
- `Kimi` por `API key`
|
|
10
|
+
- `DeepSeek` por `API key`
|
|
11
|
+
- `Qwen` por `OAuth` o `Token`
|
|
12
|
+
- catálogo local en SQLite sembrado automáticamente desde código
|
|
13
|
+
- creación, edición y eliminación de conexiones
|
|
14
|
+
- activación reversible sobre la instalación real de `Claude Code`
|
|
15
|
+
- detección automática de rutas en Linux y Windows
|
|
16
|
+
- gateway local Anthropic-compatible para `Qwen`
|
|
17
|
+
- limpieza y restauración reversible de credenciales de `claude.ai` para evitar `Auth conflict`
|
|
18
|
+
- navegación con `Volver` en pantallas y salida por doble `Esc`
|
|
19
|
+
|
|
20
|
+
## Uso
|
|
21
|
+
|
|
22
|
+
Arranque local:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm start
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Para exponer el comando globalmente:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm link
|
|
32
|
+
claude-connect
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Instalación desde npm:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm install -g claude-connect
|
|
39
|
+
claude-connect
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Ejecución sin instalación global:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npx claude-connect
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Requisito:
|
|
49
|
+
|
|
50
|
+
- Node.js 22 o superior
|
|
51
|
+
|
|
52
|
+
## Flujo principal
|
|
53
|
+
|
|
54
|
+
1. `Nueva conexion`
|
|
55
|
+
2. elegir proveedor
|
|
56
|
+
3. elegir modelo
|
|
57
|
+
4. elegir tipo de conexión: `OAuth` o `Token`
|
|
58
|
+
5. guardar perfil local
|
|
59
|
+
6. `Activar en Claude`
|
|
60
|
+
7. usar `claude`
|
|
61
|
+
|
|
62
|
+
Al activar:
|
|
63
|
+
|
|
64
|
+
- `Kimi` usa `https://api.kimi.com/coding/`
|
|
65
|
+
- `DeepSeek` usa `https://api.deepseek.com/anthropic`
|
|
66
|
+
- `Qwen` usa el gateway local `http://127.0.0.1:4310/anthropic`
|
|
67
|
+
|
|
68
|
+
## Dónde se guarda cada cosa
|
|
69
|
+
|
|
70
|
+
Claude Connect guarda estado local fuera del repo. Por defecto:
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
Linux: ~/.claude-connect
|
|
74
|
+
Windows: %APPDATA%\claude-connect
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Ahí viven:
|
|
78
|
+
|
|
79
|
+
- perfiles
|
|
80
|
+
- tokens OAuth
|
|
81
|
+
- API keys gestionadas por la app
|
|
82
|
+
- estado del switch de Claude
|
|
83
|
+
- estado y logs del gateway
|
|
84
|
+
|
|
85
|
+
El catálogo SQLite local se genera automáticamente en:
|
|
86
|
+
|
|
87
|
+
```text
|
|
88
|
+
storage/claude-connect.sqlite
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Importante:
|
|
92
|
+
|
|
93
|
+
- esa base ya no se versiona en git
|
|
94
|
+
- el catálogo se reconstruye desde `src/data/catalog-store.js`
|
|
95
|
+
- un `git pull` no debería volver a darte conflicto por la base SQLite
|
|
96
|
+
|
|
97
|
+
## Switch de Claude Code
|
|
98
|
+
|
|
99
|
+
La activación modifica la configuración real detectada de Claude Code y guarda un snapshot reversible.
|
|
100
|
+
|
|
101
|
+
Archivos implicados:
|
|
102
|
+
|
|
103
|
+
- `settings.json` de Claude
|
|
104
|
+
- `~/.claude.json`
|
|
105
|
+
- `.credentials.json` de Claude
|
|
106
|
+
|
|
107
|
+
Esto permite:
|
|
108
|
+
|
|
109
|
+
- activar `Kimi`, `DeepSeek` o `Qwen`
|
|
110
|
+
- evitar conflicto entre `claude.ai` y `ANTHROPIC_API_KEY`
|
|
111
|
+
- restaurar la sesión original con `Revertir Claude`
|
|
112
|
+
|
|
113
|
+
## Proveedores
|
|
114
|
+
|
|
115
|
+
### Kimi
|
|
116
|
+
|
|
117
|
+
- modelo: `kimi-for-coding`
|
|
118
|
+
- auth: `Token`
|
|
119
|
+
- base URL: `https://api.kimi.com/coding/`
|
|
120
|
+
- activación directa en Claude Code
|
|
121
|
+
|
|
122
|
+
### DeepSeek
|
|
123
|
+
|
|
124
|
+
- modelos: `deepseek-chat`, `deepseek-reasoner`
|
|
125
|
+
- auth: `Token`
|
|
126
|
+
- base URL de activación: `https://api.deepseek.com/anthropic`
|
|
127
|
+
- activación directa en Claude Code
|
|
128
|
+
|
|
129
|
+
### Qwen
|
|
130
|
+
|
|
131
|
+
- modelo: `qwen3-coder-plus`
|
|
132
|
+
- auth: `OAuth`, `Token`
|
|
133
|
+
- OAuth con device flow oficial de `Qwen Code`
|
|
134
|
+
- gateway local requerido para integrarlo con Claude Code
|
|
135
|
+
|
|
136
|
+
URL de autorización típica:
|
|
137
|
+
|
|
138
|
+
```text
|
|
139
|
+
https://chat.qwen.ai/auth?user_code=XXXXX&client=qwen-code
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Navegación
|
|
143
|
+
|
|
144
|
+
- `Tab` vuelve a la pantalla anterior cuando aplica
|
|
145
|
+
- `Volver` aparece como opción visible en listas
|
|
146
|
+
- `Esc` una vez avisa
|
|
147
|
+
- `Esc` dos veces sale
|
|
148
|
+
|
|
149
|
+
## Desarrollo
|
|
150
|
+
|
|
151
|
+
Pruebas:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
npm test
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Entrada principal:
|
|
158
|
+
|
|
159
|
+
- `src/wizard.js`
|
|
160
|
+
|
|
161
|
+
Catálogo:
|
|
162
|
+
|
|
163
|
+
- `src/data/catalog-store.js`
|
|
164
|
+
|
|
165
|
+
Switch de Claude:
|
|
166
|
+
|
|
167
|
+
- `src/lib/claude-settings.js`
|
|
168
|
+
|
|
169
|
+
OAuth Qwen:
|
|
170
|
+
|
|
171
|
+
- `src/lib/oauth.js`
|
|
172
|
+
|
|
173
|
+
Gateway local:
|
|
174
|
+
|
|
175
|
+
- `src/gateway/server.js`
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import process from 'node:process';
|
|
6
|
+
import { run } from '../src/index.js';
|
|
7
|
+
|
|
8
|
+
const alreadyRestarted = process.env.CLAUDE_CONNECT_NO_WARNINGS === '1';
|
|
9
|
+
|
|
10
|
+
if (!alreadyRestarted && !process.execArgv.includes('--no-warnings=ExperimentalWarning')) {
|
|
11
|
+
const scriptPath = fileURLToPath(import.meta.url);
|
|
12
|
+
const child = spawn(process.execPath, ['--no-warnings=ExperimentalWarning', scriptPath, ...process.argv.slice(2)], {
|
|
13
|
+
env: {
|
|
14
|
+
...process.env,
|
|
15
|
+
CLAUDE_CONNECT_NO_WARNINGS: '1'
|
|
16
|
+
},
|
|
17
|
+
stdio: 'inherit'
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
child.on('exit', (code, signal) => {
|
|
21
|
+
if (signal) {
|
|
22
|
+
process.kill(process.pid, signal);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
process.exit(code ?? 0);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
child.on('error', (error) => {
|
|
30
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
31
|
+
console.error(`\nclaude-connect: ${message}`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
});
|
|
34
|
+
} else {
|
|
35
|
+
run().catch((error) => {
|
|
36
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
37
|
+
console.error(`\nclaude-connect: ${message}`);
|
|
38
|
+
process.exitCode = 1;
|
|
39
|
+
});
|
|
40
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "claude-connect",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI para configurar Claude Code con proveedores de modelos externos",
|
|
5
|
+
"author": "wmcarlosv",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"homepage": "https://github.com/wmcarlosv/claude-connect#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/wmcarlosv/claude-connect.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/wmcarlosv/claude-connect/issues"
|
|
14
|
+
},
|
|
15
|
+
"bin": {
|
|
16
|
+
"claude-connect": "./bin/claude-connect.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"bin/claude-connect.js",
|
|
20
|
+
"src/",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"start": "node --no-warnings=ExperimentalWarning ./bin/claude-connect.js",
|
|
26
|
+
"test": "node --no-warnings=ExperimentalWarning --test",
|
|
27
|
+
"prepublishOnly": "npm test"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=22.0.0"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"cli",
|
|
34
|
+
"claude",
|
|
35
|
+
"claude-code",
|
|
36
|
+
"anthropic",
|
|
37
|
+
"deepseek",
|
|
38
|
+
"kimi",
|
|
39
|
+
"qwen",
|
|
40
|
+
"terminal"
|
|
41
|
+
],
|
|
42
|
+
"license": "MIT"
|
|
43
|
+
}
|