English ยท ํ๊ตญ์ด
An interactive hook widget for Claude Code: when Claude pauses, the lion Leo peeks out so you can reply straight from a desktop popup.
When Claude finishes a task (Stop) or waits for your input (Notification), pawse shows a small desktop widget. Type your next instruction right in the widget and Claude keeps going. Built with PowerShell + WPF โ no install required (Windows only).
Optionally, pawse can also confirm risky commands before they run โ see Optional: PreToolUse.
| Stop โ type your next instruction | Notification โ Claude needs you |
|---|---|
![]() |
![]() |
| Event | Trigger | Widget | Leo |
|---|---|---|---|
| Stop | Claude finishes a response | Preview of the last message + an input box. Type to make Claude continue ({"decision":"block"}); leave it empty to just stop. |
๐ happy |
| Notification | Permission / idle input wait | Toast notification (auto-dismiss). Informational only. | ๐ฎ surprised ! |
A third event, PreToolUse (risky-command confirm), is optional and off by default โ see Optional: PreToolUse.
Design: aligned with Windows 11 Fluent (8px card / 4px controls, soft shadow + 1px border, Segoe UI Variable type ramp 20/14/12, WCAG AA-passing colors), automatic light/dark following the system, and a slide-in entrance (respecting the system "Show animations" setting).
The widget script is wired into Claude Code hooks. The key idea is that it's bidirectional:
Claude finishes โโถ Stop hook โโถ pawse widget appears
โ you type the next instruction
โผ
{"decision":"block","reason":"<your text>"} โโถ Claude continues
Windows only. pawse uses
powershell.exe+ WPF. Installing on macOS/Linux is harmless but the widget won't appear.
pawse ships as a Claude Code plugin โ nothing to hand-edit. In Claude Code:
/plugin marketplace add sinwoo0225/Pawse
/plugin install pawse@leo
Then run /reload-plugins (or restart Claude Code). The Stop + Notification hooks are wired automatically via ${CLAUDE_PLUGIN_ROOT}.
Prefer to wire it yourself? Clone the repo and add this to hooks in ~/.claude/settings.json, replacing <install-path> with the absolute path to the repo. Note the plugin\ subfolder โ the script lives under plugin/:
"hooks": {
"Stop": [{ "hooks": [{ "type": "command", "timeout": 600,
"command": "powershell.exe -NoProfile -ExecutionPolicy Bypass -File \"<install-path>\\plugin\\claude-widget.ps1\" -Event Stop" }] }],
"Notification": [{ "hooks": [{ "type": "command", "timeout": 30,
"command": "powershell.exe -NoProfile -ExecutionPolicy Bypass -File \"<install-path>\\plugin\\claude-widget.ps1\" -Event Notification" }] }]
}Then restart Claude Code to load the hooks.
WPF needs an STA thread, so it's invoked with
powershell.exe(Windows PowerShell 5.1), notpwsh.
Upgrading from a pre-plugin manual install? The script moved from the repo root into
plugin/. Switch to the plugin install above, or update yoursettings.jsonhook path to add\plugin.
Not part of the default install above โ pawse can also pop a confirm widget right before a command runs. To turn it on, add a PreToolUse hook alongside the others:
"PreToolUse": [{ "matcher": "Bash", "hooks": [{ "type": "command", "timeout": 600,
"command": "powershell.exe -NoProfile -ExecutionPolicy Bypass -File \"<install-path>\\plugin\\claude-widget.ps1\" -Event PreToolUse" }] }]Then set a DangerPattern regex in config.psd1 to choose which commands trigger it (the shipped default '.' matches every command), and restart Claude Code.
Before a tool runs, the hook decides whether to show the confirm widget. It only shows when all three gates pass โ otherwise it exits silently and Claude's normal permission flow continues:
tool about to run
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ yes
โ 1. permission_mode โ {auto, bypassPermissions, dontAsk}? โ โโโโโโโถ exit 0 (no widget)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ no
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ yes
โ 2. command covered by a permissions.allow rule? โ โโโโโโโถ exit 0 (no widget)
โ (Bash(...) form โ the hook matcher is "Bash") โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ no
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ no
โ 3. command matches DangerPattern? โ โโโโโโโถ exit 0 (normal flow)
โ (default config '.' โ every command matches) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ yes
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PreToolUse widget appears โ
โ ํ์ฉ / ์ง์ ํ์ธ / ์ฐจ๋จ โ (Allow / Ask / Block)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
permissionDecision: allow / ask / deny โโถ Claude
- Gate 1 (mode):
auto/bypassPermissions/dontAskproceed without asking, so the widget stays out of the way. It still appears indefault/plan/acceptEdits. - Gate 2 (allowlist): mirrors
permissions.allowfrom~/.claudeand the project's.claudesettings, so commands you already trust don't pop the widget. Approving "don't ask again" adds the rule automatically. - Gate 3 (DangerPattern): shipped as
'.'(matches everything) for a terminal-mirror feel; set a real regex inconfig.psd1to limit the widget to risky commands only.
Because the hook can't see Claude Code's resolved permission decision (only
tool_name/tool_input/permission_mode), this is a best-effort mirror โ session-only "allow once" approvals and the built-in safe-command classifier aren't visible to it.
| Key | Description |
|---|---|
Sound |
Play a sound when the widget appears |
NotificationAutoCloseSeconds |
Toast auto-dismiss time (seconds) |
PreviewMaxChars |
Max chars for the Stop preview (0 = unlimited) |
Mode |
'auto' (follow Windows light/dark) ยท 'light' ยท 'dark' |
Accent / AccentDark |
Light/dark accent (primary button & focus). Defaults pass WCAG AA (โฅ4.5:1) |
Animate |
Slide-in entrance. If omitted, follows the Windows "Show animations" setting ($true/$false to force) |
DangerPattern |
(PreToolUse only) Regex for which commands trigger the confirm widget; '.' matches every Bash command. Has no effect unless the optional PreToolUse hook is enabled |
config.psd1 is read every time a widget appears, so changes apply without restarting Claude Code.
Installed as a plugin? The bundled
config.psd1lives in the plugin cache and is overwritten on update. On first run pawse copies it to the plugin's data folder (${CLAUDE_PLUGIN_DATA}\config.psd1); edit that copy โ your settings then survive plugin updates. (Manual installs just editplugin/config.psd1directly.)
The plugin/assets/ folder contains Leo's three expressions (stop.png, notification.png, pretooluse.png). Replace them with your own transparent PNGs (square recommended) to change the character. Delete them to fall back to the built-in vector character. When installed as a plugin, drop your PNGs in ${CLAUDE_PLUGIN_DATA}\assets\ instead so they survive updates.
# Stop widget (type, continue โ check JSON output)
'{"hook_event_name":"Stop","stop_hook_active":false,"transcript_path":""}' |
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\plugin\claude-widget.ps1 -Event Stop
# Notification toast
'{"notification_type":"idle_prompt","message":"Waiting for input"}' |
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\plugin\claude-widget.ps1 -Event Notification
# PreToolUse widget (optional event โ risky command)
'{"tool_name":"Bash","tool_input":{"command":"rm -rf build"}}' |
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\plugin\claude-widget.ps1 -Event PreToolUseLogic only (no GUI): powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\plugin\test-widget.ps1
- Stop: when the hook writes
{"decision":"block","reason":"<text>"}to stdout, Claude resumes with that text as its next instruction. Ifstop_hook_activeis true (already in a widget-triggered resume), the widget is skipped to avoid an infinite loop. - Notification is informational only and can't answer permission prompts. (The optional PreToolUse widget can confirm commands โ see Optional: PreToolUse.)
- While the widget waits for input, Claude waits too. If it exceeds
timeout(seconds) the hook is killed and the widget closes, so 600 is recommended for Stop (and PreToolUse if enabled). - All of stdin, stdout, transcript reads, and the script file are handled as UTF-8 so non-ASCII (e.g. Korean) doesn't break.
| File | Role |
|---|---|
.claude-plugin/marketplace.json |
Self-hosted marketplace leo (lists the pawse plugin) |
plugin/.claude-plugin/plugin.json |
Plugin manifest |
plugin/hooks/hooks.json |
Stop + Notification hooks (wired via ${CLAUDE_PLUGIN_ROOT}) |
plugin/claude-widget.ps1 |
Single entry point; dispatches on -Event Stop|Notification|PreToolUse |
plugin/config.psd1 |
User settings (bundled default โ see the data-folder note in Configuration) |
plugin/assets/ |
Leo expression PNGs (customizable) |
plugin/test-widget.ps1 |
Dependency-free logic tests |
settings-hooks.snippet.json |
Manual-install hooks snippet (fallback) |
MIT โ see LICENSE.
Claude Code๊ฐ ๋ฉ์ถ ๋(pause) ์ฌ์ Leo๊ฐ ๊ณ ๊ฐ๋ฅผ ์ ๋ด๋ฏธ๋, Claude Code์ฉ ์๋ฐฉํฅ hook ์์ ฏ.
Claude Code๊ฐ ์์ ์ ๋ง์น๊ฑฐ๋(Stop) ์ ๋ ฅ์ ๊ธฐ๋ค๋ฆด ๋(Notification) ๋ฐ์คํฌํฑ์ ์์ ์์ ฏ์ ๋์ฐ๊ณ , ๊ทธ ์์ ฏ์์ ๋ฐ๋ก ๋ค์ ์ง์๋ฅผ ์ ๋ ฅํ๋ฉด Claude๊ฐ ์ด์ด์ ์์ ํฉ๋๋ค. PowerShell + WPF๋ก ๋ง๋ค์ด ๋ณ๋ ์ค์น๊ฐ ํ์ ์์ต๋๋ค(Windows ์ ์ฉ).
์ํํ ๋ช ๋ น ์คํ ์ ํ์ธ์ด ํ์ํ๋ฉด ์ ํ ๊ธฐ๋ฅ์ผ๋ก ์ผค ์ ์์ต๋๋ค โ ์๋ ์ ํ: PreToolUse ์ฐธ๊ณ .
| ์ด๋ฒคํธ | ํธ๋ฆฌ๊ฑฐ | ์์ ฏ | Leo |
|---|---|---|---|
| Stop | Claude๊ฐ ์๋ต์ ๋ง์นจ | ๋ง์ง๋ง ๋ฉ์์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ + ์
๋ ฅ์ฐฝ. ์
๋ ฅํ๋ฉด Claude๊ฐ ์ด์ด์ ์์
({"decision":"block"}). ๋น์๋๋ฉด ๊ทธ๋ฅ ์ข
๋ฃ. |
๐ ์์ |
| Notification | ๊ถํ/์ ๋ ฅ ๋๊ธฐ(idle) | ํ ์คํธ ์๋ฆผ(์๋ ๋ซํ). ์ ๋ณด ์ ์ฉ. | ๐ฎ ๋๋ ! |
์ธ ๋ฒ์งธ ์ด๋ฒคํธ PreToolUse(์ํ ๋ช ๋ น ํ์ธ)๋ ์ ํ ๊ธฐ๋ฅ์ด๋ฉฐ ๊ธฐ๋ณธ ๋นํ์ฑ โ ์๋ ์ ํ: PreToolUse ์ฐธ๊ณ .
๋์์ธ: Windows 11 Fluent ์ ํฉ(8px ์นด๋ / 4px ์ปจํธ๋กค, ๋ถ๋๋ฌ์ด ๊ทธ๋ฆผ์ + 1px ํ ๋๋ฆฌ, Segoe UI Variable ํ์ ๋จํ 20/14/12, WCAG AA ํต๊ณผ ์), ์์คํ ๋ผ์ดํธ/๋คํฌ ์๋ ์ ํ, ๋ฑ์ฅ ์ฌ๋ผ์ด๋์ธ(์์คํ "์ ๋๋ฉ์ด์ ํ์" ์ค์ ์กด์ค).
Claude Code์ hooks์ ์์ ฏ ์คํฌ๋ฆฝํธ๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค. ํต์ฌ์ ์๋ฐฉํฅ์ด๋ผ๋ ์ โ Stop hook์ด {"decision":"block","reason":"<์
๋ ฅ>"}์ ๋ฐํํ๋ฉด ๊ทธ ์
๋ ฅ์ด Claude์ ๋ค์ ์ง์๊ฐ ๋์ด ์์
์ด ์ด์ด์ง๋๋ค.
Windows ์ ์ฉ. pawse๋
powershell.exe+ WPF๋ฅผ ์ฐ๋ฏ๋ก Windows์์ ๋์ํฉ๋๋ค. mac/Linux์ ์ค์นํด๋ ๋ฌดํดํ์ง๋ง ์์ ฏ์ ๋จ์ง ์์ต๋๋ค.
pawse๋ Claude Code ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋ฐฐํฌ๋์ด ๊ฒฝ๋ก๋ฅผ ์๋ณผ ํ์๊ฐ ์์ต๋๋ค. Claude Code์์:
/plugin marketplace add sinwoo0225/Pawse
/plugin install pawse@leo
์ด์ด์ /reload-plugins(๋๋ Claude Code ์ฌ์์). Stop + Notification hook์ด ${CLAUDE_PLUGIN_ROOT}๋ก ์๋ ์ฐ๊ฒฐ๋ฉ๋๋ค.
์ง์ ์ฐ๊ฒฐํ๋ ค๋ฉด ์ ์ฅ์๋ฅผ ํด๋ก ํ ๋ค ~/.claude/settings.json์ hooks์ ์ ์์ด ์น์
์ JSON์ ์ถ๊ฐํ์ธ์. <install-path>๋ฅผ ์ ์ฅ์ ์ ๋๊ฒฝ๋ก๋ก ๋ฐ๊พธ๊ณ , ์คํฌ๋ฆฝํธ๊ฐ plugin\ ํ์์ ์์์ ์ฃผ์(...\plugin\claude-widget.ps1). ๊ทธ ํ Claude Code๋ฅผ ์ฌ์์ํ์ธ์.
WPF๋ STA ์ค๋ ๋๊ฐ ํ์ํ๋ฏ๋ก
pwsh๊ฐ ์๋๋ผpowershell.exe(Windows PowerShell 5.1)๋ก ํธ์ถํฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ ์ด์ ์ ์๋ ์ค์น์์ ์ฌ๋ผ์ค๋์? ์คํฌ๋ฆฝํธ๊ฐ ์ ์ฅ์ ๋ฃจํธ์์
plugin/์ผ๋ก ์ด๋ํ์ต๋๋ค. ์ ํ๋ฌ๊ทธ์ธ ์ค์น๋ก ์ ํํ๊ฑฐ๋settings.jsonhook ๊ฒฝ๋ก์\plugin์ ์ถ๊ฐํ์ธ์.
๊ธฐ๋ณธ ์ค์น์๋ ํฌํจ๋์ง ์์ต๋๋ค โ pawse๋ ๋ช
๋ น ์คํ ์ง์ ์ ํ์ธ ์์ ฏ์ ๋์ธ ์๋ ์์ต๋๋ค. ์ผ๋ ค๋ฉด ๋ค๋ฅธ hook ์์ PreToolUse hook์ ์ถ๊ฐํ์ธ์:
"PreToolUse": [{ "matcher": "Bash", "hooks": [{ "type": "command", "timeout": 600,
"command": "powershell.exe -NoProfile -ExecutionPolicy Bypass -File \"<install-path>\\plugin\\claude-widget.ps1\" -Event PreToolUse" }] }]๊ทธ๋ฆฌ๊ณ config.psd1์ DangerPattern ์ ๊ท์์ผ๋ก ์ด๋ค ๋ช
๋ น์ ๋์ธ์ง ์ ํ ๋ค(์ถ๊ณ ๊ธฐ๋ณธ๊ฐ '.'์ ๋ชจ๋ ๋ช
๋ น์ ๋งค์น) Claude Code๋ฅผ ์ฌ์์ํ์ธ์.
๋๊ตฌ ์คํ ์ง์ , hook์ด ์ธ ๊ด๋ฌธ์ ๋ชจ๋ ํต๊ณผํ ๋๋ง ํ์ธ ์์ ฏ์ ๋์๋๋ค. ํ๋๋ผ๋ ๊ฑธ๋ฆฌ๋ฉด ์กฐ์ฉํ ์ข
๋ฃ(exit 0)ํ๊ณ Claude์ ํ์ ๊ถํ ํ๋ฆ์ผ๋ก ๋์ด๊ฐ๋๋ค:
๋๊ตฌ ์คํ ์ง์
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ์
โ 1. permission_mode ๊ฐ auto/bypassPermissions/dontAsk ? โ โโโโโโโถ exit 0 (์์ ฏ ์์)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ์๋์ค
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ์
โ 2. permissions.allow ๊ท์น์ ํด๋นํ๋ ๋ช
๋ น์ธ๊ฐ? โ โโโโโโโถ exit 0 (์์ ฏ ์์)
โ (Bash(...) ํ์ โ hook matcher ๊ฐ "Bash") โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ์๋์ค
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ์๋์ค
โ 3. DangerPattern ์ ๋งค์น๋๋๊ฐ? โ โโโโโโโถ exit 0 (ํ์ ๊ถํ ํ๋ฆ)
โ (๊ธฐ๋ณธ ์ค์ '.' โ ๋ชจ๋ ๋ช
๋ น์ด ๋งค์น) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ์
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PreToolUse ์์ ฏ ํ์ โ
โ ํ์ฉ / ์ง์ ํ์ธ / ์ฐจ๋จ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
permissionDecision: allow / ask / deny โโถ Claude
- ๊ด๋ฌธ 1 (๋ชจ๋):
auto/bypassPermissions/dontAsk๋ ๋ฌป์ง ์๊ณ ์งํํ๋ ๋ชจ๋๋ผ ์์ ฏ์ด ๋ผ์ด๋ค์ง ์์ต๋๋ค.default/plan/acceptEdits์์ ๋น๋๋ค. - ๊ด๋ฌธ 2 (allowlist):
~/.claude์ ํ๋ก์ ํธ.claude์ค์ ์permissions.allow๋ฅผ ๋ฏธ๋ฌ๋งํด, ์ด๋ฏธ ์ ๋ขฐํ๋ ๋ช ๋ น์ ์์ ฏ์ด ์ ๋น๋๋ค. "ํ์ฉํ๊ณ ๋ค์ ๋ฌป์ง ์๊ธฐ"๋ฅผ ๊ณ ๋ฅด๋ฉด ๊ท์น์ด ์๋ ์ถ๊ฐ๋ฉ๋๋ค. - ๊ด๋ฌธ 3 (DangerPattern): ํฐ๋ฏธ๋ ๋ฏธ๋ฌ ๋๋์ ์ํด ๊ธฐ๋ณธ๊ฐ
'.'(๋ชจ๋ ๋งค์น)๋ก ์ถ๊ณ ๋ฉ๋๋ค.config.psd1์์ ์ ๊ท์์ ์ง์ ํ๋ฉด ์ํ ๋ช ๋ น์๋ง ์์ ฏ์ ๋์ธ ์ ์์ต๋๋ค.
hook์ Claude Code์ ์ต์ข ๊ถํ ๊ฒฐ์ ์ ๋ชป ๋ณด๊ณ (
tool_name/tool_input/permission_mode๋ง ๋ฐ์), ๊ทธ๋์ ์ด๋ ์ต์ ์ ๊ทผ์ฌ์ ๋๋ค โ "์ด๋ฒ๋ง ํ์ฉ" ๊ฐ์ ์ธ์ ๋จ์ ์น์ธ๊ณผ ๋ด์ฅ ์์ -๋ช ๋ น ๋ถ๋ฅ๊ธฐ๋ hook์ ๋ณด์ด์ง ์์ต๋๋ค.
| ํค | ์ค๋ช |
|---|---|
Sound |
์์ ฏ ๋ฑ์ฅ ์ ์๋ฆผ์ |
NotificationAutoCloseSeconds |
ํ ์คํธ ์๋ ๋ซํ ์๊ฐ(์ด) |
PreviewMaxChars |
Stop ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ต๋ ๊ธ์ ์(0์ด๋ฉด ๋ฌด์ ํ) |
Mode |
'auto'(Windows ๋ผ์ดํธ/๋คํฌ ๋ฐ๋ฆ) ยท 'light' ยท 'dark' |
Accent / AccentDark |
๋ผ์ดํธ/๋คํฌ ๊ฐ์กฐ์(Primary ๋ฒํผยทํฌ์ปค์ค). ๊ธฐ๋ณธ๊ฐ์ WCAG AA(โฅ4.5:1) ํต๊ณผ |
Animate |
๋ฑ์ฅ ์ฌ๋ผ์ด๋์ธ. ์๋ต ์ Windows "์ ๋๋ฉ์ด์
ํ์" ์ค์ ์ ๋ฐ๋ฆ($true/$false๋ก ๊ฐ์ ) |
DangerPattern |
(PreToolUse ์ ์ฉ) ํ์ธ ์์ ฏ์ ๋์ธ ๋ช
๋ น ์ ๊ท์. ๋ชจ๋ Bash์ ๋์ฐ๋ ค๋ฉด '.'. ์ ํ ๊ธฐ๋ฅ์ธ PreToolUse hook์ ์ผ์ง ์์ผ๋ฉด ํจ๊ณผ ์์ |
config.psd1์ ์์ ฏ์ด ๋ฐ ๋๋ง๋ค ์ฝ์ผ๋ฏ๋ก Claude Code ์ฌ์์ ์์ด ๋ฐ์๋ฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ค์นํ ๊ฒฝ์ฐ? ๋ฒ๋ค
config.psd1์ ํ๋ฌ๊ทธ์ธ ์บ์์ ์์ด ์ ๋ฐ์ดํธ ์ ๋ฎ์ด์ฐ์ ๋๋ค. pawse๋ ์ฒซ ์คํ ๋ ์ด๋ฅผ ํ๋ฌ๊ทธ์ธ ๋ฐ์ดํฐ ํด๋(${CLAUDE_PLUGIN_DATA}\config.psd1)๋ก ๋ณต์ฌํ๋ฏ๋ก, ๊ทธ ์ฌ๋ณธ์ ํธ์งํ๋ฉด ์ค์ ์ด ํ๋ฌ๊ทธ์ธ ์ ๋ฐ์ดํธ์๋ ๋ณด์กด๋ฉ๋๋ค. (์๋ ์ค์น๋plugin/config.psd1์ ์ง์ ํธ์งํ๋ฉด ๋ฉ๋๋ค.)
plugin/assets/ ํด๋์ ์ฌ์ Leo์ ํ์ 3์ข
(stop.png, notification.png, pretooluse.png)์ด ๋ค์ด ์์ต๋๋ค. ์ํ๋ ํฌ๋ช
PNG(์ ์ฌ๊ฐํ ๊ถ์ฅ)๋ก ๊ต์ฒดํ๋ฉด ์บ๋ฆญํฐ๊ฐ ๋ฐ๋๋๋ค. ํ์ผ์ ์ง์ฐ๋ฉด ์คํฌ๋ฆฝํธ์ ๋ด์ฅ๋ ๋ฒกํฐ ์บ๋ฆญํฐ๊ฐ ๋์ ํ์๋ฉ๋๋ค. ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ค์นํ๋ค๋ฉด ์
๋ฐ์ดํธ์๋ ๋ณด์กด๋๋๋ก ${CLAUDE_PLUGIN_DATA}\assets\์ PNG๋ฅผ ๋ฃ์ผ์ธ์.
- Stop: hook์ด
{"decision":"block","reason":"<์ ๋ ฅ>"}์ stdout์ผ๋ก ๋ฐํํ๋ฉด Claude๊ฐ ๊ทธ ์ง์๋ก ์์ ์ ์ฌ๊ฐํฉ๋๋ค.stop_hook_active๊ฐ true๋ฉด(์ด๋ฏธ ์์ ฏ์ด ์ ๋ฐํ ์ฌ๊ฐ ์ค) ์์ ฏ์ ๋์ฐ์ง ์์ ๋ฌดํ ๋ฃจํ๋ฅผ ๋ง์ต๋๋ค. - Notification์ ์ ๋ณด ์ ์ฉ์ด๋ผ ๊ถํ์ ์ง์ ์๋ตํ ์ ์์ต๋๋ค. (์ ํ ๊ธฐ๋ฅ์ธ PreToolUse ์์ ฏ์ผ๋ก ๋ช ๋ น์ ํ์ธํ ์ ์์ต๋๋ค โ ์ ์ ํ: PreToolUse ์ฐธ๊ณ .)
- ์์ ฏ์ด ์
๋ ฅ ๋๊ธฐ๋ก ๋ ์๋ ๋์ Claude๋ ๊ธฐ๋ค๋ฆฝ๋๋ค.
timeout(์ด)์ ๋๊ธฐ๋ฉด hook์ด ์ข ๋ฃ๋๊ณ ์์ ฏ์ด ๋ซํ๋ฏ๋ก Stop์(์ผฐ๋ค๋ฉด PreToolUse๋) 600 ๊ถ์ฅ. - ํ๊ธ ๋ฑ ๋นASCII๊ฐ ๊นจ์ง์ง ์๋๋ก stdinยทstdoutยทํธ๋์คํฌ๋ฆฝํธ ์ฝ๊ธฐยท์คํฌ๋ฆฝํธ ํ์ผ์ ๋ชจ๋ UTF-8๋ก ์ฒ๋ฆฌํฉ๋๋ค.
made for Claude Code ยท PowerShell + WPF ยท Windows

