SpyBara
Go Premium

Documentation 2026-10-24 22:59 UTC to 2026-10-25 23:58 UTC

56 files changed +693 −198. View all changes and history on the product overview
2026
Fri 30 23:01 Thu 29 23:57 Wed 28 23:57 Tue 27 22:59 Mon 26 22:57 Sun 25 23:58 Sat 24 22:59 Fri 23 22:59 Thu 22 22:58 Wed 21 23:02 Tue 20 23:00 Mon 19 23:58 Sat 17 23:57 Fri 16 22:59 Thu 15 23:58 Wed 14 22:58 Tue 13 23:57 Sun 11 23:57 Sat 10 23:01 Fri 9 23:02 Thu 8 22:58 Wed 7 23:59 Tue 6 23:59 Mon 5 23:58 Sun 4 23:58 Sat 3 23:57 Fri 2 22:59 Thu 1 23:59
Details

324 * La llamada fue de un solo disparo, así que no existe resultado anterior.324 * La llamada fue de un solo disparo, así que no existe resultado anterior.

325 * El bloqueo ocurrió en el primer turno.325 * El bloqueo ocurrió en el primer turno.

326 * El turno anterior al bloqueo fue el `/clear` mismo, así que su resultado cubre solo el reinicio.326 * El turno anterior al bloqueo fue el `/clear` mismo, así que su resultado cubre solo el reinicio.

3272. Sume el `usage` en los mensajes del asistente en su lugar, contando cada respuesta de API una vez, como hace el ejemplo [Track per-step usage](#track-per-step-usage). En modo de un solo disparo, sume todos ellos; en modo de entrada de transmisión, sume los que llegaron después del último resultado. Esto le da los tokens de entrada y caché del bucle principal. El uso de subagentes no es recuperable de esta manera, tampoco lo son los tokens de salida o el costo en USD, porque [el `output_tokens` por paso es un marcador de posición](#read-output-tokens-from-the-result-message).3272. Sume el `usage` en los mensajes del asistente en su lugar, contando cada respuesta de API una vez, como hace el ejemplo [Rastrear el uso por paso](#track-per-step-usage). En modo de un solo disparo, sume todos ellos; en modo de entrada de transmisión, sume los que llegaron después del último resultado. Esto le da los tokens de entrada y caché del bucle principal. El uso de subagentes no es recuperable de esta manera, tampoco lo son los tokens de salida o el costo en USD, porque [el `output_tokens` por paso es un marcador de posición](#read-output-tokens-from-the-result-message).

328 328 

329### Rastrear tokens en caché329### Rastrear tokens en caché

330 330 

Details

771 771 

772Cuando una devolución de llamada excede su tiempo de espera, Claude Code la cancela y descarta su salida, y la sesión continúa en lugar de colgarse. Lo que sucede a continuación depende del evento:772Cuando una devolución de llamada excede su tiempo de espera, Claude Code la cancela y descarta su salida, y la sesión continúa en lugar de colgarse. Lo que sucede a continuación depende del evento:

773 773 

774* `PreToolUse`: Claude Code bloquea la llamada a herramienta. En su lugar, Claude recibe un resultado de herramienta indicando que el hook no respondió antes de su tiempo de espera, y el turno continúa. Antes de v2.1.210, Claude Code reportaba el tiempo de espera a Claude como un rechazo del usuario, lo que hacía que las sesiones desatendidas se detuvieran y esperaran entrada.774* `PreToolUse`: Claude Code bloquea la llamada a herramienta. Si todos los demás hooks no devolvieron nada o solo una decisión `allow`, el resultado de la herramienta le indica a Claude que el hook no respondió antes de su tiempo de espera, y el turno continúa. Si otro de tus hooks ya denegó la llamada, su denegación igualmente llega a Claude: el resultado de la herramienta incluye el motivo de ese hook, y el texto del tiempo de espera puede aparecer a continuación.

775 

776 Antes de v2.1.210, Claude Code reportaba el tiempo de espera a Claude como un rechazo del usuario, lo que hacía que las sesiones desatendidas se detuvieran y esperaran entrada.

775* `PostToolUse` y `PostToolUseFailure`: Claude Code mantiene el resultado de la herramienta y el turno continúa.777* `PostToolUse` y `PostToolUseFailure`: Claude Code mantiene el resultado de la herramienta y el turno continúa.

776* `UserPromptSubmit` y [`UserPromptExpansion`](https://code.claude.com/docs/es/hooks#userpromptexpansion): Claude Code bloquea el prompt con un mensaje que nombra el hook y el tiempo de espera, y la sesión continúa. Antes de v2.1.208, Claude Code terminaba la consulta con `error_during_execution` cuando se agotaba el tiempo de espera de una devolución de llamada en estos eventos.778* `UserPromptSubmit` y [`UserPromptExpansion`](https://code.claude.com/docs/es/hooks#userpromptexpansion): Claude Code bloquea el prompt con un mensaje que nombra el hook y el tiempo de espera, y la sesión continúa. Antes de v2.1.208, Claude Code terminaba la consulta con `error_during_execution` cuando se agotaba el tiempo de espera de una devolución de llamada en estos eventos.

777* `Stop` y `SubagentStop`: la devolución de llamada con tiempo de espera agotado cuenta como no devolver ninguna decisión. El agente o subagente se detiene como si esa devolución de llamada lo hubiera permitido, y una decisión de tus otros hooks en el evento aún se aplica. Antes de Claude Code v2.1.273, una devolución de llamada `Stop` o `SubagentStop` con tiempo de espera agotado contaba como una ejecución de hook fallida, y Claude Code descartaba las decisiones de tus otros hooks en el evento.779* `Stop` y `SubagentStop`: la devolución de llamada con tiempo de espera agotado cuenta como no devolver ninguna decisión. El agente o subagente se detiene como si esa devolución de llamada lo hubiera permitido, y una decisión de tus otros hooks en el evento aún se aplica. Antes de Claude Code v2.1.273, una devolución de llamada `Stop` o `SubagentStop` con tiempo de espera agotado contaba como una ejecución de hook fallida, y Claude Code descartaba las decisiones de tus otros hooks en el evento.

Details

309| `options.dir` | `string` | `undefined` | Directorio de proyecto en el que buscar la sesión. Cuando se omite, busca en todos los proyectos |309| `options.dir` | `string` | `undefined` | Directorio de proyecto en el que buscar la sesión. Cuando se omite, busca en todos los proyectos |

310| `options.limit` | `number` | `undefined` | Número máximo de mensajes a devolver |310| `options.limit` | `number` | `undefined` | Número máximo de mensajes a devolver |

311| `options.offset` | `number` | `undefined` | Número de mensajes a omitir desde el inicio |311| `options.offset` | `number` | `undefined` | Número de mensajes a omitir desde el inicio |

312| `options.includeSystemMessages` | `boolean` | `false` | Cuando es `true`, también devuelve mensajes del sistema, como los límites de compactación, junto con los mensajes de usuario y asistente |

312 313 

313#### Tipo de retorno: `SessionMessage`314#### Tipo de retorno: `SessionMessage`

314 315 

315| Propiedad | Tipo | Descripción |316| Propiedad | Tipo | Descripción |

316| :- | :- | :- |317| :- | :- | :- |

317| `type` | `"user" \| "assistant"` | Rol del mensaje |318| `type` | `"user" \| "assistant" \| "system"` | Rol del mensaje. `"system"` aparece solo cuando `options.includeSystemMessages` es `true` |

318| `uuid` | `string` | Identificador de mensaje único |319| `uuid` | `string` | Identificador de mensaje único |

319| `session_id` | `string` | Sesión a la que pertenece este mensaje |320| `session_id` | `string` | Sesión a la que pertenece este mensaje |

320| `message` | `unknown` | Payload del mensaje sin procesar de la transcripción |321| `message` | `unknown` | Payload del mensaje sin procesar de la transcripción |


632 }): Promise<SDKControlReloadPluginsResponse>;633 }): Promise<SDKControlReloadPluginsResponse>;

633 reloadSkills(): Promise<SDKControlReloadSkillsResponse>;634 reloadSkills(): Promise<SDKControlReloadSkillsResponse>;

634 reloadOutputStyles(): Promise<SDKControlReloadOutputStylesResponse>;635 reloadOutputStyles(): Promise<SDKControlReloadOutputStylesResponse>;

636 seedReadState(path: string, mtime: number): Promise<void>;

635 accountInfo(): Promise<AccountInfo>;637 accountInfo(): Promise<AccountInfo>;

636 reconnectMcpServer(serverName: string): Promise<void>;638 reconnectMcpServer(serverName: string): Promise<void>;

637 toggleMcpServer(serverName: string, enabled: boolean): Promise<void>;639 toggleMcpServer(serverName: string, enabled: boolean): Promise<void>;

638 setMcpServers(servers: Record<string, McpServerConfig>): Promise<McpSetServersResult>;640 setMcpServers(servers: Record<string, McpServerConfig>): Promise<McpSetServersResult>;

641 setMcpPermissionModeOverride(

642 serverName: string,

643 mode: 'default' | 'auto' | null

644 ): Promise<{ warning?: string }>;

639 readMcpResource(serverName: string, uri: string): Promise<SDKControlMcpReadResourceResponse>;645 readMcpResource(serverName: string, uri: string): Promise<SDKControlMcpReadResourceResponse>;

640 streamInput(stream: AsyncIterable<SDKUserMessage>): Promise<void>;646 streamInput(stream: AsyncIterable<SDKUserMessage>): Promise<void>;

641 stopTask(taskId: string): Promise<void>;647 stopTask(taskId: string): Promise<void>;

648 backgroundTasks(toolUseId?: string): Promise<boolean>;

642 close(): void;649 close(): void;

643}650}

644```651```


665| `reloadPlugins(options?)` | Recarga los plugins desde el disco, para que los plugins que instales o edites durante la sesión lleguen a la sesión en ejecución. Se resuelve con un [`SDKControlReloadPluginsResponse`](#sdkcontrolreloadpluginsresponse) que enumera los comandos, subagentes y plugins de la sesión, y el estado de los servidores MCP. Requiere Agent SDK v0.2.85 o posterior. La [opción `holdOnCacheImpact`](#sdkcontrolreloadpluginsresponse) requiere Agent SDK v0.3.268 o posterior |672| `reloadPlugins(options?)` | Recarga los plugins desde el disco, para que los plugins que instales o edites durante la sesión lleguen a la sesión en ejecución. Se resuelve con un [`SDKControlReloadPluginsResponse`](#sdkcontrolreloadpluginsresponse) que enumera los comandos, subagentes y plugins de la sesión, y el estado de los servidores MCP. Requiere Agent SDK v0.2.85 o posterior. La [opción `holdOnCacheImpact`](#sdkcontrolreloadpluginsresponse) requiere Agent SDK v0.3.268 o posterior |

666| `reloadSkills()` | Recarga los skills desde el disco, para que los skills que agregues o edites durante la sesión estén disponibles en la sesión en ejecución. Se resuelve con un [`SDKControlReloadSkillsResponse`](#sdkcontrolreloadskillsresponse) que enumera los skills disponibles después de la recarga. Requiere Agent SDK v0.3.163 o posterior |673| `reloadSkills()` | Recarga los skills desde el disco, para que los skills que agregues o edites durante la sesión estén disponibles en la sesión en ejecución. Se resuelve con un [`SDKControlReloadSkillsResponse`](#sdkcontrolreloadskillsresponse) que enumera los skills disponibles después de la recarga. Requiere Agent SDK v0.3.163 o posterior |

667| `reloadOutputStyles()` | Vuelve a leer los [estilos de salida](https://code.claude.com/docs/es/output-styles.md) desde el disco, para que un archivo de estilo que agregues o edites durante la sesión esté disponible en la sesión en ejecución. Se resuelve con un [`SDKControlReloadOutputStylesResponse`](#sdkcontrolreloadoutputstylesresponse) que enumera los nombres de los estilos disponibles después de la recarga. Requiere Agent SDK v0.3.261 o posterior |674| `reloadOutputStyles()` | Vuelve a leer los [estilos de salida](https://code.claude.com/docs/es/output-styles.md) desde el disco, para que un archivo de estilo que agregues o edites durante la sesión esté disponible en la sesión en ejecución. Se resuelve con un [`SDKControlReloadOutputStylesResponse`](#sdkcontrolreloadoutputstylesresponse) que enumera los nombres de los estilos disponibles después de la recarga. Requiere Agent SDK v0.3.261 o posterior |

675| `seedReadState(path, mtime)` | Marca un archivo como ya leído para que un Edit posterior no falle con `File has not been read yet`. Consulta [`seedReadState()`](#seedreadstate). Requiere TypeScript SDK v0.2.83 o posterior |

668| `accountInfo()` | Devuelve la información de la cuenta |676| `accountInfo()` | Devuelve la información de la cuenta |

669| `reconnectMcpServer(serverName)` | Vuelve a conectar un servidor MCP por nombre. Si el nombre también coincide con una entrada de un archivo de configuración como `.mcp.json` o `~/.claude.json`, Claude Code vuelve a conectar el servidor que configuraste mediante [`mcpServers`](#options) o `setMcpServers()`, no la entrada del archivo de configuración. Ese orden de resolución requiere Claude Code v2.1.257 o posterior |677| `reconnectMcpServer(serverName)` | Vuelve a conectar un servidor MCP por nombre. Si el nombre también coincide con una entrada de un archivo de configuración como `.mcp.json` o `~/.claude.json`, Claude Code vuelve a conectar el servidor que configuraste mediante [`mcpServers`](#options) o `setMcpServers()`, no la entrada del archivo de configuración. Ese orden de resolución requiere Claude Code v2.1.257 o posterior |

670| `toggleMcpServer(serverName, enabled)` | Habilita o deshabilita un servidor MCP por nombre, con la misma resolución de nombres que `reconnectMcpServer()`. Deshabilitar un servidor lo desconecta y elimina sus herramientas. Consulta [`toggleMcpServer()`](#togglemcpserver) para ver la versión de Claude Code que esto necesita para cada tipo de servidor |678| `toggleMcpServer(serverName, enabled)` | Habilita o deshabilita un servidor MCP por nombre, con la misma resolución de nombres que `reconnectMcpServer()`. Deshabilitar un servidor lo desconecta y elimina sus herramientas. Consulta [`toggleMcpServer()`](#togglemcpserver) para ver la versión de Claude Code que esto necesita para cada tipo de servidor |

671| `setMcpServers(servers)` | Reemplaza los servidores MCP que administra este método: los servidores agregados mediante él y los [servidores SDK en proceso](#createsdkmcpserver). Se resuelve con un [`McpSetServersResult`](#mcpsetserversresult) que indica qué servidores se agregaron y cuáles se eliminaron, y cualquier error; esa sección indica qué otros servidores permanecen conectados |679| `setMcpServers(servers)` | Reemplaza los servidores MCP que administra este método: los servidores agregados mediante él y los [servidores SDK en proceso](#createsdkmcpserver). Se resuelve con un [`McpSetServersResult`](#mcpsetserversresult) que indica qué servidores se agregaron y cuáles se eliminaron, y cualquier error; esa sección indica qué otros servidores permanecen conectados |

680| `setMcpPermissionModeOverride(serverName, mode)` | Sobrescribe el modo de permisos de las herramientas de un servidor MCP con un modo más estricto que el de la sesión, o borra la sobrescritura con `null`. Solo está disponible en el modo de entrada en streaming. Consulta [`setMcpPermissionModeOverride()`](#setmcppermissionmodeoverride). Requiere TypeScript SDK v0.3.187 o posterior |

672| `readMcpResource(serverName, uri)` | *Alfa.* Lee un recurso `ui://` de MCP Apps desde un servidor MCP conectado para que tu aplicación pueda renderizar el widget de una herramienta. Se resuelve con un [`SDKControlMcpReadResourceResponse`](#sdkcontrolmcpreadresourceresponse). Requiere TypeScript Agent SDK v0.3.280 o posterior |681| `readMcpResource(serverName, uri)` | *Alfa.* Lee un recurso `ui://` de MCP Apps desde un servidor MCP conectado para que tu aplicación pueda renderizar el widget de una herramienta. Se resuelve con un [`SDKControlMcpReadResourceResponse`](#sdkcontrolmcpreadresourceresponse). Requiere TypeScript Agent SDK v0.3.280 o posterior |

673| `streamInput(stream)` | Envía mensajes de entrada en streaming a la consulta para conversaciones de varios turnos |682| `streamInput(stream)` | Envía mensajes de entrada en streaming a la consulta para conversaciones de varios turnos |

674| `stopTask(taskId)` | Detiene una tarea en segundo plano en ejecución por su ID |683| `stopTask(taskId)` | Detiene una tarea en segundo plano en ejecución por su ID |

684| `backgroundTasks(toolUseId?)` | Mueve a segundo plano los comandos Bash y los subagentes en ejecución que el turno está esperando, igual que al presionar Ctrl+B en la terminal interactiva. Consulta [`backgroundTasks()`](#backgroundtasks). Requiere TypeScript SDK v0.2.139 o posterior |

675| `close()` | Cierra la consulta y termina el proceso subyacente. Finaliza la consulta de forma forzada y libera todos los recursos |685| `close()` | Cierra la consulta y termina el proceso subyacente. Finaliza la consulta de forma forzada y libera todos los recursos |

676 686 

687#### `setMcpPermissionModeOverride()`

688 

689Sobrescribe el modo de permisos de las herramientas de un servidor MCP con un modo más estricto que el de la sesión, o borra la sobrescritura con `null`. Úsalo cuando una sesión se ejecuta en un modo que omite las solicitudes de permiso por acción, pero las herramientas de un servidor deben seguir revisándose. Requiere TypeScript SDK v0.3.187 o posterior.

690 

691Pasa uno de estos tres valores como `mode`:

692 

693* `'default'`: Claude Code evalúa las llamadas a herramientas de ese servidor como lo hace el [modo Manual](https://code.claude.com/docs/es/permission-modes.md#available-modes).

694* `'auto'`: Claude Code dirige las llamadas a herramientas de ese servidor al clasificador del [modo automático](https://code.claude.com/docs/es/permission-modes.md#eliminate-prompts-with-auto-mode). Claude Code rechaza este valor cuando el clasificador no está disponible para la sesión.

695* `null`: borra la sobrescritura.

696 

697La sobrescritura solo tiene efecto mientras la sesión está en un modo que omite las solicitudes de permiso por acción: `bypassPermissions` o `auto`. En cualquier otro modo de sesión, Claude Code ignora la sobrescritura, así que nunca puede ampliar lo que permite la sesión.

698 

699La promesa se resuelve con `{ warning }` cuando todavía no se conoce ningún servidor con ese nombre. Claude Code guarda la sobrescritura de todos modos y la aplica en cuanto se conecta un servidor con ese nombre exacto, así que la advertencia sirve para detectar errores tipográficos, no indica un fallo.

700 

701Solo está disponible en el modo de entrada en streaming, la misma restricción que `setModel()` y `setPermissionMode()`.

702 

703#### `seedReadState()`

704 

705Marca un archivo como ya leído para que un Edit posterior no falle con `File has not been read yet`. Úsalo cuando tu aplicación haya eliminado del contexto de la conversación un resultado anterior de `Read` y Claude vaya a editar ese archivo a continuación. Requiere TypeScript SDK v0.2.83 o posterior.

706 

707Pasa `mtime` como la fecha de modificación del archivo en el momento de esa lectura anterior, en milisegundos enteros desde la época, por ejemplo `Math.floor(stat.mtimeMs)`. Si el archivo en disco cambió después de ese momento, Claude Code omite la marca.

708 

709La promesa se resuelve tanto si el archivo se marcó como si no, así que una promesa resuelta no te indica cuál de los dos casos ocurrió.

710 

711#### `backgroundTasks()`

712 

713Mueve a segundo plano los comandos Bash y los subagentes en ejecución que el turno está esperando, igual que al presionar Ctrl+B en la terminal interactiva. Pasa el `toolUseId` de una llamada a herramienta para enviar a segundo plano solo el comando Bash o el subagente que inició esa llamada, u omítelo para enviar a segundo plano todas las tareas en primer plano. Requiere TypeScript SDK v0.2.139 o posterior.

714 

715Cada llamada a herramienta enviada a segundo plano vuelve a Claude de inmediato con un resultado que indica que se está ejecutando en segundo plano, el turno continúa y Claude Code emite un [`SDKTaskNotificationMessage`](#sdktasknotificationmessage) cuando termina la tarea.

716 

717En una sesión donde las tareas en segundo plano están habilitadas, la promesa se resuelve con un booleano:

718 

719* **`true`**: se envió una tarea a segundo plano, u omitiste `toolUseId`.

720* **`false`**: el `toolUseId` que pasaste no coincidió con ninguna tarea en primer plano.

721 

722Si las tareas en segundo plano están deshabilitadas para la sesión, por ejemplo con [`CLAUDE_CODE_DISABLE_BACKGROUND_TASKS`](https://code.claude.com/docs/es/env-vars), la promesa se rechaza y no se envía nada a segundo plano.

723 

677#### `applyFlagSettings()`724#### `applyFlagSettings()`

678 725 

679Cambia la [configuración](https://code.claude.com/docs/es/settings.md) de una sesión en ejecución sin reiniciar la consulta. Úsalo cuando un ajuste que no tiene un setter dedicado necesite cambiar durante la sesión, como endurecer `permissions` después de que el agente lea una entrada no confiable. `setModel()` y `setPermissionMode()` son setters dedicados para esas dos claves; `applyFlagSettings()` es la forma general que acepta cualquier subconjunto de las claves de configuración, y pasar `model` aquí se comporta igual que `setModel()`.726Cambia la [configuración](https://code.claude.com/docs/es/settings.md) de una sesión en ejecución sin reiniciar la consulta. Úsalo cuando un ajuste que no tiene un setter dedicado necesite cambiar durante la sesión, como endurecer `permissions` después de que el agente lea una entrada no confiable. `setModel()` y `setPermissionMode()` son setters dedicados para esas dos claves; `applyFlagSettings()` es la forma general que acepta cualquier subconjunto de las claves de configuración, y pasar `model` aquí se comporta igual que `setModel()`.


1472 | SDKPermissionDeniedMessage1519 | SDKPermissionDeniedMessage

1473 | SDKPromptSuggestionMessage1520 | SDKPromptSuggestionMessage

1474 | SDKAPIRetryMessage1521 | SDKAPIRetryMessage

1522 | SDKControlRequestProgressMessage

1523 | SDKModelRefusalFallbackMessage

1524 | SDKModelRefusalNoFallbackMessage

1475 | SDKMirrorErrorMessage1525 | SDKMirrorErrorMessage

1476 | SDKInformationalMessage1526 | SDKInformationalMessage

1477 | SDKConversationResetMessage;1527 | SDKConversationResetMessage;

1478```1528```

1479 1529 

1530Tres mensajes de esta unión informan del progreso de las solicitudes de control y de los rechazos del modelo. Todos tienen `type: "system"`, así que distínguelos por el `subtype` indicado junto a cada uno:

1531 

1532* `SDKControlRequestProgressMessage`, `subtype: "control_request_progress"`: informa del progreso de una solicitud de control de larga duración que envió tu cliente. `request_id` asocia el mensaje con esa solicitud, y `status` es `"started"` o `"api_retry"`. Requiere Agent SDK v0.3.203 o posterior.

1533* `SDKModelRefusalFallbackMessage`, `subtype: "model_refusal_fallback"`: se emite cuando el modelo termina el stream con un rechazo y el turno se reintenta con un modelo de respaldo. Incluye `original_model` y `fallback_model`. Requiere Agent SDK v0.3.170 o posterior.

1534* `SDKModelRefusalNoFallbackMessage`, `subtype: "model_refusal_no_fallback"`: se emite cuando el modelo termina el stream con un rechazo y no se ejecuta ningún reintento, por ejemplo porque no hay ningún modelo de respaldo configurado. Incluye `original_model`. Requiere Agent SDK v0.3.193 o posterior.

1535 

1480### `SDKAssistantMessage`1536### `SDKAssistantMessage`

1481 1537 

1482Mensaje de respuesta del asistente.1538Mensaje de respuesta del asistente.


1636 stop_reason: string | null;1692 stop_reason: string | null;

1637 ttft_ms?: number;1693 ttft_ms?: number;

1638 ttft_stream_ms?: number;1694 ttft_stream_ms?: number;

1695 time_to_request_ms?: number;

1639 user_message_uuid?: string;1696 user_message_uuid?: string;

1640 user_message_uuids?: string[];1697 user_message_uuids?: string[];

1641 resume_reason?: string;1698 resume_reason?: string;


1701* `api_error_status`: el código de estado HTTP del error de API que terminó la conversación. Ausente o `null` cuando el turno terminó sin un error de API.1758* `api_error_status`: el código de estado HTTP del error de API que terminó la conversación. Ausente o `null` cuando el turno terminó sin un error de API.

1702* `ttft_ms`: tiempo hasta el primer token en milisegundos, medido cuando llega el primer mensaje completo del asistente. Presente solo en la rama de éxito.1759* `ttft_ms`: tiempo hasta el primer token en milisegundos, medido cuando llega el primer mensaje completo del asistente. Presente solo en la rama de éxito.

1703* `ttft_stream_ms`: tiempo en milisegundos hasta el primer evento de streaming `message_start`, cuando se abre el stream de respuesta. Es menor que `ttft_ms`; la diferencia entre ambos es el tiempo dedicado a transmitir en streaming el primer mensaje. Presente solo en la rama de éxito.1760* `ttft_stream_ms`: tiempo en milisegundos hasta el primer evento de streaming `message_start`, cuando se abre el stream de respuesta. Es menor que `ttft_ms`; la diferencia entre ambos es el tiempo dedicado a transmitir en streaming el primer mensaje. Presente solo en la rama de éxito.

1761* `time_to_request_ms`: tiempo en milisegundos desde el inicio del turno hasta que Claude Code envía la solicitud a la API. Presente solo en la rama de éxito. Requiere Claude Code v2.1.162 o posterior.

1704* `user_message_uuid`: el `uuid` del mensaje que enviaste y que este turno respondió. Consulta [`user_message_uuid`](#user_message_uuid) para saber qué resultados lo llevan.1762* `user_message_uuid`: el `uuid` del mensaje que enviaste y que este turno respondió. Consulta [`user_message_uuid`](#user_message_uuid) para saber qué resultados lo llevan.

1705* `user_message_uuids`: los `uuid` de cada mensaje que enviaste y que Claude Code respondió en este turno. Consulta [`user_message_uuids`](#user_message_uuids).1763* `user_message_uuids`: los `uuid` de cada mensaje que enviaste y que Claude Code respondió en este turno. Consulta [`user_message_uuids`](#user_message_uuids).

1706* `resume_reason`: por qué este turno continúa uno que un reinicio interrumpió. Presente en ambas ramas. Consulta [`resume_reason`](#resume_reason).1764* `resume_reason`: por qué este turno continúa uno que un reinicio interrumpió. Presente en ambas ramas. Consulta [`resume_reason`](#resume_reason).


1772* Turnos que no responden a ningún mensaje tuyo, o que responden a un mensaje que enviaste sin `uuid`1830* Turnos que no responden a ningún mensaje tuyo, o que responden a un mensaje que enviaste sin `uuid`

1773* Resultados que no responden a ningún mensaje que enviaste, como el resultado puesto a cero después de que falla un proceso worker1831* Resultados que no responden a ningún mensaje que enviaste, como el resultado puesto a cero después de que falla un proceso worker

1774 1832 

1833Cuando un hook [`UserPromptSubmit`](https://code.claude.com/docs/es/hooks#userpromptsubmit) bloquea un mensaje que inicia su propio turno, o lo detiene con `continue: false`, igualmente obtienes un resultado para ese mensaje. Es un resultado de éxito con `is_error: false` y `num_turns: 0`, su `result` es el [mensaje de bloqueo](https://code.claude.com/docs/es/hooks.md#what-a-blocked-prompt-leaves-behind) o el [mensaje de detención](https://code.claude.com/docs/es/hooks.md#json-output), y devuelve el `uuid` del mensaje con las mismas reglas que cualquier otro resultado. El resultado no tiene `terminal_reason`, y nada en él aparte del texto de `result` indica que un hook terminó el turno. Un mensaje que un hook bloquea mientras otro turno está en ejecución puede no obtener ningún resultado: consulta [`user_message_uuids`](#user_message_uuids).

1834 

1775#### `user_message_uuids`1835#### `user_message_uuids`

1776 1836 

1777Los `uuid` de cada mensaje que enviaste y que Claude Code respondió en este turno. Cuando envías varios mensajes en poco tiempo, Claude Code puede fusionarlos en un solo turno, y `user_message_uuid` entonces nombra solo el último de ellos. Para asociar la respuesta con cualquiera de los mensajes fusionados, busca el `uuid` de ese mensaje en cualquier posición de esta lista. Requiere Agent SDK v0.3.259 o posterior.1837Los `uuid` de cada mensaje que enviaste y que Claude Code respondió en este turno. Cuando envías varios mensajes en poco tiempo, Claude Code puede fusionarlos en un solo turno, y `user_message_uuid` entonces nombra solo el último de ellos. Para asociar la respuesta con cualquiera de los mensajes fusionados, busca el `uuid` de ese mensaje en cualquier posición de esta lista. Requiere Agent SDK v0.3.259 o posterior.

1778 1838 

1779Claude Code establece la lista junto con `user_message_uuid` en cada frame de respuesta que lleva ese campo y en el resultado. Para ver el conjunto completo de frames del turno que devuelven el `uuid` del mensaje respondido, y la versión que requiere cada uno, consulta [`user_message_uuid`](#user_message_uuid). La lista siempre contiene `user_message_uuid` y tiene como máximo 64 entradas.1839Claude Code establece la lista junto con `user_message_uuid` en cada frame de respuesta que lleva ese campo y en el resultado. Para ver el conjunto completo de frames del turno que devuelven el `uuid` del mensaje respondido, y la versión que requiere cada uno, consulta [`user_message_uuid`](#user_message_uuid). La lista siempre contiene `user_message_uuid` y tiene como máximo 64 entradas.

1780 1840 

1781Cuando Claude Code recoge un mensaje normal que enviaste mientras se ejecutaba un turno, añade el `uuid` de ese mensaje a la lista del resultado.1841Cuando Claude Code recoge un mensaje normal que enviaste mientras un turno estaba en ejecución, agrega el `uuid` de ese mensaje a la lista del resultado. Cuando un hook [`UserPromptSubmit`](https://code.claude.com/docs/es/hooks#userpromptsubmit) bloquea el mensaje al recogerlo, Claude Code lo descarta en su lugar: el mensaje nunca llega a Claude y no se conserva para un turno posterior. No obtienes ningún resultado para él, y su `uuid` no aparece en la lista de ningún resultado. Si un hook puede bloquear mensajes, establece un tiempo de espera al esperar un resultado que liste un mensaje que enviaste mientras un turno estaba en ejecución.

1842 

1843Eso se cumple cuando la salida del hook es solo un bloqueo. Si la salida establece `continue: false`, incluso junto a `decision: "block"`, o el hook es un hook de prompt que responde [`ok: false`](https://code.claude.com/docs/es/hooks#response-schema) sin `continueOnBlock: true`, Claude Code detiene el mensaje en lugar de descartarlo. El mensaje espera su propio turno, obtienes un resultado para él y su texto permanece en la conversación, así que Claude lo ve en el siguiente turno.

1782 1844 

1783Cuando una primera respuesta o un resultado lleva `user_message_uuid` sin la lista, proviene de una versión anterior de Claude Code, así que recurre al campo individual.1845Cuando una primera respuesta o un resultado lleva `user_message_uuid` sin la lista, proviene de una versión anterior de Claude Code, así que recurre al campo individual.

1784 1846 

Details

582}582}

583```583```

584 584 

585Una respuesta remota que no coincida exactamente con el formato esperado falla de una de dos maneras, y en ambos casos el diálogo del terminal local permanece abierto:585Si una respuesta remota no tiene efecto y el diálogo de la terminal local permanece abierto, comprueba estas causas:

586 586 

587* **Formato diferente**: la expresión regular de tu manejador entrante no coincide, por lo que texto como `approve it` o `yes` sin un ID cae a través como un mensaje normal a Claude.587* **El formato es incorrecto**: la expresión regular de tu manejador entrante no coincide, por lo que texto como `approve it` o `yes` sin un ID cae a través como un mensaje normal a Claude.

588* **Formato correcto, ID incorrecto**: tu servidor emite un veredicto, pero Claude Code no encuentra ninguna solicitud abierta con ese ID y lo descarta silenciosamente.588* **El ID es incorrecto**: tu servidor emite un veredicto, pero Claude Code no encuentra ninguna solicitud abierta con ese ID y lo descarta silenciosamente.

589* **El ID ya lo usó una solicitud anterior**: tu servidor emite un veredicto con el ID de la solicitud, pero una solicitud anterior en la sesión tenía el mismo ID. Una vez que un ID se repite, Claude Code descarta cualquier veredicto del canal que lo lleve, para que una respuesta destinada a una solicitud no pueda aprobar la otra. Un ID son cinco letras aleatorias, así que una repetición es poco frecuente. Responde en la terminal en su lugar.

589 590 

590### Ejemplo completo591### Ejemplo completo

591 592 

Details

90 90 

91### Los mensajes enviados a mitad de turno no se someten a checkpoint91### Los mensajes enviados a mitad de turno no se someten a checkpoint

92 92 

93En el menú de rewind, un mensaje que [escribiste mientras Claude todavía estaba trabajando](https://code.claude.com/docs/es/interactive-mode.md#queue-messages-while-claude-works) puede aparecer marcado como **No code restore**. Claude leyó ese mensaje antes de que terminara su turno. [Los checkpoints se crean para los prompts que inician un turno](#how-checkpoints-work), por lo que este mensaje no tiene uno propio. Las ediciones que Claude realizó después de leerlo cuentan para el prompt que inició el turno.93En el menú de rewind, un mensaje que [escribiste mientras Claude todavía estaba trabajando](https://code.claude.com/docs/es/interactive-mode.md#queue-messages-while-claude-works) puede aparecer marcado como **No code restore**. El mensaje marcado no tiene un [checkpoint](#how-checkpoints-work) propio.

94 94 

95No necesitas hacer nada con el mensaje en sí. Para deshacer los cambios de archivos de esa parte de la sesión, selecciona el prompt que inició el turno y elige **Restore code** o **Restore code and conversation**. Eso revierte las ediciones de archivos de Claude de todo el turno, incluidas las de antes de que llegara tu mensaje. Seleccionar el mensaje marcado sigue ofreciendo **Restore conversation**, que retrocede la conversación hasta ese mensaje y deja tus archivos como están.95Para deshacer las ediciones de archivos que Claude realizó después de ese mensaje, selecciona el prompt que inició el turno y elige **Restore code** o **Restore code and conversation**. Eso revierte las ediciones de archivos de Claude de todo el turno, incluidas las de antes de que llegara tu mensaje.

96 96 

97### Las rutas con enlaces simbólicos y enlaces duros no se restauran97### Las rutas con enlaces simbólicos y enlaces duros no se restauran

98 98 

Details

98 98 

99Las advertencias y el porcentaje provienen de los encabezados `anthropic-ratelimit-unified-*`, que el gateway agrega a cada respuesta exitosa de `/v1/messages` para un desarrollador que tiene un límite. Los encabezados siempre describen el límite propio del desarrollador: el gateway elimina los encabezados de rate limit del proveedor upstream, que describen tu cuota compartida, y nunca los reenvía.99Las advertencias y el porcentaje provienen de los encabezados `anthropic-ratelimit-unified-*`, que el gateway agrega a cada respuesta exitosa de `/v1/messages` para un desarrollador que tiene un límite. Los encabezados siempre describen el límite propio del desarrollador: el gateway elimina los encabezados de rate limit del proveedor upstream, que describen tu cuota compartida, y nunca los reenvía.

100 100 

101El gasto que ve un desarrollador es la propia [estimación](#how-requests-are-priced) del gateway, la misma cifra con la que aplica el límite, y no un monto de la factura de tu proveedor. Claude Code lee los montos en dólares con una solicitud separada al gateway. Si estableces `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` en las máquinas de los desarrolladores, como sugiere [Postura de cumplimiento](https://code.claude.com/docs/es/claude-apps-gateway-deploy.md#compliance-posture), Claude Code omite esa solicitud. Con esa variable establecida, o con un servidor del gateway anterior a v2.1.284, la barra y la línea de estado muestran solo el porcentaje.101El gasto que ve un desarrollador es la propia [estimación](#how-requests-are-priced) del gateway, la misma cifra con la que aplica el límite. No es un monto de la factura de tu proveedor. Claude Code lee los montos en dólares con una solicitud separada al gateway, que envía incluso si estableces `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` en las máquinas de los desarrolladores. Antes de v2.1.295, Claude Code omitía esa solicitud cuando la variable estaba establecida, y `/usage` y la línea de estado mostraban el porcentaje y la fecha de reinicio, sin montos en dólares.

102 102 

103## Referencia de API de administrador103## Referencia de API de administrador

104 104 

Details

18 18 

19* **Navegador**: [claude.ai/code](https://claude.ai/code), también llamado Claude Code en la web19* **Navegador**: [claude.ai/code](https://claude.ai/code), también llamado Claude Code en la web

20* **Móvil**: la pestaña **Code** en la [aplicación Claude](https://code.claude.com/docs/es/mobile.md)20* **Móvil**: la pestaña **Code** en la [aplicación Claude](https://code.claude.com/docs/es/mobile.md)

21* **Aplicación de escritorio**: seleccione **Cloud** en lugar de **Local** cuando [inicie una sesión](https://code.claude.com/docs/es/desktop.md#run-long-running-tasks-in-the-cloud)21* **Aplicación de escritorio**: selecciona un entorno en **Cloud** en el selector de entorno cuando [inicies una sesión](https://code.claude.com/docs/es/desktop.md#run-long-running-tasks-in-the-cloud)

22* **Terminal**: [`claude --cloud`](#from-terminal-to-cloud)22* **Terminal**: [`claude --cloud`](#from-terminal-to-cloud)

23* **Tareas programadas en la nube**: las [ejecuciones programadas y activadas](https://code.claude.com/docs/es/routines.md) se ejecutan cada una como una sesión en la nube23* **Tareas programadas en la nube**: las [ejecuciones programadas y activadas](https://code.claude.com/docs/es/routines.md) se ejecutan cada una como una sesión en la nube

24 24 


247 247 

248### Revisar cambios248### Revisar cambios

249 249 

250Cada sesión muestra un indicador de diff con líneas agregadas y eliminadas, como `+42 -18`. Selecciónalo para abrir la vista de diff, dejar comentarios en línea en líneas específicas y enviarlos a Claude con tu próximo mensaje.250Después de que Claude envía sus cambios a una rama, la tarjeta **Changes** en el panel junto al chat muestra las líneas agregadas y eliminadas, como `+42 -18`. Haz clic en los recuentos de líneas de la tarjeta **Changes** para abrir la vista de diff.

251 251 

252La vista de diff compara los cambios de la sesión contra su rama base de forma predeterminada. Para comparar contra cualquier otra rama en el repositorio, selecciona **Compare against** y elige una.252* También puedes hacer clic en **Changes** en la barra de título de la sesión, o en el menú **⋮** de la barra.

253* Para mostrar el panel cuando está oculto, haz clic en el icono **Show session rail** en la barra de título de la sesión, o en el menú **⋮** de la barra.

254 

255En la vista de diff, puedes comentar líneas y comparar con otra rama:

256 

257* **Comentar**: deja comentarios en línea en líneas específicas y luego envía los comentarios a Claude con tu próximo mensaje

258* **Comparar**: la vista de diff compara los cambios de la sesión contra su rama base de forma predeterminada. Para comparar contra cualquier otra rama en el repositorio, selecciona **Compare against** y elige una

253 259 

254Claude Code calcula estos diffs a partir del contenido de blob de git sin procesar, por lo que los controladores de diff y los filtros `textconv` configurados en el repositorio no se aplican.260Claude Code calcula estos diffs a partir del contenido de blob de git sin procesar, por lo que los controladores de diff y los filtros `textconv` configurados en el repositorio no se aplican.

255 261 


313 319 

314### Archivar sesiones320### Archivar sesiones

315 321 

316Puede archivar sesiones para mantener su lista de sesiones organizada. Las sesiones archivadas se ocultan de la lista de sesiones predeterminada pero se pueden ver filtrando sesiones archivadas.322Archiva una sesión para quitarla de la lista de sesiones de la barra lateral. Para archivar una, pasa el cursor sobre ella en la barra lateral, abre su menú **⋯** y selecciona **Archive**.

317 323 

318Para archivar una sesión, pase el cursor sobre la sesión en la barra lateral y seleccione el icono de archivo.324#### Encontrar una sesión archivada

325 

326Para ver tus sesiones archivadas, ve a [claude.ai/code/sessions](https://claude.ai/code/sessions) y abre la pestaña **Archived**. Para devolver una a la lista de sesiones de la barra lateral, pasa el cursor sobre ella en esa pestaña, abre su menú **⋮** y selecciona **Unarchive**.

319 327 

320### Eliminar sesiones328### Eliminar sesiones

321 329 

322Eliminar una sesión elimina permanentemente la sesión y sus datos. Esta acción no se puede deshacer. Puede eliminar una sesión de dos formas:330Eliminar una sesión elimina permanentemente la sesión y sus datos. Esta acción no se puede deshacer. Elimina una sesión desde la barra lateral, desde el menú de sesión o desde la pestaña **Archived** si ya la archivaste:

323 331 

324* **Desde la barra lateral**: filtre sesiones archivadas, luego pase el cursor sobre la sesión que desea eliminar y seleccione el icono de eliminar332* **Desde la barra lateral**: pasa el cursor sobre la sesión, abre su menú **⋯** y selecciona **Delete**

325* **Desde el menú de sesión**: abra una sesión, seleccione el menú desplegable junto al título de la sesión y seleccione **Delete**333* **Desde el menú de sesión**: abra una sesión, seleccione el menú desplegable junto al título de la sesión y seleccione **Delete**

334* **Desde la pestaña Archived**: pasa el cursor sobre la sesión en la [pestaña **Archived**](#find-an-archived-session), abre su menú **⋮** y selecciona **Delete**

326 335 

327Se le pedirá que confirme antes de que se elimine una sesión.336Se le pedirá que confirme antes de que se elimine una sesión.

328 337 


336 345 

337Hay algunas formas de activar correcciones automáticas dependiendo de dónde provenga la PR y qué dispositivo esté usando:346Hay algunas formas de activar correcciones automáticas dependiendo de dónde provenga la PR y qué dispositivo esté usando:

338 347 

339* **PRs creadas en una sesión en la nube**: abra la sesión en claude.ai/code, abra la barra de estado de CI y seleccione **Correcciones automáticas**348* **PRs creados en una sesión en la nube**: abre la sesión en claude.ai/code y busca el pull request en la [tarjeta **Changes**](#review-changes). Abre el menú **⋮** junto al título del pull request y activa **Auto-fix**

340* **Desde su terminal**: ejecute [`/autofix-pr`](https://code.claude.com/docs/es/commands) mientras está en la rama de la PR. Claude Code detecta la PR abierta con `gh`, genera una sesión en la nube y activa correcciones automáticas en un paso349* **Desde su terminal**: ejecute [`/autofix-pr`](https://code.claude.com/docs/es/commands) mientras está en la rama de la PR. Claude Code detecta la PR abierta con `gh`, genera una sesión en la nube y activa correcciones automáticas en un paso

341* **Desde la aplicación móvil**: dígale a Claude que corrija automáticamente la PR, por ejemplo "observa esta PR y corrige cualquier fallo de CI o comentario de revisión"350* **Desde la aplicación móvil**: dígale a Claude que corrija automáticamente la PR, por ejemplo "observa esta PR y corrige cualquier fallo de CI o comentario de revisión"

342* **Cualquier PR existente**: pegue la URL de la PR en una sesión y dígale a Claude que la corrija automáticamente351* **Cualquier PR existente**: pegue la URL de la PR en una sesión y dígale a Claude que la corrija automáticamente

343 352 

344Las correcciones automáticas son un control por PR. Para dejar de monitorear, abra la barra de estado de CI en la sesión en claude.ai/code y desactive el control **Correcciones automáticas**, o dígale a Claude que deje de observar la PR.353Para dejar de monitorear, desactiva **Auto-fix** en el menú **⋮** del pull request en la [tarjeta **Changes**](#review-changes) de la sesión, o dile a Claude que deje de observar el PR.

345 354 

346### Cómo Claude responde a la actividad de PR355### Cómo Claude responde a la actividad de PR

347 356 


381* Reintente después de un minuto, ya que la capacidad se aprovisiona bajo demanda390* Reintente después de un minuto, ya que la capacidad se aprovisiona bajo demanda

382* Confirme que su conexión de GitHub puede alcanzar el repositorio siguiendo [No repositories appear after connecting GitHub](https://code.claude.com/docs/es/web-quickstart.md#no-repositories-appear-after-connecting-github)391* Confirme que su conexión de GitHub puede alcanzar el repositorio siguiendo [No repositories appear after connecting GitHub](https://code.claude.com/docs/es/web-quickstart.md#no-repositories-appear-after-connecting-github)

383 392 

393### Your new session couldn't start

394 

395Tu prompt vuelve a estar en el cuadro desde el que lo enviaste.

396 

397* **Conexión perdida**: verifica tu conexión a internet y cualquier VPN o proxy que uses, luego envía tu prompt de nuevo

398* **Error del servidor**: espera un momento y luego envía tu prompt de nuevo. Si el aviso vuelve a aparecer, consulta [status.claude.com](https://status.claude.com)

399 

400### Can't rewind to this message

401 

402**Rewind to here** falla con este error en cualquier mensaje excepto el más reciente cuando tu sesión se ejecuta en un [runner autoalojado](https://code.claude.com/docs/es/self-hosted-environments) con una versión de Claude Code anterior a la v2.1.246. Pide a quien administre los runners de tu organización que [los actualice](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#pin-the-version).

403 

384### No se puede obtener UUID de organización404### No se puede obtener UUID de organización

385 405 

386`claude --cloud` y `claude --teleport` requieren iniciar sesión con una cuenta de claude.ai. Si te autenticas con una clave de API, o tus detalles de cuenta almacenados están obsoletos, verás uno de estos:406`claude --cloud` y `claude --teleport` requieren iniciar sesión con una cuenta de claude.ai. Si te autenticas con una clave de API, o tus detalles de cuenta almacenados están obsoletos, verás uno de estos:

Details

111 111 

112El proyecto ahora aparece en **Projects** en la barra lateral, y su conversación está abierta. [Tu primer lote](#your-first-batch) explica qué configurar antes de enviarle trabajo.112El proyecto ahora aparece en **Projects** en la barra lateral, y su conversación está abierta. [Tu primer lote](#your-first-batch) explica qué configurar antes de enviarle trabajo.

113 113 

114### Empezar desde una sesión en la nube existente114### Empezar desde una sesión existente

115 115 

116Si una sesión en la nube que iniciaste tú mismo está haciendo un trabajo que corresponde a un proyecto, abre su menú de la barra lateral, elige **Move to project** y luego elige una opción del submenú:116Si una sesión en la nube que iniciaste tú mismo está haciendo un trabajo que corresponde a un proyecto, abre su menú de la barra lateral, elige **Move to project** y luego elige una opción del submenú:

117 117 


120 120 

121También puede aparecer un banner **Set up project** encima del cuadro de mensaje de una sesión en la nube. Si lo usas en lugar de **Continue as new project**, el resultado es el mismo, excepto que el turno en curso de la sesión se detiene en cuanto se abre el proyecto.121También puede aparecer un banner **Set up project** encima del cuadro de mensaje de una sesión en la nube. Si lo usas en lugar de **Continue as new project**, el resultado es el mismo, excepto que el turno en curso de la sesión se detiene en cuanto se abre el proyecto.

122 122 

123Una sesión local no tiene estas opciones. Para continuar su trabajo en un proyecto, describe el trabajo en la conversación del proyecto, o haz push de su rama al repositorio remoto, agrega ese repositorio al proyecto y nombra la rama en la tarea.123Una sesión en tu propia máquina obtiene el mismo menú de la barra lateral en claude.ai/code una vez que la conectas mediante [Remote Control](https://code.claude.com/docs/es/remote-control.md#start-a-remote-control-session). Desde un proyecto, Claude no puede leer la transcripción de una sesión que se conectó mientras [**Require trusted devices**](https://code.claude.com/docs/es/remote-control.md#trusted-devices) estaba activado para tu cuenta. Si ese ajuste está desactivado:

124 

1251. Si la sesión aún no está conectada, ejecuta `/remote-control` en ella. Si se conectó mientras ese ajuste estaba activado, primero desconéctala y vuelve a conectarla.

1262. En un navegador, busca la fila de la sesión en la barra lateral de [claude.ai/code](https://claude.ai/code), abre su menú y elige una opción del mismo submenú.

127 

128Si **Require trusted devices** está activado, o no usas Remote Control, describe el trabajo tú mismo en la conversación del proyecto. O haz push de la rama de la sesión, agrega su repositorio al proyecto e indícale a Claude el nombre de la rama.

124 129 

125### Configurar el acceso a GitHub130### Configurar el acceso a GitHub

126 131 


425* **Sesiones en la nube**: cada hilo es una [sesión en la nube](https://code.claude.com/docs/es/claude-code-on-the-web.md) a menos que le pidas a Claude que la ejecute en tu máquina. De cualquier forma, Claude la comienza y rastrea en lugar de ti. También puedes llevar el trabajo de una sesión en la nube que iniciaste tú mismo a un proyecto: elige [**Move to project**](#start-from-an-existing-cloud-session) en el menú de la barra lateral de esa sesión.430* **Sesiones en la nube**: cada hilo es una [sesión en la nube](https://code.claude.com/docs/es/claude-code-on-the-web.md) a menos que le pidas a Claude que la ejecute en tu máquina. De cualquier forma, Claude la comienza y rastrea en lugar de ti. También puedes llevar el trabajo de una sesión en la nube que iniciaste tú mismo a un proyecto: elige [**Move to project**](#start-from-an-existing-cloud-session) en el menú de la barra lateral de esa sesión.

426* **Tareas programadas**: cuando pides trabajo programado en un proyecto, Claude crea una [tarea programada en la nube](https://code.claude.com/docs/es/routines.md) que se ejecuta como hilos en ese proyecto y aparece en su pestaña **Scheduled tasks**. Las tareas programadas que creas fuera de un proyecto siguen funcionando por su cuenta.431* **Tareas programadas**: cuando pides trabajo programado en un proyecto, Claude crea una [tarea programada en la nube](https://code.claude.com/docs/es/routines.md) que se ejecuta como hilos en ese proyecto y aparece en su pestaña **Scheduled tasks**. Las tareas programadas que creas fuera de un proyecto siguen funcionando por su cuenta.

427* **Remote Control**: [Remote Control](https://code.claude.com/docs/es/remote-control.md) conecta claude.ai a una sesión de Claude Code que se ejecuta en su máquina. Cuando pide a Claude en un proyecto que ejecute un hilo en su computadora, el proyecto [utiliza Remote Control para hacerlo](#run-a-thread-on-your-own-computer).432* **Remote Control**: [Remote Control](https://code.claude.com/docs/es/remote-control.md) conecta claude.ai a una sesión de Claude Code que se ejecuta en su máquina. Cuando pide a Claude en un proyecto que ejecute un hilo en su computadora, el proyecto [utiliza Remote Control para hacerlo](#run-a-thread-on-your-own-computer).

428* **Local sessions and agent view**: una sesión que comienza usted mismo en su terminal, IDE, o el entorno local de la aplicación de escritorio no puede ser agregada a un proyecto. [Agent view](https://code.claude.com/docs/es/agent-view.md) es una pantalla para rastrear varias sesiones locales lado a lado, y usted sigue iniciando cada una y le da su tarea usted mismo.433* **Sesiones locales y agent view**: una sesión que inicias tú mismo en tu terminal, IDE o el entorno local de la aplicación de escritorio queda fuera de tus proyectos, aunque puedes [llevar su trabajo a uno](#start-from-an-existing-cloud-session). [Agent view](https://code.claude.com/docs/es/agent-view.md) es una pantalla para rastrear varias sesiones locales lado a lado, y sigues iniciando cada una y dándole su tarea tú mismo.

429* **Worktrees**: un [worktree](https://code.claude.com/docs/es/worktrees.md) le da a cada sesión local su propia copia de trabajo de un repositorio. Los hilos en la nube no los necesitan: cada uno clona sus repositorios en su propio sandbox en la nube y trabaja en su propia rama.434* **Worktrees**: un [worktree](https://code.claude.com/docs/es/worktrees.md) le da a cada sesión local su propia copia de trabajo de un repositorio. Los hilos en la nube no los necesitan: cada uno clona sus repositorios en su propio sandbox en la nube y trabaja en su propia rama.

430* **Equipos de agentes**: un [equipo de agentes](https://code.claude.com/docs/es/agent-teams.md) es una sesión que comienza sesiones de compañeros para una sola tarea, en tu máquina o dentro de una sesión en la nube, y termina con esa tarea.435* **Equipos de agentes**: un [equipo de agentes](https://code.claude.com/docs/es/agent-teams.md) es una sesión que comienza sesiones de compañeros para una sola tarea, en tu máquina o dentro de una sesión en la nube, y termina con esa tarea.

431* **Subagents**: un [subagente](https://code.claude.com/docs/es/sub-agents.md) se ejecuta dentro de una sesión, realiza una tarea secundaria en su propia ventana de contexto, y devuelve un resumen a esa sesión. Los hilos de un proyecto son sesiones completas que Claude comienza y que reportan al proyecto, y un hilo aún puede usar subagentes para sus propias tareas secundarias.436* **Subagents**: un [subagente](https://code.claude.com/docs/es/sub-agents.md) se ejecuta dentro de una sesión, realiza una tarea secundaria en su propia ventana de contexto, y devuelve un resumen a esa sesión. Los hilos de un proyecto son sesiones completas que Claude comienza y que reportan al proyecto, y un hilo aún puede usar subagentes para sus propias tareas secundarias.


437 442 

438* Los proyectos están disponibles en claude.ai/code, en la aplicación de escritorio y en la aplicación móvil de Claude, no en el CLI de terminal, la extensión de VS Code o el plugin de JetBrains, y no a través de Amazon Bedrock, Google Cloud's Agent Platform o Microsoft Foundry.443* Los proyectos están disponibles en claude.ai/code, en la aplicación de escritorio y en la aplicación móvil de Claude, no en el CLI de terminal, la extensión de VS Code o el plugin de JetBrains, y no a través de Amazon Bedrock, Google Cloud's Agent Platform o Microsoft Foundry.

439* Los hilos del proyecto son [sesiones en la nube](https://code.claude.com/docs/es/claude-code-on-the-web.md), o sesiones en su propia máquina a través de [Remote Control](https://code.claude.com/docs/es/remote-control.md), con Anthropic como proveedor de modelo en ambos casos. [Seguridad](https://code.claude.com/docs/es/security.md) y [Uso de datos](https://code.claude.com/docs/es/data-usage.md) cubren cómo se aíslan las sesiones en la nube y qué se retiene, y [Connection and security](https://code.claude.com/docs/es/remote-control.md#connection-and-security) cubre cómo un hilo en su máquina se conecta y qué se almacena.444* Los hilos del proyecto son [sesiones en la nube](https://code.claude.com/docs/es/claude-code-on-the-web.md), o sesiones en su propia máquina a través de [Remote Control](https://code.claude.com/docs/es/remote-control.md), con Anthropic como proveedor de modelo en ambos casos. [Seguridad](https://code.claude.com/docs/es/security.md) y [Uso de datos](https://code.claude.com/docs/es/data-usage.md) cubren cómo se aíslan las sesiones en la nube y qué se retiene, y [Connection and security](https://code.claude.com/docs/es/remote-control.md#connection-and-security) cubre cómo un hilo en su máquina se conecta y qué se almacena.

440* No puede agregar una sesión que inició usted mismo en su máquina a un proyecto. Un proyecto llega a su máquina solo al [ejecutar un hilo allí a través de Remote Control](#run-a-thread-on-your-own-computer), y esa sección enumera lo que necesita.445* No puedes agregar a un proyecto una sesión que iniciaste tú mismo en tu máquina, aunque sí puedes [traer su trabajo a uno](#start-from-an-existing-cloud-session). Un proyecto llega a tu máquina al [ejecutar un hilo allí a través de Remote Control](#run-a-thread-on-your-own-computer), y esa sección enumera lo que necesita.

441* La sandbox de un hilo en la nube se pausa entre turnos y se reanuda cuando el hilo continúa. Si la sandbox no se puede reanudar, el hilo continúa desde un clon fresco, así que los cambios no confirmados pueden perderse. En tareas largas, pídele a Claude que confirme e inserte trabajo en progreso.446* La sandbox de un hilo en la nube se pausa entre turnos y se reanuda cuando el hilo continúa. Si la sandbox no se puede reanudar, el hilo continúa desde un clon fresco, así que los cambios no confirmados pueden perderse. En tareas largas, pídele a Claude que confirme e inserte trabajo en progreso.

442* Un proyecto pertenece a un usuario. No puedes compartir un proyecto o sus hilos con otro usuario, y las transcripciones de hilos no tienen la opción de compartir que tienen otras sesiones en la nube. No hay controles a nivel de organización para proyectos durante la beta.447* Un proyecto pertenece a un usuario. No puedes compartir un proyecto o sus hilos con otro usuario, y las transcripciones de hilos no tienen la opción de compartir que tienen otras sesiones en la nube. No hay controles a nivel de organización para proyectos durante la beta.

443* Un hilo pertenece al único proyecto que lo comenzó. No puede mover o copiar un hilo a otro proyecto, o sacarlo para que esté solo. [**Move to project**](#start-from-an-existing-cloud-session) va solo en la otra dirección: trae el trabajo de una sesión en la nube a un proyecto. No puede fusionar dos proyectos en uno.448* Un hilo pertenece al único proyecto que lo comenzó. No puede mover o copiar un hilo a otro proyecto, o sacarlo para que esté solo. [**Move to project**](#start-from-an-existing-cloud-session) va solo en la otra dirección: trae el trabajo de una sesión en la nube a un proyecto. No puede fusionar dos proyectos en uno.

Details

135| `--teleport` | Reanuda una [sesión en la nube](https://code.claude.com/docs/es/claude-code-on-the-web.md) en tu terminal local | `claude --teleport` |135| `--teleport` | Reanuda una [sesión en la nube](https://code.claude.com/docs/es/claude-code-on-the-web.md) en tu terminal local | `claude --teleport` |

136| `--teammate-mode` | Establece cómo los compañeros de [equipo de agentes](https://code.claude.com/docs/es/agent-teams.md) se muestran: `in-process` (predeterminado), `auto`, `tmux`, o `iterm2`. Anula la configuración [`teammateMode`](https://code.claude.com/docs/es/settings-reference#teammatemode) para esta sesión. Consulta [Elige un modo de visualización](https://code.claude.com/docs/es/agent-teams.md#choose-a-display-mode) | `claude --teammate-mode auto` |136| `--teammate-mode` | Establece cómo los compañeros de [equipo de agentes](https://code.claude.com/docs/es/agent-teams.md) se muestran: `in-process` (predeterminado), `auto`, `tmux`, o `iterm2`. Anula la configuración [`teammateMode`](https://code.claude.com/docs/es/settings-reference#teammatemode) para esta sesión. Consulta [Elige un modo de visualización](https://code.claude.com/docs/es/agent-teams.md#choose-a-display-mode) | `claude --teammate-mode auto` |

137| `--tmux` | Crea una sesión tmux para el worktree. Requiere `--worktree`. Usa paneles nativos de iTerm2 cuando estén disponibles; pasa `--tmux=classic` para tmux tradicional | `claude -w feature-auth --tmux` |137| `--tmux` | Crea una sesión tmux para el worktree. Requiere `--worktree`. Usa paneles nativos de iTerm2 cuando estén disponibles; pasa `--tmux=classic` para tmux tradicional | `claude -w feature-auth --tmux` |

138| `--tools` | Restringe qué herramientas integradas puede usar Claude. Usa `""` para deshabilitar todas, `"default"` para el conjunto predeterminado, o nombres de herramientas como `"Bash,Edit,Read"`. En macOS, Linux y WSL, el conjunto predeterminado deja fuera `Glob` y `Grep`, como se describe en [Comportamiento de la herramienta Glob](https://code.claude.com/docs/es/tools-reference.md#glob-tool-behavior). Si nombras una de las [herramientas de seguimiento de tareas](https://code.claude.com/docs/es/tools-reference.md#task-tool-availability) aquí, Claude Code también opta por la sesión. La bandera no afecta herramientas MCP; para negar esas también, usa `--disallowedTools "mcp__*"`. Una lista que omite [`EndConversation`](https://code.claude.com/docs/es/tools-reference#endconversation-tool-behavior) no la elimina; `""` la elimina solo cuando no quedan herramientas MCP | `claude --tools "Bash,Edit,Read"` |138| `--tools` | Restringe qué herramientas integradas puede usar Claude. Usa `""` para deshabilitar todas, `"default"` para el conjunto predeterminado, o nombres de herramientas como `"Bash,Edit,Read"`. En macOS, Linux y WSL, el conjunto predeterminado deja fuera `Glob` y `Grep`, como se describe en [Comportamiento de la herramienta Glob](https://code.claude.com/docs/es/tools-reference.md#glob-tool-behavior). Si nombras una de las [herramientas de seguimiento de tareas](https://code.claude.com/docs/es/tools-reference.md#task-tool-availability) aquí, Claude Code también considera que la sesión ha optado por usarlas. La bandera no afecta herramientas MCP; para negar esas también, usa `--disallowedTools "mcp__*"`. Una lista que omite [`EndConversation`](https://code.claude.com/docs/es/tools-reference#endconversation-tool-behavior) no la elimina; `""` la elimina solo cuando no quedan herramientas MCP | `claude --tools "Bash,Edit,Read"` |

139| `--verbose` | Habilita el registro detallado, muestra la salida completa turno por turno. Anula la configuración [`viewMode`](https://code.claude.com/docs/es/settings-reference#viewmode) para esta sesión | `claude --verbose` |139| `--verbose` | Habilita el registro detallado, muestra la salida completa turno por turno. Anula la configuración [`viewMode`](https://code.claude.com/docs/es/settings-reference#viewmode) para esta sesión | `claude --verbose` |

140| `--version`, `-v` | Imprime el número de versión | `claude -v` |140| `--version`, `-v` | Imprime el número de versión | `claude -v` |

141| `--worktree`, `-w` | Inicia Claude en un [git worktree](https://code.claude.com/docs/es/worktrees.md) aislado en `<repo>/.claude/worktrees/<name>`. Si no das un nombre, Claude Code genera uno. Pasa `#<number>`, una URL de solicitud de extracción de GitHub, o una URL de solicitud de fusión de GitLab para [obtener ese PR o MR de `origin` y ramificar el worktree desde él](https://code.claude.com/docs/es/worktrees#branch-from-a-pull-request). Ramificar desde una solicitud de fusión de GitLab requiere Claude Code v2.1.233 o posterior | `claude -w feature-auth` |141| `--worktree`, `-w` | Inicia Claude en un [git worktree](https://code.claude.com/docs/es/worktrees.md) aislado en `<repo>/.claude/worktrees/<name>`. Si no das un nombre, Claude Code genera uno. Pasa `#<number>`, una URL de solicitud de extracción de GitHub, o una URL de solicitud de fusión de GitLab para [obtener ese PR o MR de `origin` y ramificar el worktree desde él](https://code.claude.com/docs/es/worktrees#branch-from-a-pull-request). Ramificar desde una solicitud de fusión de GitLab requiere Claude Code v2.1.233 o posterior | `claude -w feature-auth` |

code-review.md +1 −1

Details

67 67 

68* **Hallazgos**: comentarios en línea en las líneas afectadas, con un resumen en el cuerpo de la revisión68* **Hallazgos**: comentarios en línea en las líneas afectadas, con un resumen en el cuerpo de la revisión

69* **Una ejecución de verificación**: llamada **Claude Code Review**, con los hallazgos listados en sus [detalles](https://code.claude.com/docs/es/code-review-pull-requests.md#check-run-output). La ejecución de verificación no concluye como fallo.69* **Una ejecución de verificación**: llamada **Claude Code Review**, con los hallazgos listados en sus [detalles](https://code.claude.com/docs/es/code-review-pull-requests.md#check-run-output). La ejecución de verificación no concluye como fallo.

70* **Cuando no encuentra nada**: el título de la ejecución de verificación dice **Code review found no issues**, y Claude publica la misma nota breve en el pull request70* **Una nota en lugar de hallazgos**: se publica cuando el título de la ejecución de verificación dice **Code review found no issues**

71 71 

72Code Review elige los modelos de Claude en los que se ejecutan las revisiones, y su configuración de administración no ofrece elegir modelo. Para que las revisiones sean más o menos exhaustivas, cambia el [nivel de revisión](#review-levels).72Code Review elige los modelos de Claude en los que se ejecutan las revisiones, y su configuración de administración no ofrece elegir modelo. Para que las revisiones sean más o menos exhaustivas, cambia el [nivel de revisión](#review-levels).

73 73 

Details

152 152 

153### Qué cubre una revisión posterior153### Qué cubre una revisión posterior

154 154 

155Una revisión posterior que se inicia por sí sola, por ejemplo después de un push, se centra en lo que cambió desde la última revisión y publica menos nits y hallazgos preexistentes. Su resumen cuenta lo que omitió, en una línea que termina en "found and not posted" u "outside the scope of this re-review and not posted."155Una revisión posterior que se inicia por sí sola, por ejemplo después de un push, se centra en lo que cambió desde la última revisión y publica menos [nits y hallazgos preexistentes](#severity-levels). Para ver si omitió hallazgos como resultado, busca en el cuerpo de la revisión una oración que los cuente:

156 

157* **Hallazgos en código que no ha cambiado desde la última revisión**: la oración termina en "outside the scope of this re-review and not posted"

158* **Nits y hallazgos preexistentes**: la oración termina en "found and not posted"

156 159 

157Para obtener una revisión que no omita nada de esto, comenta [`@claude review`](#comment-commands). Cubre de nuevo todo el pull request.160Para obtener una revisión que no omita nada de esto, comenta [`@claude review`](#comment-commands). Cubre de nuevo todo el pull request.

158 161 

Details

15| Título del check run | Qué significa | Qué hacer |15| Título del check run | Qué significa | Qué hacer |

16| :- | :- | :- |16| :- | :- | :- |

17| **Code review queued...** o **Code review in progress...** | La revisión no ha terminado | Espera a que cambie el título |17| **Code review queued...** o **Code review in progress...** | La revisión no ha terminado | Espera a que cambie el título |

18| **Code review found no issues** | La revisión terminó y no encontró nada que señalar | Nada |18| **Code review found no issues** | La revisión terminó y no publicó ningún hallazgo | Si esta no es la primera revisión del pull request, busca en el cuerpo de la revisión un recuento de los [hallazgos que la revisión omitió](https://code.claude.com/docs/es/code-review-pull-requests.md#what-a-later-review-covers). De lo contrario, nada |

19| Un título que dice que se encontraron problemas | La revisión terminó con hallazgos | Si no los ves en el diff, consulta [Encuentra problemas que no aparecen como comentarios en línea](#find-issues-that-aren’t-showing-as-inline-comments) |19| Un título que dice que se encontraron problemas | La revisión terminó con hallazgos | Si no los ves en el diff, consulta [Encuentra problemas que no aparecen como comentarios en línea](#find-issues-that-aren’t-showing-as-inline-comments) |

20| **Code review skipped — no new changes** | No se ejecutó una revisión automática en tu último push | Para obtener una revisión de todos modos, comenta `@claude review` |20| **Code review skipped — no new changes** | No se ejecutó una revisión automática en tu último push | Para obtener una revisión de todos modos, comenta `@claude review` |

21| **Code review not repeated — earlier findings still open** | No se ejecutó una revisión automática en tu último push y los hallazgos Important de la revisión anterior siguen abiertos | Haz push de una corrección o, para obtener una revisión de todos modos, comenta `@claude review`. Consulta [Cuando un push conserva el resultado anterior](https://code.claude.com/docs/es/code-review-pull-requests.md#when-a-push-keeps-the-earlier-result) |21| **Code review not repeated — earlier findings still open** | No se ejecutó una revisión automática en tu último push y los hallazgos Important de la revisión anterior siguen abiertos | Haz push de una corrección o, para obtener una revisión de todos modos, comenta `@claude review`. Consulta [Cuando un push conserva el resultado anterior](https://code.claude.com/docs/es/code-review-pull-requests.md#when-a-push-keeps-the-earlier-result) |

desktop.md +48 −17

Details

223 223 

224#### Ocultar o mostrar el panel de detalles de la sesión224#### Ocultar o mostrar el panel de detalles de la sesión

225 225 

226Para ocultar o mostrar el panel, haz clic en **Hide session rail** o **Show session rail** en la barra de título de la sesión, o en el menú **⋮** de la barra cuando la ventana es estrecha. Si aun así no ves el panel, [verifica qué diseño de la pestaña Code tienes](#check-which-layout-you-have).226Para ocultar o mostrar el panel, haz clic en **Hide session rail** o **Show session rail** en la barra de título de la sesión, o en el menú **⋮** de la barra. Si aun así no ves el panel, [verifica qué diseño de la pestaña Code tienes](#check-which-layout-you-have).

227 227 

228### Ejecutar comandos en la terminal228### Ejecutar comandos en la terminal

229 229 


984 984 

985* **Sistema**: un procesador x86\_64 o arm64. La máquina también tiene que cumplir los [requisitos del sistema](https://code.claude.com/docs/es/setup.md#system-requirements) de Claude Code. En Linux, Claude Code necesita glibc 2.17 o posterior, o musl. Para ver cuál tiene la máquina, ejecuta `ldd --version` allí. En una distribución basada en musl como Alpine Linux, instala también los [paquetes que necesita Claude Code](https://code.claude.com/docs/es/setup.md#alpine-linux-and-musl-based-distributions).985* **Sistema**: un procesador x86\_64 o arm64. La máquina también tiene que cumplir los [requisitos del sistema](https://code.claude.com/docs/es/setup.md#system-requirements) de Claude Code. En Linux, Claude Code necesita glibc 2.17 o posterior, o musl. Para ver cuál tiene la máquina, ejecuta `ldd --version` allí. En una distribución basada en musl como Alpine Linux, instala también los [paquetes que necesita Claude Code](https://code.claude.com/docs/es/setup.md#alpine-linux-and-musl-based-distributions).

986* **SFTP**: el servidor SSH tiene que ofrecer el subsistema SFTP, que se activa con una línea `Subsystem sftp` en su `sshd_config`. Para comprobarlo, conéctate al mismo host y puerto con `sftp` en una terminal de tu computadora. Un servidor que funciona muestra el prompt `sftp>`.986* **SFTP**: el servidor SSH tiene que ofrecer el subsistema SFTP, que se activa con una línea `Subsystem sftp` en su `sshd_config`. Para comprobarlo, conéctate al mismo host y puerto con `sftp` en una terminal de tu computadora. Un servidor que funciona muestra el prompt `sftp>`.

987* **Sesiones por conexión**: Desktop en macOS y Linux abre varias sesiones en una sola conexión SSH. Si el `sshd_config` del servidor establece `MaxSessions 1`, auméntalo, por ejemplo al valor predeterminado de OpenSSH, 10.987* **`MaxSessions 1` en el servidor**: para conectarte a un servidor cuyo `sshd_config` establece `MaxSessions 1`, haz una de estas cosas:

988 * **Tu computadora ejecuta macOS o Linux**: actualiza a Claude Desktop v3.1623.0 o posterior

989 * **Tu computadora ejecuta Windows**: asegúrate de que Desktop [se conecte a través del cliente OpenSSH](#use-your-ssh-configuration), porque el cliente SSH integrado de Desktop no puede conectarse a ese servidor

990 * **Puedes cambiar el servidor**: aumenta `MaxSessions`, por ejemplo al valor predeterminado de OpenSSH, 10

991* **Inicios de sesión con `MaxSessions 1`**: usa un inicio de sesión que funcione sin solicitudes, como una clave que tenga tu agente SSH. Desktop inicia sesión al menos dos veces cada vez que se conecta o se vuelve a conectar. Espera al menos un inicio de sesión más por cada pestaña de la [terminal](#run-commands-in-the-terminal) y por cada sesión de Desktop en la que ejecutes comandos que empiezan con `!`. No esperes ninguno por los comandos que ejecuta Claude.

992* **Códigos de un solo uso con `MaxSessions 1`**: si cada inicio de sesión te pide algo, como con códigos de un solo uso, los comandos `!` fallan. Ejecuta esos comandos en una pestaña de la terminal, que muestra la solicitud en su propio panel.

988* **Carpeta de instalación**: Desktop instala un programa auxiliar y Claude Code en `~/.claude/remote/` dentro de tu directorio home. Los ejecuta desde allí, por lo que esa carpeta no puede estar en un sistema de archivos montado con `noexec`. Reserva aproximadamente 1 GB de espacio en disco en el directorio home de cada usuario que se conecte. Para saber qué contiene esa carpeta, consulta [Archivos y procesos en la máquina remota](#files-and-processes-on-the-remote-machine).993* **Carpeta de instalación**: Desktop instala un programa auxiliar y Claude Code en `~/.claude/remote/` dentro de tu directorio home. Los ejecuta desde allí, por lo que esa carpeta no puede estar en un sistema de archivos montado con `noexec`. Reserva aproximadamente 1 GB de espacio en disco en el directorio home de cada usuario que se conecte. Para saber qué contiene esa carpeta, consulta [Archivos y procesos en la máquina remota](#files-and-processes-on-the-remote-machine).

989* **Shell**: el shell establecido para tu cuenta en la máquina remota tiene que ejecutar los comandos enviados a través de SSH, como lo hacen Bash, Zsh y `sh`994* **Shell**: el shell establecido para tu cuenta en la máquina remota tiene que ejecutar los comandos enviados a través de SSH, como lo hacen Bash, Zsh y `sh`

990* **Red**: Claude Code se ejecuta en la máquina remota y realiza sus solicitudes de red desde allí, por lo que la máquina necesita el [acceso a la red que requiere Claude Code](https://code.claude.com/docs/es/network-config.md#network-access-requirements). Si la máquina no puede descargar Claude Code, Desktop lo descarga en tu computadora y lo sube. Las demás solicitudes de Claude Code siguen saliendo desde la máquina remota. En una máquina remota Linux, si esas solicitudes necesitan un proxy, [establécelo para las sesiones SSH](#set-a-proxy-or-a-ca-certificate-for-ssh-sessions).995* **Red**: Claude Code se ejecuta en la máquina remota y realiza sus solicitudes de red desde allí, por lo que la máquina necesita el [acceso a la red que requiere Claude Code](https://code.claude.com/docs/es/network-config.md#network-access-requirements). Si la máquina no puede descargar Claude Code, Desktop lo descarga en tu computadora y lo sube. Las demás solicitudes de Claude Code siguen saliendo desde la máquina remota. En una máquina remota Linux, si esas solicitudes necesitan un proxy, [establécelo para las sesiones SSH](#set-a-proxy-or-a-ca-certificate-for-ssh-sessions).


993 998 

994Si una máquina remota Linux accede a internet a través de un proxy o necesita un certificado de CA, agrega las [variables de proxy y de CA](https://code.claude.com/docs/es/network-config.md) en `env` en el `~/.claude/settings.json` de esa máquina. Agrégalas incluso si ya las exportas en `~/.profile`, `~/.bash_profile`, `~/.zprofile` o `~/.zshrc` en esa máquina.999Si una máquina remota Linux accede a internet a través de un proxy o necesita un certificado de CA, agrega las [variables de proxy y de CA](https://code.claude.com/docs/es/network-config.md) en `env` en el `~/.claude/settings.json` de esa máquina. Agrégalas incluso si ya las exportas en `~/.profile`, `~/.bash_profile`, `~/.zprofile` o `~/.zshrc` en esa máquina.

995 1000 

996Una sesión SSH no las obtiene de esos archivos, aunque `claude` en una terminal de esa máquina sí las obtenga. Entonces la sesión puede colgarse, o mostrar **The connection from … to the API failed** o **Authentication failed**, y volver a iniciar sesión no ayuda.1001En una sesión SSH, Claude Code no obtiene las variables de esos archivos, aunque `claude` en una terminal de esa máquina sí las obtenga. La sesión puede entonces quedarse colgada o mostrar **The connection from … to the API failed** o **Authentication failed**, y volver a iniciar sesión no ayuda.

997 1002 

998**1. Agrega las variables**1003**1. Agrega las variables**

999 1004 


1028 1033 

1029Reinicia la máquina remota, o cierra Desktop y termina los procesos del programa auxiliar, como en los dos primeros pasos para [eliminar el programa auxiliar](#files-and-processes-on-the-remote-machine). Hazlo cuando no haya ninguna tarea en ejecución, porque cualquiera de las dos opciones interrumpe el trabajo de Claude.1034Reinicia la máquina remota, o cierra Desktop y termina los procesos del programa auxiliar, como en los dos primeros pasos para [eliminar el programa auxiliar](#files-and-processes-on-the-remote-machine). Hazlo cuando no haya ninguna tarea en ejecución, porque cualquiera de las dos opciones interrumpe el trabajo de Claude.

1030 1035 

1031#### Usar tu configuración SSH en macOS y Linux1036#### Usar tu configuración de SSH

1032 1037 

1033En macOS y Linux, Desktop se conecta ejecutando el cliente OpenSSH en tu computadora, por lo que usa tu `~/.ssh/config`. Conectarse a través del cliente OpenSSH requiere Claude Desktop v1.37937.0 o posterior. Ingresa un nombre de `Host` de ese archivo en el campo **SSH host** para usar la configuración de su entrada, como `HostName`, `User`, `IdentityFile`, `CertificateFile`, `ProxyJump` y `ProxyCommand`.1038Puedes usar tu configuración de SSH en macOS, Linux y Windows cuando Desktop se conecta a través del cliente OpenSSH de tu computadora:

1039 

1040* **macOS y Linux**: Desktop se conecta ejecutando el cliente OpenSSH de tu computadora, así que usa tu `~/.ssh/config`. Conectarse a través del cliente OpenSSH requiere Claude Desktop v1.37937.0 o posterior.

1041* **Windows**: cuando Desktop se conecta a través del cliente OpenSSH, usa tu `%USERPROFILE%\.ssh\config`. Si usas una cuenta de Claude en lugar de un proveedor externo, conectarse a través del cliente OpenSSH requiere todo lo siguiente:

1042 

1043 * Claude Desktop v2.2553.0 o posterior. Para encontrar tu versión, consulta [Comprobar tu versión](#check-your-version).

1044 * OpenSSH de Microsoft 9.4 o posterior

1045 * Desktop instalado con los botones de descarga de la parte superior de esta página, porque Desktop de Microsoft Store no se conecta a través del cliente OpenSSH

1046 

1047 Si no puedes cumplir estos requisitos, o usas un proveedor externo, consulta [Conectarse en Windows sin el cliente OpenSSH](#connect-on-windows-without-the-openssh-client).

1048 

1049Con el cliente OpenSSH, ingresa un nombre de `Host` de tu archivo de configuración en el campo **SSH host**. Desktop usa entonces los ajustes de esa entrada `Host`, como `HostName`, `User`, `IdentityFile`, `CertificateFile`, `ProxyJump` y `ProxyCommand`.

1034 1050 

1035Antes de agregar la conexión, revisa el cliente y la entrada en una terminal de tu computadora:1051Antes de agregar la conexión, revisa el cliente y la entrada en una terminal de tu computadora:

1036 1052 

1037* **Versión del cliente**: ejecuta `ssh -V`. El cliente tiene que ser OpenSSH 7.6 o posterior.1053* **Versión del cliente en macOS y Linux**: ejecuta `ssh -V`. El cliente tiene que ser OpenSSH 7.6 o posterior.

1038* **Entrada**: ejecuta `ssh` con el nombre de `Host`, como `ssh devbox`. Si falla, corrige primero la entrada.1054* **Versión del cliente en Windows**: Desktop prueba primero el `ssh` de tu `PATH`, así que ejecuta `ssh -V`. El cliente es válido si la salida muestra `OpenSSH_for_Windows_` y 9.4 o posterior. Si no es válido, revisa las dos carpetas que Desktop prueba a continuación: ejecuta `.\ssh.exe -V` en `C:\Windows\System32\OpenSSH` y luego en `C:\Program Files\OpenSSH`.

1055* **Ningún cliente es válido en Windows**: agrega la característica opcional **OpenSSH Client** en Windows e instala las actualizaciones pendientes de Windows, o instala la [compilación más reciente de Microsoft](https://learn.microsoft.com/en-us/troubleshoot/windows-server/system-management-components/upgrade-in-box-openssh-to-latest-openssh-release). Luego cierra y vuelve a abrir Desktop. Para ver si Desktop encontró un cliente OpenSSH utilizable, busca en [`ssh.log`](#get-desktops-logs-for-an-ssh-problem) `Windows OpenSSH client:` y una versión, o `no usable Windows OpenSSH client`.

1056* **Entrada**: en Windows, usa el cliente que pasó la comprobación de versión. Ejecuta `ssh` con el nombre de `Host`, como `ssh devbox`. Si falla, corrige primero la entrada.

1039 1057 

1040Puedes dejar vacíos los campos **SSH port** y **SSH key (optional)**. Si completas uno, Desktop lo usa junto con la entrada:1058Puedes dejar vacíos los campos **SSH port** y **SSH key (optional)**. Si completas uno, Desktop lo usa junto con la entrada:

1041 1059 

1042* **SSH port**: un valor aquí sobrescribe el `Port` de la entrada1060* **SSH port**: un valor aquí sobrescribe el `Port` de la entrada

1043* **SSH key (optional)**: Desktop ofrece el archivo de clave que elijas además del `IdentityFile` de la entrada y las claves de tu agente SSH1061* **SSH key (optional)**: con el cliente OpenSSH, Desktop ofrece el archivo de clave que elijas además del `IdentityFile` de la entrada y las claves de tu agente SSH. En Windows, elige una clave en formato OpenSSH, porque `ssh` no lee un archivo `.ppk` de PuTTY.

1062 

1063##### Conectarse en Windows sin el cliente OpenSSH

1064 

1065En Windows, te conectas a través del cliente SSH integrado de Desktop si tu computadora no cumple [los requisitos para el cliente OpenSSH](#use-your-ssh-configuration). Con un proveedor externo, te conectas de forma predeterminada a través del cliente integrado, y tu administrador puede cambiarlo. Para ver el ajuste, consulta [SSH remote sessions in Claude Desktop on 3P](https://claude.com/docs/third-party/claude-desktop/ssh-remote-sessions).

1066 

1067Con el cliente integrado, aún puedes ingresar un nombre de `Host` de tu configuración de SSH en el campo **SSH host** si tu `PATH` tiene un comando `ssh`, con estos límites:

1068 

1069* **Ajustes de la entrada**: Desktop toma `HostName`, `User`, `Port` e `IdentityFile`. También toma `ProxyCommand` si hay un shell `sh` en tu `PATH`.

1070* **SSH key (optional)**: deja este campo vacío para conservar el `IdentityFile` de la entrada, porque un archivo de clave que elijas aquí reemplaza al `IdentityFile`

1071* **`CertificateFile` y `ProxyJump`**: Desktop ignora `CertificateFile`, y la conexión falla si la entrada establece `ProxyJump`. Para usar cualquiera de los dos ajustes, [conéctate a través del cliente OpenSSH](#use-your-ssh-configuration).

1044 1072 

1045##### Llegar a una máquina detrás de un host de salto1073##### Llegar a una máquina detrás de un host de salto

1046 1074 


1095 1123 

1096##### Usar variables de tu shell en un `ProxyCommand`1124##### Usar variables de tu shell en un `ProxyCommand`

1097 1125 

1098Para usar una variable de entorno propia en un comando `ProxyCommand` o `Match exec`, expórtala en un archivo de inicio del shell, como `~/.zshrc`, y luego cierra y vuelve a abrir Desktop. Cuando Desktop se inicia, lee lo que exporta tu shell de inicio de sesión, y conserva esos valores hasta que lo cierres.1126En macOS y Linux, para usar una variable de entorno propia en un comando `ProxyCommand` o `Match exec`, expórtala en un archivo de inicio del shell, como `~/.zshrc`. Luego cierra y vuelve a abrir Desktop. Cuando Desktop se inicia, lee lo que exporta tu shell de inicio de sesión y conserva esos valores hasta que lo cierras.

1099 1127 

1100Esto requiere Claude Desktop v2.37337.0 o posterior y un comando `env` que acepte `-0`, lo que puedes comprobar ejecutando `env -0` en una terminal de tu computadora.1128Esto requiere Claude Desktop v2.37337.0 o posterior y un comando `env` que acepte `-0`, lo que puedes comprobar ejecutando `env -0` en una terminal de tu computadora.

1101 1129 


1103>1131>

1104> Si tu shell establece credenciales temporales de AWS, [dale a la AWS CLI un perfil](#use-aws-credentials-in-a-proxycommand) en lugar de exportar variables `AWS_*`.1132> Si tu shell establece credenciales temporales de AWS, [dale a la AWS CLI un perfil](#use-aws-credentials-in-a-proxycommand) en lugar de exportar variables `AWS_*`.

1105 1133 

1106##### Usar credenciales de AWS en un `ProxyCommand`1134##### Usar credenciales de AWS en un `ProxyCommand` en macOS y Linux

1107 1135 

1108Si estableces credenciales temporales de AWS en un archivo de inicio del shell, un `ProxyCommand` que ejecuta la AWS CLI puede conectarse en una terminal y fallar en Desktop. Cuando tu shell exporta `AWS_SESSION_TOKEN`, `AWS_SECURITY_TOKEN` o `AWS_CREDENTIAL_EXPIRATION`, `ssh` y tu `ProxyCommand` en Desktop no obtienen las credenciales de AWS del shell, `AWS_REGION` ni `AWS_PROFILE`.1136Si estableces credenciales temporales de AWS en un archivo de inicio del shell, un `ProxyCommand` que ejecuta la AWS CLI puede conectarse en una terminal y fallar en Desktop. Cuando tu shell exporta `AWS_SESSION_TOKEN`, `AWS_SECURITY_TOKEN` o `AWS_CREDENTIAL_EXPIRATION`, `ssh` y tu `ProxyCommand` en Desktop no obtienen las credenciales de AWS del shell, `AWS_REGION` ni `AWS_PROFILE`.

1109 1137 


1242 1270 

1243##### Preparar una tarea larga1271##### Preparar una tarea larga

1244 1272 

1245* **Actualiza primero**: actualiza Desktop antes de iniciar una tarea larga. En macOS y Windows, Desktop puede reiniciarse por sí solo para instalar una actualización que haya descargado. Ese reinicio espera mientras Claude trabaja en una tarea SSH. En macOS con una cuenta de Claude, de forma predeterminada el reinicio puede realizarse de todos modos una vez que la actualización haya esperado 72 horas.1273* **Actualiza primero**: actualiza Desktop antes de iniciar una tarea larga. En macOS y Windows, Desktop puede reiniciarse por sí solo para instalar una actualización que descargó. Ese reinicio espera mientras Claude trabaja en una tarea SSH. De forma predeterminada, una vez que la actualización esperó 72 horas, el reinicio puede realizarse durante la tarea si Desktop puede [reincorporarse a la tarea después](#reopen-a-session-after-you-quit-desktop).

1246* **No salgas en Windows, ni antes de v2.42304.0 con un proveedor externo**: si sales en esos casos, pierdes la tarea en ejecución, así que deja Desktop abierto durante la tarea. En cualquier otro caso, consulta [qué recuperas](#reopen-a-session-after-you-quit-desktop) antes de salir.1274* **Revisa antes de cerrar**: no siempre recuperas la tarea en ejecución después de un cierre o reinicio, por ejemplo después de algunas actualizaciones de Desktop. Para ver los casos, consulta [Volver a abrir una sesión después de cerrar Desktop](#reopen-a-session-after-you-quit-desktop).

1275* **En una versión anterior, deja Desktop abierto**: en Windows con Claude Desktop anterior a la v3.1623.0, no recuperas la tarea en ejecución después de que Desktop se cierra o se reinicia. Lo mismo ocurre con un proveedor externo en macOS o Linux antes de la v2.42304.0. En ambos casos, deja Desktop abierto durante la tarea. Para encontrar tu versión, consulta [Comprobar tu versión](#check-your-version).

1247* **Reduce las solicitudes**: elige un modo de permisos, reglas o hooks que [hagan que la tarea te espere con menos frecuencia](#handle-requests-that-arrive-while-you-are-away)1276* **Reduce las solicitudes**: elige un modo de permisos, reglas o hooks que [hagan que la tarea te espere con menos frecuencia](#handle-requests-that-arrive-while-you-are-away)

1248* **Revisa el host de salto**: si tu host de salto pide un inicio de sesión, por ejemplo una notificación push a un teléfono, cambia a un inicio de sesión que funcione sin pedirte nada. De lo contrario, Desktop puede enviar otra notificación push cada vez que intenta volver a conectarse.1277* **Revisa el host de salto**: si tu host de salto pide un inicio de sesión, por ejemplo una notificación push a un teléfono, cambia a un inicio de sesión que funcione sin pedirte nada. De lo contrario, Desktop puede enviar otra notificación push cada vez que intenta volver a conectarse.

1249* **Prueba la máquina remota**: inicia una tarea corta, cierra Desktop mientras la tarea sigue en ejecución y vuelve a abrir la sesión bastante después de cuando la tarea debería haber terminado. Si la tarea no terminó y la sesión no muestra ningún error de autenticación, revisa la máquina remota en busca de [lo que puede terminar una tarea](#limits-while-desktop-is-disconnected).1278* **Prueba la máquina remota**: inicia una tarea corta, cierra Desktop mientras la tarea sigue en ejecución y vuelve a abrir la sesión bastante después de cuando la tarea debería haber terminado. Si la tarea no terminó y la sesión no muestra ningún error de autenticación, revisa la máquina remota en busca de [lo que puede terminar una tarea](#limits-while-desktop-is-disconnected).


1320 1349 

1321Después de salir de Desktop, la tarea sigue ejecutándose en la máquina remota, pero se detiene cuando la sesión vuelve a abrirse, a menos que Desktop pueda volver a unirse a su proceso. Mientras Desktop está cerrado, la tarea se ejecuta hasta que termina, te necesita o alcanza uno de los [límites](#limits-while-desktop-is-disconnected).1350Después de salir de Desktop, la tarea sigue ejecutándose en la máquina remota, pero se detiene cuando la sesión vuelve a abrirse, a menos que Desktop pueda volver a unirse a su proceso. Mientras Desktop está cerrado, la tarea se ejecuta hasta que termina, te necesita o alcanza uno de los [límites](#limits-while-desktop-is-disconnected).

1322 1351 

1323* **Desktop en Windows**: no recuperas la tarea en ejecución, porque Desktop nunca vuelve a unirse después de salir. Inicia Desktop de nuevo solo cuando esperes que la tarea haya terminado, porque la sesión puede abrirse cuando Desktop se inicia.1352* **Desktop en Windows, tarea iniciada en una versión anterior a la v3.1623.0**: no recuperas la tarea, aunque Desktop se haya actualizado desde entonces. Vuelve a iniciar Desktop solo cuando esperes que la tarea haya terminado, porque la sesión puede abrirse cuando Desktop se inicia, y la tarea se detiene cuando la sesión se abre. Si no sabes en qué versión iniciaste la tarea, espera también hasta que esperes que haya terminado.

1324* **Proveedor externo, tarea de una versión anterior**: si iniciaste la tarea en una versión de Desktop anterior a v2.42304.0, tampoco la recuperas en macOS ni en Linux. Inicia Desktop de nuevo solo cuando esperes que la tarea haya terminado.1353* **Proveedor externo en macOS o Linux, tarea iniciada en una versión anterior a la v2.42304.0**: no recuperas la tarea. Vuelve a iniciar Desktop solo cuando esperes que la tarea haya terminado.

1325* **Cualquier otra tarea, con Desktop en macOS o Linux**: inicia Desktop y abre la sesión, y la tarea continúa si Desktop vuelve a unirse. No siempre puede volver a unirse, por ejemplo después de algunas actualizaciones de Desktop, así que [actualiza antes de una tarea larga](#prepare-a-long-task).1354* **Cualquier otra tarea**: inicia Desktop y abre la sesión, y la tarea continúa si Desktop se reincorpora. No siempre puede reincorporarse, por ejemplo después de algunas actualizaciones de Desktop, así que [actualiza antes de una tarea larga](#prepare-a-long-task).

1326 1355 

1327Cuando Desktop no puede volver a unirse, también pierdes cualquier aprobación o pregunta que te estuviera esperando. Si la tarea no continúa por sí sola, envía un mensaje y Claude continúa a partir del historial guardado de la conversación.1356Cuando la tarea se detiene, la sesión puede mostrar `Restarting Claude Code on <host>…` mientras Desktop inicia un nuevo proceso. También pierdes cualquier aprobación o pregunta que te estuviera esperando. Si Claude no continúa por sí solo, envía un mensaje, y Claude continúa a partir del historial guardado de la conversación.

1328 1357 

1329Para despliegues con terceros, consulta [SSH remote sessions in Claude Desktop on 3P](https://claude.com/docs/third-party/claude-desktop/ssh-remote-sessions).1358Para despliegues con terceros, consulta [SSH remote sessions in Claude Desktop on 3P](https://claude.com/docs/third-party/claude-desktop/ssh-remote-sessions).

1330 1359 


1411 1440 

1412Para saber quién se conectó a una máquina remota, lee el registro del servidor SSH en esa máquina, donde un inicio de sesión desde Desktop se ve como uno desde una terminal. Con Desktop en macOS o Linux, espera una entrada cada vez que Desktop se conecta, no una por cada sesión.1441Para saber quién se conectó a una máquina remota, lee el registro del servidor SSH en esa máquina, donde un inicio de sesión desde Desktop se ve como uno desde una terminal. Con Desktop en macOS o Linux, espera una entrada cada vez que Desktop se conecta, no una por cada sesión.

1413 1442 

1443Si el servidor establece `MaxSessions 1`, espera al menos dos entradas cada vez que Desktop se conecta o se reconecta. Espera al menos una más por cada pestaña de terminal, y por cada sesión de Desktop en la que ejecutes comandos que empiezan con `!`.

1444 

1414No encontrarás las conexiones SSH de Desktop en las [métricas y eventos](https://code.claude.com/docs/es/monitoring-usage.md#available-metrics-and-events) de Claude Code. Para saber a partir de ellos en qué máquina remota se ejecutó una sesión SSH, consulta [Atribuir la telemetría a las sesiones SSH de Desktop](https://code.claude.com/docs/es/monitoring-usage.md#attribute-telemetry-to-desktop-ssh-sessions). Para el registro propio de Desktop de sus conexiones, consulta [Obtener los registros de Desktop para un problema de SSH](#get-desktops-logs-for-an-ssh-problem).1445No encontrarás las conexiones SSH de Desktop en las [métricas y eventos](https://code.claude.com/docs/es/monitoring-usage.md#available-metrics-and-events) de Claude Code. Para saber a partir de ellos en qué máquina remota se ejecutó una sesión SSH, consulta [Atribuir la telemetría a las sesiones SSH de Desktop](https://code.claude.com/docs/es/monitoring-usage.md#attribute-telemetry-to-desktop-ssh-sessions). Para el registro propio de Desktop de sus conexiones, consulta [Obtener los registros de Desktop para un problema de SSH](#get-desktops-logs-for-an-ssh-problem).

1415 1446 

1416#### Conexiones que se cierran antes del inicio de sesión1447#### Conexiones que se cierran antes del inicio de sesión


2112| - | - | - |2143| - | - | - |

2113| `<host>'s SSH server has SFTP turned off` | `[SFTP_UNAVAILABLE]` | Activa SFTP en el `sshd_config` del servidor, como se describe en [requisitos de la máquina remota](#remote-machine-requirements-for-ssh-sessions) |2144| `<host>'s SSH server has SFTP turned off` | `[SFTP_UNAVAILABLE]` | Activa SFTP en el `sshd_config` del servidor, como se describe en [requisitos de la máquina remota](#remote-machine-requirements-for-ssh-sessions) |

2114| `SFTP doesn't start on <host>` | `[SFTP_NOT_STARTED]` | Conéctate al mismo host con `sftp` en una terminal de tu computadora para ver qué lo impide y luego revisa los ajustes y archivos que menciona el mensaje de Desktop |2145| `SFTP doesn't start on <host>` | `[SFTP_NOT_STARTED]` | Conéctate al mismo host con `sftp` en una terminal de tu computadora para ver qué lo impide y luego revisa los ajustes y archivos que menciona el mensaje de Desktop |

2115| `<host> allows too few SSH sessions per connection` | `[SESSION_LIMIT]` | Aumenta `MaxSessions` en el `sshd_config` del servidor, por ejemplo al valor predeterminado de OpenSSH, que es 10 |2146| `<host> allows too few SSH sessions per connection` | `[SESSION_LIMIT]` | Actualiza a Claude Desktop v3.1623.0 o posterior, o aumenta `MaxSessions` en el `sshd_config` del servidor, por ejemplo al valor predeterminado de OpenSSH, que es 10 |

2116| `<host> is out of disk space` | `[ENOSPC]` o `[EDQUOT]` | Libera espacio o cuota en la máquina remota, en tu directorio home o en `/tmp` |2147| `<host> is out of disk space` | `[ENOSPC]` o `[EDQUOT]` | Libera espacio o cuota en la máquina remota, en tu directorio home o en `/tmp` |

2117| `Free up disk space on this computer` | `[ENOSPC]` o `[EDQUOT]`, en un mensaje que comienza con `Couldn't prepare the deploy locally` | Libera espacio en tu computadora |2148| `Free up disk space on this computer` | `[ENOSPC]` o `[EDQUOT]`, en un mensaje que comienza con `Couldn't prepare the deploy locally` | Libera espacio en tu computadora |

2118| `Claude Code won't start on <host>` | `[CLI_UNRESPONSIVE]` | Espera un minuto y vuelve a intentarlo. Si sigue fallando, ejecuta en la máquina remota el comando que menciona el mensaje para ver si Claude Code responde allí. |2149| `Claude Code won't start on <host>` | `[CLI_UNRESPONSIVE]` | Espera un minuto y vuelve a intentarlo. Si sigue fallando, ejecuta en la máquina remota el comando que menciona el mensaje para ver si Claude Code responde allí. |

errors.md +3 −1

Details

247| `Error: MCP tool <name> (passed via --permission-prompt-tool) not found` | [Errores de línea de comandos](#mcp-permission-prompt-tool-not-found) |247| `Error: MCP tool <name> (passed via --permission-prompt-tool) not found` | [Errores de línea de comandos](#mcp-permission-prompt-tool-not-found) |

248| `OAuth callback port <port> is already in use — another process may be holding it` | [Errores de línea de comandos](#oauth-callback-port-is-already-in-use) |248| `OAuth callback port <port> is already in use — another process may be holding it` | [Errores de línea de comandos](#oauth-callback-port-is-already-in-use) |

249| `No available ports for OAuth redirect` | [Errores de línea de comandos](#no-available-ports-for-oauth-redirect) |249| `No available ports for OAuth redirect` | [Errores de línea de comandos](#no-available-ports-for-oauth-redirect) |

250| `Shell command failed for pattern "..."`, de `/security-review` o de cualquier skill que inyecte contexto dinámico | [Errores de línea de comandos](#security-review-fails-without-origin-head) |250| `Shell command failed for pattern "..."`, desde `/security-review` o cualquier skill que inyecte contexto dinámico | [Errores de línea de comandos](#security-review-fails-without-origin-head) |

251| `Shell command permission check failed for pattern "..."`, de un skill que inyecta contexto dinámico | [Errores de línea de comandos](#security-review-fails-without-origin-head) |251| `Shell command permission check failed for pattern "..."`, de un skill que inyecta contexto dinámico | [Errores de línea de comandos](#security-review-fails-without-origin-head) |

252| ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found`` | [Errores de línea de comandos](#security-review-fails-without-origin-head) |252| ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found`` | [Errores de línea de comandos](#security-review-fails-without-origin-head) |

253| `No shell command in <name> was run, because the <tool> tool does not accept one of them` | [Errores de línea de comandos](#no-shell-command-was-run) |253| `No shell command in <name> was run, because the <tool> tool does not accept one of them` | [Errores de línea de comandos](#no-shell-command-was-run) |


327| `Cannot read this as an image: <path> is a pipe or a device` | [Errores de herramientas](#file-is-too-large-to-read-as-an-image) |327| `Cannot read this as an image: <path> is a pipe or a device` | [Errores de herramientas](#file-is-too-large-to-read-as-an-image) |

328| `subagent_type is required: the general-purpose agent is not available in this session` | [Errores de herramientas](#subagent-type-is-required) |328| `subagent_type is required: the general-purpose agent is not available in this session` | [Errores de herramientas](#subagent-type-is-required) |

329| `Error: this write left the memory index at MEMORY.md at ..., over its ... read limit` | [Errores de herramientas](#memory-index-is-over-its-read-limit) |329| `Error: this write left the memory index at MEMORY.md at ..., over its ... read limit` | [Errores de herramientas](#memory-index-is-over-its-read-limit) |

330| `Sandbox is required but failed to initialize: <reason>` | [Solución de problemas de sandboxing](https://code.claude.com/docs/es/sandboxing.md#commands-refused-with-sandbox-is-required) |

331| `Sandbox is required (sandbox.failIfUnavailable) and stopped being available in this session: <reason>` | [Solución de problemas de sandboxing](https://code.claude.com/docs/es/sandboxing.md#commands-refused-with-sandbox-is-required) |

330| `pkill: refusing to run` | [Errores de herramientas](#pkill-pattern-matches-the-claude-code-process) |332| `pkill: refusing to run` | [Errores de herramientas](#pkill-pattern-matches-the-claude-code-process) |

331| `Failed to write to <name>'s inbox — nothing was sent` | [Errores de herramientas](#failed-to-write-to-a-teammate-inbox) |333| `Failed to write to <name>'s inbox — nothing was sent` | [Errores de herramientas](#failed-to-write-to-a-teammate-inbox) |

332| `Failed to write the plan approval request to the lead's inbox — plan not submitted` | [Errores de herramientas](#failed-to-write-to-a-teammate-inbox) |334| `Failed to write the plan approval request to the lead's inbox — plan not submitted` | [Errores de herramientas](#failed-to-write-to-a-teammate-inbox) |

fast-mode.md +2 −2

Details

80 80 

81Los precios del modo rápido son fijos en toda la ventana de contexto de 1M tokens. Para la tarifa estándar de Opus con la que comparar, consulte la [referencia de precios de Claude](https://platform.claude.com/docs/es/about-claude/pricing).81Los precios del modo rápido son fijos en toda la ventana de contexto de 1M tokens. Para la tarifa estándar de Opus con la que comparar, consulte la [referencia de precios de Claude](https://platform.claude.com/docs/es/about-claude/pricing).

82 82 

83La primera vez que habilitas el modo rápido en una conversación, pagas el precio completo del token de entrada sin caché del modo rápido para todo el contexto de la conversación. Cuanto más avanzada esté la conversación, más cuesta esto, por lo que el cargo es menor cuando habilitas el modo rápido desde el inicio. El costo se aplica una vez por conversación, por lo que desactivar y activar el modo rápido nuevamente más tarde no lo repite. Para el mecanismo, consulta [cómo el modo rápido interactúa con la caché de prompts](https://code.claude.com/docs/es/prompt-caching.md#turning-on-fast-mode).83La primera vez que habilitas el modo rápido en una conversación, pagas el precio completo del token de entrada sin caché del modo rápido para todo el contexto de la conversación. Cuanto más avanzada esté la conversación, más cuesta esto, por lo que el cargo es menor cuando habilitas el modo rápido desde el inicio. El modo rápido y la velocidad estándar mantienen [cachés separadas](https://code.claude.com/docs/es/prompt-caching.md#turning-on-fast-mode), por lo que cada cambio posterior vuelve a leer sin caché parte o toda la conversación.

84 84 

85### Vea dónde aparece el gasto del modo rápido85### Vea dónde aparece el gasto del modo rápido

86 86 


167 167 

168Detrás de un gateway, revisa si tienes estas configuraciones, en las que Claude Code no envía la verificación de disponibilidad y no tiene en caché ninguna verificación exitosa anterior:168Detrás de un gateway, revisa si tienes estas configuraciones, en las que Claude Code no envía la verificación de disponibilidad y no tiene en caché ninguna verificación exitosa anterior:

169 169 

170* Apuntas `ANTHROPIC_BASE_URL` a tu gateway y estableces [`ANTHROPIC_API_KEY`](https://code.claude.com/docs/es/llm-gateway-connect#set-the-base-url-and-credential) en una clave emitida por el gateway que no tiene el formato de una clave de API de Anthropic. Claude Code no envía esa clave a `api.anthropic.com`.170* Apuntas `ANTHROPIC_BASE_URL` a tu gateway y estableces [`ANTHROPIC_API_KEY`](https://code.claude.com/docs/es/llm-gateway-connect#set-the-base-url-and-credential) en una clave emitida por el gateway que no tiene el formato de una clave de API de Anthropic.

171* Estableces [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/es/env-vars), por lo que Claude Code omite la verificación.171* Estableces [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/es/env-vars), por lo que Claude Code omite la verificación.

172 172 

173Para restaurar el modo rápido en cualquiera de las dos configuraciones, establece `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`.173Para restaurar el modo rápido en cualquiera de las dos configuraciones, establece `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`.

Details

262 262 

263**Costo de contexto:** Bajo hasta que se usa. Los skills exclusivos del usuario tienen costo cero hasta que se invocan.263**Costo de contexto:** Bajo hasta que se usa. Los skills exclusivos del usuario tienen costo cero hasta que se invocan.

264 264 

265**En subagentes:** Los skills funcionan de manera diferente en los subagentes. En lugar de cargarse bajo demanda, los skills listados en el campo `skills` del subagente se precargan por completo en su contexto al iniciarse. Los subagentes aún pueden descubrir e invocar skills de proyecto, de usuario y de plugins no listados mediante la herramienta Skill.265**En subagentes:** El contenido completo de los skills listados en el campo `skills` de un subagente [se carga en su contexto al iniciarse](https://code.claude.com/docs/es/sub-agents.md#preload-skills-into-subagents), en lugar de cargarse bajo demanda. Los subagentes aún pueden descubrir e invocar skills de proyecto, de usuario y de plugins no listados mediante la herramienta Skill.

266 266 

267> [!TIP]267> [!TIP]

268>268>

glossary.md +2 −2

Details

120 120 

121### Compaction121### Compaction

122 122 

123Resumen automático de su conversación cuando la [context window](#context-window) se acerca a su límite. Las salidas de herramientas más antiguas se borran primero, luego se resume la conversación. El CLAUDE.md de raíz de proyecto y auto memory sobreviven a compaction y se recargan desde el disco; las instrucciones dadas solo en conversación pueden perderse. Ejecute `/compact` para activar manualmente, opcionalmente con un enfoque como `/compact focus on the API changes`.123Resumen automático de tu conversación cuando la [ventana de contexto](#context-window) se acerca a su límite. El CLAUDE.md de la raíz del proyecto y la memoria automática sobreviven a la compactación, pero las instrucciones dadas solo en la conversación podrían no hacerlo. Ejecuta `/compact` para activarla manualmente, opcionalmente con un enfoque como `/compact focus on the API changes`.

124 124 

125Más información: [What survives compaction](https://code.claude.com/docs/es/context-window.md#what-survives-compaction) · [When context fills up](https://code.claude.com/docs/es/how-claude-code-works.md#when-context-fills-up)125Más información: [What survives compaction](https://code.claude.com/docs/es/context-window.md#what-survives-compaction) · [When context fills up](https://code.claude.com/docs/es/how-claude-code-works.md#when-context-fills-up) · [When Claude Code compacts a conversation you leave idle](https://code.claude.com/docs/es/settings-reference.md#idlecompaction)

126 126 

127### Connector127### Connector

128 128 

hooks.md +15 −5

Details

1426 1426 

1427Los hooks Setup no pueden bloquear; la ejecución continúa con cualquier código de salida. Con cualquier código de salida, Claude Code descarta los [campos de salida JSON](#json-output) de un hook Setup, como `systemMessage`, `continue` y `hookSpecificOutput.additionalContext`. Con `-p`, el stdout, el stderr y el código de salida de un hook Setup aparecen en la salida de la ejecución solo como [eventos `hook_response`](https://code.claude.com/docs/es/headless#read-session-metadata) cuando inicias con `--output-format stream-json --verbose`.1427Los hooks Setup no pueden bloquear; la ejecución continúa con cualquier código de salida. Con cualquier código de salida, Claude Code descarta los [campos de salida JSON](#json-output) de un hook Setup, como `systemMessage`, `continue` y `hookSpecificOutput.additionalContext`. Con `-p`, el stdout, el stderr y el código de salida de un hook Setup aparecen en la salida de la ejecución solo como [eventos `hook_response`](https://code.claude.com/docs/es/headless#read-session-metadata) cuando inicias con `--output-format stream-json --verbose`.

1428 1428 

1429Los hooks Setup tienen acceso a `CLAUDE_ENV_FILE`. Las variables escritas en ese archivo se conservan en los comandos de Bash posteriores de la sesión, como en los [hooks SessionStart](#persist-environment-variables). Solo los hooks `type: "command"` se ejecutan en `Setup`. Un hook `type: "mcp_tool"` en `Setup` siempre se omite, como se describe en [Campos de hooks de herramientas MCP](#mcp-tool-hook-fields).1429Los hooks Setup tienen acceso a `CLAUDE_ENV_FILE`. Si tu hook escribe variables en ese archivo, estas se conservan en los comandos de Bash posteriores de la sesión, igual que en los [hooks SessionStart](#persist-environment-variables). Solo los hooks `type: "command"` se ejecutan en `Setup`. Un hook `type: "mcp_tool"` en `Setup` siempre se omite, como se describe en [Campos de hooks de herramientas MCP](#mcp-tool-hook-fields).

1430 1430 

1431### InstructionsLoaded1431### InstructionsLoaded

1432 1432 


1483 1483 

1484Un [hook de callback del Agent SDK](https://code.claude.com/docs/es/agent-sdk/hooks.md) en `UserPromptSubmit` al que se le agota el tiempo de espera bloquea el prompt con un mensaje que nombra el hook y el tiempo de espera, porque un callback en ese punto puede estar actuando como una barrera de políticas que no debe fallar de forma abierta. La sesión continúa.1484Un [hook de callback del Agent SDK](https://code.claude.com/docs/es/agent-sdk/hooks.md) en `UserPromptSubmit` al que se le agota el tiempo de espera bloquea el prompt con un mensaje que nombra el hook y el tiempo de espera, porque un callback en ese punto puede estar actuando como una barrera de políticas que no debe fallar de forma abierta. La sesión continúa.

1485 1485 

1486#### `Esc` durante la comprobación de un prompt

1487 

1488Si presionas `Esc` o interrumpes la sesión mientras los hooks siguen comprobando un prompt, la comprobación se detiene y el prompt no llega a Claude. El texto que escribiste en la terminal vuelve al campo de entrada del prompt, y los hooks lo comprueban de nuevo cuando lo vuelves a enviar.

1489 

1490Un hook puede bloquear el prompt en el mismo momento en que interrumpes. En ese caso el prompt sigue bloqueado: ves el [mensaje de bloqueo](#what-a-blocked-prompt-leaves-behind) de ese hook, y el texto no vuelve al campo de entrada.

1491 

1486#### Entrada de UserPromptSubmit1492#### Entrada de UserPromptSubmit

1487 1493 

1488Además de los [campos de entrada comunes](#common-input-fields), los hooks UserPromptSubmit reciben el campo `prompt` que contiene el texto enviado. El contenido pegado que se contrajo en un marcador `[Pasted text #N]` llega expandido en su lugar. En las sesiones donde Claude Code [marca el texto pegado para Claude](https://code.claude.com/docs/es/terminal-config.md#how-claude-treats-pasted-text), ese contenido expandido se encuentra entre una línea `<pasted_content id="…">` y una línea `</pasted_content id="…">`, así que ten en cuenta esas líneas si tu hook analiza el prompt.1494Además de los [campos de entrada comunes](#common-input-fields), los hooks UserPromptSubmit reciben el campo `prompt` que contiene el texto enviado. El contenido pegado que se contrajo en un marcador `[Pasted text #N]` llega expandido en su lugar. En las sesiones donde Claude Code [marca el texto pegado para Claude](https://code.claude.com/docs/es/terminal-config.md#how-claude-treats-pasted-text), ese contenido expandido se encuentra entre una línea `<pasted_content id="…">` y una línea `</pasted_content id="…">`, así que ten en cuenta esas líneas si tu hook analiza el prompt.


1741 1747 

1742Usa el [control de decisiones de PreToolUse](#pretooluse-decision-control) para permitir, denegar, preguntar o diferir la llamada a herramienta.1748Usa el [control de decisiones de PreToolUse](#pretooluse-decision-control) para permitir, denegar, preguntar o diferir la llamada a herramienta.

1743 1749 

1744Un [hook de callback del Agent SDK](https://code.claude.com/docs/es/agent-sdk/hooks.md) en `PreToolUse` que supera su tiempo de espera bloquea la llamada a herramienta, y Claude recibe un resultado de error que nombra el tiempo de espera.1750Un [hook de callback del Agent SDK](https://code.claude.com/docs/es/agent-sdk/hooks.md#hook-timeout) en `PreToolUse` que supera su tiempo de espera bloquea la llamada a herramienta.

1745 1751 

1746#### Entrada de PreToolUse1752#### Entrada de PreToolUse

1747 1753 


2970 2976 

2971Se ejecuta cuando un comando de shell en la conversación principal cambia el directorio de trabajo, por ejemplo cuando Claude ejecuta un comando `cd`. Úsalo para reaccionar a los cambios de directorio: recargar variables de entorno, activar toolchains específicas del proyecto o ejecutar scripts de configuración automáticamente. Se combina con [FileChanged](#filechanged) para herramientas como [direnv](https://direnv.net/) que administran el entorno por directorio.2977Se ejecuta cuando un comando de shell en la conversación principal cambia el directorio de trabajo, por ejemplo cuando Claude ejecuta un comando `cd`. Úsalo para reaccionar a los cambios de directorio: recargar variables de entorno, activar toolchains específicas del proyecto o ejecutar scripts de configuración automáticamente. Se combina con [FileChanged](#filechanged) para herramientas como [direnv](https://direnv.net/) que administran el entorno por directorio.

2972 2978 

2973Los hooks CwdChanged tienen acceso a [`CLAUDE_ENV_FILE`](#persist-environment-variables). Las variables escritas en ese archivo persisten en los comandos Bash posteriores hasta el siguiente evento CwdChanged, cuando Claude Code las borra.2979Los hooks CwdChanged tienen acceso a [`CLAUDE_ENV_FILE`](#persist-environment-variables). Si tu hook escribe variables en ese archivo, persisten en los comandos Bash posteriores hasta el siguiente evento CwdChanged, cuando Claude Code las borra.

2974 2980 

2975CwdChanged no admite matchers y se dispara en cada ocurrencia.2981CwdChanged no admite matchers y se dispara en cada ocurrencia.

2976 2982 


3135* Claude Code aísla una [sesión en segundo plano](https://code.claude.com/docs/es/agent-view.md#how-file-edits-are-isolated) en su propio worktree3141* Claude Code aísla una [sesión en segundo plano](https://code.claude.com/docs/es/agent-view.md#how-file-edits-are-isolated) en su propio worktree

3136* [`claude remote-control`](https://code.claude.com/docs/es/remote-control#start-a-remote-control-session) en modo `worktree` inicia una sesión en su propio worktree3142* [`claude remote-control`](https://code.claude.com/docs/es/remote-control#start-a-remote-control-session) en modo `worktree` inicia una sesión en su propio worktree

3137 3143 

3138Cuando Claude ejecuta `git worktree add` mediante la herramienta Bash en lugar de llamar a `EnterWorktree`, tu hook WorktreeCreate no se ejecuta. Para inspeccionar o bloquear ese comando, agrega un hook [`PreToolUse`](#pretooluse) con el matcher `Bash`.3144Un hook WorktreeCreate no se ejecuta para un worktree que Claude agrega mediante Bash, y el hook de un plugin no se ejecuta para el que se crea cuando inicias con `--worktree` y [`--tmux`](https://code.claude.com/docs/es/cli-reference#cli-flags):

3145 

3146* **`git worktree add` mediante Bash**: para inspeccionar o bloquear ese comando, agrega un hook [`PreToolUse`](#pretooluse) con el matcher `Bash`.

3147* **`--worktree` con `--tmux`**: Claude Code crea el worktree antes de cargar los plugins, por lo que un hook WorktreeCreate de un plugin no se ejecuta. Para que tu hook se ejecute con ambos flags, defínelo en un [archivo de configuración](#configuration). Antes de v2.1.300, el hook WorktreeCreate de un plugin tampoco se ejecutaba solo con `--worktree`.

3139 3148 

3140De forma predeterminada, Claude Code crea la copia de trabajo aislada con `git worktree`. Configurar un hook WorktreeCreate reemplaza ese comportamiento predeterminado de git, lo que te permite usar un sistema de control de versiones diferente como SVN, Perforce o Mercurial.3149De forma predeterminada, Claude Code crea la copia de trabajo aislada con `git worktree`. Configurar un hook WorktreeCreate reemplaza ese comportamiento predeterminado de git, lo que te permite usar un sistema de control de versiones diferente como SVN, Perforce o Mercurial.

3141 3150 


4077 4086 

4078Cuando se activa un hook asincrónico, Claude Code inicia el proceso del hook e inmediatamente continúa sin esperar a que finalice. El hook recibe la misma entrada JSON a través de stdin que un hook sincrónico.4087Cuando se activa un hook asincrónico, Claude Code inicia el proceso del hook e inmediatamente continúa sin esperar a que finalice. El hook recibe la misma entrada JSON a través de stdin que un hook sincrónico.

4079 4088 

4080Después de que el proceso de fondo sale, Claude Code entrega los campos `additionalContext` y `systemMessage` de la respuesta JSON del hook a Claude en el siguiente turno de conversación. A diferencia del `systemMessage` de un hook sincrónico, ninguno de estos campos se le muestra a usted.4089Después de que el proceso en segundo plano sale, Claude Code entrega los campos `additionalContext` y `systemMessage` de la respuesta JSON del hook a Claude en el siguiente turno de conversación, excepto en el caso de la [salida repetida de `SessionStart`](#limitations). A diferencia del `systemMessage` de un hook sincrónico, ninguno de estos campos se te muestra a ti.

4081 4090 

4082Imprime la respuesta JSON sola en stdout o en una línea propia:4091Imprime la respuesta JSON sola en stdout o en una línea propia:

4083 4092 


4145 4154 

4146* La salida del hook se entrega en el siguiente turno de conversación. Si la sesión está inactiva, la respuesta espera hasta la siguiente interacción del usuario. Excepción: un hook `asyncRewake` que sale con código 2 despierta a Claude inmediatamente incluso cuando la sesión está inactiva.4155* La salida del hook se entrega en el siguiente turno de conversación. Si la sesión está inactiva, la respuesta espera hasta la siguiente interacción del usuario. Excepción: un hook `asyncRewake` que sale con código 2 despierta a Claude inmediatamente incluso cuando la sesión está inactiva.

4147* Cada ejecución crea un proceso en segundo plano separado.4156* Cada ejecución crea un proceso en segundo plano separado.

4157* Un hook `SessionStart` asincrónico se ejecuta cada vez que se activa el evento. Claude Code omite la salida del hook cuando el texto de `additionalContext` y `systemMessage` coincide con lo último que Claude recibió de ese hook, a menos que un hook `SessionStart` sincrónico haya agregado otro texto desde entonces. Claude Code entrega el texto cuando cambia, y de nuevo la próxima vez que el hook se ejecuta después de una compactación o de `/clear`. Antes de v2.1.295, Claude Code volvía a agregar el mismo texto a la conversación en cada reanudación.

4148 4158 

4149## Consideraciones de seguridad4159## Consideraciones de seguridad

4150 4160 

hooks-guide.md +1 −1

Details

954* Los hooks `PostToolUse` no pueden deshacer acciones ya que la herramienta ya se ha ejecutado.954* Los hooks `PostToolUse` no pueden deshacer acciones ya que la herramienta ya se ha ejecutado.

955* Los hooks [`PermissionRequest`](https://code.claude.com/docs/es/hooks#permissionrequest) se activan cuando Claude Code está a punto de pedirte permiso, o cuando de otro modo denegaría automáticamente una llamada que no puede mostrar una solicitud. En [modo no interactivo](https://code.claude.com/docs/es/headless.md) con el flag `-p`, se siguen ejecutando fuera del [modo `dontAsk`](https://code.claude.com/docs/es/permission-modes#allow-only-pre-approved-tools-with-dontask-mode), y una llamada sobre la que ningún hook decide y que nada más puede responder se deniega.955* Los hooks [`PermissionRequest`](https://code.claude.com/docs/es/hooks#permissionrequest) se activan cuando Claude Code está a punto de pedirte permiso, o cuando de otro modo denegaría automáticamente una llamada que no puede mostrar una solicitud. En [modo no interactivo](https://code.claude.com/docs/es/headless.md) con el flag `-p`, se siguen ejecutando fuera del [modo `dontAsk`](https://code.claude.com/docs/es/permission-modes#allow-only-pre-approved-tools-with-dontask-mode), y una llamada sobre la que ningún hook decide y que nada más puede responder se deniega.

956* Los hooks `Stop` se activan cada vez que Claude termina de responder, no solo en la finalización de tareas. No se activan en interrupciones del usuario. Los errores de API activan [StopFailure](https://code.claude.com/docs/es/hooks.md#stopfailure) en su lugar.956* Los hooks `Stop` se activan cada vez que Claude termina de responder, no solo en la finalización de tareas. No se activan en interrupciones del usuario. Los errores de API activan [StopFailure](https://code.claude.com/docs/es/hooks.md#stopfailure) en su lugar.

957* Cuando múltiples hooks `PreToolUse` devuelven [`updatedInput`](https://code.claude.com/docs/es/hooks#pretooluse) para reescribir los argumentos de una herramienta, el último en terminar gana. Como los hooks se ejecutan en paralelo, el orden es no determinista. Evite tener más de un hook modificando la entrada de la misma herramienta.957* Cuando varios hooks `PreToolUse` devuelven [`updatedInput`](https://code.claude.com/docs/es/hooks#pretooluse) para reescribir la entrada de una herramienta, Claude Code no combina las reescrituras ni garantiza con cuál de ellas se ejecuta la herramienta. Evita que más de un hook reescriba la entrada de la misma herramienta.

958 958 

959### Hooks y modos de permiso959### Hooks y modos de permiso

960 960 

Details

131 131 

132#### Cuando el contexto se llena132#### Cuando el contexto se llena

133 133 

134Claude Code gestiona el contexto automáticamente a medida que se acerca al límite. Primero borra salidas de herramientas más antiguas, luego resume la conversación si es necesario. Sus solicitudes y fragmentos de código clave se preservan; las instrucciones detalladas del principio de la conversación pueden perderse. Coloque reglas persistentes en CLAUDE.md en lugar de depender del historial de conversación.134Claude Code gestiona el contexto automáticamente a medida que te acercas al límite. Compacta la conversación en un resumen. El resumen conserva tus solicitudes y los fragmentos de código clave, pero las instrucciones detalladas del principio de la conversación pueden perderse. Coloca reglas persistentes en CLAUDE.md en lugar de depender del historial de conversación.

135 135 

136Para controlar qué se preserva durante la compactación, agregue una sección "Compact Instructions" a CLAUDE.md o ejecute `/compact` con un enfoque (como `/compact focus on the API changes`).136Para controlar qué se preserva durante la compactación, agregue una sección "Compact Instructions" a CLAUDE.md o ejecute `/compact` con un enfoque (como `/compact focus on the API changes`).

137 137 

Details

659 659 

660Para reasignar las teclas que desplazan la lista de archivos o cambian la comparación, consulta [Acciones del panel de diff](https://code.claude.com/docs/es/keybindings.md#diff-panel-actions).660Para reasignar las teclas que desplazan la lista de archivos o cambian la comparación, consulta [Acciones del panel de diff](https://code.claude.com/docs/es/keybindings.md#diff-panel-actions).

661 661 

662Durante una fusión, un rebase, un cherry-pick o un revert sin terminar, el panel sigue mostrando los cambios que leyó por última vez de git, para que no se llene con los cambios entrantes de la operación. Se actualiza en su primera actualización después de que termina la operación, por ejemplo, la próxima vez que Claude edite un archivo.

663 

662### Diálogo de diff664### Diálogo de diff

663 665 

664El diálogo de diff se abre como un bloque con borde encima del prompt y enumera tus archivos modificados con sus recuentos de líneas añadidas y eliminadas. Los compara con `HEAD`, o con lo que hayas [elegido por última vez en el panel de diff](#diff-panel) para este repositorio.666El diálogo de diff se abre como un bloque con borde encima del prompt y enumera tus archivos modificados con sus recuentos de líneas añadidas y eliminadas. Los compara con `HEAD`, o con lo que hayas [elegido por última vez en el panel de diff](#diff-panel) para este repositorio.

keybindings.md +4 −4

Details

678 678 

679## Interacción del modo Vim679## Interacción del modo Vim

680 680 

681Cuando el modo vim está habilitado mediante `/config` → Editor mode, los atajos de teclado y el modo vim funcionan de forma independiente:681Cuando habilitas el modo vim con el ajuste Editor mode en `/config`, los atajos de teclado y el modo vim funcionan de forma independiente:

682 682 

683* **Modo Vim** maneja la entrada a nivel de entrada de texto (movimiento del cursor, modos, movimientos)683* **Modo Vim** maneja la entrada a nivel de entrada de texto: movimiento del cursor, modos y movimientos

684* **Atajos de teclado** manejan acciones a nivel de componente (alternar tareas, enviar, etc.)684* **Atajos de teclado** manejan acciones a nivel de componente, como alternar tareas o enviar un mensaje

685* La tecla Escape en modo vim cambia de modo INSERT a NORMAL; no activa `chat:cancel`685* La tecla Escape en el modo vim cambia del modo INSERT al modo NORMAL; no activa `chat:cancel`

686* La mayoría de los atajos Ctrl+tecla pasan a través del modo vim al sistema de atajos de teclado686* La mayoría de los atajos Ctrl+tecla pasan a través del modo vim al sistema de atajos de teclado

687* Las teclas Vim no se pueden remapear a través del archivo de atajos de teclado. Para mapear una secuencia de dos teclas en modo INSERT como `jj` a Escape, use la configuración [`vimInsertModeRemaps`](https://code.claude.com/docs/es/interactive-mode#remap-insert-mode-key-sequences)687* Las teclas Vim no se pueden remapear a través del archivo de atajos de teclado. Para mapear una secuencia de dos teclas en modo INSERT como `jj` a Escape, use la configuración [`vimInsertModeRemaps`](https://code.claude.com/docs/es/interactive-mode#remap-insert-mode-key-sequences)

688* En modo NORMAL de vim, `?` muestra el menú de ayuda (comportamiento de vim)688* En modo NORMAL de vim, `?` muestra el menú de ayuda (comportamiento de vim)

Details

306 306 

307## Agregar skills por directorio307## Agregar skills por directorio

308 308 

309Cualquier subdirectorio puede definir [skills](https://code.claude.com/docs/es/skills.md) limitados a su propio stack. Un skill se carga bajo demanda cuando Claude determina que es relevante, por lo que las herramientas específicas de API no consumen contexto durante el trabajo de frontend.309Cualquier subdirectorio puede definir [skills](https://code.claude.com/docs/es/skills.md) limitados a su propio stack. Un skill se carga bajo demanda cuando Claude determina que es relevante.

310 310 

311Los skills viven bajo `.claude/skills/` dentro del directorio. Comprométalos junto con el código de esa área para que cualquiera que clone el repositorio los obtenga. En un monorepo esto puede ser un conjunto de skills por paquete. En un codebase de árbol único grande es uno por subsistema como `src/db/.claude/skills/`.311Los skills viven bajo `.claude/skills/` dentro del directorio. Comprométalos junto con el código de esa área para que cualquiera que clone el repositorio los obtenga. En un monorepo esto puede ser un conjunto de skills por paquete. En un codebase de árbol único grande es uno por subsistema como `src/db/.claude/skills/`.

312 312 


347- Simula los servicios externos en `src/__tests__/mocks/`347- Simula los servicios externos en `src/__tests__/mocks/`

348```348```

349 349 

350Un subdirectorio diferente contiene diferentes skills de la misma manera: `packages/web/.claude/skills/component-patterns/` describe las convenciones de componentes del frontend en lugar de pruebas. Cuando Claude trabaja en un archivo en `packages/api/`, carga el skill api-testing. Cuando trabaja en `packages/web/`, carga component-patterns en su lugar. Los skills de ningún directorio se cargan durante las tareas del otro.350Un subdirectorio diferente contiene diferentes skills de la misma manera: `packages/web/.claude/skills/component-patterns/` describe las convenciones de componentes del frontend en lugar de pruebas. Cuando Claude trabaja en un archivo en `packages/api/`, carga el skill api-testing. Cuando trabaja en `packages/web/`, carga component-patterns.

351 351 

352También puedes limitar un skill por patrón de archivo en lugar de por ubicación. El [campo frontmatter `paths`](https://code.claude.com/docs/es/skills#frontmatter-reference) toma patrones glob, y Claude carga el skill automáticamente solo cuando trabaja con archivos coincidentes. Úsalo para un skill que vive en el `.claude/skills/` de la raíz del repositorio pero se aplica solo a ciertos archivos, como un skill de migración de base de datos limitado a `**/migrations/**`.352También puedes limitar un skill por patrón de archivo en lugar de por ubicación. El [campo frontmatter `paths`](https://code.claude.com/docs/es/skills#frontmatter-reference) toma patrones glob, y Claude carga el skill automáticamente solo cuando trabaja con archivos coincidentes. Úsalo para un skill que vive en el `.claude/skills/` de la raíz del repositorio pero se aplica solo a ciertos archivos, como un skill de migración de base de datos limitado a `**/migrations/**`.

353 353 

Details

520| Errores `400` en cada solicitud, en las propias palabras de la puerta de enlace rechazando un tipo de herramienta no reconocido, como `Input tag 'advisor_20260301'`, en Claude Code v2.1.275 | En un despliegue gradual en esa versión, las solicitudes llevan una entrada de [herramienta advisor](https://code.claude.com/docs/es/advisor.md) incluso con el advisor desactivado. La API de Anthropic la acepta, pero una puerta de enlace o upstream que valida tipos de herramientas rechaza toda la solicitud; una que [reenvía campos del cuerpo de la solicitud sin cambios](https://code.claude.com/docs/es/llm-gateway-protocol.md#forward-as-open-lists) la pasa sin afectar. La entrada es una declaración que no lleva contenido de conversación | Actualice a v2.1.276 o posterior, que no envía la entrada detrás de una puerta de enlace `ANTHROPIC_BASE_URL` a menos que active el advisor. En v2.1.275, establezca [`CLAUDE_CODE_DISABLE_ADVISOR_TOOL=1`](https://code.claude.com/docs/es/env-vars), que elimina la entrada de las solicitudes |520| Errores `400` en cada solicitud, en las propias palabras de la puerta de enlace rechazando un tipo de herramienta no reconocido, como `Input tag 'advisor_20260301'`, en Claude Code v2.1.275 | En un despliegue gradual en esa versión, las solicitudes llevan una entrada de [herramienta advisor](https://code.claude.com/docs/es/advisor.md) incluso con el advisor desactivado. La API de Anthropic la acepta, pero una puerta de enlace o upstream que valida tipos de herramientas rechaza toda la solicitud; una que [reenvía campos del cuerpo de la solicitud sin cambios](https://code.claude.com/docs/es/llm-gateway-protocol.md#forward-as-open-lists) la pasa sin afectar. La entrada es una declaración que no lleva contenido de conversación | Actualice a v2.1.276 o posterior, que no envía la entrada detrás de una puerta de enlace `ANTHROPIC_BASE_URL` a menos que active el advisor. En v2.1.275, establezca [`CLAUDE_CODE_DISABLE_ADVISOR_TOOL=1`](https://code.claude.com/docs/es/env-vars), que elimina la entrada de las solicitudes |

521| Modelos faltantes del selector `/model` | Los nombres de modelos de puerta de enlace no están en la lista integrada de Claude Code, o Claude Code está mostrando una alineación [`modelPicker`](https://code.claude.com/docs/es/settings-reference#modelpicker) que reemplaza las opciones integradas | Habilite [descubrimiento de modelos de puerta de enlace](#add-gateway-models-to-the-model-picker) o agregue nombres con las variables de [configuración de modelo](https://code.claude.com/docs/es/model-config.md). Si Claude Code muestra una alineación `modelPicker` que reemplaza, agregue los modelos de puerta de enlace a ella, o pida a su administrador que los agregue cuando la configuración administrada lo proporcione |521| Modelos faltantes del selector `/model` | Los nombres de modelos de puerta de enlace no están en la lista integrada de Claude Code, o Claude Code está mostrando una alineación [`modelPicker`](https://code.claude.com/docs/es/settings-reference#modelpicker) que reemplaza las opciones integradas | Habilite [descubrimiento de modelos de puerta de enlace](#add-gateway-models-to-the-model-picker) o agregue nombres con las variables de [configuración de modelo](https://code.claude.com/docs/es/model-config.md). Si Claude Code muestra una alineación `modelPicker` que reemplaza, agregue los modelos de puerta de enlace a ella, o pida a su administrador que los agregue cuando la configuración administrada lo proporcione |

522| `/fast` reporta `Fast mode unavailable due to network connectivity issues` mientras las solicitudes de inferencia funcionan | La verificación de disponibilidad del [modo rápido](https://code.claude.com/docs/es/fast-mode.md) va directamente a `api.anthropic.com` y no sigue `ANTHROPIC_BASE_URL`, por lo que, si el tráfico de salida directo está bloqueado, la verificación falla | Agrega `api.anthropic.com` a la lista de dominios permitidos si el tráfico de salida está bloqueado, o establece una variable de omisión. Consulta [usar el modo rápido detrás de proxies y gateways de LLM](https://code.claude.com/docs/es/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |522| `/fast` reporta `Fast mode unavailable due to network connectivity issues` mientras las solicitudes de inferencia funcionan | La verificación de disponibilidad del [modo rápido](https://code.claude.com/docs/es/fast-mode.md) va directamente a `api.anthropic.com` y no sigue `ANTHROPIC_BASE_URL`, por lo que, si el tráfico de salida directo está bloqueado, la verificación falla | Agrega `api.anthropic.com` a la lista de dominios permitidos si el tráfico de salida está bloqueado, o establece una variable de omisión. Consulta [usar el modo rápido detrás de proxies y gateways de LLM](https://code.claude.com/docs/es/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

523| `/fast` reporta `Fast mode is currently unavailable` en una sesión que se autentica con una clave emitida por el gateway en `ANTHROPIC_API_KEY` | Mientras `ANTHROPIC_BASE_URL` apunta a tu gateway, Claude Code no envía a `api.anthropic.com` una clave que no tenga el formato de una clave de API de Anthropic. Entonces la verificación de disponibilidad del [modo rápido](https://code.claude.com/docs/es/fast-mode.md) no se envía y, sin una verificación exitosa previa en caché, Claude Code trata el modo rápido como no disponible | Establece `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`; consulta [usar el modo rápido detrás de proxies y gateways de LLM](https://code.claude.com/docs/es/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |523| `/fast` reporta `Fast mode is currently unavailable` en una sesión que se autentica con una clave emitida por el gateway en `ANTHROPIC_API_KEY` | Mientras `ANTHROPIC_BASE_URL` apunta a tu gateway y la clave no tiene el formato de una clave de API de Anthropic, Claude Code no envía la verificación de disponibilidad del [modo rápido](https://code.claude.com/docs/es/fast-mode.md). Sin una verificación exitosa previa en caché, trata el modo rápido como no disponible | Establece `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`; consulta [usar el modo rápido detrás de proxies y gateways de LLM](https://code.claude.com/docs/es/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

524| `/fast` reporta `Fast mode has been disabled by your organization` en una sesión autenticada con `ANTHROPIC_AUTH_TOKEN`, aunque la organización tiene el modo rápido habilitado | La verificación de disponibilidad requiere un inicio de sesión en claude.ai o una clave de API; con solo un token bearer, Claude Code trata el modo rápido como deshabilitado sin enviar la verificación | Establece `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1`; consulta [usar el modo rápido detrás de proxies y gateways de LLM](https://code.claude.com/docs/es/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |524| `/fast` reporta `Fast mode has been disabled by your organization` en una sesión autenticada con `ANTHROPIC_AUTH_TOKEN`, aunque la organización tiene el modo rápido habilitado | La verificación de disponibilidad requiere un inicio de sesión en claude.ai o una clave de API; con solo un token bearer, Claude Code trata el modo rápido como deshabilitado sin enviar la verificación | Establece `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1`; consulta [usar el modo rápido detrás de proxies y gateways de LLM](https://code.claude.com/docs/es/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

525| Claude Code le pide que inicie sesión aunque la [prueba de curl](#verify-the-connection) tenga éxito | La CLI no tiene credencial propia: una URL base alcanzable no es una, y en una sesión interactiva un bloque `env` en el `.claude/settings.json` o `.claude/settings.local.json` de un proyecto se aplica solo después del asistente de primera ejecución y la [solicitud de confianza](https://code.claude.com/docs/es/permissions.md#what-runs-before-you-trust-a-folder) | Establezca `ANTHROPIC_AUTH_TOKEN` en algún lugar que Claude Code lea antes de la configuración de primera ejecución: una exportación de shell, el bloque `env` en `~/.claude/settings.json`, o configuración administrada |525| Claude Code le pide que inicie sesión aunque la [prueba de curl](#verify-the-connection) tenga éxito | La CLI no tiene credencial propia: una URL base alcanzable no es una, y en una sesión interactiva un bloque `env` en el `.claude/settings.json` o `.claude/settings.local.json` de un proyecto se aplica solo después del asistente de primera ejecución y la [solicitud de confianza](https://code.claude.com/docs/es/permissions.md#what-runs-before-you-trust-a-folder) | Establezca `ANTHROPIC_AUTH_TOKEN` en algún lugar que Claude Code lea antes de la configuración de primera ejecución: una exportación de shell, el bloque `env` en `~/.claude/settings.json`, o configuración administrada |

526| `ANTHROPIC_API_KEY` está establecido pero ignorado, sin solicitud | La clave necesita una aprobación única en sesiones interactivas, y una clave previamente rechazada se ignora sin preguntar de nuevo | Habilítela bajo `/config` con la opción `Use custom API key` |526| `ANTHROPIC_API_KEY` está establecido pero ignorado, sin solicitud | La clave necesita una aprobación única en sesiones interactivas, y una clave previamente rechazada se ignora sin preguntar de nuevo | Habilítela bajo `/config` con la opción `Use custom API key` |

Details

148| :- | :- |148| :- | :- |

149| `x-claude-code-request-class` | Qué tipo de solicitud es esta: `main` para un turno de la conversación principal, `subagent` para un turno de un [subagente](https://code.claude.com/docs/es/sub-agents.md), `workflow` para un agente ejecutándose dentro de un flujo de trabajo, `compaction` para la solicitud de resumen que compacta una conversación, o `auxiliary` para solicitudes secundarias como títulos de sesión, clasificadores y resúmenes. Enviado en cada solicitud |149| `x-claude-code-request-class` | Qué tipo de solicitud es esta: `main` para un turno de la conversación principal, `subagent` para un turno de un [subagente](https://code.claude.com/docs/es/sub-agents.md), `workflow` para un agente ejecutándose dentro de un flujo de trabajo, `compaction` para la solicitud de resumen que compacta una conversación, o `auxiliary` para solicitudes secundarias como títulos de sesión, clasificadores y resúmenes. Enviado en cada solicitud |

150| `x-claude-code-agent-type` | El tipo de subagente que emitió la solicitud: un nombre de tipo de agente integrado como `Explore`, `Plan` o `general-purpose`, o `custom` para un agente definido por el usuario, `teammate` para un miembro del [equipo de agentes](https://code.claude.com/docs/es/agent-teams.md) ejecutándose en el proceso del líder, o `fork` para un [fork](https://code.claude.com/docs/es/sub-agents.md#fork-the-current-conversation). Presente solo en los turnos propios de un subagente; la compactación o solicitudes secundarias de un subagente mantienen el ID del agente pero no llevan tipo. Un nombre de agente elegido por el usuario nunca se envía |150| `x-claude-code-agent-type` | El tipo de subagente que emitió la solicitud: un nombre de tipo de agente integrado como `Explore`, `Plan` o `general-purpose`, o `custom` para un agente definido por el usuario, `teammate` para un miembro del [equipo de agentes](https://code.claude.com/docs/es/agent-teams.md) ejecutándose en el proceso del líder, o `fork` para un [fork](https://code.claude.com/docs/es/sub-agents.md#fork-the-current-conversation). Presente solo en los turnos propios de un subagente; la compactación o solicitudes secundarias de un subagente mantienen el ID del agente pero no llevan tipo. Un nombre de agente elegido por el usuario nunca se envía |

151| `x-claude-code-compaction` | Presente en la solicitud que resume la conversación durante una [compactación](https://code.claude.com/docs/es/prompt-caching.md#compacting-the-conversation). El valor indica qué la activó: `auto` cuando la ventana de contexto se acercaba a su capacidad, `manual` para `/compact`, o `reactive` cuando la API rechazó una solicitud por ser demasiado larga. El valor también es `auto` para la [compactación por inactividad](https://code.claude.com/docs/es/settings-reference.md#idlecompaction). Ausente en todas las demás solicitudes |151| `x-claude-code-compaction` | Presente en la solicitud que resume la conversación durante una [compactación](https://code.claude.com/docs/es/prompt-caching.md#compacting-the-conversation). El valor indica qué la activó: `auto` cuando la ventana de contexto se acercaba a su capacidad, `manual` para `/compact`, o `reactive` cuando la API rechazó una solicitud por ser demasiado larga. El valor también es `auto` para la [compactación por inactividad](https://code.claude.com/docs/es/settings-reference.md#idlecompaction) en una sesión interactiva de terminal. Ausente en todas las demás solicitudes, incluida una que escribe un resumen en segundo plano antes de una compactación |

152| `x-claude-code-context-compacted` | Presente una vez, en la primera solicitud de conversación principal después de una compactación, con los mismos valores que `x-claude-code-compaction`. El prefijo de conversación antes de esta solicitud ya no se usa, así que un caché codificado en él puede descartarse |152| `x-claude-code-context-compacted` | Presente una vez, en la primera solicitud de conversación principal después de una compactación, con los mismos valores que `x-claude-code-compaction`. El prefijo de conversación antes de esta solicitud ya no se usa, así que un caché codificado en él puede descartarse |

153| `x-claude-code-prev-tool-durations` | Tiempo de ejecución medido de las llamadas de herramienta cuyos resultados lleva esta solicitud, como `<name>=<ms>;<name>=<ms>`, por ejemplo `Bash=742;Read=9`. Enviado en la siguiente solicitud de la misma conversación después de un lote de llamadas de herramienta, desde la sesión principal o un subagente |153| `x-claude-code-prev-tool-durations` | Tiempo de ejecución medido de las llamadas de herramienta cuyos resultados lleva esta solicitud, como `<name>=<ms>;<name>=<ms>`, por ejemplo `Bash=742;Read=9`. Enviado en la siguiente solicitud de la misma conversación después de un lote de llamadas de herramienta, desde la sesión principal o un subagente |

154| `x-claude-code-prompt-id` | UUID aleatorio que identifica la solicitud del usuario que sirve una solicitud. Las solicitudes que sirven una solicitud comparten el valor, incluidos los turnos de subagentes que la solicitud inició. Las solicitudes no atribuidas a una solicitud la omiten. Úselo para agrupar las solicitudes de una sesión por solicitud. Requiere Claude Code v2.1.283 o posterior |154| `x-claude-code-prompt-id` | UUID aleatorio que identifica la solicitud del usuario que sirve una solicitud. Las solicitudes que sirven una solicitud comparten el valor, incluidos los turnos de subagentes que la solicitud inició. Las solicitudes no atribuidas a una solicitud la omiten. Úselo para agrupar las solicitudes de una sesión por solicitud. Requiere Claude Code v2.1.283 o posterior |


238* Cuando el proveedor ascendente rechaza solo el marcador `cache_control` en un mensaje del sistema a mitad de conversación, Claude Code mantiene los mensajes del sistema y reintenta una vez con el marcador movido. El marcador va en la última entrada de `messages` que no sea un mensaje del sistema, en ese reintento y en las solicitudes posteriores hasta que Claude Code se cierre238* Cuando el proveedor ascendente rechaza solo el marcador `cache_control` en un mensaje del sistema a mitad de conversación, Claude Code mantiene los mensajes del sistema y reintenta una vez con el marcador movido. El marcador va en la última entrada de `messages` que no sea un mensaje del sistema, en ese reintento y en las solicitudes posteriores hasta que Claude Code se cierre

239* Cuando el proveedor ascendente rechaza una [firma de pensamiento](https://platform.claude.com/docs/en/build-with-claude/extended-thinking), incluido con un `400` cuyo mensaje dice que el bloque está `bound to a different conversation`, Claude Code elimina bloques de pensamiento anteriores de la solicitud, reintenta, y los mantiene fuera de cada solicitud posterior. Las nuevas respuestas aún incluyen pensamiento239* Cuando el proveedor ascendente rechaza una [firma de pensamiento](https://platform.claude.com/docs/en/build-with-claude/extended-thinking), incluido con un `400` cuyo mensaje dice que el bloque está `bound to a different conversation`, Claude Code elimina bloques de pensamiento anteriores de la solicitud, reintenta, y los mantiene fuera de cada solicitud posterior. Las nuevas respuestas aún incluyen pensamiento

240* Cuando la puerta de enlace o su proveedor ascendente rechaza la entrada de [herramienta asesor](https://code.claude.com/docs/es/advisor.md) en `tools` como un tipo de herramienta no reconocido, Claude Code reintenta la solicitud una vez sin esa entrada y su valor `anthropic-beta`. Las solicitudes posteriores a esa URL base dejan el asesor fuera hasta que Claude Code se cierre, y `/advisor` no está disponible para el desarrollador durante ese tiempo. Claude Code reconoce este rechazo por una respuesta `400` o `422` cuyo mensaje nombra el tipo de herramienta después de `Input tag`, como `Input tag 'advisor_20260301'`. Antes de v2.1.280, Claude Code no reintentaba este rechazo240* Cuando la puerta de enlace o su proveedor ascendente rechaza la entrada de [herramienta asesor](https://code.claude.com/docs/es/advisor.md) en `tools` como un tipo de herramienta no reconocido, Claude Code reintenta la solicitud una vez sin esa entrada y su valor `anthropic-beta`. Las solicitudes posteriores a esa URL base dejan el asesor fuera hasta que Claude Code se cierre, y `/advisor` no está disponible para el desarrollador durante ese tiempo. Claude Code reconoce este rechazo por una respuesta `400` o `422` cuyo mensaje nombra el tipo de herramienta después de `Input tag`, como `Input tag 'advisor_20260301'`. Antes de v2.1.280, Claude Code no reintentaba este rechazo

241* Cuando el proveedor ascendente rechaza `output_config.effort`, Claude Code reintenta la solicitud sin el esfuerzo y lo deja fuera de las solicitudes posteriores a ese modelo hasta que Claude Code se cierre. Claude Code reconoce este rechazo por un `400` cuyo mensaje nombra `output_config.effort` junto con `Extra inputs are not permitted`, o dice que el modelo no admite el parámetro de esfuerzo241* Cuando el proveedor ascendente rechaza `output_config.effort` o su valor `anthropic-beta`, Claude Code reintenta y no agrega ninguno de los dos a las solicitudes para ese modelo hasta que Claude Code se cierre. Tu gateway no necesita ningún cambio si reenvía el `400` del proveedor ascendente sin modificar y el mensaje:

242 * Nombra `output_config.effort` junto con `Extra inputs are not permitted`

243 * Dice que el modelo no admite el parámetro de esfuerzo

244 * Comienza con `Unexpected value(s)` y enumera `effort-2025-11-24` para el encabezado `anthropic-beta`. Requiere v2.1.310 o posterior. Los desarrolladores cuyo [`ANTHROPIC_BETAS`](https://code.claude.com/docs/es/env-vars) incluye el valor siguen enviándolo y recibiendo el `400`, así que pídeles que eliminen esa entrada

242* Cuando el proveedor ascendente rechaza el campo `context_management` o su valor `anthropic-beta`, el gateway ve la solicitud una vez más sin ellos. Si el gateway vuelve a verlos en una solicitud posterior y el proveedor ascendente los rechaza de nuevo, se produce el mismo reintento. Claude Code reconoce este rechazo por su mensaje, por ejemplo uno que contiene `context_management: Extra inputs are not permitted`. Antes de v2.1.304, Claude Code no reintentaba este rechazo245* Cuando el proveedor ascendente rechaza el campo `context_management` o su valor `anthropic-beta`, el gateway ve la solicitud una vez más sin ellos. Si el gateway vuelve a verlos en una solicitud posterior y el proveedor ascendente los rechaza de nuevo, se produce el mismo reintento. Claude Code reconoce este rechazo por su mensaje, por ejemplo uno que contiene `context_management: Extra inputs are not permitted`. Antes de v2.1.304, Claude Code no reintentaba este rechazo

243* Cuando el proveedor ascendente rechaza un campo de herramienta beta distinto de `defer_loading`, como `strict`, el `400` llega al desarrollador. Antes de que eso ocurra, el gateway puede volver a ver la solicitud [sin los campos de búsqueda de herramientas](#retry-without-tool-search). Para dejar de enviar esos campos, haz que los desarrolladores establezcan [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`](#disable-pre-release-capabilities)246* Cuando el proveedor ascendente rechaza un campo de herramienta beta distinto de `defer_loading`, como `strict`, el `400` llega al desarrollador. Antes de que eso ocurra, el gateway puede volver a ver la solicitud [sin los campos de búsqueda de herramientas](#retry-without-tool-search). Para dejar de enviar esos campos, haz que los desarrolladores establezcan [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`](#disable-pre-release-capabilities)

244 247 

mcp.md +1 −1

Details

761 761 

762### Alcance de proyecto762### Alcance de proyecto

763 763 

764Los servidores con alcance de proyecto habilitan la colaboración en equipo al almacenar configuraciones en un archivo `.mcp.json` en el directorio raíz de su proyecto. Cuando agrega un servidor con alcance de proyecto, Claude Code crea o actualiza automáticamente este archivo con la estructura de configuración apropiada. Verifique `.mcp.json` en el control de versiones para que todos en su equipo obtengan las mismas herramientas y servicios MCP.764Los servidores con alcance de proyecto habilitan la colaboración en equipo al almacenar configuraciones en un archivo `.mcp.json` en el directorio raíz de su proyecto. Cuando agrega un servidor con alcance de proyecto, Claude Code crea o actualiza automáticamente este archivo con la estructura de configuración apropiada. Incluya `.mcp.json` en el control de versiones para que todos en su equipo obtengan las mismas herramientas y servicios MCP.

765 765 

766```bash theme={null}766```bash theme={null}

767# Agregar un servidor con alcance de proyecto767# Agregar un servidor con alcance de proyecto

Details

470Si el nombre no llega, comprueba si se debe a una de estas causas:470Si el nombre no llega, comprueba si se debe a una de estas causas:

471 471 

472* **Lo estableciste en la computadora que ejecuta Desktop**: Desktop no pasa a la sesión SSH un valor que establezcas ahí472* **Lo estableciste en la computadora que ejecuta Desktop**: Desktop no pasa a la sesión SSH un valor que establezcas ahí

473* **Lo exportaste en un archivo de inicio de sesión**: solo los shells de inicio de sesión leen un archivo como `/etc/profile`. Un valor que exportas con `export` ahí llega a Claude Code cuando lo inicias desde un shell de inicio de sesión. No llega a una sesión SSH de Desktop, porque Desktop no inicia Claude Code a través de un shell de inicio de sesión.473* **Lo exportaste en `/etc/profile` u otro archivo que solo leen los shells de inicio de sesión**: el nombre llega cuando ejecutas `claude` desde un shell de inicio de sesión, pero no en una sesión SSH de Desktop. Desktop no inicia Claude Code a través de un shell de inicio de sesión. En su lugar, establece la variable en `env` en el [archivo de configuración administrada](https://code.claude.com/docs/es/desktop.md#managed-settings) de la máquina remota.

474* **Un valor contiene un espacio**: en ese caso, Claude Code no copia ninguna de las claves en los eventos ni en los puntos de datos, y no reporta ningún error. [Quita el espacio del valor](#multi-team-organization-support).474* **Un valor contiene un espacio**: en ese caso, Claude Code no copia ninguna de las claves en los eventos ni en los puntos de datos, y no reporta ningún error. [Quita el espacio del valor](#multi-team-organization-support).

475* **Algo más ya establece la variable**: en una sesión que inicia la aplicación de escritorio, una variable ya establecida en el entorno de lanzamiento [tiene precedencia sobre los archivos de configuración](https://code.claude.com/docs/es/settings-reference.md#how-env-values-interact-with-your-shell). El [registro de depuración](https://code.claude.com/docs/es/debug-your-config.md) nombra cada variable ignorada. Cuando un despliegue de Desktop de terceros [especifica un endpoint OTLP](#how-managed-settings-lock-the-otlp-destination) en el entorno que proporciona, ese entorno lleva el propio `OTEL_RESOURCE_ATTRIBUTES` de Desktop.475* **Algo más ya establece la variable**: en una sesión que inicia la aplicación de escritorio, una variable ya establecida en el entorno de lanzamiento [tiene precedencia sobre los archivos de configuración](https://code.claude.com/docs/es/settings-reference.md#how-env-values-interact-with-your-shell). El [registro de depuración](https://code.claude.com/docs/es/debug-your-config.md) nombra cada variable ignorada. Cuando un despliegue de Desktop de terceros [especifica un endpoint OTLP](#how-managed-settings-lock-the-otlp-destination) en el entorno que proporciona, ese entorno lleva el propio `OTEL_RESOURCE_ATTRIBUTES` de Desktop.

476 476 


1403* `pre_tokens`: recuento aproximado de tokens antes de la compactación1403* `pre_tokens`: recuento aproximado de tokens antes de la compactación

1404* `post_tokens`: recuento aproximado de tokens después de la compactación1404* `post_tokens`: recuento aproximado de tokens después de la compactación

1405* `error`: mensaje de error cuando la compactación falló1405* `error`: mensaje de error cuando la compactación falló

1406* `precompute_reuse`: solo se establece cuando `trigger` es `"manual"` o para una [compactación por inactividad](https://code.claude.com/docs/es/settings-reference.md#idlecompaction), que informa `trigger` como `"auto"`. La compactación automática puede preparar un resumen en segundo plano antes de que se llene la ventana de contexto, y este atributo registra si la compactación reutilizó ese resumen preparado. `"hit"` significa que se reutilizó; `"miss_custom_instructions"`, `"miss_hook"` y `"miss_not_ready"` indican el motivo por el que, en su lugar, se calculó un resumen nuevo1406* `precompute_reuse`: solo se establece cuando `trigger` es `"manual"`, o cuando `trigger` es `"auto"` para una [compactación por inactividad](https://code.claude.com/docs/es/settings-reference.md#idlecompaction) en una sesión interactiva de terminal. La compactación automática puede preparar un resumen en segundo plano antes de que se llene la ventana de contexto, y este atributo registra si la compactación reutilizó ese resumen preparado. `"hit"` significa que se reutilizó; `"miss_custom_instructions"`, `"miss_hook"` y `"miss_not_ready"` indican el motivo por el que, en su lugar, se calculó un resumen nuevo

1407 1407 

1408#### Evento de subagente completado1408#### Evento de subagente completado

1409 1409 

Details

248 248 

249**Web and mobile**249**Web and mobile**

250 250 

251En [claude.ai/code](https://claude.ai/code), usa el menú desplegable de modo junto al cuadro de prompt. En la aplicación móvil, toca el botón **+** en el cuadro de prompt y luego **Permission**. Las sesiones en la nube y las sesiones de Remote Control ofrecen modos de permisos diferentes:251En [claude.ai/code](https://claude.ai/code), usa el menú desplegable de modo en la fila debajo del cuadro de prompt. En la aplicación móvil, toca el botón **+** en el cuadro de prompt y luego **Permission**. Las sesiones en la nube y las sesiones de Remote Control ofrecen modos de permisos diferentes:

252 252 

253* **[Sesiones en la nube](https://code.claude.com/docs/es/claude-code-on-the-web.md)**: Aceptar ediciones, Plan y Auto. Aceptar ediciones corresponde al modo `default`: las sesiones en la nube aprueban previamente las ediciones de archivos independientemente del modo, por lo que el menú desplegable muestra Aceptar ediciones en lugar de Manual. Las sesiones en la nube aún respetan `defaultMode: "acceptEdits"` de la configuración. El modo Auto aparece solo cuando tu organización lo permite y el modelo seleccionado lo admite. Omitir permisos no está disponible.253* **[Sesiones en la nube](https://code.claude.com/docs/es/claude-code-on-the-web.md)**: Aceptar ediciones, Plan y Auto. Aceptar ediciones corresponde al modo `default`: las sesiones en la nube aprueban previamente las ediciones de archivos independientemente del modo, por lo que el menú desplegable muestra Aceptar ediciones en lugar de Manual. Las sesiones en la nube aún respetan `defaultMode: "acceptEdits"` de la configuración. El modo Auto aparece solo cuando tu organización lo permite y el modelo seleccionado lo admite. Omitir permisos no está disponible.

254* **Sesiones de [Remote Control](https://code.claude.com/docs/es/remote-control.md)** en tu máquina local: Manual, Aceptar ediciones, Plan y Auto para una sesión que iniciaste tú mismo, y no puedes seleccionar Omitir permisos desde la aplicación. Para usar Auto, la sesión tiene que cumplir los [requisitos de disponibilidad](#eliminate-prompts-with-auto-mode) del modo automático. Para un hilo de proyecto que se ejecuta en tu computadora, consulta [Ejecutar un hilo en tu propia computadora](https://code.claude.com/docs/es/claude-projects.md#run-a-thread-on-your-own-computer).254* **Sesiones de [Remote Control](https://code.claude.com/docs/es/remote-control.md)** en tu máquina local: Manual, Aceptar ediciones, Plan y Auto para una sesión que iniciaste tú mismo, y no puedes seleccionar Omitir permisos desde la aplicación. Para usar Auto, la sesión tiene que cumplir los [requisitos de disponibilidad](#eliminate-prompts-with-auto-mode) del modo automático. Para un hilo de proyecto que se ejecuta en tu computadora, consulta [Ejecutar un hilo en tu propia computadora](https://code.claude.com/docs/es/claude-projects.md#run-a-thread-on-your-own-computer).

Details

584 584 

585El comando de un monitor está limitado en dónde comienza y qué puede referenciar:585El comando de un monitor está limitado en dónde comienza y qué puede referenciar:

586 586 

587* **Solo sesiones interactivas**: los monitores del plugin se inician en una sesión interactiva y nunca en modo no interactivo con el flag `-p`. Tampoco se inician en sesiones donde el proveedor de la API o la configuración de telemetría hacen que la [herramienta Monitor](https://code.claude.com/docs/es/tools-reference.md#monitor-tool) no esté disponible587* **Sesiones interactivas**: los monitores del plugin no se inician en modo no interactivo con el flag `-p`

588* **Versión mínima**: en Amazon Bedrock, Claude Platform on AWS, Agent Platform de Google Cloud o Microsoft Foundry, o con `DISABLE_TELEMETRY` o `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` establecidos, los monitores requieren Claude Code v2.1.310 o posterior. El requisito se aplica cuando la [obtención de feature flags](https://code.claude.com/docs/es/env-vars.md#features-that-need-feature-flag-fetching) está desactivada

588* **Sin configuración del usuario**: `command` obtiene las [variables de ruta](#path-variables-and-persistent-data) y `${ENV_VAR}` del entorno, pero nunca `${user_config.*}`. Un monitor que hace referencia a uno no comienza, y los procesos de monitor tampoco reciben `CLAUDE_PLUGIN_OPTION_<KEY>`589* **Sin configuración del usuario**: `command` obtiene las [variables de ruta](#path-variables-and-persistent-data) y `${ENV_VAR}` del entorno, pero nunca `${user_config.*}`. Un monitor que hace referencia a uno no comienza, y los procesos de monitor tampoco reciben `CLAUDE_PLUGIN_OPTION_<KEY>`

589* **Deshabilitación a mitad de sesión**: si deshabilita un plugin a mitad de sesión, Claude Code no detiene los monitores que ya se están ejecutando. Se detienen cuando termina la sesión590* **Deshabilitación a mitad de sesión**: si deshabilita un plugin a mitad de sesión, Claude Code no detiene los monitores que ya se están ejecutando. Se detienen cuando termina la sesión

590 591 


647 648 

648En la ruta del directorio de datos, `<id>` es el identificador del plugin con cada carácter que no sea letra, dígito, `_` y `-` reemplazado por `-`, así que `my-plugin@my-marketplace` se convierte en `my-plugin-my-marketplace`.649En la ruta del directorio de datos, `<id>` es el identificador del plugin con cada carácter que no sea letra, dígito, `_` y `-` reemplazado por `-`, así que `my-plugin@my-marketplace` se convierte en `my-plugin-my-marketplace`.

649 650 

650En Windows, las rutas sustituidas usan barras diagonales para que un shell no lea las barras invertidas como escapes.651En Windows, la mayoría de las rutas sustituidas usan barras diagonales, como en `C:/Users/you/...`. Conservan sus barras invertidas nativas en un [hook de forma exec](https://code.claude.com/docs/es/hooks.md#exec-form-and-shell-form) y en un hook que se ejecuta a través de PowerShell, que es el shell predeterminado en Windows cuando Git Bash no está instalado.

651 652 

652### Instalar dependencias en el directorio de datos653### Instalar dependencias en el directorio de datos

653 654 

Details

148 148 

149Cuando los dos nombres difieren y alguien instala por el nombre del manifest, Claude Code reporta `Plugin "<manifest-name>" not found in marketplace "<marketplace>"`. Mantenga los dos nombres iguales. Para más información sobre cómo Claude Code usa los dos nombres, consulte [Referencia de carga de plugins](https://code.claude.com/docs/es/plugins/loading.md#find-where-a-plugin-came-from).149Cuando los dos nombres difieren y alguien instala por el nombre del manifest, Claude Code reporta `Plugin "<manifest-name>" not found in marketplace "<marketplace>"`. Mantenga los dos nombres iguales. Para más información sobre cómo Claude Code usa los dos nombres, consulte [Referencia de carga de plugins](https://code.claude.com/docs/es/plugins/loading.md#find-where-a-plugin-came-from).

150 150 

151### Mantener los submódulos no usados fuera del clon

152 

153Cuando alguien agrega tu marketplace, Claude Code clona el repositorio y obtiene solo los submódulos de git que contienen archivos de plugins. Requiere Claude Code v2.1.295 o posterior.

154 

155Tú decides qué submódulos obtiene Claude Code según dónde colocas cada plugin:

156 

157* **Un plugin en un subdirectorio**: Claude Code obtiene los submódulos dentro del directorio del plugin y un submódulo que lo contenga. Coloca dentro del directorio del plugin un submódulo que tu plugin necesite, y deja fuera uno que no necesite

158* **Un plugin en la raíz del marketplace**: Claude Code obtiene todos los submódulos del repositorio en cuanto uno de los archivos del plugin hace referencia a una ruta dentro de cualquiera de ellos. Si tu repositorio tiene un submódulo grande que solo usa tu compilación, mueve el plugin a un subdirectorio

159 

160Si un plugin en la raíz ejecuta un archivo de un submódulo, escribe la ruta del archivo de forma explícita en la configuración del hook o del servidor del plugin, como `${CLAUDE_PLUGIN_ROOT}/vendor/tool/run.sh`. Claude Code lee esas rutas para determinar si el plugin necesita los submódulos. No puede ver una ruta que un script construye mientras se ejecuta.

161 

162Para la regla completa, consulta [Submódulos de Git en el repositorio del marketplace](https://code.claude.com/docs/es/plugins/marketplace-reference.md#git-submodules-in-the-marketplace-repository).

163 

151## Elegir una source de plugin164## Elegir una source de plugin

152 165 

153Cada entrada de plugin en `marketplace.json` tiene una `source` que le dice a Claude Code dónde obtener ese plugin. Elija la source según dónde se almacenan los archivos del plugin. La tabla enumera las sources que la mayoría de los propietarios de marketplace utilizan.166Cada entrada de plugin en `marketplace.json` tiene una `source` que le dice a Claude Code dónde obtener ese plugin. Elija la source según dónde se almacenan los archivos del plugin. La tabla enumera las sources que la mayoría de los propietarios de marketplace utilizan.

Details

111Diga a los usuarios qué necesita cada protocolo en su máquina:111Diga a los usuarios qué necesita cada protocolo en su máquina:

112 112 

113* **SSH**: la clave debe funcionar sin una indicación de contraseña, por ejemplo porque está cargada en `ssh-agent`. El host ya debe estar en `known_hosts`.113* **SSH**: la clave debe funcionar sin una indicación de contraseña, por ejemplo porque está cargada en `ssh-agent`. El host ya debe estar en `known_hosts`.

114* **HTTPS**: Claude Code deja habilitado el asistente de credenciales de git del usuario pero le prohíbe que solicite. Una credencial que el asistente ya almacena funciona; una que tendría que pedir falla. En GitHub, `gh auth login` seguido de `gh auth setup-git` almacena una.114* **HTTPS**: Claude Code deja habilitado el asistente de credenciales de git del usuario pero le prohíbe que solicite datos, y no ejecuta programas askpass como uno configurado en `GIT_ASKPASS`. Una credencial que el asistente ya almacena funciona; una que tendría que pedir falla. En GitHub, `gh auth login` seguido de `gh auth setup-git` almacena una.

115 115 

116Para un host de GitHub Enterprise Server, los usuarios necesitan acceso de git a ese host desde su máquina. Consulte [Plugin marketplaces on GHES](https://code.claude.com/docs/es/github-enterprise-server.md#plugin-marketplaces-on-ghes) para ver qué necesita cada superficie de Claude Code para alcanzar un marketplace alojado en GHES.116Para un host de GitHub Enterprise Server, los usuarios necesitan acceso de git a ese host desde su máquina. Consulte [Plugin marketplaces on GHES](https://code.claude.com/docs/es/github-enterprise-server.md#plugin-marketplaces-on-ghes) para ver qué necesita cada superficie de Claude Code para alcanzar un marketplace alojado en GHES.

117 117 

Details

238 238 

239Un marketplace privado es uno en un repositorio al que necesita credenciales para clonar, en GitHub o cualquier otro host git. Lo agrega con el mismo comando `/plugin marketplace add` o `claude plugin marketplace add` que uno público. Claude Code lo clona con las credenciales git ya en su máquina y nunca solicita, así que cada forma de conectarse tiene un requisito:239Un marketplace privado es uno en un repositorio al que necesita credenciales para clonar, en GitHub o cualquier otro host git. Lo agrega con el mismo comando `/plugin marketplace add` o `claude plugin marketplace add` que uno público. Claude Code lo clona con las credenciales git ya en su máquina y nunca solicita, así que cada forma de conectarse tiene un requisito:

240 240 

241* **HTTPS**: sus ayudantes de credenciales git se aplican, así que el acceso que configuró con `gh auth login`, el Keychain de macOS, o `git-credential-store` funciona. Los prompts interactivos se suprimen, así que un host al que nunca se ha autenticado falla en lugar de pedir una contraseña.241* **HTTPS**: se aplican tus ayudantes de credenciales git, así que funciona el acceso que configuraste con `gh auth login`, el Keychain de macOS o `git-credential-store`. Las solicitudes de git y los programas askpass están desactivados, incluido uno configurado en `GIT_ASKPASS`, así que la clonación falla en lugar de pedirte algo cuando git tendría que solicitar una credencial.

242* **SSH**: el host ya debe estar en su archivo `known_hosts` y la clave debe funcionar sin un prompt de frase de contraseña. Si su configuración de git nombra un programa SSH en `GIT_SSH_COMMAND`, `GIT_SSH`, o el `core.sshCommand` de su configuración de git, Claude Code ejecuta ese programa.242* **SSH**: el host ya debe estar en su archivo `known_hosts` y la clave debe funcionar sin un prompt de frase de contraseña. Si su configuración de git nombra un programa SSH en `GIT_SSH_COMMAND`, `GIT_SSH`, o el `core.sshCommand` de su configuración de git, Claude Code ejecuta ese programa.

243* **Abreviatura de GitHub `owner/repo`**: Claude Code verifica si su clave SSH se autentica en `github.com`, luego clona sobre SSH si lo hace y sobre HTTPS si no. Establezca [`CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1`](https://code.claude.com/docs/es/env-vars#variables) para omitir esa verificación y siempre clonar sobre HTTPS.243* **Abreviatura de GitHub `owner/repo`**: Claude Code verifica si su clave SSH se autentica en `github.com`, luego clona sobre SSH si lo hace y sobre HTTPS si no. Establezca [`CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1`](https://code.claude.com/docs/es/env-vars#variables) para omitir esa verificación y siempre clonar sobre HTTPS.

244 244 

Details

41* **Un mercado que la configuración declara pero que `known_marketplaces.json` carece**: Claude Code lo clona, luego recarga plugins y descarga plugins habilitados que aún no están en caché41* **Un mercado que la configuración declara pero que `known_marketplaces.json` carece**: Claude Code lo clona, luego recarga plugins y descarga plugins habilitados que aún no están en caché

42* **Un mercado declarado cuya fuente cambió en la configuración**: Claude Code lo vuelve a obtener de la nueva fuente y muestra `Plugins changed. Run /reload-plugins to activate.`42* **Un mercado declarado cuya fuente cambió en la configuración**: Claude Code lo vuelve a obtener de la nueva fuente y muestra `Plugins changed. Run /reload-plugins to activate.`

43 43 

44Un plugin habilitado que ninguna ruta obtuvo y que no tiene un directorio de caché utilizable muestra `Plugin "<name>" not cached at <path>` en la pestaña **Errors** de `/plugin`, y `claude plugin list` agrega `— run /plugin to refresh` a la misma línea. Para la solución, consulte [`Plugin "<name>" not cached at <path>`](https://code.claude.com/docs/es/plugins/troubleshooting#plugin-not-cached-at).44Un plugin habilitado que ninguna ruta obtuvo y que no tiene un directorio de caché utilizable muestra `Plugin "<name>" not cached at <path>` en la pestaña **Errors** de `/plugin`. Para la solución, consulta [`Plugin "<name>" not cached at <path>`](https://code.claude.com/docs/es/plugins/troubleshooting#plugin-not-cached-at).

45 45 

46## Encontrar de dónde vino un plugin46## Encontrar de dónde vino un plugin

47 47 

Details

155| `workflows` | Path, or array of paths | Archivos [Workflow](https://code.claude.com/docs/es/workflows.md#distribute-a-workflow-in-a-plugin) `.js` o directorios. Reemplaza el escaneo predeterminado `workflows/` |155| `workflows` | Path, or array of paths | Archivos [Workflow](https://code.claude.com/docs/es/workflows.md#distribute-a-workflow-in-a-plugin) `.js` o directorios. Reemplaza el escaneo predeterminado `workflows/` |

156| `experimental` | Object | Contenedor para `themes`, `monitors` y `evals`, cuya forma de manifiesto aún puede cambiar |156| `experimental` | Object | Contenedor para `themes`, `monitors` y `evals`, cuya forma de manifiesto aún puede cambiar |

157| `experimental.themes` | Path, or array of paths | Archivos de tema o directorios. Reemplaza el escaneo predeterminado `themes/`. Una clave `themes` de nivel superior aún se carga, con una advertencia `claude plugin validate` |157| `experimental.themes` | Path, or array of paths | Archivos de tema o directorios. Reemplaza el escaneo predeterminado `themes/`. Una clave `themes` de nivel superior aún se carga, con una advertencia `claude plugin validate` |

158| [`experimental.monitors`](#monitors) | Path, or inline array | Un archivo `.json` que contiene el array de monitores, o el array en sí. Por defecto es `monitors/monitors.json`. Una clave `monitors` de nivel superior aún se carga, con una advertencia `claude plugin validate`. Los monitores se ejecutan solo en sesiones interactivas, y no en Amazon Bedrock, Google Cloud's Agent Platform o Microsoft Foundry |158| [`experimental.monitors`](#monitors) | Path, or inline array | Un archivo `.json` que contiene el array de monitores, o el array en sí. Por defecto es `monitors/monitors.json`. Una clave `monitors` de nivel superior aún se carga, con una advertencia `claude plugin validate`. Los monitores [no se inician con el flag `-p`](https://code.claude.com/docs/es/plugins/components#monitors) |

159| `experimental.evals` | Path, or array of paths | Directorio que contiene los [casos de evaluación](https://code.claude.com/docs/es/plugin-evals.md#use-a-different-eval-directory) del plugin cuando no es el predeterminado `evals/`. `claude plugin eval --eval-dir` lo anula |159| `experimental.evals` | Path, or array of paths | Directorio que contiene los [casos de evaluación](https://code.claude.com/docs/es/plugin-evals.md#use-a-different-eval-directory) del plugin cuando no es el predeterminado `evals/`. `claude plugin eval --eval-dir` lo anula |

160 160 

161En la columna Tipo, una ruta es una cadena relativa a la raíz del plugin, como `"./custom/commands"`.161En la columna Tipo, una ruta es una cadena relativa a la raíz del plugin, como `"./custom/commands"`.


606}606}

607```607```

608 608 

609En Windows, las rutas sustituidas usan barras diagonales para que un shell no lea barras invertidas como escapes.609En Windows, la mayoría de las rutas sustituidas usan barras diagonales, como en `C:/Users/you/...`. Conservan sus barras invertidas nativas en un [hook de forma exec](https://code.claude.com/docs/es/hooks.md#exec-form-and-shell-form) y en un hook que se ejecuta a través de PowerShell, que es el shell predeterminado en Windows cuando Git Bash no está instalado.

610 610 

611## Diseño estándar611## Diseño estándar

612 612 

Details

129| `false` | presente | ninguno | `plugin.json` es el manifiesto, como con `true` |129| `false` | presente | ninguno | `plugin.json` es el manifiesto, como con `true` |

130| `false` | presente | uno o más | Conflicto. El plugin falla al cargar con `Plugin <name> has conflicting manifests: both plugin.json and marketplace entry specify components` |130| `false` | presente | uno o más | Conflicto. El plugin falla al cargar con `Plugin <name> has conflicting manifests: both plugin.json and marketplace entry specify components` |

131 131 

132## Fuentes de plugins132## Orígenes de plugins

133 133 

134El `source` de una entrada de plugin indica dónde Claude Code obtiene ese plugin. Es una cadena de ruta relativa u un objeto cuya propia clave `source` nombra el tipo, por lo que una entrada se ve como `"source": { "source": "github", "repo": "your-org/formatter" }`.134El `source` de una entrada de plugin indica desde dónde Claude Code obtiene ese plugin en particular. Es una cadena de ruta relativa o un objeto cuya propia clave `source` nombra el tipo, de modo que una entrada se ve así: `"source": { "source": "github", "repo": "your-org/formatter" }`.

135 135 

136La tabla enumera cada tipo de fuente de plugin y sus campos.136La tabla enumera cada tipo de origen de plugin y sus campos.

137 137 

138| Tipo | Campos | Notas |138| Tipo | Campos | Notas |

139| :- | :- | :- |139| :- | :- | :- |

140| Ruta relativa | la cadena en sí | Un directorio dentro del marketplace, resuelto desde la raíz del marketplace. Debe comenzar con `./`, a menos que escriba un [nombre desnudo bajo `metadata.pluginRoot`](#relative-path-plugin-source). `"."` por sí solo significa la raíz en sí |140| Ruta relativa | la propia cadena | Un directorio dentro del marketplace, resuelto desde la raíz del marketplace. Debe comenzar con `./`, a menos que escribas un [nombre simple bajo `metadata.pluginRoot`](#relative-path-plugin-source). `"."` por sí solo significa la propia raíz |

141| `github` | `repo`, `ref`, `sha` | Repositorio de GitHub en forma `owner/repo` |141| `github` | `repo`, `ref`, `sha` | Repositorio de GitHub en formato `owner/repo` |

142| `url` | `url`, `ref`, `sha` | Cualquier repositorio git por URL |142| `url` | `url`, `ref`, `sha` | Cualquier repositorio git por URL |

143| `git-subdir` | `url`, `path`, `ref`, `sha` | Un subdirectorio de un repositorio git, obtenido con un sparse checkout |143| `git-subdir` | `url`, `path`, `ref`, `sha` | Un subdirectorio de un repositorio git, obtenido con un sparse checkout |

144| `npm` | `package`, `version`, `registry` | Paquete del registro npm o enlace a un tarball, obtenido con tu cliente npm y desempaquetado sin ejecutar scripts de instalación |144| `npm` | `package`, `version`, `registry` | Paquete del registro de npm o enlace a un tarball, obtenido con tu cliente de npm y desempaquetado sin ejecutar scripts de instalación |

145| `archive` | `url`, `sha256` | Archivo Zip sobre HTTPS. Requiere Claude Code v2.1.224 o posterior |145| `archive` | `url`, `sha256` | Archivo zip a través de HTTPS. Requiere Claude Code v2.1.224 o posterior |

146| `command` | `command`, `timeout`, `mode` | Directorio impreso por un comando que Claude Code ejecuta en la máquina del usuario. Requiere Claude Code v2.1.229 o posterior |146| `command` | `command`, `timeout`, `mode` | Directorio impreso por un comando que Claude Code ejecuta en la máquina del usuario. Requiere Claude Code v2.1.229 o posterior |

147 147 

148Los nombres `url` y `github` también son tipos de [fuente de marketplace](#marketplace-sources), donde `url` significa un enlace directo a un archivo `marketplace.json` en lugar de un repositorio git. `git` existe solo como una fuente de marketplace, y `npm` existe como ambas. `git-subdir`, `archive` y `command` existen solo como fuentes de plugins.148Los nombres `url` y `github` también son tipos de [origen de marketplace](#marketplace-sources), donde `url` significa un enlace directo a un archivo `marketplace.json` en lugar de a un repositorio git. `git` existe solo como origen de marketplace, y `npm` existe como ambos. `git-subdir`, `archive` y `command` existen solo como orígenes de plugin.

149 149 

150Use una ruta relativa para un plugin en un subdirectorio del repositorio del marketplace en sí. Use `git-subdir` para un subdirectorio de algún otro repositorio.150Usa una ruta relativa para un plugin que esté en un subdirectorio del propio repositorio del marketplace. Usa `git-subdir` para un subdirectorio de algún otro repositorio.

151 151 

152Las fuentes `github`, `url` y `git-subdir` comparten los campos `ref` y `sha`:152Los orígenes `github`, `url` y `git-subdir` comparten los campos `ref` y `sha`:

153 153 

154* **`ref`**: una rama o etiqueta. Por defecto es la rama predeterminada del repositorio.154* **`ref`**: una rama o etiqueta. De forma predeterminada es la rama predeterminada del repositorio.

155* **`sha`**: un SHA de commit completo de 40 caracteres en minúsculas. Cuando establece tanto `ref` como `sha`, Claude Code verifica `sha`. En la mayoría de hosts git, incluidos GitHub, GitLab y Bitbucket, esto significa que la instalación tiene éxito incluso si la rama o etiqueta nombrada por `ref` ha sido eliminada posteriormente, siempre que el commit aún sea alcanzable desde el repositorio. Algunos servidores, como AWS CodeCommit, no admiten obtener commits por SHA. En esos servidores, el `ref` aún debe existir y el commit fijado debe ser alcanzable desde él.155* **`sha`**: un SHA de commit completo de 40 caracteres en minúsculas. Cuando estableces tanto `ref` como `sha`, Claude Code hace checkout de `sha`. En la mayoría de los hosts de git, incluidos GitHub, GitLab y Bitbucket, esto significa que la instalación tiene éxito aunque la rama o etiqueta nombrada por `ref` se haya eliminado desde entonces en el upstream, siempre que el commit siga siendo alcanzable desde el repositorio. Algunos servidores, como AWS CodeCommit, no admiten obtener commits por SHA. En esos servidores, la `ref` debe seguir existiendo y el commit fijado debe ser alcanzable desde ella.

156 156 

157Para cómo se obtiene, almacena en caché y versiona cada tipo, consulte [Referencia de carga de plugins](https://code.claude.com/docs/es/plugins/loading.md).157Para saber cómo se obtiene, almacena en caché y versiona cada tipo, consulta la [referencia de carga de plugins](https://code.claude.com/docs/es/plugins/loading.md).

158 158 

159### Fuente de plugin de ruta relativa159### Origen de plugin de ruta relativa

160 160 

161La ruta se resuelve desde la raíz del marketplace. `./plugins/formatter` es `<root>/plugins/formatter` aunque el archivo marketplace esté en `<root>/.claude-plugin/`.161La ruta se resuelve desde la raíz del marketplace. `./plugins/formatter` es `<root>/plugins/formatter` aunque el archivo del marketplace esté en `<root>/.claude-plugin/`.

162 162 

163Una ruta que contiene `..` falla la validación. En macOS y Linux, Claude Code rechaza una ruta de entrada que contiene una barra invertida en cualquier lugar después del `./` inicial, por lo que escriba la ruta con barras diagonales.163Una ruta que contiene `..` no supera la validación. En macOS y Linux, Claude Code rechaza una ruta de entrada que contenga una barra invertida en cualquier lugar después del `./` inicial, así que escribe la ruta con barras diagonales.

164 164 

165```json theme={null}165```json theme={null}

166{ "name": "formatter", "source": "./plugins/formatter" }166{ "name": "formatter", "source": "./plugins/formatter" }

167```167```

168 168 

169Una ruta relativa se resuelve solo cuando Claude Code tiene los archivos del marketplace, así que verifique el tipo de [fuente de marketplace](#marketplace-sources):169Una ruta relativa solo se resuelve cuando Claude Code tiene los archivos del marketplace, así que revisa el tipo de [origen del marketplace](#marketplace-sources):

170 170 

171* **`github`, `git`, `file` y `directory`**: Claude Code tiene los archivos del marketplace.171* **`github`, `git`, `file` y `directory`**: Claude Code tiene los archivos del marketplace.

172* **`url`**: Claude Code obtiene solo `marketplace.json`, por lo que las rutas relativas no pueden resolverse. Dé a cada plugin una fuente de objeto en su lugar, como `github` o `git-subdir`.172* **`url`**: Claude Code obtiene solo `marketplace.json`, por lo que las rutas relativas no pueden resolverse. En su lugar, dale a cada plugin un origen de tipo objeto, como `github` o `git-subdir`.

173* **`settings`**: las rutas relativas se rechazan directamente.173* **`settings`**: las rutas relativas se rechazan directamente.

174 174 

175#### Nombres desnudos bajo pluginRoot175#### Submódulos de Git en el repositorio del marketplace

176 176 

177Un nombre desnudo es un nombre de directorio único sin `/`, como `"formatter"`. Para escribir nombres desnudos en lugar de rutas `./`, establezca [`metadata.pluginRoot`](#top-level-fields) en el directorio bajo el cual se resuelven. Con `"pluginRoot": "./plugins"`, `"source": "formatter"` se resuelve a `./plugins/formatter`. Requiere Claude Code v2.1.239 o posterior.177Cuando Claude Code clona un repositorio de marketplace, obtiene solo los submódulos de git que contienen archivos de plugins. Requiere Claude Code v2.1.295 o posterior.

178 

179Las versiones anteriores obtienen todos los submódulos, incluidos los anidados. Si el repositorio tiene un submódulo grande, Claude Code puede entonces superar el [tiempo de espera de clonación](https://code.claude.com/docs/es/plugins/troubleshooting.md#git-clone-timed-out-after-120s) mientras lo obtiene.

180 

181Para un plugin en un subdirectorio, como `./plugins/formatter`, Claude Code obtiene un submódulo en estos casos:

182 

183* **El plugin está dentro del submódulo**: el submódulo es el directorio del plugin o un directorio por encima de él

184* **El submódulo está dentro del plugin**: el submódulo está en cualquier lugar bajo el directorio del plugin

185* **Un enlace simbólico apunta dentro del submódulo**: un enlace con commit en el repositorio tiene su destino en el submódulo

186 

187Un plugin en la raíz del marketplace, con `"source": "./"`, obtiene todos los submódulos del repositorio o ninguno. Claude Code obtiene todos los submódulos cuando alguno de estos apunta dentro de cualquier submódulo:

188 

189* **Un directorio de componentes**: un directorio en la raíz que contiene componentes del plugin, como `skills/`, `hooks/` o `bin/`

190* **Una ruta en la configuración del plugin**: una ruta en la entrada del marketplace del plugin, en su `plugin.json` o en un archivo de configuración como `.mcp.json` o `hooks/hooks.json`

191* **Un enlace simbólico**: un enlace con commit en el repositorio

192* **Texto en los archivos del plugin**: la ruta de un submódulo, como `vendor/tool`, escrita en un archivo de configuración o en un archivo bajo un directorio de componentes

193 

194Cuando ninguno de ellos apunta dentro de un submódulo, Claude Code no obtiene ningún submódulo para ese plugin. Un repositorio que es a la vez un proyecto y un plugin a menudo tiene submódulos que solo usa la compilación del proyecto, y esta regla los deja fuera.

195 

196Claude Code también obtiene todos los submódulos cuando no puede determinar cuáles contienen archivos de plugins, por ejemplo:

197 

198* **Un `SKILL.md` en la raíz**: en ese caso, todo el repositorio es el directorio de un skill

199* **Un archivo que Claude Code no puede leer**: el archivo del marketplace, uno de los archivos de configuración del plugin o `.gitmodules`

200 

201Si agregas un marketplace con `--sparse`, o su origen establece `sparsePaths`, Claude Code hace checkout solo de los directorios nombrados allí y no obtiene ningún submódulo. Las versiones anteriores hacen lo mismo.

202 

203Para mantener fuera de la clonación un submódulo que tus plugins no usan, consulta [Mantener los submódulos no usados fuera de la clonación](https://code.claude.com/docs/es/plugins/create-marketplace.md#keep-unused-submodules-out-of-the-clone).

204 

205#### Nombres simples bajo pluginRoot

206 

207Un nombre simple es un único nombre de directorio sin `/`, como `"formatter"`. Para escribir nombres simples en lugar de rutas `./`, establece [`metadata.pluginRoot`](#top-level-fields) en el directorio bajo el cual se resuelven. Con `"pluginRoot": "./plugins"`, `"source": "formatter"` se resuelve como `./plugins/formatter`. Requiere Claude Code v2.1.239 o posterior.

178 208 

179`metadata.pluginRoot` tiene estos límites:209`metadata.pluginRoot` tiene estos límites:

180 210 

181* Debe ser en sí una ruta relativa dentro del marketplace.211* Debe ser en sí mismo una ruta relativa dentro del marketplace.

182* No tiene efecto en una fuente que ya comienza con `./`.212* No tiene efecto sobre un origen que ya comienza con `./`.

183* Una fuente que contiene un `/`, como `team-a/formatter`, no es un nombre desnudo y aún necesita el prefijo `./`, incluso cuando `metadata.pluginRoot` está establecido.213* Un origen que contiene una `/`, como `team-a/formatter`, no es un nombre simple y sigue necesitando el prefijo `./`, incluso cuando `metadata.pluginRoot` está establecido.

184 214 

185### Fuente de plugin github215### Origen de plugin github

186 216 

187`repo` toma `owner/repo`. `ref` y `sha` son opcionales.217`repo` acepta `owner/repo`. `ref` y `sha` son opcionales.

188 218 

189```json theme={null}219```json theme={null}

190{220{


198}228}

199```229```

200 230 

201### Fuente de plugin url231### Origen de plugin url

202 232 

203`url` es una URL git completa: `https://`, `http://`, `file://` o `git@`. Un sufijo `.git` no es obligatorio, por lo que las URL de Azure DevOps y AWS CodeCommit funcionan tal como están escritas. Este tipo no toma el atajo `owner/repo`.233`url` es una URL de git completa: `https://`, `http://`, `file://` o `git@`. No se requiere el sufijo `.git`, por lo que las URL de Azure DevOps y AWS CodeCommit funcionan tal como están escritas. Este tipo no acepta la forma abreviada `owner/repo`.

204 234 

205```json theme={null}235```json theme={null}

206{236{


213}243}

214```244```

215 245 

216### Fuente de plugin git-subdir246### Origen de plugin git-subdir

217 247 

218`url` acepta una URL git completa o el atajo `owner/repo` de GitHub. `path` es el subdirectorio que contiene el plugin, y Claude Code hace checkout solo de ese subdirectorio. Sobre una URL `https` o SSH, Claude Code le pide al servidor un clon parcial, así que desde un host que admite clones parciales, un plugin en un monorepo grande se instala sin descargar el resto del repositorio.248`url` acepta una URL de git completa o la forma abreviada `owner/repo` de GitHub. `path` es el subdirectorio que contiene el plugin, y Claude Code hace checkout solo de ese subdirectorio. Con una URL `https` o SSH, Claude Code le pide al servidor una clonación parcial, así que desde un host que admite clonaciones parciales, un plugin en un monorepo grande se instala sin descargar el resto del repositorio.

219 249 

220```json theme={null}250```json theme={null}

221{251{


228}258}

229```259```

230 260 

231### Fuente de plugin npm261### Origen de plugin npm

232 262 

233Una fuente `npm` toma estos campos:263Un origen `npm` acepta estos campos:

234 264 

235* `package`: un nombre de paquete del registro como `@your-org/formatter`, un nombre con una versión añadida como `@your-org/formatter@2.0.0`, o un enlace `https` al archivo tarball del paquete265* `package`: un nombre de paquete del registro como `@your-org/formatter`, un nombre con una versión añadida como `@your-org/formatter@2.0.0`, o un enlace `https` al archivo tarball del paquete

236* `version`: una versión, un rango semver o un dist-tag, que se usa cuando `package` es un nombre de paquete sin versión añadida. Omítelo para obtener `latest`266* `version`: una versión, un rango semver o una dist-tag, que se usa cuando `package` es un nombre de paquete sin versión añadida. Omítelo para obtener `latest`

237* `registry`: una URL de registro para un paquete que no está en el registro predeterminado267* `registry`: una URL de registro para un paquete que no está en el registro predeterminado

238 268 

239Claude Code obtiene el paquete con su cliente npm. Los scripts de instalación del paquete, como `preinstall` o `postinstall`, nunca se ejecutan, y sus dependencias no se instalan durante la obtención. Si el paquete tiene un archivo de bloqueo compatible junto a su `package.json`, Claude Code instala esas [dependencias de paquetes Node.js](https://code.claude.com/docs/es/plugins/loading.md#node-js-package-dependencies) en un paso separado, también con scripts deshabilitados.269Claude Code obtiene el paquete con tu cliente de npm. Los scripts de instalación del paquete, como `preinstall` o `postinstall`, nunca se ejecutan, y sus dependencias no se instalan durante la obtención. Si el paquete tiene un lockfile compatible junto a su `package.json`, Claude Code instala esas [dependencias de paquetes de Node.js](https://code.claude.com/docs/es/plugins/loading.md#node-js-package-dependencies) en un paso aparte, también con los scripts deshabilitados.

240 270 

241Claude Code verifica el valor de `package` antes de obtener nada. Un valor rechazado hace fallar la instalación con un mensaje que nombra el valor y el motivo. Los valores rechazados incluyen:271Claude Code revisa el valor de `package` antes de obtener nada. Un valor rechazado hace fallar la instalación con un mensaje que nombra el valor y el motivo. Los valores rechazados incluyen:

242 272 

243* **Una dirección git, una carpeta o ruta `file:`, o un alias `npm:`**: usa una [fuente `github`, `url` o `git-subdir`](#plugin-sources) para un repositorio git, una ruta relativa para una carpeta en el marketplace y el nombre propio del paquete para un alias273* **Una dirección de git, una carpeta o ruta `file:`, o un alias `npm:`**: usa un [origen `github`, `url` o `git-subdir`](#plugin-sources) para un repositorio git, una ruta relativa para una carpeta del marketplace y el propio nombre del paquete en lugar de un alias

244* **Un enlace a un tarball en github.com, gist.github.com, gitlab.com, bitbucket.org o git.sr.ht**: se rechaza incluso cuando el enlace es una descarga de release de GitHub, a menos que sea un enlace al registro npm de GitLab bajo `gitlab.com/api/v4/`274* **Un enlace a un tarball en github.com, gist.github.com, gitlab.com, bitbucket.org o git.sr.ht**: se rechaza incluso cuando el enlace es una descarga de una release de GitHub, a menos que sea un enlace al registro npm de GitLab bajo `gitlab.com/api/v4/`

245* **Un enlace a un tarball sobre `http`**: se rechaza a menos que apunte al registro npm predeterminado del propio usuario que instala275* **Un enlace a un tarball a través de `http`**: se rechaza a menos que apunte al registro npm predeterminado del propio usuario que instala

246 276 

247La URL de `registry` debe usar `https` a menos que sea el registro npm predeterminado del propio usuario que instala. Con cualquier otro registro `http`, la instalación falla antes de que npm lo contacte.277La URL de `registry` debe usar `https` a menos que sea el registro npm predeterminado del propio usuario que instala. Con cualquier otro registro `http`, la instalación falla antes de que npm lo contacte.

248 278 


258}288}

259```289```

260 290 

261### Fuente de plugin archive291### Origen de plugin archive

262 292 

263`url` debe usar `https://` y no puede apuntar a un host de loopback, link-local o cloud-metadata. Para los límites de tamaño, tiempo de espera, redirección y extracción en la descarga, consulte [Manténgase dentro de los límites de descarga para archivos alojados](https://code.claude.com/docs/es/plugins/host-marketplace.md#stay-within-the-download-limits-for-hosted-files).293`url` debe usar `https://` y no puede apuntar a un host de loopback, de enlace local (link-local) o de metadatos de la nube. Para conocer los límites de tamaño, tiempo de espera, redirecciones y extracción de la descarga, consulta [Mantenerse dentro de los límites de descarga para archivos alojados](https://code.claude.com/docs/es/plugins/host-marketplace.md#stay-within-the-download-limits-for-hosted-files).

264 294 

265La raíz del plugin puede estar en la parte superior del zip o un directorio hacia abajo.295La raíz del plugin puede estar en el nivel superior del zip o un directorio más abajo.

266 296 

267`sha256` es el resumen del archivo como 64 caracteres hexadecimales, mayúsculas o minúsculas. Cuando lo establece, Claude Code rechaza una descarga que no coincida.297`sha256` es el digest del archivo como 64 caracteres hexadecimales, en mayúsculas o minúsculas. Cuando lo estableces, Claude Code rechaza una descarga que no coincida.

268 298 

269```json theme={null}299```json theme={null}

270{300{


277}307}

278```308```

279 309 

280### Fuente de plugin command310### Origen de plugin command

281 311 

282Use una fuente `command` cuando una herramienta instalada en la máquina del usuario produce el directorio del plugin, como un IDE que renderiza su plugin para la cadena de herramientas que el usuario ha seleccionado. Claude Code ejecuta el comando cuando el usuario instala o actualiza el plugin, y [nuevamente una vez por sesión](https://code.claude.com/docs/es/plugins/loading.md#when-a-command-source-re-runs), por lo que los usuarios obtienen la salida cambiada de la herramienta sin reinstalar.312Usa un origen `command` cuando una herramienta instalada en la máquina del usuario produce el directorio del plugin, como un IDE que genera su plugin para la cadena de herramientas que el usuario ha seleccionado. Claude Code ejecuta el comando cuando el usuario instala o actualiza el plugin, y [de nuevo una vez por sesión](https://code.claude.com/docs/es/plugins/loading.md#when-a-command-source-re-runs), para que los usuarios reciban la salida modificada de la herramienta sin reinstalar.

283 313 

284Una fuente `command` toma estos campos:314Un origen `command` acepta estos campos:

285 315 

286* `command`: un comando de shell que imprime la ruta absoluta del directorio del plugin como una línea y sale con 0. Claude Code muestra a los usuarios la cadena completa para revisión antes de ejecutarla. Escríbala como ASCII imprimible, como máximo 500 caracteres, sin una ejecución de cuatro o más espacios.316* `command`: un comando de shell que imprime la ruta absoluta del directorio del plugin como una sola línea y termina con código 0. Claude Code muestra a los usuarios la cadena completa para que la revisen antes de ejecutarla. Escríbelo en ASCII imprimible, con un máximo de 500 caracteres y sin secuencias de cuatro o más espacios.

287* `timeout`: un número entero de segundos de 1 a 600. Por defecto es 60.317* `timeout`: un número entero de segundos entre 1 y 600. El valor predeterminado es 60.

288* `mode`: `copy`, el predeterminado, o `link`. Consulte [Modo de copia y modo de enlace](#copy-mode-and-link-mode).318* `mode`: `copy`, el predeterminado, o `link`. Consulta [Modo copy y modo link](#copy-mode-and-link-mode).

289 319 

290```json theme={null}320```json theme={null}

291{321{


298}328}

299```329```

300 330 

301Para cómo los usuarios aceptan el comando, consulte [Instalar desde su shell](https://code.claude.com/docs/es/plugins/install.md#install-from-your-shell). Para lo que los usuarios ven después de que lo cambia, consulte [Cambiar el comando de una fuente de comando](https://code.claude.com/docs/es/plugins/host-marketplace.md#change-the-command-of-a-command-source). Los administradores desactivan las fuentes de comando con [`disableCommandPluginSources`](https://code.claude.com/docs/es/settings-reference#disablecommandpluginsources).331Para saber cómo los usuarios aceptan el comando, consulta [Instalar desde tu shell](https://code.claude.com/docs/es/plugins/install.md#install-from-your-shell). Para saber qué ven los usuarios después de que lo cambias, consulta [Cambiar el comando de un origen command](https://code.claude.com/docs/es/plugins/host-marketplace.md#change-the-command-of-a-command-source). Los administradores desactivan los orígenes command con [`disableCommandPluginSources`](https://code.claude.com/docs/es/settings-reference#disablecommandpluginsources).

302 332 

303#### Qué debe hacer el comando333#### Qué debe hacer el comando

304 334 

305Escriba el comando para cumplir con estos requisitos:335Escribe el comando de modo que cumpla estos requisitos:

306 336 

307* **Shell y directorio de trabajo**: Claude Code ejecuta el comando a través de `sh`, o a través de `cmd.exe` en Windows, desde el directorio de inicio del usuario. Dé una ruta absoluta o un comando en `PATH`.337* **Shell y directorio de trabajo**: Claude Code ejecuta el comando mediante `sh`, o mediante `cmd.exe` en Windows, desde el directorio home del usuario. Indica una ruta absoluta o un comando que esté en `PATH`.

308* **Salida**: imprima exactamente una línea en stdout, la ruta absoluta del directorio del plugin, y salga con 0 dentro de `timeout` segundos.338* **Salida**: imprime exactamente una línea en stdout, la ruta absoluta del directorio del plugin, y termina con código 0 dentro de los `timeout` segundos.

309* **Contenido del directorio**: el directorio contiene el plugin completo en el momento en que el comando sale. La ruta puede diferir de una ejecución a la siguiente.339* **Contenido del directorio**: el directorio contiene el plugin completo en el momento en que el comando termina. La ruta puede ser distinta de una ejecución a otra.

310 340 

311#### Salida que falla la instalación o actualización341#### Salida que hace fallar la instalación o actualización

312 342 

313La instalación o actualización falla cuando el comando sale con un código distinto de cero, se ejecuta más tiempo que `timeout`, o imprime algo que no sea una ruta absoluta. También falla cuando el directorio impreso es uno de estos:343La instalación o actualización falla cuando el comando termina con un código distinto de cero, se ejecuta durante más de `timeout` o imprime cualquier cosa que no sea exactamente una única ruta absoluta. También falla cuando el directorio impreso es uno de estos:

314 344 

315* **Sin contenido de plugin**: el directorio impreso no tiene contenido de plugin en su nivel superior, como un directorio `.claude-plugin/` o un directorio `skills/`, `commands/`, `agents/` o `hooks/`.345* **Sin contenido de plugin**: el directorio impreso no tiene contenido de plugin en su nivel superior, como un directorio `.claude-plugin/` o un directorio `skills/`, `commands/`, `agents/` o `hooks/`.

316* **El directorio de la propia sesión**: el directorio impreso es el en el que se inició Claude Code, o uno de sus padres.346* **El propio directorio de la sesión**: el directorio impreso es aquel en el que se inició Claude Code, o uno de sus directorios superiores.

317* **Una ruta de red**: en Windows, la ruta impresa es una ruta UNC.347* **Una ruta de red**: en Windows, la ruta impresa es una ruta UNC.

318* **Demasiado grande para copiar**: en modo de copia, el directorio es más grande que 256 MiB o tiene más de 20,000 entradas.348* **Demasiado grande para copiar**: en modo copy, el directorio ocupa más de 256 MiB o tiene más de 20,000 entradas.

319 349 

320#### Modo de copia y modo de enlace350#### Modo copy y modo link

321 351 

322`mode` decide si Claude Code copia el directorio impreso o lo usa en su lugar:352`mode` decide si Claude Code copia el directorio impreso o lo usa en su ubicación:

323 353 

324* **`copy`**: Claude Code copia el directorio en el caché de plugins y deriva la [versión del plugin](https://code.claude.com/docs/es/plugins/loading.md#how-claude-code-computes-the-version) de un hash de los archivos copiados. Su herramienta puede eliminar o reescribir el directorio después de que el comando salga. Una re-ejecución que produce archivos idénticos cuenta como actualizado.354* **`copy`**: Claude Code copia el directorio en la caché de plugins y deriva la [versión del plugin](https://code.claude.com/docs/es/plugins/loading.md#how-claude-code-computes-the-version) a partir de un hash de los archivos copiados. Tu herramienta puede eliminar o reescribir el directorio después de que el comando termine. Una nueva ejecución que produce archivos idénticos se considera actualizada.

325* **`link`**: Claude Code llena la entrada de caché del plugin con un enlace a cada entrada de nivel superior del directorio impreso y carga los archivos en su lugar. Nada se copia, los contenidos de los archivos no se hashean, y los límites de tamaño no se aplican. Úselo para un directorio demasiado grande para copiar, como una exportación de SDK renderizada.355* **`link`**: Claude Code llena la entrada de caché del plugin con un enlace a cada entrada de nivel superior del directorio impreso y carga los archivos en su ubicación. No se copia nada, no se calcula el hash del contenido de los archivos y los límites de tamaño no se aplican. Úsalo para un directorio demasiado grande para copiar, como una exportación de un SDK generada.

326 356 

327Un plugin en modo de enlace tiene estos requisitos:357Un plugin en modo link tiene estos requisitos:

328 358 

329* **Mantenga el directorio en su lugar**: Claude Code carga el plugin a través de los enlaces en cada inicio, por lo que el directorio impreso debe permanecer donde está mientras el plugin permanezca instalado.359* **Mantén el directorio en su lugar**: Claude Code carga el plugin a través de los enlaces en cada inicio, por lo que el directorio impreso debe permanecer donde está mientras el plugin siga instalado.

330* **Imprima una ruta diferente para señalar contenido nuevo**: la versión proviene de la ruta real del directorio impreso y sus entradas de nivel superior, no de los archivos dentro de ellas.360* **Imprime una ruta diferente para indicar contenido nuevo**: la versión proviene de la ruta real del directorio impreso y de sus entradas de nivel superior, no de los archivos que contienen.

331* **Mantenga los enlaces simbólicos de nivel superior dentro del directorio**: la instalación falla si una entrada de nivel superior es un enlace simbólico que apunta fuera del directorio impreso.361* **Mantén los enlaces simbólicos de nivel superior dentro del directorio**: la instalación falla si una entrada de nivel superior es un enlace simbólico que apunta fuera del directorio impreso.

332* **Incluya `node_modules`**: Claude Code omite la [instalación de dependencias de paquetes Node.js](https://code.claude.com/docs/es/plugins/loading.md#node-js-package-dependencies) para un plugin en modo de enlace, por lo que imprima un directorio que ya contenga los paquetes que el plugin necesita.362* **Incluye `node_modules`**: Claude Code omite la [instalación de dependencias de paquetes de Node.js](https://code.claude.com/docs/es/plugins/loading.md#node-js-package-dependencies) para un plugin en modo link, así que imprime un directorio que ya contenga los paquetes que el plugin necesita.

333* **Sesiones iniciadas dentro del directorio**: una sesión iniciada en el directorio impreso o en cualquier lugar debajo de él no carga el plugin.363* **Sesiones iniciadas dentro del directorio**: una sesión iniciada en el directorio impreso o en cualquier lugar debajo de él no carga el plugin.

334* **No en Windows**: Claude Code rechaza instalar un plugin en modo de enlace en Windows. Declare `"mode": "copy"` allí.364* **No en Windows**: Claude Code se niega a instalar un plugin en modo link en Windows. Declara `"mode": "copy"` allí.

335 365 

336## Fuentes de marketplace366## Fuentes de marketplace

337 367 

Details

313 313 

314#### Qué devuelven las llamadas rechazadas314#### Qué devuelven las llamadas rechazadas

315 315 

316En los resultados, `<reason>` representa `the session was stopped and nobody has sent input since`:316En los resultados, `<reason>` representa el motivo por el que se rechazó la llamada. Después de una interrupción, ese motivo es `the session was stopped and nobody has sent input since`. Para otros motivos, consulta [Llamadas rechazadas en ejecuciones de `claude -p` y sesiones del Agent SDK](#calls-refused-in-non-interactive-runs).

317 317 

318| Algunas llamadas rechazadas | Resultado hasta la siguiente entrada del usuario |318| Algunas llamadas rechazadas | Resultado |

319| :- | :- |319| :- | :- |

320| `$.prompt.submit` | Se resuelve con `{ drop: '<reason>' }` y no pone ningún prompt en cola |320| `$.prompt.submit` | Se resuelve con `{ drop: '<reason>' }` y no pone ningún prompt en cola |

321| `$.command.run` | Se rechaza con un error cuyo mensaje termina con `<reason>` |321| `$.command.run` | Se rechaza con un error cuyo mensaje termina con `<reason>` |


324| `$.session.send` a un compañero de un [equipo de agentes](https://code.claude.com/docs/es/agent-teams.md) | Se resuelve con `{ isDelivered: false, reason: 'Teammate "<name>" was not messaged: <reason>.' }`, donde `<name>` es el nombre del compañero |324| `$.session.send` a un compañero de un [equipo de agentes](https://code.claude.com/docs/es/agent-teams.md) | Se resuelve con `{ isDelivered: false, reason: 'Teammate "<name>" was not messaged: <reason>.' }`, donde `<name>` es el nombre del compañero |

325| [`$.tool.call`](https://code.claude.com/docs/es/plugins/mods/reference#mods-api-methods) de Bash con `run_in_background: true`, Monitor o CronCreate | Se resuelve con `{ deny: '<tool> was not run: it starts background work, a schedule or a goal, and <reason>' }`, donde `<tool>` es el nombre de la herramienta |325| [`$.tool.call`](https://code.claude.com/docs/es/plugins/mods/reference#mods-api-methods) de Bash con `run_in_background: true`, Monitor o CronCreate | Se resuelve con `{ deny: '<tool> was not run: it starts background work, a schedule or a goal, and <reason>' }`, donde `<tool>` es el nombre de la herramienta |

326 326 

327Junto con estos resultados de `$.session.send` y `$.tool.call`, el usuario puede ver la [notificación emergente `Stopped:`](https://code.claude.com/docs/es/plugins/mods/troubleshoot#stopped-type-a-message-to-continue).327Cuando una de estas llamadas a `$.session.send` o `$.tool.call` se rechaza después de una interrupción en una sesión interactiva, el usuario puede ver la [notificación emergente `Stopped:`](https://code.claude.com/docs/es/plugins/mods/troubleshoot#stopped-type-a-message-to-continue).

328 328 

329#### Trabajo que tu mod inició antes de la interrupción329#### Trabajo que tu mod inició antes de la interrupción

330 330 


341 341 

342Cuando un trabajo programado vence o un monitor genera un evento antes de la siguiente entrada del usuario, el usuario puede ver la [notificación emergente `Stopped:`](https://code.claude.com/docs/es/plugins/mods/troubleshoot#stopped-type-a-message-to-continue).342Cuando un trabajo programado vence o un monitor genera un evento antes de la siguiente entrada del usuario, el usuario puede ver la [notificación emergente `Stopped:`](https://code.claude.com/docs/es/plugins/mods/troubleshoot#stopped-type-a-message-to-continue).

343 343 

344### Llamadas rechazadas en ejecuciones de `claude -p` y sesiones del Agent SDK

345 

346En una ejecución de `claude -p` o en una sesión del [Agent SDK](https://code.claude.com/docs/es/agent-sdk/overview.md), un resultado como `{ drop: 'the run reached its --max-turns limit' }` significa que la ejecución rechazó la llamada de tu mod.

347 

348Un `$.prompt.submit` rechazado se resuelve con `{ drop: '<reason>' }`. Otras llamadas rechazadas, como `$.command.run` y `$.agent.spawn`, dan los resultados que se muestran en [Qué devuelven las llamadas rechazadas](#what-refused-calls-return), con el motivo en lugar de `<reason>`. Busca tu `<reason>` a continuación para saber qué hacer:

349 

350* **`the run reached its --max-turns limit`**: los turnos de los prompts de tu mod y de los subagentes que genera cuentan para [`--max-turns`](https://code.claude.com/docs/es/cli-reference#cli-flags) o para el [límite de turnos](https://code.claude.com/docs/es/agent-sdk/configuration.md#limit-turns-and-spend) del Agent SDK. Para tener más turnos, inicia la ejecución con un límite más alto. Si no puedes, haz que tu mod deje de hacer la llamada rechazada. Si la ejecución recibe otro prompt del usuario o de la aplicación del SDK, el recuento de turnos se reinicia y la ejecución vuelve a aceptar llamadas.

351* **`the run is past its --max-budget-usd limit`**: inicia la ejecución con un `--max-budget-usd` más alto, o aumenta el [límite de gasto](https://code.claude.com/docs/es/agent-sdk/configuration.md#limit-turns-and-spend) del Agent SDK. Si no puedes, haz que tu mod deje de hacer la llamada rechazada. El límite se aplica al costo total de la ejecución hasta el momento. Ese total sigue sumándose cuando la ejecución recibe otro prompt, así que un reintento devuelve el mismo motivo.

352* **`the host has ended its input`**: por ejemplo, la aplicación del SDK terminó su [entrada en streaming](https://code.claude.com/docs/es/agent-sdk/streaming-vs-single-mode.md), o stdin se cerró en una ejecución iniciada con [`--input-format stream-json`](https://code.claude.com/docs/es/cli-reference#cli-flags). La ejecución está terminando y no acepta más entrada, así que un reintento devuelve el mismo motivo. Haz que tu mod deje de hacer la llamada rechazada. Si inicias la ejecución tú mismo, la próxima vez mantén esa entrada abierta hasta que tu mod no tenga más llamadas que hacer.

353* **`the session was stopped and nobody has sent input since`**: la ejecución se [interrumpió](#calls-and-background-work-after-the-user-interrupts-a-turn), por ejemplo con [`interrupt()`](https://code.claude.com/docs/es/agent-sdk/typescript#query-object) del Agent SDK. Para volver a hacer la llamada después del siguiente mensaje del usuario o de la aplicación del SDK, sigue [Reintentar una llamada rechazada o descartada](#retry-a-refused-or-dropped-call).

354 

355### Una ejecución de `claude -p` con tu mod nunca termina

356 

357Si tu mod envía un prompt al final de cada turno, cada prompt inicia otro turno. Sin [`--max-turns`](https://code.claude.com/docs/es/cli-reference#cli-flags) ni `--max-budget-usd`, una ejecución de `claude -p` que carga el mod continúa hasta que la detengas tú mismo.

358 

359Para que la ejecución termine por sí sola, agrega cualquiera de los dos flags al comando en tu shell. Si otras personas inician la ejecución, haz que tu mod deje de enviar prompts una vez que termine su trabajo. Este comando agrega `--max-turns`:

360 

361```bash theme={null}

362claude -p "find the TODOs" --max-turns 5

363```

364 

365Una vez que la ejecución alcanza ese límite, el siguiente prompt del mod se [rechaza](#calls-refused-in-non-interactive-runs) en lugar de iniciar un turno, y la ejecución termina.

366 

367Si la ejecución sigue superando el límite, ejecuta `claude --version` en tu shell y [actualiza Claude Code](https://code.claude.com/docs/es/setup.md#update-claude-code) si tu versión es anterior a v2.1.304. Los prompts del mod se rechazan al alcanzar el límite a partir de v2.1.299. Si tu mod genera subagentes, sus turnos cuentan para `--max-turns` a partir de v2.1.304.

368 

344## Enviar y recibir mensajes entre sesiones369## Enviar y recibir mensajes entre sesiones

345 370 

346Un mod puede enviar un mensaje de texto sin formato a otra de tus sesiones, a uno de los subagentes de esta sesión o a un compañero de su [equipo de agentes](https://code.claude.com/docs/es/agent-teams.md). También puede observar los mensajes que llegan y salen.371Un mod puede enviar un mensaje de texto sin formato a otra de tus sesiones, a uno de los subagentes de esta sesión o a un compañero de su [equipo de agentes](https://code.claude.com/docs/es/agent-teams.md). También puede observar los mensajes que llegan y salen.


390| `$.http` | `fetch(url, init)` sobre `http` o `https`. Se resuelve en `{ status, ok, headers, text }` una vez que se lee el cuerpo. |415| `$.http` | `fetch(url, init)` sobre `http` o `https`. Se resuelve en `{ status, ok, headers, text }` una vez que se lee el cuerpo. |

391| `$.store` | Un almacén clave-valor JSON propio de tu plugin, que se conserva entre sesiones |416| `$.store` | Un almacén clave-valor JSON propio de tu plugin, que se conserva entre sesiones |

392| `$.env` | `get` y `set` de variables de entorno. Escribe el nombre como un literal de cadena. |417| `$.env` | `get` y `set` de variables de entorno. Escribe el nombre como un literal de cadena. |

393| `$.settings` | `read` lo que contienen los archivos de configuración y la política administrada |418| `$.settings` | `read()` se resuelve en toda la configuración, combinada en un solo objeto. Con `{ source }` o `{ key }`, se resuelve en cambio en [la configuración de una fuente o el valor de una clave](#read-one-source-or-one-key). |

394| `$.session` | `messages()` devuelve la transcripción como una lista de `{ role, text, toolUses }`. También el directorio de trabajo, el modelo y más. [`usage()`](https://code.claude.com/docs/es/plugins/mods/reference#mods-api-methods) devuelve el uso de la ventana de contexto y los límites del plan. |419| `$.session` | `messages()` devuelve la transcripción como una lista de `{ role, text, toolUses }`. También el directorio de trabajo, el modelo y más. [`usage()`](https://code.claude.com/docs/es/plugins/mods/reference#mods-api-methods) devuelve el uso de la ventana de contexto y los límites del plan. |

395| `$.mcp` | `call` a una herramienta en un servidor MCP conectado |420| `$.mcp` | `call` a una herramienta en un servidor MCP conectado |

396 421 


408* **`$.process.spawn started, and a plugin withheld its result:`**: el mod que la rechazó no había leído la salida del comando hasta el final. Claude Code detiene el comando si sigue en ejecución.433* **`$.process.spawn started, and a plugin withheld its result:`**: el mod que la rechazó no había leído la salida del comando hasta el final. Claude Code detiene el comando si sigue en ejecución.

409* **`$.process.spawn ran, and a plugin withheld its result:`**: el mod que la rechazó había leído la salida del comando hasta el final, por lo que el comando ya había terminado434* **`$.process.spawn ran, and a plugin withheld its result:`**: el mod que la rechazó había leído la salida del comando hasta el final, por lo que el comando ya había terminado

410 435 

436### Lee toda la configuración, una fuente o una clave

437 

438`$.settings.read()` se resuelve en un objeto que contiene la configuración de todas las fuentes en uso, combinada según la [precedencia](https://code.claude.com/docs/es/settings.md#settings-precedence). Pasa `{ source }` para leer en cambio una sola fuente, `{ key }` para leer una sola clave, o ambos:

439 

440| Llamada | Se resuelve en |

441| :- | :- |

442| `$.settings.read()` | La configuración combinada como un solo objeto. Sus claves de nivel superior son las de un archivo `settings.json`, como `permissions` y `hooks`. |

443| `$.settings.read({ source: 'policy' })` | La configuración de esa única fuente como un solo objeto, o `{}` cuando esa fuente no contiene configuración |

444| `$.settings.read({ key: 'spinnerTipsEnabled' })` | El valor de esa clave en la configuración combinada, o `undefined` cuando la clave no está establecida |

445| `$.settings.read({ key: 'spinnerTipsEnabled', source: 'user' })` | El valor de esa clave en esa única fuente, o `undefined` cuando esa fuente no la establece |

446 

447Para `source`, pasa el nombre de la única fuente de configuración que se va a leer:

448 

449* **`user`**: `~/.claude/settings.json`

450* **`project`**: `.claude/settings.json`

451* **`local`**: `.claude/settings.local.json`

452* **`flag`**: lo que pasas con `--settings`, y la configuración en línea del SDK

453* **`policy`**: [configuración administrada](https://code.claude.com/docs/es/managed-settings.md#how-claude-code-combines-managed-sources)

454 

455Para `key`, pasa el nombre exacto de una clave de nivel superior, no una ruta con puntos hacia un objeto anidado. El argumento `key` requiere Claude Code v2.1.304 o posterior.

456 

411## Próximos pasos457## Próximos pasos

412 458 

413* [Reaccionar a eventos](https://code.claude.com/docs/es/plugins/mods/events.md): intercepta llamadas a herramientas, prompts y turnos459* [Reaccionar a eventos](https://code.claude.com/docs/es/plugins/mods/events.md): intercepta llamadas a herramientas, prompts y turnos

Details

48 48 

49Usa lo que pediste. Para el prompt de ejemplo, el nombre de la rama actual aparece encima del cuadro del prompt. Si el mod no hace lo que querías, dile a Claude qué cambiar. El mod se recarga al final de cada turno que modifique sus archivos, así que puedes probar el cambio en cuanto Claude termine.49Usa lo que pediste. Para el prompt de ejemplo, el nombre de la rama actual aparece encima del cuadro del prompt. Si el mod no hace lo que querías, dile a Claude qué cambiar. El mod se recarga al final de cada turno que modifique sus archivos, así que puedes probar el cambio en cuanto Claude termine.

50 50 

51Si una línea de la transcripción que empieza con el nombre del mod indica que el [cambio no se cargó](https://code.claude.com/docs/es/plugins/mods/troubleshoot.md#this-mods-change-didnt-load), pega esa línea en tu siguiente mensaje cuando le pidas a Claude una corrección. Claude no ve la línea a menos que la pegues.

52 

51### Usa el mod en otras sesiones53### Usa el mod en otras sesiones

52 54 

53Un mod que escribió Claude solo se carga en la sesión que lo creó, y Claude Code elimina la carpeta de mods de esa sesión una vez que supera la antigüedad de [`cleanupPeriodDays`](https://code.claude.com/docs/es/settings-reference#cleanupperioddays). Para conservar el mod, copia su directorio fuera de la carpeta de mods a un lugar propio, como `~/mods/git-branch`. Luego elige cómo cargarlo:55Un mod que escribió Claude solo se carga en la sesión que lo creó, y Claude Code elimina la carpeta de mods de esa sesión una vez que supera la antigüedad de [`cleanupPeriodDays`](https://code.claude.com/docs/es/settings-reference#cleanupperioddays). Para conservar el mod, copia su directorio fuera de la carpeta de mods a un lugar propio, como `~/mods/git-branch`. Luego elige cómo cargarlo:

Details

93 93 

94## Engancha lo que Claude está haciendo94## Engancha lo que Claude está haciendo

95 95 

96Maneja estos eventos para ver o cambiar una llamada a herramienta, un prompt o un turno mientras ocurre. Para ver cada evento y lo que un hook puede devolver, consulta la [referencia de eventos](https://code.claude.com/docs/es/plugins/mods/reference.md#events).96Maneja estos eventos para ver o cambiar una llamada a herramienta, un prompt, un turno o una lectura de la configuración mientras ocurre. Para ver cada evento y lo que un hook puede devolver, consulta la [referencia de eventos](https://code.claude.com/docs/es/plugins/mods/reference.md#events).

97 97 

98### Proteger o cambiar una llamada a herramienta98### Proteger o cambiar una llamada a herramienta

99 99 


115 115 

116Cuando Claude intenta `git push --force`, el comando no se ejecuta y no aparece ninguna solicitud de permiso, porque el hook nunca llama a `next`. Claude lee el texto de `deny` como el resultado de la herramienta, así que escríbelo como una instrucción sobre la que Claude pueda actuar. Cualquier otro comando de Bash se ejecuta como lo haría sin el mod.116Cuando Claude intenta `git push --force`, el comando no se ejecuta y no aparece ninguna solicitud de permiso, porque el hook nunca llama a `next`. Claude lee el texto de `deny` como el resultado de la herramienta, así que escríbelo como una instrucción sobre la que Claude pueda actuar. Cualquier otro comando de Bash se ejecuta como lo haría sin el mod.

117 117 

118Si este hook lanza una excepción o agota el tiempo, Claude Code lo omite y el comando continúa como lo haría sin el mod. Para rechazar el comando en su lugar, [agrega un manejador `.catch`](#handle-a-hook-that-fails) al hook.

119 

118Para actuar después de que una herramienta se haya ejecutado, usa `await next(e)`, haz tu trabajo y devuelve lo que `next` te dio. Este hook registra cada archivo `.mdx` que Claude cambia, con [`$.ui.log`](https://code.claude.com/docs/es/plugins/mods/api#show-something-without-starting-a-turn), que agrega a la transcripción una línea atenuada que Claude no lee:120Para actuar después de que una herramienta se haya ejecutado, usa `await next(e)`, haz tu trabajo y devuelve lo que `next` te dio. Este hook registra cada archivo `.mdx` que Claude cambia, con [`$.ui.log`](https://code.claude.com/docs/es/plugins/mods/api#show-something-without-starting-a-turn), que agrega a la transcripción una línea atenuada que Claude no lee:

119 121 

120```javascript theme={null}122```javascript theme={null}


177* **El usuario escribe una respuesta**: `$.ui.ask` se resuelve con el texto escrito. El hook lo compara con `Run it`, así que cualquier otro texto rechaza el comando.179* **El usuario escribe una respuesta**: `$.ui.ask` se resuelve con el texto escrito. El hook lo compara con `Run it`, así que cualquier otro texto rechaza el comando.

178* **Nadie responde**: `$.ui.ask` se rechaza cuando el usuario descarta la pregunta o elige **Chat about this**, y en una ejecución de `claude -p`, así que el bloque `catch` deja la respuesta en `Refuse`180* **Nadie responde**: `$.ui.ask` se rechaza cuando el usuario descarta la pregunta o elige **Chat about this**, y en una ejecución de `claude -p`, así que el bloque `catch` deja la respuesta en `Refuse`

179 181 

180Mantén la espera dentro de una llamada a la API de mods como `$.ui.ask`, porque ese tiempo no cuenta para el [límite de tiempo](https://code.claude.com/docs/es/plugins/mods/reference.md#limits) del hook. El tiempo dedicado a esperar una promesa propia sí cuenta. Claude Code omite un hook que agota el tiempo, así que el comando retenido se ejecutaría.182Mantén la espera dentro de una llamada a la API de mods como `$.ui.ask`, porque ese tiempo no cuenta para el [límite de tiempo](https://code.claude.com/docs/es/plugins/mods/reference.md#limits) del hook. El tiempo dedicado a esperar una promesa propia sí cuenta.

183 

184Claude Code omite un hook que agota el tiempo, así que el comando retenido se ejecutaría. Para rechazarlo en su lugar, encadena [un manejador `.catch`](#handle-a-hook-that-fails) al registro que devuelve `on`. Ese manejador es independiente del bloque `catch` dentro del hook.

181 185 

182#### Aprobar o rechazar una llamada a herramienta antes de preguntarle al usuario186#### Aprobar o rechazar una llamada a herramienta antes de preguntarle al usuario

183 187 


207 211 

208* **En `main`**: el hook devuelve `deny`, incluso cuando una regla permite `git push`212* **En `main`**: el hook devuelve `deny`, incluso cuando una regla permite `git push`

209* **En otra rama, y para otros comandos**: la llamada obtiene la decisión que obtendría sin el mod213* **En otra rama, y para otros comandos**: la llamada obtiene la decisión que obtendría sin el mod

214* **El hook lanza una excepción o agota el tiempo**: la llamada también obtiene la decisión que obtendría sin el mod. Para rechazar la llamada en su lugar, [agrega un manejador `.catch`](#handle-a-hook-that-fails) que devuelva `{ decision: 'deny', reason: 'the reason' }`.

210 215 

211El hook compara el texto del comando, así que trátalo como un recordatorio para Claude. Para bloquear los pushes a `main` para todos, protege la rama en tu host de Git.216El hook compara el texto del comando, así que trátalo como un recordatorio para Claude. Para bloquear los pushes a `main` para todos, protege la rama en tu host de Git.

212 217 


269 274 

270Cuando envías un prompt como `open a PR for this change`, tu mensaje se ve igual en la transcripción, y Claude también lee una línea como `Current branch: feature/auth` después de él. Un prompt que no menciona un pull request pasa sin cambios, y `git` no se ejecuta.275Cuando envías un prompt como `open a PR for this change`, tu mensaje se ve igual en la transcripción, y Claude también lee una línea como `Current branch: feature/auth` después de él. Un prompt que no menciona un pull request pasa sin cambios, y `git` no se ejecuta.

271 276 

272Para detener un prompt, devuelve `{ drop: 'the reason' }` sin llamar a `next`. El texto vuelve al campo de entrada de prompts del usuario, y este ve `Prompt dropped by a hook:` seguido de tu motivo, así que dirígele el motivo a él. Si tu hook devuelve un `drop` después de que su llamada a `next(e)` dejó pasar el prompt, el turno se ejecuta de todos modos, y el hook [falla](#handle-a-hook-that-fails) con un mensaje que incluye `a drop after its next() was answered`.277Para detener un prompt, devuelve `{ drop: 'the reason' }` sin llamar a `next`. El texto vuelve al campo de entrada de prompts del usuario, y este ve `Prompt dropped by a hook:` seguido de tu motivo, así que dirígele el motivo a él. El prompt se envía de todos modos en estos casos:

278 

279* **Tu hook devuelve un `drop` después de que su llamada a `next(e)` dejó pasar el prompt**: el turno se ejecuta de todos modos, y el hook [falla](#handle-a-hook-that-fails) con un mensaje que incluye `a drop after its next() was answered`

280* **Tu hook lanza una excepción o agota el tiempo**: Claude Code lo omite y envía el prompt. [Agrega un manejador `.catch`](#handle-a-hook-that-fails) para que un fallo no envíe un prompt que el hook habría detenido.

273 281 

274[Otros eventos](https://code.claude.com/docs/es/plugins/mods/reference.md#prompts-and-what-claude-reads) cubren el resto de lo que Claude lee: `prompt.section` para cada sección del prompt del sistema, `prompt.context` para el contexto enviado con el primer mensaje y `skill.prompt` para el texto de un skill. El texto de estos hooks que cambia entre solicitudes [invalida la caché de prompts](https://code.claude.com/docs/es/prompt-caching.md). En un hook `skill.prompt`, también puedes leer [de qué plugin o archivo proviene el skill](https://code.claude.com/docs/es/plugins/mods/reference.md#skill-prompt-fields).282[Otros eventos](https://code.claude.com/docs/es/plugins/mods/reference.md#prompts-and-what-claude-reads) cubren el resto de lo que Claude lee: `prompt.section` para cada sección del prompt del sistema, `prompt.context` para el contexto enviado con el primer mensaje y `skill.prompt` para el texto de un skill. El texto de estos hooks que cambia entre solicitudes [invalida la caché de prompts](https://code.claude.com/docs/es/prompt-caching.md). En un hook `skill.prompt`, también puedes leer [de qué plugin o archivo proviene el skill](https://code.claude.com/docs/es/plugins/mods/reference.md#skill-prompt-fields).

275 283 


305 313 

306Para ver las llamadas a herramientas que la propia API ejecutó durante la solicitud, como las llamadas a la [herramienta advisor](https://code.claude.com/docs/es/advisor.md), lee `result.serverToolUses`. Claude Code no ejecuta estas llamadas, así que ningún hook `tool.call` o `tool.check` se dispara para ellas. El campo no está presente cuando la respuesta no tiene ese tipo de llamadas, y requiere Claude Code v2.1.290 o posterior.314Para ver las llamadas a herramientas que la propia API ejecutó durante la solicitud, como las llamadas a la [herramienta advisor](https://code.claude.com/docs/es/advisor.md), lee `result.serverToolUses`. Claude Code no ejecuta estas llamadas, así que ningún hook `tool.call` o `tool.check` se dispara para ellas. El campo no está presente cuando la respuesta no tiene ese tipo de llamadas, y requiere Claude Code v2.1.290 o posterior.

307 315 

316### Cambiar o rechazar una lectura de la configuración

317 

318Un hook `settings.read` se ejecuta en la lectura de un mod y en la propia lectura de Claude Code:

319 

320* **La lectura de un mod**: un mod llama a [`$.settings.read`](https://code.claude.com/docs/es/plugins/mods/api#read-one-source-or-one-key).

321* **La propia lectura de Claude Code**: Claude Code genera la configuración combinada de la sesión. Esta lectura se repite cuando cambian la configuración o los plugins cargados.

322 

323Antes de depender de cualquiera de las dos lecturas, comprueba la protección y tu versión:

324 

325* **La protección integrada**: con configuración administrada, o con un [`/login`](https://code.claude.com/docs/es/authentication#authentication-precedence) de Team o Enterprise como credencial de la sesión, la [protección integrada](https://code.claude.com/docs/es/plugins/mods/admin.md#know-what-happens-by-default) puede omitir este hook en un mod que instalas o cargas con `--plugin-dir`. Para comprobarlo, busca `settings.read bypassed by cc-plugin-sec-default` en el [registro de depuración](https://code.claude.com/docs/es/plugins/mods/troubleshoot.md#read-the-debug-log). Si una línea con ese texto nombra tu mod, pídele al administrador de tu organización que [instale el mod como uno de los mods de la organización](https://code.claude.com/docs/es/plugins/mods/admin.md#install-your-organizations-mods).

326* **La versión**: que el evento se dispare en la propia lectura de Claude Code, y el campo `e.layers`, requieren Claude Code v2.1.304 o posterior.

327 

328#### Qué recibe un hook `settings.read`

329 

330| Campo | Tipo | Qué contiene |

331| :- | :- | :- |

332| `e.layers` | array | Un objeto `{ source, settings }` por cada fuente en uso que contiene configuración, empezando por la de menor [precedencia](https://code.claude.com/docs/es/settings.md#settings-precedence): `plugin`, `user`, `project`, `local`, `flag`, `policy`. Vacío en `claude plugin test`. |

333| `e.source` | string | La única fuente que pidió un mod, como en `$.settings.read({ source: 'policy' })`. En ese caso, `e.layers` contiene solo esa capa. No está presente en la propia lectura de Claude Code ni en cualquier otra lectura de la configuración combinada. |

334 

335En `e.layers`, `plugin` contiene la configuración que aportan los plugins habilitados, y es solo un nombre de capa, no un `source` que puedas pasar a `$.settings.read`. `flag` contiene la configuración pasada con `--settings`, y `policy` contiene la configuración administrada.

336 

337#### Distinguir la propia lectura de Claude Code de la lectura de un mod

338 

339En la [propia lectura de Claude Code](#settings-read-hook), [`next.origin`](https://code.claude.com/docs/es/plugins/mods/reference#the-hook-function) es `{ plugin: 'engine', tier: 'core' }`, y en la lectura de un mod, `next.origin.plugin` es el nombre del mod que llama.

340 

341#### Qué puede devolver un hook `settings.read`

342 

343Tu hook puede devolver el resultado de [`next(e)`](https://code.claude.com/docs/es/plugins/mods/reference#the-hook-function) sin cambios, un `{ value }` propio o `{ deny: reason }`. En la [propia lectura de Claude Code](#settings-read-hook) y en la lectura de un mod, un `{ value }` reemplaza lo que da la lectura y `{ deny: reason }` rechaza la lectura:

344 

345| Valor devuelto | En la propia lectura de Claude Code | En la lectura de un mod |

346| :- | :- | :- |

347| `{ value }` | Para cada clave que cambias, lo que devuelves reemplaza el valor completo de esa clave en la configuración combinada de la sesión, si [se ajusta al esquema de la clave](https://code.claude.com/docs/es/plugins/mods/troubleshoot.md#settings-read-key-refused) | La llamada de ese mod se resuelve con tu `value`, o con la `key` que pidió tomada de tu `value`, así que devuelve un objeto completo y no un array |

348| `{ deny: reason }` | La sesión conserva la configuración tal como se combinó antes de que respondiera cualquier hook, y el [registro de depuración guarda tu `reason`](https://code.claude.com/docs/es/plugins/mods/troubleshoot#settings-read-refused) | La llamada de ese mod se rechaza con `<calling mod>: $.settings.read: <reason>` |

349 

350En la propia lectura de Claude Code, arma tu `{ value }` a partir del [`value` de `next(e)`](#settings-read-next), ya que una clave que omites queda sin definir. Cuando Claude Code lee una clave como `env` de cada fuente por separado, cambiarla en tu `value` [no tiene efecto](https://code.claude.com/docs/es/plugins/mods/troubleshoot.md#settings-read-key-no-effect).

351 

352#### Qué le da `next(e)` a un hook `settings.read`

353 

354`next(e)` se resuelve con `{ value }` o con `{ deny }`:

355 

356* **`{ value }`**: `value` es la configuración combinada, o la configuración de una sola fuente cuando [`e.source`](#settings-read-receives) está definido. Si un hook que [se ejecuta después del tuyo](#the-order-mods-run-in) devolvió un `{ value }` propio, obtienes el `value` de ese hook en su lugar.

357* **`{ deny }`**: un hook que se ejecuta después del tuyo rechazó la lectura. Devuelve ese `{ deny }` sin cambios.

358 

359#### Cambiar un ajuste desde un hook `settings.read`

360 

361Primero comprueba [qué mods reciben este evento y a partir de qué versión](#settings-read-hook).

362 

363Para cambiar una clave, expande el `value` de [`next(e)`](https://code.claude.com/docs/es/plugins/mods/reference#the-hook-function) y establece esa clave, como hace este hook con [`spinnerTipsEnabled`](https://code.claude.com/docs/es/settings-reference#spinnertipsenabled). El hook no comprueba [`next.origin`](#settings-read-origin), así que cambia la clave tanto en la [propia lectura de Claude Code](#settings-read-hook) como en la lectura combinada de un mod:

364 

365```javascript theme={null}

366on('settings.read', async ($, e, next) => {

367 const read = await next(e)

368 // Pass through a read of one source, so that only the merged settings change.

369 // Pass through a { deny } from a later hook too: it has no value.

370 if (e.source || !read.value) return read

371 // Keep every other key and change this one

372 return { value: { ...read.value, spinnerTipsEnabled: false } }

373})

374```

375 

376En la propia lectura de Claude Code, si tu hook devuelve un valor fuera del esquema de la clave, como una cadena, solo esa clave conserva el valor combinado antes de que respondiera cualquier hook. El registro de depuración indica entonces [`the answer for <key> is no value the key can hold`](https://code.claude.com/docs/es/plugins/mods/troubleshoot#settings-read-key-refused). Si tu valor se ajusta y la clave sigue sin cambiar, consulta [por qué una clave devuelta no tiene efecto](https://code.claude.com/docs/es/plugins/mods/troubleshoot.md#settings-read-key-no-effect).

377 

308### Manejar los eventos de los hooks de configuración378### Manejar los eventos de los hooks de configuración

309 379 

310Los hooks de configuración son los hooks de comando, HTTP, prompt y agente que configuras en los archivos de configuración. Cada [evento de hook de configuración](https://code.claude.com/docs/es/hooks.md#hook-events), como `Stop`, `SessionEnd` o `PostToolUse`, también es un evento llamado `classic.` seguido del nombre del evento del hook de configuración, como `classic.Stop`. `e` es el JSON que un hook de configuración recibe por stdin, incluido `transcript_path`.380Los hooks de configuración son los hooks de comando, HTTP, prompt y agente que configuras en los archivos de configuración. Cada [evento de hook de configuración](https://code.claude.com/docs/es/hooks.md#hook-events), como `Stop`, `SessionEnd` o `PostToolUse`, también es un evento llamado `classic.` seguido del nombre del evento del hook de configuración, como `classic.Stop`. `e` es el JSON que un hook de configuración recibe por stdin, incluido `transcript_path`.

Details

508* **`Input`**: acepta `onSubmit(value)` y `onInput(value)`508* **`Input`**: acepta `onSubmit(value)` y `onInput(value)`

509* **`Select`**: acepta `onSelect(value)` con sus opciones en `options`, una lista de al menos una opción con valores únicos, como `[{ value: 'sm', label: 'Small' }, { value: 'lg', label: 'Large' }]`509* **`Select`**: acepta `onSelect(value)` con sus opciones en `options`, una lista de al menos una opción con valores únicos, como `[{ value: 'sm', label: 'Small' }, { value: 'lg', label: 'Large' }]`

510 510 

511Una prueba pulsa o escribe en un control por su `key`, así que dale una a cada control. Cada uso de un control también dispara [`ui.press`, `ui.input` o `ui.select`](https://code.claude.com/docs/es/plugins/mods/reference#interface) con la `key` en `e.element`, y otro mod puede manejar esos eventos. Su hook se ejecuta antes que tu callback, así que ve lo que el usuario escribe en tu `Input` y puede cambiarlo o responder en lugar de tu callback. La API de mods no tiene ningún método que pulse el botón de otro mod.511### Qué controles necesitan una `key`

512 

513Dale a cada `Input` y `Select` una prop `key`, como `key: 'size'`. Un `Button` puede prescindir de una `key` cuando tiene una prop `label` o un único hijo de tipo cadena. Su `key` es entonces el valor de `label` o esa cadena.

514 

515Las pruebas y otros mods identifican un control por su `key`:

516 

517* **Pruebas**: una [prueba](https://code.claude.com/docs/es/plugins/mods/test.md#test-a-drawing) pulsa o escribe en un control por su `key`.

518* **Otros mods**: Claude Code dispara [`ui.press`, `ui.input` o `ui.select`](https://code.claude.com/docs/es/plugins/mods/reference#interface) con la `key` del control en `e.element` antes de ejecutar el callback del control. El hook de otro mod para ese evento ve lo que el usuario escribió en tu `Input` y puede cambiar ese texto o impedir que tu callback se ejecute. La API de mods no le da a ese mod ningún método para pulsar tus botones.

519 

520Si un mensaje dice `needs a key` o `is drawn twice`, [encuentra la causa a partir de ese mensaje](https://code.claude.com/docs/es/plugins/mods/troubleshoot.md#needs-a-key).

512 521 

513### Foco del teclado y teclas de acceso rápido522### Foco del teclado y teclas de acceso rápido

514 523 

Details

21| `.claude-plugin/plugin.json` | Sí | El [manifiesto](https://code.claude.com/docs/es/plugins/manifest-reference.md) del plugin. Los mods no añaden campos obligatorios. |21| `.claude-plugin/plugin.json` | Sí | El [manifiesto](https://code.claude.com/docs/es/plugins/manifest-reference.md) del plugin. Los mods no añaden campos obligatorios. |

22| `hooks/hooks.json` | Sí | `modules`: un array con una ruta, relativa a este archivo, al módulo de hooks, como en `"modules": ["./register.js"]`. También puede contener [hooks de configuración](https://code.claude.com/docs/es/hooks.md) en `hooks`. |22| `hooks/hooks.json` | Sí | `modules`: un array con una ruta, relativa a este archivo, al módulo de hooks, como en `"modules": ["./register.js"]`. También puede contener [hooks de configuración](https://code.claude.com/docs/es/hooks.md) en `hooks`. |

23| El módulo de hooks, como [`hooks/register.js`](https://code.claude.com/docs/es/plugins/mods/create#write-a-mod-yourself) | Sí | El punto de entrada del mod. Exporta `register(on, options)`. Con nombre `.js`, `.mjs`, `.cjs`, `.jsx`, `.ts`, `.mts`, `.cts` o `.tsx`. Un módulo ES. |23| El módulo de hooks, como [`hooks/register.js`](https://code.claude.com/docs/es/plugins/mods/create#write-a-mod-yourself) | Sí | El punto de entrada del mod. Exporta `register(on, options)`. Con nombre `.js`, `.mjs`, `.cjs`, `.jsx`, `.ts`, `.mts`, `.cts` o `.tsx`. Un módulo ES. |

24| [`types/index.d.ts`](https://code.claude.com/docs/es/plugins/mods/interface#declare-the-values), indicado por `types` en el manifiesto | Cuando el mod usa `$.state` o añade un namespace a la API de mods | Declara los valores de `PluginState` y cualquier namespace que añada el mod |24| [`types/index.d.ts`](https://code.claude.com/docs/es/plugins/mods/interface#declare-the-values), a menos que `types` en el manifiesto indique otra ruta | Cuando el mod usa `$.state` o añade un namespace a la API de mods | Declara los valores de `PluginState` y cualquier namespace que añada el mod. Para omitir `types` del manifiesto, necesitas la v2.1.299 o posterior. |

25| Archivos cuyos nombres terminan en `.test.ts` o `.test.tsx` | No | Pruebas que ejecuta [`claude plugin test`](https://code.claude.com/docs/es/plugins/mods/test#write-a-test) |25| Archivos cuyos nombres terminan en `.test.ts` o `.test.tsx` | No | Pruebas que ejecuta [`claude plugin test`](https://code.claude.com/docs/es/plugins/mods/test#write-a-test) |

26 26 

27`register` recibe `on` y `options`. `options` contiene los valores de los campos de [`userConfig`](https://code.claude.com/docs/es/plugins/components#user-configuration) que declara el manifiesto, con los valores predeterminados ya completados.27`register` recibe `on` y `options`. `options` contiene los valores de los campos de [`userConfig`](https://code.claude.com/docs/es/plugins/components#user-configuration) que declara el manifiesto, con los valores predeterminados ya completados.


110 110 

111### Comandos y configuración111### Comandos y configuración

112 112 

113Los eventos de comandos y configuración se disparan cuando un comando se ejecuta o se lista, y cuando una fila de `/config` se muestra o cambia:113Los eventos de comandos y configuración se disparan cuando un comando se ejecuta o se lista, cuando una fila de `/config` se muestra o cambia, y en una lectura de la configuración:

114 114 

115| Evento | Se dispara cuando | Un hook puede devolver |115| Evento | Se dispara cuando | Un hook puede devolver |

116| :- | :- | :- |116| :- | :- | :- |


118| `command.describe` | Una vez por cada comando, para la lista de comandos | `{ description, argumentHint, isHidden }` |118| `command.describe` | Una vez por cada comando, para la lista de comandos | `{ description, argumentHint, isHidden }` |

119| `config.set` | Una fila de `/config` está a punto de cambiar | `next({ ...e, value })` o `{ deny: reason }` |119| `config.set` | Una fila de `/config` está a punto de cambiar | `next({ ...e, value })` o `{ deny: reason }` |

120| `config.describe` | Una vez por cada fila de `/config` | `{ label, description, isHidden }` |120| `config.describe` | Una vez por cada fila de `/config` | `{ label, description, isHidden }` |

121| [`settings.read`](https://code.claude.com/docs/es/plugins/mods/events#settings-read-hook) | Un mod llama a [`$.settings.read`](https://code.claude.com/docs/es/plugins/mods/api#reach-files-processes-and-the-network), o Claude Code genera la configuración combinada de la sesión | `next(e)`, `{ value }` o `{ deny: reason }` |

122 

123#### `e.layers` y `e.source` en `settings.read`

124 

125* **`e.layers`**: un objeto `{ source, settings }` por cada origen en uso que contiene configuración, empezando por el de menor [precedencia](https://code.claude.com/docs/es/settings.md#settings-precedence). Consulta [Qué recibe un hook de `settings.read`](https://code.claude.com/docs/es/plugins/mods/events#settings-read-receives).

126* **`e.source`**: el único origen que pidió un mod, como en `$.settings.read({ source: 'policy' })`. Está ausente en la lectura propia de Claude Code y en cualquier otra lectura de la configuración combinada

127 

128En `settings.read`, que el evento se dispare en la lectura propia de Claude Code y el campo `e.layers` requieren Claude Code v2.1.304 o posterior. Para saber cuándo se ejecuta el hook y qué puede devolver, con un ejemplo, consulta [Cambiar o rechazar una lectura de la configuración](https://code.claude.com/docs/es/plugins/mods/events.md#settings-read-hook).

121 129 

122### Turnos130### Turnos

123 131 

Details

168 168 

169Antes de la v2.1.292, la llamada se ejecutaba una segunda vez, por lo que el prompt se enviaba, el comando se ejecutaba o el subagente se iniciaba dos veces.169Antes de la v2.1.292, la llamada se ejecutaba una segunda vez, por lo que el prompt se enviaba, el comando se ejecutaba o el subagente se iniciaba dos veces.

170 170 

171### `This mod's change didn't load` o `the earlier version is no longer running`

172 

173Un cambio en un [mod que Claude escribió en esta sesión](https://code.claude.com/docs/es/plugins/mods/create.md#ask-claude-for-a-mod) no pudo cargarse. La línea de la transcripción comienza con el nombre del mod y termina con el motivo:

174 

175* `This mod's change didn't load, so the earlier version is still running: <reason>.`

176* `This mod didn't load, and the earlier version is no longer running: <reason>.`

177 

178Claude no ve esta línea, así que pégala en tu siguiente mensaje cuando le pidas a Claude una corrección.

179 

171### `$.agent.register refused: the hooks module that made the call is no longer loaded`180### `$.agent.register refused: the hooks module that made the call is no longer loaded`

172 181 

173La línea comienza con el nombre de tu mod, como en `first-mod: $.agent.register refused: the hooks module that made the call is no longer loaded (it was reloaded or removed)`, y el agente no queda registrado. Tu mod se recargó o se descargó antes de la llamada. Una recarga carga una copia nueva del módulo de hooks, y esta llamada provino de código que aún se ejecutaba en la copia anterior, como un hook que aún no había retornado.182La línea comienza con el nombre de tu mod, como en `first-mod: $.agent.register refused: the hooks module that made the call is no longer loaded (it was reloaded or removed)`, y el agente no queda registrado. Tu mod se recargó o se descargó antes de la llamada. Una recarga carga una copia nueva del módulo de hooks, y esta llamada provino de código que aún se ejecutaba en la copia anterior, como un hook que aún no había retornado.


225 234 

226Lee el motivo en esa línea. Las causas comunes son una prop que el elemento no acepta y un elemento que la app no tiene.235Lee el motivo en esa línea. Las causas comunes son una prop que el elemento no acepta y un elemento que la app no tiene.

227 236 

237### `needs a key`, `is drawn twice` o `key each once`

238 

239Un elemento del árbol que devuelve tu hook `ui.render` no tiene una [`key`](https://code.claude.com/docs/es/plugins/mods/interface#which-controls-need-a-key) válida, o dos elementos comparten una. Busca el mensaje que recibiste:

240 

241* **`<Input> needs a key` o `<Select> needs a key`**: el elemento no tiene la prop `key`, o su `key` está vacía o no es una cadena, como en `key: 3`. Dale una cadena no vacía como su `key`.

242* **`<Button> needs a key`**: dale al botón una cadena no vacía como su `key`

243* **`is drawn twice; each takes its own key`**: dos elementos del tipo que nombra el mensaje tienen la misma `key`, como en `Input "size" is drawn twice; each takes its own key`. Dale a cada elemento su propia `key`.

244* **`key each once` de `press` en una [prueba](https://code.claude.com/docs/es/plugins/mods/test.md#test-a-drawing)**: el dibujo tiene más de un botón con la clave que pasaste. Los botones con la misma etiqueta y sin la prop `key` comparten esa etiqueta como clave. Dale a cada botón su propia `key`.

245 

228### Una línea de `ui.render` dice `threw while drawn`246### Una línea de `ui.render` dice `threw while drawn`

229 247 

230La línea nombra el [punto de renderizado](https://code.claude.com/docs/es/plugins/mods/reference.md#render-sites), luego dice `threw while drawn:` y el error, como en `first-mod: ui.render (ToolUse) threw while drawn: <error>; the engine drew its own`. Claude Code encontró ese error al dibujar el árbol que devolvió tu hook [`ui.render`](https://code.claude.com/docs/es/plugins/mods/reference#interface), o al dibujar el punto de renderizado a partir de las [`props` que tu hook pasó a `next`](https://code.claude.com/docs/es/plugins/mods/interface#change-what-claude-code-already-draws). El final `the engine drew its own` significa que el punto de renderizado muestra el contenido habitual de Claude Code.248La línea nombra el [punto de renderizado](https://code.claude.com/docs/es/plugins/mods/reference.md#render-sites), luego dice `threw while drawn:` y el error, como en `first-mod: ui.render (ToolUse) threw while drawn: <error>; the engine drew its own`. Claude Code encontró ese error al dibujar el árbol que devolvió tu hook [`ui.render`](https://code.claude.com/docs/es/plugins/mods/reference#interface), o al dibujar el punto de renderizado a partir de las [`props` que tu hook pasó a `next`](https://code.claude.com/docs/es/plugins/mods/interface#change-what-claude-code-already-draws). El final `the engine drew its own` significa que el punto de renderizado muestra el contenido habitual de Claude Code.


303 321 

304[Carga de nuevo el valor guardado](https://code.claude.com/docs/es/plugins/mods/interface.md#load-a-saved-value-again-after-clear) en un hook `classic.SessionStart`.322[Carga de nuevo el valor guardado](https://code.claude.com/docs/es/plugins/mods/interface.md#load-a-saved-value-again-after-clear) en un hook `classic.SessionStart`.

305 323 

324### Una clave que devuelve tu hook `settings.read` no surte efecto

325 

326Las entradas `env` devueltas no se convierten en variables de entorno. Las reglas `allow`, `ask` y `deny` devueltas no se comprueban en las llamadas a herramientas. Defínelas en un [archivo de configuración](https://code.claude.com/docs/es/settings.md), o llama a [`$.env.set`](https://code.claude.com/docs/es/plugins/mods/api#reach-files-processes-and-the-network) para las variables de entorno.

327 

328Para cualquier otra clave, comprueba [qué mods reciben `settings.read` y a partir de qué versión](https://code.claude.com/docs/es/plugins/mods/events#settings-read-hook), luego busca `settings.read` en el [registro de depuración](#read-the-debug-log) y localiza una de estas líneas:

329 

330| Línea del registro | Significado y paso |

331| :- | :- |

332| `settings.read hook skipped`, después del nombre de tu mod | Tu hook falló. [Corrige el error que indica la línea](#hook-skipped). |

333| `settings.read bypassed by cc-plugin-sec-default`, en una línea que nombra tu mod antes | La [protección integrada](https://code.claude.com/docs/es/plugins/mods/admin.md#know-what-happens-by-default) omitió tu hook. Pide al administrador de tu organización que [instale el mod como uno de los mods de la organización](https://code.claude.com/docs/es/plugins/mods/admin.md#install-your-organizations-mods). |

334| `settings.read: the answer for <key> is no value the key can hold` | El valor devuelto no se ajusta al esquema de la clave. [Devuelve uno que permita](#settings-read-key-refused). |

335| `settings.read: the merge never settles for <key>` | Las claves que nombra la línea conservan los valores de las fuentes de configuración. Defínelas en un archivo de configuración. |

336| `answered settings.read without next()`, después del nombre de un mod | Solo es relevante si ese mod [se ejecuta antes que el tuyo](https://code.claude.com/docs/es/plugins/mods/events.md#the-order-mods-run-in). En ese caso, tu hook no se ejecutó en esa lectura. [Desactiva ese mod](https://code.claude.com/docs/es/plugins/mods/overview.md#turn-mods-on-or-off) o, si tu organización lo implementó, pide a su administrador que lo haga. |

337| `settings.read: refused to the engine` | La lectura se rechazó, así que no se aplicó el `{ value }` de ningún hook. [Averigua qué la rechazó](#settings-read-refused). |

338 

339Si ninguna línea explica la clave, revisa los mods que se ejecutan antes que el tuyo en busca de un hook `settings.read` que [cambie la clave](https://code.claude.com/docs/es/plugins/mods/events.md#settings-read-example). Desactiva ese mod, o pide al administrador de tu organización que lo haga. Si ningún hook la cambia, define la clave en un archivo de configuración.

340 

341### `the answer for <key> is no value the key can hold`

342 

343Esta línea del [registro de depuración](#read-the-debug-log) significa que Claude Code rechazó el valor que tu hook [`settings.read`](https://code.claude.com/docs/es/plugins/mods/events#settings-read-hook) devolvió para la clave nombrada, y solo para esa clave:

344 

345```text theme={null}

346settings.read: the answer for <key> is no value the key can hold; the settings' own value stands

347```

348 

349El valor que devolviste para la clave nombrada no se ajustaba al esquema de esa clave, por ejemplo por tipo o por rango. Devuelve un valor que permita la entrada de la clave en la [referencia de configuración](https://code.claude.com/docs/es/settings-reference.md). Mientras tu valor no se ajuste, la clave conserva el valor combinado a partir de las fuentes de configuración antes de que respondiera cualquier hook. La línea lo llama el valor propio de la configuración.

350 

351### `settings.read: refused to the engine`

352 

353Esta línea del [registro de depuración](#read-the-debug-log) significa que [la propia lectura de Claude Code](https://code.claude.com/docs/es/plugins/mods/events.md#settings-read-hook) se rechazó, así que no se aplicó el `{ value }` de ningún hook, incluido el tuyo. Cuando un hook `settings.read` rechaza esa lectura con [`{ deny: reason }`](https://code.claude.com/docs/es/plugins/mods/events#settings-read-returns), la línea incluye el motivo de ese hook:

354 

355```text theme={null}

356settings.read: refused to the engine (engine: $.settings.read: <reason>); the settings' own values stand

357```

358 

359Busca el texto de `<reason>` en el código de tu propio hook:

360 

361* **Tu código lo contiene**: tu hook rechazó la lectura. Haz que devuelva `{ value }` cuando [`next.origin`](https://code.claude.com/docs/es/plugins/mods/events#settings-read-origin) indique la propia lectura de Claude Code.

362* **Tu código no lo contiene**: [desactiva](https://code.claude.com/docs/es/plugins/mods/overview.md#turn-mods-on-or-off) tus otros mods uno a uno. Después de cada uno, vuelve a ejecutar el comando de esta sesión desde tu shell con un `--debug-file` en una ruta nueva, y busca `refused to the engine` en ese archivo. Si la línea está, desactiva el siguiente mod. Si no, el último mod que desactivaste rechazó la lectura, así que mantenlo desactivado.

363 

364Si no queda ningún otro mod, usa un [archivo de configuración](https://code.claude.com/docs/es/settings.md) para las claves que devuelve tu hook. Sus valores se mantienen mientras la lectura esté rechazada.

365 

306## Lee el registro de depuración366## Lee el registro de depuración

307 367 

308El registro de depuración tiene una línea por cada módulo que Claude Code carga o rechaza, cada hook que falla y cada resultado que rechaza, así que es donde debes buscar cuando la transcripción no muestra nada. Para generar uno, en tu shell inicia Claude Code con `--debug`, o con `--debug-file <path>` para elegir dónde se guarda:368El registro de depuración tiene una línea por cada módulo que Claude Code carga o rechaza, cada hook que falla y cada resultado que rechaza, así que es donde debes buscar cuando la transcripción no muestra nada. Para generar uno, en tu shell inicia Claude Code con `--debug`, o con `--debug-file <path>` para elegir dónde se guarda:

Details

251 251 

252Primero verifique el repositorio en sí: un `owner/repo` mal escrito, un repositorio que no existe, o un repositorio privado que no puede ver también termina en este mensaje. Abra la URL del repositorio en su navegador, o ejecute `git ls-remote <url>` en su terminal, para confirmar que existe y tiene acceso.252Primero verifique el repositorio en sí: un `owner/repo` mal escrito, un repositorio que no existe, o un repositorio privado que no puede ver también termina en este mensaje. Abra la URL del repositorio en su navegador, o ejecute `git ls-remote <url>` en su terminal, para confirmar que existe y tiene acceso.

253 253 

254Si el repositorio es correcto, la causa son las credenciales. Claude Code ejecuta git con prompts interactivos deshabilitados, por lo que no puede pedirle una contraseña, una frase de contraseña de clave, o una credencial de la manera que lo haría su terminal. Si git necesita solicitar, ve `fatal: Cannot prompt because user interactivity has been disabled` o `terminal prompts disabled` en el error original. Solo las credenciales que ya funcionan de forma no interactiva tienen éxito:254Si el repositorio es correcto, la causa son las credenciales. Claude Code desactiva los prompts de git y los programas askpass, incluido uno establecido en `GIT_ASKPASS`, y ejecuta SSH en modo batch. Cuando git necesita pedir algo, el error de la clonación incluye `fatal: Cannot prompt because user interactivity has been disabled`, `terminal prompts disabled` o `fatal: unable to get password from user`. Solo funcionan las credenciales que git puede obtener sin un prompt ni un programa askpass:

255 255 

256* **SSH**: `ssh -T git@<host>` debe tener éxito sin solicitar una frase de contraseña, y el host ya debe estar en `known_hosts`256* **SSH**: `ssh -T git@<host>` debe tener éxito sin solicitar una frase de contraseña, y el host ya debe estar en `known_hosts`

257* **HTTPS**: su asistente de credenciales debe contener un token para el host. Para GitHub, ejecute `gh auth login` y `gh auth setup-git`. Para otro host, almacene un token de acceso personal en su asistente de credenciales de git. Pruebe con `git ls-remote <url>`257* **HTTPS**: tu asistente de credenciales debe contener un token para el host. Para GitHub, ejecuta `gh auth login` y `gh auth setup-git`. Para otro host, guarda un token de acceso personal en tu asistente de credenciales de git. Para probarlo, quita `GIT_ASKPASS` en tu terminal y ejecuta `git -c core.askPass= ls-remote <url>`.

258 258 

259Una vez que `git ls-remote` tiene éxito en su terminal sin un prompt, ejecute la adición o actualización nuevamente. Una adición exitosa imprime `Successfully added marketplace: <name>`. Una actualización exitosa imprime `Successfully updated marketplace: <name>` desde su shell, o `✔ Updated 1 marketplace` en una sesión.259Una vez que la verificación de tu protocolo funcione sin un prompt, vuelve a ejecutar la adición o la actualización. Una adición exitosa imprime `Successfully added marketplace: <name>`. Una actualización exitosa imprime `Successfully updated marketplace: <name>` desde tu shell, o `✔ Updated 1 marketplace` en una sesión.

260 260 

261Para hacer que Claude Code omita SSH para fuentes `owner/repo` de GitHub, establezca `CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1`. Sin él, Claude Code clona esas fuentes sobre SSH cuando una clave SSH para `github.com` parece estar configurada, y vuelve a HTTPS cuando el clonado SSH falla.261Para hacer que Claude Code omita SSH para fuentes `owner/repo` de GitHub, establezca `CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1`. Sin él, Claude Code clona esas fuentes sobre SSH cuando una clave SSH para `github.com` parece estar configurada, y vuelve a HTTPS cuando el clonado SSH falla.

262 262 


318 318 

319Si el repositorio es un monorepo, limite el checkout a los directorios que nombra con `claude plugin marketplace add <source> --sparse <paths>`.319Si el repositorio es un monorepo, limite el checkout a los directorios que nombra con `claude plugin marketplace add <source> --sparse <paths>`.

320 320 

321Si el repositorio tiene submódulos de git grandes, actualiza Claude Code. En v2.1.295 y posteriores, Claude Code obtiene solo los [submódulos que contienen archivos de plugins](https://code.claude.com/docs/es/plugins/marketplace-reference.md#git-submodules-in-the-marketplace-repository). Las versiones anteriores obtienen todos los submódulos, lo que por sí solo puede consumir los 120 segundos.

322 

321### Marketplace updates keep failing offline323### Marketplace updates keep failing offline

322 324 

323Trabaja en un entorno donde el host git del mercado es inaccesible, y cada sesión repite una actualización fallida en segundo plano. Su checkout existente del mercado permanece en su lugar y el inicio no se retrasa.325Trabaja en un entorno donde el host git del mercado es inaccesible, y cada sesión repite una actualización fallida en segundo plano. Su checkout existente del mercado permanece en su lugar y el inicio no se retrasa.


609| `<Plugin or Dependency> "<name>" has conflicting version requirements` | Ninguna versión satisface todos los rangos que la fijan. El mensaje enumera los rangos. | Desinstala o actualiza uno de los plugins en conflicto, o pide al autor original que amplíe su restricción. |611| `<Plugin or Dependency> "<name>" has conflicting version requirements` | Ninguna versión satisface todos los rangos que la fijan. El mensaje enumera los rangos. | Desinstala o actualiza uno de los plugins en conflicto, o pide al autor original que amplíe su restricción. |

610| `... has version requirements too complex to intersect` o `has an invalid version requirement` | Un rango no es semver válido, o los rangos combinados no se pueden intersecar. | Corrige el rango no válido o simplifica las cadenas `\|\|` largas. |612| `... has version requirements too complex to intersect` o `has an invalid version requirement` | Un rango no es semver válido, o los rangos combinados no se pueden intersecar. | Corrige el rango no válido o simplifica las cadenas `\|\|` largas. |

611| `... has no git tag satisfying <range>` | El repositorio de la dependencia no tiene ninguna etiqueta `<name>--v*` dentro del rango. | Comprueba que el proyecto original etiquete sus versiones con esa convención, o flexibiliza el rango. |613| `... has no git tag satisfying <range>` | El repositorio de la dependencia no tiene ninguna etiqueta `<name>--v*` dentro del rango. | Comprueba que el proyecto original etiquete sus versiones con esa convención, o flexibiliza el rango. |

612| `Dependency "<dep>" (required by <plugin>) is in <marketplace>, which is not in the allowlist` | La dependencia está en un marketplace diferente, y la resolución entre marketplaces está desactivada de forma predeterminada. | Instala tú mismo la dependencia en el mismo alcance, en tu shell con `claude plugin install <dep>@<marketplace>` más el `--scope` en el que estás instalando el plugin, y luego reintenta. |614| `Dependency "<dep>" (required by <plugin>) is in marketplace "<marketplace>", which is not in the allowlist` | La dependencia está en un marketplace diferente, y la resolución entre marketplaces está desactivada de forma predeterminada. | Instala tú mismo la dependencia en el mismo alcance, en tu shell con `claude plugin install <dep>@<marketplace>` más el `--scope` en el que estás instalando el plugin, y luego reintenta. |

613 615 

614Para verlos de forma programática, ejecuta `claude plugin list --json` en tu shell. Los plugins con problemas incluyen un campo `errors` con los mensajes y un campo `errorDetails` con un `type` para cada uno: las tres primeras filas son `dependency-unsatisfied` y la cuarta es `dependency-version-unsatisfied`.616Para verlos de forma programática, ejecuta `claude plugin list --json` en tu shell. Los plugins con problemas incluyen un campo `errors` con los mensajes y un campo `errorDetails` con un `type` para cada uno: las tres primeras filas son `dependency-unsatisfied` y la cuarta es `dependency-version-unsatisfied`.

615 617 


979 981 

980### `${CLAUDE_PLUGIN_ROOT}` muestra barras diagonales en Windows982### `${CLAUDE_PLUGIN_ROOT}` muestra barras diagonales en Windows

981 983 

982En Windows, un hook de plugin recibe `${CLAUDE_PLUGIN_ROOT}` como `C:/Users/you/...` en lugar de `C:\Users\you\...`, y un script que esperaba barras invertidas falla.984En Windows, un hook de plugin que se ejecuta a través de Git Bash recibe `${CLAUDE_PLUGIN_ROOT}` como `C:/Users/you/...` en lugar de `C:\Users\you\...`, y un script que esperaba barras invertidas falla.

983 985 

984Claude Code ejecuta los hooks en forma de shell a través de Git Bash en Windows y sustituye a propósito la raíz del plugin en la forma Win32 con barras diagonales. Los builtins de Bash, las herramientas de MSYS y los binarios nativos de Windows aceptan esa forma.986Con Git Bash instalado, un [hook en forma de shell](https://code.claude.com/docs/es/hooks.md#exec-form-and-shell-form) se ejecuta a través de Git Bash de forma predeterminada. Para un hook que se ejecuta a través de Git Bash, Claude Code pasa la ruta con barras diagonales para que Bash no interprete las barras invertidas como caracteres de escape. Los builtins de Bash, las herramientas de MSYS y los binarios nativos de Windows aceptan esa forma.

985 987 

986Si tu script necesita barras invertidas, cambia el hook a una de las formas que conservan las rutas nativas, descritas en [forma exec y forma de shell](https://code.claude.com/docs/es/hooks.md#exec-form-and-shell-form):988Si tu script necesita barras invertidas, cambia el hook a una de las formas que conservan las rutas nativas, descritas en [forma exec y forma de shell](https://code.claude.com/docs/es/hooks.md#exec-form-and-shell-form):

987 989 


1090 1092 

1091Alternativamente, aloje el mercado en un repositorio git y diga a los usuarios que lo agreguen con la URL del repositorio. Para una fuente de git, Claude Code clona todo el repositorio, por lo que las rutas relativas se resuelven. Los tipos de fuente están en la [marketplace reference](https://code.claude.com/docs/es/plugins/marketplace-reference.md).1093Alternativamente, aloje el mercado en un repositorio git y diga a los usuarios que lo agreguen con la URL del repositorio. Para una fuente de git, Claude Code clona todo el repositorio, por lo que las rutas relativas se resuelven. Los tipos de fuente están en la [marketplace reference](https://code.claude.com/docs/es/plugins/marketplace-reference.md).

1092 1094 

1095### Faltan los archivos de un submódulo git de un plugin raíz después de la instalación

1096 

1097Tu plugin está en la raíz del marketplace y ejecuta o lee un archivo de un submódulo git del repositorio. Después de la instalación, el directorio del submódulo está vacío. Antes de v2.1.295, Claude Code obtenía todos los submódulos, por lo que el directorio tenía contenido.

1098 

1099Cuando Claude Code clona tu marketplace, obtiene solo los [submódulos que contienen archivos de plugin](https://code.claude.com/docs/es/plugins/marketplace-reference.md#git-submodules-in-the-marketplace-repository). Para un plugin en la raíz, lo decide leyendo las rutas de la configuración del plugin y el texto de los archivos del plugin. No puede ver una ruta que un script construye mientras se ejecuta.

1100 

1101Escribe la ruta al submódulo completa en un lugar donde Claude Code pueda leerla, como `${CLAUDE_PLUGIN_ROOT}/vendor/tool/run.sh` en un comando de hook. Claude Code entonces obtiene todos los submódulos del repositorio para ese plugin.

1102 

1093### Marketplace validation errors1103### Marketplace validation errors

1094 1104 

1095Ejecutó `claude plugin validate .` desde su directorio de mercado e informó errores o advertencias en el archivo del mercado en sí.1105Ejecutó `claude plugin validate .` desde su directorio de mercado e informó errores o advertencias en el archivo del mercado en sí.


1121 1131 

1122### `Marketplace source '<source>' is blocked by enterprise policy`1132### `Marketplace source '<source>' is blocked by enterprise policy`

1123 1133 

1124Ejecutó `/plugin marketplace add`, `update`, o una instalación, y Claude Code rechazó con esta línea. Para una fuente de GitHub o git, el host sigue la fuente entre paréntesis, como en `'github:owner/repo' (github.com)`.1134Ejecutaste `/plugin marketplace add`, `update` o una instalación, y Claude Code lo rechazó con esta línea.

1125 1135 

1126Su administrador estableció `blockedMarketplaces` o `strictKnownMarketplaces` en configuración administrada, y esta fuente no está permitida. Pida a su administrador que permita la fuente, o agregue una de las fuentes permitidas que el mensaje enumera.1136Su administrador estableció `blockedMarketplaces` o `strictKnownMarketplaces` en configuración administrada, y esta fuente no está permitida. Pida a su administrador que permita la fuente, o agregue una de las fuentes permitidas que el mensaje enumera.

1127 1137 

Details

100 100 

101### Activar el modo rápido101### Activar el modo rápido

102 102 

103Habilitar el [modo rápido](https://code.claude.com/docs/es/fast-mode.md) agrega un encabezado de solicitud que es parte de la clave de caché, por lo que la primera solicitud que Claude Code envía con el modo rápido activado lee todo el historial de conversación sin aciertos de caché. Claude Code establece ese encabezado una vez cuando comienza un turno y lo mantiene durante todo el turno, por lo que cuando activas el modo rápido mientras Claude está trabajando, la pérdida de caché del encabezado ocurre en la primera solicitud de tu siguiente turno. Esos tokens de entrada sin caché se facturan a [tarifas de modo rápido](https://code.claude.com/docs/es/fast-mode.md#understand-the-cost-tradeoff), por lo que activarlo al inicio de una sesión cuesta menos que activarlo muy avanzada una sesión larga. Si tu modelo actual no admite el modo rápido, habilitar el modo rápido también [cambia tu modelo](#switching-models), y ese cambio inicia una caché nueva por sí solo desde la siguiente solicitud en el turno en ejecución.103El [modo rápido](https://code.claude.com/docs/es/fast-mode.md) y la velocidad estándar mantienen cachés separadas, por lo que después de activar o desactivar el modo rápido, la siguiente solicitud no puede usar lo que la otra velocidad almacenó en caché. La primera vez que activas el modo rápido en una conversación, la siguiente solicitud lee toda la conversación hasta ese momento sin caché a [tarifas de modo rápido](https://code.claude.com/docs/es/fast-mode.md#understand-the-cost-tradeoff). Para mantener ese costo bajo, actívalo al inicio de una sesión.

104 104 

105El costo se aplica una vez por conversación. Después del primer turno de modo rápido, Claude Code sigue enviando el encabezado y varía solo el ajuste de velocidad de la solicitud, que no es parte de la clave de caché. Desactivar el modo rápido, el [cambio automático a velocidad estándar](https://code.claude.com/docs/es/fast-mode.md#handle-rate-limits) después de un rate limit, y activarlo nuevamente más tarde mantienen la caché. Si [te quedas sin créditos de uso](https://code.claude.com/docs/es/fast-mode.md#handle-rate-limits) a mitad de sesión, Claude Code reintenta cada solicitud de modo rápido rechazada a velocidad estándar de la misma manera, por lo que este respaldo también mantiene la caché. `/clear` y `/compact` restablecen esto, ya que reconstruyen la caché en esos puntos de todos modos.105* Si lo activas mientras Claude está trabajando, ese turno termina a velocidad estándar, y pagas cualquier lectura sin caché en la primera solicitud de tu siguiente turno.

106* Si tu modelo actual no admite el modo rápido, habilitar el modo rápido también [te cambia a Opus](https://code.claude.com/docs/es/fast-mode.md#toggle-fast-mode). Ese [cambio de modelo](#switching-models) inicia una caché nueva por sí solo desde la siguiente solicitud en el turno en ejecución.

107 

108Cada activación o desactivación posterior lee sin caché todo lo que la velocidad a la que cambias no tenga almacenado en caché. Los cambios de velocidad que Claude Code hace por su cuenta, como el [cambio automático a velocidad estándar](https://code.claude.com/docs/es/fast-mode.md#handle-rate-limits) después de un rate limit y el regreso al modo rápido más tarde, también cuentan como activaciones o desactivaciones.

106 109 

107### Conectar o desconectar un servidor MCP110### Conectar o desconectar un servidor MCP

108 111 


184>187>

185> La compactación funciona a tu favor cuando el contexto que descartas es contenido que ya no necesitas. Para elegir cuándo ocurre su sobrecarga, ejecuta `/compact` en una pausa natural de tu trabajo, como entre tareas, en lugar de esperar a que la compactación automática se active a mitad de tarea. Si has seguido un camino que quieres abandonar por completo, usa [`/rewind`](#rewinding-the-conversation) en su lugar para volver a un turno anterior. Retroceder trunca hasta un prefijo que ya está almacenado en caché, en lugar de crear uno nuevo como lo hace la compactación.188> La compactación funciona a tu favor cuando el contexto que descartas es contenido que ya no necesitas. Para elegir cuándo ocurre su sobrecarga, ejecuta `/compact` en una pausa natural de tu trabajo, como entre tareas, en lugar de esperar a que la compactación automática se active a mitad de tarea. Si has seguido un camino que quieres abandonar por completo, usa [`/rewind`](#rewinding-the-conversation) en su lugar para volver a un turno anterior. Retroceder trunca hasta un prefijo que ya está almacenado en caché, en lugar de crear uno nuevo como lo hace la compactación.

186 189 

187Si dejas una conversación larga inactiva en una sesión de terminal mientras está en el [TTL de una hora](#which-ttl-each-request-gets), Claude Code puede compactarla poco antes de que expire la caché. Para desactivar la compactación por inactividad, establece [`idleCompaction`](https://code.claude.com/docs/es/settings-reference#idlecompaction) en `false`, lo que requiere Claude Code v2.1.290 o posterior.190Si dejas una conversación larga inactiva mientras está en el [TTL de una hora](#which-ttl-each-request-gets), Claude Code puede compactarla. Para desactivar la compactación por inactividad, establece [`idleCompaction`](https://code.claude.com/docs/es/settings-reference#idlecompaction) en `false`, lo que requiere Claude Code v2.1.290 o posterior.

188 191 

189### Acumular muchas imágenes192### Acumular muchas imágenes

190 193 


309 312 

310En Claude Code, el caché está efectivamente limitado a una máquina y directorio. El prompt del sistema integra sus rutas de memoria automática, y la conversación se abre con un anuncio del directorio de trabajo, plataforma, shell, y versión del SO. Dos sesiones en directorios diferentes, por lo tanto, construyen prefijos diferentes y se pierden el caché del otro.313En Claude Code, el caché está efectivamente limitado a una máquina y directorio. El prompt del sistema integra sus rutas de memoria automática, y la conversación se abre con un anuncio del directorio de trabajo, plataforma, shell, y versión del SO. Dos sesiones en directorios diferentes, por lo tanto, construyen prefijos diferentes y se pierden el caché del otro.

311 314 

312Las sesiones que ejecuta en paralelo en el mismo directorio construyen prefijos coincidentes y leen el caché del otro. Las sesiones secuenciales comparten el prefijo solo cuando la instantánea de estado de git al inicio coincide, ya que cada conversación también lleva la rama y commits recientes de esa instantánea.315* Las sesiones que ejecutas en paralelo en el mismo directorio generan prefijos coincidentes y pueden leer la caché de las demás.

316* Las sesiones secuenciales comparten el prefijo solo cuando coincide la instantánea del estado de git tomada al inicio, ya que cada conversación también incluye la rama y los commits recientes de esa instantánea.

317 

318La caché subyacente de la API es más amplia. Las cachés están aisladas entre organizaciones y, en algunos proveedores, [entre espacios de trabajo dentro de una organización](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-storage-and-sharing). Dentro de esos límites, dos solicitudes comparten una caché solo cuando coinciden su modelo, su [velocidad](#turning-on-fast-mode) y su prefijo.

313 319 

314El caché de API subyacente es más amplio. Los cachés están aislados entre organizaciones, y en algunos proveedores, [entre espacios de trabajo dentro de una organización](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-storage-and-sharing). Dentro de esos límites, cualquier dos solicitudes con el mismo modelo y prefijo leen el mismo caché. Para llamadores de Agent SDK que ejecutan flotas de procesos automatizados, vea [mejorar el almacenamiento en caché de prompts entre usuarios y máquinas](https://code.claude.com/docs/es/agent-sdk/modifying-system-prompts.md#improve-prompt-caching-across-users-and-machines) para mover la ubicación de la memoria automática fuera del prompt del sistema y compartir la entrada de caché del prompt del sistema entre usuarios y máquinas.320Si llamas al Agent SDK para ejecutar flotas de procesos automatizados, consulta [mejorar la caché de prompts entre usuarios y máquinas](https://code.claude.com/docs/es/agent-sdk/modifying-system-prompts.md#improve-prompt-caching-across-users-and-machines) para sacar la ubicación de la memoria automática del prompt del sistema.

315 321 

316## Verificar el rendimiento del caché322## Verificar el rendimiento del caché

317 323 

Details

179* **Diferencia de sus cambios**: cuando el directorio de la sesión está en un repositorio git, el panel de diferencia de un dispositivo conectado muestra sus cambios. En una rama que tiene confirmaciones por delante de la rama predeterminada del repositorio, el panel muestra los cambios desde que la rama se separó de ella, incluidas sus ediciones sin confirmar. En la rama predeterminada misma, o en una rama que no está por delante de ella, el panel muestra solo sus cambios sin confirmar.179* **Diferencia de sus cambios**: cuando el directorio de la sesión está en un repositorio git, el panel de diferencia de un dispositivo conectado muestra sus cambios. En una rama que tiene confirmaciones por delante de la rama predeterminada del repositorio, el panel muestra los cambios desde que la rama se separó de ella, incluidas sus ediciones sin confirmar. En la rama predeterminada misma, o en una rama que no está por delante de ella, el panel muestra solo sus cambios sin confirmar.

180* **Modelo**: cuando elige un [modelo](https://code.claude.com/docs/es/model-config.md) desde un dispositivo conectado, Claude Code ejecuta la sesión en ese modelo. Requiere Claude Code v2.1.238 o posterior. Un modelo que elige desde el control de modelo del dispositivo se aplica solo a la sesión actual. Cuando envía `/model <name>` desde el dispositivo a una sesión interactiva, Claude Code también establece su predeterminado para nuevas sesiones.180* **Modelo**: cuando elige un [modelo](https://code.claude.com/docs/es/model-config.md) desde un dispositivo conectado, Claude Code ejecuta la sesión en ese modelo. Requiere Claude Code v2.1.238 o posterior. Un modelo que elige desde el control de modelo del dispositivo se aplica solo a la sesión actual. Cuando envía `/model <name>` desde el dispositivo a una sesión interactiva, Claude Code también establece su predeterminado para nuevas sesiones.

181* **Nivel de esfuerzo**: cuando establece el [nivel de esfuerzo](https://code.claude.com/docs/es/model-config.md#adjust-effort-level) desde un dispositivo conectado, con `/effort` o el control de esfuerzo del dispositivo, Claude Code lo aplica a la sesión en su máquina. Si fijó un nivel con `CLAUDE_CODE_EFFORT_LEVEL`, la sesión mantiene ese nivel, y Claude Code rechaza una selección diferente desde el control de esfuerzo. Seleccionar un nivel desde el control de esfuerzo requiere Claude Code v2.1.234 o posterior en su máquina.181* **Nivel de esfuerzo**: cuando establece el [nivel de esfuerzo](https://code.claude.com/docs/es/model-config.md#adjust-effort-level) desde un dispositivo conectado, con `/effort` o el control de esfuerzo del dispositivo, Claude Code lo aplica a la sesión en su máquina. Si fijó un nivel con `CLAUDE_CODE_EFFORT_LEVEL`, la sesión mantiene ese nivel, y Claude Code rechaza una selección diferente desde el control de esfuerzo. Seleccionar un nivel desde el control de esfuerzo requiere Claude Code v2.1.234 o posterior en su máquina.

182* **Reconexión después de un fallo de conexión**: ejecute `/remote-control` para reconectarse. Si la compactación rescribió la conversación o cambió conversaciones con `/resume` mientras tanto, Claude Code archiva la sesión del servidor que estaba usando en lugar de dejarla en la lista de sesiones. Aún puede encontrarla [filtrando sesiones archivadas](https://code.claude.com/docs/es/claude-code-on-the-web.md#archive-sessions). Cambiar conversaciones mientras un dispositivo aún está conectado no archiva la sesión.182* **Reconexión después de un fallo de conexión**: ejecuta `/remote-control` para reconectarte. Si la compactación reescribió la conversación o cambiaste de conversación con `/resume` mientras tanto, Claude Code archiva la sesión del servidor que estaba usando en lugar de dejarla en la lista de sesiones. Aún puedes encontrar esa sesión entre tus [sesiones archivadas](https://code.claude.com/docs/es/claude-code-on-the-web.md#find-an-archived-session) en claude.ai/code. Cambiar de conversación mientras un dispositivo sigue conectado no archiva la sesión.

183 183 

184### Habilite Remote Control para todas las sesiones184### Habilite Remote Control para todas las sesiones

185 185 


401 401 

402## Solución de problemas402## Solución de problemas

403 403 

404### "Remote Control disconnected" o "Can't reach"

405 

406En [claude.ai/code](https://claude.ai/code) o en la aplicación de escritorio, **Remote Control disconnected** o un mensaje **Can't reach** significa que tu navegador o aplicación perdió el contacto con Claude Code en tu computadora. Ninguno de los dos mensajes te indica si Claude o un subagente que estabas observando sigue trabajando en tu computadora. En esa computadora, verifica en qué estado se encuentra Claude Code y sigue el paso correspondiente para reconectarte:

407 

408* **Una sesión interactiva muestra `Remote Control disconnected`**: sigue [los pasos de reconexión para el motivo que indica esa línea](#session-ended-elsewhere)

409* **Claude Code se está ejecutando y no muestra ningún error**: una sesión interactiva se reconecta por sí sola una vez que la máquina está activa y en línea, por lo que no necesitas hacer nada. Si usaste `claude remote-control`, consulta **Interrupción prolongada de la red** en [Limitaciones](#limitations)

410* **Claude Code no se está ejecutando**: [inícialo de nuevo y recupera la sesión](#resume-sessions-after-stopping-the-server)

411 

404### "Remote Control requires a claude.ai subscription"412### "Remote Control requires a claude.ai subscription"

405 413 

406No has iniciado sesión con una cuenta de claude.ai, o una credencial diferente tiene precedencia sobre tu inicio de sesión. El mensaje toma una de estas formas:414No has iniciado sesión con una cuenta de claude.ai, o una credencial diferente tiene precedencia sobre tu inicio de sesión. El mensaje toma una de estas formas:


463* **Con `/remote-control`, `claude --remote-control` o [conexión automática](#enable-remote-control-for-all-sessions)**: la sesión sigue ejecutándose sin Remote Control, y Claude Code la archiva en claude.ai471* **Con `/remote-control`, `claude --remote-control` o [conexión automática](#enable-remote-control-for-all-sessions)**: la sesión sigue ejecutándose sin Remote Control, y Claude Code la archiva en claude.ai

464* **Con `claude remote-control`**: el servidor se detiene y archiva las sesiones que estaba atendiendo, y luego sale472* **Con `claude remote-control`**: el servidor se detiene y archiva las sesiones que estaba atendiendo, y luego sale

465 473 

466Todavía puedes encontrar una sesión archivada [filtrando por sesiones archivadas](https://code.claude.com/docs/es/claude-code-on-the-web.md#archive-sessions).474Para volver a encontrar una de estas sesiones, abre tus [sesiones archivadas](https://code.claude.com/docs/es/claude-code-on-the-web.md#find-an-archived-session) en claude.ai/code.

467 475 

468Remote Control no se reconecta por sí solo. Para volver a activarlo después de que tu organización lo permita de nuevo, ejecuta `/remote-control` en la sesión o `claude remote-control` en tu shell. Cualquiera de los dos comandos falla con [`Remote Control is disabled by your organization's policy`](#remote-control-is-disabled-by-your-organizations-policy) hasta que Claude Code en esta máquina haya obtenido la política modificada. Una sesión abierta la obtiene aproximadamente una vez por hora. Para averiguar qué está bloqueando Remote Control, compara el texto completo que imprime el comando con esa entrada.476Remote Control no se reconecta por sí solo. Para volver a activarlo después de que tu organización lo permita de nuevo, ejecuta `/remote-control` en la sesión o `claude remote-control` en tu shell. Cualquiera de los dos comandos falla con [`Remote Control is disabled by your organization's policy`](#remote-control-is-disabled-by-your-organizations-policy) hasta que Claude Code en esta máquina haya obtenido la política modificada. Una sesión abierta la obtiene aproximadamente una vez por hora. Para averiguar qué está bloqueando Remote Control, compara el texto completo que imprime el comando con esa entrada.

469 477 

routines.md +24 −4

Details

293 293 

294#### Eventos admitidos294#### Eventos admitidos

295 295 

296Los disparadores de GitHub pueden suscribirse a cualquiera de las siguientes categorías de eventos. Dentro de cada categoría, puedes elegir una acción específica, como `pull_request.opened`, o reaccionar a todas las acciones de la categoría.296Elige un evento de cualquiera de las siguientes categorías. Dentro de cada categoría, puedes elegir una acción específica, como `pull_request.opened`, o reaccionar a todas las acciones de la categoría.

297 297 

298| Evento | Se activa cuando |298| Evento | Se activa cuando |

299| :- | :- |299| :- | :- |

300| Pull request | Se abre, cierra, asigna, etiqueta, sincroniza o actualiza de otra manera un PR |300| Pull request | Se abre, cierra, asigna, etiqueta, sincroniza o actualiza de otra manera un PR |

301| Lanzamiento | Se crea, publica, edita o elimina un lanzamiento |301| Lanzamiento | Se crea, publica, edita o elimina un lanzamiento |

302| Issue | Se abre, edita, cierra, reabre, etiqueta, asigna o actualiza de otra manera un issue |

302 303 

303#### Filtrar pull requests304#### Filtrar pull requests

304 305 


333 334 

334Haz clic en cualquier ejecución para abrirla como una sesión completa. Desde allí puedes ver qué hizo Claude, revisar los cambios, crear un pull request o continuar la conversación. Cada sesión de ejecución funciona como cualquier otra sesión: usa el menú desplegable junto al título de la sesión para cambiarle el nombre, archivarla o eliminarla.335Haz clic en cualquier ejecución para abrirla como una sesión completa. Desde allí puedes ver qué hizo Claude, revisar los cambios, crear un pull request o continuar la conversación. Cada sesión de ejecución funciona como cualquier otra sesión: usa el menú desplegable junto al título de la sesión para cambiarle el nombre, archivarla o eliminarla.

335 336 

336> [!NOTE]337En **History**, en la página de detalles de la tarea, la fila de cada ejecución finalizada termina con **Error** si la ejecución falló, con **Cancelled** si se canceló, y sin ninguna de esas palabras si tuvo éxito. El filtro **Status** llama a esos mismos tres resultados **Failed**, **Cancelled** y **Succeeded**. Estos resultados indican cómo terminó la sesión, no si Claude completó el trabajo que describe tu prompt, así que abre la ejecución y lee su transcripción para ver qué sucedió.

337>338 

338> Un estado verde en la lista de ejecuciones significa que la sesión se inició y terminó sin un error de infraestructura. No significa que el trabajo que describe tu prompt haya tenido éxito. Abre la ejecución para leer la transcripción y confirmar qué hizo realmente Claude. Las solicitudes de red bloqueadas, las herramientas de conectores faltantes y los fallos en el propio trabajo aparecen allí y no en el indicador de estado.339* **Succeeded**: la sesión terminó sin que Claude Code informara un fallo. Las solicitudes de red bloqueadas, las herramientas de conectores faltantes y el trabajo que Claude no pudo completar aparecen en la transcripción y no en la fila

340* **Failed**: la sesión no terminó normalmente. Por ejemplo, se detuvo inesperadamente, terminó con un error o se archivó antes de que comenzara la ejecución

341* **Cancelled**: la ejecución no falló y su sesión se archivó. Si archivas la sesión de una ejecución que tuvo éxito, la ejecución cambia a **Cancelled**. No es necesario cambiar nada en la tarea

342 

343Si aparece una advertencia en **History**, consulta [Advertencias «The last run»](#the-last-run-didnt-start).

339 344 

340### Editar y controlar tareas programadas345### Editar y controlar tareas programadas

341 346 


499 504 

500Probablemente un Owner de tu organización de Team o Enterprise desactivó el interruptor **Scheduled tasks (Was Routines)** en [**Organization settings > Capabilities > Remote sessions**](https://claude.ai/admin-settings/capabilities). En Claude Code v2.1.227 o posterior, el mismo interruptor también oculta `/schedule` en la CLI. Es una configuración de la organización del lado del servidor, por lo que no se puede anular desde tu configuración local. Pídele a un Owner que vuelva a activar las tareas programadas para tu organización.505Probablemente un Owner de tu organización de Team o Enterprise desactivó el interruptor **Scheduled tasks (Was Routines)** en [**Organization settings > Capabilities > Remote sessions**](https://claude.ai/admin-settings/capabilities). En Claude Code v2.1.227 o posterior, el mismo interruptor también oculta `/schedule` en la CLI. Es una configuración de la organización del lado del servidor, por lo que no se puede anular desde tu configuración local. Pídele a un Owner que vuelva a activar las tareas programadas para tu organización.

501 506 

507### Advertencias "The last run"

508 

509Cuando una advertencia en **History** comienza con "The last run", búscala en la primera columna y haz lo que indica su fila. La advertencia desaparece en cuanto se inicia una ejecución posterior.

510 

511| Advertencia | Qué hacer |

512| :- | :- |

513| "The last run didn't start because your organization had reached its limit on cloud sessions running at once." | La tarea no necesita ningún cambio. Haz clic en **Run now** más tarde, o espera a la siguiente ejecución |

514| "The last run didn't start because its cloud environment couldn't be found or used." | En la página de detalles de la tarea, abre el menú junto a su nombre, selecciona **Edit** y busca el [selector de entorno en la nube](#environments-and-network-access). Si dice **Unavailable environment**, ese entorno se archivó o ya no está disponible para tu cuenta, así que elige otro ahí y guarda los cambios. De lo contrario, reintenta con **Run now** en la página de detalles, o elige otro entorno en el selector y guarda los cambios |

515| "The last run was blocked because it couldn't access something it needs, or your organization's policy doesn't allow it." | Comprueba que tu [acceso a GitHub](#repositories-and-branch-permissions) cubra los repositorios de la tarea. Si es así, pregúntale a un [Owner](https://code.claude.com/docs/es/server-managed-settings.md#access-control) de tu organización de Claude si alguna política bloquea la tarea |

516| "The last run didn't start because of a problem that's usually temporary." | Haz clic en **Run now** para intentarlo de nuevo, o espera a la siguiente ejecución |

517| "The last run didn't start because its repository or branch wasn't available." | Comprueba en GitHub que cada repositorio de la tarea tenga la [rama desde la que se inicia la ejecución](#repositories-and-branch-permissions). Comprueba también que tu [acceso a GitHub](#repositories-and-branch-permissions) cubra cada repositorio, y vuelve a conectar GitHub si tu conexión expiró |

518| "The last run didn't start because some of its settings weren't accepted." | En la página de detalles de la tarea, abre el menú junto a su nombre y selecciona **Edit**. El cuadro de diálogo no marca qué ajuste no se aceptó, así que revisa cada uno ahí, incluidos el nombre, el prompt, el modelo, los repositorios, el entorno, los conectores y los disparadores de la tarea |

519| "The last run stopped because a usage limit was reached." | Para saber cuándo pueden volver a iniciarse las ejecuciones de la tarea tras alcanzar un límite de uso, consulta [Uso y límites](#usage-and-limits) |

520| "The last run failed." | Haz clic en **Run now** para intentarlo de nuevo, o espera a la siguiente ejecución. La ejecución fallida no tiene ninguna sesión que abrir |

521 

502## Recursos relacionados522## Recursos relacionados

503 523 

504* [`/loop` y programación dentro de la sesión](https://code.claude.com/docs/es/scheduled-tasks): programa tareas locales dentro de una sesión de CLI abierta524* [`/loop` y programación dentro de la sesión](https://code.claude.com/docs/es/scheduled-tasks): programa tareas locales dentro de una sesión de CLI abierta

sandboxing.md +26 −2

Details

223* **Una regla de consulta para el parámetro**: agrega una [regla de consulta](https://code.claude.com/docs/es/permissions.md#match-by-input-parameter) para `Bash(dangerouslyDisableSandbox:true)` para que se te pida confirmación en los reintentos de Bash. También recibes la solicitud en el modo automático y en el modo `bypassPermissions`, y la regla tiene precedencia sobre una regla de permiso que coincida223* **Una regla de consulta para el parámetro**: agrega una [regla de consulta](https://code.claude.com/docs/es/permissions.md#match-by-input-parameter) para `Bash(dangerouslyDisableSandbox:true)` para que se te pida confirmación en los reintentos de Bash. También recibes la solicitud en el modo automático y en el modo `bypassPermissions`, y la regla tiene precedencia sobre una regla de permiso que coincida

224* **[`permissions.blockReadsOutsideWorkingDirectories`](https://code.claude.com/docs/es/settings-reference#permissions-blockreadsoutsideworkingdirectories)**: [Acciones que ningún modo aprueba automáticamente](https://code.claude.com/docs/es/permission-modes.md#actions-no-mode-auto-approves) explica los reintentos que piden confirmación mientras está activado224* **[`permissions.blockReadsOutsideWorkingDirectories`](https://code.claude.com/docs/es/settings-reference#permissions-blockreadsoutsideworkingdirectories)**: [Acciones que ningún modo aprueba automáticamente](https://code.claude.com/docs/es/permission-modes.md#actions-no-mode-auto-approves) explica los reintentos que piden confirmación mientras está activado

225 225 

226Mientras los comandos se rechazan con un [mensaje `Sandbox is required`](#commands-refused-with-sandbox-is-required), Claude Code ignora el parámetro `dangerouslyDisableSandbox` y también rechaza el reintento.

227 

226#### Desactivar el reintento con el modo estricto del sandbox228#### Desactivar el reintento con el modo estricto del sandbox

227 229 

228Puedes desactivar el reintento fuera del sandbox estableciendo `"allowUnsandboxedCommands": false` en tu [configuración del sandbox](https://code.claude.com/docs/es/settings-reference.md#sandbox-settings). Con el reintento desactivado, Claude Code ignora el parámetro `dangerouslyDisableSandbox`. Mientras el sandbox está en ejecución, los comandos que ejecuta Claude se ejecutan entonces en el sandbox, a menos que coincidan con una entrada de `excludedCommands`. Para evitar que Claude Code ejecute comandos fuera del sandbox cuando este no puede iniciarse, establece también [`failIfUnavailable`](https://code.claude.com/docs/es/settings-reference#sandbox-failifunavailable). La pestaña **Overrides** de `/sandbox` muestra este ajuste como **Strict sandbox mode**.230Puedes desactivar el reintento fuera del sandbox estableciendo `"allowUnsandboxedCommands": false` en tu [configuración del sandbox](https://code.claude.com/docs/es/settings-reference.md#sandbox-settings). Con el reintento desactivado, Claude Code ignora el parámetro `dangerouslyDisableSandbox`. Mientras el sandbox está en ejecución, los comandos que ejecuta Claude se ejecutan entonces en el sandbox, a menos que coincidan con una entrada de `excludedCommands`. Para evitar que Claude Code ejecute comandos fuera del sandbox cuando este no puede iniciarse, establece también [`failIfUnavailable`](https://code.claude.com/docs/es/settings-reference#sandbox-failifunavailable). La pestaña **Overrides** de `/sandbox` muestra este ajuste como **Strict sandbox mode**.


899 901 

900### Los archivos de solo lectura de 0 bytes aparecen en las rutas de configuración `.claude`, y "Sí, y no preguntar de nuevo" no guarda902### Los archivos de solo lectura de 0 bytes aparecen en las rutas de configuración `.claude`, y "Sí, y no preguntar de nuevo" no guarda

901 903 

902En Linux y WSL2, el sandbox mantiene una denegación de escritura en un archivo que aún no existe creando un marcador de posición de solo lectura de 0 bytes allí mientras se ejecuta un comando aislado. El sandbox elimina el marcador de posición después. Si una sesión se mata antes de que se ejecute esa limpieza, por ejemplo por SIGKILL, los marcadores de posición permanecen. Las sesiones posteriores vuelven a vincular los marcadores de posición como de solo lectura en cada inicio, por lo que una escritura de configuración como guardar una opción de permiso falla en una ruta donde permanece un marcador de posición.904En Linux y WSL2, el sandbox mantiene una denegación de escritura en un archivo que aún no existe creando un marcador de posición de solo lectura de 0 bytes allí mientras se ejecuta un comando aislado. El sandbox elimina el marcador de posición después.

905 

906Un marcador de posición permanece en casos como estos:

907 

908* La sesión se mata antes de que se ejecute esa limpieza, por ejemplo por SIGKILL

909* La sesión termina mientras un comando aislado todavía se está ejecutando, como un comando en segundo plano

903 910 

904Ejecuta `claude doctor` en tu terminal para enumerar los archivos de marcador de posición restantes. La advertencia [`Sandbox mask files left behind at write-deny paths`](https://code.claude.com/docs/es/errors#stale-sandbox-mask-files-left-by-a-killed-session) nombra algunos de ellos y cuenta el resto. Elimina cada archivo con `rm` mientras no se ejecute ninguna otra sesión de Claude Code en ese proyecto. Antes de v2.1.257, Claude Code dejaba los mismos marcadores de posición sin marcarlos.911Las sesiones posteriores vuelven a vincular los marcadores de posición como de solo lectura en cada inicio, por lo que una escritura de configuración como guardar una opción de permiso falla en una ruta donde permanece un marcador de posición.

912 

913Ejecuta `claude doctor` en tu terminal para enumerar los archivos de marcador de posición restantes. La advertencia [`Sandbox mask files left behind at write-deny paths`](https://code.claude.com/docs/es/errors#stale-sandbox-mask-files-left-by-a-killed-session) nombra algunos de ellos y cuenta el resto. Elimina cada archivo con `rm` mientras no se ejecute ninguna otra sesión de Claude Code en ese proyecto. Antes de v2.1.257, Claude Code dejaba los mismos marcadores de posición cuando se mataba una sesión, sin marcarlos.

905 914 

906### `git` sobre SSH falla con el sandbox activado915### `git` sobre SSH falla con el sandbox activado

907 916 


1000 1009 

1001Antes de v2.1.284, el proxy se conectaba a cualquier dirección en la que se resolviera un nombre de host permitido.1010Antes de v2.1.284, el proxy se conectaba a cualquier dirección en la que se resolviera un nombre de host permitido.

1002 1011 

1012### Los comandos se rechazan con `Sandbox is required`

1013 

1014Si exiges el sandbox con [`sandbox.failIfUnavailable`](https://code.claude.com/docs/es/settings-reference#sandbox-failifunavailable) y este falla de una de estas maneras después de que Claude Code se inicia, cada comando aislado que ejecuta Claude se rechaza con el mensaje indicado. La sesión sigue ejecutándose y el comando rechazado no se ejecuta fuera del sandbox:

1015 

1016* **`Sandbox is required but failed to initialize: <reason>`**: Claude Code se inició, pero luego el sandbox no logró inicializarse. Sigue el paso que indica el mensaje: `Restart to retry.` o `Fix the sandbox settings to retry`.

1017* **`Sandbox is required (sandbox.failIfUnavailable) and stopped being available in this session: <reason>`**: en Linux o WSL2, el sandbox se inició y luego Claude Code detectó que faltaba una dependencia. Corrige lo que indica el motivo, como [instalar una dependencia faltante](#set-up-linux-and-wsl2), y luego reinicia Claude Code.

1018 

1019Los comandos excluidos y los comandos que escribes tú mismo siguen ejecutándose, y Claude no puede reintentar un comando rechazado fuera del sandbox:

1020 

1021* **Comandos excluidos**: los comandos que coinciden con una entrada de [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands) siguen ejecutándose fuera del sandbox. Cuando uno de ellos escribe en una ruta de [`filesystem.allowWrite`](https://code.claude.com/docs/es/settings-reference#sandbox-filesystem-allowwrite) fuera de tu directorio de trabajo, esa escritura pasa por el flujo de permisos habitual. Con un [sandbox obligatorio por parte del administrador](#repository-settings-under-an-admin-required-sandbox), Claude Code ignora las entradas de la configuración del repositorio

1022* **Comandos que escribes en el [prompt del modo shell `!`](https://code.claude.com/docs/es/interactive-mode#shell-mode-with-prefix)**: siguen ejecutándose fuera del sandbox. En una [sesión en segundo plano](https://code.claude.com/docs/es/agent-view.md), también se rechazan

1023* **Reintentos fuera del sandbox**: Claude Code ignora el parámetro `dangerouslyDisableSandbox` de un [reintento fuera del sandbox](#the-unsandboxed-retry-escape-hatch)

1024 

1025En una sesión de Linux con `CLAUDE_CODE_SUBPROCESS_ENV_SCRUB` establecida, todos los comandos se ejecutan en el sandbox, por lo que los comandos excluidos y los comandos que escribes también se rechazan.

1026 

1003### `/sandbox` falla con `Sandbox settings are overridden by a higher-priority configuration`1027### `/sandbox` falla con `Sandbox settings are overridden by a higher-priority configuration`

1004 1028 

1005`/sandbox` imprime `Error: Sandbox settings are overridden by a higher-priority configuration and cannot be changed locally.` en lugar de abrir su panel cuando un [nivel de configuración](https://code.claude.com/docs/es/settings.md#settings-precedence) superior establece `sandbox.enabled`, `sandbox.autoAllowBashIfSandboxed` o `sandbox.allowUnsandboxedCommands`. El panel guarda tus elecciones en `.claude/settings.local.json`, y un valor guardado allí no puede sobrescribir esos niveles.1029`/sandbox` imprime `Error: Sandbox settings are overridden by a higher-priority configuration and cannot be changed locally.` en lugar de abrir su panel cuando un [nivel de configuración](https://code.claude.com/docs/es/settings.md#settings-precedence) superior establece `sandbox.enabled`, `sandbox.autoAllowBashIfSandboxed` o `sandbox.allowUnsandboxedCommands`. El panel guarda tus elecciones en `.claude/settings.local.json`, y un valor guardado allí no puede sobrescribir esos niveles.

Details

783 783 

784Para conocer el orden en que se aplican estas fuentes, consulta [precedencia de configuración](https://code.claude.com/docs/es/settings.md#settings-precedence).784Para conocer el orden en que se aplican estas fuentes, consulta [precedencia de configuración](https://code.claude.com/docs/es/settings.md#settings-precedence).

785 785 

786Cuando el plano de control de Anthropic proporciona una sesión con [hooks de Claude Code](https://code.claude.com/docs/es/hooks.md), el ejecutor los instala junto a, no sobre, su propia configuración. Requiere Claude Code v2.1.229 o posterior.786Cuando el plano de control de Anthropic proporciona a una sesión [hooks de Claude Code](https://code.claude.com/docs/es/hooks.md), el ejecutor los instala junto a tu propia configuración, no encima de ella. Requiere Claude Code v2.1.229 o posterior; los ejecutores anteriores ignoran los hooks suministrados. Los hooks suministrados ejecutan `python3`, así que instala `python3` en tu [imagen del ejecutor](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#build-the-runner-image).

787 787 

788* **Dónde aterrizan**: el ejecutor escribe cada script de hook suministrado en un subdirectorio reservado `hooks/.ccr-launcher/` del directorio de configuración de la sesión y registra los scripts en un archivo de configuración separado que pasa a la sesión con `--settings`, dejando el `settings.json` sembrado y sus propios scripts en `hooks/<name>` sin tocar. El ejecutor recrea el subdirectorio reservado para cada sesión y no siembra contenido del host en `~/.claude/hooks/.ccr-launcher/` en sesiones.788* **Dónde aterrizan**: el ejecutor escribe cada script de hook suministrado en un subdirectorio reservado `hooks/.ccr-launcher/` del directorio de configuración de la sesión y registra los scripts en un archivo de configuración separado que pasa a la sesión con `--settings`, dejando el `settings.json` sembrado y sus propios scripts en `hooks/<name>` sin tocar. El ejecutor recrea el subdirectorio reservado para cada sesión y no siembra contenido del host en `~/.claude/hooks/.ccr-launcher/` en sesiones.

789* **Quién los autor**: el plano de control puebla los scripts desde constantes fijas en su propia implementación, nunca desde entrada por sesión o de terceros.789* **Quién los autor**: el plano de control puebla los scripts desde constantes fijas en su propia implementación, nunca desde entrada por sesión o de terceros.

Details

348 348 

349Las recetas a continuación usan `--capacity 4`, por lo que un contenedor sirve hasta cuatro sesiones concurrentes del mismo propietario bloqueado. Eso no proporciona el aislamiento del contenedor por sesión en la [sección de endurecimiento](#harden-your-deployment): antes de conectar un entorno a sistemas de producción, ejecute las recetas en `--capacity 1` con un contenedor por sesión, o use [runners bajo demanda](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#on-demand-runners), que también mantienen el secreto del entorno fuera de los hosts que ejecutan sesiones. Si agrega el [proxy de git de Anthropic](#use-the-anthropic-git-proxy) a una de estas recetas, también cambie `--capacity` a `1`.349Las recetas a continuación usan `--capacity 4`, por lo que un contenedor sirve hasta cuatro sesiones concurrentes del mismo propietario bloqueado. Eso no proporciona el aislamiento del contenedor por sesión en la [sección de endurecimiento](#harden-your-deployment): antes de conectar un entorno a sistemas de producción, ejecute las recetas en `--capacity 1` con un contenedor por sesión, o use [runners bajo demanda](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#on-demand-runners), que también mantienen el secreto del entorno fuera de los hosts que ejecutan sesiones. Si agrega el [proxy de git de Anthropic](#use-the-anthropic-git-proxy) a una de estas recetas, también cambie `--capacity` a `1`.

350 350 

351Este Dockerfile es un punto de partida mínimo:351Este Dockerfile es un punto de partida mínimo. Instala `python3` porque los [hooks que el plano de control de Anthropic proporciona](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#how-each-session’s-config-is-assembled) a las sesiones de Claude Tag, incluido el que hace que Claude publique su respuesta en Slack, ejecutan `python3`. Mantén `python3` en el `PATH` en cualquier imagen que sirva sesiones de Claude Tag:

352 352 

353```dockerfile theme={null}353```dockerfile theme={null}

354FROM debian:bookworm-slim354FROM debian:bookworm-slim

355ARG CLAUDE_CODE_VERSION355ARG CLAUDE_CODE_VERSION

356RUN apt-get update && apt-get install -y --no-install-recommends git curl ca-certificates openssh-client jq \356RUN apt-get update && apt-get install -y --no-install-recommends git curl ca-certificates openssh-client jq python3 \

357 && rm -rf /var/lib/apt/lists/*357 && rm -rf /var/lib/apt/lists/*

358RUN curl -fsSL "https://downloads.claude.ai/claude-code-releases/${CLAUDE_CODE_VERSION:?set with --build-arg CLAUDE_CODE_VERSION}/linux-x64/claude" \358RUN curl -fsSL "https://downloads.claude.ai/claude-code-releases/${CLAUDE_CODE_VERSION:?set with --build-arg CLAUDE_CODE_VERSION}/linux-x64/claude" \

359 -o /usr/local/bin/claude && chmod +x /usr/local/bin/claude359 -o /usr/local/bin/claude && chmod +x /usr/local/bin/claude


363ENTRYPOINT ["claude"]363ENTRYPOINT ["claude"]

364```364```

365 365 

366Intercambie `linux-x64` por `linux-arm64` si sus nodos son ARM, o por `linux-x64-musl` o `linux-arm64-musl` en una imagen basada en musl como Alpine; consulte [Configuración de Alpine Linux](https://code.claude.com/docs/es/setup.md#alpine-linux-and-musl-based-distributions) para los paquetes adicionales que las imágenes musl necesitan. La URL es la ubicación de lanzamiento estándar de Claude Code, por lo que puede verificar el binario descargado contra el manifiesto firmado del lanzamiento como se describe en [Integridad binaria y firma de código](https://code.claude.com/docs/es/setup.md#binary-integrity-and-code-signing). El runner requiere la versión 2.1.224 de Claude Code o posterior. Construya la imagen, luego empújela a su registro y hágale referencia en las recetas a continuación:366Intercambia `linux-x64` por `linux-arm64` si tus nodos son ARM, o por `linux-x64-musl` o `linux-arm64-musl` en una imagen basada en musl como Alpine; consulta [Configuración de Alpine Linux](https://code.claude.com/docs/es/setup.md#alpine-linux-and-musl-based-distributions) para los paquetes adicionales que las imágenes musl necesitan. La URL es la ubicación de lanzamiento estándar de Claude Code, por lo que puedes verificar el binario descargado contra el manifiesto firmado del lanzamiento como se describe en [Integridad binaria y firma de código](https://code.claude.com/docs/es/setup.md#binary-integrity-and-code-signing). El runner requiere la versión 2.1.224 de Claude Code o posterior, o la 2.1.229 o posterior para servir sesiones de Claude Tag. Crea la imagen, luego súbela a tu registro y haz referencia a ella en las recetas a continuación:

367 367 

368```bash theme={null}368```bash theme={null}

369docker build \369docker build \


768 * **Con un hook `checkout`**: a los repositorios obtenidos mediante un [hook de ciclo de vida `checkout`](https://code.claude.com/docs/es/self-hosted-environments-configuration#checkout) no se les hace push. En su lugar, guarda una instantánea de ellos desde el [hook `post-session`](https://code.claude.com/docs/es/self-hosted-environments-configuration#post-session).768 * **Con un hook `checkout`**: a los repositorios obtenidos mediante un [hook de ciclo de vida `checkout`](https://code.claude.com/docs/es/self-hosted-environments-configuration#checkout) no se les hace push. En su lugar, guarda una instantánea de ellos desde el [hook `post-session`](https://code.claude.com/docs/es/self-hosted-environments-configuration#post-session).

769 * **Antes de habilitar el flag**: restringe quién puede hacer push a las refs `claude/*` en el remoto de origen. Al reanudar, el runner obtiene la rama a la que se hizo push previamente sin verificar quién hizo el push.769 * **Antes de habilitar el flag**: restringe quién puede hacer push a las refs `claude/*` en el remoto de origen. Al reanudar, el runner obtiene la rama a la que se hizo push previamente sin verificar quién hizo el push.

770 * **Los cambios sin commit se siguen perdiendo**: para pedirle a Claude que haga commit y push cuando termine de responder, consulta [Pedir a las sesiones que hagan push de su trabajo](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work)770 * **Los cambios sin commit se siguen perdiendo**: para pedirle a Claude que haga commit y push cuando termine de responder, consulta [Pedir a las sesiones que hagan push de su trabajo](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work)

771* **Un comando interrumpido por la pérdida de un runner puede volver a ejecutarse**: cuando la sesión se reanuda en otro runner, Claude ve la llamada a herramienta interrumpida con un resultado que indica que su desenlace es desconocido.

771* **Un repositorio agregado a mitad de sesión puede fallar al clonarse**: Claude lo clona con `git clone` a través de HTTPS. En un runner sin [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), la clonación falla con un error de autenticación de git si nada en el host puede leer el repositorio. Siempre que puedas, selecciona todos los repositorios que la sesión necesita al crearla.772* **Un repositorio agregado a mitad de sesión puede fallar al clonarse**: Claude lo clona con `git clone` a través de HTTPS. En un runner sin [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), la clonación falla con un error de autenticación de git si nada en el host puede leer el repositorio. Siempre que puedas, selecciona todos los repositorios que la sesión necesita al crearla.

772* **Algunos conectores no aparecen en sesiones autohospedadas**: un conector que aún no ha conectado en la configuración de claude.ai no se enumera en una sesión autohospedada, y la sesión no le pedirá que lo conecte. Conéctelo en Configuración primero, luego inicie una sesión nueva. Agregar un conector a una sesión ya en ejecución tampoco hace que sus herramientas estén disponibles para Claude; inicie una sesión nueva para recoger un conector recién agregado.773* **Algunos conectores no aparecen en sesiones autohospedadas**: un conector que aún no ha conectado en la configuración de claude.ai no se enumera en una sesión autohospedada, y la sesión no le pedirá que lo conecte. Conéctelo en Configuración primero, luego inicie una sesión nueva. Agregar un conector a una sesión ya en ejecución tampoco hace que sus herramientas estén disponibles para Claude; inicie una sesión nueva para recoger un conector recién agregado.

773* **Cuando alguien archiva o elimina una sesión, o libera su runner desde el menú de la sesión**: no cuentes con el push de [`--push-outcome-on-release`](https://code.claude.com/docs/es/self-hosted-environments-reference#runner-cli-flags). Para guardar los commits en esos casos, haz push de `HEAD` a una rama de rescate desde un [hook `post-session`](https://code.claude.com/docs/es/self-hosted-environments-configuration#post-session). Si partes del ejemplo de esa sección, haz que haga push incluso cuando no haya nada sin commit, porque solo hace push después de un commit de instantánea.774* **Cuando alguien archiva o elimina una sesión, o libera su runner desde el menú de la sesión**: no cuentes con el push de [`--push-outcome-on-release`](https://code.claude.com/docs/es/self-hosted-environments-reference#runner-cli-flags). Para guardar los commits en esos casos, haz push de `HEAD` a una rama de rescate desde un [hook `post-session`](https://code.claude.com/docs/es/self-hosted-environments-configuration#post-session). Si partes del ejemplo de esa sección, haz que haga push incluso cuando no haya nada sin commit, porque solo hace push después de un commit de instantánea.


824 Una vez que el runner esté actualizado o la causa esté corregida, reintenta la sesión o inicia una nueva. Si ninguna de estas comprobaciones encuentra la causa, [reporta un problema](#report-an-issue).825 Una vez que el runner esté actualizado o la causa esté corregida, reintenta la sesión o inicia una nueva. Si ninguna de estas comprobaciones encuentra la causa, [reporta un problema](#report-an-issue).

825 826 

826 Para la fuente a la que la sesión envía resultados, una rama eliminada hace fallar la sesión. Para una fuente de git que la sesión solo lee, el runner omite esa fuente y continúa con las restantes. El runner hace fallar la sesión cuando omitirla la dejaría sin ningún repositorio. Antes de v2.1.228, una sesión así comenzaba en un directorio vacío.827 Para la fuente a la que la sesión envía resultados, una rama eliminada hace fallar la sesión. Para una fuente de git que la sesión solo lee, el runner omite esa fuente y continúa con las restantes. El runner hace fallar la sesión cuando omitirla la dejaría sin ningún repositorio. Antes de v2.1.228, una sesión así comenzaba en un directorio vacío.

828* **Claude Tag a veces no publica su respuesta en Slack**: el recordatorio de respuesta es un [hook que proporciona el plano de control](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#how-each-session’s-config-is-assembled). Confirma con `claude --version` que el runner sea Claude Code v2.1.229 o posterior, ya que los runners más antiguos ignoran los hooks proporcionados; confirma que `python3 --version` funcione dentro de la imagen del runner, ya que los hooks ejecutan `python3`; y confirma que ningún archivo de configuración desactive los hooks, ya sea `disableAllHooks` en `managed-settings.json`, en el `~/.claude/settings.json` del usuario del runner o en el `.claude/settings.json` o `.claude/settings.local.json` del repositorio, o bien `allowManagedHooksOnly` o un [`strictPluginOnlyCustomization`](https://code.claude.com/docs/es/settings-reference#strictpluginonlycustomization) que cubra los hooks en la configuración administrada.

827* **Una sesión comienza sin uno de sus repositorios**: en un runner sin un [hook `checkout`](https://code.claude.com/docs/es/self-hosted-environments-configuration#checkout), el host de git puede rechazar la verificación de acceso del runner para un repositorio que la sesión solo lee. El runner entonces omite ese repositorio, registra una línea `[runner:warn] could not access context source` que nombra el rechazo, e inicia la sesión en los restantes.829* **Una sesión comienza sin uno de sus repositorios**: en un runner sin un [hook `checkout`](https://code.claude.com/docs/es/self-hosted-environments-configuration#checkout), el host de git puede rechazar la verificación de acceso del runner para un repositorio que la sesión solo lee. El runner entonces omite ese repositorio, registra una línea `[runner:warn] could not access context source` que nombra el rechazo, e inicia la sesión en los restantes.

828 830 

829 El runner omite solo un rechazo claro: el host responde que el repositorio no fue encontrado, git no encuentra credenciales para el host, o la autenticación falla. Una falla de red, un tiempo de espera agotado, o un HTTP `403` aún falla el inicio de sesión, al igual que un rechazo para un repositorio al que la sesión envía resultados. El runner aún falla una sesión que omitir dejaría sin repositorio en absoluto. Con [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), el runner omite solo un repositorio que el proxy de git mismo deniega.831 El runner omite solo un rechazo claro: el host responde que el repositorio no fue encontrado, git no encuentra credenciales para el host, o la autenticación falla. Una falla de red, un tiempo de espera agotado, o un HTTP `403` aún falla el inicio de sesión, al igual que un rechazo para un repositorio al que la sesión envía resultados. El runner aún falla una sesión que omitir dejaría sin repositorio en absoluto. Con [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), el runner omite solo un repositorio que el proxy de git mismo deniega.

Details

35 35 

36Instale en el host antes de comenzar:36Instale en el host antes de comenzar:

37 37 

38* **Claude Code v2.1.224 o posterior**, con cualquiera de los [métodos de instalación estándar](https://code.claude.com/docs/es/setup.md). El runner es parte del binario `claude` estándar, y las versiones anteriores no reconocen el subcomando `self-hosted-runner`. Para fijar la versión exacta que ejecuta tu flota, consulta [Instalar una versión específica](https://code.claude.com/docs/es/setup.md#install-a-specific-version). Para imágenes de contenedor, consulta el Dockerfile en [Implementar en producción](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#build-the-runner-image).38* **Claude Code v2.1.224 o posterior**, con cualquiera de los [métodos de instalación estándar](https://code.claude.com/docs/es/setup.md). El runner es parte del binario `claude` estándar, y las versiones anteriores no reconocen el subcomando `self-hosted-runner`. Un runner que atiende sesiones de Claude Tag necesita v2.1.229 o posterior y `python3` en su `PATH`, ya que los [hooks que proporciona el plano de control](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#how-each-session’s-config-is-assembled) para esas sesiones ejecutan `python3`. Para fijar la versión exacta que ejecuta tu flota, consulta [Instalar una versión específica](https://code.claude.com/docs/es/setup.md#install-a-specific-version). Para imágenes de contenedor, consulta el Dockerfile en [Implementar en producción](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#build-the-runner-image).

39* **Git 2.24 o más reciente**. Algunas opciones de git en la página de implementación necesitan versiones más recientes; [Configurar git](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#configure-git) establece cada piso.39* **Git 2.24 o más reciente**. Algunas opciones de git en la página de implementación necesitan versiones más recientes; [Configurar git](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#configure-git) establece cada piso.

40 40 

41Confirme que el host está listo:41Confirme que el host está listo:

Details

52| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | unset | Retire el runner en una marca de tiempo Unix absoluta en segundos, para infraestructura que mata el runner en un tiempo conocido; [Runner lifecycle](https://code.claude.com/docs/es/self-hosted-environments#runner-lifecycle) describe la secuencia de liberación y cómo dimensionar el margen. Los valores antes de 2001 o después del año 5138 son rechazados por el flag e ignorados por la variable de entorno. |52| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | unset | Retire el runner en una marca de tiempo Unix absoluta en segundos, para infraestructura que mata el runner en un tiempo conocido; [Runner lifecycle](https://code.claude.com/docs/es/self-hosted-environments#runner-lifecycle) describe la secuencia de liberación y cómo dimensionar el margen. Los valores antes de 2001 o después del año 5138 son rechazados por el flag e ignorados por la variable de entorno. |

53| `--server-auto-mode-lists <mode>` | `SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS` | `no-allow` | Cuáles de las listas de reglas del clasificador del [modo automático](https://code.claude.com/docs/es/permission-modes.md#eliminate-prompts-with-auto-mode) que el plano de control envía con una sesión pueden llegar a esa sesión: `all`, `no-allow` o `none`. Consulta [Listas de reglas del modo automático](#auto-mode-rule-lists) para ver qué aplica cada valor. Un valor no válido detiene el runner al iniciar. Requiere Claude Code v2.1.295 o posterior. |53| `--server-auto-mode-lists <mode>` | `SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS` | `no-allow` | Cuáles de las listas de reglas del clasificador del [modo automático](https://code.claude.com/docs/es/permission-modes.md#eliminate-prompts-with-auto-mode) que el plano de control envía con una sesión pueden llegar a esa sesión: `all`, `no-allow` o `none`. Consulta [Listas de reglas del modo automático](#auto-mode-rule-lists) para ver qué aplica cada valor. Un valor no válido detiene el runner al iniciar. Requiere Claude Code v2.1.295 o posterior. |

54| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | Cuánto tiempo esperar a que el proceso de Claude salga limpiamente después de que una sesión termina, antes de matarlo por la fuerza. Aumente el valor si los hooks `SessionEnd` propios del hijo necesitan más tiempo. |54| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | Cuánto tiempo esperar a que el proceso de Claude salga limpiamente después de que una sesión termina, antes de matarlo por la fuerza. Aumente el valor si los hooks `SessionEnd` propios del hijo necesitan más tiempo. |

55| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | Libera un slot de sesión si el proceso hijo no ha señalado en el [canal de actividad](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#keep-stdin-and-file-descriptor-3-attached) que se inicializó dentro de N minutos. Los N minutos comienzan al generarse el proceso, después de la clonación, y vuelven a empezar con cada mensaje `user` o `assistant` que el proceso hijo emite antes de haberse inicializado o de haber informado su estado. Antes de v2.1.299, este tiempo de espera dejaba de aplicarse con el primer mensaje de ese tipo de la sesión. Para la liberación después de la señal de inicialización, consulta `--release-idle-session-min`. `0` lo desactiva. |55| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | Cuánto tiempo esperar a un proceso hijo que no se ha inicializado antes de liberar el slot de la sesión. Consulta [Tiempo de espera de inicio de sesión](#session-startup-timeout) para saber dónde empieza el conteo y qué sesiones deja en ejecución. `0` desactiva el tiempo de espera. |

56| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | on | Semilla de confianza persistida para las rutas del repositorio de cada sesión para que `permissions.allow` y `additionalDirectories` comprometidos en el repositorio sean honrados. Establezca `false` para descartar concesiones de permisos comprometidas en el repositorio y configure reglas de permiso en la `settings.json` de la configuración del host en su lugar; la configuración `sandbox.*` comprometida en el repositorio aún se aplica de cualquier forma, que es por qué el [guard de configuración de repositorio](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#harden-your-deployment) los escanea independientemente de este flag. |56| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | on | Semilla de confianza persistida para las rutas del repositorio de cada sesión para que `permissions.allow` y `additionalDirectories` comprometidos en el repositorio sean honrados. Establezca `false` para descartar concesiones de permisos comprometidas en el repositorio y configure reglas de permiso en la `settings.json` de la configuración del host en su lugar; la configuración `sandbox.*` comprometida en el repositorio aún se aplica de cualquier forma, que es por qué el [guard de configuración de repositorio](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#harden-your-deployment) los escanea independientemente de este flag. |

57| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | off | Clona los repositorios de github.com a través del [proxy de git de Anthropic](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#use-the-anthropic-git-proxy) en lugar de la autenticación de git administrada por el cliente. Requiere `--capacity 1` y git 2.32 o posterior; de lo contrario, el runner se niega a iniciar. Reemplaza los flags de reescritura. |57| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | off | Clona los repositorios de github.com a través del [proxy de git de Anthropic](https://code.claude.com/docs/es/self-hosted-environments-deploy.md#use-the-anthropic-git-proxy) en lugar de la autenticación de git administrada por el cliente. Requiere `--capacity 1` y git 2.32 o posterior; de lo contrario, el runner se niega a iniciar. Reemplaza los flags de reescritura. |

58 58 


61* **Flag**: el inicio falla con un error.61* **Flag**: el inicio falla con un error.

62* **Variable de entorno**: el runner fija el valor al techo del temporizador en lugar de rechazarlo.62* **Variable de entorno**: el runner fija el valor al techo del temporizador en lugar de rechazarlo.

63 63 

64### Tiempo de espera de inicio de sesión

65 

66Si una sesión perdió su slot durante un turno como `/code-review`, actualiza el runner y el binario hijo a v2.1.309 o posterior. Desde v2.1.299 hasta v2.1.308, el runner liberaba una sesión, incluso a mitad de turno, una vez que pasaba el tiempo de espera de inicio sin un mensaje `user` o `assistant`.

67 

68Con `--startup-timeout-min <n>`, el runner libera el slot de una sesión cuando su proceso hijo no se ha inicializado dentro de los `<n>` minutos posteriores a la clonación. Durante un turno que comienza antes de que el proceso hijo se inicialice, la sesión conserva su slot hasta que pasan `<n>` minutos sin ninguna línea en el [canal de actividad](https://code.claude.com/docs/es/self-hosted-environments-configuration.md#keep-stdin-and-file-descriptor-3-attached) del proceso hijo. Una vez que el proceso hijo se inicializa, el runner descarta ese conteo y `--release-idle-session-min` rige la liberación. Para limitar una sesión cuyo proceso hijo está vivo pero atascado, establece `--kill-session-after-min`.

69 

64### Listas de reglas del modo automático70### Listas de reglas del modo automático

65 71 

66`--server-auto-mode-lists` te permite decidir qué reglas del clasificador del [modo automático](https://code.claude.com/docs/es/permission-modes.md#eliminate-prompts-with-auto-mode) procedentes de fuera del runner llegan a las sesiones de tus runners. El plano de control de Anthropic puede enviar listas de reglas con una sesión y pedir al runner que las aplique. Algunas entradas pueden ser reglas que escribió un administrador de tu organización. Las listas son `environment`, `soft_deny` y `allow`:72`--server-auto-mode-lists` te permite decidir qué reglas del clasificador del [modo automático](https://code.claude.com/docs/es/permission-modes.md#eliminate-prompts-with-auto-mode) procedentes de fuera del runner llegan a las sesiones de tus runners. El plano de control de Anthropic puede enviar listas de reglas con una sesión y pedir al runner que las aplique. Algunas entradas pueden ser reglas que escribió un administrador de tu organización. Las listas son `environment`, `soft_deny` y `allow`:


374 380 

375#### Unir las métricas de una sesión con las del runner381#### Unir las métricas de una sesión con las del runner

376 382 

377Para colocar las métricas propias de una sesión junto a `claude_code_self_hosted_runner_session_idle_seconds`, haz la unión por el `session_id` del runner:383Para ver cuánto han costado las sesiones inactivas, une la métrica `claude_code_self_hosted_runner_session_idle_seconds` del runner con la métrica de costo de Claude Code por `ccr_session_id`. La métrica del runner no lleva esa etiqueta, así que agrégasela con `label_replace`, como en esta consulta:

384 

385```text theme={null}

386sum by (ccr_session_id) (claude_code_cost_usage_total)

387and on (ccr_session_id)

388label_replace(

389 claude_code_self_hosted_runner_session_idle_seconds > 600,

390 "ccr_session_id", "cse_$1", "session_id", "session_(.*)"

391)

392```

393 

394La consulta devuelve un resultado por cada sesión inactiva durante más de diez minutos: el costo en dólares estadounidenses que su proceso de Claude Code ha contabilizado hasta ahora. Para unir otra métrica de Claude Code, reemplaza `claude_code_cost_usage_total` en la consulta. La consulta funciona con cualquier `--capacity`.

378 395 

379* **Con `--capacity` superior a uno**: haz la unión directamente. En el `/metrics` del runner, las series de la sesión llevan el mismo `session_id` que esa métrica, en formato `session_...`.396* **`session_id`**: en el puerto 9464, esa etiqueta en las métricas de Claude Code contiene el [`session.id`](https://code.claude.com/docs/es/monitoring-usage#standard-attributes) propio de Claude Code, que no coincide con ninguna serie del runner. Una unión por ella no devuelve nada, así que haz la unión por `ccr_session_id`.

380* **Con `--capacity 1`**: haz la unión por un `ccr_session_id` convertido. De forma predeterminada, cada métrica de Claude Code en el puerto 9464 lleva esa etiqueta, que contiene el ID de sesión en formato `cse_...`. En una etiqueta nueva, reemplaza su prefijo `cse_` por `session_` para obtener el `session_id` del runner. El `session_id` propio de la métrica contiene el [`session.id`](https://code.claude.com/docs/es/monitoring-usage#standard-attributes) propio de Claude Code, que no coincide con ninguna serie del runner.397* **Las métricas de Claude Code no tienen `ccr_session_id`**: comprueba que [`OTEL_METRICS_INCLUDE_SESSION_ID`](https://code.claude.com/docs/es/monitoring-usage#metrics-cardinality-control) no esté establecido en `false`

381 398 

382### Semántica del contador del ciclo de vida de la sesión399### Semántica del contador del ciclo de vida de la sesión

383 400 

Details

117| [`gcpAuthRefresh`](#gcpauthrefresh) | Actualiza las [credenciales de Google Cloud](https://code.claude.com/docs/es/google-vertex-ai.md#advanced-credential-configuration) con tu propio comando | Autenticación y proveedores | Any file |117| [`gcpAuthRefresh`](#gcpauthrefresh) | Actualiza las [credenciales de Google Cloud](https://code.claude.com/docs/es/google-vertex-ai.md#advanced-credential-configuration) con tu propio comando | Autenticación y proveedores | Any file |

118| [`hooks`](#hooks) | Ejecuta tus propios comandos como [hooks](https://code.claude.com/docs/es/hooks.md) en distintos puntos del ciclo de vida de Claude Code | Hooks y automatización | Any file |118| [`hooks`](#hooks) | Ejecuta tus propios comandos como [hooks](https://code.claude.com/docs/es/hooks.md) en distintos puntos del ciclo de vida de Claude Code | Hooks y automatización | Any file |

119| [`httpHookAllowedEnvVars`](#httphookallowedenvvars) | Limita qué variables de entorno pueden poner los [hooks HTTP](https://code.claude.com/docs/es/hooks.md) en los encabezados | Hooks y automatización | Any file |119| [`httpHookAllowedEnvVars`](#httphookallowedenvvars) | Limita qué variables de entorno pueden poner los [hooks HTTP](https://code.claude.com/docs/es/hooks.md) en los encabezados | Hooks y automatización | Any file |

120| [`idleCompaction`](#idlecompaction) | Impide que Claude Code compacte una conversación larga mientras tu sesión de terminal está inactiva | Memoria y contexto | Any file |120| [`idleCompaction`](#idlecompaction) | Impide que Claude Code compacte una conversación larga de la que te alejaste | Memoria y contexto | Any file |

121| [`includeCoAuthoredBy`](#includecoauthoredby) | Obsoleto; usa `attribution` para ocultar o cambiar la atribución de commits y PR | Git y atribución | Any file |121| [`includeCoAuthoredBy`](#includecoauthoredby) | Obsoleto; usa `attribution` para ocultar o cambiar la atribución de commits y PR | Git y atribución | Any file |

122| [`includeGitInstructions`](#includegitinstructions) | Elimina del contexto de Claude las instrucciones integradas de commits y PR | Git y atribución | Any file |122| [`includeGitInstructions`](#includegitinstructions) | Elimina del contexto de Claude las instrucciones integradas de commits y PR | Git y atribución | Any file |

123| [`inputNeededNotifEnabled`](#inputneedednotifenabled) | Recibe una [notificación push](https://code.claude.com/docs/es/remote-control.md#mobile-push-notifications) cuando Claude esté esperándote | Remoto, escritorio y notificaciones | Any file |123| [`inputNeededNotifEnabled`](#inputneedednotifenabled) | Recibe una [notificación push](https://code.claude.com/docs/es/remote-control.md#mobile-push-notifications) cuando Claude esté esperándote | Remoto, escritorio y notificaciones | Any file |


1229En una plataforma que el sandbox no admite, Claude Code no se inicia con esta clave activada. Consulta [Aplicar el sandboxing con configuración administrada](https://code.claude.com/docs/es/sandboxing.md#enforce-sandboxing-with-managed-settings).1229En una plataforma que el sandbox no admite, Claude Code no se inicia con esta clave activada. Consulta [Aplicar el sandboxing con configuración administrada](https://code.claude.com/docs/es/sandboxing.md#enforce-sandboxing-with-managed-settings).

1230 1230 

1231* **Scope**: [`Any file`](#scopes), con [límites en la configuración de proyecto y local](https://code.claude.com/docs/es/sandboxing.md#repository-settings-under-an-admin-required-sandbox)1231* **Scope**: [`Any file`](#scopes), con [límites en la configuración de proyecto y local](https://code.claude.com/docs/es/sandboxing.md#repository-settings-under-an-admin-required-sandbox)

1232* **Type**: Boolean1232* **Tipo**: booleano

1233 * `true`: Claude Code sale con un error al inicio cuando `sandbox.enabled` es `true` pero el sandbox no puede iniciarse1233 * `true`: Claude Code termina con un error al iniciarse cuando `sandbox.enabled` es `true` pero el sandbox no puede iniciarse. Si el sandbox supera esa comprobación y luego no logra inicializarse, la sesión sigue en ejecución y Claude Code [rechaza cada comando en el sandbox](https://code.claude.com/docs/es/sandboxing.md#commands-refused-with-sandbox-is-required)

1234 * `false`: Claude Code ejecuta los comandos sin sandbox cuando el sandbox no puede iniciarse1234 * `false`: Claude Code ejecuta los comandos sin sandbox cuando el sandbox no puede iniciarse

1235* **Default**: `false`1235* **Default**: `false`

1236 1236 

1237Esto hace que cada máquina administrada ejecute los comandos en sandbox o se niegue a iniciarse:1237Esto activa el sandbox en las máquinas administradas y establece `failIfUnavailable` en `true`:

1238 1238 

1239```json managed-settings.json theme={null}1239```json managed-settings.json theme={null}

1240{1240{


2415 2415 

2416### `idleCompaction`2416### `idleCompaction`

2417 2417 

2418La compactación en inactividad [compacta](https://code.claude.com/docs/es/context-window.md#what-survives-compaction) una conversación larga de la que te has alejado, poco antes de que expire su caché de prompts. Así, tu siguiente mensaje envía un resumen en lugar de la conversación completa. Cuando regresas, la conversación muestra una línea que comienza con `Compacted while idle, before the prompt cache expired`.2418La compactación en inactividad [compacta](https://code.claude.com/docs/es/context-window.md#what-survives-compaction) una conversación larga de la que te has alejado. Así, tu siguiente mensaje envía un resumen en lugar de la conversación completa. Una vez compactada, la conversación muestra un aviso:

2419 

2420* **Terminal**: una línea que comienza con `Compacted while idle, before the prompt cache expired`

2421* **[Panel de chat de VS Code](#idle-compaction-in-vs-code-and-the-desktop-app)**: un aviso que incluye `a summary written while you were away`

2422* **[Aplicación de escritorio](#idle-compaction-in-vs-code-and-the-desktop-app)**: el mismo aviso, dentro de una fila cuya etiqueta incluye `Claude Code notice`. Si no ves esa fila o su texto, cambia al [modo de vista Verbose](https://code.claude.com/docs/es/desktop.md#switch-view-modes).

2419 2423 

2420La compactación en inactividad está activada de forma predeterminada para las conversaciones que cumplen todas estas condiciones:2424La compactación en inactividad está activada de forma predeterminada para las conversaciones que cumplen todas estas condiciones:

2421 2425 

2422* **Sesión**: estás en una sesión interactiva de terminal2426* **Sesión**: estás en una sesión interactiva de terminal, o en el panel de chat de la extensión de VS Code o en la pestaña Code de la aplicación de escritorio con una [cuenta que Anthropic selecciona](#idle-compaction-in-vs-code-and-the-desktop-app)

2423* **Compactación automática**: [`autoCompactEnabled`](#autocompactenabled) está activado2427* **Compactación automática**: [`autoCompactEnabled`](#autocompactenabled) está activado

2424* **Caché de prompts**: la conversación usa el [TTL de una hora de la caché de prompts](https://code.claude.com/docs/es/prompt-caching.md#which-ttl-each-request-gets)2428* **Caché de prompts**: la conversación usa el [TTL de una hora de la caché de prompts](https://code.claude.com/docs/es/prompt-caching.md#which-ttl-each-request-gets)

2425* **Flags de funciones**: Claude Code puede [obtener flags de funciones de Anthropic](https://code.claude.com/docs/es/env-vars.md#features-that-need-feature-flag-fetching)2429* **Flags de funciones**: Claude Code puede [obtener flags de funciones de Anthropic](https://code.claude.com/docs/es/env-vars.md#features-that-need-feature-flag-fetching)


2441}2445}

2442```2446```

2443 2447 

2444Para desactivar o activar la compactación en inactividad desde dentro de una sesión, ejecuta `/config` y cambia la fila **Idle compaction**. Tu elección se guarda en tu configuración de usuario y se aplica de inmediato. La fila requiere Claude Code v2.1.302 o posterior. Si ejecutas una de esas versiones y `/config` no muestra la fila, revisa estas causas:2448Para desactivar o activar la compactación en inactividad desde dentro de una sesión de terminal, ejecuta `/config` y cambia la fila **Idle compaction**. Tu elección se guarda en tu configuración de usuario y se aplica de inmediato. La fila requiere Claude Code v2.1.302 o posterior. Si ejecutas una de esas versiones y `/config` no muestra la fila, revisa estas causas:

2445 2449 

2446* **Otra fuente de configuración establece la clave**: un valor en la configuración administrada, el flag `--settings` o un archivo de configuración del proyecto o local sobrescribe tu configuración de usuario. Cambia la clave en esa fuente2450* **Otra fuente de configuración establece la clave**: un valor en la configuración administrada, el flag `--settings` o un archivo de configuración del proyecto o local sobrescribe tu configuración de usuario. Cambia la clave en esa fuente

2447* **Los flags de funciones no están disponibles**: donde Claude Code no puede [obtener flags de funciones de Anthropic](https://code.claude.com/docs/es/env-vars.md#features-that-need-feature-flag-fetching), la compactación en inactividad no se ejecuta, así que no hay nada que desactivar2451* **Los flags de funciones no están disponibles**: donde Claude Code no puede [obtener flags de funciones de Anthropic](https://code.claude.com/docs/es/env-vars.md#features-that-need-feature-flag-fetching), la compactación en inactividad no se ejecuta, así que no hay nada que desactivar


2462}2466}

2463```2467```

2464 2468 

2469#### Compactación en inactividad en VS Code y la aplicación de escritorio

2470 

2471Un aviso como este significa que Claude Code [reemplazó tu conversación anterior por un resumen](https://code.claude.com/docs/es/context-window.md#what-survives-compaction) a partir del cual Claude trabaja ahora:

2472 

2473```text theme={null}

2474Compacted using a summary written while you were away · turn off with "idleCompaction": false in settings.json

2475```

2476 

2477No necesitas hacer nada. Para desactivar la compactación en inactividad, establece `idleCompaction` en `false` en `~/.claude/settings.json` o en otro [archivo de configuración](https://code.claude.com/docs/es/settings.md#settings-files-and-who-they-affect).

2478 

2479En el panel de chat de la extensión de VS Code y en la pestaña Code de la aplicación de escritorio, la compactación en inactividad se ejecuta para las cuentas que Anthropic selecciona. Claude Code escribe el resumen mientras no estás, y luego compacta con él solo si tu siguiente mensaje llega una hora o más después de la última solicitud.

2480 

2465### `plansDirectory`2481### `plansDirectory`

2466 2482 

2467Elige dónde Claude Code almacena los archivos de plan que escribe en [modo plan](https://code.claude.com/docs/es/permission-modes.md#analyze-before-you-edit-with-plan-mode). Claude Code resuelve la ruta de forma relativa a la raíz del proyecto.2483Elige dónde Claude Code almacena los archivos de plan que escribe en [modo plan](https://code.claude.com/docs/es/permission-modes.md#analyze-before-you-edit-with-plan-mode). Claude Code resuelve la ruta de forma relativa a la raíz del proyecto.


3522 3538 

3523* **Se ejecutan hooks administrados y SDK**: hooks de configuración administrada y hooks que el [Agent SDK](https://code.claude.com/docs/es/agent-sdk/overview.md) registra en proceso3539* **Se ejecutan hooks administrados y SDK**: hooks de configuración administrada y hooks que el [Agent SDK](https://code.claude.com/docs/es/agent-sdk/overview.md) registra en proceso

3524* **Se ejecutan hooks de plugins forzados a habilitarse**: hooks de plugins que tu configuración administrada fuerza a habilitar a través de [`enabledPlugins`](#enabledplugins). Claude Code coincide con el ID completo `plugin@marketplace`, por lo que un plugin con el mismo nombre de un marketplace diferente permanece bloqueado. Esto te permite distribuir hooks verificados a través de un marketplace de organización mientras bloqueas todo lo demás. Un [mod](https://code.claude.com/docs/es/plugins/mods/overview.md) en tal plugin se carga solo cuando [cuenta como el de tu organización](https://code.claude.com/docs/es/plugins/mods/admin.md#install-your-organizations-mods)3540* **Se ejecutan hooks de plugins forzados a habilitarse**: hooks de plugins que tu configuración administrada fuerza a habilitar a través de [`enabledPlugins`](#enabledplugins). Claude Code coincide con el ID completo `plugin@marketplace`, por lo que un plugin con el mismo nombre de un marketplace diferente permanece bloqueado. Esto te permite distribuir hooks verificados a través de un marketplace de organización mientras bloqueas todo lo demás. Un [mod](https://code.claude.com/docs/es/plugins/mods/overview.md) en tal plugin se carga solo cuando [cuenta como el de tu organización](https://code.claude.com/docs/es/plugins/mods/admin.md#install-your-organizations-mods)

3541* **Los monitores de otros plugins están bloqueados**: los [monitores](https://code.claude.com/docs/es/plugins/components.md#monitors) de un plugin no se inician a menos que el plugin esté forzado a habilitarse. Requiere Claude Code v2.1.310 o posterior

3525* **Todo lo demás está bloqueado**: hooks de usuario, proyecto y locales, hooks y mods de otros plugins instalados, y hooks declarados en frontmatter de agente. [Los mods integrados en Claude Code](https://code.claude.com/docs/es/plugins/mods/overview.md#mods-built-into-claude-code) continúan ejecutándose. Para bloquear solo los mods de los usuarios, establece [`allowManagedModsOnly`](https://code.claude.com/docs/es/plugins/mods/admin#set-options-on-the-built-in-guard) en su lugar.3542* **Todo lo demás está bloqueado**: hooks de usuario, proyecto y locales, hooks y mods de otros plugins instalados, y hooks declarados en frontmatter de agente. [Los mods integrados en Claude Code](https://code.claude.com/docs/es/plugins/mods/overview.md#mods-built-into-claude-code) continúan ejecutándose. Para bloquear solo los mods de los usuarios, establece [`allowManagedModsOnly`](https://code.claude.com/docs/es/plugins/mods/admin#set-options-on-the-built-in-guard) en su lugar.

3526* **Los plugins con origen de comando están deshabilitados**: Claude Code también deshabilita plugins con un [origen `command`](https://code.claude.com/docs/es/plugins/marketplace-reference#command-plugin-source), incluidos plugins forzados a habilitarse en `enabledPlugins` administrado, a menos que establezcas [`disableCommandPluginSources`](#disablecommandpluginsources) explícitamente en `false`3543* **Los plugins con origen de comando están deshabilitados**: Claude Code también deshabilita plugins con un [origen `command`](https://code.claude.com/docs/es/plugins/marketplace-reference#command-plugin-source), incluidos plugins forzados a habilitarse en `enabledPlugins` administrado, a menos que establezcas [`disableCommandPluginSources`](#disablecommandpluginsources) explícitamente en `false`

3527* **Los comandos `headersHelper` del marketplace están bloqueados**: Claude Code también bloquea los comandos [`headersHelper`](https://code.claude.com/docs/es/plugins/host-marketplace#authenticate-archive-downloads) del marketplace a menos que [`disableCommandPluginSources`](#disablecommandpluginsources) esté explícitamente establecido en `false`, excepto para un marketplace que la configuración administrada declara. Requiere Claude Code v2.1.238 o posterior3544* **Los comandos `headersHelper` del marketplace están bloqueados**: Claude Code también bloquea los comandos [`headersHelper`](https://code.claude.com/docs/es/plugins/host-marketplace#authenticate-archive-downloads) del marketplace a menos que [`disableCommandPluginSources`](#disablecommandpluginsources) esté explícitamente establecido en `false`, excepto para un marketplace que la configuración administrada declara. Requiere Claude Code v2.1.238 o posterior

statusline.md +1 −1

Details

380* `used_percentage` y `resets_at`: llegan con cada respuesta, por lo que están presentes siempre que `spend_limit` lo esté. `used_percentage` va de 0 a 100, o por encima de 100 una vez que excedas el límite, y `resets_at` son los segundos de época Unix cuando se reinicia el período del límite.380* `used_percentage` y `resets_at`: llegan con cada respuesta, por lo que están presentes siempre que `spend_limit` lo esté. `used_percentage` va de 0 a 100, o por encima de 100 una vez que excedas el límite, y `resets_at` son los segundos de época Unix cuando se reinicia el período del límite.

381* `used_usd`, `limit_usd` y `period`: tu gasto estimado hasta el momento y tu límite en dólares estadounidenses, y el período que cubre el límite, uno de `daily`, `weekly` o `monthly`. El gateway [calcula `used_usd` a partir de los conteos de tokens](https://code.claude.com/docs/es/claude-apps-gateway-spend-limits#how-requests-are-priced), por lo que es una estimación y no un monto facturado. Claude Code los lee del gateway en una solicitud separada, aproximadamente cada cinco minutos mientras envías solicitudes. Los montos en dólares pueden tener unos cinco minutos más de antigüedad que `used_percentage`, por lo que ambos pueden no coincidir brevemente. Requiere v2.1.284 o posterior tanto en Claude Code como en el gateway.381* `used_usd`, `limit_usd` y `period`: tu gasto estimado hasta el momento y tu límite en dólares estadounidenses, y el período que cubre el límite, uno de `daily`, `weekly` o `monthly`. El gateway [calcula `used_usd` a partir de los conteos de tokens](https://code.claude.com/docs/es/claude-apps-gateway-spend-limits#how-requests-are-priced), por lo que es una estimación y no un monto facturado. Claude Code los lee del gateway en una solicitud separada, aproximadamente cada cinco minutos mientras envías solicitudes. Los montos en dólares pueden tener unos cinco minutos más de antigüedad que `used_percentage`, por lo que ambos pueden no coincidir brevemente. Requiere v2.1.284 o posterior tanto en Claude Code como en el gateway.

382 382 

383Trata `used_usd`, `limit_usd` y `period` como opcionales incluso cuando `spend_limit` esté presente. Tu script recibe el porcentaje antes que ellos, y permanecen ausentes si estableces `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`, que desactiva esa solicitud. Lee cada uno con un valor de respaldo en tu script, como `jq -r '.rate_limits.spend_limit.used_usd // empty'`.383Trata `used_usd`, `limit_usd` y `period` como opcionales incluso cuando `spend_limit` esté presente, porque tu script recibe el porcentaje antes que ellos. Lee cada uno con un valor de respaldo en tu script, como `jq -r '.rate_limits.spend_limit.used_usd // empty'`. Antes de Claude Code v2.1.295, permanecían ausentes si establecías `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`, que desactivaba esa solicitud.

384 384 

385### Campos de prompt cache385### Campos de prompt cache

386 386 

sub-agents.md +1 −1

Details

600| `default` | Modo Manual: solicita permiso |600| `default` | Modo Manual: solicita permiso |

601| `acceptEdits` | Aceptar automáticamente ediciones de archivo y comandos comunes del sistema de archivos para rutas en el directorio de trabajo o `additionalDirectories` |601| `acceptEdits` | Aceptar automáticamente ediciones de archivo y comandos comunes del sistema de archivos para rutas en el directorio de trabajo o `additionalDirectories` |

602| `auto` | [Modo auto](https://code.claude.com/docs/es/permission-modes.md#eliminate-prompts-with-auto-mode): un clasificador de fondo revisa comandos y escrituras de directorio protegido |602| `auto` | [Modo auto](https://code.claude.com/docs/es/permission-modes.md#eliminate-prompts-with-auto-mode): un clasificador de fondo revisa comandos y escrituras de directorio protegido |

603| `dontAsk` | Deniega automáticamente las llamadas que pedirían permiso, aunque un [mod](https://code.claude.com/docs/es/plugins/mods/overview.md) que instalaste aún puede aprobar [algunas de esas llamadas](https://code.claude.com/docs/es/permissions.md#precedence-among-rules-hooks-and-mods). Las herramientas permitidas explícitamente siguen funcionando. `AskUserQuestion`, las herramientas MCP marcadas con [`requiresUserInteraction`](https://code.claude.com/docs/es/mcp#require-approval-for-a-specific-tool), las [lecturas desde rutas de red](https://code.claude.com/docs/es/permissions.md#network-paths) y las herramientas de conectores [que tu organización estableció en `ask`](https://code.claude.com/docs/es/mcp#organization-controls-on-connector-tools), en sesiones donde ese ajuste llega a Claude Code, se deniegan incluso si las has permitido |603| `dontAsk` | Deniega automáticamente las llamadas que pedirían permiso, aunque un [mod](https://code.claude.com/docs/es/plugins/mods/overview.md) que instalaste aún puede aprobar [algunas de esas llamadas](https://code.claude.com/docs/es/permissions.md#precedence-among-rules-hooks-and-mods). Las herramientas permitidas explícitamente siguen funcionando. `AskUserQuestion`, las herramientas MCP marcadas con [`requiresUserInteraction`](https://code.claude.com/docs/es/mcp#require-approval-for-a-specific-tool), las [lecturas desde rutas de red](https://code.claude.com/docs/es/permissions.md#network-paths) y las herramientas de conectores [que tu organización estableció en `ask`](https://code.claude.com/docs/es/mcp#organization-controls-on-connector-tools) en sesiones donde ese ajuste llega a Claude Code se deniegan incluso si las has permitido |

604| `bypassPermissions` | [Omitir solicitudes de permiso](https://code.claude.com/docs/es/permission-modes.md#skip-all-checks-with-bypasspermissions-mode). Un subagente se ejecuta en este modo solo cuando la conversación principal lo hace |604| `bypassPermissions` | [Omitir solicitudes de permiso](https://code.claude.com/docs/es/permission-modes.md#skip-all-checks-with-bypasspermissions-mode). Un subagente se ejecuta en este modo solo cuando la conversación principal lo hace |

605| `plan` | Modo plan (exploración de solo lectura) |605| `plan` | Modo plan (exploración de solo lectura) |

606 606 

Details

121* **Sesión en segundo plano**: una [sesión en segundo plano](https://code.claude.com/docs/es/agent-view.md) no reporta su estado a tu terminal, incluso mientras estás conectado a ella. La vista de agentes muestra su estado en su lugar.121* **Sesión en segundo plano**: una [sesión en segundo plano](https://code.claude.com/docs/es/agent-view.md) no reporta su estado a tu terminal, incluso mientras estás conectado a ella. La vista de agentes muestra su estado en su lugar.

122* **[`CLAUDE_CODE_DISABLE_TERMINAL_TITLE`](https://code.claude.com/docs/es/env-vars#variables)**: si estableces esta variable en `1`, Claude Code no comprueba la compatibilidad ni reporta el estado. Elimínala.122* **[`CLAUDE_CODE_DISABLE_TERMINAL_TITLE`](https://code.claude.com/docs/es/env-vars#variables)**: si estableces esta variable en `1`, Claude Code no comprueba la compatibilidad ni reporta el estado. Elimínala.

123 123 

124El título de la pestaña no comienza con un glifo de estado en una terminal que reporta compatibilidad con el protocolo. La propia terminal muestra el estado de la sesión, por lo que Claude Code omite el glifo que coloca delante del título en otras terminales.

125 

124## Configurar tmux126## Configurar tmux

125 127 

126Cuando Claude Code se ejecuta dentro de tmux, por defecto Shift+Enter envía en lugar de insertar una nueva línea, y las notificaciones de escritorio y la [barra de progreso](https://code.claude.com/docs/es/settings-reference.md#terminalprogressbarenabled) nunca llegan a la terminal externa. Agregue estas líneas a `~/.tmux.conf`, luego ejecute `tmux source-file ~/.tmux.conf` para aplicarlas al servidor en ejecución:128Cuando Claude Code se ejecuta dentro de tmux, por defecto Shift+Enter envía en lugar de insertar una nueva línea, y las notificaciones de escritorio y la [barra de progreso](https://code.claude.com/docs/es/settings-reference.md#terminalprogressbarenabled) nunca llegan a la terminal externa. Agregue estas líneas a `~/.tmux.conf`, luego ejecute `tmux source-file ~/.tmux.conf` para aplicarlas al servidor en ejecución:

Details

258 258 

259Un archivo que cambió en el disco después de que Claude lo leyó por última vez aún puede editarse cuando `old_string` coincide exactamente con el contenido actual de forma inequívoca y Claude Code puede leer el archivo sin solicitar permiso. La coincidencia con el contenido actual del archivo mantiene esto seguro, y el resultado indica que el archivo contiene otros cambios para que Claude lo vuelva a leer antes de ediciones que dependan del contenido circundante. En cualquier otro caso, como un `old_string` obsoleto o uno que coincida más de una vez sin `replace_all`, Claude lee el archivo nuevamente antes de editar.259Un archivo que cambió en el disco después de que Claude lo leyó por última vez aún puede editarse cuando `old_string` coincide exactamente con el contenido actual de forma inequívoca y Claude Code puede leer el archivo sin solicitar permiso. La coincidencia con el contenido actual del archivo mantiene esto seguro, y el resultado indica que el archivo contiene otros cambios para que Claude lo vuelva a leer antes de ediciones que dependan del contenido circundante. En cualquier otro caso, como un `old_string` obsoleto o uno que coincida más de una vez sin `replace_all`, Claude lee el archivo nuevamente antes de editar.

260 260 

261Claude también puede editar un archivo sin un Read por separado después de verlo con un comando Bash como `cat` o `grep`. Esos comandos son `cat`, `nl`, `bat`, `batcat`, `head`, `tail`, `sed -n 'X,Yp'`, `grep`, `egrep`, `fgrep` y `rg`, cada uno ejecutado en un único archivo sin tuberías ni redirecciones. Una búsqueda que no imprime coincidencias no cuenta como lectura, ni tampoco ningún comando fuera de esta lista.261Claude también puede editar un archivo sin un Read por separado después de verlo con un comando Bash como `cat` o `grep`. Esos comandos son `cat`, `nl`, `bat`, `batcat`, `head`, `tail`, `sed -n 'X,Yp'`, `grep`, `egrep`, `fgrep` y `rg`, cada uno ejecutado en un único archivo sin tuberías ni redirecciones. Si el comando no imprimió nada del texto del archivo, como cuando una búsqueda no encuentra coincidencias, la comprobación read-before-edit sigue aplicándose.

262 262 

263Cuando Claude ve un archivo de esta manera, Claude Code también carga cualquier [`CLAUDE.md` de subdirectorio](https://code.claude.com/docs/es/memory#how-claude-md-files-load) y las [reglas con alcance de ruta](https://code.claude.com/docs/es/memory.md#path-specific-rules) que se apliquen a ese archivo. Consulta [Reglas de permisos Read y Edit](https://code.claude.com/docs/es/permissions.md#read-and-edit) para saber qué comandos Bash cubren tus reglas de denegación `Read` y `Edit`.263Cuando Claude ve un archivo de esta manera, Claude Code también carga cualquier [`CLAUDE.md` de subdirectorio](https://code.claude.com/docs/es/memory#how-claude-md-files-load) y las [reglas con alcance de ruta](https://code.claude.com/docs/es/memory.md#path-specific-rules) que se apliquen a ese archivo. Consulta [Reglas de permisos Read y Edit](https://code.claude.com/docs/es/permissions.md#read-and-edit) para saber qué comandos Bash cubren tus reglas de denegación `Read` y `Edit`.

264 264 


383 383 

384La [fuente WebSocket](#websocket-source) tiene su propia solicitud de aprobación, que el clasificador también decide en modo automático.384La [fuente WebSocket](#websocket-source) tiene su propia solicitud de aprobación, que el clasificador también decide en modo automático.

385 385 

386La herramienta no está disponible en Amazon Bedrock, en Agent Platform de Google Cloud ni en Microsoft Foundry. Tampoco está disponible cuando se establece `DISABLE_TELEMETRY` o `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`. En Windows, la herramienta solo está disponible cuando [Git Bash](https://code.claude.com/docs/es/setup.md#set-up-on-windows) está instalado.386Monitor requiere una versión mínima o Git Bash en estos casos:

387 

388* **Versión mínima**: en Amazon Bedrock, Claude Platform on AWS, Agent Platform de Google Cloud o Microsoft Foundry, o cuando se establece `DISABLE_TELEMETRY` o `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`, Monitor requiere Claude Code v2.1.310 o posterior. El requisito se aplica cuando la [obtención de feature flags](https://code.claude.com/docs/es/env-vars.md#features-that-need-feature-flag-fetching) está desactivada

389* **Windows**: la herramienta solo está disponible cuando [Git Bash](https://code.claude.com/docs/es/setup.md#set-up-on-windows) está instalado

387 390 

388Los plugins pueden declarar monitores que se inician automáticamente cuando el plugin está activo, en lugar de pedirle a Claude que los inicie. Consulta [monitores de plugins](https://code.claude.com/docs/es/plugins/components.md#monitors).391Los plugins pueden declarar monitores que se inician automáticamente cuando el plugin está activo, en lugar de pedirle a Claude que los inicie. Consulta [monitores de plugins](https://code.claude.com/docs/es/plugins/components.md#monitors).

389 392 

Details

177 177 

178**1. Abre la vista de diff**178**1. Abre la vista de diff**

179 179 

180Un indicador de diff muestra líneas agregadas y eliminadas en toda la sesión, por ejemplo `+42 -18`. Selecciónalo para abrir la vista de diff, con una lista de archivos a la izquierda y cambios a la derecha.180Después de que Claude sube sus cambios a una rama, la tarjeta **Cambios** en el panel junto al chat muestra las líneas agregadas y eliminadas en toda la sesión, por ejemplo `+42 -18`. Haz clic en esos conteos para abrir la vista de diff.

181 

182* También puedes hacer clic en **Cambios** en la barra de título de la sesión, o en el menú **⋮** de la barra.

183* Para mostrar el panel cuando está oculto, haz clic en el ícono **Mostrar panel de la sesión** en la barra de título de la sesión, o en el menú **⋮** de la barra.

181 184 

182El diff compara los cambios de la sesión contra su rama base de forma predeterminada. Para comparar contra una rama diferente, selecciona **Comparar contra** y elige una.185El diff compara los cambios de la sesión contra su rama base de forma predeterminada. Para comparar contra una rama diferente, selecciona **Comparar contra** y elige una.

183 186 

184**2. Deja comentarios en línea**187**2. Deja comentarios en línea**

185 188 

186Selecciona cualquier línea en el diff, escribe tu comentario y presiona Enter. Los comentarios se colan hasta que envíes tu siguiente mensaje, luego se agrupan con él. Claude ve "en `src/auth.ts:47`, no captures el error aquí" junto a tu instrucción principal, por lo que no tienes que describir dónde está el problema.189Selecciona cualquier línea en el diff, escribe tu comentario y presiona Enter. Los comentarios se ponen en cola hasta que envíes tu siguiente mensaje, luego se agrupan con él. Claude ve "en `src/auth.ts:47`, no captures el error aquí" junto a tu instrucción principal, por lo que no tienes que describir dónde está el problema.

190 

191**3. Crea un pull request**

187 192 

188**3. Crea una solicitud de extracción**193Cuando el diff se vea bien, [vuelve a mostrar el panel](https://code.claude.com/docs/es/claude-code-on-the-web.md#review-changes) si la tarjeta **Cambios** no está visible, luego crea un pull request o un borrador desde la tarjeta:

189 194 

190Cuando el diff se vea bien, selecciona **Crear PR** en la parte superior de la vista de diff. Puedes abrirlo como un PR completo, un borrador, o ir a la página de composición de GitHub con un título y descripción generados.195* Haz clic en **Crear PR**. Claude Code crea el pull request con un título y una descripción generados.

196* Para abrir un borrador en su lugar, haz clic derecho en **Crear PR**, selecciona **Crear PR borrador** para cambiar lo que hace el botón y luego haz clic en el botón

191 197 

192**4. Continúa iterando después del PR**198**4. Continúa iterando después del PR**

193 199 

194La sesión permanece activa después de que se crea el PR. Pega la salida de falla de CI o comentarios del revisor en el chat y pide a Claude que los aborde. Para que Claude monitoree el PR automáticamente, consulta [Corregir automáticamente solicitudes de extracción](https://code.claude.com/docs/es/claude-code-on-the-web.md#auto-fix-pull-requests).200La sesión permanece activa después de que se crea el PR. Pega la salida de falla de CI o comentarios del revisor en el chat y pide a Claude que los aborde. Para que Claude monitoree el PR automáticamente, consulta [Corregir automáticamente pull requests](https://code.claude.com/docs/es/claude-code-on-the-web.md#auto-fix-pull-requests).

195 201 

196## Soluciona problemas de configuración202## Soluciona problemas de configuración

197 203