Skills & Slash Commands: Dynamic Context Injection
Skills & 슬래시 커맨드 — 동적 컨텍스트 주입의 기술
SKILL.md는 CLAUDE.md의 강력한 확장이다 — 정적 규칙 대신 실시간으로 실행되는 컨텍스트를 주입하고, 팀의 반복 작업을 재사용 가능한 절차로 캡슐화한다.
Overview
CLAUDE.md가 '항상 적용되는 규칙'이라면, Skills는 '필요할 때 호출하는 절차'다. 팀의 배포 절차, 코드 리뷰 체크리스트, PR 생성 워크플로우 — 이런 반복적인 작업을 SKILL.md로 정의하면 /deploy, /review, /pr 같은 슬래시 커맨드로 일관성 있게 실행할 수 있다.
Skills의 진짜 힘은 동적 컨텍스트 주입에 있다. ! 문법을 사용하면 스킬이 실행될 때 실제 쉘 명령을 실행하고 그 출력을 컨텍스트에 포함시킨다. 고정된 지시문이 아니라, 현재 상태에 반응하는 살아있는 문서가 된다.
- SKILL.md의 13가지 프론트매터 필드를 알고 주요 필드를 활용한다
- 슬래시 커맨드 이름이 어떻게 해석되는지 경로 규칙을 이해한다
- 동적 컨텍스트 주입(! 문법)으로 실시간 데이터를 스킬에 포함하는 방법을 안다
- 팀의 반복 작업을 스킬로 캡슐화하는 설계를 할 수 있다
- 번들 스킬의 종류와 커스터마이즈 방법을 안다
Sections
SKILL.md 구조 — 13가지 프론트매터 필드
SKILL.md 파일의 기본 구조:
---
name: my-skill # 표시 이름 (커맨드 이름이 아님)
description: 무엇을 하는지, 언제 사용하는지
when_to_use: 트리거 문구들
disable-model-invocation: true # 모델이 자동 트리거 못하게
user-invocable: false # /메뉴에서 숨김
allowed-tools: Read Grep # 이 스킬에서 허용할 도구
disallowed-tools: AskUserQuestion # 이 스킬에서 차단할 도구
model: claude-opus-4-7 # 이 스킬용 모델 오버라이드
effort: high # 노력 수준 오버라이드
context: fork # 포크된 서브에이전트에서 실행
paths: "src/**/*.ts" # 이 경로에서만 활성화
---
## 지시사항
!`git diff HEAD` ← 동적 컨텍스트: 실행 시 현재 diff 주입
가장 중요한 필드는 description이다. Claude는 이 설명을 기반으로 어떤 스킬이 관련있는지 판단한다. 좋은 description은 '무엇을'과 '언제'를 모두 담는다.
context: fork는 스킬을 메인 세션과 격리된 서브에이전트에서 실행한다. 긴 작업이나 독립적인 태스크에 유용하다.
슬래시 커맨드 이름 해석 규칙
스킬의 커맨드 이름은 name 필드가 아니라 파일 경로에서 결정된다. 이 규칙을 이해하지 못하면 커맨드를 찾지 못한다.
| 파일 위치 | 커맨드 이름 |
|---|---|
.claude/skills/deploy/SKILL.md |
/deploy |
.claude/skills/pr/SKILL.md |
/pr |
apps/web/.claude/skills/deploy/SKILL.md |
/apps/web:deploy |
my-plugin/skills/review/SKILL.md |
/my-plugin:review |
~/.claude/skills/debug/SKILL.md |
/debug (전역) |
중첩 스킬에서 충돌이 생기면 : 네임스페이스로 구분된다. 플러그인 스킬은 플러그인 이름이 네임스페이스가 된다.
자동 발견 규칙: 스킬은 현재 작업 디렉토리와 모든 조상 디렉토리의 .claude/skills/에서 자동 발견된다. 서브디렉토리 스킬도 CLAUDE.md와 마찬가지로 지연 로딩된다.
실시간 변경 감지: SKILL.md 파일의 변경은 재시작 없이 즉시 반영된다.
동적 컨텍스트 주입 — ! 문법의 힘
Skills의 가장 강력한 기능은 스킬이 실행될 때 쉘 명령을 실행하고 그 출력을 Claude의 컨텍스트에 주입하는 것이다.
---
name: code-review
description: 현재 브랜치의 변경 사항을 리뷰한다
---
아래 변경 사항을 리뷰해주세요:
!`git diff HEAD`
또한 현재 테스트 상태:
!`npm test --silent 2>&1 | tail -20`
/code-review를 실행하면, Claude는 git diff HEAD의 실제 현재 출력과 테스트 결과를 컨텍스트에 받은 상태로 리뷰를 시작한다. 오래된 스니펫이 아닌 실제 현재 상태다.
이것이 CLAUDE.md의 정적 지시와 Skills의 근본적인 차이다 — Skills는 실행 시점의 실제 데이터를 컨텍스트에 포함할 수 있다.
쉘 스크립트 블록도 지원된다:
!```bash
echo '## 현재 브랜치:'
git branch --show-current
echo '## 변경된 파일:'
git diff --name-only HEAD
번들 스킬과 팀 스킬 설계
Claude Code에는 기본 내장 스킬들이 있다 — /code-review, /debug, /batch, /loop, /verify, /run. 이것들은 프롬프트 기반(고정 로직이 아닌 Claude의 지시)이며, 커스터마이즈할 수 없지만 참고할 수 있다.
disableBundledSkills: true 설정으로 번들 스킬을 비활성화할 수 있다 (팀 스킬과 충돌하는 경우).
실용적인 팀 스킬 예시:
# .claude/skills/pr/SKILL.md
---
name: pr
description: PR을 생성하고 팀 체크리스트를 적용한다
---
다음 단계로 PR을 생성해주세요:
현재 변경 사항:
!`git log main..HEAD --oneline`
1. PR 제목: [type]: [짧은 설명] (type: feat/fix/refactor/docs)
2. 체크리스트 확인:
- [ ] 테스트 추가/업데이트 완료
- [ ] 타입 체크 통과
- [ ] 보안 취약점 검토
3. gh pr create 실행
팀이 이 스킬을 쓰면 모든 PR이 동일한 구조와 체크리스트를 가진다.
프로그래밍에서 매크로와 함수를 비교해보자. 매크로는 정적으로 텍스트를 치환한다 — 호출 시점의 상태와 관계없이 항상 같은 내용으로 전개된다. 함수는 호출 시점에 인자를 받고, 실행 시점의 상태를 반영한 결과를 반환한다.
CLAUDE.md는 매크로다. 항상 같은 내용이 주입된다. Skills는 함수다. ! 문법으로 실행 시점의 상태 — 현재 git diff, 테스트 결과, 환경 변수 — 를 받아서 컨텍스트에 포함한다.
이 차이가 중요한 이유는, '이 규칙은 항상 적용'인 것과 '이 작업은 현재 상태를 보고 수행'인 것을 명확하게 분리할 수 있기 때문이다. 배포 절차 스킬이 현재 배포 환경 상태를 확인하는 것은 Functions이 해야 할 일이다. 'default export 쓰지 마라'는 CLAUDE.md의 일이다.
실제 팀에서 사용할 수 있는 PR 생성 스킬의 완성된 예제다. 동적 컨텍스트 주입이 어떻게 작동하는지 주목하라.
---
name: pr-create
description: >-
현재 브랜치의 변경사항으로 PR을 생성한다.
git add/commit이 완료된 후 호출하라.
allowed-tools: Bash Read
---
# PR 생성 절차
## 현재 상태 확인
**브랜치:** !`git branch --show-current`
**Main 대비 커밋:**
!`git log main..HEAD --oneline`
**변경된 파일:**
!`git diff main --name-only`
## 작업 순서
1. 위 변경 사항을 분석해 PR 제목을 작성하라
- 형식: `[type]: [설명]` (feat/fix/refactor/chore/docs)
- 50자 이내
2. PR 본문을 작성하라:
- ## Summary (변경 이유, 3줄 이내)
- ## Changes (변경 내용 bullet)
- ## Test Plan (어떻게 검증했는지)
3. 다음 체크리스트를 확인하라:
- [ ] 타입체크: npm run typecheck
- [ ] 테스트: npm test
- [ ] 보안: .env 파일이 스테이징에 없는지
4. 체크리스트 통과 후: gh pr create 실행
**중요**: 체크리스트 실패 시 PR 생성 전에 반드시 수정할 것 스킬 파일의 ! 백틱 구문이 실행 시 실제 쉘 명령으로 교체된다. /pr-create를 호출하면 Claude는 현재 브랜치 이름, 실제 커밋 목록, 실제 변경 파일 목록을 받은 상태로 PR 작성을 시작한다. 매번 같은 지시를 하는 게 아니라, 현재 상태에 맞게 작동하는 것이다.
✅ 시니어가 보는 것
- 동적 컨텍스트 주입(!`)을 사용해 실제 상태를 반영하는 스킬
- 팀 표준 절차를 스킬로 문서화한 것
- allowed-tools, disallowed-tools로 스킬의 권한을 최소화한 것
⚠️ 레드 플래그
- 정적인 지시만 있고 ! 문법을 사용하지 않는 스킬
- CLAUDE.md에 있어야 할 내용을 스킬로 만든 경우 (항상 적용 vs 명시적 호출의 혼동)
- 너무 범용적이어서 재사용 가능성이 없는 스킬
🎤 예상 인터뷰 질문
- 팀에서 가장 가치 있는 스킬이 무엇이고 왜 스킬로 만들었나요?
- CLAUDE.md 규칙과 스킬을 어떻게 구분해서 설계하시나요?
- 동적 컨텍스트 주입을 활용한 스킬 사례를 보여주실 수 있나요?
Key Takeaways
스킬 = 호출 가능한 절차
CLAUDE.md가 항상 적용 규칙이라면, Skills는 명시적으로 호출하는 팀 표준 절차다.
커맨드 이름은 파일 경로
name 필드가 아니라 디렉토리 이름이 커맨드 이름이 된다. 이 규칙을 혼동하면 커맨드를 찾지 못한다.
! 문법이 핵심 차별점
실행 시점에 쉘 명령을 실행하고 출력을 컨텍스트에 주입한다. 정적 지시가 아닌 현재 상태에 반응하는 스킬을 만든다.
allowed-tools로 권한 최소화
스킬이 필요한 도구만 허용한다. 불필요한 도구 접근을 차단하면 실수 가능성이 줄어든다.
실시간 감지로 바로 적용
SKILL.md 변경은 재시작 없이 즉시 반영된다. 스킬을 수정하고 바로 테스트할 수 있다.