====== OpenCode ======
[[https://opencode.ai|OpenCode]] es una herramienta de programación con IA que vive **dentro de la terminal** y es de código abierto.
No es un editor ni un plugin del editor: se lanza en la carpeta del proyecto y trabaja sobre esos ficheros.
----
===== 1. Instalar y arrancar =====
curl -fsSL https://opencode.ai/install | bash
opencode --version
Para trabajar, siempre desde la raíz del proyecto:
cd mi-proyecto
opencode
Se abre la //TUI//: la caja de entrada abajo, y encima la conversación.
----
===== 2. Proveedores y modelos =====
OpenCode no es un modelo: habla con modelos de otros. Conviene no confundir las dos cosas:
^ ^ Qué es ^ Comando ^ Cuándo se toca ^
| **Proveedor** | El servicio al que te conectas | ''/connect'' | Una vez, al entrar con tu cuenta |
| **Modelo** | La IA concreta que responde | ''/models'' | Cuantas veces quieras, incluso a mitad de sesión |
Recién instalado **ya funciona**, sin registro ni tarjeta: de serie usa los modelos de **OpenCode Zen**, y varios son gratuitos. En ''/models'' se reconocen por la etiqueta //free// —la lista concreta cambia con el tiempo—.
==== /connect: los proveedores ====
Abre la misma pantalla que sale en el primer arranque, con la lista de servicios a los que enlazarse. Lo importante es que **no te obliga a contratar nada nuevo**: si ya pagas ChatGPT, GitHub Copilot, Anthropic o Google, esa suscripción se reaprovecha desde OpenCode. Puedes tener varios proveedores conectados a la vez.
==== /models: cambiar de modelo ====
Lista todos los modelos de los proveedores que tengas conectados y elige con cuál se manda la siguiente petición. El cambio es instantáneo y **la conversación no se pierde**, y de ahí sale el flujo más rentable del día a día:
* **Plan** con el modelo más capaz, que es donde se decide si el cambio está bien planteado.
* ''Tab'' a **Build** con uno más barato, que es donde solo hay que ejecutar lo ya decidido.
Con los modelos gratuitos **tu código se usa para entrenar**. No los uses con código confidencial.
----
===== 3. La caja de entrada: tres formas de escribir =====
Todo lo que se hace con OpenCode se escribe en la misma caja. Lo que cambia es con qué empieza la línea.
^ Empieza por ^ Qué hace ^ Ejemplo ^
| //texto// | Le hablas al agente. Gasta tokens. | ''arregla el error de validación del formulario'' |
| ''@'' | Referencia un fichero **concreto**. | ''@src/api/login.ts revisa el manejo de errores'' |
| ''!'' | Ejecuta un comando de shell. **No gasta tokens.** | ''!npm test'' |
| ''/'' | Comando de OpenCode. Escribiendo solo ''/'' salen todos. | ''/compact'' |
Las dos teclas que más dinero ahorran son ''@'' y ''!'':
* Con **''@''** el modelo no tiene que salir a buscar el fichero: va directo. Un ''@public/robots.txt'' resuelve en un par de segundos lo que buscando a ciegas cuesta diez y unos cuantos miles de tokens.
* Con **''!''** ejecutas tú los comandos —''!git status'', ''!npm test''— y su salida entra en el contexto. El patrón normal es: lanzas tú los tests con ''!'' y luego le pides que arregle lo que ha fallado, sin que gaste una sola llamada en averiguar cómo se ejecutan.
''Mayús+Enter'' inserta un salto de línea sin enviar el prompt. Las flechas ''↑'' / ''↓'' recorren los prompts que ya has mandado, para reenviarlos sin volver a escribirlos.
----
===== 4. Plan y Build: la tecla Tab =====
OpenCode tiene dos modos de trabajo y se alterna entre ellos con **''Tab''**:
^ Modo ^ Qué hace ^
| **Plan** | Lee, analiza y te propone. **No toca el disco.** |
| **Build** | Ejecuta: crea, modifica y borra ficheros. |
El ciclo de un cambio serio es siempre el mismo:
start
repeat
:Plan: describir el cambio;
:leer el plan;
repeat while (¿hay algo que corregir?) is (sí)
:Tab: pasar a Build;
:revisar el diff y commitear;
stop
En Plan puedes además pedirle que **te pregunte** lo que no tenga claro («antes de proponer nada, hazme las preguntas que necesites») en lugar de que se invente los huecos. Leer el plan cuesta un minuto; deshacer un cambio mal enfocado, bastante más.
==== Mientras trabaja ====
* **''Esc Esc''** lo interrumpe en seco, esté pensando o a media tarea.
* Cuando va a hacer algo sensible, sale el **diálogo de permisos**: permitir una vez, permitir siempre o rechazar.
* Puedes seguir escribiendo mientras trabaja: los mensajes se **encolan** y los recoge cuando llega a un punto en el que encajan.
''/undo'' revierte el último mensaje de la conversación, pero **no deshace los cambios en los ficheros**. El deshacer de verdad es ''git'': commitea a menudo y revisa el ''diff'' antes de seguir.
----
===== 5. AGENTS.md: las instrucciones fijas del proyecto =====
Sin él acabas repitiendo las mismas restricciones en cada prompt: «nada de TypeScript», «usa el gestor de paquetes del proyecto», «no añadas dependencias». Eso se escribe **una vez** en un fichero:
/init
''/init'' analiza el código y genera ''AGENTS.md'' en la raíz: qué es el proyecto, arquitectura, dependencias y comandos habituales (arrancar, probar, construir). Se lee automáticamente en cada sesión.
* **Revísalo y edítalo a mano.** Lo que genera es un punto de partida, no la verdad.
* **Breve y concreto.** Ocupa contexto en todas las peticiones, así que cada línea de relleno se paga en cada prompt.
* **Va al repositorio**, como cualquier otro fichero del proyecto.
* Es un estándar abierto: el mismo ''AGENTS.md'' lo entienden otras herramientas.
Lo que escribas en el prompt **siempre manda** sobre lo que ponga en el fichero.
----
===== 6. La sesión y el contexto =====
Abajo, junto a la caja de entrada, hay un indicador con los tokens consumidos, el **porcentaje de contexto** ocupado y el coste. Sube siempre, porque en cada petición se manda de nuevo toda la conversación: el historial se paga entero cada vez.
^ Comando ^ Cuándo ^
| ''/compact'' | La conversación sigue siendo la buena pero el contexto va alto. Condensa el historial en un resumen (objetivo, restricciones, progreso) y sigues donde estabas. |
| ''/new'' | Cambias de tarea. Sesión nueva, contexto a cero. |
La regla práctica: **una sesión por tarea**. Arrastrar el historial de lo anterior no ayuda al modelo, lo despista y encima cuesta dinero.
Al cerrar OpenCode, la terminal imprime el nombre de la sesión y **el comando exacto para retomarla**. Cópialo y la recuperas entera, con su historial, al día siguiente.
----
===== 7. Chuleta =====
^ ^ ^
| ''opencode'' | Arrancar en la carpeta actual |
| ''/'' | Ver todos los comandos |
| ''Ctrl+P'' | Paleta de comandos |
| ''Tab'' | Cambiar entre Plan y Build |
| ''Esc Esc'' | Parar al agente |
| ''Mayús+Enter'' | Salto de línea |
| ''↑'' / ''↓'' | Historial de prompts |
| ''@fichero'' | Referenciar un fichero |
| ''!comando'' | Shell, sin gastar tokens |
| ''/connect'' | Conectar un proveedor |
| ''/models'' | Cambiar de modelo |
| ''/init'' | Generar ''AGENTS.md'' |
| ''/compact'' | Condensar el contexto |
| ''/new'' | Sesión nueva |
----
===== 8. Enlaces =====
* [[https://opencode.ai|opencode.ai]]
* [[https://github.com/sst/opencode|Repositorio]]
* [[https://agents.md|AGENTS.md]] — el estándar