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/v1 design_md_hash_at_creation: <hash 또는 빈 문자열> --- # Preference Log ## 2026-04-30T17:48:00.000Z — ctas-never-uppercase ```omd-meta id: pref_lqxk2_a3f9c1d4 timestamp: 2026-04-30T17:48:00.000Z scope: components.button signal: user-statement confidence: explicit status: pending source_agent: claude-code source_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로 한 줄: ```bash node -e "console.log('pref_' + Date.now().toString(36) + '_' + require('crypto').randomBytes(4).toString('hex'))"
Step 4 — slug + heading
bashnode -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)


