본문으로 건너뛰기
5분 AI.
REPO DEEP DIVE · 2026-07-29 · KWAKSEONGJAE/OH-MY-DESIGN · AI 코딩 에이전트에 "브랜드 톤"을 심어주는 스킬 번들

kwakseongjae/oh-my-design 딥다이브
— "에이전트에게 디자인 규칙서를 쥐여주다" DESIGN.md 워크플로

CLI·스킬 모음

빠른 판단

무엇
에이전트 스킬·레퍼런스·훅을 설치하고 프로젝트 전용 DESIGN.md를 만드는 디자인 시스템 도구
이럴 때
AI가 세션마다 다른 톤의 UI를 만들 때 브랜드·테마·컴포넌트 규칙을 프로젝트 문서로 확정해 재사용할 때
oh-my-design(줄여서 OmD)은 그 자체가 AI 모델이나 디자인 생성기가 아니다. Claude Code · Codex · OpenCode · Cursor 같은 코딩 에이전트에 "우리 프로젝트만의 디자인 규칙서(DESIGN.md)를 만들고 지키게 하는" 스킬·서브에이전트·훅·레퍼런스 카탈로그를 설치해주는 CLI다.

핵심 산출물인 DESIGN.md는 색상·타이포·간격 같은 토큰뿐 아니라 보이스(말투)·내러티브·원칙·페르소나·모션까지 담는 이식 가능한 브랜드 명세로, 실제 440개 기업의 검증된 디자인 시스템을 출발점(레퍼런스)으로 삼을 수 있다. 설치와 핵심 워크플로에는 별도 API 키나 MCP 서버가 필요 없다 — 추론은 이미 쓰고 있는 에이전트 세션 안에서 그대로 일어난다.

(저장소 kwakseongjae/oh-my-design · 라이선스 MIT · npm 패키지 oh-my-design-cli v1.9.0(2026-07-17) · 최신 커밋 0a7f3a1(2026-07-21) · 소스 파일 약 3,259개 중 마크다운 2,204개 · 레퍼런스 440개 기업 DESIGN.md · CLI=TypeScript/Node · 부속 웹앱 oh-my-design.kr=Next.js 16 + React 19 · 한국어·영어·일본어·중국어 번체 4개 언어 문서)
목차
  1. 한 줄 정체
  2. 왜 지금 뜨는가
  3. 무엇을 해결하나
  4. 전체 구조
  5. 핵심 설계·동작 원리
  6. 기술 스택·의존성
  7. 설치·요구사항
  8. 실제 사용 흐름
  9. 함정·오해 방지
  10. 대안 비교
  11. 정리 — 누가 쓰면 좋은가
  12. 직접 해볼 수 있는 실습 과제
  13. 관련 기술 심화 학습 로드맵
  14. 핵심 키워드 사전

1한 줄 정체

"AI 코딩 에이전트가 매번 다른 톤으로 UI를 짜는 문제"를 프로젝트 소유의 문서 한 장으로 고정한다

oh-my-design은 "디자인 시스템 설치기"다. npx oh-my-design-cli@latest 한 번이면 지금 쓰는 코딩 에이전트(Claude Code / Codex / OpenCode / Cursor) 안에 20개 스킬 · 최대 18개 전문 서브에이전트 · 자동 훅 · 440개 기업 레퍼런스 카탈로그가 깔린다. 이후 사용자가 "우리 서비스 디자인 시스템 세팅해줘"라고 말하면, 방금 설치된 omd:init 스킬이 카탈로그에서 어울리는 기업(예: 토스, 뱅크샐러드, Linear)을 추천하고, 선택된 레퍼런스의 톤을 보존한 변형본을 프로젝트 루트 DESIGN.md로 만들어낸다.

중요한 건 이 도구가 새 AI를 추가하지 않는다는 점이다. 추천 로직도, 문서 작성도 전부 사용자가 이미 쓰고 있는 에이전트의 모델이 스킬 마크다운에 적힌 절차를 그대로 따라가며 수행한다. oh-my-design은 그 절차서(SKILL.md)와 근거 자료(레퍼런스 카탈로그)를 만들어 설치해줄 뿐이다.

한 줄 비유

실력 있는 셰프(에이전트)에게 "이 레스토랑만의 레시피북"을 쥐여주는 일

셰프는 이미 요리를 잘한다. 하지만 매번 "그냥 맛있게"라고만 주문하면 오늘은 짜게, 내일은 싱겁게 나온다. oh-my-design은 셰프를 바꾸지 않는다. 대신 "우리 가게는 이 레시피(토큰)로, 이런 말투(보이스)로, 이 손님층(페르소나)을 위해 요리한다"고 적힌 레시피북 한 권(DESIGN.md)을 주방에 걸어둔다.

다음에 다른 요리사(다른 세션, 다른 날)가 와도 같은 레시피북을 펴 보면 똑같은 맛이 나온다 — 이것이 이 프로젝트가 노리는 "톤의 일관성"이다.

2왜 지금 뜨는가

"바이브 코딩" 시대의 부작용 — 코드는 빨라졌는데 디자인 톤은 세션마다 흔들린다

2025~2026년은 Claude Code · Codex · OpenCode 같은 터미널 코딩 에이전트가 일상 도구가 된 시기다. 코드 생성은 빨라졌지만, "디자인 판단"은 여전히 매 프롬프트마다 즉흥적으로 이뤄진다. "미니멀하게", "토스 느낌으로" 같은 지시는 세션이 바뀌면 다시 처음부터 설명해야 하고, 팀원마다 해석이 달라 결과물이 들쭉날쭉해진다. oh-my-design은 이 틈을 정확히 겨냥한다.

① "vibe coding"에 빠진 "vibe design" 문제 해결

코드에는 eslint·prettier·타입 체커 같은 일관성 강제 장치가 있지만, "이 버튼이 우리 브랜드다운가"에는 그런 장치가 없었다. oh-my-design은 DESIGN.md라는 파일을 프로젝트에 커밋시켜, 디자인 판단도 코드처럼 버전 관리되고 다음 세션에서 다시 읽히는 문서로 만든다.

② 레퍼런스가 "검증됨"을 표방한다

단순 "느낌적인 느낌"이 아니라, 각 기업 레퍼런스는 실제 라이브 사이트의 computed-style 스크래핑과 공식 디자인 시스템 문서를 근거로 토큰 값에 출처(source)·방법(method)·날짜(captured)를 매긴다. 한국 기업 레퍼런스는 "브랜드 소유 Tier-1 출처 2개 이상 + Proof 블록"이라는 자체 품질 게이트를 통과해야 카탈로그에 들어간다(CHANGELOG 기준). "그럴듯한 색상 팔레트"가 아니라 "이 회사가 실제로 이 값을 쓴다는 근거"를 파는 셈이다.

③ 멀티 에이전트 시대의 "한 곳에서 관리" 요구

같은 팀 안에서도 누구는 Claude Code, 누구는 Codex, 누구는 Cursor를 쓴다. oh-my-design은 하나의 DESIGN.md를 4개 채널이 공유하게 만들어, 도구가 달라도 같은 브랜드 규칙을 참조하게 한다.

경쟁 지형
디자인 토큰 파이프라인 · UI 킷 · 범용 스킬 마켓과 다른 자리

Style Dictionary 같은 토큰 빌드 도구는 코드 상수를 만들지만 "브랜드가 왜 이런 말투를 쓰는지"는 다루지 않는다. shadcn/ui 같은 컴포넌트 킷은 코드를 주지만 브랜드 고유성이 없다. oh-my-design은 그 중간 — "에이전트가 UI를 짜기 직전에 읽는 산문형 규칙서"라는 자리를 차지한다.

3무엇을 해결하나

"매번 설명하는 디자인 지시"를 "한 번 쓰고 계속 읽히는 파일"로 바꾼다

실제로 해결하는 문제는 셋으로 요약된다.

문제 ① — 디자인 컨텍스트가 세션 사이에서 증발한다

코딩 에이전트는 대화가 끝나면 그 세션의 판단(어떤 파란색을 썼는지, 왜 그 폰트 크기를 골랐는지)을 잊는다. oh-my-design은 그 판단을 DESIGN.md라는 파일로 프로젝트에 남겨, 다음 세션·다음 사람이 다시 그 파일을 Read하면 동일한 맥락을 되찾게 한다.

문제 ② — "느낌"만으로는 재현이 안 된다

"토스 같은 느낌"이라는 지시는 사람마다, 세션마다 다르게 해석된다. 440개 기업의 검증된 실제 토큰·보이스·원칙을 출발점으로 제공함으로써, "느낌"이 아니라 "이 회사의 실제 값을 기준으로 우리 것을 만든다(hybrid variation)"는 재현 가능한 절차로 바꾼다.

문제 ③ — 여러 에이전트·여러 팀원 간 규칙 파편화

Claude Code용 지시, Codex용 지시, Cursor용 규칙을 따로 관리하면 셋이 어긋난다. oh-my-design은 CLAUDE.md / AGENTS.md / .cursor/rules/omd-design.mdc 세 개의 "shim"(연결 통로) 파일을 자동 생성·동기화해, 진짜 소스는 DESIGN.md 하나로 유지한다.

용어
DESIGN.md
색상·타이포·간격 같은 디자인 토큰에 더해 보이스(말투)·내러티브(브랜드 서사)·원칙·페르소나·상태(States)·모션까지 담는 마크다운 문서. Google Stitch의 design-md 규격을 뼈대로 삼는다. 프로젝트 루트에 커밋되어 "우리 프로덕트의 디자인 헌법" 역할을 한다.
용어
shim(심)
여기서는 각 코딩 에이전트가 원래 읽는 지시 파일(CLAUDE.md, AGENTS.md, Cursor rule)에 "DESIGN.md를 참조하라"는 짧은 연결 블록을 자동으로 심어주는 것. 진짜 규칙은 DESIGN.md에만 있고, shim은 그곳으로 안내하는 표지판 역할만 한다.

4전체 구조

"설치기(CLI)" + "실행 절차서(스킬 마크다운)" + "근거 카탈로그(440개 DESIGN.md)" 3부작

저장소는 겉보기엔 npm 패키지 하나(oh-my-design-cli)지만, 실제로는 서로 다른 세 가지 산출물이 한 레포에 같이 산다: ① Node/TypeScript로 짠 설치·진단 CLI, ② 코드가 아니라 마크다운으로 쓰인 절차서(스킬·서브에이전트), ③ Next.js로 만든 웹사이트 겸 레퍼런스 파이프라인(oh-my-design.kr). 이 셋의 관계를 그림으로 보면 아래와 같다.

┌──────────────────────────────────────────────────────────────────┐ │ OH-MY-DESIGN 3부작 구조 │ └──────────────────────────────────────────────────────────────────┘ [1] CLI (bin/oh-my-design.ts → src/cli/*.ts) npx oh-my-design-cli@latest ├ install-skills.ts (1,706줄) — 채널 감지 후 파일 복사/관리 ├ doctor.ts (983줄) — 설치 상태 진단 + 정확한 복구 명령 출력 └ agent-detect.ts — .claude / .codex / .opencode / .cursor 존재 확인 │ 설치 대상 파일을 프로젝트에 복사 ▼ [2] 스킬·서브에이전트 (skills/*, agents/*, .claude/hooks/*.cjs) ├ skills/omd-init/SKILL.md 등 20개 — 순수 마크다운 "행동 절차서" ├ agents/omd-*.md 18개 — 전문 역할 페르소나(리서처·비평가·감사 등) └ .claude/hooks/*.cjs — DESIGN.md 존재 체크 등 트리거 보조 훅 │ 호스트 에이전트(Claude/Codex 등)의 LLM이 이 절차서를 "실행" ▼ [3] 레퍼런스 카탈로그 + 웹 (design-md/*, web/) ├ design-md/<id>/DESIGN.md — 440개 기업, 검증된 토큰+보이스+원칙 ├ data/reference-fingerprints.json — omd:init이 in-head로 스코어링할 요약본 └ web/ (Next.js) — oh-my-design.kr, 카탈로그·빌더·reverify(재검증) 파이프라인

세 계층은 완전히 다른 언어로 짜여 있다는 게 이 레포의 특징이다. ①은 평범한 TypeScript CLI, ②는 실행 가능한 산문(prose-as-program), ③은 표준적인 Next.js 앱이다. "어디에 로직이 있나"를 코드에서만 찾으면 ②를 놓친다.

oh-my-design/ ├── bin/oh-my-design.ts # commander CLI 진입점 ├── src/cli/ # install-skills.ts · doctor.ts · hook-contract.ts ├── src/core/agent-detect.ts # 채널(에이전트) 감지 ├── skills/ # ★ 20개 스킬 소스 (omd-init, omd-apply, omd-feel …) ├── agents/ # ★ 18개 서브에이전트 페르소나 (omd-master 등) ├── .claude/hooks/*.cjs # 설치되는 훅 원본(관리 마커 sha256 포함) ├── design-md/<company>/ # ★ 440개, 각 DESIGN.md+README.md+.verification.md ├── packages/mcp/ # (은퇴) 옛 MCP 서버 — 현재는 아카이브 ├── web/ # Next.js 16 — oh-my-design.kr, 파이프라인 스크립트 ├── spec/ · docs/ · CHANGELOG.md └── test/ · .github/workflows/ (quality · release · reverify)
용어
채널(channel)
이 레포에서 "채널"은 설치 대상이 되는 코딩 에이전트 종류를 뜻한다 — claude-code, codex, opencode, cursor 네 가지. 채널마다 설치 위치와 받는 기능 범위가 다르다(§6, §7 표 참고).

5핵심 설계·동작 원리

가장 중요한 부분 — "관리 파일 마커"로 안전하게 갱신하기 · "마크다운 상태 기계"로 추천하기 · "출처 앵커"로 거짓말 막기

이 레포에서 배울 가치가 가장 큰 설계는 코드의 복잡도가 아니라 "신뢰를 어떻게 기계적으로 보장하는가"다. 네 가지 패턴으로 나눠본다.

설계 패턴 ① — sha256 마커로 "내가 관리하는 파일"과 "사용자가 고친 파일"을 구분한다

src/cli/hook-contract.ts는 설치되는 훅 6개(skill-activation.cjs 등) 각각에 대해, 파일 맨 위에 // omd:installed-hook sha256=<해시>라는 한 줄을 새긴다. 이 해시는 마커를 뺀 나머지 내용으로 계산되므로(renderManagedHook), 파일을 열어 실제로 재계산해보면 "이 파일이 지금 배포되는 버전 그대로인지, 사용자가 손을 댔는지"를 판별할 수 있다(isCurrentManagedHook). 과거 버전(마커가 없던 시절) 파일까지 LEGACY_HOOK_HASHES 해시 목록으로 인식해, 재설치 시 "이건 예전 관리 파일이니 갱신해도 안전"이라고 판단한다.

비유

도서관 대출 스탬프처럼 생각하면 쉽다. 관리자가 배포한 책(훅 파일) 첫 페이지에는 "이 판본의 지문(해시)"이 찍혀 있다. 다음 번 새 판본을 배포할 때, 책을 펼쳐 지문이 초판 그대로면 "아무도 안 건드렸으니 새 판으로 안전하게 교체", 지문이 달라졌으면 "누군가 낙서(수정)했으니 강제로 덮어쓰지 않고 사용자에게 물어본다." doctor·install-skills --force는 바로 이 판별 결과로 동작한다.

설계 패턴 ② — 추천·추론 로직이 코드가 아니라 "실행되는 산문"으로 존재한다

skills/omd-init/SKILL.md는 약 320줄짜리 마크다운인데, 이 자체가 7단계 상태 기계다. TypeScript 함수가 아니라 "다음 순서로 하라"는 지시문으로 짜여 있고, 이를 실제로 실행하는 건 호스트 에이전트(Claude Code 등)의 LLM이다.

이 절차서는 스스로에게 "금지 목록"도 박아둔다 — 예컨대 "omd init recommend처럼 존재하지 않는 CLI 서브커맨드를 호출하지 말 것"이라는 문장이 SKILL.md 본문에 그대로 적혀 있다(§9에서 다시 다룬다).

설계 패턴 ③ — 레퍼런스 토큰마다 "출처 앵커"를 달아 검증 가능하게 만든다

design-md/toss/DESIGN.md의 frontmatter를 열어보면 verification_v2.claims 블록에 YAML 앵커(&tds_button)와 참조(*tds_button)를 써서, tokens.colors.primary 같은 각 토큰 값이 어느 화면(surface)·어느 출처(source)·어떤 방법(computed-style-and-official-doc)·언제(captured 날짜) 확인됐는지 일일이 매핑해 둔다. "그냥 그럴듯한 값"이 아니라 "이 값은 이 URL의 이 방법으로 이 날짜에 확인했다"는 감사 추적(audit trail)이다.

용어
YAML 앵커/별칭 (&name / *name)
YAML 문법에서 같은 값을 여러 곳에서 재사용할 때 쓰는 표기. &tds_button으로 한 번 값을 "고정"해두고, 이후 *tds_button으로 그 값을 그대로 가져다 쓴다. oh-my-design은 이를 이용해 "여러 토큰이 같은 출처 하나를 공유한다"는 사실을 중복 없이 표현한다.

설계 패턴 ④ — 채널마다 "받는 능력"을 의도적으로 차등한다

모든 채널이 같은 걸 받지 않는다. Claude Code는 스킬+18개 서브에이전트+훅+데이터 전체 번들을 받지만, Cursor는 규칙 파일 하나 + 공유 카탈로그만 받는다(서브에이전트·훅·스킬 없음). 이는 실수가 아니라 README가 명시한 설계 결정 — "Cursor는 omd:init 같은 스킬을 실행할 호스트가 아니다"라는 현실을 인정하고, Cursor 사용자에게는 미리 만든 DESIGN.md를 그대로 붙여 넣는 경로만 제공한다.

경계선 — 헷갈리기 쉬운 지점
이 저장소에는 "디자인을 생성하는 AI"가 없다

oh-my-design은 이미지를 그리거나 UI를 렌더링하지 않는다. 하는 일은 ①이미 검증된 텍스트 근거를 제공하고 ②그 근거를 읽고 쓰는 절차를 마크다운으로 코딩해 두는 것뿐이다. 실제 UI 코드 생성·이미지 판단은 여전히 호스트 에이전트(Claude Code 등)의 모델이 한다. "AI 로직을 찾는다"는 마음으로 src/만 뒤지면 실망한다 — 진짜 "로직"은 skills/*.md와 agents/*.md의 자연어 지시 안에 있다.

6기술 스택·의존성

CLI=가벼운 TypeScript · 웹앱=Next.js 16 + React 19, 버전의 진실원은 package.json+CHANGELOG

버전 진실원(source of truth)부터 짚으면: 루트 package.json의 version은 1.9.0이고, CHANGELOG.md 최신 항목도 "1.9.0 — 2026-07-17"로 정확히 일치한다. 클론한 HEAD는 그보다 나흘 뒤인 0a7f3a1(2026-07-21) — 버전을 올리지 않은 문서/레퍼런스 후속 커밋으로 보인다.

① CLI — oh-my-design-cli (npm 배포 패키지)

요소무엇 / 왜
언어·빌드TypeScript + tsup(번들러). bin/oh-my-design.ts → dist/bin/oh-my-design.js로 빌드돼 oh-my-design/omd 두 이름으로 실행된다.
CLI 프레임워크commander 13 — install-skills·doctor 서브커맨드 정의.
대화형 설치 UI@clack/prompts — bare 실행 시 뜨는 TUI(Project/Global 스코프 선택 등). 색은 picocolors.
테스트vitest 3. devDependency에 playwright-core도 있는데, 이는 선택 스킬 claude-design이 로그인된 Chrome의 claude.ai/design 세션을 여는 데 쓰인다(별도 API 호출 아님).
엔진engines.node >= 18.

② 웹앱 — web/ (oh-my-design.kr, 별도 미배포 패키지)

루트 CLI와 별개로, web/package.json(이름 web, 버전 0.1.0)이 정의하는 완전히 다른 Next.js 애플리케이션이 카탈로그 사이트·빌더·문서를 서빙한다.

요소무엇 / 왜
프레임워크Next.js 16.2.6 + React 19.2.4. 스타일은 Tailwind CSS v4 + @base-ui/react, 모션은 framer-motion.
레퍼런스 파이프라인scripts/build-registry.mjs(카탈로그 인덱스 생성) · build-reference-quality.mjs(품질 등급) · build-reference-ast.ts · build-embeddings.mjs(검색용 임베딩) — @anthropic-ai/sdk를 이 빌드 스크립트들이 사용(런타임 스킬 추론과는 별개).
재검증(reverify)build-reverify-queue.ts · run-reverify-batch.ts · capture-reference-evidence.ts — 라이브 사이트를 주기적으로 다시 스크래핑해 토큰 값이 드리프트했는지 확인하는 자체 파이프라인.
데이터·분석@upstash/redis(성장 지표 스냅샷) · mixpanel-browser(제품 분석) · zod(스키마 검증) · react-markdown+rehype-sanitize(레퍼런스 원문 마크다운을 안전하게 렌더링).

③ 레거시 — packages/mcp/

과거 카탈로그를 MCP(Model Context Protocol) 서버로 서빙하던 구현이 남아 있다(server.ts·tools/get-design-md.ts·tools/search-by-vibe.ts 등). README가 명시적으로 "은퇴했고, 아카이브로만 남는다"고 밝힌다 — 지금 스킬들은 로컬 카탈로그 파일 또는 oh-my-design.kr/<id>/design.md raw 라우트를 직접 읽지, MCP 서버를 거치지 않는다.

7설치·요구사항

별도 API 키 불필요 · Node 18+ · 채널별로 받는 것이 다르다
$ npx oh-my-design-cli@latest # 대화형 설치 (Project/Global 스코프 질문) $ npx oh-my-design-cli@latest doctor # 설치 상태 진단 + 정확한 복구 명령 출력 $ npx oh-my-design-cli@latest install-skills \ --agent claude-code --all # 비대화형(CI 등) 전체 설치 $ npx oh-my-design-cli@latest install-skills \ --skills claude-design --skills-only # 스킬 파일만 최소 설치
채널설치 위치받는 것
Claude Code.claude/스킬 20개 + 서브에이전트 18개 + 훅 + 데이터 — 전체 번들
Codex.agents/skills/ + .codex/{agents,data}/스킬 + 내장 서브에이전트 역할 + 로컬 카탈로그
OpenCode.opencode/{skills,agents,data}/ (전역은 ~/.config/opencode/…)스킬 + 네이티브 서브에이전트 + 카탈로그
Cursor.cursor/rules/omd-design.mdc규칙 파일 1개 + .claude/data 공유 카탈로그뿐 — 스킬·서브에이전트·훅 없음
주의
설치만으로 끝나지 않는다 — 재시작이 필수

설치 후 에이전트 앱을 완전히 재시작(Claude Code는 종료 후 재실행)해야 새로 생긴 스킬/훅 파일을 인식한다. 이후 doctor로 실제 파일 상태를 확인하는 습관을 들이라고 README가 강조한다.

업그레이드도 같은 명령(npx oh-my-design-cli@latest)을 다시 실행하면 되는데, sha256 마커 덕분에 관리 파일만 갱신되고 사용자가 손댄 파일은 그대로("skipped-drift") 유지된다.

8실제 사용 흐름

설치 → 첫 자연어 프롬프트 → omd:init 7단계 → DESIGN.md 커밋 → 이후 세션은 그 파일을 다시 읽는다
STEP 1

설치 + 진단

npx oh-my-design-cli@latest로 채널을 고르고, 에이전트 재시작 후 doctor로 확인한다.

STEP 2

슬래시 명령이 아니라 "그냥 말"로 시작

에이전트에게 예: "가족용 식단 관리 앱의 프로젝트 전용 DESIGN.md를 만들어줘. 토스를 레퍼런스로 쓰고, 검증된 사실만 남기고 제품 고유 사실은 먼저 물어봐줘." 라고 자연어로 요청한다. skill-activation.cjs 훅이 "DESIGN.md가 없고 UI 관련 요청 같다"고 판단되면 omd:init을 먼저 권하기도 한다.

STEP 3

omd:init의 7단계가 실행된다

맥락 질문 → 카탈로그에서 top-5 추천(Claude Code에서는 화살표로 고르는 AskUserQuestion UI) → 사용자가 하나 확정 → 원본 DESIGN.md 로드 → 브랜드 서사용 사실 확인 → 하이브리드 변형 작성 → omd:sync로 shim 3종 설치. 결과로 프로젝트 루트에 DESIGN.md, CLAUDE.md/AGENTS.md/Cursor rule이 생긴다.

STEP 4

이후 작업은 "그 파일을 다시 읽는" 방식으로 진행

다음 프롬프트부터는 "DESIGN.md 읽고 홈 화면 디자인해줘" 처럼 요청하면, 에이전트가 커밋된 파일을 Read해 톤을 재사용한다. 전체 화면을 새로 짤 때는 omd:harness, 사용자 선호를 기록해두려면 omd:remember, 완성도 감사는 omd:feel/omd:slop-audit/omd:final-qa 같은 나머지 스킬들이 이어받는다.

9함정·오해 방지

"MCP 서버"로 오해하기 · 없는 CLI 서브커맨드 상상하기 · 로직을 src/에서만 찾기
함정 1
packages/mcp/를 보고 "이게 현재 아키텍처구나" 오해

server.ts·tools/search-by-vibe.ts 같은 파일이 멀쩡히 남아 있어 MCP 서버가 지금도 동작 중이라 착각하기 쉽다. 하지만 README는 "옛 카탈로그 MCP 전송은 은퇴했다"고 못 박는다. 현재 스킬들은 로컬 파일 또는 raw markdown 라우트를 직접 읽는다 — MCP 서버를 거치지 않는다.

함정 2
스킬 이름의 콜론(omd:init) 때문에 CLI 서브커맨드가 있다고 착각

omd:init, omd:sync 같은 이름 때문에 omd init, omd sync 같은 CLI 명령이 있을 것 같지만 존재하지 않는다. bin/oh-my-design.ts가 실제로 노출하는 명령은 bare 설치기, install-skills, doctor 셋뿐이다. skills/omd-init/SKILL.md 자체에도 "omd init recommend·omd init prepare·omd sync처럼 존재하지 않는 CLI 서브커맨드를 호출하지 말 것"이라는 금지 문구가 박혀 있다 — 저장소가 스스로 이 오해를 경계한다는 점이 흥미롭다.

함정 3
"추천 알고리즘"을 TypeScript 함수로 찾으면 없다

레퍼런스 추천의 점수 계산(브랜드 힌트 +5점 등)은 src/ 어디에도 함수로 존재하지 않는다. 전부 skills/omd-init/SKILL.md 안의 산문 지시이고, 호스트 에이전트의 LLM이 그때그때 "머릿속으로" 계산한다. 결정론적으로 보이지만 실제 구현은 코드가 아니라 자연어 규칙이라는 점을 헷갈리면 안 된다.

함정 4
skills/(레포 소스)와 .claude/skills/(설치된 사본)는 바이트 단위로 동일하지 않다

실제로 diff해보면 두 omd-init/SKILL.md는 내용이 다르다 — 설치 과정에서 경로·마커가 채널에 맞게 조정되기 때문이다. "레포에 있는 스킬 파일 = 실제로 내 프로젝트에 깔리는 파일"이라고 단정하면 안 된다.

사실 확인
"440+ 레퍼런스"는 이 커밋 기준으로 정확히 440개

design-md/ 아래 디렉터리 수를 실제로 세어보면 정확히 440개(각각 DESIGN.md+README.md+.verification.md)로, README·배지의 "440+" 표기와 일치한다. 다만 이 숫자는 web/scripts/build-registry.mjs가 갱신하는 계속 늘어나는 값이므로, 이 문서를 나중에 다시 볼 때는 실제 값을 다시 확인하는 게 안전하다(참고로 이 딥다이브는 별점 수를 인용하지 않는다 — GitHub 스타는 변동성이 크고 이 문서의 근거 기준에 맞지 않는다).

10대안 비교

토큰 빌드 파이프라인 · 컴포넌트 킷 · 범용 스킬 마켓과 무엇이 다른가
대안oh-my-design과의 차이
Style Dictionary 등
토큰 빌드 도구
디자인 토큰을 여러 플랫폼 코드(CSS 변수, Swift, Android XML 등)로 빌드하는 데 집중한다. 브랜드 보이스·원칙·페르소나 같은 "왜 이 색인가" 서사는 다루지 않는다. oh-my-design은 그 서사까지 문서화해 에이전트가 읽게 한다.
shadcn/ui, MUI 등
컴포넌트 라이브러리
바로 쓸 수 있는 코드/컴포넌트를 준다. 특정 브랜드 톤을 강제하지 않는다. oh-my-design은 코드를 주지 않고, 코드를 짤 때 참고할 규칙 문서만 준다 — 서로 배타적이지 않고 같이 쓰인다.
범용 Claude Skills 마켓플레이스서로 무관한 스킬을 잡다하게 모아둔다. oh-my-design은 디자인 워크플로 하나에 특화돼 있고, 검증된 440개 레퍼런스라는 자체 데이터 자산을 함께 배포한다는 점이 다르다.
Figma / Google Stitch 등
비주얼 디자인 툴
사람이 눈으로 보며 반복하는 비주얼 산출물을 만든다. oh-my-design은 그 결과를 텍스트 규격(DESIGN.md, Stitch의 design-md 규격을 뼈대로 함)으로 옮겨 에이전트가 코드를 짜기 직전에 읽는 계약서로 쓴다 — 경쟁이 아니라 다음 단계에 가깝다.
손으로 쓴 CLAUDE.md/AGENTS.md 프롬프트가장 흔한 현실의 대안이지만 검증된 근거·드리프트 감지·다채널 동기화가 전혀 없다. oh-my-design은 이 수작업을 sha256 마커 기반 관리 파일 체계로 자동화한다.

11정리 — 누가 쓰면 좋은가

Claude Code/Codex/OpenCode/Cursor로 UI를 자주 만드는데, 매번 브랜드 톤이 흔들리는 사람

잘 맞는 경우

· 1인 개발자~소규모 팀이 "토스처럼", "Linear-clone" 같은 즉흥 지시에 의존해 왔고, 그 결과가 세션마다 달라지는 걸 겪어본 사람.

· 이미 구독 중인 코딩 에이전트만으로 끝내고 싶고, 별도 API 키·MCP 서버·인프라를 새로 관리하고 싶지 않은 사람.

· 팀 안에 서로 다른 에이전트(Claude Code, Codex, Cursor 등)를 쓰는 사람이 섞여 있어 규칙을 한 곳에서 관리하고 싶은 경우.

잘 안 맞는 경우

· 이미 성숙한 자체 디자인 토큰 파이프라인(Style Dictionary 등)과 디자인 시스템 문서를 갖춘 대규모 조직 — 역할이 겹치지 않고 오히려 이중 관리가 될 수 있다.

· Claude Code/Codex/OpenCode/Cursor 계열이 아닌 다른 코딩 도구만 쓰는 경우 — 채널 지원이 이 넷으로 한정돼 있다.

기술적으로 이 레포에서 가장 배울 만한 것은 화려한 알고리즘이 아니라 "신뢰를 어떻게 파일 시스템 수준에서 기계적으로 보장하는가"다 — sha256 마커로 관리 파일과 사용자 수정본을 구분하고, YAML 앵커로 토큰 값마다 출처를 추적하고, 스킬 자신이 스스로의 오남용(존재하지 않는 CLI 호출)을 금지 문구로 막는 방식. "AI를 위한 문서 하나가 이 정도로 엄격하게 설계될 수 있다"는 사례로 읽으면 유익하다.

12직접 해볼 수 있는 실습 과제

근거 읽기부터 변경 감지까지 — 로컬 소스만으로 워크플로의 판단 과정을 재현한다

아래 경로와 명령은 모두 레포 루트를 기준으로 합니다. 터미널 실습에는 rg(파일 내용 검색 도구)와 Node.js를 사용하며, 로컬 파일 읽기와 메모리 안의 값 비교로 진행합니다.

과제 1

토큰 하나의 근거를 끝까지 추적하기 입문

목표: 레퍼런스에 적힌 값과 그 값을 뒷받침하는 관찰 기록을 연결합니다.

  1. design-md/toss/DESIGN.md에서 색상·타이포·컴포넌트 관련 제목을 찾고, design-md/toss/.verification.md의 검증 기록을 읽습니다.
  2. 기본 동작 색상, 본문 글꼴, 버튼 상태를 하나씩 골라 두 문서에서 대응하는 설명을 찾습니다. 제품 화면과 마케팅 화면의 값은 적용 대상을 나누어 대조합니다.
  3. 각 항목을 “역할 → 값 또는 동작 → 적용 화면 → 근거가 있는 파일과 제목”으로 정리하고, 근거를 찾지 못한 부분은 미확인으로 남깁니다.
rg -n '^## |^### ' design-md/toss/DESIGN.md
cat design-md/toss/.verification.md

완료 기준: 세 항목 모두 근거 위치를 설명할 수 있고, 직접 관찰된 내용·문서 설명·미확인 내용을 구분한 대조표가 있어야 합니다.

과제 2

스킬 절차를 분기표로 바꾸기 중급

목표: 자연어로 적힌 절차에서도 입력·결과·중단 조건을 찾아냅니다.

  1. skills/omd-init/SKILL.md 전체를 읽고, 단계 제목과 선택·실패 관련 문장을 찾아 표시합니다.
  2. “가족용 식단 관리 앱의 DESIGN.md를 준비하고 싶다”는 가상 요청을 놓고, 맥락 확인·레퍼런스 선택·원문 확보·프로젝트 사실 확인·연결 파일 동기화에 필요한 입력과 결과를 정리합니다.
  3. 사용자가 중단하는 경우, 참고용 저장을 고르는 경우, 원문을 끝내 확보하지 못하는 경우를 각각 따라갑니다. 자동 작업은 실행하지 않고, 어느 단계에서 끝나며 어떤 결과가 남아야 하는지 문서와 대조합니다.
cat skills/omd-init/SKILL.md
rg -n '^## Phase|참고용|중단|찾지 못' skills/omd-init/SKILL.md

완료 기준: 정상 흐름 하나와 세 분기를 설명한 표가 있어야 합니다. 특히 원문 부재 시 내용을 지어내지 않는 처리와, 참고용 저장이 프로젝트 표준 적용과 다른 처리를 거친다는 점을 짚어야 합니다.

과제 3

채널 감지와 연결 파일의 역할 구분하기 중급

목표: 실행 중인 에이전트의 신호, 프로젝트에 남은 도구 흔적, DESIGN.md를 읽게 하는 연결 규칙을 구별합니다.

  1. src/core/agent-detect.ts에서 detectCallingAgent가 읽는 환경 변수와 detectInstalledAgents가 검사하는 경로를 각각 찾습니다.
  2. 가상의 프로젝트 다섯 개를 놓습니다. 감지 대상 경로가 없는 경우, .claude/만 있는 경우, AGENTS.md만 있는 경우, opencode.json만 있는 경우, .cursor/만 있는 경우입니다. 실제 파일을 만들지 않고 각 경우의 반환값을 예측한 뒤 테스트와 대조합니다.
  3. skills/omd-sync/SKILL.md를 읽고 CLAUDE.md·AGENTS.md·.cursor/rules/omd-design.mdc가 어떻게 DESIGN.md로 안내하는지 정리합니다. 관리 블록만 갱신하는 파일과 전체를 관리하는 파일도 나눕니다.
cat src/core/agent-detect.ts
cat test/unit/core/agent-detect.test.ts
cat skills/omd-sync/SKILL.md

완료 기준: 다섯 경우에 대한 채널 감지 결과와 연결 파일별 관리 범위를 설명할 수 있어야 합니다. 파일 존재로 얻은 신호만으로 해당 앱이 현재 실행 중이라고 단정해서는 안 됩니다.

과제 4

관리 훅의 변경 감지 원리 재현하기 심화

목표: 파일 내용의 지문인 해시가 변경을 드러내는 원리를 직접 확인합니다.

  1. src/cli/hook-contract.ts의 stripManagedHookMarker·renderManagedHook·isCurrentManagedHook를 읽습니다. 해시를 계산할 때 기존 마커를 제외하는 이유를 설명해 봅니다.
  2. 아래 명령으로 .claude/hooks/skill-activation.cjs를 텍스트로 읽고, 마커를 뺀 본문으로 기준 해시를 만듭니다. 이어서 같은 본문과 공백을 더한 메모리 복사본을 각각 비교합니다.
  3. src/cli/install-skills.ts에서 관리 훅의 갱신 판정을 찾아봅니다. “현재 배포 원본과 동일함”과 “기록된 해시와 본문이 서로 일치함”이 각각 무엇을 확인하는지 정리합니다.
node -e '
const { readFileSync } = require("node:fs");
const { createHash } = require("node:crypto");
const source = readFileSync(".claude/hooks/skill-activation.cjs", "utf8");
const raw = source.replace(/^\/\/ omd:installed-hook sha256=[0-9a-f]{64}\r?\n/m, "");
function hash(text) {
  return createHash("sha256").update(text).digest("hex");
}
const expected = hash(raw);
console.log("같은 본문:", expected === hash(raw));
console.log("공백 추가:", expected === hash(raw + " "));
'

이 예제는 훅을 실행하지 않고 파일 내용만 읽습니다. 기준 해시는 읽은 본문에서 새로 계산하므로, 원본에 적힌 기존 마커의 유효성을 검사하는 예제와는 구분해야 합니다.

완료 기준: 비교 결과가 차례로 true·false여야 합니다. 또한 내용이 온전한 구버전 파일도 현재 배포 원본과는 다를 수 있다는 점을 설명할 수 있어야 합니다.

13관련 기술 심화 학습 로드맵

다섯 주 동안 데이터·절차·도구 연결·변경 감지를 차례로 연결한다

매주 “개념을 자기 말로 설명하기 → 관련 소스 읽기 → 확인 가능한 결과물 만들기” 순서로 진행합니다. 테스트 파일은 입력과 기대 결과를 보여주는 예제집으로 읽고, 소스의 판단 근거를 함께 찾습니다.

주차·배울 개념이 레포에서 읽을 파일결과물
1주차
디자인 토큰과 근거
design-md/toss/DESIGN.md
design-md/toss/.verification.md
색상·글꼴·컴포넌트 상태의 근거 대조표. 값의 적용 화면과 미확인 범위를 함께 적습니다.
2주차
스킬과 상태 전이
skills/omd-init/SKILL.md
skills/omd-sync/SKILL.md
입력·출력·선택·중단 조건을 담은 흐름도. 초기 설정에서 연결 파일 관리로 넘어가는 경계를 표시합니다.
3주차
채널 감지와 연결 규칙
src/core/agent-detect.ts
test/unit/core/agent-detect.test.ts
skills/omd-sync/SKILL.md
환경 변수와 파일 존재 신호의 비교표, 연결 파일별 관리 범위표. 사용자 작성 내용을 보존할 영역도 표시합니다.
4주차
해시와 변경 감지
src/cli/hook-contract.ts
.claude/hooks/skill-activation.cjs
src/cli/install-skills.ts
원문과 메모리 복사본의 해시 비교 기록. 현재 버전과의 동일성 검사와 자체 해시 일치 검사를 구별합니다.
5주차
진단과 반복 실행
src/cli/doctor.ts
test/unit/cli/doctor.test.ts
test/unit/cli/install-skills.test.ts
설치 누락·사용자 수정·다시 설치하는 상황의 기대 동작표. 각 판단을 뒷받침하는 테스트 이름과 소스 위치를 붙입니다.

마지막에는 “같은 설치를 반복해도 불필요한 변경이 없어야 한다”와 “사용자가 고친 내용을 구별해야 한다”는 요구를 각각 어떤 코드와 테스트가 맡는지 연결해 보세요. 이 연결표가 있으면 다른 설치기나 설정 동기화 도구도 같은 관점으로 읽을 수 있습니다.

14핵심 키워드 사전

문서가 규칙이 되고, 규칙이 여러 도구에 전달되는 과정을 이해하기 위한 용어
DESIGN.md
프로젝트의 디자인 판단을 글로 남긴 규칙서입니다. 이 레포에서는 색상·글꼴 같은 값과 보이스·원칙 같은 설명을 함께 담아, 에이전트가 UI 작업 전에 읽는 계약서로 사용합니다.
디자인 토큰
색상·글자 크기·간격처럼 반복해서 쓰는 디자인 값에 이름을 붙인 것입니다. 이 레포의 레퍼런스 문서는 그 값의 역할과 적용 대상을 함께 읽을 수 있는 출발점입니다.
YAML 프런트매터
마크다운 문서 맨 앞에서 ---로 감싸는 구조화된 정보 영역입니다. skills/omd-init/SKILL.md에서는 스킬 이름과 설명을, 레퍼런스 DESIGN.md에서는 색상·타이포 같은 데이터를 확인할 수 있습니다.
레퍼런스
디자인 결정을 할 때 근거와 방향을 얻는 참고 자료입니다. design-md/toss/처럼 기업별로 묶인 문서를 읽을 때는 해당 기업의 확인된 사실과 내 프로젝트에 적용할 판단을 구분합니다.
근거 추적
“이 값은 어디서, 어떻게 확인했는가”를 되짚을 수 있도록 기록을 연결하는 일입니다. 이 레포에서는 레퍼런스의 .verification.md를 대조해 관찰 대상·방법·시점과 확인 범위를 읽을 수 있습니다.
스킬
에이전트가 특정 일을 수행할 때 따라가는 작업 절차서입니다. skills/omd-init/SKILL.md처럼 마크다운으로 적힌 질문·선택·실패 처리 규칙도 실제 동작을 결정하므로 코드와 함께 읽어야 합니다.
호스트 에이전트
스킬을 읽고 판단하며 파일 작업을 수행하는 코딩 에이전트입니다. 이 레포에서는 Claude Code·Codex 같은 사용자의 기존 도구가 그 역할을 맡고, 스킬 문서는 수행할 절차를 제공합니다.
채널
규칙과 자료를 전달할 대상 도구를 구분하는 이름입니다. src/core/agent-detect.ts는 환경 변수와 프로젝트 경로를 살펴 채널을 판단할 신호를 찾습니다.
shim — 연결 규칙
각 도구가 읽는 지시 파일에서 DESIGN.md로 안내하는 표지판 같은 규칙입니다. skills/omd-sync/SKILL.md는 CLAUDE.md·AGENTS.md·Cursor 규칙 파일의 연결 내용을 관리합니다.
훅
정해진 사건이 발생했을 때 자동으로 실행되는 보조 프로그램입니다. .claude/hooks/skill-activation.cjs는 DESIGN.md 존재 여부와 UI 관련 요청을 살펴 초기 설정 안내가 필요한지 판단합니다.
SHA-256 해시
내용을 일정한 길이의 지문으로 바꾸는 계산 방식으로, 공백 하나가 달라져도 비교 결과가 달라질 수 있습니다. src/cli/hook-contract.ts는 관리 훅의 본문으로 해시를 만들어 마커에 기록합니다.
드리프트
관리하던 내용이 기준에서 벗어난 상태를 뜻합니다. 이 레포에서는 훅이나 연결 파일의 변경을 판별해, 배포본 갱신과 사용자 수정 내용의 처리를 결정하는 데 사용합니다.
상태 전이
현재 단계와 입력에 따라 다음 단계가 달라지는 흐름입니다. skills/omd-init/SKILL.md의 사용자 선택·참고용 저장·중단 경로를 표로 옮기면 자연어 절차도 이 관점으로 이해할 수 있습니다.
멱등성
같은 작업을 반복해도 이미 맞춰진 결과가 불필요하게 바뀌지 않는 성질입니다. test/unit/cli/install-skills.test.ts에는 다시 설치했을 때 기존 스킬 파일의 수정 시각이 유지되는지 확인하는 사례가 있습니다.