@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.
Files changed (167) hide show
  1. package/.claude/CLAUDE.md +13 -6
  2. package/CHANGELOG.md +21 -0
  3. package/README.md +23 -24
  4. package/dist/bin/droid.js +9 -9
  5. package/dist/bin/droid.js.map +1 -1
  6. package/dist/commands/install.d.ts +1 -1
  7. package/dist/commands/install.d.ts.map +1 -1
  8. package/dist/commands/install.js +24 -23
  9. package/dist/commands/install.js.map +1 -1
  10. package/dist/commands/setup.d.ts +3 -3
  11. package/dist/commands/setup.d.ts.map +1 -1
  12. package/dist/commands/setup.js +32 -28
  13. package/dist/commands/setup.js.map +1 -1
  14. package/dist/commands/skills.d.ts.map +1 -1
  15. package/dist/commands/skills.js +60 -53
  16. package/dist/commands/skills.js.map +1 -1
  17. package/dist/commands/tui.d.ts.map +1 -1
  18. package/dist/commands/tui.js +213 -319
  19. package/dist/commands/tui.js.map +1 -1
  20. package/dist/commands/uninstall.d.ts +1 -1
  21. package/dist/commands/uninstall.d.ts.map +1 -1
  22. package/dist/commands/uninstall.js +15 -6
  23. package/dist/commands/uninstall.js.map +1 -1
  24. package/dist/commands/update.d.ts +2 -2
  25. package/dist/commands/update.d.ts.map +1 -1
  26. package/dist/commands/update.js +9 -9
  27. package/dist/commands/update.js.map +1 -1
  28. package/dist/lib/agents.d.ts +11 -10
  29. package/dist/lib/agents.d.ts.map +1 -1
  30. package/dist/lib/agents.js +52 -54
  31. package/dist/lib/agents.js.map +1 -1
  32. package/dist/lib/config.d.ts +1 -0
  33. package/dist/lib/config.d.ts.map +1 -1
  34. package/dist/lib/config.js +42 -5
  35. package/dist/lib/config.js.map +1 -1
  36. package/dist/lib/platforms.d.ts +41 -0
  37. package/dist/lib/platforms.d.ts.map +1 -0
  38. package/dist/lib/platforms.js +52 -0
  39. package/dist/lib/platforms.js.map +1 -0
  40. package/dist/lib/skills.d.ts +19 -11
  41. package/dist/lib/skills.d.ts.map +1 -1
  42. package/dist/lib/skills.js +127 -106
  43. package/dist/lib/skills.js.map +1 -1
  44. package/dist/lib/tools.d.ts +30 -0
  45. package/dist/lib/tools.d.ts.map +1 -0
  46. package/dist/lib/tools.js +116 -0
  47. package/dist/lib/tools.js.map +1 -0
  48. package/dist/lib/types.d.ts +45 -2
  49. package/dist/lib/types.d.ts.map +1 -1
  50. package/dist/lib/types.js +24 -5
  51. package/dist/lib/types.js.map +1 -1
  52. package/dist/tools/brain/TOOL.yaml +27 -0
  53. package/dist/tools/coach/TOOL.yaml +21 -0
  54. package/dist/tools/code-review/TOOL.yaml +18 -0
  55. package/dist/{skills → tools}/code-review/commands/code-review.md +23 -1
  56. package/dist/tools/comments/TOOL.yaml +27 -0
  57. package/dist/tools/project/TOOL.yaml +26 -0
  58. package/package.json +2 -2
  59. package/src/bin/droid.ts +9 -9
  60. package/src/commands/install.ts +24 -23
  61. package/src/commands/setup.test.ts +2 -2
  62. package/src/commands/setup.ts +33 -29
  63. package/src/commands/skills.ts +63 -64
  64. package/src/commands/tui.tsx +432 -578
  65. package/src/commands/uninstall.ts +17 -6
  66. package/src/commands/update.ts +10 -10
  67. package/src/lib/agents.ts +58 -58
  68. package/src/lib/config.test.ts +0 -10
  69. package/src/lib/config.ts +47 -5
  70. package/src/lib/platforms.ts +59 -0
  71. package/src/lib/skills.test.ts +53 -28
  72. package/src/lib/skills.ts +136 -109
  73. package/src/lib/tools.ts +140 -0
  74. package/src/lib/types.test.ts +15 -7
  75. package/src/lib/types.ts +63 -2
  76. package/src/tools/brain/TOOL.yaml +27 -0
  77. package/src/tools/coach/TOOL.yaml +21 -0
  78. package/src/tools/code-review/TOOL.yaml +18 -0
  79. package/src/{skills → tools}/code-review/commands/code-review.md +23 -1
  80. package/src/tools/comments/TOOL.yaml +27 -0
  81. package/src/tools/project/TOOL.yaml +26 -0
  82. package/dist/agents/README.md +0 -137
  83. package/src/agents/README.md +0 -137
  84. /package/dist/{skills → tools}/README.md +0 -0
  85. /package/dist/{skills → tools}/brain/commands/README.md +0 -0
  86. /package/dist/{skills → tools}/brain/commands/brain.md +0 -0
  87. /package/dist/{skills → tools}/brain/commands/scratchpad.md +0 -0
  88. /package/dist/{skills → tools/brain/skills}/brain/SKILL.md +0 -0
  89. /package/dist/{skills → tools/brain/skills}/brain/SKILL.yaml +0 -0
  90. /package/dist/{skills → tools/brain/skills}/brain/references/metadata.md +0 -0
  91. /package/dist/{skills → tools/brain/skills}/brain/references/naming.md +0 -0
  92. /package/dist/{skills → tools/brain/skills}/brain/references/templates.md +0 -0
  93. /package/dist/{skills → tools/brain/skills}/brain/references/workflows.md +0 -0
  94. /package/dist/{skills → tools/brain/skills}/brain-obsidian/SKILL.md +0 -0
  95. /package/dist/{skills → tools/brain/skills}/brain-obsidian/SKILL.yaml +0 -0
  96. /package/dist/{skills → tools/brain/skills}/brain-obsidian/references/templates.md +0 -0
  97. /package/dist/{skills → tools/brain/skills}/brain-obsidian/references/workflows.md +0 -0
  98. /package/dist/{skills → tools}/coach/commands/README.md +0 -0
  99. /package/dist/{skills → tools}/coach/commands/coach.md +0 -0
  100. /package/dist/{skills → tools/coach/skills}/coach/SKILL.md +0 -0
  101. /package/dist/{skills → tools/coach/skills}/coach/SKILL.yaml +0 -0
  102. /package/dist/{skills → tools}/code-review/agents/edi-standards-reviewer/AGENT.md +0 -0
  103. /package/dist/{skills → tools}/code-review/agents/edi-standards-reviewer/AGENT.yaml +0 -0
  104. /package/dist/{skills → tools}/code-review/agents/error-handling-reviewer/AGENT.md +0 -0
  105. /package/dist/{skills → tools}/code-review/agents/error-handling-reviewer/AGENT.yaml +0 -0
  106. /package/dist/{skills → tools}/code-review/agents/test-coverage-analyzer/AGENT.md +0 -0
  107. /package/dist/{skills → tools}/code-review/agents/test-coverage-analyzer/AGENT.yaml +0 -0
  108. /package/dist/{skills → tools}/code-review/agents/type-reviewer/AGENT.md +0 -0
  109. /package/dist/{skills → tools}/code-review/agents/type-reviewer/AGENT.yaml +0 -0
  110. /package/dist/{skills → tools/code-review/skills}/code-review/SKILL.md +0 -0
  111. /package/dist/{skills → tools/code-review/skills}/code-review/SKILL.yaml +0 -0
  112. /package/dist/{skills → tools}/comments/commands/README.md +0 -0
  113. /package/dist/{skills → tools}/comments/commands/comments.md +0 -0
  114. /package/dist/{skills → tools/comments/skills}/comments/SKILL.md +0 -0
  115. /package/dist/{skills → tools/comments/skills}/comments/SKILL.yaml +0 -0
  116. /package/dist/{skills → tools}/project/commands/README.md +0 -0
  117. /package/dist/{skills → tools}/project/commands/project.md +0 -0
  118. /package/dist/{skills → tools/project/skills}/project/SKILL.md +0 -0
  119. /package/dist/{skills → tools/project/skills}/project/SKILL.yaml +0 -0
  120. /package/dist/{skills → tools/project/skills}/project/references/changelog.md +0 -0
  121. /package/dist/{skills → tools/project/skills}/project/references/creating.md +0 -0
  122. /package/dist/{skills → tools/project/skills}/project/references/loading.md +0 -0
  123. /package/dist/{skills → tools/project/skills}/project/references/templates.md +0 -0
  124. /package/dist/{skills → tools/project/skills}/project/references/updating.md +0 -0
  125. /package/dist/{skills → tools/project/skills}/project/references/versioning.md +0 -0
  126. /package/src/{skills → tools}/README.md +0 -0
  127. /package/src/{skills → tools}/brain/commands/README.md +0 -0
  128. /package/src/{skills → tools}/brain/commands/brain.md +0 -0
  129. /package/src/{skills → tools}/brain/commands/scratchpad.md +0 -0
  130. /package/src/{skills → tools/brain/skills}/brain/SKILL.md +0 -0
  131. /package/src/{skills → tools/brain/skills}/brain/SKILL.yaml +0 -0
  132. /package/src/{skills → tools/brain/skills}/brain/references/metadata.md +0 -0
  133. /package/src/{skills → tools/brain/skills}/brain/references/naming.md +0 -0
  134. /package/src/{skills → tools/brain/skills}/brain/references/templates.md +0 -0
  135. /package/src/{skills → tools/brain/skills}/brain/references/workflows.md +0 -0
  136. /package/src/{skills → tools/brain/skills}/brain-obsidian/SKILL.md +0 -0
  137. /package/src/{skills → tools/brain/skills}/brain-obsidian/SKILL.yaml +0 -0
  138. /package/src/{skills → tools/brain/skills}/brain-obsidian/references/templates.md +0 -0
  139. /package/src/{skills → tools/brain/skills}/brain-obsidian/references/workflows.md +0 -0
  140. /package/src/{skills → tools}/coach/commands/README.md +0 -0
  141. /package/src/{skills → tools}/coach/commands/coach.md +0 -0
  142. /package/src/{skills → tools/coach/skills}/coach/SKILL.md +0 -0
  143. /package/src/{skills → tools/coach/skills}/coach/SKILL.yaml +0 -0
  144. /package/src/{skills → tools}/code-review/agents/edi-standards-reviewer/AGENT.md +0 -0
  145. /package/src/{skills → tools}/code-review/agents/edi-standards-reviewer/AGENT.yaml +0 -0
  146. /package/src/{skills → tools}/code-review/agents/error-handling-reviewer/AGENT.md +0 -0
  147. /package/src/{skills → tools}/code-review/agents/error-handling-reviewer/AGENT.yaml +0 -0
  148. /package/src/{skills → tools}/code-review/agents/test-coverage-analyzer/AGENT.md +0 -0
  149. /package/src/{skills → tools}/code-review/agents/test-coverage-analyzer/AGENT.yaml +0 -0
  150. /package/src/{skills → tools}/code-review/agents/type-reviewer/AGENT.md +0 -0
  151. /package/src/{skills → tools}/code-review/agents/type-reviewer/AGENT.yaml +0 -0
  152. /package/src/{skills → tools/code-review/skills}/code-review/SKILL.md +0 -0
  153. /package/src/{skills → tools/code-review/skills}/code-review/SKILL.yaml +0 -0
  154. /package/src/{skills → tools}/comments/commands/README.md +0 -0
  155. /package/src/{skills → tools}/comments/commands/comments.md +0 -0
  156. /package/src/{skills → tools/comments/skills}/comments/SKILL.md +0 -0
  157. /package/src/{skills → tools/comments/skills}/comments/SKILL.yaml +0 -0
  158. /package/src/{skills → tools}/project/commands/README.md +0 -0
  159. /package/src/{skills → tools}/project/commands/project.md +0 -0
  160. /package/src/{skills → tools/project/skills}/project/SKILL.md +0 -0
  161. /package/src/{skills → tools/project/skills}/project/SKILL.yaml +0 -0
  162. /package/src/{skills → tools/project/skills}/project/references/changelog.md +0 -0
  163. /package/src/{skills → tools/project/skills}/project/references/creating.md +0 -0
  164. /package/src/{skills → tools/project/skills}/project/references/loading.md +0 -0
  165. /package/src/{skills → tools/project/skills}/project/references/templates.md +0 -0
  166. /package/src/{skills → tools/project/skills}/project/references/updating.md +0 -0
  167. /package/src/{skills → tools/project/skills}/project/references/versioning.md +0 -0
@@ -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 { AITool, BuiltInOutput, type DroidConfig, type OutputPreference } from '../lib/types.js';
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 AI tool is installed
23
+ * Detect which platform is installed
24
24
  */
25
- function detectAITool(): AITool | null {
25
+ function detectPlatform(): Platform | null {
26
26
  try {
27
27
  execSync('claude --version', { stdio: 'ignore' });
28
- return AITool.ClaudeCode;
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 AITool.OpenCode;
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 AI tool permissions for droid
62
+ * Configure platform permissions for droid
63
63
  */
64
- export function configureAIToolPermissions(aiTool: AITool): { added: string[]; alreadyPresent: boolean; error?: string } {
64
+ export function configurePlatformPermissions(platform: Platform): { added: string[]; alreadyPresent: boolean; error?: string } {
65
65
  const added: string[] = [];
66
66
 
67
- if (aiTool === AITool.ClaudeCode) {
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 (aiTool === AITool.OpenCode) {
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 existingConfig = configExists();
192
- if (existingConfig) {
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 AI tool
209
- const detectedTool = detectAITool();
210
- if (detectedTool) {
211
- console.log(chalk.green(`✓ Detected ${detectedTool}\n`));
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 AI tool detected (Claude Code or OpenCode)\n'));
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
- ai_tool: AITool;
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: 'ai_tool',
231
- message: 'Which AI tool are you using?',
230
+ name: 'platform',
231
+ message: 'Which platform are you using?',
232
232
  choices: [
233
- { name: 'Claude Code', value: AITool.ClaudeCode },
234
- { name: 'OpenCode', value: AITool.OpenCode },
233
+ { name: 'Claude Code', value: Platform.ClaudeCode },
234
+ { name: 'OpenCode', value: Platform.OpenCode },
235
235
  ],
236
- default: detectedTool || AITool.ClaudeCode,
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
- ...loadConfig(),
265
- ...answers,
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 AI tool permissions/plugins
273
- const { added, alreadyPresent, error } = configureAIToolPermissions(answers.ai_tool);
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 AI tool'));
277
- } else if (answers.ai_tool === AITool.ClaudeCode) {
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.ai_tool === AITool.OpenCode) {
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`));
@@ -1,59 +1,49 @@
1
1
  import inquirer from 'inquirer';
2
2
  import chalk from 'chalk';
3
- import { join } from 'path';
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 SkillManifest } from '../lib/types.js';
6
+ import { SkillStatus, type ToolManifest } from '../lib/types.js';
16
7
 
17
- function formatSkillChoice(skill: SkillManifest): string {
18
- const installed = isSkillInstalled(skill.name);
19
- const installedInfo = getInstalledSkill(skill.name);
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 = `${skill.name}`;
12
+ let line = `${tool.name}`;
23
13
 
24
- if (installed && installedInfo) {
25
- line += chalk.green(` [installed] v${installedInfo.version}`);
14
+ if (installed && installedVersion) {
15
+ line += chalk.green(` [installed] v${installedVersion}`);
26
16
  } else {
27
- line += chalk.gray(` v${skill.version}`);
17
+ line += chalk.gray(` v${tool.version}`);
28
18
  }
29
19
 
30
- if (statusDisplay) {
31
- const color =
32
- skill.status === SkillStatus.Alpha
20
+ if (tool.status) {
21
+ const statusColor =
22
+ tool.status === SkillStatus.Alpha
33
23
  ? chalk.red
34
- : skill.status === SkillStatus.Beta
24
+ : tool.status === SkillStatus.Beta
35
25
  ? chalk.yellow
36
26
  : chalk.white;
37
- line += ` ${color(statusDisplay)}`;
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 skills = getBundledSkills();
34
+ const tools = getBundledTools();
45
35
 
46
- if (skills.length === 0) {
47
- console.log(chalk.yellow('\nNo skills available yet.'));
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 Skills\n'));
41
+ console.log(chalk.bold('\n🤖 Available Tools\n'));
52
42
 
53
- const skillChoices = skills.map((skill) => ({
54
- name: formatSkillChoice(skill),
55
- value: skill.name,
56
- short: skill.name,
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
- ...skillChoices,
55
+ ...toolChoices,
66
56
  ];
67
57
 
68
- const { selectedSkill } = await inquirer.prompt<{ selectedSkill: string }>([
58
+ const { selectedTool } = await inquirer.prompt<{ selectedTool: string }>([
69
59
  {
70
60
  type: 'list',
71
- name: 'selectedSkill',
72
- message: 'Select a skill to view details or install:',
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 (selectedSkill === '__exit__') {
68
+ if (selectedTool === '__exit__') {
79
69
  return;
80
70
  }
81
71
 
82
- const skill = skills.find((s) => s.name === selectedSkill);
83
- if (!skill) {
84
- console.error(chalk.red('Skill not found'));
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 skill details
89
- console.log(chalk.bold(`\n📦 ${skill.name}`));
90
- console.log(chalk.gray(`Version: ${skill.version}`));
91
- if (skill.status) {
92
- console.log(chalk.gray(`Status: ${skill.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${skill.description}`);
84
+ console.log(`\n${tool.description}`);
95
85
 
96
- if (skill.dependencies && skill.dependencies.length > 0) {
97
- console.log(chalk.gray(`\nDependencies: ${skill.dependencies.join(', ')}`));
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 = isSkillInstalled(skill.name);
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(skill.name);
126
+ const result = installSkill(primarySkill);
125
127
  if (result.success) {
126
- console.log(chalk.green(`\n✓ ${result.message}`));
127
- // Prompt for config if skill has options
128
- const manifest = loadSkillManifest(join(getBundledSkillsDir(), skill.name));
129
- if (manifest?.config_schema && Object.keys(manifest.config_schema).length > 0) {
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(skill.name, manifest.config_schema, !hasRequiredConfig);
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
- const manifest = loadSkillManifest(join(getBundledSkillsDir(), skill.name));
143
- if (manifest?.config_schema && Object.keys(manifest.config_schema).length > 0) {
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 skill has no configuration options.'));
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(skill.name);
150
+ const result = uninstallSkill(primarySkill);
152
151
  if (result.success) {
153
- console.log(chalk.green(`\n✓ ${result.message}`));
152
+ console.log(chalk.green(`\n✓ Uninstalled ${tool.name}`));
154
153
  } else {
155
154
  console.log(chalk.red(`\n✗ ${result.message}`));
156
155
  }