@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
@@ -0,0 +1,116 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import YAML from 'yaml';
5
+ import { loadConfig } from './config.js';
6
+ import { getPlatformTools } from './types.js';
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ const BUNDLED_TOOLS_DIR = join(__dirname, '../tools');
9
+ /**
10
+ * Get the path to bundled tools directory
11
+ */
12
+ export function getBundledToolsDir() {
13
+ return BUNDLED_TOOLS_DIR;
14
+ }
15
+ /**
16
+ * Load a tool manifest from a tool directory
17
+ */
18
+ export function loadToolManifest(toolDir) {
19
+ const manifestPath = join(toolDir, 'TOOL.yaml');
20
+ if (!existsSync(manifestPath)) {
21
+ return null;
22
+ }
23
+ try {
24
+ const content = readFileSync(manifestPath, 'utf-8');
25
+ const parsed = YAML.parse(content);
26
+ // Normalize includes structure
27
+ const includes = {
28
+ skills: parsed.includes?.skills || [],
29
+ commands: parsed.includes?.commands || [],
30
+ agents: parsed.includes?.agents || [],
31
+ };
32
+ return {
33
+ ...parsed,
34
+ includes,
35
+ };
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ /**
42
+ * Get all bundled tools
43
+ */
44
+ export function getBundledTools() {
45
+ if (!existsSync(BUNDLED_TOOLS_DIR)) {
46
+ return [];
47
+ }
48
+ const toolDirs = readdirSync(BUNDLED_TOOLS_DIR, { withFileTypes: true })
49
+ .filter((dirent) => dirent.isDirectory())
50
+ .map((dirent) => dirent.name);
51
+ const tools = [];
52
+ for (const toolName of toolDirs) {
53
+ const manifest = loadToolManifest(join(BUNDLED_TOOLS_DIR, toolName));
54
+ if (manifest) {
55
+ tools.push(manifest);
56
+ }
57
+ }
58
+ return tools;
59
+ }
60
+ /**
61
+ * Check if a tool is installed (any of its required skills are installed)
62
+ */
63
+ export function isToolInstalled(toolName) {
64
+ const config = loadConfig();
65
+ const installedTools = getPlatformTools(config);
66
+ // A tool is installed if any of its required skills are in the installed tools
67
+ const tool = getBundledTools().find(t => t.name === toolName);
68
+ if (!tool)
69
+ return false;
70
+ const requiredSkills = tool.includes.skills
71
+ .filter(s => s.required)
72
+ .map(s => s.name);
73
+ // Tool is installed if at least one required skill is installed
74
+ return requiredSkills.some(skillName => skillName in installedTools);
75
+ }
76
+ /**
77
+ * Get the installed version of a tool (from its primary skill)
78
+ */
79
+ export function getInstalledToolVersion(toolName) {
80
+ const config = loadConfig();
81
+ const installedTools = getPlatformTools(config);
82
+ const tool = getBundledTools().find(t => t.name === toolName);
83
+ if (!tool)
84
+ return null;
85
+ // Get version from the first installed required skill
86
+ const requiredSkills = tool.includes.skills
87
+ .filter(s => s.required)
88
+ .map(s => s.name);
89
+ for (const skillName of requiredSkills) {
90
+ if (installedTools[skillName]) {
91
+ return installedTools[skillName].version;
92
+ }
93
+ }
94
+ return null;
95
+ }
96
+ /**
97
+ * Check if a tool has an update available
98
+ */
99
+ export function getToolUpdateStatus(toolName) {
100
+ const installedVersion = getInstalledToolVersion(toolName);
101
+ const tool = getBundledTools().find(t => t.name === toolName);
102
+ const bundledVersion = tool?.version || null;
103
+ if (!installedVersion || !bundledVersion) {
104
+ return {
105
+ hasUpdate: false,
106
+ installedVersion,
107
+ bundledVersion,
108
+ };
109
+ }
110
+ return {
111
+ hasUpdate: bundledVersion !== installedVersion,
112
+ installedVersion,
113
+ bundledVersion,
114
+ };
115
+ }
116
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/lib/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAwC,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpF,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEhD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnC,+BAA+B;QAC/B,MAAM,QAAQ,GAAiB;YAC7B,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE;YACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE;YACzC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE;SACtC,CAAC;QAEF,OAAO;YACL,GAAG,MAAM;YACT,QAAQ;SACO,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SACrE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;SACxC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC;QACrE,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEhD,+EAA+E;IAC/E,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC9D,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;SACxC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEpB,gEAAgE;IAChE,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,IAAI,cAAc,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC9D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,sDAAsD;IACtD,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;SACxC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEpB,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;QACvC,IAAI,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAKlD,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC;IAE7C,IAAI,CAAC,gBAAgB,IAAI,CAAC,cAAc,EAAE,CAAC;QACzC,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,gBAAgB;YAChB,cAAc;SACf,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,cAAc,KAAK,gBAAgB;QAC9C,gBAAgB;QAChB,cAAc;KACf,CAAC;AACJ,CAAC"}
@@ -1,7 +1,10 @@
1
- export declare enum AITool {
1
+ export declare enum Platform {
2
2
  ClaudeCode = "claude-code",
3
3
  OpenCode = "opencode"
4
4
  }
5
+ declare const AIToolValue: typeof Platform;
6
+ export { AIToolValue as AITool };
7
+ export type AITool = Platform;
5
8
  /**
6
9
  * Get the AI's mention tag
7
10
  * Always @droid - consistent branding regardless of underlying AI tool
@@ -22,13 +25,31 @@ export declare enum ConfigOptionType {
22
25
  Boolean = "boolean",
23
26
  Select = "select"
24
27
  }
28
+ export interface PlatformConfig {
29
+ tools: Record<string, InstalledSkill>;
30
+ }
25
31
  export interface DroidConfig {
26
- ai_tool: AITool;
32
+ platform: Platform;
33
+ user_mention: string;
34
+ output_preference: OutputPreference;
35
+ git_username: string;
36
+ platforms: Record<string, PlatformConfig>;
37
+ }
38
+ export interface LegacyDroidConfig {
39
+ ai_tool: Platform;
27
40
  user_mention: string;
28
41
  output_preference: OutputPreference;
29
42
  git_username: string;
30
43
  skills: Record<string, InstalledSkill>;
31
44
  }
45
+ /**
46
+ * Get installed tools for the current platform
47
+ */
48
+ export declare function getPlatformTools(config: DroidConfig): Record<string, InstalledSkill>;
49
+ /**
50
+ * Set installed tools for the current platform
51
+ */
52
+ export declare function setPlatformTools(config: DroidConfig, tools: Record<string, InstalledSkill>): void;
32
53
  export interface InstalledSkill {
33
54
  version: string;
34
55
  installed_at: string;
@@ -58,4 +79,26 @@ export interface ConfigOption {
58
79
  export interface SkillOverrides {
59
80
  [key: string]: string | boolean | number;
60
81
  }
82
+ /**
83
+ * Tool manifest structure (TOOL.yaml)
84
+ */
85
+ export interface ToolSkillInclude {
86
+ name: string;
87
+ required: boolean;
88
+ description?: string;
89
+ }
90
+ export interface ToolIncludes {
91
+ skills: ToolSkillInclude[];
92
+ commands: string[];
93
+ agents: string[];
94
+ }
95
+ export interface ToolManifest {
96
+ name: string;
97
+ description: string;
98
+ version: string;
99
+ status?: SkillStatus;
100
+ includes: ToolIncludes;
101
+ dependencies?: string[];
102
+ config_schema?: Record<string, ConfigOption>;
103
+ }
61
104
  //# sourceMappingURL=types.d.ts.map
@@ -1 +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;IACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;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;IAE1B,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAG1B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
package/dist/lib/types.js CHANGED
@@ -1,8 +1,12 @@
1
- export var AITool;
2
- (function (AITool) {
3
- AITool["ClaudeCode"] = "claude-code";
4
- AITool["OpenCode"] = "opencode";
5
- })(AITool || (AITool = {}));
1
+ export var Platform;
2
+ (function (Platform) {
3
+ Platform["ClaudeCode"] = "claude-code";
4
+ Platform["OpenCode"] = "opencode";
5
+ })(Platform || (Platform = {}));
6
+ // Backwards compatibility alias - using different names to avoid redeclare error
7
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
8
+ const AIToolValue = Platform;
9
+ export { AIToolValue as AITool };
6
10
  /**
7
11
  * Get the AI's mention tag
8
12
  * Always @droid - consistent branding regardless of underlying AI tool
@@ -28,4 +32,19 @@ export var ConfigOptionType;
28
32
  ConfigOptionType["Boolean"] = "boolean";
29
33
  ConfigOptionType["Select"] = "select";
30
34
  })(ConfigOptionType || (ConfigOptionType = {}));
35
+ /**
36
+ * Get installed tools for the current platform
37
+ */
38
+ export function getPlatformTools(config) {
39
+ return config.platforms[config.platform]?.tools ?? {};
40
+ }
41
+ /**
42
+ * Set installed tools for the current platform
43
+ */
44
+ export function setPlatformTools(config, tools) {
45
+ if (!config.platforms[config.platform]) {
46
+ config.platforms[config.platform] = { tools: {} };
47
+ }
48
+ config.platforms[config.platform].tools = tools;
49
+ }
31
50
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,MAGX;AAHD,WAAY,MAAM;IAChB,oCAA0B,CAAA;IAC1B,+BAAqB,CAAA;AACvB,CAAC,EAHW,MAAM,KAAN,MAAM,QAGjB;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,sCAAqB,CAAA;IACrB,kCAAiB,CAAA;AACnB,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AAKD,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,4BAAa,CAAA;IACb,8BAAe,CAAA;AACjB,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAED,MAAM,CAAN,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,qCAAiB,CAAA;IACjB,uCAAmB,CAAA;IACnB,qCAAiB,CAAA;AACnB,CAAC,EAJW,gBAAgB,KAAhB,gBAAgB,QAI3B"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,sCAA0B,CAAA;IAC1B,iCAAqB,CAAA;AACvB,CAAC,EAHW,QAAQ,KAAR,QAAQ,QAGnB;AAED,iFAAiF;AACjF,6DAA6D;AAC7D,MAAM,WAAW,GAAG,QAAQ,CAAC;AAC7B,OAAO,EAAE,WAAW,IAAI,MAAM,EAAE,CAAC;AAGjC;;;GAGG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,sCAAqB,CAAA;IACrB,kCAAiB,CAAA;AACnB,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AAKD,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,4BAAa,CAAA;IACb,8BAAe,CAAA;AACjB,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAED,MAAM,CAAN,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,qCAAiB,CAAA;IACjB,uCAAmB,CAAA;IACnB,qCAAiB,CAAA;AACnB,CAAC,EAJW,gBAAgB,KAAhB,gBAAgB,QAI3B;AAuBD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB;IAClD,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB,EAAE,KAAqC;IACzF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC;IACD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;AAClD,CAAC"}
@@ -0,0 +1,27 @@
1
+ name: brain
2
+ description: "Collaborative scratchpad for planning and research. Create docs with /brain plan, /brain research, or /brain review. Use @mentions for async discussion. Docs persist across sessions."
3
+ version: 0.2.0
4
+ status: beta
5
+
6
+ includes:
7
+ skills:
8
+ - name: brain
9
+ required: true
10
+ - name: brain-obsidian
11
+ required: false
12
+ description: "Obsidian vault integration with YAML frontmatter and wikilinks"
13
+ commands:
14
+ - brain
15
+ - scratchpad
16
+ agents: []
17
+
18
+ dependencies: []
19
+
20
+ config_schema:
21
+ brain_dir:
22
+ type: string
23
+ description: Directory for brain docs (default varies by platform)
24
+ inbox_folder:
25
+ type: string
26
+ description: Subfolder for new docs (empty = flat structure)
27
+ default: ""
@@ -0,0 +1,21 @@
1
+ name: coach
2
+ description: "Learning-mode AI assistance - AI as coach, not crutch. Use /coach plan for co-authored planning, /coach scaffold for structure with hints, /coach review for Socratic questions."
3
+ version: 0.1.0
4
+ status: beta
5
+
6
+ includes:
7
+ skills:
8
+ - name: coach
9
+ required: true
10
+ commands:
11
+ - coach
12
+ agents: []
13
+
14
+ dependencies:
15
+ - comments
16
+
17
+ config_schema:
18
+ scaffold_verbosity:
19
+ type: string
20
+ description: "How detailed scaffold hints should be: minimal, medium, detailed"
21
+ default: "medium"
@@ -0,0 +1,18 @@
1
+ name: code-review
2
+ description: "Comprehensive code review using specialized agents. Reviews PRs, staged changes, branches, or specific files with confidence scoring."
3
+ version: 0.1.0
4
+ status: alpha
5
+
6
+ includes:
7
+ skills:
8
+ - name: code-review
9
+ required: true
10
+ commands:
11
+ - code-review
12
+ agents:
13
+ - edi-standards-reviewer
14
+ - error-handling-reviewer
15
+ - test-coverage-analyzer
16
+ - type-reviewer
17
+
18
+ dependencies: []
@@ -17,29 +17,46 @@ Review target: $ARGUMENTS
17
17
  /code-review path/to/file # Review specific file
18
18
  ```
19
19
 
20
+ ### Step 0: Check for Brain Integration
21
+
22
+ **If the `brain` skill is installed** (check for `~/.claude/skills/brain/SKILL.md` or `~/.config/opencode/skills/brain/SKILL.md`):
23
+
24
+ Ask the user: **"Would you like the review results saved to a `/brain review` doc?"**
25
+
26
+ - If yes: Create a brain review doc at the start using `/brain review {PR title or branch name}`
27
+ - The final report will be written to the brain doc instead of just displayed
28
+ - This allows for async discussion via `@droid`/`@{user}` comments
29
+
30
+ If brain skill is not installed or user declines, proceed with normal terminal output.
31
+
20
32
  ### Step 1: Determine Review Scope
21
33
 
22
34
  Parse the argument to determine what to review:
23
35
 
24
36
  **If argument starts with `#` or is a number (e.g., `#123` or `123`):**
37
+
25
38
  - This is a PR number
26
39
  - Fetch PR details: `gh pr view $PR_NUMBER --json title,body,baseRefName,headRefName,files`
27
40
  - Get the diff: `gh pr diff $PR_NUMBER`
28
41
  - Note the PR author and description for context
29
42
 
30
43
  **If argument is `staged` or empty:**
44
+
31
45
  - Review staged changes: `git diff --cached`
32
46
 
33
47
  **If argument is `branch`:**
48
+
34
49
  - Review current branch vs main: `git diff origin/main...HEAD`
35
50
 
36
51
  **If argument is a file path:**
52
+
37
53
  - Review specific file: `git diff HEAD -- $FILE_PATH`
38
54
  - If no changes, review the entire file for issues
39
55
 
40
56
  ### Step 2: Gather Context
41
57
 
42
58
  For PR reviews, also fetch:
59
+
43
60
  - PR description (may contain context about the change)
44
61
  - Linked issues: `gh pr view $PR_NUMBER --json body` and parse for #issue refs
45
62
  - Changed files list for targeted agent assignment
@@ -54,6 +71,7 @@ Launch these agents in parallel using the Task tool with `run_in_background: tru
54
71
  4. **type-reviewer**: Type design, interface contracts
55
72
 
56
73
  Pass each agent:
74
+
57
75
  1. The diff content
58
76
  2. The full file content for changed files (for context)
59
77
  3. PR description if available
@@ -70,15 +88,18 @@ Filter out issues with confidence < 80.
70
88
  Compile findings into a prioritized report:
71
89
 
72
90
  **PR #123: "Add partnership billing events"** (if reviewing a PR)
73
- *Author: @username*
91
+ _Author: @username_
74
92
 
75
93
  **Critical** (security, data loss, billing errors)
94
+
76
95
  - `file.ts:42` - Issue description
77
96
 
78
97
  **Important** (bugs, missing tests, type issues)
98
+
79
99
  - `file.ts:67` - Issue description
80
100
 
81
101
  **Suggestions** (style, readability)
102
+
82
103
  - `file.ts:89` - Issue description
83
104
 
84
105
  **Summary**: X critical, Y important, Z suggestions across N files.
@@ -86,6 +107,7 @@ Compile findings into a prioritized report:
86
107
  ### Step 6: Offer Actions (for PRs)
87
108
 
88
109
  After presenting the report, offer:
110
+
89
111
  - "Would you like me to post this as a PR comment?"
90
112
  - "Should I suggest fixes for any of these issues?"
91
113
  - "Want me to check out this branch and fix the critical issues?"
@@ -0,0 +1,27 @@
1
+ name: comments
2
+ description: "Enable inline conversations using @droid/@user markers. Tag @droid to ask the AI, AI responds with @{your-name}. Ideal for code review notes and async collaboration."
3
+ version: 0.2.2
4
+ status: beta
5
+
6
+ includes:
7
+ skills:
8
+ - name: comments
9
+ required: true
10
+ commands:
11
+ - comments
12
+ agents: []
13
+
14
+ dependencies: []
15
+
16
+ config_schema:
17
+ user_mention:
18
+ type: string
19
+ description: Override the global user mention for this skill
20
+ ai_mentions:
21
+ type: string
22
+ description: Additional AI mentions to recognize (comma-separated)
23
+ default: ""
24
+ preserve_comments:
25
+ type: boolean
26
+ description: Keep original comments after addressing (vs removing them)
27
+ default: true
@@ -0,0 +1,26 @@
1
+ name: project
2
+ description: "Manage project context files for persistent AI memory across sessions. Load, update, or create project context before working on multi-session features."
3
+ version: 0.1.2
4
+ status: beta
5
+
6
+ includes:
7
+ skills:
8
+ - name: project
9
+ required: true
10
+ commands:
11
+ - project
12
+ agents: []
13
+
14
+ dependencies: []
15
+
16
+ config_schema:
17
+ projects_dir:
18
+ type: string
19
+ description: Path to projects directory (default varies by platform)
20
+ preset:
21
+ type: select
22
+ description: Output format for templates
23
+ default: "markdown"
24
+ options:
25
+ - markdown
26
+ - obsidian
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderful/droid",
3
- "version": "0.10.4",
3
+ "version": "0.11.0",
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": "tsc && cp -r src/skills dist/ && cp -r src/agents dist/",
11
+ "build": "tsc && cp -r src/tools dist/",
12
12
  "dev": "tsc --watch",
13
13
  "start": "bun dist/bin/droid.js",
14
14
  "test": "bun test src/",
package/src/bin/droid.ts CHANGED
@@ -31,26 +31,26 @@ program
31
31
  .action(configCommand);
32
32
 
33
33
  program
34
- .command('skills')
35
- .description('Browse and manage available skills')
34
+ .command('tools')
35
+ .description('Browse and manage available tools')
36
36
  .action(skillsCommand);
37
37
 
38
38
  program
39
- .command('install <skill>')
40
- .description('Install a skill and run its setup wizard')
39
+ .command('install <tool>')
40
+ .description('Install a tool and run its setup wizard')
41
41
  .action(installCommand);
42
42
 
43
43
  program
44
- .command('uninstall <skill>')
45
- .description('Uninstall a skill')
44
+ .command('uninstall <tool>')
45
+ .description('Uninstall a tool')
46
46
  .action(uninstallCommand);
47
47
 
48
48
  program
49
49
  .command('update')
50
- .description('Update droid and installed skills')
51
- .option('--skills', 'Only update skills')
50
+ .description('Update droid and installed tools')
51
+ .option('--tools', 'Only update tools')
52
52
  .option('--cli', 'Only update the CLI')
53
- .argument('[skill]', 'Update a specific skill')
53
+ .argument('[tool]', 'Update a specific tool')
54
54
  .action(updateCommand);
55
55
 
56
56
  program
@@ -1,50 +1,51 @@
1
1
  import chalk from 'chalk';
2
- import { join } from 'path';
3
- import { installSkill, isSkillInstalled, getBundledSkills, loadSkillManifest, getBundledSkillsDir } from '../lib/skills.js';
2
+ import { installSkill } from '../lib/skills.js';
3
+ import { getBundledTools, isToolInstalled } from '../lib/tools.js';
4
4
  import { promptForSkillConfig } from '../lib/skill-config.js';
5
5
 
6
- export async function installCommand(skillName: string): Promise<void> {
7
- // Check if skill exists
8
- const skills = getBundledSkills();
9
- const skill = skills.find((s) => s.name === skillName);
6
+ export async function installCommand(toolName: string): Promise<void> {
7
+ // Check if tool exists
8
+ const tools = getBundledTools();
9
+ const tool = tools.find((t) => t.name === toolName);
10
10
 
11
- if (!skill) {
12
- console.error(chalk.red(`\n✗ Skill '${skillName}' not found`));
13
- console.log(chalk.gray('\nAvailable skills:'));
14
- for (const s of skills) {
15
- console.log(chalk.gray(` - ${s.name}`));
11
+ if (!tool) {
12
+ console.error(chalk.red(`\n✗ Tool '${toolName}' not found`));
13
+ console.log(chalk.gray('\nAvailable tools:'));
14
+ for (const t of tools) {
15
+ console.log(chalk.gray(` - ${t.name}`));
16
16
  }
17
17
  process.exit(1);
18
18
  }
19
19
 
20
20
  // Check if already installed
21
- if (isSkillInstalled(skillName)) {
22
- console.log(chalk.yellow(`\n⚠ Skill '${skillName}' is already installed`));
21
+ if (isToolInstalled(toolName)) {
22
+ console.log(chalk.yellow(`\n⚠ Tool '${toolName}' is already installed`));
23
23
  console.log(chalk.gray('Use `droid update` to update it, or uninstall first.'));
24
24
  return;
25
25
  }
26
26
 
27
- console.log(chalk.bold(`\n🤖 Installing ${skillName}...\n`));
27
+ console.log(chalk.bold(`\n🤖 Installing ${toolName}...\n`));
28
28
 
29
- const result = installSkill(skillName);
29
+ // Install via primary skill
30
+ const primarySkill = tool.includes.skills.find(s => s.required)?.name || toolName;
31
+ const result = installSkill(primarySkill);
30
32
 
31
33
  if (result.success) {
32
- console.log(chalk.green(`✓ ${result.message}`));
34
+ console.log(chalk.green(`✓ Installed ${toolName}`));
33
35
 
34
- // Check if skill has configurable options
35
- const manifest = loadSkillManifest(join(getBundledSkillsDir(), skillName));
36
- if (manifest?.config_schema && Object.keys(manifest.config_schema).length > 0) {
36
+ // Check if tool has configurable options
37
+ if (tool.config_schema && Object.keys(tool.config_schema).length > 0) {
37
38
  // If any config option lacks a default, go straight to config (it's required)
38
- const hasRequiredConfig = Object.values(manifest.config_schema).some(
39
+ const hasRequiredConfig = Object.values(tool.config_schema).some(
39
40
  (option) => option.default === undefined
40
41
  );
41
- await promptForSkillConfig(skillName, manifest.config_schema, !hasRequiredConfig);
42
+ await promptForSkillConfig(primarySkill, tool.config_schema, !hasRequiredConfig);
42
43
  }
43
44
 
44
45
  // Show next steps
45
46
  console.log(chalk.gray('\nNext steps:'));
46
- console.log(chalk.gray(' - Run your AI tool to start using the skill'));
47
- console.log(chalk.gray(` - Reconfigure anytime with \`droid skills\` → Configure`));
47
+ console.log(chalk.gray(' - Run your AI tool to start using it'));
48
+ console.log(chalk.gray(` - Reconfigure anytime with \`droid\` → Configure`));
48
49
  } else {
49
50
  console.error(chalk.red(`✗ ${result.message}`));
50
51
  process.exit(1);
@@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach, mock, spyOn } from 'bun:te
2
2
  import { existsSync, mkdirSync, rmSync, readFileSync, writeFileSync } from 'fs';
3
3
  import { join } from 'path';
4
4
  import { tmpdir } from 'os';
5
- import { AITool } from '../lib/types.js';
5
+ import { Platform } from '../lib/types.js';
6
6
 
7
7
  // We need to mock homedir() before importing the module
8
8
  // Create a test directory that will act as our fake home
@@ -11,7 +11,7 @@ let testHomeDir: string;
11
11
  // Mock the os module's homedir function
12
12
  const originalHomedir = await import('os').then(m => m.homedir);
13
13
 
14
- describe('configureAIToolPermissions', () => {
14
+ describe('configurePlatformPermissions', () => {
15
15
  beforeEach(() => {
16
16
  testHomeDir = join(tmpdir(), `droid-setup-test-${Date.now()}`);
17
17
  mkdirSync(testHomeDir, { recursive: true });