OMC (oh-my-claudecode) · 스킬과 슬래시 커맨드 (SKILL.md 워크플로우 + 얇은 디스패처)

한 줄 요약

OMC는 재사용 작업 절차를 두꺼운 레시피(스킬)얇은 포인터(커맨드) 로 나눠, 필요할 때만 절차서를 불러오는 “지연 로딩” 구조다. 이 설계를 알면 긴 절차서 수십 개를 매 세션 메모리에 띄우지 않고도 슬래시 한 줄로 호출해, 내 작업 절차를 토큰 낭비 없이 자산화할 수 있다.

그림

flowchart TD
    A["세션 시작: commands/*.md<br/>메타데이터만 스캔"] --> B["커맨드 목록 등록<br/>(description='' → 토큰 절약)"]
    B --> C["사용자 입력:<br/>/oh-my-claudecode:trace '인자'"]
    C --> D["디스패처 본문 주입<br/>'SKILL.md 읽고 따르라 + $ARGUMENTS'"]
    D --> E["모델이 Read로 두꺼운<br/>SKILL.md 로드 (지연 로딩)"]
    E --> F["argument-hint 따라<br/>$ARGUMENTS 슬롯 파싱"]
    F --> G["워크플로우 실행 → 결과 보고"]

쉽게 풀기

비유: 요리책과 포스트잇. 큰 요리책(스킬)에는 레시피 전문이 빼곡하지만, 요리 때마다 책 전체를 식탁에 펼치면 자리만 차지한다. 그래서 냉장고엔 포스트잇(커맨드)만 붙인다 — “오늘은 32쪽을 펴서 그대로 해.” 실제 요리를 시작할 때만 그 32쪽을 펼친다. OMC도 똑같다.

flowchart LR
    subgraph 평소["세션 내내 떠 있음"]
        P["포스트잇=커맨드<br/>(얇음, 설명 비움)"]
    end
    subgraph 호출시["호출 순간만 펼침"]
        R["요리책 32쪽=SKILL.md<br/>(두꺼운 절차 전문)"]
    end
    P -- "/명령 입력 시 Read" --> R
  • 스킬 = 두꺼운 절차서. skills/<이름>/SKILL.md 하나가 작업 절차 하나. 위쪽 frontmatter(이름·설명·인자 힌트) + 아래 본문(Usage → Architecture → Examples → Workflow).
  • 커맨드 = 얇은 길잡이. commands/<이름>.md는 일부러 얇은 포인터. “짝 SKILL.md를 읽고 그대로 따르되 사용자 인자($ARGUMENTS)를 넘겨라”만 지시.
  • 왜 설명을 비우나(description: ""). Claude Code는 세션 시작 시 모든 커맨드 설명을 통째로 읽는다. 여기 긴 절차를 적으면 호출하지도 않은 수십 개 설명이 매번 컨텍스트를 잡아먹으므로 빈 문자열로 비운다.
  • 지연 로딩. 두꺼운 SKILL.md 본문은 세션 시작 때 로드되지 않고, 사용자가 실제로 명령을 부른 순간 모델이 Read로 펼친다.
  • 인자 전달. 슬래시 뒤 값은 $ARGUMENTS 자리표시자로 전달되고, argument-hint(예: [N:agent-type] [ralph] <task>)가 어떤 슬롯에 끼울지 안내한다.

핵심 정리

스킬 frontmatter 주요 필드 (실측 40개 SKILL.md 집계)

필드필수 여부설명
name필수 40/40식별자. /oh-my-claudecode:<name>로 호출
description필수 40/40한 줄 설명. 스킬은 채우고 짝 커맨드는 비움
level권장 32/40작업 무게/권한 단계 (team=4, trace=2)
argument-hint선택 18/40슬롯 형식 (<>=필수, []=선택)

커맨드(디스패처) 구성

구성내용
description의도적 "" — 세션 시작 시 전부 로드되므로 토큰 절약
본문”SKILL.md 읽어라 → 그대로 따르라 → $ARGUMENTS 전달” + 파일 못 찾을 때 폴백 탐색

비대칭 주의 — 모든 스킬에 짝 커맨드가 있는 건 아니다

commands/엔 28개 파일. commands/team.md없다 (team은 /oh-my-claudecode:team로 직접 호출). 반면 trace·skill은 디스패처가 있고, psmproject-session-manager별칭 디스패처다.

세 가지 커맨드 형태의 관계:

flowchart TD
    T["/team"] -->|디스패처 없음| TS["skills/team/SKILL.md"]
    TR["/trace"] -->|얇은 디스패처| TRS["skills/trace/SKILL.md"]
    PSM["/psm"] -->|별칭 디스패처| PSMS["skills/project-session-manager/SKILL.md"]

실제 예시

핵심만: 스킬(두꺼움) ↔ 커맨드(얇음) 의 짝 구조다. 전문은 접이식에 보존.

만들 때 체크리스트

  • skills/<name>/SKILL.md 생성, frontmatter name·description 필수.
  • 인자 받으면 argument-hint로 슬롯 명시(<>=필수, []=선택).
  • 작업 무게에 맞는 level(가벼움 1~2, 무거운 오케스트레이션 4+).
  • 본문에 Usage/Parameters/Examples + 실제 절차(Workflow/Architecture).
  • 토큰 절약 필요 시 commands/<name>.md 디스패처 생성, description: "".
  • 디스패처 본문은 SKILL.md 읽기 지시 + $ARGUMENTS + 폴백 경로만.
  • 별칭은 SKILL.md aliases:에 추가, 별도 호출명 원하면 별칭 디스패처(psm.md형)도.
  • 자동 활성화 필요 시 triggers: 추가, docs/REFERENCE.md 스킬 수 갱신.
  • 주의: 디스패처가 모든 스킬에 필수는 아님(team은 직접 호출).

요약 & 셀프체크

3줄 요약

  1. 스킬(skills/<이름>/SKILL.md)은 두꺼운 절차서, 커맨드(commands/<이름>.md)는 그걸 가리키는 얇은 포인터다.
  2. 커맨드 설명을 ""로 비우는 건 세션 시작 시 모든 커맨드 설명이 로드되기 때문 — 두꺼운 절차는 호출 순간 Read로 지연 로딩한다.
  3. 사용자 인자는 $ARGUMENTS로 SKILL.md에 전달되고, argument-hint가 슬롯 파싱을 안내한다.

스스로 답해 보기

  • Q1. 커맨드 description을 일부러 비우는 이유는? (힌트: 세션 시작 로드 / 토큰)
  • Q2. SKILL.md 본문은 언제 컨텍스트에 들어오나 — 세션 시작 때인가, 호출 순간인가?
  • Q3. team 스킬엔 왜 commands/team.md 디스패처가 없어도 되는가?

연결

OMC_개요 · OMC_30_subagents · _분석축_루브릭