oh-my-design-cli 1.7.1 → 1.8.0
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/.claude/hooks/lib/preferences-parser.cjs +91 -0
- package/.claude/hooks/lib/preferences-writer.cjs +118 -0
- package/.claude/hooks/post-edit-watch.cjs +232 -36
- package/.claude/hooks/session-end-foldin.cjs +72 -19
- package/.claude/hooks/session-state-loader.cjs +52 -3
- package/.claude/hooks/skill-activation.cjs +40 -7
- package/README.ja.md +32 -103
- package/README.ko.md +45 -206
- package/README.md +33 -151
- package/README.zh-TW.md +32 -103
- package/agents/AGENT.md +3 -3
- package/agents/omd-master.md +16 -7
- package/agents/omd-microcopy.md +1 -1
- package/agents/omd-ux-engineer.md +9 -7
- package/agents/omd-ux-researcher.md +1 -1
- package/agents/omd-ux-writer.md +1 -1
- package/dist/bin/oh-my-design.js +3 -3
- package/dist/bin/oh-my-design.js.map +1 -1
- package/dist/{install-skills-YYHEC4CS.js → install-skills-7UUDOLG2.js} +152 -20
- package/dist/install-skills-7UUDOLG2.js.map +1 -0
- package/package.json +3 -1
- package/skills/omd-designer-review/SKILL.md +34 -0
- package/skills/omd-final-qa/SKILL.md +29 -0
- package/skills/omd-harness/SKILL.md +30 -9
- package/skills/omd-init/SKILL.md +52 -6
- package/skills/omd-kr-writer/SKILL.md +73 -3
- package/skills/omd-learn/SKILL.md +20 -0
- package/skills/omd-reference-capture/SKILL.md +15 -4
- package/skills/omd-taste/SKILL.md +79 -0
- package/dist/install-skills-YYHEC4CS.js.map +0 -1
|
@@ -7,11 +7,13 @@
|
|
|
7
7
|
|
|
8
8
|
const fs = require('node:fs');
|
|
9
9
|
const path = require('node:path');
|
|
10
|
+
const { countPending } = require('./lib/preferences-parser.cjs');
|
|
10
11
|
|
|
11
12
|
const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
12
13
|
const stateMd = path.join(projectDir, '.omd', 'state.md');
|
|
13
14
|
const timelineMd = path.join(projectDir, '.omd', 'timeline.md');
|
|
14
15
|
const preferencesMd = path.join(projectDir, '.omd', 'preferences.md');
|
|
16
|
+
const proposalJson = path.join(projectDir, '.omd', 'foldin-proposal.json');
|
|
15
17
|
|
|
16
18
|
function safeRead(p) {
|
|
17
19
|
try {
|
|
@@ -32,9 +34,9 @@ if (fs.existsSync(stateMd)) {
|
|
|
32
34
|
lines.push('');
|
|
33
35
|
}
|
|
34
36
|
} else if (fs.existsSync(preferencesMd)) {
|
|
35
|
-
// Best-effort fallback — count pending entries
|
|
37
|
+
// Best-effort fallback — count pending entries (canonical omd:remember format).
|
|
36
38
|
const text = safeRead(preferencesMd) || '';
|
|
37
|
-
const pendingCount = (text
|
|
39
|
+
const pendingCount = countPending(text);
|
|
38
40
|
if (pendingCount > 0) {
|
|
39
41
|
lines.push('## OMD ENVIRONMENT STATE');
|
|
40
42
|
lines.push('');
|
|
@@ -43,6 +45,43 @@ if (fs.existsSync(stateMd)) {
|
|
|
43
45
|
}
|
|
44
46
|
}
|
|
45
47
|
|
|
48
|
+
// Auto-fold gate (issue #23): a "proposed" fold-in proposal instructs the
|
|
49
|
+
// agent to ask the user via AskUserQuestion — hooks can't render UI, the
|
|
50
|
+
// agent executes the question at session start. Snoozed/applied → silent.
|
|
51
|
+
let proposal = null;
|
|
52
|
+
try {
|
|
53
|
+
proposal = JSON.parse(fs.readFileSync(proposalJson, 'utf8'));
|
|
54
|
+
} catch {
|
|
55
|
+
// missing / malformed → no proposal
|
|
56
|
+
}
|
|
57
|
+
if (
|
|
58
|
+
proposal &&
|
|
59
|
+
proposal.status === 'proposed' &&
|
|
60
|
+
Array.isArray(proposal.scopes) &&
|
|
61
|
+
proposal.scopes.length > 0
|
|
62
|
+
) {
|
|
63
|
+
const items = proposal.scopes
|
|
64
|
+
.map((s) => `${s.scope}: ${s.summary || '(no summary)'} (${s.count}×)`)
|
|
65
|
+
.join('; ');
|
|
66
|
+
const perScope =
|
|
67
|
+
proposal.scopes.length <= 3
|
|
68
|
+
? ` / per-scope picks (${proposal.scopes.map((s) => s.scope).join(', ')})`
|
|
69
|
+
: '';
|
|
70
|
+
lines.push('## OMD FOLD-IN PROPOSAL');
|
|
71
|
+
lines.push('');
|
|
72
|
+
lines.push(`${proposal.scopes.length} scope(s) recurred: ${items}.`);
|
|
73
|
+
lines.push(
|
|
74
|
+
`Ask the user via AskUserQuestion (one question, options: '전부 반영'${perScope} / '나중에') whether to fold these into DESIGN.md.`,
|
|
75
|
+
);
|
|
76
|
+
lines.push(
|
|
77
|
+
"On approve: run the omd:learn skill for the approved scopes, then set .omd/foldin-proposal.json status to 'applied'.",
|
|
78
|
+
);
|
|
79
|
+
lines.push(
|
|
80
|
+
"On decline: set status to 'snoozed' and add snoozed_at (ISO timestamp).",
|
|
81
|
+
);
|
|
82
|
+
lines.push('');
|
|
83
|
+
}
|
|
84
|
+
|
|
46
85
|
if (fs.existsSync(timelineMd)) {
|
|
47
86
|
const text = safeRead(timelineMd) || '';
|
|
48
87
|
const blocks = text.split(/^## /m).slice(1).slice(-3);
|
|
@@ -59,6 +98,16 @@ if (fs.existsSync(timelineMd)) {
|
|
|
59
98
|
}
|
|
60
99
|
|
|
61
100
|
if (lines.length > 0) {
|
|
62
|
-
|
|
101
|
+
// SessionStart contract: structured context must sit under hookSpecificOutput
|
|
102
|
+
// — a top-level { additionalContext } parses as JSON and is silently dropped
|
|
103
|
+
// (same class as the post-edit-watch / skill-activation fixes).
|
|
104
|
+
process.stdout.write(
|
|
105
|
+
JSON.stringify({
|
|
106
|
+
hookSpecificOutput: {
|
|
107
|
+
hookEventName: 'SessionStart',
|
|
108
|
+
additionalContext: lines.join('\n'),
|
|
109
|
+
},
|
|
110
|
+
}),
|
|
111
|
+
);
|
|
63
112
|
}
|
|
64
113
|
|
|
@@ -35,9 +35,11 @@ const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
|
35
35
|
// "is the user asking for UI work?" sniff test, not a full taxonomy.
|
|
36
36
|
// If you find yourself wanting to add 50 entries here, that's a sign
|
|
37
37
|
// the description on the relevant SKILL.md should grow instead.
|
|
38
|
+
// `색` → `색상`: the bare `색` substring-matched 검색("search"), 검색창, etc.,
|
|
39
|
+
// firing the gate on non-UI prompts. `색상` ("color") is the real cue.
|
|
38
40
|
const UI_CUES = [
|
|
39
41
|
// Korean
|
|
40
|
-
'디자인', '레이아웃', '화면', '컴포넌트', '버튼', '카드', '
|
|
42
|
+
'디자인', '레이아웃', '화면', '컴포넌트', '버튼', '카드', '색상',
|
|
41
43
|
'폰트', '스타일', '브랜드', '리팩토링', '랜딩', '페이지',
|
|
42
44
|
// English
|
|
43
45
|
'design', 'layout', 'component', 'button', 'card', 'color', 'colour',
|
|
@@ -49,17 +51,38 @@ const UI_CUES = [
|
|
|
49
51
|
'設計', '佈局', '元件', '按鈕', '風格', '顏色', '字體', '品牌', '落地頁',
|
|
50
52
|
];
|
|
51
53
|
|
|
52
|
-
|
|
54
|
+
// Latin-alphabet cues use word boundaries so e.g. "card" doesn't match
|
|
55
|
+
// "discard"/"cardinal" and "style" doesn't match "stylesheet" inside a path.
|
|
56
|
+
// CJK cues have no ASCII word boundaries, so for them we keep substring match.
|
|
57
|
+
const isLatin = (s) => /^[a-z]+$/i.test(s);
|
|
58
|
+
function cueMatches(cue, prompt, lowerPrompt) {
|
|
59
|
+
if (isLatin(cue)) {
|
|
60
|
+
return new RegExp(`\\b${cue}\\b`, 'i').test(prompt);
|
|
61
|
+
}
|
|
62
|
+
return lowerPrompt.includes(cue.toLowerCase()) || prompt.includes(cue);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
let input = '';
|
|
53
66
|
process.stdin.setEncoding('utf8');
|
|
54
|
-
process.stdin.on('data', (chunk) => (
|
|
67
|
+
process.stdin.on('data', (chunk) => (input += chunk));
|
|
55
68
|
process.stdin.on('end', () => {
|
|
69
|
+
// Never crash on malformed stdin — exit 0 silently.
|
|
70
|
+
let prompt;
|
|
71
|
+
try {
|
|
72
|
+
const payload = JSON.parse(input || '{}');
|
|
73
|
+
// Match against the user's prompt ONLY — not cwd/transcript_path, which
|
|
74
|
+
// contain repo paths like ".../oh-my-design/..." that falsely tripped the gate.
|
|
75
|
+
prompt = typeof payload.prompt === 'string' ? payload.prompt : '';
|
|
76
|
+
} catch {
|
|
77
|
+
process.exit(0);
|
|
78
|
+
}
|
|
79
|
+
if (!prompt) process.exit(0);
|
|
80
|
+
|
|
56
81
|
const designMdPath = path.join(projectDir, 'DESIGN.md');
|
|
57
82
|
if (fs.existsSync(designMdPath)) process.exit(0);
|
|
58
83
|
|
|
59
84
|
const lower = prompt.toLowerCase();
|
|
60
|
-
const looksLikeUiWork = UI_CUES.some(
|
|
61
|
-
(k) => lower.includes(k.toLowerCase()) || prompt.includes(k),
|
|
62
|
-
);
|
|
85
|
+
const looksLikeUiWork = UI_CUES.some((k) => cueMatches(k, prompt, lower));
|
|
63
86
|
if (!looksLikeUiWork) process.exit(0);
|
|
64
87
|
|
|
65
88
|
const lines = [
|
|
@@ -71,5 +94,15 @@ process.stdin.on('end', () => {
|
|
|
71
94
|
' with brand context.',
|
|
72
95
|
'',
|
|
73
96
|
];
|
|
74
|
-
|
|
97
|
+
// UserPromptSubmit contract: structured context must sit under
|
|
98
|
+
// hookSpecificOutput — a top-level { additionalContext } parses as JSON
|
|
99
|
+
// with no recognized fields and the gate message is silently dropped.
|
|
100
|
+
process.stdout.write(
|
|
101
|
+
JSON.stringify({
|
|
102
|
+
hookSpecificOutput: {
|
|
103
|
+
hookEventName: 'UserPromptSubmit',
|
|
104
|
+
additionalContext: lines.join('\n'),
|
|
105
|
+
},
|
|
106
|
+
}),
|
|
107
|
+
);
|
|
75
108
|
});
|
package/README.ja.md
CHANGED
|
@@ -5,19 +5,16 @@
|
|
|
5
5
|
<h1 align="center">oh-my-design</h1>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
<strong>
|
|
9
|
-
</p>
|
|
10
|
-
|
|
11
|
-
<p align="center">
|
|
12
|
-
<strong>新機能: OmD v0.1 Philosophy Layer。</strong>Voice・Narrative・Principles・Personas・States・Motion — Claude Code が AI のデフォルトではなく、あなたのブランドに合わせて出力します。
|
|
8
|
+
<strong>AI コーディングエージェントのためのスキル駆動デザイン — コマンド 1 回でブートストラップ。</strong>221 社の実在する企業デザインシステム。インストールに AI 呼び出しゼロ。あとはエージェントに話しかけるだけ。
|
|
13
9
|
</p>
|
|
14
10
|
|
|
15
11
|
<p align="center">
|
|
12
|
+
<a href="https://www.npmjs.com/package/oh-my-design-cli"><img src="https://img.shields.io/npm/v/oh-my-design-cli?style=flat-square&color=cb3837" alt="npm version" /></a>
|
|
13
|
+
<a href="https://www.npmjs.com/package/oh-my-design-cli"><img src="https://img.shields.io/npm/dm/oh-my-design-cli?style=flat-square&color=cb3837" alt="npm downloads" /></a>
|
|
16
14
|
<a href="LICENSE"><img src="https://img.shields.io/github/license/kwakseongjae/oh-my-design?style=flat-square" alt="License" /></a>
|
|
17
15
|
<a href="https://github.com/kwakseongjae/oh-my-design/stargazers"><img src="https://img.shields.io/github/stars/kwakseongjae/oh-my-design?style=social" alt="GitHub Stars" /></a>
|
|
18
|
-
<img src="https://img.shields.io/badge/
|
|
19
|
-
<img src="https://img.shields.io/badge/
|
|
20
|
-
<img src="https://img.shields.io/badge/references-107-7c5cfc?style=flat-square" alt="107 References" />
|
|
16
|
+
<img src="https://img.shields.io/badge/references-221-7c5cfc?style=flat-square" alt="221 References" />
|
|
17
|
+
<img src="https://img.shields.io/badge/CLI%20commands-1-blue?style=flat-square" alt="One CLI command" />
|
|
21
18
|
</p>
|
|
22
19
|
|
|
23
20
|
<p align="center">
|
|
@@ -28,118 +25,50 @@
|
|
|
28
25
|
|
|
29
26
|
## oh-my-design とは?
|
|
30
27
|
|
|
31
|
-
**oh-my-design (OmD)**
|
|
32
|
-
|
|
33
|
-
[Google が提案した](https://stitch.withgoogle.com/docs/design-md/overview/) `DESIGN.md` は本質的に**トークン文書** — 色・タイポグラフィ・コンポーネントの集合です。必要ですが、十分ではありません。トークンだけで UI を作ると形は整っても「誰のブランドでもない」出力になります — Inter-on-white、紫グラデーション、意味のない絵文字といった AI のデフォルトに収束します。OmD v0.1 はその上に**ブランド哲学レイヤー**を重ねます: **Voice・Narrative・Principles・Personas・States・Motion**。OmD フォーマットの `DESIGN.md` をプロジェクトルートに置くと、エージェントの出力はジェネリックではなく「あなたのもの」になります。
|
|
34
|
-
|
|
35
|
-
3 つの構成要素:
|
|
36
|
-
|
|
37
|
-
1. **[仕様](spec/omd-v0.1.md)** — バージョン管理された Google Stitch 拡張、MIT ライセンス。
|
|
38
|
-
2. **[Claude Code スキル](.claude/skills/omd/SKILL.md)** — 仕様をハード制約として自動適用。
|
|
39
|
-
3. **[107 のリファレンス](references/)** — 実在企業の `DESIGN.md` をフォークし、ビルダーでカスタマイズしてそのまま導入。
|
|
40
|
-
|
|
41
|
-
**API キー不要。AI 呼び出しゼロ。全てクライアントサイドで完結。**
|
|
42
|
-
|
|
43
|
-
## OmD v0.1 Philosophy Layer
|
|
44
|
-
|
|
45
|
-
Google Stitch の 9 セクションの上に OmD が追加する 6 セクション:
|
|
46
|
-
|
|
47
|
-
| セクション | 役割 |
|
|
48
|
-
|---|---|
|
|
49
|
-
| **10. Voice & Tone** | マイクロコピー制約 — ボタン文言、エラーメッセージ、オンボーディング |
|
|
50
|
-
| **11. Brand Narrative** | 「なぜ」 — ブランドが拒否するもの、変えようとしているカテゴリ |
|
|
51
|
-
| **12. Principles** | トークンでは解けないケースを決する 5〜10 の第一原理 |
|
|
52
|
-
| **13. Personas** | 2〜4 人の具体的なユーザー。エージェントの出力を実際の使用文脈に grounded させる |
|
|
53
|
-
| **14. States** | Empty / loading / error / skeleton パターン — ジェネリックな「データなし」を防ぐ |
|
|
54
|
-
| **15. Motion & Easing** | 命名された duration + easing トークン — Stitch の 9 セクションが抜けている次元 |
|
|
55
|
-
|
|
56
|
-
**現在、10 のリファレンスが完全な Philosophy Layer とともに提供されています:**
|
|
57
|
-
Toss · Claude · Line · Stripe · Linear · Vercel · Notion · Airbnb · Apple · Figma — それぞれ voice, narrative, principles, personas, states, motion まで公開ソースに基づいて書かれています。
|
|
28
|
+
**oh-my-design (OmD)** は AI コーディングエージェントのためのデザインシステムです。Claude Code / Codex / OpenCode / Cursor を、あなたのブランドを記憶したシニアプロダクトデザイナーに変えます。一度インストールすれば、あとは欲しいものを説明するだけ — コンポーネント、画面、コピー、アセット、チャート — エージェントがプロジェクトのデザインシステムを適用して出力します。`DESIGN.md` がブランド仕様([Google Stitch](https://stitch.withgoogle.com/docs/design-md/overview/) トークン + ブランド哲学レイヤー: Voice / Narrative / Principles / Personas / States / Motion)で、221 社の実在企業の DESIGN.md がパッケージに同梱されています。**API キー不要。外部インフラ不要。すべて既存の CLI セッション内で動作します。**
|
|
58
29
|
|
|
59
|
-
|
|
30
|
+
## インストール
|
|
60
31
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
- **デザインシステムディレクトリ** ([oh-my-design.kr/design-systems](https://oh-my-design.kr/design-systems)) — 107 リファレンス中 34 件は公式のデザインシステムまたはブランドガイドラインページを持っており、ディレクトリからライブサムネイル付きで直接アクセスできます。
|
|
65
|
-
- **Personal Curation** ([oh-my-design.kr/curation](https://oh-my-design.kr/curation)) — MBTI 風の短いクイズであなたのデザイン傾向を 107 リファレンスのいずれかとマッチングし、そのリファレンスが事前選択されたビルダーへ直接移動します。
|
|
66
|
-
|
|
67
|
-
## サポートされる 107 のリファレンス
|
|
68
|
-
|
|
69
|
-
| カテゴリ | 企業 |
|
|
70
|
-
|----------|------|
|
|
71
|
-
| **AI & LLM** | Claude, Cohere, ElevenLabs, Minimax, Mistral AI, Ollama, OpenCode AI, Replicate, RunwayML, Together AI, VoltAgent, xAI |
|
|
72
|
-
| **デザインツール** | Airtable, Clay, Figma, Framer, Miro, Webflow |
|
|
73
|
-
| **開発者ツール** | Cursor, Expo, Lovable, Raycast, Superhuman, Vercel, Warp |
|
|
74
|
-
| **生産性** | Cal.com, freee, Intercom, Linear, Mintlify, Notion, Resend, Zapier |
|
|
75
|
-
| **コンシューマテック** | Airbnb, Apple, Baemin, Dcard, IBM, Kakao, Karrot, LINE, Mercari, NVIDIA, Pinkoi, Pinterest, SpaceX, Spotify, Uber |
|
|
76
|
-
| **フィンテック** | Coinbase, Kraken, Revolut, Stripe, Toss, Wise |
|
|
77
|
-
| **バックエンド & DevOps** | ClickHouse, Composio, Hashicorp, MongoDB, PostHog, Sanity, Sentry, Supabase |
|
|
78
|
-
| **自動車** | BMW, Ferrari, Lamborghini, Renault, Tesla |
|
|
79
|
-
| **マーケティング** | Semrush |
|
|
80
|
-
|
|
81
|
-
> ビルダーの**国フィルター**で地域別に絞り込めます (韓国、台湾、日本、フランス、イタリア、ドイツ、イギリス、アメリカ)。
|
|
82
|
-
|
|
83
|
-
## エクスポートされる DESIGN.md
|
|
84
|
-
|
|
85
|
-
[Google Stitch DESIGN.md フォーマット](https://stitch.withgoogle.com/docs/design-md/overview/)ベース — セクション 1〜9 + OmD v0.1 Philosophy Layer (セクション 10〜15、オプション):
|
|
32
|
+
```bash
|
|
33
|
+
npx oh-my-design-cli install-skills
|
|
34
|
+
```
|
|
86
35
|
|
|
87
|
-
|
|
88
|
-
1. Visual Theme & Atmosphere
|
|
89
|
-
2. Color Palette & Roles
|
|
90
|
-
3. Typography Rules
|
|
91
|
-
4. Component Stylings
|
|
92
|
-
5. Layout Principles
|
|
93
|
-
6. Depth & Elevation
|
|
94
|
-
7. Do's and Don'ts
|
|
95
|
-
8. Responsive Behavior
|
|
96
|
-
9. Agent Prompt Guide
|
|
36
|
+
インストール後、エージェントを再起動してください (Claude Code は Cmd+Q → 再起動) — 新しいスキル + エージェントが読み込まれます。
|
|
97
37
|
|
|
98
|
-
|
|
38
|
+
実行する CLI コマンドはこれだけです。あとはすべてエージェントへの自然言語です。
|
|
99
39
|
|
|
100
|
-
|
|
101
|
-
11. Brand Narrative
|
|
102
|
-
12. Principles
|
|
103
|
-
13. Personas
|
|
104
|
-
14. States
|
|
105
|
-
15. Motion & Easing
|
|
40
|
+
## サポートされるエージェント
|
|
106
41
|
|
|
107
|
-
|
|
42
|
+
| エージェント | チャネル | インストールされるもの |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| **Claude Code** | `--agent claude-code` (デフォルト) | フルバンドル — `.claude/` 配下のスキル、16 サブエージェント、hooks、data |
|
|
45
|
+
| **Codex** | `--agent codex` | `.agents/skills/` スキルバンドル (公式 discovery パス) |
|
|
46
|
+
| **OpenCode** | `--agent opencode` | `.opencode/skills/` スキルバンドル |
|
|
47
|
+
| **Cursor** | `--agent cursor` | 正式な rules チャネル — `.cursor/rules/omd-design.mdc` shim + 共有 `.claude/data` カタログ (スキル/フックなし) |
|
|
108
48
|
|
|
109
|
-
|
|
49
|
+
デフォルトでは検出されたすべてのエージェントにインストールします; 単一チャネルのみなら `--agent <name>`。
|
|
110
50
|
|
|
111
|
-
|
|
112
|
-
oh-my-design/
|
|
113
|
-
spec/ OmD v0.1 仕様 (正本)
|
|
114
|
-
.claude/skills/omd/ Claude Code スキルバンドル
|
|
115
|
-
references/ 107 社分の DESIGN.md ファイル
|
|
116
|
-
src/ CLI コア (TypeScript)
|
|
117
|
-
web/ Next.js ウェブビルダー
|
|
118
|
-
src/app/ Landing + Builder + Directory ページ
|
|
119
|
-
src/components/ Wizard, Preview, Export
|
|
120
|
-
test/ CLI Vitest スイート (unit/, integration/, scripts/)
|
|
121
|
-
```
|
|
51
|
+
## パッケージの中身
|
|
122
52
|
|
|
123
|
-
|
|
53
|
+
**17 スキル · 16 サブエージェント · 221 の検証済みリファレンス · 活性化 hooks** — 上記コマンド 1 回ですべてインストールされます。
|
|
124
54
|
|
|
125
|
-
|
|
55
|
+
すべてのリファレンスは `oh-my-design.kr/design-systems/<id>.md` から raw markdown としても取得でき、エージェントが直接 fetch できます。スキル・エージェントごとの詳細リファレンス: **[oh-my-design.kr/docs](https://oh-my-design.kr/docs)**。
|
|
126
56
|
|
|
127
|
-
|
|
57
|
+
## アップグレード
|
|
128
58
|
|
|
129
59
|
```bash
|
|
130
|
-
|
|
131
|
-
cd web && npm test # Web: 107 テスト — generate-css, config-hash, survey
|
|
60
|
+
npx oh-my-design-cli@latest install-skills
|
|
132
61
|
```
|
|
133
62
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
## 謝辞
|
|
63
|
+
Idempotent。`<!-- omd:installed-skill -->` マーカー付きの管理ファイルは in-place で更新され、ユーザーが編集したファイルはそのまま残ります (`--force` で上書き)。再実行後はエージェントを再起動してください。
|
|
137
64
|
|
|
138
|
-
|
|
139
|
-
- [kzhrknt/awesome-design-md-jp](https://github.com/kzhrknt/awesome-design-md-jp) — 日本市場のデザインシステムリファレンス。
|
|
65
|
+
## リンク
|
|
140
66
|
|
|
141
|
-
oh-my-design
|
|
67
|
+
- **カタログ** — [oh-my-design.kr/design-systems](https://oh-my-design.kr/design-systems)
|
|
68
|
+
- **コレクション** — [oh-my-design.kr/collections](https://oh-my-design.kr/collections)
|
|
69
|
+
- **ドキュメント** — [oh-my-design.kr/docs](https://oh-my-design.kr/docs)
|
|
70
|
+
- **チェンジログ** — [CHANGELOG.md](CHANGELOG.md)
|
|
142
71
|
|
|
143
72
|
## ライセンス
|
|
144
73
|
|
|
145
|
-
[
|
|
74
|
+
MIT — [LICENSE](LICENSE) を参照。リファレンスは各企業に帰属し、教育的参照のために再構成されています。
|