omnidesign 1.0.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/LICENSE +21 -0
- package/QUICKREF.md +150 -0
- package/README.md +576 -0
- package/bin/cli.js +390 -0
- package/bin/detect-ide.js +50 -0
- package/bin/install.js +8 -0
- package/logo.jpg +0 -0
- package/package.json +84 -0
- package/recipes/components/README.md +29 -0
- package/recipes/components/agent-card.md +314 -0
- package/recipes/components/ai-chat.md +252 -0
- package/recipes/components/bento-grid.md +186 -0
- package/recipes/components/code-block.md +503 -0
- package/recipes/components/file-upload.md +483 -0
- package/recipes/components/forms.md +238 -0
- package/recipes/components/hero-section.md +161 -0
- package/recipes/components/navbar.md +214 -0
- package/recipes/components/prompt-input.md +293 -0
- package/recipes/components/thinking-indicator.md +372 -0
- package/recipes/motion/README.md +3 -0
- package/recipes/motion/motion-system.md +437 -0
- package/recipes/patterns/README.md +3 -0
- package/skills/aider/omnidesign.md +67 -0
- package/skills/amp/SKILL.md +114 -0
- package/skills/antigravity/SKILL.md +114 -0
- package/skills/claude/omnidesign.md +111 -0
- package/skills/continue/omnidesign.yaml +29 -0
- package/skills/cursor/omnidesign.md +110 -0
- package/skills/kilo/SKILL.md +114 -0
- package/skills/opencode/omnidesign.md +110 -0
- package/skills/vscode/package.json +66 -0
- package/skills/zed/omnidesign.json +7 -0
- package/tokens/motion/README.md +3 -0
- package/tokens/primitives/README.md +3 -0
- package/tokens/primitives/color.json +219 -0
- package/tokens/primitives/motion.json +56 -0
- package/tokens/primitives/radii.json +37 -0
- package/tokens/primitives/shadows.json +34 -0
- package/tokens/primitives/spacing.json +67 -0
- package/tokens/primitives/typography.json +127 -0
- package/tokens/semantic/README.md +3 -0
- package/tokens/semantic/color.json +114 -0
- package/tokens/semantic/motion.json +44 -0
- package/tokens/semantic/radii.json +29 -0
- package/tokens/semantic/shadows.json +24 -0
- package/tokens/semantic/spacing.json +69 -0
- package/tokens/semantic/typography.json +118 -0
- package/tokens/shadows/README.md +3 -0
- package/tokens/themes/README.md +3 -0
- package/tokens/themes/berry.json +143 -0
- package/tokens/themes/brutalist.json +143 -0
- package/tokens/themes/coral.json +143 -0
- package/tokens/themes/corporate.json +143 -0
- package/tokens/themes/cream.json +143 -0
- package/tokens/themes/cyberpunk.json +143 -0
- package/tokens/themes/daylight.json +143 -0
- package/tokens/themes/deep-space.json +143 -0
- package/tokens/themes/forest.json +143 -0
- package/tokens/themes/graphite.json +143 -0
- package/tokens/themes/lavender.json +143 -0
- package/tokens/themes/midnight.json +143 -0
- package/tokens/themes/mint.json +143 -0
- package/tokens/themes/navy.json +143 -0
- package/tokens/themes/noir.json +143 -0
- package/tokens/themes/obsidian.json +143 -0
- package/tokens/themes/ocean.json +143 -0
- package/tokens/themes/paper.json +143 -0
- package/tokens/themes/ruby.json +143 -0
- package/tokens/themes/slate.json +143 -0
- package/tokens/themes/snow.json +143 -0
- package/tokens/themes/solar.json +143 -0
- package/tokens/themes/spring.json +143 -0
- package/tokens/themes/starry-night.json +143 -0
- package/tokens/themes/sunset.json +143 -0
- package/tokens/typography/FONT_GUIDE.md +381 -0
- package/tokens/typography/README.md +37 -0
- package/tokens/typography/font-collection.json +221 -0
package/bin/cli.js
ADDED
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { program } from 'commander';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
|
|
8
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const packageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8'));
|
|
10
|
+
|
|
11
|
+
program
|
|
12
|
+
.name('omnidesign')
|
|
13
|
+
.description('Universal design system skill for AI coding assistants')
|
|
14
|
+
.version(packageJson.version);
|
|
15
|
+
|
|
16
|
+
program
|
|
17
|
+
.command('install')
|
|
18
|
+
.description('Install OmniDesign skill for your IDE')
|
|
19
|
+
.option('-i, --ide <ide>', 'Target IDE (claude, cursor, opencode, vscode, aider, continue, zed, amp, kilo, antigravity)')
|
|
20
|
+
.option('-g, --global', 'Install globally (default: project-level)')
|
|
21
|
+
.action(async (options) => {
|
|
22
|
+
console.log(chalk.blue('🎨 OmniDesign Skill Installer\n'));
|
|
23
|
+
|
|
24
|
+
const detectedIde = options.ide || detectIDE();
|
|
25
|
+
|
|
26
|
+
if (!detectedIde) {
|
|
27
|
+
console.log(chalk.yellow('⚠️ Could not auto-detect IDE. Please specify with --ide flag'));
|
|
28
|
+
console.log(chalk.gray('Supported: claude, cursor, opencode, vscode, aider, continue, zed, amp, kilo, antigravity'));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
console.log(chalk.green(`✓ Detected IDE: ${detectedIde}\n`));
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
await installSkill(detectedIde, options.global);
|
|
36
|
+
console.log(chalk.green('\n✅ OmniDesign skill installed successfully!'));
|
|
37
|
+
console.log(chalk.gray('\nNext steps:'));
|
|
38
|
+
console.log(chalk.gray(' 1. Restart your IDE if needed'));
|
|
39
|
+
console.log(chalk.gray(' 2. Try: "Use the OmniDesign theme cyberpunk"'));
|
|
40
|
+
console.log(chalk.gray(' 3. See: https://omnidesign.dev/docs'));
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.error(chalk.red('\n❌ Installation failed:'), error.message);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
program
|
|
48
|
+
.command('list')
|
|
49
|
+
.description('List available IDE integrations')
|
|
50
|
+
.action(() => {
|
|
51
|
+
console.log(chalk.blue('🎨 Supported IDEs:\n'));
|
|
52
|
+
|
|
53
|
+
const ides = [
|
|
54
|
+
{ name: 'Claude Code', cmd: 'claude', file: '.claude/skills/omnidesign.md' },
|
|
55
|
+
{ name: 'Cursor', cmd: 'cursor', file: '.cursor/skills/omnidesign.md' },
|
|
56
|
+
{ name: 'OpenCode', cmd: 'opencode', file: '.opencode/skills/omnidesign.md' },
|
|
57
|
+
{ name: 'VS Code', cmd: 'vscode', file: '.vscode/settings.json' },
|
|
58
|
+
{ name: 'Zed', cmd: 'zed', file: '.zed/omnidesign.json' },
|
|
59
|
+
{ name: 'Amp Code', cmd: 'amp', file: '.agents/skills/omnidesign/SKILL.md' },
|
|
60
|
+
{ name: 'Kilo Code', cmd: 'kilo', file: '.kilocode/skills/omnidesign/SKILL.md' },
|
|
61
|
+
{ name: 'Antigravity', cmd: 'antigravity', file: '.agent/skills/omnidesign/SKILL.md' },
|
|
62
|
+
{ name: 'Aider', cmd: 'aider', file: 'CONVENTIONS.md' },
|
|
63
|
+
{ name: 'Continue.dev', cmd: 'continue', file: '.continue/config.yaml' },
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
ides.forEach(ide => {
|
|
67
|
+
const installed = fs.existsSync(path.join(process.cwd(), ide.file));
|
|
68
|
+
const status = installed ? chalk.green('✓ installed') : chalk.gray('not installed');
|
|
69
|
+
console.log(` ${chalk.bold(ide.name)}: ${status}`);
|
|
70
|
+
console.log(` Config: ${ide.file}`);
|
|
71
|
+
console.log();
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
program
|
|
76
|
+
.command('uninstall')
|
|
77
|
+
.description('Remove OmniDesign skill from your IDE')
|
|
78
|
+
.option('-i, --ide <ide>', 'Target IDE')
|
|
79
|
+
.action(async (options) => {
|
|
80
|
+
const detectedIde = options.ide || detectIDE();
|
|
81
|
+
|
|
82
|
+
if (!detectedIde) {
|
|
83
|
+
console.log(chalk.yellow('⚠️ Please specify IDE with --ide flag'));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
console.log(chalk.blue(`Removing OmniDesign from ${detectedIde}...`));
|
|
88
|
+
await uninstallSkill(detectedIde);
|
|
89
|
+
console.log(chalk.green('✅ Uninstalled successfully'));
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
function detectIDE() {
|
|
93
|
+
const cwd = process.cwd();
|
|
94
|
+
|
|
95
|
+
if (fs.existsSync(path.join(cwd, '.claude'))) return 'claude';
|
|
96
|
+
if (fs.existsSync(path.join(cwd, '.cursor'))) return 'cursor';
|
|
97
|
+
if (fs.existsSync(path.join(cwd, '.opencode'))) return 'opencode';
|
|
98
|
+
if (fs.existsSync(path.join(cwd, '.vscode'))) return 'vscode';
|
|
99
|
+
if (fs.existsSync(path.join(cwd, '.zed'))) return 'zed';
|
|
100
|
+
if (fs.existsSync(path.join(cwd, '.amp'))) return 'amp';
|
|
101
|
+
if (fs.existsSync(path.join(cwd, '.kilocode'))) return 'kilo';
|
|
102
|
+
if (fs.existsSync(path.join(cwd, '.antigravity'))) return 'antigravity';
|
|
103
|
+
if (fs.existsSync(path.join(cwd, '.agents'))) return 'amp';
|
|
104
|
+
if (fs.existsSync(path.join(cwd, '.aider.conf.yml'))) return 'aider';
|
|
105
|
+
if (fs.existsSync(path.join(cwd, '.continue'))) return 'continue';
|
|
106
|
+
if (fs.existsSync(path.join(cwd, 'claude.md'))) return 'claude';
|
|
107
|
+
if (fs.existsSync(path.join(cwd, '.cursorrules'))) return 'cursor';
|
|
108
|
+
if (process.env.CLAUDE_CODE) return 'claude';
|
|
109
|
+
if (process.env.CURSOR_TRACE) return 'cursor';
|
|
110
|
+
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function installSkill(ide, global = false) {
|
|
115
|
+
const cwd = process.cwd();
|
|
116
|
+
const skillsDir = path.join(__dirname, '..', 'skills', ide);
|
|
117
|
+
|
|
118
|
+
if (!fs.existsSync(skillsDir)) {
|
|
119
|
+
throw new Error(`Skill files for ${ide} not found`);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
switch (ide) {
|
|
123
|
+
case 'claude':
|
|
124
|
+
await installClaudeSkill(cwd, skillsDir, global);
|
|
125
|
+
break;
|
|
126
|
+
case 'cursor':
|
|
127
|
+
await installCursorSkill(cwd, skillsDir, global);
|
|
128
|
+
break;
|
|
129
|
+
case 'opencode':
|
|
130
|
+
await installOpenCodeSkill(cwd, skillsDir, global);
|
|
131
|
+
break;
|
|
132
|
+
case 'vscode':
|
|
133
|
+
await installVSCodeSkill(cwd, skillsDir, global);
|
|
134
|
+
break;
|
|
135
|
+
case 'aider':
|
|
136
|
+
await installAiderSkill(cwd, skillsDir, global);
|
|
137
|
+
break;
|
|
138
|
+
case 'continue':
|
|
139
|
+
await installContinueSkill(cwd, skillsDir, global);
|
|
140
|
+
break;
|
|
141
|
+
case 'zed':
|
|
142
|
+
await installZedSkill(cwd, skillsDir, global);
|
|
143
|
+
break;
|
|
144
|
+
case 'amp':
|
|
145
|
+
await installAmpSkill(cwd, skillsDir, global);
|
|
146
|
+
break;
|
|
147
|
+
case 'kilo':
|
|
148
|
+
await installKiloSkill(cwd, skillsDir, global);
|
|
149
|
+
break;
|
|
150
|
+
case 'antigravity':
|
|
151
|
+
await installAntigravitySkill(cwd, skillsDir, global);
|
|
152
|
+
break;
|
|
153
|
+
default:
|
|
154
|
+
throw new Error(`Unsupported IDE: ${ide}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async function installClaudeSkill(cwd, skillsDir, global) {
|
|
159
|
+
const targetDir = global
|
|
160
|
+
? path.join(require('os').homedir(), '.claude', 'skills')
|
|
161
|
+
: path.join(cwd, '.claude', 'skills');
|
|
162
|
+
|
|
163
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
164
|
+
|
|
165
|
+
fs.copyFileSync(
|
|
166
|
+
path.join(skillsDir, 'omnidesign.md'),
|
|
167
|
+
path.join(targetDir, 'omnidesign.md')
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
console.log(chalk.gray(` Created: ${path.relative(cwd, path.join(targetDir, 'omnidesign.md'))}`));
|
|
171
|
+
|
|
172
|
+
const marketplacePath = global
|
|
173
|
+
? path.join(require('os').homedir(), '.claude', 'marketplace.json')
|
|
174
|
+
: path.join(cwd, '.claude', 'marketplace.json');
|
|
175
|
+
|
|
176
|
+
let marketplace = { name: 'local', plugins: [] };
|
|
177
|
+
if (fs.existsSync(marketplacePath)) {
|
|
178
|
+
marketplace = JSON.parse(fs.readFileSync(marketplacePath, 'utf8'));
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (!marketplace.plugins.find(p => p.name === 'omnidesign')) {
|
|
182
|
+
marketplace.plugins.push({
|
|
183
|
+
name: 'omnidesign',
|
|
184
|
+
source: './skills/omnidesign.md',
|
|
185
|
+
description: 'Universal design system with 25 themes and AI components',
|
|
186
|
+
version: '1.0.0'
|
|
187
|
+
});
|
|
188
|
+
fs.writeFileSync(marketplacePath, JSON.stringify(marketplace, null, 2));
|
|
189
|
+
console.log(chalk.gray(` Updated: ${path.relative(cwd, marketplacePath)}`));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
async function installCursorSkill(cwd, skillsDir, global) {
|
|
194
|
+
const targetDir = global
|
|
195
|
+
? path.join(require('os').homedir(), '.cursor', 'skills')
|
|
196
|
+
: path.join(cwd, '.cursor', 'skills');
|
|
197
|
+
|
|
198
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
199
|
+
|
|
200
|
+
fs.copyFileSync(
|
|
201
|
+
path.join(skillsDir, 'omnidesign.md'),
|
|
202
|
+
path.join(targetDir, 'omnidesign.md')
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
console.log(chalk.gray(` Created: ${path.relative(cwd, path.join(targetDir, 'omnidesign.md'))}`));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
async function installOpenCodeSkill(cwd, skillsDir, global) {
|
|
209
|
+
const targetDir = global
|
|
210
|
+
? path.join(require('os').homedir(), '.config', 'opencode', 'skills')
|
|
211
|
+
: path.join(cwd, '.opencode', 'skills');
|
|
212
|
+
|
|
213
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
214
|
+
|
|
215
|
+
fs.copyFileSync(
|
|
216
|
+
path.join(skillsDir, 'omnidesign.md'),
|
|
217
|
+
path.join(targetDir, 'omnidesign.md')
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
console.log(chalk.gray(` Created: ${path.relative(cwd, path.join(targetDir, 'omnidesign.md'))}`));
|
|
221
|
+
|
|
222
|
+
const configPath = global
|
|
223
|
+
? path.join(require('os').homedir(), '.config', 'opencode', 'config.json')
|
|
224
|
+
: path.join(cwd, '.opencode', 'config.json');
|
|
225
|
+
|
|
226
|
+
let config = { plugins: [] };
|
|
227
|
+
if (fs.existsSync(configPath)) {
|
|
228
|
+
config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (!config.plugins.includes('omnidesign')) {
|
|
232
|
+
config.plugins.push('omnidesign');
|
|
233
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
234
|
+
console.log(chalk.gray(` Updated: ${path.relative(cwd, configPath)}`));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
async function installVSCodeSkill(cwd, skillsDir, global) {
|
|
239
|
+
const targetDir = path.join(cwd, '.vscode');
|
|
240
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
241
|
+
|
|
242
|
+
const settingsPath = path.join(targetDir, 'settings.json');
|
|
243
|
+
let settings = {};
|
|
244
|
+
|
|
245
|
+
if (fs.existsSync(settingsPath)) {
|
|
246
|
+
settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
settings['omnidesign.enabled'] = true;
|
|
250
|
+
settings['omnidesign.theme'] = 'corporate';
|
|
251
|
+
|
|
252
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
253
|
+
console.log(chalk.gray(` Updated: ${path.relative(cwd, settingsPath)}`));
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
async function installAiderSkill(cwd, skillsDir, global) {
|
|
257
|
+
const conventionsPath = path.join(cwd, 'CONVENTIONS.md');
|
|
258
|
+
|
|
259
|
+
fs.copyFileSync(path.join(skillsDir, 'omnidesign.md'), conventionsPath);
|
|
260
|
+
console.log(chalk.gray(` Created: ${path.relative(cwd, conventionsPath)}`));
|
|
261
|
+
|
|
262
|
+
const configPath = path.join(cwd, '.aider.conf.yml');
|
|
263
|
+
if (fs.existsSync(configPath)) {
|
|
264
|
+
let config = fs.readFileSync(configPath, 'utf8');
|
|
265
|
+
if (!config.includes('CONVENTIONS.md')) {
|
|
266
|
+
config += '\nread: CONVENTIONS.md\n';
|
|
267
|
+
fs.writeFileSync(configPath, config);
|
|
268
|
+
console.log(chalk.gray(` Updated: ${path.relative(cwd, configPath)}`));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
async function installContinueSkill(cwd, skillsDir, global) {
|
|
274
|
+
const targetDir = path.join(cwd, '.continue');
|
|
275
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
276
|
+
|
|
277
|
+
const skillRefPath = path.join(targetDir, 'omnidesign.yaml');
|
|
278
|
+
fs.copyFileSync(path.join(skillsDir, 'omnidesign.yaml'), skillRefPath);
|
|
279
|
+
console.log(chalk.gray(` Created: ${path.relative(cwd, skillRefPath)}`));
|
|
280
|
+
console.log(chalk.yellow(' Note: Please manually add OmniDesign to your Continue config'));
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
async function installZedSkill(cwd, skillsDir, global) {
|
|
284
|
+
const targetDir = path.join(cwd, '.zed');
|
|
285
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
286
|
+
|
|
287
|
+
const configPath = path.join(targetDir, 'omnidesign.json');
|
|
288
|
+
const config = {
|
|
289
|
+
name: 'OmniDesign',
|
|
290
|
+
version: '1.0.0',
|
|
291
|
+
description: 'Universal design system skill',
|
|
292
|
+
enabled: true
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
296
|
+
console.log(chalk.gray(` Created: ${path.relative(cwd, configPath)}`));
|
|
297
|
+
console.log(chalk.yellow(' Note: Add OmniDesign to your Zed settings.json'));
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
async function installAmpSkill(cwd, skillsDir, global) {
|
|
301
|
+
const targetDir = global
|
|
302
|
+
? path.join(require('os').homedir(), '.config', 'agents', 'skills', 'omnidesign')
|
|
303
|
+
: path.join(cwd, '.agents', 'skills', 'omnidesign');
|
|
304
|
+
|
|
305
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
306
|
+
|
|
307
|
+
fs.copyFileSync(
|
|
308
|
+
path.join(skillsDir, 'SKILL.md'),
|
|
309
|
+
path.join(targetDir, 'SKILL.md')
|
|
310
|
+
);
|
|
311
|
+
|
|
312
|
+
console.log(chalk.gray(` Created: ${path.relative(cwd, path.join(targetDir, 'SKILL.md'))}`));
|
|
313
|
+
console.log(chalk.blue(' You can also use: amp skill add owner/omnidesign'));
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
async function installKiloSkill(cwd, skillsDir, global) {
|
|
317
|
+
const targetDir = global
|
|
318
|
+
? path.join(require('os').homedir(), '.kilocode', 'skills', 'omnidesign')
|
|
319
|
+
: path.join(cwd, '.kilocode', 'skills', 'omnidesign');
|
|
320
|
+
|
|
321
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
322
|
+
|
|
323
|
+
fs.copyFileSync(
|
|
324
|
+
path.join(skillsDir, 'SKILL.md'),
|
|
325
|
+
path.join(targetDir, 'SKILL.md')
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
console.log(chalk.gray(` Created: ${path.relative(cwd, path.join(targetDir, 'SKILL.md'))}`));
|
|
329
|
+
console.log(chalk.yellow(' Reload VS Code window to activate skill'));
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
async function installAntigravitySkill(cwd, skillsDir, global) {
|
|
333
|
+
const targetDir = global
|
|
334
|
+
? path.join(require('os').homedir(), '.gemini', 'antigravity', 'skills', 'omnidesign')
|
|
335
|
+
: path.join(cwd, '.agent', 'skills', 'omnidesign');
|
|
336
|
+
|
|
337
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
338
|
+
|
|
339
|
+
fs.copyFileSync(
|
|
340
|
+
path.join(skillsDir, 'SKILL.md'),
|
|
341
|
+
path.join(targetDir, 'SKILL.md')
|
|
342
|
+
);
|
|
343
|
+
|
|
344
|
+
console.log(chalk.gray(` Created: ${path.relative(cwd, path.join(targetDir, 'SKILL.md'))}`));
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
async function uninstallSkill(ide) {
|
|
348
|
+
const cwd = process.cwd();
|
|
349
|
+
|
|
350
|
+
switch (ide) {
|
|
351
|
+
case 'claude':
|
|
352
|
+
fs.rmSync(path.join(cwd, '.claude', 'skills', 'omnidesign.md'), { force: true });
|
|
353
|
+
break;
|
|
354
|
+
case 'cursor':
|
|
355
|
+
fs.rmSync(path.join(cwd, '.cursor', 'skills', 'omnidesign.md'), { force: true });
|
|
356
|
+
break;
|
|
357
|
+
case 'opencode':
|
|
358
|
+
fs.rmSync(path.join(cwd, '.opencode', 'skills', 'omnidesign.md'), { force: true });
|
|
359
|
+
break;
|
|
360
|
+
case 'vscode':
|
|
361
|
+
const settingsPath = path.join(cwd, '.vscode', 'settings.json');
|
|
362
|
+
if (fs.existsSync(settingsPath)) {
|
|
363
|
+
const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
|
|
364
|
+
delete settings['omnidesign.enabled'];
|
|
365
|
+
delete settings['omnidesign.theme'];
|
|
366
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
367
|
+
}
|
|
368
|
+
break;
|
|
369
|
+
case 'zed':
|
|
370
|
+
fs.rmSync(path.join(cwd, '.zed', 'omnidesign.json'), { force: true });
|
|
371
|
+
break;
|
|
372
|
+
case 'amp':
|
|
373
|
+
fs.rmSync(path.join(cwd, '.agents', 'skills', 'omnidesign'), { force: true, recursive: true });
|
|
374
|
+
break;
|
|
375
|
+
case 'kilo':
|
|
376
|
+
fs.rmSync(path.join(cwd, '.kilocode', 'skills', 'omnidesign'), { force: true, recursive: true });
|
|
377
|
+
break;
|
|
378
|
+
case 'antigravity':
|
|
379
|
+
fs.rmSync(path.join(cwd, '.agent', 'skills', 'omnidesign'), { force: true, recursive: true });
|
|
380
|
+
break;
|
|
381
|
+
case 'aider':
|
|
382
|
+
fs.rmSync(path.join(cwd, 'CONVENTIONS.md'), { force: true });
|
|
383
|
+
break;
|
|
384
|
+
case 'continue':
|
|
385
|
+
fs.rmSync(path.join(cwd, '.continue', 'omnidesign.yaml'), { force: true });
|
|
386
|
+
break;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
program.parse();
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
|
|
8
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
|
|
10
|
+
function detectIDE() {
|
|
11
|
+
const cwd = process.cwd();
|
|
12
|
+
|
|
13
|
+
if (fs.existsSync(path.join(cwd, '.claude'))) return 'claude';
|
|
14
|
+
if (fs.existsSync(path.join(cwd, '.cursor'))) return 'cursor';
|
|
15
|
+
if (fs.existsSync(path.join(cwd, '.opencode'))) return 'opencode';
|
|
16
|
+
if (fs.existsSync(path.join(cwd, '.vscode'))) return 'vscode';
|
|
17
|
+
if (fs.existsSync(path.join(cwd, '.zed'))) return 'zed';
|
|
18
|
+
if (fs.existsSync(path.join(cwd, '.agents'))) return 'amp';
|
|
19
|
+
if (fs.existsSync(path.join(cwd, '.kilocode'))) return 'kilo';
|
|
20
|
+
if (fs.existsSync(path.join(cwd, '.antigravity'))) return 'antigravity';
|
|
21
|
+
if (fs.existsSync(path.join(cwd, '.agent'))) return 'antigravity';
|
|
22
|
+
if (fs.existsSync(path.join(cwd, '.aider.conf.yml'))) return 'aider';
|
|
23
|
+
if (fs.existsSync(path.join(cwd, '.continue'))) return 'continue';
|
|
24
|
+
if (fs.existsSync(path.join(cwd, 'claude.md'))) return 'claude';
|
|
25
|
+
if (fs.existsSync(path.join(cwd, '.cursorrules'))) return 'cursor';
|
|
26
|
+
if (process.env.CLAUDE_CODE) return 'claude';
|
|
27
|
+
if (process.env.CURSOR_TRACE) return 'cursor';
|
|
28
|
+
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function autoInstall() {
|
|
33
|
+
const ide = detectIDE();
|
|
34
|
+
|
|
35
|
+
if (!ide) {
|
|
36
|
+
console.log(chalk.gray('ℹ️ No IDE detected. Run: npx omnidesign install --ide <ide>'));
|
|
37
|
+
console.log(chalk.gray('Supported: claude, cursor, opencode, vscode, zed, amp, kilo, antigravity, aider, continue'));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
console.log(chalk.blue(`🎨 OmniDesign detected ${ide}. Installing...\n`));
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
execSync(`node ${path.join(__dirname, 'cli.js')} install`, { stdio: 'inherit' });
|
|
45
|
+
} catch (error) {
|
|
46
|
+
console.log(chalk.gray('ℹ️ Run manually: npx omnidesign install'));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
autoInstall();
|
package/bin/install.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
|
|
8
|
+
execSync(`node ${path.join(__dirname, 'cli.js')} install`, { stdio: 'inherit' });
|
package/logo.jpg
ADDED
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "omnidesign",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Universal design system skill for AI coding assistants - Works with Claude Code, Cursor, OpenCode, VS Code, and more",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"omnidesign": "./bin/cli.js",
|
|
9
|
+
"omnidesign-install": "./bin/install.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "bun run scripts/build-tokens.js",
|
|
13
|
+
"validate": "bun run scripts/validate-tokens.js",
|
|
14
|
+
"lint": "biome lint .",
|
|
15
|
+
"format": "biome format . --write",
|
|
16
|
+
"format:check": "biome format .",
|
|
17
|
+
"check": "bun run format:check && bun run lint && bun run validate",
|
|
18
|
+
"themes:list": "bun run -e \"const fs=require('fs');const themes=fs.readdirSync('tokens/themes').filter(f=>f.endsWith('.json')).map(f=>f.replace('.json','')).sort();console.log('\\n🎨 Available Themes ('+themes.length+'):\\n');themes.forEach(t=>console.log(' •',t));console.log();\"",
|
|
19
|
+
"fonts:list": "bun run -e \"const data=require('./tokens/typography/font-collection.json');console.log('\\n🔤 Font Families:\\n');Object.entries(data.families).forEach(([cat,families])=>{console.log(cat+':');Object.keys(families).forEach(f=>console.log(' •',f));console.log();});\"",
|
|
20
|
+
"postinstall": "node bin/detect-ide.js"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"design-system",
|
|
24
|
+
"design-tokens",
|
|
25
|
+
"themes",
|
|
26
|
+
"components",
|
|
27
|
+
"ui-library",
|
|
28
|
+
"css-variables",
|
|
29
|
+
"typography",
|
|
30
|
+
"nerd-fonts",
|
|
31
|
+
"ai-components",
|
|
32
|
+
"claude-code",
|
|
33
|
+
"cursor",
|
|
34
|
+
"opencode",
|
|
35
|
+
"vscode",
|
|
36
|
+
"skill",
|
|
37
|
+
"plugin"
|
|
38
|
+
],
|
|
39
|
+
"author": "OmniDesign Team",
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://github.com/codewithkenzo/omnidesign.git"
|
|
44
|
+
},
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/codewithkenzo/omnidesign/issues"
|
|
47
|
+
},
|
|
48
|
+
"homepage": "https://omnidesign.dev",
|
|
49
|
+
"files": [
|
|
50
|
+
"tokens/",
|
|
51
|
+
"recipes/",
|
|
52
|
+
"components/",
|
|
53
|
+
"packages/",
|
|
54
|
+
"bin/",
|
|
55
|
+
"skills/",
|
|
56
|
+
"README.md",
|
|
57
|
+
"QUICKREF.md",
|
|
58
|
+
"logo.jpg"
|
|
59
|
+
],
|
|
60
|
+
"exports": {
|
|
61
|
+
"./tokens": "./packages/tokens-css/dist/tokens.css",
|
|
62
|
+
"./tokens-ts": "./packages/tokens-ts/dist/tokens.ts",
|
|
63
|
+
"./react": "./packages/react/dist/index.js",
|
|
64
|
+
"./skill/claude": "./skills/claude/",
|
|
65
|
+
"./skill/cursor": "./skills/cursor/",
|
|
66
|
+
"./skill/opencode": "./skills/opencode/",
|
|
67
|
+
"./skill/vscode": "./skills/vscode/",
|
|
68
|
+
"./skill/aider": "./skills/aider/",
|
|
69
|
+
"./skill/continue": "./skills/continue/"
|
|
70
|
+
},
|
|
71
|
+
"engines": {
|
|
72
|
+
"node": ">=18.0.0"
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"@biomejs/biome": "^1.9.4",
|
|
76
|
+
"typescript": "^5.0.0"
|
|
77
|
+
},
|
|
78
|
+
"dependencies": {
|
|
79
|
+
"chalk": "^5.3.0",
|
|
80
|
+
"commander": "^11.1.0",
|
|
81
|
+
"inquirer": "^9.2.12",
|
|
82
|
+
"ora": "^8.0.1"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Components
|
|
2
|
+
|
|
3
|
+
Markdown documentation of UI component implementations. Each file describes a component's anatomy, variants, and usage patterns.
|
|
4
|
+
|
|
5
|
+
## Core Components
|
|
6
|
+
- [Hero Section](./hero-section.md) - Landing page hero with CTA
|
|
7
|
+
- [Bento Grid](./bento-grid.md) - Feature showcase grid
|
|
8
|
+
- [Navbar](./navbar.md) - Navigation header
|
|
9
|
+
- [Forms](./forms.md) - Input components and patterns
|
|
10
|
+
|
|
11
|
+
## AI Industry Components
|
|
12
|
+
Modern components for AI-powered applications:
|
|
13
|
+
|
|
14
|
+
- [AI Chat](./ai-chat.md) - ChatGPT/Claude-style chat interface
|
|
15
|
+
- [Prompt Input](./prompt-input.md) - Smart prompt with suggestions
|
|
16
|
+
- [Agent Card](./agent-card.md) - AI model/agent display card
|
|
17
|
+
- [Thinking Indicator](./thinking-indicator.md) - Loading/streaming states
|
|
18
|
+
- [Code Block](./code-block.md) - Syntax-highlighted code with actions
|
|
19
|
+
- [File Upload](./file-upload.md) - Drag-drop upload with AI context
|
|
20
|
+
|
|
21
|
+
## Component Structure
|
|
22
|
+
Each component recipe includes:
|
|
23
|
+
- **When to Use** - Context and use cases
|
|
24
|
+
- **Anatomy** - Structural breakdown
|
|
25
|
+
- **Token Usage** - Design token implementation
|
|
26
|
+
- **State Matrix** - Interactive states
|
|
27
|
+
- **Accessibility** - ARIA and screen reader support
|
|
28
|
+
- **Responsive Behavior** - Breakpoint adaptations
|
|
29
|
+
- **Code Examples** - React/TSX implementations
|