25 de marzo de 2026

Claude Code: Los cuatro caracteres especiales que cambian el modo de comunicación

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.


El mapa rápido: los cuatro caracteres

/
Slash commands

Activa comandos internos del agente. No genera respuesta conversacional; ejecuta una función específica de Claude Code.

@
Referencias de archivos

Incluye el contenido de un archivo o directorio directamente en el contexto del prompt actual.

!
Shell directo

Ejecuta un comando bash en tu terminal y vuelca el output al contexto de la conversación.

#
Escritura a memoria

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.

Tip: Los slash commands personalizados son ideales para rituales de equipo: code reviews, checklists de pre-release, generación de changelogs, análisis de cobertura de tests. Puedes versionar los de .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 Más rápido y más preciso que esperar a que el agente lo encuentre
Comparar dos implementaciones 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 Los archivos de config tienen nombres similares en distintas carpetas; el @ elimina la ambigüedad
Atención con el contexto: Incluir archivos grandes con @ 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 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?
Cuidado con secretos en el output: Si ejecutas ! 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.
Sobre el volumen del output: Si el comando produce miles de líneas (stack traces largos, logs de build verbosos), todo eso entra al contexto y puede saturarlo rápidamente. Para comandos verbosos, filtra el output antes: ! 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