@orderful/droid 0.2.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 (86) hide show
  1. package/.changeset/README.md +30 -0
  2. package/.changeset/config.json +14 -0
  3. package/.eslintrc.json +20 -0
  4. package/.github/PULL_REQUEST_TEMPLATE.md +9 -0
  5. package/.github/workflows/ci.yml +47 -0
  6. package/.github/workflows/release.yml +45 -0
  7. package/CHANGELOG.md +11 -0
  8. package/README.md +153 -0
  9. package/bun.lock +571 -0
  10. package/dist/bin/droid.d.ts +3 -0
  11. package/dist/bin/droid.d.ts.map +1 -0
  12. package/dist/bin/droid.js +48 -0
  13. package/dist/bin/droid.js.map +1 -0
  14. package/dist/commands/config.d.ts +8 -0
  15. package/dist/commands/config.d.ts.map +1 -0
  16. package/dist/commands/config.js +67 -0
  17. package/dist/commands/config.js.map +1 -0
  18. package/dist/commands/install.d.ts +2 -0
  19. package/dist/commands/install.d.ts.map +1 -0
  20. package/dist/commands/install.js +42 -0
  21. package/dist/commands/install.js.map +1 -0
  22. package/dist/commands/setup.d.ts +2 -0
  23. package/dist/commands/setup.d.ts.map +1 -0
  24. package/dist/commands/setup.js +132 -0
  25. package/dist/commands/setup.js.map +1 -0
  26. package/dist/commands/skills.d.ts +2 -0
  27. package/dist/commands/skills.d.ts.map +1 -0
  28. package/dist/commands/skills.js +135 -0
  29. package/dist/commands/skills.js.map +1 -0
  30. package/dist/commands/uninstall.d.ts +2 -0
  31. package/dist/commands/uninstall.d.ts.map +1 -0
  32. package/dist/commands/uninstall.js +17 -0
  33. package/dist/commands/uninstall.js.map +1 -0
  34. package/dist/commands/update.d.ts +7 -0
  35. package/dist/commands/update.d.ts.map +1 -0
  36. package/dist/commands/update.js +45 -0
  37. package/dist/commands/update.js.map +1 -0
  38. package/dist/index.d.ts +5 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +6 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/lib/config.d.ts +46 -0
  43. package/dist/lib/config.d.ts.map +1 -0
  44. package/dist/lib/config.js +133 -0
  45. package/dist/lib/config.js.map +1 -0
  46. package/dist/lib/skill-config.d.ts +6 -0
  47. package/dist/lib/skill-config.d.ts.map +1 -0
  48. package/dist/lib/skill-config.js +80 -0
  49. package/dist/lib/skill-config.js.map +1 -0
  50. package/dist/lib/skills.d.ts +56 -0
  51. package/dist/lib/skills.d.ts.map +1 -0
  52. package/dist/lib/skills.js +245 -0
  53. package/dist/lib/skills.js.map +1 -0
  54. package/dist/lib/types.d.ts +54 -0
  55. package/dist/lib/types.d.ts.map +1 -0
  56. package/dist/lib/types.js +31 -0
  57. package/dist/lib/types.js.map +1 -0
  58. package/dist/lib/version.d.ts +10 -0
  59. package/dist/lib/version.d.ts.map +1 -0
  60. package/dist/lib/version.js +41 -0
  61. package/dist/lib/version.js.map +1 -0
  62. package/dist/skills/comments/SKILL.md +65 -0
  63. package/dist/skills/comments/SKILL.yaml +18 -0
  64. package/dist/skills/comments/commands/comments.md +48 -0
  65. package/package.json +58 -0
  66. package/src/bin/droid.ts +58 -0
  67. package/src/commands/config.ts +86 -0
  68. package/src/commands/install.ts +48 -0
  69. package/src/commands/setup.ts +149 -0
  70. package/src/commands/skills.ts +159 -0
  71. package/src/commands/uninstall.ts +18 -0
  72. package/src/commands/update.ts +58 -0
  73. package/src/index.ts +5 -0
  74. package/src/lib/config.test.ts +99 -0
  75. package/src/lib/config.ts +154 -0
  76. package/src/lib/skill-config.ts +93 -0
  77. package/src/lib/skills.test.ts +138 -0
  78. package/src/lib/skills.ts +285 -0
  79. package/src/lib/types.test.ts +65 -0
  80. package/src/lib/types.ts +68 -0
  81. package/src/lib/version.test.ts +23 -0
  82. package/src/lib/version.ts +47 -0
  83. package/src/skills/comments/SKILL.md +65 -0
  84. package/src/skills/comments/SKILL.yaml +18 -0
  85. package/src/skills/comments/commands/comments.md +48 -0
  86. package/tsconfig.json +19 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=droid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droid.d.ts","sourceRoot":"","sources":["../../src/bin/droid.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ import { program } from 'commander';
3
+ import { setupCommand } from '../commands/setup.js';
4
+ import { configCommand } from '../commands/config.js';
5
+ import { skillsCommand } from '../commands/skills.js';
6
+ import { installCommand } from '../commands/install.js';
7
+ import { uninstallCommand } from '../commands/uninstall.js';
8
+ import { updateCommand } from '../commands/update.js';
9
+ import { getVersion, checkForUpdates } from '../lib/version.js';
10
+ const version = getVersion();
11
+ program
12
+ .name('droid')
13
+ .description('AI workflow toolkit - teaching your droid new tricks')
14
+ .version(version);
15
+ program
16
+ .command('setup')
17
+ .description('Interactive wizard for global configuration')
18
+ .action(setupCommand);
19
+ program
20
+ .command('config')
21
+ .description('View or edit configuration')
22
+ .option('-e, --edit', 'Open config in editor')
23
+ .option('-g, --get <key>', 'Get a specific config value')
24
+ .option('-s, --set <key=value>', 'Set a config value')
25
+ .action(configCommand);
26
+ program
27
+ .command('skills')
28
+ .description('Browse and manage available skills')
29
+ .action(skillsCommand);
30
+ program
31
+ .command('install <skill>')
32
+ .description('Install a skill and run its setup wizard')
33
+ .action(installCommand);
34
+ program
35
+ .command('uninstall <skill>')
36
+ .description('Uninstall a skill')
37
+ .action(uninstallCommand);
38
+ program
39
+ .command('update')
40
+ .description('Update droid and installed skills')
41
+ .option('--skills', 'Only update skills')
42
+ .option('--cli', 'Only update the CLI')
43
+ .argument('[skill]', 'Update a specific skill')
44
+ .action(updateCommand);
45
+ // Check for updates on any command (non-blocking)
46
+ checkForUpdates().catch(() => { });
47
+ program.parse();
48
+ //# sourceMappingURL=droid.js.map
@@ -0,0 +1 @@
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,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEhE,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAE7B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,sDAAsD,CAAC;KACnE,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,QAAQ,CAAC;KACjB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,UAAU,EAAE,oBAAoB,CAAC;KACxC,MAAM,CAAC,OAAO,EAAE,qBAAqB,CAAC;KACtC,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;KAC9C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,kDAAkD;AAClD,eAAe,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ interface ConfigOptions {
2
+ edit?: boolean;
3
+ get?: string;
4
+ set?: string;
5
+ }
6
+ export declare function configCommand(options: ConfigOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAUA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEzE"}
@@ -0,0 +1,67 @@
1
+ import chalk from 'chalk';
2
+ import { execSync } from 'child_process';
3
+ import { loadConfig, getConfigPath, getConfigValue, setConfigValue, configExists, } from '../lib/config.js';
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function installCommand(skillName: string): Promise<void>;
2
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CrE"}
@@ -0,0 +1,42 @@
1
+ import chalk from 'chalk';
2
+ import { join } from 'path';
3
+ import { installSkill, isSkillInstalled, getBundledSkills, loadSkillManifest, getBundledSkillsDir } from '../lib/skills.js';
4
+ import { promptForSkillConfig } from '../lib/skill-config.js';
5
+ export async function installCommand(skillName) {
6
+ // Check if skill exists
7
+ const skills = getBundledSkills();
8
+ const skill = skills.find((s) => s.name === skillName);
9
+ if (!skill) {
10
+ console.error(chalk.red(`\n✗ Skill '${skillName}' not found`));
11
+ console.log(chalk.gray('\nAvailable skills:'));
12
+ for (const s of skills) {
13
+ console.log(chalk.gray(` - ${s.name}`));
14
+ }
15
+ process.exit(1);
16
+ }
17
+ // Check if already installed
18
+ if (isSkillInstalled(skillName)) {
19
+ console.log(chalk.yellow(`\n⚠ Skill '${skillName}' 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 ${skillName}...\n`));
24
+ const result = installSkill(skillName);
25
+ if (result.success) {
26
+ console.log(chalk.green(`✓ ${result.message}`));
27
+ // Check if skill has configurable options
28
+ const manifest = loadSkillManifest(join(getBundledSkillsDir(), skillName));
29
+ if (manifest?.config_schema && Object.keys(manifest.config_schema).length > 0) {
30
+ await promptForSkillConfig(skillName, manifest.config_schema, true);
31
+ }
32
+ // Show next steps
33
+ console.log(chalk.gray('\nNext steps:'));
34
+ console.log(chalk.gray(' - Run your AI tool to start using the skill'));
35
+ console.log(chalk.gray(` - Reconfigure anytime with \`droid skills\` → Configure`));
36
+ }
37
+ else {
38
+ console.error(chalk.red(`✗ ${result.message}`));
39
+ process.exit(1);
40
+ }
41
+ }
42
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5H,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB;IACpD,wBAAwB;IACxB,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAEvD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,SAAS,aAAa,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,6BAA6B;IAC7B,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,SAAS,wBAAwB,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,SAAS,OAAO,CAAC,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAEvC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;QAC3E,IAAI,QAAQ,EAAE,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9E,MAAM,oBAAoB,CAAC,SAAS,EAAE,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACtE,CAAC;QAED,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC,CAAC;IACvF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function setupCommand(): Promise<void>;
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AA8DA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAsFlD"}
@@ -0,0 +1,132 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ import { execSync } from 'child_process';
4
+ import { loadConfig, saveConfig, configExists } from '../lib/config.js';
5
+ import { getBundledSkills } from '../lib/skills.js';
6
+ import { AITool, BuiltInOutput } from '../lib/types.js';
7
+ /**
8
+ * Detect which AI tool is installed
9
+ */
10
+ function detectAITool() {
11
+ try {
12
+ execSync('claude --version', { stdio: 'ignore' });
13
+ return AITool.ClaudeCode;
14
+ }
15
+ catch {
16
+ // Claude Code not found
17
+ }
18
+ try {
19
+ execSync('opencode --version', { stdio: 'ignore' });
20
+ return AITool.OpenCode;
21
+ }
22
+ catch {
23
+ // OpenCode not found
24
+ }
25
+ return null;
26
+ }
27
+ /**
28
+ * Try to get git username
29
+ */
30
+ function detectGitUsername() {
31
+ try {
32
+ return execSync('git config user.name', { encoding: 'utf-8' }).trim();
33
+ }
34
+ catch {
35
+ return '';
36
+ }
37
+ }
38
+ /**
39
+ * Get available output options (built-in + skills that provide output)
40
+ */
41
+ function getOutputOptions() {
42
+ const options = [
43
+ { name: 'Terminal (display in CLI)', value: BuiltInOutput.Terminal },
44
+ { name: 'Editor ($EDITOR)', value: BuiltInOutput.Editor },
45
+ ];
46
+ // Add skills that provide output targets
47
+ const skills = getBundledSkills();
48
+ for (const skill of skills) {
49
+ if (skill.provides_output) {
50
+ options.push({
51
+ name: `${skill.name} (${skill.description})`,
52
+ value: skill.name,
53
+ });
54
+ }
55
+ }
56
+ return options;
57
+ }
58
+ export async function setupCommand() {
59
+ console.log(chalk.bold('\n🤖 Droid Setup\n'));
60
+ const existingConfig = configExists();
61
+ if (existingConfig) {
62
+ const { overwrite } = await inquirer.prompt([
63
+ {
64
+ type: 'confirm',
65
+ name: 'overwrite',
66
+ message: 'Config already exists. Overwrite?',
67
+ default: false,
68
+ },
69
+ ]);
70
+ if (!overwrite) {
71
+ console.log(chalk.gray('Setup cancelled.'));
72
+ return;
73
+ }
74
+ }
75
+ // Detect AI tool
76
+ const detectedTool = detectAITool();
77
+ if (detectedTool) {
78
+ console.log(chalk.green(`✓ Detected ${detectedTool}\n`));
79
+ }
80
+ else {
81
+ console.log(chalk.yellow('⚠ No AI tool detected (Claude Code or OpenCode)\n'));
82
+ }
83
+ // Detect git username
84
+ const detectedGitUsername = detectGitUsername();
85
+ // Get dynamic output options
86
+ const outputOptions = getOutputOptions();
87
+ const answers = await inquirer.prompt([
88
+ {
89
+ type: 'list',
90
+ name: 'ai_tool',
91
+ message: 'Which AI tool are you using?',
92
+ choices: [
93
+ { name: 'Claude Code', value: AITool.ClaudeCode },
94
+ { name: 'OpenCode', value: AITool.OpenCode },
95
+ ],
96
+ default: detectedTool || AITool.ClaudeCode,
97
+ },
98
+ {
99
+ type: 'input',
100
+ name: 'user_mention',
101
+ message: 'What @mention should be used for you?',
102
+ default: '@user',
103
+ validate: (input) => {
104
+ if (!input.startsWith('@')) {
105
+ return 'Mention should start with @';
106
+ }
107
+ return true;
108
+ },
109
+ },
110
+ {
111
+ type: 'list',
112
+ name: 'output_preference',
113
+ message: 'Default output preference for skill results?',
114
+ choices: outputOptions,
115
+ default: BuiltInOutput.Terminal,
116
+ },
117
+ {
118
+ type: 'input',
119
+ name: 'git_username',
120
+ message: 'Git username for attribution?',
121
+ default: detectedGitUsername || '',
122
+ },
123
+ ]);
124
+ const config = {
125
+ ...loadConfig(),
126
+ ...answers,
127
+ };
128
+ saveConfig(config);
129
+ console.log(chalk.green('\n✓ Config saved to ~/.droid/config.yaml'));
130
+ console.log(chalk.gray('\nRun `droid skills` to browse and install skills.'));
131
+ }
132
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function skillsCommand(): Promise<void>;
2
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AA0CA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAoHnD"}
@@ -0,0 +1,135 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ import { join } from 'path';
4
+ import { getBundledSkills, getBundledSkillsDir, isSkillInstalled, getInstalledSkill, getSkillStatusDisplay, installSkill, uninstallSkill, loadSkillManifest, } from '../lib/skills.js';
5
+ import { promptForSkillConfig } from '../lib/skill-config.js';
6
+ import { SkillStatus } from '../lib/types.js';
7
+ function formatSkillChoice(skill) {
8
+ const installed = isSkillInstalled(skill.name);
9
+ const installedInfo = getInstalledSkill(skill.name);
10
+ const statusDisplay = getSkillStatusDisplay(skill.status);
11
+ let line = `${skill.name}`;
12
+ if (installed && installedInfo) {
13
+ line += chalk.green(` [installed] v${installedInfo.version}`);
14
+ }
15
+ else {
16
+ line += chalk.gray(` v${skill.version}`);
17
+ }
18
+ if (statusDisplay) {
19
+ const color = skill.status === SkillStatus.Alpha
20
+ ? chalk.red
21
+ : skill.status === SkillStatus.Beta
22
+ ? chalk.yellow
23
+ : chalk.white;
24
+ line += ` ${color(statusDisplay)}`;
25
+ }
26
+ return line;
27
+ }
28
+ export async function skillsCommand() {
29
+ const skills = getBundledSkills();
30
+ if (skills.length === 0) {
31
+ console.log(chalk.yellow('\nNo skills available yet.'));
32
+ return;
33
+ }
34
+ console.log(chalk.bold('\n🤖 Available Skills\n'));
35
+ const skillChoices = skills.map((skill) => ({
36
+ name: formatSkillChoice(skill),
37
+ value: skill.name,
38
+ short: skill.name,
39
+ }));
40
+ const choices = [
41
+ {
42
+ name: chalk.gray('← Exit'),
43
+ value: '__exit__',
44
+ short: 'Exit',
45
+ },
46
+ ...skillChoices,
47
+ ];
48
+ const { selectedSkill } = await inquirer.prompt([
49
+ {
50
+ type: 'list',
51
+ name: 'selectedSkill',
52
+ message: 'Select a skill to view details or install:',
53
+ choices,
54
+ pageSize: 15,
55
+ },
56
+ ]);
57
+ if (selectedSkill === '__exit__') {
58
+ return;
59
+ }
60
+ const skill = skills.find((s) => s.name === selectedSkill);
61
+ if (!skill) {
62
+ console.error(chalk.red('Skill not found'));
63
+ return;
64
+ }
65
+ // Show skill details
66
+ console.log(chalk.bold(`\n📦 ${skill.name}`));
67
+ console.log(chalk.gray(`Version: ${skill.version}`));
68
+ if (skill.status) {
69
+ console.log(chalk.gray(`Status: ${skill.status}`));
70
+ }
71
+ console.log(`\n${skill.description}`);
72
+ if (skill.dependencies && skill.dependencies.length > 0) {
73
+ console.log(chalk.gray(`\nDependencies: ${skill.dependencies.join(', ')}`));
74
+ }
75
+ const installed = isSkillInstalled(skill.name);
76
+ const actions = installed
77
+ ? [
78
+ { name: '← Back', value: 'back' },
79
+ { name: 'Configure', value: 'configure' },
80
+ { name: 'Uninstall', value: 'uninstall' },
81
+ ]
82
+ : [
83
+ { name: '← Back', value: 'back' },
84
+ { name: 'Install', value: 'install' },
85
+ ];
86
+ const { action } = await inquirer.prompt([
87
+ {
88
+ type: 'list',
89
+ name: 'action',
90
+ message: 'What would you like to do?',
91
+ choices: actions,
92
+ },
93
+ ]);
94
+ switch (action) {
95
+ case 'install': {
96
+ const result = installSkill(skill.name);
97
+ if (result.success) {
98
+ console.log(chalk.green(`\n✓ ${result.message}`));
99
+ // Prompt for config if skill has options
100
+ const manifest = loadSkillManifest(join(getBundledSkillsDir(), skill.name));
101
+ if (manifest?.config_schema && Object.keys(manifest.config_schema).length > 0) {
102
+ await promptForSkillConfig(skill.name, manifest.config_schema, true);
103
+ }
104
+ }
105
+ else {
106
+ console.log(chalk.red(`\n✗ ${result.message}`));
107
+ }
108
+ break;
109
+ }
110
+ case 'configure': {
111
+ const manifest = loadSkillManifest(join(getBundledSkillsDir(), skill.name));
112
+ if (manifest?.config_schema && Object.keys(manifest.config_schema).length > 0) {
113
+ await promptForSkillConfig(skill.name, manifest.config_schema, false);
114
+ }
115
+ else {
116
+ console.log(chalk.gray('\nThis skill has no configuration options.'));
117
+ }
118
+ break;
119
+ }
120
+ case 'uninstall': {
121
+ const result = uninstallSkill(skill.name);
122
+ if (result.success) {
123
+ console.log(chalk.green(`\n✓ ${result.message}`));
124
+ }
125
+ else {
126
+ console.log(chalk.red(`\n✗ ${result.message}`));
127
+ }
128
+ break;
129
+ }
130
+ case 'back':
131
+ await skillsCommand();
132
+ break;
133
+ }
134
+ }
135
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function uninstallCommand(skillName: string): Promise<void>;
2
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcvE"}
@@ -0,0 +1,17 @@
1
+ import chalk from 'chalk';
2
+ import { uninstallSkill, isSkillInstalled } from '../lib/skills.js';
3
+ export async function uninstallCommand(skillName) {
4
+ if (!isSkillInstalled(skillName)) {
5
+ console.error(chalk.red(`\n✗ Skill '${skillName}' is not installed`));
6
+ process.exit(1);
7
+ }
8
+ const result = uninstallSkill(skillName);
9
+ if (result.success) {
10
+ console.log(chalk.green(`\n✓ ${result.message}`));
11
+ }
12
+ else {
13
+ console.error(chalk.red(`\n✗ ${result.message}`));
14
+ process.exit(1);
15
+ }
16
+ }
17
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB;IACtD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,SAAS,oBAAoB,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAEzC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface UpdateOptions {
2
+ skills?: boolean;
3
+ cli?: boolean;
4
+ }
5
+ export declare function updateCommand(skill?: string, options?: UpdateOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAIA,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD1F"}
@@ -0,0 +1,45 @@
1
+ import chalk from 'chalk';
2
+ import { execSync } from 'child_process';
3
+ import { getVersion } from '../lib/version.js';
4
+ export async function updateCommand(skill, options) {
5
+ // If specific skill specified, update just that skill
6
+ if (skill) {
7
+ console.log(chalk.yellow('\n⚠ Per-skill updates not implemented yet'));
8
+ console.log(chalk.gray('Skills are bundled with the CLI - run `droid update` to update all.'));
9
+ return;
10
+ }
11
+ // If --skills flag, update skills only
12
+ if (options?.skills) {
13
+ console.log(chalk.yellow('\n⚠ Skill-only updates not implemented yet'));
14
+ console.log(chalk.gray('Skills are bundled with the CLI - run `droid update` to update all.'));
15
+ return;
16
+ }
17
+ // Update CLI (and bundled skills with it)
18
+ console.log(chalk.bold('\n🤖 Updating Droid...\n'));
19
+ const currentVersion = getVersion();
20
+ console.log(chalk.gray(`Current version: ${currentVersion}`));
21
+ try {
22
+ // Check for latest version
23
+ const latestVersion = execSync('npm view @orderful/droid version 2>/dev/null', {
24
+ encoding: 'utf-8',
25
+ }).trim();
26
+ if (!latestVersion) {
27
+ console.log(chalk.yellow('\n⚠ Could not check for updates'));
28
+ return;
29
+ }
30
+ if (latestVersion === currentVersion) {
31
+ console.log(chalk.green('\n✓ Already on latest version'));
32
+ return;
33
+ }
34
+ console.log(chalk.gray(`Latest version: ${latestVersion}`));
35
+ console.log(chalk.gray('\nUpdating...'));
36
+ execSync('npm install -g @orderful/droid@latest', { stdio: 'inherit' });
37
+ console.log(chalk.green(`\n✓ Updated to v${latestVersion}`));
38
+ }
39
+ catch {
40
+ // Package might not be published yet
41
+ console.log(chalk.yellow('\n⚠ Could not check for updates'));
42
+ console.log(chalk.gray('Package may not be published yet.'));
43
+ }
44
+ }
45
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAO/C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAc,EAAE,OAAuB;IACzE,sDAAsD;IACtD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC,CAAC;QAC/F,OAAO;IACT,CAAC;IAED,uCAAuC;IACvC,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC,CAAC;QAC/F,OAAO;IACT,CAAC;IAED,0CAA0C;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAEpD,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,cAAc,EAAE,CAAC,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,aAAa,GAAG,QAAQ,CAAC,8CAA8C,EAAE;YAC7E,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,IAAI,aAAa,KAAK,cAAc,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QAEzC,QAAQ,CAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAExE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './lib/types.js';
2
+ export * from './lib/config.js';
3
+ export * from './lib/skills.js';
4
+ export * from './lib/version.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ // Re-export types and utilities for potential programmatic usage
2
+ export * from './lib/types.js';
3
+ export * from './lib/config.js';
4
+ export * from './lib/skills.js';
5
+ export * from './lib/version.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}