omgkit 2.6.0 → 2.7.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/README.md +21 -2
- package/lib/cli.js +399 -20
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
|
|
9
9
|
> **AI Team System for Claude Code**
|
|
10
|
-
> 23 Agents • 58 Commands •
|
|
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** |
|
|
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
|
@@ -58,7 +58,7 @@ ${COLORS.magenta}╔════════════════════
|
|
|
58
58
|
`;
|
|
59
59
|
|
|
60
60
|
/**
|
|
61
|
-
* Get the plugin
|
|
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 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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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.
|
|
141
|
-
2.
|
|
142
|
-
3.
|
|
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 {
|
|
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
|
/**
|
|
@@ -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
|
|
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(`
|
|
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.
|
|
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
|
|
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
|
-
|
|
345
|
-
|
|
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
|
/**
|