Chapter 4

클로드 코드 스킬 만들기: 반복하는 절차를 명령 하나로

2026-08-22 · 11 min read · 10 XP
챕터 4 시작 · 클로드 코드 길들이기: 스킬, 서브에이전트, 자동화

Claude Code(클로드 코드)에는 반복되는 절차를 명령 하나로 등록해 두는 스킬이 있습니다. CLAUDE.md가 매 세션 항상 따르는 규칙이라면, 스킬은 필요할 때 불러 쓰는 절차입니다.

같은 절차를 채팅창에 세 번째 붙여넣고 있다면 신호입니다.

지난 레슨에서 남이 만든 플러그인을 설치해 바로 써봤다면, 오늘은 남의 것이 아니라 내 절차를 직접 스킬로 만들 차례입니다. 스킬 작성법이 급해서 오셨다면 이 레슨만 보셔도 됩니다. SKILL.md 파일 형식 자체는 잘 안 바뀌는 편이지만, 관련 옵션이나 명령은 릴리스마다 조금씩 늘어날 수 있으니 오래된 시점에 읽으신다면 공식 문서를 함께 확인해 주세요.

스킬 (Skill)

스킬은 지침을 담은 SKILL.md 파일 하나로 Claude Code의 능력을 넓히는 장치다. 폴더 이름이 그대로 슬래시 명령이 되어 /스킬이름으로 직접 부를 수도 있고, 대화 맥락과 관련이 있으면 Claude(클로드)가 스스로 찾아 쓸 수도 있다. 같은 지침을 채팅창에 계속 붙여넣거나 CLAUDE.md의 한 항목이 점점 절차로 불어났다면 스킬로 옮길 때다.

스킬 구조: SKILL.md 파일 하나

스킬은 SKILL.md를 진입점으로 하는 폴더입니다. 가장 단순한 형태는 이렇습니다.

~/.claude/skills/summarize-changes/
└── SKILL.md

파일 맨 위에 YAML frontmatter가 있고, 그 아래에 Claude가 실행할 때 따르는 지침이 이어집니다. frontmatter 중 실제로 자주 쓰이는 것만 추려보면 이렇습니다.

필드역할
description이 스킬이 무엇을 하는지. Claude가 언제 자동으로 부를지 판단하는 근거가 되므로 사실상 필수
disable-model-invocationtrue면 Claude가 알아서 부르지 못하고 사람이 /스킬이름으로만 부를 수 있다. 배포나 커밋처럼 타이밍을 사람이 정해야 하는 작업에 쓴다
user-invocablefalse면 반대로 사람이 메뉴에서 직접 부를 수 없고 Claude만 참고 지식으로 쓸 수 있다
allowed-tools이 스킬이 켜졌을 때 승인 없이 쓸 수 있는 도구를 미리 지정
argument-hint/스킬이름을 입력할 때 자동완성으로 보여줄 인수 힌트, 예: [YYYY년 M월]

지침 본문에는 $ARGUMENTS라는 자리표시자를 쓸 수 있습니다. 스킬 이름 뒤에 입력한 텍스트가 그대로 이 자리에 채워집니다. 인수가 여러 개 필요하면 $ARGUMENTS[0], $ARGUMENTS[1]처럼 순서대로 나눠 받을 수도 있습니다.

스킬을 어디에 두느냐에 따라 누가 쓸 수 있는지가 갈립니다. CLAUDE.md 위치 규칙과 결이 같습니다.

위치경로적용 대상
개인~/.claude/skills/<이름>/SKILL.md내 모든 프로젝트
프로젝트.claude/skills/<이름>/SKILL.md이 프로젝트뿐, 버전 관리로 팀과 공유
플러그인<플러그인>/skills/<이름>/SKILL.md그 플러그인이 켜진 곳 어디서나

같은 이름의 스킬이 여러 위치에 있으면 개인 위치가 프로젝트 위치를 덮어씁니다. 플러그인 스킬은 플러그인이름:스킬이름처럼 이름 앞에 플러그인 이름이 붙어서 다른 위치와 겹칠 일이 없습니다.

지원 파일을 곁들일 수도 있다는 점이 커스텀 명령과 갈리는 지점입니다. 이 블로그가 쓰는 저장소의 post-writer 스킬이 실제 예입니다.

.claude/skills/post-writer/
├── SKILL.md         # 골격과 워크플로우
├── lexicon.md        # 문체 어휘 사전
└── style-guide.md    # 문체 규칙

SKILL.md는 뼈대만 담고, 세부 규칙은 옆 파일에 두어 필요할 때만 펼쳐 봅니다. 참고로 이 저장소의 스킬들은 scopeexecution이라는 항목도 frontmatter에 함께 적어두고 있는데, 이 둘은 공식 필드가 아니라 이 저장소가 "다른 에이전트에도 그대로 이식할 수 있는 절차인지"를 표시하려고 자체적으로 붙인 관행입니다. 공식 스펙에 없는 필드를 얹어도 스킬은 그대로 동작합니다. YAML이니까요.

내 절차를 스킬로

이 트랙이 이어온 관통 시나리오, 고객사 월간 콘텐츠 리포트로 실습해 보겠습니다. 지난 CLAUDE.md 레슨에서 리포트의 표 형식과 표기 규칙을 파일에 고정해 뒀습니다. 이번에는 그 규칙 위에서 실제로 초안을 뽑아내는 절차를 스킬 하나로 만듭니다.

리포트 작업을 하는 프로젝트에서 .claude/skills/monthly-report-draft/SKILL.md를 만듭니다. 팀원과 함께 쓰는 저장소라면 이 위치가 맞습니다. 버전 관리에 커밋되어 있는 그대로 협업자에게도 적용되기 때문입니다.

---
description: 고객사 월간 콘텐츠 리포트 초안을 만든다. 이번 달 게시물과 지난달 대비 증감을 정리해 달라고 할 때 쓴다.
argument-hint: "[YYYY년 M월]"
disable-model-invocation: true
---
 
# 월간 콘텐츠 리포트 초안
 
$ARGUMENTS 리포트 초안을 만든다. 형식과 표기 규칙은 이 프로젝트의 CLAUDE.md를 그대로 따른다.
 
1. 해당 월과 지난달의 게시물 목록, 채널별 지표를 확인한다
2. CLAUDE.md의 표 형식대로 표를 만든다 (첫 칸 게시일, 둘째 칸 채널명)
3. 지난달과 비교하는 문장에는 반드시 근거 수치를 괄호로 병기한다
4. 초안 끝에 다음 달 제안을 한 줄 덧붙인다

disable-model-invocation: true를 넣은 이유가 있습니다. 리포트 초안 작성은 사람이 시점을 정해서 시작하는 작업이지, Claude가 대화 맥락만 보고 알아서 실행할 작업이 아닙니다. 공식 문서도 배포나 커밋처럼 사람이 타이밍을 쥐어야 하는 작업에는 이 옵션을 권합니다.

이 스킬이 매번 같은 파일을 읽거나 같은 명령으로 데이터를 가져온다면 allowed-tools를 함께 적어두는 것도 방법입니다. 예를 들어 리포트 자료를 프로젝트 안의 특정 폴더에서만 읽는다면 allowed-tools: Read(./reports/*)처럼 지정해 그 안에서는 매번 승인을 묻지 않게 할 수 있습니다. 스킬이 켜져 있을 때만 적용되고, 나머지 도구는 평소 권한 설정을 그대로 따릅니다.

저장한 뒤 /monthly-report-draft 8월처럼 입력하면 $ARGUMENTS 자리에 "8월"이 채워진 채로 Claude에게 전달됩니다.

슬래시 메뉴에 내가 만든 monthly-report-draft 스킬이 설명과 함께 뜬 화면 (2026년 8월 24일 캡처)
슬래시 메뉴에 내가 만든 monthly-report-draft 스킬이 설명과 함께 뜬 화면 (2026년 8월 24일 캡처)

/mo까지만 쳐도 방금 만든 스킬이 frontmatter의 description 문장과 함께 목록에 올라옵니다.

체크포인트위 내용대로 .claude/skills/monthly-report-draft/SKILL.md를 실제로 만들어 저장하세요. Claude Code 세션에서 /만 입력해 스킬 메뉴를 열고 monthly-report-draft가 목록에 뜨는지 확인하면 됩니다. 이어서 /monthly-report-draft 8월을 실제로 실행해 CLAUDE.md의 표 형식대로 초안이 나오는지까지 확인하면 이 레슨의 결과물 달성입니다.

메뉴에 안 뜬다면 십중팔구 frontmatter의 YAML 형식이 어긋난 경우입니다. ---로 감싼 부분의 들여쓰기나 콜론 뒤 띄어쓰기가 깨지면 Claude Code는 본문은 읽되 frontmatter는 빈 채로 처리하므로, /monthly-report-draft로 직접 부르는 건 되어도 스킬 메뉴에서 설명이 안 보이는 식으로 나타납니다. 이럴 때는 claude --debug로 다시 열어 파싱 오류 로그를 확인하시면 됩니다.

잘 도는 스킬과 안 도는 스킬

스킬로 만든다고 전부 안정적으로 도는 건 아닙니다. 이 블로그가 쓰는 저장소에는 성격이 다른 스킬이 여러 개 있는데, 나란히 놓고 보면 기준이 드러납니다.

thumbnail 스킬은 순서가 완전히 고정되어 있습니다. 픽셀 그리드를 그리고, 렌더링 명령을 실행하고, 결과 PNG 파일이 생겼는지 확인합니다. 매번 같은 순서로 돌고, 끝났는지 아닌지도 파일 존재 여부로 판정할 수 있습니다. 판단이 끼어들 자리가 거의 없어서 스킬로 만들기 딱 좋은 자리입니다.

factcheck 스킬은 다릅니다. "수정 0건 라운드가 나올 때까지 반복한다"는 조건으로 끝을 판정합니다. 이 판정 자체가 판단입니다. 무엇을 "수정"으로 칠지, 언제 라운드를 더 돌릴지는 매번 다시 봐야 합니다. 그런데도 이 스킬이 안정적으로 도는 이유는 판단이 필요한 지점을 애매하게 남겨두지 않고 "수정 0건 라운드"라는 멈추는 조건을 명시해뒀기 때문입니다. draft-weave 스킬도 비슷합니다. "AI는 이어붙이는 역할이지 고쳐 쓰는 역할이 아니다"처럼 하지 말아야 할 경계를 못박아둡니다.

여기서 얻는 기준은 이렇습니다. 순서가 고정된 기계적인 작업은 스킬로 만들면 그대로 잘 돕니다. 판단이 필요한 작업이라면 "언제 끝나는지"와 "무엇을 하면 안 되는지"를 문장으로 못박아야 매번 다르게 돌지 않습니다. 반대로 "알아서 잘 판단해서 처리해줘" 식으로만 적어두면, 판단 기준이 없는 스킬은 매번 다른 결과를 냅니다. post-writer 스킬은 이 둘을 겹쳐 씁니다. 자체 절차 안에서 factcheck 스킬을 다시 불러 쓰는 식으로, 스킬이 다른 스킬을 단계로 참조할 수도 있습니다.

길이도 참고할 만합니다. 공식 문서는 SKILL.md를 500줄 이하로 유지하라고 권합니다. 스킬 본문은 호출될 때마다 그대로 컨텍스트에 얹히는 비용이기 때문입니다. 실제로 이 저장소의 스킬들은 factcheckdraft-weave가 71줄, thumbnail이 110줄, 가장 긴 post-writer도 202줄로 권장선 안에 있습니다. 자세한 규칙은 본문이 아니라 옆에 둔 지원 파일로 뺀 덕분입니다.

커스텀 명령과는 뭐가 다른가

자동완성에는 "클로드코드 커스텀 커맨드"도 상위 쿼리로 잡힙니다. 공식 문서가 둘을 한 페이지에서 다루는 이유가 있습니다. 사실상 같은 메커니즘이기 때문입니다.

이 저장소에는 실제로 두 방식이 함께 있습니다. .claude/commands/handoff.md는 폴더 없이 파일 하나로 만든 예전 방식의 명령입니다.

---
description: 워크트리 간 핸드오프 우편함 확인·처리
argument-hint: "[pull | new <받는쪽> <주제>]"
---
 
워크트리 간 핸드오프를 확인하고 처리한다. ...

이 파일은 /handoff라는 명령을 만들고, .claude/skills/post-writer/처럼 폴더로 만든 스킬이 /post-writer를 만드는 것과 똑같이 동작합니다. frontmatter도 description, argument-hint처럼 스킬과 같은 필드를 그대로 씁니다. 공식 문서는 이 둘이 완전히 같은 방식이라고 못박습니다.

둘의 차이는 딱 하나, 폴더냐 파일 하나냐입니다. 스킬은 폴더라서 SKILL.md 옆에 lexicon.md나 스크립트 같은 지원 파일을 같이 둘 수 있습니다. 명령은 파일 하나뿐이라 그럴 자리가 없습니다. 지원 파일이 필요 없는 짧은 절차라면 .claude/commands/의 파일 하나로도 충분하고, 실제로 기존 .claude/commands/ 파일은 계속 그대로 작동합니다. 다만 공식 문서는 새로 만들 때는 스킬 폴더 형식을 권합니다. 나중에 참고 자료나 스크립트가 필요해져도 폴더 구조를 새로 짤 필요가 없기 때문입니다.

제가 처음 스킬로 묶은 것은 GA4 데이터 분석이었습니다. 매번 대화로 같은 순서를 불러주다가 "이건 묶어야겠다" 싶었던 순간이 왔습니다. 그 뒤로는 광고 현황 점검, 분석 결과를 자연어 리포트로 받기처럼 매번 대화로 시작해야 했던 일들을 순서대로 알아서 돌게 하는 루트로 짰고, 콘텐츠 마케팅 쪽에서도 주제 찾기부터 글 구조 잡기, 초안 쓰기까지를 한 묶음으로 만들어 썼습니다. 공통점은 하나였습니다. 순서가 정해져 있는데 그 순서를 매번 제 입으로 다시 말하고 있었다는 것.

30초 요약
  • 스킬은 SKILL.md를 진입점으로 하는 폴더다. description이 사실상 필수이고, disable-model-invocation으로 사람만 호출하게 제한할 수 있다
  • 폴더인 덕분에 SKILL.md 옆에 참고 자료나 스크립트 같은 지원 파일을 같이 둘 수 있다
  • 순서가 고정된 기계적인 작업은 스킬로 만들면 그대로 잘 돈다. 판단이 필요한 작업은 멈추는 조건과 하지 말아야 할 경계를 문장으로 못박아야 안정적으로 돈다
  • SKILL.md는 500줄 이하 권장. 호출될 때마다 그대로 컨텍스트 비용이 되기 때문이다
  • 커스텀 명령과 스킬은 같은 메커니즘이다. 차이는 폴더냐 파일 하나냐뿐이고, 새로 만들 땐 폴더 형식이 권장된다

자주 묻는 질문

Claude Code(클로드 코드) 스킬은 어떻게 만드나요?

~/.claude/skills/(개인용) 또는 .claude/skills/(프로젝트용) 아래에 폴더를 만들고 그 안에 SKILL.md 파일을 작성하면 됩니다. 폴더 이름이 곧 슬래시 명령이 되어 /폴더이름으로 부를 수 있습니다. description frontmatter만 있으면 Claude(클로드)가 언제 자동으로 쓸지도 판단할 수 있습니다.

스킬과 커스텀 명령은 뭐가 다른가요?

사실상 같은 메커니즘입니다. .claude/commands/deploy.md 파일과 .claude/skills/deploy/SKILL.md로 만든 스킬은 둘 다 /deploy 명령을 만들고 똑같이 동작합니다. 차이는 폴더냐 파일 하나냐뿐입니다. 스킬은 폴더라서 SKILL.md 옆에 참고 문서나 스크립트 같은 지원 파일을 함께 둘 수 있고, 명령은 파일 하나뿐이라 그럴 수 없습니다.

SKILL.md는 몇 줄까지 써야 하나요?

공식 권장은 500줄 이하입니다. 스킬이 호출되면 본문 전체가 그대로 대화 컨텍스트에 얹히므로 길어질수록 매번 그만큼의 비용이 듭니다. 자세한 참고 자료나 예제는 SKILL.md 본문 대신 같은 폴더의 다른 파일로 옮기고 필요할 때만 참조하게 하는 편이 낫습니다.

스킬을 Claude(클로드)가 알아서 부르지 못하게 하려면 어떻게 하나요?

frontmatter에 disable-model-invocation: true를 추가하면 됩니다. 이렇게 하면 사용자가 /스킬이름으로 직접 부를 때만 실행되고, Claude가 대화 맥락만 보고 자동으로 실행하지 않습니다. 배포나 커밋, 메시지 발송처럼 실행 타이밍을 사람이 정해야 하는 작업에 씁니다.

이미 있는 스킬을 다른 프로젝트에서도 쓰려면 어떻게 하나요?

스킬을 개인 위치인 ~/.claude/skills/에 두면 내 컴퓨터의 모든 프로젝트에서 사용할 수 있습니다. 반대로 팀 전체와 공유하고 여러 프로젝트에서 재사용하려면 플러그인으로 묶어 마켓플레이스를 통해 배포하는 편이 낫습니다.

스킬을 수정하면 바로 반영되나요?

네, SKILL.md 텍스트를 수정하면 Claude Code(클로드 코드)를 다시 시작하지 않아도 같은 세션 안에서 바로 적용됩니다. 다만 세션이 시작된 뒤에 스킬 디렉토리 자체를 새로 만든 경우에는 그 최상위 폴더를 감시 대상에 넣기 위해 Claude Code를 재시작해야 합니다.

Sources (2)펼쳐서 전체 출처 보기
quest_log.txt
획득
챕터 4 완료
+10 XP (누적 0)
스킬은 순서가 고정된 자리에서 잘 돌고 판단엔 멈추는 조건이 필요하다
0/7 · 0%
Lv.1 입문자
0 / 100 XP
다음 레벨까지 100 XP
다음 퀘스트클로드 코드 서브에이전트: 일을 나눠 맡기기
4 / 7클로드 코드 서브에이전트: 일을 나눠 맡기기< 뒤로다음>