oh-my-design-cli 1.3.9 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.ja.md +8 -8
  2. package/README.ko.md +7 -7
  3. package/README.md +50 -16
  4. package/README.zh-TW.md +8 -8
  5. package/agents/omd-asset-curator.md +2 -7
  6. package/agents/omd-codex-image.md +49 -0
  7. package/agents/omd-designer-review.md +38 -0
  8. package/agents/omd-final-qa.md +40 -0
  9. package/agents/omd-kr-writer.md +35 -0
  10. package/agents/omd-locale-adapter.md +32 -0
  11. package/agents/omd-master.md +3 -13
  12. package/agents/omd-orchestrator.md +34 -0
  13. package/data/reference-audits/2026-05-14-kr10.md +72 -0
  14. package/data/reference-audits/2026-05-15-kr10.md +124 -0
  15. package/data/reference-fingerprints.json +253 -3
  16. package/data/research/2026-05-18-agent-landscape.md +69 -0
  17. package/data/research/2026-05-18-kr-style-presets.md +572 -0
  18. package/dist/bin/oh-my-design.js +6 -3
  19. package/dist/bin/oh-my-design.js.map +1 -1
  20. package/dist/{install-skills-MVXVXYAY.js → install-skills-IETT2TBJ.js} +91 -8
  21. package/dist/install-skills-IETT2TBJ.js.map +1 -0
  22. package/package.json +9 -3
  23. package/skills/omd-apply/SKILL.md +0 -1
  24. package/skills/omd-codex-image/SKILL.md +162 -0
  25. package/skills/omd-designer-review/SKILL.md +146 -0
  26. package/skills/omd-final-qa/SKILL.md +153 -0
  27. package/skills/omd-kr-writer/SKILL.md +229 -0
  28. package/skills/omd-locale-adapter/SKILL.md +124 -0
  29. package/skills/omd-orchestrator/SKILL.md +124 -0
  30. package/web/references/29cm/DESIGN.md +11 -2
  31. package/web/references/ably/DESIGN.md +12 -2
  32. package/web/references/airbnb/DESIGN.md +17 -2
  33. package/web/references/airtable/DESIGN.md +20 -0
  34. package/web/references/apple/DESIGN.md +17 -2
  35. package/web/references/baemin/DESIGN.md +11 -2
  36. package/web/references/banksalad/DESIGN.md +17 -2
  37. package/web/references/bmw/DESIGN.md +14 -0
  38. package/web/references/bunjang/DESIGN.md +308 -0
  39. package/web/references/cal/DESIGN.md +14 -0
  40. package/web/references/catchtable/DESIGN.md +262 -0
  41. package/web/references/channeltalk/DESIGN.md +374 -0
  42. package/web/references/classum/DESIGN.md +217 -0
  43. package/web/references/claude/DESIGN.md +11 -2
  44. package/web/references/clay/DESIGN.md +19 -0
  45. package/web/references/clickhouse/DESIGN.md +19 -0
  46. package/web/references/cohere/DESIGN.md +20 -0
  47. package/web/references/coinbase/DESIGN.md +14 -0
  48. package/web/references/composio/DESIGN.md +14 -0
  49. package/web/references/coupang/DESIGN.md +17 -2
  50. package/web/references/cursor/DESIGN.md +20 -0
  51. package/web/references/dabang/DESIGN.md +210 -0
  52. package/web/references/dcard/DESIGN.md +11 -2
  53. package/web/references/elevenlabs/DESIGN.md +20 -0
  54. package/web/references/expo/DESIGN.md +20 -0
  55. package/web/references/fastcampus/DESIGN.md +460 -0
  56. package/web/references/ferrari/DESIGN.md +14 -0
  57. package/web/references/figma/DESIGN.md +17 -2
  58. package/web/references/flex/DESIGN.md +309 -0
  59. package/web/references/framer/DESIGN.md +20 -0
  60. package/web/references/freee/DESIGN.md +16 -2
  61. package/web/references/gangnamunni/DESIGN.md +18 -2
  62. package/web/references/gmarket/DESIGN.md +464 -0
  63. package/web/references/hashicorp/DESIGN.md +19 -0
  64. package/web/references/ibm/DESIGN.md +20 -0
  65. package/web/references/inflearn/DESIGN.md +396 -0
  66. package/web/references/intercom/DESIGN.md +14 -0
  67. package/web/references/jumpit/DESIGN.md +366 -0
  68. package/web/references/kakao/DESIGN.md +14 -0
  69. package/web/references/kakaobank/DESIGN.md +17 -2
  70. package/web/references/kakaopay/DESIGN.md +17 -2
  71. package/web/references/karrot/DESIGN.md +16 -2
  72. package/web/references/kbank/DESIGN.md +195 -0
  73. package/web/references/kraken/DESIGN.md +14 -0
  74. package/web/references/krds/DESIGN.md +17 -2
  75. package/web/references/kream/DESIGN.md +382 -0
  76. package/web/references/kurly/DESIGN.md +11 -2
  77. package/web/references/lamborghini/DESIGN.md +14 -0
  78. package/web/references/line/DESIGN.md +17 -2
  79. package/web/references/linear.app/DESIGN.md +17 -2
  80. package/web/references/lovable/DESIGN.md +14 -0
  81. package/web/references/lunit/DESIGN.md +249 -0
  82. package/web/references/mercari/DESIGN.md +11 -2
  83. package/web/references/minimax/DESIGN.md +14 -0
  84. package/web/references/mintlify/DESIGN.md +14 -0
  85. package/web/references/miro/DESIGN.md +20 -0
  86. package/web/references/mistral.ai/DESIGN.md +20 -0
  87. package/web/references/mongodb/DESIGN.md +19 -0
  88. package/web/references/musinsa/DESIGN.md +11 -2
  89. package/web/references/naver/DESIGN.md +17 -2
  90. package/web/references/notion/DESIGN.md +11 -2
  91. package/web/references/nvidia/DESIGN.md +11 -2
  92. package/web/references/ohouse/DESIGN.md +11 -2
  93. package/web/references/oliveyoung/DESIGN.md +342 -0
  94. package/web/references/ollama/DESIGN.md +14 -0
  95. package/web/references/opencode.ai/DESIGN.md +20 -0
  96. package/web/references/pinkoi/DESIGN.md +11 -2
  97. package/web/references/pinterest/DESIGN.md +19 -0
  98. package/web/references/posthog/DESIGN.md +20 -0
  99. package/web/references/qanda/DESIGN.md +11 -2
  100. package/web/references/raycast/DESIGN.md +19 -0
  101. package/web/references/remember/DESIGN.md +17 -2
  102. package/web/references/renault/DESIGN.md +14 -0
  103. package/web/references/replicate/DESIGN.md +14 -0
  104. package/web/references/resend/DESIGN.md +20 -0
  105. package/web/references/revolut/DESIGN.md +14 -0
  106. package/web/references/ridi/DESIGN.md +11 -2
  107. package/web/references/runwayml/DESIGN.md +14 -0
  108. package/web/references/sanity/DESIGN.md +20 -0
  109. package/web/references/sentry/DESIGN.md +14 -0
  110. package/web/references/socar/DESIGN.md +17 -2
  111. package/web/references/spacex/DESIGN.md +11 -2
  112. package/web/references/spotify/DESIGN.md +14 -0
  113. package/web/references/stripe/DESIGN.md +11 -2
  114. package/web/references/supabase/DESIGN.md +20 -0
  115. package/web/references/superhuman/DESIGN.md +20 -0
  116. package/web/references/tesla/DESIGN.md +11 -2
  117. package/web/references/together.ai/DESIGN.md +20 -0
  118. package/web/references/toss/DESIGN.md +16 -2
  119. package/web/references/toss-securities/DESIGN.md +193 -0
  120. package/web/references/tving/DESIGN.md +259 -0
  121. package/web/references/uber/DESIGN.md +19 -0
  122. package/web/references/upbit/DESIGN.md +276 -0
  123. package/web/references/upstage/DESIGN.md +214 -0
  124. package/web/references/vercel/DESIGN.md +17 -2
  125. package/web/references/voltagent/DESIGN.md +14 -0
  126. package/web/references/wadiz/DESIGN.md +344 -0
  127. package/web/references/wanted/DESIGN.md +16 -2
  128. package/web/references/warp/DESIGN.md +14 -0
  129. package/web/references/webflow/DESIGN.md +14 -0
  130. package/web/references/wise/DESIGN.md +19 -0
  131. package/web/references/x.ai/DESIGN.md +14 -0
  132. package/web/references/yanolja/DESIGN.md +17 -2
  133. package/web/references/yeogiotte/DESIGN.md +18 -2
  134. package/web/references/zapier/DESIGN.md +20 -0
  135. package/web/references/zigbang/DESIGN.md +12 -2
  136. package/web/references/zigzag/DESIGN.md +17 -2
  137. package/agents/omd-3d-blender.md +0 -269
  138. package/dist/install-skills-MVXVXYAY.js.map +0 -1
@@ -0,0 +1,153 @@
1
+ ---
2
+ name: omd:final-qa
3
+ description: "출간 ready 직전 read-only critic. 8-item rubric 강제. 'looks good' rubber-stamp 금지. 라인 ref 필수. 2-round revision hard cap. '최종 QA', '출간 검수', 'rubric으로 평가' 류 트리거."
4
+ user-invocable: true
5
+ ---
6
+
7
+ # omd:final-qa
8
+
9
+ artifact가 사용자에게 handoff 되기 전 마지막 게이트. **read-only**. 절대 수정하지 않고, verdict + actionable feedback만 emit.
10
+
11
+ ## 0. 입력
12
+
13
+ - `artifact_paths`: 모든 locale 파일 (예: `index.ko.md`, `index.en.md`)
14
+ - `design_md_path`: brand DESIGN.md
15
+ - `prior_reviews`: designer-review 보고서 경로 (있으면)
16
+ - `voice_preset`: kr-writer가 사용한 preset_id
17
+ - `round`: 1 또는 2 (orchestrator가 주입)
18
+
19
+ ## 1. Rubric (9 items, 모두 closed checklist)
20
+
21
+ 각 항목은 **PASS / FAIL** 이진. 회색 zone 없음. 1개라도 FAIL이면 verdict = REVISION (round 1) 또는 BLOCK (round 2).
22
+
23
+ ### [1] Brand consistency
24
+ - DESIGN.md의 §Color/§Typography/§Spacing 토큰이 artifact에 사용됨
25
+ - DESIGN.md에 없는 hex/font/spacing 직접 사용 0건
26
+ - 검증: artifact 내 모든 토큰값 추출 → DESIGN.md set과 diff
27
+
28
+ ### [2] Typography hierarchy
29
+ - h1 1개, h2 ≥2개, h3는 h2 자식으로만
30
+ - 빈 level skip 0건 (h1→h3 금지)
31
+ - 본문 weight 일관
32
+
33
+ ### [3] Voice register
34
+ - 선언된 `voice_preset` 룰 준수 (예: toss-tech-design이면 `-요` 종결 100%)
35
+ - 금지 어미 0건 (preset spec 참조)
36
+ - 평균 문장 길이가 preset 범위 내
37
+
38
+ ### [4] Image / figure
39
+ - 모든 `<img>` / `![]()`에 alt 텍스트 존재
40
+ - caption (figcaption 또는 figure 옆 짧은 설명) 존재
41
+ - alt와 caption이 다름 (alt=설명, caption=맥락)
42
+ - src 경로 valid (파일 존재)
43
+
44
+ ### [5] Cross-locale parity
45
+ - KR이 N H2 → 다른 locale도 N H2
46
+ - KR이 N figure → 다른 locale도 N figure
47
+ - frontmatter `source_revision` 최신
48
+
49
+ ### [6] Accessibility
50
+ - 대비비 AA 충족 (text/bg 4.5:1, large 3:1)
51
+ - focus state 정의됨 (CSS 또는 컴포넌트)
52
+ - semantic HTML (button vs div, nav, main, article)
53
+ - 한국어 본문에 `lang="ko"`
54
+
55
+ ### [7] Performance
56
+ - 이미지가 적정 크기 (>500KB 단일 이미지 = FAIL)
57
+ - 코드 블록에 lang 태그 (` ```ts `, ` ```python `)
58
+ - 외부 폰트 로드 시 `font-display: swap`
59
+
60
+ ### [8] Links
61
+ - 모든 hyperlink HTTP 200 (브로큰 0건). 외부 링크 체크는 best-effort.
62
+ - 외부 링크에 indicator (icon 또는 `target="_blank" rel="noopener"`)
63
+ - relative path 일관
64
+
65
+ > 한국어 표기/맞춤법은 이 rubric의 자동 항목이 아니다. 자동 검사가 필요하면
66
+ > 외부 서비스(예: 부산대 한국어 맞춤법 검사기)를 작성자가 별도로 돌린다 —
67
+ > 번들된 결정론적 도구는 없다.
68
+
69
+ ## 2. Anti-rubber-stamp guardrails
70
+
71
+ - "looks good", "전반적으로 OK", "전체적으로 괜찮음" 등 문구 hard-banned. 사용 시 self-reject.
72
+ - 각 PASS도 **왜 PASS인지 1줄 evidence** 필수.
73
+ - 각 FAIL은 **라인 ref + verbatim quote + fix direction** 필수.
74
+ - DESIGN.md를 강제 재read. 캐시된 기억 사용 금지. Report 헤더에 `design_md_read_at` ISO timestamp 명시.
75
+
76
+ ## 3. 2-round hard cap
77
+
78
+ ```
79
+ round 1:
80
+ rubric FAIL → verdict = REVISION
81
+ → orchestrator가 writer로 송환
82
+ round 2:
83
+ rubric FAIL → verdict = BLOCK
84
+ → orchestrator가 사용자 escalation
85
+ ```
86
+
87
+ 3번째 round 금지. 사용자가 강제 통과 결정 시 known-issues로 frontmatter 기록 후 ship.
88
+
89
+ ## 4. 출력 형식
90
+
91
+ `<work_dir>/.reviews/final-qa-round-<N>.md`:
92
+
93
+ ```markdown
94
+ # Final QA — round <N>
95
+
96
+ **Date:** <ISO>
97
+ **Artifacts:** <list>
98
+ **DESIGN.md read at:** <ISO>
99
+ **Voice preset:** <preset_id>
100
+
101
+ ## Rubric
102
+
103
+ | # | Item | Verdict | Evidence |
104
+ |---|---|---|---|
105
+ | 1 | Brand consistency | PASS | DESIGN.md 12 tokens 모두 사용. 추가 hex 0건. |
106
+ | 2 | Typography hierarchy | FAIL | `index.ko.md:88` h2 → h4 skip. h3 누락. |
107
+ | 3 | Voice register | PASS | 종결어미 `-요` 198/198 (100%). |
108
+ | 4 | Image / figure | FAIL | `index.ko.md:34` alt 텍스트 누락. |
109
+ | 5 | Cross-locale parity | PASS | KR 6 H2 = EN 6 H2. |
110
+ | 6 | Accessibility | PASS | 대비비 7.1:1. focus-visible 정의됨. |
111
+ | 7 | Performance | PASS | 모든 이미지 < 200KB. |
112
+ | 8 | Links | PASS | 23 link, broken 0. |
113
+
114
+ ## Failed items detail
115
+
116
+ ### [2] Typography hierarchy — h-level skip
117
+ - Location: `index.ko.md:88`
118
+ - Evidence: `## 가져가도 좋은 것` → 다음에 `#### 1. 토큰` (h4)
119
+ - Fix: h3로 변경
120
+
121
+ ### [4] alt 텍스트
122
+ - Location: `index.ko.md:34`
123
+ - Evidence: `![](./images/karrot-hero.png "당근 메인")`
124
+ - Fix: alt 채움. 예: `![당근 메인 화면 스크린샷](./images/karrot-hero.png "당근 메인")`
125
+
126
+ ## Verdict
127
+
128
+ **REVISION** (round 1) — 2 items FAIL. Writer로 송환.
129
+
130
+ 다음 round에서 동일 항목 FAIL 시 BLOCK.
131
+ ```
132
+
133
+ ## 5. Anti-patterns
134
+
135
+ - ❌ "looks good" / "괜찮음" 류 응답 — hard ban
136
+ - ❌ Evidence 없는 PASS
137
+ - ❌ Line ref 없는 FAIL
138
+ - ❌ Severity / verdict 회피 (애매한 "약간 우려" 금지 → PASS 또는 FAIL)
139
+ - ❌ 직접 수정 시도 (read-only 원칙)
140
+ - ❌ Rubric 추가/삭제 (8 items은 고정. 추가는 별도 PR로 SKILL.md 갱신.)
141
+ - ❌ DESIGN.md를 한 번 읽고 round 2에서 재사용
142
+
143
+ ## 6. Rubric 확장 (메타)
144
+
145
+ 새 rubric item 추가는:
146
+ 1. 이 SKILL.md에 [9] 이상으로 추가
147
+ 2. 한국어 closed PASS/FAIL 정의
148
+ 3. orchestrator의 round-cap에 영향 없음 (rubric 늘어도 cap=2 유지)
149
+
150
+ ## 7. Cross-skill 의존
151
+
152
+ - `omd-designer-review` 보고서 ← `prior_reviews`로 참조 (해소 여부 확인)
153
+ - `omd-locale-adapter` 결과물 ← rubric [5]에서 검증
@@ -0,0 +1,229 @@
1
+ ---
2
+ name: omd:kr-writer
3
+ description: "한국어 글쓰기 멀티-preset 스킬. 12개 preset 지원 — toss-tech-design (default) / karrot-neighborly / brunch-maker-popular / naver-d2-engineering / biz-formal-report / academic-paper / journalism-broadsheet / kakao-warm-product / line-global-saas / academic-lecture-essay / emotional-brand / legal-disclosure. '한글 글 작성', 'KR rewrite', '토스 톤으로', '당근 톤으로', '브런치 톤으로', '보고서로 써줘', '학술 톤', '신문기사체' 류 트리거."
4
+ user-invocable: true
5
+ ---
6
+
7
+ # omd:kr-writer
8
+
9
+ oh-my-design의 한국어 본문 작성 스킬. **preset_id 인자**로 6개 voice 중 선택.
10
+
11
+ ## 0. preset_id 인자
12
+
13
+ 호출 envelope:
14
+
15
+ ```yaml
16
+ agent: omd-kr-writer
17
+ inputs:
18
+ preset_id: toss-tech-design # 또는 아래 6개
19
+ task: "당근 디자인 분석 글 작성"
20
+ ...
21
+ ```
22
+
23
+ 지원 preset 12개. **자세한 9-field spec + verbatim 한국어 examples**: `data/research/2026-05-18-kr-style-presets.md`
24
+
25
+ | # | preset_id | 종결 | 분량 (한글) | 용도 |
26
+ |---|---|---|---|---|
27
+ | 1 | `toss-tech-design` ⭐ (default) | 해요체 -요 | 5,500~7,000자 | omd 블로그 본문, 디자인 deep-dive |
28
+ | 2 | `karrot-neighborly` | 해요체 + 동네 lexicon | 3,000~5,000자 | 마케팅, 커뮤니티 글 |
29
+ | 3 | `brunch-maker-popular` | 해요체 80% + 회상 `-했다` | 4,000~6,000자 | 회고, 포스트모템, 메이커 에세이 |
30
+ | 4 | `naver-d2-engineering` | 해요체 + 격식 mix | 자유 | 엔지니어링 분석 글 |
31
+ | 5 | `biz-formal-report` | 하십시오체 -습니다 | 자유 | 보고서·기획서·BRD |
32
+ | 6 | `academic-paper` | 해라체 `-한다`/`-이다` | 자유 | 학술 논문, 연구 노트 |
33
+ | 7 | `journalism-broadsheet` | 해라체 `-다`/`-했다` | 자유 | 보도자료, 신문기사 |
34
+ | 8 | `kakao-warm-product` | 해요체 + 감정 표현 | 자유 | 카카오톡·카카오뱅크 in-app copy |
35
+ | 9 | `line-global-saas` | 해요체 + 다국어 친화 | 자유 | 한일 brand voice, 글로벌 SaaS |
36
+ | 10 | `academic-lecture-essay` | 해요체 + 학술 lexicon | 자유 | 교양 강연, 지식 에세이 |
37
+ | 11 | `emotional-brand` | 해요체 + 외래어 자유 | 자유 | 무신사·29CM 패션 커머스 |
38
+ | 12 | `legal-disclosure` | 하십시오체 + 한자어 | 자유 | 법무·약관·고지사항 |
39
+
40
+ **호출 시 preset 미지정 → `toss-tech-design` 적용.**
41
+
42
+ 본 문서의 § 1~8은 default preset (`toss-tech-design`)의 상세 spec. 다른 preset 선택 시 research doc의 해당 section 룰로 substitution.
43
+
44
+ ### 전환 매트릭스 (자주 쓰는 6개)
45
+
46
+ 같은 콘텐츠를 다른 preset으로 옮길 때 standard rewrite 룰. 자세한 5-step rule은 research doc §14 참조.
47
+
48
+ | from | to | 핵심 변환 |
49
+ |---|---|---|
50
+ | `biz-formal-report` | `toss-tech-design` | `-합니다`→`-해요` · 한자어 풀이 · 50자+ 문장 쪼개기 · 3인칭→1인칭 |
51
+ | `toss-tech-design` | `biz-formal-report` | `-요`→`-니다` · 인사 제거 · 섹션 번호 (1.1) · 한자어 회복 |
52
+ | `academic-paper` | `toss-tech-design` | `-한다`→`-해요` · `우리는`→`저는` · 인용 형식 인라인 |
53
+ | `karrot-neighborly` | `toss-tech-design` | "동네" lexicon 제거 · 분석 voice 강화 · 5,500자+ |
54
+ | `journalism-broadsheet` | `toss-tech-design` | `-다`→`-요` · OOO 대표 said → 직접 quote · narrative 1인칭 |
55
+ | `legal-disclosure` | `kakao-warm-product` | 한자어 → 우리말 · 수동 → 능동 · 친근 어휘 보강 |
56
+
57
+ ### 한국어 어말어미 — 6단계 speech level
58
+
59
+ | 단계 | 격식 | 친근 | 종결예 | preset 매핑 |
60
+ |---|---|---|---|---|
61
+ | 하십시오체 | ✓ | ✗ | -습니다 | biz-formal / legal |
62
+ | 하오체 | ✓ | ✗ | -오, -소 | (구식, 거의 안 씀) |
63
+ | 하게체 | △ | △ | -네, -게 | (구식, 윗사람→아랫사람) |
64
+ | 해라체 | ✗ | ✗ | -다, -한다 | academic / journalism |
65
+ | 해요체 ⭐ | △ | ✓ | -요, -아요 | toss / karrot / kakao / brunch / line / lecture / emotional |
66
+ | 해체 (반말) | ✗ | ✓✓ | -아, -이야 | (사용 안 함 — disrespectful) |
67
+
68
+ omd 디폴트는 **해요체**. 격식이 필요하면 하십시오체. 학술/뉴스만 해라체. 그 외 모든 경우 해요체.
69
+
70
+ ---
71
+
72
+ ## Default preset (toss-tech-design)
73
+
74
+ oh-my-design 블로그의 한국어 본문을 **Toss Tech 디자인 카테고리** 수준의 voice로 작성. Brunch와 당근 미디엄도 보조 참고.
75
+
76
+ ## 1. Voice DNA — 한국 디자인 블로그 명문 공통 패턴
77
+
78
+ ### 첫 단락 fingerprint (변형 가능)
79
+
80
+ ```
81
+ 안녕하세요. [본인 직무] [본인 이름]이에요.
82
+ 저는 [구체적인 업무]를 담당하고 있어요.
83
+ [배경 1-2 문장 — 어떤 상황에서 어떤 미션을 받았는지].
84
+ 오늘은 [주제]를 나눠보려고 해요.
85
+ ```
86
+
87
+ oh-my-design용 변형:
88
+ ```
89
+ 안녕하세요. oh-my-design을 만드는 [이름]이에요.
90
+ 107개 브랜드의 디자인 시스템을 라이브로 캡쳐해서 카탈로그로 모으고 있어요.
91
+ 오늘은 그 중 [브랜드]를 들여다본 이야기를 나누려고 해요.
92
+ ```
93
+
94
+ ### 종결 어미 룰
95
+
96
+ | 사용 | 빈도 |
97
+ |---|---|
98
+ | `-요` | **100%** (default) |
99
+ | `-했어요`, `-있어요`, `-거예요`, `-네요` | 자주 |
100
+ | `-아요`, `-이에요` | 자주 |
101
+ | `-습니다`, `-는다`, `-한다` | **금지** (관공서 톤) |
102
+ | `-입니다`, `-합니다` | **금지** |
103
+
104
+ ### 문장 호흡
105
+
106
+ - **평균 35~50자/문장**. 80자+ 문장 = 쪼개기.
107
+ - 두 문장 연결: `~했고, ~했어요.` → 가급적 `~했어요. ~했어요.` 두 문장으로.
108
+ - 접속사 `그리고`/`그래서`/`그런데` 남발 금지. 단락 이행은 새 단락으로.
109
+ - 감탄/조사 `~네요`, `~죠`, `~인가요?` 적절히 — 글이 살아남.
110
+
111
+ ### 단락 길이
112
+
113
+ - **평균 3~5 문장 / 단락**. 80자+ 단락 = 쪼개기.
114
+ - 한 줄 단락 OK — 강조용.
115
+ - 글 전체에서 80% 이상이 짧은 단락.
116
+
117
+ ### 첫 인사 + 마지막 인사
118
+
119
+ ```
120
+ 시작: "안녕하세요. ~이에요."
121
+ 마무리:
122
+ - "여기까지 [주제]에 대해 나눠봤어요."
123
+ - "혹시 [관련 질문]이 있다면 댓글로 남겨주세요."
124
+ - "다음 글에서는 [다음 주제]를 들고 올게요."
125
+ ```
126
+
127
+ ## 2. 구조 템플릿 — 디자인 시스템 분석 글
128
+
129
+ ### 한국어 H2 헤더 패턴
130
+
131
+ 영문 식 `## Insight 1 — OKLCH-based perceptual color scaling` 같은 무거운 헤더는 금지. 한국어는 **짧고 호흡감 있게**.
132
+
133
+ | 영문 패턴 | 한국어 변환 |
134
+ |---|---|
135
+ | `## 1. A short history of "the Toss feel"` | `## 토스 느낌의 시작` |
136
+ | `## 2. The atmosphere — calm, confident, deceptively simple` | `## 화면을 열면 흰 캔버스` |
137
+ | `## 3. Insight 1 — OKLCH-based perceptual color scaling` | `## 토스는 색을 수학으로 정의해요` |
138
+ | `## 4. What to steal` | `## 가져가도 좋은 것` |
139
+ | `## 5. What NOT to steal` | `## 따라하면 안 되는 것` |
140
+
141
+ 원칙: 헤더는 **3~12자**. 문장형 OK, 호기심 유발 OK, 결론 spoiler OK.
142
+
143
+ ### 권장 글 구조 (5,500자+ 목표)
144
+
145
+ 1. **인사 + 글 소개** (~300자) — 안녕하세요 인사 + 오늘 분석할 브랜드 소개 + 어떻게 분석했는지
146
+ 2. **브랜드 배경** (~600자) — 회사 역사 짧게, 디자인이 왜 지금처럼 됐는지
147
+ 3. **첫 인상 — 화면을 열면** (~700자) — 시각 톤, 색, 타입, 첫 느낌
148
+ 4. **인사이트 1** (~700자) — 발견 1개, 왜 중요한지, 어떻게 따라할지
149
+ 5. **인사이트 2** (~700자)
150
+ 6. **인사이트 3** (~700자)
151
+ 7. **인사이트 4** (~700자)
152
+ 8. **인사이트 5** (~600자) — 더 짧아도 OK
153
+ 9. **가져가도 좋은 것** (~400자) — 5개 정리 (불릿 OK)
154
+ 10. **따라하면 안 되는 것** (~400자) — 5개 정리
155
+ 11. **마무리 + CTA** (~200자) — MCP 설치, design-system 페이지 링크
156
+
157
+ 목표: **5,500자~7,000자** (한국어, 공백 제외).
158
+
159
+ ## 3. 이미지/figure 정책
160
+
161
+ Toss 글은 단락 2~3개 당 이미지 1개. oh-my-design 본문에서:
162
+
163
+ - **헤로 이미지**: 글 첫머리, 브랜드 색감 + 타이포 한 컷
164
+ - **인사이트 1~5 각**: 1~2개 이미지 (스크린샷 / 다이어그램 / 컬러 그리드)
165
+ - **figcaption 짧게**: "토스 송금 화면" / "OKLCH 컬러 그리드" / "토스 vs KB의 헤로 비교"
166
+ - **alt 텍스트는 단순한 설명만** — figcaption과 다른 정보
167
+
168
+ 이미지가 부족한 경우:
169
+ - 라이브 캡쳐 (browser-harness로 brand site 스크린샷)
170
+ - CSS 비주얼 컴포넌트 (ColorSwatchGrid, TypeSample 등)
171
+ - 다이어그램 (인라인 SVG, primitive → semantic → component 같은 토큰 트리)
172
+
173
+ ## 4. 인사이트 본문 패턴
174
+
175
+ 각 인사이트는 다음 4 단락 구조 권장:
176
+
177
+ 1. **현상 단락**: "토스를 열면 이상한 게 있어요. ~" — 호기심 hook
178
+ 2. **데이터 단락**: "실제로 CSS 번들을 뜯어보니, ~ 81번 등장하더라구요." — 숫자/증거
179
+ 3. **이유 단락**: "왜 이렇게 했을까요? ~" — 디자인 thesis
180
+ 4. **적용 단락**: "여러분 작업에 가져가려면, ~" — actionable
181
+
182
+ ## 5. 안티패턴 (절대 금지)
183
+
184
+ - ❌ `-습니다`, `-한다`, `-할 것이다` 등 격식체
185
+ - ❌ `~할 수 있다` 식 가능형 남발 → `~할 수 있어요`
186
+ - ❌ 영어를 한글로 번역만 한 듯한 문장 (`이것은 우리가 만든 시스템이다` — X. `우리가 만든 시스템이에요.` — O)
187
+ - ❌ 영문 인용 부호 그대로 (`"trust comes from clarity"`) → `"신뢰는 깊이가 아니라 명확함에서 온다"` (한글 번역 + 영문 옆에 작게)
188
+ - ❌ 머리말 `## 1. 인사이트 1 — Insight 1: OKLCH-based ~` 식 형식적 헤더
189
+ - ❌ 마지막에 "감사합니다." 한 줄 → 톤 깨짐. 차라리 안 쓰기.
190
+ - ❌ 문단 사이를 `**굵게**` 강조로 도배 — 시각 노이즈
191
+ - ❌ 5,000자 미만 분량 (5분 안 채워짐)
192
+
193
+ ## 6. 어휘 가이드
194
+
195
+ | 어색한 한자어 | 친근한 한국어 |
196
+ |---|---|
197
+ | 사용자 | 쓰는 사람 / 사용자 (case-by-case, 사용자도 OK) |
198
+ | 설계하다 | 설계하다 / 만들다 |
199
+ | 적용하다 | 적용하다 / 쓰다 |
200
+ | 결과적으로 | 결국 / 그렇게 |
201
+ | 비교했을 때 | 비교하면 |
202
+ | ~에 의하면 | ~에 따르면 |
203
+ | 또한 | 그리고 / 또 |
204
+ | 따라서 | 그래서 |
205
+ | 본인 | 본인 / 자신 / 나 |
206
+ | 일반적으로 | 보통 |
207
+
208
+ ## 7. 실행 절차
209
+
210
+ 1. 영문 원문 본문을 가져옴 (`content/posts/<slug>/index.md`의 EN 부분)
211
+ 2. 각 H2 섹션을 한 번에 1개씩 KR로 옮김
212
+ 3. 첫 단락에 "안녕하세요 ~" intro 삽입
213
+ 4. H2 헤더를 짧은 한국어로 다시 작성
214
+ 5. 종결어미 100% `-요`로 통일
215
+ 6. figure placeholder `![설명](./images/...png "figcaption")` 삽입 — 인사이트당 1~2개
216
+ 7. 마지막에 "여기까지 ~ 나눠봤어요" 마무리
217
+ 8. 글 끝에 frontmatter의 `title_ko`, `subtitle_ko` 필드 채움
218
+
219
+ ## 8. Quality bar
220
+
221
+ - 분량: 5,500자~7,000자 (공백 제외, 한국어 본문)
222
+ - 종결어미 `-습니다` / `-한다` 검사 = 0건
223
+ - 인사이트당 평균 ≥ 2 figure placeholder
224
+ - 첫 단락 "안녕하세요" 인사 포함
225
+ - 가져가도 좋은 것 / 따라하면 안 되는 것 = 각 5개
226
+
227
+ ---
228
+
229
+ 이 스킬은 oh-my-design 블로그 한국어 본문의 **단일 source of truth voice guide**. 모든 KR 글은 이 guide를 따른다.
@@ -0,0 +1,124 @@
1
+ ---
2
+ name: omd:locale-adapter
3
+ description: "한국어 본문을 EN/JP/ZH-TW로 **번역이 아닌 adaptation**. 문화 레퍼런스 swap, JP honorific 정합, ZH-TW 번체 idiom. KR은 항상 source of truth. '다국어 적용', 'EN 버전 만들어줘', 'JP로 옮겨줘' 류 트리거."
4
+ user-invocable: true
5
+ ---
6
+
7
+ # omd:locale-adapter
8
+
9
+ KR 본문을 받아 EN/JP/ZH-TW로 **adapt**한다. 직역이 아니라 각 문화의 디자인 블로그 voice로 다시 쓴다.
10
+
11
+ 참조: Frontitude brand-voice translation model, LINE localization playbook.
12
+
13
+ ## 0. Source of truth
14
+
15
+ **KR이 canonical**. EN/JP/ZH-TW는 derivative. KR이 갱신되면 다른 locale도 무효화.
16
+
17
+ ## 1. 대상 locale별 룰
18
+
19
+ ### 1.1 EN (en)
20
+
21
+ - Voice baseline: Stripe Press / Linear changelog / Vercel blog
22
+ - 문장 길이: 15~25 words (KR 35~50자 ≈ EN 15~25 words)
23
+ - 1인칭: "we" or "I" 자연스럽게
24
+ - 문화 swap:
25
+ - "토스" → "Toss (Korea's leading fintech)" (첫 출현만)
26
+ - "당근" → "Karrot (a hyperlocal Korean marketplace)"
27
+ - 김치/돌잔치 등 강한 KR-only ref → 영미권 equivalent or 짧은 gloss
28
+ - "안녕하세요" 인사 → "Hi, I'm [name]." 또는 informal opener
29
+ - 분량: KR 자수의 0.45~0.55 (영어가 짧음)
30
+ - 헤더: KR 짧은 헤더 → EN은 좀 더 descriptive OK ("토스 느낌의 시작" → "What gives Toss its 'feel'")
31
+
32
+ ### 1.2 JP (ja)
33
+
34
+ - Voice baseline: note.com デザイン カテゴリ, クックパッド開発者ブログ
35
+ - 종결: です・ます 일관 (敬体)
36
+ - 격식 register: 영미보다 한 단계 더 정중
37
+ - 문화 swap:
38
+ - "토스" → "Toss (韓国最大級のフィンテック)"
39
+ - 한국 특유의 이웃문화 ref → 일본식 「ご近所」 비유
40
+ - 존경어/겸양어 자연스럽게 ("저는 ~한다고 생각해요" → "私は〜と考えています")
41
+ - 분량: KR 자수의 0.85~1.0
42
+ - 헤더: 한국어 짧은 헤더와 비슷한 호흡 ("토스 느낌の始まり")
43
+ - 한자: 常用漢字 위주. 어려운 한자는 仮名 병기.
44
+
45
+ ### 1.3 ZH-TW (zh-tw)
46
+
47
+ - Voice baseline: 數位時代, INSIDE 硬塞網
48
+ - **번체** (簡体 금지). 「設計」「顯示」「優化」.
49
+ - 문화 swap:
50
+ - "토스" → "Toss (南韓金融科技龍頭)"
51
+ - "당근" → "Karrot (南韓地區型二手交易平台)"
52
+ - 한국 idiom → 中華圈 idiom (가능한 경우)
53
+ - 분량: KR 자수의 0.6~0.75
54
+ - 인용부호: 「」 사용
55
+ - 헤더: KR 짧은 헤더와 비슷한 호흡 (「Toss 給人的感覺,從何而來」)
56
+
57
+ ## 2. Adaptation 7단계 절차
58
+
59
+ 1. KR canonical 본문 + 출간된 frontmatter 읽기
60
+ 2. 글 전체 thesis 한 줄로 추출 (locale 다 동일해야 함)
61
+ 3. 각 H2 섹션을 1개씩 옮김 — **문장 단위 직역 금지**, 단락 단위 의역
62
+ 4. 문화 ref 발견 시 위 swap 룰 적용 + 첫 출현에 gloss
63
+ 5. 인용/코드/URL/figure src는 그대로 보존
64
+ 6. 헤더 number 일관성 유지 (KR=5 H2면 다른 locale도 5)
65
+ 7. frontmatter `title_<locale>`, `subtitle_<locale>` 채우기
66
+
67
+ ## 3. 보존 (절대 변경 금지)
68
+
69
+ - 코드 블록 내부 (변수명, 함수명, 주석 영문 유지)
70
+ - URL, 파일 경로
71
+ - 사람 이름 / 회사명 (단, 첫 출현에 gloss는 OK)
72
+ - figure src
73
+ - frontmatter slug
74
+ - 수치 / 통계
75
+
76
+ ## 4. 비전형 케이스
77
+
78
+ | 원문 | 대응 |
79
+ |---|---|
80
+ | KR 특유의 이모지 사용 패턴 (`ㅎㅎ`, `^^`) | EN/JP/ZH-TW에서 제거. 톤은 다른 방식으로 표현. |
81
+ | 한자어 농담 | locale 등가 농담 없으면 그냥 의미만 유지하고 농담 톤 표시 |
82
+ | `안녕하세요` 같은 의례 인사 | EN은 informal greeting, JP는 「こんにちは」, ZH-TW는 「大家好」 |
83
+ | Toss/당근 같은 회사명 인지도 차이 | 첫 등장에서 1줄 gloss, 이후 그대로 |
84
+
85
+ ## 5. 출력 형식
86
+
87
+ ```
88
+ content/posts/<slug>/index.ko.md ← source
89
+ content/posts/<slug>/index.en.md ← this skill 생성
90
+ content/posts/<slug>/index.ja.md
91
+ content/posts/<slug>/index.zh-tw.md
92
+ ```
93
+
94
+ 각 파일 frontmatter에:
95
+ ```yaml
96
+ locale: en
97
+ source_locale: ko
98
+ source_revision: <git sha of ko at time of adaptation>
99
+ adapted_at: <ISO date>
100
+ ```
101
+
102
+ ## 6. 품질 체크 (self-audit)
103
+
104
+ 각 locale 생성 후 writer가 직접 검증:
105
+ - H2 카운트가 KR과 일치
106
+ - 인용 / 통계 누락 0건
107
+ - figure src 경로 일치
108
+ - 분량이 위 1.x의 비율 범위
109
+ - 첫 출현 회사명 모두 gloss 처리됨
110
+ - 코드 블록 변경 0건
111
+
112
+ 미달 시 동일 locale 재작성 (orchestrator round 카운터 증가).
113
+
114
+ ## 7. KR 갱신 시 staleness
115
+
116
+ KR이 수정되면 EN/JP/ZH-TW의 `source_revision`이 outdated. orchestrator가 다시 호출. 부분 갱신 가능 (수정된 H2 섹션만 re-adapt).
117
+
118
+ ## 8. Anti-patterns
119
+
120
+ - ❌ Google Translate 톤 — 직역 흔적
121
+ - ❌ KR-only ref를 그대로 둠 (예: "강남에서 일하는데" → 영어판에 그대로)
122
+ - ❌ 분량 mismatch (EN이 KR과 같은 자수)
123
+ - ❌ 헤더 number 불일치
124
+ - ❌ KR 없이 EN을 먼저 작성 (KR=canonical 원칙 위배)
@@ -0,0 +1,124 @@
1
+ ---
2
+ name: omd:orchestrator
3
+ description: "멀티 에이전트 디자인 워크플로우 supervisor. omd-kr-writer, omd-locale-adapter, omd-designer-review, omd-final-qa, omd-codex-image를 routing. 2-round revision cap 유지. 블로그/컴포넌트/아티클 등 multi-role 작업에 트리거 ('블로그 글 작성', 'KR+EN 동시 발행', '디자인 리뷰 받고 다듬어줘')."
4
+ user-invocable: true
5
+ ---
6
+
7
+ # omd:orchestrator
8
+
9
+ omd v0.2 agent layer의 **supervisor**. 한 글/한 컴포넌트가 여러 specialist를 거쳐야 할 때 routing을 책임진다.
10
+
11
+ 채택 패턴: **Anthropic orchestrator-workers** (Building effective agents, 2024-12) + **LangGraph supervisor**의 revision-cap. 자세한 비교는 `data/research/2026-05-18-agent-landscape.md` §1.
12
+
13
+ > 런타임 dependency 없음. Claude Code의 subagent 호출 메커니즘이 그대로 orchestrator-workers 토폴로지를 구현한다.
14
+
15
+ ## 0. Worker 카탈로그
16
+
17
+ | 역할 | subagent | 용도 |
18
+ |---|---|---|
19
+ | Writer | `omd-kr-writer` | 한국어 본문 작성. `preset_id` 인자로 voice 결정. |
20
+ | Localizer | `omd-locale-adapter` | KR → EN/JP/ZH-TW **adaptation** (번역 아님) |
21
+ | Visual reviewer | `omd-designer-review` | DESIGN.md 대비 typo/색/spacing/state 검수 |
22
+ | Critic | `omd-final-qa` | Read-only rubric verdict. 2-round cap 강제. |
23
+ | Image materializer | `omd-codex-image` | `<!-- omd:gen-image -->` 블록을 채널별로 실체화 (Codex native gen / asset-curator fallback / OpenCode user-queue) |
24
+
25
+ ## 1. 입력
26
+
27
+ 사용자 요청. 예:
28
+ - "당근 디자인 시스템 분석 글 작성, KR + EN, 5500자+"
29
+ - "이 컴포넌트 디자인 리뷰 받고 카피 다듬어줘"
30
+ - "이 글 final QA 거쳐서 출간 ready로"
31
+
32
+ ## 2. Routing decision tree
33
+
34
+ ```
35
+ 사용자 요청 도착
36
+ ├─ "글 작성" 키워드 → Stage 1: omd-kr-writer
37
+ ├─ 다국어 요청 ("EN", "영문", "JP") → Stage 3 추가
38
+ ├─ artifact 첨부 + "리뷰" → Stage 2부터 진입
39
+ └─ "출간 ready" → Stage 4 final-qa로 직행
40
+ ```
41
+
42
+ ## 3. 표준 5-stage 워크플로우 (블로그 글 기준)
43
+
44
+ ```
45
+ Stage 1 WRITE omd-kr-writer (preset=toss-tech-design)
46
+ Stage 2 REVIEW omd-designer-review (artifact + brand DESIGN.md)
47
+ Stage 2r REVISION omd-kr-writer (review feedback 반영) ← max 2 round
48
+ Stage 3 LOCALIZE omd-locale-adapter (KR → EN/JP)
49
+ Stage 4 CRITIC omd-final-qa (rubric, read-only)
50
+ Stage 4r REVISION omd-kr-writer (final-qa feedback) ← max 2 round (Stage 2와 별도 카운트)
51
+ Stage 4i IMAGES omd-codex-image (`<!-- omd:gen-image -->` 블록 처리, 채널별 분기)
52
+ Stage 5 HANDOFF 사용자에게 최종 artifact + revision log + image manifest
53
+ ```
54
+
55
+ ## 4. Revision cap (hard)
56
+
57
+ 각 critic gate (designer-review, final-qa)는 **최대 2 round**.
58
+
59
+ ```
60
+ revision_state = {
61
+ "designer_review": { "round": 0, "max": 2 },
62
+ "final_qa": { "round": 0, "max": 2 }
63
+ }
64
+ ```
65
+
66
+ Round 2 후에도 BLOCK이면:
67
+ 1. 사용자에게 escalate ("designer-review가 2회 fail. 강제 통과? 재작성? 폐기?")
68
+ 2. 강제 통과 시 known issues 섹션을 artifact frontmatter에 명시
69
+ 3. 재작성 시 Stage 1로 회귀, 카운터 리셋
70
+
71
+ ## 5. Handoff 로그 (필수)
72
+
73
+ 각 stage 전후로 `<work_dir>/.orchestrator.log`에 append:
74
+
75
+ ```
76
+ [2026-05-18T10:23:11] STAGE=write agent=omd-kr-writer status=ok artifact=content/posts/karrot/index.ko.md
77
+ [2026-05-18T10:25:02] STAGE=review agent=omd-designer-review status=WARN issues=2
78
+ [2026-05-18T10:25:03] STAGE=write agent=omd-kr-writer round=2 reason="색 budget 위반 fix"
79
+ ...
80
+ ```
81
+
82
+ ## 6. State 직렬화
83
+
84
+ Orchestrator 자체는 stateless. 모든 state는 파일 시스템:
85
+ - artifact: `content/posts/<slug>/index.<locale>.md`
86
+ - review reports: `content/posts/<slug>/.reviews/round-<N>.md`
87
+ - final verdict: `content/posts/<slug>/.reviews/final-qa.md`
88
+
89
+ ## 7. Subagent 호출 규약
90
+
91
+ Claude Code subagent 호출 시 다음 envelope:
92
+
93
+ ```yaml
94
+ agent: omd-kr-writer
95
+ inputs:
96
+ task: "당근 디자인 분석 글 작성"
97
+ preset_id: toss-tech-design
98
+ brand_design_md: references/karrot/DESIGN.md
99
+ target_length: 6000
100
+ output_path: content/posts/karrot/index.ko.md
101
+ revision_round: 0
102
+ prior_review: null # 또는 review report 경로
103
+ ```
104
+
105
+ 응답을 받으면 `.orchestrator.log`에 기록 후 다음 stage 결정.
106
+
107
+ ## 8. Anti-patterns (금지)
108
+
109
+ - **3+ round revision loop** — cost runaway. Round 2에서 escalate.
110
+ - **Critic의 직접 수정** — final-qa는 read-only. Writer로 round-trip해야.
111
+ - **Stage skip** — designer-review 없이 final-qa 진입 금지 (rubric 불충분).
112
+ - **병렬 stage 같은 artifact 수정** — race condition. writer/locale-adapter는 직렬.
113
+ - **rubber-stamp** — final-qa가 "looks good" 응답 시 orchestrator는 rejected로 처리.
114
+
115
+ ## 9. 병렬화 허용 케이스
116
+
117
+ - KR이 PASS된 뒤 EN/JP/ZH-TW **localization은 병렬** (각각 다른 파일이라 conflict 없음)
118
+ - DESIGN.md re-read는 stage마다 강제 (Anthropic best practice — memory hallucination 방지)
119
+
120
+ ## 10. 종료 조건
121
+
122
+ - final-qa verdict = PASS → handoff stage로
123
+ - final-qa round 2 BLOCK → 사용자 escalation
124
+ - 사용자가 명시적으로 abort → `.orchestrator.log`에 ABORT 기록 후 종료
@@ -1,6 +1,15 @@
1
1
  ---
2
- omd: 0.1
3
- brand: 29CM
2
+ id: "29cm"
3
+ name: "29CM"
4
+ country: KR
5
+ category: ecommerce
6
+ homepage: "https://www.29cm.co.kr"
7
+ primary_color: "#000000"
8
+ logo:
9
+ type: favicon
10
+ slug: "https://asset.29cm.co.kr/icon/apple-icon-144x144.png"
11
+ verified: "2026-05-15"
12
+ omd: "0.1"
4
13
  ---
5
14
 
6
15
  # Design System Inspiration of 29CM
@@ -1,6 +1,16 @@
1
1
  ---
2
- omd: 0.1
3
- brand: Ably (에이블리)
2
+ id: ably
3
+ name: Ably
4
+ display_name_kr: Ably (에이블리)
5
+ country: KR
6
+ category: ecommerce
7
+ homepage: "https://m.a-bly.com"
8
+ primary_color: "#fa2e5f"
9
+ logo:
10
+ type: favicon
11
+ slug: "https://www.google.com/s2/favicons?domain=a-bly.com&sz=128"
12
+ verified: "2026-05-15"
13
+ omd: "0.1"
4
14
  ---
5
15
 
6
16
  # Design System Inspiration of Ably (에이블리)