[awesome-claude-code] ํ ์์ฑ ์ปค๋งจ๋
์ด ์ปค๋งจ๋๋ ํ๋ก์ ํธ ํ๊ฒฝ์ ๋ถ์ํ์ฌ Claude Code ํ ์ ์๋์ผ๋ก ์ ์ํ๊ณ ์์ฑํ๋ ๋๊ตฌ์ ๋๋ค.
๐ ์ฐธ๊ณ : ์ด ๋ฌธ์๋ awesome Claude Code ๋ฌธ์์ ์๋ฌธ + ๋ ํผ๋ฐ์ค์ ๋๋ค.
- ์๋ฌธ ๋งํฌ๋ฅผ ๋ฐฉ๋ฌธํ์ ์ ๋ณต์ฌํด์ ์ฌ์ฉํ์ ๋ ๋ฉ๋๋ค
- ์ด ํ์ผ์
.claude/skills/ํ์์ ๋ณต์ฌํ์ฌ ์คํฌ๋ก ๋ฑ๋กํ ์๋ ์์ต๋๋ค(26.03.15 ๊ธฐ์ค)
ํ ์์ฑ ์ปค๋งจ๋
ํ๋ก์ ํธ๋ฅผ ๋ถ์ํ๊ณ , ์ค์ฉ์ ์ธ ํ ์ ์ ์ํ๋ฉฐ, ์ ์ ํ ํ ์คํธ์ ํจ๊ป ์์ฑํฉ๋๋ค.
์์ ๋ด์ฉ (/create-hook)
- ํ๊ฒฝ ๋ถ์ - ๋๊ตฌ ๋ฐ ๊ธฐ์กด ํ ๊ฐ์ง
- ํ ์ ์ - ํ๋ก์ ํธ ์ค์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ ์
- ํ ๊ตฌ์ฑ - ๋ง์ถค ์ง๋ฌธ์ ํ๊ณ ์คํฌ๋ฆฝํธ ์์ฑ
- ํ ์คํธ ๋ฐ ๊ฒ์ฆ - ํ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธ
์ํฌํ๋ก์ฐ
1. ํ๊ฒฝ ๋ถ์ ๋ฐ ์ ์
ํ๋ก์ ํธ ๋๊ตฌ๋ฅผ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ๊ด๋ จ ํ ์ ์ ์ํฉ๋๋ค:
TypeScript๊ฐ ๊ฐ์ง๋ ๊ฒฝ์ฐ (tsconfig.json):
- PostToolUse ํ : "ํธ์ง ํ ํ์ผ ํ์ ์ฒดํฌ"
- PreToolUse ํ : "ํ์ ์๋ฌ๊ฐ ์๋ ํธ์ง ์ฐจ๋จ"
Prettier๊ฐ ๊ฐ์ง๋ ๊ฒฝ์ฐ (.prettierrc, prettier.config.js):
- PostToolUse ํ : "ํธ์ง ํ ์๋ ํฌ๋งทํ "
- PreToolUse ํ : "ํฌ๋งทํ ๋ ์ฝ๋ ํ์ํ"
ESLint๊ฐ ๊ฐ์ง๋ ๊ฒฝ์ฐ (.eslintrc.*):
- PostToolUse ํ : "ํธ์ง ํ ๋ฆฐํธ ๋ฐ ์๋ ์์ "
- PreToolUse ํ : "๋ฆฐํ ์๋ฌ๊ฐ ์๋ ์ปค๋ฐ ์ฐจ๋จ"
package.json์ ์คํฌ๋ฆฝํธ๊ฐ ์๋ ๊ฒฝ์ฐ:
test์คํฌ๋ฆฝํธ โ "์ปค๋ฐ ์ ํ ์คํธ ์คํ"build์คํฌ๋ฆฝํธ โ "์ปค๋ฐ ์ ๋น๋ ๊ฒ์ฆ"
git ์ ์ฅ์๊ฐ ๊ฐ์ง๋ ๊ฒฝ์ฐ:
- PreToolUse/Bash ํ : "๋น๋ฐ ์ ๋ณด๊ฐ ํฌํจ๋ ์ปค๋ฐ ๋ฐฉ์ง"
- PostToolUse ํ : "ํ์ผ ๋ณ๊ฒฝ ์ ๋ณด์ ์ค์บ"
๊ฒฐ์ ํธ๋ฆฌ:
ํ๋ก์ ํธ์ TypeScript๊ฐ ์๋๊ฐ? โ ํ์
์ฒดํฌ ํ
์ ์
ํ๋ก์ ํธ์ ํฌ๋งทํฐ๊ฐ ์๋๊ฐ? โ ํฌ๋งทํ
ํ
์ ์
ํ๋ก์ ํธ์ ํ
์คํธ๊ฐ ์๋๊ฐ? โ ํ
์คํธ ๊ฒ์ฆ ํ
์ ์
๋ณด์์ ๋ฏผ๊ฐํ๊ฐ? โ ๋ณด์ ํ
์ ์
+ ์ถ๊ฐ ํจํด์ ์ค์บํ๊ณ ๋ค์์ ๊ธฐ๋ฐ์ผ๋ก ์ปค์คํ
ํ
์ ์:
- package.json์ ์ปค์คํ
์คํฌ๋ฆฝํธ
- ๊ณ ์ ํ ํ์ผ ํจํด ๋๋ ํ์ฅ์
- ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ ์งํ
- ํ๋ก์ ํธ๋ณ ๋๊ตฌ ์ค์
2. ํ ๊ตฌ์ฑ
๋จผ์ ๋ค์์ ์ง๋ฌธํฉ๋๋ค: "์ด ํ ์ด ๋ฌด์์ ํด์ผ ํ๋์?" ๊ทธ๋ฆฌ๊ณ ๋ถ์์์ ๋์ถ๋ ๊ด๋ จ ์ ์์ ์ ์ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ์์ ์ค๋ช ์์ ๋งฅ๋ฝ์ ํ์ ํ๊ณ ํ์ ์ด ์๋ ์ธ๋ถ ์ฌํญ์ ๋ํด์๋ง ์ง๋ฌธํฉ๋๋ค:
-
ํธ๋ฆฌ๊ฑฐ ํ์ด๋ฐ: ์ธ์ ์คํ๋์ด์ผ ํ๋์?
PreToolUse: ํ์ผ ์์ ์ (์ฐจ๋จ ๊ฐ๋ฅ)PostToolUse: ํ์ผ ์์ ํ (ํผ๋๋ฐฑ/์์ )UserPromptSubmit: ์์ฒญ ์ฒ๋ฆฌ ์ - ํ์์ ๋ฐ๋ฅธ ๊ธฐํ ์ด๋ฒคํธ ์ ํ
-
๋๊ตฌ ๋งค์ฒ: ์ด๋ค ๋๊ตฌ๊ฐ ํธ๋ฆฌ๊ฑฐํด์ผ ํ๋์? (
Write,Edit,Bash,*๋ฑ) -
๋ฒ์:
global,project, ๋๋project-local -
์๋ต ๋ฐฉ์:
- ์ข ๋ฃ ์ฝ๋๋ง: ๊ฐ๋จ (exit 0 = ์ฑ๊ณต, exit 2 = PreToolUse์์ ์ฐจ๋จ)
- JSON ์๋ต: ๊ณ ๊ธ ์ ์ด (์ฐจ๋จ, ์ปจํ ์คํธ, ๊ฒฐ์ )
- ๋ณต์ก๋์ ๋ฐ๋ผ ์๋ด: ๋จ์ ํต๊ณผ/์คํจ โ ์ข ๋ฃ ์ฝ๋, ํ๋ถํ ํผ๋๋ฐฑ โ JSON
-
์ฐจ๋จ ๋์ (๊ด๋ จ๋ ๊ฒฝ์ฐ): "๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ์์ ์ ์ค๋จํด์ผ ํ๋์?"
- PreToolUse: ์์ ์ฐจ๋จ ๊ฐ๋ฅ (๋ณด์, ๊ฒ์ฆ)
- PostToolUse: ๋ณดํต ํผ๋๋ฐฑ๋ง ์ ๊ณต
-
Claude ํตํฉ (์ค์): "Claude Code๊ฐ ์ด ํ ์ด ๊ฐ์งํ ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ํ์ธํ๊ณ ์์ ํด์ผ ํ๋์?"
- ์์ธ ๊ฒฝ์ฐ: ์๋ฌ ์ ๋ฌ์ ์ํด
additionalContext์ฌ์ฉ - ์๋์ค์ธ ๊ฒฝ์ฐ: ๋ฌด์ ์๋์ ์ํด
suppressOutput: true์ฌ์ฉ
- ์์ธ ๊ฒฝ์ฐ: ์๋ฌ ์ ๋ฌ์ ์ํด
-
์ปจํ ์คํธ ์ค์ผ: "์ฑ๊ณต์ ์ธ ์์ ์ด ๋ ธ์ด์ฆ๋ฅผ ํผํ๊ธฐ ์ํด ๋ฌด์์ด์ด์ผ ํ๋์?"
- ํฌ๋งทํ , ์ผ์์ ์ธ ๊ฒ์ฌ์๋ ์๋ฅผ ๊ถ์ฅ
- ๋ณด์ ์๋ฆผ, ์ค์ ์๋ฌ์๋ ์๋์ค๋ฅผ ๊ถ์ฅ
-
ํ์ผ ํํฐ๋ง: "์ด ํ ์ด ์ด๋ค ํ์ผ ์ ํ์ ์ฒ๋ฆฌํด์ผ ํ๋์?"
3. ํ ์์ฑ
๋ค์์ ์ํํด์ผ ํฉ๋๋ค:
- ํ
๋๋ ํ ๋ฆฌ ์์ฑ: ๋ฒ์์ ๋ฐ๋ผ
~/.claude/hooks/๋๋.claude/hooks/ - ์คํฌ๋ฆฝํธ ์์ฑ: ๋ค์์ ํฌํจํ๋ ํ
์คํฌ๋ฆฝํธ ์์ฑ:
- ์ ์ ํ shebang๊ณผ ์คํ ๊ถํ
- ํ๋ก์ ํธ๋ณ ๋ช ๋ น์ด (๊ฐ์ง๋ ์ค์ ๊ฒฝ๋ก ์ฌ์ฉ)
- ํ ์ ๋ชฉ์ ์ ์ค๋ช ํ๋ ์ฃผ์
- ์ค์ ์ ๋ฐ์ดํธ: ์ ์ ํ settings.json์ ํ ์ค์ ์ถ๊ฐ
- ์ ๋ ๊ฒฝ๋ก ์ฌ์ฉ: ์คํฌ๋ฆฝํธ์ ์คํ ํ์ผ์ ์๋ ๊ฒฝ๋ก ์ฌ์ฉ ๊ธ์ง. ํ๋ก์ ํธ ๋ฃจํธ๋ฅผ ์ฐธ์กฐํ๋ ค๋ฉด
$CLAUDE_PROJECT_DIR์ฌ์ฉ - ๊ฒ์ฆ ์ ์: ์ฌ์ฉ์์๊ฒ ํ ํ ์คํธ๋ฅผ ์ํ๋์ง ์ง๋ฌธ
์ฃผ์ ๊ตฌํ ํ์ค:
- stdin์์ JSON ์ฝ๊ธฐ (argv ์ฌ์ฉ ๊ธ์ง)
- Claude ํต์ ์ ์ํด ์ต์์
additionalContext/systemMessage์ฌ์ฉ - ์ฑ๊ณต์ ์ธ ์์
์
suppressOutput: trueํฌํจ - ๊ตฌ์ฒด์ ์ธ ์๋ฌ ์์ ์คํ ๊ฐ๋ฅํ ํผ๋๋ฐฑ ์ ๊ณต
- ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค๊ฐ ์๋ ๋ณ๊ฒฝ๋ ํ์ผ์ ์ง์ค
- ์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ ์ง์
์ฃผ์: ์ ์ถ๋ ฅ ํ์
๋๋ถ๋ถ์ ํ ๊ตฌํ์ด ์คํจํ๋ ๋ถ๋ถ์ ๋๋ค. ๋ค์์ ํนํ ์ฃผ์ํ์ธ์:
- ์ ๋ ฅ: stdin์์ JSON์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฝ๊ธฐ (argv๊ฐ ์๋)
- ์ถ๋ ฅ: Claude ํต์ ์ ์ํ ์ฌ๋ฐ๋ฅธ ์ต์์ JSON ๊ตฌ์กฐ ์ฌ์ฉ
- ๋ฌธ์: ์ ํํ ์คํค๋ง๊ฐ ์์ฌ๋ ๋ ๊ณต์ ๋ฌธ์ ์ฐธ์กฐ
4. ํ ์คํธ ๋ฐ ๊ฒ์ฆ
์ค์: ์ฑ๊ณต ๊ฒฝ๋ก์ ์คํจ ๊ฒฝ๋ก ๋ชจ๋ ํ ์คํธํ์ธ์:
์ฑ๊ณต ๊ฒฝ๋ก ํ ์คํธ:
- ์์ ์ฑ๊ณต ์๋๋ฆฌ์ค ํ
์คํธ - ํ
์ด ํต๊ณผํด์ผ ํ๋ ์กฐ๊ฑด ์์ฑ
- ์์: TypeScript (์ ํจํ ์ฝ๋), ๋ฆฐํ (ํฌ๋งท๋ ์ฝ๋), ๋ณด์ (์์ ํ ๋ช ๋ น)
์คํจ ๊ฒฝ๋ก ํ ์คํธ: 2. ์์ ์คํจ ์๋๋ฆฌ์ค ํ ์คํธ - ํ ์ด ์คํจ/๊ฒฝ๊ณ ํด์ผ ํ๋ ์กฐ๊ฑด ์์ฑ
- ์์: TypeScript (ํ์ ์๋ฌ), ๋ฆฐํ (ํฌ๋งท๋์ง ์์ ์ฝ๋), ๋ณด์ (์ํํ ์์ )
๊ฒ์ฆ ๋จ๊ณ: 3. ์์ ๋์ ํ์ธ: ์๋ํ ๋๋ก ์ฐจ๋จ/๊ฒฝ๊ณ /์ปจํ ์คํธ๋ฅผ ์ ๊ณตํ๋์ง ํ์ธ
ํ ์คํธ ํ๋ก์ธ์ค ์์:
- ํ์ผ ์ญ์ ๋ฅผ ๋ฐฉ์งํ๋ ํ ์ ๊ฒฝ์ฐ: ํ ์คํธ ํ์ผ์ ์์ฑํ๊ณ , ๋ณดํธ๋ ์์ ์ ์๋ํ๋ฉฐ, ํ ์ด ์ด๋ฅผ ๋ฐฉ์งํ๋์ง ํ์ธ
๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๋ค์์ ์ํํด์ผ ํฉ๋๋ค:
- ์ค์ ์์ ํ ๋ฑ๋ก ํ์ธ
- ์คํฌ๋ฆฝํธ ๊ถํ ํ์ธ (
chmod +x) - ๋จ์ํ๋ ๋ฒ์ ์ผ๋ก ๋จผ์ ํ ์คํธ
- ์์ธํ ํ ์คํ ๋ถ์์ผ๋ก ๋๋ฒ๊ทธ
ํ ํ ํ๋ฆฟ
ํ์ ์ฒดํฌ (PostToolUse)
#!/usr/bin/env node
// stdin JSON ์ฝ๊ธฐ, .ts/.tsx ํ์ผ๋ง ํ์ธ
// ์คํ: npx tsc --noEmit --pretty
// ์ถ๋ ฅ: ์๋ฌ์ ๋ํ additionalContext๊ฐ ํฌํจ๋ JSON
์๋ ํฌ๋งทํ (PostToolUse)
#!/usr/bin/env node
// stdin JSON ์ฝ๊ธฐ, ์ง์๋๋ ํ์ผ ์ ํ ํ์ธ
// ์คํ: npx prettier --write [file]
// ์ถ๋ ฅ: suppressOutput: true๊ฐ ํฌํจ๋ JSON
๋ณด์ ์ค์บ (PreToolUse)
#!/bin/bash
# stdin JSON ์ฝ๊ธฐ, ๋น๋ฐ ์ ๋ณด/ํค ํ์ธ
# ์ํํ ํจํด์ด ๋ฐ๊ฒฌ๋๋ฉด ์ฐจ๋จ
# ์ฐจ๋จํ๋ ค๋ฉด Exit 2, ๊ณ์ํ๋ ค๋ฉด 0
์ ์ฒด ํ ํ๋ฆฟ ์ ๊ณต ์์น: https://docs.claude.com/en/docs/claude-code/hooks#examples
๋น ๋ฅธ ์ฐธ์กฐ
๊ณต์ ๋ฌธ์: https://docs.claude.com/en/docs/claude-code/hooks.md
์ผ๋ฐ์ ์ธ ํจํด:
- stdin ์
๋ ฅ:
JSON.parse(process.stdin.read()) - ํ์ผ ํํฐ๋ง: ์ฒ๋ฆฌ ์ ํ์ฅ์ ํ์ธ
- ์ฑ๊ณต ์๋ต:
{continue: true, suppressOutput: true} - ์๋ฌ ์๋ต:
{continue: true, additionalContext: "error details"} - ์์
์ฐจ๋จ: PreToolUse ํ
์์
exit(2)
์ฌ์ฉ ์ฌ๋ก๋ณ ํ ์ ํ:
- ์ฝ๋ ํ์ง: ํผ๋๋ฐฑ๊ณผ ์์ ์ ์ํ PostToolUse
- ๋ณด์: ์ํํ ์์ ์ ์ฐจ๋จํ๋ PreToolUse
- CI/CD: ์ปค๋ฐ ์ ๊ฒ์ฆ์ ์ํ PreToolUse
- ๊ฐ๋ฐ: ์๋ํ๋ ๊ฐ์ ์ ์ํ PostToolUse
ํ ์คํ ๋ชจ๋ฒ ์ฌ๋ก:
- ํ ์ ๋ณ๋ ฌ๋ก ์คํ๋ฉ๋๋ค (๊ณต์ ๋ฌธ์ ๊ธฐ์ค)
- ๋ ๋ฆฝ์ ์ผ๋ก ์ค๊ณํ์ธ์ (์คํ ์์๊ฐ ๋ณด์ฅ๋์ง ์์ผ๋ฏ๋ก)
- ์ฌ๋ฌ ํ ์ด ๊ฐ์ ํ์ผ์ ์ํฅ์ ๋ฏธ์น ๋ ํ ์ํธ์์ฉ์ ์ ์คํ๊ฒ ๊ณํํ์ธ์
์ฑ๊ณต ๊ธฐ์ค
ํ ์ด ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋ ๊ฒฝ์ฐ:
- ์คํฌ๋ฆฝํธ์ ์คํ ๊ถํ์ด ์์
- ์ฌ๋ฐ๋ฅธ settings.json์ ๋ฑ๋ก๋จ
- ํ ์คํธ ์๋๋ฆฌ์ค์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ตํจ
- ์๋ ์์ ์ ์ํด Claude์ ์ ์ ํ ํตํฉ๋จ
- ํ๋ก์ ํธ ๊ท์น๊ณผ ๊ฐ์ง๋ ๋๊ตฌ๋ฅผ ๋ฐ๋ฆ
๊ฒฐ๊ณผ: ์ฌ์ฉ์๋ ์ง๋ฅํ ์๋ํ์ ํ์ง ๊ฒ์ฌ๋ฅผ ํตํด ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ํฅ์์ํค๋ ์๋ํ๋ ํ ์ ์ป๊ฒ ๋ฉ๋๋ค.