@orderful/droid 0.15.0 → 0.16.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.
Files changed (125) hide show
  1. package/.claude/CLAUDE.md +18 -40
  2. package/AGENTS.md +75 -0
  3. package/CHANGELOG.md +25 -0
  4. package/dist/bin/droid.js +3064 -54
  5. package/dist/commands/setup.d.ts +1 -1
  6. package/dist/commands/setup.d.ts.map +1 -1
  7. package/dist/commands/tui/components/Badge.d.ts +13 -0
  8. package/dist/commands/tui/components/Badge.d.ts.map +1 -0
  9. package/dist/commands/tui/components/Markdown.d.ts +5 -0
  10. package/dist/commands/tui/components/Markdown.d.ts.map +1 -0
  11. package/dist/commands/tui/components/SettingsDetails.d.ts +5 -0
  12. package/dist/commands/tui/components/SettingsDetails.d.ts.map +1 -0
  13. package/dist/commands/tui/components/TabBar.d.ts +10 -0
  14. package/dist/commands/tui/components/TabBar.d.ts.map +1 -0
  15. package/dist/commands/tui/components/ToolDetails.d.ts +8 -0
  16. package/dist/commands/tui/components/ToolDetails.d.ts.map +1 -0
  17. package/dist/commands/tui/components/ToolItem.d.ts +9 -0
  18. package/dist/commands/tui/components/ToolItem.d.ts.map +1 -0
  19. package/dist/commands/tui/constants.d.ts +16 -0
  20. package/dist/commands/tui/constants.d.ts.map +1 -0
  21. package/dist/commands/tui/hooks/useAppUpdate.d.ts +13 -0
  22. package/dist/commands/tui/hooks/useAppUpdate.d.ts.map +1 -0
  23. package/dist/commands/tui/hooks/useToolUpdates.d.ts +22 -0
  24. package/dist/commands/tui/hooks/useToolUpdates.d.ts.map +1 -0
  25. package/dist/commands/tui/types.d.ts +5 -0
  26. package/dist/commands/tui/types.d.ts.map +1 -0
  27. package/dist/commands/tui/views/ReadmeViewer.d.ts +7 -0
  28. package/dist/commands/tui/views/ReadmeViewer.d.ts.map +1 -0
  29. package/dist/commands/tui/views/SetupScreen.d.ts +8 -0
  30. package/dist/commands/tui/views/SetupScreen.d.ts.map +1 -0
  31. package/dist/commands/tui/views/SkillConfigScreen.d.ts +8 -0
  32. package/dist/commands/tui/views/SkillConfigScreen.d.ts.map +1 -0
  33. package/dist/commands/tui/views/ToolExplorer.d.ts +8 -0
  34. package/dist/commands/tui/views/ToolExplorer.d.ts.map +1 -0
  35. package/dist/commands/tui/views/ToolUpdatePrompt.d.ts +10 -0
  36. package/dist/commands/tui/views/ToolUpdatePrompt.d.ts.map +1 -0
  37. package/dist/commands/tui/views/WelcomeScreen.d.ts +11 -0
  38. package/dist/commands/tui/views/WelcomeScreen.d.ts.map +1 -0
  39. package/dist/commands/tui.d.ts.map +1 -1
  40. package/dist/index.d.ts +4 -4
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +952 -6
  43. package/dist/lib/agents.d.ts +1 -1
  44. package/dist/lib/agents.d.ts.map +1 -1
  45. package/dist/lib/config.d.ts +1 -1
  46. package/dist/lib/config.d.ts.map +1 -1
  47. package/dist/lib/platforms.d.ts +1 -1
  48. package/dist/lib/platforms.d.ts.map +1 -1
  49. package/dist/lib/skill-config.d.ts +1 -1
  50. package/dist/lib/skill-config.d.ts.map +1 -1
  51. package/dist/lib/skills.d.ts +1 -1
  52. package/dist/lib/skills.d.ts.map +1 -1
  53. package/dist/lib/tools.d.ts +1 -1
  54. package/dist/lib/tools.d.ts.map +1 -1
  55. package/package.json +3 -3
  56. package/scripts/build.ts +78 -0
  57. package/src/bin/droid.ts +8 -8
  58. package/src/commands/config.ts +1 -1
  59. package/src/commands/install.ts +3 -3
  60. package/src/commands/setup.test.ts +1 -1
  61. package/src/commands/setup.ts +3 -3
  62. package/src/commands/skills.ts +4 -4
  63. package/src/commands/tui/components/Badge.tsx +86 -0
  64. package/src/commands/tui/components/Markdown.tsx +48 -0
  65. package/src/commands/tui/components/SettingsDetails.tsx +70 -0
  66. package/src/commands/tui/components/TabBar.tsx +26 -0
  67. package/src/commands/tui/components/ToolDetails.tsx +117 -0
  68. package/src/commands/tui/components/ToolItem.tsx +39 -0
  69. package/src/commands/tui/constants.ts +17 -0
  70. package/src/commands/tui/hooks/useAppUpdate.ts +67 -0
  71. package/src/commands/tui/hooks/useToolUpdates.ts +110 -0
  72. package/src/commands/tui/types.ts +4 -0
  73. package/src/commands/tui/views/ReadmeViewer.tsx +93 -0
  74. package/src/commands/tui/views/SetupScreen.tsx +242 -0
  75. package/src/commands/tui/views/SkillConfigScreen.tsx +278 -0
  76. package/src/commands/tui/views/ToolExplorer.tsx +190 -0
  77. package/src/commands/tui/views/ToolUpdatePrompt.tsx +109 -0
  78. package/src/commands/tui/views/WelcomeScreen.tsx +149 -0
  79. package/src/commands/tui.tsx +65 -1587
  80. package/src/commands/uninstall.ts +2 -2
  81. package/src/commands/update.ts +1 -1
  82. package/src/index.ts +4 -4
  83. package/src/lib/agents.ts +4 -4
  84. package/src/lib/config.ts +1 -1
  85. package/src/lib/platforms.ts +1 -1
  86. package/src/lib/skill-config.ts +2 -2
  87. package/src/lib/skills.test.ts +2 -2
  88. package/src/lib/skills.ts +5 -5
  89. package/src/lib/tools.ts +3 -3
  90. package/src/lib/types.test.ts +1 -1
  91. package/src/lib/version.test.ts +1 -1
  92. package/dist/bin/droid.js.map +0 -1
  93. package/dist/commands/config.js +0 -67
  94. package/dist/commands/config.js.map +0 -1
  95. package/dist/commands/install.js +0 -45
  96. package/dist/commands/install.js.map +0 -1
  97. package/dist/commands/setup.js +0 -269
  98. package/dist/commands/setup.js.map +0 -1
  99. package/dist/commands/skills.js +0 -144
  100. package/dist/commands/skills.js.map +0 -1
  101. package/dist/commands/tui.js +0 -1008
  102. package/dist/commands/tui.js.map +0 -1
  103. package/dist/commands/uninstall.js +0 -26
  104. package/dist/commands/uninstall.js.map +0 -1
  105. package/dist/commands/update.js +0 -45
  106. package/dist/commands/update.js.map +0 -1
  107. package/dist/index.js.map +0 -1
  108. package/dist/lib/agents.js +0 -248
  109. package/dist/lib/agents.js.map +0 -1
  110. package/dist/lib/config.js +0 -196
  111. package/dist/lib/config.js.map +0 -1
  112. package/dist/lib/platforms.js +0 -52
  113. package/dist/lib/platforms.js.map +0 -1
  114. package/dist/lib/quotes.js +0 -24
  115. package/dist/lib/quotes.js.map +0 -1
  116. package/dist/lib/skill-config.js +0 -80
  117. package/dist/lib/skill-config.js.map +0 -1
  118. package/dist/lib/skills.js +0 -582
  119. package/dist/lib/skills.js.map +0 -1
  120. package/dist/lib/tools.js +0 -145
  121. package/dist/lib/tools.js.map +0 -1
  122. package/dist/lib/types.js +0 -50
  123. package/dist/lib/types.js.map +0 -1
  124. package/dist/lib/version.js +0 -100
  125. package/dist/lib/version.js.map +0 -1
@@ -1,582 +0,0 @@
1
- import { existsSync, readdirSync, readFileSync, mkdirSync, writeFileSync, rmSync } from 'fs';
2
- import { join, dirname } from 'path';
3
- import { fileURLToPath } from 'url';
4
- import YAML from 'yaml';
5
- import { loadConfig, saveConfig } from './config.js';
6
- import { SkillStatus, getPlatformTools, setPlatformTools } from './types.js';
7
- import { getInstalledAgentsDir, installAgentFromPath, uninstallAgent, isAgentInstalled } from './agents.js';
8
- import { getSkillsPath, getCommandsPath, getConfigPath } from './platforms.js';
9
- import { loadToolManifest } from './tools.js';
10
- // Marker comments for CLAUDE.md skill registration
11
- const DROID_SKILLS_START = '<!-- droid-skills-start -->';
12
- const DROID_SKILLS_END = '<!-- droid-skills-end -->';
13
- const __dirname = dirname(fileURLToPath(import.meta.url));
14
- const BUNDLED_SKILLS_DIR = join(__dirname, '../tools');
15
- /**
16
- * Get the path to bundled tools directory
17
- */
18
- export function getBundledSkillsDir() {
19
- return BUNDLED_SKILLS_DIR;
20
- }
21
- /**
22
- * Get the installation path for skills based on platform
23
- */
24
- export function getSkillsInstallPath(platform) {
25
- return getSkillsPath(platform);
26
- }
27
- /**
28
- * Get the commands installation path based on platform
29
- */
30
- export function getCommandsInstallPath(platform) {
31
- return getCommandsPath(platform);
32
- }
33
- /**
34
- * Get the path to the platform's main config markdown file
35
- */
36
- export function getPlatformConfigPath(platform) {
37
- return getConfigPath(platform);
38
- }
39
- /**
40
- * Update the platform's config file with skill registrations
41
- */
42
- export function updatePlatformConfigSkills(platform, installedSkills) {
43
- const configPath = getPlatformConfigPath(platform);
44
- let content = '';
45
- if (existsSync(configPath)) {
46
- content = readFileSync(configPath, 'utf-8');
47
- }
48
- // Generate skills section
49
- const skillLines = installedSkills.map(name => {
50
- const relativePath = `skills/${name}/SKILL.md`;
51
- return `- [${name}](${relativePath})`;
52
- });
53
- const skillsSection = installedSkills.length > 0
54
- ? `${DROID_SKILLS_START}\n## Droid Skills\n\n${skillLines.join('\n')}\n${DROID_SKILLS_END}`
55
- : '';
56
- // Check if section already exists
57
- const startIdx = content.indexOf(DROID_SKILLS_START);
58
- const endIdx = content.indexOf(DROID_SKILLS_END);
59
- if (startIdx !== -1 && endIdx !== -1) {
60
- // Replace existing section
61
- content = content.slice(0, startIdx) + skillsSection + content.slice(endIdx + DROID_SKILLS_END.length);
62
- }
63
- else if (skillsSection) {
64
- // Append new section
65
- content = content.trim() + '\n\n' + skillsSection + '\n';
66
- }
67
- // Ensure parent directory exists
68
- const configDir = dirname(configPath);
69
- if (!existsSync(configDir)) {
70
- mkdirSync(configDir, { recursive: true });
71
- }
72
- writeFileSync(configPath, content, 'utf-8');
73
- }
74
- /**
75
- * Parse YAML frontmatter from SKILL.md content
76
- */
77
- function parseSkillFrontmatter(content) {
78
- const trimmed = content.trimStart();
79
- if (!trimmed.startsWith('---')) {
80
- return null;
81
- }
82
- const endMatch = trimmed.slice(3).indexOf('---');
83
- if (endMatch === -1) {
84
- return null;
85
- }
86
- const frontmatterContent = trimmed.slice(3, 3 + endMatch);
87
- try {
88
- return YAML.parse(frontmatterContent);
89
- }
90
- catch {
91
- return null;
92
- }
93
- }
94
- /**
95
- * Load a skill manifest from a skill directory
96
- * Reads frontmatter from SKILL.md, version from TOOL.yaml
97
- */
98
- export function loadSkillManifest(skillDir) {
99
- const skillMdPath = join(skillDir, 'SKILL.md');
100
- // Read SKILL.md and parse frontmatter
101
- if (!existsSync(skillMdPath)) {
102
- return null;
103
- }
104
- const content = readFileSync(skillMdPath, 'utf-8');
105
- const frontmatter = parseSkillFrontmatter(content);
106
- if (!frontmatter || !frontmatter.name) {
107
- return null;
108
- }
109
- // Get version and other tool-level info from TOOL.yaml
110
- const toolDir = dirname(dirname(skillDir)); // skillDir is tools/{tool}/skills/{skill}, toolDir is tools/{tool}
111
- const toolManifest = loadToolManifest(toolDir);
112
- return {
113
- name: frontmatter.name,
114
- description: frontmatter.description || '',
115
- version: toolManifest?.version || '0.0.0',
116
- status: toolManifest?.status,
117
- dependencies: toolManifest?.dependencies,
118
- config_schema: toolManifest?.config_schema,
119
- };
120
- }
121
- /**
122
- * Find the path to a skill within the tools directory structure
123
- * Returns { toolDir, skillDir } or null if not found
124
- */
125
- export function findSkillPath(skillName) {
126
- if (!existsSync(BUNDLED_SKILLS_DIR)) {
127
- return null;
128
- }
129
- const toolDirs = readdirSync(BUNDLED_SKILLS_DIR, { withFileTypes: true })
130
- .filter((dirent) => dirent.isDirectory())
131
- .map((dirent) => dirent.name);
132
- for (const toolName of toolDirs) {
133
- const skillsDir = join(BUNDLED_SKILLS_DIR, toolName, 'skills');
134
- if (!existsSync(skillsDir))
135
- continue;
136
- const skillDir = join(skillsDir, skillName);
137
- // Check for SKILL.md (content file) - metadata now comes from TOOL.yaml
138
- if (existsSync(skillDir) && existsSync(join(skillDir, 'SKILL.md'))) {
139
- return {
140
- toolDir: join(BUNDLED_SKILLS_DIR, toolName),
141
- skillDir,
142
- };
143
- }
144
- }
145
- return null;
146
- }
147
- /**
148
- * Get all bundled skills from all tools
149
- */
150
- export function getBundledSkills() {
151
- if (!existsSync(BUNDLED_SKILLS_DIR)) {
152
- return [];
153
- }
154
- const toolDirs = readdirSync(BUNDLED_SKILLS_DIR, { withFileTypes: true })
155
- .filter((dirent) => dirent.isDirectory())
156
- .map((dirent) => dirent.name);
157
- const skills = [];
158
- for (const toolName of toolDirs) {
159
- const skillsDir = join(BUNDLED_SKILLS_DIR, toolName, 'skills');
160
- if (!existsSync(skillsDir))
161
- continue;
162
- const skillSubdirs = readdirSync(skillsDir, { withFileTypes: true })
163
- .filter((dirent) => dirent.isDirectory())
164
- .map((dirent) => dirent.name);
165
- for (const skillName of skillSubdirs) {
166
- const manifest = loadSkillManifest(join(skillsDir, skillName));
167
- if (manifest) {
168
- skills.push(manifest);
169
- }
170
- }
171
- }
172
- return skills;
173
- }
174
- /**
175
- * Check if a skill is installed
176
- */
177
- export function isSkillInstalled(skillName) {
178
- const config = loadConfig();
179
- const tools = getPlatformTools(config);
180
- return skillName in tools;
181
- }
182
- /**
183
- * Get installed skill info
184
- */
185
- export function getInstalledSkill(skillName) {
186
- const config = loadConfig();
187
- const tools = getPlatformTools(config);
188
- return tools[skillName] || null;
189
- }
190
- /**
191
- * Check if a skill has an update available
192
- */
193
- export function getSkillUpdateStatus(skillName) {
194
- const installed = getInstalledSkill(skillName);
195
- const skillPath = findSkillPath(skillName);
196
- const manifest = skillPath ? loadSkillManifest(skillPath.skillDir) : null;
197
- if (!installed || !manifest) {
198
- return {
199
- hasUpdate: false,
200
- installedVersion: installed?.version || null,
201
- bundledVersion: manifest?.version || null,
202
- };
203
- }
204
- return {
205
- hasUpdate: manifest.version !== installed.version,
206
- installedVersion: installed.version,
207
- bundledVersion: manifest.version,
208
- };
209
- }
210
- /**
211
- * Get all installed skills that have updates available
212
- */
213
- export function getSkillsWithUpdates() {
214
- const config = loadConfig();
215
- const tools = getPlatformTools(config);
216
- const updates = [];
217
- for (const skillName of Object.keys(tools)) {
218
- const status = getSkillUpdateStatus(skillName);
219
- if (status.hasUpdate && status.installedVersion && status.bundledVersion) {
220
- updates.push({
221
- name: skillName,
222
- installedVersion: status.installedVersion,
223
- bundledVersion: status.bundledVersion,
224
- });
225
- }
226
- }
227
- return updates;
228
- }
229
- /**
230
- * Update a skill to the latest bundled version
231
- */
232
- export function updateSkill(skillName) {
233
- const status = getSkillUpdateStatus(skillName);
234
- if (!status.installedVersion) {
235
- return { success: false, message: `Skill '${skillName}' is not installed` };
236
- }
237
- if (!status.bundledVersion) {
238
- return { success: false, message: `Skill '${skillName}' not found in bundled skills` };
239
- }
240
- if (!status.hasUpdate) {
241
- return { success: false, message: `Skill '${skillName}' is already at latest version (${status.installedVersion})` };
242
- }
243
- // Reinstall the skill (install handles overwriting existing files)
244
- const result = installSkill(skillName);
245
- if (result.success) {
246
- return {
247
- success: true,
248
- message: `Updated ${skillName} from ${status.installedVersion} to ${status.bundledVersion}`,
249
- };
250
- }
251
- return result;
252
- }
253
- /**
254
- * Update all installed skills that have newer bundled versions
255
- */
256
- export function updateAllSkills() {
257
- const config = loadConfig();
258
- const tools = getPlatformTools(config);
259
- const result = {
260
- updated: [],
261
- failed: [],
262
- upToDate: 0,
263
- };
264
- for (const skillName of Object.keys(tools)) {
265
- const status = getSkillUpdateStatus(skillName);
266
- if (!status.hasUpdate) {
267
- result.upToDate++;
268
- continue;
269
- }
270
- const updateResult = updateSkill(skillName);
271
- if (updateResult.success) {
272
- result.updated.push({
273
- name: skillName,
274
- from: status.installedVersion,
275
- to: status.bundledVersion,
276
- });
277
- }
278
- else {
279
- result.failed.push({
280
- name: skillName,
281
- error: updateResult.message,
282
- });
283
- }
284
- }
285
- return result;
286
- }
287
- /**
288
- * Install a skill
289
- */
290
- export function installSkill(skillName) {
291
- const config = loadConfig();
292
- const skillPath = findSkillPath(skillName);
293
- if (!skillPath) {
294
- return { success: false, message: `Skill '${skillName}' not found` };
295
- }
296
- const { toolDir, skillDir } = skillPath;
297
- const manifest = loadSkillManifest(skillDir);
298
- if (!manifest) {
299
- return { success: false, message: `Invalid skill manifest for '${skillName}'` };
300
- }
301
- // Check dependencies
302
- if (manifest.dependencies) {
303
- for (const dep of manifest.dependencies) {
304
- if (!isSkillInstalled(dep)) {
305
- return {
306
- success: false,
307
- message: `Missing dependency: '${dep}'. Install it first with \`droid install ${dep}\``,
308
- };
309
- }
310
- }
311
- }
312
- const skillsPath = getSkillsInstallPath(config.platform);
313
- const targetSkillDir = join(skillsPath, skillName);
314
- const commandsPath = getCommandsInstallPath(config.platform);
315
- const tools = getPlatformTools(config);
316
- // Commands and agents are at the tool level, not skill level
317
- const commandsSource = join(toolDir, 'commands');
318
- const agentsSource = join(toolDir, 'agents');
319
- // Check for collisions BEFORE installing (only if not already installed by droid)
320
- // Note: If skill folder exists but skill isn't in config, we allow overwriting (stale state
321
- // from platform switch or manual cleanup). Command/agent collisions still checked.
322
- if (!tools[skillName]) {
323
- // Check command file collisions (these could conflict with other skills)
324
- if (existsSync(commandsSource)) {
325
- const commandFiles = readdirSync(commandsSource).filter(f => f.endsWith('.md') && f.toLowerCase() !== 'readme.md');
326
- for (const file of commandFiles) {
327
- const targetCommandPath = join(commandsPath, file);
328
- if (existsSync(targetCommandPath)) {
329
- const commandName = file.replace('.md', '');
330
- return {
331
- success: false,
332
- message: `Cannot install: command /${commandName} already exists at ${targetCommandPath}`,
333
- };
334
- }
335
- }
336
- }
337
- // Check bundled agent collisions
338
- if (existsSync(agentsSource)) {
339
- const agentDirs = readdirSync(agentsSource, { withFileTypes: true })
340
- .filter(dirent => dirent.isDirectory())
341
- .map(dirent => dirent.name);
342
- for (const agentName of agentDirs) {
343
- if (isAgentInstalled(agentName)) {
344
- return {
345
- success: false,
346
- message: `Cannot install: agent '${agentName}' already exists at ${getInstalledAgentsDir()}`,
347
- };
348
- }
349
- }
350
- }
351
- }
352
- // Ensure skills directory exists
353
- if (!existsSync(skillsPath)) {
354
- mkdirSync(skillsPath, { recursive: true });
355
- }
356
- // Copy SKILL.md (includes its own frontmatter)
357
- const skillMdSource = join(skillDir, 'SKILL.md');
358
- if (existsSync(skillMdSource)) {
359
- if (!existsSync(targetSkillDir)) {
360
- mkdirSync(targetSkillDir, { recursive: true });
361
- }
362
- const skillMdTarget = join(targetSkillDir, 'SKILL.md');
363
- const content = readFileSync(skillMdSource, 'utf-8');
364
- writeFileSync(skillMdTarget, content);
365
- }
366
- // Copy references if present (skill documentation files)
367
- const referencesSource = join(skillDir, 'references');
368
- if (existsSync(referencesSource)) {
369
- const targetReferencesDir = join(targetSkillDir, 'references');
370
- if (!existsSync(targetReferencesDir)) {
371
- mkdirSync(targetReferencesDir, { recursive: true });
372
- }
373
- const referenceFiles = readdirSync(referencesSource).filter(f => f.endsWith('.md'));
374
- for (const file of referenceFiles) {
375
- const sourcePath = join(referencesSource, file);
376
- const targetPath = join(targetReferencesDir, file);
377
- const content = readFileSync(sourcePath, 'utf-8');
378
- writeFileSync(targetPath, content);
379
- }
380
- }
381
- // Copy commands if present (from tool level)
382
- if (existsSync(commandsSource)) {
383
- if (!existsSync(commandsPath)) {
384
- mkdirSync(commandsPath, { recursive: true });
385
- }
386
- const commandFiles = readdirSync(commandsSource).filter(f => f.endsWith('.md') && f.toLowerCase() !== 'readme.md');
387
- for (const file of commandFiles) {
388
- const sourcePath = join(commandsSource, file);
389
- const targetPath = join(commandsPath, file);
390
- const content = readFileSync(sourcePath, 'utf-8');
391
- writeFileSync(targetPath, content);
392
- }
393
- }
394
- // Install bundled agents if present (from tool level)
395
- const installedAgents = [];
396
- if (existsSync(agentsSource)) {
397
- const agentDirs = readdirSync(agentsSource, { withFileTypes: true })
398
- .filter(dirent => dirent.isDirectory())
399
- .map(dirent => dirent.name);
400
- for (const agentName of agentDirs) {
401
- const agentDir = join(agentsSource, agentName);
402
- const result = installAgentFromPath(agentDir, agentName);
403
- if (result.success) {
404
- installedAgents.push(agentName);
405
- }
406
- }
407
- }
408
- // Update config
409
- const updatedTools = {
410
- ...tools,
411
- [skillName]: {
412
- version: manifest.version,
413
- installed_at: new Date().toISOString(),
414
- ...(installedAgents.length > 0 && { bundled_agents: installedAgents }),
415
- },
416
- };
417
- setPlatformTools(config, updatedTools);
418
- saveConfig(config);
419
- // Update platform's config file with skill reference
420
- const installedSkillNames = Object.keys(updatedTools);
421
- updatePlatformConfigSkills(config.platform, installedSkillNames);
422
- return { success: true, message: `Installed ${skillName} v${manifest.version}` };
423
- }
424
- /**
425
- * Uninstall a skill
426
- */
427
- export function uninstallSkill(skillName) {
428
- const config = loadConfig();
429
- const tools = getPlatformTools(config);
430
- if (!isSkillInstalled(skillName)) {
431
- return { success: false, message: `Skill '${skillName}' is not installed` };
432
- }
433
- // Remove skill files from platform location
434
- const skillsPath = getSkillsInstallPath(config.platform);
435
- const skillDir = join(skillsPath, skillName);
436
- if (existsSync(skillDir)) {
437
- rmSync(skillDir, { recursive: true });
438
- }
439
- // Remove command files if they exist (commands are at tool level)
440
- const skillPath = findSkillPath(skillName);
441
- const commandsPath = getCommandsInstallPath(config.platform);
442
- const commandsSource = skillPath ? join(skillPath.toolDir, 'commands') : null;
443
- if (commandsSource && existsSync(commandsSource)) {
444
- const commandFiles = readdirSync(commandsSource).filter(f => f.endsWith('.md') && f.toLowerCase() !== 'readme.md');
445
- for (const file of commandFiles) {
446
- const commandPath = join(commandsPath, file);
447
- if (existsSync(commandPath)) {
448
- rmSync(commandPath);
449
- }
450
- }
451
- }
452
- // Remove bundled agents if they were installed with this skill
453
- const installedSkillInfo = tools[skillName];
454
- if (installedSkillInfo?.bundled_agents) {
455
- for (const agentName of installedSkillInfo.bundled_agents) {
456
- uninstallAgent(agentName);
457
- }
458
- }
459
- // Remove from config (destructure to omit the skill being removed)
460
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
461
- const { [skillName]: removed, ...remainingTools } = tools;
462
- setPlatformTools(config, remainingTools);
463
- saveConfig(config);
464
- // Update platform's config file to remove skill reference
465
- const installedSkillNames = Object.keys(remainingTools);
466
- updatePlatformConfigSkills(config.platform, installedSkillNames);
467
- return { success: true, message: `Uninstalled ${skillName}` };
468
- }
469
- /**
470
- * Get skill status display string
471
- */
472
- export function getSkillStatusDisplay(status) {
473
- switch (status) {
474
- case SkillStatus.Alpha:
475
- return '[alpha]';
476
- case SkillStatus.Beta:
477
- return '[beta]';
478
- case SkillStatus.Stable:
479
- default:
480
- return '';
481
- }
482
- }
483
- /**
484
- * Check if a command is installed
485
- * @param commandName - The display name (e.g., "comments check")
486
- * @param skillName - The skill the command belongs to
487
- */
488
- export function isCommandInstalled(commandName, skillName) {
489
- // If the parent skill is installed, the command is installed with it
490
- if (isSkillInstalled(skillName)) {
491
- return true;
492
- }
493
- // Otherwise check if command was installed standalone
494
- const config = loadConfig();
495
- const commandsPath = getCommandsInstallPath(config.platform);
496
- // Command filename is derived from the command name after the skill prefix
497
- // e.g., "comments check" from skill "comments" → "check.md"
498
- const cmdPart = commandName.startsWith(skillName + ' ')
499
- ? commandName.slice(skillName.length + 1)
500
- : commandName;
501
- const filename = cmdPart.replace(/\s+/g, '-') + '.md';
502
- return existsSync(join(commandsPath, filename));
503
- }
504
- /**
505
- * Install a single command (without installing the full skill)
506
- */
507
- export function installCommand(commandName, skillName) {
508
- const config = loadConfig();
509
- // Find the skill to get its tool directory (commands are at tool level)
510
- const skillPath = findSkillPath(skillName);
511
- if (!skillPath) {
512
- return { success: false, message: `Skill '${skillName}' not found` };
513
- }
514
- const commandsDir = join(skillPath.toolDir, 'commands');
515
- if (!existsSync(commandsDir)) {
516
- return { success: false, message: `No commands found for skill '${skillName}'` };
517
- }
518
- // Find the source command file
519
- const cmdPart = commandName.startsWith(skillName + ' ')
520
- ? commandName.slice(skillName.length + 1)
521
- : commandName;
522
- const files = readdirSync(commandsDir).filter(f => f.endsWith('.md') && f.toLowerCase() !== 'readme.md');
523
- const sourceFile = files.find(f => {
524
- const base = f.replace('.md', '');
525
- return base === cmdPart || base === cmdPart.replace(/\s+/g, '-');
526
- });
527
- if (!sourceFile) {
528
- return { success: false, message: `Command file not found for: ${commandName}` };
529
- }
530
- // Ensure commands directory exists
531
- const commandsPath = getCommandsInstallPath(config.platform);
532
- if (!existsSync(commandsPath)) {
533
- mkdirSync(commandsPath, { recursive: true });
534
- }
535
- const actualSourcePath = join(commandsDir, sourceFile);
536
- const targetPath = join(commandsPath, sourceFile);
537
- try {
538
- const content = readFileSync(actualSourcePath, 'utf-8');
539
- writeFileSync(targetPath, content);
540
- return { success: true, message: `Installed /${commandName}` };
541
- }
542
- catch (error) {
543
- return { success: false, message: `Failed to install command: ${error}` };
544
- }
545
- }
546
- /**
547
- * Uninstall a single command
548
- */
549
- export function uninstallCommand(commandName, skillName) {
550
- const config = loadConfig();
551
- // If the parent skill is installed, block command uninstall
552
- if (isSkillInstalled(skillName)) {
553
- return {
554
- success: false,
555
- message: `Command belongs to installed skill '${skillName}'. Uninstall the skill to remove this command.`,
556
- };
557
- }
558
- const commandsPath = getCommandsInstallPath(config.platform);
559
- // Find the installed command file
560
- const cmdPart = commandName.startsWith(skillName + ' ')
561
- ? commandName.slice(skillName.length + 1)
562
- : commandName;
563
- // Check possible filenames
564
- const possibleFilenames = [
565
- cmdPart + '.md',
566
- cmdPart.replace(/\s+/g, '-') + '.md',
567
- ];
568
- for (const filename of possibleFilenames) {
569
- const commandPath = join(commandsPath, filename);
570
- if (existsSync(commandPath)) {
571
- try {
572
- rmSync(commandPath);
573
- return { success: true, message: `Uninstalled /${commandName}` };
574
- }
575
- catch (error) {
576
- return { success: false, message: `Failed to uninstall command: ${error}` };
577
- }
578
- }
579
- }
580
- return { success: false, message: `Command not installed: ${commandName}` };
581
- }
582
- //# sourceMappingURL=skills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"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"}