297| :-------------- | :-- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |297| :-------------- | :-- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
298| `type` | ์ | `"command"`, `"http"`, `"mcp_tool"`, `"prompt"` ๋๋ `"agent"` |298| `type` | ์ | `"command"`, `"http"`, `"mcp_tool"`, `"prompt"` ๋๋ `"agent"` |
299| `if` | ์๋์ค | `"Bash(git *)"` ๋๋ `"Edit(*.ts)"`์ ๊ฐ์ ๊ถํ ๊ท์น ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ด hook์ด ์คํ๋ ๋๋ฅผ ํํฐ๋งํฉ๋๋ค. hook์ ๋๊ตฌ ํธ์ถ์ด ํจํด๊ณผ ์ผ์นํ ๋๋ง ์์ฑ๋๊ฑฐ๋ Bash ๋ช
๋ น์ด ๋๋ฌด ๋ณต์กํ์ฌ ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์์ ๋ ์์ฑ๋ฉ๋๋ค. ๋๊ตฌ ์ด๋ฒคํธ์์๋ง ํ๊ฐ๋ฉ๋๋ค: `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `PermissionDenied`. ๋ค๋ฅธ ์ด๋ฒคํธ์์๋ `if`๊ฐ ์ค์ ๋ hook์ด ์ ๋ ์คํ๋์ง ์์ต๋๋ค. [๊ถํ ๊ท์น](/ko/permissions)๊ณผ ๋์ผํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค |299| `if` | ์๋์ค | `"Bash(git *)"` ๋๋ `"Edit(*.ts)"`์ ๊ฐ์ ๊ถํ ๊ท์น ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ด hook์ด ์คํ๋ ๋๋ฅผ ํํฐ๋งํฉ๋๋ค. hook์ ๋๊ตฌ ํธ์ถ์ด ํจํด๊ณผ ์ผ์นํ ๋๋ง ์์ฑ๋๊ฑฐ๋ Bash ๋ช
๋ น์ด ๋๋ฌด ๋ณต์กํ์ฌ ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์์ ๋ ์์ฑ๋ฉ๋๋ค. ๋๊ตฌ ์ด๋ฒคํธ์์๋ง ํ๊ฐ๋ฉ๋๋ค: `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `PermissionDenied`. ๋ค๋ฅธ ์ด๋ฒคํธ์์๋ `if`๊ฐ ์ค์ ๋ hook์ด ์ ๋ ์คํ๋์ง ์์ต๋๋ค. [๊ถํ ๊ท์น](/ko/permissions)๊ณผ ๋์ผํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค |
300| `timeout` | ์๋์ค | ์ทจ์ํ๊ธฐ ์ ์ด ๋จ์. ๊ธฐ๋ณธ๊ฐ: ๋ช
๋ น์ ๊ฒฝ์ฐ 600, ํ๋กฌํํธ์ ๊ฒฝ์ฐ 30, ์์ด์ ํธ์ ๊ฒฝ์ฐ 60 |300| `timeout` | ์๋์ค | ์ทจ์ํ๊ธฐ ์ ์ด ๋จ์. ๊ธฐ๋ณธ๊ฐ: `command`, `http`, `mcp_tool`์ ๊ฒฝ์ฐ 600; `prompt`์ ๊ฒฝ์ฐ 30; `agent`์ ๊ฒฝ์ฐ 60. [`UserPromptSubmit`](#userpromptsubmit)์ `command`, `http`, `mcp_tool`์ ๊ธฐ๋ณธ๊ฐ์ 30์ผ๋ก ๋ฎ์ถฅ๋๋ค |
301| `statusMessage` | ์๋์ค | hook์ด ์คํ๋๋ ๋์ ํ์๋๋ ์ฌ์ฉ์ ์ ์ ์คํผ๋ ๋ฉ์์ง |301| `statusMessage` | ์๋์ค | hook์ด ์คํ๋๋ ๋์ ํ์๋๋ ์ฌ์ฉ์ ์ ์ ์คํผ๋ ๋ฉ์์ง |
302| `once` | ์๋์ค | `true`์ธ ๊ฒฝ์ฐ ์ธ์
๋น ํ ๋ฒ๋ง ์คํ๋ ํ ์ ๊ฑฐ๋ฉ๋๋ค. [Skill ๋ฐ ์์ด์ ํธ์ Hook](#hooks-in-skills-and-agents)์์ ์ ์ธ๋ hook์๋ง ์ ์ฉ๋จ; ์ค์ ํ์ผ ๋ฐ ์์ด์ ํธ frontmatter์์๋ ๋ฌด์๋จ |302| `once` | ์๋์ค | `true`์ธ ๊ฒฝ์ฐ ์ธ์
๋น ํ ๋ฒ๋ง ์คํ๋ ํ ์ ๊ฑฐ๋ฉ๋๋ค. [Skill ๋ฐ ์์ด์ ํธ์ Hook](#hooks-in-skills-and-agents)์์ ์ ์ธ๋ hook์๋ง ์ ์ฉ๋จ; ์ค์ ํ์ผ ๋ฐ ์์ด์ ํธ frontmatter์์๋ ๋ฌด์๋จ |
303 303
558 558
559๋ช
๋ น hook์ stdin์ ํตํด JSON ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ ์ข
๋ฃ ์ฝ๋, stdout, stderr๋ฅผ ํตํด ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํฉ๋๋ค. HTTP hook์ POST ์์ฒญ ๋ณธ๋ฌธ์ผ๋ก ๋์ผํ JSON์ ๋ฐ๊ณ HTTP ์๋ต ๋ณธ๋ฌธ์ ํตํด ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ด ์น์
์์๋ ๋ชจ๋ ์ด๋ฒคํธ์ ๊ณตํต์ ์ธ ํ๋์ ๋์์ ๋ค๋ฃน๋๋ค. [Hook ์ด๋ฒคํธ](#hook-events) ์๋์ ๊ฐ ์ด๋ฒคํธ ์น์
์๋ ํน์ ์
๋ ฅ ์คํค๋ง์ ๊ฒฐ์ ์ ์ด ์ต์
์ด ํฌํจ๋ฉ๋๋ค.559๋ช
๋ น hook์ stdin์ ํตํด JSON ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ ์ข
๋ฃ ์ฝ๋, stdout, stderr๋ฅผ ํตํด ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํฉ๋๋ค. HTTP hook์ POST ์์ฒญ ๋ณธ๋ฌธ์ผ๋ก ๋์ผํ JSON์ ๋ฐ๊ณ HTTP ์๋ต ๋ณธ๋ฌธ์ ํตํด ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ด ์น์
์์๋ ๋ชจ๋ ์ด๋ฒคํธ์ ๊ณตํต์ ์ธ ํ๋์ ๋์์ ๋ค๋ฃน๋๋ค. [Hook ์ด๋ฒคํธ](#hook-events) ์๋์ ๊ฐ ์ด๋ฒคํธ ์น์
์๋ ํน์ ์
๋ ฅ ์คํค๋ง์ ๊ฒฐ์ ์ ์ด ์ต์
์ด ํฌํจ๋ฉ๋๋ค.
560 560
561macOS ๋ฐ Linux์์ ๋ช
๋ น hook์ v2.1.139๋ถํฐ ์ ์ด ํฐ๋ฏธ๋ ์์ด ์์ ์ ์ธ์
์์ ์คํ๋ฉ๋๋ค. hook ํ๋ก์ธ์ค ๋ฐ ๋ชจ๋ ์์ ํ๋ก์ธ์ค๋ `/dev/tty`๋ฅผ ์ด๊ฑฐ๋ Claude Code ์ธํฐํ์ด์ค์ ์ง์ ์ด์ค์ผ์ดํ ์ํ์ค๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค. Windows์๋ `/dev/tty`๊ฐ ์์ต๋๋ค. ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉ์์๊ฒ ๋ฉ์์ง๋ฅผ ํ์ํ๋ ค๋ฉด JSON ์ถ๋ ฅ์์ [`systemMessage`](#json-output)๋ฅผ ๋ฐํํฉ๋๋ค. ๋ฐ์คํฌํฑ ์๋ฆผ์ ํธ๋ฆฌ๊ฑฐํ๊ฑฐ๋ ์ฐฝ ์ ๋ชฉ์ ์ค์ ํ๊ฑฐ๋ ๋ฒจ์ ์ธ๋ฆฌ๋ ค๋ฉด ๋์ [`terminalSequence`](#emit-terminal-notifications)๋ฅผ ๋ฐํํฉ๋๋ค.
562
561### ๊ณตํต ์
๋ ฅ ํ๋563### ๊ณตํต ์
๋ ฅ ํ๋
562 564
563Hook ์ด๋ฒคํธ๋ ๊ฐ [hook ์ด๋ฒคํธ](#hook-events) ์น์
์์ ๋ฌธ์ํ๋ ์ด๋ฒคํธ ํน์ ํ๋ ์ธ์ ์ด๋ฌํ ํ๋๋ฅผ JSON์ผ๋ก ๋ฐ์ต๋๋ค. ๋ช
๋ น hook์ ๊ฒฝ์ฐ ์ด JSON์ stdin์ ํตํด ๋์ฐฉํฉ๋๋ค. HTTP hook์ ๊ฒฝ์ฐ POST ์์ฒญ ๋ณธ๋ฌธ์ผ๋ก ๋์ฐฉํฉ๋๋ค.565Hook ์ด๋ฒคํธ๋ ๊ฐ [hook ์ด๋ฒคํธ](#hook-events) ์น์
์์ ๋ฌธ์ํ๋ ์ด๋ฒคํธ ํน์ ํ๋ ์ธ์ ์ด๋ฌํ ํ๋๋ฅผ JSON์ผ๋ก ๋ฐ์ต๋๋ค. ๋ช
๋ น hook์ ๊ฒฝ์ฐ ์ด JSON์ stdin์ ํตํด ๋์ฐฉํฉ๋๋ค. HTTP hook์ ๊ฒฝ์ฐ POST ์์ฒญ ๋ณธ๋ฌธ์ผ๋ก ๋์ฐฉํฉ๋๋ค.
685 687
686hook์ stdout์ JSON ๊ฐ์ฒด๋ง ํฌํจํด์ผ ํฉ๋๋ค. ์
ธ ํ๋กํ์ด ์์ ์ ํ
์คํธ๋ฅผ ์ธ์ํ๋ฉด JSON ๊ตฌ๋ฌธ ๋ถ์์ ๋ฐฉํดํ ์ ์์ต๋๋ค. ๋ฌธ์ ํด๊ฒฐ ๊ฐ์ด๋์ [JSON ๊ฒ์ฆ ์คํจ](/ko/hooks-guide#json-validation-failed)๋ฅผ ์ฐธ์กฐํ์ธ์.688hook์ stdout์ JSON ๊ฐ์ฒด๋ง ํฌํจํด์ผ ํฉ๋๋ค. ์
ธ ํ๋กํ์ด ์์ ์ ํ
์คํธ๋ฅผ ์ธ์ํ๋ฉด JSON ๊ตฌ๋ฌธ ๋ถ์์ ๋ฐฉํดํ ์ ์์ต๋๋ค. ๋ฌธ์ ํด๊ฒฐ ๊ฐ์ด๋์ [JSON ๊ฒ์ฆ ์คํจ](/ko/hooks-guide#json-validation-failed)๋ฅผ ์ฐธ์กฐํ์ธ์.
687 689
688์ปจํ
์คํธ์ ์ฃผ์
๋ hook ์ถ๋ ฅ (`additionalContext`, `systemMessage` ๋๋ ์ผ๋ฐ stdout)์ 10,000์๋ก ์ ํ๋ฉ๋๋ค. ์ด ์ ํ์ ์ด๊ณผํ๋ ์ถ๋ ฅ์ ํ์ผ์ ์ ์ฅ๋๊ณ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐ ํ์ผ ๊ฒฝ๋ก๋ก ๋ฐ๋๋ฉฐ, ํฐ ๋๊ตฌ ๊ฒฐ๊ณผ๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์๊ณผ ๋์ผํฉ๋๋ค.690hook ์ถ๋ ฅ ๋ฌธ์์ด (`additionalContext`, `systemMessage`, ๋ฐ ์ผ๋ฐ stdout)์ 10,000์๋ก ์ ํ๋ฉ๋๋ค. ์ด ์ ํ์ ์ด๊ณผํ๋ ์ถ๋ ฅ์ ํ์ผ์ ์ ์ฅ๋๊ณ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐ ํ์ผ ๊ฒฝ๋ก๋ก ๋ฐ๋๋ฉฐ, ํฐ ๋๊ตฌ ๊ฒฐ๊ณผ๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์๊ณผ ๋์ผํฉ๋๋ค.
689 691
690JSON ๊ฐ์ฒด๋ ์ธ ๊ฐ์ง ์ข
๋ฅ์ ํ๋๋ฅผ ์ง์ํฉ๋๋ค:692JSON ๊ฐ์ฒด๋ ์ธ ๊ฐ์ง ์ข
๋ฅ์ ํ๋๋ฅผ ์ง์ํฉ๋๋ค:
691 693
694* \*\*`hookSpecificOutput`\*\*์ ๋ ํ๋ถํ ์ ์ด๊ฐ ํ์ํ ์ด๋ฒคํธ๋ฅผ ์ํ ์ค์ฒฉ ๊ฐ์ฒด์
๋๋ค. ์ด๋ฒคํธ ์ด๋ฆ์ผ๋ก ์ค์ ๋ `hookEventName` ํ๋๊ฐ ํ์ํฉ๋๋ค.696* \*\*`hookSpecificOutput`\*\*์ ๋ ํ๋ถํ ์ ์ด๊ฐ ํ์ํ ์ด๋ฒคํธ๋ฅผ ์ํ ์ค์ฒฉ ๊ฐ์ฒด์
๋๋ค. ์ด๋ฒคํธ ์ด๋ฆ์ผ๋ก ์ค์ ๋ `hookEventName` ํ๋๊ฐ ํ์ํฉ๋๋ค.
695 697
696| ํ๋ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
|698| ํ๋ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
|
697| :--------------- | :------ | :----------------------------------------------------------------- |699| :----------------- | :------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
698| `continue` | `true` | `false`์ธ ๊ฒฝ์ฐ hook์ด ์คํ๋ ํ Claude๊ฐ ์์ ํ ์ค์ง๋ฉ๋๋ค. ๋ชจ๋ ์ด๋ฒคํธ ํน์ ๊ฒฐ์ ํ๋๋ณด๋ค ์ฐ์ ํฉ๋๋ค |700| `continue` | `true` | `false`์ธ ๊ฒฝ์ฐ hook์ด ์คํ๋ ํ Claude๊ฐ ์์ ํ ์ค์ง๋ฉ๋๋ค. ๋ชจ๋ ์ด๋ฒคํธ ํน์ ๊ฒฐ์ ํ๋๋ณด๋ค ์ฐ์ ํฉ๋๋ค |
699| `stopReason` | ์์ | `continue`๊ฐ `false`์ผ ๋ ์ฌ์ฉ์์๊ฒ ํ์๋๋ ๋ฉ์์ง. Claude์๋ ํ์๋์ง ์์ |701| `stopReason` | ์์ | `continue`๊ฐ `false`์ผ ๋ ์ฌ์ฉ์์๊ฒ ํ์๋๋ ๋ฉ์์ง. Claude์๋ ํ์๋์ง ์์ |
700| `suppressOutput` | `false` | `true`์ธ ๊ฒฝ์ฐ ๋๋ฒ๊ทธ ๋ก๊ทธ์์ stdout์ ์จ๊น๋๋ค |702| `suppressOutput` | `false` | `true`์ธ ๊ฒฝ์ฐ ๋๋ฒ๊ทธ ๋ก๊ทธ์์ stdout์ ์จ๊น๋๋ค |
701| `systemMessage` | ์์ | ์ฌ์ฉ์์๊ฒ ํ์๋๋ ๊ฒฝ๊ณ ๋ฉ์์ง |703| `systemMessage` | ์์ | ์ฌ์ฉ์์๊ฒ ํ์๋๋ ๊ฒฝ๊ณ ๋ฉ์์ง |
704| `terminalSequence` | ์์ | Claude Code๊ฐ ์ฌ์ฉ์๋ฅผ ๋์ ํ์ฌ ๋ด๋ณด๋ผ ํฐ๋ฏธ๋ ์ด์ค์ผ์ดํ ์ํ์ค (์: ๋ฐ์คํฌํฑ ์๋ฆผ, ์ฐฝ ์ ๋ชฉ ๋๋ ๋ฒจ). OSC `0`/`1`/`2`/`9`/`99`/`777` ๋ฐ BEL๋ก ์ ํ๋ฉ๋๋ค. ๊ฐ์ ํ์ฉ ๋ชฉ๋ก ์ธ์ ํญ๋ชฉ์ด ํฌํจ๋๋ฉด ํ๋๋ ๋ฌด์๋ฉ๋๋ค. `/dev/tty`๋ฅผ ์ฌ์ฉํ ์ ์๋ hook ๋์ ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค |
702 705
703Claude๋ฅผ ์ด๋ฒคํธ ์ ํ๊ณผ ๊ด๊ณ์์ด ์์ ํ ์ค์งํ๋ ค๋ฉด:706Claude๋ฅผ ์ด๋ฒคํธ ์ ํ๊ณผ ๊ด๊ณ์์ด ์์ ํ ์ค์งํ๋ ค๋ฉด:
704 707
706{ "continue": false, "stopReason": "Build failed, fix errors before continuing" }709{ "continue": false, "stopReason": "Build failed, fix errors before continuing" }
707```710```
708 711
712#### ํฐ๋ฏธ๋ ์๋ฆผ ๋ด๋ณด๋ด๊ธฐ
713
714`terminalSequence` ํ๋๋ Claude Code v2.1.141 ์ด์์ด ํ์ํฉ๋๋ค.
715
716Hook์ ์ ์ด ํฐ๋ฏธ๋ ์์ด ์คํ๋๋ฏ๋ก ์ด์ค์ผ์ดํ ์ํ์ค๋ฅผ `/dev/tty`์ ์ง์ ์ฐ๋ ๊ฒ์ด ์คํจํฉ๋๋ค. ๋์ `terminalSequence` ํ๋์ ์ด์ค์ผ์ดํ ์ํ์ค๋ฅผ ๋ฐํํ๋ฉด Claude Code๊ฐ ์์ ์ ํฐ๋ฏธ๋ ์ฐ๊ธฐ ๊ฒฝ๋ก๋ฅผ ํตํด ์ด๋ฅผ ๋ด๋ณด๋
๋๋ค. ์ด๋ race-free์ด๊ณ tmux ๋ฐ GNU screen ๋ด์์ ์๋ํ๋ฉฐ `/dev/tty`๊ฐ ์๋ Windows์์๋ ์๋ํฉ๋๋ค.
717
718ํ๋๋ ํ๋ ์ด์์ ํ์ฉ ๋ชฉ๋ก์ ์๋ ์ด์ค์ผ์ดํ ์ํ์ค ๋ฌธ์์ด์ ํ์ฉํฉ๋๋ค:
719
720* OSC `0`, `1`, `2`: ์ฐฝ ๋ฐ ์์ด์ฝ ์ ๋ชฉ
721* OSC `9`: iTerm2, ConEmu, Windows Terminal, ๋ฐ WezTerm ์๋ฆผ (`9;4` ์์
ํ์์ค ์งํ๋ฅ ํฌํจ)
722* OSC `99`: Kitty ์๋ฆผ
723* OSC `777`: urxvt, Ghostty, ๋ฐ Warp ์๋ฆผ
724* ๋งจ BEL
725
726์ํ์ค๋ BEL ๋๋ ST๋ก ์ข
๋ฃ๋ ์ ์์ต๋๋ค. ํ์ฉ ๋ชฉ๋ก ์ธ์ ํญ๋ชฉ (CSI ์ปค์ ๋ฐ ์์ ์ํ์ค, OSC ํ๋ ํธ ์ํ์ค, OSC 8 ํ์ดํผ๋งํฌ, OSC 52 ํด๋ฆฝ๋ณด๋ ์ฐ๊ธฐ, ๋ฐ OSC 1337 ํฌํจ)์ ๊ฑฐ๋ถ๋๊ณ ํ๋๋ ๋ฌด์๋ฉ๋๋ค.
727
728์๋ ์์ ๋ `Notification` hook์์ ๋ฐ์คํฌํฑ ์๋ฆผ์ ๋ฐ์์ํต๋๋ค. ์ด์ค์ผ์ดํ ์ํ์ค๋ `printf` 8์ง์ ์ด์ค์ผ์ดํ๋ก ๋น๋๋๋ฏ๋ก ์ ์ด ๋ฐ์ดํธ๊ฐ ์
ธ ๋ช
๋ น์ค์ ๋ํ๋์ง ์์ผ๋ฉฐ, `jq -n --arg`๋ JSON ์ถ๋ ฅ์ ๋น๋ํ๋ฏ๋ก ์๋ฆผ ๋ฉ์์ง์ ๋ฐ์ดํ, ๋ฐฑ์ฌ๋์, ๋ฐ ์ค๋ฐ๊ฟ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ด์ค์ผ์ดํ๋ฉ๋๋ค:
729
730```bash theme={null}
731#!/bin/bash
732# Notification hook: Claude Code๊ฐ ์ฃผ์๊ฐ ํ์ํ ๋ ๋ฐ์คํฌํฑ์ pingํฉ๋๋ค.
733input=$(cat)
734title="Claude Code'
735body=$(jq -r '.message // "Needs your attention"' <<<"$input")
736seq=$(printf '\033]777;notify;%s;%s\007' "$title" "$body")
737jq -nc --arg seq "$seq" '{terminalSequence: $seq}'
738```
739
740`{ "terminalSequence": "..." }` ํํ๋ ๋ชจ๋ ์
ธ ๋๋ ์ธ์ด์์ ๋์ผํฉ๋๋ค. Windows์์๋ PowerShell ๋๋ ์คํฌ๋ฆฝํธ์์ ์ด์ค์ผ์ดํ ๋ฌธ์์ด์ ๋น๋ํ๊ณ ๋์ผํ JSON ๊ฐ์ฒด๋ฅผ ๋ด๋ณด๋
๋๋ค.
741
742<Note>
743 `terminalSequence`๋ ์ด์ ์ `/dev/tty`์ ์ง์ ์ด์ค์ผ์ดํ ์ํ์ค๋ฅผ ์์ฑํ hook์ ์ง์๋๋ ๋์ฒด์
๋๋ค. ํ์ฉ ๋ชฉ๋ก์ ์ปค์๋ฅผ ์ด๋ํ๊ฑฐ๋ ์์์ ๋ณ๊ฒฝํ ์ ์๋ ์ํ์ค๋ก ์ ํ๋๋ฏ๋ก hook์ ํ๋ฉด์์ ํ๋กฌํํธ๋ฅผ ์์์ํฌ ์ ์์ต๋๋ค.
744</Note>
745
709#### Claude๋ฅผ ์ํ ์ปจํ
์คํธ ์ถ๊ฐ746#### Claude๋ฅผ ์ํ ์ปจํ
์คํธ ์ถ๊ฐ
710 747
711`additionalContext` ํ๋๋ hook์์ Claude์ ์ปจํ
์คํธ ์๋์ฐ๋ก ๋ฌธ์์ด์ ์ ๋ฌํฉ๋๋ค. Claude Code๋ ๋ฌธ์์ด์ ์์คํ
๋ฏธ๋ฆฌ ์๋ฆผ์ผ๋ก ๋ํํ๊ณ hook์ด ๋ฐ์ํ ์ง์ ์์ ๋ํ์ ์ฝ์
ํฉ๋๋ค. Claude๋ ๋ค์ ๋ชจ๋ธ ์์ฒญ์์ ๋ฏธ๋ฆฌ ์๋ฆผ์ ์ฝ์ง๋ง ์ธํฐํ์ด์ค์ ์ฑํ
๋ฉ์์ง๋ก ๋ํ๋์ง ์์ต๋๋ค.748`additionalContext` ํ๋๋ hook์์ Claude์ ์ปจํ
์คํธ ์๋์ฐ๋ก ๋ฌธ์์ด์ ์ ๋ฌํฉ๋๋ค. Claude Code๋ ๋ฌธ์์ด์ ์์คํ
๋ฏธ๋ฆฌ ์๋ฆผ์ผ๋ก ๋ํํ๊ณ hook์ด ๋ฐ์ํ ์ง์ ์์ ๋ํ์ ์ฝ์
ํฉ๋๋ค. Claude๋ ๋ค์ ๋ชจ๋ธ ์์ฒญ์์ ๋ฏธ๋ฆฌ ์๋ฆผ์ ์ฝ์ง๋ง ์ธํฐํ์ด์ค์ ์ฑํ
๋ฉ์์ง๋ก ๋ํ๋์ง ์์ต๋๋ค.
989 1026
990์ฌ์ฉ์๊ฐ ํ๋กฌํํธ๋ฅผ ์ ์ถํ ๋, Claude๊ฐ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ์คํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํ๋กฌํํธ/๋ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ถ๊ฐ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, ํ๋กฌํํธ๋ฅผ ๊ฒ์ฆํ๊ฑฐ๋, ํน์ ์ ํ์ ํ๋กฌํํธ๋ฅผ ์ฐจ๋จํ ์ ์์ต๋๋ค.1027์ฌ์ฉ์๊ฐ ํ๋กฌํํธ๋ฅผ ์ ์ถํ ๋, Claude๊ฐ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ์คํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํ๋กฌํํธ/๋ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ถ๊ฐ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, ํ๋กฌํํธ๋ฅผ ๊ฒ์ฆํ๊ฑฐ๋, ํน์ ์ ํ์ ํ๋กฌํํธ๋ฅผ ์ฐจ๋จํ ์ ์์ต๋๋ค.
991 1028
1029`UserPromptSubmit` hook์ `command`, `http`, `mcp_tool` ์ ํ์ ๋ํด ๊ธฐ๋ณธ 30์ด ์๊ฐ ์ด๊ณผ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด๋ ๋ค๋ฅธ ์ด๋ฒคํธ์์ ์ด๋ฌํ ์ ํ์ ๊ธฐ๋ณธ 600์ด๋ณด๋ค ์งง์ต๋๋ค. ์ด hook์ ๋ชจ๋ ํ๋กฌํํธ ์ ์ ์คํ๋๊ณ ๋ชจ๋ธ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ๋๊น์ง ์ฐจ๋จํ๋ฏ๋ก stuck hook์ ์ธ์
์ ์ ์ง์ํต๋๋ค. hook์ ๋ ๋ง์ ์๊ฐ์ด ํ์ํ๋ฉด hook ํญ๋ชฉ์์ `timeout` ํ๋๋ฅผ ์ค์ ํฉ๋๋ค.
1030
992#### UserPromptSubmit ์
๋ ฅ1031#### UserPromptSubmit ์
๋ ฅ
993 1032
994[๊ณตํต ์
๋ ฅ ํ๋](#common-input-fields) ์ธ์๋ UserPromptSubmit hook์ ์ฌ์ฉ์๊ฐ ์ ์ถํ ํ
์คํธ๋ฅผ ํฌํจํ๋ `prompt` ํ๋๋ฅผ ๋ฐ์ต๋๋ค.1033[๊ณตํต ์
๋ ฅ ํ๋](#common-input-fields) ์ธ์๋ UserPromptSubmit hook์ ์ฌ์ฉ์๊ฐ ์ ์ถํ ํ
์คํธ๋ฅผ ํฌํจํ๋ `prompt` ํ๋๋ฅผ ๋ฐ์ต๋๋ค.
2596 2635
2597๋น๋๊ธฐ hook์ด ๋ฐ์ํ๋ฉด Claude Code๋ hook ํ๋ก์ธ์ค๋ฅผ ์์ํ๊ณ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฆ์ ๊ณ์ํฉ๋๋ค. hook์ ๋๊ธฐ hook๊ณผ ๋์ผํ JSON ์
๋ ฅ์ stdin์ ํตํด ๋ฐ์ต๋๋ค.2636๋น๋๊ธฐ hook์ด ๋ฐ์ํ๋ฉด Claude Code๋ hook ํ๋ก์ธ์ค๋ฅผ ์์ํ๊ณ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฆ์ ๊ณ์ํฉ๋๋ค. hook์ ๋๊ธฐ hook๊ณผ ๋์ผํ JSON ์
๋ ฅ์ stdin์ ํตํด ๋ฐ์ต๋๋ค.
2598 2637
2599๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋ ํ hook์ด `systemMessage` ๋๋ `additionalContext` ํ๋๊ฐ ์๋ JSON ์๋ต์ ์์ฑํ ๊ฒฝ์ฐ ํด๋น ์ฝํ
์ธ ๋ ๋ค์ ๋ํ ํด์์ Claude์ ์ปจํ
์คํธ๋ก ์ ๋ฌ๋ฉ๋๋ค.2638๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋ ํ hook์ด `additionalContext` ํ๋๊ฐ ์๋ JSON ์๋ต์ ์์ฑํ ๊ฒฝ์ฐ ํด๋น ์ฝํ
์ธ ๋ ๋ค์ ๋ํ ํด์์ Claude์ ์ปจํ
์คํธ๋ก ์ ๋ฌ๋ฉ๋๋ค. `systemMessage` ํ๋๋ Claude๊ฐ ์๋ ์ฌ์ฉ์์๊ฒ ํ์๋ฉ๋๋ค.
2600 2639
2601๋น๋๊ธฐ hook ์๋ฃ ์๋ฆผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์ ๋ฉ๋๋ค. ๋ณด๋ ค๋ฉด `Ctrl+O`๋ก ์์ธํ ๋ชจ๋๋ฅผ ํ์ฑํํ๊ฑฐ๋ `--verbose`๋ก Claude Code๋ฅผ ์์ํฉ๋๋ค.2640๋น๋๊ธฐ hook ์๋ฃ ์๋ฆผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์ ๋ฉ๋๋ค. ๋ณด๋ ค๋ฉด `Ctrl+O`๋ก ์์ธํ ๋ชจ๋๋ฅผ ํ์ฑํํ๊ฑฐ๋ `--verbose`๋ก Claude Code๋ฅผ ์์ํฉ๋๋ค.
2602 2641
2617 exit 02656 exit 0
2618fi2657fi
2619 2658
2620# ํ
์คํธ๋ฅผ ์คํํ๊ณ systemMessage๋ฅผ ํตํด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค2659# ํ
์คํธ๋ฅผ ์คํํ๊ณ additionalContext๋ฅผ ํตํด ๊ฒฐ๊ณผ๋ฅผ Claude์ ๋ณด๊ณ ํฉ๋๋ค
2621RESULT=$(npm test 2>&1)2660RESULT=$(npm test 2>&1)
2622EXIT_CODE=$?2661EXIT_CODE=$?
2623 2662
2624if [ $EXIT_CODE -eq 0 ]; then2663if [ $EXIT_CODE -eq 0 ]; then
2625 echo "{\"systemMessage\": \"Tests passed after editing $FILE_PATH\"}"2664 MSG="Tests passed after editing $FILE_PATH"
2626else2665else
2627 echo "{\"systemMessage\": \"Tests failed after editing $FILE_PATH: $RESULT\"}"2666 MSG="Tests failed after editing $FILE_PATH: $RESULT"
2628fi2667fi
2668jq -nc --arg msg "$MSG" '{hookSpecificOutput: {hookEventName: "PostToolUse", additionalContext: $msg}}'
2629```2669```
2630 2670
2631๊ทธ๋ฐ ๋ค์ ํ๋ก์ ํธ ๋ฃจํธ์ `.claude/settings.json`์ ์ด ๊ตฌ์ฑ์ ์ถ๊ฐํฉ๋๋ค. `async: true` ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด Claude๊ฐ ํ
์คํธ ์คํ ์ค์ ๊ณ์ ์์
ํ ์ ์์ต๋๋ค:2671๊ทธ๋ฐ ๋ค์ ํ๋ก์ ํธ ๋ฃจํธ์ `.claude/settings.json`์ ์ด ๊ตฌ์ฑ์ ์ถ๊ฐํฉ๋๋ค. `async: true` ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด Claude๊ฐ ํ
์คํธ ์คํ ์ค์ ๊ณ์ ์์
ํ ์ ์์ต๋๋ค: