@orderful/droid 0.16.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.
- package/.claude/CLAUDE.md +3 -43
- package/AGENTS.md +75 -0
- package/CHANGELOG.md +12 -0
- package/dist/bin/droid.js +3064 -54
- package/dist/index.js +952 -6
- package/package.json +2 -2
- package/scripts/build.ts +78 -0
- package/dist/bin/droid.js.map +0 -1
- package/dist/commands/config.js +0 -67
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/install.js +0 -45
- package/dist/commands/install.js.map +0 -1
- package/dist/commands/setup.js +0 -269
- package/dist/commands/setup.js.map +0 -1
- package/dist/commands/skills.js +0 -144
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/tui/components/Badge.js +0 -29
- package/dist/commands/tui/components/Badge.js.map +0 -1
- package/dist/commands/tui/components/Markdown.js +0 -42
- package/dist/commands/tui/components/Markdown.js.map +0 -1
- package/dist/commands/tui/components/SettingsDetails.js +0 -11
- package/dist/commands/tui/components/SettingsDetails.js.map +0 -1
- package/dist/commands/tui/components/TabBar.js +0 -7
- package/dist/commands/tui/components/TabBar.js.map +0 -1
- package/dist/commands/tui/components/ToolDetails.js +0 -35
- package/dist/commands/tui/components/ToolDetails.js.map +0 -1
- package/dist/commands/tui/components/ToolItem.js +0 -11
- package/dist/commands/tui/components/ToolItem.js.map +0 -1
- package/dist/commands/tui/constants.js +0 -17
- package/dist/commands/tui/constants.js.map +0 -1
- package/dist/commands/tui/hooks/useAppUpdate.js +0 -52
- package/dist/commands/tui/hooks/useAppUpdate.js.map +0 -1
- package/dist/commands/tui/hooks/useToolUpdates.js +0 -77
- package/dist/commands/tui/hooks/useToolUpdates.js.map +0 -1
- package/dist/commands/tui/types.js +0 -2
- package/dist/commands/tui/types.js.map +0 -1
- package/dist/commands/tui/views/ReadmeViewer.js +0 -56
- package/dist/commands/tui/views/ReadmeViewer.js.map +0 -1
- package/dist/commands/tui/views/SetupScreen.js +0 -114
- package/dist/commands/tui/views/SetupScreen.js.map +0 -1
- package/dist/commands/tui/views/SkillConfigScreen.js +0 -148
- package/dist/commands/tui/views/SkillConfigScreen.js.map +0 -1
- package/dist/commands/tui/views/ToolExplorer.js +0 -86
- package/dist/commands/tui/views/ToolExplorer.js.map +0 -1
- package/dist/commands/tui/views/ToolUpdatePrompt.js +0 -38
- package/dist/commands/tui/views/ToolUpdatePrompt.js.map +0 -1
- package/dist/commands/tui/views/WelcomeScreen.js +0 -46
- package/dist/commands/tui/views/WelcomeScreen.js.map +0 -1
- package/dist/commands/tui.js +0 -307
- package/dist/commands/tui.js.map +0 -1
- package/dist/commands/uninstall.js +0 -26
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/commands/update.js +0 -45
- package/dist/commands/update.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/agents.js +0 -248
- package/dist/lib/agents.js.map +0 -1
- package/dist/lib/config.js +0 -196
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/platforms.js +0 -52
- package/dist/lib/platforms.js.map +0 -1
- package/dist/lib/quotes.js +0 -24
- package/dist/lib/quotes.js.map +0 -1
- package/dist/lib/skill-config.js +0 -80
- package/dist/lib/skill-config.js.map +0 -1
- package/dist/lib/skills.js +0 -582
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/tools.js +0 -145
- package/dist/lib/tools.js.map +0 -1
- package/dist/lib/types.js +0 -50
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/version.js +0 -100
- package/dist/lib/version.js.map +0 -1
package/dist/lib/skills.js
DELETED
|
@@ -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';
|
|
6
|
-
import { SkillStatus, getPlatformTools, setPlatformTools } from './types';
|
|
7
|
-
import { getInstalledAgentsDir, installAgentFromPath, uninstallAgent, isAgentInstalled } from './agents';
|
|
8
|
-
import { getSkillsPath, getCommandsPath, getConfigPath } from './platforms';
|
|
9
|
-
import { loadToolManifest } from './tools';
|
|
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
|
package/dist/lib/skills.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"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"}
|