Los comandos secretos de OpenCode
Llevas una semana con OpenCode. La TUI ya no te parece rara. Sabes pedirle cosas, ves cómo modifica archivos, entiendes más o menos qué hace cuando se pone a pensar.
Y entonces alguien te pregunta: “¿Ya usas /undo?”
Silencio.
Pasa con todas las herramientas. Hay una capa de funcionalidades que existe, está documentada, nadie la lee y tú la descubres por accidente o porque alguien te la señala con el dedo. Este post es ese dedo.
OpenCode tiene más de una docena de comandos en la TUI, varios modos de CLI que no aparecen en el onboarding, y un sistema de personalización que la mayoría de usuarios nunca activa. No porque sea complicado, sino porque cuando empiezas con una herramienta nueva te limitas a lo que necesitas para avanzar, y lo demás queda en el cajón.
Aquí he reunido los que más impacto tienen sobre el día a día: los que ahorran tiempo real, los que evitan frustraciones concretas y los que abren posibilidades que quizás no te habías planteado.
Lo que vas a encontrar aquí:
- Los slash commands del TUI que parecen secundarios y resultan ser imprescindibles
- Los operadores
@y!que funcionan sin barra - Combinaciones de CLI que ahorran tiempo real en scripts y automatizaciones
- Las variables de entorno que cambian el comportamiento de fondo
- Cómo crear tus propios comandos y, si quieres, pisar los built-in
Sin paja. Comando a comando.
Los slash commands que casi nadie activa ¶
Cuando estás dentro de la TUI, escribir / abre el menú de comandos. Los obvios los conoces: /new para empezar sesión, /help para ver opciones, /exit para salir. Bien.
Pero hay un grupo de comandos que no entran en ese primer vistazo y que, cuando los descubres, te preguntas cómo has estado trabajando sin ellos.
/details — ver qué narices está haciendo por dentro ¶
Este comando activa o desactiva los detalles de ejecución de herramientas. Por defecto están ocultos. Cuando los activas, ves exactamente qué archivos está tocando el modelo y qué comandos está lanzando antes de que los ejecute.
/details
Atajo: ctrl+x d
Útil sobre todo cuando algo falla y no entiendes por qué. En lugar de mirar el resultado y rascarte la cabeza, ves el proceso completo: qué buscó, qué leyó, qué intentó escribir. El debug clásico, pero del agente.
También es útil en el sentido contrario: cuando el proceso sí funciona pero quieres entender cómo lo está haciendo para aprender. Ver qué herramientas usa el modelo para una tarea concreta da mucha información sobre cómo plantear los prompts futuros de forma más eficiente. Si ves que siempre empieza leyendo el mismo archivo, quizás tiene sentido incluirlo directamente en el contexto con @ desde el principio.
/compact — cuando el contexto se convierte en un problema ¶
Cada mensaje que añades a la sesión consume contexto. Con proyectos grandes o sesiones largas, llegas a un punto donde el modelo empieza a perder el hilo porque tiene demasiado que procesar. El síntoma más habitual es que empieza a repetirse o a ignorar cosas que ya dijiste.
/compact (o su alias /summarize) compacta toda la conversación en un resumen y libera contexto. El modelo no pierde el estado general del trabajo, pero deja de arrastrar cada mensaje individual.
/compact
Atajo: ctrl+x c
💡 Si notas que OpenCode empieza a “olvidar” cosas que ya había hecho o repite preguntas que ya respondiste, es el momento de ejecutar
/compact. No esperes a que el contexto esté lleno del todo.
/undo y /redo — el historial de verdad ¶
Esto no es el historial del chat. Esto es deshacer de verdad.
/undo revierte el último mensaje y todos los cambios en archivos que ese mensaje generó. No queda rastro. Si el modelo tocó tres archivos y borró una función, /undo lo devuelve todo al estado anterior.
/undo
/redo
Atajos: ctrl+x u / ctrl+x r
El detalle importante: internamente usa Git para gestionar los cambios de archivos. Tu proyecto tiene que ser un repositorio Git para que esto funcione. Si no lo es, el undo de mensajes funciona, pero los cambios en archivos no se revierten.
/thinking — razonamiento visible (con matiz) ¶
Activa o desactiva la visualización de los bloques de razonamiento para modelos que los soportan. Cuando está activo, puedes ver el proceso de pensamiento del modelo antes de la respuesta.
/thinking
Hay un matiz que vale la pena entender: este comando solo controla si los bloques de razonamiento se muestran. No activa ni desactiva las capacidades de razonamiento del modelo. Para cambiar entre variantes de razonamiento (básico, avanzado), el atajo es ctrl+t.
/sessions — cambiar de proyecto sin cerrar nada ¶
Lista todas las sesiones disponibles y te permite cambiar entre ellas. También responde a /resume y /continue, por si te resulta más intuitivo.
/sessions
Atajo: ctrl+x l
Útil si trabajas con varios proyectos en paralelo o si tienes sesiones antiguas con contexto que quieres recuperar sin empezar desde cero.
/editor y /export — salir del TUI cuando lo necesitas ¶
Estos dos son para los momentos donde el TUI se queda pequeño.
/editor abre tu editor externo (el que tengas en la variable EDITOR) para escribir prompts largos con comodidad. Cambios de línea, estructuras complejas, instrucciones con varios pasos: mucho más manejable que la caja de texto del TUI.
/export exporta toda la conversación actual a Markdown y la abre en el mismo editor. Para guardar un análisis, compartir lo que hizo el agente con alguien, o simplemente tener un registro legible.
/editor → ctrl+x e
/export → ctrl+x x
Para que funcionen necesitas tener la variable EDITOR configurada en tu shell:
# En ~/.zshrc o ~/.bashrc
export EDITOR=nvim
# Para VS Code con modo bloqueo
export EDITOR="code --wait"
/share y /unshare — compartir una sesión con alguien ¶
Publica la sesión actual en una URL accesible. Útil para pedir ayuda, hacer una revisión con otro desarrollador o simplemente guardar algo que quieres poder abrir desde el navegador.
/share
/unshare
La URL generada es accesible para cualquier persona que la tenga. No es privada. Si compartiste algo que no deberías, /unshare lo retira.
Los operadores que no llevan barra ¶
Hay dos formas de interactuar con OpenCode que no son comandos slash pero son igual de potentes. Y mucha gente las desconoce.
El operador @ para referenciar archivos ¶
Escribe @ seguido de cualquier parte del nombre de un archivo y OpenCode hace una búsqueda difusa en el directorio actual. Cuando seleccionas el archivo, su contenido se añade al contexto de forma automática.
¿Cómo se gestiona la autenticación en @src/api/auth.ts?
Puedes combinar varias referencias en el mismo mensaje:
Compara la lógica de @src/models/User.ts con @src/models/Admin.ts
No hace falta pegar el contenido manualmente. No hace falta copiar rutas. Solo @ y las primeras letras del archivo.
El operador ! para inyectar output de comandos ¶
Si empiezas un mensaje con !, OpenCode ejecuta ese comando de shell y añade el output como contexto de la conversación.
!git log --oneline -10
!npm test
El resultado aparece como un tool result en la sesión. A partir de ahí puedes hacer preguntas o pedir acciones basadas en ese output.
!git diff HEAD~1
¿Hay algo en este diff que debería revisar antes de hacer merge?
Los agentes de código cambian rápido y cada semana aparecen trucos nuevos. Cada domingo, +5.800 developers compartimos lo que vamos descubriendo sobre IA y desarrollo. Gratis, desde 2018.
Quiero esa dinamita 🧨CLI: los flags que no están en los tutoriales ¶
El CLI de OpenCode tiene un modo interactivo (el TUI) y un modo no interactivo con opencode run. El segundo tiene combinaciones que no aparecen en los primeros pasos y que abren posibilidades para scripts y automatizaciones.
opencode run --attach — evitar el arranque en frío ¶
Cada vez que ejecutas opencode run arranca un servidor nuevo. Si tienes servidores MCP configurados, ese boot tarda. Con --attach puedes levantar el servidor una sola vez y conectarte desde múltiples ejecuciones.
# Terminal 1: levanta el servidor una vez
opencode serve
# Terminal 2: ejecuta prompts sin coste de arranque
opencode run --attach http://localhost:4096 "Explica cómo funciona el sistema de caché"
opencode run --attach http://localhost:4096 "Genera tests para el módulo de autenticación"
En pipelines de CI o en scripts que encadenan varias llamadas, la diferencia de tiempo es notable.
opencode stats --models N — el desglose que está oculto ¶
opencode stats muestra el uso de tokens y coste por sesión. Lo que no aparece por defecto es el desglose por modelos. Para verlo tienes que pasar explícitamente cuántos quieres mostrar:
# Muestra los 10 modelos más usados
opencode stats --models 10
También puedes filtrar por proyecto o por número de días:
opencode stats --days 30 --models 5
opencode stats --project mi-proyecto --models 10
Útil si usas varios modelos y quieres saber dónde se va el presupuesto de tokens.
opencode models --refresh — actualizar la caché cuando añaden modelos nuevos ¶
OpenCode cachea la lista de modelos disponibles. Si acaban de añadir un modelo nuevo a un proveedor y no te aparece, la solución es sencilla:
opencode models --refresh
También puedes filtrar por proveedor y añadir --verbose para ver metadatos como el coste por token:
opencode models anthropic --verbose
opencode session list — gestionar sesiones desde fuera del TUI ¶
Para scripts o para tener una visión limpia de lo que tienes guardado:
# Lista en formato tabla
opencode session list
# Lista en JSON para procesar con jq u otras herramientas
opencode session list --format json
# Solo las 5 más recientes
opencode session list -n 5
Las variables de entorno que cambian el comportamiento de fondo ¶
OpenCode tiene una lista de variables de entorno que no aparecen en el onboarding pero que pueden cambiar cosas importantes sobre cómo funciona. Algunas de las más útiles:
Para controlar el contexto y la compactación:
# Desactiva la compactación automática
OPENCODE_DISABLE_AUTOCOMPACT=true opencode
Para control sobre Claude Code:
# No lee nada de .claude/ (ni prompt ni skills)
OPENCODE_DISABLE_CLAUDE_CODE=true opencode
# Solo desactiva las skills, mantiene el CLAUDE.md
OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=true opencode
# Solo desactiva el CLAUDE.md de ~/.claude/
OPENCODE_DISABLE_CLAUDE_CODE_PROMPT=true opencode
Estas tres son especialmente útiles cuando quieres probar cómo se comporta el agente sin la capa de contexto de Claude Code, o cuando tienes un conflicto entre tu configuración de .claude/ y un proyecto específico.
Para configuración dinámica:
# Pasa configuración como JSON inline, sin fichero
OPENCODE_CONFIG_CONTENT='{"provider":{"anthropic":{"apiKey":"sk-..."}}}' opencode run "hola"
🔐 La variable
OPENCODE_SERVER_PASSWORDactiva autenticación básica HTTP cuando usasopencode serveoopencode web. El usuario por defecto esopencode, pero puedes cambiarlo conOPENCODE_SERVER_USERNAME. Si expones el servidor en red, es el primer sitio donde poner freno.
Comandos personalizados: cuando los built-in no son suficientes ¶
OpenCode permite crear tus propios comandos y asociarles un prompt, un agente específico y hasta un modelo concreto. Los defines como archivos Markdown con frontmatter.
Cómo crear un comando ¶
Crea un archivo en .opencode/commands/ con el nombre del comando:
.opencode/commands/review-pr.md
---
description: Revisa los cambios del PR actual
agent: build
model: anthropic/claude-sonnet-4-5
---
Commits recientes:
!`git log --oneline -10`
Cambios actuales:
!`git diff main`
Revisa estos cambios y señala posibles problemas de lógica,
rendimiento o seguridad. Sé concreto.
Desde la TUI:
/review-pr
Comandos con argumentos ¶
Usa $ARGUMENTS o posicionales $1, $2, etc.:
.opencode/commands/explain.md
---
description: Explica un concepto técnico en detalle
---
Explica $ARGUMENTS con ejemplos prácticos en código.
Asume que quien lee tiene experiencia con JavaScript/TypeScript.
Uso:
/explain closures en JavaScript
/explain el patron repository
Comandos globales vs por proyecto ¶
Los comandos en ~/.config/opencode/commands/ están disponibles en todos tus proyectos. Los de .opencode/commands/ son solo para ese proyecto. Puedes tener ambos a la vez.
Pisar un built-in (con cuidado) ¶
Si creas un comando con el mismo nombre que uno built-in, el tuyo gana. Es la forma de modificar el comportamiento por defecto de /init, por ejemplo, para que genere un AGENTS.md con tu propia plantilla en lugar del genérico.
⚠️ Esto puede ser una trampa si no lo tienes claro. Si de repente
/undono funciona como esperas, comprueba si tienes un archivoundo.mden alguna de las carpetas de comandos.
opencode serve + API HTTP — el modo automatización total ¶
Cuando opencode serve arranca en modo headless, no solo sirve de backend para el TUI. Expone una API HTTP completa con endpoints para todo lo que puedes hacer desde la interfaz.
opencode serve --port 4096
Desde ahí puedes, entre otras cosas, ejecutar slash commands por HTTP o lanzar comandos de shell contra una sesión activa. Esto abre la puerta a automatizaciones que van más allá del uso manual.
La documentación del servidor está en opencode.ai/docs/server y describe el esquema OpenAPI completo. Vale la pena echarle un vistazo si tienes en mente integrar OpenCode en un pipeline más amplio.
Un caso de uso concreto: tienes un proceso de revisión de código que siempre sigue los mismos pasos. En lugar de hacerlo a mano cada vez, levantas un servidor, lanzas los comandos necesarios por HTTP y procesas el resultado como JSON.
# Arranca el servidor en segundo plano
opencode serve --port 4096 &
# Ejecuta un prompt y obtén el resultado en JSON
opencode run --attach http://localhost:4096 \
--format json \
"Revisa los tests del módulo de autenticación y lista los casos que faltan"
El flag --format json hace que el output sean eventos JSON raw en lugar del formato visual del TUI. Útil para integraciones donde necesitas procesar la respuesta programáticamente.
De la API HTTP a los comandos personalizados, OpenCode tiene más fondo del que parece. Cada semana seleccionamos 12 recursos sobre productividad con IA y herramientas para developers. Ya somos +5.800.
Apúntate gratis →opencode import y opencode export — sesiones portátiles ¶
Hay dos comandos del CLI que tampoco aparecen en los primeros tutoriales y que son muy prácticos para trabajo en equipo.
opencode export guarda una sesión completa como JSON:
# Exporta una sesión específica
opencode export abc123
# Si no pasas ID, te muestra un selector
opencode export
opencode import hace el proceso inverso. Acepta un fichero local o una URL de share:
# Desde un fichero
opencode import sesion-revisada.json
# Desde una URL compartida
opencode import https://opncd.ai/s/abc123
Esto resuelve un problema concreto: un compañero ha hecho un análisis de arquitectura con OpenCode, quiere que lo revises y añadas tu feedback. En lugar de copiar y pegar texto, te pasa el export y tú continúas exactamente donde lo dejó.
/init — el comando que construye tu contexto de proyecto ¶
Este es el más infravalorado de todos los built-in. No hace algo tan dramático como /undo, pero tiene un impacto silencioso en la calidad de todas las sesiones siguientes.
/init analiza el proyecto actual y genera (o actualiza) un archivo AGENTS.md en la raíz. Ese archivo es el contexto que el modelo va a leer al inicio de cada sesión: qué tipo de proyecto es, cómo está estructurado, qué convenciones usa, qué no debe tocar.
/init
Atajo: ctrl+x i
La primera vez que lo ejecutas en un proyecto nuevo, el resultado es un AGENTS.md básico. Con el tiempo puedes editarlo a mano para añadir instrucciones específicas: qué patrones prefiere el equipo, cómo se nombran los archivos, qué partes del código son críticas y hay que tratar con cuidado.
# AGENTS.md
## Estructura del proyecto
- `src/api/` — endpoints REST, no modificar sin tests
- `src/models/` — modelos de base de datos con Prisma
- `src/utils/` — funciones de utilidad compartidas
## Convenciones
- Nombres de variables en camelCase
- Comentarios en español
- Tests obligatorios para cualquier función en `src/api/`
## Nunca hacer
- No modificar directamente los archivos de migración de Prisma
- No instalar dependencias sin actualizar el README
Cuanto más detallado es tu AGENTS.md, menos necesitas repetirte en cada sesión. Si usas Claude Code, el equivalente es el CLAUDE.md — y tiene sus propios comandos secretos que merecen una mirada.
La combinación que más cambia el flujo de trabajo ¶
Si tuvieras que quedarte con una sola cosa de este post, que sea esta:
/undo + /redo con Git + comandos personalizados para tareas repetitivas.
Es el combo que convierte OpenCode en algo más que un chat con contexto. Puedes experimentar, deshacer si algo no queda bien, y ejecutar procesos completos con un único comando que ya tienes afinado para tu proyecto.
La mayoría de las herramientas de agentes de código en terminal tienen una curva donde los primeros días son de asombro y los siguientes de frustración cuando las cosas no salen como esperabas. Conocer estos comandos no elimina esa curva, pero la acorta bastante.
Preguntas frecuentes sobre los comandos de OpenCode ¶
¿Dónde se guardan los comandos personalizados globales?
En ~/.config/opencode/commands/. Los de proyecto van en .opencode/commands/ dentro del directorio del proyecto.
¿/undo funciona si no tengo Git?
El deshacer de mensajes funciona siempre. La reversión de cambios en archivos requiere que el proyecto sea un repositorio Git. Sin Git, los archivos modificados no se restauran.
¿Qué pasa si el compacto de /compact pierde información importante?
El resumen mantiene el estado general del trabajo, pero puede perder detalles específicos de mensajes anteriores. Si hay algo crítico que el modelo necesita recordar, añádelo explícitamente en el siguiente mensaje o inclúyelo en AGENTS.md.
¿Puedo usar @ para referenciar archivos fuera del directorio del proyecto?
No directamente. La búsqueda difusa de @ está limitada al directorio de trabajo actual. Para archivos externos puedes usar el operador ! con cat o cp para traerlos al contexto.
¿/thinking está disponible con todos los modelos?
Solo con modelos que soporten razonamiento extendido, como Claude con extended thinking o modelos de la familia o1/o3 de OpenAI. Con el resto, el comando no hace nada visible.
¿Cómo sé qué modelo estoy usando en cada momento?
Puedes usar /models para ver los disponibles y comprobar cuál está activo. En el CLI, opencode models --verbose muestra metadatos incluyendo coste por token.
¿Las variables de entorno como OPENCODE_DISABLE_AUTOCOMPACT persisten entre sesiones?
Solo si las añades a tu perfil de shell (~/.zshrc, ~/.bashrc). Si las pasas inline al comando, solo afectan a esa ejecución concreta.
12 recursos para developers cada domingo en tu bandeja de entrada
Además de una skill práctica bien explicada, trucos para mejorar tu futuro profesional y una pizquita de humor útil para el resto de la semana. Gratis.