@orderful/droid 0.10.4 → 0.11.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/.claude/CLAUDE.md +13 -6
- package/CHANGELOG.md +21 -0
- package/README.md +23 -24
- package/dist/bin/droid.js +9 -9
- package/dist/bin/droid.js.map +1 -1
- package/dist/commands/install.d.ts +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +24 -23
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/setup.d.ts +3 -3
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +32 -28
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +60 -53
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/tui.d.ts.map +1 -1
- package/dist/commands/tui.js +213 -319
- package/dist/commands/tui.js.map +1 -1
- package/dist/commands/uninstall.d.ts +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +15 -6
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.d.ts +2 -2
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +9 -9
- package/dist/commands/update.js.map +1 -1
- package/dist/lib/agents.d.ts +11 -10
- package/dist/lib/agents.d.ts.map +1 -1
- package/dist/lib/agents.js +52 -54
- package/dist/lib/agents.js.map +1 -1
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +42 -5
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/platforms.d.ts +41 -0
- package/dist/lib/platforms.d.ts.map +1 -0
- package/dist/lib/platforms.js +52 -0
- package/dist/lib/platforms.js.map +1 -0
- package/dist/lib/skills.d.ts +19 -11
- package/dist/lib/skills.d.ts.map +1 -1
- package/dist/lib/skills.js +127 -106
- package/dist/lib/skills.js.map +1 -1
- package/dist/lib/tools.d.ts +30 -0
- package/dist/lib/tools.d.ts.map +1 -0
- package/dist/lib/tools.js +116 -0
- package/dist/lib/tools.js.map +1 -0
- package/dist/lib/types.d.ts +45 -2
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +24 -5
- package/dist/lib/types.js.map +1 -1
- package/dist/tools/brain/TOOL.yaml +27 -0
- package/dist/tools/coach/TOOL.yaml +21 -0
- package/dist/tools/code-review/TOOL.yaml +18 -0
- package/dist/{skills → tools}/code-review/commands/code-review.md +23 -1
- package/dist/tools/comments/TOOL.yaml +27 -0
- package/dist/tools/project/TOOL.yaml +26 -0
- package/package.json +2 -2
- package/src/bin/droid.ts +9 -9
- package/src/commands/install.ts +24 -23
- package/src/commands/setup.test.ts +2 -2
- package/src/commands/setup.ts +33 -29
- package/src/commands/skills.ts +63 -64
- package/src/commands/tui.tsx +432 -578
- package/src/commands/uninstall.ts +17 -6
- package/src/commands/update.ts +10 -10
- package/src/lib/agents.ts +58 -58
- package/src/lib/config.test.ts +0 -10
- package/src/lib/config.ts +47 -5
- package/src/lib/platforms.ts +59 -0
- package/src/lib/skills.test.ts +53 -28
- package/src/lib/skills.ts +136 -109
- package/src/lib/tools.ts +140 -0
- package/src/lib/types.test.ts +15 -7
- package/src/lib/types.ts +63 -2
- package/src/tools/brain/TOOL.yaml +27 -0
- package/src/tools/coach/TOOL.yaml +21 -0
- package/src/tools/code-review/TOOL.yaml +18 -0
- package/src/{skills → tools}/code-review/commands/code-review.md +23 -1
- package/src/tools/comments/TOOL.yaml +27 -0
- package/src/tools/project/TOOL.yaml +26 -0
- package/dist/agents/README.md +0 -137
- package/src/agents/README.md +0 -137
- /package/dist/{skills → tools}/README.md +0 -0
- /package/dist/{skills → tools}/brain/commands/README.md +0 -0
- /package/dist/{skills → tools}/brain/commands/brain.md +0 -0
- /package/dist/{skills → tools}/brain/commands/scratchpad.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain/SKILL.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain/SKILL.yaml +0 -0
- /package/dist/{skills → tools/brain/skills}/brain/references/metadata.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain/references/naming.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain/references/templates.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain/references/workflows.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain-obsidian/SKILL.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain-obsidian/SKILL.yaml +0 -0
- /package/dist/{skills → tools/brain/skills}/brain-obsidian/references/templates.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain-obsidian/references/workflows.md +0 -0
- /package/dist/{skills → tools}/coach/commands/README.md +0 -0
- /package/dist/{skills → tools}/coach/commands/coach.md +0 -0
- /package/dist/{skills → tools/coach/skills}/coach/SKILL.md +0 -0
- /package/dist/{skills → tools/coach/skills}/coach/SKILL.yaml +0 -0
- /package/dist/{skills → tools}/code-review/agents/edi-standards-reviewer/AGENT.md +0 -0
- /package/dist/{skills → tools}/code-review/agents/edi-standards-reviewer/AGENT.yaml +0 -0
- /package/dist/{skills → tools}/code-review/agents/error-handling-reviewer/AGENT.md +0 -0
- /package/dist/{skills → tools}/code-review/agents/error-handling-reviewer/AGENT.yaml +0 -0
- /package/dist/{skills → tools}/code-review/agents/test-coverage-analyzer/AGENT.md +0 -0
- /package/dist/{skills → tools}/code-review/agents/test-coverage-analyzer/AGENT.yaml +0 -0
- /package/dist/{skills → tools}/code-review/agents/type-reviewer/AGENT.md +0 -0
- /package/dist/{skills → tools}/code-review/agents/type-reviewer/AGENT.yaml +0 -0
- /package/dist/{skills → tools/code-review/skills}/code-review/SKILL.md +0 -0
- /package/dist/{skills → tools/code-review/skills}/code-review/SKILL.yaml +0 -0
- /package/dist/{skills → tools}/comments/commands/README.md +0 -0
- /package/dist/{skills → tools}/comments/commands/comments.md +0 -0
- /package/dist/{skills → tools/comments/skills}/comments/SKILL.md +0 -0
- /package/dist/{skills → tools/comments/skills}/comments/SKILL.yaml +0 -0
- /package/dist/{skills → tools}/project/commands/README.md +0 -0
- /package/dist/{skills → tools}/project/commands/project.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/SKILL.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/SKILL.yaml +0 -0
- /package/dist/{skills → tools/project/skills}/project/references/changelog.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/references/creating.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/references/loading.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/references/templates.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/references/updating.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/references/versioning.md +0 -0
- /package/src/{skills → tools}/README.md +0 -0
- /package/src/{skills → tools}/brain/commands/README.md +0 -0
- /package/src/{skills → tools}/brain/commands/brain.md +0 -0
- /package/src/{skills → tools}/brain/commands/scratchpad.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain/SKILL.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain/SKILL.yaml +0 -0
- /package/src/{skills → tools/brain/skills}/brain/references/metadata.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain/references/naming.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain/references/templates.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain/references/workflows.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain-obsidian/SKILL.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain-obsidian/SKILL.yaml +0 -0
- /package/src/{skills → tools/brain/skills}/brain-obsidian/references/templates.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain-obsidian/references/workflows.md +0 -0
- /package/src/{skills → tools}/coach/commands/README.md +0 -0
- /package/src/{skills → tools}/coach/commands/coach.md +0 -0
- /package/src/{skills → tools/coach/skills}/coach/SKILL.md +0 -0
- /package/src/{skills → tools/coach/skills}/coach/SKILL.yaml +0 -0
- /package/src/{skills → tools}/code-review/agents/edi-standards-reviewer/AGENT.md +0 -0
- /package/src/{skills → tools}/code-review/agents/edi-standards-reviewer/AGENT.yaml +0 -0
- /package/src/{skills → tools}/code-review/agents/error-handling-reviewer/AGENT.md +0 -0
- /package/src/{skills → tools}/code-review/agents/error-handling-reviewer/AGENT.yaml +0 -0
- /package/src/{skills → tools}/code-review/agents/test-coverage-analyzer/AGENT.md +0 -0
- /package/src/{skills → tools}/code-review/agents/test-coverage-analyzer/AGENT.yaml +0 -0
- /package/src/{skills → tools}/code-review/agents/type-reviewer/AGENT.md +0 -0
- /package/src/{skills → tools}/code-review/agents/type-reviewer/AGENT.yaml +0 -0
- /package/src/{skills → tools/code-review/skills}/code-review/SKILL.md +0 -0
- /package/src/{skills → tools/code-review/skills}/code-review/SKILL.yaml +0 -0
- /package/src/{skills → tools}/comments/commands/README.md +0 -0
- /package/src/{skills → tools}/comments/commands/comments.md +0 -0
- /package/src/{skills → tools/comments/skills}/comments/SKILL.md +0 -0
- /package/src/{skills → tools/comments/skills}/comments/SKILL.yaml +0 -0
- /package/src/{skills → tools}/project/commands/README.md +0 -0
- /package/src/{skills → tools}/project/commands/project.md +0 -0
- /package/src/{skills → tools/project/skills}/project/SKILL.md +0 -0
- /package/src/{skills → tools/project/skills}/project/SKILL.yaml +0 -0
- /package/src/{skills → tools/project/skills}/project/references/changelog.md +0 -0
- /package/src/{skills → tools/project/skills}/project/references/creating.md +0 -0
- /package/src/{skills → tools/project/skills}/project/references/loading.md +0 -0
- /package/src/{skills → tools/project/skills}/project/references/templates.md +0 -0
- /package/src/{skills → tools/project/skills}/project/references/updating.md +0 -0
- /package/src/{skills → tools/project/skills}/project/references/versioning.md +0 -0
package/src/commands/setup.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { join } from 'path';
|
|
|
6
6
|
import { homedir } from 'os';
|
|
7
7
|
import { loadConfig, saveConfig, configExists } from '../lib/config.js';
|
|
8
8
|
import { getBundledSkills } from '../lib/skills.js';
|
|
9
|
-
import {
|
|
9
|
+
import { Platform, BuiltInOutput, type DroidConfig, type OutputPreference } from '../lib/types.js';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Permissions droid needs to operate without constant prompts
|
|
@@ -20,19 +20,19 @@ const DROID_PERMISSIONS = [
|
|
|
20
20
|
];
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
|
-
* Detect which
|
|
23
|
+
* Detect which platform is installed
|
|
24
24
|
*/
|
|
25
|
-
function
|
|
25
|
+
function detectPlatform(): Platform | null {
|
|
26
26
|
try {
|
|
27
27
|
execSync('claude --version', { stdio: 'ignore' });
|
|
28
|
-
return
|
|
28
|
+
return Platform.ClaudeCode;
|
|
29
29
|
} catch {
|
|
30
30
|
// Claude Code not found
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
try {
|
|
34
34
|
execSync('opencode --version', { stdio: 'ignore' });
|
|
35
|
-
return
|
|
35
|
+
return Platform.OpenCode;
|
|
36
36
|
} catch {
|
|
37
37
|
// OpenCode not found
|
|
38
38
|
}
|
|
@@ -59,12 +59,12 @@ function detectGitUsername(): string {
|
|
|
59
59
|
const OPENCODE_SKILLS_PLUGIN = 'opencode-skills';
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
|
-
* Configure
|
|
62
|
+
* Configure platform permissions for droid
|
|
63
63
|
*/
|
|
64
|
-
export function
|
|
64
|
+
export function configurePlatformPermissions(platform: Platform): { added: string[]; alreadyPresent: boolean; error?: string } {
|
|
65
65
|
const added: string[] = [];
|
|
66
66
|
|
|
67
|
-
if (
|
|
67
|
+
if (platform === Platform.ClaudeCode) {
|
|
68
68
|
const settingsPath = join(homedir(), '.claude', 'settings.json');
|
|
69
69
|
|
|
70
70
|
// Ensure .claude directory exists
|
|
@@ -113,7 +113,7 @@ export function configureAIToolPermissions(aiTool: AITool): { added: string[]; a
|
|
|
113
113
|
return { added, alreadyPresent: added.length === 0 };
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
if (
|
|
116
|
+
if (platform === Platform.OpenCode) {
|
|
117
117
|
// OpenCode uses opencode.json for config
|
|
118
118
|
// Check global config location: ~/.config/opencode/opencode.json
|
|
119
119
|
const globalConfigDir = join(homedir(), '.config', 'opencode');
|
|
@@ -188,8 +188,8 @@ function getOutputOptions(): Array<{ name: string; value: OutputPreference }> {
|
|
|
188
188
|
export async function setupCommand(): Promise<void> {
|
|
189
189
|
console.log(chalk.bold('\n🤖 Droid Setup\n'));
|
|
190
190
|
|
|
191
|
-
const
|
|
192
|
-
if (
|
|
191
|
+
const hasExistingConfig = configExists();
|
|
192
|
+
if (hasExistingConfig) {
|
|
193
193
|
const { overwrite } = await inquirer.prompt<{ overwrite: boolean }>([
|
|
194
194
|
{
|
|
195
195
|
type: 'confirm',
|
|
@@ -205,12 +205,12 @@ export async function setupCommand(): Promise<void> {
|
|
|
205
205
|
}
|
|
206
206
|
}
|
|
207
207
|
|
|
208
|
-
// Detect
|
|
209
|
-
const
|
|
210
|
-
if (
|
|
211
|
-
console.log(chalk.green(`✓ Detected ${
|
|
208
|
+
// Detect platform
|
|
209
|
+
const detectedPlatform = detectPlatform();
|
|
210
|
+
if (detectedPlatform) {
|
|
211
|
+
console.log(chalk.green(`✓ Detected ${detectedPlatform}\n`));
|
|
212
212
|
} else {
|
|
213
|
-
console.log(chalk.yellow('⚠ No
|
|
213
|
+
console.log(chalk.yellow('⚠ No platform detected (Claude Code or OpenCode)\n'));
|
|
214
214
|
}
|
|
215
215
|
|
|
216
216
|
// Detect git username
|
|
@@ -220,20 +220,20 @@ export async function setupCommand(): Promise<void> {
|
|
|
220
220
|
const outputOptions = getOutputOptions();
|
|
221
221
|
|
|
222
222
|
const answers = await inquirer.prompt<{
|
|
223
|
-
|
|
223
|
+
platform: Platform;
|
|
224
224
|
user_mention: string;
|
|
225
225
|
output_preference: OutputPreference;
|
|
226
226
|
git_username: string;
|
|
227
227
|
}>([
|
|
228
228
|
{
|
|
229
229
|
type: 'list',
|
|
230
|
-
name: '
|
|
231
|
-
message: 'Which
|
|
230
|
+
name: 'platform',
|
|
231
|
+
message: 'Which platform are you using?',
|
|
232
232
|
choices: [
|
|
233
|
-
{ name: 'Claude Code', value:
|
|
234
|
-
{ name: 'OpenCode', value:
|
|
233
|
+
{ name: 'Claude Code', value: Platform.ClaudeCode },
|
|
234
|
+
{ name: 'OpenCode', value: Platform.OpenCode },
|
|
235
235
|
],
|
|
236
|
-
default:
|
|
236
|
+
default: detectedPlatform || Platform.ClaudeCode,
|
|
237
237
|
},
|
|
238
238
|
{
|
|
239
239
|
type: 'input',
|
|
@@ -260,27 +260,31 @@ export async function setupCommand(): Promise<void> {
|
|
|
260
260
|
},
|
|
261
261
|
]);
|
|
262
262
|
|
|
263
|
+
const existingConfig = loadConfig();
|
|
263
264
|
const config: DroidConfig = {
|
|
264
|
-
...
|
|
265
|
-
|
|
265
|
+
...existingConfig,
|
|
266
|
+
platform: answers.platform,
|
|
267
|
+
user_mention: answers.user_mention,
|
|
268
|
+
output_preference: answers.output_preference,
|
|
269
|
+
git_username: answers.git_username,
|
|
266
270
|
};
|
|
267
271
|
|
|
268
272
|
saveConfig(config);
|
|
269
273
|
|
|
270
274
|
console.log(chalk.green('\n✓ Config saved to ~/.droid/config.yaml'));
|
|
271
275
|
|
|
272
|
-
// Configure
|
|
273
|
-
const { added, alreadyPresent, error } =
|
|
276
|
+
// Configure platform permissions/plugins
|
|
277
|
+
const { added, alreadyPresent, error } = configurePlatformPermissions(answers.platform);
|
|
274
278
|
if (error) {
|
|
275
279
|
console.log(chalk.red(`✗ ${error}`));
|
|
276
|
-
console.log(chalk.yellow(' You may need to manually configure your
|
|
277
|
-
} else if (answers.
|
|
280
|
+
console.log(chalk.yellow(' You may need to manually configure your platform'));
|
|
281
|
+
} else if (answers.platform === Platform.ClaudeCode) {
|
|
278
282
|
if (added.length > 0) {
|
|
279
283
|
console.log(chalk.green(`✓ Added droid permissions to Claude Code settings`));
|
|
280
284
|
} else if (alreadyPresent) {
|
|
281
285
|
console.log(chalk.gray(` Droid permissions already configured in Claude Code`));
|
|
282
286
|
}
|
|
283
|
-
} else if (answers.
|
|
287
|
+
} else if (answers.platform === Platform.OpenCode) {
|
|
284
288
|
if (added.length > 0) {
|
|
285
289
|
console.log(chalk.green(`✓ Added opencode-skills plugin to OpenCode config`));
|
|
286
290
|
console.log(chalk.gray(` This enables Claude Code-style skills in OpenCode`));
|
package/src/commands/skills.ts
CHANGED
|
@@ -1,59 +1,49 @@
|
|
|
1
1
|
import inquirer from 'inquirer';
|
|
2
2
|
import chalk from 'chalk';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
getBundledSkills,
|
|
6
|
-
getBundledSkillsDir,
|
|
7
|
-
isSkillInstalled,
|
|
8
|
-
getInstalledSkill,
|
|
9
|
-
getSkillStatusDisplay,
|
|
10
|
-
installSkill,
|
|
11
|
-
uninstallSkill,
|
|
12
|
-
loadSkillManifest,
|
|
13
|
-
} from '../lib/skills.js';
|
|
3
|
+
import { installSkill, uninstallSkill } from '../lib/skills.js';
|
|
4
|
+
import { getBundledTools, isToolInstalled, getInstalledToolVersion } from '../lib/tools.js';
|
|
14
5
|
import { promptForSkillConfig } from '../lib/skill-config.js';
|
|
15
|
-
import { SkillStatus, type
|
|
6
|
+
import { SkillStatus, type ToolManifest } from '../lib/types.js';
|
|
16
7
|
|
|
17
|
-
function
|
|
18
|
-
const installed =
|
|
19
|
-
const
|
|
20
|
-
const statusDisplay = getSkillStatusDisplay(skill.status);
|
|
8
|
+
function formatToolChoice(tool: ToolManifest): string {
|
|
9
|
+
const installed = isToolInstalled(tool.name);
|
|
10
|
+
const installedVersion = getInstalledToolVersion(tool.name);
|
|
21
11
|
|
|
22
|
-
let line = `${
|
|
12
|
+
let line = `${tool.name}`;
|
|
23
13
|
|
|
24
|
-
if (installed &&
|
|
25
|
-
line += chalk.green(` [installed] v${
|
|
14
|
+
if (installed && installedVersion) {
|
|
15
|
+
line += chalk.green(` [installed] v${installedVersion}`);
|
|
26
16
|
} else {
|
|
27
|
-
line += chalk.gray(` v${
|
|
17
|
+
line += chalk.gray(` v${tool.version}`);
|
|
28
18
|
}
|
|
29
19
|
|
|
30
|
-
if (
|
|
31
|
-
const
|
|
32
|
-
|
|
20
|
+
if (tool.status) {
|
|
21
|
+
const statusColor =
|
|
22
|
+
tool.status === SkillStatus.Alpha
|
|
33
23
|
? chalk.red
|
|
34
|
-
:
|
|
24
|
+
: tool.status === SkillStatus.Beta
|
|
35
25
|
? chalk.yellow
|
|
36
26
|
: chalk.white;
|
|
37
|
-
line += ` ${
|
|
27
|
+
line += statusColor(` [${tool.status}]`);
|
|
38
28
|
}
|
|
39
29
|
|
|
40
30
|
return line;
|
|
41
31
|
}
|
|
42
32
|
|
|
43
33
|
export async function skillsCommand(): Promise<void> {
|
|
44
|
-
const
|
|
34
|
+
const tools = getBundledTools();
|
|
45
35
|
|
|
46
|
-
if (
|
|
47
|
-
console.log(chalk.yellow('\nNo
|
|
36
|
+
if (tools.length === 0) {
|
|
37
|
+
console.log(chalk.yellow('\nNo tools available yet.'));
|
|
48
38
|
return;
|
|
49
39
|
}
|
|
50
40
|
|
|
51
|
-
console.log(chalk.bold('\n🤖 Available
|
|
41
|
+
console.log(chalk.bold('\n🤖 Available Tools\n'));
|
|
52
42
|
|
|
53
|
-
const
|
|
54
|
-
name:
|
|
55
|
-
value:
|
|
56
|
-
short:
|
|
43
|
+
const toolChoices = tools.map((tool) => ({
|
|
44
|
+
name: formatToolChoice(tool),
|
|
45
|
+
value: tool.name,
|
|
46
|
+
short: tool.name,
|
|
57
47
|
}));
|
|
58
48
|
|
|
59
49
|
const choices = [
|
|
@@ -62,42 +52,54 @@ export async function skillsCommand(): Promise<void> {
|
|
|
62
52
|
value: '__exit__',
|
|
63
53
|
short: 'Exit',
|
|
64
54
|
},
|
|
65
|
-
...
|
|
55
|
+
...toolChoices,
|
|
66
56
|
];
|
|
67
57
|
|
|
68
|
-
const {
|
|
58
|
+
const { selectedTool } = await inquirer.prompt<{ selectedTool: string }>([
|
|
69
59
|
{
|
|
70
60
|
type: 'list',
|
|
71
|
-
name: '
|
|
72
|
-
message: 'Select a
|
|
61
|
+
name: 'selectedTool',
|
|
62
|
+
message: 'Select a tool to view details or install:',
|
|
73
63
|
choices,
|
|
74
64
|
pageSize: 15,
|
|
75
65
|
},
|
|
76
66
|
]);
|
|
77
67
|
|
|
78
|
-
if (
|
|
68
|
+
if (selectedTool === '__exit__') {
|
|
79
69
|
return;
|
|
80
70
|
}
|
|
81
71
|
|
|
82
|
-
const
|
|
83
|
-
if (!
|
|
84
|
-
console.error(chalk.red('
|
|
72
|
+
const tool = tools.find((t) => t.name === selectedTool);
|
|
73
|
+
if (!tool) {
|
|
74
|
+
console.error(chalk.red('Tool not found'));
|
|
85
75
|
return;
|
|
86
76
|
}
|
|
87
77
|
|
|
88
|
-
// Show
|
|
89
|
-
console.log(chalk.bold(`\n📦 ${
|
|
90
|
-
console.log(chalk.gray(`Version: ${
|
|
91
|
-
if (
|
|
92
|
-
console.log(chalk.gray(`Status: ${
|
|
78
|
+
// Show tool details
|
|
79
|
+
console.log(chalk.bold(`\n📦 ${tool.name}`));
|
|
80
|
+
console.log(chalk.gray(`Version: ${tool.version}`));
|
|
81
|
+
if (tool.status) {
|
|
82
|
+
console.log(chalk.gray(`Status: ${tool.status}`));
|
|
93
83
|
}
|
|
94
|
-
console.log(`\n${
|
|
84
|
+
console.log(`\n${tool.description}`);
|
|
95
85
|
|
|
96
|
-
|
|
97
|
-
|
|
86
|
+
// Show what the tool includes
|
|
87
|
+
const skillNames = tool.includes.skills.map(s => s.name);
|
|
88
|
+
const commandNames = tool.includes.commands.map(c => `/${c}`);
|
|
89
|
+
const agentNames = tool.includes.agents;
|
|
90
|
+
|
|
91
|
+
if (skillNames.length > 0) {
|
|
92
|
+
console.log(chalk.gray(`\nSkills: ${skillNames.join(', ')}`));
|
|
93
|
+
}
|
|
94
|
+
if (commandNames.length > 0) {
|
|
95
|
+
console.log(chalk.gray(`Commands: ${commandNames.join(', ')}`));
|
|
96
|
+
}
|
|
97
|
+
if (agentNames.length > 0) {
|
|
98
|
+
console.log(chalk.gray(`Agents: ${agentNames.join(', ')}`));
|
|
98
99
|
}
|
|
99
100
|
|
|
100
|
-
const installed =
|
|
101
|
+
const installed = isToolInstalled(tool.name);
|
|
102
|
+
const primarySkill = tool.includes.skills.find(s => s.required)?.name || tool.name;
|
|
101
103
|
|
|
102
104
|
const actions = installed
|
|
103
105
|
? [
|
|
@@ -121,17 +123,15 @@ export async function skillsCommand(): Promise<void> {
|
|
|
121
123
|
|
|
122
124
|
switch (action) {
|
|
123
125
|
case 'install': {
|
|
124
|
-
const result = installSkill(
|
|
126
|
+
const result = installSkill(primarySkill);
|
|
125
127
|
if (result.success) {
|
|
126
|
-
console.log(chalk.green(`\n✓ ${
|
|
127
|
-
// Prompt for config if
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
// If any config option lacks a default, go straight to config (it's required)
|
|
131
|
-
const hasRequiredConfig = Object.values(manifest.config_schema).some(
|
|
128
|
+
console.log(chalk.green(`\n✓ Installed ${tool.name}`));
|
|
129
|
+
// Prompt for config if tool has options
|
|
130
|
+
if (tool.config_schema && Object.keys(tool.config_schema).length > 0) {
|
|
131
|
+
const hasRequiredConfig = Object.values(tool.config_schema).some(
|
|
132
132
|
(option) => option.default === undefined
|
|
133
133
|
);
|
|
134
|
-
await promptForSkillConfig(
|
|
134
|
+
await promptForSkillConfig(primarySkill, tool.config_schema, !hasRequiredConfig);
|
|
135
135
|
}
|
|
136
136
|
} else {
|
|
137
137
|
console.log(chalk.red(`\n✗ ${result.message}`));
|
|
@@ -139,18 +139,17 @@ export async function skillsCommand(): Promise<void> {
|
|
|
139
139
|
break;
|
|
140
140
|
}
|
|
141
141
|
case 'configure': {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
await promptForSkillConfig(skill.name, manifest.config_schema, false);
|
|
142
|
+
if (tool.config_schema && Object.keys(tool.config_schema).length > 0) {
|
|
143
|
+
await promptForSkillConfig(primarySkill, tool.config_schema, false);
|
|
145
144
|
} else {
|
|
146
|
-
console.log(chalk.gray('\nThis
|
|
145
|
+
console.log(chalk.gray('\nThis tool has no configuration options.'));
|
|
147
146
|
}
|
|
148
147
|
break;
|
|
149
148
|
}
|
|
150
149
|
case 'uninstall': {
|
|
151
|
-
const result = uninstallSkill(
|
|
150
|
+
const result = uninstallSkill(primarySkill);
|
|
152
151
|
if (result.success) {
|
|
153
|
-
console.log(chalk.green(`\n✓ ${
|
|
152
|
+
console.log(chalk.green(`\n✓ Uninstalled ${tool.name}`));
|
|
154
153
|
} else {
|
|
155
154
|
console.log(chalk.red(`\n✗ ${result.message}`));
|
|
156
155
|
}
|