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.
- package/.claude/hooks/lib/preferences-parser.cjs +1 -0
- package/.claude/hooks/lib/preferences-writer.cjs +1 -0
- package/.claude/hooks/post-edit-watch.cjs +1 -0
- package/.claude/hooks/session-end-foldin.cjs +1 -0
- package/.claude/hooks/session-state-loader.cjs +1 -0
- package/.claude/hooks/skill-activation.cjs +1 -0
- package/.claude/settings.json +10 -1
- package/.github/assets/logo-bg.png +0 -0
- package/AGENTS.md +20 -1
- package/CHANGELOG.md +482 -0
- package/MIGRATION.md +103 -0
- package/README.ja.md +56 -19
- package/README.ko.md +47 -30
- package/README.md +48 -30
- package/README.zh-TW.md +59 -22
- package/agents/AGENT.md +8 -7
- package/agents/omd-codex-image.md +1 -1
- package/agents/omd-critic.md +6 -7
- package/agents/omd-designer-review.md +1 -1
- package/agents/omd-final-qa.md +1 -1
- package/agents/omd-humanizer.md +38 -0
- package/agents/omd-kr-writer.md +3 -4
- package/agents/omd-locale-adapter.md +12 -16
- package/agents/omd-master.md +24 -19
- package/agents/omd-microcopy.md +1 -1
- package/agents/omd-orchestrator.md +7 -8
- package/agents/omd-slop-auditor.md +31 -0
- package/agents/omd-ux-researcher.md +1 -1
- package/data/reference-fingerprints.json +1995 -38
- package/dist/bin/oh-my-design.js +16 -8
- package/dist/bin/oh-my-design.js.map +1 -1
- package/dist/chunk-UJIHCEYF.js +99 -0
- package/dist/chunk-UJIHCEYF.js.map +1 -0
- package/dist/doctor-LDWSFM3I.js +763 -0
- package/dist/doctor-LDWSFM3I.js.map +1 -0
- package/dist/install-skills-ZZFNJ2II.js +1120 -0
- package/dist/install-skills-ZZFNJ2II.js.map +1 -0
- package/docs/CLI_QUICKSTART.md +157 -0
- package/package.json +25 -4
- package/scripts/postinstall.cjs +5 -4
- package/skills/claude-design/SKILL.md +38 -14
- package/skills/claude-design/references/claude-design-flow.md +11 -11
- package/skills/claude-design/references/codebase-analysis.md +5 -4
- package/skills/omd-final-qa/SKILL.md +1 -1
- package/skills/omd-harness/SKILL.md +51 -50
- package/skills/omd-humanize/SKILL.md +116 -0
- package/skills/omd-humanize/agents/openai.yaml +4 -0
- package/skills/omd-humanize/references/locale-playbooks.md +102 -0
- package/skills/omd-humanize/references/sources.md +11 -0
- package/skills/omd-init/SKILL.md +18 -12
- package/skills/omd-locale-adapter/SKILL.md +58 -91
- package/skills/omd-orchestrator/SKILL.md +11 -5
- package/skills/omd-reference-capture/SKILL.md +80 -26
- package/skills/omd-reference-capture/scripts/PLAYWRIGHT-LICENSE.txt +202 -0
- package/skills/omd-reference-capture/scripts/PLAYWRIGHT-NOTICE.txt +5 -0
- package/skills/omd-reference-capture/scripts/THIRD_PARTY_NOTICES.md +3 -0
- package/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs +159906 -0
- package/skills/omd-slop-audit/SKILL.md +110 -0
- package/skills/omd-slop-audit/agents/openai.yaml +4 -0
- package/skills/omd-slop-audit/references/pattern-catalog.md +96 -0
- package/skills/omd-slop-audit/references/sources.md +24 -0
- package/web/references/104/DESIGN.md +354 -0
- package/web/references/11st/DESIGN.md +197 -316
- package/web/references/29cm/DESIGN.md +297 -393
- package/web/references/42dot/DESIGN.md +390 -0
- package/web/references/8percent/DESIGN.md +438 -0
- package/web/references/ably/DESIGN.md +267 -572
- package/web/references/acer/DESIGN.md +329 -0
- package/web/references/airbnb/DESIGN.md +219 -557
- package/web/references/alipay/DESIGN.md +179 -420
- package/web/references/apple/DESIGN.md +224 -498
- package/web/references/asleep/DESIGN.md +402 -0
- package/web/references/au/DESIGN.md +334 -0
- package/web/references/autopedia/DESIGN.md +382 -0
- package/web/references/aws-cloudscape/DESIGN.md +241 -0
- package/web/references/baemin/DESIGN.md +332 -491
- package/web/references/banksalad/DESIGN.md +269 -180
- package/web/references/barogo/DESIGN.md +416 -0
- package/web/references/beusable/DESIGN.md +464 -0
- package/web/references/bilibili/DESIGN.md +206 -374
- package/web/references/bmw/DESIGN.md +162 -276
- package/web/references/brandi/DESIGN.md +184 -325
- package/web/references/catchtable/DESIGN.md +219 -264
- package/web/references/cgv/DESIGN.md +317 -0
- package/web/references/channeltalk/DESIGN.md +210 -336
- package/web/references/china-airlines/DESIGN.md +291 -0
- package/web/references/cjonstyle/DESIGN.md +453 -0
- package/web/references/class101/DESIGN.md +168 -387
- package/web/references/classum/DESIGN.md +228 -203
- package/web/references/claude/DESIGN.md +242 -479
- package/web/references/clay/DESIGN.md +179 -377
- package/web/references/clickhouse/DESIGN.md +254 -343
- package/web/references/cohere/DESIGN.md +214 -324
- package/web/references/coinone/DESIGN.md +199 -179
- package/web/references/corca/DESIGN.md +414 -0
- package/web/references/coupang/DESIGN.md +205 -475
- package/web/references/cursor/DESIGN.md +240 -381
- package/web/references/dabang/DESIGN.md +248 -213
- package/web/references/dable/DESIGN.md +431 -0
- package/web/references/datarize/DESIGN.md +217 -330
- package/web/references/dealicious/DESIGN.md +402 -0
- package/web/references/drdiary/DESIGN.md +404 -0
- package/web/references/elastic/DESIGN.md +238 -0
- package/web/references/elevenlabs/DESIGN.md +183 -321
- package/web/references/eslite/DESIGN.md +257 -0
- package/web/references/evaair/DESIGN.md +338 -0
- package/web/references/expo/DESIGN.md +238 -331
- package/web/references/familymart-tw/DESIGN.md +254 -0
- package/web/references/ferrari/DESIGN.md +160 -377
- package/web/references/figma/DESIGN.md +197 -451
- package/web/references/fitpet/DESIGN.md +445 -0
- package/web/references/flex/DESIGN.md +170 -253
- package/web/references/framer/DESIGN.md +197 -340
- package/web/references/freee/DESIGN.md +211 -533
- package/web/references/friendliai/DESIGN.md +431 -0
- package/web/references/frip/DESIGN.md +440 -0
- package/web/references/gangnamunni/DESIGN.md +154 -591
- package/web/references/gaudiolab/DESIGN.md +414 -0
- package/web/references/google/DESIGN.md +290 -398
- package/web/references/hashicorp/DESIGN.md +273 -318
- package/web/references/heydealer/DESIGN.md +429 -0
- package/web/references/humanscape/DESIGN.md +433 -0
- package/web/references/hyundai/DESIGN.md +158 -368
- package/web/references/hyundaicard/DESIGN.md +171 -121
- package/web/references/ibm/DESIGN.md +227 -378
- package/web/references/idus/DESIGN.md +450 -0
- package/web/references/igaworks/DESIGN.md +437 -0
- package/web/references/inflearn/DESIGN.md +221 -366
- package/web/references/intuit/DESIGN.md +244 -0
- package/web/references/jandi/DESIGN.md +191 -291
- package/web/references/jobplanet/DESIGN.md +415 -0
- package/web/references/kakao/DESIGN.md +287 -475
- package/web/references/kakaobank/DESIGN.md +220 -521
- package/web/references/kakaogames/DESIGN.md +220 -0
- package/web/references/kakaopay/DESIGN.md +207 -526
- package/web/references/karrot/DESIGN.md +227 -251
- package/web/references/kb-kookmin/DESIGN.md +308 -0
- package/web/references/kbank/DESIGN.md +220 -175
- package/web/references/kmong/DESIGN.md +281 -356
- package/web/references/krds/DESIGN.md +245 -19
- package/web/references/kream/DESIGN.md +224 -359
- package/web/references/kurly/DESIGN.md +211 -533
- package/web/references/lamborghini/DESIGN.md +198 -360
- package/web/references/lguplus/DESIGN.md +259 -0
- package/web/references/likelion/DESIGN.md +283 -0
- package/web/references/line/DESIGN.md +396 -355
- package/web/references/linear.app/DESIGN.md +209 -562
- package/web/references/lotteon/DESIGN.md +386 -0
- package/web/references/lovable/DESIGN.md +255 -349
- package/web/references/makinarocks/DESIGN.md +149 -349
- package/web/references/maum-ai/DESIGN.md +423 -0
- package/web/references/medibloc/DESIGN.md +425 -0
- package/web/references/megabox/DESIGN.md +232 -0
- package/web/references/mercari/DESIGN.md +217 -434
- package/web/references/microsoft/DESIGN.md +234 -388
- package/web/references/mildang/DESIGN.md +411 -0
- package/web/references/millie/DESIGN.md +183 -504
- package/web/references/minimax/DESIGN.md +264 -322
- package/web/references/miricanvas/DESIGN.md +182 -355
- package/web/references/miro/DESIGN.md +234 -232
- package/web/references/mistral.ai/DESIGN.md +231 -314
- package/web/references/mixi/DESIGN.md +234 -0
- package/web/references/moin/DESIGN.md +445 -0
- package/web/references/mongodb/DESIGN.md +219 -316
- package/web/references/musinsa/DESIGN.md +184 -510
- package/web/references/mynavi/DESIGN.md +242 -0
- package/web/references/myrealtrip/DESIGN.md +169 -406
- package/web/references/naver/DESIGN.md +328 -499
- package/web/references/naverwebtoon/DESIGN.md +172 -395
- package/web/references/nhn/DESIGN.md +169 -346
- package/web/references/nhncloud/DESIGN.md +185 -123
- package/web/references/notion/DESIGN.md +271 -475
- package/web/references/nrise/DESIGN.md +417 -0
- package/web/references/ohouse/DESIGN.md +210 -549
- package/web/references/oliveyoung/DESIGN.md +217 -326
- package/web/references/ollama/DESIGN.md +241 -308
- package/web/references/onestore/DESIGN.md +248 -0
- package/web/references/palantir/DESIGN.md +256 -0
- package/web/references/panasonic/DESIGN.md +276 -0
- package/web/references/patternfly/DESIGN.md +259 -0
- package/web/references/payhere/DESIGN.md +438 -0
- package/web/references/pega/DESIGN.md +262 -0
- package/web/references/peoplefund/DESIGN.md +431 -0
- package/web/references/petfriends/DESIGN.md +428 -0
- package/web/references/pinkfong/DESIGN.md +199 -367
- package/web/references/pinterest/DESIGN.md +258 -308
- package/web/references/poya/DESIGN.md +286 -0
- package/web/references/pozalabs/DESIGN.md +438 -0
- package/web/references/protopie/DESIGN.md +419 -0
- package/web/references/qraft/DESIGN.md +448 -0
- package/web/references/quotabook/DESIGN.md +449 -0
- package/web/references/recruit/DESIGN.md +247 -0
- package/web/references/remember/DESIGN.md +202 -396
- package/web/references/resend/DESIGN.md +274 -348
- package/web/references/sakura-internet/DESIGN.md +269 -0
- package/web/references/samsung/DESIGN.md +157 -359
- package/web/references/sandoll/DESIGN.md +445 -0
- package/web/references/sanity/DESIGN.md +241 -375
- package/web/references/scatterlab/DESIGN.md +412 -0
- package/web/references/selectstar/DESIGN.md +439 -0
- package/web/references/servicenow/DESIGN.md +289 -0
- package/web/references/shinhanbank/DESIGN.md +161 -341
- package/web/references/shinhancard/DESIGN.md +208 -319
- package/web/references/sionic/DESIGN.md +454 -0
- package/web/references/sktelecom/DESIGN.md +310 -0
- package/web/references/socar/DESIGN.md +125 -32
- package/web/references/softbank/DESIGN.md +231 -0
- package/web/references/sony/DESIGN.md +234 -0
- package/web/references/soop/DESIGN.md +261 -0
- package/web/references/spacex/DESIGN.md +184 -323
- package/web/references/spotify/DESIGN.md +253 -394
- package/web/references/squeezebits/DESIGN.md +441 -0
- package/web/references/stayfolio/DESIGN.md +422 -0
- package/web/references/stripe/DESIGN.md +212 -491
- package/web/references/supabase/DESIGN.md +244 -316
- package/web/references/tabling/DESIGN.md +415 -0
- package/web/references/taishinbank/DESIGN.md +243 -0
- package/web/references/teamlab/DESIGN.md +240 -0
- package/web/references/teamsparta/DESIGN.md +472 -0
- package/web/references/tellingme/DESIGN.md +392 -0
- package/web/references/tesla/DESIGN.md +244 -427
- package/web/references/thsr/DESIGN.md +284 -0
- package/web/references/thumbtack/DESIGN.md +302 -0
- package/web/references/together.ai/DESIGN.md +257 -304
- package/web/references/toss/DESIGN.md +251 -593
- package/web/references/toss-securities/DESIGN.md +255 -178
- package/web/references/tossbank/DESIGN.md +195 -491
- package/web/references/toyota/DESIGN.md +238 -0
- package/web/references/tving/DESIGN.md +197 -245
- package/web/references/typed/DESIGN.md +413 -0
- package/web/references/uber/DESIGN.md +256 -333
- package/web/references/udn/DESIGN.md +250 -0
- package/web/references/upbit/DESIGN.md +145 -256
- package/web/references/upstage/DESIGN.md +211 -204
- package/web/references/uswds/DESIGN.md +287 -0
- package/web/references/vercel/DESIGN.md +236 -440
- package/web/references/wanted/DESIGN.md +215 -487
- package/web/references/wise/DESIGN.md +223 -231
- package/web/references/wisetracker/DESIGN.md +462 -0
- package/web/references/wooribank/DESIGN.md +245 -0
- package/web/references/yanolja/DESIGN.md +250 -419
- package/web/references/yeogiotte/DESIGN.md +235 -418
- package/web/references/zapier/DESIGN.md +256 -377
- package/web/references/zendesk/DESIGN.md +288 -0
- package/web/references/zigzag/DESIGN.md +200 -621
- package/dist/install-skills-7UUDOLG2.js +0 -734
- package/dist/install-skills-7UUDOLG2.js.map +0 -1
|
@@ -29,12 +29,9 @@ v2의 핵심: ① 코드베이스 → 디자인 컨텍스트 이관(스택/토
|
|
|
29
29
|
상호작용이 막히면 알려진 확장 충돌 버그로 보고 즉시 수동 전환).
|
|
30
30
|
|
|
31
31
|
> **스크립트 경로 규칙:** 런타임 cwd 는 보통 **사용자의 프로젝트 폴더**다(스킬 폴더가
|
|
32
|
-
> 아님).
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
162
|
+
python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/collect_source.py" --root "$PWD" \
|
|
139
163
|
--entry src/app/page.tsx --json # 랜딩
|
|
140
|
-
python3
|
|
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
|
-
> 프로필(
|
|
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
|
|
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
|
|
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
|
|
260
|
+
python3 "$CLAUDE_DESIGN_SKILL_DIR/scripts/analyze_codebase.py" --root "$PWD" --level comprehensive
|
|
261
261
|
|
|
262
262
|
# 머신 JSON — assets[] 는 업로드용 절대경로. 파일로도 저장 가능
|
|
263
|
-
python3
|
|
264
|
-
python3
|
|
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
|
|
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
|
-
>
|
|
377
|
-
>
|
|
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
|
|
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
|
|
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
|
|
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` 는 분석할 프로젝트
|
|
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
|
|
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
|
|
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 (
|
|
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 —
|
|
26
|
+
## Step 1 — Channel-safe role activation + inline recovery (v1.9.0+)
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
먼저 Agent 도구의 사용 가능 role 목록에서 `omd-master`를 확인한다. 있으면 Step 2로 간다. 없을 때는 Markdown을 임의 폴더에 복사하지 않는다. Claude와 Codex의 role schema가 다르고, `.agents/`는 Codex에서 skill 경로이지 role 경로가 아니다.
|
|
29
29
|
|
|
30
|
-
### 1.1 —
|
|
30
|
+
### 1.1 — 현재 채널과 설치물 검증
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
- `.claude/agents
|
|
34
|
-
- `.
|
|
35
|
-
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
### 1.2 — 패키지 source 위치 확인 + 복구 Write
|
|
37
|
+
role 파일이 없거나 schema가 틀렸으면 해당 채널만 최신 설치기로 복구한다:
|
|
40
38
|
|
|
41
39
|
```bash
|
|
42
|
-
#
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
49
|
+
설치 파일이 유효해도 이미 실행 중인 세션의 Agent 목록은 즉시 갱신되지 않을 수 있다. 이 경우 작업을 중단하거나 잘못된 형식으로 복사하지 말고:
|
|
57
50
|
|
|
58
|
-
|
|
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
|
-
|
|
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. .
|
|
167
|
-
# 2.
|
|
168
|
-
# 3.
|
|
169
|
-
|
|
170
|
-
|
|
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` (
|
|
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
|
-
다음
|
|
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
|
-
-
|
|
274
|
-
-
|
|
275
|
-
-
|
|
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
|
-
|
|
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. `.
|
|
579
|
-
2.
|
|
580
|
-
3.
|
|
581
|
-
4. `
|
|
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,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
|
+
실질적인 코드·규칙 문장을 가져올 때는 원 프로젝트의 라이선스와 저작권 고지를 함께 보존한다. 이 스킬은 출처 판별기나 탐지 우회 도구가 아니다.
|