Blog
Tutorials·14 min read

Dominar Claude Code Parte 4: Comandos Personalizados

Construye tu biblioteca personal de comandos. Convierte flujos de trabajo complejos en una sola pulsación de tecla con comandos slash personalizados, argumentos, frontmatter y hooks.

Jo Vinkenroye·January 15, 2026
Dominar Claude Code Parte 4: Comandos Personalizados

Algo que noté después de unas semanas usando Claude Code: seguía escribiendo los mismos prompts una y otra vez. "Revisa este código por problemas de seguridad." "Genera tests siguiendo los patrones del proyecto." "Crea un commit con un buen mensaje."

Yo escribiendo "revisa este código por problemas de seguridad" por 47.ª vez - Otra vez
Yo escribiendo "revisa este código por problemas de seguridad" por 47.ª vez - Otra vez

Cada prompt repetido son pulsaciones de tecla desperdiciadas. Los comandos slash personalizados solucionan eso.

¿Qué Son los Comandos Personalizados?

Los comandos personalizados son archivos markdown que se convierten en comandos slash. Pon un archivo llamado review.md en la carpeta correcta, y de repente /review es un comando que puedes ejecutar en cualquier momento.

.claude/commands/
├── review.md → /review
├── test.md → /test
└── git/
├── commit.md → /git:commit
└── pr.md → /git:pr

La magia: estos comandos pueden aceptar argumentos, especificar qué herramientas puede usar Claude, definir hooks que se ejecutan automáticamente, e incluso forzar un modelo específico. No son solo prompts guardados—son flujos de trabajo programables.

Tu Primer Comando en 60 Segundos

Paso 1: Crea el Directorio

Mkdir -p .claude/commands

Paso 2: Crea un Archivo de Comando

Cat > .claude/commands/review.md << 'EOF'
Review the staged changes for:
- Security vulnerabilities
- Performance issues
- Missing error handling
- Type safety problems
Format as: Critical (must fix) → Warnings → Suggestions
EOF

Paso 3: Úsalo

/review

Eso es todo. Claude ejecuta tus instrucciones como si las hubieras escrito manualmente.

Argumentos: Haciendo los Comandos Dinámicos

Los comandos estáticos son útiles, pero los comandos dinámicos son poderosos. El placeholder $ARGUMENTS captura todo lo que viene después del nombre del comando.

Argumentos Básicos

# .claude/commands/explain.md
Explain how $ARGUMENTS works in this codebase.
Show me the key files, the data flow, and any gotchas.

Uso:

/explain the authentication system
/explain the payment processing flow
/explain how websockets connect to the backend

Lo que escribas después de /explain se convierte en $ARGUMENTS.

Argumentos Posicionales

¿Necesitas más control? Usa $1, $2, $3 para posiciones específicas:

# .claude/commands/fix-issue.md
Fix GitHub issue #$1.
Priority: $2
Additional context: $3
1. Read the issue description
2. Find the relevant code
3. Implement the fix
4. Write tests
5. Create a commit referencing the issue

Uso:

/fix-issue 1234 high "user reported login failures on mobile"

Aquí $1 = "1234", $2 = "high", $3 = "user reported login failures on mobile".

Frontmatter: Los Superpoderes de los Comandos

El verdadero poder viene del frontmatter YAML en la parte superior de tu archivo de comando. Te permite configurar permisos, hints, modelos y más.

Lo Básico

---
Description: Review code for security issues
Argument-hint: [file-or-directory]
---
Review $ARGUMENTS for security vulnerabilities including:
- SQL injection
- XSS
- Authentication bypasses

La description aparece cuando ejecutas /help. El argument-hint le dice a los usuarios qué pasar.

Pre-Aprobación de Permisos de Herramientas

¿Cansado de aprobar los mismos comandos git cada vez? Usa allowed-tools:

---
Description: Smart git commit
Allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*), Bash(git diff:*)
Argument-hint: [optional message]
---
Analyze the staged changes and create a commit.
If a message is provided, use it: $ARGUMENTS
Otherwise, generate a descriptive message following conventional commits.
Requirements:
- Use format: type(scope): description
- Keep summary under 72 characters
- Body explains WHY, not WHAT

Ahora /git:commit se ejecuta sin prompts de permisos para esos comandos git específicos.

Forzar un Modelo Específico

Algunos comandos funcionan mejor con modelos específicos:

---
Description: Deep architecture analysis
Model: claude-sonnet-4-5-20250929
---
Analyze the architecture of $ARGUMENTS.
Consider:
- Design patterns in use
- Coupling between modules
- Scalability implications
- Technical debt indicators

Usa Haiku para tareas rápidas, Sonnet para trabajo equilibrado, Opus para razonamiento complejo:

---
Description: Quick code explanation
Model: claude-3-5-haiku-20241022
---
Briefly explain what $ARGUMENTS does in 2-3 sentences.

Hooks en Comandos

Los comandos pueden definir sus propios hooks que se ejecutan durante la ejecución:

---
Description: Format and commit
Hooks:
PostToolUse:
- matcher: "Edit|Write"
hooks:
- type: command
command: "npx prettier --write $FILE_PATH"
---
Make the requested changes to $ARGUMENTS.
After each edit, files will be auto-formatted.

Esto ejecuta Prettier después de cada edición de archivo—pero solo mientras este comando está activo.

Espacios de Nombres con Directorios

Organiza comandos relacionados en subdirectorios. El nombre de la carpeta se convierte en un espacio de nombres:

.claude/commands/
├── git/
│ ├── commit.md → /git:commit
│ ├── pr.md → /git:pr
│ ├── branch.md → /git:branch
│ └── squash.md → /git:squash
├── test/
│ ├── unit.md → /test:unit
│ ├── e2e.md → /test:e2e
│ └── coverage.md → /test:coverage
└── docs/
├── readme.md → /docs:readme
└── api.md → /docs:api

Esto mantiene la salida de /help organizada y los comandos fáciles de descubrir.

Comandos Globales vs de Proyecto

Comandos de Proyecto (Equipo)

Tu-proyecto/.claude/commands/
  • Disponibles solo en este proyecto
  • Commitéalos a git—todo el equipo los recibe
  • Ideales para flujos de trabajo específicos del proyecto

Comandos Personales (Tú)

~/.claude/commands/
  • Disponibles en todos los proyectos
  • Potenciadores de productividad personal
  • No se comparten con el equipo

División Recomendada

Mantén como global (personal):

  • /explain — Explicación universal de código
  • /debug — Proceso sistemático de depuración
  • /review — Lista de verificación general de code review

Mantén como específico del proyecto (equipo):

  • /deploy — Tus pasos de despliegue
  • /test:e2e — Tu configuración de tests
  • /git:commit — Las convenciones de commits de tu equipo
  • /onboard — Contexto específico del proyecto para nuevos devs

10 Comandos que Vale la Pena Copiar

Aquí tienes comandos probados en batalla. Cópialos, modifícalos, hazlos tuyos.

Los Diez Mandamientos de Claude Code
Los Diez Mandamientos de Claude Code

1. /review — Code Review

---
Description: Comprehensive code review
Argument-hint: [file or leave empty for staged changes]
---
Review $ARGUMENTS (or staged changes if not specified).
## Check For
- Security: OWASP Top 10, auth issues, data exposure
- Performance: N+1 queries, memory leaks, blocking calls
- Correctness: Edge cases, error handling, type safety
- Maintainability: Complexity, naming, duplication
## Output Format
### 🚨 Critical (blocks merge)
### ⚠️ Warnings (should fix)
### 💡 Suggestions (nice to have)

2. /git:commit — Commits Inteligentes

---
Description: Analyze changes and create commit
Allowed-tools: Bash(git *)
---
1. Run `git diff --staged` to see changes
2. Analyze what was changed and why
3. Create a commit message:
- Format: type(scope): description
- Types: feat, fix, refactor, docs, test, chore
- Under 72 chars
- Body explains WHY if non-obvious
4. Execute the commit

3. /test:generate — Creación de Tests

---
Description: Generate comprehensive tests
Argument-hint: [file-to-test]
---
Generate tests for $ARGUMENTS.
## Include
- Happy path (expected usage)
- Edge cases (empty, null, boundaries)
- Error scenarios (invalid input, failures)
- Integration points (mocks for external deps)
## Requirements
- Match existing test patterns in this project
- Use the testing framework already in use
- Clear test names: "should [expected] when [condition]"

4. /debug — Depuración Sistemática

---
Description: Debug an issue systematically
Argument-hint: [description of the problem]
---
Debug: $ARGUMENTS
## Process
1. Clarify: What's expected vs actual behavior?
2. Reproduce: What triggers the issue?
3. Isolate: Which component/function is responsible?
4. Trace: Follow the data flow
5. Fix: Implement and verify the solution
## Output
- Root cause
- Affected code paths
- Fix with explanation
- Prevention strategy

5. /security — Auditoría de Seguridad

---
Description: Security vulnerability scan
Argument-hint: [file, directory, or leave empty for full scan]
Allowed-tools: Read, Grep, Glob
---
Audit $ARGUMENTS for security vulnerabilities.
## Check For
- Injection: SQL, command, XSS, template
- Auth: Weak passwords, session issues, CSRF
- Data: Exposure, logging secrets, insecure storage
- Config: Debug mode, default creds, missing headers
- Dependencies: Known CVEs
## Output
Severity-ranked findings with:
- Location (file:line)
- Risk explanation
- Remediation steps

6. /refactor — Mejora de Código

---
Description: Refactor while maintaining behavior
Argument-hint: [file-or-function]
---
Refactor $ARGUMENTS.
## Goals
- Reduce complexity
- Improve readability
- Apply DRY
- Better naming
- Smaller functions (single responsibility)
## Constraints
- NO behavior changes
- Keep public API intact
- Existing tests must pass
Explain each change.

7. /explain — Explicación de Código

---
Description: Explain code for someone new
Argument-hint: [file, function, or concept]
Model: claude-3-5-haiku-20241022
---
Explain $ARGUMENTS.
## Cover
- What it does (purpose)
- How it works (step by step)
- Why it's designed this way
- Dependencies and side effects
- Potential gotchas
Assume reader knows the language but not this codebase.

8. /optimize — Análisis de Rendimiento

---
Description: Analyze and optimize performance
Argument-hint: [file-or-function]
---
Analyze $ARGUMENTS for performance.
## Examine
- Time complexity (Big O)
- Space complexity
- I/O operations
- Database queries (N+1?)
- Unnecessary allocations
## Output
- Current bottlenecks
- Specific optimizations
- Expected improvement
- Trade-offs involved

9. /ship — Lista de Verificación Pre-Despliegue

---
Description: Pre-deployment verification
Allowed-tools: Bash(npm *), Bash(git *)
---
Pre-deploy checklist:
- [ ] Tests pass (`npm test`)
- [ ] Lint clean (`npm run lint`)
- [ ] Build succeeds (`npm run build`)
- [ ] No console.log/debugger statements
- [ ] Env vars documented
- [ ] No hardcoded secrets
- [ ] Error handling complete
- [ ] Migrations ready
Run checks and report: Ready 🚀 or Blocked 🛑 with issues.

10. /catchup — Restauración de Contexto

Este comando implementa el patrón /clear + /catchup de la Parte 2 para una gestión eficiente del contexto.

---
Description: Rebuild context after /clear
Allowed-tools: Bash(git *)
---
I just cleared context. Help me catch up.
1. Run `git diff main...HEAD --stat` to see what's changed
2. Summarize the changes on this branch
3. Read the key modified files
4. Tell me where we likely are in this feature
$ARGUMENTS (if any additional context)

Más Allá del Código: Comandos Creativos

Los comandos no se limitan a flujos de trabajo de código. Puedes integrar cualquier API o servicio que Claude pueda llamar. Aquí tienes dos que usé mientras escribía esta misma serie de blog:

/meme — Generar Memes

---
Description: Generate a meme using Imgflip API
Argument-hint: "top text" "bottom text" [template]
---
Generate a meme using the Imgflip API.
## API Details
- Endpoint: https://api.imgflip.com/caption_image
- Username: $IMGFLIP_USER
- Password: $IMGFLIP_PASS
## Popular Templates
- drake (181913649) - Drake Hotline Bling
- distracted (112126428) - Distracted Boyfriend
- changemymind (129242436) - Change My Mind
- twobuttons (87743020) - Two Buttons
- pikachu (155067746) - Surprised Pikachu
## Instructions
1. Parse the arguments: $ARGUMENTS
2. Use curl to POST to the API with template_id, text0, text1
3. Return the generated meme URL
4. Download to ./public/assets/blog/ if requested

Usé esto para generar el meme del "distracted boyfriend" en la Parte 5 — un desarrollador distraído por "simplemente publícalo" mientras "escribe tests primero" mira con desaprobación.

/imagen — Generación de Imágenes con IA

Este es uno de mis favoritos. La API Imagen de Google te permite generar imágenes directamente desde Claude Code. Aquí tienes una implementación completa:

---
Description: Generate an image using Google Imagen
Argument-hint: "prompt" [output-path]
Allowed-tools: Bash(node *)
---
Generate an image using Google Imagen.
## Instructions
1. Parse the prompt from: $ARGUMENTS
2. Run: node ~/.claude/scripts/generate-image.js "prompt" "./output.png"
3. Report the saved file path

La verdadera magia está en el script. Aquí tienes una implementación completa que puedes colocar en ~/.claude/scripts/generate-image.js:

#!/usr/bin/env node
Const https = require('https');
Const fs = require('fs');
Const path = require('path');
Const API_KEY = process.env.GOOGLE_AI_API_KEY || 'your-api-key-here';
// Note: Check https://ai.google.dev/gemini-api/docs/imagen for the latest model ID
Const MODEL = 'imagen-4.0-generate-001';
Async function generateImage(prompt, outputPath) {
const requestBody = {
instances: [{ prompt }],
parameters: {
sampleCount: 1,
aspectRatio: '16:9',
personGeneration: 'dont_allow'
}
};
const body = JSON.stringify(requestBody);
const options = {
hostname: 'generativelanguage.googleapis.com',
port: 443,
path: `/v1beta/models/${MODEL}:predict?key=${API_KEY}`,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(body)
}
};
return new Promise((resolve, reject) => {
const req = https.request(options, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
const response = JSON.parse(data);
if (response.error) {
reject(new Error(response.error.message));
return;
}
if (response.predictions?.[0]) {
const imageData = response.predictions[0].bytesBase64Encoded;
const dir = path.dirname(outputPath);
if (dir && !fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
fs.writeFileSync(outputPath, Buffer.from(imageData, 'base64'));
resolve(outputPath);
}
});
});
req.on('error', reject);
req.write(body);
req.end();
});
}
Const [prompt, outputPath = `./generated-${Date.now()}.png`] = process.argv.slice(2);
GenerateImage(prompt, outputPath).then(p => console.log(`Saved: ${p}`));

Obtener una clave API:

  1. Ve a Google AI Studio
  2. Crea una nueva clave API
  3. Establece la variable de entorno GOOGLE_AI_API_KEY o pégala directamente en el script

Ejemplos de uso:

/imagen "a minimalist logo for a coding blog, orange and white"
/imagen "abstract geometric pattern" ./public/hero.png
/imagen "futuristic terminal interface, dark theme, neon accents"

Parámetros de la API:

  • sampleCount — Número de imágenes a generar (1-4, por defecto: 4)
  • aspectRatio — Dimensiones de salida: 1:1, 3:4, 4:3, 9:16, 16:9 (por defecto: 1:1)
  • personGeneration — Controla personas en las imágenes:
    • dont_allow — Bloquear personas completamente
    • allow_adult — Solo adultos (por defecto)
    • allow_all — Adultos y niños
  • imageSize — Resolución: 1K o 2K (solo modelos Standard/Ultra)

Modelos disponibles:

  • imagen-4.0-generate-001 — Standard, mejor calidad
  • imagen-4.0-ultra-generate-001 — Ultra, máxima calidad
  • imagen-4.0-fast-generate-001 — Fast, menor latencia
  • imagen-3.0-generate-001 — Generación anterior

¿Algunas imágenes de portada e ilustraciones a lo largo de esta serie? Generadas con /imagen. ¿Los memes que ves aquí? Creados con /meme.

El punto es: si hay una API, puedes envolverla en un comando. Publicación en redes sociales, traducción, generación de imágenes, consultas de datos—todo se convierte en un comando slash.

Principios de Diseño de Comandos

Propósito único — Un comando hace una cosa bien. /review revisa, /test testea. No hagas navajas suizas.

Formato de salida claro — Dile a Claude exactamente cómo presentar los resultados. ¿Viñetas? ¿Categorías? ¿Niveles de severidad? Sé explícito.

Incluye restricciones — ¿Qué NO debería hacer Claude? "Sin cambios de comportamiento" o "No modificar tests" previene que se exceda.

Usa el modelo apropiado — Haiku para consultas rápidas, Sonnet para la mayoría de tareas, Opus para razonamiento complejo. Ajusta el modelo al trabajo.

Pre-aprueba herramientas seguras — Si un comando siempre necesita git o npm, usa allowed-tools para saltar los prompts de permisos.

Depuración de Comandos

Si un comando no funciona:

  1. Verifica la ruta — ¿Está en .claude/commands/ o ~/.claude/commands/?
  2. Verifica la extensión — Debe ser .md
  3. Ejecuta /help — Tu comando debería aparecer en la lista
  4. Verifica el frontmatter — El YAML debe ser válido (indentación correcta, comillas alrededor de strings con caracteres especiales)

Qué Sigue

Los comandos personalizados codifican tus flujos de trabajo en acciones reutilizables. Pero ¿qué pasa si quieres compartir comandos más allá de tu equipo? ¿Y si quieres comandos que funcionen en diferentes proyectos sin copiar archivos por todas partes?

Ahí es donde entran los Skills. En la Parte 5: Skills, exploraremos cómo empaquetar comandos para distribución más amplia y crear automatización más sofisticada.

Quick Reference

Crear comandos

mkdir -p .claude/commands — Crear directorio

.claude/commands/nombre.md — Comando básico

.claude/commands/git/commit.md — Con espacio de nombres (/git:commit)

Campos de frontmatter

Description — Se muestra en /help

Argument-hint — Pista de uso

Allowed-tools — ej., Bash(git *), Read, Write

Model — Sobreescribir modelo

Placeholders de argumentos

$ARGUMENTS — Todo después del comando

$1, $2, $3 — Argumentos posicionales

Ver comandos/help

Stay Updated

Get notified about new posts on automation, productivity tips, indie hacking, and web3.

No spam, ever. Unsubscribe anytime.

Comments

Related Posts