6 6
7> Referencia completa de los mods de Claude Code: estructura del módulo de hooks, eventos, métodos de la API de mods, puntos de renderizado, elementos por superficie, límites y configuración.7> Referencia completa de los mods de Claude Code: estructura del módulo de hooks, eventos, métodos de la API de mods, puntos de renderizado, elementos por superficie, límites y configuración.
8 8
9Consulta cualquier evento que un [mod](/docs/es/plugins/mods/overview.md) puede manejar, cualquier método de la API de mods que puede llamar o cualquier punto de renderizado en el que puede dibujar. Las entradas cubren la CLI de Claude Code y la app de escritorio a partir de la v2.1.290, y la extensión de VS Code a partir de la v2.1.299. Cada entrada indica el nombre y una descripción de una línea, y enlaza a la sección de la guía que lo explica cuando existe.9Consulta cualquier evento que un [mod](https://code.claude.com/docs/es/plugins/mods/overview.md) puede manejar, cualquier método de la API de mods que puede llamar o cualquier punto de renderizado en el que puede dibujar. Las entradas cubren la CLI de Claude Code y la app de escritorio a partir de la v2.1.290, y la extensión de VS Code a partir de la v2.1.299. Cada entrada indica el nombre y una descripción de una línea, y enlaza a la sección de la guía que lo explica cuando existe.
10 10
11> [!NOTE]11> [!NOTE]
12>12>
13> La referencia completa son las [declaraciones de TypeScript para mods](https://github.com/anthropics/claude-code/blob/main/mods/types/claude-code.d.ts) de Claude Code, que describen cada evento, método y elemento, con ejemplos. La copia en GitHub puede ser más antigua que la versión de Claude Code que tienes instalada. Cuando ambas no coincidan, confía en [la copia que Claude Code escribe para tu versión](/docs/es/plugins/mods/create.md#get-the-types-for-your-build).13> La referencia completa son las [declaraciones de TypeScript para mods](https://github.com/anthropics/claude-code/blob/main/mods/types/claude-code.d.ts) de Claude Code, que describen cada evento, método y elemento, con ejemplos. La copia en GitHub puede ser más antigua que la versión de Claude Code que tienes instalada. Cuando ambas no coincidan, confía en [la copia que Claude Code escribe para tu versión](https://code.claude.com/docs/es/plugins/mods/create.md#get-the-types-for-your-build).
14 14
15## Archivos15## Archivos
16 16
18 18
19| Archivo | Obligatorio | Contenido |19| Archivo | Obligatorio | Contenido |
20| :- | :- | :- |20| :- | :- | :- |
21| `.claude-plugin/plugin.json` | Sí | El [manifiesto](/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](/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`](/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`](/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), 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 |
25| Archivos cuyos nombres terminan en `.test.ts` o `.test.tsx` | No | Pruebas que ejecuta [`claude plugin test`](/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`](/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.
28 28
29## La función del hook29## La función del hook
30 30
31Un mod registra cada uno de sus hooks, que son controladores de eventos, llamando a `on` dentro de `register`. `on` recibe el nombre del evento, un [matcher](/docs/es/plugins/mods/events.md#filter-which-events-a-hook-handles) opcional, que es un filtro sobre los campos del evento, y el hook, como en `on('tool.call', { tool: 'Bash' }, async ($, e, next) => next(e))`. `on` devuelve un registro con un método, `.catch(handler)`, que establece el [controlador de errores](/docs/es/plugins/mods/events.md#handle-a-hook-that-fails) del hook.31Un mod registra cada uno de sus hooks, que son controladores de eventos, llamando a `on` dentro de `register`. `on` recibe el nombre del evento, un [matcher](https://code.claude.com/docs/es/plugins/mods/events.md#filter-which-events-a-hook-handles) opcional, que es un filtro sobre los campos del evento, y el hook, como en `on('tool.call', { tool: 'Bash' }, async ($, e, next) => next(e))`. `on` devuelve un registro con un método, `.catch(handler)`, que establece el [controlador de errores](https://code.claude.com/docs/es/plugins/mods/events.md#handle-a-hook-that-fails) del hook.
32 32
33| Argumento | Qué es |33| Argumento | Qué es |
34| :- | :- |34| :- | :- |
35| [`$`](/docs/es/plugins/mods/events#how-a-hook-handles-an-event) | La API de mods: todos los métodos de [métodos de la API de mods](#mods-api-methods). Escribe cada llamada completa, primero el espacio de nombres y luego el método, como en `$.fs.read('notes.md')`. |35| [`$`](https://code.claude.com/docs/es/plugins/mods/events#how-a-hook-handles-an-event) | La API de mods: todos los métodos de [métodos de la API de mods](#mods-api-methods). Escribe cada llamada completa, primero el espacio de nombres y luego el método, como en `$.fs.read('notes.md')`. |
36| [`e`](/docs/es/plugins/mods/events#how-a-hook-handles-an-event) | La entrada del evento, como datos simples congelados en profundidad. Para cambiarla, pasa una copia a `next`. |36| [`e`](https://code.claude.com/docs/es/plugins/mods/events#how-a-hook-handles-an-event) | La entrada del evento, como datos simples congelados en profundidad. Para cambiarla, pasa una copia a `next`. |
37| [`next(e)`](/docs/es/plugins/mods/events#how-a-hook-handles-an-event) | El siguiente controlador, como en un middleware. Ejecuta los hooks posteriores a este y luego el comportamiento de Claude Code. Se resuelve con el resultado del evento. |37| [`next(e)`](https://code.claude.com/docs/es/plugins/mods/events#how-a-hook-handles-an-event) | El siguiente controlador, como en un middleware. Ejecuta los hooks posteriores a este y luego el comportamiento de Claude Code. Se resuelve con el resultado del evento. |
38| [`next.signal`](/docs/es/plugins/mods/api#stop-background-work) | Un `AbortSignal` que se aborta cuando el evento se abandona |38| [`next.signal`](https://code.claude.com/docs/es/plugins/mods/api#stop-background-work) | Un `AbortSignal` que se aborta cuando el evento se abandona |
39| `next.origin` | `{ plugin, tier }` de quien disparó el evento. El propio Claude Code es `{ plugin: 'engine', tier: 'core' }`. El `tier` de un mod es su grupo de prioridad en el [orden en que se ejecutan los mods](/docs/es/plugins/mods/events.md#the-order-mods-run-in): `prepend`, `user`, `append` o `builtin`. |39| `next.origin` | `{ plugin, tier }` de quien disparó el evento. El propio Claude Code es `{ plugin: 'engine', tier: 'core' }`. El `tier` de un mod es su grupo de prioridad en el [orden en que se ejecutan los mods](https://code.claude.com/docs/es/plugins/mods/events.md#the-order-mods-run-in): `prepend`, `user`, `append` o `builtin`. |
40| `next.budget` | El límite de tiempo del hook en milisegundos: `next.budget.ms` es el límite completo y `next.budget.remainingMs` es lo que queda en este momento |40| `next.budget` | El límite de tiempo del hook en milisegundos: `next.budget.ms` es el límite completo y `next.budget.remainingMs` es lo que queda en este momento |
41| `next.to(e, tier)` | Salta a un tier posterior, que es `append`, `builtin` o `core`. `next.to(e, 'append')` omite los mods que instaló un usuario. Solo un mod en `prependPlugins` o `appendPlugins` puede llamarlo. |41| `next.to(e, tier)` | Salta a un tier posterior, que es `append`, `builtin` o `core`. `next.to(e, 'append')` omite los mods que instaló un usuario. Solo un mod en `prependPlugins` o `appendPlugins` puede llamarlo. |
42| `next.error` | Solo en un controlador `.catch`. `kind` es `throw` o `timeout` cuando el hook falló, y `message` es el texto del error. `kind` es `re-entry` cuando el hook se omitió porque el evento provino de una llamada a la API de mods hecha por ese hook o por el código de tu mod fuera de sus hooks. `re-entry` requiere Claude Code v2.1.292 o posterior. |42| `next.error` | Solo en un controlador `.catch`. `kind` es `throw` o `timeout` cuando el hook falló, y `message` es el texto del error. `kind` es `re-entry` cuando el hook se omitió porque el evento provino de una llamada a la API de mods hecha por ese hook o por el código de tu mod fuera de sus hooks. `re-entry` requiere Claude Code v2.1.292 o posterior. |
43| `next.error.cause` | Solo se establece cuando `kind` es `re-entry`. `rewritten` si un hook `tool.call` o [`PreToolUse`](/docs/es/hooks#pretooluse) cambió la llamada a la API de mods de la que provino el evento, o si un hook `agent.spawn` cambió un agente iniciado por esa llamada. `lent` cuando un método que otro mod agrega a la API de mods disparó ese evento, a menos que también aplique `rewritten`. `lent` requiere Claude Code v2.1.292 o posterior y `rewritten`, v2.1.300 o posterior. |43| `next.error.cause` | Solo se establece cuando `kind` es `re-entry`. `rewritten` si un hook `tool.call` o [`PreToolUse`](https://code.claude.com/docs/es/hooks#pretooluse) cambió la llamada a la API de mods de la que provino el evento, o si un hook `agent.spawn` cambió un agente iniciado por esa llamada. `lent` cuando un método que otro mod agrega a la API de mods disparó ese evento, a menos que también aplique `rewritten`. `lent` requiere Claude Code v2.1.292 o posterior y `rewritten`, v2.1.300 o posterior. |
44| `next.called` | Solo en un controlador `.catch`. `true` cuando el hook había llamado a `next`. |44| `next.called` | Solo en un controlador `.catch`. `true` cuando el hook había llamado a `next`. |
45 45
46## Eventos46## Eventos
55 55
56| Evento | Se dispara cuando | Un hook puede devolver |56| Evento | Se dispara cuando | Un hook puede devolver |
57| :- | :- | :- |57| :- | :- | :- |
58| [`tool.call`](/docs/es/plugins/mods/events#guard-or-change-a-tool-call) | Una herramienta está a punto de ejecutarse | `next(e)`, `{ deny: reason }` o `{ result }` |58| [`tool.call`](https://code.claude.com/docs/es/plugins/mods/events#guard-or-change-a-tool-call) | Una herramienta está a punto de ejecutarse | `next(e)`, `{ deny: reason }` o `{ result }` |
59| [`tool.check`](/docs/es/plugins/mods/events#where-settings-hooks-run-in-the-order) | Claude Code decide si una llamada a herramienta puede ejecutarse, después de los hooks `tool.call` y `PreToolUse`. `next(e)` se resuelve en la decisión a la que llegaron las reglas, el modo de permisos y esos hooks. | `next(e)` o `{ decision }`, con `decision` establecido en `allow`, `ask` o `deny` y un `reason` opcional |59| [`tool.check`](https://code.claude.com/docs/es/plugins/mods/events#where-settings-hooks-run-in-the-order) | Claude Code decide si una llamada a herramienta puede ejecutarse, después de los hooks `tool.call` y `PreToolUse`. `next(e)` se resuelve en la decisión a la que llegaron las reglas, el modo de permisos y esos hooks. | `next(e)` o `{ decision }`, con `decision` establecido en `allow`, `ask` o `deny` y un `reason` opcional |
60| `tool.describe` | Una vez por cada herramienta, cuando su descripción se envía por primera vez a Claude. Una segunda vez para una herramienta MCP cuando Claude la carga mediante la [búsqueda de herramientas](/docs/es/mcp.md#scale-with-mcp-tool-search), con `e.description` establecido en el texto que lee Claude para la herramienta cargada. | `{ description }`, opcionalmente con `isDeferred` establecido en `true` para poner la herramienta detrás de la búsqueda de herramientas o en `false` para cargarla desde el inicio |60| `tool.describe` | Una vez por cada herramienta, cuando su descripción se envía por primera vez a Claude. Una segunda vez para una herramienta MCP cuando Claude la carga mediante la [búsqueda de herramientas](https://code.claude.com/docs/es/mcp.md#scale-with-mcp-tool-search), con `e.description` establecido en el texto que lee Claude para la herramienta cargada. | `{ description }`, opcionalmente con `isDeferred` establecido en `true` para poner la herramienta detrás de la búsqueda de herramientas o en `false` para cargarla desde el inicio |
61 61
62#### Campos de agente y organización en `tool.check`62#### Campos de agente y organización en `tool.check`
63 63
64En un hook de `tool.check`, lee estos campos para distinguir la llamada de un subagente de la de la conversación principal, y para ver si tu organización requiere aprobación para una herramienta de conector:64En un hook de `tool.check`, lee estos campos para distinguir la llamada de un subagente de la de la conversación principal, y para ver si tu organización requiere aprobación para una herramienta de conector:
65 65
66* **`e.agentId`**: se establece cuando un [subagente](/docs/es/sub-agents.md) o un [compañero en proceso](/docs/es/agent-teams.md#choose-a-display-mode) hace la llamada, y está ausente cuando la hace la conversación principal66* **`e.agentId`**: se establece cuando un [subagente](https://code.claude.com/docs/es/sub-agents.md) o un [compañero en proceso](https://code.claude.com/docs/es/agent-teams.md#choose-a-display-mode) hace la llamada, y está ausente cuando la hace la conversación principal
67* **`e.ceiling`**: `ask` para una herramienta de conector que tu organización estableció en `ask`, en [sesiones en las que ese ajuste llega a Claude Code](/docs/es/mcp.md#organization-controls-on-connector-tools)67* **`e.ceiling`**: `ask` para una herramienta de conector que tu organización estableció en `ask`, en [sesiones en las que ese ajuste llega a Claude Code](https://code.claude.com/docs/es/mcp.md#organization-controls-on-connector-tools)
68 68
69En `tool.check`, `e.agentId` y `e.ceiling` requieren Claude Code v2.1.290 o posterior.69En `tool.check`, `e.agentId` y `e.ceiling` requieren Claude Code v2.1.290 o posterior.
70 70
71#### El campo `e.isReadOnly` en `tool.check`71#### El campo `e.isReadOnly` en `tool.check`
72 72
73En un hook de `tool.check`, `e.isReadOnly` es `true` cuando la herramienta informa que esta llamada es de solo lectura. En caso contrario, el campo está ausente, no es `false`. El valor es el propio informe de la herramienta, así que lee [Comprobar si una llamada a herramienta es de solo lectura](/docs/es/plugins/mods/events.md#check-whether-a-tool-call-is-read-only) antes de aprobar una llamada basándote solo en este campo.73En un hook de `tool.check`, `e.isReadOnly` es `true` cuando la herramienta informa que esta llamada es de solo lectura. En caso contrario, el campo está ausente, no es `false`. El valor es el propio informe de la herramienta, así que lee [Comprobar si una llamada a herramienta es de solo lectura](https://code.claude.com/docs/es/plugins/mods/events.md#check-whether-a-tool-call-is-read-only) antes de aprobar una llamada basándote solo en este campo.
74 74
75En `tool.check`, `e.isReadOnly` requiere Claude Code v2.1.304 o posterior.75En `tool.check`, `e.isReadOnly` requiere Claude Code v2.1.304 o posterior.
76 76
80 80
81| Evento | Se dispara cuando | Un hook puede devolver |81| Evento | Se dispara cuando | Un hook puede devolver |
82| :- | :- | :- |82| :- | :- | :- |
83| [`prompt.submit`](/docs/es/plugins/mods/events#rewrite-or-add-to-a-prompt) | Se envía un prompt | `next({ ...e, text })`, `next({ ...e, context })` o `{ drop: reason }` |83| [`prompt.submit`](https://code.claude.com/docs/es/plugins/mods/events#rewrite-or-add-to-a-prompt) | Se envía un prompt | `next({ ...e, text })`, `next({ ...e, context })` o `{ drop: reason }` |
84| `prompt.fill`, `prompt.suggest` | Un texto está a punto de entrar en el cuadro del prompt como borrador o como sugerencia atenuada | `next(e)` con el texto cambiado |84| `prompt.fill`, `prompt.suggest` | Un texto está a punto de entrar en el cuadro del prompt como borrador o como sugerencia atenuada | `next(e)` con el texto cambiado |
85| `prompt.edit` | El usuario edita el cuadro del prompt | `next(e)` |85| `prompt.edit` | El usuario edita el cuadro del prompt | `next(e)` |
86| `prompt.autocomplete` | El usuario escribe en el cuadro del prompt y una palabra termina en el cursor. `e.token` es esa palabra. Claude Code no espera al hook: sus propias filas de autocompletado se muestran primero. | `{ suggestions }`, una lista de filas `{ text, label, description }` que se muestran debajo de las propias de Claude Code. Elegir una fila escribe su `text` sobre la palabra. |86| `prompt.autocomplete` | El usuario escribe en el cuadro del prompt y una palabra termina en el cursor. `e.token` es esa palabra. Claude Code no espera al hook: sus propias filas de autocompletado se muestran primero. | `{ suggestions }`, una lista de filas `{ text, label, description }` que se muestran debajo de las propias de Claude Code. Elegir una fila escribe su `text` sobre la palabra. |
87| `prompt.compose` | Claude Code genera un prompt del sistema | `{ sections }`, una lista de `{ id, text, scope }` en el orden en que se envían |87| `prompt.compose` | Claude Code genera un prompt del sistema | `{ sections }`, una lista de `{ id, text, scope }` en el orden en que se envían |
88| [`prompt.section`](/docs/es/plugins/mods/events#rewrite-or-add-to-a-prompt) | Una vez por cada sección con nombre del prompt del sistema. `e.name` es el `id` de la sección en `prompt.compose`. | `{ text }`, o `{ text: null }` para omitir la sección |88| [`prompt.section`](https://code.claude.com/docs/es/plugins/mods/events#rewrite-or-add-to-a-prompt) | Una vez por cada sección con nombre del prompt del sistema. `e.name` es el `id` de la sección en `prompt.compose`. | `{ text }`, o `{ text: null }` para omitir la sección |
89| [`prompt.context`](/docs/es/plugins/mods/events#rewrite-or-add-to-a-prompt) | Una vez por cada conversación, para el contexto enviado con el primer mensaje | `{ blocks }` |89| [`prompt.context`](https://code.claude.com/docs/es/plugins/mods/events#rewrite-or-add-to-a-prompt) | Una vez por cada conversación, para el contexto enviado con el primer mensaje | `{ blocks }` |
90| `prompt.attachment` | Claude Code agrega un mensaje propio para Claude, como un recordatorio. `e.type` indica el tipo y, para los tipos que declaran las definiciones de tipos, `e.detail` contiene los datos a partir de los cuales se escribió el texto. | `{ text }`, o `{ text: null }` para omitirlo |90| `prompt.attachment` | Claude Code agrega un mensaje propio para Claude, como un recordatorio. `e.type` indica el tipo y, para los tipos que declaran las definiciones de tipos, `e.detail` contiene los datos a partir de los cuales se escribió el texto. | `{ text }`, o `{ text: null }` para omitirlo |
91| `prompt.mention` | Claude Code está a punto de leer un archivo que un prompt menciona con @. Requiere Claude Code v2.1.290 o posterior. | `next({ ...e, path })` para leer un archivo diferente, o `{ deny: reason }` |91| `prompt.mention` | Claude Code está a punto de leer un archivo que un prompt menciona con @. Requiere Claude Code v2.1.290 o posterior. | `next({ ...e, path })` para leer un archivo diferente, o `{ deny: reason }` |
92| [`skill.prompt`](/docs/es/plugins/mods/events#rewrite-or-add-to-a-prompt) | El texto de un skill se expande para Claude | `{ text }` |92| [`skill.prompt`](https://code.claude.com/docs/es/plugins/mods/events#rewrite-or-add-to-a-prompt) | El texto de un skill se expande para Claude | `{ text }` |
93| `attribution.text` | Claude Code compone el texto de atribución de un commit o pull request | `{ text }` |93| `attribution.text` | Claude Code compone el texto de atribución de un commit o pull request | `{ text }` |
94 94
95#### Campos de origen y frontmatter en `skill.prompt`95#### Campos de origen y frontmatter en `skill.prompt`
98 98
99| Campo | Tipo | Qué contiene |99| Campo | Tipo | Qué contiene |
100| :- | :- | :- |100| :- | :- | :- |
101| `e.source` | string | Quién proporciona el skill: `policySettings`, `userSettings` o `projectSettings` para un skill en la [ubicación](/docs/es/skills.md#where-skills-live) empresarial, personal o de proyecto, respectivamente. Otros orígenes dan una palabra como `plugin`, `mcp`, `syncedSkills` o `built-in`. |101| `e.source` | string | Quién proporciona el skill: `policySettings`, `userSettings` o `projectSettings` para un skill en la [ubicación](https://code.claude.com/docs/es/skills.md#where-skills-live) empresarial, personal o de proyecto, respectivamente. Otros orígenes dan una palabra como `plugin`, `mcp`, `syncedSkills` o `built-in`. |
102| `e.pluginName` | string | El nombre del plugin, para un skill cuyo `e.source` es `plugin` |102| `e.pluginName` | string | El nombre del plugin, para un skill cuyo `e.source` es `plugin` |
103| `e.path` | string | La ruta absoluta del archivo `SKILL.md` del skill, o de su archivo `.md` para un skill escrito como [archivo de comando](/docs/es/skills.md#where-skills-live). Está ausente cuando el skill no tiene ningún archivo en esta máquina, como ocurre con un skill integrado. |103| `e.path` | string | La ruta absoluta del archivo `SKILL.md` del skill, o de su archivo `.md` para un skill escrito como [archivo de comando](https://code.claude.com/docs/es/skills.md#where-skills-live). Está ausente cuando el skill no tiene ningún archivo en esta máquina, como ocurre con un skill integrado. |
104| `e.frontmatter` | object | El frontmatter del archivo del skill, como datos simples |104| `e.frontmatter` | object | El frontmatter del archivo del skill, como datos simples |
105| `e.frontmatterProblem` | string | El motivo por el que a `e.frontmatter` le falta el frontmatter del archivo o una de sus claves, como en `is a list or a single value, not a table`. Está ausente cuando `e.frontmatter` contiene todo el frontmatter o el skill no tiene ninguno. |105| `e.frontmatterProblem` | string | El motivo por el que a `e.frontmatter` le falta el frontmatter del archivo o una de sus claves, como en `is a list or a single value, not a table`. Está ausente cuando `e.frontmatter` contiene todo el frontmatter o el skill no tiene ninguno. |
106 106
107Un hook puede pasar un `text` o `frontmatter` cambiado a `next`: los hooks posteriores leen ambos, y Claude lee el `text` final. Un hook que cambia cualquier otro campo [falla](/docs/es/plugins/mods/events.md#handle-a-hook-that-fails).107Un hook puede pasar un `text` o `frontmatter` cambiado a `next`: los hooks posteriores leen ambos, y Claude lee el `text` final. Un hook que cambia cualquier otro campo [falla](https://code.claude.com/docs/es/plugins/mods/events.md#handle-a-hook-that-fails).
108 108
109En `skill.prompt`, `e.source`, `e.pluginName`, `e.path`, `e.frontmatter` y `e.frontmatterProblem` requieren Claude Code v2.1.299 o posterior.109En `skill.prompt`, `e.source`, `e.pluginName`, `e.path`, `e.frontmatter` y `e.frontmatterProblem` requieren Claude Code v2.1.299 o posterior.
110 110
114 114
115| Evento | Se dispara cuando | Un hook puede devolver |115| Evento | Se dispara cuando | Un hook puede devolver |
116| :- | :- | :- |116| :- | :- | :- |
117| [`command.run`](/docs/es/plugins/mods/api#add-a-command) | Un comando está a punto de ejecutarse | `{ text }`, `{}` o `next(e)` |117| [`command.run`](https://code.claude.com/docs/es/plugins/mods/api#add-a-command) | Un comando está a punto de ejecutarse | `{ text }`, `{}` o `next(e)` |
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 }` |
125 125
126| Evento | Se dispara cuando | Un hook puede devolver |126| Evento | Se dispara cuando | Un hook puede devolver |
127| :- | :- | :- |127| :- | :- | :- |
128| [`turn.start`](/docs/es/plugins/mods/events#follow-a-turn) | Comienza un turno | `next(e)` |128| [`turn.start`](https://code.claude.com/docs/es/plugins/mods/events#follow-a-turn) | Comienza un turno | `next(e)` |
129| [`turn.step`](/docs/es/plugins/mods/events#follow-a-turn) | Una solicitud está a punto de enviarse al modelo | `yield* next(e)`, o `next({ ...e, model })`, `next({ ...e, effort })` |129| [`turn.step`](https://code.claude.com/docs/es/plugins/mods/events#follow-a-turn) | Una solicitud está a punto de enviarse al modelo | `yield* next(e)`, o `next({ ...e, model })`, `next({ ...e, effort })` |
130| [`turn.complete`](/docs/es/plugins/mods/events#follow-a-turn) | Terminó un turno | `next(e)`, o `{ text }` para mostrar una línea debajo de la respuesta |130| [`turn.complete`](https://code.claude.com/docs/es/plugins/mods/events#follow-a-turn) | Terminó un turno | `next(e)`, o `{ text }` para mostrar una línea debajo de la respuesta |
131 131
132### Sesión132### Sesión
133 133
135 135
136| Evento | Se dispara cuando | Un hook puede devolver |136| Evento | Se dispara cuando | Un hook puede devolver |
137| :- | :- | :- |137| :- | :- | :- |
138| [`session.start`](/docs/es/plugins/mods/api#add-a-command-or-a-tool) | Una vez por cada mod cargado, antes del primer prompt, y de nuevo tras recargar ese mod. No después de `/clear`, `/resume` o `/branch`. | `next(e)` |138| [`session.start`](https://code.claude.com/docs/es/plugins/mods/api#add-a-command-or-a-tool) | Una vez por cada mod cargado, antes del primer prompt, y de nuevo tras recargar ese mod. No después de `/clear`, `/resume` o `/branch`. | `next(e)` |
139| `session.end` | La sesión termina, o se ejecuta `/clear`, `/resume` o `/branch`. `e.reason` es `clear`, `resume`, `logout`, `prompt_input_exit` u `other`. `/branch` informa `resume`. | `next(e)` |139| `session.end` | La sesión termina, o se ejecuta `/clear`, `/resume` o `/branch`. `e.reason` es `clear`, `resume`, `logout`, `prompt_input_exit` u `other`. `/branch` informa `resume`. | `next(e)` |
140| `session.compact` | La conversación está a punto de compactarse | `{ skip: reason }` |140| `session.compact` | La conversación está a punto de compactarse | `{ skip: reason }` |
141| [`session.receive`](/docs/es/plugins/mods/api#send-and-receive-messages-between-sessions), [`session.send`](/docs/es/plugins/mods/api#send-and-receive-messages-between-sessions) | Llega un mensaje de otro agente o sesión, o está a punto de enviarse a uno. Consulta [Enviar y recibir mensajes entre sesiones](/docs/es/plugins/mods/api.md#send-and-receive-messages-between-sessions). | `{ consumed: reason }` para `receive`, `{ isDelivered: false, reason }` para `send` |141| [`session.receive`](https://code.claude.com/docs/es/plugins/mods/api#send-and-receive-messages-between-sessions), [`session.send`](https://code.claude.com/docs/es/plugins/mods/api#send-and-receive-messages-between-sessions) | Llega un mensaje de otro agente o sesión, o está a punto de enviarse a uno. Consulta [Enviar y recibir mensajes entre sesiones](https://code.claude.com/docs/es/plugins/mods/api.md#send-and-receive-messages-between-sessions). | `{ consumed: reason }` para `receive`, `{ isDelivered: false, reason }` para `send` |
142| `session.append` | Una vez por cada fila que conserva la conversación, como un prompt, un bloque de respuesta, un resultado de herramienta o un aviso, antes de almacenarla | `next({ ...e, message })` con un `message.content` cambiado, para reescribir los bloques de texto de la fila o el `content` de un bloque `tool_result` que contenga |142| `session.append` | Una vez por cada fila que conserva la conversación, como un prompt, un bloque de respuesta, un resultado de herramienta o un aviso, antes de almacenarla | `next({ ...e, message })` con un `message.content` cambiado, para reescribir los bloques de texto de la fila o el `content` de un bloque `tool_result` que contenga |
143| `session.attach`, `session.detach` | Otra aplicación se conecta a la sesión o se desconecta de ella | `next(e)` |143| `session.attach`, `session.detach` | Otra aplicación se conecta a la sesión o se desconecta de ella | `next(e)` |
144| `session.measure` | Después de cada turno, y cuando cambia el porcentaje usado de un límite del plan | `next(e)` |144| `session.measure` | Después de cada turno, y cuando cambia el porcentaje usado de un límite del plan | `next(e)` |
150| Evento | Se dispara cuando | Un hook puede devolver |150| Evento | Se dispara cuando | Un hook puede devolver |
151| :- | :- | :- |151| :- | :- | :- |
152| `agent.offer` | Se ofrece un tipo de subagente a Claude | `{ isOffered: false }` para ocultarlo |152| `agent.offer` | Se ofrece un tipo de subagente a Claude | `{ isOffered: false }` para ocultarlo |
153| `agent.spawn` | Un subagente o un compañero de un [equipo de agentes](/docs/es/agent-teams.md) está a punto de iniciarse. Para un compañero, `e.isTeammate` es `true`. | `next({ ...e, model })` para elegir su modelo, o `{ deny: reason }` |153| `agent.spawn` | Un subagente o un compañero de un [equipo de agentes](https://code.claude.com/docs/es/agent-teams.md) está a punto de iniciarse. Para un compañero, `e.isTeammate` es `true`. | `next({ ...e, model })` para elegir su modelo, o `{ deny: reason }` |
154 154
155Cuando Claude reanuda un subagente con la herramienta [`SendMessage`](/docs/es/sub-agents#resume-subagents), tu hook de `agent.spawn` no vuelve a ejecutarse. Para rechazar las llamadas a `SendMessage` que reanudan un subagente, haz coincidir esa herramienta en un hook de [`tool.call`](/docs/es/plugins/mods/events#guard-or-change-a-tool-call).155Cuando Claude reanuda un subagente con la herramienta [`SendMessage`](https://code.claude.com/docs/es/sub-agents#resume-subagents), tu hook de `agent.spawn` no vuelve a ejecutarse. Para rechazar las llamadas a `SendMessage` que reanudan un subagente, haz coincidir esa herramienta en un hook de [`tool.call`](https://code.claude.com/docs/es/plugins/mods/events#guard-or-change-a-tool-call).
156 156
157### Interfaz157### Interfaz
158 158
159Los eventos de interfaz se disparan cuando Claude Code dibuja un punto de renderizado y cuando el usuario usa un control que dibujó un mod. [Dibujar en la interfaz](/docs/es/plugins/mods/interface.md) muestra lo que devuelve un hook de `ui.render`:159Los eventos de interfaz se disparan cuando Claude Code dibuja un punto de renderizado y cuando el usuario usa un control que dibujó un mod. [Dibujar en la interfaz](https://code.claude.com/docs/es/plugins/mods/interface.md) muestra lo que devuelve un hook de `ui.render`:
160 160
161| Evento | Se dispara cuando |161| Evento | Se dispara cuando |
162| :- | :- |162| :- | :- |
163| [`ui.render`](/docs/es/plugins/mods/interface#pick-where-to-draw) | Un [punto de renderizado](#render-sites) está a punto de dibujarse |163| [`ui.render`](https://code.claude.com/docs/es/plugins/mods/interface#pick-where-to-draw) | Un [punto de renderizado](#render-sites) está a punto de dibujarse |
164| `ui.resolve` | Se cargan los mods, una vez por cada aplicación, punto de renderizado y mod. El resultado es la tabla de elementos que lee `$.ui.resolve(e)`. |164| `ui.resolve` | Se cargan los mods, una vez por cada aplicación, punto de renderizado y mod. El resultado es la tabla de elementos que lee `$.ui.resolve(e)`. |
165| [`ui.press`](/docs/es/plugins/mods/interface#respond-to-presses-and-typing), [`ui.input`](/docs/es/plugins/mods/interface#respond-to-presses-and-typing), [`ui.select`](/docs/es/plugins/mods/interface#respond-to-presses-and-typing) | Se usa un `Button`, `Input` o `Select` que dibujó un mod |165| [`ui.press`](https://code.claude.com/docs/es/plugins/mods/interface#respond-to-presses-and-typing), [`ui.input`](https://code.claude.com/docs/es/plugins/mods/interface#respond-to-presses-and-typing), [`ui.select`](https://code.claude.com/docs/es/plugins/mods/interface#respond-to-presses-and-typing) | Se usa un `Button`, `Input` o `Select` que dibujó un mod |
166| `ui.focus`, `ui.scroll` | El control enfocado o la posición de desplazamiento de un panel o de la banda está a punto de cambiar |166| `ui.focus`, `ui.scroll` | El control enfocado o la posición de desplazamiento de un panel o de la banda está a punto de cambiar |
167| `ui.close` | Un panel está a punto de cerrarse. `e.id` es el panel y `e.origin.kind` es `plugin`, `person` o `unload`. |167| `ui.close` | Un panel está a punto de cerrarse. `e.id` es el panel y `e.origin.kind` es `plugin`, `person` o `unload`. |
168| [`ui.message`](/docs/es/plugins/mods/interface#build-a-tree-from-elements) | Un elemento `Client` publica datos en su mod |168| [`ui.message`](https://code.claude.com/docs/es/plugins/mods/interface#build-a-tree-from-elements) | Un elemento `Client` publica datos en su mod |
169| [`ui.fault`](/docs/es/plugins/mods/interface#redraw-when-something-changes) | Un elemento `Client` que dibujó tu mod no pudo cargarse, dibujarse o ejecutarse. `e.phase` es `load`, `render` o `run`, y `e.reason` es el mensaje de error. Requiere Claude Code v2.1.289 o posterior. |169| [`ui.fault`](https://code.claude.com/docs/es/plugins/mods/interface#redraw-when-something-changes) | Un elemento `Client` que dibujó tu mod no pudo cargarse, dibujarse o ejecutarse. `e.phase` es `load`, `render` o `run`, y `e.reason` es el mensaje de error. Requiere Claude Code v2.1.289 o posterior. |
170 170
171### Otros mods171### Otros mods
172 172
174 174
175| Evento | Se dispara cuando | Un hook puede devolver |175| Evento | Se dispara cuando | Un hook puede devolver |
176| :- | :- | :- |176| :- | :- | :- |
177| [`plugin.register`](/docs/es/plugins/mods/admin#enforce-a-policy-with-a-mod-of-your-own) | Un módulo de hooks está a punto de cargarse. `e.uses` enumera sus eventos, llamadas a la API de mods, variables de entorno y estado, tal como los imprime `claude plugin validate`. Cada llamada se escribe sin el prefijo `$.`, como `fs.read`. | `{ refuse: reason }` |177| [`plugin.register`](https://code.claude.com/docs/es/plugins/mods/admin#enforce-a-policy-with-a-mod-of-your-own) | Un módulo de hooks está a punto de cargarse. `e.uses` enumera sus eventos, llamadas a la API de mods, variables de entorno y estado, tal como los imprime `claude plugin validate`. Cada llamada se escribe sin el prefijo `$.`, como `fs.read`. | `{ refuse: reason }` |
178| `engine.create` | Se está construyendo la API de mods para este mod | Una API de mods modificada, para agregar un espacio de nombres. Un mod fuera del [nivel](#the-hook-function) `user` también puede ocultar uno. |178| `engine.create` | Se está construyendo la API de mods para este mod | Una API de mods modificada, para agregar un espacio de nombres. Un mod fuera del [nivel](#the-hook-function) `user` también puede ocultar uno. |
179 179
180Cuando el hook de otro mod llama a un método de un espacio de nombres que agregaste en `engine.create`, las llamadas a `$` de tu método se ejecutan en el contexto de ese hook hasta que todos los hooks de ese evento devuelven. Por ejemplo, una ruta relativa se resuelve respecto al directorio de trabajo de ese hook, y `$.prompt.submit` se rechaza mientras el turno está esperando a ese hook. Las llamadas que tu método hace después de eso se ejecutan en el contexto propio de tu mod.180Cuando el hook de otro mod llama a un método de un espacio de nombres que agregaste en `engine.create`, las llamadas a `$` de tu método se ejecutan en el contexto de ese hook hasta que todos los hooks de ese evento devuelven. Por ejemplo, una ruta relativa se resuelve respecto al directorio de trabajo de ese hook, y `$.prompt.submit` se rechaza mientras el turno está esperando a ese hook. Las llamadas que tu método hace después de eso se ejecutan en el contexto propio de tu mod.
189 189
190### Eventos de hooks de configuración190### Eventos de hooks de configuración
191 191
192Cada [evento de hook de configuración](/docs/es/hooks.md#hook-events) es un evento llamado `classic.<Event>`, como `classic.Stop` o `classic.PostToolUse`. `e` es el JSON de stdin del hook.192Cada [evento de hook de configuración](https://code.claude.com/docs/es/hooks.md#hook-events) es un evento llamado `classic.<Event>`, como `classic.Stop` o `classic.PostToolUse`. `e` es el JSON de stdin del hook.
193 193
194### Llamadas a la API de mods194### Llamadas a la API de mods
195 195
197 197
198## Métodos de la API de mods198## Métodos de la API de mods
199 199
200La API de mods es el argumento `$` que recibe cada hook. Sus métodos están agrupados en espacios de nombres, como `$.ui`. Esta tabla enumera los métodos de cada espacio de nombres por su nombre, de modo que `open` en la fila de `$.ui` es la llamada `$.ui.open(...)`. Las guías muestran los más comunes en uso, y [los tipos para tu compilación](/docs/es/plugins/mods/create.md#get-the-types-for-your-build) documentan cada método con un ejemplo.200La API de mods es el argumento `$` que recibe cada hook. Sus métodos están agrupados en espacios de nombres, como `$.ui`. Esta tabla enumera los métodos de cada espacio de nombres por su nombre, de modo que `open` en la fila de `$.ui` es la llamada `$.ui.open(...)`. Las guías muestran los más comunes en uso, y [los tipos para tu compilación](https://code.claude.com/docs/es/plugins/mods/create.md#get-the-types-for-your-build) documentan cada método con un ejemplo.
201 201
202| Espacio de nombres | Métodos |202| Espacio de nombres | Métodos |
203| :- | :- |203| :- | :- |
204| `$.plugin` | `name`, `root`: el nombre y el directorio de este plugin |204| `$.plugin` | `name`, `root`: el nombre y el directorio de este plugin |
205| [`$.ui`](/docs/es/plugins/mods/interface#pick-where-to-draw) | `resolve`, `invalidate`, `open`, `close`, `panes`, `focus`, `scroll`, `toast`, `notify`, `status`, `log`, `notice`, `ask`, `copy`, `selection`, `blit` |205| [`$.ui`](https://code.claude.com/docs/es/plugins/mods/interface#pick-where-to-draw) | `resolve`, `invalidate`, `open`, `close`, `panes`, `focus`, `scroll`, `toast`, `notify`, `status`, `log`, `notice`, `ask`, `copy`, `selection`, `blit` |
206| [`$.command`](/docs/es/plugins/mods/api#add-a-command) | `register`, `run`, `list` |206| [`$.command`](https://code.claude.com/docs/es/plugins/mods/api#add-a-command) | `register`, `run`, `list` |
207| [`$.tool`](/docs/es/plugins/mods/api#add-a-tool) | `register`, `call`, `check`, `list` |207| [`$.tool`](https://code.claude.com/docs/es/plugins/mods/api#add-a-tool) | `register`, `call`, `check`, `list` |
208| `$.agent` | `register`, `spawn`, `list`. `list()` devuelve los subagentes y compañeros de equipo de esta sesión, cada uno con un `status` de `pending`, `running`, `waiting`, `idle`, `completed`, `failed` o `killed`, donde `idle` y `waiting` requieren Claude Code v2.1.289 o posterior. |208| `$.agent` | `register`, `spawn`, `list`. `list()` devuelve los subagentes y compañeros de equipo de esta sesión, cada uno con un `status` de `pending`, `running`, `waiting`, `idle`, `completed`, `failed` o `killed`, donde `idle` y `waiting` requieren Claude Code v2.1.289 o posterior. |
209| [`$.model`](/docs/es/plugins/mods/api#call-a-model) | `complete`, `fork`, `classify` |209| [`$.model`](https://code.claude.com/docs/es/plugins/mods/api#call-a-model) | `complete`, `fork`, `classify` |
210| [`$.prompt`](/docs/es/plugins/mods/api#start-a-turn-from-a-background-job) | `submit`, `read`, `fill`, `suggest`, `compose`. Claude lee el texto de `submit({ text })` después de una oración que nombra a tu mod como remitente. `submit({ text, asUser: true })` envía el texto como las propias palabras del usuario, sin esa oración. |210| [`$.prompt`](https://code.claude.com/docs/es/plugins/mods/api#start-a-turn-from-a-background-job) | `submit`, `read`, `fill`, `suggest`, `compose`. Claude lee el texto de `submit({ text })` después de una oración que nombra a tu mod como remitente. `submit({ text, asUser: true })` envía el texto como las propias palabras del usuario, sin esa oración. |
211| `$.turn` | `abort` |211| `$.turn` | `abort` |
212| [`$.session`](/docs/es/plugins/mods/api#send-and-receive-messages-between-sessions) | `messages`, `cwd`, `root`, `model`, `turns`, `id`, `repo`, `surfaces`, `usage`, `version`, `compact`, `send`, `append`, `authorize`. `usage()` devuelve `{ startedAt, context, rateLimits, cost }`: `context` tiene `tokens`, `window` y `percent`, y `rateLimits` es una lista de `{ kind, percentUsed, resetsAt }`. |212| [`$.session`](https://code.claude.com/docs/es/plugins/mods/api#send-and-receive-messages-between-sessions) | `messages`, `cwd`, `root`, `model`, `turns`, `id`, `repo`, `surfaces`, `usage`, `version`, `compact`, `send`, `append`, `authorize`. `usage()` devuelve `{ startedAt, context, rateLimits, cost }`: `context` tiene `tokens`, `window` y `percent`, y `rateLimits` es una lista de `{ kind, percentUsed, resetsAt }`. |
213| `$.config` | `list`, `set` |213| `$.config` | `list`, `set` |
214| [`$.settings`](/docs/es/plugins/mods/api#reach-files-processes-and-the-network) | `read` |214| [`$.settings`](https://code.claude.com/docs/es/plugins/mods/api#reach-files-processes-and-the-network) | `read` |
215| [`$.env`](/docs/es/plugins/mods/api#reach-files-processes-and-the-network) | `get`, `set` |215| [`$.env`](https://code.claude.com/docs/es/plugins/mods/api#reach-files-processes-and-the-network) | `get`, `set` |
216| [`$.fs`](/docs/es/plugins/mods/api#reach-files-processes-and-the-network) | `read`, `write`, `list`, `exists`, `stat`, `ancestors`. `write` no es atómico: reemplaza el contenido del archivo en el lugar, por lo que otro proceso puede leer un archivo escrito parcialmente. Guarda en `$.store` los datos que varias sesiones modifican. |216| [`$.fs`](https://code.claude.com/docs/es/plugins/mods/api#reach-files-processes-and-the-network) | `read`, `write`, `list`, `exists`, `stat`, `ancestors`. `write` no es atómico: reemplaza el contenido del archivo en el lugar, por lo que otro proceso puede leer un archivo escrito parcialmente. Guarda en `$.store` los datos que varias sesiones modifican. |
217| [`$.store`](/docs/es/plugins/mods/interface#keep-state) | `get`, `set`, `delete`, `keys`. Un almacén de clave-valor que comparten todas las sesiones de la máquina. Consulta [Guardar desde más de una sesión](/docs/es/plugins/mods/interface.md#save-from-more-than-one-session). |217| [`$.store`](https://code.claude.com/docs/es/plugins/mods/interface#keep-state) | `get`, `set`, `delete`, `keys`. Un almacén de clave-valor que comparten todas las sesiones de la máquina. Consulta [Guardar desde más de una sesión](https://code.claude.com/docs/es/plugins/mods/interface.md#save-from-more-than-one-session). |
218| [`$.state`](/docs/es/plugins/mods/interface#keep-a-value-in-\$-state) | Estado reactivo: `get`, `set`, con los helpers `atom`, `read`, `update`, `derive` y `memberOf` importados de `claude-code` |218| [`$.state`](https://code.claude.com/docs/es/plugins/mods/interface#keep-a-value-in-\$-state) | Estado reactivo: `get`, `set`, con los helpers `atom`, `read`, `update`, `derive` y `memberOf` importados de `claude-code` |
219| [`$.clock`](/docs/es/plugins/mods/api#run-work-in-the-background) | `now`, `sleep`, `after`, `every` |219| [`$.clock`](https://code.claude.com/docs/es/plugins/mods/api#run-work-in-the-background) | `now`, `sleep`, `after`, `every` |
220| [`$.http`](/docs/es/plugins/mods/api#reach-files-processes-and-the-network) | `fetch` |220| [`$.http`](https://code.claude.com/docs/es/plugins/mods/api#reach-files-processes-and-the-network) | `fetch` |
221| [`$.process`](/docs/es/plugins/mods/api#reach-files-processes-and-the-network) | `run`, `spawn` |221| [`$.process`](https://code.claude.com/docs/es/plugins/mods/api#reach-files-processes-and-the-network) | `run`, `spawn` |
222| [`$.mcp`](/docs/es/plugins/mods/api#reach-files-processes-and-the-network) | `call`, `connect`. `connect(server)` conecta un servidor MCP que el manifiesto de tu propio plugin enumera. |222| [`$.mcp`](https://code.claude.com/docs/es/plugins/mods/api#reach-files-processes-and-the-network) | `call`, `connect`. `connect(server)` conecta un servidor MCP que el manifiesto de tu propio plugin enumera. |
223| `$.audio` | `play`, `speak` |223| `$.audio` | `play`, `speak` |
224| `$.telemetry` | `log`, `mark`. Un registro se envía solo cuando Claude Code o un mod integrado hace la llamada. |224| `$.telemetry` | `log`, `mark`. Un registro se envía solo cuando Claude Code o un mod integrado hace la llamada. |
225 225
226## Puntos de renderizado226## Puntos de renderizado
227 227
228Un punto de renderizado es un punto de extensión en la interfaz de Claude Code. Cada fila es un valor de `e.component` en un hook `ui.render`, con los campos de `e.props` y las apps que lo renderizan. `e.surface` indica la app que está dibujando, como `terminal`, `desktop` o `vscode`. [Cambiar lo que Claude Code ya dibuja](/docs/es/plugins/mods/interface.md#change-what-claude-code-already-draws) muestra lo que un hook puede hacer en un punto de renderizado, con un ejemplo de cada opción.228Un punto de renderizado es un punto de extensión en la interfaz de Claude Code. Cada fila es un valor de `e.component` en un hook `ui.render`, con los campos de `e.props` y las apps que lo renderizan. `e.surface` indica la app que está dibujando, como `terminal`, `desktop` o `vscode`. [Cambiar lo que Claude Code ya dibuja](https://code.claude.com/docs/es/plugins/mods/interface.md#change-what-claude-code-already-draws) muestra lo que un hook puede hacer en un punto de renderizado, con un ejemplo de cada opción.
229 229
230Renderizar en la extensión de VS Code requiere la versión 2.1.299 o posterior de la extensión. Una sesión que [no obtiene los feature flags](/docs/es/env-vars.md#features-that-need-feature-flag-fetching) necesita la versión 2.1.304 o posterior. [Dibujar en la extensión de VS Code](/docs/es/plugins/mods/interface.md#draw-in-the-vs-code-extension) enumera lo que la extensión dibuja de forma diferente.230Renderizar en la extensión de VS Code requiere la versión 2.1.299 o posterior de la extensión. Una sesión que [no obtiene los feature flags](https://code.claude.com/docs/es/env-vars.md#features-that-need-feature-flag-fetching) necesita la versión 2.1.304 o posterior. [Dibujar en la extensión de VS Code](https://code.claude.com/docs/es/plugins/mods/interface.md#draw-in-the-vs-code-extension) enumera lo que la extensión dibuja de forma diferente.
231 231
232| Punto de renderizado | `e.props` | `e.requestId` | Se renderiza en |232| Punto de renderizado | `e.props` | `e.requestId` | Se renderiza en |
233| :- | :- | :- | :- |233| :- | :- | :- | :- |
234| [`Pane`](/docs/es/plugins/mods/interface#pick-where-to-draw) | `title`, `isFocused`, `bodyColumns`, `placement`, `scroll`, `view` | El `id` del panel | Terminal, Desktop, VS Code |234| [`Pane`](https://code.claude.com/docs/es/plugins/mods/interface#pick-where-to-draw) | `title`, `isFocused`, `bodyColumns`, `placement`, `scroll`, `view` | El `id` del panel | Terminal, Desktop, VS Code |
235| [`AbovePrompt`](/docs/es/plugins/mods/interface#pick-where-to-draw) | `hasSurvey`, `isWorking`, `maxRows`, `bodyColumns`, `scroll`, `view` | Una instancia | Terminal, Desktop |235| [`AbovePrompt`](https://code.claude.com/docs/es/plugins/mods/interface#pick-where-to-draw) | `hasSurvey`, `isWorking`, `maxRows`, `bodyColumns`, `scroll`, `view` | Una instancia | Terminal, Desktop |
236| `UserMessage` | `text`, `origin`, `isExpanded`, y `task` o `from` según el origen | El id del mensaje | Terminal, Desktop, VS Code |236| `UserMessage` | `text`, `origin`, `isExpanded`, y `task` o `from` según el origen | El id del mensaje | Terminal, Desktop, VS Code |
237| `AssistantMessage` | El texto de la respuesta | El id del mensaje | Terminal, Desktop, VS Code |237| `AssistantMessage` | El texto de la respuesta | El id del mensaje | Terminal, Desktop, VS Code |
238| `ToolUse`, `ToolResult`, `ToolGroup` | El nombre, la entrada y el resultado de la herramienta | El id de la llamada a herramienta | Terminal, Desktop, VS Code |238| `ToolUse`, `ToolResult`, `ToolGroup` | El nombre, la entrada y el resultado de la herramienta | El id de la llamada a herramienta | Terminal, Desktop, VS Code |
239| `CommandOutput` | `command`, `text` | El id del mensaje | Terminal, Desktop |239| `CommandOutput` | `command`, `text` | El id del mensaje | Terminal, Desktop |
240| [`AskUserQuestion`](/docs/es/plugins/mods/interface#change-what-claude-code-already-draws) | La pregunta y las opciones | El id de la llamada a herramienta | Terminal, Desktop, VS Code |240| [`AskUserQuestion`](https://code.claude.com/docs/es/plugins/mods/interface#change-what-claude-code-already-draws) | La pregunta y las opciones | El id de la llamada a herramienta | Terminal, Desktop, VS Code |
241| `ToolProgress` | `kind` | El id de la llamada a herramienta | Terminal |241| `ToolProgress` | `kind` | El id de la llamada a herramienta | Terminal |
242| [`Spinner`](/docs/es/plugins/mods/interface#change-what-claude-code-already-draws) | `word`, `message`, `suffix`, `mode` | El id del agente | Terminal, Desktop, VS Code |242| [`Spinner`](https://code.claude.com/docs/es/plugins/mods/interface#change-what-claude-code-already-draws) | `word`, `message`, `suffix`, `mode` | El id del agente | Terminal, Desktop, VS Code |
243| `TurnDuration` | `word`, `durationMs` | El id del mensaje | Terminal |243| `TurnDuration` | `word`, `durationMs` | El id del mensaje | Terminal |
244| `InfoNotice` | `text`, `command` | El id del mensaje | Terminal |244| `InfoNotice` | `text`, `command` | El id del mensaje | Terminal |
245| `SessionMode` | `modes` | Una instancia | Terminal, Desktop |245| `SessionMode` | `modes` | Una instancia | Terminal, Desktop |
251 251
252* **Ancho de un `Pane` o de la banda**: dibuja según `e.props.bodyColumns`252* **Ancho de un `Pane` o de la banda**: dibuja según `e.props.bodyColumns`
253* **Altura de un `Pane` junto a la transcripción**: cuando `e.props.placement` es `'dock'`, `e.props.scroll.bodyRows` es el número de filas que tiene el panel para tu árbol253* **Altura de un `Pane` junto a la transcripción**: cuando `e.props.placement` es `'dock'`, `e.props.scroll.bodyRows` es el número de filas que tiene el panel para tu árbol
254* **Altura de un `Pane` encima del prompt**: cuando `e.props.placement` es `'inline'`, el panel crece con tu árbol hasta un límite, y `bodyRows` es ese límite. Para solicitar un límite distinto, consulta el [campo `rows` de `$.ui.open`](/docs/es/plugins/mods/interface#open-a-pane-at-the-right-time).254* **Altura de un `Pane` encima del prompt**: cuando `e.props.placement` es `'inline'`, el panel crece con tu árbol hasta un límite, y `bodyRows` es ese límite. Para solicitar un límite distinto, consulta el [campo `rows` de `$.ui.open`](https://code.claude.com/docs/es/plugins/mods/interface#open-a-pane-at-the-right-time).
255 255
256Un árbol más alto que el panel se desplaza como un todo.256Un árbol más alto que el panel se desplaza como un todo.
257 257
258## Elementos258## Elementos
259 259
260Los elementos son los bloques de construcción de un árbol que devuelve un hook `ui.render`, y los obtienes de `$.ui.resolve(e)`. [Crea un árbol a partir de elementos](/docs/es/plugins/mods/interface.md#build-a-tree-from-elements) muestra los más comunes junto con cómo los dibuja la terminal, y la [galería de interfaces](/docs/es/plugins/mods/gallery.md) tiene capturas de pantalla de la mayoría. Una marca de verificación significa que la aplicación puede dibujar el elemento.260Los elementos son los bloques de construcción de un árbol que devuelve un hook `ui.render`, y los obtienes de `$.ui.resolve(e)`. [Crea un árbol a partir de elementos](https://code.claude.com/docs/es/plugins/mods/interface.md#build-a-tree-from-elements) muestra los más comunes junto con cómo los dibuja la terminal, y la [galería de interfaces](https://code.claude.com/docs/es/plugins/mods/gallery.md) tiene capturas de pantalla de la mayoría. Una marca de verificación significa que la aplicación puede dibujar el elemento.
261 261
262| Elemento | Props principales | Terminal | Escritorio | VS Code |262| Elemento | Props principales | Terminal | Escritorio | VS Code |
263| :- | :- | :-: | :-: | :-: |263| :- | :- | :-: | :-: | :-: |
264| [`Box`](/docs/es/plugins/mods/interface#build-a-tree-from-elements) | `key`, diseño flex, [`gap`, `padding`, `margin`](#box-spacing-steps), `width`, `height`, [`borderStyle`](#box-border-styles), `backgroundColor`, `position`, `hover` | ✓ | ✓ | ✓ |264| [`Box`](https://code.claude.com/docs/es/plugins/mods/interface#build-a-tree-from-elements) | `key`, diseño flex, [`gap`, `padding`, `margin`](#box-spacing-steps), `width`, `height`, `minWidth`, `minHeight`, [`borderStyle`](#box-border-styles), `borderColor`, `borderDimColor`, `backgroundColor`, `position`, `top`, `left`, `right`, `bottom`, `overflow`, `display`, `hover` | ✓ | ✓ | ✓ |
265| [`Text`](/docs/es/plugins/mods/interface#build-a-tree-from-elements) | `color`, `backgroundColor`, [`bold`](#text-bold), `italic`, `underline`, `dimColor`, `inverse`, `wrap`, [`size`, `weight`, `mono`, `tabular`](#text-typography) | ✓ | ✓ | ✓ |265| [`Text`](https://code.claude.com/docs/es/plugins/mods/interface#build-a-tree-from-elements) | `color`, `backgroundColor`, [`bold`](#text-bold), `italic`, `underline`, `strikethrough`, `dimColor`, `inverse`, `wrap`, [`size`, `weight`, `mono`, `tabular`](#text-typography), `hover` | ✓ | ✓ | ✓ |
266| [`Button`](/docs/es/plugins/mods/interface#respond-to-presses-and-typing) | `key`, `label`, `onPress`, `hotkey`, `plain`, `dimColor`, `autoFocus`, `action` | ✓ | ✓ | ✓ |266| [`Button`](https://code.claude.com/docs/es/plugins/mods/interface#respond-to-presses-and-typing) | `key`, `label`, `onPress`, `hotkey`, `plain`, `dimColor`, `autoFocus`, `action`, `hover` | ✓ | ✓ | ✓ |
267| [`Link`](/docs/es/plugins/mods/interface#link-in-the-desktop-app) | `href`, `label`. Consulta [Límites](#limits). | ✓ | ✓ | ✓ |267| [`Link`](https://code.claude.com/docs/es/plugins/mods/interface#link-in-the-desktop-app) | `href`, `label`. Consulta [Límites](#limits). | ✓ | ✓ | ✓ |
268| [`Code`](/docs/es/plugins/mods/gallery#show-code-and-changes) | `source`, `language`, `path`, `startLine`, `format`, `wrap` | ✓ | ✓ | ✓ |268| [`Code`](https://code.claude.com/docs/es/plugins/mods/gallery#show-code-and-changes) | `source`, `language`, `path`, `startLine`, `format`, `wrap` | ✓ | ✓ | ✓ |
269| `Markdown` | `text`, `key`, `dimColor`, `onLinkPress`, `pressableLinks` | ✓ | ✓ | ✓ |269| `Markdown` | `text`, `key`, `dimColor`, `onLinkPress`, `pressableLinks` | ✓ | ✓ | ✓ |
270| [`Input`](/docs/es/plugins/mods/interface#take-typed-input-and-draw-a-row-for-each-item) | `key`, `label`, `placeholder`, `value`, `submitLabel`, `onSubmit`, `onInput`, `autoFocus` | ✓ | ✓ | ✓ |270| [`Input`](https://code.claude.com/docs/es/plugins/mods/interface#take-typed-input-and-draw-a-row-for-each-item) | `key`, `label`, `placeholder`, `value`, `submitLabel`, `onSubmit`, `onInput`, `autoFocus` | ✓ | ✓ | ✓ |
271| `Select` | `key`, `label`, `options`, `value`, `onSelect`, `autoFocus` | ✓ | ✓ | ✓ |271| `Select` | `key`, `label`, `options`, `value`, `onSelect`, `autoFocus` | ✓ | ✓ | ✓ |
272| `Svg` | Un documento SVG, hasta 131,072 caracteres | | ✓ | ✓ |272| `Svg` | un `source` de marcado SVG de hasta 131,072 caracteres, texto `alt`, `width`, `height` e `isInteractive` | | ✓ | ✓ |
273| [`Client`](/docs/es/plugins/mods/interface#build-a-tree-from-elements) | `module`, `key` | ✓ | ✓ | |273| [`Client`](https://code.claude.com/docs/es/plugins/mods/interface#build-a-tree-from-elements) | `module`, `key`, `props`, `width`, `height`, `flexGrow` | ✓ | ✓ | |
274| [`Raster`](/docs/es/plugins/mods/interface#draw-a-grid-of-colored-cells) | `key`, `columns` hasta 512, `rows` hasta 256, `cells`. Consulta [Dibuja una cuadrícula de celdas de colores](/docs/es/plugins/mods/interface.md#draw-a-grid-of-colored-cells). | ✓ | | |274| [`Raster`](https://code.claude.com/docs/es/plugins/mods/interface#draw-a-grid-of-colored-cells) | `key`, `columns` hasta 512, `rows` hasta 256, `cells`. Consulta [Dibuja una cuadrícula de celdas de colores](https://code.claude.com/docs/es/plugins/mods/interface.md#draw-a-grid-of-colored-cells). | ✓ | | |
275| `Image` | Bytes PNG o RGBA de hasta 2 MiB, o una ruta de archivo, `columns` y `rows` hasta 255, y texto `alt`. Consulta [qué terminales lo dibujan](/docs/es/plugins/mods/gallery.md#image-and-client). | ✓ | | |275| `Image` | `key`, un `source` como bytes PNG o RGBA de hasta 2 MiB, o una ruta de archivo, `columns` y `rows` hasta 255, y texto `alt`. Consulta [qué terminales lo dibujan](https://code.claude.com/docs/es/plugins/mods/gallery.md#image-and-client). | ✓ | | |
276 276
277Más reglas de `Button`: `action` nombra una de las propias [acciones de atajos de teclado](/docs/es/keybindings.md) de Claude Code, y el atajo del usuario para ella presiona el botón cuando ese atajo es un acorde o una tecla con modificador. Un `hotkey` de dígito en un botón de la banda también se activa cuando el usuario escribe solo ese dígito en un prompt vacío y hace una pausa. Cuando dos botones de un mismo dibujo nombran el mismo `hotkey`, el último se queda con él. `autoFocus` solo acepta `true` en cualquier control, así que omite la prop para dejarla desactivada.277Más reglas de `Button`:
278
279* **`action`**: nombra una de las propias [acciones de atajos de teclado](https://code.claude.com/docs/es/keybindings.md) de Claude Code, y el atajo del usuario para ella presiona el botón cuando ese atajo es un acorde o una tecla con modificador
280* **Hotkeys de dígito en la banda**: un `hotkey` de dígito en un botón de la banda también se activa cuando el usuario escribe solo ese dígito en un prompt vacío y hace una pausa
281* **Una banda contraída**: mientras la banda está [contraída](https://code.claude.com/docs/es/plugins/mods/interface.md#when-the-user-collapses-the-band), ni un atajo de `action` ni un hotkey presionan un botón en ella
282* **Dos botones con un mismo hotkey**: cuando dos botones de un mismo dibujo nombran el mismo `hotkey`, el último se queda con él
283
284`autoFocus` solo acepta `true` en cualquier control, así que omite la prop para dejarla desactivada.
278 285
279La extensión de VS Code ignora algunas props de los elementos y dibuja el elemento como si las hubieras omitido:286La extensión de VS Code ignora algunas props de los elementos y dibuja el elemento como si las hubieras omitido:
280 287
281* **`Box`**: `position` y `hover`288* **`Box`**: `position` con sus `top`, `left`, `right` y `bottom`, `alignSelf`, `borderDimColor` y `hover`
282* **`Text`**: `size`, `mono` y `tabular`289* **`Text`**: `size`, `mono`, `tabular` y `hover`
283* **`Button`**: `hotkey`, `plain`, `autoFocus` y `action`, así que allí el usuario presiona un botón con un clic, o con Enter una vez que tiene el foco290* **`Button`**: `hotkey`, `plain`, `autoFocus`, `action` y `hover`, así que allí el usuario presiona un botón con un clic, o con Enter una vez que tiene el foco
284* **`Code`**: `language`, `path`, `startLine`, `format` y `wrap`, así que el código se dibuja sin colores ni números de línea, y un bloque `format: 'diff'` muestra el texto sin procesar del diff291* **`Code`**: `language`, `path`, `startLine`, `format` y `wrap`, así que el código se dibuja sin colores ni números de línea, y un bloque `format: 'diff'` muestra el texto sin procesar del diff
285* **`Input` y `Select`**: `autoFocus`292* **`Input` y `Select`**: `autoFocus`
293* **`Svg`**: `isInteractive`
286 294
287### Estilos de borde de `Box`295### Estilos de borde de `Box`
288 296
317 325
318Si estableces `gap`, `padding` o `margin` en un paso, el paso se aplica en horizontal y en vertical a la vez. Por ejemplo, en la terminal y en la extensión de VS Code, `padding: 'md'` equivale a dos celdas a cada lado y una fila arriba y abajo.326Si estableces `gap`, `padding` o `margin` en un paso, el paso se aplica en horizontal y en vertical a la vez. Por ejemplo, en la terminal y en la extensión de VS Code, `padding: 'md'` equivale a dos celdas a cada lado y una fila arriba y abajo.
319 327
320Los nombres de paso requieren Claude Code v2.1.299 o posterior. En una versión anterior, Claude Code [dibuja su propia versión del sitio](/docs/es/plugins/mods/interface.md#build-a-tree-from-elements) en lugar de un árbol que usa un nombre de paso.328Los nombres de paso requieren Claude Code v2.1.299 o posterior. En una versión anterior, Claude Code [dibuja su propia versión del sitio](https://code.claude.com/docs/es/plugins/mods/interface.md#build-a-tree-from-elements) en lugar de un árbol que usa un nombre de paso.
321 329
322### Props tipográficas de `Text`330### Props tipográficas de `Text`
323 331
330| `mono` | `true` para pedir la tipografía monoespaciada de la aplicación | Se ignora: la terminal siempre es monoespaciada | Se ignora, así que el texto conserva la tipografía propia de la extensión |338| `mono` | `true` para pedir la tipografía monoespaciada de la aplicación | Se ignora: la terminal siempre es monoespaciada | Se ignora, así que el texto conserva la tipografía propia de la extensión |
331| `tabular` | `true` para pedir dígitos de ancho uniforme, de modo que un número que se actualiza en su lugar o una columna de números se mantenga alineada | Se ignora: los dígitos de la terminal ya ocupan una celda de ancho | Se ignora |339| `tabular` | `true` para pedir dígitos de ancho uniforme, de modo que un número que se actualiza en su lugar o una columna de números se mantenga alineada | Se ignora: los dígitos de la terminal ya ocupan una celda de ancho | Se ignora |
332 340
333Estas cuatro props requieren Claude Code v2.1.299 o posterior. En una versión anterior, Claude Code [dibuja su propia versión del sitio](/docs/es/plugins/mods/interface.md#build-a-tree-from-elements) en lugar de un árbol que establece `size`, `weight`, `mono` o `tabular`.341Estas cuatro props requieren Claude Code v2.1.299 o posterior. En una versión anterior, Claude Code [dibuja su propia versión del sitio](https://code.claude.com/docs/es/plugins/mods/interface.md#build-a-tree-from-elements) en lugar de un árbol que establece `size`, `weight`, `mono` o `tabular`.
334 342
335#### Reemplaza `bold` por `weight`343#### Reemplaza `bold` por `weight`
336 344
337`bold` en un `Text` está obsoleto en favor de `weight` y sigue funcionando. Para reemplazarlo en un `Text` sin `weight`, cambia `bold: true` por `weight: 'semibold'` para obtener el mismo resultado en Claude Code v2.1.299 o posterior.345`bold` en un `Text` está obsoleto en favor de `weight` y sigue funcionando. Para reemplazarlo en un `Text` sin `weight`, cambia `bold: true` por `weight: 'semibold'` para obtener el mismo resultado en Claude Code v2.1.299 o posterior.
338 346
339En una versión anterior a v2.1.299, un árbol que establece `weight` no se dibuja, y Claude Code [dibuja su propia versión del sitio](/docs/es/plugins/mods/interface.md#build-a-tree-from-elements) en su lugar. Si estableces tanto `bold` como `weight` en un `Text`, `bold` no tiene efecto.347En una versión anterior a v2.1.299, un árbol que establece `weight` no se dibuja, y Claude Code [dibuja su propia versión del sitio](https://code.claude.com/docs/es/plugins/mods/interface.md#build-a-tree-from-elements) en su lugar. Si estableces tanto `bold` como `weight` en un `Text`, `bold` no tiene efecto.
340 348
341## Límites349## Límites
342 350
346| :- | :- |354| :- | :- |
347| El tiempo de ejecución propio de un hook para un evento, sin contar el tiempo dentro de `next` ni de una llamada a la API de mods distinta de `$.clock.sleep` | 10 segundos, o 50 milisegundos para un hook `prompt.edit` |355| El tiempo de ejecución propio de un hook para un evento, sin contar el tiempo dentro de `next` ni de una llamada a la API de mods distinta de `$.clock.sleep` | 10 segundos, o 50 milisegundos para un hook `prompt.edit` |
348| El tiempo de ejecución de un controlador `.catch` | 1 segundo |356| El tiempo de ejecución de un controlador `.catch` | 1 segundo |
349| Todos los hooks `session.end` en conjunto | Lo mismo que el [presupuesto del hook SessionEnd](/docs/es/hooks.md#sessionend-input), 1.5 segundos a menos que lo cambies, contado desde que terminan los hooks `SessionEnd` de tu configuración |357| Todos los hooks `session.end` en conjunto | Lo mismo que el [presupuesto del hook SessionEnd](https://code.claude.com/docs/es/hooks.md#sessionend-input), 1.5 segundos a menos que lo cambies, contado desde que terminan los hooks `SessionEnd` de tu configuración |
350| Tiempo de espera de `$.process.run` | 30 segundos de forma predeterminada, 10 minutos como máximo |358| Tiempo de espera de `$.process.run` | 30 segundos de forma predeterminada, 10 minutos como máximo |
351| `maxTokens` de `$.model.complete` | 1024 de forma predeterminada, hasta 64,000 o el límite de salida del modelo |359| `maxTokens` de `$.model.complete` | 1024 de forma predeterminada, hasta 64,000 o el límite de salida del modelo |
352| `$.fs.read` y `$.fs.write` | 4 MiB por archivo |360| `$.fs.read` y `$.fs.write` | 4 MiB por archivo |
354| El cuerpo de una respuesta de `$.http.fetch` | 4 MiB. `text` contiene los primeros 4 MiB y el resto no se lee. Cuando el encabezado `Content-Length` declara más, la llamada se rechaza en su lugar, con un motivo que termina en `is over the 4194304-byte limit`, excepto cuando la última solicitud después de cualquier redirección usa el método `HEAD`. La exención de `HEAD` requiere Claude Code v2.1.296 o posterior. |362| El cuerpo de una respuesta de `$.http.fetch` | 4 MiB. `text` contiene los primeros 4 MiB y el resto no se lee. Cuando el encabezado `Content-Length` declara más, la llamada se rechaza en su lugar, con un motivo que termina en `is over the 4194304-byte limit`, excepto cuando la última solicitud después de cualquier redirección usa el método `HEAD`. La exención de `HEAD` requiere Claude Code v2.1.296 o posterior. |
355| Una llamada a `$.http.fetch`, incluidos las redirecciones y el cuerpo | 30 segundos |363| Una llamada a `$.http.fetch`, incluidos las redirecciones y el cuerpo | 30 segundos |
356| Redirecciones que sigue una llamada a `$.http.fetch` | 5 |364| Redirecciones que sigue una llamada a `$.http.fetch` | 5 |
357| El motivo de `drop` de un hook o el motivo de `deny` de `config.set` | 4,096 caracteres. Se corta el final de un motivo más largo, y el drop o deny se sigue aplicando. El corte requiere Claude Code v2.1.292 o posterior, y en versiones anteriores el hook [falla](/docs/es/plugins/mods/events.md#handle-a-hook-that-fails) en su lugar. |365| El motivo de `drop` de un hook o el motivo de `deny` de `config.set` | 4,096 caracteres. Se corta el final de un motivo más largo, y el drop o deny se sigue aplicando. El corte requiere Claude Code v2.1.292 o posterior, y en versiones anteriores el hook [falla](https://code.claude.com/docs/es/plugins/mods/events.md#handle-a-hook-that-fails) en su lugar. |
358| Texto en un árbol | Se dibujan los primeros 100,000 caracteres |366| Texto en un árbol | Se dibujan los primeros 100,000 caracteres |
359| El `language` o `path` de un `Code`, el `value` de una opción de `Select` o el `module` de un `Client` | 10,000 caracteres. Si alguno es más largo, Claude Code [dibuja su propia versión del sitio](/docs/es/plugins/mods/interface.md#build-a-tree-from-elements). |367| El `language` o `path` de un `Code`, el `value` de una opción de `Select` o el `module` de un `Client` | 10,000 caracteres. Si alguno es más largo, Claude Code [dibuja su propia versión del sitio](https://code.claude.com/docs/es/plugins/mods/interface.md#build-a-tree-from-elements). |
360| El `href` de un `Link` | 2,048 caracteres. Un `href` más largo impide que se dibuje todo el árbol. |368| El `href` de un `Link` | 2,048 caracteres. Un `href` más largo impide que se dibuje todo el árbol. |
361| `$.store` | 4 MiB de JSON en total |369| `$.store` | 4 MiB de JSON en total |
362| `$.session.messages()` | Las 4,096 entradas más recientes |370| `$.session.messages()` | Las 4,096 entradas más recientes |
375| :- | :- | :- |383| :- | :- | :- |
376| `CLAUDE_CODE_PLUGIN_DIRS` | Entorno, o `env` en `~/.claude/settings.json` | Directorios de plugins que se cargan como lo hace `--plugin-dir`, para aplicaciones a las que no puedes pasar un flag. Rutas absolutas separadas por `:`, o por `;` en Windows. |384| `CLAUDE_CODE_PLUGIN_DIRS` | Entorno, o `env` en `~/.claude/settings.json` | Directorios de plugins que se cargan como lo hace `--plugin-dir`, para aplicaciones a las que no puedes pasar un flag. Rutas absolutas separadas por `:`, o por `;` en Windows. |
377| `CLAUDE_CODE_PLUGIN_DIR_WATCH` | Entorno | `1` hace que una sesión no interactiva de larga duración recargue los mods de `--plugin-dir` al guardar |385| `CLAUDE_CODE_PLUGIN_DIR_WATCH` | Entorno | `1` hace que una sesión no interactiva de larga duración recargue los mods de `--plugin-dir` al guardar |
378| `prependPlugins`, `appendPlugins` | Configuración administrada. Configuración de usuario solo en una máquina sin configuración administrada, en una sesión cuya credencial no sea un `/login` de Team o Enterprise. | Listas de ids de plugins, como `acme-guard@acme-tools`. Los mods en `prependPlugins` se ejecutan antes de cada mod que instala un usuario, y los mods en `appendPlugins` se ejecutan después, en el orden indicado. Consulta [El orden en que se ejecutan los mods](/docs/es/plugins/mods/events.md#the-order-mods-run-in). |386| `prependPlugins`, `appendPlugins` | Configuración administrada. Configuración de usuario solo en una máquina sin configuración administrada, en una sesión cuya credencial no sea un `/login` de Team o Enterprise. | Listas de ids de plugins, como `acme-guard@acme-tools`. Los mods en `prependPlugins` se ejecutan antes de cada mod que instala un usuario, y los mods en `appendPlugins` se ejecutan después, en el orden indicado. Consulta [El orden en que se ejecutan los mods](https://code.claude.com/docs/es/plugins/mods/events.md#the-order-mods-run-in). |
379| `allowManagedModsOnly` | Configuración administrada, como una [opción de la protección integrada](/docs/es/plugins/mods/admin.md#set-options-on-the-built-in-guard) | Solo los mods que [cuentan como de tu organización](/docs/es/plugins/mods/admin.md#install-your-organizations-mods) y los mods integrados en Claude Code ejecutan sus hooks. Los hooks de configuración de los usuarios siguen ejecutándose. |387| `allowManagedModsOnly` | Configuración administrada, como una [opción de la protección integrada](https://code.claude.com/docs/es/plugins/mods/admin.md#set-options-on-the-built-in-guard) | Solo los mods que [cuentan como de tu organización](https://code.claude.com/docs/es/plugins/mods/admin.md#install-your-organizations-mods) y los mods integrados en Claude Code ejecutan sus hooks. Los hooks de configuración de los usuarios siguen ejecutándose. |
380| `allowModsToOverrideDenyRules` | Configuración administrada, como una [opción de la protección integrada](/docs/es/plugins/mods/admin.md#set-options-on-the-built-in-guard) | Permite que un mod instalado por un usuario apruebe una llamada a herramienta que una regla `deny` rechaza |388| `allowModsToOverrideDenyRules` | Configuración administrada, como una [opción de la protección integrada](https://code.claude.com/docs/es/plugins/mods/admin.md#set-options-on-the-built-in-guard) | Permite que un mod instalado por un usuario apruebe una llamada a herramienta que una regla `deny` rechaza |
381| `allowManagedHooksOnly` | Configuración administrada | Bloquea los hooks y los mods instalados que no son de tu organización. Consulta [qué sigue ejecutándose](/docs/es/settings-reference.md#what-runs-under-allowmanagedhooksonly). |389| `allowManagedHooksOnly` | Configuración administrada | Bloquea los hooks y los mods instalados que no son de tu organización. Consulta [qué sigue ejecutándose](https://code.claude.com/docs/es/settings-reference.md#what-runs-under-allowmanagedhooksonly). |
382| `disableAllHooks` | Cualquier archivo de configuración | En la configuración administrada, no se ejecuta ningún mod ni hook de un plugin instalado. En tu propia configuración, lo que administra tu organización sigue ejecutándose. Consulta [`disableAllHooks`](/docs/es/settings-reference#disableallhooks). |390| `disableAllHooks` | Cualquier archivo de configuración | En la configuración administrada, no se ejecuta ningún mod ni hook de un plugin instalado. En tu propia configuración, lo que administra tu organización sigue ejecutándose. Consulta [`disableAllHooks`](https://code.claude.com/docs/es/settings-reference#disableallhooks). |
383| `disableSideloadFlags` | Configuración administrada | Rechaza `--plugin-dir` y `--plugin-url` al inicio |391| `disableSideloadFlags` | Configuración administrada | Rechaza `--plugin-dir` y `--plugin-url` al inicio |
384| `pluginConfigs` | Configuración de usuario o administrada | Contiene los valores de `userConfig` de un mod, indexados por el id del plugin, como `acme-guard@acme-tools`, o por su nombre y `@inline`, como `first-mod@inline`, para uno cargado con `--plugin-dir` |392| `pluginConfigs` | Configuración de usuario o administrada | Contiene los valores de `userConfig` de un mod, indexados por el id del plugin, como `acme-guard@acme-tools`, o por su nombre y `@inline`, como `first-mod@inline`, para uno cargado con `--plugin-dir` |
385 393
386`sec-default@builtin` es una protección integrada en Claude Code, que aparece como `cc-plugin-sec-default` en `/plugin` y en el registro de depuración. Se carga antes de cada mod que una persona instala en una máquina con configuración administrada, o en una sesión cuya credencial sea un [`/login`](/docs/es/authentication#authentication-precedence) de Team o Enterprise. Si se establece `prependPlugins` en la configuración administrada, la protección solo se carga cuando esa lista la nombra, en la posición indicada.394`sec-default@builtin` es una protección integrada en Claude Code, que aparece como `cc-plugin-sec-default` en `/plugin` y en el registro de depuración. Se carga antes de cada mod que una persona instala en una máquina con configuración administrada, o en una sesión cuya credencial sea un [`/login`](https://code.claude.com/docs/es/authentication#authentication-precedence) de Team o Enterprise. Si se establece `prependPlugins` en la configuración administrada, la protección solo se carga cuando esa lista la nombra, en la posición indicada.
387 395
388Su código fuente está en el [directorio `mods/sec-default` del repositorio de Claude Code](https://github.com/anthropics/claude-code/tree/main/mods/sec-default).396Su código fuente está en el [directorio `mods/sec-default` del repositorio de Claude Code](https://github.com/anthropics/claude-code/tree/main/mods/sec-default).
389 397
393 401
394| Comando | Qué hace |402| Comando | Qué hace |
395| :- | :- |403| :- | :- |
396| [`/plugin`](/docs/es/plugins/mods/overview#see-which-mods-a-session-loaded) | Muestra una línea como `1 mod active · first-mod` debajo de sus pestañas cuando se ha cargado un mod que no viene integrado |404| [`/plugin`](https://code.claude.com/docs/es/plugins/mods/overview#see-which-mods-a-session-loaded) | Muestra una línea como `1 mod active · first-mod` debajo de sus pestañas cuando se ha cargado un mod que no viene integrado |
397| [`claude plugin validate <directory>`](/docs/es/plugins/mods/create#check-what-claude-code-reads-from-your-mod) | Lee el manifiesto y el módulo de hooks de un plugin e informa los errores, los eventos que maneja y las llamadas a la API de mods que realiza. `--strict` trata las advertencias como errores y `--json` imprime un informe legible por máquina. |405| [`claude plugin validate <directory>`](https://code.claude.com/docs/es/plugins/mods/create#check-what-claude-code-reads-from-your-mod) | Lee el manifiesto y el módulo de hooks de un plugin e informa los errores, los eventos que maneja y las llamadas a la API de mods que realiza. `--strict` trata las advertencias como errores y `--json` imprime un informe legible por máquina. |
398| [`claude plugin test [directory]`](/docs/es/plugins/mods/test#write-a-test) | Ejecuta cada archivo dentro del directorio, o del directorio actual cuando no indicas ninguno, cuyo nombre termina en `.test.ts` o `.test.tsx`. Sale con estado 1 cuando una prueba falla. |406| [`claude plugin test [directory]`](https://code.claude.com/docs/es/plugins/mods/test#write-a-test) | Ejecuta cada archivo dentro del directorio, o del directorio actual cuando no indicas ninguno, cuyo nombre termina en `.test.ts` o `.test.tsx`. Sale con estado 1 cuando una prueba falla. |
399| [`claude --plugin-dir <directory>`](/docs/es/plugins/mods/create#write-a-mod-yourself) | Carga un directorio de plugin durante una sesión y vuelve a cargar su módulo de hooks cuando guardas. Repite el flag para cargar varios. |407| [`claude --plugin-dir <directory>`](https://code.claude.com/docs/es/plugins/mods/create#write-a-mod-yourself) | Carga un directorio de plugin durante una sesión y vuelve a cargar su módulo de hooks cuando guardas. Repite el flag para cargar varios. |
400| `/reload-plugins` | Vuelve a cargar los plugins cuando lo ejecutas |408| `/reload-plugins` | Vuelve a cargar los plugins cuando lo ejecutas |