oh-my-design-cli 1.5.1 → 1.6.1

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 (54) hide show
  1. package/AGENTS.md +2 -1
  2. package/README.ko.md +1 -1
  3. package/README.md +38 -1
  4. package/agents/omd-master.md +13 -1
  5. package/data/reference-fingerprints.json +380 -2
  6. package/dist/bin/oh-my-design.js +1 -1
  7. package/dist/{install-skills-IETT2TBJ.js → install-skills-UKEVE3KT.js} +11 -9
  8. package/dist/{install-skills-IETT2TBJ.js.map → install-skills-UKEVE3KT.js.map} +1 -1
  9. package/package.json +10 -4
  10. package/scripts/ctx-prime.cjs +266 -0
  11. package/scripts/postinstall.cjs +6 -6
  12. package/skills/omd-harness/SKILL.md +135 -7
  13. package/web/references/91app/DESIGN.md +151 -0
  14. package/web/references/airtable/DESIGN.md +16 -2
  15. package/web/references/bithumb/DESIGN.md +170 -0
  16. package/web/references/bunjang/DESIGN.md +19 -0
  17. package/web/references/cakeresume/DESIGN.md +162 -0
  18. package/web/references/catchtable/DESIGN.md +19 -0
  19. package/web/references/classum/DESIGN.md +19 -0
  20. package/web/references/dabang/DESIGN.md +19 -0
  21. package/web/references/dji/DESIGN.md +0 -1
  22. package/web/references/fastcampus/DESIGN.md +19 -0
  23. package/web/references/flex/DESIGN.md +19 -0
  24. package/web/references/gmarket/DESIGN.md +19 -0
  25. package/web/references/gogolook/DESIGN.md +126 -0
  26. package/web/references/hahow/DESIGN.md +158 -0
  27. package/web/references/hyundaicard/DESIGN.md +172 -0
  28. package/web/references/inflearn/DESIGN.md +19 -0
  29. package/web/references/kbank/DESIGN.md +18 -0
  30. package/web/references/kdan/DESIGN.md +160 -0
  31. package/web/references/kkbox/DESIGN.md +114 -0
  32. package/web/references/kream/DESIGN.md +18 -0
  33. package/web/references/lunit/DESIGN.md +19 -0
  34. package/web/references/melon/DESIGN.md +153 -0
  35. package/web/references/nhncloud/DESIGN.md +174 -0
  36. package/web/references/oliveyoung/DESIGN.md +19 -0
  37. package/web/references/rayark/DESIGN.md +132 -0
  38. package/web/references/sendbird/DESIGN.md +285 -0
  39. package/web/references/socar/DESIGN.md +18 -0
  40. package/web/references/toss-securities/DESIGN.md +19 -0
  41. package/web/references/tving/DESIGN.md +18 -0
  42. package/web/references/upbit/DESIGN.md +19 -0
  43. package/web/references/upstage/DESIGN.md +18 -0
  44. package/web/references/velog/DESIGN.md +168 -0
  45. package/web/references/wadiz/DESIGN.md +19 -0
  46. package/web/references/webflow/DESIGN.md +16 -2
  47. package/web/references/yeogiotte/DESIGN.md +19 -0
  48. package/data/architecture-proposals/2026-05-13-thin-install-fresh-fetch.md +0 -189
  49. package/data/issues/2026-05-13-multi-surface-schema-rfc.md +0 -67
  50. package/data/reference-audits/2026-05-13-kr10.md +0 -132
  51. package/data/reference-audits/2026-05-14-kr10.md +0 -72
  52. package/data/reference-audits/2026-05-15-kr10.md +0 -124
  53. package/data/research/2026-05-18-agent-landscape.md +0 -69
  54. package/data/research/2026-05-18-kr-style-presets.md +0 -572
package/AGENTS.md CHANGED
@@ -7,13 +7,14 @@ oh-my-design itself uses Claude Code skills + subagents for its design harness.
7
7
  ## Repository quick map
8
8
 
9
9
  - `src/` — TypeScript source for the `omd` CLI (`bin/oh-my-design.ts` is the entrypoint).
10
- - `references/`67 real-company DESIGN.md files used as bundled references.
10
+ - `web/references/<id>/DESIGN.md`100+ real-company DESIGN.md files; the **canonical source of truth** for the reference catalog. It lives under `web/` because the Vercel project root is `web/` (the site build can only read files beneath it). The root `references` symlink, `design-md/`, and `packages/mcp/data/references/` are all derived from here — see **Repository layout** in `README.md` for why each tree exists and which to edit. Rule: edit `web/references/` only.
11
11
  - `skills/omd-*` — Claude Code / Codex / OpenCode skill files (installed into target projects via `omd install-skills`).
12
12
  - `.claude/agents/` — Subagent definitions for the design harness (Claude Code).
13
13
  - `.codex/agents/` — Mirror TOML definitions for the design harness (Codex).
14
14
  - `spec/omd-v0.1.md` — OmD spec (15-section DESIGN.md format).
15
15
  - `research/harness-design/` — Design harness research + integration design.
16
16
  - `skills/omd-lab-02-design-harness/` — Lab #02 versioned harness experiments.
17
+ - `scripts/ctx-prime.cjs` — v1.6.0 deterministic codebase analyzer (stack, brand color, voice, surface inventory, audience hypothesis). Called by `omd-harness` Step 2.5 to pre-fill master slots.
17
18
 
18
19
  ## Build / test / lint
19
20
 
package/README.ko.md CHANGED
@@ -105,7 +105,7 @@ shim과 스킬 파일은 `<!-- omd:start -->` 마커 블록을 사용해서, 마
105
105
  |---|---|---|
106
106
  | `omd:init` | "DESIGN.md 만들어줘" / "브랜드 세팅" | 레퍼런스 추천 → 프로젝트 description 수집 → 레퍼런스 톤·매너 preserve하면서 deltas 반영한 Hybrid variation → DESIGN.md + shim 작성 |
107
107
  | `omd:apply` | UI / 스타일링 / 마이크로카피 / 모션 작업 | DESIGN.md + pending preference를 authoritative context로 주입, 사용자 교정 시 자동으로 `omd:remember` 호출 |
108
- | `omd:harness` | "랜딩 처음부터 / production-ready" | 10-phase 디자인 파이프라인. rule 9 hero archetype 7종 (center-text / carousel / split-screen / editorial / dashboard / quote-led / left-character) 중 brand vibe 매칭으로 선택. rule 5 워드마크-only 로고, rule 10 reveal safety net. |
108
+ | `omd:harness` | "랜딩 처음부터 / 그럴싸한 랜딩 / 프로토타입 구색 갖춰 / production-ready" | 10-phase 디자인 파이프라인. **v1.6.0** — 자연어 트리거 확대 (슬래시 없이도 발동), **CTX-PRIME** 사전 분석 (~20ms) + 단일 페르소나 picker + Interview-lite 배치로 `omd-master`가 slot-gate 건너뛰고 PROPOSE_PLAN 직행. rule 9 hero archetype 7종 (center-text / carousel / split-screen / editorial / dashboard / quote-led / left-character) 중 brand vibe 매칭으로 선택. rule 5 워드마크-only 로고, rule 10 reveal safety net. |
109
109
  | `omd:sync` | "shim drift" / "AGENTS.md 동기화" | 적절한 플래그로 `omd:sync` 실행 |
110
110
  | `omd:remember` | "기억해 둬" / "우리는 ~안 해" | 구조화된 entry를 `.omd/preferences.md`에 append |
111
111
  | `omd:learn` | "preferences 정리해서 DESIGN.md에 반영" | scope별로 그룹핑 → coherent edit 제안 → status flip |
package/README.md CHANGED
@@ -37,6 +37,28 @@ Then restart your agent (Cmd+Q in Claude Code, then relaunch) so the new skills
37
37
 
38
38
  That is the only CLI command you will run. Everything else is natural language to your agent.
39
39
 
40
+ ## Your first 60 seconds
41
+
42
+ This is the whole point: one prompt turns into a `DESIGN.md` your agent remembers across every future session.
43
+
44
+ 1. Install (above), then **restart your agent** (Cmd+Q, relaunch) so it loads the new skills.
45
+
46
+ 2. In your project, type your first prompt — copy this exactly:
47
+
48
+ > Set up our design system — Toss-style, for a family meal-tracking app.
49
+
50
+ Your agent runs **`omd:init`**: it recommends a reference from the 100+ real-company catalog, asks you to confirm, and writes **`DESIGN.md`** to your project root. (`omd:sync` then wires up the `CLAUDE.md` / `AGENTS.md` / Cursor shims so every agent reads it automatically.)
51
+
52
+ **That `DESIGN.md` is your activation — your agent now remembers your brand.**
53
+
54
+ 3. Now build against it:
55
+
56
+ > Design the home screen.
57
+
58
+ The agent reads `DESIGN.md` and ships brand-correct UI. No re-explaining your design system, ever again.
59
+
60
+ Don't want Toss? Any brand works — `Stripe-style`, `Linear-clone B2B SaaS`, `Karrot-style marketplace`. Browse the full catalog at [oh-my-design.kr/design-systems](https://oh-my-design.kr/design-systems).
61
+
40
62
  ## Upgrading
41
63
 
42
64
  Skills and agents evolve every release. To pick up the latest bundle in an existing project:
@@ -118,7 +140,7 @@ Skills (loaded into your agent's context based on prompt triggers):
118
140
  **Core flow**
119
141
  - **omd:apply** — DESIGN.md as authoritative context for every UI task. Routes complex requests (assets, charts, full screens, a11y audit) to specialized sub-agents.
120
142
  - **omd:init** — Bootstrap DESIGN.md from a reference + project description. 100+ references, hybrid variation that preserves the reference voice while shifting only user-named axes.
121
- - **omd:harness** — `/omd-harness <task>` to run the 10-phase design pipeline. 7 hero archetypes (rule 9) match brand vibe to layout (center-text / carousel / split-screen / editorial / dashboard / quote-led / left-character). Reveal safety net (rule 10), wordmark-only logo (rule 5), container-inner consistency (rule 7), decomposed hero (rule 8).
143
+ - **omd:harness** — `/omd-harness <task>` to run the 10-phase design pipeline. **v1.6.0**: auto-triggers on natural-language requests ("그럴싸한 랜딩 만들어줘", "프로토타입 구색 갖춰") — no slash required. New **CTX-PRIME** pre-phase scans your repo (stack, brand color, voice, surface inventory) in ~20ms, then surfaces a single audience picker + batched Interview-lite so `omd-master` skips slot-gate and jumps straight to PROPOSE_PLAN. 7 hero archetypes (rule 9) match brand vibe to layout (center-text / carousel / split-screen / editorial / dashboard / quote-led / left-character). Reveal safety net (rule 10), wordmark-only logo (rule 5), container-inner consistency (rule 7), decomposed hero (rule 8).
122
144
  - **omd:remember** — Captures user corrections to `.omd/preferences.md` automatically when the agent detects them.
123
145
  - **omd:learn** — Folds pending corrections back into DESIGN.md by scope.
124
146
  - **omd:sync** — Maintains the shim files (CLAUDE.md / AGENTS.md / Cursor mdc) so every agent reads your DESIGN.md.
@@ -168,6 +190,21 @@ Works with Claude Desktop, Cursor, Cline, Continue, and Codex. Zero AI calls, ze
168
190
  - It is not an SDK. If you need the matching algorithm or shim format, look at the skill markdown directly.
169
191
  - It does not generate emojis as icons. Asset agent prefers inline SVG (Lucide-matched or custom).
170
192
 
193
+ ## Repository layout
194
+
195
+ > For contributors. If you're just *using* OmD, you never touch these — the install ships everything you need.
196
+
197
+ The brand `DESIGN.md` corpus lives in more than one place **on purpose**. Here's the map so nothing looks like accidental duplication:
198
+
199
+ | Path | In git? | Ships to npm? | Role |
200
+ |---|---|---|---|
201
+ | `web/references/<id>/DESIGN.md` | ✅ | ✅ (CLI pkg) | **Canonical source of truth.** Lives under `web/` because the Vercel project root is `web/` — the site build can only read files beneath it. Everything else is derived from here. |
202
+ | `references` → `web/references` | ❌ gitignored | — | Local convenience symlink so root-level scripts/tests resolve the same path during local dev. |
203
+ | `design-md/<id>/DESIGN.md` | ✅ | ❌ | Public [awesome-design-md](https://github.com/VoltAgent/awesome-design-md)-style mirror — frontmatter-stripped + a "Source / Last verified" note. A different *format*, not a byte copy. |
204
+ | `packages/mcp/data/references/` | ❌ gitignored | ✅ (MCP pkg) | Build artifact. Regenerated from `web/references` by `packages/mcp/scripts/sync-data.mjs` on every `prepublish`/`build`. Never edit by hand. |
205
+
206
+ **Rule of thumb: edit `web/references/<id>/DESIGN.md` only.** `web/scripts/build-registry.mjs` regenerates the typed registry, and the pre-commit catalog-integrity gate (`web/__tests__/catalog-integrity.test.ts`) plus `sync-data.mjs` keep the derived copies honest.
207
+
171
208
  ## Changelog
172
209
 
173
210
  See [CHANGELOG.md](CHANGELOG.md) for release history. Migrating from 0.1.x: see [MIGRATION.md](MIGRATION.md).
@@ -91,7 +91,19 @@ Each turn you are in one state. Determine current state from `.handoff.json` `st
91
91
 
92
92
  ### State definitions
93
93
 
94
- - **INTAKE**: First turn. Read `.omd/context.json` if it exists (skill caches via `node scripts/context.cjs` helper if available); else compute inline (Glob `**/package.json,**/*.{css,scss,tsx,jsx,vue,svelte}` + Read top files + grep for color/spacing literals). Decide INTAKE branch:
94
+ - **INTAKE**: First turn.
95
+
96
+ **0.0.1 — Prefilled-slots fast path (v1.6.0+).** Before any other branch logic, Read `<RUN_DIR>/handoff/.handoff.json` if it exists. If it has `prefilled_slots` AND `state: "PROPOSE_PLAN"`, the omd-harness skill ran CTX-PRIME + Interview-lite already and pre-filled the slots (`audience`, `exit_scope`, `wow_moment`, `cta_primary`, `visual_grounding`).
97
+
98
+ Also Read `<RUN_DIR>/ctx-prime.json` for the codebase analysis (stack, brand_signal, surface_inventory, wow_moment_candidates).
99
+
100
+ → **Skip SLOT_GATE entirely.** Use prefilled_slots as authoritative. Jump straight to PROPOSE_PLAN with `ctx_prime.brand_signal` seeded as initial token defaults (override-able during PLAN_REVIEW). Only re-ask via ASK_TEST if a slot truly required for the chosen `exit_scope` is *missing* from prefilled_slots — never re-ask `audience` or `wow_moment` if already filled.
101
+
102
+ Acknowledge the handoff in your first user-facing prose: "분석 결과 + 페르소나 답 받았어요 — {audience} / {wow_moment} 방향으로 plan 잡을게요." Don't re-interrogate.
103
+
104
+ Continue from PROPOSE_PLAN.
105
+
106
+ **0.0.2 — Legacy fast path.** If no prefilled_slots, read `.omd/context.json` if it exists (skill caches via `node scripts/context.cjs` helper if available); else compute inline (Glob `**/package.json,**/*.{css,scss,tsx,jsx,vue,svelte}` + Read top files + grep for color/spacing literals). Decide INTAKE branch:
95
107
  - empty folder + URL hint in task ("Stripe 같이" / "https://...") AND persona_signal_initial = `F` → **F-FAST PATH**: skip SLOT_GATE entirely, propose plan immediately with all defaults (audience=`[FILL IN]`, tone_seed from URL or `stripe`, exit_scope=`handoff-zip`, etc.). Founder smashes `go`, gets handoff zip ASAP.
96
108
  - empty folder (no URL) → SLOT_GATE (greenfield mode)
97
109
  - existing code → CONTEXT_DETECT brief, then SLOT_GATE
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schema_version": 1,
3
- "generated_at": "2026-05-15T00:00:00Z",
3
+ "generated_at": "2026-06-01T00:00:00Z",
4
4
  "generator": "oh-my-design parallel agent extraction (Claude Code Agent tool, no API key)",
5
- "count": 137,
5
+ "count": 150,
6
6
  "items": [
7
7
  {
8
8
  "id": "17live",
@@ -3268,6 +3268,384 @@
3268
3268
  "signature_motion": "찜 heart: outline → filled brand pink with brief pulse; primary CTA uses pink-400 fill, darkening to pink-450/550 on hover/press.",
3269
3269
  "has_personas": true,
3270
3270
  "category_raw": "Commerce / Women's Fashion Discovery"
3271
+ },
3272
+ {
3273
+ "id": "sendbird",
3274
+ "primary_color_hex": "#742DDD",
3275
+ "category": "Developer Tools",
3276
+ "visual_theme": "Two-faced infrastructure: a token-driven chat UIKit on Sendbird purple #742DDD over an 8-step neutral grayscale with universal 4px flat fills, paired with a near-monochrome marketing site — white ground, 72px serif display headline, Helvetica Now Text body, black/white pill CTAs. Brand color is held back from chrome and spent only on product primary actions.",
3277
+ "voice_fingerprint": {
3278
+ "register": "infrastructure-precise",
3279
+ "sentence_length": "short",
3280
+ "metaphor_density": "low",
3281
+ "vocabulary_register": "english-technical"
3282
+ },
3283
+ "tone_keywords": [
3284
+ "precise",
3285
+ "reliable",
3286
+ "enterprise-assured",
3287
+ "plain",
3288
+ "calm",
3289
+ "invisible"
3290
+ ],
3291
+ "antipatterns": [
3292
+ "No gradients or drop shadows — flat fills and 1px hairlines only",
3293
+ "No brand purple in marketing chrome",
3294
+ "No second brand hue; green/red/blue are semantic only",
3295
+ "No multi-field spec lines",
3296
+ "No body copy set in the serif display face"
3297
+ ],
3298
+ "signature_motion": "New messages fade/slide in at the column bottom (~150-200ms ease-out); near-instant color steps on hover/focus/press (purple-300 -> 400 -> 500); overlay scrim fades in ~200ms. Motion clarifies, never performs.",
3299
+ "has_personas": true,
3300
+ "category_raw": "developer-infra / conversations API (UIKit)"
3301
+ },
3302
+ {
3303
+ "id": "velog",
3304
+ "primary_color_hex": "#12B886",
3305
+ "category": "Developer Tools",
3306
+ "visual_theme": "Reading-first Korean dev-blog surface on the Open Color palette: soft gray0 #F8F9FA canvas, white content, near-black #212529 text, and brand teal6 #12B886 reserved as the single action signal (the write button). Calm, editorial, content-forward.",
3307
+ "voice_fingerprint": {
3308
+ "register": "calm-editorial",
3309
+ "sentence_length": "medium",
3310
+ "metaphor_density": "low",
3311
+ "vocabulary_register": "korean-developer"
3312
+ },
3313
+ "tone_keywords": [
3314
+ "calm",
3315
+ "reading-first",
3316
+ "minimal",
3317
+ "content-forward",
3318
+ "legible",
3319
+ "developer-native"
3320
+ ],
3321
+ "antipatterns": [
3322
+ "No teal as a background wash — it is the single action color",
3323
+ "No pure black text (use #212529)",
3324
+ "No heavy shadows — depth is the gray-to-white value step",
3325
+ "No multi-field spec lines"
3326
+ ],
3327
+ "signature_motion": "Quiet, near-instant state transitions; the dark login pill and teal write button are static anchors — motion stays out of the reading surface.",
3328
+ "has_personas": true,
3329
+ "category_raw": "developer-tools / dev-blogging platform"
3330
+ },
3331
+ {
3332
+ "id": "nhncloud",
3333
+ "primary_color_hex": "#125DE6",
3334
+ "category": "Developer Tools",
3335
+ "visual_theme": "Two-surface enterprise cloud: a polished corporate site (Pretendard Variable, vivid brand blue #125DE6, big 30px rounded pills) paired with the TOAST UI open-source widget library (lighter #00a9ff accent, tight 4px radius, 13px text). Clean, functional, trustworthy infrastructure.",
3336
+ "voice_fingerprint": {
3337
+ "register": "enterprise-precise",
3338
+ "sentence_length": "medium",
3339
+ "metaphor_density": "low",
3340
+ "vocabulary_register": "korean-technical"
3341
+ },
3342
+ "tone_keywords": [
3343
+ "enterprise",
3344
+ "trustworthy",
3345
+ "functional",
3346
+ "clean",
3347
+ "scalable",
3348
+ "precise"
3349
+ ],
3350
+ "antipatterns": [
3351
+ "Don't mix the corporate 30px-pill language with the TOAST UI 4px-widget language",
3352
+ "Don't use the #00a9ff widget blue as the corporate brand color (#125DE6)",
3353
+ "No gradients",
3354
+ "No multi-field spec lines"
3355
+ ],
3356
+ "signature_motion": "Restrained corporate transitions; functional widget interactions in TOAST UI. Motion clarifies, never decorates.",
3357
+ "has_personas": true,
3358
+ "category_raw": "backend-devops / cloud infrastructure (NHN Cloud + TOAST UI)"
3359
+ },
3360
+ {
3361
+ "id": "hyundaicard",
3362
+ "primary_color_hex": "#000000",
3363
+ "category": "Fintech",
3364
+ "visual_theme": "Monochrome premium minimalism — black-and-white luxury where withholding color IS the identity — anchored by the proprietary Youandi (유앤아이) typeface as the brand signature. White ground, black ink, Noto Sans KR body, typography-as-identity. Korea's most design-celebrated card brand.",
3365
+ "voice_fingerprint": {
3366
+ "register": "premium-restrained",
3367
+ "sentence_length": "short",
3368
+ "metaphor_density": "low",
3369
+ "vocabulary_register": "korean-premium"
3370
+ },
3371
+ "tone_keywords": [
3372
+ "premium",
3373
+ "monochrome",
3374
+ "minimal",
3375
+ "typographic",
3376
+ "confident",
3377
+ "cultured"
3378
+ ],
3379
+ "antipatterns": [
3380
+ "No decorative color — the brand is monochrome; color is withheld on purpose",
3381
+ "Don't substitute a generic font for the Youandi display identity",
3382
+ "No visual clutter — typography and whitespace carry it",
3383
+ "No multi-field spec lines"
3384
+ ],
3385
+ "signature_motion": "Editorial restraint — slow, deliberate reveals; nothing flashy. The premium feel comes from stillness and typographic precision.",
3386
+ "has_personas": true,
3387
+ "category_raw": "fintech / premium credit card (design-led brand)"
3388
+ },
3389
+ {
3390
+ "id": "rayark",
3391
+ "primary_color_hex": "#5FE0EE",
3392
+ "category": "Entertainment",
3393
+ "visual_theme": "Dark premium gaming aesthetic from a Taipei rhythm-game studio (Cytus/Deemo/Sdorica): a near-black #1A1C1D canvas lit by a single electric-cyan #5FE0EE accent, white display type, and sharp 3px corners with white-outlined cyan CTAs. Cool, neon-on-black, rhythm-game energy.",
3394
+ "voice_fingerprint": {
3395
+ "register": "cool-gaming",
3396
+ "sentence_length": "short",
3397
+ "metaphor_density": "moderate",
3398
+ "vocabulary_register": "english-gaming"
3399
+ },
3400
+ "tone_keywords": [
3401
+ "dark",
3402
+ "electric",
3403
+ "premium",
3404
+ "rhythmic",
3405
+ "immersive",
3406
+ "cool"
3407
+ ],
3408
+ "antipatterns": [
3409
+ "No light backgrounds — the canvas is near-black #1A1C1D",
3410
+ "No second accent — electric cyan #5FE0EE is the only chromatic lift",
3411
+ "Don't round corners heavily (sharp 3px)",
3412
+ "No multi-field spec lines"
3413
+ ],
3414
+ "signature_motion": "Beat-synced, kinetic energy true to rhythm games; quick sharp transitions, neon glow accents on the cyan.",
3415
+ "has_personas": true,
3416
+ "category_raw": "entertainment / indie game studio"
3417
+ },
3418
+ {
3419
+ "id": "91app",
3420
+ "primary_color_hex": "#061C3D",
3421
+ "category": "Commerce",
3422
+ "visual_theme": "Taiwan omnichannel retail-commerce SaaS (OMO). Deep-navy #061C3D structural brand with a coral-red #E85040 action accent on a clean white ground, Traditional-Chinese Noto Sans TC, generously rounded 16px primary buttons. Reads as trustworthy retail infrastructure with B2B confidence.",
3423
+ "voice_fingerprint": {
3424
+ "register": "b2b-confident",
3425
+ "sentence_length": "medium",
3426
+ "metaphor_density": "low",
3427
+ "vocabulary_register": "traditional-chinese-business"
3428
+ },
3429
+ "tone_keywords": [
3430
+ "trustworthy",
3431
+ "retail-savvy",
3432
+ "confident",
3433
+ "omnichannel",
3434
+ "growth-driven",
3435
+ "professional"
3436
+ ],
3437
+ "antipatterns": [
3438
+ "Keep navy #061C3D structural and coral #E85040 for action — don't swap their roles",
3439
+ "No clutter — clean white ground",
3440
+ "Maintain the rounded 16px primary-button language",
3441
+ "No multi-field spec lines"
3442
+ ],
3443
+ "signature_motion": "Smooth, professional B2B transitions; confident hover states on the navy and coral CTAs. Restrained and credible.",
3444
+ "has_personas": true,
3445
+ "category_raw": "ecommerce / omnichannel retail SaaS (OMO)"
3446
+ },
3447
+ {
3448
+ "id": "melon",
3449
+ "primary_color_hex": "#00CD3C",
3450
+ "category": "Entertainment",
3451
+ "visual_theme": "Dense, white, content-first Korean music-streaming UI (Kakao Entertainment): packed charts and lists, small 12-14px Pretendard type, sharp 0px corners, with the signature Melon green #00CD3C rationed onto active nav, tabs, and primary actions. Grayscale hierarchy (#1A1A1A/#666/#999) lets the green do all the signaling.",
3452
+ "voice_fingerprint": {
3453
+ "register": "utilitarian-dense",
3454
+ "sentence_length": "short",
3455
+ "metaphor_density": "low",
3456
+ "vocabulary_register": "korean-mainstream"
3457
+ },
3458
+ "tone_keywords": [
3459
+ "dense",
3460
+ "efficient",
3461
+ "content-first",
3462
+ "mainstream",
3463
+ "scannable",
3464
+ "green-signal"
3465
+ ],
3466
+ "antipatterns": [
3467
+ "No rounded corners — Melon is square (0px)",
3468
+ "Don't spread the green; ration it to active/primary",
3469
+ "Don't inflate type — density depends on 12-14px",
3470
+ "No multi-field spec lines"
3471
+ ],
3472
+ "signature_motion": "Minimal, utilitarian transitions; the player and list interactions stay quick and quiet — the green marks live elements rather than animating.",
3473
+ "has_personas": true,
3474
+ "category_raw": "entertainment / music streaming"
3475
+ },
3476
+ {
3477
+ "id": "kdan",
3478
+ "primary_color_hex": "#00DC87",
3479
+ "category": "Productivity",
3480
+ "visual_theme": "Bold Taiwanese document-workflow SaaS (PDF/e-sign/SDKs): a deep teal-black #002D37 structural base, an electric-lime #CAFF00 pop accent, and the kdanGreen #00DC87 brand token, set in Clear Sans with crisp 4px corners. Energetic, modern, developer-credible.",
3481
+ "voice_fingerprint": {
3482
+ "register": "confident-modern",
3483
+ "sentence_length": "medium",
3484
+ "metaphor_density": "low",
3485
+ "vocabulary_register": "english-technical"
3486
+ },
3487
+ "tone_keywords": [
3488
+ "bold",
3489
+ "modern",
3490
+ "energetic",
3491
+ "credible",
3492
+ "workflow-driven",
3493
+ "crisp"
3494
+ ],
3495
+ "antipatterns": [
3496
+ "Keep kdanGreen #00DC87 as brand, #002D37 as structure, #CAFF00 as the loud accent — don't blur roles",
3497
+ "Maintain crisp 4px corners",
3498
+ "No gradients",
3499
+ "No multi-field spec lines"
3500
+ ],
3501
+ "signature_motion": "Crisp, confident transitions; the lime CTA pops with energy while the teal-black base stays steady.",
3502
+ "has_personas": true,
3503
+ "category_raw": "productivity / document-workflow SaaS"
3504
+ },
3505
+ {
3506
+ "id": "hahow",
3507
+ "primary_color_hex": "#00CCB4",
3508
+ "category": "Education",
3509
+ "visual_theme": "Friendly Taiwanese EdTech course marketplace (好學校): a soft gray-blue #F5F7F9 canvas, the bright brand teal #00CCB4 from its own design tokens, rounded 8px cards, and warm orange/coral promo accents, set in PingFang TC. Encouraging and human, not corporate.",
3510
+ "voice_fingerprint": {
3511
+ "register": "warm-encouraging",
3512
+ "sentence_length": "medium",
3513
+ "metaphor_density": "moderate",
3514
+ "vocabulary_register": "traditional-chinese-friendly"
3515
+ },
3516
+ "tone_keywords": [
3517
+ "friendly",
3518
+ "warm",
3519
+ "approachable",
3520
+ "encouraging",
3521
+ "human",
3522
+ "playful"
3523
+ ],
3524
+ "antipatterns": [
3525
+ "Keep the brand teal #00CCB4; warm orange/coral are promo accents only",
3526
+ "Maintain rounded 8px cards (not sharp)",
3527
+ "Don't go corporate-cold — the tone is human",
3528
+ "No multi-field spec lines"
3529
+ ],
3530
+ "signature_motion": "Gentle, friendly transitions; warm hover lifts on cards. Encouraging, never abrupt.",
3531
+ "has_personas": true,
3532
+ "category_raw": "education / EdTech course marketplace"
3533
+ },
3534
+ {
3535
+ "id": "bithumb",
3536
+ "primary_color_hex": "#1C2028",
3537
+ "category": "Fintech",
3538
+ "visual_theme": "Dark, premium, data-dense Korean crypto-exchange (No.1): a near-black #1C2028 structural base warmed by a bronze/brown #543E35 accent, signed by the proprietary Bithumb Trading Sans typeface, with Korea-convention trading colors (red #E15241 = up, blue #4880EE = down). Serious, money-grade.",
3539
+ "voice_fingerprint": {
3540
+ "register": "premium-serious",
3541
+ "sentence_length": "short",
3542
+ "metaphor_density": "low",
3543
+ "vocabulary_register": "korean-financial"
3544
+ },
3545
+ "tone_keywords": [
3546
+ "premium",
3547
+ "dark",
3548
+ "serious",
3549
+ "data-dense",
3550
+ "trustworthy",
3551
+ "money-grade"
3552
+ ],
3553
+ "antipatterns": [
3554
+ "Korea convention: red = price up, blue = price down (don't invert)",
3555
+ "Keep the near-black + bronze pairing; don't lighten the trading base",
3556
+ "Use Bithumb Trading Sans identity",
3557
+ "No multi-field spec lines"
3558
+ ],
3559
+ "signature_motion": "Fast, precise data updates; restrained chrome motion. The dense trading surface prioritizes information over flourish.",
3560
+ "has_personas": true,
3561
+ "category_raw": "fintech / crypto-asset exchange"
3562
+ },
3563
+ {
3564
+ "id": "gogolook",
3565
+ "primary_color_hex": "#0CD25F",
3566
+ "category": "Consumer",
3567
+ "visual_theme": "Friendly Taiwanese TrustTech (Whoscall caller-ID / anti-scam): clean white ground, vivid documented brand green #0CD25F, fully-rounded 100px pill buttons, and a big playful Nunito rounded display over Noto Sans body. Approachable protection, not enterprise security.",
3568
+ "voice_fingerprint": {
3569
+ "register": "reassuring-friendly",
3570
+ "sentence_length": "short",
3571
+ "metaphor_density": "moderate",
3572
+ "vocabulary_register": "english-consumer"
3573
+ },
3574
+ "tone_keywords": [
3575
+ "friendly",
3576
+ "reassuring",
3577
+ "approachable",
3578
+ "safe",
3579
+ "playful",
3580
+ "trustworthy"
3581
+ ],
3582
+ "antipatterns": [
3583
+ "Keep the fully-rounded pill language (100px)",
3584
+ "Brand green #0CD25F leads; pink/teal are category accents",
3585
+ "Don't make it look like cold enterprise security",
3586
+ "No multi-field spec lines"
3587
+ ],
3588
+ "signature_motion": "Bouncy, friendly micro-interactions on the rounded pills; reassuring and light.",
3589
+ "has_personas": true,
3590
+ "category_raw": "consumer-tech / TrustTech anti-scam app"
3591
+ },
3592
+ {
3593
+ "id": "kkbox",
3594
+ "primary_color_hex": "#00B6E1",
3595
+ "category": "Entertainment",
3596
+ "visual_theme": "Dark, premium Taiwanese music-streaming (KKCompany): a near-black #111111 canvas, the signature KKBOX cyan-blue #00B6E1 as the single brand accent, oversized Work Sans display type, and softly-rounded 30px buttons. Cinematic and music-forward.",
3597
+ "voice_fingerprint": {
3598
+ "register": "cinematic-premium",
3599
+ "sentence_length": "short",
3600
+ "metaphor_density": "moderate",
3601
+ "vocabulary_register": "english-media"
3602
+ },
3603
+ "tone_keywords": [
3604
+ "dark",
3605
+ "premium",
3606
+ "cinematic",
3607
+ "music-forward",
3608
+ "immersive",
3609
+ "bold"
3610
+ ],
3611
+ "antipatterns": [
3612
+ "Near-black #111111 canvas — don't lighten",
3613
+ "KKBOX cyan #00B6E1 is the single accent; don't add competing hues",
3614
+ "Keep oversized Work Sans display",
3615
+ "No multi-field spec lines"
3616
+ ],
3617
+ "signature_motion": "Smooth, cinematic transitions; the cyan accent glows against the dark. Music-forward pacing.",
3618
+ "has_personas": true,
3619
+ "category_raw": "entertainment / music streaming (KKCompany)"
3620
+ },
3621
+ {
3622
+ "id": "cakeresume",
3623
+ "primary_color_hex": "#13AB67",
3624
+ "category": "Productivity",
3625
+ "visual_theme": "Clean Taiwanese global talent network (Cake, formerly CakeResume): white ground, confident Cake green #13AB67 for primary action, deep-green #0C4129 headings, crisp 4px corners, set in Inter. Professional, optimistic, with human warmth.",
3626
+ "voice_fingerprint": {
3627
+ "register": "professional-optimistic",
3628
+ "sentence_length": "medium",
3629
+ "metaphor_density": "low",
3630
+ "vocabulary_register": "english-professional"
3631
+ },
3632
+ "tone_keywords": [
3633
+ "professional",
3634
+ "optimistic",
3635
+ "clean",
3636
+ "trustworthy",
3637
+ "modern",
3638
+ "human"
3639
+ ],
3640
+ "antipatterns": [
3641
+ "Cake green #13AB67 for primary action; deep green #0C4129 for headings",
3642
+ "Crisp 4px corners and Inter type",
3643
+ "Keep it professional-warm, not playful-loud",
3644
+ "No multi-field spec lines"
3645
+ ],
3646
+ "signature_motion": "Clean, professional transitions; confident green hover states. Optimistic and steady.",
3647
+ "has_personas": true,
3648
+ "category_raw": "saas / talent network + resume builder"
3271
3649
  }
3272
3650
  ]
3273
3651
  }
@@ -26,7 +26,7 @@ var program = new Command();
26
26
  program.name("oh-my-design").description("Bootstrap oh-my-design skills + agents into your project. After install, talk to your agent in natural language \u2014 no other CLI commands.").version(readPackageVersion()).showSuggestionAfterError(true).showHelpAfterError(true);
27
27
  program.command("install-skills").description("Install omd skill files + canonical agents into agent directories (.claude/, .codex/, .opencode/). Interactive multiselect TUI by default \u2014 picks which skills + sub-agents to install.").option("--dir <path>", "Project root (defaults to cwd)").option("--agent <name...>", "Restrict to specific channels (claude-code | codex | opencode)").option("--force", "Overwrite existing files even without the omd marker").option("--all", "Skip the interactive TUI and install every shipped skill + agent (use in CI)").option("--skills <names>", "Comma-separated skill names to install (overrides TUI)", (v) => v.split(",").map((s) => s.trim()).filter(Boolean)).option("--agents-only <names>", "Comma-separated agent names to install (overrides TUI). Use --agents-only to disambiguate from --agent (channel selector).", (v) => v.split(",").map((s) => s.trim()).filter(Boolean)).action(
28
28
  async (opts) => {
29
- const { runInstallSkills } = await import("../install-skills-IETT2TBJ.js");
29
+ const { runInstallSkills } = await import("../install-skills-UKEVE3KT.js");
30
30
  const validAgents = ["claude-code", "codex", "opencode"];
31
31
  const agents = opts.agent ? opts.agent.filter(
32
32
  (a) => validAgents.includes(a)
@@ -477,22 +477,24 @@ async function runInstallSkills(opts = {}) {
477
477
  return 0;
478
478
  }
479
479
  const nextSteps = [
480
- `${pc.bold("Open Claude Code (or Codex). Just say what you want:")}`,
480
+ `${pc.bold("Restart your agent, then type your first prompt:")}`,
481
481
  "",
482
- ` ${pc.dim('"\uD1A0\uC2A4 \uC2A4\uD0C0\uC77C \uAC00\uC871 \uC2DD\uB2E8 \uACF5\uC720 \uC571 \uBA54\uC778 \uD654\uBA74 \uB514\uC790\uC778\uD574\uC918"')}`,
483
- ` ${pc.dim('"Linear-clone B2B SaaS dashboard \uB9CC\uB4E4\uACE0 \uC2F6\uC5B4"')}`,
484
- ` ${pc.dim('"\uC774 \uCE74\uB4DC \uC880 \uB354 \uC138\uB828\uB418\uAC8C"')} ${pc.dim("# \uC791\uC5C5 \uC911 \uC790\uC5F0\uC5B4 \u2014 \uC790\uB3D9 \uB77C\uC6B0\uD305")}`,
482
+ ` ${pc.cyan("EN")} ${pc.dim("Set up our design system \u2014 Toss-style, for a family meal-tracking app.")}`,
483
+ ` ${pc.cyan("KR")} ${pc.dim("\uD1A0\uC2A4 \uC2A4\uD0C0\uC77C\uB85C \uAC00\uC871 \uC2DD\uB2E8 \uACF5\uC720 \uC571 \uB514\uC790\uC778 \uC2DC\uC2A4\uD15C \uC7A1\uC544\uC918")}`,
485
484
  "",
486
- `${pc.bold("Claude\uAC00 description \uB9E4\uCE6D\uC73C\uB85C \uC790\uB3D9 \uB77C\uC6B0\uD305")} ${pc.dim("\u2014 \uC2AC\uB798\uC2DC \uBA85\uB839 \uC548 \uCCD0\uB3C4 \uB428. Hook\uC740 DESIGN.md \uBD80\uC7AC \uC2DC omd:init \uC548\uB0B4\uB9CC.")}`,
485
+ `${pc.dim("Your agent runs omd:init and writes DESIGN.md. Then build against it:")}`,
486
+ ` ${pc.cyan("EN")} ${pc.dim("Design the home screen.")} ${pc.cyan("KR")} ${pc.dim("\uD648 \uD654\uBA74 \uB514\uC790\uC778\uD574\uC918")}`,
487
487
  "",
488
- `${pc.dim("Power user shortcut: ")}${pc.cyan("/omd-harness <task>")} ${pc.dim("\u2014 \uC989\uC2DC \uC9C4\uC785.")}`,
488
+ `${pc.dim('Full walkthrough \u2192 "Your first 60 seconds" in the README. Routing is automatic \u2014 no slash command needed.')}`,
489
+ `${pc.dim("Power user: ")}${pc.cyan("/omd-harness <task>")}${pc.dim(" \u2014 jump straight into the pipeline.")}`,
489
490
  "",
490
- `${pc.yellow("\u26A0 Already-running Claude Code session?")} ${pc.dim("Run `/agents` inside the session to reload \u2014 or quit (Cmd+Q on macOS) and relaunch. Without reload, hooks/agents do not load.")}`
491
+ `${pc.yellow("\u26A0 Already-running session?")} ${pc.dim("Run `/agents` to reload \u2014 or quit (Cmd+Q on macOS) and relaunch. Without reload, hooks/agents do not load.")}`
491
492
  ].join("\n");
492
493
  p.note(nextSteps, "Next");
494
+ const hookCount = targets.includes("claude-code") ? 4 : 0;
493
495
  p.outro(
494
496
  pc.green(
495
- `Done. 6 skills \xB7 11 sub-agents \xB7 4 hooks installed (${writtenCount} files).`
497
+ `Done. ${skills.length} skills \xB7 ${canonicalAgents.length} sub-agents \xB7 ${hookCount} hooks installed (${writtenCount} files).`
496
498
  )
497
499
  );
498
500
  return 0;
@@ -500,4 +502,4 @@ async function runInstallSkills(opts = {}) {
500
502
  export {
501
503
  runInstallSkills
502
504
  };
503
- //# sourceMappingURL=install-skills-IETT2TBJ.js.map
505
+ //# sourceMappingURL=install-skills-UKEVE3KT.js.map