omnidesign 1.1.0 → 1.1.1

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/bin/cli.js CHANGED
@@ -19,7 +19,7 @@ program
19
19
  .command('install')
20
20
  .description('Install OmniDesign skill for your IDE')
21
21
  .option('-i, --ide <ide>', 'Target IDE (claude, cursor, opencode, vscode, aider, continue, zed, amp, kilo, antigravity)')
22
- .option('-g, --global', 'Install globally (default: project-level)')
22
+ .option('-g, --global', 'Install to global IDE config (~/.claude, ~/.cursor, etc.)')
23
23
  .action(async (options) => {
24
24
  console.log(chalk.blue('šŸŽØ OmniDesign Skill Installer\n'));
25
25
 
@@ -48,11 +48,11 @@ program
48
48
 
49
49
  program
50
50
  .command('list')
51
- .description('List available IDE integrations')
51
+ .description('List available IDE integrations and detection status')
52
52
  .option('-g, --global', 'Check global installations')
53
53
  .action((options) => {
54
- console.log(chalk.blue('šŸŽØ Supported IDEs:\n'));
55
-
54
+ console.log(chalk.blue('šŸŽØ OmniDesign IDE Status:\n'));
55
+
56
56
  const ides = [
57
57
  { name: 'Claude Code', cmd: 'claude', ...getClaudePaths(options.global) },
58
58
  { name: 'Cursor', cmd: 'cursor', ...getCursorPaths(options.global) },
@@ -65,14 +65,34 @@ program
65
65
  { name: 'Aider', cmd: 'aider', ...getAiderPaths(options.global) },
66
66
  { name: 'Continue.dev', cmd: 'continue', ...getContinuePaths(options.global) },
67
67
  ];
68
-
68
+
69
69
  ides.forEach(ide => {
70
- const installed = fs.existsSync(ide.configPath);
71
- const status = installed ? chalk.green('āœ“ installed') : chalk.gray('not installed');
72
- console.log(` ${chalk.bold(ide.name)}: ${status}`);
73
- console.log(` Config: ${ide.configFile}`);
74
- console.log();
70
+ const skillInstalled = fs.existsSync(ide.configPath);
71
+ const ideDetected = fs.existsSync(ide.baseDir);
72
+ const skillStatus = skillInstalled ? chalk.green('āœ“ skill') : chalk.gray('no skill');
73
+ const ideStatus = ideDetected ? chalk.blue('āœ“ IDE') : chalk.gray('no IDE');
74
+ console.log(` ${chalk.bold(ide.name)}: ${ideStatus} / ${skillStatus}`);
75
75
  });
76
+
77
+ console.log(chalk.blue('\nšŸŽÆ Auto-detect would find:'));
78
+ const detected = [];
79
+ if (fs.existsSync(path.join(homedir, '.claude'))) detected.push('claude');
80
+ if (fs.existsSync(path.join(homedir, '.cursor'))) detected.push('cursor');
81
+ if (fs.existsSync(path.join(homedir, '.config', 'opencode'))) detected.push('opencode');
82
+ if (fs.existsSync(path.join(homedir, '.config', 'agents'))) detected.push('amp');
83
+ if (fs.existsSync(path.join(homedir, '.config', 'Code'))) detected.push('vscode');
84
+ if (fs.existsSync(path.join(homedir, '.config', 'zed'))) detected.push('zed');
85
+ if (fs.existsSync(path.join(homedir, '.kilocode'))) detected.push('kilo');
86
+ if (fs.existsSync(path.join(homedir, '.gemini', 'antigravity'))) detected.push('antigravity');
87
+ if (fs.existsSync(path.join(homedir, '.continue'))) detected.push('continue');
88
+
89
+ if (detected.length === 0) {
90
+ console.log(chalk.gray(' No IDEs detected in home directory'));
91
+ } else {
92
+ detected.forEach(name => console.log(chalk.green(` āœ“ ${name}`)));
93
+ }
94
+
95
+ console.log(chalk.gray('\nRun with --global to check global installs'));
76
96
  });
77
97
 
78
98
  program
@@ -197,37 +217,57 @@ function getContinuePaths(global = false) {
197
217
 
198
218
  function detectIDE(global = false) {
199
219
  const cwd = process.cwd();
200
-
201
- if (fs.existsSync(path.join(cwd, '.claude'))) return 'claude';
202
- if (fs.existsSync(path.join(cwd, '.cursor'))) return 'cursor';
203
- if (fs.existsSync(path.join(cwd, '.opencode'))) return 'opencode';
204
- if (fs.existsSync(path.join(cwd, '.vscode'))) return 'vscode';
205
- if (fs.existsSync(path.join(cwd, '.zed'))) return 'zed';
206
- if (fs.existsSync(path.join(cwd, '.agents'))) return 'amp';
207
- if (fs.existsSync(path.join(cwd, '.kilocode'))) return 'kilo';
208
- if (fs.existsSync(path.join(cwd, '.antigravity'))) return 'antigravity';
209
- if (fs.existsSync(path.join(cwd, '.agent'))) return 'antigravity';
210
- if (fs.existsSync(path.join(cwd, '.aider.conf.yml'))) return 'aider';
211
- if (fs.existsSync(path.join(cwd, '.continue'))) return 'continue';
212
- if (fs.existsSync(path.join(cwd, 'claude.md'))) return 'claude';
213
- if (fs.existsSync(path.join(cwd, '.cursorrules'))) return 'cursor';
214
-
215
- if (global || true) {
216
- if (fs.existsSync(path.join(homedir, '.claude'))) return 'claude';
217
- if (fs.existsSync(path.join(homedir, '.cursor'))) return 'cursor';
218
- if (fs.existsSync(path.join(homedir, '.config', 'opencode'))) return 'opencode';
219
- if (fs.existsSync(path.join(homedir, '.kilocode'))) return 'kilo';
220
- if (fs.existsSync(path.join(homedir, '.gemini', 'antigravity'))) return 'antigravity';
221
- if (fs.existsSync(path.join(homedir, '.config', 'Code'))) return 'vscode';
222
- if (fs.existsSync(path.join(homedir, '.config', 'zed'))) return 'zed';
223
- if (fs.existsSync(path.join(homedir, '.config', 'agents'))) return 'amp';
224
- if (fs.existsSync(path.join(homedir, '.continue'))) return 'continue';
220
+ const detected = [];
221
+
222
+ const checks = [
223
+ { name: 'claude', path: path.join(homedir, '.claude'), global: true },
224
+ { name: 'cursor', path: path.join(homedir, '.cursor'), global: true },
225
+ { name: 'opencode', path: path.join(homedir, '.config', 'opencode'), global: true },
226
+ { name: 'vscode', path: path.join(homedir, '.config', 'Code'), global: true },
227
+ { name: 'zed', path: path.join(homedir, '.config', 'zed'), global: true },
228
+ { name: 'amp', path: path.join(homedir, '.config', 'agents'), global: true },
229
+ { name: 'kilo', path: path.join(homedir, '.kilocode'), global: true },
230
+ { name: 'antigravity', path: path.join(homedir, '.gemini', 'antigravity'), global: true },
231
+ { name: 'continue', path: path.join(homedir, '.continue'), global: true },
232
+ { name: 'claude', path: path.join(cwd, '.claude'), global: false },
233
+ { name: 'cursor', path: path.join(cwd, '.cursor'), global: false },
234
+ { name: 'opencode', path: path.join(cwd, '.opencode'), global: false },
235
+ { name: 'vscode', path: path.join(cwd, '.vscode'), global: false },
236
+ { name: 'zed', path: path.join(cwd, '.zed'), global: false },
237
+ { name: 'amp', path: path.join(cwd, '.agents'), global: false },
238
+ { name: 'kilo', path: path.join(cwd, '.kilocode'), global: false },
239
+ { name: 'antigravity', path: path.join(cwd, '.antigravity'), global: false },
240
+ { name: 'aider', path: path.join(cwd, '.aider.conf.yml'), global: false },
241
+ { name: 'continue', path: path.join(cwd, '.continue'), global: false },
242
+ { name: 'claude', path: path.join(cwd, 'claude.md'), global: false },
243
+ { name: 'cursor', path: path.join(cwd, '.cursorrules'), global: false },
244
+ ];
245
+
246
+ for (const check of checks) {
247
+ if (fs.existsSync(check.path) && !detected.find(d => d.name === check.name)) {
248
+ detected.push({ name: check.name, global: check.global });
249
+ }
225
250
  }
226
-
227
- if (process.env.CLAUDE_CODE) return 'claude';
228
- if (process.env.CURSOR_TRACE) return 'cursor';
229
-
230
- return null;
251
+
252
+ if (process.env.CLAUDE_CODE && !detected.find(d => d.name === 'claude')) {
253
+ detected.push({ name: 'claude', global: true });
254
+ }
255
+ if (process.env.CURSOR_TRACE && !detected.find(d => d.name === 'cursor')) {
256
+ detected.push({ name: 'cursor', global: true });
257
+ }
258
+
259
+ if (detected.length === 0) return null;
260
+ if (detected.length === 1) return detected[0].name;
261
+
262
+ console.log(chalk.yellow('\nāš ļø Multiple IDEs detected:'));
263
+ detected.forEach((ide, i) => {
264
+ const globalFlag = ide.global ? '--global' : '';
265
+ console.log(chalk.gray(` ${i + 1}. ${ide.name} ${globalFlag}`));
266
+ });
267
+ console.log(chalk.gray(`\nUsing first: ${detected[0].name}`));
268
+ console.log(chalk.gray(`To use different: npx omnidesign install --ide <name>\n`));
269
+
270
+ return detected[0].name;
231
271
  }
232
272
 
233
273
  async function installSkill(ide, global = false) {
@@ -274,18 +314,19 @@ async function installSkill(ide, global = false) {
274
314
  }
275
315
  }
276
316
 
277
- function copyDirSync(src, dest) {
317
+ function copyDirSync(src, dest, { overwrite = true } = {}) {
278
318
  fs.mkdirSync(dest, { recursive: true });
279
319
  const entries = fs.readdirSync(src, { withFileTypes: true });
280
-
320
+
281
321
  for (const entry of entries) {
282
322
  const srcPath = path.join(src, entry.name);
283
323
  const destPath = path.join(dest, entry.name);
284
-
324
+
285
325
  if (entry.isDirectory()) {
286
- copyDirSync(srcPath, destPath);
326
+ copyDirSync(srcPath, destPath, { overwrite });
287
327
  } else {
288
- fs.copyFileSync(srcPath, destPath);
328
+ const copyFlags = overwrite ? undefined : fs.constants.COPYFILE_EXCL;
329
+ fs.copyFileSync(srcPath, destPath, copyFlags);
289
330
  }
290
331
  }
291
332
  }
package/bin/detect-ide.js CHANGED
@@ -4,47 +4,75 @@ import fs from 'fs';
4
4
  import path from 'path';
5
5
  import { fileURLToPath } from 'url';
6
6
  import { execSync } from 'child_process';
7
+ import os from 'os';
7
8
 
8
9
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+ const homeDir = os.homedir();
9
11
 
10
- function detectIDE() {
12
+ function detectAllIDEs() {
13
+ const detected = [];
11
14
  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;
15
+
16
+ const checks = [
17
+ { name: 'claude', path: path.join(homeDir, '.claude') },
18
+ { name: 'cursor', path: path.join(homeDir, '.cursor') },
19
+ { name: 'opencode', path: path.join(homeDir, '.config', 'opencode') },
20
+ { name: 'vscode', path: path.join(homeDir, '.config', 'Code') },
21
+ { name: 'zed', path: path.join(homeDir, '.config', 'zed') },
22
+ { name: 'amp', path: path.join(homeDir, '.config', 'agents') },
23
+ { name: 'kilo', path: path.join(homeDir, '.kilocode') },
24
+ { name: 'antigravity', path: path.join(homeDir, '.gemini', 'antigravity') },
25
+ { name: 'continue', path: path.join(homeDir, '.continue') },
26
+ { name: 'claude', path: path.join(cwd, '.claude') },
27
+ { name: 'cursor', path: path.join(cwd, '.cursor') },
28
+ { name: 'aider', path: path.join(cwd, '.aider.conf.yml') },
29
+ ];
30
+
31
+ const envChecks = [
32
+ { name: 'claude', env: 'CLAUDE_CODE' },
33
+ { name: 'cursor', env: 'CURSOR_TRACE' },
34
+ ];
35
+
36
+ for (const check of checks) {
37
+ if (fs.existsSync(check.path) && !detected.find(d => d.name === check.name)) {
38
+ detected.push({ name: check.name, source: fs.statSync(check.path).isDirectory() ? 'global' : 'project' });
39
+ }
40
+ }
41
+
42
+ for (const check of envChecks) {
43
+ if (process.env[check.env] && !detected.find(d => d.name === check.name)) {
44
+ detected.push({ name: check.name, source: 'env' });
45
+ }
46
+ }
47
+
48
+ return detected;
30
49
  }
31
50
 
32
51
  function autoInstall() {
33
- const ide = detectIDE();
34
-
35
- if (!ide) {
52
+ const detected = detectAllIDEs();
53
+
54
+ if (detected.length === 0) {
36
55
  console.log(chalk.gray('ā„¹ļø No IDE detected. Run: npx omnidesign install --ide <ide>'));
37
56
  console.log(chalk.gray('Supported: claude, cursor, opencode, vscode, zed, amp, kilo, antigravity, aider, continue'));
38
57
  return;
39
58
  }
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'));
59
+
60
+ if (detected.length === 1) {
61
+ console.log(chalk.blue(`šŸŽØ OmniDesign detected ${detected[0].name}. Installing...\n`));
62
+ try {
63
+ execSync(`node ${path.join(__dirname, 'cli.js')} install --global`, { stdio: 'inherit' });
64
+ } catch (error) {
65
+ console.log(chalk.gray('ā„¹ļø Run manually: npx omnidesign install --global'));
66
+ }
67
+ return;
47
68
  }
69
+
70
+ console.log(chalk.blue(`šŸŽØ OmniDesign detected multiple IDEs:\n`));
71
+ detected.forEach((ide, i) => {
72
+ console.log(chalk.gray(` ${i + 1}. ${ide.name} (${ide.source})`));
73
+ });
74
+ console.log(chalk.gray(`\nInstall for all: npx omnidesign install --global`));
75
+ console.log(chalk.gray(`Or specify one: npx omnidesign install --ide <name> --global`));
48
76
  }
49
77
 
50
78
  autoInstall();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omnidesign",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Universal design system with Tailwind CSS integration - 25 themes, 176 colors, 39 Nerd Fonts, and AI-ready component recipes for Claude Code, Cursor, OpenCode, and more",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -2,7 +2,7 @@
2
2
  "_meta": {
3
3
  "version": "1.0.0",
4
4
  "description": "Token to Tailwind utility class mapping",
5
- "generated": "2026-01-31T20:08:20.439Z"
5
+ "generated": "2026-01-31T21:24:42.962Z"
6
6
  },
7
7
  "colors": {
8
8
  "text-default": {