6 6
7> Claude Code mod에 대한 전체 참조: 훅 모듈 레이아웃, 이벤트, mods API 메서드, 렌더링 지점, 사용 환경별 요소, 제한 및 설정.7> Claude Code mod에 대한 전체 참조: 훅 모듈 레이아웃, 이벤트, mods API 메서드, 렌더링 지점, 사용 환경별 요소, 제한 및 설정.
8 8
9[mod](/docs/ko/plugins/mods/overview.md)가 처리할 수 있는 이벤트, 호출할 수 있는 mods API 메서드, 그릴 수 있는 렌더링 지점을 찾아볼 수 있습니다. 항목은 v2.1.290 기준 Claude Code CLI 및 Desktop 앱과 v2.1.299 기준 VS Code 확장 프로그램을 다룹니다. 각 항목에는 이름과 한 줄 설명이 있으며, 이를 설명하는 가이드 섹션이 있는 경우 해당 섹션으로 연결됩니다.9[mod](https://code.claude.com/docs/ko/plugins/mods/overview.md)가 처리할 수 있는 이벤트, 호출할 수 있는 mods API 메서드, 그릴 수 있는 렌더링 지점을 찾아볼 수 있습니다. 항목은 v2.1.290 기준 Claude Code CLI 및 Desktop 앱과 v2.1.299 기준 VS Code 확장 프로그램을 다룹니다. 각 항목에는 이름과 한 줄 설명이 있으며, 이를 설명하는 가이드 섹션이 있는 경우 해당 섹션으로 연결됩니다.
10 10
11> [!NOTE]11> [!NOTE]
12>12>
13> 전체 참조는 Claude Code의 [mod용 TypeScript 선언](https://github.com/anthropics/claude-code/blob/main/mods/types/claude-code.d.ts)으로, 모든 이벤트, 메서드, 요소를 예제와 함께 설명합니다. GitHub의 사본은 설치된 Claude Code 버전보다 오래된 것일 수 있습니다. 두 내용이 서로 다를 경우 [Claude Code가 해당 버전에 맞게 작성하는 사본](/docs/ko/plugins/mods/create.md#get-the-types-for-your-build)을 신뢰하십시오.13> 전체 참조는 Claude Code의 [mod용 TypeScript 선언](https://github.com/anthropics/claude-code/blob/main/mods/types/claude-code.d.ts)으로, 모든 이벤트, 메서드, 요소를 예제와 함께 설명합니다. GitHub의 사본은 설치된 Claude Code 버전보다 오래된 것일 수 있습니다. 두 내용이 서로 다를 경우 [Claude Code가 해당 버전에 맞게 작성하는 사본](https://code.claude.com/docs/ko/plugins/mods/create.md#get-the-types-for-your-build)을 신뢰하십시오.
14 14
15## 파일15## 파일
16 16
18 18
19| 파일 | 필수 여부 | 내용 |19| 파일 | 필수 여부 | 내용 |
20| :- | :- | :- |20| :- | :- | :- |
21| `.claude-plugin/plugin.json` | 예 | 플러그인 [매니페스트](/docs/ko/plugins/manifest-reference.md)입니다. mod는 필수 필드를 추가하지 않습니다. |21| `.claude-plugin/plugin.json` | 예 | 플러그인 [매니페스트](https://code.claude.com/docs/ko/plugins/manifest-reference.md)입니다. mod는 필수 필드를 추가하지 않습니다. |
22| `hooks/hooks.json` | 예 | `modules`: `"modules": ["./register.js"]`처럼 훅 모듈에 대한 경로 하나를 이 파일 기준 상대 경로로 담은 배열입니다. `hooks` 아래에 [설정 훅](/docs/ko/hooks.md)을 포함할 수도 있습니다. |22| `hooks/hooks.json` | 예 | `modules`: `"modules": ["./register.js"]`처럼 훅 모듈에 대한 경로 하나를 이 파일 기준 상대 경로로 담은 배열입니다. `hooks` 아래에 [설정 훅](https://code.claude.com/docs/ko/hooks.md)을 포함할 수도 있습니다. |
23| [`hooks/register.js`](/docs/ko/plugins/mods/create#write-a-mod-yourself)와 같은 훅 모듈 | 예 | mod의 진입점입니다. `register(on, options)`를 내보냅니다. 파일 이름은 `.js`, `.mjs`, `.cjs`, `.jsx`, `.ts`, `.mts`, `.cts` 또는 `.tsx`로 끝납니다. ES 모듈입니다. |23| [`hooks/register.js`](https://code.claude.com/docs/ko/plugins/mods/create#write-a-mod-yourself)와 같은 훅 모듈 | 예 | mod의 진입점입니다. `register(on, options)`를 내보냅니다. 파일 이름은 `.js`, `.mjs`, `.cjs`, `.jsx`, `.ts`, `.mts`, `.cts` 또는 `.tsx`로 끝납니다. ES 모듈입니다. |
24| 매니페스트의 `types`로 지정된 [`types/index.d.ts`](/docs/ko/plugins/mods/interface#declare-the-values) | mod가 `$.state`를 사용하거나 mods API에 네임스페이스를 추가하는 경우 | `PluginState` 값과 mod가 추가하는 모든 네임스페이스를 선언합니다 |24| 매니페스트의 `types`로 지정된 [`types/index.d.ts`](https://code.claude.com/docs/ko/plugins/mods/interface#declare-the-values) | mod가 `$.state`를 사용하거나 mods API에 네임스페이스를 추가하는 경우 | `PluginState` 값과 mod가 추가하는 모든 네임스페이스를 선언합니다 |
25| 이름이 `.test.ts` 또는 `.test.tsx`로 끝나는 파일 | 아니요 | [`claude plugin test`](/docs/ko/plugins/mods/test#write-a-test)가 실행하는 테스트입니다 |25| 이름이 `.test.ts` 또는 `.test.tsx`로 끝나는 파일 | 아니요 | [`claude plugin test`](https://code.claude.com/docs/ko/plugins/mods/test#write-a-test)가 실행하는 테스트입니다 |
26 26
27`register`는 `on`과 `options`를 받습니다. `options`에는 매니페스트가 선언한 [`userConfig`](/docs/ko/plugins/components#user-configuration) 필드의 값이 기본값이 채워진 상태로 담겨 있습니다.27`register`는 `on`과 `options`를 받습니다. `options`에는 매니페스트가 선언한 [`userConfig`](https://code.claude.com/docs/ko/plugins/components#user-configuration) 필드의 값이 기본값이 채워진 상태로 담겨 있습니다.
28 28
29## 훅 함수29## 훅 함수
30 30
31mod는 `register` 안에서 `on`을 호출하여 이벤트 핸들러인 각 훅을 등록합니다. `on`은 이벤트 이름, 이벤트 필드에 대한 필터인 선택적 [matcher](/docs/ko/plugins/mods/events.md#filter-which-events-a-hook-handles), 그리고 훅을 인수로 받으며, 예를 들면 `on('tool.call', { tool: 'Bash' }, async ($, e, next) => next(e))`와 같습니다. `on`은 메서드 하나, 즉 `.catch(handler)`를 가진 등록 객체를 반환하며, 이 메서드는 훅의 [오류 핸들러](/docs/ko/plugins/mods/events.md#handle-a-hook-that-fails)를 설정합니다.31mod는 `register` 안에서 `on`을 호출하여 이벤트 핸들러인 각 훅을 등록합니다. `on`은 이벤트 이름, 이벤트 필드에 대한 필터인 선택적 [matcher](https://code.claude.com/docs/ko/plugins/mods/events.md#filter-which-events-a-hook-handles), 그리고 훅을 인수로 받으며, 예를 들면 `on('tool.call', { tool: 'Bash' }, async ($, e, next) => next(e))`와 같습니다. `on`은 메서드 하나, 즉 `.catch(handler)`를 가진 등록 객체를 반환하며, 이 메서드는 훅의 [오류 핸들러](https://code.claude.com/docs/ko/plugins/mods/events.md#handle-a-hook-that-fails)를 설정합니다.
32 32
33| 인수 | 설명 |33| 인수 | 설명 |
34| :- | :- |34| :- | :- |
35| [`$`](/docs/ko/plugins/mods/events#how-a-hook-handles-an-event) | mods API: [mods API 메서드](#mods-api-methods)에 있는 모든 메서드입니다. 각 호출은 `$.fs.read('notes.md')`처럼 네임스페이스 다음에 메서드를 붙여 전체 형태로 작성합니다. |35| [`$`](https://code.claude.com/docs/ko/plugins/mods/events#how-a-hook-handles-an-event) | mods API: [mods API 메서드](#mods-api-methods)에 있는 모든 메서드입니다. 각 호출은 `$.fs.read('notes.md')`처럼 네임스페이스 다음에 메서드를 붙여 전체 형태로 작성합니다. |
36| [`e`](/docs/ko/plugins/mods/events#how-a-hook-handles-an-event) | 깊게 동결된 일반 데이터 형태의 이벤트 입력입니다. 이를 변경하려면 복사본을 `next`에 전달합니다. |36| [`e`](https://code.claude.com/docs/ko/plugins/mods/events#how-a-hook-handles-an-event) | 깊게 동결된 일반 데이터 형태의 이벤트 입력입니다. 이를 변경하려면 복사본을 `next`에 전달합니다. |
37| [`next(e)`](/docs/ko/plugins/mods/events#how-a-hook-handles-an-event) | 미들웨어에서와 같은 다음 핸들러입니다. 이 훅 이후의 훅들을 실행한 다음 Claude Code의 동작을 실행합니다. 이벤트의 결과로 resolve됩니다. |37| [`next(e)`](https://code.claude.com/docs/ko/plugins/mods/events#how-a-hook-handles-an-event) | 미들웨어에서와 같은 다음 핸들러입니다. 이 훅 이후의 훅들을 실행한 다음 Claude Code의 동작을 실행합니다. 이벤트의 결과로 resolve됩니다. |
38| [`next.signal`](/docs/ko/plugins/mods/api#stop-background-work) | 이벤트가 중단되면 abort되는 `AbortSignal`입니다 |38| [`next.signal`](https://code.claude.com/docs/ko/plugins/mods/api#stop-background-work) | 이벤트가 중단되면 abort되는 `AbortSignal`입니다 |
39| `next.origin` | 이벤트를 발생시킨 주체의 `{ plugin, tier }`입니다. Claude Code 자체는 `{ plugin: 'engine', tier: 'core' }`입니다. mod의 `tier`는 [mod 실행 순서](/docs/ko/plugins/mods/events.md#the-order-mods-run-in)에서의 우선순위 그룹으로, `prepend`, `user`, `append`, `builtin` 중 하나입니다. |39| `next.origin` | 이벤트를 발생시킨 주체의 `{ plugin, tier }`입니다. Claude Code 자체는 `{ plugin: 'engine', tier: 'core' }`입니다. mod의 `tier`는 [mod 실행 순서](https://code.claude.com/docs/ko/plugins/mods/events.md#the-order-mods-run-in)에서의 우선순위 그룹으로, `prepend`, `user`, `append`, `builtin` 중 하나입니다. |
40| `next.budget` | 밀리초 단위의 훅 시간 제한입니다. `next.budget.ms`는 전체 제한이고, `next.budget.remainingMs`는 현재 남은 시간입니다 |40| `next.budget` | 밀리초 단위의 훅 시간 제한입니다. `next.budget.ms`는 전체 제한이고, `next.budget.remainingMs`는 현재 남은 시간입니다 |
41| `next.to(e, tier)` | 이후의 tier인 `append`, `builtin`, `core` 중 하나로 건너뜁니다. `next.to(e, 'append')`는 사용자가 설치한 mod를 건너뜁니다. `prependPlugins` 또는 `appendPlugins`에 있는 mod만 이를 호출할 수 있습니다. |41| `next.to(e, tier)` | 이후의 tier인 `append`, `builtin`, `core` 중 하나로 건너뜁니다. `next.to(e, 'append')`는 사용자가 설치한 mod를 건너뜁니다. `prependPlugins` 또는 `appendPlugins`에 있는 mod만 이를 호출할 수 있습니다. |
42| `next.error` | `.catch` 핸들러에서만 사용할 수 있습니다. 훅이 실패한 경우 `kind`는 `throw` 또는 `timeout`이고, `message`는 오류의 텍스트입니다. 이벤트가 해당 훅의 mods API 호출 내부 또는 훅 외부에 있는 mod 코드의 mods API 호출 내부에서 발생하여 훅을 건너뛴 경우 `kind`는 `re-entry`입니다. `re-entry`는 Claude Code v2.1.292 이상이 필요합니다. |42| `next.error` | `.catch` 핸들러에서만 사용할 수 있습니다. 훅이 실패한 경우 `kind`는 `throw` 또는 `timeout`이고, `message`는 오류의 텍스트입니다. 이벤트가 해당 훅의 mods API 호출 내부 또는 훅 외부에 있는 mod 코드의 mods API 호출 내부에서 발생하여 훅을 건너뛴 경우 `kind`는 `re-entry`입니다. `re-entry`는 Claude Code v2.1.292 이상이 필요합니다. |
43| `next.error.cause` | `kind`가 `re-entry`인 경우에만 설정됩니다. `tool.call` 또는 [`PreToolUse`](/docs/ko/hooks#pretooluse) 훅이 이벤트가 발생한 mods API 호출을 변경했거나, `agent.spawn` 훅이 해당 호출로 시작된 에이전트를 변경한 경우 `rewritten`입니다. 다른 mod가 mods API에 추가한 메서드가 해당 이벤트를 발생시킨 경우, `rewritten`에도 해당하지 않는 한 `lent`입니다. `lent`는 Claude Code v2.1.292 이상, `rewritten`은 v2.1.300 이상이 필요합니다. |43| `next.error.cause` | `kind`가 `re-entry`인 경우에만 설정됩니다. `tool.call` 또는 [`PreToolUse`](https://code.claude.com/docs/ko/hooks#pretooluse) 훅이 이벤트가 발생한 mods API 호출을 변경했거나, `agent.spawn` 훅이 해당 호출로 시작된 에이전트를 변경한 경우 `rewritten`입니다. 다른 mod가 mods API에 추가한 메서드가 해당 이벤트를 발생시킨 경우, `rewritten`에도 해당하지 않는 한 `lent`입니다. `lent`는 Claude Code v2.1.292 이상, `rewritten`은 v2.1.300 이상이 필요합니다. |
44| `next.called` | `.catch` 핸들러에서만 사용할 수 있습니다. 훅이 `next`를 호출한 경우 `true`입니다. |44| `next.called` | `.catch` 핸들러에서만 사용할 수 있습니다. 훅이 `next`를 호출한 경우 `true`입니다. |
45 45
46## 이벤트46## 이벤트
55 55
56| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |56| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |
57| :- | :- | :- |57| :- | :- | :- |
58| [`tool.call`](/docs/ko/plugins/mods/events#guard-or-change-a-tool-call) | 도구가 실행되기 직전 | `next(e)`, `{ deny: reason }` 또는 `{ result }` |58| [`tool.call`](https://code.claude.com/docs/ko/plugins/mods/events#guard-or-change-a-tool-call) | 도구가 실행되기 직전 | `next(e)`, `{ deny: reason }` 또는 `{ result }` |
59| [`tool.check`](/docs/ko/plugins/mods/events#where-settings-hooks-run-in-the-order) | `tool.call` 및 `PreToolUse` 훅 이후, Claude Code가 도구 호출의 실행 허용 여부를 결정할 때. `next(e)`는 규칙, 권한 모드, 그리고 해당 훅들이 내린 결정으로 확정됩니다. | `next(e)` 또는 `{ decision }`. `decision`은 `allow`, `ask` 또는 `deny`로 설정하며, 선택적으로 `reason`을 함께 지정할 수 있습니다 |59| [`tool.check`](https://code.claude.com/docs/ko/plugins/mods/events#where-settings-hooks-run-in-the-order) | `tool.call` 및 `PreToolUse` 훅 이후, Claude Code가 도구 호출의 실행 허용 여부를 결정할 때. `next(e)`는 규칙, 권한 모드, 그리고 해당 훅들이 내린 결정으로 확정됩니다. | `next(e)` 또는 `{ decision }`. `decision`은 `allow`, `ask` 또는 `deny`로 설정하며, 선택적으로 `reason`을 함께 지정할 수 있습니다 |
60| `tool.describe` | 각 도구의 설명이 Claude에 처음 전송될 때 도구마다 한 번. MCP 도구의 경우 Claude가 [도구 검색](/docs/ko/mcp.md#scale-with-mcp-tool-search)을 통해 해당 도구를 로드할 때 한 번 더 발생하며, 이때 `e.description`은 로드된 도구에 대해 Claude가 읽는 텍스트로 설정됩니다. | `{ description }`. 선택적으로 `isDeferred`를 함께 지정할 수 있으며, `true`로 설정하면 도구를 도구 검색 뒤에 두고 `false`로 설정하면 처음부터 로드합니다 |60| `tool.describe` | 각 도구의 설명이 Claude에 처음 전송될 때 도구마다 한 번. MCP 도구의 경우 Claude가 [도구 검색](https://code.claude.com/docs/ko/mcp.md#scale-with-mcp-tool-search)을 통해 해당 도구를 로드할 때 한 번 더 발생하며, 이때 `e.description`은 로드된 도구에 대해 Claude가 읽는 텍스트로 설정됩니다. | `{ description }`. 선택적으로 `isDeferred`를 함께 지정할 수 있으며, `true`로 설정하면 도구를 도구 검색 뒤에 두고 `false`로 설정하면 처음부터 로드합니다 |
61 61
62#### `tool.check`의 에이전트 및 조직 필드62#### `tool.check`의 에이전트 및 조직 필드
63 63
64`tool.check` 훅에서 다음 필드를 읽어 서브에이전트의 호출과 메인 대화의 호출을 구분하고, 조직이 커넥터 도구에 대해 승인을 요구하는지 확인할 수 있습니다.64`tool.check` 훅에서 다음 필드를 읽어 서브에이전트의 호출과 메인 대화의 호출을 구분하고, 조직이 커넥터 도구에 대해 승인을 요구하는지 확인할 수 있습니다.
65 65
66* **`e.agentId`**: [서브에이전트](/docs/ko/sub-agents.md) 또는 [인프로세스 팀원](/docs/ko/agent-teams.md#choose-a-display-mode)이 호출할 때 설정되며, 메인 대화가 호출할 때는 없습니다66* **`e.agentId`**: [서브에이전트](https://code.claude.com/docs/ko/sub-agents.md) 또는 [인프로세스 팀원](https://code.claude.com/docs/ko/agent-teams.md#choose-a-display-mode)이 호출할 때 설정되며, 메인 대화가 호출할 때는 없습니다
67* **`e.ceiling`**: [해당 설정이 Claude Code에 적용되는 세션](/docs/ko/mcp.md#organization-controls-on-connector-tools)에서, 조직이 `ask`로 설정한 커넥터 도구의 경우 `ask`입니다67* **`e.ceiling`**: [해당 설정이 Claude Code에 적용되는 세션](https://code.claude.com/docs/ko/mcp.md#organization-controls-on-connector-tools)에서, 조직이 `ask`로 설정한 커넥터 도구의 경우 `ask`입니다
68 68
69`tool.check`에서 `e.agentId`와 `e.ceiling`을 사용하려면 Claude Code v2.1.290 이상이 필요합니다.69`tool.check`에서 `e.agentId`와 `e.ceiling`을 사용하려면 Claude Code v2.1.290 이상이 필요합니다.
70 70
71#### `tool.check`의 `e.isReadOnly` 필드71#### `tool.check`의 `e.isReadOnly` 필드
72 72
73`tool.check` 훅에서 `e.isReadOnly`는 도구가 이 호출을 읽기 전용으로 보고할 때 `true`입니다. 그렇지 않으면 이 필드는 `false`가 아니라 아예 없습니다. 이 값은 도구 자체의 보고이므로, 이 필드만으로 호출을 승인하기 전에 [도구 호출이 읽기 전용인지 확인하기](/docs/ko/plugins/mods/events.md#check-whether-a-tool-call-is-read-only)를 먼저 읽어 보세요.73`tool.check` 훅에서 `e.isReadOnly`는 도구가 이 호출을 읽기 전용으로 보고할 때 `true`입니다. 그렇지 않으면 이 필드는 `false`가 아니라 아예 없습니다. 이 값은 도구 자체의 보고이므로, 이 필드만으로 호출을 승인하기 전에 [도구 호출이 읽기 전용인지 확인하기](https://code.claude.com/docs/ko/plugins/mods/events.md#check-whether-a-tool-call-is-read-only)를 먼저 읽어 보세요.
74 74
75`tool.check`에서 `e.isReadOnly`를 사용하려면 Claude Code v2.1.304 이상이 필요합니다.75`tool.check`에서 `e.isReadOnly`를 사용하려면 Claude Code v2.1.304 이상이 필요합니다.
76 76
80 80
81| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |81| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |
82| :- | :- | :- |82| :- | :- | :- |
83| [`prompt.submit`](/docs/ko/plugins/mods/events#rewrite-or-add-to-a-prompt) | 프롬프트가 제출될 때 | `next({ ...e, text })`, `next({ ...e, context })` 또는 `{ drop: reason }` |83| [`prompt.submit`](https://code.claude.com/docs/ko/plugins/mods/events#rewrite-or-add-to-a-prompt) | 프롬프트가 제출될 때 | `next({ ...e, text })`, `next({ ...e, context })` 또는 `{ drop: reason }` |
84| `prompt.fill`, `prompt.suggest` | 텍스트가 초안으로, 또는 흐린 제안으로 프롬프트 입력란에 들어가기 직전 | 텍스트를 변경한 `next(e)` |84| `prompt.fill`, `prompt.suggest` | 텍스트가 초안으로, 또는 흐린 제안으로 프롬프트 입력란에 들어가기 직전 | 텍스트를 변경한 `next(e)` |
85| `prompt.edit` | 사용자가 프롬프트 입력란을 편집할 때 | `next(e)` |85| `prompt.edit` | 사용자가 프롬프트 입력란을 편집할 때 | `next(e)` |
86| `prompt.autocomplete` | 사용자가 프롬프트 입력란에 입력하고 커서 위치에서 단어가 끝날 때. `e.token`은 해당 단어입니다. Claude Code는 훅을 기다리지 않으며, 자체 자동 완성 행이 먼저 표시됩니다. | `{ suggestions }`(Claude Code 자체 행 아래에 표시되는 `{ text, label, description }` 행 목록). 행을 선택하면 해당 행의 `text`가 단어를 대체합니다. |86| `prompt.autocomplete` | 사용자가 프롬프트 입력란에 입력하고 커서 위치에서 단어가 끝날 때. `e.token`은 해당 단어입니다. Claude Code는 훅을 기다리지 않으며, 자체 자동 완성 행이 먼저 표시됩니다. | `{ suggestions }`(Claude Code 자체 행 아래에 표시되는 `{ text, label, description }` 행 목록). 행을 선택하면 해당 행의 `text`가 단어를 대체합니다. |
87| `prompt.compose` | Claude Code가 시스템 프롬프트를 렌더링할 때 | `{ sections }`(전송 순서대로 나열한 `{ id, text, scope }` 목록) |87| `prompt.compose` | Claude Code가 시스템 프롬프트를 렌더링할 때 | `{ sections }`(전송 순서대로 나열한 `{ id, text, scope }` 목록) |
88| [`prompt.section`](/docs/ko/plugins/mods/events#rewrite-or-add-to-a-prompt) | 시스템 프롬프트의 이름 있는 섹션마다 한 번. `e.name`은 `prompt.compose`에서의 섹션 `id`입니다. | `{ text }`, 또는 섹션을 생략하려면 `{ text: null }` |88| [`prompt.section`](https://code.claude.com/docs/ko/plugins/mods/events#rewrite-or-add-to-a-prompt) | 시스템 프롬프트의 이름 있는 섹션마다 한 번. `e.name`은 `prompt.compose`에서의 섹션 `id`입니다. | `{ text }`, 또는 섹션을 생략하려면 `{ text: null }` |
89| [`prompt.context`](/docs/ko/plugins/mods/events#rewrite-or-add-to-a-prompt) | 대화마다 한 번, 첫 메시지와 함께 전송되는 컨텍스트에 대해 | `{ blocks }` |89| [`prompt.context`](https://code.claude.com/docs/ko/plugins/mods/events#rewrite-or-add-to-a-prompt) | 대화마다 한 번, 첫 메시지와 함께 전송되는 컨텍스트에 대해 | `{ blocks }` |
90| `prompt.attachment` | Claude Code가 리마인더처럼 Claude를 위한 자체 메시지를 추가할 때. `e.type`은 종류를 나타내며, 타입에 선언된 종류의 경우 `e.detail`에 텍스트 작성의 근거가 된 정보가 담깁니다. | `{ text }`, 또는 생략하려면 `{ text: null }` |90| `prompt.attachment` | Claude Code가 리마인더처럼 Claude를 위한 자체 메시지를 추가할 때. `e.type`은 종류를 나타내며, 타입에 선언된 종류의 경우 `e.detail`에 텍스트 작성의 근거가 된 정보가 담깁니다. | `{ text }`, 또는 생략하려면 `{ text: null }` |
91| `prompt.mention` | Claude Code가 프롬프트에서 @-멘션한 파일을 읽기 직전. Claude Code v2.1.290 이상이 필요합니다. | 다른 파일을 읽으려면 `next({ ...e, path })`, 또는 `{ deny: reason }` |91| `prompt.mention` | Claude Code가 프롬프트에서 @-멘션한 파일을 읽기 직전. Claude Code v2.1.290 이상이 필요합니다. | 다른 파일을 읽으려면 `next({ ...e, path })`, 또는 `{ deny: reason }` |
92| [`skill.prompt`](/docs/ko/plugins/mods/events#rewrite-or-add-to-a-prompt) | 스킬의 텍스트가 Claude용으로 확장될 때 | `{ text }` |92| [`skill.prompt`](https://code.claude.com/docs/ko/plugins/mods/events#rewrite-or-add-to-a-prompt) | 스킬의 텍스트가 Claude용으로 확장될 때 | `{ text }` |
93| `attribution.text` | Claude Code가 커밋 또는 풀 리퀘스트의 저작자 표시 텍스트를 작성할 때 | `{ text }` |93| `attribution.text` | Claude Code가 커밋 또는 풀 리퀘스트의 저작자 표시 텍스트를 작성할 때 | `{ text }` |
94 94
95#### `skill.prompt`의 소스 및 frontmatter 필드95#### `skill.prompt`의 소스 및 frontmatter 필드
98 98
99| 필드 | 타입 | 담긴 내용 |99| 필드 | 타입 | 담긴 내용 |
100| :- | :- | :- |100| :- | :- | :- |
101| `e.source` | string | 스킬을 제공하는 주체: 엔터프라이즈, 개인, 프로젝트 [위치](/docs/ko/skills.md#where-skills-live)의 스킬에 대해 각각 `policySettings`, `userSettings`, `projectSettings`입니다. 그 밖의 소스는 `plugin`, `mcp`, `syncedSkills`, `built-in` 같은 단어를 제공합니다. |101| `e.source` | string | 스킬을 제공하는 주체: 엔터프라이즈, 개인, 프로젝트 [위치](https://code.claude.com/docs/ko/skills.md#where-skills-live)의 스킬에 대해 각각 `policySettings`, `userSettings`, `projectSettings`입니다. 그 밖의 소스는 `plugin`, `mcp`, `syncedSkills`, `built-in` 같은 단어를 제공합니다. |
102| `e.pluginName` | string | `e.source`가 `plugin`인 스킬의 경우 플러그인 이름 |102| `e.pluginName` | string | `e.source`가 `plugin`인 스킬의 경우 플러그인 이름 |
103| `e.path` | string | 스킬의 `SKILL.md` 파일의 절대 경로, 또는 [명령 파일](/docs/ko/skills.md#where-skills-live)로 작성된 스킬의 경우 해당 `.md` 파일의 절대 경로. 기본 제공 스킬처럼 이 머신에 파일이 없는 스킬의 경우에는 없습니다. |103| `e.path` | string | 스킬의 `SKILL.md` 파일의 절대 경로, 또는 [명령 파일](https://code.claude.com/docs/ko/skills.md#where-skills-live)로 작성된 스킬의 경우 해당 `.md` 파일의 절대 경로. 기본 제공 스킬처럼 이 머신에 파일이 없는 스킬의 경우에는 없습니다. |
104| `e.frontmatter` | object | 일반 데이터 형태로 된 스킬 파일의 frontmatter |104| `e.frontmatter` | object | 일반 데이터 형태로 된 스킬 파일의 frontmatter |
105| `e.frontmatterProblem` | string | `e.frontmatter`에 파일의 frontmatter 또는 그 키 중 하나가 빠져 있는 이유(예: `is a list or a single value, not a table`). `e.frontmatter`에 frontmatter 전체가 담겨 있거나 스킬에 frontmatter가 없으면 없습니다. |105| `e.frontmatterProblem` | string | `e.frontmatter`에 파일의 frontmatter 또는 그 키 중 하나가 빠져 있는 이유(예: `is a list or a single value, not a table`). `e.frontmatter`에 frontmatter 전체가 담겨 있거나 스킬에 frontmatter가 없으면 없습니다. |
106 106
107훅은 변경한 `text` 또는 `frontmatter`를 `next`에 전달할 수 있습니다. 그 뒤의 훅은 둘 다 읽고, Claude는 최종 `text`를 읽습니다. 그 밖의 필드를 변경하는 훅은 [실패](/docs/ko/plugins/mods/events.md#handle-a-hook-that-fails)합니다.107훅은 변경한 `text` 또는 `frontmatter`를 `next`에 전달할 수 있습니다. 그 뒤의 훅은 둘 다 읽고, Claude는 최종 `text`를 읽습니다. 그 밖의 필드를 변경하는 훅은 [실패](https://code.claude.com/docs/ko/plugins/mods/events.md#handle-a-hook-that-fails)합니다.
108 108
109`skill.prompt`에서 `e.source`, `e.pluginName`, `e.path`, `e.frontmatter`, `e.frontmatterProblem`을 사용하려면 Claude Code v2.1.299 이상이 필요합니다.109`skill.prompt`에서 `e.source`, `e.pluginName`, `e.path`, `e.frontmatter`, `e.frontmatterProblem`을 사용하려면 Claude Code v2.1.299 이상이 필요합니다.
110 110
114 114
115| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |115| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |
116| :- | :- | :- |116| :- | :- | :- |
117| [`command.run`](/docs/ko/plugins/mods/api#add-a-command) | 명령이 실행되기 직전 | `{ text }`, `{}` 또는 `next(e)` |117| [`command.run`](https://code.claude.com/docs/ko/plugins/mods/api#add-a-command) | 명령이 실행되기 직전 | `{ text }`, `{}` 또는 `next(e)` |
118| `command.describe` | 명령 목록을 위해 명령마다 한 번 | `{ description, argumentHint, isHidden }` |118| `command.describe` | 명령 목록을 위해 명령마다 한 번 | `{ description, argumentHint, isHidden }` |
119| `config.set` | `/config` 행이 변경되기 직전 | `next({ ...e, value })` 또는 `{ deny: reason }` |119| `config.set` | `/config` 행이 변경되기 직전 | `next({ ...e, value })` 또는 `{ deny: reason }` |
120| `config.describe` | `/config` 행마다 한 번 | `{ label, description, isHidden }` |120| `config.describe` | `/config` 행마다 한 번 | `{ label, description, isHidden }` |
125 125
126| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |126| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |
127| :- | :- | :- |127| :- | :- | :- |
128| [`turn.start`](/docs/ko/plugins/mods/events#follow-a-turn) | 턴이 시작될 때 | `next(e)` |128| [`turn.start`](https://code.claude.com/docs/ko/plugins/mods/events#follow-a-turn) | 턴이 시작될 때 | `next(e)` |
129| [`turn.step`](/docs/ko/plugins/mods/events#follow-a-turn) | 하나의 요청이 모델로 전송되기 직전 | `yield* next(e)`, 또는 `next({ ...e, model })`, `next({ ...e, effort })` |129| [`turn.step`](https://code.claude.com/docs/ko/plugins/mods/events#follow-a-turn) | 하나의 요청이 모델로 전송되기 직전 | `yield* next(e)`, 또는 `next({ ...e, model })`, `next({ ...e, effort })` |
130| [`turn.complete`](/docs/ko/plugins/mods/events#follow-a-turn) | 턴이 종료되었을 때 | `next(e)`, 또는 답변 아래에 한 줄을 표시하려면 `{ text }` |130| [`turn.complete`](https://code.claude.com/docs/ko/plugins/mods/events#follow-a-turn) | 턴이 종료되었을 때 | `next(e)`, 또는 답변 아래에 한 줄을 표시하려면 `{ text }` |
131 131
132### 세션132### 세션
133 133
135 135
136| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |136| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |
137| :- | :- | :- |137| :- | :- | :- |
138| [`session.start`](/docs/ko/plugins/mods/api#add-a-command-or-a-tool) | 로드된 mod마다 첫 프롬프트 전에 한 번, 그리고 해당 mod를 다시 로드한 후에 다시 한 번. `/clear`, `/resume` 또는 `/branch` 이후에는 발생하지 않습니다. | `next(e)` |138| [`session.start`](https://code.claude.com/docs/ko/plugins/mods/api#add-a-command-or-a-tool) | 로드된 mod마다 첫 프롬프트 전에 한 번, 그리고 해당 mod를 다시 로드한 후에 다시 한 번. `/clear`, `/resume` 또는 `/branch` 이후에는 발생하지 않습니다. | `next(e)` |
139| `session.end` | 세션이 종료되거나 `/clear`, `/resume` 또는 `/branch`가 실행될 때. `e.reason`은 `clear`, `resume`, `logout`, `prompt_input_exit` 또는 `other`입니다. `/branch`는 `resume`으로 보고됩니다. | `next(e)` |139| `session.end` | 세션이 종료되거나 `/clear`, `/resume` 또는 `/branch`가 실행될 때. `e.reason`은 `clear`, `resume`, `logout`, `prompt_input_exit` 또는 `other`입니다. `/branch`는 `resume`으로 보고됩니다. | `next(e)` |
140| `session.compact` | 대화가 압축되기 직전 | `{ skip: reason }` |140| `session.compact` | 대화가 압축되기 직전 | `{ skip: reason }` |
141| [`session.receive`](/docs/ko/plugins/mods/api#send-and-receive-messages-between-sessions), [`session.send`](/docs/ko/plugins/mods/api#send-and-receive-messages-between-sessions) | 다른 에이전트나 세션에서 메시지가 도착하거나, 다른 에이전트나 세션으로 메시지가 전송되기 직전. [세션 간 메시지 주고받기](/docs/ko/plugins/mods/api.md#send-and-receive-messages-between-sessions)를 참조하세요. | `receive`의 경우 `{ consumed: reason }`, `send`의 경우 `{ isDelivered: false, reason }` |141| [`session.receive`](https://code.claude.com/docs/ko/plugins/mods/api#send-and-receive-messages-between-sessions), [`session.send`](https://code.claude.com/docs/ko/plugins/mods/api#send-and-receive-messages-between-sessions) | 다른 에이전트나 세션에서 메시지가 도착하거나, 다른 에이전트나 세션으로 메시지가 전송되기 직전. [세션 간 메시지 주고받기](https://code.claude.com/docs/ko/plugins/mods/api.md#send-and-receive-messages-between-sessions)를 참조하세요. | `receive`의 경우 `{ consumed: reason }`, `send`의 경우 `{ isDelivered: false, reason }` |
142| `session.append` | 프롬프트, 응답 블록, 도구 결과, 알림 등 대화가 보관하는 각 행이 저장되기 전에 행마다 한 번 | 행의 텍스트 블록이나 그 안에 있는 `tool_result` 블록의 `content`를 다시 작성하려면 `message.content`를 변경한 `next({ ...e, message })` |142| `session.append` | 프롬프트, 응답 블록, 도구 결과, 알림 등 대화가 보관하는 각 행이 저장되기 전에 행마다 한 번 | 행의 텍스트 블록이나 그 안에 있는 `tool_result` 블록의 `content`를 다시 작성하려면 `message.content`를 변경한 `next({ ...e, message })` |
143| `session.attach`, `session.detach` | 다른 앱이 세션에 연결되거나 연결이 끊길 때 | `next(e)` |143| `session.attach`, `session.detach` | 다른 앱이 세션에 연결되거나 연결이 끊길 때 | `next(e)` |
144| `session.measure` | 각 턴이 끝난 후, 그리고 플랜 한도의 사용 비율이 변경될 때 | `next(e)` |144| `session.measure` | 각 턴이 끝난 후, 그리고 플랜 한도의 사용 비율이 변경될 때 | `next(e)` |
150| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |150| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |
151| :- | :- | :- |151| :- | :- | :- |
152| `agent.offer` | 서브에이전트 유형이 Claude에 제공될 때 | 제공하지 않으려면 `{ isOffered: false }` |152| `agent.offer` | 서브에이전트 유형이 Claude에 제공될 때 | 제공하지 않으려면 `{ isOffered: false }` |
153| `agent.spawn` | 서브에이전트 또는 [에이전트 팀](/docs/ko/agent-teams.md) 팀원이 시작되기 직전. 팀원의 경우 `e.isTeammate`는 `true`입니다. | 모델을 선택하려면 `next({ ...e, model })`, 또는 `{ deny: reason }` |153| `agent.spawn` | 서브에이전트 또는 [에이전트 팀](https://code.claude.com/docs/ko/agent-teams.md) 팀원이 시작되기 직전. 팀원의 경우 `e.isTeammate`는 `true`입니다. | 모델을 선택하려면 `next({ ...e, model })`, 또는 `{ deny: reason }` |
154 154
155Claude가 [`SendMessage`](/docs/ko/sub-agents#resume-subagents) 도구로 서브에이전트를 재개할 때는 `agent.spawn` 훅이 다시 실행되지 않습니다. 서브에이전트를 재개하는 `SendMessage` 호출을 거부하려면 [`tool.call`](/docs/ko/plugins/mods/events#guard-or-change-a-tool-call) 훅에서 해당 도구를 매칭하세요.155Claude가 [`SendMessage`](https://code.claude.com/docs/ko/sub-agents#resume-subagents) 도구로 서브에이전트를 재개할 때는 `agent.spawn` 훅이 다시 실행되지 않습니다. 서브에이전트를 재개하는 `SendMessage` 호출을 거부하려면 [`tool.call`](https://code.claude.com/docs/ko/plugins/mods/events#guard-or-change-a-tool-call) 훅에서 해당 도구를 매칭하세요.
156 156
157### 인터페이스157### 인터페이스
158 158
159인터페이스 이벤트는 Claude Code가 렌더링 지점을 그릴 때와 사용자가 mod가 그린 컨트롤을 사용할 때 발생합니다. `ui.render` 훅이 반환하는 값은 [인터페이스에 그리기](/docs/ko/plugins/mods/interface.md)에서 확인할 수 있습니다.159인터페이스 이벤트는 Claude Code가 렌더링 지점을 그릴 때와 사용자가 mod가 그린 컨트롤을 사용할 때 발생합니다. `ui.render` 훅이 반환하는 값은 [인터페이스에 그리기](https://code.claude.com/docs/ko/plugins/mods/interface.md)에서 확인할 수 있습니다.
160 160
161| 이벤트 | 발생 시점 |161| 이벤트 | 발생 시점 |
162| :- | :- |162| :- | :- |
163| [`ui.render`](/docs/ko/plugins/mods/interface#pick-where-to-draw) | [렌더링 지점](#render-sites)이 그려지기 직전 |163| [`ui.render`](https://code.claude.com/docs/ko/plugins/mods/interface#pick-where-to-draw) | [렌더링 지점](#render-sites)이 그려지기 직전 |
164| `ui.resolve` | mod가 로드될 때, 앱, 렌더링 지점, mod 조합마다 한 번. 결과는 `$.ui.resolve(e)`가 읽는 요소 테이블입니다. |164| `ui.resolve` | mod가 로드될 때, 앱, 렌더링 지점, mod 조합마다 한 번. 결과는 `$.ui.resolve(e)`가 읽는 요소 테이블입니다. |
165| [`ui.press`](/docs/ko/plugins/mods/interface#respond-to-presses-and-typing), [`ui.input`](/docs/ko/plugins/mods/interface#respond-to-presses-and-typing), [`ui.select`](/docs/ko/plugins/mods/interface#respond-to-presses-and-typing) | mod가 그린 `Button`, `Input` 또는 `Select`가 사용될 때 |165| [`ui.press`](https://code.claude.com/docs/ko/plugins/mods/interface#respond-to-presses-and-typing), [`ui.input`](https://code.claude.com/docs/ko/plugins/mods/interface#respond-to-presses-and-typing), [`ui.select`](https://code.claude.com/docs/ko/plugins/mods/interface#respond-to-presses-and-typing) | mod가 그린 `Button`, `Input` 또는 `Select`가 사용될 때 |
166| `ui.focus`, `ui.scroll` | 포커스된 컨트롤, 또는 창이나 밴드의 스크롤 위치가 변경되기 직전 |166| `ui.focus`, `ui.scroll` | 포커스된 컨트롤, 또는 창이나 밴드의 스크롤 위치가 변경되기 직전 |
167| `ui.close` | 창이 닫히기 직전. `e.id`는 해당 창이며 `e.origin.kind`는 `plugin`, `person` 또는 `unload`입니다. |167| `ui.close` | 창이 닫히기 직전. `e.id`는 해당 창이며 `e.origin.kind`는 `plugin`, `person` 또는 `unload`입니다. |
168| [`ui.message`](/docs/ko/plugins/mods/interface#build-a-tree-from-elements) | `Client` 요소가 자신의 mod에 데이터를 게시할 때 |168| [`ui.message`](https://code.claude.com/docs/ko/plugins/mods/interface#build-a-tree-from-elements) | `Client` 요소가 자신의 mod에 데이터를 게시할 때 |
169| [`ui.fault`](/docs/ko/plugins/mods/interface#redraw-when-something-changes) | mod가 그린 `Client` 요소가 로드, 그리기 또는 실행에 실패했을 때. `e.phase`는 `load`, `render` 또는 `run`이며, `e.reason`은 오류 메시지입니다. Claude Code v2.1.289 이상이 필요합니다. |169| [`ui.fault`](https://code.claude.com/docs/ko/plugins/mods/interface#redraw-when-something-changes) | mod가 그린 `Client` 요소가 로드, 그리기 또는 실행에 실패했을 때. `e.phase`는 `load`, `render` 또는 `run`이며, `e.reason`은 오류 메시지입니다. Claude Code v2.1.289 이상이 필요합니다. |
170 170
171### 다른 mod171### 다른 mod
172 172
174 174
175| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |175| 이벤트 | 발생 시점 | 훅이 반환할 수 있는 값 |
176| :- | :- | :- |176| :- | :- | :- |
177| [`plugin.register`](/docs/ko/plugins/mods/admin#enforce-a-policy-with-a-mod-of-your-own) | 훅 모듈이 로드되기 직전. `e.uses`는 해당 모듈의 이벤트, mods API 호출, 환경 변수, 상태를 `claude plugin validate`가 출력하는 형식으로 나열합니다. 각 호출은 `fs.read`처럼 `$.` 접두사 없이 작성됩니다. | `{ refuse: reason }` |177| [`plugin.register`](https://code.claude.com/docs/ko/plugins/mods/admin#enforce-a-policy-with-a-mod-of-your-own) | 훅 모듈이 로드되기 직전. `e.uses`는 해당 모듈의 이벤트, mods API 호출, 환경 변수, 상태를 `claude plugin validate`가 출력하는 형식으로 나열합니다. 각 호출은 `fs.read`처럼 `$.` 접두사 없이 작성됩니다. | `{ refuse: reason }` |
178| `engine.create` | 이 mod를 위한 mods API가 구성될 때 | 네임스페이스를 추가하도록 변경한 mods API. `user` [계층](#the-hook-function) 외부의 mod는 네임스페이스를 제외할 수도 있습니다. |178| `engine.create` | 이 mod를 위한 mods API가 구성될 때 | 네임스페이스를 추가하도록 변경한 mods API. `user` [계층](#the-hook-function) 외부의 mod는 네임스페이스를 제외할 수도 있습니다. |
179 179
180`engine.create`에서 추가한 네임스페이스의 메서드를 다른 mod의 훅이 호출하면, 해당 이벤트의 모든 훅이 반환될 때까지 메서드의 `$` 호출은 그 훅의 컨텍스트에서 실행됩니다. 예를 들어 상대 경로는 해당 훅의 작업 디렉터리를 기준으로 확인되며, `$.prompt.submit`은 턴이 해당 훅을 기다리는 동안 거부됩니다. 그 이후에 메서드가 수행하는 호출은 mod 자체의 컨텍스트에서 실행됩니다.180`engine.create`에서 추가한 네임스페이스의 메서드를 다른 mod의 훅이 호출하면, 해당 이벤트의 모든 훅이 반환될 때까지 메서드의 `$` 호출은 그 훅의 컨텍스트에서 실행됩니다. 예를 들어 상대 경로는 해당 훅의 작업 디렉터리를 기준으로 확인되며, `$.prompt.submit`은 턴이 해당 훅을 기다리는 동안 거부됩니다. 그 이후에 메서드가 수행하는 호출은 mod 자체의 컨텍스트에서 실행됩니다.
189 189
190### 설정 훅 이벤트190### 설정 훅 이벤트
191 191
192각 [설정 훅 이벤트](/docs/ko/hooks.md#hook-events)는 `classic.Stop`이나 `classic.PostToolUse`처럼 `classic.<Event>`라는 이름의 이벤트입니다. `e`는 훅의 stdin JSON입니다.192각 [설정 훅 이벤트](https://code.claude.com/docs/ko/hooks.md#hook-events)는 `classic.Stop`이나 `classic.PostToolUse`처럼 `classic.<Event>`라는 이름의 이벤트입니다. `e`는 훅의 stdin JSON입니다.
193 193
194### Mods API 호출194### Mods API 호출
195 195
197 197
198## Mods API 메서드198## Mods API 메서드
199 199
200mods API는 모든 훅이 받는 `$` 인수입니다. 이 API의 메서드는 `$.ui`와 같은 네임스페이스로 그룹화되어 있습니다. 이 표는 각 네임스페이스의 메서드를 이름별로 나열하므로, `$.ui` 행의 `open`은 `$.ui.open(...)` 호출을 의미합니다. 가이드에서는 자주 쓰이는 메서드의 사용 예를 보여 주며, [사용 중인 빌드의 타입](/docs/ko/plugins/mods/create.md#get-the-types-for-your-build)에는 모든 메서드가 예제와 함께 문서화되어 있습니다.200mods API는 모든 훅이 받는 `$` 인수입니다. 이 API의 메서드는 `$.ui`와 같은 네임스페이스로 그룹화되어 있습니다. 이 표는 각 네임스페이스의 메서드를 이름별로 나열하므로, `$.ui` 행의 `open`은 `$.ui.open(...)` 호출을 의미합니다. 가이드에서는 자주 쓰이는 메서드의 사용 예를 보여 주며, [사용 중인 빌드의 타입](https://code.claude.com/docs/ko/plugins/mods/create.md#get-the-types-for-your-build)에는 모든 메서드가 예제와 함께 문서화되어 있습니다.
201 201
202| 네임스페이스 | 메서드 |202| 네임스페이스 | 메서드 |
203| :- | :- |203| :- | :- |
204| `$.plugin` | `name`, `root`: 이 플러그인의 이름과 디렉터리 |204| `$.plugin` | `name`, `root`: 이 플러그인의 이름과 디렉터리 |
205| [`$.ui`](/docs/ko/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/ko/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/ko/plugins/mods/api#add-a-command) | `register`, `run`, `list` |206| [`$.command`](https://code.claude.com/docs/ko/plugins/mods/api#add-a-command) | `register`, `run`, `list` |
207| [`$.tool`](/docs/ko/plugins/mods/api#add-a-tool) | `register`, `call`, `check`, `list` |207| [`$.tool`](https://code.claude.com/docs/ko/plugins/mods/api#add-a-tool) | `register`, `call`, `check`, `list` |
208| `$.agent` | `register`, `spawn`, `list`. `list()`는 이 세션의 서브에이전트와 팀원을 반환하며, 각 항목의 `status`는 `pending`, `running`, `waiting`, `idle`, `completed`, `failed`, `killed` 중 하나입니다. 이 중 `idle`과 `waiting`에는 Claude Code v2.1.289 이상이 필요합니다. |208| `$.agent` | `register`, `spawn`, `list`. `list()`는 이 세션의 서브에이전트와 팀원을 반환하며, 각 항목의 `status`는 `pending`, `running`, `waiting`, `idle`, `completed`, `failed`, `killed` 중 하나입니다. 이 중 `idle`과 `waiting`에는 Claude Code v2.1.289 이상이 필요합니다. |
209| [`$.model`](/docs/ko/plugins/mods/api#call-a-model) | `complete`, `fork`, `classify` |209| [`$.model`](https://code.claude.com/docs/ko/plugins/mods/api#call-a-model) | `complete`, `fork`, `classify` |
210| [`$.prompt`](/docs/ko/plugins/mods/api#start-a-turn-from-a-background-job) | `submit`, `read`, `fill`, `suggest`, `compose`. Claude는 해당 mod를 발신자로 명시하는 문장 뒤에 오는 `submit({ text })`의 텍스트를 읽습니다. `submit({ text, asUser: true })`는 그 문장 없이 텍스트를 사용자 본인의 말로 보냅니다. |210| [`$.prompt`](https://code.claude.com/docs/ko/plugins/mods/api#start-a-turn-from-a-background-job) | `submit`, `read`, `fill`, `suggest`, `compose`. Claude는 해당 mod를 발신자로 명시하는 문장 뒤에 오는 `submit({ text })`의 텍스트를 읽습니다. `submit({ text, asUser: true })`는 그 문장 없이 텍스트를 사용자 본인의 말로 보냅니다. |
211| `$.turn` | `abort` |211| `$.turn` | `abort` |
212| [`$.session`](/docs/ko/plugins/mods/api#send-and-receive-messages-between-sessions) | `messages`, `cwd`, `root`, `model`, `turns`, `id`, `repo`, `surfaces`, `usage`, `version`, `compact`, `send`, `append`, `authorize`. `usage()`는 `{ startedAt, context, rateLimits, cost }`를 반환합니다. `context`에는 `tokens`, `window`, `percent`가 있으며, `rateLimits`는 `{ kind, percentUsed, resetsAt }`의 목록입니다. |212| [`$.session`](https://code.claude.com/docs/ko/plugins/mods/api#send-and-receive-messages-between-sessions) | `messages`, `cwd`, `root`, `model`, `turns`, `id`, `repo`, `surfaces`, `usage`, `version`, `compact`, `send`, `append`, `authorize`. `usage()`는 `{ startedAt, context, rateLimits, cost }`를 반환합니다. `context`에는 `tokens`, `window`, `percent`가 있으며, `rateLimits`는 `{ kind, percentUsed, resetsAt }`의 목록입니다. |
213| `$.config` | `list`, `set` |213| `$.config` | `list`, `set` |
214| [`$.settings`](/docs/ko/plugins/mods/api#reach-files-processes-and-the-network) | `read` |214| [`$.settings`](https://code.claude.com/docs/ko/plugins/mods/api#reach-files-processes-and-the-network) | `read` |
215| [`$.env`](/docs/ko/plugins/mods/api#reach-files-processes-and-the-network) | `get`, `set` |215| [`$.env`](https://code.claude.com/docs/ko/plugins/mods/api#reach-files-processes-and-the-network) | `get`, `set` |
216| [`$.fs`](/docs/ko/plugins/mods/api#reach-files-processes-and-the-network) | `read`, `write`, `list`, `exists`, `stat`, `ancestors`. `write`는 원자적이지 않습니다. 파일의 내용을 제자리에서 교체하므로 다른 프로세스가 일부만 기록된 파일을 읽을 수 있습니다. 여러 세션이 변경하는 데이터는 `$.store`에 보관하십시오. |216| [`$.fs`](https://code.claude.com/docs/ko/plugins/mods/api#reach-files-processes-and-the-network) | `read`, `write`, `list`, `exists`, `stat`, `ancestors`. `write`는 원자적이지 않습니다. 파일의 내용을 제자리에서 교체하므로 다른 프로세스가 일부만 기록된 파일을 읽을 수 있습니다. 여러 세션이 변경하는 데이터는 `$.store`에 보관하십시오. |
217| [`$.store`](/docs/ko/plugins/mods/interface#keep-state) | `get`, `set`, `delete`, `keys`. 머신의 모든 세션이 공유하는 키-값 저장소입니다. [둘 이상의 세션에서 저장하기](/docs/ko/plugins/mods/interface.md#save-from-more-than-one-session)를 참조하십시오. |217| [`$.store`](https://code.claude.com/docs/ko/plugins/mods/interface#keep-state) | `get`, `set`, `delete`, `keys`. 머신의 모든 세션이 공유하는 키-값 저장소입니다. [둘 이상의 세션에서 저장하기](https://code.claude.com/docs/ko/plugins/mods/interface.md#save-from-more-than-one-session)를 참조하십시오. |
218| [`$.state`](/docs/ko/plugins/mods/interface#keep-a-value-in-\$-state) | 반응형 상태: `get`, `set`, 그리고 `claude-code`에서 가져오는 헬퍼 `atom`, `read`, `update`, `derive`, `memberOf` |218| [`$.state`](https://code.claude.com/docs/ko/plugins/mods/interface#keep-a-value-in-\$-state) | 반응형 상태: `get`, `set`, 그리고 `claude-code`에서 가져오는 헬퍼 `atom`, `read`, `update`, `derive`, `memberOf` |
219| [`$.clock`](/docs/ko/plugins/mods/api#run-work-in-the-background) | `now`, `sleep`, `after`, `every` |219| [`$.clock`](https://code.claude.com/docs/ko/plugins/mods/api#run-work-in-the-background) | `now`, `sleep`, `after`, `every` |
220| [`$.http`](/docs/ko/plugins/mods/api#reach-files-processes-and-the-network) | `fetch` |220| [`$.http`](https://code.claude.com/docs/ko/plugins/mods/api#reach-files-processes-and-the-network) | `fetch` |
221| [`$.process`](/docs/ko/plugins/mods/api#reach-files-processes-and-the-network) | `run`, `spawn` |221| [`$.process`](https://code.claude.com/docs/ko/plugins/mods/api#reach-files-processes-and-the-network) | `run`, `spawn` |
222| [`$.mcp`](/docs/ko/plugins/mods/api#reach-files-processes-and-the-network) | `call`, `connect`. `connect(server)`는 해당 플러그인의 매니페스트에 나열된 MCP 서버에 연결합니다. |222| [`$.mcp`](https://code.claude.com/docs/ko/plugins/mods/api#reach-files-processes-and-the-network) | `call`, `connect`. `connect(server)`는 해당 플러그인의 매니페스트에 나열된 MCP 서버에 연결합니다. |
223| `$.audio` | `play`, `speak` |223| `$.audio` | `play`, `speak` |
224| `$.telemetry` | `log`, `mark`. 레코드는 Claude Code 또는 내장 mod가 호출한 경우에만 전송됩니다. |224| `$.telemetry` | `log`, `mark`. 레코드는 Claude Code 또는 내장 mod가 호출한 경우에만 전송됩니다. |
225 225
226## 렌더링 지점226## 렌더링 지점
227 227
228렌더링 지점은 Claude Code 인터페이스의 확장 지점입니다. 각 행은 `ui.render` 훅에서 `e.component`의 값이며, `e.props`의 필드와 해당 지점을 렌더링하는 앱을 함께 보여 줍니다. `e.surface`는 `terminal`, `desktop`, `vscode`처럼 그리기를 수행하는 앱을 나타냅니다. [Claude Code가 이미 그리는 요소 변경하기](/docs/ko/plugins/mods/interface.md#change-what-claude-code-already-draws)에서는 훅이 각 지점에서 무엇을 할 수 있는지를 선택지별 예시와 함께 보여 줍니다.228렌더링 지점은 Claude Code 인터페이스의 확장 지점입니다. 각 행은 `ui.render` 훅에서 `e.component`의 값이며, `e.props`의 필드와 해당 지점을 렌더링하는 앱을 함께 보여 줍니다. `e.surface`는 `terminal`, `desktop`, `vscode`처럼 그리기를 수행하는 앱을 나타냅니다. [Claude Code가 이미 그리는 요소 변경하기](https://code.claude.com/docs/ko/plugins/mods/interface.md#change-what-claude-code-already-draws)에서는 훅이 각 지점에서 무엇을 할 수 있는지를 선택지별 예시와 함께 보여 줍니다.
229 229
230VS Code 확장 프로그램에서 렌더링하려면 확장 프로그램 버전 2.1.299 이상이 필요합니다. [기능 플래그를 가져오지 않는](/docs/ko/env-vars.md#features-that-need-feature-flag-fetching) 세션에서는 2.1.304 이상이 필요합니다. [VS Code 확장 프로그램에서 그리기](/docs/ko/plugins/mods/interface.md#draw-in-the-vs-code-extension)에 확장 프로그램이 다르게 그리는 요소가 정리되어 있습니다.230VS Code 확장 프로그램에서 렌더링하려면 확장 프로그램 버전 2.1.299 이상이 필요합니다. [기능 플래그를 가져오지 않는](https://code.claude.com/docs/ko/env-vars.md#features-that-need-feature-flag-fetching) 세션에서는 2.1.304 이상이 필요합니다. [VS Code 확장 프로그램에서 그리기](https://code.claude.com/docs/ko/plugins/mods/interface.md#draw-in-the-vs-code-extension)에 확장 프로그램이 다르게 그리는 요소가 정리되어 있습니다.
231 231
232| 지점 | `e.props` | `e.requestId` | 렌더링 위치 |232| 지점 | `e.props` | `e.requestId` | 렌더링 위치 |
233| :- | :- | :- | :- |233| :- | :- | :- | :- |
234| [`Pane`](/docs/ko/plugins/mods/interface#pick-where-to-draw) | `title`, `isFocused`, `bodyColumns`, `placement`, `scroll`, `view` | 창의 `id` | 터미널, Desktop, VS Code |234| [`Pane`](https://code.claude.com/docs/ko/plugins/mods/interface#pick-where-to-draw) | `title`, `isFocused`, `bodyColumns`, `placement`, `scroll`, `view` | 창의 `id` | 터미널, Desktop, VS Code |
235| [`AbovePrompt`](/docs/ko/plugins/mods/interface#pick-where-to-draw) | `hasSurvey`, `isWorking`, `maxRows`, `bodyColumns`, `scroll`, `view` | 단일 인스턴스 | 터미널, Desktop |235| [`AbovePrompt`](https://code.claude.com/docs/ko/plugins/mods/interface#pick-where-to-draw) | `hasSurvey`, `isWorking`, `maxRows`, `bodyColumns`, `scroll`, `view` | 단일 인스턴스 | 터미널, Desktop |
236| `UserMessage` | `text`, `origin`, `isExpanded`, 그리고 origin에 따라 `task` 또는 `from` | 메시지 id | 터미널, Desktop, VS Code |236| `UserMessage` | `text`, `origin`, `isExpanded`, 그리고 origin에 따라 `task` 또는 `from` | 메시지 id | 터미널, Desktop, VS Code |
237| `AssistantMessage` | 응답의 텍스트 | 메시지 id | 터미널, Desktop, VS Code |237| `AssistantMessage` | 응답의 텍스트 | 메시지 id | 터미널, Desktop, VS Code |
238| `ToolUse`, `ToolResult`, `ToolGroup` | 도구의 이름, 입력, 결과 | 도구 호출 id | 터미널, Desktop, VS Code |238| `ToolUse`, `ToolResult`, `ToolGroup` | 도구의 이름, 입력, 결과 | 도구 호출 id | 터미널, Desktop, VS Code |
239| `CommandOutput` | `command`, `text` | 메시지 id | 터미널, Desktop |239| `CommandOutput` | `command`, `text` | 메시지 id | 터미널, Desktop |
240| [`AskUserQuestion`](/docs/ko/plugins/mods/interface#change-what-claude-code-already-draws) | 질문과 선택지 | 도구 호출 id | 터미널, Desktop, VS Code |240| [`AskUserQuestion`](https://code.claude.com/docs/ko/plugins/mods/interface#change-what-claude-code-already-draws) | 질문과 선택지 | 도구 호출 id | 터미널, Desktop, VS Code |
241| `ToolProgress` | `kind` | 도구 호출 id | 터미널 |241| `ToolProgress` | `kind` | 도구 호출 id | 터미널 |
242| [`Spinner`](/docs/ko/plugins/mods/interface#change-what-claude-code-already-draws) | `word`, `message`, `suffix`, `mode` | 에이전트 id | 터미널, Desktop, VS Code |242| [`Spinner`](https://code.claude.com/docs/ko/plugins/mods/interface#change-what-claude-code-already-draws) | `word`, `message`, `suffix`, `mode` | 에이전트 id | 터미널, Desktop, VS Code |
243| `TurnDuration` | `word`, `durationMs` | 메시지 id | 터미널 |243| `TurnDuration` | `word`, `durationMs` | 메시지 id | 터미널 |
244| `InfoNotice` | `text`, `command` | 메시지 id | 터미널 |244| `InfoNotice` | `text`, `command` | 메시지 id | 터미널 |
245| `SessionMode` | `modes` | 단일 인스턴스 | 터미널, Desktop |245| `SessionMode` | `modes` | 단일 인스턴스 | 터미널, Desktop |
251 251
252* **`Pane` 또는 밴드의 너비**: `e.props.bodyColumns`에 맞춰 그립니다252* **`Pane` 또는 밴드의 너비**: `e.props.bodyColumns`에 맞춰 그립니다
253* **트랜스크립트 옆에 있는 `Pane`의 높이**: `e.props.placement`가 `'dock'`인 경우 `e.props.scroll.bodyRows`는 창이 트리에 제공하는 행 수입니다253* **트랜스크립트 옆에 있는 `Pane`의 높이**: `e.props.placement`가 `'dock'`인 경우 `e.props.scroll.bodyRows`는 창이 트리에 제공하는 행 수입니다
254* **프롬프트 위에 있는 `Pane`의 높이**: `e.props.placement`가 `'inline'`인 경우 창은 트리에 맞춰 한도까지 커지며, `bodyRows`가 그 한도입니다. [`$.ui.open`의 `rows` 필드](/docs/ko/plugins/mods/interface#open-a-pane-at-the-right-time)로 다른 한도를 요청할 수 있습니다.254* **프롬프트 위에 있는 `Pane`의 높이**: `e.props.placement`가 `'inline'`인 경우 창은 트리에 맞춰 한도까지 커지며, `bodyRows`가 그 한도입니다. [`$.ui.open`의 `rows` 필드](https://code.claude.com/docs/ko/plugins/mods/interface#open-a-pane-at-the-right-time)로 다른 한도를 요청할 수 있습니다.
255 255
256창보다 높은 트리는 전체가 하나로 스크롤됩니다.256창보다 높은 트리는 전체가 하나로 스크롤됩니다.
257 257
258## 요소258## 요소
259 259
260요소는 `ui.render` 훅이 반환하는 트리의 구성 요소이며, `$.ui.resolve(e)`에서 가져옵니다. [요소로 트리 만들기](/docs/ko/plugins/mods/interface.md#build-a-tree-from-elements)에서는 자주 쓰이는 요소와 터미널이 이를 그리는 방식을 보여 주며, [인터페이스 갤러리](/docs/ko/plugins/mods/gallery.md)에서는 대부분의 요소에 대한 스크린샷을 확인할 수 있습니다. 체크 표시는 앱이 해당 요소를 그릴 수 있음을 의미합니다.260요소는 `ui.render` 훅이 반환하는 트리의 구성 요소이며, `$.ui.resolve(e)`에서 가져옵니다. [요소로 트리 만들기](https://code.claude.com/docs/ko/plugins/mods/interface.md#build-a-tree-from-elements)에서는 자주 쓰이는 요소와 터미널이 이를 그리는 방식을 보여 주며, [인터페이스 갤러리](https://code.claude.com/docs/ko/plugins/mods/gallery.md)에서는 대부분의 요소에 대한 스크린샷을 확인할 수 있습니다. 체크 표시는 앱이 해당 요소를 그릴 수 있음을 의미합니다.
261 261
262| 요소 | 주요 prop | 터미널 | 데스크톱 | VS Code |262| 요소 | 주요 prop | 터미널 | 데스크톱 | VS Code |
263| :- | :- | :-: | :-: | :-: |263| :- | :- | :-: | :-: | :-: |
264| [`Box`](/docs/ko/plugins/mods/interface#build-a-tree-from-elements) | `key`, flex 레이아웃, [`gap`, `padding`, `margin`](#box-spacing-steps), `width`, `height`, [`borderStyle`](#box-border-styles), `backgroundColor`, `position`, `hover` | ✓ | ✓ | ✓ |264| [`Box`](https://code.claude.com/docs/ko/plugins/mods/interface#build-a-tree-from-elements) | `key`, 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/ko/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/ko/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/ko/plugins/mods/interface#respond-to-presses-and-typing) | `key`, `label`, `onPress`, `hotkey`, `plain`, `dimColor`, `autoFocus`, `action` | ✓ | ✓ | ✓ |266| [`Button`](https://code.claude.com/docs/ko/plugins/mods/interface#respond-to-presses-and-typing) | `key`, `label`, `onPress`, `hotkey`, `plain`, `dimColor`, `autoFocus`, `action`, `hover` | ✓ | ✓ | ✓ |
267| [`Link`](/docs/ko/plugins/mods/interface#link-in-the-desktop-app) | `href`, `label`. [제한 사항](#limits)을 참조하십시오. | ✓ | ✓ | ✓ |267| [`Link`](https://code.claude.com/docs/ko/plugins/mods/interface#link-in-the-desktop-app) | `href`, `label`. [제한 사항](#limits)을 참조하십시오. | ✓ | ✓ | ✓ |
268| [`Code`](/docs/ko/plugins/mods/gallery#show-code-and-changes) | `source`, `language`, `path`, `startLine`, `format`, `wrap` | ✓ | ✓ | ✓ |268| [`Code`](https://code.claude.com/docs/ko/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/ko/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/ko/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` | SVG 문서, 최대 131,072자 | | ✓ | ✓ |272| `Svg` | 최대 131,072자의 SVG 마크업으로 된 `source`, `alt` 텍스트, `width`, `height`, `isInteractive` | | ✓ | ✓ |
273| [`Client`](/docs/ko/plugins/mods/interface#build-a-tree-from-elements) | `module`, `key` | ✓ | ✓ | |273| [`Client`](https://code.claude.com/docs/ko/plugins/mods/interface#build-a-tree-from-elements) | `module`, `key`, `props`, `width`, `height`, `flexGrow` | ✓ | ✓ | |
274| [`Raster`](/docs/ko/plugins/mods/interface#draw-a-grid-of-colored-cells) | `key`, 최대 512의 `columns`, 최대 256의 `rows`, `cells`. [색상 셀 그리드 그리기](/docs/ko/plugins/mods/interface.md#draw-a-grid-of-colored-cells)를 참조하십시오. | ✓ | | |274| [`Raster`](https://code.claude.com/docs/ko/plugins/mods/interface#draw-a-grid-of-colored-cells) | `key`, 최대 512의 `columns`, 최대 256의 `rows`, `cells`. [색상 셀 그리드 그리기](https://code.claude.com/docs/ko/plugins/mods/interface.md#draw-a-grid-of-colored-cells)를 참조하십시오. | ✓ | | |
275| `Image` | 최대 2 MiB의 PNG 또는 RGBA 바이트 또는 파일 경로, 각각 최대 255의 `columns` 및 `rows`, `alt` 텍스트. [이를 그리는 터미널](/docs/ko/plugins/mods/gallery.md#image-and-client)을 참조하십시오. | ✓ | | |275| `Image` | `key`, 최대 2 MiB의 PNG 또는 RGBA 바이트나 파일 경로 같은 `source`, 각각 최대 255의 `columns` 및 `rows`, `alt` 텍스트. [이를 그리는 터미널](https://code.claude.com/docs/ko/plugins/mods/gallery.md#image-and-client)을 참조하십시오. | ✓ | | |
276 276
277`Button`에 대한 추가 규칙: `action`은 Claude Code 자체의 [키보드 단축키 액션](/docs/ko/keybindings.md) 중 하나를 지정하며, 해당 액션에 대한 사용자의 바인딩이 코드(chord) 또는 수정자 키 조합인 경우 그 바인딩으로 버튼이 눌립니다. 밴드에 있는 버튼의 숫자 `hotkey`는 사용자가 빈 프롬프트에 해당 숫자만 입력하고 잠시 멈출 때도 실행됩니다. 하나의 그리기에서 두 버튼이 동일한 `hotkey`를 지정하면 나중의 버튼이 이를 가져갑니다. `autoFocus`는 모든 컨트롤에서 `true`만 허용하므로, 이를 끄려면 해당 prop을 생략하십시오.277`Button`에 대한 추가 규칙:
278
279* **`action`**: Claude Code 자체의 [키보드 단축키 액션](https://code.claude.com/docs/ko/keybindings.md) 중 하나를 지정하며, 해당 액션에 대한 사용자의 바인딩이 코드(chord) 또는 수정자 키 조합인 경우 그 바인딩으로 버튼이 눌립니다
280* **밴드의 숫자 단축키**: 밴드에 있는 버튼의 숫자 `hotkey`는 사용자가 빈 프롬프트에 해당 숫자만 입력하고 잠시 멈출 때도 실행됩니다
281* **접힌 밴드**: 밴드가 [접혀 있는](https://code.claude.com/docs/ko/plugins/mods/interface.md#when-the-user-collapses-the-band) 동안에는 `action` 바인딩과 단축키 모두 밴드 안의 버튼을 누르지 않습니다
282* **하나의 단축키를 지정한 두 버튼**: 하나의 그리기에서 두 버튼이 동일한 `hotkey`를 지정하면 나중의 버튼이 이를 가져갑니다
283
284`autoFocus`는 모든 컨트롤에서 `true`만 허용하므로, 이를 끄려면 해당 prop을 생략하십시오.
278 285
279VS Code 확장은 일부 요소 prop을 무시하고, 해당 prop을 생략한 것처럼 요소를 그립니다.286VS Code 확장은 일부 요소 prop을 무시하고, 해당 prop을 생략한 것처럼 요소를 그립니다.
280 287
281* **`Box`**: `position` 및 `hover`288* **`Box`**: `position`과 그에 따른 `top`, `left`, `right`, `bottom`, 그리고 `alignSelf`, `borderDimColor`, `hover`
282* **`Text`**: `size`, `mono`, `tabular`289* **`Text`**: `size`, `mono`, `tabular`, `hover`
283* **`Button`**: `hotkey`, `plain`, `autoFocus`, `action`. 따라서 VS Code에서는 버튼을 클릭하거나, 버튼에 포커스가 있을 때 Enter를 눌러 버튼을 누릅니다290* **`Button`**: `hotkey`, `plain`, `autoFocus`, `action`, `hover`. 따라서 VS Code에서는 버튼을 클릭하거나, 버튼에 포커스가 있을 때 Enter를 눌러 버튼을 누릅니다
284* **`Code`**: `language`, `path`, `startLine`, `format`, `wrap`. 따라서 코드는 색상이나 줄 번호 없이 그려지며, `format: 'diff'` 블록은 diff의 원시 텍스트를 표시합니다291* **`Code`**: `language`, `path`, `startLine`, `format`, `wrap`. 따라서 코드는 색상이나 줄 번호 없이 그려지며, `format: 'diff'` 블록은 diff의 원시 텍스트를 표시합니다
285* **`Input` 및 `Select`**: `autoFocus`292* **`Input` 및 `Select`**: `autoFocus`
293* **`Svg`**: `isInteractive`
286 294
287### `Box` 테두리 스타일295### `Box` 테두리 스타일
288 296
317 325
318`gap`, `padding` 또는 `margin`을 단계로 설정하면 해당 단계가 가로와 세로에 동시에 적용됩니다. 예를 들어 터미널과 VS Code 확장에서 `padding: 'md'`는 양옆 각각 두 셀, 위아래 각각 한 행입니다.326`gap`, `padding` 또는 `margin`을 단계로 설정하면 해당 단계가 가로와 세로에 동시에 적용됩니다. 예를 들어 터미널과 VS Code 확장에서 `padding: 'md'`는 양옆 각각 두 셀, 위아래 각각 한 행입니다.
319 327
320단계 이름을 사용하려면 Claude Code v2.1.299 이상이 필요합니다. 이전 릴리스에서는 단계 이름을 사용하는 트리 대신 Claude Code가 [사이트의 자체 버전을 그립니다](/docs/ko/plugins/mods/interface.md#build-a-tree-from-elements).328단계 이름을 사용하려면 Claude Code v2.1.299 이상이 필요합니다. 이전 릴리스에서는 단계 이름을 사용하는 트리 대신 Claude Code가 [사이트의 자체 버전을 그립니다](https://code.claude.com/docs/ko/plugins/mods/interface.md#build-a-tree-from-elements).
321 329
322### `Text` 타이포그래피 prop330### `Text` 타이포그래피 prop
323 331
330| `mono` | 앱의 고정폭 서체를 요청하려면 `true` | 무시됨: 터미널은 항상 고정폭입니다 | 무시되므로 텍스트는 확장 자체의 서체를 유지합니다 |338| `mono` | 앱의 고정폭 서체를 요청하려면 `true` | 무시됨: 터미널은 항상 고정폭입니다 | 무시되므로 텍스트는 확장 자체의 서체를 유지합니다 |
331| `tabular` | 제자리에서 업데이트되는 숫자나 숫자 열이 정렬된 상태를 유지하도록 너비가 동일한 숫자를 요청하려면 `true` | 무시됨: 터미널의 숫자는 이미 한 셀 너비입니다 | 무시됨 |339| `tabular` | 제자리에서 업데이트되는 숫자나 숫자 열이 정렬된 상태를 유지하도록 너비가 동일한 숫자를 요청하려면 `true` | 무시됨: 터미널의 숫자는 이미 한 셀 너비입니다 | 무시됨 |
332 340
333이 네 가지 prop을 사용하려면 Claude Code v2.1.299 이상이 필요합니다. 이전 릴리스에서는 `size`, `weight`, `mono` 또는 `tabular`를 설정한 트리 대신 Claude Code가 [사이트의 자체 버전을 그립니다](/docs/ko/plugins/mods/interface.md#build-a-tree-from-elements).341이 네 가지 prop을 사용하려면 Claude Code v2.1.299 이상이 필요합니다. 이전 릴리스에서는 `size`, `weight`, `mono` 또는 `tabular`를 설정한 트리 대신 Claude Code가 [사이트의 자체 버전을 그립니다](https://code.claude.com/docs/ko/plugins/mods/interface.md#build-a-tree-from-elements).
334 342
335#### `bold`를 `weight`로 대체하기343#### `bold`를 `weight`로 대체하기
336 344
337`Text`의 `bold`는 `weight`로 대체되어 deprecated되었지만 여전히 작동합니다. `weight`가 없는 `Text`에서 이를 대체하려면 `bold: true`를 `weight: 'semibold'`로 변경하십시오. Claude Code v2.1.299 이상에서 동일한 결과를 얻을 수 있습니다.345`Text`의 `bold`는 `weight`로 대체되어 deprecated되었지만 여전히 작동합니다. `weight`가 없는 `Text`에서 이를 대체하려면 `bold: true`를 `weight: 'semibold'`로 변경하십시오. Claude Code v2.1.299 이상에서 동일한 결과를 얻을 수 있습니다.
338 346
339v2.1.299 이전 릴리스에서는 `weight`를 설정한 트리가 그려지지 않으며, 대신 Claude Code가 [사이트의 자체 버전을 그립니다](/docs/ko/plugins/mods/interface.md#build-a-tree-from-elements). `Text`에 `bold`와 `weight`를 모두 설정하면 `bold`는 효과가 없습니다.347v2.1.299 이전 릴리스에서는 `weight`를 설정한 트리가 그려지지 않으며, 대신 Claude Code가 [사이트의 자체 버전을 그립니다](https://code.claude.com/docs/ko/plugins/mods/interface.md#build-a-tree-from-elements). `Text`에 `bold`와 `weight`를 모두 설정하면 `bold`는 효과가 없습니다.
340 348
341## 제한349## 제한
342 350
346| :- | :- |354| :- | :- |
347| 하나의 이벤트에 대한 훅 자체의 실행 시간(`next` 내부 시간 또는 `$.clock.sleep`을 제외한 mod API 호출 시간은 포함하지 않음) | 10초, `prompt.edit` 훅의 경우 50밀리초 |355| 하나의 이벤트에 대한 훅 자체의 실행 시간(`next` 내부 시간 또는 `$.clock.sleep`을 제외한 mod API 호출 시간은 포함하지 않음) | 10초, `prompt.edit` 훅의 경우 50밀리초 |
348| `.catch` 핸들러의 실행 시간 | 1초 |356| `.catch` 핸들러의 실행 시간 | 1초 |
349| 모든 `session.end` 훅의 합계 | [SessionEnd 훅 예산](/docs/ko/hooks.md#sessionend-input)만큼(변경하지 않으면 1.5초), 설정의 `SessionEnd` 훅이 완료된 시점부터 계산 |357| 모든 `session.end` 훅의 합계 | [SessionEnd 훅 예산](https://code.claude.com/docs/ko/hooks.md#sessionend-input)만큼(변경하지 않으면 1.5초), 설정의 `SessionEnd` 훅이 완료된 시점부터 계산 |
350| `$.process.run` 타임아웃 | 기본값 30초, 최대 10분 |358| `$.process.run` 타임아웃 | 기본값 30초, 최대 10분 |
351| `$.model.complete` `maxTokens` | 기본값 1024, 최대 64,000 또는 모델의 출력 제한 |359| `$.model.complete` `maxTokens` | 기본값 1024, 최대 64,000 또는 모델의 출력 제한 |
352| `$.fs.read` 및 `$.fs.write` | 파일 하나당 4 MiB |360| `$.fs.read` 및 `$.fs.write` | 파일 하나당 4 MiB |
354| `$.http.fetch` 응답 본문 | 4 MiB. `text`에는 처음 4 MiB가 담기며 나머지는 읽지 않습니다. `Content-Length` 헤더에 이보다 큰 값이 선언된 경우에는 대신 호출이 거부되며, 그 사유는 `is over the 4194304-byte limit`로 끝납니다. 단, 리디렉션 이후의 마지막 요청이 `HEAD` 메서드를 사용하는 경우는 예외입니다. `HEAD` 예외에는 Claude Code v2.1.296 이상이 필요합니다. |362| `$.http.fetch` 응답 본문 | 4 MiB. `text`에는 처음 4 MiB가 담기며 나머지는 읽지 않습니다. `Content-Length` 헤더에 이보다 큰 값이 선언된 경우에는 대신 호출이 거부되며, 그 사유는 `is over the 4194304-byte limit`로 끝납니다. 단, 리디렉션 이후의 마지막 요청이 `HEAD` 메서드를 사용하는 경우는 예외입니다. `HEAD` 예외에는 Claude Code v2.1.296 이상이 필요합니다. |
355| 리디렉션과 본문을 포함한 `$.http.fetch` 호출 하나 | 30초 |363| 리디렉션과 본문을 포함한 `$.http.fetch` 호출 하나 | 30초 |
356| `$.http.fetch` 호출 하나가 따르는 리디렉션 수 | 5 |364| `$.http.fetch` 호출 하나가 따르는 리디렉션 수 | 5 |
357| 훅의 `drop` 사유 또는 `config.set` `deny` 사유 | 4,096자. 이보다 긴 사유는 끝부분이 잘리며, drop 또는 deny는 그대로 적용됩니다. 잘라내기에는 Claude Code v2.1.292 이상이 필요하며, 이전 버전에서는 대신 훅이 [실패합니다](/docs/ko/plugins/mods/events.md#handle-a-hook-that-fails). |365| 훅의 `drop` 사유 또는 `config.set` `deny` 사유 | 4,096자. 이보다 긴 사유는 끝부분이 잘리며, drop 또는 deny는 그대로 적용됩니다. 잘라내기에는 Claude Code v2.1.292 이상이 필요하며, 이전 버전에서는 대신 훅이 [실패합니다](https://code.claude.com/docs/ko/plugins/mods/events.md#handle-a-hook-that-fails). |
358| 하나의 트리에 포함된 텍스트 | 처음 100,000자까지 그려집니다 |366| 하나의 트리에 포함된 텍스트 | 처음 100,000자까지 그려집니다 |
359| `Code`의 `language` 또는 `path`, `Select` 옵션의 `value`, `Client`의 `module` | 10,000자. 이보다 길면 Claude Code가 [해당 위치를 자체 버전으로 그립니다](/docs/ko/plugins/mods/interface.md#build-a-tree-from-elements). |367| `Code`의 `language` 또는 `path`, `Select` 옵션의 `value`, `Client`의 `module` | 10,000자. 이보다 길면 Claude Code가 [해당 위치를 자체 버전으로 그립니다](https://code.claude.com/docs/ko/plugins/mods/interface.md#build-a-tree-from-elements). |
360| `Link`의 `href` | 2,048자. 이보다 긴 `href`가 있으면 트리 전체가 그려지지 않습니다. |368| `Link`의 `href` | 2,048자. 이보다 긴 `href`가 있으면 트리 전체가 그려지지 않습니다. |
361| `$.store` | JSON 총 4 MiB |369| `$.store` | JSON 총 4 MiB |
362| `$.session.messages()` | 최신 4,096개 항목 |370| `$.session.messages()` | 최신 4,096개 항목 |
375| :- | :- | :- |383| :- | :- | :- |
376| `CLAUDE_CODE_PLUGIN_DIRS` | 환경, 또는 `~/.claude/settings.json`의 `env` | 플래그를 전달할 수 없는 앱을 위해 `--plugin-dir`와 같은 방식으로 로드할 플러그인 디렉터리입니다. 절대 경로를 `:`로 구분하며, Windows에서는 `;`로 구분합니다. |384| `CLAUDE_CODE_PLUGIN_DIRS` | 환경, 또는 `~/.claude/settings.json`의 `env` | 플래그를 전달할 수 없는 앱을 위해 `--plugin-dir`와 같은 방식으로 로드할 플러그인 디렉터리입니다. 절대 경로를 `:`로 구분하며, Windows에서는 `;`로 구분합니다. |
377| `CLAUDE_CODE_PLUGIN_DIR_WATCH` | 환경 | `1`로 설정하면 장시간 실행되는 비대화형 세션이 저장 시 `--plugin-dir` mod를 다시 로드합니다 |385| `CLAUDE_CODE_PLUGIN_DIR_WATCH` | 환경 | `1`로 설정하면 장시간 실행되는 비대화형 세션이 저장 시 `--plugin-dir` mod를 다시 로드합니다 |
378| `prependPlugins`, `appendPlugins` | 관리형 설정. 관리형 설정이 없는 머신에서, 자격 증명이 Team 또는 Enterprise `/login`이 아닌 세션에서만 사용자 설정. | `acme-guard@acme-tools`와 같은 플러그인 ID 목록입니다. `prependPlugins`의 mod는 사용자가 설치한 모든 mod보다 먼저 실행되고, `appendPlugins`의 mod는 그 후에 나열된 순서대로 실행됩니다. [mod 실행 순서](/docs/ko/plugins/mods/events.md#the-order-mods-run-in)를 참조하세요. |386| `prependPlugins`, `appendPlugins` | 관리형 설정. 관리형 설정이 없는 머신에서, 자격 증명이 Team 또는 Enterprise `/login`이 아닌 세션에서만 사용자 설정. | `acme-guard@acme-tools`와 같은 플러그인 ID 목록입니다. `prependPlugins`의 mod는 사용자가 설치한 모든 mod보다 먼저 실행되고, `appendPlugins`의 mod는 그 후에 나열된 순서대로 실행됩니다. [mod 실행 순서](https://code.claude.com/docs/ko/plugins/mods/events.md#the-order-mods-run-in)를 참조하세요. |
379| `allowManagedModsOnly` | 관리형 설정, [기본 제공 가드의 옵션](/docs/ko/plugins/mods/admin.md#set-options-on-the-built-in-guard)으로 설정 | [조직의 mod로 간주되는](/docs/ko/plugins/mods/admin.md#install-your-organizations-mods) mod와 Claude Code에 기본 제공되는 mod만 훅을 실행합니다. 사용자의 설정 훅은 계속 실행됩니다. |387| `allowManagedModsOnly` | 관리형 설정, [기본 제공 가드의 옵션](https://code.claude.com/docs/ko/plugins/mods/admin.md#set-options-on-the-built-in-guard)으로 설정 | [조직의 mod로 간주되는](https://code.claude.com/docs/ko/plugins/mods/admin.md#install-your-organizations-mods) mod와 Claude Code에 기본 제공되는 mod만 훅을 실행합니다. 사용자의 설정 훅은 계속 실행됩니다. |
380| `allowModsToOverrideDenyRules` | 관리형 설정, [기본 제공 가드의 옵션](/docs/ko/plugins/mods/admin.md#set-options-on-the-built-in-guard)으로 설정 | 사용자가 설치한 mod가 `deny` 규칙이 거부하는 도구 호출을 승인할 수 있도록 합니다 |388| `allowModsToOverrideDenyRules` | 관리형 설정, [기본 제공 가드의 옵션](https://code.claude.com/docs/ko/plugins/mods/admin.md#set-options-on-the-built-in-guard)으로 설정 | 사용자가 설치한 mod가 `deny` 규칙이 거부하는 도구 호출을 승인할 수 있도록 합니다 |
381| `allowManagedHooksOnly` | 관리형 설정 | 조직의 것이 아닌 훅과 설치된 mod를 차단합니다. [계속 실행되는 항목](/docs/ko/settings-reference.md#what-runs-under-allowmanagedhooksonly)을 참조하세요. |389| `allowManagedHooksOnly` | 관리형 설정 | 조직의 것이 아닌 훅과 설치된 mod를 차단합니다. [계속 실행되는 항목](https://code.claude.com/docs/ko/settings-reference.md#what-runs-under-allowmanagedhooksonly)을 참조하세요. |
382| `disableAllHooks` | 모든 설정 파일 | 관리형 설정에서는 설치된 플러그인의 mod나 훅이 하나도 실행되지 않습니다. 사용자 본인의 설정에서는 조직이 관리하는 항목이 계속 실행됩니다. [`disableAllHooks`](/docs/ko/settings-reference#disableallhooks)를 참조하세요. |390| `disableAllHooks` | 모든 설정 파일 | 관리형 설정에서는 설치된 플러그인의 mod나 훅이 하나도 실행되지 않습니다. 사용자 본인의 설정에서는 조직이 관리하는 항목이 계속 실행됩니다. [`disableAllHooks`](https://code.claude.com/docs/ko/settings-reference#disableallhooks)를 참조하세요. |
383| `disableSideloadFlags` | 관리형 설정 | 시작 시 `--plugin-dir` 및 `--plugin-url`을 거부합니다 |391| `disableSideloadFlags` | 관리형 설정 | 시작 시 `--plugin-dir` 및 `--plugin-url`을 거부합니다 |
384| `pluginConfigs` | 사용자 또는 관리형 설정 | mod의 `userConfig` 값을 보관하며, `acme-guard@acme-tools`와 같은 플러그인 ID를 키로 사용합니다. `--plugin-dir`로 로드된 mod의 경우 `first-mod@inline`과 같이 이름과 `@inline`을 키로 사용합니다 |392| `pluginConfigs` | 사용자 또는 관리형 설정 | mod의 `userConfig` 값을 보관하며, `acme-guard@acme-tools`와 같은 플러그인 ID를 키로 사용합니다. `--plugin-dir`로 로드된 mod의 경우 `first-mod@inline`과 같이 이름과 `@inline`을 키로 사용합니다 |
385 393
386`sec-default@builtin`은 Claude Code에 기본 제공되는 가드로, `/plugin` 및 디버그 로그에는 `cc-plugin-sec-default`로 표시됩니다. 관리형 설정이 있는 머신이거나 자격 증명이 Team 또는 Enterprise [`/login`](/docs/ko/authentication#authentication-precedence)인 세션에서는, 사용자가 설치하는 모든 mod보다 먼저 로드됩니다. 관리형 `prependPlugins`가 설정된 경우, 이 가드는 해당 목록에 이름이 포함된 경우에만 나열된 위치에서 로드됩니다.394`sec-default@builtin`은 Claude Code에 기본 제공되는 가드로, `/plugin` 및 디버그 로그에는 `cc-plugin-sec-default`로 표시됩니다. 관리형 설정이 있는 머신이거나 자격 증명이 Team 또는 Enterprise [`/login`](https://code.claude.com/docs/ko/authentication#authentication-precedence)인 세션에서는, 사용자가 설치하는 모든 mod보다 먼저 로드됩니다. 관리형 `prependPlugins`가 설정된 경우, 이 가드는 해당 목록에 이름이 포함된 경우에만 나열된 위치에서 로드됩니다.
387 395
388소스는 [Claude Code 저장소의 `mods/sec-default` 디렉터리](https://github.com/anthropics/claude-code/tree/main/mods/sec-default)에 있습니다.396소스는 [Claude Code 저장소의 `mods/sec-default` 디렉터리](https://github.com/anthropics/claude-code/tree/main/mods/sec-default)에 있습니다.
389 397
393 401
394| 명령 | 기능 |402| 명령 | 기능 |
395| :- | :- |403| :- | :- |
396| [`/plugin`](/docs/ko/plugins/mods/overview#see-which-mods-a-session-loaded) | 기본 제공되지 않는 mod가 로드되면 탭 아래에 `1 mod active · first-mod`와 같은 줄을 표시합니다 |404| [`/plugin`](https://code.claude.com/docs/ko/plugins/mods/overview#see-which-mods-a-session-loaded) | 기본 제공되지 않는 mod가 로드되면 탭 아래에 `1 mod active · first-mod`와 같은 줄을 표시합니다 |
397| [`claude plugin validate <directory>`](/docs/ko/plugins/mods/create#check-what-claude-code-reads-from-your-mod) | 플러그인의 매니페스트와 훅 모듈을 읽고 오류, 처리하는 이벤트, 수행하는 mods API 호출을 보고합니다. `--strict`는 경고를 오류로 처리하고 `--json`은 기계가 읽을 수 있는 보고서를 출력합니다. |405| [`claude plugin validate <directory>`](https://code.claude.com/docs/ko/plugins/mods/create#check-what-claude-code-reads-from-your-mod) | 플러그인의 매니페스트와 훅 모듈을 읽고 오류, 처리하는 이벤트, 수행하는 mods API 호출을 보고합니다. `--strict`는 경고를 오류로 처리하고 `--json`은 기계가 읽을 수 있는 보고서를 출력합니다. |
398| [`claude plugin test [directory]`](/docs/ko/plugins/mods/test#write-a-test) | 디렉터리 아래에서, 디렉터리를 지정하지 않은 경우 현재 디렉터리 아래에서 이름이 `.test.ts` 또는 `.test.tsx`로 끝나는 모든 파일을 실행합니다. 테스트가 실패하면 상태 1로 종료됩니다. |406| [`claude plugin test [directory]`](https://code.claude.com/docs/ko/plugins/mods/test#write-a-test) | 디렉터리 아래에서, 디렉터리를 지정하지 않은 경우 현재 디렉터리 아래에서 이름이 `.test.ts` 또는 `.test.tsx`로 끝나는 모든 파일을 실행합니다. 테스트가 실패하면 상태 1로 종료됩니다. |
399| [`claude --plugin-dir <directory>`](/docs/ko/plugins/mods/create#write-a-mod-yourself) | 하나의 세션 동안 플러그인 디렉터리를 로드하고 저장할 때마다 훅 모듈을 다시 로드합니다. 여러 개를 로드하려면 플래그를 반복합니다. |407| [`claude --plugin-dir <directory>`](https://code.claude.com/docs/ko/plugins/mods/create#write-a-mod-yourself) | 하나의 세션 동안 플러그인 디렉터리를 로드하고 저장할 때마다 훅 모듈을 다시 로드합니다. 여러 개를 로드하려면 플래그를 반복합니다. |
400| `/reload-plugins` | 실행하면 플러그인을 다시 로드합니다 |408| `/reload-plugins` | 실행하면 플러그인을 다시 로드합니다 |