Buenas Prácticas para Comandos, Hooks y Subagentes Personalizados
Estas son las convenciones que vale la pena adoptar una vez que un proyecto comienza a depender de comandos, hooks y subagentes personalizados más allá de un experimento único.
Cada regla a continuación refleja un modo de fallo real, un matcher ambiguo, un prompt de tarea vago, un hook que se ejecuta de manera demasiado amplia, que aparece rápidamente una vez que estos puntos de extensión se utilizan para trabajo real.
Cómo Usar Esta Lista
- Trata las reglas como valores predeterminados de los que desviarse deliberadamente, no como leyes, ya que la tolerancia al riesgo de cada proyecto difiere.
- Revisa las secciones de hooks y comandos cada vez que
settings.jsono.claude/commands/crezca más allá de un puñado de entradas; las convenciones decaen más rápido bajo una acumulación silenciosa. - Aplica las reglas de subagente por tarea, ya que la cantidad adecuada de delegación varía con la independencia y el tamaño real del trabajo.
- Empareja las reglas de PreToolUse con una lista real de rutas protegidas para tu proyecto; una regla sin un objetivo concreto no impone nada.
A - Nomenclatura y Descubrimiento
- Asigna a cada comando una
descriptionen su frontmatter. Sin ella, un comando es invisible en el autocompletado, y los compañeros de equipo recurren a reimplementar la misma solicitud desde cero. - Nombra los comandos por la acción, no por el solicitante.
/pre-reviewse lee claramente meses después;/chris-checkno sobrevive a la salida de la persona del equipo. - Mantén los nombres de archivo y slugs de los comandos estables una vez compartidos. Renombrar un comando rompe la memoria muscular de cada compañero de equipo y cualquier documentación que lo referencie por nombre.
- Agrupa comandos relacionados con un prefijo compartido cuando el conjunto crezca.
/pr-review,/pr-summarizey/pr-changelogse leen como una familia en el autocompletado; tres nombres no relacionados no lo hacen.
B - Delimitación del Alcance de los Matchers de Hooks
- Empareja los hooks con el conjunto de herramientas más estrecho que realice el trabajo. Un hook de formato necesita
Edit|Write, no un match sin delimitar en cada llamada a herramienta. - Prefiere un archivo de script dedicado sobre un comando en línea largo en settings.json. Un script es comprobable y comparable por sí solo; una línea única y extensa en JSON no lo es.
- Protege contra datos de eventos faltantes o mal formados antes de actuar. Un hook que asume que una ruta de archivo siempre está presente fallará ruidosamente, o silenciosamente, la primera vez que no lo esté.
- Mantén los hooks rápidos. Un hook PostToolUse se ejecuta en cada edición coincidente; uno lento (una suite de pruebas completa, una compilación grande) agrega esa latencia a cada edición individual, no solo a las que importan.
- Controla versiones de cada script de hook junto con el proyecto. Un hook que solo existe en la máquina de un contribuidor es un hook que el resto del equipo realmente no tiene.
C - Uso de PreToolUse para Límites Reales
- Reserva PreToolUse para reglas que deben cumplirse incluso contra un prompt engañoso. Cualquier cosa formulada como "esto nunca debería suceder" pertenece aquí, no en un paso de limpieza PostToolUse.
- Emite una decisión de bloqueo explícita, no solo un código de salida distinto de cero. Una respuesta estructurada
{"decision": "block", "reason": "..."}es la señal confiable; los códigos de salida solos pueden interpretarse de manera inconsistente. - Escribe razones de bloqueo para un humano que lea la transcripción más tarde. "Bloqueado" no explica nada; "esta ruta está protegida, pide a un humano que haga este cambio directamente" sí lo hace.
- Ancla los patrones de rutas protegidas a la estructura de directorios real, no solo a una extensión de archivo. Un patrón como
*.jsonque protege un archivo de bloqueo terminará bloqueando cada archivo JSON en el proyecto. - Empareja una protección PreToolUse con protecciones normales a nivel de repositorio. Un hook solo se activa dentro de la ruta de llamada a herramientas de Claude Code; no es un sustituto de la protección de ramas o los permisos de archivo aplicados en otros lugares.
D - Delegación de Trabajo a Subagentes
- Escribe los prompts de tareas de subagente como si el subagente no hubiera visto nada más. Porque no lo ha hecho; cualquier cosa que la sesión principal sepa y no repita simplemente no está disponible para el subagente.
- Delimita las herramientas de un subagente a lo que su trabajo realmente requiere. Un subagente de investigación que nunca edita archivos no debería tener
EditoWriteen su lista de herramientas, como cuestión de aplicación, no solo de orden. - Pide un resumen, no el contenido completo del archivo, en la instrucción de reporte. Un subagente que devuelve archivos completos al principal anula el propósito de ahorro de contexto de delegar en primer lugar.
- Solo distribuye subagentes en paralelo cuando las piezas sean genuinamente independientes. Una tarea donde un subagente necesita los hallazgos de otro primero debe ejecutarse secuencialmente, no concurrentemente.
- Empareja el número de subagentes paralelos con cuánta síntesis la sesión principal puede hacer realmente después. Generar más subagentes de los que puedes leer y combinar de manera significativa solo retrasa la respuesta.
- Reserva subagentes para tareas lo suficientemente grandes o aisladas como para justificar la sobrecarga. Una búsqueda de una línea rara vez necesita su propia ventana de contexto; una exploración de cuarenta pasos usualmente sí.
E - Evitar que los Tres Puntos de Extensión Colisionen
- No pidas a un hook que tome una decisión. Un hook no tiene razonamiento de modelo adjunto; si la decisión requiere sopesar el contexto, pertenece al prompt de un comando o a la tarea de un subagente, no a un script de shell.
- No uses un comando donde un hook garantizaría el resultado. Si algo debe suceder cada vez sin excepciones, un comando que un usuario debe recordar escribir es el mecanismo incorrecto; usa un hook en su lugar.
- Documenta cuál de los tres puntos de extensión utiliza una nueva automatización y por qué. Un miembro del equipo que depura un comportamiento inesperado necesita saber rápidamente si debe buscar en
.claude/commands/,settings.json, o una definición de subagente. - Revisa los hooks de
settings.jsony.claude/commands/juntos durante la incorporación. Ambos están controlados en el repositorio y ambos dan forma a lo que significa "escribir una solicitud" o "ocurrir una edición"; omitir cualquiera de ellos deja a un nuevo miembro del equipo con una imagen incompleta.
Preguntas Frecuentes
¿Cuál de estas reglas es más importante para un proyecto pequeño que recién comienza?
Asignar una description clara a los comandos y delimitar estrechamente los matchers de los hooks. Ambas son baratas de hacer desde el principio y caras de adaptar una vez que un proyecto ha acumulado una docena de comandos indocumentados o un hook demasiado amplio.
¿Está bien alguna vez omitir la escritura de una descripción para un comando?
Para un comando puramente personal y desechable, sí. Para cualquier cosa controlada en un repositorio compartido, omitirla significa que los compañeros de equipo no pueden descubrir que el comando existe sin abrir el archivo directamente.
¿Por qué la sección de nomenclatura advierte contra nombrar un comando por una persona?
Porque un comando sobrevive a la persona que lo escribió; un nombre ligado a la acción (/pre-review) se mantiene significativo mucho después de que un nombre ligado al autor (/chris-check) ha perdido su contexto.
¿Cuál es el error más común con los matchers de hooks?
Dejar el matcher sin delimitar, de modo que el hook se active en cada llamada a herramienta en lugar de solo en las herramientas que realmente le importan, agregando ruido y latencia a acciones no relacionadas.
¿Por qué la sección PreToolUse insiste en una decisión de bloqueo explícita en lugar de solo un código de salida distinto de cero?
Porque el manejo del código de salida puede variar según la configuración, mientras que una carga útil explícita {"decision": "block", "reason": "..."} es la forma inequívoca y documentada de señalar un bloqueo.
¿Debe cada archivo protegido tener su propia entrada de hook PreToolUse separada?
No. Un solo script de protección con una lista de patrones de rutas protegidas es más fácil de auditar en su conjunto que las mismas reglas dispersas en muchas entradas de hook separadas.
¿Cuándo es aceptable omitir la delimitación de las herramientas de un subagente?
Cuando la tarea del subagente realmente requiere el mismo acceso amplio que la sesión principal, como un subagente encargado explícitamente de realizar un conjunto coordinado de ediciones en varios archivos. La delimitación es un valor predeterminado, no un requisito absoluto.
¿Qué sucede si distribuyo subagentes en paralelo para una tarea que resulta tener una dependencia que olvidé?
El subagente que necesitaba la información faltante típicamente producirá un informe más débil o incorrecto, ya que no tiene forma de solicitar ese contexto a mitad de la tarea; detectar dependencias antes de generarlos evita esto.
¿Por qué la lista advierte contra pedirle a un hook que tome una decisión?
Porque un hook es un comando de shell sin razonamiento de modelo adjunto; pedirle que "decida" algo significa escribir lógica condicional frágil para aproximar una decisión que un comando o subagente podría razonar realmente.
¿Cómo cambian estas mejores prácticas entre un proyecto en solitario y un proyecto en equipo?
El razonamiento sigue siendo el mismo, pero el costo de omitirlas aumenta drásticamente en un equipo: un comando indocumentado o un hook demasiado amplio afecta a todos los que extraen el repositorio, no solo a la persona que lo escribió.
¿Existe una mejor práctica para revisar hooks y comandos a lo largo del tiempo?
Revísalos cada vez que settings.json o el directorio de comandos crezca más allá de un puñado de entradas, ya que las convenciones tienden a decaer silenciosamente a medida que se acumulan más automatizaciones sin que nadie audite el conjunto completo.
¿Se aplican estas prácticas por igual a los comandos con alcance de proyecto y con alcance de usuario?
La disciplina de nomenclatura y descripción es importante para ambos, pero el control de versiones de scripts y la documentación de qué punto de extensión está en uso son más importantes para los comandos y hooks con alcance de proyecto, ya que esos son los que comparte todo el equipo.
Relacionado
- Comandos, Hooks y Subagentes Personalizados: Para Qué Sirve Cada Uno - la distinción fundamental sobre la que se basan estas prácticas.
- Escribiendo Tu Primer Comando Personalizado con Frontmatter Markdown - donde las convenciones de nomenclatura y descripción se aplican directamente.
- Bloqueo de Ediciones de Archivos Riesgosas con un Hook PreToolUse - un ejemplo completo y funcional de las prácticas PreToolUse anteriores.
- Generación de Subagentes Paralelos para Tareas de Investigación Aisladas - las prácticas de distribución en un recorrido completo.
- Eventos Comunes de Hooks y Cuándo Usar Cada Uno - emparejar el evento de un hook con su trabajo real.
Versiones de Stack: Escrito contra la línea de modelos Claude actual a partir de ~junio de 2026 - Claude Fable 5, Claude Opus 4.8, Claude Sonnet 5 (el predeterminado) y Claude Haiku 4.5. Los nombres de modelos, precios y características del producto cambian rápidamente; verifica los detalles actuales en platform.claude.com/docs antes de confiar en ellos.