agent-workbench 0.1.0 → 0.2.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/README.md +413 -219
- package/dist/server.js +17719 -3689
- package/dist/web/assets/{highlight-B0RyEt-U.js → highlight-D9nIZ0qi.js} +2 -2
- package/dist/web/assets/index-Bgx4KtjD.css +32 -0
- package/dist/web/assets/index-DIDbH8tn.js +130 -0
- package/dist/web/index.html +2 -2
- package/package.json +6 -2
- package/dist/web/assets/index-HOJufhVy.css +0 -32
- package/dist/web/assets/index-pspQSiEP.js +0 -286
package/README.md
CHANGED
|
@@ -1,219 +1,413 @@
|
|
|
1
|
-
# Agent Workbench
|
|
2
|
-
|
|
3
|
-
Una interfaz visual local para
|
|
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
|
-
Para
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
**
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
1
|
+
# Agent Workbench
|
|
2
|
+
|
|
3
|
+
Una interfaz visual local para las CLIs de agentes de código. Funciona con la
|
|
4
|
+
CLI de Claude Code, con la de Codex, con la de OpenCode y con Antigravity CLI.
|
|
5
|
+
|
|
6
|
+
No habla con ninguna API. Lanza la CLI que ya tenés instalada y logueada
|
|
7
|
+
—`claude`, `codex`, `opencode` o `agy`— dentro de una pseudo-terminal, y le
|
|
8
|
+
agrega alrededor lo que una terminal sola no da: pestañas, historial navegable,
|
|
9
|
+
la conversación como tarjetas, un medidor de contexto, el estado de git y un
|
|
10
|
+
árbol de archivos.
|
|
11
|
+
|
|
12
|
+
La terminal sigue siendo la terminal. Todo lo que escribís le llega a la CLI sin
|
|
13
|
+
que la aplicación lo toque.
|
|
14
|
+
|
|
15
|
+

|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Qué hace
|
|
20
|
+
|
|
21
|
+
| | |
|
|
22
|
+
|---|---|
|
|
23
|
+
| **Pestañas** | Varias sesiones vivas a la vez, de cualquiera de las CLIs, cada una en su directorio. Sobreviven a un `F5`: los procesos viven en el servidor, no en la pestaña del navegador. El punto de cada una dice si el agente está trabajando, parado o esperando una respuesta, en las CLIs que publican su estado ([abajo](#varias-clis)). |
|
|
24
|
+
| **Arranque sin gastar nada** | Al abrir la app las pestañas vuelven **dormidas**: se leen enteras y no lanzan ninguna CLI. La abrís con un botón cuando quieras escribirle al agente. |
|
|
25
|
+
| **Historial** | Tus proyectos y conversaciones anteriores en la barra lateral, con filtro, y las de las cuatro CLIs juntas bajo cada proyecto, cada una con su insignia. Abrir una la retoma con su CLI, en la misma sesión. **Archivar historial…** esconde de una vez las sesiones de una CLI anteriores a hoy, y cada proyecto se archiva entero con un botón: sin borrar nada, y las dos cosas se deshacen. |
|
|
26
|
+
| **Conversación** | Los mensajes de la sesión activa, en vivo, con las herramientas plegadas y su resultado adentro. Búsqueda, salto entre resultados, copiado por mensaje y, según la CLI, las preguntas del agente se contestan desde el chat. |
|
|
27
|
+
| **Continuar con…** | Con más de una CLI instalada, una conversación se sigue con otra CLI en la misma carpeta. El agente nuevo arranca de un recorte de los últimos turnos, no del contexto que tenía el anterior. |
|
|
28
|
+
| **Buscar en todo** | Con más de una CLI y algo guardado en la copia propia, el filtro de la barra busca también en el texto de todas las conversaciones guardadas, no sólo en sus títulos. |
|
|
29
|
+
| **Medidor de contexto** | Tokens de la última petición contra la ventana del modelo. Tokens, nunca dinero. |
|
|
30
|
+
| **Cambios** | Rama, adelanto y atraso contra la rama de seguimiento, worktrees, y los archivos tocados con su diff. **Solo lectura.** |
|
|
31
|
+
| **Archivos** | El árbol del directorio de la pestaña, con buscador por nombre y previsualización con resaltado de sintaxis. Menú contextual para copiar rutas, insertarlas como `@ruta` o abrir el archivo con la app del sistema. |
|
|
32
|
+
| **Planes** | Los documentos que escribió esa conversación, renderizados: los planes del modo plan y también los `.md` que el agente creó dentro del proyecto o en la carpeta temporal de la sesión. Sólo los que la conversación que estás mirando nombró. |
|
|
33
|
+
| **Memoria compartida** | Lo que los agentes aprenden de un proyecto, en `.agents/memory/`, y lo leen y escriben las cuatro CLIs ([abajo](#memoria-compartida)). |
|
|
34
|
+
| **Copia propia** | Opcional. El historial de las cuatro CLIs en una carpeta tuya y en un formato de la aplicación, para no perderlo si una CLI cambia de formato, lo borra o la desinstalás ([abajo](#copia-propia-opcional)). |
|
|
35
|
+
| **Tema** | Claro, oscuro, o el del sistema. |
|
|
36
|
+
|
|
37
|
+
<p>
|
|
38
|
+
<img src="https://raw.githubusercontent.com/cvelasquez/agent-workbench/main/docs/captura-cambios.png" width="49%" alt="El panel de cambios: rama y archivos tocados, por grupo">
|
|
39
|
+
<img src="https://raw.githubusercontent.com/cvelasquez/agent-workbench/main/docs/captura-diff.png" width="49%" alt="El diff de uno de esos archivos, en el mismo panel">
|
|
40
|
+
</p>
|
|
41
|
+
|
|
42
|
+
### Varias CLIs
|
|
43
|
+
|
|
44
|
+
Con más de una CLI instalada, cada sesión de la barra y cada pestaña lleva la
|
|
45
|
+
insignia de su CLI, y el `+` de nueva pestaña abre con la que usaste en ese
|
|
46
|
+
proyecto; su flecha te deja elegir otra. Con una sola, no ves nada de esto.
|
|
47
|
+
|
|
48
|
+
<img src="https://raw.githubusercontent.com/cvelasquez/agent-workbench/main/docs/captura-clis.png" width="45%" alt="La barra de proyectos con sesiones de varias CLIs, cada una con su insignia, y el menú del + con las cuatro CLIs y sus versiones">
|
|
49
|
+
|
|
50
|
+
**No todas las CLIs dan lo mismo.** Claude Code deja en sus archivos todo lo que
|
|
51
|
+
la aplicación necesita. Codex deja el historial y los tokens del medidor, pero no
|
|
52
|
+
su estado, ni los permisos pendientes, ni sus preguntas, ni el modelo: su punto
|
|
53
|
+
dice que no se sabe, no hay aviso de "esperando" y las preguntas se contestan en
|
|
54
|
+
su terminal. Con OpenCode, la aplicación arranca un servidor local de OpenCode
|
|
55
|
+
cuando abrís una pestaña, y de ahí salen su estado, el aviso de que espera un
|
|
56
|
+
permiso y las preguntas que se contestan desde el chat. Antigravity CLI publica
|
|
57
|
+
su estado y sus tokens sólo si configurás su status line
|
|
58
|
+
([abajo](#antigravity-cli-estado-y-medidor-opcional)).
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Requisitos
|
|
63
|
+
|
|
64
|
+
| | |
|
|
65
|
+
|---|---|
|
|
66
|
+
| **Node.js** | 20 o superior. **Para ver el historial de OpenCode y los títulos de Antigravity CLI, 22.13 o posterior**: se leen con el SQLite que trae Node desde esa versión. Con uno anterior todo lo demás funciona igual; el arranque avisa lo de OpenCode, y Antigravity CLI lista sus conversaciones sin los títulos ni las carpetas de su índice |
|
|
67
|
+
| **git** | para el panel de cambios; el resto funciona sin él |
|
|
68
|
+
| **Al menos una CLI** | instalada y con sesión iniciada (tabla de abajo) |
|
|
69
|
+
|
|
70
|
+
| CLI | Comando | Instalación |
|
|
71
|
+
|---|---|---|
|
|
72
|
+
| Claude Code | `claude` | [guía de instalación](https://docs.claude.com/en/docs/claude-code/setup) |
|
|
73
|
+
| Codex | `codex` | [guía](https://learn.chatgpt.com/docs/codex/cli) |
|
|
74
|
+
| OpenCode | `opencode` | [documentación](https://opencode.ai/docs/) |
|
|
75
|
+
| Antigravity CLI | `agy` | [guía](https://antigravity.google/docs/cli/getting-started). Para su estado y su medidor, además, `node` en el `PATH` de la CLI |
|
|
76
|
+
|
|
77
|
+
Agent Workbench **no** incluye ninguna CLI ni la descarga: usa las que ya tenés
|
|
78
|
+
en el `PATH`. Si no encuentra ninguna, te lo dice y no abre sesiones.
|
|
79
|
+
|
|
80
|
+
Probado sobre Windows 11 con PowerShell, que es la plataforma principal.
|
|
81
|
+
macOS y Linux funcionan igual. En Linux, la dependencia `node-pty` no trae
|
|
82
|
+
binario precompilado y se compila al instalar: hacen falta `python3`, `make` y
|
|
83
|
+
un compilador de C++ (`build-essential` en Debian y Ubuntu).
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Instalar
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
npm install -g agent-workbench
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Después, parado en el proyecto en el que quieras trabajar:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
agent-workbench
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Para probarlo una vez sin instalarlo, `npx agent-workbench` — baja unos 60 MB
|
|
100
|
+
cada vez que la caché de npm está fría, casi todo del binario de la terminal.
|
|
101
|
+
Para uso diario conviene la instalación global.
|
|
102
|
+
|
|
103
|
+
El servidor imprime una URL con un token y la abre en el navegador:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
URL http://127.0.0.1:52341/?token=…
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Esa URL es la única forma de entrar. El token es distinto en cada arranque, y el
|
|
110
|
+
servidor escucha solo en `127.0.0.1`.
|
|
111
|
+
|
|
112
|
+
### Memoria compartida
|
|
113
|
+
|
|
114
|
+
Cada CLI guarda lo que aprende de un proyecto en su propia carpeta, y las demás
|
|
115
|
+
no lo ven. La solapa **Memoria** instala un puente para que las cuatro usen la
|
|
116
|
+
misma: notas en `.agents/memory/` del proyecto, que cada CLI lee y escribe
|
|
117
|
+
—desde acá o desde su propia terminal— a través de `AGENTS.md` y `CLAUDE.md`.
|
|
118
|
+
|
|
119
|
+
**Ver cambios** muestra archivo por archivo qué se va a escribir, y nada se toca
|
|
120
|
+
hasta que confirmás. Al instalar importa la memoria que ya tenía Claude Code de
|
|
121
|
+
ese proyecto. La memoria global de cada CLI no la escribe la aplicación: te da
|
|
122
|
+
el fragmento para que lo pegues vos.
|
|
123
|
+
|
|
124
|
+
<img src="https://raw.githubusercontent.com/cvelasquez/agent-workbench/main/docs/captura-memoria.png" width="70%" alt="La solapa Memoria con el puente instalado para las cuatro CLIs y las notas importadas">
|
|
125
|
+
|
|
126
|
+
### Antigravity CLI: estado y medidor (opcional)
|
|
127
|
+
|
|
128
|
+
Antigravity CLI no deja en ningún archivo si está trabajando, esperando que
|
|
129
|
+
autorices una herramienta o libre, ni cuántos tokens lleva: eso lo publica sólo
|
|
130
|
+
por su *status line*. Sin configurarla, sus pestañas funcionan igual —historial,
|
|
131
|
+
conversación, modo, modelo— pero el punto de la pestaña dice que no se sabe y el
|
|
132
|
+
medidor queda sin medir. Para activarlo:
|
|
133
|
+
|
|
134
|
+
1. Abrí una pestaña de Antigravity y tocá **Configurar**, al lado del medidor.
|
|
135
|
+
2. Copiá la línea que muestra el diálogo y fusionala con lo que ya tenga
|
|
136
|
+
`~/.gemini/antigravity-cli/settings.json`. La aplicación no toca ese archivo:
|
|
137
|
+
lo editás vos.
|
|
138
|
+
3. El diálogo pasa a **Configurada** solo en un par de segundos, o con
|
|
139
|
+
**Comprobar**.
|
|
140
|
+
|
|
141
|
+
La línea corre un script que la aplicación deja en su propia carpeta. Guarda sólo
|
|
142
|
+
el estado, el modo, el modelo y los tokens de cada conversación, en esa misma
|
|
143
|
+
carpeta; no guarda tu email, tu cuota, tu plan ni el costo, que la CLI también le
|
|
144
|
+
pasa, y no imprime nada, así que la línea propia de la CLI queda como está. Una
|
|
145
|
+
vez puesta, la corre **toda** sesión de `agy`, también las que abras fuera de la
|
|
146
|
+
aplicación, y necesita `node` en el `PATH`. En Windows la línea entra a la
|
|
147
|
+
carpeta del script en vez de nombrarlo entre comillas: la CLI la ejecuta con
|
|
148
|
+
`cmd /c`, y ninguna comilla le llega viva a `node`.
|
|
149
|
+
|
|
150
|
+
### Copia propia (opcional)
|
|
151
|
+
|
|
152
|
+
El historial de cada conversación es de su CLI, en su formato, y una CLI puede
|
|
153
|
+
cambiarlo, podarlo o dejar de existir. La copia propia guarda lo mismo que ese
|
|
154
|
+
historial —mensajes, entradas y resultados de herramientas, imágenes y la memoria
|
|
155
|
+
de cada proyecto— en una carpeta tuya, en archivos que se leen sin la
|
|
156
|
+
aplicación. **Arranca apagada.** El botón de la copia, en la cabecera de la barra
|
|
157
|
+
de proyectos, abre un diálogo: primero **Medir** te dice cuánto ocuparía por CLI,
|
|
158
|
+
sin escribir nada, y después **Activar** la enciende. Encendida, copia todo lo
|
|
159
|
+
que la barra lista y no está archivado, y cada sesión que cambia la vuelve a
|
|
160
|
+
copiar un minuto después de que quede quieta. Las archivadas no se copian, y
|
|
161
|
+
archivar no borra lo ya copiado: la aplicación nunca borra nada de esa carpeta.
|
|
162
|
+
|
|
163
|
+
Lo que la CLI ya no tiene sigue en la barra, marcado como copia, y se abre en
|
|
164
|
+
Markdown; cada proyecto se exporta a Markdown. Y con la copia encendida y más de
|
|
165
|
+
una CLI, el filtro de la barra ofrece **En conversaciones**: busca en el texto de
|
|
166
|
+
todo lo copiado, de todas las CLIs.
|
|
167
|
+
|
|
168
|
+
<img src="https://raw.githubusercontent.com/cvelasquez/agent-workbench/main/docs/captura-buscador.png" width="40%" alt="El buscador en conversaciones: un acierto en una sesión de cada CLI, con su fragmento">
|
|
169
|
+
|
|
170
|
+
Por defecto va dentro de la carpeta de configuración de la aplicación
|
|
171
|
+
(`%APPDATA%\agent-workbench\vault` en Windows). **Cambiar carpeta…** la copia
|
|
172
|
+
entera a otra —una sincronizada, otra unidad— sin pisar nada, y la anterior queda
|
|
173
|
+
como estaba. Si la ponés en una carpeta sincronizada o en un repositorio, lo que
|
|
174
|
+
guarda viaja con ella.
|
|
175
|
+
|
|
176
|
+
Dos importadores de un solo uso traen historial de herramientas que la
|
|
177
|
+
aplicación no lee. Se corren desde el código ([abajo](#desde-el-código)) y **no
|
|
178
|
+
escriben nada sin `--write`**: sin él, dicen qué importarían.
|
|
179
|
+
|
|
180
|
+
- `pnpm vault:import gemini-cli [--cwd <carpeta>]` — los chats que quedaron de
|
|
181
|
+
Gemini CLI; `--cwd` nombra la carpeta donde lo usabas, para ubicarlos en su
|
|
182
|
+
proyecto.
|
|
183
|
+
- `pnpm vault:import antigravity-ide --workspace <carpeta>` — lo legible de las
|
|
184
|
+
conversaciones del IDE de Antigravity en esa carpeta: la ficha de cada una y
|
|
185
|
+
sus documentos `.md`. El contenido de la conversación está cifrado y queda
|
|
186
|
+
marcada como historial parcial.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Desde el código
|
|
191
|
+
|
|
192
|
+
Para trabajar en la aplicación, o si preferís no instalar nada global:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
corepack enable pnpm
|
|
196
|
+
pnpm install
|
|
197
|
+
pnpm dev # Vite con recarga en caliente
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
pnpm build # compila la interfaz una vez
|
|
202
|
+
pnpm start # la sirve ya compilada, sin Vite
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Arranque de un clic en Windows
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
pnpm package
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Compila la interfaz y deja un **`Agent Workbench.cmd`** en la raíz. Doble clic y
|
|
212
|
+
listo: instala lo que falte, compila si hace falta y abre el navegador. Es un
|
|
213
|
+
archivo de texto de veinte líneas; se puede leer entero antes de ejecutarlo.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Atajos
|
|
218
|
+
|
|
219
|
+
`Alt+T` nueva pestaña · `Alt+W` cerrar · `Alt+←/→` (o `Alt+RePág/AvPág`)
|
|
220
|
+
cambiar de pestaña · `Alt+P` mostrar u ocultar el panel derecho · `Shift+Tab`,
|
|
221
|
+
fuera de la terminal, volver a la pestaña anterior.
|
|
222
|
+
|
|
223
|
+
El botón `?` de la barra superior los lista todos, junto con los de la CLI de la
|
|
224
|
+
pestaña.
|
|
225
|
+
|
|
226
|
+
**Por qué `Alt` y no `Ctrl`:** el navegador se queda con `Ctrl+T`, `Ctrl+W` y
|
|
227
|
+
`Ctrl+Tab` para sus propias pestañas y el evento nunca llega a la página. No es
|
|
228
|
+
algo que se arregle con `preventDefault`: no hay evento que prevenir.
|
|
229
|
+
|
|
230
|
+
La aplicación captura exactamente esas combinaciones y ninguna más. `Shift+Tab`
|
|
231
|
+
sólo cuando el foco no está en la terminal, porque adentro es la tecla con la que
|
|
232
|
+
la CLI cambia de modo. Todo lo demás —`Esc`, `Esc Esc`, `Ctrl+C`, `Ctrl+R`,
|
|
233
|
+
`Ctrl+O`, las flechas y sobre todo `Alt+V`, que es el pegado de imágenes— le
|
|
234
|
+
llega intacto a la CLI.
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Qué hace la aplicación con tus datos
|
|
239
|
+
|
|
240
|
+
Nada sale de tu máquina. Sin telemetría, sin analítica, sin ninguna llamada de
|
|
241
|
+
red saliente. La excepción es la propia CLI trabajando: la que abrís en una
|
|
242
|
+
pestaña, y el servidor de OpenCode de abajo, hablan con el proveedor del modelo
|
|
243
|
+
como lo harían abiertas a mano.
|
|
244
|
+
|
|
245
|
+
**Nunca toca tus credenciales.** No hay login en la interfaz: si no iniciaste
|
|
246
|
+
sesión, lo hacés dentro de la terminal de la CLI y la aplicación ni se entera.
|
|
247
|
+
|
|
248
|
+
**De cada CLI lee sólo esto, y en su carpeta no escribe nada.** Los
|
|
249
|
+
importadores de la copia propia, cuando los corrés vos, leen además lo que dice
|
|
250
|
+
[su sección](#copia-propia-opcional).
|
|
251
|
+
|
|
252
|
+
| CLI | Lee | No abre nunca |
|
|
253
|
+
|---|---|---|
|
|
254
|
+
| Claude Code | de `~/.claude/`: `projects/` (el historial, y la memoria de cada proyecto para importarla), `sessions/` (si la CLI está esperando una respuesta) y `plans/`. Y para la solapa Planes, los `.md` que la conversación escribió dentro del proyecto o en la carpeta temporal de esa sesión: **sólo los que la conversación que estás mirando nombró**, sin recorrer ninguna carpeta | `.credentials.json` ni ningún token |
|
|
255
|
+
| Codex | de `~/.codex/` (o `CODEX_HOME`): `sessions/` y `archived_sessions/` | `auth.json`, `config.toml` ni sus bases `*.sqlite` |
|
|
256
|
+
| OpenCode | su base `opencode.db`, abierta en sólo lectura, y de ella sólo las tablas de sesiones, mensajes y partes; y su catálogo de modelos, para el tamaño de la ventana | `auth.json`, `opencode.json`, ni las tablas de cuentas, credenciales, permisos y sesiones compartidas |
|
|
257
|
+
| Antigravity CLI | de `~/.gemini/antigravity-cli/`: los transcripts de cada conversación, `history.jsonl`, la última conversación de cada carpeta, de `settings.json` sólo el modelo y la status line, y su índice de conversaciones, de una **copia** temporal; de `~/.gemini/config/projects/`, la carpeta de cada proyecto | la configuración de MCP, su entrada en el llavero del sistema, el contenido de `conversations/`, ni `~/.gemini/antigravity/`, que es su IDE |
|
|
258
|
+
|
|
259
|
+
Tres huellas que conviene saber:
|
|
260
|
+
|
|
261
|
+
- **Leer la base de OpenCode** hace lo que SQLite hace con cualquier lector: crea
|
|
262
|
+
sus archivos `-wal` y `-shm` si faltan y le cambia la fecha a `-shm`. Para
|
|
263
|
+
leerla nunca corre un comando de OpenCode.
|
|
264
|
+
- **Si el log propio de una pestaña de Antigravity no aparece**, lee los
|
|
265
|
+
`log/cli-*.log` de la CLI, que traen tus mensajes y el email de la cuenta, sólo
|
|
266
|
+
para encontrar el id de la conversación y sin guardar ninguna línea.
|
|
267
|
+
- **Con OpenCode, la aplicación corre su servidor local**, `opencode serve`: uno
|
|
268
|
+
solo, desde que abrís la primera pestaña de OpenCode hasta cinco minutos
|
|
269
|
+
después de cerrar la última, o hasta que cerrás la aplicación. Escucha en
|
|
270
|
+
`127.0.0.1`, con un puerto efímero y una contraseña distinta en cada arranque,
|
|
271
|
+
aunque tu configuración de OpenCode diga otra cosa. La aplicación le pide sólo
|
|
272
|
+
el estado de las sesiones, los permisos y preguntas pendientes, crear una
|
|
273
|
+
sesión, contestar una pregunta y cortar una sesión: nada de tu configuración ni
|
|
274
|
+
de tus cuentas.
|
|
275
|
+
|
|
276
|
+
**No agrega variables de autenticación** al entorno de las CLIs que lanza. El
|
|
277
|
+
entorno se hereda tal cual, con dos excepciones: **quita**
|
|
278
|
+
`CLAUDE_CODE_CHILD_SESSION` —que apaga el guardado del historial— y te avisa con
|
|
279
|
+
un cartel cuando lo hace; y al servidor de OpenCode le **agrega** una sola
|
|
280
|
+
variable, `OPENCODE_SERVER_PASSWORD`, con esa contraseña de cada arranque. No es
|
|
281
|
+
la de ninguna cuenta, y la variable no llega a ninguna pestaña: cada pestaña de
|
|
282
|
+
OpenCode recibe la contraseña en su línea de comando (`attach --password`), donde
|
|
283
|
+
la ven los demás procesos de tu usuario. Sólo sirve para ese servidor y deja de
|
|
284
|
+
valer al cerrar la aplicación.
|
|
285
|
+
|
|
286
|
+
**Lo que escribe la aplicación:**
|
|
287
|
+
|
|
288
|
+
- **En su propio directorio de configuración:** las pestañas abiertas, la caché
|
|
289
|
+
del índice, las notas, las sesiones archivadas, el script de la status line de
|
|
290
|
+
Antigravity y, si la encendés, la copia propia (o en la carpeta que elijas).
|
|
291
|
+
- **En la carpeta temporal:** las imágenes que pegás; el log de cada pestaña de
|
|
292
|
+
Antigravity, que trae tus mensajes, con permisos sólo tuyos y borrado en el
|
|
293
|
+
primer arranque pasadas 24 horas; y el transcript de una conversación que
|
|
294
|
+
continuás en otra CLI, que se borra al cerrar esa pestaña o a las 24 horas.
|
|
295
|
+
- **En tus proyectos, una sola cosa y sólo si confirmás:** la memoria
|
|
296
|
+
compartida. Se limita a `.agents/memory/`, a lo que está entre sus marcas en
|
|
297
|
+
`AGENTS.md` y `CLAUDE.md`, y a unas líneas al final de `.gitignore`.
|
|
298
|
+
|
|
299
|
+
**El servidor escucha solo en `127.0.0.1`**, en un puerto efímero, con un token
|
|
300
|
+
aleatorio por arranque que exigen el WebSocket y todas las rutas HTTP, y rechaza
|
|
301
|
+
peticiones cuyo `Origin` no sea el propio.
|
|
302
|
+
|
|
303
|
+
**El panel de git es de solo lectura.** No hay commit, stage ni push. Con un
|
|
304
|
+
agente editando archivos, un botón que escribe historia es exactamente lo que
|
|
305
|
+
después nadie sabe quién disparó.
|
|
306
|
+
|
|
307
|
+

|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## Si algo falla
|
|
312
|
+
|
|
313
|
+
**"No se encontró el comando `claude` en el PATH"**, seguido de "También
|
|
314
|
+
funciona con: …" — la aplicación no encontró ninguna de las cuatro CLIs en el
|
|
315
|
+
`PATH` del proceso que la corre. Comprobalo con `where claude` (o `which claude`),
|
|
316
|
+
y lo mismo con `codex`, `opencode` o `agy`. Las CLIs se buscan al arrancar: si
|
|
317
|
+
instalaste una con la aplicación abierta, volvé a arrancarla.
|
|
318
|
+
|
|
319
|
+
**No aparece el historial de OpenCode.** Mirá la línea `Historial` del arranque.
|
|
320
|
+
Si dice que esa versión de Node no trae `node:sqlite`, actualizá Node a la 22.13
|
|
321
|
+
o posterior. Si no hay línea, no encontró la base: está en
|
|
322
|
+
`~/.local/share/opencode/opencode.db`, o donde diga `OPENCODE_DB` o
|
|
323
|
+
`XDG_DATA_HOME`.
|
|
324
|
+
|
|
325
|
+
**Una pestaña de OpenCode no abre y dice "No se pudo arrancar el servidor de
|
|
326
|
+
OpenCode".** La pestaña se engancha a un `opencode serve` que la aplicación
|
|
327
|
+
lanza, y el motivo va después de los dos puntos. Si no queda claro, abrí
|
|
328
|
+
`opencode` en una terminal común: si tampoco arranca, el problema es de esa
|
|
329
|
+
instalación de OpenCode.
|
|
330
|
+
|
|
331
|
+
**Una pestaña de OpenCode dice que el servidor se cerró.** El `opencode serve`
|
|
332
|
+
terminó y la terminal de la pestaña quedó sin conexión. **Relanzar**, en la misma
|
|
333
|
+
barra, abre otro servidor y vuelve a enganchar la pestaña a la misma sesión.
|
|
334
|
+
|
|
335
|
+
**Una pestaña de Antigravity no muestra su estado ni el medidor.** Mirá la línea
|
|
336
|
+
`Status line` del arranque, debajo de la CLI: si dice que no está configurada, o
|
|
337
|
+
que hay otra, seguí los pasos de
|
|
338
|
+
[arriba](#antigravity-cli-estado-y-medidor-opcional). Si la configuraste y la
|
|
339
|
+
terminal de la CLI muestra `Statusline Error`, lo más probable es que `node` no
|
|
340
|
+
esté en el `PATH` de esa sesión. Mientras la línea no publique nada, la pestaña
|
|
341
|
+
se trata como si no la hubieras configurado.
|
|
342
|
+
|
|
343
|
+
**`node-pty` no compila al instalar.** Es un módulo nativo. Normalmente baja un
|
|
344
|
+
binario precompilado y no hace falta nada; si tu combinación de Node y
|
|
345
|
+
plataforma no tiene uno, hay que compilarlo:
|
|
346
|
+
|
|
347
|
+
- **Windows:** Visual Studio Build Tools con la carga de trabajo *Desarrollo
|
|
348
|
+
para el escritorio con C++*, y Python 3.
|
|
349
|
+
`npm install --global windows-build-tools` ya no se mantiene: instalá los
|
|
350
|
+
Build Tools desde el instalador de Visual Studio.
|
|
351
|
+
- **macOS:** `xcode-select --install`.
|
|
352
|
+
- **Linux:** `build-essential` y `python3`.
|
|
353
|
+
|
|
354
|
+
**La terminal se queda en blanco.** El renderer por defecto es canvas a
|
|
355
|
+
propósito: con el addon WebGL la pestaña se congela en Windows 11 + Chrome
|
|
356
|
+
aunque los datos lleguen. Si querés probarlo igual, agregá `?renderer=webgl` a
|
|
357
|
+
la URL.
|
|
358
|
+
|
|
359
|
+
**Un cartel dice que se quitó `CLAUDE_CODE_CHILD_SESSION`.** Pasa cuando
|
|
360
|
+
arrancás la aplicación desde adentro de una sesión de la CLI de Claude Code. Esa
|
|
361
|
+
variable apaga el guardado del historial, y sin historial no hay conversación ni
|
|
362
|
+
medidor. La aplicación la quita y te avisa. En uso normal —una terminal común—
|
|
363
|
+
ni aparece.
|
|
364
|
+
|
|
365
|
+
**El panel de cambios dice que la carpeta no es un repositorio git** y sí lo es.
|
|
366
|
+
Fijate que `git` esté en el `PATH`. Si el mensaje es otro, es el error que
|
|
367
|
+
devolvió git, tal cual.
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## Cómo está hecho
|
|
372
|
+
|
|
373
|
+
Monorepo con pnpm, TypeScript en todo.
|
|
374
|
+
|
|
375
|
+
```
|
|
376
|
+
packages/
|
|
377
|
+
server/ Node, Express, ws, node-pty, chokidar — sirve la interfaz y hospeda las pty
|
|
378
|
+
src/agents/ un adaptador por CLI: lo único del servidor que conoce a cada una
|
|
379
|
+
web/ Vite, React, xterm.js, highlight.js
|
|
380
|
+
shared/ los tipos del protocolo, sin `any` en los bordes
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
Un solo proceso sirve la interfaz y el WebSocket en el mismo puerto: con un
|
|
384
|
+
único origen, el chequeo de `Origin` y el token funcionan igual en desarrollo y
|
|
385
|
+
en producción, sin excepciones que después nadie se acuerda de sacar.
|
|
386
|
+
|
|
387
|
+
La decisión de arquitectura que ordena el resto: **las pty viven en un registro
|
|
388
|
+
del servidor y el WebSocket es solo transporte.** Si el proceso muriera con el
|
|
389
|
+
socket, un `Ctrl+R` sin querer borraría la sesión de trabajo. Cada terminal
|
|
390
|
+
guarda un buffer de su salida reciente para repintar la pantalla cuando el
|
|
391
|
+
cliente vuelve.
|
|
392
|
+
|
|
393
|
+
La otra: **el servidor genérico no nombra ninguna CLI.** Lo que sabe de cada una
|
|
394
|
+
—dónde guarda, cómo se lanza, qué se lee y qué no se abre nunca— vive en su
|
|
395
|
+
adaptador, y la interfaz dibuja cada control según lo que esa CLI declara.
|
|
396
|
+
|
|
397
|
+
[`CLAUDE.md`](CLAUDE.md) tiene las reglas y el mapa, y su índice lleva a
|
|
398
|
+
[`docs/`](docs), donde vive el detalle de cada CLI: el formato real de su
|
|
399
|
+
historial —que difiere de lo que uno esperaría—, qué se lee y qué no, y las
|
|
400
|
+
trampas ya pisadas. [`CHECKLIST.md`](CHECKLIST.md) es lo que falta y la deuda
|
|
401
|
+
abierta; [`docs/bitacora.md`](https://raw.githubusercontent.com/cvelasquez/agent-workbench/main/docs/bitacora.md), la crónica hito por hito.
|
|
402
|
+
[`CONTRIBUTING.md`](CONTRIBUTING.md), cómo trabajar en el repositorio. Las
|
|
403
|
+
capturas de este README salen de `pnpm demo:shots`, sobre datos inventados.
|
|
404
|
+
|
|
405
|
+
---
|
|
406
|
+
|
|
407
|
+
## Licencia
|
|
408
|
+
|
|
409
|
+
MIT. Ver [`LICENSE`](LICENSE).
|
|
410
|
+
|
|
411
|
+
Agent Workbench es un proyecto independiente. Funciona con las CLIs de Claude
|
|
412
|
+
Code, de Codex, de OpenCode y de Antigravity, pero no está afiliado a Anthropic,
|
|
413
|
+
a OpenAI, a los autores de OpenCode ni a Google, ni respaldado por ellos.
|