Skip to content

Referencia de Scripts API: Interfaz de Scripts Node.js

Lo que aprenderás

  • Comprender completamente la API de scripts de Everything Claude Code
  • Usar funciones de detección de plataforma y utilidades multiplataforma
  • Configurar y usar el mecanismo de detección automática del gestor de paquetes
  • Escribir scripts de Hook personalizados para extender las capacidades de automatización
  • Depurar y modificar implementaciones de scripts existentes

Tu situación actual

Ya sabes que Everything Claude Code tiene muchos scripts de automatización, pero te encuentras con estos problemas:

  • "¿Qué APIs proporcionan exactamente estos scripts de Node.js?"
  • "¿Cómo personalizo los scripts de Hook?"
  • "¿Cuál es la prioridad de detección del gestor de paquetes?"
  • "¿Cómo implemento compatibilidad multiplataforma en los scripts?"

Este tutorial te dará una referencia completa de la API de Scripts.

Concepto central

El sistema de scripts de Everything Claude Code se divide en dos categorías:

  1. Biblioteca de utilidades compartidas (scripts/lib/) - Proporciona funciones multiplataforma y APIs
  2. Scripts de Hook (scripts/hooks/) - Lógica de automatización activada en eventos específicos

Todos los scripts soportan Windows, macOS y Linux, implementados usando módulos nativos de Node.js.

Estructura de scripts

scripts/
├── lib/
│   ├── utils.js              # Funciones de utilidad general
│   └── package-manager.js    # Detección del gestor de paquetes
├── hooks/
│   ├── session-start.js       # Hook SessionStart
│   ├── session-end.js         # Hook SessionEnd
│   ├── pre-compact.js        # Hook PreCompact
│   ├── suggest-compact.js     # Hook PreToolUse
│   └── evaluate-session.js   # Hook Stop
└── setup-package-manager.js   # Script de configuración del gestor de paquetes

lib/utils.js - Funciones de utilidad general

Este módulo proporciona funciones de utilidad multiplataforma, incluyendo detección de plataforma, operaciones de archivos, comandos del sistema, etc.

Detección de plataforma

javascript
const {
  isWindows,
  isMacOS,
  isLinux
} = require('./lib/utils');
FunciónTipoValor de retornoDescripción
isWindowsbooleantrue/falseSi la plataforma actual es Windows
isMacOSbooleantrue/falseSi la plataforma actual es macOS
isLinuxbooleantrue/falseSi la plataforma actual es Linux

Principio de implementación: Basado en la evaluación de process.platform

javascript
const isWindows = process.platform === 'win32';
const isMacOS = process.platform === 'darwin';
const isLinux = process.platform === 'linux';

Utilidades de directorios

javascript
const {
  getHomeDir,
  getClaudeDir,
  getSessionsDir,
  getLearnedSkillsDir,
  getTempDir,
  ensureDir
} = require('./lib/utils');

getHomeDir()

Obtiene el directorio home del usuario (compatible multiplataforma)

Valor de retorno: string - Ruta del directorio home del usuario

Ejemplo:

javascript
const homeDir = getHomeDir();
// Windows: C:\Users\username
// macOS: /Users/username
// Linux: /home/username

getClaudeDir()

Obtiene el directorio de configuración de Claude Code

Valor de retorno: string - Ruta del directorio ~/.claude

Ejemplo:

javascript
const claudeDir = getClaudeDir();
// /Users/username/.claude

getSessionsDir()

Obtiene el directorio de archivos de sesión

Valor de retorno: string - Ruta del directorio ~/.claude/sessions

Ejemplo:

javascript
const sessionsDir = getSessionsDir();
// /Users/username/.claude/sessions

getLearnedSkillsDir()

Obtiene el directorio de habilidades aprendidas

Valor de retorno: string - Ruta del directorio ~/.claude/skills/learned

Ejemplo:

javascript
const learnedDir = getLearnedSkillsDir();
// /Users/username/.claude/skills/learned

getTempDir()

Obtiene el directorio temporal del sistema (multiplataforma)

Valor de retorno: string - Ruta del directorio temporal

Ejemplo:

javascript
const tempDir = getTempDir();
// macOS: /var/folders/...
// Linux: /tmp
// Windows: C:\Users\username\AppData\Local\Temp

ensureDir(dirPath)

Asegura que el directorio existe, lo crea si no existe

Parámetros:

  • dirPath (string) - Ruta del directorio

Valor de retorno: string - Ruta del directorio

Ejemplo:

javascript
const dir = ensureDir('/path/to/new/dir');
// Si el directorio no existe, se crea recursivamente

Utilidades de fecha y hora

javascript
const {
  getDateString,
  getTimeString,
  getDateTimeString
} = require('./lib/utils');

getDateString()

Obtiene la fecha actual (formato: YYYY-MM-DD)

Valor de retorno: string - Cadena de fecha

Ejemplo:

javascript
const date = getDateString();
// '2026-01-25'

getTimeString()

Obtiene la hora actual (formato: HH:MM)

Valor de retorno: string - Cadena de hora

Ejemplo:

javascript
const time = getTimeString();
// '14:30'

getDateTimeString()

Obtiene la fecha y hora actual (formato: YYYY-MM-DD HH:MM:SS)

Valor de retorno: string - Cadena de fecha y hora

Ejemplo:

javascript
const datetime = getDateTimeString();
// '2026-01-25 14:30:45'

Operaciones de archivos

javascript
const {
  findFiles,
  readFile,
  writeFile,
  appendFile,
  replaceInFile,
  countInFile,
  grepFile
} = require('./lib/utils');

findFiles(dir, pattern, options)

Busca archivos que coincidan con un patrón en un directorio (alternativa multiplataforma a find)

Parámetros:

  • dir (string) - Directorio a buscar
  • pattern (string) - Patrón de archivo (ej. "*.tmp", "*.md")
  • options (object, opcional) - Opciones
    • maxAge (number) - Antigüedad máxima del archivo en días
    • recursive (boolean) - Si buscar recursivamente

Valor de retorno: Array<{path: string, mtime: number}> - Lista de archivos coincidentes, ordenados por fecha de modificación descendente

Ejemplo:

javascript
// Buscar archivos .tmp de los últimos 7 días
const recentFiles = findFiles('/tmp', '*.tmp', { maxAge: 7 });
// [{ path: '/tmp/session.tmp', mtime: 1737804000000 }]

// Buscar recursivamente todos los archivos .md
const allMdFiles = findFiles('./docs', '*.md', { recursive: true });

Compatibilidad multiplataforma

Esta función proporciona búsqueda de archivos multiplataforma, no depende del comando Unix find, por lo que funciona correctamente en Windows.

readFile(filePath)

Lee un archivo de texto de forma segura

Parámetros:

  • filePath (string) - Ruta del archivo

Valor de retorno: string | null - Contenido del archivo, devuelve null si falla la lectura

Ejemplo:

javascript
const content = readFile('/path/to/file.txt');
if (content !== null) {
  console.log(content);
}

writeFile(filePath, content)

Escribe un archivo de texto

Parámetros:

  • filePath (string) - Ruta del archivo
  • content (string) - Contenido del archivo

Valor de retorno: ninguno

Ejemplo:

javascript
writeFile('/path/to/file.txt', 'Hello, World!');
// Si el directorio no existe, se crea automáticamente

appendFile(filePath, content)

Añade contenido a un archivo de texto

Parámetros:

  • filePath (string) - Ruta del archivo
  • content (string) - Contenido a añadir

Valor de retorno: ninguno

Ejemplo:

javascript
appendFile('/path/to/log.txt', 'New log entry\n');

replaceInFile(filePath, search, replace)

Reemplaza texto en un archivo (alternativa multiplataforma a sed)

Parámetros:

  • filePath (string) - Ruta del archivo
  • search (string | RegExp) - Contenido a buscar
  • replace (string) - Contenido de reemplazo

Valor de retorno: boolean - Si el reemplazo fue exitoso

Ejemplo:

javascript
const success = replaceInFile('/path/to/file.txt', 'old text', 'new text');
// true: reemplazo exitoso
// false: archivo no existe o fallo de lectura

countInFile(filePath, pattern)

Cuenta las ocurrencias de un patrón en un archivo

Parámetros:

  • filePath (string) - Ruta del archivo
  • pattern (string | RegExp) - Patrón a contar

Valor de retorno: number - Número de coincidencias

Ejemplo:

javascript
const count = countInFile('/path/to/file.txt', /error/g);
// 5

grepFile(filePath, pattern)

Busca un patrón en un archivo y devuelve las líneas coincidentes con números de línea

Parámetros:

  • filePath (string) - Ruta del archivo
  • pattern (string | RegExp) - Patrón a buscar

Valor de retorno: Array<{lineNumber: number, content: string}> - Lista de líneas coincidentes

Ejemplo:

javascript
const matches = grepFile('/path/to/file.txt', /function\s+\w+/);
// [{ lineNumber: 10, content: 'function test() {...}' }]

Hook I/O

javascript
const {
  readStdinJson,
  log,
  output
} = require('./lib/utils');

readStdinJson()

Lee datos JSON desde la entrada estándar (para entrada de Hook)

Valor de retorno: Promise<object> - Objeto JSON parseado

Ejemplo:

javascript
async function main() {
  const hookInput = await readStdinJson();
  console.log(hookInput.tool);
  console.log(hookInput.tool_input);
}

Formato de entrada del Hook

El formato de entrada que Claude Code pasa al Hook es:

json
{
  "tool": "Bash",
  "tool_input": { "command": "npm run dev" },
  "tool_output": { "output": "..." }
}

log(message)

Registra un mensaje en stderr (visible para el usuario)

Parámetros:

  • message (string) - Mensaje de log

Valor de retorno: ninguno

Ejemplo:

javascript
log('[SessionStart] Loading context...');
// Se muestra en stderr, visible para el usuario en Claude Code

output(data)

Envía datos a stdout (devuelve a Claude Code)

Parámetros:

  • data (object | string) - Datos a enviar

Valor de retorno: ninguno

Ejemplo:

javascript
// Enviar objeto (serialización JSON automática)
output({ success: true, message: 'Completed' });

// Enviar cadena
output('Hello, Claude');

Comandos del sistema

javascript
const {
  commandExists,
  runCommand,
  isGitRepo,
  getGitModifiedFiles
} = require('./lib/utils');

commandExists(cmd)

Verifica si un comando existe en el PATH

Parámetros:

  • cmd (string) - Nombre del comando

Valor de retorno: boolean - Si el comando existe

Ejemplo:

javascript
if (commandExists('pnpm')) {
  console.log('pnpm is available');
}

Validación de seguridad

Esta función valida el nombre del comando con regex, solo permite letras, números, guiones bajos, puntos y guiones, previniendo inyección de comandos.

runCommand(cmd, options)

Ejecuta un comando y devuelve la salida

Parámetros:

  • cmd (string) - Comando a ejecutar (debe ser un comando confiable y hardcodeado)
  • options (object, opcional) - Opciones de execSync

Valor de retorno: {success: boolean, output: string} - Resultado de la ejecución

Ejemplo:

javascript
const result = runCommand('git status');
if (result.success) {
  console.log(result.output);
} else {
  console.error(result.output);
}

Advertencia de seguridad

Usa esta función solo para comandos confiables y hardcodeados. No pases entrada controlada por el usuario directamente a esta función. Para entrada de usuario, usa spawnSync con array de argumentos.

isGitRepo()

Verifica si el directorio actual es un repositorio Git

Valor de retorno: boolean - Si es un repositorio Git

Ejemplo:

javascript
if (isGitRepo()) {
  console.log('This is a Git repository');
}

getGitModifiedFiles(patterns = [])

Obtiene la lista de archivos modificados en Git

Parámetros:

  • patterns (string[], opcional) - Array de patrones de filtro

Valor de retorno: string[] - Lista de rutas de archivos modificados

Ejemplo:

javascript
// Obtener todos los archivos modificados
const allModified = getGitModifiedFiles();

// Obtener solo archivos TypeScript
const tsModified = getGitModifiedFiles([/\.ts$/, /\.tsx$/]);

lib/package-manager.js - API del gestor de paquetes

Este módulo proporciona la API de detección automática y configuración del gestor de paquetes.

Gestores de paquetes soportados

javascript
const { PACKAGE_MANAGERS } = require('./lib/package-manager');
Gestor de paquetesArchivo lockComando installComando runComando exec
npmpackage-lock.jsonnpm installnpm runnpx
pnpmpnpm-lock.yamlpnpm installpnpmpnpm dlx
yarnyarn.lockyarnyarnyarn dlx
bunbun.lockbbun installbun runbunx

Prioridad de detección

javascript
const { DETECTION_PRIORITY } = require('./lib/package-manager');

// ['pnpm', 'bun', 'yarn', 'npm']

La detección del gestor de paquetes sigue esta prioridad (de mayor a menor):

  1. Variable de entorno CLAUDE_PACKAGE_MANAGER
  2. Configuración a nivel de proyecto .claude/package-manager.json
  3. Campo packageManager en package.json
  4. Detección de archivo lock
  5. Preferencia global del usuario ~/.claude/package-manager.json
  6. Devuelve el primer gestor de paquetes disponible según prioridad

Funciones principales

javascript
const {
  getPackageManager,
  setPreferredPackageManager,
  setProjectPackageManager,
  getAvailablePackageManagers,
  getRunCommand,
  getExecCommand,
  getCommandPattern
} = require('./lib/package-manager');

getPackageManager(options = {})

Obtiene el gestor de paquetes que debe usar el proyecto actual

Parámetros:

  • options (object, opcional)
    • projectDir (string) - Ruta del directorio del proyecto, por defecto process.cwd()
    • fallbackOrder (string[]) - Orden de respaldo, por defecto ['pnpm', 'bun', 'yarn', 'npm']

Valor de retorno: {name: string, config: object, source: string}

  • name: Nombre del gestor de paquetes
  • config: Objeto de configuración del gestor de paquetes
  • source: Fuente de detección ('environment' | 'project-config' | 'package.json' | 'lock-file' | 'global-config' | 'fallback' | 'default')

Ejemplo:

javascript
const pm = getPackageManager();
console.log(pm.name);        // 'pnpm'
console.log(pm.source);      // 'lock-file'
console.log(pm.config);      // { name: 'pnpm', lockFile: 'pnpm-lock.yaml', ... }

setPreferredPackageManager(pmName)

Establece la preferencia global del gestor de paquetes

Parámetros:

  • pmName (string) - Nombre del gestor de paquetes (npm | pnpm | yarn | bun)

Valor de retorno: object - Objeto de configuración

Ejemplo:

javascript
const config = setPreferredPackageManager('pnpm');
// Guarda en ~/.claude/package-manager.json
// { packageManager: 'pnpm', setAt: '2026-01-25T...' }

setProjectPackageManager(pmName, projectDir)

Establece la preferencia del gestor de paquetes a nivel de proyecto

Parámetros:

  • pmName (string) - Nombre del gestor de paquetes
  • projectDir (string) - Ruta del directorio del proyecto, por defecto process.cwd()

Valor de retorno: object - Objeto de configuración

Ejemplo:

javascript
const config = setProjectPackageManager('bun', '/path/to/project');
// Guarda en /path/to/project/.claude/package-manager.json
// { packageManager: 'bun', setAt: '2026-01-25T...' }

getAvailablePackageManagers()

Obtiene la lista de gestores de paquetes instalados en el sistema

Valor de retorno: string[] - Array de nombres de gestores de paquetes disponibles

Ejemplo:

javascript
const available = getAvailablePackageManagers();
// ['pnpm', 'npm']  // Si solo están instalados pnpm y npm

getRunCommand(script, options = {})

Obtiene el comando para ejecutar un script

Parámetros:

  • script (string) - Nombre del script (ej. "dev", "build", "test")
  • options (object, opcional) - Opciones del directorio del proyecto

Valor de retorno: string - Comando de ejecución completo

Ejemplo:

javascript
const devCmd = getRunCommand('dev');
// 'npm run dev'  o  'pnpm dev'  o  'bun run dev'

const buildCmd = getRunCommand('build');
// 'npm run build'  o  'pnpm build'

Atajos de scripts integrados:

  • install → Devuelve installCmd
  • test → Devuelve testCmd
  • build → Devuelve buildCmd
  • dev → Devuelve devCmd
  • Otros → Devuelve ${runCmd} ${script}

getExecCommand(binary, args = '', options = {})

Obtiene el comando para ejecutar un binario de paquete

Parámetros:

  • binary (string) - Nombre del binario (ej. "prettier", "eslint")
  • args (string, opcional) - Cadena de argumentos
  • options (object, opcional) - Opciones del directorio del proyecto

Valor de retorno: string - Comando de ejecución completo

Ejemplo:

javascript
const cmd = getExecCommand('prettier', '--write file.js');
// 'npx prettier --write file.js'  o  'pnpm dlx prettier --write file.js'

const eslintCmd = getExecCommand('eslint');
// 'npx eslint'  o  'bunx eslint'

getCommandPattern(action)

Genera un patrón de expresión regular que coincide con comandos de todos los gestores de paquetes

Parámetros:

  • action (string) - Tipo de acción ('dev' | 'install' | 'test' | 'build' o nombre de script personalizado)

Valor de retorno: string - Patrón de expresión regular

Ejemplo:

javascript
const devPattern = getCommandPattern('dev');
// (npm run dev|pnpm( run)? dev|yarn dev|bun run dev)

const installPattern = getCommandPattern('install');
// (npm install|pnpm install|yarn( install)?|bun install)

setup-package-manager.js - Script de configuración del gestor de paquetes

Este es un script CLI ejecutable para configurar interactivamente las preferencias del gestor de paquetes.

Uso

bash
# Detectar y mostrar el gestor de paquetes actual
node scripts/setup-package-manager.js --detect

# Establecer preferencia global
node scripts/setup-package-manager.js --global pnpm

# Establecer preferencia del proyecto
node scripts/setup-package-manager.js --project bun

# Listar gestores de paquetes disponibles
node scripts/setup-package-manager.js --list

# Mostrar ayuda
node scripts/setup-package-manager.js --help

Argumentos de línea de comandos

ArgumentoDescripción
--detectDetectar y mostrar el gestor de paquetes actual
--global <pm>Establecer preferencia global del gestor de paquetes
--project <pm>Establecer preferencia del gestor de paquetes del proyecto
--listListar todos los gestores de paquetes disponibles
--helpMostrar información de ayuda

Ejemplo de salida

Salida de --detect:

=== Package Manager Detection ===

Current selection:
  Package Manager: pnpm
  Source: lock-file

Detection results:
  From package.json: not specified
  From lock file: pnpm
  Environment var: not set

Available package managers:
  ✓ pnpm (current)
  ✓ npm
  ✗ yarn
  ✗ bun

Commands:
  Install: pnpm install
  Run script: pnpm [script-name]
  Execute binary: pnpm dlx [binary-name]

Detalles de los scripts de Hook

session-start.js - Hook de inicio de sesión

Tipo de Hook: SessionStart

Momento de activación: Al iniciar una sesión de Claude Code

Funcionalidad:

  • Verificar archivos de sesión recientes (últimos 7 días)
  • Verificar archivos de habilidades aprendidas
  • Detectar e informar el gestor de paquetes
  • Si el gestor de paquetes se detecta por fallback, mostrar mensaje de selección

Ejemplo de salida:

[SessionStart] Found 3 recent session(s)
[SessionStart] Latest: /Users/username/.claude/sessions/2026-01-25-session.tmp
[SessionStart] 5 learned skill(s) available in /Users/username/.claude/skills/learned
[SessionStart] Package manager: pnpm (lock-file)

session-end.js - Hook de fin de sesión

Tipo de Hook: SessionEnd

Momento de activación: Al finalizar una sesión de Claude Code

Funcionalidad:

  • Crear o actualizar el archivo de sesión del día
  • Registrar hora de inicio y fin de sesión
  • Proporcionar plantilla de estado de sesión (completado, en progreso, notas)

Plantilla de archivo de sesión:

markdown
# Session: 2026-01-25
**Date:** 2026-01-25
**Started:** 14:30
**Last Updated:** 15:45

---

## Current State

[Session context goes here]

### Completed
- [ ]

### In Progress
- [ ]

### Notes for Next Session
-

### Context to Load

[relevant files]

pre-compact.js - Hook de pre-compactación

Tipo de Hook: PreCompact

Momento de activación: Antes de que Claude Code compacte el contexto

Funcionalidad:

  • Registrar evento de compactación en archivo de log
  • Marcar el momento de compactación en el archivo de sesión activo

Ejemplo de salida:

[PreCompact] State saved before compaction

Archivo de log: ~/.claude/sessions/compaction-log.txt

suggest-compact.js - Hook de sugerencia de compactación

Tipo de Hook: PreToolUse

Momento de activación: Después de cada llamada a herramienta (generalmente Edit o Write)

Funcionalidad:

  • Rastrear el número de llamadas a herramientas
  • Sugerir compactación manual al alcanzar el umbral
  • Recordar periódicamente el momento de compactación

Variables de entorno:

  • COMPACT_THRESHOLD - Umbral de compactación (por defecto: 50)
  • CLAUDE_SESSION_ID - ID de sesión

Ejemplo de salida:

[StrategicCompact] 50 tool calls reached - consider /compact if transitioning phases
[StrategicCompact] 75 tool calls - good checkpoint for /compact if context is stale

Compactación manual vs automática

¿Por qué se recomienda la compactación manual?

  • La compactación automática generalmente se activa a mitad de tarea, causando pérdida de contexto
  • La compactación manual puede preservar información importante durante cambios de fase lógica
  • Momentos de compactación: fin de fase de exploración, inicio de fase de ejecución, hitos completados

evaluate-session.js - Hook de evaluación de sesión

Tipo de Hook: Stop

Momento de activación: Al final de cada respuesta de IA

Funcionalidad:

  • Verificar la longitud de la sesión (basada en número de mensajes del usuario)
  • Evaluar si la sesión contiene patrones extraíbles
  • Sugerir guardar habilidades aprendidas

Archivo de configuración: skills/continuous-learning/config.json

Variables de entorno:

  • CLAUDE_TRANSCRIPT_PATH - Ruta del archivo de transcripción de sesión

Ejemplo de salida:

[ContinuousLearning] Session has 25 messages - evaluate for extractable patterns
[ContinuousLearning] Save learned skills to: /Users/username/.claude/skills/learned

¿Por qué usar Stop en lugar de UserPromptSubmit?

  • Stop se activa solo una vez por respuesta (ligero)
  • UserPromptSubmit se activa con cada mensaje (alta latencia)

Scripts de Hook personalizados

Crear un Hook personalizado

  1. Crear script en el directorio scripts/hooks/
javascript
#!/usr/bin/env node
/**
 * Custom Hook - Tu descripción
 *
 * Multiplataforma (Windows, macOS, Linux)
 */

const { log, output } = require('../lib/utils');

async function main() {
  // Tu lógica
  log('[CustomHook] Processing...');
  
  // Enviar resultado
  output({ success: true });
  
  process.exit(0);
}

main().catch(err => {
  console.error('[CustomHook] Error:', err.message);
  process.exit(0); // No bloquear la sesión
});
  1. Configurar Hook en hooks/hooks.json
json
{
  "matcher": "tool == \"Bash\" && tool_input.command matches \"your_pattern\"",
  "hooks": [
    {
      "type": "command",
      "command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/hooks/your-hook.js\""
    }
  ],
  "description": "Descripción de tu hook personalizado"
}
  1. Probar el Hook
bash
# Activar la condición en Claude Code, verificar la salida

Mejores prácticas

1. Manejo de errores

javascript
main().catch(err => {
  console.error('[HookName] Error:', err.message);
  process.exit(0); // No bloquear la sesión
});

2. Usar la biblioteca de utilidades

javascript
const {
  log,
  readFile,
  writeFile,
  ensureDir
} = require('../lib/utils');

3. Rutas multiplataforma

javascript
const path = require('path');
const filePath = path.join(getHomeDir(), '.claude', 'config.json');

4. Variables de entorno

javascript
const sessionId = process.env.CLAUDE_SESSION_ID || 'default';
const transcriptPath = process.env.CLAUDE_TRANSCRIPT_PATH;

Probar scripts

Probar funciones de utilidad

javascript
const { findFiles, readFile, writeFile } = require('./lib/utils');

// Probar búsqueda de archivos
const files = findFiles('/tmp', '*.tmp', { maxAge: 7 });
console.log('Found files:', files);

// Probar lectura/escritura de archivos
writeFile('/tmp/test.txt', 'Hello, World!');
const content = readFile('/tmp/test.txt');
console.log('Content:', content);

Probar detección del gestor de paquetes

javascript
const { getPackageManager, getRunCommand } = require('./lib/package-manager');

const pm = getPackageManager();
console.log('Package manager:', pm.name);
console.log('Source:', pm.source);
console.log('Dev command:', getRunCommand('dev'));

Probar scripts de Hook

bash
# Ejecutar script de Hook directamente (requiere variables de entorno)
CLAUDE_SESSION_ID=test CLAUDE_TRANSCRIPT_PATH=/tmp/transcript.json \
  node scripts/hooks/session-start.js

Consejos de depuración

1. Usar salida de log

javascript
const { log } = require('../lib/utils');

log('[Debug] Current value:', value);

2. Capturar errores

javascript
try {
  // Código que puede fallar
} catch (err) {
  console.error('[Error]', err.message);
  console.error('[Stack]', err.stack);
}

3. Verificar rutas de archivos

javascript
const path = require('path');
const { existsSync } = require('fs');

const filePath = path.join(getHomeDir(), '.claude', 'config.json');
console.log('Config path:', filePath);
console.log('Exists:', existsSync(filePath));

4. Ver logs de ejecución de Hook

bash
# En Claude Code, la salida stderr del Hook se muestra en la respuesta
# Buscar logs con prefijo [HookName]

Preguntas frecuentes

P1: ¿El script de Hook no se ejecuta?

Posibles causas:

  1. Configuración incorrecta del matcher en hooks/hooks.json
  2. Ruta del script incorrecta
  3. El script no tiene permisos de ejecución

Pasos de diagnóstico:

bash
# Verificar ruta del script
ls -la scripts/hooks/

# Ejecutar script manualmente para probar
node scripts/hooks/session-start.js

# Verificar sintaxis de hooks.json
cat hooks/hooks.json | jq '.'

P2: ¿Error de ruta en Windows?

Causa: Windows usa barras invertidas, mientras que Unix usa barras normales

Solución:

javascript
// ❌ Incorrecto: separador de ruta hardcodeado
const path = 'C:\\Users\\username\\.claude';

// ✅ Correcto: usar path.join()
const path = require('path');
const claudePath = path.join(getHomeDir(), '.claude');

P3: ¿Cómo depurar la entrada del Hook?

Método: Escribir la entrada del Hook en un archivo temporal

javascript
const { writeFileSync } = require('fs');
const path = require('path');

async function main() {
  const hookInput = await readStdinJson();
  
  // Escribir archivo de depuración
  const debugPath = path.join(getTempDir(), 'hook-debug.json');
  writeFileSync(debugPath, JSON.stringify(hookInput, null, 2));
  
  console.error('[Debug] Input saved to:', debugPath);
}

Resumen de la lección

Esta lección explicó sistemáticamente la API de Scripts de Everything Claude Code:

Módulos principales:

  • lib/utils.js: Funciones de utilidad multiplataforma (detección de plataforma, operaciones de archivos, comandos del sistema)
  • lib/package-manager.js: API de detección y configuración del gestor de paquetes
  • setup-package-manager.js: Herramienta de configuración CLI

Scripts de Hook:

  • session-start.js: Cargar contexto al inicio de sesión
  • session-end.js: Guardar estado al fin de sesión
  • pre-compact.js: Guardar estado antes de compactación
  • suggest-compact.js: Sugerir momento de compactación manual
  • evaluate-session.js: Evaluar sesión para extraer patrones

Mejores prácticas:

  • Usar funciones de la biblioteca de utilidades para garantizar compatibilidad multiplataforma
  • Los scripts de Hook no deben bloquear la sesión (código de salida 0 en caso de error)
  • Usar log() para salida de depuración
  • Usar process.env para leer variables de entorno

Consejos de depuración:

  • Ejecutar scripts directamente para probar
  • Usar archivos temporales para guardar datos de depuración
  • Verificar configuración del matcher y rutas de scripts

Próxima lección

En la próxima lección aprenderemos Suite de pruebas: Ejecución y personalización.

Aprenderás:

  • Cómo ejecutar la suite de pruebas
  • Cómo escribir pruebas unitarias para funciones de utilidad
  • Cómo escribir pruebas de integración para scripts de Hook
  • Cómo agregar casos de prueba personalizados

Apéndice: Referencia del código fuente

Haz clic para expandir y ver las ubicaciones del código fuente

Fecha de actualización: 2026-01-25

Módulo funcionalRuta del archivoLíneas
Funciones de utilidad generalscripts/lib/utils.js1-384
API del gestor de paquetesscripts/lib/package-manager.js1-391
Script de configuración del gestor de paquetesscripts/setup-package-manager.js1-207
Hook SessionStartscripts/hooks/session-start.js1-62
Hook SessionEndscripts/hooks/session-end.js1-83
Hook PreCompactscripts/hooks/pre-compact.js1-49
Hook Suggest Compactscripts/hooks/suggest-compact.js1-61
Hook Evaluate Sessionscripts/hooks/evaluate-session.js1-79

Constantes clave:

  • DETECTION_PRIORITY = ['pnpm', 'bun', 'yarn', 'npm']: Prioridad de detección del gestor de paquetes (scripts/lib/package-manager.js:57)
  • COMPACT_THRESHOLD: Umbral de sugerencia de compactación (por defecto 50, configurable mediante variable de entorno)

Funciones clave:

  • getPackageManager(): Detectar y seleccionar gestor de paquetes (scripts/lib/package-manager.js:157)
  • findFiles(): Búsqueda de archivos multiplataforma (scripts/lib/utils.js:102)
  • readStdinJson(): Leer entrada del Hook (scripts/lib/utils.js:154)
  • commandExists(): Verificar si existe un comando (scripts/lib/utils.js:228)

Variables de entorno:

  • CLAUDE_PACKAGE_MANAGER: Forzar gestor de paquetes específico
  • CLAUDE_SESSION_ID: ID de sesión
  • CLAUDE_TRANSCRIPT_PATH: Ruta del archivo de transcripción de sesión
  • COMPACT_THRESHOLD: Umbral de sugerencia de compactación

Detección de plataforma:

  • process.platform === 'win32': Windows
  • process.platform === 'darwin': macOS
  • process.platform === 'linux': Linux