$npx -y skills add kwakseongjae/oh-my-design --skill omd-taste시스템이 학습한 사용자의 디자인 취향을 한 뷰로 렌더. .omd/preferences.md + foldin-proposal.json + DESIGN.md를 읽어 반영됨/대기 중/보류됨/모르는 것 4그룹으로 보여준다. '/omd-taste', '내 취향 보여줘', '취향 현황', 'what are my preferences', 'show my taste', 「私の好みを見せて」, 「顯示我的偏好」류의 발화에 트리거. 기록은 omd:remember, DESIGN.md 반영은 omd:learn.
| 1 | <!-- omd:installed-skill — managed by `omd install-skills`. Do not edit; rerun the command to refresh. --> |
| 2 | |
| 3 | |
| 4 | # omd:taste — Taste Dashboard |
| 5 | |
| 6 | 시스템이 사용자에 대해 알고 있는 취향을 **한 뷰**로 렌더한다. 신뢰는 가시성에서 나온다 — 루프가 뭘 배웠고, 뭘 기다리고, 뭘 모르는지 보여주면 사용자가 루프에 더 먹인다. 기본 동작은 **읽기 전용** — 기록은 `omd:remember`, 반영은 `omd:learn`의 몫이고, 이 스킬은 보여주고 다음 행동만 안내한다. **CLI 호출 없음** — Read/Edit 툴로 직접 처리. |
| 7 | |
| 8 | ## 입력 (모두 Read 툴) |
| 9 | |
| 10 | 1. `.omd/preferences.md` — canonical 포맷 (`## <heading>` + ` ```omd-meta` 블록 + body — `omd:remember` 스킬의 포맷 정의 참조). **모든 status**의 엔트리를 파싱: `id` / `timestamp` / `scope` / `signal` / `confidence` / `status` |
| 11 | 2. `.omd/foldin-proposal.json` — 있으면 `status` (`proposed` / `applied` / `partial` / `snoozed`)와 `scopes[]` (scope, count, score, summary) |
| 12 | 3. `DESIGN.md` — § 라우팅 표시 + "모르는 것" 축 도출용 |
| 13 | |
| 14 | ## 빈 상태 |
| 15 | |
| 16 | `.omd/preferences.md`가 없거나 파싱된 엔트리가 0개면 두 줄로 끝낸다: |
| 17 | |
| 18 | > 아직 학습된 취향이 없어요. |
| 19 | > 작업 중 "앞으로는 ~로 해"라고 말하면 omd:remember가 기록하고, 같은 취향이 쌓이면 omd:learn이 DESIGN.md에 정식 반영해요. |
| 20 | |
| 21 | 이때 `.omd/` 디렉토리나 파일을 **만들지 말 것** — 뷰 스킬이 상태를 생성하면 안 된다. |
| 22 | |
| 23 | ## 렌더 — 4 그룹 한 뷰 |
| 24 | |
| 25 | ### ① 반영됨 (`status: applied`) |
| 26 | |
| 27 | scope별 한 줄: body 요약 + 반영된 DESIGN.md 섹션 + `applied_at` (있으면). 섹션은 omd:learn Phase 3의 scope→§ 라우팅으로 도출: |
| 28 | |
| 29 | | scope | DESIGN.md § | |
| 30 | |---|---| |
| 31 | | `components.*` | §8 (Components) 또는 §13 | |
| 32 | | `color` | §2 (Color Palette) | |
| 33 | | `typography` | §3 | |
| 34 | | `spacing` | §4 | |
| 35 | | `voice` | §10 (Voice & Tone) | |
| 36 | | `motion` | §15 (Motion & Easing) | |
| 37 | | `visualTheme` | §1 (Visual Theme) | |
| 38 | |
| 39 | DESIGN.md에 해당 섹션이 실제로 없으면 § 표기는 생략 (추측으로 적지 말 것). |
| 40 | |
| 41 | ### ② 대기 중 (`status: pending`) |
| 42 | |
| 43 | scope별로 그룹화해 한 그룹당 한 줄: |
| 44 | |
| 45 | - **발생 횟수** — 해당 scope의 pending 엔트리 수 |
| 46 | - **confidence** — explicit / inferred 구성 (예: `explicit ×2, inferred ×1`) |
| 47 | - **한 줄 요약** — 최신 엔트리 body의 첫 줄 |
| 48 | - **폴드 제안까지 남은 횟수** — 자동 fold-in 게이트(session-end hook)의 기본 임계는 **최근 7일 창 안에서 같은 scope 3회**. `max(0, 3 - 7일 내 발생 횟수)`로 계산해 "N회 더 쌓이면 제안돼요"로 표기. 이미 충족이면 "다음 세션 종료 시 제안 예정" |
| 49 | |
| 50 | ### ③ 보류됨 (snoozed) |
| 51 | |
| 52 | `.omd/foldin-proposal.json`의 `status`가 `snoozed`면 그 `scopes[]`를 나열 — scope + summary + `snoozed_at`. "지금 반영하려면 omd:learn을 부르세요" 한 줄 덧붙임. proposal 파일이 없거나 snoozed가 아니면 이 그룹은 생략. |
| 53 | |
| 54 | ### ④ 시스템이 모르는 것 (가볍게) |
| 55 | |
| 56 | DESIGN.md에는 정의돼 있지만 preference 엔트리(어느 status든)로 한 번도 확인된 적 없는 주요 축을 **1-2개만** 짚는다 (예: "motion은 DESIGN.md 기본값 그대로 — 아직 취향을 들은 적이 없어요"). 절대 전 축을 나열하지 말 것 — 가볍게 한두 줄. |
| 57 | |
| 58 | ## 다음 행동 안내 (뷰 끝에 항상) |
| 59 | |
| 60 | ``` |
| 61 | 다음 중 하나로 이어갈 수 있어요: |
| 62 | - "지금 반영" → omd:learn — pending을 DESIGN.md에 fold |
| 63 | - "잊어줘 <id|scope>" → 해당 엔트리 status를 rejected로 플립 |
| 64 | - "수정: <내용>" → omd:remember로 재기록 (옛 엔트리는 superseded) |
| 65 | ``` |
| 66 | |
| 67 | - **"지금 반영"** → `omd:learn` 트리거 (전체 또는 사용자가 지정한 scope만) |
| 68 | - **"잊어줘"** → 해당 엔트리의 omd-meta 블록만 Edit 툴로 `status: rejected` + `rejected_reason: "user-forget"` 플립 (omd:learn의 single-entry 플립과 동일 절차). body는 건드리지 않는다 |
| 69 | - **"수정"** → body 직접 편집 금지 (영구 기록) — `omd:remember`로 새 엔트리 재기록 후 옛 엔트리를 `status: superseded` + `superseded_by: <새 id>`로 플립 |
| 70 | |
| 71 | ## 금지 |
| 72 | |
| 73 | - "잊어줘"/"수정" 후속 요청의 status 플립 외에는 어떤 파일도 수정하지 말 것 — DESIGN.md 수정은 항상 omd:learn 경유 |
| 74 | - 엔트리 전체 dump 금지 — scope 그룹 요약으로 |
| 75 | - ④번 그룹을 채우려고 억지 축을 만들지 말 것 — 짚을 게 없으면 생략 |
| 76 | - preferences.md 포맷 해석은 canonical 규칙(omd:remember)만 따를 것 — 자체 변형 포맷 발명 금지 |