omgkit 2.6.0 → 2.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.
Files changed (3) hide show
  1. package/README.md +21 -2
  2. package/lib/cli.js +406 -27
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
8
8
 
9
9
  > **AI Team System for Claude Code**
10
- > 23 Agents • 58 Commands • 76 Skills • 10 Modes
10
+ > 23 Agents • 58 Commands • 88 Skills • 10 Modes
11
11
  > *"Think Omega. Build Omega. Be Omega."*
12
12
 
13
13
  OMGKIT transforms Claude Code into an autonomous AI development team with sprint management, specialized agents, and Omega-level thinking for 10x-1000x productivity improvements.
@@ -18,7 +18,7 @@ OMGKIT transforms Claude Code into an autonomous AI development team with sprint
18
18
  |-----------|-------|-------------|
19
19
  | **Agents** | 23 | Specialized AI team members |
20
20
  | **Commands** | 58 | Slash commands for every task |
21
- | **Skills** | 76 | Domain expertise modules |
21
+ | **Skills** | 88 | Domain expertise modules |
22
22
  | **Modes** | 10 | Behavioral configurations |
23
23
  | **Sprint Management** | ✅ | Vision, backlog, team autonomy |
24
24
  | **Omega Thinking** | ✅ | 7 modes for 10x-1000x solutions |
@@ -204,6 +204,25 @@ Switch modes with: `/mode <name>`
204
204
  | 🕸️ Systemic | Interconnections and emergence |
205
205
  | ⚛️ Quantum | Multiple possibilities |
206
206
 
207
+ ## 🧠 AI Engineering Skills (12)
208
+
209
+ Based on Chip Huyen's "AI Engineering" book, OMGKIT includes comprehensive skills for building production AI applications:
210
+
211
+ | Skill | Description |
212
+ |-------|-------------|
213
+ | `foundation-models` | Model architecture, sampling, structured outputs |
214
+ | `evaluation-methodology` | AI-as-judge, semantic similarity, ELO ranking |
215
+ | `ai-system-evaluation` | Benchmarks, model selection, cost analysis |
216
+ | `prompt-engineering` | Few-shot, chain-of-thought, injection defense |
217
+ | `rag-systems` | Chunking, embedding, hybrid retrieval, reranking |
218
+ | `ai-agents` | Tool use, ReAct, Plan-and-Execute, memory |
219
+ | `finetuning` | LoRA, QLoRA, PEFT, model merging |
220
+ | `dataset-engineering` | Curation, deduplication, synthesis |
221
+ | `inference-optimization` | Quantization, batching, caching, vLLM |
222
+ | `ai-architecture` | Gateway, routing, observability |
223
+ | `guardrails-safety` | Input/output guards, PII protection |
224
+ | `user-feedback` | Explicit/implicit signals, A/B testing |
225
+
207
226
  ## 🛠️ CLI Commands
208
227
 
209
228
  ```bash
package/lib/cli.js CHANGED
@@ -51,14 +51,14 @@ ${COLORS.magenta}╔════════════════════
51
51
  ║ ║
52
52
  ║ 🔮 OMGKIT - Omega-Level Development Kit ║
53
53
  ║ ║
54
- ║ 23 Agents • 54 Commands • 43 Skills • 9 Modes
54
+ ║ 23 Agents • 58 Commands • 88 Skills • 10 Modes
55
55
  ║ "Think Omega. Build Omega. Be Omega." ║
56
56
  ║ ║
57
57
  ╚════════════════════════════════════════════════════════════╝${COLORS.reset}
58
58
  `;
59
59
 
60
60
  /**
61
- * Get the plugin installation directory
61
+ * Get the plugin backup directory (for reference/updates)
62
62
  * @param {string} [homeDir] - Optional home directory override for testing
63
63
  * @returns {string} Plugin directory path
64
64
  */
@@ -67,6 +67,160 @@ export function getPluginDir(homeDir) {
67
67
  return join(home, '.claude', 'plugins', 'omgkit');
68
68
  }
69
69
 
70
+ /**
71
+ * Get the Claude Code commands directory
72
+ * @param {string} [homeDir] - Optional home directory override for testing
73
+ * @returns {string} Commands directory path
74
+ */
75
+ export function getCommandsDir(homeDir) {
76
+ const home = homeDir || process.env.HOME || process.env.USERPROFILE;
77
+ return join(home, '.claude', 'commands');
78
+ }
79
+
80
+ /**
81
+ * Get the Claude Code skills directory
82
+ * @param {string} [homeDir] - Optional home directory override for testing
83
+ * @returns {string} Skills directory path
84
+ */
85
+ export function getSkillsDir(homeDir) {
86
+ const home = homeDir || process.env.HOME || process.env.USERPROFILE;
87
+ return join(home, '.claude', 'skills');
88
+ }
89
+
90
+ /**
91
+ * Get the Claude Code agents directory
92
+ * @param {string} [homeDir] - Optional home directory override for testing
93
+ * @returns {string} Agents directory path
94
+ */
95
+ export function getAgentsDir(homeDir) {
96
+ const home = homeDir || process.env.HOME || process.env.USERPROFILE;
97
+ return join(home, '.claude', 'agents');
98
+ }
99
+
100
+ /**
101
+ * Copy commands from plugin to Claude Code commands directory
102
+ * Commands are flattened with category prefix (e.g., dev/fix.md -> dev-fix.md)
103
+ * @param {string} pluginSrc - Source plugin directory
104
+ * @param {string} commandsDest - Destination commands directory
105
+ * @returns {number} Number of commands copied
106
+ */
107
+ function copyCommands(pluginSrc, commandsDest) {
108
+ const commandsSrc = join(pluginSrc, 'commands');
109
+ if (!existsSync(commandsSrc)) return 0;
110
+
111
+ mkdirSync(commandsDest, { recursive: true });
112
+ let count = 0;
113
+
114
+ // Get all category directories
115
+ const categories = readdirSync(commandsSrc).filter(f =>
116
+ statSync(join(commandsSrc, f)).isDirectory()
117
+ );
118
+
119
+ for (const category of categories) {
120
+ const categoryPath = join(commandsSrc, category);
121
+ const files = readdirSync(categoryPath).filter(f => f.endsWith('.md'));
122
+
123
+ for (const file of files) {
124
+ const srcPath = join(categoryPath, file);
125
+ // Use category prefix with colon for clarity (e.g., dev:fix.md)
126
+ const destName = `${category}:${file}`;
127
+ const destPath = join(commandsDest, destName);
128
+ cpSync(srcPath, destPath);
129
+ count++;
130
+ }
131
+ }
132
+
133
+ return count;
134
+ }
135
+
136
+ /**
137
+ * Copy skills from plugin to Claude Code skills directory
138
+ * Preserves the skill directory structure (category/skill-name/SKILL.md)
139
+ * @param {string} pluginSrc - Source plugin directory
140
+ * @param {string} skillsDest - Destination skills directory
141
+ * @returns {number} Number of skills copied
142
+ */
143
+ function copySkills(pluginSrc, skillsDest) {
144
+ const skillsSrc = join(pluginSrc, 'skills');
145
+ if (!existsSync(skillsSrc)) return 0;
146
+
147
+ mkdirSync(skillsDest, { recursive: true });
148
+ let count = 0;
149
+
150
+ // Get all category directories
151
+ const categories = readdirSync(skillsSrc).filter(f =>
152
+ statSync(join(skillsSrc, f)).isDirectory()
153
+ );
154
+
155
+ for (const category of categories) {
156
+ const categoryPath = join(skillsSrc, category);
157
+ const skills = readdirSync(categoryPath).filter(f =>
158
+ statSync(join(categoryPath, f)).isDirectory()
159
+ );
160
+
161
+ for (const skill of skills) {
162
+ const skillSrcPath = join(categoryPath, skill);
163
+ // Use flat structure with unique name: category-skill-name
164
+ const skillDestPath = join(skillsDest, `${category}-${skill}`);
165
+ cpSync(skillSrcPath, skillDestPath, { recursive: true });
166
+ count++;
167
+ }
168
+ }
169
+
170
+ return count;
171
+ }
172
+
173
+ /**
174
+ * Copy agents from plugin to Claude Code agents directory
175
+ * @param {string} pluginSrc - Source plugin directory
176
+ * @param {string} agentsDest - Destination agents directory
177
+ * @returns {number} Number of agents copied
178
+ */
179
+ function copyAgents(pluginSrc, agentsDest) {
180
+ const agentsSrc = join(pluginSrc, 'agents');
181
+ if (!existsSync(agentsSrc)) return 0;
182
+
183
+ mkdirSync(agentsDest, { recursive: true });
184
+ let count = 0;
185
+
186
+ const files = readdirSync(agentsSrc).filter(f => f.endsWith('.md'));
187
+
188
+ for (const file of files) {
189
+ const srcPath = join(agentsSrc, file);
190
+ const destPath = join(agentsDest, file);
191
+ cpSync(srcPath, destPath);
192
+ count++;
193
+ }
194
+
195
+ return count;
196
+ }
197
+
198
+ /**
199
+ * Copy modes as special commands
200
+ * @param {string} pluginSrc - Source plugin directory
201
+ * @param {string} commandsDest - Destination commands directory
202
+ * @returns {number} Number of modes copied
203
+ */
204
+ function copyModes(pluginSrc, commandsDest) {
205
+ const modesSrc = join(pluginSrc, 'modes');
206
+ if (!existsSync(modesSrc)) return 0;
207
+
208
+ mkdirSync(commandsDest, { recursive: true });
209
+ let count = 0;
210
+
211
+ const files = readdirSync(modesSrc).filter(f => f.endsWith('.md'));
212
+
213
+ for (const file of files) {
214
+ const srcPath = join(modesSrc, file);
215
+ // Prefix modes with 'mode:' for clarity
216
+ const destPath = join(commandsDest, `mode:${file}`);
217
+ cpSync(srcPath, destPath);
218
+ count++;
219
+ }
220
+
221
+ return count;
222
+ }
223
+
70
224
  /**
71
225
  * Get package version from package.json
72
226
  * @returns {string} Version string
@@ -112,15 +266,44 @@ export function installPlugin(options = {}) {
112
266
 
113
267
  const pluginSrc = join(getPackageRoot(), 'plugin');
114
268
  const pluginDest = getPluginDir(homeDir);
269
+ const commandsDest = getCommandsDir(homeDir);
270
+ const skillsDest = getSkillsDir(homeDir);
271
+ const agentsDest = getAgentsDir(homeDir);
115
272
 
116
273
  if (!existsSync(pluginSrc)) {
117
274
  if (!silent) log.error('Plugin source not found. Package may be corrupted.');
118
275
  return { success: false, error: 'SOURCE_NOT_FOUND' };
119
276
  }
120
277
 
278
+ const stats = {
279
+ commands: 0,
280
+ skills: 0,
281
+ agents: 0,
282
+ modes: 0
283
+ };
284
+
121
285
  try {
286
+ // Step 1: Copy full plugin to backup location for reference
287
+ if (!silent) log.info('Copying plugin to backup location...');
122
288
  mkdirSync(pluginDest, { recursive: true });
123
289
  cpSync(pluginSrc, pluginDest, { recursive: true });
290
+
291
+ // Step 2: Install commands to ~/.claude/commands/
292
+ if (!silent) log.info('Installing commands...');
293
+ stats.commands = copyCommands(pluginSrc, commandsDest);
294
+
295
+ // Step 3: Install skills to ~/.claude/skills/
296
+ if (!silent) log.info('Installing skills...');
297
+ stats.skills = copySkills(pluginSrc, skillsDest);
298
+
299
+ // Step 4: Install agents to ~/.claude/agents/
300
+ if (!silent) log.info('Installing agents...');
301
+ stats.agents = copyAgents(pluginSrc, agentsDest);
302
+
303
+ // Step 5: Install modes as commands
304
+ if (!silent) log.info('Installing modes...');
305
+ stats.modes = copyModes(pluginSrc, commandsDest);
306
+
124
307
  } catch (err) {
125
308
  if (!silent) log.error(`Installation failed: ${err.message}`);
126
309
  return { success: false, error: err.message };
@@ -128,24 +311,39 @@ export function installPlugin(options = {}) {
128
311
 
129
312
  if (!silent) {
130
313
  log.success('Plugin installed successfully!');
131
- log.info(`Location: ${pluginDest}`);
132
314
  console.log(`
133
- ${COLORS.bright}Installed:${COLORS.reset}
134
- 📦 23 Agents
135
- 54 Commands
136
- 🧠 43 Skills
137
- 🎭 9 Modes
315
+ ${COLORS.bright}Installed to Claude Code:${COLORS.reset}
316
+ ${COLORS.cyan}Commands:${COLORS.reset} ${commandsDest} (${stats.commands} commands + ${stats.modes} modes)
317
+ ${COLORS.cyan}Skills:${COLORS.reset} ${skillsDest} (${stats.skills} skills)
318
+ ${COLORS.cyan}Agents:${COLORS.reset} ${agentsDest} (${stats.agents} agents)
319
+ ${COLORS.cyan}Backup:${COLORS.reset} ${pluginDest}
320
+
321
+ ${COLORS.bright}Summary:${COLORS.reset}
322
+ 📦 ${stats.agents} Agents
323
+ ⚡ ${stats.commands} Commands
324
+ 🧠 ${stats.skills} Skills
325
+ 🎭 ${stats.modes} Modes
138
326
 
139
327
  ${COLORS.bright}Next steps:${COLORS.reset}
140
- 1. cd your-project
141
- 2. omgkit init
142
- 3. Open Claude Code and type /help
328
+ 1. Restart Claude Code to load new commands
329
+ 2. Type /help to see available commands
330
+ 3. Try /dev:fix, /git:commit, /planning:plan, etc.
143
331
 
144
332
  ${COLORS.magenta}🔮 Think Omega. Build Omega. Be Omega.${COLORS.reset}
145
333
  `);
146
334
  }
147
335
 
148
- return { success: true, path: pluginDest };
336
+ return {
337
+ success: true,
338
+ path: pluginDest,
339
+ stats,
340
+ locations: {
341
+ commands: commandsDest,
342
+ skills: skillsDest,
343
+ agents: agentsDest,
344
+ backup: pluginDest
345
+ }
346
+ };
149
347
  }
150
348
 
151
349
  /**
@@ -215,14 +413,14 @@ export function initProject(options = {}) {
215
413
  ${COLORS.bright}Project initialized!${COLORS.reset}
216
414
 
217
415
  ${COLORS.bright}Next steps in Claude Code:${COLORS.reset}
218
- /vision:set Set your product vision
219
- /sprint:new Create a sprint (add --propose for AI suggestions)
220
- /team:run Start the AI team
416
+ /sprint:vision-set Set your product vision
417
+ /sprint:sprint-new Create a sprint (add --propose for AI suggestions)
418
+ /sprint:team-run Start the AI team
221
419
 
222
420
  ${COLORS.bright}Quick commands:${COLORS.reset}
223
- /feature [desc] Build a feature
224
- /fix [issue] Fix a bug
225
- /10x [topic] Find 10x improvement
421
+ /dev:feature [desc] Build a feature
422
+ /dev:fix [issue] Fix a bug
423
+ /omega:10x [topic] Find 10x improvement
226
424
 
227
425
  ${COLORS.magenta}🔮 Your Omega journey begins!${COLORS.reset}
228
426
  `);
@@ -248,18 +446,23 @@ export function doctor(options = {}) {
248
446
  }
249
447
 
250
448
  const pluginDir = getPluginDir(homeDir);
449
+ const commandsDir = getCommandsDir(homeDir);
450
+ const skillsDir = getSkillsDir(homeDir);
451
+ const agentsDir = getAgentsDir(homeDir);
452
+
251
453
  const result = {
252
454
  plugin: { installed: false, components: {} },
455
+ claudeCode: { commands: 0, skills: 0, agents: 0 },
253
456
  project: { initialized: false, files: {} }
254
457
  };
255
458
 
256
- // Check plugin
257
- if (!silent) console.log(`${COLORS.bright}Plugin Status${COLORS.reset}`);
459
+ // Check backup plugin location
460
+ if (!silent) console.log(`${COLORS.bright}Backup Plugin Location${COLORS.reset}`);
258
461
 
259
462
  if (existsSync(pluginDir)) {
260
463
  result.plugin.installed = true;
261
464
  result.plugin.path = pluginDir;
262
- if (!silent) log.success(`Installed at ${pluginDir}`);
465
+ if (!silent) log.success(`Backup at ${pluginDir}`);
263
466
 
264
467
  const components = [
265
468
  { path: 'commands', name: 'Commands' },
@@ -282,7 +485,84 @@ export function doctor(options = {}) {
282
485
  });
283
486
  } else {
284
487
  if (!silent) {
285
- log.error('Not installed');
488
+ log.warn('Backup not found (optional)');
489
+ }
490
+ }
491
+
492
+ // Check Claude Code directories (the important ones)
493
+ if (!silent) console.log(`\n${COLORS.bright}Claude Code Integration${COLORS.reset}`);
494
+
495
+ // Count commands
496
+ if (existsSync(commandsDir)) {
497
+ const commandPrefixes = ['dev:', 'git:', 'planning:', 'quality:', 'context:', 'design:', 'omega:', 'sprint:', 'mode:'];
498
+ const files = readdirSync(commandsDir).filter(f =>
499
+ f.endsWith('.md') && commandPrefixes.some(p => f.startsWith(p))
500
+ );
501
+ result.claudeCode.commands = files.length;
502
+ if (!silent) {
503
+ if (files.length > 0) {
504
+ log.success(`Commands: ${files.length} installed at ${commandsDir}`);
505
+ } else {
506
+ log.warn(`Commands: None found at ${commandsDir}`);
507
+ }
508
+ }
509
+ } else {
510
+ if (!silent) log.warn(`Commands: Directory not found (${commandsDir})`);
511
+ }
512
+
513
+ // Count skills
514
+ if (existsSync(skillsDir)) {
515
+ const skillPrefixes = ['databases-', 'devops-', 'tools-', 'languages-', 'frameworks-', 'frontend-', 'backend-', 'mobile-', 'integrations-', 'security-', 'testing-', 'methodology-', 'ai-engineering-', 'omega-'];
516
+ const dirs = readdirSync(skillsDir).filter(f => {
517
+ const fullPath = join(skillsDir, f);
518
+ return statSync(fullPath).isDirectory() && skillPrefixes.some(p => f.startsWith(p));
519
+ });
520
+ result.claudeCode.skills = dirs.length;
521
+ if (!silent) {
522
+ if (dirs.length > 0) {
523
+ log.success(`Skills: ${dirs.length} installed at ${skillsDir}`);
524
+ } else {
525
+ log.warn(`Skills: None found at ${skillsDir}`);
526
+ }
527
+ }
528
+ } else {
529
+ if (!silent) log.warn(`Skills: Directory not found (${skillsDir})`);
530
+ }
531
+
532
+ // Count agents
533
+ if (existsSync(agentsDir)) {
534
+ const agentFiles = [
535
+ 'code-reviewer.md', 'architect.md', 'debugger.md', 'api-designer.md',
536
+ 'database-admin.md', 'cicd-manager.md', 'oracle.md', 'researcher.md',
537
+ 'project-manager.md', 'copywriter.md', 'vulnerability-scanner.md',
538
+ 'security-auditor.md', 'journal-writer.md', 'sprint-master.md',
539
+ 'tester.md', 'fullstack-developer.md', 'planner.md', 'docs-manager.md',
540
+ 'git-manager.md', 'ui-ux-designer.md', 'scout.md', 'brainstormer.md',
541
+ 'pipeline-architect.md'
542
+ ];
543
+ const installed = agentFiles.filter(f => existsSync(join(agentsDir, f)));
544
+ result.claudeCode.agents = installed.length;
545
+ if (!silent) {
546
+ if (installed.length > 0) {
547
+ log.success(`Agents: ${installed.length} installed at ${agentsDir}`);
548
+ } else {
549
+ log.warn(`Agents: None found at ${agentsDir}`);
550
+ }
551
+ }
552
+ } else {
553
+ if (!silent) log.warn(`Agents: Directory not found (${agentsDir})`);
554
+ }
555
+
556
+ // Overall status
557
+ const isInstalled = result.claudeCode.commands > 0 ||
558
+ result.claudeCode.skills > 0 ||
559
+ result.claudeCode.agents > 0;
560
+
561
+ if (!silent) {
562
+ if (isInstalled) {
563
+ console.log(`\n${COLORS.green}✓ OMGKIT is properly installed in Claude Code${COLORS.reset}`);
564
+ } else {
565
+ console.log(`\n${COLORS.red}✗ OMGKIT is not installed in Claude Code${COLORS.reset}`);
286
566
  log.info('Run: omgkit install');
287
567
  }
288
568
  }
@@ -322,6 +602,34 @@ export function doctor(options = {}) {
322
602
  return result;
323
603
  }
324
604
 
605
+ /**
606
+ * Remove OMGKIT files from a directory based on naming patterns
607
+ * @param {string} dir - Directory to clean
608
+ * @param {string[]} prefixes - File prefixes to remove (e.g., ['dev-', 'git-'])
609
+ * @returns {number} Number of files removed
610
+ */
611
+ function cleanOmgkitFiles(dir, prefixes) {
612
+ if (!existsSync(dir)) return 0;
613
+
614
+ let count = 0;
615
+ const items = readdirSync(dir);
616
+
617
+ for (const item of items) {
618
+ const itemPath = join(dir, item);
619
+ const stat = statSync(itemPath);
620
+
621
+ // Check if item matches any prefix
622
+ const matchesPrefix = prefixes.some(p => item.startsWith(p));
623
+
624
+ if (matchesPrefix) {
625
+ rmSync(itemPath, { recursive: true, force: true });
626
+ count++;
627
+ }
628
+ }
629
+
630
+ return count;
631
+ }
632
+
325
633
  /**
326
634
  * Uninstall the plugin
327
635
  * @param {Object} options - Options
@@ -338,15 +646,86 @@ export function uninstallPlugin(options = {}) {
338
646
  }
339
647
 
340
648
  const pluginDir = getPluginDir(homeDir);
649
+ const commandsDir = getCommandsDir(homeDir);
650
+ const skillsDir = getSkillsDir(homeDir);
651
+ const agentsDir = getAgentsDir(homeDir);
652
+
653
+ const removed = {
654
+ backup: false,
655
+ commands: 0,
656
+ skills: 0,
657
+ agents: 0
658
+ };
659
+
660
+ // Command prefixes from our categories (using colon separator)
661
+ const commandPrefixes = [
662
+ 'dev:', 'git:', 'planning:', 'quality:', 'context:',
663
+ 'design:', 'omega:', 'sprint:', 'mode:'
664
+ ];
665
+
666
+ // Skill prefixes from our categories
667
+ const skillPrefixes = [
668
+ 'databases-', 'devops-', 'tools-', 'languages-', 'frameworks-',
669
+ 'frontend-', 'backend-', 'mobile-', 'integrations-', 'security-',
670
+ 'testing-', 'methodology-', 'ai-engineering-', 'omega-'
671
+ ];
672
+
673
+ // Agent files we installed
674
+ const agentFiles = [
675
+ 'code-reviewer.md', 'architect.md', 'debugger.md', 'api-designer.md',
676
+ 'database-admin.md', 'cicd-manager.md', 'oracle.md', 'researcher.md',
677
+ 'project-manager.md', 'copywriter.md', 'vulnerability-scanner.md',
678
+ 'security-auditor.md', 'journal-writer.md', 'sprint-master.md',
679
+ 'tester.md', 'fullstack-developer.md', 'planner.md', 'docs-manager.md',
680
+ 'git-manager.md', 'ui-ux-designer.md', 'scout.md', 'brainstormer.md',
681
+ 'pipeline-architect.md'
682
+ ];
341
683
 
684
+ // Remove backup location
342
685
  if (existsSync(pluginDir)) {
343
686
  rmSync(pluginDir, { recursive: true, force: true });
344
- if (!silent) log.success('Plugin uninstalled!');
345
- return { success: true, removed: true };
346
- } else {
347
- if (!silent) log.warn('Plugin not found.');
348
- return { success: true, removed: false };
687
+ removed.backup = true;
688
+ if (!silent) log.success('Removed backup plugin directory');
349
689
  }
690
+
691
+ // Remove commands
692
+ removed.commands = cleanOmgkitFiles(commandsDir, commandPrefixes);
693
+ if (!silent && removed.commands > 0) {
694
+ log.success(`Removed ${removed.commands} commands`);
695
+ }
696
+
697
+ // Remove skills
698
+ removed.skills = cleanOmgkitFiles(skillsDir, skillPrefixes);
699
+ if (!silent && removed.skills > 0) {
700
+ log.success(`Removed ${removed.skills} skills`);
701
+ }
702
+
703
+ // Remove agents
704
+ if (existsSync(agentsDir)) {
705
+ for (const agentFile of agentFiles) {
706
+ const agentPath = join(agentsDir, agentFile);
707
+ if (existsSync(agentPath)) {
708
+ rmSync(agentPath, { force: true });
709
+ removed.agents++;
710
+ }
711
+ }
712
+ if (!silent && removed.agents > 0) {
713
+ log.success(`Removed ${removed.agents} agents`);
714
+ }
715
+ }
716
+
717
+ const anyRemoved = removed.backup || removed.commands > 0 ||
718
+ removed.skills > 0 || removed.agents > 0;
719
+
720
+ if (!silent) {
721
+ if (anyRemoved) {
722
+ log.success('OMGKIT uninstalled successfully!');
723
+ } else {
724
+ log.warn('OMGKIT was not installed.');
725
+ }
726
+ }
727
+
728
+ return { success: true, removed };
350
729
  }
351
730
 
352
731
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omgkit",
3
- "version": "2.6.0",
3
+ "version": "2.8.0",
4
4
  "description": "Omega-Level Development Kit - AI Team System for Claude Code. 23 agents, 58 commands, 88 skills, sprint management.",
5
5
  "keywords": [
6
6
  "claude-code",