chocolatito-code 1.6.6 → 1.6.8

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.
Files changed (76) hide show
  1. package/README.md +437 -341
  2. package/dist/agent/context.d.ts +6 -0
  3. package/dist/agent/context.js +69 -2
  4. package/dist/agent/loop.js +8 -0
  5. package/dist/agent/toolGate.js +13 -7
  6. package/dist/agent/verifier.js +2 -1
  7. package/dist/config/permissions.d.ts +17 -0
  8. package/dist/config/permissions.js +47 -7
  9. package/dist/config/plataforma.d.ts +62 -0
  10. package/dist/config/plataforma.js +109 -0
  11. package/dist/config/updater.js +4 -1
  12. package/dist/hooks/manager.js +2 -1
  13. package/dist/index.js +164 -39
  14. package/dist/memory/manager.d.ts +15 -5
  15. package/dist/memory/manager.js +146 -29
  16. package/dist/servidor/captura.d.ts +36 -0
  17. package/dist/servidor/captura.js +74 -0
  18. package/dist/servidor/pagina.d.ts +27 -0
  19. package/dist/servidor/pagina.js +268 -0
  20. package/dist/servidor/puente.d.ts +34 -0
  21. package/dist/servidor/puente.js +115 -0
  22. package/dist/servidor/servidor.d.ts +61 -0
  23. package/dist/servidor/servidor.js +249 -0
  24. package/dist/sessions/manager.d.ts +8 -0
  25. package/dist/sessions/manager.js +44 -0
  26. package/dist/sessions/resume.d.ts +12 -0
  27. package/dist/sessions/resume.js +10 -0
  28. package/dist/tools/backgroundTask.d.ts +64 -0
  29. package/dist/tools/backgroundTask.js +264 -0
  30. package/dist/tools/browserExtension.d.ts +2 -1
  31. package/dist/tools/browserExtension.js +48 -0
  32. package/dist/tools/computerUse.js +51 -9
  33. package/dist/tools/definitions.js +93 -1
  34. package/dist/tools/gitAudit.d.ts +41 -0
  35. package/dist/tools/gitAudit.js +282 -0
  36. package/dist/tools/runCommand.js +5 -2
  37. package/dist/tools/runner.js +36 -2
  38. package/dist/tools/safety.d.ts +1 -0
  39. package/dist/tools/safety.js +3 -0
  40. package/dist/tools/todoTool.d.ts +2 -0
  41. package/dist/tools/todoTool.js +29 -0
  42. package/dist/tools/toolDefsComputer.js +9 -0
  43. package/dist/tools/win/hostScript.js +7 -2
  44. package/dist/ui/comandos.js +2 -0
  45. package/dist/ui/ink/App.d.ts +0 -23
  46. package/dist/ui/ink/App.js +86 -57
  47. package/dist/ui/ink/Prompt.d.ts +16 -6
  48. package/dist/ui/ink/Prompt.js +37 -62
  49. package/dist/ui/ink/montarApp.d.ts +34 -0
  50. package/dist/ui/ink/montarApp.js +93 -1
  51. package/dist/ui/ink/prestamo.d.ts +63 -0
  52. package/dist/ui/ink/prestamo.js +92 -0
  53. package/dist/ui/ink/teclado.d.ts +48 -0
  54. package/dist/ui/ink/teclado.js +96 -0
  55. package/dist/ui/ink/transcripcion.d.ts +114 -0
  56. package/dist/ui/ink/transcripcion.js +180 -0
  57. package/dist/ui/interrupt.js +4 -1
  58. package/dist/ui/loopPrompt.d.ts +6 -7
  59. package/dist/ui/loopPrompt.js +14 -1
  60. package/dist/ui/marco.d.ts +3 -0
  61. package/dist/ui/marco.js +22 -3
  62. package/dist/ui/pantalla.d.ts +45 -17
  63. package/dist/ui/pantalla.js +150 -92
  64. package/dist/ui/permissionPrompt.d.ts +19 -17
  65. package/dist/ui/permissionPrompt.js +44 -1
  66. package/dist/ui/pieFijo.d.ts +1 -1
  67. package/dist/ui/pieFijo.js +27 -5
  68. package/dist/ui/renderer.js +8 -0
  69. package/dist/ui/selector.d.ts +6 -4
  70. package/dist/ui/selector.js +14 -1
  71. package/extension/background.js +80 -0
  72. package/extension/content.js +106 -0
  73. package/extension/manifest.json +3 -2
  74. package/package.json +3 -2
  75. package/dist/ui/historial.d.ts +0 -49
  76. package/dist/ui/historial.js +0 -92
package/README.md CHANGED
@@ -1,341 +1,437 @@
1
- # 🦊 Chocolatito Code (v1.0.0)
2
-
3
- > **Agente Autónomo de Programación para la Terminal**, desarrollado por **Chocolatito** con la arquitectura del **Motor Espectro**.
4
-
5
- ---
6
-
7
- ## ⚡ Niveles de Potencia y Esfuerzo (/effort)
8
-
9
- Chocolatito Code te permite regular dinámicamente la profundidad y potencia del motor según la complejidad de la tarea:
10
-
11
- | Nivel | Nombre | Nivel de Esfuerzo | Uso Recomendado |
12
- | :--- | :--- | :---: | :--- |
13
- | Nivel | Modelo real | Uso recomendado |
14
- | :--- | :--- | :--- |
15
- | **`1.0`** Ágil | `deepseek-v4-flash` | Tareas cotidianas, funciones y scripts directos. |
16
- | **`1.5`** Avanzado | `deepseek-v4-flash` | Refactorizaciones, con más margen creativo. |
17
- | **`2.0`** Razonamiento Pro | `deepseek-v4-pro` | Bugs difíciles, algoritmos y arquitectura. |
18
- | **`2.5`** MAX | `deepseek-v4-pro` | Proyectos completos y exploración amplia. |
19
-
20
- Ventana de contexto: **1.000.000 de tokens** en los cuatro niveles.
21
-
22
- Para cambiar de nivel dentro de la sesión, escribe:
23
- ```bash
24
- /effort 2.0
25
- ```
26
-
27
- ---
28
-
29
- ## 🛠️ Herramientas Nativas Autónomas
30
-
31
- - 👁️ `view_file`: Lectura precisa con numeración de líneas.
32
- - ✏️ `edit_file`: Modificación de código con diffs visuales tipo Git (verde/rojo).
33
- - 📄 `write_file`: Creación y sobreescritura de archivos y directorios.
34
- - 💻 `run_command`: Ejecución de comandos en PowerShell/Bash con captura de logs.
35
- - 📂 `list_dir`: Exploración de proyectos respetando `.gitignore`.
36
- - 🔍 `grep_search`: Búsqueda instantánea de texto y regex.
37
- - 🌐 `chrome`: Controla **tu** Chrome desde dentro, con tus sesiones iniciadas y en segundo
38
- plano real (requiere la extensión: ver `extension/README.md`).
39
- - 🖥️ `computer_use`: Aplicaciones de escritorio por árbol de accesibilidad, sin adivinar píxeles.
40
- - 🧭 `browser`: Navegador propio por CDP, para webs públicas y `localhost`.
41
-
42
- Las lecturas independientes lanzadas en el mismo turno se ejecutan **en paralelo**.
43
-
44
- ## 🗺️ Mapa del repositorio
45
-
46
- Al arrancar, el agente recibe un índice de los símbolos del proyecto ordenado por **cuánto los
47
- usa el resto del código** (un PageRank sobre el grafo de referencias, con presupuesto de 4.000
48
- tokens). Sirve para que sepa qué existe y dónde mirar sin gastar turnos en `grep_search`
49
- buscando a ciegas.
50
-
51
- Son nombres y números de línea, no contenido: antes de editar sigue leyendo el archivo.
52
-
53
- Lo que escribes también cuenta. Si dices *"arregla calcularImpuesto"* o *"falla en loop.ts"*, se
54
- detecta la referencia aunque no pongas `@` y se le pasan las rutas —solo las rutas, no el
55
- contenido, que cuesta más contexto del que ahorra.
56
-
57
- ## ✅ Verificación automática tras editar
58
-
59
- Cuando un turno escribe en disco, Chocolatito puede correr el verificador del proyecto y
60
- devolverle el error al agente **en el mismo turno**, en vez de dar el trabajo por bueno y que el
61
- fallo aparezca tres turnos después.
62
-
63
- Viene **apagada**: correr un comando del proyecto es ejecutar código, y eso se pide. Para
64
- activarla, en `.chocolatito/settings.json` (del proyecto o global en `~/.chocolatito/`):
65
-
66
- ```json
67
- {
68
- "verify": { "auto": true },
69
- "limits": { "maxIterations": 60, "subagentIterations": 20 }
70
- }
71
- ```
72
-
73
- También con variables de entorno: `CHOCOLATITO_AUTO_VERIFY=1`, `CHOCOLATITO_VERIFY_CMD`,
74
- `CHOCOLATITO_MAX_ITERATIONS`, `CHOCOLATITO_SUBAGENT_ITERATIONS`.
75
-
76
- El comando se detecta solo, en este orden: `npm run typecheck` → `lint` → `check` → `build`, o
77
- `npx tsc --noEmit`, `cargo check`, `go build ./...`. **Nunca los tests**: un `npm test` puede
78
- levantar servidores o tardar minutos, y verificar no puede significar eso. Con `verify.command`
79
- pones el tuyo. Si falla, el agente tiene tres intentos para arreglarlo; al cuarto para y te lo
80
- dice.
81
-
82
- ## ↻ Cuando el agente se atasca
83
-
84
- Si repite tres veces la misma llamada con el mismo resultado, se para y pregunta: le dejas
85
- seguir, o le dices que cambie de enfoque. Sin terminal (CI, `chocolatito "haz X"`) se corta
86
- solo, para que un bucle que nadie está mirando no se coma la cuota.
87
-
88
- ## 🧩 VSCode
89
-
90
- Si tienes la extensión instalada y abres `chocolatito` en la terminal integrada, **se conecta
91
- solo**. No hay nada que configurar.
92
-
93
- El truco está al revés de lo que parece: la extensión es un **servidor MCP** y el agente es el
94
- cliente. Cada ventana de VSCode levanta un servidor en `127.0.0.1` y deja una ficha en
95
- `~/.chocolatito/ide/` con su puerto, su token y la carpeta que tiene abierta. El agente busca la
96
- ficha cuya carpeta contiene su directorio de trabajo.
97
-
98
- Lo que gana el agente (lo único que no puede tener por su cuenta):
99
-
100
- | Herramienta | Para qué |
101
- | --- | --- |
102
- | `diagnosticos` | Los errores del servidor de lenguaje. Los subrayados rojos, sin esperar a compilar. |
103
- | `seleccion_actual` | Qué archivo tienes abierto y qué has seleccionado. Hace que «arregla esto» signifique algo. |
104
- | `archivos_abiertos` | Las pestañas abiertas, en orden. |
105
- | `mostrar_diff` | Abre el visor de diferencias nativo. No escribe nada: es para que lo veas antes. |
106
-
107
- **Con varias ventanas abiertas se elige la correcta**, no la primera: gana la carpeta más
108
- específica que contenga el directorio de trabajo, y si ninguna lo contiene **no se conecta a
109
- nada**. Conectarse a la ventana de otro proyecto sería peor que no conectarse: los diffs saldrían
110
- en el sitio equivocado.
111
-
112
- El servidor escucha solo en `127.0.0.1` y exige un token de 32 bytes que va en la ficha, dentro de
113
- tu carpeta personal. Sin eso, cualquier programa de la máquina podría manejar tu editor.
114
-
115
- Para apagarlo: `CHOCOLATITO_SIN_EDITOR=1`, o la opción `chocolatito.puente` en VSCode.
116
-
117
- ### Instalarla
118
-
119
- Mientras no esté en el marketplace, se instala desde el paquete:
120
-
121
- ```bash
122
- cd extension-vscode
123
- npx @vscode/vsce package --allow-missing-repository --skip-license
124
- code --install-extension chocolatito-code-vscode-0.1.1.vsix
125
- ```
126
-
127
- **Con VSCode cerrado**, y reiniciándolo después. Copiar la carpeta a mano a `~/.vscode/extensions`
128
- **no funciona**: falta el `.vsixmanifest` y VSCode la lista pero no la carga nunca, sin dar ningún
129
- error. Para desarrollar, `F5` sobre la carpeta abre una ventana con la extensión cargada al vuelo.
130
-
131
- En la barra de estado, abajo a la derecha, pone **Chocolatito** con el estado del puente. Si algo
132
- falla —sin carpeta abierta, puente apagado, puerto ocupado— lo dice ahí, y al pulsarlo se abre el
133
- detalle.
134
-
135
- ---
136
-
137
- ## 🔌 MCP (Model Context Protocol)
138
-
139
- Conecta cualquier servidor MCP y sus herramientas quedan disponibles para el agente.
140
- Configuración compatible con Claude Code en `.mcp.json` (ver `.mcp.json.ejemplo`):
141
-
142
- ```json
143
- { "mcpServers": { "github": {
144
- "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"],
145
- "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}" } } } }
146
- ```
147
-
148
- Las herramientas aparecen como `mcp__<servidor>__<herramienta>`. Usa `/mcp` para ver el estado.
149
-
150
- ## 🪝 Hooks
151
-
152
- Reglas propias que el agente no puede saltarse, en `.chocolatito/settings.json`:
153
-
154
- ```json
155
- { "hooks": { "PreToolUse": [ { "matcher": "run_command",
156
- "hooks": [{ "type": "command", "command": "node .chocolatito/hooks/guardia.mjs" }] } ] } }
157
- ```
158
-
159
- El hook recibe el evento por stdin como JSON y puede **denegar**, **pedir confirmación** o
160
- **reescribir los argumentos** antes de que la herramienta se ejecute. Salir con código 2
161
- bloquea directamente.
162
-
163
-
164
- ## 🔐 Permisos
165
-
166
- Una sola regla: **mirar es gratis, actuar se pregunta.**
167
-
168
- | Acción | Se pregunta |
169
- | :--- | :--- |
170
- | `ui_snapshot`, `list_windows`, `snapshot`, `screenshot`, `get_text`, `tabs` | No. Es el paso previo obligatorio de todo. |
171
- | Clic, escritura, navegación o JavaScript sobre tu ordenador o tu Chrome | **Siempre**, también en `acceptEdits`. |
172
- | `run_command`, escritura y borrado de archivos | Sí, salvo patrón autorizado. |
173
-
174
- ### Cambiar de modo con `shift+tab`
175
-
176
- Funciona **en cualquier momento**: en el prompt, a mitad de una generación y dentro del
177
- propio diálogo de permiso (ahí además aprueba la acción pendiente).
178
-
179
- ```
180
- normal → acepta ediciones → automático → normal
181
- ```
182
-
183
- - **normal** — pregunta antes de cada acción con consecuencias.
184
- - **acepta ediciones** escribe archivos sin preguntar; sigue preguntando por comandos y
185
- por el control del ordenador.
186
- - **automático** — no pregunta nada.
187
-
188
- El **modo plan** se activa aparte, con `/plan`, para no dejarlo a un golpe de tecla. Es
189
- solo lectura de verdad: ni comandos, ni clics, ni escrituras.
190
-
191
- `--yes` aprueba todo sin preguntar: es para CI, no para el día a día.
192
-
193
- ## 📋 Pegar texto largo
194
-
195
- Pegar un log de 300 líneas ya no mete 300 líneas en el recuadro. Se guarda aparte y en el prompt
196
- queda una marca corta:
197
-
198
- ```
199
- ❯ arregla esto [pegado #1 · 347 lineas]
200
- ```
201
-
202
- **El modelo recibe el texto entero**, no la marca: al enviar se sustituye por lo que pegaste. Y un
203
- solo `backspace` con el cursor detrás de la marca se la lleva completa — lo que ocupa una línea se
204
- borra como una línea.
205
-
206
- Por debajo de 5 líneas o 400 caracteres se pega normal, entero y a la vista.
207
-
208
- ---
209
-
210
- ## ⌨️ Escribir mientras trabaja
211
-
212
- No hace falta esperar a que termine. Lo que escribas durante una generación aparece bajo
213
- el spinner y, al pulsar Enter, queda en cola: el agente acaba su turno y lo toma como
214
- siguiente orden, sin que tengas que volver a teclearlo.
215
-
216
- `Esc` pausa el turno en curso. `Ctrl+C` una vez interrumpe; dos veces cierra la sesión.
217
-
218
-
219
- ---
220
-
221
- ## 🔑 Licencia
222
-
223
- Al abrirlo por primera vez pide la clave que recibiste por correo al comprar:
224
-
225
- ```
226
- 🔑 ACTIVACIÓN — CHOCOLATITO CODE
227
- Licencia 38b1460a-5104-4067-a91d-77b872934d51
228
- ✔ Licencia activada para tu@correo.com
229
- ```
230
-
231
- Se guarda en `~/.chocolatitorc` y no vuelve a pedirla. Una clave sirve para **3 equipos**.
232
-
233
- ```bash
234
- /licencia # ver la licencia activa y en qué equipo estás
235
- /licencia liberar # soltar este equipo para usar la clave en otro
236
- ```
237
-
238
- Si cambias de ordenador o formateas, libera el equipo antes. Si ya no puedes,
239
- escribe al soporte y se libera desde el panel.
240
-
241
- Se comprueba una vez al día. Si algún día no hay conexión, **sigues trabajando**:
242
- hay 7 días de margen antes de pedirte que te conectes.
243
-
244
- ---
245
-
246
- ## 📦 Instalación
247
-
248
- ```bash
249
- npm install -g chocolatito-code
250
- chocolatito --version
251
- ```
252
-
253
- Requiere **Node.js 20 o superior**. La primera vez pide la API key y la guarda en
254
- `~/.chocolatitorc`; también se puede pasar por `CHOCOLATITO_API_KEY` o por un `.env` del
255
- proyecto.
256
-
257
- Para desarrollar sobre el propio proyecto:
258
-
259
- ```bash
260
- npm install && npm run build && npm link
261
- ```
262
-
263
- ### Actualizaciones
264
-
265
- Se instalan solas. Al arrancar se le pregunta al registro de npm si hay una versión más
266
- nueva (como mucho una vez cada 6 horas, y sin retrasar el arranque: si no hay red, no pasa
267
- nada). Si la hay, se instala de fondo y entra **al reiniciar** `chocolatito` — nunca a
268
- mitad de sesión.
269
-
270
- | | |
271
- | --- | --- |
272
- | `/actualizar` | Comprobar e instalar ahora, sin esperar a la siguiente ventana. |
273
- | `CHOCOLATITO_SIN_ACTUALIZAR=1` | Apagarlo del todo. |
274
-
275
- Una instalación de desarrollo (`npm link` sobre el repositorio) **no se toca nunca**:
276
- instalar encima le borraría el trabajo a quien lo está escribiendo. Y no se baja jamás a
277
- una preversión, aunque el registro la anuncie como la última.
278
-
279
- Si la carpeta global es de administrador y no hay permiso para escribir, no se insiste: se
280
- dice una vez el comando (`npm i -g chocolatito-code@latest`) y se sigue trabajando.
281
-
282
- ---
283
-
284
- ## 🚀 Uso Rápido
285
-
286
- ```bash
287
- # Iniciar sesión interactiva
288
- chocolatito
289
-
290
- # O ejecutar una orden directa
291
- chocolatito "crea una API REST con Node.js y Express"
292
-
293
- # Modo no interactivo: aprueba las acciones sin preguntar
294
- chocolatito --yes "ejecuta los tests y arregla lo que falle"
295
-
296
- # Ayuda y versión, sin gastar tokens
297
- chocolatito --help
298
- chocolatito --version
299
- ```
300
-
301
- ### Códigos de salida
302
-
303
- En modo orden única el código dice qué pasó de verdad. Antes siempre era `0`: una cuota
304
- agotada o una licencia caída dejaban el paso del CI en verde sin haber tocado nada.
305
-
306
- | Código | Qué significa | Qué hacer |
307
- | :---: | :--- | :--- |
308
- | `0` | La tarea se completó. | Nada. |
309
- | `1` | El agente no pudo terminar: el motor falló tras los reintentos, o se agotó el límite de 30 iteraciones. | Reintentar tiene sentido. |
310
- | `2` | Error de uso: no se dio ninguna orden, o no hay terminal para pedirla. | Arreglar la invocación. |
311
- | `3` | Cuota agotada. | Esperar a que se libere la ventana; reintentar no la devuelve. |
312
- | `4` | Licencia o API key no válida. | Revisar `/licencia` o `~/.chocolatitorc`. |
313
- | `5` | Ya hay 4 peticiones en curso con esta licencia. | Esperar los segundos que dice el mensaje y reintentar. |
314
- | `130` | Interrumpido con `Esc` (128 + SIGINT, como cualquier otro programa). | Nada. |
315
-
316
- Lo que no es `0` se explica también por `stderr`, con el motivo del corte. Un ejemplo:
317
-
318
- ```bash
319
- chocolatito --yes "ejecuta los tests y arregla lo que falle"
320
- case $? in
321
- 0) echo "hecho" ;;
322
- 3|4) echo "problema de cuenta, no de código: no reintentes" ;;
323
- *) echo "falló, se puede reintentar" ;;
324
- esac
325
- ```
326
-
327
- ## 🧪 Pruebas
328
-
329
- ```bash
330
- npm run build && npm test
331
- ```
332
-
333
- ## 📚 Documentación
334
-
335
- - `MEJORAS.md` — auditoría del núcleo y de permisos: qué estaba roto, qué se arregló y cómo se comprobó.
336
- - `COMPUTER-USE.md` — diseño del control de ordenador y navegador.
337
- - `extension/README.md` — instalación de la extensión de Chrome.
338
-
339
- ---
340
-
341
- Desarrollado con pasión por **Chocolatito**. 🦊⚡
1
+ # 🦊 Chocolatito Code (v1.0.0)
2
+
3
+ > **Agente Autónomo de Programación para la Terminal**, desarrollado por **Chocolatito** con la arquitectura del **Motor Espectro**.
4
+
5
+ ---
6
+
7
+ ## ⚡ Niveles de Potencia y Esfuerzo (/effort)
8
+
9
+ Chocolatito Code te permite regular dinámicamente la profundidad y potencia del motor según la complejidad de la tarea:
10
+
11
+ | Nivel | Nombre | Nivel de Esfuerzo | Uso Recomendado |
12
+ | :--- | :--- | :---: | :--- |
13
+ | Nivel | Modelo real | Uso recomendado |
14
+ | :--- | :--- | :--- |
15
+ | **`1.0`** Ágil | `deepseek-v4-flash` | Tareas cotidianas, funciones y scripts directos. |
16
+ | **`1.5`** Avanzado | `deepseek-v4-flash` | Refactorizaciones, con más margen creativo. |
17
+ | **`2.0`** Razonamiento Pro | `deepseek-v4-pro` | Bugs difíciles, algoritmos y arquitectura. |
18
+ | **`2.5`** MAX | `deepseek-v4-pro` | Proyectos completos y exploración amplia. |
19
+
20
+ Ventana de contexto: **1.000.000 de tokens** en los cuatro niveles.
21
+
22
+ Para cambiar de nivel dentro de la sesión, escribe:
23
+ ```bash
24
+ /effort 2.0
25
+ ```
26
+
27
+ ---
28
+
29
+ ## 🛠️ Herramientas Nativas Autónomas
30
+
31
+ - 👁️ `view_file`: Lectura precisa con numeración de líneas.
32
+ - ✏️ `edit_file`: Modificación de código con diffs visuales tipo Git (verde/rojo).
33
+ - 📄 `write_file`: Creación y sobreescritura de archivos y directorios.
34
+ - 💻 `run_command`: Ejecución de comandos en PowerShell/Bash con captura de logs.
35
+ - `start_background_task`: Ejecución de servidores y procesos en segundo plano (`npm run dev`, watchers) con lectura incremental (`read_task_output`), listado (`list_background_tasks`) y parada limpia del árbol de procesos (`stop_background_task`).
36
+ - 🧠 `save_memory` / `read_memory`: Memoria jerárquica en dos niveles (ámbito local de proyecto en `.chocolatito/memory/` y preferencias globales en `~/.chocolatito/memory/`).
37
+ - 📂 `list_dir`: Exploración de proyectos respetando `.gitignore`.
38
+ - 🔍 `grep_search`: Búsqueda instantánea de texto y regex.
39
+ - 🌐 `chrome`: Controla **tu** Chrome desde dentro con telemetría web en vivo: captura de excepciones de consola (`console_logs`) y errores de red HTTP (`network_errors`).
40
+ - 🖥️ `computer_use`: Aplicaciones de escritorio por árbol de accesibilidad, sin adivinar píxeles.
41
+ - 🧭 `browser`: Navegador propio por CDP, para webs públicas y `localhost`.
42
+
43
+ Las lecturas independientes lanzadas en el mismo turno se ejecutan **en paralelo**.
44
+
45
+ ## 🗺️ Mapa del repositorio
46
+
47
+ Al arrancar, el agente recibe un índice de los símbolos del proyecto ordenado por **cuánto los
48
+ usa el resto del código** (un PageRank sobre el grafo de referencias, con presupuesto de 4.000
49
+ tokens). Sirve para que sepa qué existe y dónde mirar sin gastar turnos en `grep_search`
50
+ buscando a ciegas.
51
+
52
+ Son nombres y números de línea, no contenido: antes de editar sigue leyendo el archivo.
53
+
54
+ Lo que escribes también cuenta. Si dices *"arregla calcularImpuesto"* o *"falla en loop.ts"*, se
55
+ detecta la referencia aunque no pongas `@` y se le pasan las rutas —solo las rutas, no el
56
+ contenido, que cuesta más contexto del que ahorra.
57
+
58
+ ## ✅ Verificación automática tras editar
59
+
60
+ Cuando un turno escribe en disco, Chocolatito puede correr el verificador del proyecto y
61
+ devolverle el error al agente **en el mismo turno**, en vez de dar el trabajo por bueno y que el
62
+ fallo aparezca tres turnos después.
63
+
64
+ Viene **apagada**: correr un comando del proyecto es ejecutar código, y eso se pide. Para
65
+ activarla, en `.chocolatito/settings.json` (del proyecto o global en `~/.chocolatito/`):
66
+
67
+ ```json
68
+ {
69
+ "verify": { "auto": true },
70
+ "limits": { "maxIterations": 60, "subagentIterations": 20 }
71
+ }
72
+ ```
73
+
74
+ También con variables de entorno: `CHOCOLATITO_AUTO_VERIFY=1`, `CHOCOLATITO_VERIFY_CMD`,
75
+ `CHOCOLATITO_MAX_ITERATIONS`, `CHOCOLATITO_SUBAGENT_ITERATIONS`.
76
+
77
+ El comando se detecta solo, en este orden: `npm run typecheck` `lint` `check` → `build`, o
78
+ `npx tsc --noEmit`, `cargo check`, `go build ./...`. **Nunca los tests**: un `npm test` puede
79
+ levantar servidores o tardar minutos, y verificar no puede significar eso. Con `verify.command`
80
+ pones el tuyo. Si falla, el agente tiene tres intentos para arreglarlo; al cuarto para y te lo
81
+ dice.
82
+
83
+ ## ↻ Cuando el agente se atasca
84
+
85
+ Si repite tres veces la misma llamada con el mismo resultado, se para y pregunta: le dejas
86
+ seguir, o le dices que cambie de enfoque. Sin terminal (CI, `chocolatito "haz X"`) se corta
87
+ solo, para que un bucle que nadie está mirando no se coma la cuota.
88
+
89
+ ## 📱 En el móvil, sin instalar nada (`--servir`)
90
+
91
+ Abre **esta misma sesión** en el navegador de cualquier aparato de tu red. El agente
92
+ sigue corriendo en tu PC, con tus archivos y tus permisos; el móvil es la pantalla y el
93
+ teclado.
94
+
95
+ ```bash
96
+ chocolatito --servir # solo desde esta máquina
97
+ chocolatito --servir-red # también desde el móvil o la tablet de tu red
98
+ ```
99
+
100
+ Imprime un enlace con un token dentro. Ese enlace **es** la llave: quien lo tenga entero
101
+ entra. El token se borra solo de la barra de direcciones en cuanto la página carga, para
102
+ que no se quede en el historial ni salga en una captura.
103
+
104
+ Resuelve de paso el **iPhone**, donde no hay forma de instalarlo: Apple no permite un
105
+ Termux, y el emulador de iSH no implementa las instrucciones que necesita el motor de
106
+ JavaScript de Node. Por el navegador no hace falta instalar nada.
107
+
108
+ | | |
109
+ | --- | --- |
110
+ | `--puerto N` | Otro puerto (por defecto 4700). |
111
+ | Se reconecta solo | Un móvil pierde la red a cada rato; la sesión no se pierde con ella. |
112
+ | Los permisos | Salen en el móvil, con los mismos botones que en el terminal. |
113
+
114
+ **Manda el navegador.** Con `--servir`, lo que escribas en el terminal ya no se lee: el
115
+ terminal queda de monitor. Es a propósito dos entradas peleándose por el mismo teclado
116
+ es de donde salen los cuelgues raros.
117
+
118
+ **Lo que NO hace, a propósito:** no hay HTTPS ni túnel propio. Para entrar desde fuera de
119
+ tu casa, usa Tailscale o `cloudflared`, que ya existen y están auditados. Un túnel casero
120
+ es la parte fácil de una responsabilidad muy grande.
121
+
122
+ ### Lo que protege la puerta
123
+
124
+ Detrás de ese enlace hay ejecución de comandos en tu máquina, así que:
125
+
126
+ 1. **Token en todo**, incluido el WebSocket — que es justo el que manda órdenes, y el que
127
+ más se olvida. Se compara en tiempo constante.
128
+ 2. **La cabecera `Host` tiene que ser una IP o `localhost`.** Corta el *DNS rebinding*, que
129
+ es la única forma real de atacar algo que solo escucha en 127.0.0.1: una web cualquiera
130
+ apunta su dominio a tu 127.0.0.1 y usa tu navegador como puente. Un ataque así llega
131
+ siempre con un nombre de dominio; exigiendo IP se cae solo.
132
+ 3. **`Origin`, si viene, tiene que coincidir.**
133
+ 4. **127.0.0.1 por defecto.** Salir a la red hay que escribirlo (`--servir-red`) y se avisa
134
+ en pantalla.
135
+
136
+ Y un permiso **nunca** se aprueba solo. Si no hay nadie conectado, la pregunta vuelve al
137
+ terminal; si el navegador se cae con una pregunta abierta, la respuesta es *no*.
138
+
139
+ ---
140
+
141
+ ## 🧩 VSCode
142
+
143
+ Si tienes la extensión instalada y abres `chocolatito` en la terminal integrada, **se conecta
144
+ solo**. No hay nada que configurar.
145
+
146
+ El truco está al revés de lo que parece: la extensión es un **servidor MCP** y el agente es el
147
+ cliente. Cada ventana de VSCode levanta un servidor en `127.0.0.1` y deja una ficha en
148
+ `~/.chocolatito/ide/` con su puerto, su token y la carpeta que tiene abierta. El agente busca la
149
+ ficha cuya carpeta contiene su directorio de trabajo.
150
+
151
+ Lo que gana el agente (lo único que no puede tener por su cuenta):
152
+
153
+ | Herramienta | Para qué |
154
+ | --- | --- |
155
+ | `diagnosticos` | Los errores del servidor de lenguaje. Los subrayados rojos, sin esperar a compilar. |
156
+ | `seleccion_actual` | Qué archivo tienes abierto y qué has seleccionado. Hace que «arregla esto» signifique algo. |
157
+ | `archivos_abiertos` | Las pestañas abiertas, en orden. |
158
+ | `mostrar_diff` | Abre el visor de diferencias nativo. No escribe nada: es para que lo veas antes. |
159
+
160
+ **Con varias ventanas abiertas se elige la correcta**, no la primera: gana la carpeta más
161
+ específica que contenga el directorio de trabajo, y si ninguna lo contiene **no se conecta a
162
+ nada**. Conectarse a la ventana de otro proyecto sería peor que no conectarse: los diffs saldrían
163
+ en el sitio equivocado.
164
+
165
+ El servidor escucha solo en `127.0.0.1` y exige un token de 32 bytes que va en la ficha, dentro de
166
+ tu carpeta personal. Sin eso, cualquier programa de la máquina podría manejar tu editor.
167
+
168
+ Para apagarlo: `CHOCOLATITO_SIN_EDITOR=1`, o la opción `chocolatito.puente` en VSCode.
169
+
170
+ ### Instalarla
171
+
172
+ Mientras no esté en el marketplace, se instala desde el paquete:
173
+
174
+ ```bash
175
+ cd extension-vscode
176
+ npx @vscode/vsce package --allow-missing-repository --skip-license
177
+ code --install-extension chocolatito-code-vscode-0.1.1.vsix
178
+ ```
179
+
180
+ **Con VSCode cerrado**, y reiniciándolo después. Copiar la carpeta a mano a `~/.vscode/extensions`
181
+ **no funciona**: falta el `.vsixmanifest` y VSCode la lista pero no la carga nunca, sin dar ningún
182
+ error. Para desarrollar, `F5` sobre la carpeta abre una ventana con la extensión cargada al vuelo.
183
+
184
+ En la barra de estado, abajo a la derecha, pone **Chocolatito** con el estado del puente. Si algo
185
+ falla —sin carpeta abierta, puente apagado, puerto ocupado— lo dice ahí, y al pulsarlo se abre el
186
+ detalle.
187
+
188
+ ---
189
+
190
+ ## 🔌 MCP (Model Context Protocol)
191
+
192
+ Conecta cualquier servidor MCP y sus herramientas quedan disponibles para el agente.
193
+ Configuración compatible con Claude Code en `.mcp.json` (ver `.mcp.json.ejemplo`):
194
+
195
+ ```json
196
+ { "mcpServers": { "github": {
197
+ "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"],
198
+ "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}" } } } }
199
+ ```
200
+
201
+ Las herramientas aparecen como `mcp__<servidor>__<herramienta>`. Usa `/mcp` para ver el estado.
202
+
203
+ ## 🪝 Hooks
204
+
205
+ Reglas propias que el agente no puede saltarse, en `.chocolatito/settings.json`:
206
+
207
+ ```json
208
+ { "hooks": { "PreToolUse": [ { "matcher": "run_command",
209
+ "hooks": [{ "type": "command", "command": "node .chocolatito/hooks/guardia.mjs" }] } ] } }
210
+ ```
211
+
212
+ El hook recibe el evento por stdin como JSON y puede **denegar**, **pedir confirmación** o
213
+ **reescribir los argumentos** antes de que la herramienta se ejecute. Salir con código 2
214
+ bloquea directamente.
215
+
216
+
217
+ ## 🔐 Permisos
218
+
219
+ Una sola regla: **mirar es gratis, actuar se pregunta.**
220
+
221
+ | Acción | Se pregunta |
222
+ | :--- | :--- |
223
+ | `ui_snapshot`, `list_windows`, `snapshot`, `screenshot`, `get_text`, `tabs` | No. Es el paso previo obligatorio de todo. |
224
+ | Clic, escritura, navegación o JavaScript sobre tu ordenador o tu Chrome | **Siempre**, también en `acceptEdits`. |
225
+ | `run_command`, escritura y borrado de archivos | Sí, salvo patrón autorizado. |
226
+
227
+ ### Cambiar de modo con `shift+tab`
228
+
229
+ Funciona **en cualquier momento**: en el prompt, a mitad de una generación y dentro del
230
+ propio diálogo de permiso (ahí además aprueba la acción pendiente).
231
+
232
+ ```
233
+ normal → acepta ediciones → automático → normal
234
+ ```
235
+
236
+ - **normal** — pregunta antes de cada acción con consecuencias.
237
+ - **acepta ediciones** — escribe archivos sin preguntar; sigue preguntando por comandos y
238
+ por el control del ordenador.
239
+ - **automático** no pregunta nada.
240
+
241
+ El **modo plan** se activa aparte, con `/plan`, para no dejarlo a un golpe de tecla. Es
242
+ solo lectura de verdad: ni comandos, ni clics, ni escrituras.
243
+
244
+ `--yes` aprueba todo sin preguntar: es para CI, no para el día a día.
245
+
246
+ ## 📋 Pegar texto largo
247
+
248
+ Pegar un log de 300 líneas ya no mete 300 líneas en el recuadro. Se guarda aparte y en el prompt
249
+ queda una marca corta:
250
+
251
+ ```
252
+ ❯ arregla esto [pegado #1 · 347 lineas]
253
+ ```
254
+
255
+ **El modelo recibe el texto entero**, no la marca: al enviar se sustituye por lo que pegaste. Y un
256
+ solo `backspace` con el cursor detrás de la marca se la lleva completa — lo que ocupa una línea se
257
+ borra como una línea.
258
+
259
+ Por debajo de 5 líneas o 400 caracteres se pega normal, entero y a la vista.
260
+
261
+ ---
262
+
263
+ ## ⌨️ Escribir mientras trabaja
264
+
265
+ No hace falta esperar a que termine. Lo que escribas durante una generación aparece bajo
266
+ el spinner y, al pulsar Enter, queda en cola: el agente acaba su turno y lo toma como
267
+ siguiente orden, sin que tengas que volver a teclearlo.
268
+
269
+ `Esc` pausa el turno en curso. `Ctrl+C` una vez interrumpe; dos veces cierra la sesión.
270
+
271
+ ---
272
+
273
+ ## 🛡️ Auditoría Pre-Commit (/audit y /review)
274
+
275
+ Antes de hacer un commit o desplegar cambios, corre `/audit` o `/review`:
276
+ - **Detección de secretos:** escanea el diff en busca de claves expuestas de OpenAI, Anthropic, AWS, Google, GitHub, tokens genéricos y claves privadas.
277
+ - **Detección de archivos sensibles:** alerta sobre la inclusión de archivos como `.env`, `.env.local`, `id_rsa` o `*.pem`.
278
+ - **Limpieza de depuración:** localiza sentencias residuales como `console.log`, `debugger;` o `print()`.
279
+ - **Sugerencia de Conventional Commits:** genera automáticamente la propuesta de commit semántico según los archivos modificados (ej. `feat(tools): ...`, `test: ...`).
280
+
281
+ ---
282
+
283
+ ## 📌 Widget de Tareas en Vivo y Selector /resume
284
+
285
+ - **Checklist visual interactivo:** cuando el agente define tareas con `todo_write`, la terminal muestra de forma fija en el pie el progreso en vivo (`⎿ ✔ 2/4 tareas · En curso: <tarea>`).
286
+ - **Reanudar sesiones visualmente:** al escribir `/resume` sin argumentos, Chocolatito abre un selector interactivo con flechas mostrando el historial, número de mensajes, fecha y previsualización de tu primer mensaje.
287
+
288
+ ---
289
+
290
+ ## 🔑 Licencia
291
+
292
+ Al abrirlo por primera vez pide la clave que recibiste por correo al comprar:
293
+
294
+ ```
295
+ 🔑 ACTIVACIÓN — CHOCOLATITO CODE
296
+ Licencia 38b1460a-5104-4067-a91d-77b872934d51
297
+ Licencia activada para tu@correo.com
298
+ ```
299
+
300
+ Se guarda en `~/.chocolatitorc` y no vuelve a pedirla. Una clave sirve para **3 equipos**.
301
+
302
+ ```bash
303
+ /licencia # ver la licencia activa y en qué equipo estás
304
+ /licencia liberar # soltar este equipo para usar la clave en otro
305
+ ```
306
+
307
+ Si cambias de ordenador o formateas, libera el equipo antes. Si ya no puedes,
308
+ escribe al soporte y se libera desde el panel.
309
+
310
+ Se comprueba una vez al día. Si algún día no hay conexión, **sigues trabajando**:
311
+ hay 7 días de margen antes de pedirte que te conectes.
312
+
313
+ ---
314
+
315
+ ## 📦 Instalación
316
+
317
+ ```bash
318
+ npm install -g chocolatito-code
319
+ chocolatito --version
320
+ ```
321
+
322
+ Requiere **Node.js 20 o superior**, en Windows, macOS, Linux o Android (Termux). La primera vez pide la API key y la guarda en
323
+ `~/.chocolatitorc`; también se puede pasar por `CHOCOLATITO_API_KEY` o por un `.env` del
324
+ proyecto.
325
+
326
+ Para desarrollar sobre el propio proyecto:
327
+
328
+ ```bash
329
+ npm install && npm run build && npm link
330
+ ```
331
+
332
+ ### En el celular, con Termux (Android)
333
+
334
+ El mismo paquete. No hay versión aparte ni nada que compilar: ninguna dependencia es
335
+ nativa.
336
+
337
+ ```bash
338
+ pkg update && pkg install nodejs git
339
+ npm install -g chocolatito-code
340
+ chocolatito
341
+ ```
342
+
343
+ Termux no tiene `/bin`, así que el shell se **busca** en vez de darlo por fijo: primero en
344
+ `$PREFIX/bin` (el prefijo real de tu instalación, que cambia en los forks) y luego en las
345
+ rutas de siempre. Si en algún momento sale un error diciendo que no encuentra `bash`, se
346
+ arregla con `pkg install bash`.
347
+
348
+ Al modelo se le dice que está en **Android (Termux)**, no en Linux, para que no proponga
349
+ `sudo` ni `apt-get`: aquí no hay root y se instala con `pkg`.
350
+
351
+ Lo que **no** funciona en el móvil, porque no puede: `computer_use` (no hay escritorio),
352
+ `chrome` y `browser` (no hay Chrome de escritorio ni extensión), y el puente con VSCode. Se
353
+ avisa al intentarlo, no se rompe la sesión. Todo lo demás —leer, editar, ejecutar comandos,
354
+ buscar, el mapa del repositorio, git— es igual que en el escritorio.
355
+
356
+ Consejo práctico: en vertical se ve poco ancho. La interfaz se adapta, pero para trabajar
357
+ de verdad vale mucho un teclado bluetooth y girar la pantalla.
358
+
359
+ ### Actualizaciones
360
+
361
+ Se instalan solas. Al arrancar se le pregunta al registro de npm si hay una versión más
362
+ nueva (como mucho una vez cada 6 horas, y sin retrasar el arranque: si no hay red, no pasa
363
+ nada). Si la hay, se instala de fondo y entra **al reiniciar** `chocolatito` — nunca a
364
+ mitad de sesión.
365
+
366
+ | | |
367
+ | --- | --- |
368
+ | `/actualizar` | Comprobar e instalar ahora, sin esperar a la siguiente ventana. |
369
+ | `CHOCOLATITO_SIN_ACTUALIZAR=1` | Apagarlo del todo. |
370
+
371
+ Una instalación de desarrollo (`npm link` sobre el repositorio) **no se toca nunca**:
372
+ instalar encima le borraría el trabajo a quien lo está escribiendo. Y no se baja jamás a
373
+ una preversión, aunque el registro la anuncie como la última.
374
+
375
+ Si la carpeta global es de administrador y no hay permiso para escribir, no se insiste: se
376
+ dice una vez el comando (`npm i -g chocolatito-code@latest`) y se sigue trabajando.
377
+
378
+ ---
379
+
380
+ ## 🚀 Uso Rápido
381
+
382
+ ```bash
383
+ # Iniciar sesión interactiva
384
+ chocolatito
385
+
386
+ # O ejecutar una orden directa
387
+ chocolatito "crea una API REST con Node.js y Express"
388
+
389
+ # Modo no interactivo: aprueba las acciones sin preguntar
390
+ chocolatito --yes "ejecuta los tests y arregla lo que falle"
391
+
392
+ # Ayuda y versión, sin gastar tokens
393
+ chocolatito --help
394
+ chocolatito --version
395
+ ```
396
+
397
+ ### Códigos de salida
398
+
399
+ En modo orden única el código dice qué pasó de verdad. Antes siempre era `0`: una cuota
400
+ agotada o una licencia caída dejaban el paso del CI en verde sin haber tocado nada.
401
+
402
+ | Código | Qué significa | Qué hacer |
403
+ | :---: | :--- | :--- |
404
+ | `0` | La tarea se completó. | Nada. |
405
+ | `1` | El agente no pudo terminar: el motor falló tras los reintentos, o se agotó el límite de 30 iteraciones. | Reintentar tiene sentido. |
406
+ | `2` | Error de uso: no se dio ninguna orden, o no hay terminal para pedirla. | Arreglar la invocación. |
407
+ | `3` | Cuota agotada. | Esperar a que se libere la ventana; reintentar no la devuelve. |
408
+ | `4` | Licencia o API key no válida. | Revisar `/licencia` o `~/.chocolatitorc`. |
409
+ | `5` | Ya hay 4 peticiones en curso con esta licencia. | Esperar los segundos que dice el mensaje y reintentar. |
410
+ | `130` | Interrumpido con `Esc` (128 + SIGINT, como cualquier otro programa). | Nada. |
411
+
412
+ Lo que no es `0` se explica también por `stderr`, con el motivo del corte. Un ejemplo:
413
+
414
+ ```bash
415
+ chocolatito --yes "ejecuta los tests y arregla lo que falle"
416
+ case $? in
417
+ 0) echo "hecho" ;;
418
+ 3|4) echo "problema de cuenta, no de código: no reintentes" ;;
419
+ *) echo "falló, se puede reintentar" ;;
420
+ esac
421
+ ```
422
+
423
+ ## 🧪 Pruebas
424
+
425
+ ```bash
426
+ npm run build && npm test
427
+ ```
428
+
429
+ ## 📚 Documentación
430
+
431
+ - `MEJORAS.md` — auditoría del núcleo y de permisos: qué estaba roto, qué se arregló y cómo se comprobó.
432
+ - `COMPUTER-USE.md` — diseño del control de ordenador y navegador.
433
+ - `extension/README.md` — instalación de la extensión de Chrome.
434
+
435
+ ---
436
+
437
+ Desarrollado con pasión por **Chocolatito**. 🦊⚡