Newsletter para devsEntra

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_PASSWORD activa autenticación básica HTTP cuando usas opencode serve o opencode web. El usuario por defecto es opencode, pero puedes cambiarlo con OPENCODE_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 /undo no funciona como esperas, comprueba si tienes un archivo undo.md en 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.


Imagen de Daniel Primo
Claude, IA de Anthropic

Escrito con la ayuda de la IA generativa de Claude, fuentes fidedignas y con un human in the loop:
Dani Primo.

CEO en pantuflas de Web Reactiva. Programador y formador en tecnologías que cambian el mundo y a las personas. Activo en linkedin, en substack y canal @webreactiva en telegram

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.