Informe de investigación profunda del código fuente de Claude Code
1. Alcance de la investigación y conclusión principal
1.1 Qué se investigó realmente
La investigación no consistió en leer un único archivo de prompt ni en mirar por encima la estructura del repositorio. Se reconstruyó el código a partir de sourcesContent dentro de cli.js.map y se siguió el flujo real del runtime.
Se cubrieron estos temas:
- la estructura global del código fuente de Claude Code
- cómo se ensambla dinámicamente el prompt del sistema principal
- los protocolos del lado del modelo para
AgentToolySkillTool - la división de roles entre los built-in agents
- la cadena de orquestación de agentes
- cómo se integran plugins, skills, hooks y MCP
- cómo cooperan permissions, tool execution y hook decisions
- por qué Claude Code se siente mucho más sólido que un simple “LLM + tool caller”
1.2 Hechos confirmados
Se pudieron confirmar al menos estos puntos:
cli.js.mapcontienesourcesContentcompleto- se recuperaron al menos 4756 archivos fuente
- el archivo central del main system prompt es
src/constants/prompts.ts - el prompt de Agent Tool está en
src/tools/AgentTool/prompt.ts - el prompt de Skill Tool está en
src/tools/SkillTool/prompt.ts - el núcleo de la orquestación de agentes incluye
src/tools/AgentTool/AgentTool.tsxysrc/tools/AgentTool/runAgent.ts - la cadena de ejecución de herramientas se apoya en
src/services/tools/toolExecution.tsysrc/services/tools/toolHooks.ts
1.3 El juicio más importante
La fortaleza de Claude Code no viene de un system prompt mágico, sino de un sistema de software completo.
Su ventaja nace de combinar:
- prompt assembly modular
- ejecución de herramientas gobernada
- modelo de permisos
- agents especializados
- empaquetado de workflows mediante skills
- metadatos de plugins y runtime constraints
- hooks como policy layer
- MCP como plano de inyección de capacidades e instrucciones
- construcción de prompts optimizada para cache
- gestión del ciclo de vida asíncrono y en segundo plano
Resumen corto:
Claude Code no es un prompt. Es un Agent Operating System que unifica prompts, herramientas, permisos, agents, skills, plugins, hooks, MCP, cache y runtime de producto.
2. Arquitectura del código fuente: por qué se parece a un Agent Operating System
2.1 La estructura superior ya revela complejidad de sistema
En src/ aparecen módulos como:
src/entrypoints/src/constants/src/tools/src/services/src/utils/src/commands/src/components/src/coordinator/src/memdir/src/plugins/src/hooks/src/bootstrap/src/tasks/
Eso es una plataforma de runtime, no un envoltorio CLI fino.
2.2 La capa de entrada muestra mentalidad de plataforma
Entrypoints visibles:
src/entrypoints/cli.tsxsrc/entrypoints/init.tssrc/entrypoints/mcp.tssrc/entrypoints/sdk/
La misma runtime sirve para CLI, inicialización, modo MCP y consumidores SDK.
2.3 El sistema de comandos es una control plane
Entre los comandos aparecen:
/mcp/memory/permissions/hooks/plugin/reload-plugins/skills/tasks/plan/review/status/model/output-style/agents/sandbox-toggle
Además integra plugin commands, skill commands, bundled skills y dynamic skills. Es una puerta de entrada al ecosistema.
2.4 La capa de herramientas convierte al modelo en ejecutor
Herramientas clave:
FileReadFileEditFileWriteBashGlobGrepTodoWriteTaskCreateAskUserQuestionSkillAgentMCPToolSleep
Esta capa transforma al modelo de respondedor en actor.
3. El papel real de prompts.ts
3.1 src/constants/prompts.ts es el punto central de control
Su importancia está en ensamblar las instrucciones runtime del hilo principal.
Se encarga de:
- ensamblaje del main system prompt
- inyección de entorno
- reglas de uso de herramientas
- reglas para acciones riesgosas
- guidance específica de la sesión
- idioma y estilo de salida
- instrucciones MCP
- memory prompt
- scratchpad
- function result clearing
- secciones condicionadas como brief mode y token budget
3.2 getSystemPrompt() es un orquestador
Su estructura separa un prefijo estático de un sufijo dinámico.
Prefijo estático:
getSimpleIntroSection()getSimpleSystemSection()getSimpleDoingTasksSection()getActionsSection()getUsingYourToolsSection()getSimpleToneAndStyleSection()getOutputEfficiencySection()
Sufijo dinámico:
- session guidance
- memory
- model override
- env info
- language
- output style
- MCP instructions
- scratchpad
- function result clearing
- summarize tool results
- numeric anchors
- token budget
- brief mode
Claude Code trata los prompts como recursos runtime ensamblables.
3.3 La frontera de cache demuestra pensamiento de infraestructura
Una frontera como SYSTEM_PROMPT_DYNAMIC_BOUNDARY deja claro que:
- el prefijo debe ser cache-friendly
- el contenido específico del usuario o la sesión debe ir después
- no conviene alterar esa frontera sin cuidado
Eso es prompt assembly con economía de cache.
4. Desglose de las secciones del prompt
4.1 getSimpleIntroSection()
Esta parte fija que:
- Claude es un interactive agent
- su trabajo es ayudar en tareas de ingeniería de software
- el estilo de salida viene controlado externamente
- la cyber-risk guidance está presente desde el inicio
- no debe inventar URLs
4.2 getSimpleSystemSection()
Define la realidad del runtime:
- la salida no ligada a herramientas se muestra al usuario
- las herramientas corren bajo permission modes
- una llamada denegada no debe repetirse igual
- pueden existir etiquetas
<system-reminder> - los resultados externos pueden contener prompt injection
- existen hooks
- el contexto puede comprimirse automáticamente
4.3 getSimpleDoingTasksSection()
Esta sección estabiliza el comportamiento:
- no agregar funciones no pedidas
- no sobre-abstraer
- no refactorizar por refactorizar
- no añadir comentarios, docstrings o type annotations sin necesidad
- no meter fallback o validación extra innecesaria
- no construir abstracciones especulativas
- leer antes de editar
- evitar crear archivos nuevos sin motivo real
- no dar estimaciones de tiempo a la ligera
- diagnosticar antes de cambiar de estrategia
- atender a la seguridad
- eliminar lo claramente innecesario
- reportar con honestidad lo que se verificó
4.4 getActionsSection()
Las acciones que requieren confirmación incluyen:
- destructive operations
- hard-to-reverse operations
- cambios sobre estado compartido
- acciones visibles externamente
- cargas a herramientas de terceros
4.5 getUsingYourToolsSection()
La gramática de uso de herramientas es explícita:
- leer con
FileRead - editar con
FileEdit - crear con
FileWrite - descubrir archivos con
Glob - buscar contenido con
Grep - reservar
Bashpara trabajo shell genuino - usar
TodoWrite/TaskCreatecuando existan - paralelizar llamadas independientes
4.6 Guidance específica de la sesión
Esta capa inyecta reglas locales según el estado de la sesión: disponibilidad de AskUserQuestion, activación de AgentTool, Explore / Plan agents, slash skills, DiscoverSkills y contratos de verificación.
4.7 Output efficiency
La idea es simple:
- el usuario quiere lenguaje natural, no logs
- decir primero la acción o la conclusión
- actualizar cuando haga falta, sin ruido
- evitar tablas innecesarias
- escribir corto y directo
4.8 Tone and style
Reglas como no abusar de emojis, responder de forma concisa y citar código con file_path:line_number mejoran mucho la sensación de producto.
4.9 DEFAULT_AGENT_PROMPT
El rol base de un sub-agent es:
- ser un agente de Claude Code
- usar herramientas para completar la tarea
- no dejar el trabajo a medias
- devolver un informe breve al final
5. Agent prompts y built-in agents
5.1 AgentTool/prompt.ts como documento de protocolo
Explica al modelo:
- cómo se presentan los agents
- cómo se describen
- cuándo debe forkearse a sí mismo
- cuándo usar
subagent_type - la diferencia entre fork y fresh agent
- cuándo no usar
AgentTool - cómo redactar un prompt para un sub-agent
- diferencias foreground / background
- significado de worktree y remote isolation
5.2 Por qué la semántica de fork es tan potente
Con fork activado:
- omitir
subagent_typesignifica self-fork - el fork hereda el contexto completo
- las tareas de investigación encajan muy bien
- también las tareas de implementación con mucho output intermedio
- el coste baja por compartir prompt cache
- cambiar el modelo empeora la reutilización del cache
- el hilo principal no debería espiar el output del fork
- tampoco debería predecir su resultado por adelantado
5.3 La sección “How to write the prompt” es valiosa
El modelo recibe reglas claras para delegar bien:
- un fresh agent no tiene contexto previo
- el prompt debe parecer un briefing a un nuevo compañero
- explicar objetivo y razón
- decir qué ya se descartó
- aportar contexto suficiente
- pedir brevedad si se necesita
- no externalizar la comprensión del problema
- no delegar de forma perezosa
- dar rutas de archivo, líneas y cambios concretos
5.4 Los built-in agents representan especialización
Roles confirmados:
- General Purpose Agent
- Explore Agent
- Plan Agent
- Verification Agent
- Claude Code Guide Agent
- Statusline Setup Agent
5.5 Explore Agent como especialista read-only
Explore no puede crear, modificar, borrar ni mover archivos. Usa Glob, Grep, FileRead y solo comandos Bash de lectura, priorizando velocidad y paralelización.
5.6 Plan Agent como planificador puro
Plan permanece read-only, entiende la solicitud, explora el código y entrega un plan paso a paso con Critical Files for Implementation.
5.7 Verification Agent como adversarial validator
El Verification agent debe intentar romper el cambio. Exige:
- build
- test suite
- lint / type-check
- verificaciones específicas según el tipo de cambio
- automatización de navegador para frontend
curl/fetchpara backend- stdout / stderr / exit code para CLI
- migraciones up/down
- verificación de API pública
- adversarial probes
- commands con outputs observados
VERDICT: PASS / FAIL / PARTIAL
6. La cadena de orquestación de agents
6.1 Flujo general
El flujo principal se resume así:
- el modelo principal llama al Agent tool
AgentTool.call()analiza la entrada- resuelve fork / built-in / teammate / background / remote
- selecciona la definición de agent
- construye prompt messages
- construye o hereda el system prompt
- arma el pool de herramientas
- crea un
ToolUseContextespecífico del agent - registra hooks, skills y MCP servers
- llama a
runAgent() query()ejecuta el bucle principal- se gestionan transcript, metadata y cleanup
6.2 AgentTool.call() es el controlador de orquestación
Se encarga de parsear la entrada, manejar team context, decidir background, separar fork path y normal path, filtrar agents por permissions, revisar MCP, construir prompts, registrar tareas y lanzar runAgent().
6.3 fork path vs normal path
fork path hereda contexto y maximiza la reutilización del prompt cache. normal path crea un system prompt nuevo, pasa solo el contexto necesario y aplica restricciones propias del agent.
6.4 Por qué importa el cache-identical prefix
El objetivo es mantener un prefijo de request lo más idéntico posible para maximizar hits del prompt cache y reducir gasto de tokens.
6.5 Lifecycles foreground y background
Los agents en background tienen abort controllers propios, registro de tareas y retorno vía notificaciones. Los foreground bloquean más al hilo principal y tienen progress tracking.
6.6 runAgent() como constructor de runtime
runAgent() inicializa MCP servers del agent, prepara contexto, resuelve tools y permissions, registra hooks y skills, ejecuta query() y limpia recursos.
6.7 MCP servers específicos del agent
Los agents pueden traer sus propios MCP servers, añadiendo capacidades especializadas al runtime.
6.8 frontmatter hooks y frontmatter skills
Hooks y skills pueden inyectarse por frontmatter, lo que convierte al agent en un prompt container configurable.
6.9 query() como bucle principal final
La separación es clara:
AgentToolenrutarunAgentconstruye runtime y lifecyclequeryejecuta el bucle modelo + herramientas
6.10 transcript / metadata / cleanup
El registro de transcript, metadata, tracking y limpieza demuestra un alto nivel de productización.
7. Skills / Plugins / Hooks / MCP
7.1 Skill como workflow package
Las skills son primitivas de primer nivel. Si una tarea coincide con una skill, el modelo debe invocar el Skill tool, no solo mencionar la skill.
7.2 Plugin como prompt + metadata + runtime constraints
Los plugins pueden aportar markdown commands, SKILL.md, metadatos, allowed tools, hints de modelo y variables runtime. Extienden el comportamiento del modelo.
7.3 Hook como runtime governance layer
Los hooks PreToolUse, PostToolUse y PostToolUseFailure pueden devolver mensajes, errores bloqueantes, inputs modificados, comportamiento de permisos o contexto adicional.
7.4 Integración madura entre hooks y permissions
Los hooks pueden devolver allow, ask o deny, pero no evitan el modelo central de seguridad.
7.5 MCP como capa de inyección de comportamiento
MCP inyecta no solo herramientas, sino también instrucciones sobre cómo usarlas.
8. Permissions, hooks y tool execution pipeline
8.1 toolExecution.ts
El pipeline incluye lookup del tool, parseo de metadata, validación de esquema, validación específica, hooks, decisión de permisos, ejecución del tool, telemetría y post-hooks.
8.2 Validación de entrada
Los errores básicos se bloquean pronto con schema parsing y validación específica.
8.3 PreToolUse hooks
Los campos más importantes son updatedInput, permissionBehavior y preventContinuation.
8.4 resolveHookPermissionDecision()
Esta lógica conecta la semántica de hooks con el modelo central de permisos.
8.5 La gobernanza continúa después del tool call
Incluso tras éxito o fallo, los hooks pueden inyectar contexto, bloquear continuidad o aportar pistas de recuperación.
9. Por qué Claude Code se siente tan fuerte
9.1 No es un prompt, sino un operating model
Su verdadero foso competitivo es la integración entre prompt architecture, runtime gobernado, permissions, hooks, especialización de agents, skills, plugins, MCP, cache y lifecycle management.
9.2 Institucionaliza el buen comportamiento
Claude Code no deja los buenos hábitos a la improvisación del modelo; los codifica en prompts y reglas runtime.
9.3 Entiende que el contexto es escaso
Las fronteras de prompt, la reutilización de cache, la inyección bajo demanda, el result clearing y los mecanismos de resume muestran que los tokens se gestionan como presupuesto.
9.4 Profundidad de la especialización de agents
Explore, Plan y Verification separan investigación, planificación, implementación y validación.
9.5 Ecosistema visible para el modelo
El modelo conoce sus extensiones mediante skill lists, agent lists, MCP instructions y session-specific guidance. Por eso el ecosistema realmente funciona.
10. Archivos clave y próximas líneas de investigación
10.1 Archivos de prompt
src/constants/prompts.tssrc/tools/AgentTool/prompt.tssrc/tools/SkillTool/prompt.tssrc/tools/FileReadTool/prompt.tssrc/tools/GlobTool/prompt.tssrc/tools/GrepTool/prompt.tssrc/tools/BriefTool/prompt.ts
10.2 Archivos de agents
src/tools/AgentTool/AgentTool.tsxsrc/tools/AgentTool/runAgent.tssrc/tools/AgentTool/resumeAgent.tssrc/tools/AgentTool/forkSubagent.tssrc/tools/AgentTool/agentMemory.tssrc/tools/AgentTool/agentMemorySnapshot.tssrc/tools/AgentTool/builtInAgents.tssrc/tools/AgentTool/built-in/exploreAgent.tssrc/tools/AgentTool/built-in/planAgent.tssrc/tools/AgentTool/built-in/verificationAgent.tssrc/tools/AgentTool/built-in/generalPurposeAgent.tssrc/tools/AgentTool/built-in/claudeCodeGuideAgent.tssrc/tools/AgentTool/built-in/statuslineSetup.ts
10.3 Skill / Plugin / Hook / MCP
src/tools/SkillTool/constants.tssrc/tools/SkillTool/prompt.tssrc/commands.tssrc/utils/plugins/loadPluginCommands.tssrc/services/tools/toolHooks.tssrc/utils/hooks.jssrc/services/tools/toolExecution.tssrc/services/mcp/types.tssrc/services/mcp/normalization.tssrc/services/mcp/mcpStringUtils.tssrc/services/mcp/utils.tssrc/entrypoints/mcp.ts
10.4 Próximas áreas para profundizar
query.tsresumeAgent.tsloadSkillsDir- carga de plugins
systemPromptSections.tscoordinator/*attachments.tsAgentSummary
Conclusión
Si hubiera que quedarse con una sola frase, sería esta:
El verdadero secreto de Claude Code no es un system prompt, sino un sistema unificado que combina prompt architecture, tool runtime, permission model, agent orchestration, skill packaging, plugin system, hook governance, MCP integration, context hygiene y product engineering.
Por eso Claude Code se parece menos a un chat con herramientas y más a un Agent Operating System extensible y gobernable.