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
@@ -7,7 +7,7 @@ description: "프로젝트 루트에 DESIGN.md를 부트스트랩 — 실제 기
7
7
 
8
8
  프로젝트에 DESIGN.md + AI 코딩 에이전트용 shim 3종을 한 번에 세팅. 레퍼런스 톤&매너는 **preserve**하고, 사용자 프로젝트 맥락은 controlled-vocabulary delta_set으로만 반영.
9
9
 
10
- **CLI 호출 없음** — Read/Write/Bash(파일 작업만) 툴로 직접 처리. (이전 버전은 `omd init recommend` CLI subcommand를 호출했으나 현재 CLI binary`install-skills`만 노출. 이 skill은 self-contained하게 동작.)
10
+ **런타임 CLI subcommand 호출 없음** — Read/Write/Bash(파일 작업만) 툴로 직접 처리한다. CLI의 사용자 표면은 bare `npx oh-my-design-cli`(대화형 installer)와 `npx oh-my-design-cli doctor`(설치 진단)이며, `omd init recommend` 같은 init subcommand는 제공하지 않는다. 이 skill은 설치 뒤 host agent 안에서 self-contained하게 동작한다.
11
11
 
12
12
  ## 전체 플로우
13
13
 
@@ -38,15 +38,19 @@ Phase 7: 요약 출력
38
38
 
39
39
  다음 파일을 Read 툴로 전체 로드 (있는 순서대로 fallback):
40
40
 
41
- 1. `.claude/data/reference-fingerprints.json` (사용자 프로젝트에 설치된 카탈로그 — 표준 경로)
42
- 2. `node_modules/oh-my-design-cli/data/reference-fingerprints.json` (npm 설치 직접 경로)
43
- 3. `data/reference-fingerprints.json` (개발 환경)
41
+ 1. `.codex/data/reference-fingerprints.json` (Codex 설치 카탈로그)
42
+ 2. `.claude/data/reference-fingerprints.json` (Claude Code / Cursor 설치 카탈로그)
43
+ 3. `.opencode/data/reference-fingerprints.json` (OpenCode 설치 카탈로그)
44
+ 4. `node_modules/oh-my-design-cli/data/reference-fingerprints.json` (npm 설치 직접 경로)
45
+ 5. `data/reference-fingerprints.json` (개발 환경)
44
46
 
45
47
  스키마: `{ count, items: [{ id, primary_color_hex, category, visual_theme, voice_fingerprint, tone_keywords, antipatterns, signature_motion, has_personas, category_raw }] }`.
46
48
 
47
49
  추가 보조 파일 (있으면 같이 로드):
48
- - `.claude/data/vocabulary.json` — controlled vocab axes/keywords
49
- - `.claude/data/reference-tags.md` — human-readable keyword matrix
50
+ - 위에서 실제 선택된 data dir의 `vocabulary.json` — controlled vocab axes/keywords
51
+ - 같은 data dir의 `reference-tags.md` — human-readable keyword matrix
52
+
53
+ 채널을 알 수 있으면 해당 채널 data dir을 우선 사용하되, 파일이 없으면 위 1→5 순서로 fallback한다. 서로 다른 설치 채널의 fingerprint와 보조 파일을 섞지 말 것.
50
54
 
51
55
  ### 2.2 task 분석 (silent, in-head)
52
56
 
@@ -126,12 +130,14 @@ Phase 4.2~6은 건너뛴다.
126
130
 
127
131
  <!-- omd:catalog-resolution-order — omd-harness/omd-reference-capture SKILL.md + agents/omd-master.md 와 동일 순서 강제. drift guard: test/unit/core/catalog-resolution-order.test.ts -->
128
132
 
129
- 1. `.claude/data/references/<id>/DESIGN.md` (installer가 복사 — npx 설치 기본 경로)
130
- 2. `node_modules/oh-my-design-cli/web/references/<id>/DESIGN.md` (로컬 npm 설치 직접 경로)
131
- 3. `web/references/<id>/DESIGN.md` (개발 레포)
132
- 4. `https://oh-my-design.kr/<id>/design.md` 를 fetch (WebFetch 또는 `curl -fsSL`) — 1~3 로컬 경로가 전부 없을 때 (npx 설치가 기본 경로라 흔한 상황). 200이면 응답 본문이 곧 reference DESIGN.md다. 가져온 내용을 `.claude/data/references/<id>/DESIGN.md`로 저장해 다음 실행부터는 로컬 캐시(경로 1)로 잡히게 한다.
133
+ 1. `.codex/data/references/<id>/DESIGN.md` (Codex installer가 복사)
134
+ 2. `.claude/data/references/<id>/DESIGN.md` (Claude Code / Cursor installer가 복사)
135
+ 3. `.opencode/data/references/<id>/DESIGN.md` (OpenCode installer가 복사)
136
+ 4. `node_modules/oh-my-design-cli/web/references/<id>/DESIGN.md` (로컬 npm 설치 직접 경로)
137
+ 5. `web/references/<id>/DESIGN.md` (개발 레포)
138
+ 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을 생성한다.
133
139
 
134
- 4까지 전부 실패하면 **절대 DESIGN.md를 임의로 지어내지 말 것.** 사용자에게
140
+ 6까지 전부 실패하면 **절대 DESIGN.md를 임의로 지어내지 말 것.** 사용자에게
135
141
  "레퍼런스 `<id>` 원문을 찾지 못했어요 (오프라인이거나 카탈로그 미배포).
136
142
  네트워크 연결 후 재시도하거나 다른 레퍼런스를 골라주세요"라고 보고하고 종료.
137
143
 
@@ -311,4 +317,4 @@ Next:
311
317
  - 레퍼런스에 없는 section/heading을 추가하지 말 것.
312
318
  - `.omd/init-context.json`을 직접 편집할 때 schema 어기지 말 것.
313
319
  - DESIGN.md가 이미 있는데 백업 없이 덮어쓰지 말 것 (Phase 4.2 rename 절차 준수).
314
- - **존재하지 않는 CLI subcommand (`omd init recommend`, `omd init prepare`, `omd sync`)를 호출하지 말 것** — CLI binary는 `install-skills`만 제공.
320
+ - **존재하지 않는 CLI subcommand (`omd init recommend`, `omd init prepare`, `omd sync`)를 호출하지 말 것** — CLI는 bare installer와 `install-skills`, `doctor`만 제공한다.
@@ -1,124 +1,91 @@
1
1
  ---
2
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
3
+ description: "한국어 canonical 문서·UX copy를 EN/JA/ZH-CN/ZH-TW로 번역이 아니라 locale adaptation한다. thesis·사실·명령어는 보존하되 문장 순서, 주어, register, 제품 용어와 호흡은 언어에서 다시 쓴다. '다국어 적용', '영문/일문/간체/대만어 버전', 'locale 문서 만들어줘' 요청에 사용한다."
5
4
  ---
6
5
 
7
6
  # omd:locale-adapter
8
7
 
9
- KR 본문을 받아 EN/JP/ZH-TW로 **adapt**한다. 직역이 아니라 문화의 디자인 블로그 voice로 다시 쓴다.
8
+ 한국어 canonical의 뜻과 사실을 다른 언어에서 **같이 이해되게** 만든다. 문장 단위 대응표를 만들지 않는다. EN, JA, ZH-CN, ZH-TW는 서로 독립된 원고다.
10
9
 
11
- 참조: Frontitude brand-voice translation model, LINE localization playbook.
10
+ ## 0. Source contract
12
11
 
13
- ## 0. Source of truth
12
+ - KO가 canonical이다. 다른 locale은 `source_revision` 또는 canonical content hash를 가진다.
13
+ - KO가 바뀌면 파생 locale을 stale로 표시하고 변경된 의미 단위를 다시 adapt한다.
14
+ - 공유하는 것은 thesis, 사실, 정보 계층, 명령, URL, 제품 동작이다.
15
+ - 공유하지 않는 것은 문장 순서, 비유, 인사, 주어, 문장 길이, 문장부호, 설명용 용어다.
16
+ - canonical에 없는 사실은 어떤 locale에도 추가하지 않는다.
14
17
 
15
- **KR이 canonical**. EN/JP/ZH-TW는 derivative. KR이 갱신되면 다른 locale도 무효화.
18
+ ## 1. Target locale
16
19
 
17
- ## 1. 대상 locale별 룰
20
+ ### EN (`en`)
18
21
 
19
- ### 1.1 EN (en)
22
+ - 행동과 관찰 가능한 결과를 먼저 쓴다.
23
+ - repeated `not X, but Y`, 3단 슬로건, 추상 찬사를 원문의 구조 그대로 옮기지 않는다.
24
+ - 제품이 이미 쓰는 US/UK spelling을 유지한다.
25
+ - 한국 서비스는 첫 등장에만 독자에게 필요한 짧은 설명을 붙인다.
20
26
 
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'")
27
+ ### JA (`ja`)
31
28
 
32
- ### 1.2 JP (ja)
29
+ - 설명문은 です・ます調를 기본으로 하고 같은 섹션에서 register를 섞지 않는다.
30
+ - 필요 없는 `私たちは / あなたは`는 생략한다.
31
+ - 제목은 짧게 쓰고 마침표를 붙이지 않는다.
32
+ - `正本 / 実ルート / 強いプロンプト` 같은 직역 대신 `唯一の基準 / 実際の製品画面 / 作業依頼`처럼 뜻이 통하는 제품 용어를 쓴다.
33
33
 
34
- - Voice baseline: note.com デザイン カテゴリ, クックパッド開発者ブログ
35
- - 종결: です・ます 일관 (敬体)
36
- - 격식 register: 영미보다 한 단계 더 정중
37
- - 문화 swap:
38
- - "토스" → "Toss (韓国最大級のフィンテック)"
39
- - 한국 특유의 이웃문화 ref → 일본식 「ご近所」 비유
40
- - 존경어/겸양어 자연스럽게 ("저는 ~한다고 생각해요" → "私は〜と考えています")
41
- - 분량: KR 자수의 0.85~1.0
42
- - 헤더: 한국어 짧은 헤더와 비슷한 호흡 ("토스 느낌の始まり")
43
- - 한자: 常用漢字 위주. 어려운 한자는 仮名 병기.
34
+ ### ZH-CN (`zh-CN`)
44
35
 
45
- ### 1.3 ZH-TW (zh-tw)
36
+ - 사용자-facing AI는 `AI 编程助手`, 기술 역할은 문맥에 따라 `智能体角色`로 구분한다.
37
+ - `赋能 / 无缝 / 全新升级 / 打造闭环` 같은 찬사를 기능 설명 대신 쓰지 않는다.
38
+ - `项目唯一设计依据 / 实际产品页面 / 可重复执行的检查 / 空状态`처럼 간결한 제품 용어를 쓴다.
39
+ - 행동과 결과를 먼저 쓰고 영어 정보 순서를 복제하지 않는다.
46
40
 
47
- - Voice baseline: 數位時代, INSIDE 硬塞網
48
- - **번체** (簡体 금지). 「設計」「顯示」「優化」.
49
- - 문화 swap:
50
- - "토스" → "Toss (南韓金融科技龍頭)"
51
- - "당근" → "Karrot (南韓地區型二手交易平台)"
52
- - 한국 idiom → 中華圈 idiom (가능한 경우)
53
- - 분량: KR 자수의 0.6~0.75
54
- - 인용부호: 「」 사용
55
- - 헤더: KR 짧은 헤더와 비슷한 호흡 (「Toss 給人的感覺,從何而來」)
41
+ ### ZH-TW (`zh-TW`)
56
42
 
57
- ## 2. Adaptation 7단계 절차
43
+ - ZH-CN의 글자를 번체로 바꾸지 않고 대만 제품 문체로 다시 쓴다.
44
+ - `軟體 / 資訊 / 使用者 / 影片 / 預設 / 介面 / 專案 / 儲存 / 設定 / 登入 / 資料`를 우선한다.
45
+ - 사용자-facing AI는 `AI 程式助理`, 저장소는 `程式碼儲存庫` 또는 `專案儲存庫`로 쓴다.
46
+ - 일반 UI QA는 `檢查`, 규정·공식 audit만 `稽核`을 쓴다.
58
47
 
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>` 채우기
48
+ 세부 후편집 규칙은 설치된 `omd-humanize/references/locale-playbooks.md`에서 대상 locale만 읽는다.
66
49
 
67
- ## 3. 보존 (절대 변경 금지)
50
+ ## 2. Adaptation workflow
68
51
 
69
- - 코드 블록 내부 (변수명, 함수명, 주석 영문 유지)
70
- - URL, 파일 경로
71
- - 사람 이름 / 회사명 (단, 출현에 gloss는 OK)
72
- - figure src
73
- - frontmatter slug
74
- - 수치 / 통계
52
+ 1. KO canonical, frontmatter, DESIGN.md §10, 승인된 제품 용어를 읽는다.
53
+ 2. 문서의 thesis 1–3개와 보호 구간(수치·명령·URL·ID·인용·제품 동작)을 적는다.
54
+ 3. 문서 구조를 의미 단위로 나눈다. H2 개수는 정보 parity를 확인하는 보조 지표일 뿐 강제로 맞추지 않는다.
55
+ 4. target locale에서 사용자가 읽을 순서로 문단을 새로 구성한다.
56
+ 5. 문화 맥락이 없으면 첫 등장에만 짧게 설명한다. 등가 비유가 없으면 억지로 새 비유를 만들지 않는다.
57
+ 6. code, command, URL, path, slug, skill/agent ID를 원문과 대조한다.
58
+ 7. `omd:humanize`의 target-locale audit으로 번역투, locale 혼입, 기계적 구조를 검증한다.
59
+ 8. UI copy면 실제 locale route에서 줄바꿈, overflow, CTA 동작, aria label을 확인한다.
75
60
 
76
- ## 4. 비전형 케이스
61
+ ## 3. Output metadata
77
62
 
78
- | 원문 | 대응 |
79
- |---|---|
80
- | KR 특유의 이모지 사용 패턴 (`ㅎㅎ`, `^^`) | EN/JP/ZH-TW에서 제거. 톤은 다른 방식으로 표현. |
81
- | 한자어 농담 | locale 등가 농담 없으면 그냥 의미만 유지하고 농담 톤 표시 |
82
- | `안녕하세요` 같은 의례 인사 | EN은 informal greeting, JP는 「こんにちは」, ZH-TW는 「大家好」 |
83
- | Toss/당근 같은 회사명 인지도 차이 | 첫 등장에서 1줄 gloss, 이후 그대로 |
63
+ 문서 파일에는 가능한 경우 아래를 기록한다.
84
64
 
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
65
  ```yaml
96
- locale: en
66
+ locale: ja
97
67
  source_locale: ko
98
- source_revision: <git sha of ko at time of adaptation>
68
+ source_revision: <ko content hash or git sha>
99
69
  adapted_at: <ISO date>
100
70
  ```
101
71
 
102
- ## 6. 품질 체크 (self-audit)
103
-
104
- 각 locale 생성 후 writer가 직접 검증:
105
- - H2 카운트가 KR과 일치
106
- - 인용 / 통계 누락 0건
107
- - figure src 경로 일치
108
- - 분량이 위 1.x의 비율 범위
109
- - 첫 출현 회사명 모두 gloss 처리됨
110
- - 코드 블록 변경 0건
72
+ 코드 dictionary처럼 frontmatter가 없으면 locale manifest 또는 테스트 fixture에 같은 revision을 기록한다.
111
73
 
112
- 미달 동일 locale 재작성 (orchestrator round 카운터 증가).
74
+ ## 4. Quality gate
113
75
 
114
- ## 7. KR 갱신 시 staleness
76
+ - 보호 구간 변경 0
77
+ - 다른 locale의 사용자-facing 용어 혼입 0
78
+ - 제거된 기능·섹션을 소개하는 stale copy 0
79
+ - target locale에서 반복되는 기계적 대조·추상 찬사 cluster 0
80
+ - UI route의 horizontal overflow와 잘린 label 0
81
+ - canonical이 바뀌었는데 revision이 그대로인 파생 원고 0
115
82
 
116
- KR이 수정되면 EN/JP/ZH-TW의 `source_revision`이 outdated. orchestrator가 다시 호출. 부분 갱신 가능 (수정된 H2 섹션만 re-adapt).
83
+ 미달 locale만 다시 작업한다. 영어 원고나 ZH-CN 원고를 fallback으로 노출하지 않는다.
117
84
 
118
- ## 8. Anti-patterns
85
+ ## 금지
119
86
 
120
- - Google Translate 직역 흔적
121
- - KR-only ref그대로 둠 (예: "강남에서 일하는데" → 영어판에 그대로)
122
- - 분량 mismatch (EN이 KR과 같은 자수)
123
- - 헤더 number 불일치
124
- - KR 없이 EN을 먼저 작성 (KR=canonical 원칙 위배)
87
+ - 영어 문장을 모든 locale object의 prose fallback으로 사용
88
+ - ZH-TW가 ZH-CN prose상속
89
+ - 단락별 1:1 직역, 문장 순서 강제, 길이 비율을 품질 점수로 사용
90
+ - 고유명사를 알리기 위해 원문에 없는 시장 지위·성과를 추가
91
+ - `fallback`, `shim`, `truth source`, `strong prompt` 같은 설명용 영어를 그대로 노출
@@ -1,6 +1,6 @@
1
1
  ---
2
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 동시 발행', '디자인 리뷰 받고 다듬어줘')."
3
+ description: "멀티 에이전트 디자인 워크플로우 supervisor. writer, locale adaptation, humanize, UI slop audit, designer review, final QA, image materialization을 routing한다. 2-round revision cap 유지하며 다국어 문서·UI 개선·출간 준비처럼 여러 역할이 필요한 요청에 사용한다."
4
4
  user-invocable: true
5
5
  ---
6
6
 
@@ -17,7 +17,9 @@ omd v0.2 agent layer의 **supervisor**. 한 글/한 컴포넌트가 여러 speci
17
17
  | 역할 | subagent | 용도 |
18
18
  |---|---|---|
19
19
  | Writer | `omd-kr-writer` | 한국어 본문 작성. `preset_id` 인자로 voice 결정. |
20
- | Localizer | `omd-locale-adapter` | KR → EN/JP/ZH-TW **adaptation** (번역 아님) |
20
+ | Localizer | `omd-locale-adapter` | KR → EN/JA/ZH-CN/ZH-TW **adaptation** (번역 아님) |
21
+ | Copy finalizer | `omd-humanizer` | locale별 번역투·기계적 구조를 국소 수정하고 보호 구간 대조 |
22
+ | Slop auditor | `omd-slop-auditor` | 실제 route의 context-free UI/copy cluster를 품질·취향과 분리해 감사 |
21
23
  | Visual reviewer | `omd-designer-review` | DESIGN.md 대비 typo/색/spacing/state 검수 |
22
24
  | Critic | `omd-final-qa` | Read-only rubric verdict. 2-round cap 강제. |
23
25
  | Image materializer | `omd-codex-image` | `<!-- omd:gen-image -->` 블록을 채널별로 실체화 (Codex native gen / asset-curator fallback / OpenCode user-queue) |
@@ -34,7 +36,9 @@ omd v0.2 agent layer의 **supervisor**. 한 글/한 컴포넌트가 여러 speci
34
36
  ```
35
37
  사용자 요청 도착
36
38
  ├─ "글 작성" 키워드 → Stage 1: omd-kr-writer
37
- ├─ 다국어 요청 ("EN", "영문", "JP")Stage 3 추가
39
+ ├─ "AI 티/번역투/문장이 기계적" → omd-humanizer
40
+ ├─ 다국어 요청 ("EN", "영문", "JA", "간체", "대만어") → Stage 3 + locale별 humanize 추가
41
+ ├─ "AI slop/템플릿 같음" → omd-slop-auditor → 수정은 omd:apply
38
42
  ├─ artifact 첨부 + "리뷰" → Stage 2부터 진입
39
43
  └─ "출간 ready" → Stage 4 final-qa로 직행
40
44
  ```
@@ -43,9 +47,11 @@ omd v0.2 agent layer의 **supervisor**. 한 글/한 컴포넌트가 여러 speci
43
47
 
44
48
  ```
45
49
  Stage 1 WRITE omd-kr-writer (preset=toss-tech-design)
50
+ Stage 1h HUMANIZE omd-humanizer (KO 보호 구간 + 자연스러움 검증)
46
51
  Stage 2 REVIEW omd-designer-review (artifact + brand DESIGN.md)
47
52
  Stage 2r REVISION omd-kr-writer (review feedback 반영) ← max 2 round
48
- Stage 3 LOCALIZE omd-locale-adapter (KR → EN/JP)
53
+ Stage 3 LOCALIZE omd-locale-adapter (KR → EN/JA/ZH-CN/ZH-TW)
54
+ Stage 3h HUMANIZE omd-humanizer (각 locale 독립 검증)
49
55
  Stage 4 CRITIC omd-final-qa (rubric, read-only)
50
56
  Stage 4r REVISION omd-kr-writer (final-qa feedback) ← max 2 round (Stage 2와 별도 카운트)
51
57
  Stage 4i IMAGES omd-codex-image (`<!-- omd:gen-image -->` 블록 처리, 채널별 분기)
@@ -114,7 +120,7 @@ prior_review: null # 또는 review report 경로
114
120
 
115
121
  ## 9. 병렬화 허용 케이스
116
122
 
117
- - KR이 PASS된 뒤 EN/JP/ZH-TW **localization은 병렬** (각각 다른 파일이라 conflict 없음)
123
+ - KR이 PASS된 뒤 EN/JA/ZH-CN/ZH-TW **adaptation은 병렬** (각각 다른 파일이라 conflict 없음). ZH-TW는 ZH-CN을 상속하지 않는다.
118
124
  - DESIGN.md re-read는 stage마다 강제 (Anthropic best practice — memory hallucination 방지)
119
125
 
120
126
  ## 10. 종료 조건
@@ -95,7 +95,12 @@ Phase 7: 사용자 요약 + 다음 단계 안내
95
95
  ## Phase 1 — 입력 검증
96
96
 
97
97
  사용자 요청에서 brand id 추출:
98
- - 명시 brand 이름 (한글/영문) → `.claude/data/reference-fingerprints.json` `items[].id` 매칭
98
+ - 명시 brand 이름 (한글/영문) → 아래 순서에서 찾은 첫 `reference-fingerprints.json`의 `items[].id` 매칭:
99
+ 1. `.codex/data/reference-fingerprints.json`
100
+ 2. `.claude/data/reference-fingerprints.json`
101
+ 3. `.opencode/data/reference-fingerprints.json`
102
+ 4. `node_modules/oh-my-design-cli/data/reference-fingerprints.json`
103
+ 5. `data/reference-fingerprints.json` (개발 레포)
99
104
  - 없으면 사용자에게 묻기: "어느 reference brand 자료를 가져올까요? (예: banksalad, toss, socar)"
100
105
 
101
106
  id가 카탈로그에 없으면 종료 + "X는 reference 카탈로그에 없어요. omd:init으로 추가 가능합니다."
@@ -106,19 +111,21 @@ id가 카탈로그에 없으면 종료 + "X는 reference 카탈로그에 없어
106
111
 
107
112
  <!-- omd:catalog-resolution-order — omd-init/omd-harness SKILL.md + agents/omd-master.md 와 동일 순서 강제. drift guard: test/unit/core/catalog-resolution-order.test.ts -->
108
113
 
109
- 1. `.claude/data/references/<id>/DESIGN.md` (installer 복사 — npx 설치 기본 경로; 디렉토리에는 **DESIGN.md만** 보장)
110
- 2. `node_modules/oh-my-design-cli/web/references/<id>/DESIGN.md` (로컬 npm 설치 직접 경로 디렉토리에 _promo.json/_research.md 포함)
111
- 3. `web/references/<id>/DESIGN.md` (개발 레포)
112
- 4. `https://oh-my-design.kr/<id>/design.md` 를 fetch (WebFetch 또는 `curl -fsSL`) — 1~3 로컬 경로가 전부 없을 때. 200이면 본문이 곧 reference DESIGN.md. 가져온 내용을 `.claude/data/references/<id>/DESIGN.md`로 캐시해 다음부터는 로컬 캐시(경로 1)로 잡히게 한다.
114
+ 1. `.codex/data/references/<id>/DESIGN.md` (Codex installer copy; 디렉토리에는 **DESIGN.md만** 보장)
115
+ 2. `.claude/data/references/<id>/DESIGN.md` (Claude Code / Cursor installer copy; 디렉토리에는 **DESIGN.md만** 보장)
116
+ 3. `.opencode/data/references/<id>/DESIGN.md` (OpenCode installer copy; 디렉토리에는 **DESIGN.md만** 보장)
117
+ 4. `node_modules/oh-my-design-cli/web/references/<id>/DESIGN.md` (로컬 npm 설치 직접 경로 디렉토리에 _promo.json/_research.md 포함)
118
+ 5. `web/references/<id>/DESIGN.md` (개발 레포)
119
+ 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을 생성한다.
113
120
 
114
- `<refdir>` = resolve된 DESIGN.md가 있는 디렉토리 (tier 4로 fetch 경우 캐시 `.claude/data/references/<id>/`). `_promo.json`/`_research.md`는 (1)/(4)에 없을 수 있으니, 없으면 (2)/(3)로 폴백하고 그래도 없으면 fingerprints 기반 추론으로 진행.
121
+ `<refdir>` = resolve된 DESIGN.md가 있는 디렉토리 (tier 6 fetch 규칙으로 정한 활성 채널 cache dir). `_promo.json`/`_research.md`는 installer copy나 network cache에 없을 수 있으니, 없으면 (4)/(5)로 폴백하고 그래도 없으면 fingerprints 기반 추론으로 진행.
115
122
 
116
123
  다음을 순서대로 시도:
117
124
 
118
125
  1. **homepage URL**:
119
126
  - `<refdir>/_promo.json`의 `logo_url`이 brand site면 거기서 도메인 추출
120
127
  - 없으면 `<refdir>/_research.md`에서 Tier 1 source URL grep
121
- - 둘 다 없으면 `.claude/data/reference-fingerprints.json`의 `items[].category_raw` 기반으로 추론 — 마지막 수단
128
+ - 둘 다 없으면 Phase 1에서 channel-aware하게 resolve한 `reference-fingerprints.json`의 `items[].category_raw` 기반으로 추론 — 마지막 수단
122
129
 
123
130
  2. **logo URL** (`_promo.json` 우선):
124
131
  - `_promo.json.logo_url` → 그대로 사용
@@ -254,15 +261,57 @@ canonical DESIGN.md가 "BM JUA를 landing/promo accent로"라고 적어뒀더라
254
261
 
255
262
  mode=clone이면 omd:init/omd:harness가 생성 HTML `<head>`에 fonts.json의 `live_observed: true` 항목 `html_link`를 **반드시** 박는다. mode=inspired면 폰트 로드는 사용자 선택.
256
263
 
257
- ## Phase 3.9 — Browser harness 자동 선택 (v1.3.6 신설)
264
+ ## Phase 3.9 — MCP-free evidence collector (v2)
258
265
 
259
- 라이브 캡쳐 도구는 가지 옵션. 환경 detect 빠른 사용:
266
+ 라이브 캡쳐의 정본은 버전된 `ReferenceEvidenceBundle`이다. 에이전트가 매번 다른 evaluate 스니펫을 만들지 않는다.
267
+
268
+ ### 기본 경로: packaged/local collector
269
+
270
+ 개발 저장소 안에서는:
271
+
272
+ ```bash
273
+ npm --prefix web run capture:reference -- <id-or-url> \
274
+ --max-routes 3 \
275
+ --out "$PWD/assets/_reference/<id>/evidence.json"
276
+ ```
277
+
278
+ npm으로 설치된 스킬에서는:
279
+
280
+ ```bash
281
+ # 현재 읽고 있는 SKILL.md와 같은 디렉토리의 bundled collector를 사용한다.
282
+ # 예: .agents/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs
283
+ SKILL_DIR="<directory-containing-this-SKILL.md>"
284
+ COLLECTOR="$SKILL_DIR/scripts/capture-reference-evidence.mjs"
285
+ node "$COLLECTOR" "<homepage-url>" --id "<id>" \
286
+ --max-routes 3 \
287
+ --out "$PWD/assets/_reference/<id>/evidence.json"
288
+ ```
289
+
290
+ 설치된 collector는 Node 18에서 실행되는 단일 ESM 파일이며 `playwright-core`까지 내부에 포함한다. 따라서 프로젝트 `node_modules`, npm cache, TypeScript runtime에 의존하지 않고 system Chrome을 직접 사용한다. Chrome 경로가 표준 위치가 아니면 `OMD_CHROME_PATH`만 지정한다. MCP server, MCP SDK, 별도 API key는 필요 없다. 설치형 collector에는 항상 Phase 2에서 확정한 homepage URL과 `--id`를 함께 전달한다. 이 방식은 npm package가 일회성 `npx` cache에서 사라진 뒤에도 동작한다.
291
+
292
+ 현재 SKILL.md의 위치를 직접 알 수 없는 shell 환경에서는 아래 순서에서 첫 실행 파일을 찾는다:
293
+
294
+ ```bash
295
+ for candidate in \
296
+ "$PWD/.claude/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs" \
297
+ "$PWD/.agents/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs" \
298
+ "$PWD/.opencode/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs" \
299
+ "$HOME/.claude/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs" \
300
+ "$HOME/.agents/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs" \
301
+ "$HOME/.config/opencode/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs"
302
+ do
303
+ if [ -f "$candidate" ]; then COLLECTOR="$candidate"; break; fi
304
+ done
305
+ test -n "${COLLECTOR:-}" || { echo "capture_blocked: bundled collector not found"; exit 1; }
306
+ ```
307
+
308
+ 필수 산출물은 `evidence.json` 하나이며 schema version, surface URL, selector, computed style, FontFaceSet, `@font-face` source, interaction state, component fingerprint와 coverage를 포함한다. hover/focus/pressed는 state-specific computed snapshot으로 남고, 안전하게 열 수 있는 menu/dialog/form-error/tab/toast는 `interactions[]`의 trigger/target/state로 남는다. `tokens.json`, `.live-inspect-proof.json`, `structure.json`은 이 bundle의 하위 projection으로만 만든다.
260
309
 
261
310
  ### Fast-path: browser-harness (있으면 우선)
262
311
 
263
312
  `shutil.which("browser-harness")` 또는 `command -v browser-harness`로 detect. 있고 `browser-harness --doctor` 가 `[ok ] chrome running` 띄우면 fast-path:
264
313
 
265
- - **장점**: heredoc 단일 호출 + Chrome remote-debugging CDP 직접 → playwright MCP 대비 3-5x 빠름 (실측 3.5s/페이지). sub-agent의 "did live inspect" 거짓 보고 불가능 (heredoc 실행 자체가 evidence).
314
+ - **용도**: 이미 로그인된 surface나 collector가 열지 못한 메뉴/모달을 보충한다. sub-agent의 "did live inspect" 보고 대신 실제 raw evidence를 남긴다.
266
315
  - **prerequisite**: Python 3.11+, uv 또는 pip, Chrome with `--remote-debugging-port=9222` 또는 `chrome://inspect#remote-debugging` 활성.
267
316
  - **호출 패턴**:
268
317
  ```bash
@@ -293,43 +342,47 @@ mode=clone이면 omd:init/omd:harness가 생성 HTML `<head>`에 fonts.json의 `
293
342
  capture_screenshot(path="<assets_dir>/screenshots/hero-desktop.png", full=False)
294
343
  PY
295
344
  ```
296
- - 결과를 `tokens.json#live_overrides` + `.live-inspect-proof.json` raw_samples에 그대로 박음.
345
+ - 결과를 임의 JSON으로 끝내지 말고 `evidence.json`의 surface/state evidence와 동일한 필드로 reconcile한다. screenshot은 보조 자료이며 토큰 근거를 대신하지 않는다.
297
346
 
298
- ### Fallback: playwright MCP (default)
347
+ ### Fallback: browser-harness only
299
348
 
300
- browser-harness 미설치면 `mcp__playwright__browser_navigate` + `browser_evaluate` + `browser_take_screenshot` 사용 (이전 버전 동작 그대로).
349
+ packaged collector가 없고 browser-harness 있으면 fast-path를 사용한다. 다 없으면 live 검증을 했다고 주장하지 말고 `capture_blocked`를 기록한다. Playwright MCP로 fallback하지 않는다.
301
350
 
302
351
  ### 자동 선택 logic
303
352
 
304
353
  ```bash
305
- if command -v browser-harness >/dev/null && browser-harness --doctor 2>&1 | grep -q "ok.*chrome running"; then
306
- echo "MODE=harness"
354
+ if [ -f "web/scripts/capture-reference-evidence.ts" ]; then
355
+ echo "MODE=local-collector"
356
+ elif [ -n "${COLLECTOR:-}" ] && [ -f "$COLLECTOR" ]; then
357
+ echo "MODE=packaged-collector"
358
+ elif command -v browser-harness >/dev/null && browser-harness --doctor 2>&1 | grep -q "ok.*chrome running"; then
359
+ echo "MODE=harness-supplement"
307
360
  else
308
- echo "MODE=playwright"
361
+ echo "MODE=capture-blocked"
309
362
  fi
310
363
  ```
311
364
 
312
365
  ### 사용자 안내 (선택)
313
366
 
314
367
  skill 진입 시 사용자에게 한 줄로 알림:
315
- > "browser-harness 감지됨 fast-path 사용 (3.5s/page)" 또는 "playwright MCP 사용 browser-harness 설치하면 3x 빠름: github.com/browser-use/browser-harness"
368
+ > "MCP 없이 evidence collector로 N개 surface를 캡쳐합니다." 또는 "collector가 없어 live capture가 막혔습니다."
316
369
 
317
370
  이 안내는 informational only, 사용자 action 요구 X.
318
371
 
319
372
  ## Phase 4 — 토큰 캡쳐 (facts)
320
373
 
321
- **Proof gate (위반 = regression)**: 이 Phase는 실제 playwright navigate + computed style 추출이 일어났음을 후속 generator에게 증명하는 artifact를 남겨야 함. 이전 버전(v1.3.3)에서 sub-agent가 "라이브 inspect 했다" 보고하지만 실제로는 canonical 값만 복사하는 결함이 관측됨. proof gate가 이를 차단:
374
+ **Proof gate (위반 = regression)**: 이 Phase는 실제 navigation + computed style 추출이 일어났음을 `evidence.json`으로 증명해야 한다. 사람이 "라이브 inspect 했다" 문장은 증거가 아니다.
322
375
 
323
376
  ### 4.0 — `.live-inspect-proof.json` 작성 (REQUIRED, 이 파일 없으면 후속 generator는 live_overrides 무시)
324
377
 
325
- playwright `browser_navigate` 직후 `browser_evaluate`로 raw computed style 5개 이상 추출하고 결과를 `assets/_reference/<id>/.live-inspect-proof.json`에 저장:
378
+ collector의 `evidence.json`에서 raw computed style 5개 이상을 projection해 `assets/_reference/<id>/.live-inspect-proof.json`에 저장한다:
326
379
 
327
380
  ```json
328
381
  {
329
382
  "navigated_at": "<ISO-8601 with seconds>",
330
383
  "source_url": "https://www.banksalad.com",
331
384
  "viewport": "1280x800",
332
- "tool_used": "playwright_mcp_browser_evaluate",
385
+ "tool_used": "reference_evidence_collector_v1",
333
386
  "raw_samples": [
334
387
  { "element_selector": "body", "font-family": "Pretendard, ...", "color": "rgb(0, 0, 0)", "background": "rgba(0, 0, 0, 0)" },
335
388
  { "element_selector": "header nav a:first-child", "font-size": "14px", "font-weight": "500" },
@@ -337,19 +390,20 @@ playwright `browser_navigate` 직후 `browser_evaluate`로 raw computed style 5
337
390
  { "element_selector": ".hero-section section", "background-color": "rgba(0, 0, 0, 0)" },
338
391
  { "element_selector": "footer", "background-color": "rgb(255, 255, 255)" }
339
392
  ],
340
- "playwright_response_hash": "<5+ char of returned evaluate result>"
393
+ "evidence_schema_version": 1,
394
+ "evidence_bundle": "./evidence.json"
341
395
  }
342
396
  ```
343
397
 
344
- 후속 generator (omd:init / omd:harness)는 파일이 **존재하고 raw_samples 길이 ≥5** 이어야만 `tokens.json#live_overrides`를 신뢰. 파일 없거나 비어있으면 canonical만 사용.
398
+ 후속 generator (omd:init / omd:harness)는 `evidence.json`의 `schemaVersion === 1`, `surfaces.length >= 1`, raw element ≥5 먼저 확인한다. legacy proof 파일만 있고 bundle이 없으면 canonical만 사용한다.
345
399
 
346
400
  ### 4.1 — drift detection (proof와 tokens.json#live_overrides 일관성)
347
401
 
348
- tokens.json의 `live_overrides` 값이 캡쳐된 canonical 값과 **byte-for-byte 동일**하면 live inspect가 실제로는 → live_overrides 블록을 통째로 삭제하고 사용자에게 "live inspect 결과가 canonical과 동일 차이 없거나 inspect 실패. tokens.json#live_overrides 미사용."이라고 알림. metadata note만 적고 실제 hex override 없는 거짓 live_overrides 금지.
402
+ `tokens.json#live_overrides`의 값은 bundle의 `surfaceId + selector + style property`로 역추적 가능해야 한다. canonical과 값이 같다는 이유만으로 실패 처리하지는 않지만, provenance가 없으면 override 삭제한다.
349
403
 
350
404
  ### 4.2 — token 캡쳐 본문
351
405
 
352
- playwright MCP를 사용해 homepage에 navigate한 뒤 computed styles추출. 결과는 `assets/_reference/<id>/tokens.json`:
406
+ `evidence.json`의 aggregate와 representative raw elementreconcile한다. 결과는 `assets/_reference/<id>/tokens.json`:
353
407
 
354
408
  ```json
355
409
  {
@@ -385,7 +439,7 @@ playwright MCP를 사용해 homepage에 navigate한 뒤 computed styles를 추
385
439
  }
386
440
  ```
387
441
 
388
- inspect 패턴: 5-10 elements 샘플링 (`body` / `header nav` / hero CTA / card / `footer` 대표 element의 getComputedStyle 추출 — Phase 3.9의 JS 패턴과 동일한 방식). 캡쳐하려는 brand가 카탈로그에 없으면 카탈로그(`oh-my-design.kr/design-systems`)에서 먼저 찾아보고, 카탈로그에 brand를 직접 추가하는 워크플로우(omd-add-reference)는 dev 레포(github.com/kwakseongjae/oh-my-design)에만 존재 — 배포본(npx 설치)에는 포함되지 않는다.
442
+ 최소 샘플은 `body` / heading / hero CTA / card 또는 form / footer이며, 샘플은 bundle selector를 보존한다. 캡쳐하려는 brand가 카탈로그에 없으면 URL을 직접 collector에 전달한다. 카탈로그에 신규 brand를 추가하는 워크플로우(omd-add-reference)는 dev 레포에만 존재한다.
389
443
 
390
444
  ## Phase 4.5 — 구조 cue 캡쳐 (structure.json)
391
445
 
@@ -505,7 +559,7 @@ structure.json에는 텍스트·이미지·copy·brand statement 일체 X. 오
505
559
 
506
560
  ### 5.2 Hero screenshot
507
561
 
508
- playwright `mcp__playwright__browser_take_screenshot`로 homepage 위 fold만 캡쳐:
562
+ evidence collector와 같은 로컬 Playwright context 또는 browser-harness로 homepage 위 fold만 캡쳐(MCP 불필요):
509
563
 
510
564
  - viewport: 1280×800 (데스크탑 기본)
511
565
  - fullPage: **false** — 위 fold만