SKILL.md란?
Skills는 Claude Code의 기능을 확장하는 SKILL.md 파일이다.
지침을 작성하면 Claude가 자동으로 도구 모음에 추가한다.
관련 상황에서 자동 로드되거나, /skill-name으로 직접 호출할 수 있다.
Agent Skills 개방형 표준을 따르므로 여러 AI 도구에서 작동한다.
.claude/commands/deploy.md와 .claude/skills/deploy/SKILL.md는 모두 /deploy를 생성하고 동일하게 작동한다. 기존 commands 파일은 계속 작동하지만, Skills는 지원 파일 디렉토리, frontmatter 제어, 자동 로드 등 추가 기능을 제공한다.
CLAUDE.md
- 매 대화 시작 시 항상 로드
- 프로젝트 전반의 규칙과 컨벤션
- 200줄 이하 권장 (항상 컨텍스트 차지)
- "이 프로젝트에서는 이렇게 해라"
SKILL.md
- 호출될 때만 전체 내용 로드
- 설명(description)만 컨텍스트에 상주
- 길이 제한 없음 + 지원 파일 가능
- "이 작업은 이 순서로 해라"
번들 Skills
Claude Code에 기본 제공되는 Skills. 프롬프트 기반이라 병렬 에이전트를 생성하고, 파일을 읽고, 코드베이스에 적응한다.
/loop 5m check deploySKILL.md 파일 구조
YAML frontmatter + 마크다운 콘텐츠. frontmatter는 동작을 제어하고, 마크다운은 지침을 담는다.
# .claude/skills/explain-code/SKILL.md
---
name: explain-code
description: 코드를 시각적 다이어그램과 유추로 설명한다. "이거 어떻게 동작해?"라고 물을 때 사용.
---
코드를 설명할 때 항상 포함할 것:
1. 유추로 시작 — 일상의 무언가에 비유
2. 다이어그램 그리기 — ASCII 아트로 흐름, 구조, 관계를 표현
3. 코드 워크스루 — 단계별로 무슨 일이 일어나는지 설명
4. 함정 하이라이트 — 흔한 실수나 오해를 짚어줌
설명은 대화체로. 복잡한 개념은 여러 유추를 사용한다.
디렉토리 구조
# 각 스킬은 SKILL.md를 진입점으로 하는 디렉토리
my-skill/
├── SKILL.md # 주요 지침 (필수)
├── template.md # Claude가 채울 템플릿
├── examples/
│ └── sample.md # 예상 형식을 보여주는 예제
└── scripts/
└── validate.sh # Claude가 실행할 수 있는 스크립트
# 프로젝트 전체 구조
my-project/
├── CLAUDE.md # 항상 로드되는 규칙
├── .claude/
│ └── skills/
│ ├── deploy/
│ │ └── SKILL.md # /deploy
│ ├── review/
│ │ └── SKILL.md # /review
│ └── create-page/
│ ├── SKILL.md # /create-page
│ └── template.html # 지원 파일
└── src/
# 글로벌 스킬 (모든 프로젝트에서 사용)
~/.claude/skills/
├── commit/
│ └── SKILL.md # /commit
└── explain-code/
└── SKILL.md # /explain-code
스킬 저장 위치와 우선순위
저장 위치에 따라 적용 범위가 결정된다. 같은 이름이면 상위가 우선.
.claude/skills/도 자동으로 검색한다. packages/frontend/.claude/skills/에 프론트엔드 전용 스킬을 둘 수 있다.
Frontmatter 레퍼런스
SKILL.md 상단의 YAML frontmatter로 스킬 동작을 제어한다. 모든 필드는 선택 사항.
| 필드 | 설명 |
|---|---|
name | 스킬 표시 이름. 생략 시 디렉토리 이름 사용. 소문자, 숫자, 하이픈만 (최대 64자). |
description | 권장. 무엇을 하고 언제 사용할지. Claude가 자동 적용 시기를 판단하는 기준. 250자 초과 시 잘림. |
argument-hint | 자동완성 시 표시되는 인수 힌트. 예: [issue-number], [filename] [format] |
disable-model-invocation | true면 Claude가 자동 로드하지 않음. /name으로만 수동 트리거. 배포, 커밋 등에 적합. |
user-invocable | false면 / 메뉴에서 숨김. Claude만 자동으로 사용. 배경 지식 스킬에 적합. |
allowed-tools | 스킬 활성화 시 허가 없이 사용 가능한 도구. Read Grep Glob 같이 공백 구분. |
model | 스킬 활성화 시 사용할 모델 지정. |
effort | 노력 수준. low, medium, high, max(Opus만). |
context | fork으로 설정하면 격리된 subagent에서 실행. |
agent | context: fork 시 사용할 subagent 타입. Explore, Plan, general-purpose 또는 커스텀. |
paths | 활성화를 제한하는 glob 패턴. 패턴에 매칭되는 파일 작업 시에만 자동 로드. |
hooks | 스킬 라이프사이클에 범위가 지정된 hooks. |
호출 제어: 누가 스킬을 사용하는가
frontmatter로 사용자/Claude 각각의 호출 권한을 분리한다
disable-model-invocation: trueuser-invocable: false/deploy), 커밋(/commit), 슬랙 전송 같은 부작용이 있는 스킬은 disable-model-invocation: true를 설정한다. Claude가 "코드가 준비된 것 같으니 배포하겠습니다"라고 스스로 판단하는 것을 막는다.
고급 패턴
동적 컨텍스트 주입 — !`command`
!`command` 구문은 스킬이 Claude에게 전달되기 전에 셸 명령을 실행한다.
명령 출력이 플레이스홀더를 대체하므로 Claude는 실제 데이터를 받는다.
---
name: pr-summary
description: PR 변경사항을 요약
context: fork
agent: Explore
allowed-tools: Bash(gh *)
---
## Pull request 컨텍스트
- PR diff: !`gh pr diff`
- PR 댓글: !`gh pr view --comments`
- 변경된 파일: !`gh pr diff --name-only`
## 작업
이 PR을 요약해줘...
Subagent에서 실행 — context: fork
context: fork를 설정하면 스킬이 격리된 subagent에서 실행된다. 스킬 콘텐츠가 subagent의 프롬프트가 된다.
---
name: deep-research
description: 주제를 철저히 조사
context: fork
agent: Explore
---
$ARGUMENTS를 철저히 조사한다:
1. Glob과 Grep으로 관련 파일 찾기
2. 코드를 읽고 분석
3. 구체적인 파일 참조와 함께 결과 요약
인수 전달 — $ARGUMENTS
---
name: migrate-component
description: 컴포넌트를 다른 프레임워크로 마이그레이션
---
$0 컴포넌트를 $1에서 $2로 마이그레이션한다.
기존 동작과 테스트를 모두 유지한다.
# 사용: /migrate-component SearchBar React Vue
# $0 = SearchBar, $1 = React, $2 = Vue
$ARGUMENTS (전체 인수), $ARGUMENTS[N] 또는 $N (위치별), ${CLAUDE_SESSION_ID} (세션 ID), ${CLAUDE_SKILL_DIR} (스킬 디렉토리 경로)를 사용할 수 있다.
실전 예제
배포 스킬 (사용자만 호출)
---
name: deploy
description: 프로덕션 환경에 배포
disable-model-invocation: true
---
$ARGUMENTS를 프로덕션에 배포한다:
1. 테스트 스위트 실행
2. 애플리케이션 빌드
3. 배포 타겟에 푸시
4. 배포 성공 여부 확인
읽기 전용 탐색 스킬
---
name: safe-reader
description: 파일을 읽기만 하고 수정하지 않음
allowed-tools: Read Grep Glob
---
파일을 탐색하고 분석하되 절대 수정하지 않는다.
발견한 내용을 정리해서 보고한다.
이슈 수정 스킬
---
name: fix-issue
description: GitHub 이슈를 수정
disable-model-invocation: true
argument-hint: [issue-number]
---
GitHub 이슈 $ARGUMENTS를 코딩 표준에 맞게 수정한다:
1. 이슈 설명 읽기
2. 요구사항 파악
3. 수정 구현
4. 테스트 작성
5. 커밋 생성
공식 자료 및 참고 링크
지원 파일 활용
SKILL.md를 500줄 이하로 유지하고, 상세한 참조 자료는 별도 파일로 분리한다. SKILL.md에서 링크로 참조하면 Claude가 필요할 때만 로드한다.
# 스킬 디렉토리 구조
create-api/
├── SKILL.md # 핵심 지침 + 파일 참조
├── reference.md # 상세 API 문서 (필요 시 로드)
├── examples.md # 사용 예제 (필요 시 로드)
└── scripts/
└── validate.py # 유틸리티 스크립트 (실행용)
# SKILL.md에서 지원 파일 참조
---
name: create-api
description: 새 API 엔드포인트를 생성
---
새 API 엔드포인트를 프로젝트 표준에 맞게 생성한다.
## 추가 리소스
- 상세 API 스펙은 [reference.md](reference.md) 참조
- 사용 예제는 [examples.md](examples.md) 참조
Python 스크립트 번들링
스킬 디렉토리에 Python, Shell 등 스크립트를 함께 번들하면 Claude가 단일 프롬프트로 가능한 것 이상의 작업을 수행할 수 있다. 스크립트가 무거운 작업을 처리하고, Claude는 조율을 담당한다.
디렉토리 구조
# 코드베이스 시각화 스킬 — Python 스크립트 번들 예제
~/.claude/skills/
└── codebase-visualizer/
├── SKILL.md # 스킬 지침
└── scripts/
└── visualize.py # 번들된 Python 스크립트
SKILL.md — 스크립트 실행 지시
핵심은 ${CLAUDE_SKILL_DIR} 변수다. 이 변수는 SKILL.md가 위치한 디렉토리의 절대 경로로 치환되므로,
현재 작업 디렉토리와 무관하게 번들된 스크립트를 정확히 참조할 수 있다.
---
name: codebase-visualizer
description: 코드베이스의 인터랙티브 트리 시각화를 생성한다. 새 레포 탐색, 프로젝트 구조 파악, 대용량 파일 식별에 사용.
allowed-tools: Bash(python *)
---
# Codebase Visualizer
프로젝트의 파일 구조를 접을 수 있는 인터랙티브 HTML 트리 뷰로 생성한다.
## 사용법
프로젝트 루트에서 시각화 스크립트를 실행한다:
```bash
python ${CLAUDE_SKILL_DIR}/scripts/visualize.py .
```
현재 디렉토리에 `codebase-map.html`을 생성하고 브라우저에서 연다.
## 시각화 내용
- 접기/펼치기 디렉토리: 폴더 클릭으로 토글
- 파일 크기: 각 파일 옆에 표시
- 색상 코딩: 파일 타입별 다른 색상
- 디렉토리 합계: 폴더별 총 크기 표시
scripts/visualize.py — 번들 스크립트
Python 기본 라이브러리만 사용하므로 별도 패키지 설치가 필요없다. 디렉토리 트리를 스캔해서 자체 완결형 HTML 파일을 생성한다.
#!/usr/bin/env python3
"""코드베이스의 인터랙티브 트리 시각화를 생성한다."""
import json, sys, webbrowser
from pathlib import Path
from collections import Counter
IGNORE = {'.git', 'node_modules', '__pycache__', '.venv', 'dist', 'build'}
def scan(path: Path, stats: dict) -> dict:
result = {"name": path.name, "children": [], "size": 0}
try:
for item in sorted(path.iterdir()):
if item.name in IGNORE or item.name.startswith('.'):
continue
if item.is_file():
size = item.stat().st_size
ext = item.suffix.lower() or '(no ext)'
result["children"].append(
{"name": item.name, "size": size, "ext": ext}
)
result["size"] += size
stats["files"] += 1
stats["extensions"][ext] += 1
elif item.is_dir():
stats["dirs"] += 1
child = scan(item, stats)
if child["children"]:
result["children"].append(child)
result["size"] += child["size"]
except PermissionError:
pass
return result
def generate_html(data, stats, output):
# ... HTML 생성 로직 (요약 사이드바 + 막대 차트 + 트리 뷰)
# 전체 코드: code.claude.com/docs/ko/skills 공식 문서 참조
...
if __name__ == '__main__':
target = Path(sys.argv[1] if len(sys.argv) > 1 else '.').resolve()
stats = {"files": 0, "dirs": 0, "extensions": Counter()}
data = scan(target, stats)
out = Path('codebase-map.html')
generate_html(data, stats, out)
print(f'Generated {out.absolute()}')
webbrowser.open(f'file://{out.absolute()}')
${CLAUDE_SKILL_DIR}/scripts/visualize.py를 실행 →
Python이 디렉토리를 스캔해서 HTML 생성 → 브라우저에서 열림.
Claude는 조율만 하고, 무거운 작업은 스크립트가 처리한다.
스크립트 번들링 패턴 정리
${CLAUDE_SKILL_DIR} — SKILL.md가 위치한 디렉토리의 절대 경로. 스크립트 참조 시 필수.allowed-tools: Bash(python *) — Claude가 Python 실행 시 허가를 묻지 않도록 설정.
# 스크립트 참조 패턴 비교
# 잘못된 방법 — 상대 경로 (작업 디렉토리에 따라 깨짐)
python ./scripts/visualize.py .
# 올바른 방법 — ${CLAUDE_SKILL_DIR} 사용 (항상 정확)
python ${CLAUDE_SKILL_DIR}/scripts/visualize.py .
# Shell 스크립트도 동일
bash ${CLAUDE_SKILL_DIR}/scripts/setup.sh
# Node.js 스크립트
node ${CLAUDE_SKILL_DIR}/scripts/generate.js
allowed-tools에 Bash(python *) 같이 실행 권한을 열어줘야 Claude가 허가 요청 없이 스크립트를 실행한다.
전체 코드와 더 많은 예제는 공식 문서 (code.claude.com/docs/ko/skills)를 참고한다.