@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.
Files changed (73) hide show
  1. package/.claude/CLAUDE.md +3 -43
  2. package/AGENTS.md +75 -0
  3. package/CHANGELOG.md +12 -0
  4. package/dist/bin/droid.js +3064 -54
  5. package/dist/index.js +952 -6
  6. package/package.json +2 -2
  7. package/scripts/build.ts +78 -0
  8. package/dist/bin/droid.js.map +0 -1
  9. package/dist/commands/config.js +0 -67
  10. package/dist/commands/config.js.map +0 -1
  11. package/dist/commands/install.js +0 -45
  12. package/dist/commands/install.js.map +0 -1
  13. package/dist/commands/setup.js +0 -269
  14. package/dist/commands/setup.js.map +0 -1
  15. package/dist/commands/skills.js +0 -144
  16. package/dist/commands/skills.js.map +0 -1
  17. package/dist/commands/tui/components/Badge.js +0 -29
  18. package/dist/commands/tui/components/Badge.js.map +0 -1
  19. package/dist/commands/tui/components/Markdown.js +0 -42
  20. package/dist/commands/tui/components/Markdown.js.map +0 -1
  21. package/dist/commands/tui/components/SettingsDetails.js +0 -11
  22. package/dist/commands/tui/components/SettingsDetails.js.map +0 -1
  23. package/dist/commands/tui/components/TabBar.js +0 -7
  24. package/dist/commands/tui/components/TabBar.js.map +0 -1
  25. package/dist/commands/tui/components/ToolDetails.js +0 -35
  26. package/dist/commands/tui/components/ToolDetails.js.map +0 -1
  27. package/dist/commands/tui/components/ToolItem.js +0 -11
  28. package/dist/commands/tui/components/ToolItem.js.map +0 -1
  29. package/dist/commands/tui/constants.js +0 -17
  30. package/dist/commands/tui/constants.js.map +0 -1
  31. package/dist/commands/tui/hooks/useAppUpdate.js +0 -52
  32. package/dist/commands/tui/hooks/useAppUpdate.js.map +0 -1
  33. package/dist/commands/tui/hooks/useToolUpdates.js +0 -77
  34. package/dist/commands/tui/hooks/useToolUpdates.js.map +0 -1
  35. package/dist/commands/tui/types.js +0 -2
  36. package/dist/commands/tui/types.js.map +0 -1
  37. package/dist/commands/tui/views/ReadmeViewer.js +0 -56
  38. package/dist/commands/tui/views/ReadmeViewer.js.map +0 -1
  39. package/dist/commands/tui/views/SetupScreen.js +0 -114
  40. package/dist/commands/tui/views/SetupScreen.js.map +0 -1
  41. package/dist/commands/tui/views/SkillConfigScreen.js +0 -148
  42. package/dist/commands/tui/views/SkillConfigScreen.js.map +0 -1
  43. package/dist/commands/tui/views/ToolExplorer.js +0 -86
  44. package/dist/commands/tui/views/ToolExplorer.js.map +0 -1
  45. package/dist/commands/tui/views/ToolUpdatePrompt.js +0 -38
  46. package/dist/commands/tui/views/ToolUpdatePrompt.js.map +0 -1
  47. package/dist/commands/tui/views/WelcomeScreen.js +0 -46
  48. package/dist/commands/tui/views/WelcomeScreen.js.map +0 -1
  49. package/dist/commands/tui.js +0 -307
  50. package/dist/commands/tui.js.map +0 -1
  51. package/dist/commands/uninstall.js +0 -26
  52. package/dist/commands/uninstall.js.map +0 -1
  53. package/dist/commands/update.js +0 -45
  54. package/dist/commands/update.js.map +0 -1
  55. package/dist/index.js.map +0 -1
  56. package/dist/lib/agents.js +0 -248
  57. package/dist/lib/agents.js.map +0 -1
  58. package/dist/lib/config.js +0 -196
  59. package/dist/lib/config.js.map +0 -1
  60. package/dist/lib/platforms.js +0 -52
  61. package/dist/lib/platforms.js.map +0 -1
  62. package/dist/lib/quotes.js +0 -24
  63. package/dist/lib/quotes.js.map +0 -1
  64. package/dist/lib/skill-config.js +0 -80
  65. package/dist/lib/skill-config.js.map +0 -1
  66. package/dist/lib/skills.js +0 -582
  67. package/dist/lib/skills.js.map +0 -1
  68. package/dist/lib/tools.js +0 -145
  69. package/dist/lib/tools.js.map +0 -1
  70. package/dist/lib/types.js +0 -50
  71. package/dist/lib/types.js.map +0 -1
  72. package/dist/lib/version.js +0 -100
  73. package/dist/lib/version.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderful/droid",
3
- "version": "0.16.0",
3
+ "version": "0.16.1",
4
4
  "description": "AI workflow toolkit for sharing skills, commands, and agents across the team",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "main": "dist/index.js",
10
10
  "scripts": {
11
- "build": "eslint src --ext .ts,.tsx && tsc && cp -r src/tools dist/",
11
+ "build": "bun run lint && bun scripts/build.ts",
12
12
  "dev": "tsc --watch",
13
13
  "start": "bun dist/bin/droid.js",
14
14
  "test": "bun test src/",
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Build script using esbuild for proper ESM bundling
4
+ *
5
+ * This bundles the CLI entry point so Node ESM can resolve imports
6
+ * without explicit .js extensions (which TypeScript doesn't add).
7
+ */
8
+
9
+ import { build, type Plugin } from 'esbuild';
10
+ import { execSync } from 'child_process';
11
+ import { cpSync, rmSync } from 'fs';
12
+
13
+ // Plugin to stub out optional dependencies that may not be installed
14
+ const stubOptionalDeps: Plugin = {
15
+ name: 'stub-optional-deps',
16
+ setup(build) {
17
+ // Stub react-devtools-core (optional Ink dependency for debugging)
18
+ build.onResolve({ filter: /^react-devtools-core$/ }, () => ({
19
+ path: 'react-devtools-core',
20
+ namespace: 'stub',
21
+ }));
22
+ build.onLoad({ filter: /.*/, namespace: 'stub' }, () => ({
23
+ contents: 'export default undefined; export const connectToDevTools = () => {};',
24
+ }));
25
+ },
26
+ };
27
+
28
+ async function main() {
29
+ // Clean dist
30
+ rmSync('dist', { recursive: true, force: true });
31
+
32
+ // Run TypeScript for type checking and declaration files
33
+ console.log('Running TypeScript type check...');
34
+ execSync('tsc --emitDeclarationOnly', { stdio: 'inherit' });
35
+
36
+ // Bundle CLI with esbuild
37
+ console.log('Bundling CLI with esbuild...');
38
+ await build({
39
+ entryPoints: ['src/bin/droid.ts'],
40
+ bundle: true,
41
+ platform: 'node',
42
+ target: 'node18',
43
+ format: 'esm',
44
+ outfile: 'dist/bin/droid.js',
45
+ // Note: shebang is preserved from source file, no banner needed
46
+ plugins: [stubOptionalDeps],
47
+ // Keep npm dependencies external - they'll be installed via package.json
48
+ // Only bundle our own code to fix ESM import resolution
49
+ packages: 'external',
50
+ // Handle React JSX
51
+ jsx: 'automatic',
52
+ jsxImportSource: 'react',
53
+ });
54
+
55
+ // Bundle index.ts for library exports
56
+ console.log('Bundling library exports...');
57
+ await build({
58
+ entryPoints: ['src/index.ts'],
59
+ bundle: true,
60
+ platform: 'node',
61
+ target: 'node18',
62
+ format: 'esm',
63
+ outfile: 'dist/index.js',
64
+ plugins: [stubOptionalDeps],
65
+ packages: 'external',
66
+ });
67
+
68
+ // Copy tools directory
69
+ console.log('Copying tools...');
70
+ cpSync('src/tools', 'dist/tools', { recursive: true });
71
+
72
+ console.log('Build complete!');
73
+ }
74
+
75
+ main().catch((err) => {
76
+ console.error(err);
77
+ process.exit(1);
78
+ });
@@ -1 +0,0 @@
1
- {"version":3,"file":"droid.js","sourceRoot":"","sources":["../../src/bin/droid.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAE7B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,oCAAoC,CAAC;KACjD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,YAAY,EAAE,uBAAuB,CAAC;KAC7C,MAAM,CAAC,iBAAiB,EAAE,6BAA6B,CAAC;KACxD,MAAM,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;KACrD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,kBAAkB,CAAC;KAC/B,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC;KACtC,MAAM,CAAC,OAAO,EAAE,qBAAqB,CAAC;KACtC,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC5C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,qCAAqC;AACrC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC9B,UAAU,EAAE,CAAC;AACf,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
@@ -1,67 +0,0 @@
1
- import chalk from 'chalk';
2
- import { execSync } from 'child_process';
3
- import { loadConfig, getConfigPath, getConfigValue, setConfigValue, configExists, } from '../lib/config';
4
- export async function configCommand(options) {
5
- // Handle --edit flag
6
- if (options.edit) {
7
- const configPath = getConfigPath();
8
- const editor = process.env.EDITOR || 'vim';
9
- if (!configExists()) {
10
- console.log(chalk.yellow('No config file exists yet. Run `droid setup` first.'));
11
- return;
12
- }
13
- console.log(chalk.gray(`Opening ${configPath} in ${editor}...`));
14
- try {
15
- execSync(`${editor} "${configPath}"`, { stdio: 'inherit' });
16
- }
17
- catch {
18
- console.error(chalk.red('Failed to open editor'));
19
- }
20
- return;
21
- }
22
- // Handle --get flag
23
- if (options.get) {
24
- const value = getConfigValue(options.get);
25
- if (value === undefined) {
26
- console.log(chalk.yellow(`Config key '${options.get}' not found`));
27
- process.exit(1);
28
- }
29
- if (typeof value === 'object') {
30
- console.log(JSON.stringify(value, null, 2));
31
- }
32
- else {
33
- console.log(value);
34
- }
35
- return;
36
- }
37
- // Handle --set flag
38
- if (options.set) {
39
- const match = options.set.match(/^([^=]+)=(.*)$/);
40
- if (!match) {
41
- console.error(chalk.red('Invalid format. Use: --set key=value'));
42
- process.exit(1);
43
- }
44
- const [, key, rawValue] = match;
45
- // Try to parse as JSON, otherwise use as string
46
- let value;
47
- try {
48
- value = JSON.parse(rawValue);
49
- }
50
- catch {
51
- value = rawValue;
52
- }
53
- setConfigValue(key, value);
54
- console.log(chalk.green(`āœ“ Set ${key} = ${JSON.stringify(value)}`));
55
- return;
56
- }
57
- // Default: show full config
58
- if (!configExists()) {
59
- console.log(chalk.yellow('No config file exists yet. Run `droid setup` first.'));
60
- return;
61
- }
62
- const config = loadConfig();
63
- console.log(chalk.bold('\nšŸ“‹ Droid Config\n'));
64
- console.log(chalk.gray(`Path: ${getConfigPath()}\n`));
65
- console.log(JSON.stringify(config, null, 2));
66
- }
67
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- import chalk from 'chalk';
2
- import { installSkill } from '../lib/skills';
3
- import { getBundledTools, isToolInstalled } from '../lib/tools';
4
- import { promptForSkillConfig } from '../lib/skill-config';
5
- export async function installCommand(toolName) {
6
- // Check if tool exists
7
- const tools = getBundledTools();
8
- const tool = tools.find((t) => t.name === toolName);
9
- if (!tool) {
10
- console.error(chalk.red(`\nāœ— Tool '${toolName}' not found`));
11
- console.log(chalk.gray('\nAvailable tools:'));
12
- for (const t of tools) {
13
- console.log(chalk.gray(` - ${t.name}`));
14
- }
15
- process.exit(1);
16
- }
17
- // Check if already installed
18
- if (isToolInstalled(toolName)) {
19
- console.log(chalk.yellow(`\n⚠ Tool '${toolName}' is already installed`));
20
- console.log(chalk.gray('Use `droid update` to update it, or uninstall first.'));
21
- return;
22
- }
23
- console.log(chalk.bold(`\nšŸ¤– Installing ${toolName}...\n`));
24
- // Install via primary skill
25
- const primarySkill = tool.includes.skills.find(s => s.required)?.name || toolName;
26
- const result = installSkill(primarySkill);
27
- if (result.success) {
28
- console.log(chalk.green(`āœ“ Installed ${toolName}`));
29
- // Check if tool has configurable options
30
- if (tool.config_schema && Object.keys(tool.config_schema).length > 0) {
31
- // If any config option lacks a default, go straight to config (it's required)
32
- const hasRequiredConfig = Object.values(tool.config_schema).some((option) => option.default === undefined);
33
- await promptForSkillConfig(primarySkill, tool.config_schema, !hasRequiredConfig);
34
- }
35
- // Show next steps
36
- console.log(chalk.gray('\nNext steps:'));
37
- console.log(chalk.gray(' - Run your AI tool to start using it'));
38
- console.log(chalk.gray(` - Reconfigure anytime with \`droid\` → Configure`));
39
- }
40
- else {
41
- console.error(chalk.red(`āœ— ${result.message}`));
42
- process.exit(1);
43
- }
44
- }
45
- //# sourceMappingURL=install.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -1,269 +0,0 @@
1
- import inquirer from 'inquirer';
2
- import chalk from 'chalk';
3
- import { execSync } from 'child_process';
4
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
5
- import { join } from 'path';
6
- import { homedir } from 'os';
7
- import { loadConfig, saveConfig, configExists } from '../lib/config';
8
- import { getBundledSkills } from '../lib/skills';
9
- import { Platform, BuiltInOutput } from '../lib/types';
10
- /**
11
- * Permissions droid needs to operate without constant prompts
12
- */
13
- const DROID_PERMISSIONS = [
14
- 'Read(~/.droid/**)',
15
- 'Write(~/.droid/**)',
16
- 'Edit(~/.droid/**)',
17
- 'Glob(~/.droid/**)',
18
- 'Grep(~/.droid/**)',
19
- ];
20
- /**
21
- * Detect which platform is installed
22
- */
23
- function detectPlatform() {
24
- try {
25
- execSync('claude --version', { stdio: 'ignore' });
26
- return Platform.ClaudeCode;
27
- }
28
- catch {
29
- // Claude Code not found
30
- }
31
- try {
32
- execSync('opencode --version', { stdio: 'ignore' });
33
- return Platform.OpenCode;
34
- }
35
- catch {
36
- // OpenCode not found
37
- }
38
- return null;
39
- }
40
- /**
41
- * Try to get git username
42
- */
43
- function detectGitUsername() {
44
- try {
45
- return execSync('git config user.name', { encoding: 'utf-8' }).trim();
46
- }
47
- catch {
48
- return '';
49
- }
50
- }
51
- /**
52
- * The opencode-skills plugin name for OpenCode
53
- * This plugin enables Claude Code-style skills in OpenCode
54
- * @see https://github.com/malhashemi/opencode-skills
55
- */
56
- const OPENCODE_SKILLS_PLUGIN = 'opencode-skills';
57
- /**
58
- * Configure platform permissions for droid
59
- */
60
- export function configurePlatformPermissions(platform) {
61
- const added = [];
62
- if (platform === Platform.ClaudeCode) {
63
- const settingsPath = join(homedir(), '.claude', 'settings.json');
64
- // Ensure .claude directory exists
65
- const claudeDir = join(homedir(), '.claude');
66
- if (!existsSync(claudeDir)) {
67
- mkdirSync(claudeDir, { recursive: true });
68
- }
69
- // Load or create settings
70
- let settings = {};
71
- if (existsSync(settingsPath)) {
72
- try {
73
- settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
74
- }
75
- catch {
76
- console.warn(chalk.yellow('⚠ Claude Code settings.json appears corrupted, resetting permissions'));
77
- settings = {};
78
- }
79
- }
80
- // Ensure permissions structure exists
81
- if (!settings.permissions) {
82
- settings.permissions = {};
83
- }
84
- if (!Array.isArray(settings.permissions.allow)) {
85
- settings.permissions.allow = [];
86
- }
87
- // Add missing permissions
88
- for (const perm of DROID_PERMISSIONS) {
89
- if (!settings.permissions.allow.includes(perm)) {
90
- settings.permissions.allow.push(perm);
91
- added.push(perm);
92
- }
93
- }
94
- // Save if we added anything
95
- if (added.length > 0) {
96
- try {
97
- writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
98
- }
99
- catch (e) {
100
- const message = e instanceof Error ? e.message : 'Unknown error';
101
- return { added: [], alreadyPresent: false, error: `Failed to update Claude Code settings: ${message}` };
102
- }
103
- }
104
- return { added, alreadyPresent: added.length === 0 };
105
- }
106
- if (platform === Platform.OpenCode) {
107
- // OpenCode uses opencode.json for config
108
- // Check global config location: ~/.config/opencode/opencode.json
109
- const globalConfigDir = join(homedir(), '.config', 'opencode');
110
- const globalConfigPath = join(globalConfigDir, 'opencode.json');
111
- // Ensure config directory exists
112
- if (!existsSync(globalConfigDir)) {
113
- mkdirSync(globalConfigDir, { recursive: true });
114
- }
115
- // Load or create config
116
- let config = {};
117
- if (existsSync(globalConfigPath)) {
118
- try {
119
- config = JSON.parse(readFileSync(globalConfigPath, 'utf-8'));
120
- }
121
- catch {
122
- console.warn(chalk.yellow('⚠ OpenCode config appears corrupted, resetting'));
123
- config = {};
124
- }
125
- }
126
- // Ensure plugin array exists
127
- if (!Array.isArray(config.plugin)) {
128
- config.plugin = [];
129
- }
130
- // Add opencode-skills plugin if not present
131
- if (!config.plugin.includes(OPENCODE_SKILLS_PLUGIN)) {
132
- config.plugin.push(OPENCODE_SKILLS_PLUGIN);
133
- added.push(OPENCODE_SKILLS_PLUGIN);
134
- }
135
- // Save if we added anything
136
- if (added.length > 0) {
137
- try {
138
- writeFileSync(globalConfigPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
139
- }
140
- catch (e) {
141
- const message = e instanceof Error ? e.message : 'Unknown error';
142
- return { added: [], alreadyPresent: false, error: `Failed to update OpenCode config: ${message}` };
143
- }
144
- }
145
- return { added, alreadyPresent: added.length === 0 };
146
- }
147
- return { added: [], alreadyPresent: true };
148
- }
149
- /**
150
- * Get available output options (built-in + skills that provide output)
151
- */
152
- function getOutputOptions() {
153
- const options = [
154
- { name: 'Terminal (display in CLI)', value: BuiltInOutput.Terminal },
155
- { name: 'Editor ($EDITOR)', value: BuiltInOutput.Editor },
156
- ];
157
- // Add skills that provide output targets
158
- const skills = getBundledSkills();
159
- for (const skill of skills) {
160
- if (skill.provides_output) {
161
- options.push({
162
- name: `${skill.name} (${skill.description})`,
163
- value: skill.name,
164
- });
165
- }
166
- }
167
- return options;
168
- }
169
- export async function setupCommand() {
170
- console.log(chalk.bold('\nšŸ¤– Droid Setup\n'));
171
- const hasExistingConfig = configExists();
172
- if (hasExistingConfig) {
173
- const { overwrite } = await inquirer.prompt([
174
- {
175
- type: 'confirm',
176
- name: 'overwrite',
177
- message: 'Config already exists. Overwrite?',
178
- default: false,
179
- },
180
- ]);
181
- if (!overwrite) {
182
- console.log(chalk.gray('Setup cancelled.'));
183
- return;
184
- }
185
- }
186
- // Detect platform
187
- const detectedPlatform = detectPlatform();
188
- if (detectedPlatform) {
189
- console.log(chalk.green(`āœ“ Detected ${detectedPlatform}\n`));
190
- }
191
- else {
192
- console.log(chalk.yellow('⚠ No platform detected (Claude Code or OpenCode)\n'));
193
- }
194
- // Detect git username
195
- const detectedGitUsername = detectGitUsername();
196
- // Get dynamic output options
197
- const outputOptions = getOutputOptions();
198
- const answers = await inquirer.prompt([
199
- {
200
- type: 'list',
201
- name: 'platform',
202
- message: 'Which platform are you using?',
203
- choices: [
204
- { name: 'Claude Code', value: Platform.ClaudeCode },
205
- { name: 'OpenCode', value: Platform.OpenCode },
206
- ],
207
- default: detectedPlatform || Platform.ClaudeCode,
208
- },
209
- {
210
- type: 'input',
211
- name: 'user_mention',
212
- message: 'What @mention should be used for you?',
213
- default: '@user',
214
- filter: (input) => {
215
- // Auto-add @ prefix if missing
216
- return input.startsWith('@') ? input : `@${input}`;
217
- },
218
- },
219
- {
220
- type: 'list',
221
- name: 'output_preference',
222
- message: 'Default output preference for skill results?',
223
- choices: outputOptions,
224
- default: BuiltInOutput.Terminal,
225
- },
226
- {
227
- type: 'input',
228
- name: 'git_username',
229
- message: 'Git username for attribution?',
230
- default: detectedGitUsername || '',
231
- },
232
- ]);
233
- const existingConfig = loadConfig();
234
- const config = {
235
- ...existingConfig,
236
- platform: answers.platform,
237
- user_mention: answers.user_mention,
238
- output_preference: answers.output_preference,
239
- git_username: answers.git_username,
240
- };
241
- saveConfig(config);
242
- console.log(chalk.green('\nāœ“ Config saved to ~/.droid/config.yaml'));
243
- // Configure platform permissions/plugins
244
- const { added, alreadyPresent, error } = configurePlatformPermissions(answers.platform);
245
- if (error) {
246
- console.log(chalk.red(`āœ— ${error}`));
247
- console.log(chalk.yellow(' You may need to manually configure your platform'));
248
- }
249
- else if (answers.platform === Platform.ClaudeCode) {
250
- if (added.length > 0) {
251
- console.log(chalk.green(`āœ“ Added droid permissions to Claude Code settings`));
252
- }
253
- else if (alreadyPresent) {
254
- console.log(chalk.gray(` Droid permissions already configured in Claude Code`));
255
- }
256
- }
257
- else if (answers.platform === Platform.OpenCode) {
258
- if (added.length > 0) {
259
- console.log(chalk.green(`āœ“ Added opencode-skills plugin to OpenCode config`));
260
- console.log(chalk.gray(` This enables Claude Code-style skills in OpenCode`));
261
- console.log(chalk.gray(` Restart OpenCode to activate the plugin`));
262
- }
263
- else if (alreadyPresent) {
264
- console.log(chalk.gray(` opencode-skills plugin already configured in OpenCode`));
265
- }
266
- }
267
- console.log(chalk.gray('\nRun `droid skills` to browse and install skills.'));
268
- }
269
- //# sourceMappingURL=setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -1,144 +0,0 @@
1
- import inquirer from 'inquirer';
2
- import chalk from 'chalk';
3
- import { installSkill, uninstallSkill } from '../lib/skills';
4
- import { getBundledTools, isToolInstalled, getInstalledToolVersion } from '../lib/tools';
5
- import { promptForSkillConfig } from '../lib/skill-config';
6
- import { SkillStatus } from '../lib/types';
7
- function formatToolChoice(tool) {
8
- const installed = isToolInstalled(tool.name);
9
- const installedVersion = getInstalledToolVersion(tool.name);
10
- let line = `${tool.name}`;
11
- if (installed && installedVersion) {
12
- line += chalk.green(` [installed] v${installedVersion}`);
13
- }
14
- else {
15
- line += chalk.gray(` v${tool.version}`);
16
- }
17
- if (tool.status) {
18
- const statusColor = tool.status === SkillStatus.Alpha
19
- ? chalk.red
20
- : tool.status === SkillStatus.Beta
21
- ? chalk.yellow
22
- : chalk.white;
23
- line += statusColor(` [${tool.status}]`);
24
- }
25
- return line;
26
- }
27
- export async function skillsCommand() {
28
- const tools = getBundledTools();
29
- if (tools.length === 0) {
30
- console.log(chalk.yellow('\nNo tools available yet.'));
31
- return;
32
- }
33
- console.log(chalk.bold('\nšŸ¤– Available Tools\n'));
34
- const toolChoices = tools.map((tool) => ({
35
- name: formatToolChoice(tool),
36
- value: tool.name,
37
- short: tool.name,
38
- }));
39
- const choices = [
40
- {
41
- name: chalk.gray('← Exit'),
42
- value: '__exit__',
43
- short: 'Exit',
44
- },
45
- ...toolChoices,
46
- ];
47
- const { selectedTool } = await inquirer.prompt([
48
- {
49
- type: 'list',
50
- name: 'selectedTool',
51
- message: 'Select a tool to view details or install:',
52
- choices,
53
- pageSize: 15,
54
- },
55
- ]);
56
- if (selectedTool === '__exit__') {
57
- return;
58
- }
59
- const tool = tools.find((t) => t.name === selectedTool);
60
- if (!tool) {
61
- console.error(chalk.red('Tool not found'));
62
- return;
63
- }
64
- // Show tool details
65
- console.log(chalk.bold(`\nšŸ“¦ ${tool.name}`));
66
- console.log(chalk.gray(`Version: ${tool.version}`));
67
- if (tool.status) {
68
- console.log(chalk.gray(`Status: ${tool.status}`));
69
- }
70
- console.log(`\n${tool.description}`);
71
- // Show what the tool includes
72
- const skillNames = tool.includes.skills.map(s => s.name);
73
- const commandNames = tool.includes.commands.map(c => `/${c}`);
74
- const agentNames = tool.includes.agents;
75
- if (skillNames.length > 0) {
76
- console.log(chalk.gray(`\nSkills: ${skillNames.join(', ')}`));
77
- }
78
- if (commandNames.length > 0) {
79
- console.log(chalk.gray(`Commands: ${commandNames.join(', ')}`));
80
- }
81
- if (agentNames.length > 0) {
82
- console.log(chalk.gray(`Agents: ${agentNames.join(', ')}`));
83
- }
84
- const installed = isToolInstalled(tool.name);
85
- const primarySkill = tool.includes.skills.find(s => s.required)?.name || tool.name;
86
- const actions = installed
87
- ? [
88
- { name: '← Back', value: 'back' },
89
- { name: 'Configure', value: 'configure' },
90
- { name: 'Uninstall', value: 'uninstall' },
91
- ]
92
- : [
93
- { name: '← Back', value: 'back' },
94
- { name: 'Install', value: 'install' },
95
- ];
96
- const { action } = await inquirer.prompt([
97
- {
98
- type: 'list',
99
- name: 'action',
100
- message: 'What would you like to do?',
101
- choices: actions,
102
- },
103
- ]);
104
- switch (action) {
105
- case 'install': {
106
- const result = installSkill(primarySkill);
107
- if (result.success) {
108
- console.log(chalk.green(`\nāœ“ Installed ${tool.name}`));
109
- // Prompt for config if tool has options
110
- if (tool.config_schema && Object.keys(tool.config_schema).length > 0) {
111
- const hasRequiredConfig = Object.values(tool.config_schema).some((option) => option.default === undefined);
112
- await promptForSkillConfig(primarySkill, tool.config_schema, !hasRequiredConfig);
113
- }
114
- }
115
- else {
116
- console.log(chalk.red(`\nāœ— ${result.message}`));
117
- }
118
- break;
119
- }
120
- case 'configure': {
121
- if (tool.config_schema && Object.keys(tool.config_schema).length > 0) {
122
- await promptForSkillConfig(primarySkill, tool.config_schema, false);
123
- }
124
- else {
125
- console.log(chalk.gray('\nThis tool has no configuration options.'));
126
- }
127
- break;
128
- }
129
- case 'uninstall': {
130
- const result = uninstallSkill(primarySkill);
131
- if (result.success) {
132
- console.log(chalk.green(`\nāœ“ Uninstalled ${tool.name}`));
133
- }
134
- else {
135
- console.log(chalk.red(`\nāœ— ${result.message}`));
136
- }
137
- break;
138
- }
139
- case 'back':
140
- await skillsCommand();
141
- break;
142
- }
143
- }
144
- //# sourceMappingURL=skills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}