Skill v1.0.1
currentAutomated scan96/100+5 new
version: "1.0.1" name: omd-remember description: "사용자의 디자인 선호·교정을 .omd/preferences.md에 기록. '이거 기억해줘', '앞으로는 이렇게', 'remember this', 'going forward never X', 「覚えておいて」, 「記住這個」류의 발화 또는 omd:apply가 교정을 감지했을 때 트리거. 기록된 내용은 omd:learn으로 DESIGN.md에 정식 반영." metadata: internal: true
omd:remember — Preference Logger
사용자의 디자인 선호/교정을 .omd/preferences.md에 append-only로 기록한다. 나중에 omd:learn이 배치로 DESIGN.md에 반영. CLI 호출 없음 — Read/Edit/Write 툴로 직접 처리.
트리거 발화 패턴
- "기억해 둬", "앞으로는 ~로 해"
- "우리는 ~한다 / ~하지 않는다"
- "remember that ...", "going forward ..."
- "rule of thumb: ..."
- 사용자가 당신의 디자인 선택을 명시적으로 교정
파일 포맷 (.omd/preferences.md)
frontmatter + 엔트리 시퀀스. 엔트리 하나당 ## <heading> + omd-meta 코드블록 + body.
---schema: omd.preferences/v1design_md_hash_at_creation: <hash 또는 빈 문자열>---# Preference Log## 2026-04-30T17:48:00.000Z — ctas-never-uppercase```omd-metaid: pref_lqxk2_a3f9c1d4timestamp: 2026-04-30T17:48:00.000Zscope: components.buttonsignal: user-statementconfidence: explicitstatus: pendingsource_agent: claude-codesource_context: "src/components/Button.tsx"```CTAs are never uppercase
실행 절차
Step 1 — note 정규화
사용자 발화를 한 문장 영문으로 요약 (예: "앞으로 CTA 대문자 쓰지마" → CTAs are never uppercase).
Step 2 — scope 추론
note 내용에서 다음 매핑 우선순위 사용:
| 매칭 키워드 (정규식, case-i) | scope | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| `\b(buttons?\ | ctas?\ | btns?)\b` | components.button | ||||||
\b(cards?)\b | components.card | ||||||||
| `\b(dialogs?\ | modals?)\b` | components.dialog | |||||||
| `\b(inputs?\ | fields?\ | forms?)\b` | components.input | ||||||
| `\b(nav\ | navigation\ | headers?\ | menus?)\b` | components.navigation | |||||
| `\b(badges?\ | chips?\ | pills?\ | tags?)\b` | components.badge | |||||
| `\b(tables?\ | rows?\ | cells?)\b` | components.table | ||||||
| `\b(dropdowns?\ | selects?\ | comboboxes?)\b` | components.dropdown | ||||||
| `\b(toasts?\ | notifications?\ | snackbars?)\b` | components.toast | ||||||
\b(tabs?)\b | components.tabs | ||||||||
| `\b(colors?\ | palette\ | hex\ | hue\ | saturation\ | shades?\ | tints?\ | gradients?)\b` | color | |
| `\b(font\ | typography\ | typeface\ | weight\ | leading\ | tracking\ | letter-?spacing)\b` | typography | ||
| `\b(spacing\ | gap\ | padding\ | margin\ | grid)\b` | spacing | ||||
| `\b(voice\ | tone\ | copy\ | microcopy\ | wording\ | language)\b` | voice | |||
| `\b(motion\ | animation\ | transition\ | easing\ | duration)\b` | motion | ||||
| `\b(layout\ | structure\ | hierarchy)\b` | layout | ||||||
| `\b(theme\ | aesthetic\ | vibe\ | mood\ | look\ | feel)\b` | visualTheme | |||
| (어느 것도 매칭 X) | visualTheme |
사용자가 명시적으로 scope를 지정했으면 그대로 사용.
Step 3 — id 생성
형식: pref_<base36 timestamp>_<8 hex chars>. Bash로 한 줄:
node -e "console.log('pref_' + Date.now().toString(36) + '_' + require('crypto').randomBytes(4).toString('hex'))"
Step 4 — slug + heading
node -e "console.log(process.argv[1].toLowerCase().replace(/[^a-z0-9]+/g,'-').replace(/^-+|-+$/g,'').slice(0,40) || 'entry')" "<note>"
heading: <ISO timestamp> — <slug>
Step 5 — 파일 read/append
Read .omd/preferences.md— 없으면 frontmatter+header부터 만든다:
```
schema: omd.preferences/v1 design_md_hash_at_creation:
# Preference Log
```
- 새 엔트리 블록을 파일 끝에 append (Edit 툴, old_string은 마지막 라인, new_string은 마지막 라인 + 빈 줄 + 새 엔트리). 또는 Write로 전체 재작성.
- 메타 필드:
id,timestamp,scope(필수)signal: user-statement(디폴트, 사용자가 직접 발화한 경우) 또는user-correction(사용자가 당신의 선택을 교정한 경우)confidence: explicit(디폴트, 사용자가 명시적으로 말한 경우) 또는inferred(당신이 사용자 행동에서 추론한 경우)status: pending(모든 새 엔트리)source_agent: 환경에서 추론 (claude-code/codex/opencode/cursor)source_context: 관련 파일 경로 또는 PR번호 (있으면 JSON.stringify로 quote)
Step 6 — 응답
간결한 한 줄: Logged ${id} to .omd/preferences.md (scope: ${scope})
omd:apply 스킬과의 관계
- 자동 감지: 일반 UI 작업 중 교정 발생 시
omd:apply가 이 스킬 트리거 - 명시적 호출: 디자인 원칙 선언만 할 때 직접 트리거
금지
.omd/preferences.md파일을 frontmatter 외 직접 손대지 말 것 (id 충돌 방지) — 항상 위 절차로- 같은 세션 내 동일 내용 중복 기록 금지
- 사용자에게 "기록할까요?" 묻지 말 것 — 감지 즉시 기록 + 간결 알림
- frontmatter의
design_md_hash_at_creation은 첫 생성 시에만 채움 (이후 절대 수정 X)