@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,46 @@
1
+ import { type DroidConfig, type SkillOverrides } from './types.js';
2
+ /**
3
+ * Ensure the config directory exists
4
+ */
5
+ export declare function ensureConfigDir(): void;
6
+ /**
7
+ * Check if config file exists
8
+ */
9
+ export declare function configExists(): boolean;
10
+ /**
11
+ * Load the global config, or return defaults if none exists
12
+ */
13
+ export declare function loadConfig(): DroidConfig;
14
+ /**
15
+ * Save the global config
16
+ */
17
+ export declare function saveConfig(config: DroidConfig): void;
18
+ /**
19
+ * Get a specific config value using dot notation
20
+ */
21
+ export declare function getConfigValue(key: string): unknown;
22
+ /**
23
+ * Set a specific config value using dot notation
24
+ */
25
+ export declare function setConfigValue(key: string, value: unknown): void;
26
+ /**
27
+ * Get the path to the config file
28
+ */
29
+ export declare function getConfigPath(): string;
30
+ /**
31
+ * Get the path to the config directory
32
+ */
33
+ export declare function getConfigDir(): string;
34
+ /**
35
+ * Get skill-specific overrides path
36
+ */
37
+ export declare function getSkillOverridesPath(skillName: string): string;
38
+ /**
39
+ * Load skill-specific overrides
40
+ */
41
+ export declare function loadSkillOverrides(skillName: string): SkillOverrides;
42
+ /**
43
+ * Save skill-specific overrides
44
+ */
45
+ export declare function saveSkillOverrides(skillName: string, overrides: SkillOverrides): void;
46
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyB,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAa1F;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,WAAW,CAgBxC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAKpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAanD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAchE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAapE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,IAAI,CAUrF"}
@@ -0,0 +1,133 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { join } from 'path';
4
+ import YAML from 'yaml';
5
+ import { AITool, BuiltInOutput } from './types.js';
6
+ const CONFIG_DIR = join(homedir(), '.droid');
7
+ const CONFIG_FILE = join(CONFIG_DIR, 'config.yaml');
8
+ const DEFAULT_CONFIG = {
9
+ ai_tool: AITool.ClaudeCode,
10
+ user_mention: '@user',
11
+ output_preference: BuiltInOutput.Terminal,
12
+ git_username: '',
13
+ skills: {},
14
+ };
15
+ /**
16
+ * Ensure the config directory exists
17
+ */
18
+ export function ensureConfigDir() {
19
+ if (!existsSync(CONFIG_DIR)) {
20
+ mkdirSync(CONFIG_DIR, { recursive: true });
21
+ }
22
+ }
23
+ /**
24
+ * Check if config file exists
25
+ */
26
+ export function configExists() {
27
+ return existsSync(CONFIG_FILE);
28
+ }
29
+ /**
30
+ * Load the global config, or return defaults if none exists
31
+ */
32
+ export function loadConfig() {
33
+ ensureConfigDir();
34
+ if (!existsSync(CONFIG_FILE)) {
35
+ return { ...DEFAULT_CONFIG };
36
+ }
37
+ try {
38
+ const content = readFileSync(CONFIG_FILE, 'utf-8');
39
+ const config = YAML.parse(content);
40
+ return { ...DEFAULT_CONFIG, ...config };
41
+ }
42
+ catch (error) {
43
+ const message = error instanceof Error ? error.message : 'Unknown error';
44
+ console.error(`Error reading config: ${message}`);
45
+ return { ...DEFAULT_CONFIG };
46
+ }
47
+ }
48
+ /**
49
+ * Save the global config
50
+ */
51
+ export function saveConfig(config) {
52
+ ensureConfigDir();
53
+ const content = YAML.stringify(config, { indent: 2 });
54
+ writeFileSync(CONFIG_FILE, content, 'utf-8');
55
+ }
56
+ /**
57
+ * Get a specific config value using dot notation
58
+ */
59
+ export function getConfigValue(key) {
60
+ const config = loadConfig();
61
+ const keys = key.split('.');
62
+ let value = config;
63
+ for (const k of keys) {
64
+ if (value === undefined || value === null || typeof value !== 'object') {
65
+ return undefined;
66
+ }
67
+ value = value[k];
68
+ }
69
+ return value;
70
+ }
71
+ /**
72
+ * Set a specific config value using dot notation
73
+ */
74
+ export function setConfigValue(key, value) {
75
+ const config = loadConfig();
76
+ const keys = key.split('.');
77
+ let current = config;
78
+ for (let i = 0; i < keys.length - 1; i++) {
79
+ if (current[keys[i]] === undefined) {
80
+ current[keys[i]] = {};
81
+ }
82
+ current = current[keys[i]];
83
+ }
84
+ current[keys[keys.length - 1]] = value;
85
+ saveConfig(config);
86
+ }
87
+ /**
88
+ * Get the path to the config file
89
+ */
90
+ export function getConfigPath() {
91
+ return CONFIG_FILE;
92
+ }
93
+ /**
94
+ * Get the path to the config directory
95
+ */
96
+ export function getConfigDir() {
97
+ return CONFIG_DIR;
98
+ }
99
+ /**
100
+ * Get skill-specific overrides path
101
+ */
102
+ export function getSkillOverridesPath(skillName) {
103
+ return join(CONFIG_DIR, 'skills', skillName, 'overrides.yaml');
104
+ }
105
+ /**
106
+ * Load skill-specific overrides
107
+ */
108
+ export function loadSkillOverrides(skillName) {
109
+ const overridesPath = getSkillOverridesPath(skillName);
110
+ if (!existsSync(overridesPath)) {
111
+ return {};
112
+ }
113
+ try {
114
+ const content = readFileSync(overridesPath, 'utf-8');
115
+ return YAML.parse(content) || {};
116
+ }
117
+ catch {
118
+ return {};
119
+ }
120
+ }
121
+ /**
122
+ * Save skill-specific overrides
123
+ */
124
+ export function saveSkillOverrides(skillName, overrides) {
125
+ const overridesPath = getSkillOverridesPath(skillName);
126
+ const skillDir = join(CONFIG_DIR, 'skills', skillName);
127
+ if (!existsSync(skillDir)) {
128
+ mkdirSync(skillDir, { recursive: true });
129
+ }
130
+ const content = YAML.stringify(overrides, { indent: 2 });
131
+ writeFileSync(overridesPath, content, 'utf-8');
132
+ }
133
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type ConfigOption } from './types.js';
2
+ /**
3
+ * Prompt user to configure a skill after install
4
+ */
5
+ export declare function promptForSkillConfig(skillName: string, configSchema: Record<string, ConfigOption>, askFirst?: boolean): Promise<void>;
6
+ //# sourceMappingURL=skill-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-config.d.ts","sourceRoot":"","sources":["../../src/lib/skill-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtF;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC1C,QAAQ,GAAE,OAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAgFf"}
@@ -0,0 +1,80 @@
1
+ import chalk from 'chalk';
2
+ import inquirer from 'inquirer';
3
+ import { saveSkillOverrides, loadConfig, loadSkillOverrides } from './config.js';
4
+ import { ConfigOptionType } from './types.js';
5
+ /**
6
+ * Prompt user to configure a skill after install
7
+ */
8
+ export async function promptForSkillConfig(skillName, configSchema, askFirst = true) {
9
+ const globalConfig = loadConfig();
10
+ if (askFirst) {
11
+ const { wantsConfigure } = await inquirer.prompt([
12
+ {
13
+ type: 'confirm',
14
+ name: 'wantsConfigure',
15
+ message: 'Would you like to configure this skill now?',
16
+ default: false,
17
+ },
18
+ ]);
19
+ if (!wantsConfigure) {
20
+ return;
21
+ }
22
+ }
23
+ console.log(chalk.bold(`\n⚙️ Configure ${skillName}\n`));
24
+ // Load existing overrides to use as defaults
25
+ const existingOverrides = loadSkillOverrides(skillName);
26
+ const questions = Object.entries(configSchema).map(([key, option]) => {
27
+ const baseQuestion = {
28
+ name: key,
29
+ message: option.description,
30
+ };
31
+ // Use existing override as default if present
32
+ const existingValue = existingOverrides[key];
33
+ switch (option.type) {
34
+ case ConfigOptionType.Boolean:
35
+ return {
36
+ ...baseQuestion,
37
+ type: 'confirm',
38
+ default: existingValue ?? option.default ?? false,
39
+ };
40
+ case ConfigOptionType.Select:
41
+ return {
42
+ ...baseQuestion,
43
+ type: 'list',
44
+ choices: option.options || [],
45
+ default: existingValue ?? option.default,
46
+ };
47
+ case ConfigOptionType.String:
48
+ default: {
49
+ // For user_mention, default to global config value if no existing override
50
+ let defaultValue = existingValue ?? option.default ?? '';
51
+ if (key === 'user_mention' && !existingValue && globalConfig.user_mention) {
52
+ defaultValue = globalConfig.user_mention;
53
+ }
54
+ return {
55
+ ...baseQuestion,
56
+ type: 'input',
57
+ default: defaultValue,
58
+ };
59
+ }
60
+ }
61
+ });
62
+ const answers = await inquirer.prompt(questions);
63
+ // Filter out empty/default values to keep overrides minimal
64
+ const overrides = {};
65
+ for (const [key, value] of Object.entries(answers)) {
66
+ const schema = configSchema[key];
67
+ // Only save if different from default
68
+ if (value !== schema.default && value !== '' && value !== false) {
69
+ overrides[key] = value;
70
+ }
71
+ }
72
+ if (Object.keys(overrides).length > 0) {
73
+ saveSkillOverrides(skillName, overrides);
74
+ console.log(chalk.green(`\n✓ Configuration saved to ~/.droid/skills/${skillName}/overrides.yaml`));
75
+ }
76
+ else {
77
+ console.log(chalk.gray('\nNo custom configuration set (using defaults).'));
78
+ }
79
+ }
80
+ //# sourceMappingURL=skill-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-config.js","sourceRoot":"","sources":["../../src/lib/skill-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { AITool, SkillStatus, type SkillManifest, type InstalledSkill } from './types.js';
2
+ /**
3
+ * Get the path to bundled skills directory
4
+ */
5
+ export declare function getBundledSkillsDir(): string;
6
+ /**
7
+ * Get the installation path for skills based on AI tool
8
+ */
9
+ export declare function getSkillsInstallPath(aiTool: AITool): string;
10
+ /**
11
+ * Get the commands installation path based on AI tool
12
+ */
13
+ export declare function getCommandsInstallPath(aiTool: AITool): string;
14
+ /**
15
+ * Get the path to the AI tool's main config markdown file
16
+ */
17
+ export declare function getAIConfigPath(aiTool: AITool): string;
18
+ /**
19
+ * Update the AI tool's config file with skill registrations
20
+ */
21
+ export declare function updateAIConfigSkills(aiTool: AITool, installedSkills: string[]): void;
22
+ /**
23
+ * Load a skill manifest from a skill directory
24
+ */
25
+ export declare function loadSkillManifest(skillDir: string): SkillManifest | null;
26
+ /**
27
+ * Get all bundled skills
28
+ */
29
+ export declare function getBundledSkills(): SkillManifest[];
30
+ /**
31
+ * Check if a skill is installed
32
+ */
33
+ export declare function isSkillInstalled(skillName: string): boolean;
34
+ /**
35
+ * Get installed skill info
36
+ */
37
+ export declare function getInstalledSkill(skillName: string): InstalledSkill | null;
38
+ /**
39
+ * Install a skill
40
+ */
41
+ export declare function installSkill(skillName: string): {
42
+ success: boolean;
43
+ message: string;
44
+ };
45
+ /**
46
+ * Uninstall a skill
47
+ */
48
+ export declare function uninstallSkill(skillName: string): {
49
+ success: boolean;
50
+ message: string;
51
+ };
52
+ /**
53
+ * Get skill status display string
54
+ */
55
+ export declare function getSkillStatusDisplay(status?: SkillStatus): string;
56
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAS1F;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAO3D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAO7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAqCpF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAaxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,EAAE,CAmBlD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAG1E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAkErF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAqCvF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,CAUlE"}
@@ -0,0 +1,245 @@
1
+ import { existsSync, readdirSync, readFileSync, mkdirSync, writeFileSync, cpSync, rmSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { homedir } from 'os';
4
+ import { fileURLToPath } from 'url';
5
+ import YAML from 'yaml';
6
+ import { loadConfig, saveConfig } from './config.js';
7
+ import { AITool, SkillStatus } from './types.js';
8
+ // Marker comments for CLAUDE.md skill registration
9
+ const DROID_SKILLS_START = '<!-- droid-skills-start -->';
10
+ const DROID_SKILLS_END = '<!-- droid-skills-end -->';
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+ const BUNDLED_SKILLS_DIR = join(__dirname, '../skills');
13
+ /**
14
+ * Get the path to bundled skills directory
15
+ */
16
+ export function getBundledSkillsDir() {
17
+ return BUNDLED_SKILLS_DIR;
18
+ }
19
+ /**
20
+ * Get the installation path for skills based on AI tool
21
+ */
22
+ export function getSkillsInstallPath(aiTool) {
23
+ switch (aiTool) {
24
+ case AITool.ClaudeCode:
25
+ return join(homedir(), '.claude', 'skills');
26
+ case AITool.OpenCode:
27
+ return join(homedir(), '.config', 'opencode', 'skills');
28
+ }
29
+ }
30
+ /**
31
+ * Get the commands installation path based on AI tool
32
+ */
33
+ export function getCommandsInstallPath(aiTool) {
34
+ switch (aiTool) {
35
+ case AITool.ClaudeCode:
36
+ return join(homedir(), '.claude', 'commands');
37
+ case AITool.OpenCode:
38
+ return join(homedir(), '.config', 'opencode', 'command');
39
+ }
40
+ }
41
+ /**
42
+ * Get the path to the AI tool's main config markdown file
43
+ */
44
+ export function getAIConfigPath(aiTool) {
45
+ switch (aiTool) {
46
+ case AITool.ClaudeCode:
47
+ return join(homedir(), '.claude', 'CLAUDE.md');
48
+ case AITool.OpenCode:
49
+ return join(homedir(), '.config', 'opencode', 'AGENTS.md');
50
+ }
51
+ }
52
+ /**
53
+ * Update the AI tool's config file with skill registrations
54
+ */
55
+ export function updateAIConfigSkills(aiTool, installedSkills) {
56
+ const configPath = getAIConfigPath(aiTool);
57
+ let content = '';
58
+ if (existsSync(configPath)) {
59
+ content = readFileSync(configPath, 'utf-8');
60
+ }
61
+ // Generate skills section
62
+ const skillLines = installedSkills.map(name => {
63
+ const relativePath = `skills/${name}/SKILL.md`;
64
+ return `- [${name}](${relativePath})`;
65
+ });
66
+ const skillsSection = installedSkills.length > 0
67
+ ? `${DROID_SKILLS_START}\n## Droid Skills\n\n${skillLines.join('\n')}\n${DROID_SKILLS_END}`
68
+ : '';
69
+ // Check if section already exists
70
+ const startIdx = content.indexOf(DROID_SKILLS_START);
71
+ const endIdx = content.indexOf(DROID_SKILLS_END);
72
+ if (startIdx !== -1 && endIdx !== -1) {
73
+ // Replace existing section
74
+ content = content.slice(0, startIdx) + skillsSection + content.slice(endIdx + DROID_SKILLS_END.length);
75
+ }
76
+ else if (skillsSection) {
77
+ // Append new section
78
+ content = content.trim() + '\n\n' + skillsSection + '\n';
79
+ }
80
+ // Ensure parent directory exists
81
+ const configDir = dirname(configPath);
82
+ if (!existsSync(configDir)) {
83
+ mkdirSync(configDir, { recursive: true });
84
+ }
85
+ writeFileSync(configPath, content, 'utf-8');
86
+ }
87
+ /**
88
+ * Load a skill manifest from a skill directory
89
+ */
90
+ export function loadSkillManifest(skillDir) {
91
+ const manifestPath = join(skillDir, 'SKILL.yaml');
92
+ if (!existsSync(manifestPath)) {
93
+ return null;
94
+ }
95
+ try {
96
+ const content = readFileSync(manifestPath, 'utf-8');
97
+ return YAML.parse(content);
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ }
103
+ /**
104
+ * Get all bundled skills
105
+ */
106
+ export function getBundledSkills() {
107
+ if (!existsSync(BUNDLED_SKILLS_DIR)) {
108
+ return [];
109
+ }
110
+ const skillDirs = readdirSync(BUNDLED_SKILLS_DIR, { withFileTypes: true })
111
+ .filter((dirent) => dirent.isDirectory())
112
+ .map((dirent) => dirent.name);
113
+ const skills = [];
114
+ for (const skillDir of skillDirs) {
115
+ const manifest = loadSkillManifest(join(BUNDLED_SKILLS_DIR, skillDir));
116
+ if (manifest) {
117
+ skills.push(manifest);
118
+ }
119
+ }
120
+ return skills;
121
+ }
122
+ /**
123
+ * Check if a skill is installed
124
+ */
125
+ export function isSkillInstalled(skillName) {
126
+ const config = loadConfig();
127
+ return skillName in config.skills;
128
+ }
129
+ /**
130
+ * Get installed skill info
131
+ */
132
+ export function getInstalledSkill(skillName) {
133
+ const config = loadConfig();
134
+ return config.skills[skillName] || null;
135
+ }
136
+ /**
137
+ * Install a skill
138
+ */
139
+ export function installSkill(skillName) {
140
+ const config = loadConfig();
141
+ const bundledSkillDir = join(BUNDLED_SKILLS_DIR, skillName);
142
+ if (!existsSync(bundledSkillDir)) {
143
+ return { success: false, message: `Skill '${skillName}' not found` };
144
+ }
145
+ const manifest = loadSkillManifest(bundledSkillDir);
146
+ if (!manifest) {
147
+ return { success: false, message: `Invalid skill manifest for '${skillName}'` };
148
+ }
149
+ // Check dependencies
150
+ if (manifest.dependencies) {
151
+ for (const dep of manifest.dependencies) {
152
+ if (!isSkillInstalled(dep)) {
153
+ return {
154
+ success: false,
155
+ message: `Missing dependency: '${dep}'. Install it first with \`droid install ${dep}\``,
156
+ };
157
+ }
158
+ }
159
+ }
160
+ const skillsPath = getSkillsInstallPath(config.ai_tool);
161
+ const targetSkillDir = join(skillsPath, skillName);
162
+ // Ensure skills directory exists
163
+ if (!existsSync(skillsPath)) {
164
+ mkdirSync(skillsPath, { recursive: true });
165
+ }
166
+ // Copy SKILL.md (the actual skill file for Claude Code / OpenCode)
167
+ const skillMdSource = join(bundledSkillDir, 'SKILL.md');
168
+ if (existsSync(skillMdSource)) {
169
+ if (!existsSync(targetSkillDir)) {
170
+ mkdirSync(targetSkillDir, { recursive: true });
171
+ }
172
+ const skillMdTarget = join(targetSkillDir, 'SKILL.md');
173
+ const content = readFileSync(skillMdSource, 'utf-8');
174
+ writeFileSync(skillMdTarget, content);
175
+ }
176
+ // Copy commands if present
177
+ const commandsSource = join(bundledSkillDir, 'commands');
178
+ if (existsSync(commandsSource)) {
179
+ const commandsPath = getCommandsInstallPath(config.ai_tool);
180
+ if (!existsSync(commandsPath)) {
181
+ mkdirSync(commandsPath, { recursive: true });
182
+ }
183
+ cpSync(commandsSource, commandsPath, { recursive: true });
184
+ }
185
+ // Update config
186
+ config.skills[skillName] = {
187
+ version: manifest.version,
188
+ installed_at: new Date().toISOString(),
189
+ };
190
+ saveConfig(config);
191
+ // Update AI tool's config file with skill reference
192
+ const installedSkillNames = Object.keys(config.skills);
193
+ updateAIConfigSkills(config.ai_tool, installedSkillNames);
194
+ return { success: true, message: `Installed ${skillName} v${manifest.version}` };
195
+ }
196
+ /**
197
+ * Uninstall a skill
198
+ */
199
+ export function uninstallSkill(skillName) {
200
+ const config = loadConfig();
201
+ if (!isSkillInstalled(skillName)) {
202
+ return { success: false, message: `Skill '${skillName}' is not installed` };
203
+ }
204
+ // Remove skill files from AI tool location
205
+ const skillsPath = getSkillsInstallPath(config.ai_tool);
206
+ const skillDir = join(skillsPath, skillName);
207
+ if (existsSync(skillDir)) {
208
+ rmSync(skillDir, { recursive: true });
209
+ }
210
+ // Remove command files if they exist
211
+ const bundledSkillDir = join(BUNDLED_SKILLS_DIR, skillName);
212
+ const commandsSource = join(bundledSkillDir, 'commands');
213
+ if (existsSync(commandsSource)) {
214
+ const commandsPath = getCommandsInstallPath(config.ai_tool);
215
+ const commandFiles = readdirSync(commandsSource);
216
+ for (const file of commandFiles) {
217
+ const commandPath = join(commandsPath, file);
218
+ if (existsSync(commandPath)) {
219
+ rmSync(commandPath);
220
+ }
221
+ }
222
+ }
223
+ // Remove from config
224
+ delete config.skills[skillName];
225
+ saveConfig(config);
226
+ // Update AI tool's config file to remove skill reference
227
+ const installedSkillNames = Object.keys(config.skills);
228
+ updateAIConfigSkills(config.ai_tool, installedSkillNames);
229
+ return { success: true, message: `Uninstalled ${skillName}` };
230
+ }
231
+ /**
232
+ * Get skill status display string
233
+ */
234
+ export function getSkillStatusDisplay(status) {
235
+ switch (status) {
236
+ case SkillStatus.Alpha:
237
+ return '[alpha]';
238
+ case SkillStatus.Beta:
239
+ return '[beta]';
240
+ case SkillStatus.Stable:
241
+ default:
242
+ return '';
243
+ }
244
+ }
245
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ export declare enum AITool {
2
+ ClaudeCode = "claude-code",
3
+ OpenCode = "opencode"
4
+ }
5
+ /**
6
+ * Get the AI's mention tag
7
+ * Always @droid - consistent branding regardless of underlying AI tool
8
+ */
9
+ export declare function getAITag(): string;
10
+ export declare enum BuiltInOutput {
11
+ Terminal = "terminal",
12
+ Editor = "editor"
13
+ }
14
+ export type OutputPreference = BuiltInOutput | string;
15
+ export declare enum SkillStatus {
16
+ Stable = "stable",
17
+ Beta = "beta",
18
+ Alpha = "alpha"
19
+ }
20
+ export declare enum ConfigOptionType {
21
+ String = "string",
22
+ Boolean = "boolean",
23
+ Select = "select"
24
+ }
25
+ export interface DroidConfig {
26
+ ai_tool: AITool;
27
+ user_mention: string;
28
+ output_preference: OutputPreference;
29
+ git_username: string;
30
+ skills: Record<string, InstalledSkill>;
31
+ }
32
+ export interface InstalledSkill {
33
+ version: string;
34
+ installed_at: string;
35
+ }
36
+ export interface SkillManifest {
37
+ name: string;
38
+ description: string;
39
+ version: string;
40
+ status?: SkillStatus;
41
+ dependencies?: string[];
42
+ config_schema?: Record<string, ConfigOption>;
43
+ provides_output?: boolean;
44
+ }
45
+ export interface ConfigOption {
46
+ type: ConfigOptionType;
47
+ description: string;
48
+ default?: string | boolean;
49
+ options?: string[];
50
+ }
51
+ export interface SkillOverrides {
52
+ [key: string]: string | boolean | number;
53
+ }
54
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,oBAAY,MAAM;IAChB,UAAU,gBAAgB;IAC1B,QAAQ,aAAa;CACtB;AAED;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAGD,oBAAY,aAAa;IACvB,QAAQ,aAAa;IACrB,MAAM,WAAW;CAClB;AAGD,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,MAAM,CAAC;AAEtD,oBAAY,WAAW;IACrB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,oBAAY,gBAAgB;IAC1B,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,gBAAgB,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAE7C,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;CAC1C"}