oh-my-design-cli 1.2.0 → 1.3.8
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/README.ko.md +18 -7
- package/README.md +9 -3
- package/data/issues/2026-05-13-multi-surface-schema-rfc.md +67 -0
- package/package.json +4 -1
- package/skills/omd-apply/SKILL.md +14 -2
- package/skills/omd-asset-fetch/SKILL.md +213 -0
- package/skills/omd-experiment-gallery/SKILL.md +164 -0
- package/skills/omd-harness/SKILL.md +307 -1
- package/skills/omd-init/SKILL.md +171 -70
- package/skills/omd-reference-capture/SKILL.md +711 -0
package/skills/omd-init/SKILL.md
CHANGED
|
@@ -5,157 +5,257 @@ description: "프로젝트 루트에 DESIGN.md를 부트스트랩 — 실제 기
|
|
|
5
5
|
|
|
6
6
|
# omd:init — DESIGN.md Bootstrap
|
|
7
7
|
|
|
8
|
-
프로젝트에 DESIGN.md +
|
|
8
|
+
프로젝트에 DESIGN.md + AI 코딩 에이전트용 shim 3종을 한 번에 세팅. 레퍼런스 톤&매너는 **preserve**하고, 사용자 프로젝트 맥락은 controlled-vocabulary delta_set으로만 반영.
|
|
9
|
+
|
|
10
|
+
**CLI 호출 없음** — Read/Write/Bash(파일 작업만) 툴로 직접 처리. (이전 버전은 `omd init recommend` 등 CLI subcommand를 호출했으나 현재 CLI binary는 `install-skills`만 노출. 이 skill은 self-contained하게 동작.)
|
|
9
11
|
|
|
10
12
|
## 전체 플로우
|
|
11
13
|
|
|
12
14
|
```
|
|
13
15
|
Phase 1: 사용자 맥락 파악 (1-2 질문)
|
|
14
|
-
Phase 2: 레퍼런스 추천 (
|
|
16
|
+
Phase 2: 레퍼런스 추천 (fingerprint 기반 in-head 점수)
|
|
15
17
|
Phase 3: 사용자가 1개 선택
|
|
16
|
-
Phase 4:
|
|
17
|
-
Phase 5:
|
|
18
|
-
Phase
|
|
18
|
+
Phase 4: 레퍼런스 DESIGN.md Read + delta_set 추출
|
|
19
|
+
Phase 4.5: Philosophy Layer 입력 수집
|
|
20
|
+
Phase 5: Hybrid variation으로 DESIGN.md 작성
|
|
21
|
+
Phase 6: Shim 3종 설치 (omd:sync skill 위임)
|
|
19
22
|
Phase 7: 요약 출력
|
|
20
23
|
```
|
|
21
24
|
|
|
22
25
|
## Phase 1 — 맥락 파악
|
|
23
26
|
|
|
24
|
-
|
|
27
|
+
이미 충분한 description이 있으면 skip. 부족하면 **최대 2개** 질문:
|
|
25
28
|
|
|
26
29
|
1. 프로젝트 유형/도메인 (SaaS / 랜딩 / 대시보드 / 이커머스 / 커뮤니티 등)
|
|
27
|
-
2. 분위기 키워드 (warm, minimal, premium, playful, dense, airy 등)
|
|
30
|
+
2. 분위기 키워드 (warm, minimal, premium, playful, dense, airy 등)
|
|
28
31
|
|
|
29
|
-
|
|
32
|
+
한 번에 하나씩, 또는 통합해서 한 번에. 질문 쌓지 말 것.
|
|
30
33
|
|
|
31
|
-
## Phase 2 — 레퍼런스 추천
|
|
34
|
+
## Phase 2 — 레퍼런스 추천 (file-based, no CLI)
|
|
32
35
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
### 2.1 카탈로그 로드
|
|
37
|
+
|
|
38
|
+
다음 파일을 Read 툴로 전체 로드 (있는 순서대로 fallback):
|
|
39
|
+
|
|
40
|
+
1. `.claude/data/reference-fingerprints.json` (사용자 프로젝트에 설치된 카탈로그 — 표준 경로)
|
|
41
|
+
2. `node_modules/oh-my-design-cli/data/reference-fingerprints.json` (npm 설치 직접 경로)
|
|
42
|
+
3. `data/reference-fingerprints.json` (개발 환경)
|
|
43
|
+
|
|
44
|
+
스키마: `{ count, items: [{ id, primary_color_hex, category, visual_theme, voice_fingerprint, tone_keywords, antipatterns, signature_motion, has_personas, category_raw }] }`.
|
|
45
|
+
|
|
46
|
+
추가 보조 파일 (있으면 같이 로드):
|
|
47
|
+
- `.claude/data/vocabulary.json` — controlled vocab axes/keywords
|
|
48
|
+
- `.claude/data/reference-tags.md` — human-readable keyword matrix
|
|
49
|
+
|
|
50
|
+
### 2.2 task 분석 (silent, in-head)
|
|
51
|
+
|
|
52
|
+
사용자의 description에서 다음 추출:
|
|
53
|
+
- **명시 brand hint**: 한글/영문 brand 이름 직접 언급 (예: "토스 같은" → `toss`, "뱅크샐러드 톤" → `banksalad`, "Linear-clone" → `linear.app`). brand 이름과 id 매핑은 일반 지식 사용 + `items[].id` 또는 `items[].category_raw`에서 cross-check.
|
|
54
|
+
- **vocab 키워드**: warm / minimal / dense / playful / formal / editorial / clinical 등 (vocabulary.json 참조)
|
|
55
|
+
- **카테고리 추측**: Consumer Tech / Fintech / Productivity / E-commerce / Design Tools / Developer Tools / AI & LLM / Mobility / HR / Real Estate / Healthcare / Government
|
|
37
56
|
|
|
38
|
-
|
|
39
|
-
- `recommendations` — top 5 references (id, category, score, matchedKeywords)
|
|
40
|
-
- `delta_set` — description에서 추출된 controlled vocab 기반 축 이동
|
|
41
|
-
- `delta_set.warnings` — conflict (e.g. "formal ↔ playful")
|
|
42
|
-
- `delta_set.matchedKeywords` — 실제 매칭된 vocabulary 키워드
|
|
57
|
+
### 2.3 점수 계산 (in-head, deterministic)
|
|
43
58
|
|
|
44
|
-
|
|
45
|
-
-
|
|
46
|
-
-
|
|
59
|
+
각 item에 대해:
|
|
60
|
+
- brand hint match → **+5점**
|
|
61
|
+
- `tone_keywords` ∩ task vocab 키워드 → 매칭당 **+1점**
|
|
62
|
+
- `category` 일치 → **+1점**
|
|
47
63
|
|
|
48
|
-
|
|
64
|
+
Top 5 정렬. 모든 추천 id는 `items[].id`에 **반드시** 존재 — hallucination 금지.
|
|
49
65
|
|
|
50
|
-
|
|
66
|
+
### 2.4 사용자에게 제시
|
|
51
67
|
|
|
52
|
-
|
|
68
|
+
prose로:
|
|
53
69
|
|
|
54
|
-
```bash
|
|
55
|
-
omd init prepare --ref <id> --description "<원본 description>" --json
|
|
56
70
|
```
|
|
71
|
+
"<task 핵심 한 줄>"을 보니 <top1.id>가 가장 잘 맞을 것 같아요 — <visual_theme 핵심 한 줄 + 매칭 키워드 1-2개>.
|
|
57
72
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
73
|
+
이대로 가시려면 go (또는 <top1.id>).
|
|
74
|
+
다른 후보: <top2.id> (한 줄 이유) · <top3.id> (...) · <top4.id> (...) · <top5.id> (...)
|
|
75
|
+
본인이 아는 다른 reference 있으면 id로 알려주세요 (예: vercel) — 카탈로그에 없으면 알려드립니다.
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
vocab axis conflict 있으면 (예: formal ↔ playful) 먼저 알리고 우선시할 축을 묻기.
|
|
79
|
+
|
|
80
|
+
## Phase 3 — 사용자 선택
|
|
81
|
+
|
|
82
|
+
- `go` 또는 top-5 안 id → 그 id 채택
|
|
83
|
+
- top-5 밖이지만 카탈로그 안 id → 그대로 채택
|
|
84
|
+
- 카탈로그에 없는 id → "해당 id는 카탈로그에 없어요. top-5 중에서 골라주세요."
|
|
85
|
+
- "중단" → 종료
|
|
86
|
+
|
|
87
|
+
## Phase 4 — 레퍼런스 DESIGN.md 로드
|
|
88
|
+
|
|
89
|
+
### 4.1 경로 결정
|
|
90
|
+
|
|
91
|
+
선택된 id를 `<id>`로 하고, 다음 순서로 Read:
|
|
92
|
+
|
|
93
|
+
1. `.claude/data/references/<id>/DESIGN.md`
|
|
94
|
+
2. `node_modules/oh-my-design-cli/web/references/<id>/DESIGN.md`
|
|
95
|
+
3. `web/references/<id>/DESIGN.md` (개발 환경)
|
|
96
|
+
|
|
97
|
+
전체 내용을 `reference_md` 변수로 보관 (Phase 5의 입력).
|
|
98
|
+
|
|
99
|
+
### 4.2 기존 DESIGN.md 처리
|
|
100
|
+
|
|
101
|
+
프로젝트 루트에 이미 `DESIGN.md`가 있으면:
|
|
102
|
+
1. Read로 내용 확인
|
|
103
|
+
2. Bash로 `mv DESIGN.md DESIGN_DEPRECATED.md`
|
|
104
|
+
3. `DESIGN_DEPRECATED.md` 최상단에 다음 헤더 prepend (Edit 툴):
|
|
105
|
+
```html
|
|
106
|
+
<!-- omd:deprecated
|
|
107
|
+
replaced_at: <ISO-8601 today>
|
|
108
|
+
replaced_by: ./DESIGN.md (bootstrapped from <id>)
|
|
109
|
+
reason: omd:init bootstrap
|
|
110
|
+
-->
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 4.3 init-context 기록
|
|
114
|
+
|
|
115
|
+
`.omd/init-context.json` 작성 (없으면 mkdir):
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"reference_id": "<id>",
|
|
119
|
+
"description": "<원본 사용자 description>",
|
|
120
|
+
"mode": "clone | inspired",
|
|
121
|
+
"delta_set": {
|
|
122
|
+
"axes": { /* description에서 추출한 vocab axis ↦ shift 값 */ },
|
|
123
|
+
"voiceHints": [ /* 추출된 voice 힌트 */ ],
|
|
124
|
+
"matchedKeywords": [ /* 매칭된 vocab 키워드 */ ],
|
|
125
|
+
"warnings": [ /* axis conflict 등 */ ]
|
|
126
|
+
},
|
|
127
|
+
"bootstrapped_at": "<ISO-8601>"
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
`mode` 값 결정:
|
|
132
|
+
- omd:reference-capture가 먼저 돌았으면 그 결과 사용 (`.omd/init-context.json` 기존값)
|
|
133
|
+
- 아직 정해지지 않았으면 사용자에게 묻기 (omd:reference-capture Phase 0과 동일한 prompt). 라이브 캡쳐 없이 omd:init만 단독으로 도는 경우는 사실상 inspired 외엔 의미 없으므로 기본 `inspired`.
|
|
62
134
|
|
|
63
|
-
|
|
135
|
+
`axes` 표준 키: `color.hue_deg` (도), `color.saturation_pct` (%p), `color.lightness_pct` (%p), `radius.delta_px` (px), `density.shift` (-2 ~ +2), `tracking.shift` (-0.01em ~ +0.01em).
|
|
64
136
|
|
|
65
137
|
## Phase 4.5 — Philosophy Layer 입력 수집 (CRITICAL)
|
|
66
138
|
|
|
67
|
-
§11 (Brand Narrative), §12 (Principles), §13 (Personas)는
|
|
139
|
+
§11 (Brand Narrative), §12 (Principles), §13 (Personas)는 레퍼런스의 검증된 historical facts에 기반. 단순 domain swap하면 거짓 brand claim을 ship하는 사고가 난다.
|
|
68
140
|
|
|
69
|
-
|
|
141
|
+
Phase 5B 진입 전 사용자에게 한 번에 묻기:
|
|
70
142
|
|
|
71
143
|
```
|
|
72
144
|
DESIGN.md의 §11-13 (Brand Narrative / Principles / Personas)에는 사실 정보가 들어갑니다. 다음을 알려주시거나 "skip"이라고 답해주세요:
|
|
73
145
|
|
|
74
146
|
1. 프로젝트 이름 / 창립 시점 (대략)
|
|
75
147
|
2. 핵심 thesis 한 문장 (e.g. Airbnb의 "Belong Anywhere")
|
|
76
|
-
3. 공식 tagline 또는 거부하는 카테고리 default
|
|
77
|
-
4. 타겟 사용자 segment 2-4개
|
|
148
|
+
3. 공식 tagline 또는 거부하는 카테고리 default
|
|
149
|
+
4. 타겟 사용자 segment 2-4개
|
|
78
150
|
|
|
79
|
-
답변 받으면 →
|
|
80
|
-
"skip" → §11-13은 [FILL IN: ...] placeholder + omd:limitation
|
|
151
|
+
답변 받으면 → §11-13에 반영
|
|
152
|
+
"skip" → §11-13은 [FILL IN: ...] placeholder + omd:limitation 코멘트
|
|
81
153
|
```
|
|
82
154
|
|
|
83
|
-
|
|
155
|
+
부분 답변은 받은 부분만 사용, 나머지 skip.
|
|
84
156
|
|
|
85
157
|
## Phase 5 — Hybrid Variation 생성 (핵심)
|
|
86
158
|
|
|
87
|
-
`.omd/init-context.json
|
|
159
|
+
`reference_md` + `.omd/init-context.json` `delta_set`을 입력으로 새 `DESIGN.md` 작성.
|
|
88
160
|
|
|
89
161
|
### Phase 5A — Voice Fingerprint 내부 추출 (silent)
|
|
90
162
|
|
|
91
|
-
|
|
92
|
-
- 평균 문장 길이 밴드
|
|
163
|
+
출력 금지. 작성 전 머릿속으로 파악:
|
|
164
|
+
- 평균 문장 길이 밴드
|
|
93
165
|
- 어휘 register (engineering-terse / editorial-warm / clinical / playful 중)
|
|
94
|
-
- 은유 밀도
|
|
166
|
+
- 은유 밀도
|
|
95
167
|
- 기술 밀도 (token-heavy / prose-heavy / balanced)
|
|
96
168
|
- 문단 리듬 (list-forward / paragraph-forward)
|
|
97
169
|
|
|
98
|
-
Phase 5B
|
|
170
|
+
Phase 5B emit하는 모든 내러티브를 이 fingerprint에 정확히 맞춰야 한다.
|
|
99
171
|
|
|
100
172
|
### Phase 5B — 새 DESIGN.md emit
|
|
101
173
|
|
|
102
174
|
**엄격 규칙 (위반 = regression)**:
|
|
103
175
|
|
|
104
|
-
1. **Section 구조 frozen
|
|
176
|
+
1. **Section 구조 frozen**: 레퍼런스의 H2/H3 heading을 같은 순서로 그대로. 추가/삭제/이름 변경 금지.
|
|
105
177
|
|
|
106
|
-
2. **Token
|
|
178
|
+
2. **Token 값 해석 우선순위** (위에서 아래로):
|
|
179
|
+
1. `assets/_reference/<id>/tokens.json` `live_overrides` 블록 — **현재 라이브 사이트의 토큰** (omd:reference-capture가 라이브 inspect로 얻은 값). 있으면 이걸 base로.
|
|
180
|
+
2. `web/references/<id>/DESIGN.md` (또는 `node_modules/.../web/references/<id>/DESIGN.md`) — **DESIGN.md가 brand intent로 기록한 canonical 값**. live_overrides 없으면 이걸 base로.
|
|
181
|
+
3. `delta_set.axes` — 사용자 customization. base 위에 가산.
|
|
182
|
+
- 색상: HSL 변환 후 `color.hue_deg` / `saturation_pct` / `lightness_pct` 적용.
|
|
183
|
+
- radius: `radius.delta_px`만큼 가산 (음수도 가능).
|
|
184
|
+
- 그 외 토큰은 손대지 말 것. "개선" 금지.
|
|
185
|
+
- **canonical과 live가 충돌하면** 사용자에게 한 줄로 알림 + 라이브 사용 (예: "Banksalad canonical은 `#04c584` 2px radius, 라이브는 `#13bd7e` 41px pill — 라이브 기준으로 진행합니다. canonical로 가시려면 'use canonical'이라고 알려주세요.").
|
|
186
|
+
- **단 brand essence (voice·principles·motion philosophy·voice samples)는 canonical 절대 권위.** live는 visual surface(토큰·컴포넌트 shape)에만 적용.
|
|
107
187
|
|
|
108
|
-
3.
|
|
188
|
+
3. **내러티브는 Phase 5A fingerprint에 매칭**: 도메인 예시 교체 시 문장 길이/register/은유 밀도 그대로. 명사만 swap, 동사/형용사/framing 손대지 말 것.
|
|
109
189
|
|
|
110
|
-
4.
|
|
190
|
+
4. **새 philosophy 도입 금지**: OmD v0.1 layer, 없던 원칙 추가 금지. delta-derived 노트는 새 bullet으로 넣지 말고 기존 bullet에 자연스럽게 통합.
|
|
111
191
|
|
|
112
|
-
5.
|
|
192
|
+
5. **해결 불가능 delta는 top-of-file HTML comment**: `<!-- omd:unresolved: <axis> -->` 상단 추가, 해당 token은 건드리지 않음.
|
|
113
193
|
|
|
114
|
-
6.
|
|
194
|
+
6. **Voice hints 반영**: `delta_set.voiceHints`는 Voice 섹션 내러티브에 반영하되 레퍼런스 voice 스타일 안에서만. "contractions ok" → Voice 원칙 bullet에 한 줄 추가.
|
|
115
195
|
|
|
116
|
-
7.
|
|
196
|
+
7. **§11-13 처리 분기**:
|
|
197
|
+
- Phase 4.5에서 정보 제공: 그 정보로 §11/12/13 작성. verbatim 인용은 사용자가 직접 준 표현만. 레퍼런스의 시간 표현·공식 인용 모두 사용자 맥락으로 대체.
|
|
198
|
+
- Phase 4.5에서 skip: §11-13 본문을 `[FILL IN: <섹션 목적 한 줄>]` placeholder + 각 섹션 상단 `<!-- omd:limitation Reference §X requires project-specific facts. Replace before shipping; do not fabricate. -->`.
|
|
199
|
+
- §14 (States), §15 (Motion): 일반 Hybrid 적용 (구체 명사만 swap).
|
|
117
200
|
|
|
118
|
-
8.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
201
|
+
8. **Frontmatter**:
|
|
202
|
+
```yaml
|
|
203
|
+
---
|
|
204
|
+
omd: 0.1
|
|
205
|
+
brand: <Project Name or "Project">
|
|
206
|
+
bootstrapped_from: <id>
|
|
207
|
+
bootstrapped_at: <ISO-8601>
|
|
208
|
+
---
|
|
209
|
+
```
|
|
122
210
|
|
|
123
211
|
### Phase 5C — 파일 작성
|
|
124
212
|
|
|
125
|
-
Write 툴로 `DESIGN.md
|
|
213
|
+
Write 툴로 `DESIGN.md` emit.
|
|
126
214
|
|
|
127
215
|
## Phase 6 — Shim 설치
|
|
128
216
|
|
|
129
|
-
|
|
130
|
-
|
|
217
|
+
CLI subcommand 없음. 두 가지 옵션:
|
|
218
|
+
|
|
219
|
+
**옵션 A (권장)**: omd:sync skill 위임. 같은 conversation에서 Skill 툴로:
|
|
220
|
+
```
|
|
221
|
+
Skill: omd:sync
|
|
222
|
+
args: --force
|
|
131
223
|
```
|
|
132
224
|
|
|
133
|
-
|
|
225
|
+
omd:sync skill이 `CLAUDE.md`, `AGENTS.md`, `.cursor/rules/omd-design.mdc` shim 3종을 생성/갱신하고 `.omd/sync.lock.json` 업데이트.
|
|
226
|
+
|
|
227
|
+
**옵션 B**: omd:sync skill을 호출할 수 없는 환경이면 직접 Write로 shim 작성. 템플릿은 `skills/omd-sync/SKILL.md` §"shim body" 참조. 최소한:
|
|
228
|
+
- `CLAUDE.md`: managed block ("<!-- omd:managed:start --> ... <!-- omd:managed:end -->") 안에 DESIGN.md 참조 + 핵심 token 요약
|
|
229
|
+
- `AGENTS.md`: 동일 패턴
|
|
230
|
+
- `.cursor/rules/omd-design.mdc`: 전체 파일 omd 전용 — frontmatter + DESIGN.md 인용
|
|
231
|
+
|
|
232
|
+
이후 `.omd/sync.lock.json`에 각 shim의 hash 기록.
|
|
134
233
|
|
|
135
234
|
## Phase 7 — 요약 출력
|
|
136
235
|
|
|
137
236
|
한 문단으로:
|
|
138
237
|
- Base reference + 프로젝트 context 한 줄 요약
|
|
139
|
-
- 적용된 주요 delta 2-3개 (e.g. "primary
|
|
238
|
+
- 적용된 주요 delta 2-3개 (e.g. "primary hue shifted warm by +12°, radius +4px")
|
|
140
239
|
- 생성된 파일 목록 (DESIGN.md + shims)
|
|
141
240
|
- DESIGN_DEPRECATED.md 있으면 언급
|
|
142
|
-
- 다음 스텝: `omd:apply`로 UI 작업
|
|
241
|
+
- 다음 스텝: `omd:apply`로 UI 작업 시작 또는 `omd:harness`로 전체 surface 디자인 또는 `omd:remember`로 선호 추가 로깅
|
|
143
242
|
|
|
144
243
|
예시:
|
|
145
244
|
```
|
|
146
|
-
✓ DESIGN.md created (based on
|
|
147
|
-
- primary hue
|
|
148
|
-
- radius
|
|
149
|
-
- voice hints:
|
|
245
|
+
✓ DESIGN.md created (based on banksalad, 한국 핀테크 랜딩 맥락)
|
|
246
|
+
- primary hue 유지 (#04c584 그대로)
|
|
247
|
+
- radius 유지 (2px 시스템)
|
|
248
|
+
- voice hints: 데이터 어드바이저 톤
|
|
150
249
|
|
|
151
250
|
Shim files:
|
|
152
|
-
✓ CLAUDE.md
|
|
153
|
-
✓ AGENTS.md
|
|
251
|
+
✓ CLAUDE.md (managed block)
|
|
252
|
+
✓ AGENTS.md (managed block)
|
|
154
253
|
✓ .cursor/rules/omd-design.mdc
|
|
155
254
|
|
|
156
255
|
Next:
|
|
157
|
-
-
|
|
158
|
-
-
|
|
256
|
+
- UI 작업 시작 → omd:apply로 자동 라우팅됨
|
|
257
|
+
- 전체 surface 디자인 (랜딩, 대시보드 등) → omd:harness
|
|
258
|
+
- 디자인 선호 로깅 → /omd:remember <note>
|
|
159
259
|
```
|
|
160
260
|
|
|
161
261
|
## 금지
|
|
@@ -163,5 +263,6 @@ Next:
|
|
|
163
263
|
- Phase 5A fingerprint를 출력하지 말 것 (내부 전용).
|
|
164
264
|
- `delta_set.axes`에 없는 token을 마음대로 바꾸지 말 것.
|
|
165
265
|
- 레퍼런스에 없는 section/heading을 추가하지 말 것.
|
|
166
|
-
- `.omd/init-context.json`을 직접
|
|
167
|
-
- DESIGN.md가 이미 있는데 백업 없이 덮어쓰지 말 것
|
|
266
|
+
- `.omd/init-context.json`을 직접 편집할 때 schema 어기지 말 것.
|
|
267
|
+
- DESIGN.md가 이미 있는데 백업 없이 덮어쓰지 말 것 (Phase 4.2 rename 절차 준수).
|
|
268
|
+
- **존재하지 않는 CLI subcommand (`omd init recommend`, `omd init prepare`, `omd sync`)를 호출하지 말 것** — 현 CLI binary는 `install-skills`만 제공.
|