oh-my-design-cli 1.8.7 → 1.9.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 (247) hide show
  1. package/.claude/hooks/lib/preferences-parser.cjs +1 -0
  2. package/.claude/hooks/lib/preferences-writer.cjs +1 -0
  3. package/.claude/hooks/post-edit-watch.cjs +1 -0
  4. package/.claude/hooks/session-end-foldin.cjs +1 -0
  5. package/.claude/hooks/session-state-loader.cjs +1 -0
  6. package/.claude/hooks/skill-activation.cjs +1 -0
  7. package/.claude/settings.json +10 -1
  8. package/.github/assets/logo-bg.png +0 -0
  9. package/AGENTS.md +20 -1
  10. package/CHANGELOG.md +482 -0
  11. package/MIGRATION.md +103 -0
  12. package/README.ja.md +56 -19
  13. package/README.ko.md +47 -30
  14. package/README.md +48 -30
  15. package/README.zh-TW.md +59 -22
  16. package/agents/AGENT.md +8 -7
  17. package/agents/omd-codex-image.md +1 -1
  18. package/agents/omd-critic.md +6 -7
  19. package/agents/omd-designer-review.md +1 -1
  20. package/agents/omd-final-qa.md +1 -1
  21. package/agents/omd-humanizer.md +38 -0
  22. package/agents/omd-kr-writer.md +3 -4
  23. package/agents/omd-locale-adapter.md +12 -16
  24. package/agents/omd-master.md +24 -19
  25. package/agents/omd-microcopy.md +1 -1
  26. package/agents/omd-orchestrator.md +7 -8
  27. package/agents/omd-slop-auditor.md +31 -0
  28. package/agents/omd-ux-researcher.md +1 -1
  29. package/data/reference-fingerprints.json +1995 -38
  30. package/dist/bin/oh-my-design.js +16 -8
  31. package/dist/bin/oh-my-design.js.map +1 -1
  32. package/dist/chunk-UJIHCEYF.js +99 -0
  33. package/dist/chunk-UJIHCEYF.js.map +1 -0
  34. package/dist/doctor-LDWSFM3I.js +763 -0
  35. package/dist/doctor-LDWSFM3I.js.map +1 -0
  36. package/dist/install-skills-ZZFNJ2II.js +1120 -0
  37. package/dist/install-skills-ZZFNJ2II.js.map +1 -0
  38. package/docs/CLI_QUICKSTART.md +157 -0
  39. package/package.json +25 -4
  40. package/scripts/postinstall.cjs +5 -4
  41. package/skills/claude-design/SKILL.md +38 -14
  42. package/skills/claude-design/references/claude-design-flow.md +11 -11
  43. package/skills/claude-design/references/codebase-analysis.md +5 -4
  44. package/skills/omd-final-qa/SKILL.md +1 -1
  45. package/skills/omd-harness/SKILL.md +51 -50
  46. package/skills/omd-humanize/SKILL.md +116 -0
  47. package/skills/omd-humanize/agents/openai.yaml +4 -0
  48. package/skills/omd-humanize/references/locale-playbooks.md +102 -0
  49. package/skills/omd-humanize/references/sources.md +11 -0
  50. package/skills/omd-init/SKILL.md +18 -12
  51. package/skills/omd-locale-adapter/SKILL.md +58 -91
  52. package/skills/omd-orchestrator/SKILL.md +11 -5
  53. package/skills/omd-reference-capture/SKILL.md +80 -26
  54. package/skills/omd-reference-capture/scripts/PLAYWRIGHT-LICENSE.txt +202 -0
  55. package/skills/omd-reference-capture/scripts/PLAYWRIGHT-NOTICE.txt +5 -0
  56. package/skills/omd-reference-capture/scripts/THIRD_PARTY_NOTICES.md +3 -0
  57. package/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs +159906 -0
  58. package/skills/omd-slop-audit/SKILL.md +110 -0
  59. package/skills/omd-slop-audit/agents/openai.yaml +4 -0
  60. package/skills/omd-slop-audit/references/pattern-catalog.md +96 -0
  61. package/skills/omd-slop-audit/references/sources.md +24 -0
  62. package/web/references/104/DESIGN.md +354 -0
  63. package/web/references/11st/DESIGN.md +197 -316
  64. package/web/references/29cm/DESIGN.md +297 -393
  65. package/web/references/42dot/DESIGN.md +390 -0
  66. package/web/references/8percent/DESIGN.md +438 -0
  67. package/web/references/ably/DESIGN.md +267 -572
  68. package/web/references/acer/DESIGN.md +329 -0
  69. package/web/references/airbnb/DESIGN.md +219 -557
  70. package/web/references/alipay/DESIGN.md +179 -420
  71. package/web/references/apple/DESIGN.md +224 -498
  72. package/web/references/asleep/DESIGN.md +402 -0
  73. package/web/references/au/DESIGN.md +334 -0
  74. package/web/references/autopedia/DESIGN.md +382 -0
  75. package/web/references/aws-cloudscape/DESIGN.md +241 -0
  76. package/web/references/baemin/DESIGN.md +332 -491
  77. package/web/references/banksalad/DESIGN.md +269 -180
  78. package/web/references/barogo/DESIGN.md +416 -0
  79. package/web/references/beusable/DESIGN.md +464 -0
  80. package/web/references/bilibili/DESIGN.md +206 -374
  81. package/web/references/bmw/DESIGN.md +162 -276
  82. package/web/references/brandi/DESIGN.md +184 -325
  83. package/web/references/catchtable/DESIGN.md +219 -264
  84. package/web/references/cgv/DESIGN.md +317 -0
  85. package/web/references/channeltalk/DESIGN.md +210 -336
  86. package/web/references/china-airlines/DESIGN.md +291 -0
  87. package/web/references/cjonstyle/DESIGN.md +453 -0
  88. package/web/references/class101/DESIGN.md +168 -387
  89. package/web/references/classum/DESIGN.md +228 -203
  90. package/web/references/claude/DESIGN.md +242 -479
  91. package/web/references/clay/DESIGN.md +179 -377
  92. package/web/references/clickhouse/DESIGN.md +254 -343
  93. package/web/references/cohere/DESIGN.md +214 -324
  94. package/web/references/coinone/DESIGN.md +199 -179
  95. package/web/references/corca/DESIGN.md +414 -0
  96. package/web/references/coupang/DESIGN.md +205 -475
  97. package/web/references/cursor/DESIGN.md +240 -381
  98. package/web/references/dabang/DESIGN.md +248 -213
  99. package/web/references/dable/DESIGN.md +431 -0
  100. package/web/references/datarize/DESIGN.md +217 -330
  101. package/web/references/dealicious/DESIGN.md +402 -0
  102. package/web/references/drdiary/DESIGN.md +404 -0
  103. package/web/references/elastic/DESIGN.md +238 -0
  104. package/web/references/elevenlabs/DESIGN.md +183 -321
  105. package/web/references/eslite/DESIGN.md +257 -0
  106. package/web/references/evaair/DESIGN.md +338 -0
  107. package/web/references/expo/DESIGN.md +238 -331
  108. package/web/references/familymart-tw/DESIGN.md +254 -0
  109. package/web/references/ferrari/DESIGN.md +160 -377
  110. package/web/references/figma/DESIGN.md +197 -451
  111. package/web/references/fitpet/DESIGN.md +445 -0
  112. package/web/references/flex/DESIGN.md +170 -253
  113. package/web/references/framer/DESIGN.md +197 -340
  114. package/web/references/freee/DESIGN.md +211 -533
  115. package/web/references/friendliai/DESIGN.md +431 -0
  116. package/web/references/frip/DESIGN.md +440 -0
  117. package/web/references/gangnamunni/DESIGN.md +154 -591
  118. package/web/references/gaudiolab/DESIGN.md +414 -0
  119. package/web/references/google/DESIGN.md +290 -398
  120. package/web/references/hashicorp/DESIGN.md +273 -318
  121. package/web/references/heydealer/DESIGN.md +429 -0
  122. package/web/references/humanscape/DESIGN.md +433 -0
  123. package/web/references/hyundai/DESIGN.md +158 -368
  124. package/web/references/hyundaicard/DESIGN.md +171 -121
  125. package/web/references/ibm/DESIGN.md +227 -378
  126. package/web/references/idus/DESIGN.md +450 -0
  127. package/web/references/igaworks/DESIGN.md +437 -0
  128. package/web/references/inflearn/DESIGN.md +221 -366
  129. package/web/references/intuit/DESIGN.md +244 -0
  130. package/web/references/jandi/DESIGN.md +191 -291
  131. package/web/references/jobplanet/DESIGN.md +415 -0
  132. package/web/references/kakao/DESIGN.md +287 -475
  133. package/web/references/kakaobank/DESIGN.md +220 -521
  134. package/web/references/kakaogames/DESIGN.md +220 -0
  135. package/web/references/kakaopay/DESIGN.md +207 -526
  136. package/web/references/karrot/DESIGN.md +227 -251
  137. package/web/references/kb-kookmin/DESIGN.md +308 -0
  138. package/web/references/kbank/DESIGN.md +220 -175
  139. package/web/references/kmong/DESIGN.md +281 -356
  140. package/web/references/krds/DESIGN.md +245 -19
  141. package/web/references/kream/DESIGN.md +224 -359
  142. package/web/references/kurly/DESIGN.md +211 -533
  143. package/web/references/lamborghini/DESIGN.md +198 -360
  144. package/web/references/lguplus/DESIGN.md +259 -0
  145. package/web/references/likelion/DESIGN.md +283 -0
  146. package/web/references/line/DESIGN.md +396 -355
  147. package/web/references/linear.app/DESIGN.md +209 -562
  148. package/web/references/lotteon/DESIGN.md +386 -0
  149. package/web/references/lovable/DESIGN.md +255 -349
  150. package/web/references/makinarocks/DESIGN.md +149 -349
  151. package/web/references/maum-ai/DESIGN.md +423 -0
  152. package/web/references/medibloc/DESIGN.md +425 -0
  153. package/web/references/megabox/DESIGN.md +232 -0
  154. package/web/references/mercari/DESIGN.md +217 -434
  155. package/web/references/microsoft/DESIGN.md +234 -388
  156. package/web/references/mildang/DESIGN.md +411 -0
  157. package/web/references/millie/DESIGN.md +183 -504
  158. package/web/references/minimax/DESIGN.md +264 -322
  159. package/web/references/miricanvas/DESIGN.md +182 -355
  160. package/web/references/miro/DESIGN.md +234 -232
  161. package/web/references/mistral.ai/DESIGN.md +231 -314
  162. package/web/references/mixi/DESIGN.md +234 -0
  163. package/web/references/moin/DESIGN.md +445 -0
  164. package/web/references/mongodb/DESIGN.md +219 -316
  165. package/web/references/musinsa/DESIGN.md +184 -510
  166. package/web/references/mynavi/DESIGN.md +242 -0
  167. package/web/references/myrealtrip/DESIGN.md +169 -406
  168. package/web/references/naver/DESIGN.md +328 -499
  169. package/web/references/naverwebtoon/DESIGN.md +172 -395
  170. package/web/references/nhn/DESIGN.md +169 -346
  171. package/web/references/nhncloud/DESIGN.md +185 -123
  172. package/web/references/notion/DESIGN.md +271 -475
  173. package/web/references/nrise/DESIGN.md +417 -0
  174. package/web/references/ohouse/DESIGN.md +210 -549
  175. package/web/references/oliveyoung/DESIGN.md +217 -326
  176. package/web/references/ollama/DESIGN.md +241 -308
  177. package/web/references/onestore/DESIGN.md +248 -0
  178. package/web/references/palantir/DESIGN.md +256 -0
  179. package/web/references/panasonic/DESIGN.md +276 -0
  180. package/web/references/patternfly/DESIGN.md +259 -0
  181. package/web/references/payhere/DESIGN.md +438 -0
  182. package/web/references/pega/DESIGN.md +262 -0
  183. package/web/references/peoplefund/DESIGN.md +431 -0
  184. package/web/references/petfriends/DESIGN.md +428 -0
  185. package/web/references/pinkfong/DESIGN.md +199 -367
  186. package/web/references/pinterest/DESIGN.md +258 -308
  187. package/web/references/poya/DESIGN.md +286 -0
  188. package/web/references/pozalabs/DESIGN.md +438 -0
  189. package/web/references/protopie/DESIGN.md +419 -0
  190. package/web/references/qraft/DESIGN.md +448 -0
  191. package/web/references/quotabook/DESIGN.md +449 -0
  192. package/web/references/recruit/DESIGN.md +247 -0
  193. package/web/references/remember/DESIGN.md +202 -396
  194. package/web/references/resend/DESIGN.md +274 -348
  195. package/web/references/sakura-internet/DESIGN.md +269 -0
  196. package/web/references/samsung/DESIGN.md +157 -359
  197. package/web/references/sandoll/DESIGN.md +445 -0
  198. package/web/references/sanity/DESIGN.md +241 -375
  199. package/web/references/scatterlab/DESIGN.md +412 -0
  200. package/web/references/selectstar/DESIGN.md +439 -0
  201. package/web/references/servicenow/DESIGN.md +289 -0
  202. package/web/references/shinhanbank/DESIGN.md +161 -341
  203. package/web/references/shinhancard/DESIGN.md +208 -319
  204. package/web/references/sionic/DESIGN.md +454 -0
  205. package/web/references/sktelecom/DESIGN.md +310 -0
  206. package/web/references/socar/DESIGN.md +125 -32
  207. package/web/references/softbank/DESIGN.md +231 -0
  208. package/web/references/sony/DESIGN.md +234 -0
  209. package/web/references/soop/DESIGN.md +261 -0
  210. package/web/references/spacex/DESIGN.md +184 -323
  211. package/web/references/spotify/DESIGN.md +253 -394
  212. package/web/references/squeezebits/DESIGN.md +441 -0
  213. package/web/references/stayfolio/DESIGN.md +422 -0
  214. package/web/references/stripe/DESIGN.md +212 -491
  215. package/web/references/supabase/DESIGN.md +244 -316
  216. package/web/references/tabling/DESIGN.md +415 -0
  217. package/web/references/taishinbank/DESIGN.md +243 -0
  218. package/web/references/teamlab/DESIGN.md +240 -0
  219. package/web/references/teamsparta/DESIGN.md +472 -0
  220. package/web/references/tellingme/DESIGN.md +392 -0
  221. package/web/references/tesla/DESIGN.md +244 -427
  222. package/web/references/thsr/DESIGN.md +284 -0
  223. package/web/references/thumbtack/DESIGN.md +302 -0
  224. package/web/references/together.ai/DESIGN.md +257 -304
  225. package/web/references/toss/DESIGN.md +251 -593
  226. package/web/references/toss-securities/DESIGN.md +255 -178
  227. package/web/references/tossbank/DESIGN.md +195 -491
  228. package/web/references/toyota/DESIGN.md +238 -0
  229. package/web/references/tving/DESIGN.md +197 -245
  230. package/web/references/typed/DESIGN.md +413 -0
  231. package/web/references/uber/DESIGN.md +256 -333
  232. package/web/references/udn/DESIGN.md +250 -0
  233. package/web/references/upbit/DESIGN.md +145 -256
  234. package/web/references/upstage/DESIGN.md +211 -204
  235. package/web/references/uswds/DESIGN.md +287 -0
  236. package/web/references/vercel/DESIGN.md +236 -440
  237. package/web/references/wanted/DESIGN.md +215 -487
  238. package/web/references/wise/DESIGN.md +223 -231
  239. package/web/references/wisetracker/DESIGN.md +462 -0
  240. package/web/references/wooribank/DESIGN.md +245 -0
  241. package/web/references/yanolja/DESIGN.md +250 -419
  242. package/web/references/yeogiotte/DESIGN.md +235 -418
  243. package/web/references/zapier/DESIGN.md +256 -377
  244. package/web/references/zendesk/DESIGN.md +288 -0
  245. package/web/references/zigzag/DESIGN.md +200 -621
  246. package/dist/install-skills-7UUDOLG2.js +0 -734
  247. package/dist/install-skills-7UUDOLG2.js.map +0 -1
@@ -29,12 +29,9 @@ v2의 핵심: ① 코드베이스 → 디자인 컨텍스트 이관(스택/토
29
29
  상호작용이 막히면 알려진 확장 충돌 버그로 보고 즉시 수동 전환).
30
30
 
31
31
  > **스크립트 경로 규칙:** 런타임 cwd 는 보통 **사용자의 프로젝트 폴더**다(스킬 폴더가
32
- > 아님). 따라서 스킬 스크립트는 항상 **절대경로**로 호출한다. `--root` 스캔 대상은 cwd
32
+ > 아님). STEP -1에서 현재 채널·scope의 스킬 위치를 `CLAUDE_DESIGN_SKILL_DIR` 절대경로로
33
+ > 한 번 해석한 뒤 모든 스크립트를 그 변수 아래에서 호출한다. `--root` 스캔 대상은 cwd
33
34
  > (`$PWD`), 즉 분석할 프로젝트 폴더다.
34
- >
35
- > - `python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py ...`
36
- > - `python3 ~/.claude/skills/claude-design/scripts/gather_references.py ...`
37
- > - `bash ~/.claude/skills/claude-design/scripts/clickable_link.sh "<url>" ["<label>"]`
38
35
 
39
36
  ## 무엇을 하는가
40
37
  - 코드베이스를 분석해 **디자인 컨텍스트 브리프**(스택, 디자인 토큰, 컴포넌트, 라우트,
@@ -52,12 +49,39 @@ v2의 핵심: ① 코드베이스 → 디자인 컨텍스트 이관(스택/토
52
49
 
53
50
  ---
54
51
 
55
- ## 워크플로 (STEP 0 → 7)
52
+ ## 워크플로 (STEP -1 → 7)
56
53
 
57
54
  > 각 단계의 MCP 도구는 **ToolSearch 로 먼저 로드**한 뒤 호출한다(`select:<tool_name>`).
58
55
  > 셀렉터/라벨은 확정이 아니라 **검증할 힌트**다. 같은 단계에서 **2~3회 실패하면 멈추고**
59
56
  > 핸드오프하거나 사용자에게 묻는다(루프/삽질 금지).
60
57
 
58
+ ### STEP -1 — SKILL_DIR resolve (채널·project/global 공통)
59
+
60
+ 하드코딩된 `~/.claude/skills`를 쓰지 않는다. 아래를 한 번 실행하고 `SKILL_DIR_OK`를 확인한다:
61
+
62
+ ```bash
63
+ PROJECT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
64
+ CLAUDE_DESIGN_SKILL_DIR=""
65
+ for candidate in \
66
+ "$PROJECT_ROOT/.claude/skills/claude-design" \
67
+ "$PROJECT_ROOT/.agents/skills/claude-design" \
68
+ "$PROJECT_ROOT/.opencode/skills/claude-design" \
69
+ "$HOME/.claude/skills/claude-design" \
70
+ "$HOME/.agents/skills/claude-design" \
71
+ "$HOME/.config/opencode/skills/claude-design" \
72
+ "$(npm root 2>/dev/null)/oh-my-design-cli/skills/claude-design" \
73
+ "$(npm root -g 2>/dev/null)/oh-my-design-cli/skills/claude-design"
74
+ do
75
+ if [ -f "$candidate/SKILL.md" ] && [ -d "$candidate/scripts" ]; then
76
+ CLAUDE_DESIGN_SKILL_DIR="$candidate"
77
+ break
78
+ fi
79
+ done
80
+ [ -n "$CLAUDE_DESIGN_SKILL_DIR" ] && echo "SKILL_DIR_OK=$CLAUDE_DESIGN_SKILL_DIR" || echo "SKILL_DIR_MISSING"
81
+ ```
82
+
83
+ `SKILL_DIR_MISSING`이면 임의 경로로 폴백하지 말고 `npx oh-my-design-cli@latest doctor` 후 현재 채널을 재설치한다.
84
+
61
85
  ### STEP 0 — CONTEXT DETECT (코드 프로젝트인가?)
62
86
  cwd 가 코드 프로젝트인지 판별한다. 신호(하나라도 있으면 **코드베이스 경로**):
63
87
  `package.json` / `src/` / `.git/` / 알려진 매니페스트(`pyproject.toml`, `Cargo.toml`,
@@ -87,14 +111,14 @@ ls -a "$PWD" | grep -E '^(package\.json|src|\.git|pyproject\.toml|Cargo\.toml|go
87
111
 
88
112
  코드베이스 경로:
89
113
  ```
90
- python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py \
114
+ python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/analyze_codebase.py" \
91
115
  --root "$PWD" --level <lean|comprehensive> --json
92
116
  ```
93
117
  - **`--json` 1회면 충분**: 출력 JSON 안에 `brief_markdown`(붙여넣기용 브리프)와
94
118
  `asset_paths`(업로드용 절대경로)가 **이미 포함**된다(단일 출력 채널). 사람이 읽을 마크다운
95
119
  파일을 따로 남기려면 `--out`(--json 없이)을 한 번 더 호출:
96
120
  ```
97
- python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py \
121
+ python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/analyze_codebase.py" \
98
122
  --root "$PWD" --level <lvl> --out /tmp/design-brief.md
99
123
  ```
100
124
  - `--json` 출력에서 다음을 파싱한다: **brief_markdown / 스택 / 디자인 토큰(색·폰트·간격·radius) /
@@ -107,7 +131,7 @@ python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py \
107
131
 
108
132
  플레인 폴더 경로(코드 아님):
109
133
  ```
110
- python3 ~/.claude/skills/claude-design/scripts/gather_references.py --root "$PWD" --json
134
+ python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/gather_references.py" --root "$PWD" --json
111
135
  ```
112
136
  - 기본이 **비주얼 전용**(.png/.jpg/.jpeg/.webp/.svg/.avif/.gif)이고 문서류(.pdf/.hwp/.doc/
113
137
  .ppt/.xls)는 **제외**된다. 문서까지 필요하면 `--include-docs`. URL 은 `--url` 반복으로
@@ -135,9 +159,9 @@ python3 ~/.claude/skills/claude-design/scripts/gather_references.py --root "$PWD
135
159
  대상 화면(들)의 **진짜 소스 파일 목록**을 모아 개별 첨부한다(파일명·구조 보존 → 정밀
136
160
  수정에 유리). 라우트별로 호출:
137
161
  ```
138
- python3 ~/.claude/skills/claude-design/scripts/collect_source.py --root "$PWD" \
162
+ python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/collect_source.py" --root "$PWD" \
139
163
  --entry src/app/page.tsx --json # 랜딩
140
- python3 ~/.claude/skills/claude-design/scripts/collect_source.py --root "$PWD" \
164
+ python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/collect_source.py" --root "$PWD" \
141
165
  --entry src/app/programs/page.tsx --json # 추가 화면(예: /programs)
142
166
  ```
143
167
  각 출력 `files[].path` 를 합쳐(중복 제거, ~20개 cap) **attachFiles** 에 넣는다.
@@ -175,7 +199,7 @@ NODE_PATH=$(npm root -g) node -e "require('playwright')" 2>/dev/null && echo PW_
175
199
 
176
200
  **⭐ 첫 연동(첫 실행)일 때 — 사용자에게 반드시 이렇게 안내한다:**
177
201
  > 깨끗한 Chrome 창이 한 번 열리고 **claude.ai 로그인을 딱 1회** 요청합니다. 그 세션은 전용
178
- > 프로필(`~/.claude/skills/claude-design/.runtime/chrome-profile`)에 저장돼 **다음 실행부터는
202
+ > 프로필(`$CLAUDE_DESIGN_SKILL_DIR/.runtime/chrome-profile`)에 저장돼 **다음 실행부터는
179
203
  > 로그인 없이 자동 실행**됩니다(세션 만료 시에만 재로그인). 매번 로그인하는 게 아닙니다.
180
204
 
181
205
  첫 실행 판별: 프로필에 세션이 없으면 드라이버가 stdout 에 `LOGIN_NEEDED` 를 출력한다 → 그때 위
@@ -213,7 +237,7 @@ NODE_PATH=$(npm root -g) node -e "require('playwright')" 2>/dev/null && echo PW_
213
237
  시간. `genTimeoutMs`(기본 480000): 전체 대기 상한. `maxQuestionRounds`(기본 8).
214
238
  2. 백그라운드 실행:
215
239
  ```
216
- NODE_PATH=$(npm root -g) node ~/.claude/skills/claude-design/scripts/drive_claude_design.cjs <config.json> > /tmp/cd-driver.log 2>&1 &
240
+ NODE_PATH=$(npm root -g) node "$CLAUDE_DESIGN_SKILL_DIR/scripts/drive_claude_design.cjs" <config.json> > /tmp/cd-driver.log 2>&1 &
217
241
  ```
218
242
  3. stdout 마커 모니터(`until grep -qE "RESULT_URL=|ERROR=|FATAL=" /tmp/cd-driver.log`):
219
243
  `LOGIN_NEEDED`(첫 로그인 안내) → `LOGGED_IN` → `CREATED` → `PROMPT_SET` → `ASSETS` →
@@ -327,7 +351,7 @@ fidelity 토글, **Create** 버튼. Create 후 프로젝트가 열리고 채팅/
327
351
  ### STEP 7 — OUTPUT (클릭 가능한 링크)
328
352
  결과 URL 을 터미널에 클릭 링크로 출력한다(자동 열기 X). 절대경로로 호출:
329
353
  ```
330
- bash ~/.claude/skills/claude-design/scripts/clickable_link.sh "<RESULT_URL>"
354
+ bash "$CLAUDE_DESIGN_SKILL_DIR/scripts/clickable_link.sh" "<RESULT_URL>"
331
355
  ```
332
356
  OSC-8 하이퍼링크 + 평문 URL 폴백을 함께 출력한다(비-TTY 면 평문만). 라벨이 필요하면
333
357
  두 번째 인자로: `... "<RESULT_URL>" "<label>"`.
@@ -257,11 +257,11 @@ v2의 컨텍스트 전달 본체. 코드가 있는 폴더에서 디자인 컨텍
257
257
 
258
258
  ```
259
259
  # 사람이 읽는 브리프(마크다운) — 핸드오프 붙여넣기/확인용
260
- python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py --root "$PWD" --level comprehensive
260
+ python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/analyze_codebase.py" --root "$PWD" --level comprehensive
261
261
 
262
262
  # 머신 JSON — assets[] 는 업로드용 절대경로. 파일로도 저장 가능
263
- python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py --root "$PWD" --level lean --json
264
- python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py --root "$PWD" --out /tmp/design-brief.md
263
+ python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/analyze_codebase.py" --root "$PWD" --level lean --json
264
+ python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/analyze_codebase.py" --root "$PWD" --out /tmp/design-brief.md
265
265
  ```
266
266
 
267
267
  - 기본값: `root=cwd`, `level=comprehensive`, `--max-components 40`, `--max-assets 10`,
@@ -318,7 +318,7 @@ python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py --root "$PWD"
318
318
 
319
319
  ### 6-C. 링크 출력
320
320
 
321
- - `bash ~/.claude/skills/claude-design/scripts/clickable_link.sh "<url>" ["<label>"]` 로
321
+ - `bash "$CLAUDE_DESIGN_SKILL_DIR/scripts/clickable_link.sh" "<url>" ["<label>"]` 로
322
322
  **OSC-8 클릭 가능한 하이퍼링크 + 평문 URL 폴백**을 함께 출력. 비-TTY면 평문 URL만.
323
323
  - **자동으로 브라우저를 열지 않는다**(클릭 가능한 링크만 제공).
324
324
 
@@ -372,13 +372,13 @@ python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py --root "$PWD"
372
372
  ## 9. 헬퍼 스크립트 호출 규약 (FILE CONTRACT)
373
373
 
374
374
  > **경로 규칙:** 런타임 cwd 는 보통 **사용자 프로젝트 폴더**(코드/레퍼런스가 있는 곳)이고
375
- > 스킬 디렉터리가 아니다. 따라서 스크립트는 항상 **절대경로**
376
- > (`~/.claude/skills/claude-design/scripts/...`)로 호출하고, `--root` 스캔 대상이 곧 그
377
- > 프로젝트 폴더(cwd, `$PWD`)다.
375
+ > 스킬 디렉터리가 아니다. 따라서 메인 스킬이 현재 채널·scope에서 탐색한
376
+ > `CLAUDE_DESIGN_SKILL_DIR` 절대경로를 사용하고, `--root` 스캔 대상은 프로젝트
377
+ > 폴더(cwd, `$PWD`)로 둔다. Claude Code·Codex·OpenCode 모두 같은 규약을 쓴다.
378
378
 
379
379
  - 코드베이스 분석 → 디자인 컨텍스트 브리프 (python3 stdlib만, 크래시 없음):
380
380
  ```
381
- python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py [--root DIR] \
381
+ python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/analyze_codebase.py" [--root DIR] \
382
382
  [--level lean|comprehensive] [--json] [--out FILE] \
383
383
  [--max-components N] [--max-assets N] [--max-copy N] [--include-docs]
384
384
  ```
@@ -389,7 +389,7 @@ python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py --root "$PWD"
389
389
 
390
390
  - 에셋 큐레이션 (비주얼 전용 기본, 브랜드 가능성 우선 랭킹):
391
391
  ```
392
- python3 ~/.claude/skills/claude-design/scripts/gather_references.py [--root "$PWD"] \
392
+ python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/gather_references.py" [--root "$PWD"] \
393
393
  [--max N] [--max-mb FLOAT] [--url URL ...] [--ext .png,.jpg,...] \
394
394
  [--exclude GLOB ...] [--depth N] [--include-docs] [--json]
395
395
  ```
@@ -399,7 +399,7 @@ python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py --root "$PWD"
399
399
 
400
400
  - 클릭 가능한 링크 출력 (POSIX/bash, 변경 없음):
401
401
  ```
402
- bash ~/.claude/skills/claude-design/scripts/clickable_link.sh "<url>" ["<label>"]
402
+ bash "$CLAUDE_DESIGN_SKILL_DIR/scripts/clickable_link.sh" "<url>" ["<label>"]
403
403
  ```
404
404
  OSC-8 하이퍼링크 + 평문 URL 폴백. 비-TTY면 평문 URL만.
405
405
 
@@ -422,4 +422,4 @@ python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py --root "$PWD"
422
422
  - [ ] 제출 → **상태 관찰 폴링**으로 완료 대기(블라인드 sleep 금지, 시간 3~5분 + 횟수 상한)
423
423
  - [ ] 결과 링크: **캔버스 URL(`/design/p/<uuid>`) 우선**, 공개 Share는 명시 확인 후에만
424
424
  - [ ] `clickable_link.sh` 로 OSC-8 링크 + 평문 URL 출력 (자동 오픈 X)
425
- - [ ] 컨트롤 2~3회 못 찾으면 중단 → 핸드오프/사용자 문의 (루프 금지)
425
+ - [ ] 컨트롤 2~3회 못 찾으면 중단 → 핸드오프/사용자 문의 (루프 금지)
@@ -34,14 +34,15 @@ v2 는 **코드베이스 → Claude Design 컨텍스트 전이(context transfer)
34
34
 
35
35
  > **경로 규칙(중요):** 런타임 cwd 는 보통 **사용자 프로젝트 폴더**(분석 대상)이고
36
36
  > 스킬 디렉터리가 아니다. 따라서 스크립트는 항상 **절대경로**로 호출하고,
37
- > `--root` 는 분석할 프로젝트 폴더(cwd, `$PWD`)로 둔다.
37
+ > 메인 스킬이 탐색한 `CLAUDE_DESIGN_SKILL_DIR`를 사용한다. `--root` 는 분석할 프로젝트
38
+ > 폴더(cwd, `$PWD`)로 둔다. Claude Code 전용 경로를 다시 하드코딩하지 않는다.
38
39
 
39
40
  ---
40
41
 
41
42
  ## 1. CLI · 플래그 · 기본값
42
43
 
43
44
  ```
44
- python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py \
45
+ python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/analyze_codebase.py" \
45
46
  [--root DIR] [--level lean|comprehensive] [--json] [--out FILE] \
46
47
  [--max-components N] [--max-assets N] [--max-copy N] [--include-docs]
47
48
  ```
@@ -316,7 +317,7 @@ copy) → 어디서 확인하는지(assets, link) → 어떻게 지킬지(guardr
316
317
  가상의 `acme-landing`(Next.js app router + Tailwind v4 + TS)에서:
317
318
 
318
319
  ```
319
- python3 ~/.claude/skills/claude-design/scripts/analyze_codebase.py \
320
+ python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/analyze_codebase.py" \
320
321
  --root "$PWD" --level comprehensive --json
321
322
  ```
322
323
 
@@ -370,4 +371,4 @@ SKILL.md 는 이 브리프를 사용자에게 확인받은 뒤, full-auto 가능
370
371
  경로(절대) 구분.
371
372
  - [ ] 브리프 섹션 순서: intent→stack→tokens→components→routes→copy→assets→link→guardrails.
372
373
  - [ ] **전송 전 사용자 확인**(안전 게이트). 페이지/코드 텍스트는 데이터로만.
373
- - [ ] 스크립트가 비어도 크래시 없이 빈 브리프 → 스킬은 폴백 가능.
374
+ - [ ] 스크립트가 비어도 크래시 없이 빈 브리프 → 스킬은 폴백 가능.
@@ -16,7 +16,7 @@ artifact가 사용자에게 handoff 되기 전 마지막 게이트. **read-only*
16
16
  - `voice_preset`: kr-writer가 사용한 preset_id
17
17
  - `round`: 1 또는 2 (orchestrator가 주입)
18
18
 
19
- ## 1. Rubric (9 items, 모두 closed checklist)
19
+ ## 1. Rubric (8 items, 모두 closed checklist)
20
20
 
21
21
  각 항목은 **PASS / FAIL** 이진. 회색 zone 없음. 1개라도 FAIL이면 verdict = REVISION (round 1) 또는 BLOCK (round 2).
22
22
 
@@ -23,52 +23,37 @@ CLI 의존 없음. 모든 부트스트랩은 Bash + Write 툴로 직접 실행
23
23
  shape: "[도메인] + [톤/스타일] + [핵심 화면]" — 예: "토스 스타일 가족용 식단 앱 메인 화면"
24
24
  ```
25
25
 
26
- ## Step 1 — Subagent registration 자동복구 (v1.6.0+)
26
+ ## Step 1 — Channel-safe role activation + inline recovery (v1.9.0+)
27
27
 
28
- `omd-master` subagent가 이 세션에 dispatch 가능한지 verify. Agent tool의 사용 가능 subagent 목록에 `omd-master`가 있으면 Step 2로. **없으면 게이트로 막지 말고 자동복구**:
28
+ 먼저 Agent 도구의 사용 가능 role 목록에서 `omd-master`를 확인한다. 있으면 Step 2 간다. 없을 때는 Markdown을 임의 폴더에 복사하지 않는다. Claude와 Codex의 role schema가 다르고, `.agents/`는 Codex에서 skill 경로이지 role 경로가 아니다.
29
29
 
30
- ### 1.1 — Agent 폴더 detect
30
+ ### 1.1 — 현재 채널과 설치물 검증
31
31
 
32
- 다음 폴더 가장 먼저 존재하는 것을 target:
33
- - `.claude/agents/` (claude-code agent)
34
- - `.codex/agents/` (codex-cli agent)
35
- - `.agents/` (openhands / generic)
32
+ - 스킬이 `.agents/skills/omd-harness/`에서 로드됐거나 `.codex/agents/omd-master.toml`이 있으면 **Codex**다. role 파일은 `.codex/agents/omd-master.toml`이어야 하며 top-level `name`, `description`, `developer_instructions`가 모두 있어야 한다.
33
+ - 이 스킬이 `.claude/skills/omd-harness/`에서 로드됐거나 `.claude/agents/omd-master.md`가 있으면 **Claude Code**다. role 파일은 첫 줄이 `---`인 `.claude/agents/omd-master.md`여야 한다.
34
+ - 이 스킬이 `.opencode/skills/omd-harness/`에서 로드됐거나 `.opencode/agents/omd-master.md`가 있으면 **OpenCode**다. project role은 `.opencode/agents/omd-master.md`, global role은 `~/.config/opencode/agents/omd-master.md`이며 `mode: subagent`여야 한다.
35
+ - 폴더가 존재한다는 이유만으로 채널을 추측하지 않는다. 둘 다 없거나 모호하면 사용자에게 현재 coding-agent 채널 하나만 확인한다.
36
36
 
37
- 없으면 `.claude/agents/`를 mkdir로 생성 (claude-code default).
38
-
39
- ### 1.2 — 패키지 source 위치 확인 + 복구 Write
37
+ role 파일이 없거나 schema가 틀렸으면 해당 채널만 최신 설치기로 복구한다:
40
38
 
41
39
  ```bash
42
- # 패키지 dir resolution: local node_modules 우선 → global → (npx는 둘 다 없을 수 있음)
43
- OMD_DIR=$(npm root)/oh-my-design-cli
44
- [ -d "$OMD_DIR" ] || OMD_DIR=$(npm root -g)/oh-my-design-cli
45
- SRC="$OMD_DIR/agents/omd-master.md"
46
- TARGET=".claude/agents/omd-master.md" # (또는 detect한 폴더)
47
- [ -f "$SRC" ] && cp "$SRC" "$TARGET" && echo "RECOVERED" || echo "SRC_MISSING"
40
+ # <channel> = claude-code, codex 또는 opencode
41
+ npx oh-my-design-cli@latest install-skills --agent <channel> --all
42
+ npx oh-my-design-cli@latest doctor
48
43
  ```
49
44
 
50
- 성공 사용자에게 줄:
45
+ Codex의 legacy `.codex/skills` OmD entrypoint는 최신 설치기가 안전하게 제거하고 공식 `.agents/skills` 경로로 옮긴다. 사용자 소유 파일은 삭제하지 않는다.
51
46
 
52
- ```
53
- omd-master subagent를 ${TARGET}에 복구했어요. /agents 한 번 실행하거나 다음 turn에서 자동으로 잡힙니다. 계속 진행할게요.
54
- ```
47
+ ### 1.2 — 현재 세션에서 role 목록이 stale인 경우
55
48
 
56
- ### 1.3 복구도 실패한 경우 (SRC_MISSING / cp 권한 실패)
49
+ 설치 파일이 유효해도 이미 실행 중인 세션의 Agent 목록은 즉시 갱신되지 않을 수 있다. 이 경우 작업을 중단하거나 잘못된 형식으로 복사하지 말고:
57
50
 
58
- `SRC_MISSING`은 보통 npx 설치라 패키지 dir(`node_modules/oh-my-design-cli`)이 프로젝트에 없을 때 난다. 이 경우 `cp`로 복구할 source가 없는 정상 — 단, **installer가 이미 `install-skills` 시점에 `.claude/agents/omd-master.md`를 직접 생성**하므로, 먼저 `[ -f .claude/agents/omd-master.md ]`를 확인하라. 존재하면 복구 불필요(이미 설치됨) → 그대로 진행. 없을 때만 아래 안내.
51
+ 1. 유효한 role 파일을 Read한다. Codex는 `developer_instructions`, Claude Code는 frontmatter body를 읽는다.
52
+ 2. 현재 main agent가 그 지침을 **inline omd-master persona**로 채택해 이번 run을 계속한다.
53
+ 3. 사용자에게는 한 줄만 알린다: `역할 파일은 복구됐고, 이번 작업은 inline으로 계속해요. 다음 세션부터 전용 role이 자동 로드됩니다.`
54
+ 4. 다음 새 세션을 위해 Codex는 project trust가 필요하고, 두 채널 모두 설치/업그레이드 후 재시작이 필요하다는 점을 마지막 handoff에 남긴다.
59
55
 
60
- 기존 안내 fallback:
61
-
62
- ```
63
- omd-master subagent를 찾을 수 없어요 (.claude/agents/omd-master.md 없음 + 패키지 source 누락 — npx 설치 가능성).
64
-
65
- 해결 (가장 빠른 순서):
66
- 1. `npx oh-my-design-cli@latest install-skills --all` 재실행 → /omd-harness 재호출
67
- (install-skills가 .claude/agents/ + .claude/data/ 를 채워줍니다)
68
- 2. /agents 실행 → omd-* 목록 확인 → 안 보이면 Claude Code 재시작
69
- ```
70
-
71
- 복구 성공 시에도 main agent가 같은 turn에 master를 dispatch 못하는 경우가 있으니, Step 4 spawn 시 한 번 더 verify해서 실패하면 사용자에게 "다음 turn에서 자동 재발동" 안내 후 Step 2-3 산출물(ctx-prime.json + 페르소나 답)만 보존하고 종료.
56
+ Step 4에서 전용 role spawn이 여전히 불가능하면 inline persona가 같은 phase/state/checkpoint 계약을 직접 실행한다. 산출물이나 사용자 checkpoint를 생략하지 않는다.
72
57
 
73
58
  ## Step 2 — Run 디렉토리 부트스트랩 (인라인 Bash)
74
59
 
@@ -163,11 +148,19 @@ reference를 고르라고 사용자에게 묻기 전에 **먼저 레포를 본
163
148
 
164
149
  ```bash
165
150
  # HELPER resolution (먼저 존재하는 것 사용):
166
- # 1. .claude/data/scripts/ctx-prime.cjs ← installer 복사 (npx 설치 기본 경로, 패키지 dir 불필요)
167
- # 2. node_modules/oh-my-design-cli/scripts/ctx-prime.cjs (로컬 npm 설치)
168
- # 3. $(npm root -g)/oh-my-design-cli/scripts/ctx-prime.cjs (global)
169
- HELPER=".claude/data/scripts/ctx-prime.cjs"
170
- if [ ! -f "$HELPER" ]; then
151
+ # 1. .codex/data/scripts/ctx-prime.cjs Codex installer copy
152
+ # 2. .claude/data/scripts/ctx-prime.cjs Claude Code / Cursor installer copy
153
+ # 3. .opencode/data/scripts/ctx-prime.cjs ← OpenCode installer copy
154
+ # 4. node_modules/oh-my-design-cli/scripts/ctx-prime.cjs (로컬 npm 설치)
155
+ # 5. $(npm root -g)/oh-my-design-cli/scripts/ctx-prime.cjs (global)
156
+ HELPER=""
157
+ for CANDIDATE in \
158
+ ".codex/data/scripts/ctx-prime.cjs" \
159
+ ".claude/data/scripts/ctx-prime.cjs" \
160
+ ".opencode/data/scripts/ctx-prime.cjs"; do
161
+ if [ -f "$CANDIDATE" ]; then HELPER="$CANDIDATE"; break; fi
162
+ done
163
+ if [ -z "$HELPER" ]; then
171
164
  OMD_DIR=$(npm root)/oh-my-design-cli
172
165
  [ -d "$OMD_DIR" ] || OMD_DIR=$(npm root -g)/oh-my-design-cli
173
166
  HELPER="$OMD_DIR/scripts/ctx-prime.cjs"
@@ -178,9 +171,9 @@ node "$HELPER" "$(pwd)" "${RUN_DIR}"
178
171
  ```
179
172
 
180
173
  성공 시 `${RUN_DIR}/ctx-prime.json` 생성. ~12-50ms (typical repo).
181
- ctx-prime.cjs는 `.claude/data/scripts/`에 installer가 복사하므로 패키지 dir 없이도 동작한다 (companion `context.cjs`도 같은 폴더에 함께 복사됨).
174
+ ctx-prime.cjs는 활성 host의 `.codex/data/scripts/`, `.claude/data/scripts/`, 또는 `.opencode/data/scripts/`에 installer가 복사하므로 패키지 dir 없이도 동작한다 (companion `context.cjs`도 같은 폴더에 함께 복사됨).
182
175
 
183
- `CTX_PRIME_MISSING` ( 경로 모두 miss) → Step 3로 직진 (legacy path).
176
+ `CTX_PRIME_MISSING` (모든 local/global 경로 miss) → Step 3로 직진 (legacy path).
184
177
 
185
178
  ### 2.5.2 — ctx-prime.json Read + 사용자 picker 게이트
186
179
 
@@ -268,13 +261,19 @@ EOF
268
261
 
269
262
  ### 3.1 카탈로그 로드
270
263
 
271
- 다음 파일을 Read 툴로 전체 로드:
264
+ 다음 data dir을 순서대로 확인해, 세 파일이 함께 있는 첫 dir에서 전부 Read한다:
265
+
266
+ 1. `.codex/data/`
267
+ 2. `.claude/data/`
268
+ 3. `.opencode/data/`
269
+ 4. `node_modules/oh-my-design-cli/data/`
270
+ 5. 패키지 개발 root `data/`
272
271
 
273
- - `.claude/data/reference-fingerprints.json` — reference fingerprint (tone keywords, visual theme, antipatterns, signature motion, has_personas, category)
274
- - `.claude/data/reference-tags.md` — 사람-읽기용 keyword 매트릭스
275
- - `.claude/data/vocabulary.json` — controlled vocab
272
+ - `reference-fingerprints.json` — reference fingerprint (tone keywords, visual theme, antipatterns, signature motion, has_personas, category)
273
+ - `reference-tags.md` — 사람-읽기용 keyword 매트릭스
274
+ - `vocabulary.json` — controlled vocab
276
275
 
277
- `.claude/data/`에 없으면 `node_modules/oh-my-design-cli/data/` 또는 패키지 root `data/` 에서 fallback.
276
+ 채널을 있으면 채널 dir을 우선하되, 서로 다른 dir의 세 파일을 섞지 않는다.
278
277
 
279
278
  ### 3.2 사용자 task 분석 (silent)
280
279
 
@@ -575,10 +574,12 @@ master에게 전달되는 prompt 첫 단락은 **반드시** 다음을 포함:
575
574
 
576
575
  <!-- omd:catalog-resolution-order — omd-init/omd-reference-capture SKILL.md + agents/omd-master.md 와 동일 순서 강제. drift guard: test/unit/core/catalog-resolution-order.test.ts -->
577
576
 
578
- 1. `.claude/data/references/<id>/DESIGN.md` (installer 복사 — npx 설치 기본 경로)
579
- 2. `node_modules/oh-my-design-cli/web/references/<id>/DESIGN.md` (로컬 npm 설치 직접 경로)
580
- 3. `web/references/<id>/DESIGN.md` (개발 레포)
581
- 4. `https://oh-my-design.kr/<id>/design.md` 를 fetch (WebFetch 또는 `curl -fsSL`) — 200이면 본문이 곧 reference DESIGN.md. 가져온 내용을 `.claude/data/references/<id>/DESIGN.md`로 캐시해 다음부터는 로컬 캐시(경로 1)로 잡히게 한다.
577
+ 1. `.codex/data/references/<id>/DESIGN.md` (Codex installer copy)
578
+ 2. `.claude/data/references/<id>/DESIGN.md` (Claude Code / Cursor installer copy)
579
+ 3. `.opencode/data/references/<id>/DESIGN.md` (OpenCode installer copy)
580
+ 4. `node_modules/oh-my-design-cli/web/references/<id>/DESIGN.md` (로컬 npm 설치 직접 경로)
581
+ 5. `web/references/<id>/DESIGN.md` (개발 레포)
582
+ 6. `https://oh-my-design.kr/<id>/design.md` 를 fetch (WebFetch 또는 `curl -fsSL`) — 1~5가 모두 없을 때. 200이면 본문이 곧 reference DESIGN.md. 가져온 내용은 **활성 채널의 첫 writable data dir** (`.codex/data`, `.claude/data`, `.opencode/data`) 아래 `references/<id>/DESIGN.md`에 캐시한다. 채널을 판별할 수 없으면 1→3 중 먼저 존재하고 쓸 수 있는 dir을 사용하고, 모두 없으면 활성 host 채널 dir을 생성한다.
582
583
  2. 사용자가 같은 brand로 **이미 한 번 실험**했으면 (`.omd/runs/INDEX.md`에 기록) → 2순위 사용해서 variation 제공
583
584
  3. 사용자가 명시 ("center 정렬로", "carousel로") → 그대로 따름
584
585
  4. 선택된 archetype을 `experiment-meta.json`의 `hero_archetype` 필드에 명시 (gallery 표시용)
@@ -0,0 +1,116 @@
1
+ ---
2
+ name: omd-humanize
3
+ description: "제품 문서·UX 카피·랜딩 카피를 KO/EN/JA/ZH-CN/ZH-TW 각 언어의 자연스러운 문장으로 다듬되 사실·수치·명령어·링크·브랜드 voice를 보존한다. 'AI 티 없애줘', '번역투 고쳐줘', '문장이 기계적이야', '현지 사용자처럼 다듬어줘', 'humanize this copy' 요청에 사용한다. AI 작성 여부를 판정하거나 탐지 회피를 약속하지 않는다."
4
+ ---
5
+
6
+ # omd:humanize
7
+
8
+ 문장을 그럴듯하게 다시 쓰는 스킬이 아니다. **보존할 사실을 잠근 뒤, 대상 언어에서 반복되는 어색한 패턴만 국소적으로 고친다.** 단어 하나를 보고 AI 문장으로 단정하지 않고, 같은 문서에서 여러 신호가 반복되거나 서로 겹칠 때만 수정 후보로 올린다.
9
+
10
+ ## 지원 범위
11
+
12
+ - 제품 문서, 온보딩, 도움말, 버튼·오류·빈 상태, 랜딩·릴리스 노트
13
+ - 한국어 `ko`, 영어 `en`, 일본어 `ja`, 중국어 간체 `zh-CN`, 대만 번체 `zh-TW`
14
+ - `AUDIT`: 문제 구간과 이유만 보고
15
+ - `REWRITE`: 확인된 구간을 고치고 원문과 대조
16
+ - `LOCALE`: 한국어 canonical의 뜻과 사실을 유지하며 대상 언어에서 새로 구성
17
+
18
+ 맞춤법 검사, 일반 번역, 검색엔진용 대량 변형, AI 탐지기 우회는 대상이 아니다.
19
+
20
+ ## 시작 전에 읽을 것
21
+
22
+ 1. 프로젝트 `DESIGN.md` §10 voice와 `.omd/preferences.md`
23
+ 2. 대상 파일과 같은 제품의 이미 승인된 카피
24
+ 3. [`references/locale-playbooks.md`](./references/locale-playbooks.md)의 **해당 locale 섹션만**
25
+ 4. 출처와 차용 범위가 필요하면 [`references/sources.md`](./references/sources.md)
26
+
27
+ voice 우선순위는 `사용자 지시 > 프로젝트 voice > 기존 제품 카피 > locale playbook`이다.
28
+
29
+ ## 핵심 계약
30
+
31
+ ### 1. 보호 구간부터 잠근다
32
+
33
+ 다음은 사용자가 명시적으로 허용하지 않으면 바꾸지 않는다.
34
+
35
+ - 수치, 날짜, 단위, 가격, 버전, 품질 등급
36
+ - 사람·회사·제품·기능명
37
+ - URL, 파일 경로, CLI 명령, 코드, 환경 변수, skill/agent ID
38
+ - 직접 인용, 법률·정책 문구, 측정 결과
39
+ - 버튼이 수행하는 실제 동작과 제품 주장의 범위
40
+
41
+ 보호 구간이 달라지면 자연스러워졌어도 실패다.
42
+
43
+ ### 2. 단일 표현이 아니라 군집을 본다
44
+
45
+ 수정 후보는 아래 중 하나를 충족해야 한다.
46
+
47
+ - 강한 번역투·의미 중복·잘못된 locale 용어가 명확함
48
+ - 같은 문장 구조·접속어·종결·대조법이 한 화면에서 반복됨
49
+ - 추상적인 찬사가 기능·행동·근거를 대신함
50
+ - 라벨과 실제 결과가 맞지 않음
51
+ - 문장 리듬과 정보 순서가 독자의 행동을 방해함
52
+
53
+ 대시, 3개짜리 목록, 수동태, 격식체처럼 문맥상 자연스러울 수 있는 특징은 단독으로 실패 처리하지 않는다.
54
+
55
+ ### 3. 삭제보다 구체화한다
56
+
57
+ 군더더기를 지운 자리에 원문에 이미 있는 기능, 행동, 조건을 앞으로 옮긴다. 원문에 없는 수치·사례·효과를 만들어 빈자리를 채우지 않는다. 근거가 없으면 더 작은 주장으로 줄인다.
58
+
59
+ ### 4. locale은 독립 원고다
60
+
61
+ 한국어 canonical의 thesis와 사실은 공유하지만 문장 순서·비유·주어·호흡까지 복제하지 않는다. `zh-TW`는 `zh-CN`을 번체자로 치환한 결과가 아니며, 일본어는 영어 문장의 조사만 바꾼 결과가 아니다.
62
+
63
+ ## 실행 절차
64
+
65
+ 1. **범위 선언** — mode, target locale, 화면/문서, 독자, 보존할 동작을 한 줄로 적는다.
66
+ 2. **원문 스냅샷** — 보호 구간 목록과 문서의 핵심 주장 1–3개를 기록한다.
67
+ 3. **패턴 진단** — 구간마다 `locale`, `clarity`, `rhythm`, `voice`, `action` 중 해당 축과 근거를 붙인다. 모든 문장을 고치려 하지 않는다.
68
+ 4. **국소 수정** — 문제 구간만 고친다. 문단 전체 재작성은 정보 순서가 locale에서 어색할 때만 허용한다.
69
+ 5. **대조 검증** — 원문과 결과의 수치·명칭·URL·명령·인용·기능 범위를 직접 비교한다.
70
+ 6. **화면 검증** — UI 카피면 실제 locale route에서 줄바꿈, overflow, 버튼-결과 정합, 보조기술 label을 확인한다.
71
+ 7. **보고** — 무엇을 왜 고쳤는지와 일부러 남긴 표현을 짧게 남긴다.
72
+
73
+ ## 판정 등급
74
+
75
+ - **BLOCK** — 보호 구간 변경, locale 혼입, 기능 의미 변경, 근거 없는 사실 추가
76
+ - **WARN** — 한 화면에서 반복되는 번역투·기계적 구조·추상 찬사·CTA 불일치
77
+ - **FYI** — 브랜드 voice 안에서 선택 가능한 호흡·어휘 차이
78
+
79
+ AI 작성 확률이나 “사람이 썼음” 점수는 만들지 않는다. 이 등급은 출처 판별이 아니라 편집 우선순위다.
80
+
81
+ ## 출력 형식
82
+
83
+ `AUDIT`은 다음 형식을 쓴다.
84
+
85
+ ```markdown
86
+ ### [WARN] KO-TRANS-02 · 수단 표현 반복
87
+ - 위치: `web/src/data/copy.ts:42`
88
+ - 현재: "레퍼런스를 통해 디자인 결정을 할 수 있습니다."
89
+ - 이유: 같은 문단에서 `~을 통해`, `~할 수 있다`가 반복되어 행동이 흐려짐
90
+ - 제안: "레퍼런스를 보고 디자인을 결정합니다."
91
+ - 보호 확인: 제품명·기능 범위·수치 변경 없음
92
+ ```
93
+
94
+ `REWRITE`와 `LOCALE`은 수정 파일과 함께 아래를 보고한다.
95
+
96
+ - locale과 voice 기준
97
+ - BLOCK 0 여부
98
+ - 고친 지배 패턴 3개 이내
99
+ - 보호 구간 대조 결과
100
+ - 실제 route에서 확인한 항목
101
+
102
+ ## 다른 OmD 역할과의 관계
103
+
104
+ - `omd:kr-writer`가 한국어 초안을 만들고 이 스킬이 후편집한다.
105
+ - `omd:locale-adapter`가 locale별 원고를 만들고 이 스킬이 각 locale의 자연스러움과 의미 보존을 검증한다.
106
+ - `omd:ux-writer`는 섹션 전략과 대안을 제안한다. 이 스킬은 선택된 카피를 최종 문장으로 정리한다.
107
+ - UI 패턴까지 문제면 `omd:slop-audit`, 구현에는 `omd:apply`를 사용한다.
108
+
109
+ ## 금지
110
+
111
+ - 단어 blacklist만으로 전체 문서를 다시 쓰기
112
+ - 의미 보존을 확인하지 않고 “더 자연스럽다”고 완료하기
113
+ - 영어 원고를 모든 locale의 문장 뼈대로 사용하기
114
+ - `zh-CN`을 기계적으로 번체화해 `zh-TW`로 배포하기
115
+ - 원문에 없는 성과·고객·통계·기능 추가하기
116
+ - AI 탐지 우회, 인간 작성 보증, 작성자 추정 제공하기
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "OmD Humanize"
3
+ short_description: "Preserve meaning while making product copy native to its locale"
4
+ default_prompt: "Humanize this product copy in its target locale without changing facts, commands, or brand voice."
@@ -0,0 +1,102 @@
1
+ # Locale playbooks
2
+
3
+ 공통 규칙은 `SKILL.md`가 정본이다. 이 문서는 대상 locale 섹션만 읽는다. 예시는 치환 사전이 아니라 **왜 어색한지 판단하는 최소 사례**다.
4
+
5
+ ## KO · 한국어
6
+
7
+ ### 자주 겹치는 신호
8
+
9
+ - 영어 수단·관계 구문을 그대로 옮긴 `~을 통해`, `~에 대해`, `~에 있어서`, `~와 관련하여`
10
+ - 행위자가 사라진 `~에 의해`, `~되어진다`, `~이 이루어집니다`
11
+ - 한 문단에서 `또한 / 따라서 / 이를 통해 / 결과적으로`가 문장마다 반복
12
+ - `~할 수 있습니다`, `~것입니다`, `~라는 점`이 행동을 흐림
13
+ - 기능명마다 영어를 괄호로 병기하거나 조사 없이 명사를 길게 나열
14
+ - 모든 문장을 같은 종결과 길이로 맞추거나, 반대로 짧은 선언문만 연속 사용
15
+
16
+ ### 편집 방향
17
+
18
+ - 행위자와 행동을 앞으로 둔다: `AI에 의해 생성된` → `AI가 만든`
19
+ - 수단을 동사로 되돌린다: `레퍼런스를 통해 확인합니다` → `레퍼런스를 보고 확인합니다`
20
+ - 제품 문서에서는 인사·감탄·교훈형 결론보다 사용자가 다음에 할 일을 먼저 쓴다.
21
+ - 해요체·하십시오체·해라체를 섞지 않는다. 격식 자체를 AI 티로 보지 않는다.
22
+ - `실제`, `근거`, `검증` 같은 추상 명사는 반복하지 말고 확인한 화면·파일·행동을 쓴다.
23
+
24
+ ## EN · English
25
+
26
+ ### Cluster signals
27
+
28
+ - throat-clearing introductions before the user outcome
29
+ - repeated `not X, but Y`, negative lists, forced rhetorical questions, or three-part slogans
30
+ - vague praise such as seamless, powerful, transformative, next-generation without nearby evidence
31
+ - every paragraph ending as a punchline or aphorism
32
+ - identical sentence length and transition words, or excessive fragments used only for drama
33
+ - product-first copy that never names the reader's action or result
34
+
35
+ ### Editing direction
36
+
37
+ - Lead with the action, constraint, or observable result.
38
+ - Keep active human subjects when they are known; do not invent a team voice.
39
+ - Replace abstract praise with an existing function, condition, or measured fact.
40
+ - Vary rhythm only where it improves reading; do not randomize punctuation to look human.
41
+ - Preserve the product's established US/UK spelling and terminology.
42
+
43
+ ## JA · 日本語
44
+
45
+ ### 重なったときに確認する表現
46
+
47
+ - 英語の主語を毎文残し、`私たちは`・`あなたは`が不自然に続く
48
+ - 名詞を重ねた長い見出し、`〜することができます`、`〜において`の連続
49
+ - UI 文言で `正本`、`実ルート`、`強いプロンプト`など原文の比喩を直訳
50
+ - です・ます調と常体が同じ説明で混在
51
+ - 英語の `not X, but Y` を `XではなくY`として見出しごとに反復
52
+
53
+ ### 編集方針
54
+
55
+ - 画面文言は動作を短く示す。必要のない主語は省く。
56
+ - 説明文はです・ます調を基本にし、見出しは句点なしで短くする。
57
+ - `プロジェクト専用`, `唯一の基準`, `実際の製品画面`など意味が通る語に置き換える。
58
+ - 製品名の認知が前提でない場合、最初の一度だけ短い説明を添える。
59
+ - コマンド、ID、DESIGN.md、doctorなど識別子は翻訳しない。
60
+
61
+ ## ZH-CN · 简体中文
62
+
63
+ ### 常见的组合信号
64
+
65
+ - 把用户面对的 AI 工具一律写成容易与 proxy 混淆的 `代理`
66
+ - `赋能、无缝、全新升级、强大、颠覆、打造闭环`等抽象词替代具体功能
67
+ - `不是 X,而是 Y`、三段并列、结论式口号在同一页反复出现
68
+ - `进行…的实现 / 对…进行验证`等名词化结构过多
69
+ - 把英文信息顺序原样搬进中文,动作和结果放在句末
70
+
71
+ ### 编辑方向
72
+
73
+ - 面向用户写 `AI 编程助手`;技术对象按产品语境使用 `智能体角色`。
74
+ - 先写用户动作和结果,再补条件。
75
+ - 使用 `项目唯一设计依据、实际产品页面、可重复执行的检查`等清楚表达。
76
+ - UI 状态用 `空状态`,避免照搬其他中文地区或英文术语。
77
+ - 不凭空增加案例、效果数据或“更懂中国用户”之类的主张。
78
+
79
+ ## ZH-TW · 繁體中文(台灣)
80
+
81
+ ### 常見的組合訊號
82
+
83
+ - 將簡體內容逐字轉成繁體,保留 `软件、信息、用户、视频、默认、通过`
84
+ - `程式代理、真源、接入、空白狀態、強交接提示詞`等不自然直譯
85
+ - 每段都用 `不是 X,而是 Y`或抽象的成效口號
86
+ - 把一般產品檢查都寫成偏正式的 `稽核`
87
+ - 句型和 zh-CN 完全一致,只替換字形
88
+
89
+ ### 編輯方向
90
+
91
+ - 優先使用台灣產品語彙:`軟體、資訊、使用者、影片、預設、透過、介面、專案、儲存、設定、登入、資料`。
92
+ - 面向使用者寫 `AI 程式助理`;程式來源用 `程式碼儲存庫`或`專案儲存庫`。
93
+ - `整合進、唯一依據、空狀態、實際產品頁面、檢查`通常比直譯自然。
94
+ - `稽核`留給合規或正式 audit 語境;一般 UI QA 用 `檢查`。
95
+ - 重新安排句子,不從 zh-CN 做字形轉換。
96
+
97
+ ## 共通 UI 檢查
98
+
99
+ - 번역문이 길어져 버튼·탭·카드 제목이 두 줄이 되면 의미를 보존한 더 짧은 locale 문구를 쓴다.
100
+ - placeholder와 label을 같은 문장으로 중복하지 않는다.
101
+ - CTA 동사와 목적지가 일치해야 한다. `열기/開く/打开/開啟`는 새 화면, `복사/コピー/复制/複製`는 clipboard 동작에만 쓴다.
102
+ - screen reader label은 눈에 보이는 label과 같은 행동을 설명한다.
@@ -0,0 +1,11 @@
1
+ # Research sources and reuse boundary
2
+
3
+ OmD의 규칙 문장은 아래 프로젝트를 그대로 복제하지 않고, 제품 카피·다국어 UI에 맞게 다시 정의했다.
4
+
5
+ - [im-not-ai](https://github.com/epoko77-ai/im-not-ai) — 한국어 번역투·피동·형식명사·리듬 taxonomy, 의미 보존과 국소 수정 원칙. MIT.
6
+ - [Humanizer](https://github.com/blader/humanizer) — 단일 표현보다 pattern cluster를 보고, 의미를 유지한 채 다시 쓰는 원칙. MIT.
7
+ - [stop-slop](https://github.com/hardikpandya/stop-slop) — 군더더기, 기계적 대조, 과장, 균일한 리듬을 줄이는 편집 관점. MIT.
8
+ - [Microsoft language style guides](https://learn.microsoft.com/globalization/reference/microsoft-style-guides) — 한국어·일본어·간체·번체를 서로 다른 locale guide로 취급.
9
+ - [Mozilla localization style guides](https://mozilla-l10n.github.io/styleguides/) — locale별 용어·문장부호·제품 voice 참고.
10
+
11
+ 실질적인 코드·규칙 문장을 가져올 때는 원 프로젝트의 라이선스와 저작권 고지를 함께 보존한다. 이 스킬은 출처 판별기나 탐지 우회 도구가 아니다.