포스트

[이제와서 시작하는 Claude AI 마스터하기 #11] Skills: 나만의 명령어 만들기

[이제와서 시작하는 Claude AI 마스터하기 #11] Skills: 나만의 명령어 만들기

반복되는 작업이 있나요? “PR 만들어줘”, “코드 리뷰해줘”… 매번 같은 지시를 내리기 번거롭죠. Skills를 사용하면 나만의 /slash-command를 만들어서 복잡한 지시를 한 단어로 실행할 수 있습니다!

완독 시간: 25분 ⭐⭐⭐

🎯 이번에 배울 것

📚 사전 지식


📖 Skill이란 무엇인가?

한 줄 설명

Skill = 재사용 가능한 Claude 지시서

SKILL.md 파일을 만들면 /skill-name으로 바로 실행할 수 있습니다.

CLAUDE.md vs Skill

구분 CLAUDE.md Skill
역할 항상 적용되는 규칙 필요할 때 호출하는 명령
로딩 세션 시작 시 자동 호출 시에만 로드
형태 배경 지식, 컨텍스트 구체적인 작업 지시
예시 “2-space 들여쓰기” “/review - 코드 리뷰 수행”

실제 사용 흐름

flowchart LR
    A[/review] --> B[SKILL.md 로드]
    B --> C[지시사항 실행]
    C --> D[결과 출력]
1
2
3
4
5
6
7
사용자: /review

Claude: (SKILL.md 내용 읽고)
        코드 리뷰를 시작합니다.
        1. 변경된 파일 확인 중...
        2. 코드 품질 검사 중...
        3. 리뷰 완료!

🛠️ 첫 번째 Skill 만들기

Step 1: Skill 디렉토리 생성

개인 Skill (모든 프로젝트에서 사용):

1
mkdir -p ~/.claude/skills/explain-code

프로젝트 Skill (이 프로젝트에서만):

1
mkdir -p .claude/skills/explain-code

Step 2: SKILL.md 작성

~/.claude/skills/explain-code/SKILL.md:

1
2
3
4
5
6
7
8
9
10
11
12
13
---
name: explain-code
description: 코드를 비유와 다이어그램으로 친절하게 설명합니다. "이거 어떻게 동작해?"라고 물을 때 사용하세요.
---

코드를 설명할 때 항상 다음을 포함하세요:

1. **비유로 시작**: 일상생활에 비유해서 설명
2. **다이어그램 그리기**: ASCII 아트로 흐름/구조 시각화
3. **단계별 설명**: 코드가 실행되는 순서대로 설명
4. **주의점 강조**: 흔한 실수나 오해하기 쉬운 부분

설명은 대화하듯 친근하게 해주세요.

Step 3: 사용하기

1
/explain-code src/auth/login.ts

또는 Claude가 관련 질문을 받으면 자동으로 이 Skill을 사용합니다:

1
이 코드 어떻게 동작해?

📋 SKILL.md 구조 이해하기

기본 구조

1
2
3
4
5
---
(YAML Frontmatter - 메타데이터)
---

(Markdown Body - 실제 지시사항)

Frontmatter 필드

필드 필수 설명
name Skill 이름 (없으면 폴더명 사용)
description ⭐ 권장 Claude가 자동 호출할 때 참고
disable-model-invocation true면 수동 호출만 가능
user-invocable false/ 메뉴에서 숨김
allowed-tools 허용할 도구 목록
model 사용할 모델 지정
context fork면 Subagent로 실행

호출 제어하기

1. 자동 + 수동 호출 (기본)

1
2
3
4
---
name: explain-code
description: 코드 설명 요청시 사용
---
  • /explain-code로 직접 호출 가능
  • “이거 어떻게 동작해?” 물으면 Claude가 자동 호출

2. 수동 호출만

1
2
3
4
5
---
name: deploy
description: 프로덕션 배포
disable-model-invocation: true
---
  • /deploy로만 실행 가능
  • Claude가 마음대로 호출하면 안 되는 작업에 사용

3. Claude 자동 호출만

1
2
3
4
5
---
name: legacy-context
description: 레거시 시스템 관련 배경 지식
user-invocable: false
---
  • / 메뉴에 표시 안 됨
  • Claude가 필요할 때 자동으로 참조

📥 인자 전달하기

$ARGUMENTS 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
---
name: fix-issue
description: GitHub 이슈 수정
disable-model-invocation: true
---

GitHub 이슈 $ARGUMENTS 를 수정합니다.

1. 이슈 내용 읽기
2. 요구사항 파악
3. 코드 수정
4. 테스트 작성
5. 커밋 생성

사용:

1
/fix-issue 123

$ARGUMENTS123으로 치환됩니다.

위치별 인자 접근

1
2
3
4
5
6
---
name: migrate
description: 컴포넌트 마이그레이션
---

$ARGUMENTS[0] 컴포넌트를 $ARGUMENTS[1]에서 $ARGUMENTS[2]로 마이그레이션합니다.

사용:

1
/migrate SearchBar React Vue
  • $ARGUMENTS[0] = SearchBar (또는 $0)
  • $ARGUMENTS[1] = React (또는 $1)
  • $ARGUMENTS[2] = Vue (또는 $2)

인자가 없을 때

Skill 내용에 $ARGUMENTS가 없으면 Claude가 자동으로 끝에 추가합니다:

1
ARGUMENTS: 사용자가 입력한 내용

⚡ 동적 컨텍스트 주입

!command 문법

쉘 명령을 실행하고 결과를 Skill에 주입할 수 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
---
name: pr-summary
description: PR 요약
context: fork
---

## PR 정보
- Diff: !`gh pr diff`
- 코멘트: !`gh pr view --comments`
- 변경 파일: !`gh pr diff --name-only`

## 요청
이 PR을 요약해주세요...

동작 방식:

  1. !command``가 먼저 실행됨
  2. 출력이 해당 위치에 삽입됨
  3. 완성된 프롬프트가 Claude에게 전달됨

🔀 Subagent에서 실행하기

복잡한 Skill은 독립된 컨텍스트에서 실행하면 좋습니다.

context: fork 사용

1
2
3
4
5
6
7
8
9
10
11
12
---
name: deep-research
description: 심층 리서치
context: fork
agent: Explore
---

$ARGUMENTS 에 대해 철저히 조사합니다:

1. Glob과 Grep으로 관련 파일 찾기
2. 코드 읽고 분석
3. 파일 참조와 함께 결과 요약

장점:

  • 메인 대화 컨텍스트를 오염시키지 않음
  • 읽기 전용 Explore 에이전트 사용
  • 결과만 요약해서 반환

agent 옵션

설명
Explore 읽기 전용, 탐색 최적화
Plan 계획 수립용
general-purpose 모든 도구 사용 가능
(커스텀) .claude/agents/의 커스텀 에이전트

📦 Skill 저장 위치

위치 적용 범위 우선순위
.claude/skills/ 이 프로젝트만 높음
~/.claude/skills/ 모든 프로젝트 중간
Plugin 내 skills/ Plugin 활성화 시 낮음 (네임스페이스 적용)

같은 이름의 Skill이 여러 곳에 있으면 높은 우선순위가 적용됩니다.

💡 서브디렉토리의 .claude/skills/도 자동으로 발견됩니다. 중첩된 프로젝트 구조에서도 Skill이 정상 동작합니다.

Skill 캐릭터 예산

Skill의 description은 컨텍스트에 로드되어 Claude가 자동 호출 여부를 판단합니다. 예산은 컨텍스트 윈도우의 2% 로 동적 조절됩니다. Skill이 너무 많아서 잘릴 때는 SLASH_COMMAND_TOOL_CHAR_BUDGET 환경변수로 제한을 조정하세요.


🧩 Plugins: Skill 배포하기

Skill을 팀이나 커뮤니티와 공유하려면 Plugin으로 패키징할 수 있습니다.

Plugin과 독립 Skill의 차이

독립 Skill (.claude/) Plugin
단일 프로젝트 전용 여러 프로젝트에서 재사용
/hello로 호출 /plugin-name:hello로 호출
Git으로 수동 공유 Marketplace로 배포

Plugin 구조 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
my-plugin/
├── .claude-plugin/
│   └── plugin.json       # 플러그인 메타데이터
├── skills/
│   └── code-review/
│       └── SKILL.md      # Agent Skill
├── commands/
│   └── hello.md          # 슬래시 명령어
├── agents/
│   └── debugger.md       # 커스텀 에이전트
├── hooks/
│   └── hooks.json        # 이벤트 핸들러
└── .mcp.json             # MCP 서버 설정

Plugin 로컬 테스트

1
claude --plugin-dir ./my-plugin

자세한 내용은 Plugin 공식 문서를 참고하세요.


🧪 실전 Skill 예제

예제 1: 코드 리뷰어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
---
name: review
description: 코드 변경사항을 리뷰합니다. 코드 작성 후 자동으로 사용하세요.
allowed-tools: Read, Grep, Glob, Bash
---

코드 리뷰를 수행합니다:

1. `git diff`로 변경사항 확인
2. 수정된 파일 분석

## 리뷰 체크리스트
- [ ] 코드가 명확하고 읽기 쉬운가?
- [ ] 함수/변수 이름이 적절한가?
- [ ] 중복 코드는 없는가?
- [ ] 에러 처리가 되어 있는가?
- [ ] 보안 취약점은 없는가?
- [ ] 테스트가 충분한가?

## 출력 형식
우선순위별로 피드백 정리:
- 🔴 Critical (필수 수정)
- 🟡 Warning (권장 수정)
- 🟢 Suggestion (개선 제안)

예제 2: 커밋 생성기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
---
name: commit
description: 변경사항으로 Git 커밋 생성
disable-model-invocation: true
allowed-tools: Bash, Read
---

커밋을 생성합니다:

1. `git status``git diff`로 변경사항 파악
2. Conventional Commits 형식으로 메시지 작성
   - feat: 새 기능
   - fix: 버그 수정
   - refactor: 리팩토링
   - docs: 문서
   - test: 테스트
3. 커밋 실행

메시지는 한글로 작성하되, 타입은 영어로:
예: `feat: 로그인 기능 추가`

예제 3: 코드베이스 시각화 (외부 스크립트)

1
2
3
4
5
6
7
8
9
10
---
name: visualize
description: 코드베이스를 인터랙티브 HTML로 시각화
allowed-tools: Bash(python *)
---

시각화 스크립트를 실행합니다:

```bash
python ~/.claude/skills/visualize/scripts/visualize.py .

이 스크립트는 codebase-map.html을 생성하고 브라우저에서 엽니다.

시각화 내용

  • 접을 수 있는 디렉토리 트리
  • 파일 크기 표시
  • 파일 타입별 색상 구분 ```

Skill은 보조 파일을 가질 수 있습니다:

1
2
3
4
visualize/
├── SKILL.md
└── scripts/
    └── visualize.py

🔐 Skill 권한 제어

도구 제한

1
2
3
4
5
---
name: safe-reader
description: 파일 읽기만 가능한 안전 모드
allowed-tools: Read, Grep, Glob
---

Edit, Write, Bash 등을 제외하여 읽기 전용으로 만듭니다.

Skill 비활성화

설정에서 특정 Skill을 차단:

1
2
3
4
5
{
  "permissions": {
    "deny": ["Skill(deploy)"]
  }
}

📝 오늘 배운 것 정리

Skill = /slash-command로 호출하는 재사용 지시서

SKILL.md = Frontmatter(메타) + Markdown(지시)

호출 제어: disable-model-invocation, user-invocable

인자 전달: $ARGUMENTS, $ARGUMENTS[0], $0

동적 컨텍스트: !command``로 실시간 데이터 주입

Subagent 실행: context: fork로 독립 실행


🔗 다음 편 미리보기

#12편: Subagents로 AI 분업하기

Skill보다 더 강력한 AI 작업 분담:

  • 내장 Subagent (Explore, Plan, general-purpose)
  • 커스텀 Subagent 만들기
  • 포그라운드 vs 백그라운드 실행
  • 영속 메모리로 학습하는 에이전트

🔗 시리즈 전체 보기

# 제목 상태
01 Claude AI란? 첫 대화 시작하기 ✅ 완료
02 프롬프트 엔지니어링 기초 ✅ 완료
03 Claude의 다양한 모델과 선택 가이드 ✅ 완료
04 API 활용 첫걸음 ✅ 완료
05 고급 프롬프트 테크닉 ✅ 완료
06 Claude Projects 활용하기 ✅ 완료
07 Claude Code 시작하기 ✅ 완료
08 Claude Code 작동 원리 ✅ 완료
09 실전 워크플로우 ✅ 완료
10 CLAUDE.md 완전 정복 ✅ 완료
11 Skills: 나만의 명령어 만들기 📖 현재 글
12 Subagents로 AI 분업하기 ✅ 완료
13 MCP로 외부 도구 연결하기 ✅ 완료
14 IDE 통합 완벽 가이드 ✅ 완료
15 GitHub Actions와 CI/CD 자동화 ✅ 완료

🔗 참고 자료


🚀 자주 쓰는 작업은 Skill로 만들어두세요!

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.