La mayor parte del tiempo, comunicarse con Claude Code es simplemente escribir texto: describes una tarea, el agente la ejecuta, siguen conversando. Pero hay cuatro caracteres que funcionan de manera diferente. No son parte de un prompt ordinario: son prefijos que cambian el canal de comunicación, de la misma forma en que un @ en un mensaje de Slack no es texto sino una referencia, o en que // en Java no es código sino un comentario.
Estos cuatro caracteres son /, @, ! y #. La mayoría de los developers que empiezan a usar Claude Code conocen el / desde el principio porque es lo más visible. El @ lo descubren rápido. El ! y el # tienden a aparecer tarde en tutoriales o directamente en la documentación oficial, y son los que mayor impacto tienen en la fluidez del trabajo diario una vez que los incorporas.
En este artículo vemos los cuatro en detalle: qué hacen, cómo usarlos, cuándo no usarlos, y los errores más comunes.
Contenido
El mapa rápido: los cuatro caracteres
Activa comandos internos del agente. No genera respuesta conversacional; ejecuta una función específica de Claude Code.
Incluye el contenido de un archivo o directorio directamente en el contexto del prompt actual.
Ejecuta un comando bash en tu terminal y vuelca el output al contexto de la conversación.
Guarda la nota que escribas a continuación en el sistema de memoria, sin que el agente genere respuesta.
Los cuatro tienen en común que operan en una capa diferente a la conversación normal. Un prompt ordinario le dice al agente qué hacer; estos caracteres cambian cómo funciona la sesión en ese momento.
/ — Comandos internos del agente
El / es el más conocido y el más sencillo de explicar: es el prefijo de los slash commands, que son instrucciones directas al sistema de Claude Code, no prompts al modelo de lenguaje. Cuando escribes /compact, no le estás pidiendo al agente que haga algo inteligente; le estás dando una instrucción al runtime de Claude Code.
Los slash commands más importantes los vimos en artículos anteriores de la serie, pero aquí está el catálogo completo organizado por categoría:
| Comando | Categoría | Qué hace |
|---|---|---|
/help |
Sistema | Lista todos los comandos disponibles con descripción |
/exit |
Sistema | Termina la sesión actual |
/doctor |
Sistema | Diagnostica problemas de configuración del entorno |
/bug |
Sistema | Abre un reporte de bug hacia Anthropic desde la sesión |
/clear |
Contexto | Borra el historial de conversación por completo |
/compact |
Contexto | Resume la conversación para liberar espacio en el contexto |
/cost |
Contexto | Muestra el uso de tokens y costo estimado de la sesión |
/resume |
Sesiones | Abre el picker para retomar una sesión anterior |
/rename |
Sesiones | Renombra la sesión actual (sin args: nombre automático) |
/fork |
Sesiones | Crea una copia de la sesión en su estado actual |
/rewind |
Sesiones | Abre el menú de checkpoints para hacer rollback |
/export |
Sesiones | Exporta la sesión como texto plano al directorio actual |
/memory |
Memoria | Abre el panel para ver y editar los archivos de memoria |
/init |
Memoria | Analiza el proyecto y genera el CLAUDE.md inicial |
/permissions |
Configuración | Muestra y edita las reglas de permisos activas |
/hooks |
Configuración | Abre la interfaz para gestionar hooks desde la sesión |
/config |
Configuración | Muestra y edita la configuración general de Claude Code |
Slash commands personalizados
Además de los comandos del sistema, puedes crear tus propios slash commands para tareas que repites frecuentemente en tu proyecto. Son simplemente archivos Markdown guardados en .claude/commands/:
# .claude/commands/review.md
# Disponible como /project:review
Haz un code review del diff actual (git diff HEAD).
Enfócate en:
1. Violaciones de los estándares definidos en el CLAUDE.md
2. Posibles NullPointerExceptions sin manejar
3. Queries N+1 en los repositorios JPA
4. Métodos con complejidad ciclomática > 5
Formato: lista de hallazgos por archivo, con número de línea y severidad (crítico/mayor/menor).
Después de crear ese archivo, dentro de cualquier sesión puedes ejecutar /project:review y el agente correrá exactamente ese prompt, con toda la consistencia de una instrucción escrita en frío en lugar de redactada sobre la marcha.
Si guardas el comando en ~/.claude/commands/ en vez de .claude/commands/, estará disponible en todos tus proyectos como /user:nombre.
.claude/commands/ en Git y todo el equipo los tiene disponibles automáticamente.
@ — Incluir archivos en el contexto
Cuando el agente necesita ver un archivo para responder tu pregunta, lo normal es que lo busque solo: navega el árbol de directorios, lo lee, y lo incorpora al contexto. Eso funciona bien. Pero tiene un costo: el agente invierte varios pasos en encontrar el archivo correcto, y si el proyecto es grande o los nombres de archivo son ambiguos, puede terminar leyendo el archivo equivocado o pidiendo que le confirmes cuál querías.
El @ cortocircuita todo eso. Le dices exactamente qué archivo o directorio incluir, y su contenido entra al contexto en el mismo momento en que envías el prompt.
# Incluir un archivo específico
> @src/main/java/com/miapp/pagos/PaymentService.java
¿Por qué este servicio lanza una excepción no chequeada en el método charge()?
# Incluir múltiples archivos en el mismo prompt
> Compara la implementación de @src/main/java/com/miapp/auth/JwtService.java
con @src/main/java/com/miapp/auth/SessionService.java
y dime cuál tiene menos acoplamiento con la capa de datos
# Incluir un directorio completo
> @src/main/java/com/miapp/pedidos/
Hay un bug de concurrencia en algún lugar de este módulo.
Analiza todas las clases e identifica dónde podría estar.
Cuando usas @directorio/, Claude Code incluye los archivos que considera relevantes dentro de ese directorio, no necesariamente todos. Si el directorio tiene decenas de archivos, el agente hace una selección. Para asegurarte de que incluya todo, es mejor referenciar los archivos individualmente o usar la barra al final del path para indicar que quieres el directorio completo.
Autocompletado con Tab
Una de las cosas más cómodas del @: cuando escribes @src/ y presionas Tab, Claude Code autocompleta el path igual que lo haría tu terminal. Puedes navegar el árbol de archivos sin tener que recordar rutas completas de memoria.
Cuándo usar @ y cuándo no
| Situación | ¿Usar @? | Por qué |
|---|---|---|
| Pregunta sobre una clase específica | Sí | Más rápido y más preciso que esperar a que el agente lo encuentre |
| Comparar dos implementaciones | Sí | Garantiza que el agente ve exactamente los dos archivos que tú quieres |
| Análisis de arquitectura de todo el proyecto | No siempre | Incluir cientos de archivos de golpe consume mucho contexto; deja que el agente navegue el árbol selectivamente |
| Archivo de configuración o properties | Sí | Los archivos de config tienen nombres similares en distintas carpetas; el @ elimina la ambigüedad |
@ consume tokens directamente. Un archivo Java de 500 líneas puede consumir entre 800 y 1,500 tokens. Si incluyes varios archivos grandes en el mismo prompt, monitorea el contexto con /cost para no saturar la ventana.
! — Ejecutar bash y capturar el output
Este es el carácter especial más poderoso y el menos conocido. El prefijo ! convierte cualquier línea en un comando bash que se ejecuta inmediatamente en tu entorno local, y cuyo output entra al contexto de la conversación como si fuera parte de tu mensaje.
La diferencia con pedirle al agente que ejecute un comando es sutil pero importante: cuando escribes ! mvn test, eres tú quien ejecuta el comando con tus permisos y tu entorno (tus variables de entorno, tus aliases, tu versión de Maven). El output entra al contexto sin que el agente tenga que pedir permiso para ejecutar nada.
# Correr los tests y darle el output al agente para que lo analice
> ! mvn test 2>&1
Analiza los tests que fallaron e identifica la causa raíz
# Ver el estado de Git antes de pedir cambios
> ! git diff HEAD
Con base en estos cambios, redacta un mensaje de commit descriptivo
# Pasar el resultado de grep al agente
> ! grep -rn "TODO\|FIXME\|HACK" src/main/java/
Ordena estos pendientes por prioridad estimada y agrúpalos por módulo
# Verificar el árbol de dependencias antes de sugerir cambios
> ! mvn dependency:tree -q
¿Hay dependencias redundantes o conflictos de versión que debería resolver?
Por qué es diferente a "ejecuta este comando"
Cuando le pides al agente que ejecute un comando, el ciclo es: agente solicita permiso → tú apruebas → agente ejecuta → output entra al contexto. Con !, el ciclo es: tú ejecutas → output entra al contexto. La diferencia práctica en sesiones largas es notable: menos interrupciones de permisos, más fluidez.
Además, como se ejecuta en tu shell, tiene acceso a todo tu entorno: variables de entorno, aliases, versiones específicas de herramientas en tu PATH. El agente, cuando ejecuta comandos, usa un entorno más básico.
Usos avanzados
# Pasar el contenido de un archivo sin usar @
# (útil para archivos que @ no autocompleta bien, como archivos ocultos)
> ! cat .env.example
Genera el .env.local correspondiente con valores de desarrollo para este proyecto
# Combinar múltiples comandos
> ! git log --oneline -20 && echo "---" && git status
¿Qué cambios del historial reciente podrían haber introducido el bug que describí antes?
# Información del sistema cuando es relevante
> ! java -version && mvn --version
¿Hay algún problema de compatibilidad entre estas versiones y Spring Boot 3.2?
! env, ! cat .env o cualquier comando que vuelque credenciales, esa información entra al contexto de la sesión. Dependiendo de cómo uses Claude Code (con API de pago por uso, en CI, etc.), ese contexto puede estar en logs. Nunca uses ! con comandos que exponen secretos, tokens o credenciales reales.
! mvn test 2>&1 | tail -50 en lugar de volcar todo.
# — Escribir en memoria directamente
El # es el más discreto de los cuatro. Cuando escribes # al inicio de un mensaje, lo que sigue se guarda directamente en el sistema de memoria de Claude Code sin que el agente genere ninguna respuesta. No hay confirmación, no hay conversación, no hay tokens gastados en una respuesta. Solo se guarda la nota.
# Guardar una decisión arquitectónica tomada en la sesión
# El servicio de notificaciones usa el patrón Observer con Spring Events, no llamadas directas entre servicios
# Apuntar algo para la próxima sesión
# TODO: revisar el leak de conexiones en DatabaseConfig antes de la demo del viernes
# Registrar una restricción descubierta durante el trabajo
# Los archivos en src/legacy/ no deben modificarse sin aprobación del equipo de infraestructura
# Anotar el contexto de negocio que el agente necesitará en futuras sesiones
# El módulo de facturación tiene lógica específica para clientes enterprise: los descuentos se aplican en cascada, no de forma acumulativa
La nota queda en la Auto Memory del proyecto, en ~/.claude/projects/, y estará disponible en sesiones futuras. Puedes verla y editarla en cualquier momento con /memory.
La diferencia con pedirle al agente que "guarde en memoria"
En el artículo anterior vimos que puedes pedirle al agente que guarde cosas en memoria de forma conversacional: "Guarda en memoria que los DTOs van en el paquete .dto". Eso también funciona. La diferencia con el # es:
| Conversacional ("guarda en memoria...") | Prefijo # | |
|---|---|---|
| Respuesta del agente | Sí, confirma que guardó y puede hacer preguntas | No. Silencioso. |
| Tokens consumidos | Los de la respuesta de confirmación | Solo los de la nota misma |
| Control sobre el texto guardado | El agente puede reformular o resumir | Se guarda exactamente lo que escribiste |
| Cuándo usarlo | Cuando quieres que el agente procese y organice la información | Cuando sabes exactamente qué quieres guardar y quieres hacerlo sin interrumpir el flujo |
El caso de uso más natural del # es el equivalente a escribir una nota adhesiva en medio de una sesión de trabajo intensa: sin pausar la conversación, sin esperar una respuesta, solo dejar constancia de algo antes de que se te olvide.
Combinaciones: cuando se usan juntos
En la práctica, estos cuatro caracteres se combinan frecuentemente en el mismo flujo de trabajo. Aquí hay tres patrones de combinación que aparecen seguido:
! + @ : ejecutar y analizar con contexto
# Correr los tests, pasarle el output, y darle también la clase bajo análisis
> ! mvn test -pl módulo-pagos 2>&1 | grep -A5 "FAILED\|ERROR"
@src/main/java/com/miapp/pagos/PaymentProcessor.java
Los tests fallidos están todos relacionados con esta clase. Identifica el bug.
! + # : ejecutar y anotar el resultado
# Verificar la versión de Java en producción y anotarla para futuras sesiones
> ! ssh servidor-prod "java -version 2>&1"
# Producción corre Java 17.0.9; el proyecto local usa 21. Posible incompatibilidad con records.
/compact + @ : compactar y recuperar contexto específico
# Después de una sesión larga, compactar y luego reintroducir
# los archivos críticos para la tarea siguiente
/compact conserva solo el diseño de la API acordado
> @src/main/java/com/miapp/api/OrderController.java
Continuando desde donde lo dejamos: implementa el endpoint DELETE /orders/{id}
siguiendo el patrón de los otros endpoints de este controlador.
Errores comunes
Usar ! con comandos de output masivo
> ! mvn clean install
# Maven puede generar miles de líneas. Todo entra al contexto.
> ! mvn clean install 2>&1 | tail -30
# Solo las últimas 30 líneas: suficiente para ver si funcionó o por qué falló
Usar @ con directorios enormes esperando que incluya todo
> @src/
Analiza todo el proyecto
# src/ puede tener cientos de archivos. El agente selecciona un subconjunto,
# no necesariamente el que esperabas.
> @src/main/java/com/miapp/pedidos/
Analiza el módulo de pedidos específicamente
Confundir # con el inicio de un comentario Markdown
# Esto no es un encabezado del CLAUDE.md
# Cuando escribes # en el prompt de Claude Code, es un comando de memoria,
# no sintaxis Markdown. El agente no lo verá como texto de conversación.
Usar ! para comandos que exponen secretos
> ! cat .env
# Todo lo que .env contenga entra al contexto de la sesión
> ! grep -v "PASSWORD\|SECRET\|TOKEN\|KEY" .env
# Filtra las líneas sensibles antes de volcar al contexto
Olvidar que los slash commands son del sistema, no del modelo
> /explícame qué hace esta función
# /explícame no es un slash command del sistema. Claude Code lo intentará
# interpretar como comando y fallará o se comportará de forma inesperada.
> Explícame qué hace esta función
# Sin /: es un prompt normal al modelo
Conclusión
Los cuatro caracteres especiales de Claude Code no son sintaxis decorativa. Cada uno resuelve un problema de comunicación concreto que no tiene buena solución con texto ordinario:
/para acceder a funciones del sistema sin que el modelo las interprete como conversación@para ser preciso sobre qué código debe tener en contexto, sin depender de que el agente lo encuentre solo!para incorporar el estado real de tu entorno — tests, logs, diffs, configuración — al contexto sin pasar por el ciclo de permisos#para persistir conocimiento en memoria en el momento en que lo generas, sin interrumpir el flujo de trabajo
Incorporar los cuatro como parte del vocabulario natural de trabajo — especialmente el ! y el #, que son los más subestimados — cambia la calidad de las sesiones de trabajo de forma tangible. El agente tiene más contexto preciso, tú tienes menos interrupciones, y la memoria del proyecto se va construyendo de forma orgánica conforme trabajas.
En el próximo artículo de esta serie veremos los flujos de trabajo avanzados para proyectos Java: code reviews con Claude Code, generación de tests con JUnit 5 y Mockito, y cómo estructurar prompts específicamente para análisis de arquitectura Spring Boot.
© javatutoriales.com – Serie: Desarrollo Asistido por IA