@orderful/droid 0.26.0 → 0.27.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 (146) hide show
  1. package/.claude-plugin/marketplace.json +7 -7
  2. package/AGENTS.md +36 -32
  3. package/CHANGELOG.md +29 -0
  4. package/dist/bin/droid.js +102 -24
  5. package/dist/index.js +59 -25
  6. package/dist/lib/migrations.d.ts +8 -0
  7. package/dist/lib/migrations.d.ts.map +1 -1
  8. package/dist/lib/skills.d.ts.map +1 -1
  9. package/dist/lib/tools.d.ts.map +1 -1
  10. package/dist/lib/types.d.ts +10 -2
  11. package/dist/lib/types.d.ts.map +1 -1
  12. package/dist/tools/brain/.claude-plugin/plugin.json +1 -1
  13. package/dist/tools/brain/TOOL.yaml +7 -5
  14. package/dist/tools/brain/commands/brain.md +17 -49
  15. package/dist/tools/brain/commands/scratchpad.md +13 -50
  16. package/{src/tools/brain/skills/droid-brain → dist/tools/brain/skills/brain}/SKILL.md +5 -5
  17. package/dist/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/SKILL.md +8 -8
  18. package/dist/tools/coach/.claude-plugin/plugin.json +1 -1
  19. package/dist/tools/coach/TOOL.yaml +4 -3
  20. package/dist/tools/coach/commands/coach.md +14 -54
  21. package/{src/tools/coach/skills/droid-coach → dist/tools/coach/skills/coach}/SKILL.md +4 -3
  22. package/dist/tools/code-review/.claude-plugin/plugin.json +1 -1
  23. package/dist/tools/code-review/TOOL.yaml +4 -3
  24. package/dist/tools/code-review/commands/code-review.md +18 -102
  25. package/dist/tools/code-review/skills/code-review/SKILL.md +154 -0
  26. package/dist/tools/codex/.claude-plugin/plugin.json +1 -1
  27. package/dist/tools/codex/TOOL.yaml +4 -3
  28. package/dist/tools/codex/commands/codex.md +18 -65
  29. package/dist/tools/codex/skills/{droid-codex → codex}/SKILL.md +64 -45
  30. package/{src/tools/codex/skills/droid-codex → dist/tools/codex/skills/codex}/references/loading.md +94 -55
  31. package/dist/tools/codex/skills/codex/scripts/git-finish-write.d.ts.map +1 -0
  32. package/dist/tools/codex/skills/codex/scripts/git-preamble.d.ts.map +1 -0
  33. package/dist/tools/codex/skills/codex/scripts/git-start-write.d.ts.map +1 -0
  34. package/dist/tools/comments/.claude-plugin/plugin.json +1 -1
  35. package/dist/tools/comments/TOOL.yaml +4 -3
  36. package/dist/tools/comments/commands/comments.md +12 -14
  37. package/{src/tools/comments/skills/droid-comments → dist/tools/comments/skills/comments}/SKILL.md +3 -1
  38. package/dist/tools/project/.claude-plugin/plugin.json +1 -1
  39. package/dist/tools/project/TOOL.yaml +4 -3
  40. package/dist/tools/project/commands/project.md +12 -27
  41. package/dist/tools/project/skills/{droid-project → project}/SKILL.md +12 -11
  42. package/dist/tools/tech-design/.claude-plugin/plugin.json +1 -1
  43. package/dist/tools/tech-design/TOOL.yaml +4 -3
  44. package/dist/tools/tech-design/commands/tech-design.md +18 -80
  45. package/{src/tools/tech-design/skills/droid-tech-design → dist/tools/tech-design/skills/tech-design}/SKILL.md +1 -1
  46. package/package.json +1 -1
  47. package/src/commands/tui/components/Badge.test.tsx +10 -4
  48. package/src/commands/tui.tsx +4 -4
  49. package/src/lib/migrations.ts +95 -4
  50. package/src/lib/skills.test.ts +199 -74
  51. package/src/lib/skills.ts +55 -54
  52. package/src/lib/tools.ts +19 -12
  53. package/src/lib/types.ts +20 -5
  54. package/src/tools/brain/.claude-plugin/plugin.json +1 -1
  55. package/src/tools/brain/TOOL.yaml +7 -5
  56. package/src/tools/brain/commands/brain.md +17 -49
  57. package/src/tools/brain/commands/scratchpad.md +13 -50
  58. package/{dist/tools/brain/skills/droid-brain → src/tools/brain/skills/brain}/SKILL.md +5 -5
  59. package/src/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/SKILL.md +8 -8
  60. package/src/tools/coach/.claude-plugin/plugin.json +1 -1
  61. package/src/tools/coach/TOOL.yaml +4 -3
  62. package/src/tools/coach/commands/coach.md +14 -54
  63. package/{dist/tools/coach/skills/droid-coach → src/tools/coach/skills/coach}/SKILL.md +4 -3
  64. package/src/tools/code-review/.claude-plugin/plugin.json +1 -1
  65. package/src/tools/code-review/TOOL.yaml +4 -3
  66. package/src/tools/code-review/commands/code-review.md +18 -102
  67. package/src/tools/code-review/skills/code-review/SKILL.md +154 -0
  68. package/src/tools/codex/.claude-plugin/plugin.json +1 -1
  69. package/src/tools/codex/TOOL.yaml +4 -3
  70. package/src/tools/codex/commands/codex.md +18 -65
  71. package/src/tools/codex/skills/{droid-codex → codex}/SKILL.md +64 -45
  72. package/{dist/tools/codex/skills/droid-codex → src/tools/codex/skills/codex}/references/loading.md +94 -55
  73. package/src/tools/comments/.claude-plugin/plugin.json +1 -1
  74. package/src/tools/comments/TOOL.yaml +4 -3
  75. package/src/tools/comments/commands/comments.md +12 -14
  76. package/{dist/tools/comments/skills/droid-comments → src/tools/comments/skills/comments}/SKILL.md +3 -1
  77. package/src/tools/project/.claude-plugin/plugin.json +1 -1
  78. package/src/tools/project/TOOL.yaml +4 -3
  79. package/src/tools/project/commands/project.md +12 -27
  80. package/src/tools/project/skills/{droid-project → project}/SKILL.md +12 -11
  81. package/src/tools/tech-design/.claude-plugin/plugin.json +1 -1
  82. package/src/tools/tech-design/TOOL.yaml +4 -3
  83. package/src/tools/tech-design/commands/tech-design.md +18 -80
  84. package/{dist/tools/tech-design/skills/droid-tech-design → src/tools/tech-design/skills/tech-design}/SKILL.md +1 -1
  85. package/dist/tools/code-review/skills/droid-code-review/SKILL.md +0 -55
  86. package/dist/tools/codex/skills/droid-codex/scripts/git-finish-write.d.ts.map +0 -1
  87. package/dist/tools/codex/skills/droid-codex/scripts/git-preamble.d.ts.map +0 -1
  88. package/dist/tools/codex/skills/droid-codex/scripts/git-start-write.d.ts.map +0 -1
  89. package/src/tools/code-review/skills/droid-code-review/SKILL.md +0 -55
  90. /package/dist/tools/brain/skills/{droid-brain → brain}/references/metadata.md +0 -0
  91. /package/dist/tools/brain/skills/{droid-brain → brain}/references/naming.md +0 -0
  92. /package/dist/tools/brain/skills/{droid-brain → brain}/references/templates.md +0 -0
  93. /package/dist/tools/brain/skills/{droid-brain → brain}/references/workflows.md +0 -0
  94. /package/dist/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/templates.md +0 -0
  95. /package/dist/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/workflows.md +0 -0
  96. /package/dist/tools/codex/skills/{droid-codex → codex}/references/creating.md +0 -0
  97. /package/dist/tools/codex/skills/{droid-codex → codex}/references/decisions.md +0 -0
  98. /package/dist/tools/codex/skills/{droid-codex → codex}/references/topics.md +0 -0
  99. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-finish-write.d.ts +0 -0
  100. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-finish-write.ts +0 -0
  101. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-preamble.d.ts +0 -0
  102. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-preamble.ts +0 -0
  103. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-scripts.test.ts +0 -0
  104. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-start-write.d.ts +0 -0
  105. /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-start-write.ts +0 -0
  106. /package/dist/tools/project/skills/{droid-project → project}/references/changelog.md +0 -0
  107. /package/dist/tools/project/skills/{droid-project → project}/references/creating.md +0 -0
  108. /package/dist/tools/project/skills/{droid-project → project}/references/loading.md +0 -0
  109. /package/dist/tools/project/skills/{droid-project → project}/references/templates.md +0 -0
  110. /package/dist/tools/project/skills/{droid-project → project}/references/updating.md +0 -0
  111. /package/dist/tools/project/skills/{droid-project → project}/references/versioning.md +0 -0
  112. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/draft.md +0 -0
  113. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/gaps.md +0 -0
  114. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/publish.md +0 -0
  115. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/research-doc-template.md +0 -0
  116. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/rollup-template.md +0 -0
  117. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/start.md +0 -0
  118. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/think.md +0 -0
  119. /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/thought-doc-template.md +0 -0
  120. /package/src/tools/brain/skills/{droid-brain → brain}/references/metadata.md +0 -0
  121. /package/src/tools/brain/skills/{droid-brain → brain}/references/naming.md +0 -0
  122. /package/src/tools/brain/skills/{droid-brain → brain}/references/templates.md +0 -0
  123. /package/src/tools/brain/skills/{droid-brain → brain}/references/workflows.md +0 -0
  124. /package/src/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/templates.md +0 -0
  125. /package/src/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/workflows.md +0 -0
  126. /package/src/tools/codex/skills/{droid-codex → codex}/references/creating.md +0 -0
  127. /package/src/tools/codex/skills/{droid-codex → codex}/references/decisions.md +0 -0
  128. /package/src/tools/codex/skills/{droid-codex → codex}/references/topics.md +0 -0
  129. /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-finish-write.ts +0 -0
  130. /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-preamble.ts +0 -0
  131. /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-scripts.test.ts +0 -0
  132. /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-start-write.ts +0 -0
  133. /package/src/tools/project/skills/{droid-project → project}/references/changelog.md +0 -0
  134. /package/src/tools/project/skills/{droid-project → project}/references/creating.md +0 -0
  135. /package/src/tools/project/skills/{droid-project → project}/references/loading.md +0 -0
  136. /package/src/tools/project/skills/{droid-project → project}/references/templates.md +0 -0
  137. /package/src/tools/project/skills/{droid-project → project}/references/updating.md +0 -0
  138. /package/src/tools/project/skills/{droid-project → project}/references/versioning.md +0 -0
  139. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/draft.md +0 -0
  140. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/gaps.md +0 -0
  141. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/publish.md +0 -0
  142. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/research-doc-template.md +0 -0
  143. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/rollup-template.md +0 -0
  144. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/start.md +0 -0
  145. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/think.md +0 -0
  146. /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/thought-doc-template.md +0 -0
package/src/lib/skills.ts CHANGED
@@ -411,6 +411,15 @@ export function installSkill(skillName: string): {
411
411
  };
412
412
  }
413
413
 
414
+ // Load tool manifest to get command metadata (for is_alias flag)
415
+ const toolManifest = loadToolManifest(toolDir);
416
+ if (!toolManifest) {
417
+ return {
418
+ success: false,
419
+ message: `Invalid tool manifest for tool containing '${skillName}'`,
420
+ };
421
+ }
422
+
414
423
  // Check dependencies
415
424
  if (manifest.dependencies) {
416
425
  for (const dep of manifest.dependencies) {
@@ -428,49 +437,39 @@ export function installSkill(skillName: string): {
428
437
  const commandsPath = getCommandsInstallPath(config.platform);
429
438
  const tools = getPlatformTools(config);
430
439
 
431
- // Clean up old skill directory if this is a renamed skill (v0.18.0 workaround for Claude Code bug)
432
- // Renamed skills have 'droid-' prefix, so check for old directory without prefix
433
- // Bug: https://github.com/anthropics/claude-code/issues/14945
434
- //
435
- // TO REVERSE WHEN BUG IS FIXED:
436
- // 1. Rename directories: droid-comments/ → comments/, droid-brain/ → brain/, etc.
437
- // 2. Update TOOL.yaml manifests back to original skill names
438
- // 3. Update SKILL.md frontmatter back to original names
439
- // 4. Replace this cleanup logic with inverse:
440
- // const renamedSkills = ['comments', 'brain', 'project', 'coach', 'code-review', 'brain-obsidian'];
441
- // if (renamedSkills.includes(skillName)) {
442
- // const droidPrefixedName = `droid-${skillName}`;
443
- // const droidPrefixedDir = join(skillsPath, droidPrefixedName);
444
- // if (existsSync(droidPrefixedDir)) {
445
- // rmSync(droidPrefixedDir, { recursive: true });
446
- // }
447
- // if (tools[droidPrefixedName]) {
448
- // delete tools[droidPrefixedName];
449
- // }
450
- // }
451
- // 5. Bump tool versions and create changeset
452
- // Migration logic: Handle skills renamed from {name} to droid-{name} (v0.18.0 workaround)
453
- // This handles both fresh installs and updates where old directory/config entries exist
454
- if (skillName.startsWith('droid-')) {
455
- const oldSkillName = skillName.replace(/^droid-/, '');
456
- const oldSkillDir = join(skillsPath, oldSkillName);
457
-
458
- // Remove or migrate old skill directory
459
- if (existsSync(oldSkillDir)) {
440
+ // Clean up old droid- prefixed directories from v0.18.x (Claude Code bug workaround)
441
+ // CLEANUP: Remove after v0.22.0 or 2026-04-01 (3 months post-v0.21.0 release)
442
+ // Migration for droid- prefix removal (v0.18.x → v0.21.0)
443
+ // These skills were temporarily renamed with droid- prefix, now back to original names
444
+ const renamedSkills = [
445
+ 'comments',
446
+ 'brain',
447
+ 'project',
448
+ 'coach',
449
+ 'code-review',
450
+ 'codex',
451
+ 'tech-design',
452
+ 'brain-obsidian',
453
+ ];
454
+ if (renamedSkills.includes(skillName)) {
455
+ const droidPrefixedName = `droid-${skillName}`;
456
+ const droidPrefixedDir = join(skillsPath, droidPrefixedName);
457
+
458
+ // Remove old droid- prefixed directory
459
+ if (existsSync(droidPrefixedDir)) {
460
460
  try {
461
- rmSync(oldSkillDir, { recursive: true });
461
+ rmSync(droidPrefixedDir, { recursive: true });
462
462
  } catch (error) {
463
463
  // Non-fatal: Log warning but continue installation
464
464
  console.warn(
465
- `Warning: Could not remove old skill directory ${oldSkillDir}: ${error}`,
465
+ `Warning: Could not remove old skill directory ${droidPrefixedDir}: ${error}`,
466
466
  );
467
467
  }
468
468
  }
469
469
 
470
470
  // Migrate old config entry if it exists
471
- // This allows tools to show as "update available" rather than "not installed"
472
- if (tools[oldSkillName]) {
473
- delete tools[oldSkillName];
471
+ if (tools[droidPrefixedName]) {
472
+ delete tools[droidPrefixedName];
474
473
  // Save immediately to ensure cleanup is persisted (matches pattern in tools.ts)
475
474
  setPlatformTools(config, tools);
476
475
  saveConfig(config);
@@ -484,23 +483,10 @@ export function installSkill(skillName: string): {
484
483
  // Check for collisions BEFORE installing (only if not already installed by droid)
485
484
  // Note: If skill folder exists but skill isn't in config, we allow overwriting (stale state
486
485
  // from platform switch or manual cleanup). Command/agent collisions still checked.
487
- //
488
- // Special handling for droid- prefix migration (temporary workaround for Claude Code bug #14945):
489
- // If installing droid-comments, check if 'comments' is in config (old naming)
490
- const oldSkillName = skillName.startsWith('droid-')
491
- ? skillName.replace(/^droid-/, '')
492
- : null;
493
- const isAlreadyInstalled =
494
- tools[skillName] || (oldSkillName && tools[oldSkillName]);
486
+ const isAlreadyInstalled = tools[skillName];
495
487
 
496
488
  if (!isAlreadyInstalled) {
497
- // For collision detection, also check if this is the same tool (with/without droid- prefix)
498
- // E.g., installing droid-comments should be allowed to overwrite existing comments.md
499
- //
500
- // TO REVERSE WHEN BUG #14945 IS FIXED:
501
- // Remove the normalizedToolName logic - tools will have original names without droid- prefix
502
489
  const toolName = basename(toolDir);
503
- const normalizedToolName = toolName.replace(/^droid-/, '');
504
490
 
505
491
  // Check command file collisions (these could conflict with other skills)
506
492
  if (existsSync(commandsSource)) {
@@ -512,9 +498,9 @@ export function installSkill(skillName: string): {
512
498
  if (existsSync(targetCommandPath)) {
513
499
  const commandName = file.replace('.md', '');
514
500
 
515
- // Allow overwrite if the command name matches the tool name (with/without prefix)
501
+ // Allow overwrite if the command name matches the tool name
516
502
  // E.g., installing 'comments' tool can overwrite 'comments.md'
517
- if (commandName === toolName || commandName === normalizedToolName) {
503
+ if (commandName === toolName) {
518
504
  continue; // Same tool, allow overwrite
519
505
  }
520
506
 
@@ -595,6 +581,7 @@ export function installSkill(skillName: string): {
595
581
  }
596
582
 
597
583
  // Copy commands if present (from tool level)
584
+ // Platform-specific: Only install primary commands on OpenCode, always install aliases
598
585
  if (existsSync(commandsSource)) {
599
586
  if (!existsSync(commandsPath)) {
600
587
  mkdirSync(commandsPath, { recursive: true });
@@ -602,11 +589,25 @@ export function installSkill(skillName: string): {
602
589
  const commandFiles = readdirSync(commandsSource).filter(
603
590
  (f) => f.endsWith('.md') && f.toLowerCase() !== 'readme.md',
604
591
  );
592
+
605
593
  for (const file of commandFiles) {
606
- const sourcePath = join(commandsSource, file);
607
- const targetPath = join(commandsPath, file);
608
- const content = readFileSync(sourcePath, 'utf-8');
609
- writeFileSync(targetPath, content);
594
+ const commandName = file.replace('.md', '');
595
+
596
+ // Find this command in the tool manifest to check if it's an alias
597
+ const commandMeta = toolManifest.includes.commands.find(
598
+ (cmd) => (typeof cmd === 'string' ? cmd : cmd.name) === commandName,
599
+ );
600
+ const isAlias = typeof commandMeta === 'object' && commandMeta.is_alias;
601
+
602
+ // Install if: OpenCode (all commands) OR alias (both platforms)
603
+ const shouldInstall = config.platform === Platform.OpenCode || isAlias;
604
+
605
+ if (shouldInstall) {
606
+ const sourcePath = join(commandsSource, file);
607
+ const targetPath = join(commandsPath, file);
608
+ const content = readFileSync(sourcePath, 'utf-8');
609
+ writeFileSync(targetPath, content);
610
+ }
610
611
  }
611
612
  }
612
613
 
package/src/lib/tools.ts CHANGED
@@ -3,7 +3,12 @@ import { join, dirname } from 'path';
3
3
  import { fileURLToPath } from 'url';
4
4
  import YAML from 'yaml';
5
5
  import { loadConfig, saveConfig } from './config';
6
- import { type ToolManifest, type ToolIncludes, getPlatformTools, setPlatformTools } from './types';
6
+ import {
7
+ type ToolManifest,
8
+ type ToolIncludes,
9
+ getPlatformTools,
10
+ setPlatformTools,
11
+ } from './types';
7
12
  import { compareSemver } from './version';
8
13
 
9
14
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -78,15 +83,15 @@ export function isToolInstalled(toolName: string): boolean {
78
83
  const installedTools = getPlatformTools(config);
79
84
 
80
85
  // A tool is installed if any of its required skills are in the installed tools
81
- const tool = getBundledTools().find(t => t.name === toolName);
86
+ const tool = getBundledTools().find((t) => t.name === toolName);
82
87
  if (!tool) return false;
83
88
 
84
89
  const requiredSkills = tool.includes.skills
85
- .filter(s => s.required)
86
- .map(s => s.name);
90
+ .filter((s) => s.required)
91
+ .map((s) => s.name);
87
92
 
88
93
  // Tool is installed if at least one required skill is installed
89
- return requiredSkills.some(skillName => skillName in installedTools);
94
+ return requiredSkills.some((skillName) => skillName in installedTools);
90
95
  }
91
96
 
92
97
  /**
@@ -96,13 +101,13 @@ export function getInstalledToolVersion(toolName: string): string | null {
96
101
  const config = loadConfig();
97
102
  const installedTools = getPlatformTools(config);
98
103
 
99
- const tool = getBundledTools().find(t => t.name === toolName);
104
+ const tool = getBundledTools().find((t) => t.name === toolName);
100
105
  if (!tool) return null;
101
106
 
102
107
  // Get version from the first installed required skill
103
108
  const requiredSkills = tool.includes.skills
104
- .filter(s => s.required)
105
- .map(s => s.name);
109
+ .filter((s) => s.required)
110
+ .map((s) => s.name);
106
111
 
107
112
  for (const skillName of requiredSkills) {
108
113
  if (installedTools[skillName]) {
@@ -139,7 +144,7 @@ export interface ToolUpdateInfo {
139
144
  */
140
145
  export function getToolUpdateStatus(toolName: string): ToolUpdateInfo {
141
146
  const installedVersion = getInstalledToolVersion(toolName);
142
- const tool = getBundledTools().find(t => t.name === toolName);
147
+ const tool = getBundledTools().find((t) => t.name === toolName);
143
148
  const bundledVersion = tool?.version || null;
144
149
 
145
150
  if (!installedVersion || !bundledVersion) {
@@ -176,10 +181,12 @@ export function getToolsWithUpdates(): ToolUpdateInfo[] {
176
181
  for (const tool of bundledTools) {
177
182
  // Find if any of the tool's required skills are installed
178
183
  const requiredSkills = tool.includes.skills
179
- .filter(s => s.required)
180
- .map(s => s.name);
184
+ .filter((s) => s.required)
185
+ .map((s) => s.name);
181
186
 
182
- const isInstalled = requiredSkills.some(skillName => skillName in installedTools);
187
+ const isInstalled = requiredSkills.some(
188
+ (skillName) => skillName in installedTools,
189
+ );
183
190
 
184
191
  if (isInstalled) {
185
192
  const updateStatus = getToolUpdateStatus(tool.name);
package/src/lib/types.ts CHANGED
@@ -43,7 +43,7 @@ export interface PlatformConfig {
43
43
  }
44
44
 
45
45
  export interface AutoUpdateConfig {
46
- app: boolean; // Auto-update droid CLI (default: false)
46
+ app: boolean; // Auto-update droid CLI (default: false)
47
47
  tools: boolean; // Auto-update installed tools (default: true)
48
48
  }
49
49
 
@@ -54,7 +54,12 @@ export interface DroidConfig {
54
54
  git_username: string;
55
55
  platforms: Record<string, PlatformConfig>;
56
56
  auto_update?: AutoUpdateConfig;
57
- migrations?: Record<string, string>; // tool name -> last migrated version
57
+ migrations?: {
58
+ package?: string; // Last package version migrated
59
+ tools?: Record<string, string>; // tool name -> last tool version migrated
60
+ // Legacy: old configs may have tool names at root level
61
+ [key: string]: string | Record<string, string> | undefined;
62
+ };
58
63
  }
59
64
 
60
65
  // Legacy config structure for migration
@@ -69,14 +74,19 @@ export interface LegacyDroidConfig {
69
74
  /**
70
75
  * Get installed tools for the current platform
71
76
  */
72
- export function getPlatformTools(config: DroidConfig): Record<string, InstalledSkill> {
77
+ export function getPlatformTools(
78
+ config: DroidConfig,
79
+ ): Record<string, InstalledSkill> {
73
80
  return config.platforms[config.platform]?.tools ?? {};
74
81
  }
75
82
 
76
83
  /**
77
84
  * Set installed tools for the current platform
78
85
  */
79
- export function setPlatformTools(config: DroidConfig, tools: Record<string, InstalledSkill>): void {
86
+ export function setPlatformTools(
87
+ config: DroidConfig,
88
+ tools: Record<string, InstalledSkill>,
89
+ ): void {
80
90
  if (!config.platforms[config.platform]) {
81
91
  config.platforms[config.platform] = { tools: {} };
82
92
  }
@@ -145,9 +155,14 @@ export interface ToolSkillInclude {
145
155
  examples?: SkillExample[];
146
156
  }
147
157
 
158
+ export interface ToolCommandInclude {
159
+ name: string;
160
+ is_alias: boolean;
161
+ }
162
+
148
163
  export interface ToolIncludes {
149
164
  skills: ToolSkillInclude[];
150
- commands: string[];
165
+ commands: ToolCommandInclude[];
151
166
  agents: string[];
152
167
  }
153
168
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droid-brain",
3
- "version": "0.2.3",
3
+ "version": "0.3.0",
4
4
  "description": "Your scratchpad (or brain) - a collaborative space for planning and research. Create docs with /brain plan, /brain research, or /brain review. Use @mentions for async discussion. Docs persist across sessions.",
5
5
  "author": {
6
6
  "name": "Orderful",
@@ -1,18 +1,20 @@
1
1
  name: brain
2
2
  description: "Your scratchpad (or brain) - a collaborative space 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.3
3
+ version: 0.3.0
4
4
  status: beta
5
5
 
6
6
  includes:
7
7
  skills:
8
- - name: droid-brain
8
+ - name: brain
9
9
  required: true
10
- - name: droid-brain-obsidian
10
+ - name: brain-obsidian
11
11
  required: false
12
12
  description: "Obsidian vault integration with YAML frontmatter and wikilinks"
13
13
  commands:
14
- - brain
15
- - scratchpad
14
+ - name: brain
15
+ is_alias: false
16
+ - name: scratchpad
17
+ is_alias: true
16
18
  agents: []
17
19
 
18
20
  dependencies: []
@@ -1,65 +1,33 @@
1
1
  ---
2
- description: Collaborative scratchpad for planning and research
2
+ name: brain
3
+ description: "Collaborative scratchpad for planning and research"
3
4
  argument-hint: "[{topic} | plan|research|review {topic} | idea|add {text} | check|done]"
4
- allowed-tools: [Read, Write, Edit, Glob, Grep, Bash(mkdir:*), Bash(ls:*)]
5
5
  ---
6
6
 
7
7
  # /brain
8
8
 
9
- Entry point for brain doc management. See the **brain skill** for full behavior.
9
+ **User invoked:** `/brain $ARGUMENTS`
10
10
 
11
- > **Alias:** This command also works as `/scratchpad` - use whichever feels natural.
12
-
13
- ## Arguments
14
-
15
- $ARGUMENTS
16
-
17
- ## Default Behavior
11
+ **Your task:** Invoke the **brain skill** with these arguments.
18
12
 
19
- **IMPORTANT:** When given just a topic (e.g., `/brain auth-refactor`), the default action is to **SEARCH** for existing docs, NOT create. Only create docs with explicit `/brain plan {topic}` or `/brain research {topic}`.
20
-
21
- ## Usage
22
-
23
- ```
24
- /brain # List recent docs or create new
25
- /brain {topic} # SEARCH: Open existing doc (fuzzy match) → active
26
- /brain plan {topic} # CREATE: New planning doc → plans/
27
- /brain research {topic} # Create research doc → research/
28
- /brain review {topic} # Create review doc → reviews/
29
- /brain idea {text} # Quick capture → ideas/ (fire-and-forget)
30
- /brain add {text} # Append to active doc
31
- /brain check # Address @droid comments in active doc
32
- /brain done # Finalize active doc
33
- ```
34
-
35
- ## Configuration
36
-
37
- **ALWAYS read `~/.droid/skills/brain/overrides.yaml` first.** Use configured values if present, only fall back to defaults if missing.
13
+ > **Alias:** This command also works as `/scratchpad` - use whichever feels natural.
38
14
 
39
- - `brain_dir` - Where docs live (default varies by AI tool)
40
- - `inbox_folder` - Root for type folders (e.g., `0-Inbox`)
15
+ ## Examples
41
16
 
42
- ## Folder Structure
17
+ - `/brain auth-refactor` → Search for existing doc about "auth-refactor"
18
+ - `/brain plan new-feature` → Create a new planning doc for "new-feature"
19
+ - `/brain add found a bug in the parser` → Append text to active doc
43
20
 
44
- Docs are organized by type:
21
+ ## Quick Reference
45
22
 
46
23
  ```
47
- {brain_dir}/{inbox_folder}/
48
- ├── plans/
49
- ├── research/
50
- ├── reviews/
51
- └── ideas/
24
+ /brain {topic} # SEARCH for existing doc (default action)
25
+ /brain plan {topic} # CREATE new planning doc
26
+ /brain research {topic} # CREATE new research doc
27
+ /brain idea {text} # Quick capture to ideas/
28
+ /brain check # Address @droid comments
52
29
  ```
53
30
 
54
- ## Behavior
55
-
56
- Refer to the brain skill for:
57
-
58
- - **Opening**: How to fuzzy-match, handle multiple matches, set active
59
- - **Creating**: Template structure by preset, naming conventions
60
- - **Ideas**: Quick capture workflow
61
- - **Adding**: Append to active doc with timestamp
62
- - **Checking**: Find and address @droid comments
63
- - **Finalizing**: Update status, suggest next steps
31
+ **Default behavior:** When given just a topic, SEARCH first (don't create unless plan/research/review keyword is present).
64
32
 
65
- The skill's `references/` folder contains detailed specs for workflows, templates, naming, and metadata.
33
+ See the **brain skill** for complete documentation and procedures.
@@ -1,65 +1,28 @@
1
1
  ---
2
- description: Collaborative scratchpad for planning and research
3
- argument-hint: "[{topic} | plan|research|review {topic} | idea|add {text} | check|done]"
4
- allowed-tools: [Read, Write, Edit, Glob, Grep, Bash(mkdir:*), Bash(ls:*)]
2
+ name: scratchpad
3
+ description: "Alias for brain. See brain skill for full behavior."
5
4
  ---
6
5
 
7
6
  # /scratchpad
8
7
 
9
- Your scratchpad for planning, research, and design. See the **brain skill** for full behavior.
8
+ **User invoked:** `/scratchpad $ARGUMENTS`
10
9
 
11
- > **Alias:** This command also works as `/brain` - use whichever feels natural.
10
+ **Your task:** Invoke the **brain skill** with these arguments (scratchpad is an alias for brain).
12
11
 
13
- ## Arguments
12
+ ## Examples
14
13
 
15
- $ARGUMENTS
14
+ - `/scratchpad auth-refactor` → Search for existing doc about "auth-refactor"
15
+ - `/scratchpad plan new-feature` → Create a new planning doc for "new-feature"
16
16
 
17
- ## Default Behavior
17
+ ## Quick Reference
18
18
 
19
- **IMPORTANT:** When given just a topic (e.g., `/scratchpad auth-refactor`), the default action is to **SEARCH** for existing docs, NOT create. Only create docs with explicit `/scratchpad plan {topic}` or `/scratchpad research {topic}`.
20
-
21
- ## Usage
19
+ Same as `/brain` - use whichever name feels natural:
22
20
 
23
21
  ```
24
- /scratchpad # List recent docs or create new
25
- /scratchpad {topic} # SEARCH: Open existing doc (fuzzy match) → active
26
- /scratchpad plan {topic} # CREATE: New planning doc → plans/
27
- /scratchpad research {topic} # Create research doc → research/
28
- /scratchpad review {topic} # Create review doc → reviews/
29
- /scratchpad idea {text} # Quick capture → ideas/ (fire-and-forget)
30
- /scratchpad add {text} # Append to active doc
31
- /scratchpad check # Address @droid comments in active doc
32
- /scratchpad done # Finalize active doc
22
+ /scratchpad {topic} # SEARCH for existing doc
23
+ /scratchpad plan {topic} # CREATE new planning doc
33
24
  ```
34
25
 
35
- ## Configuration
36
-
37
- **ALWAYS read `~/.droid/skills/brain/overrides.yaml` first.** Use configured values if present, only fall back to defaults if missing.
38
-
39
- - `brain_dir` - Where docs live (default varies by AI tool)
40
- - `inbox_folder` - Root for type folders (e.g., `0-Inbox`)
41
-
42
- ## Folder Structure
43
-
44
- Docs are organized by type:
45
-
46
- ```
47
- {brain_dir}/{inbox_folder}/
48
- ├── plans/
49
- ├── research/
50
- ├── reviews/
51
- └── ideas/
52
- ```
53
-
54
- ## Behavior
55
-
56
- Refer to the brain skill for:
57
-
58
- - **Opening**: How to fuzzy-match, handle multiple matches, set active
59
- - **Creating**: Template structure by preset, naming conventions
60
- - **Ideas**: Quick capture workflow
61
- - **Adding**: Append to active doc with timestamp
62
- - **Checking**: Find and address @droid comments
63
- - **Finalizing**: Update status, suggest next steps
26
+ **Default behavior:** SEARCH first, don't create unless plan/research/review keyword is present.
64
27
 
65
- The skill's `references/` folder contains detailed specs for workflows, templates, naming, and metadata.
28
+ See `/brain` or the **brain skill** for complete documentation.
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: droid-brain
2
+ name: brain
3
3
  description: "Collaborative scratchpad for planning and research. Use when planning a feature, exploring a problem, or capturing thinking that should persist across sessions. User prompts like 'let's think through', 'open a scratchpad', 'plan this out', 'use our brain'."
4
4
  globs:
5
5
  - "**/brain/**/*.md"
@@ -39,10 +39,10 @@ Ideas develop through iteration, not single prompts.
39
39
 
40
40
  **IMPORTANT:** Before using any default paths, ALWAYS read `~/.droid/skills/brain/overrides.yaml` first. If `brain_dir` is configured there, use that path. Only fall back to defaults if the file doesn't exist or lacks a `brain_dir` setting.
41
41
 
42
- | Setting | Default | Description |
43
- | -------------- | ----------- | --------------------------------------------- |
44
- | `brain_dir` | (see below) | Where docs are stored |
45
- | `inbox_folder` | (empty) | Root folder for new docs (e.g., `0-Inbox`) |
42
+ | Setting | Default | Description |
43
+ | -------------- | ----------- | ------------------------------------------ |
44
+ | `brain_dir` | (see below) | Where docs are stored |
45
+ | `inbox_folder` | (empty) | Root folder for new docs (e.g., `0-Inbox`) |
46
46
 
47
47
  Default `brain_dir` by AI tool (only if not configured):
48
48
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: droid-brain-obsidian
2
+ name: brain-obsidian
3
3
  description: "Obsidian extension for brain skill with YAML frontmatter, wikilinks, and PARA folder organization. Use when your brain docs live in an Obsidian vault."
4
4
  globs:
5
5
  - "**/brain/**/*.md"
@@ -114,10 +114,10 @@ When running `/brain done`:
114
114
 
115
115
  Same commands as brain skill, but with Obsidian output:
116
116
 
117
- | Command | Obsidian Behavior |
118
- | ------------------------- | --------------------------------------------- |
119
- | `/brain plan {topic}` | Creates in `plans/` with frontmatter |
120
- | `/brain research {topic}` | Creates in `research/` with frontmatter |
121
- | `/brain review {topic}` | Creates in `reviews/` with frontmatter |
122
- | `/brain idea {text}` | Quick capture to `ideas/` |
123
- | `/brain done` | Updates status, suggests archive/PARA move |
117
+ | Command | Obsidian Behavior |
118
+ | ------------------------- | ------------------------------------------ |
119
+ | `/brain plan {topic}` | Creates in `plans/` with frontmatter |
120
+ | `/brain research {topic}` | Creates in `research/` with frontmatter |
121
+ | `/brain review {topic}` | Creates in `reviews/` with frontmatter |
122
+ | `/brain idea {text}` | Quick capture to `ideas/` |
123
+ | `/brain done` | Updates status, suggests archive/PARA move |
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droid-coach",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "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.",
5
5
  "author": {
6
6
  "name": "Orderful",
@@ -1,14 +1,15 @@
1
1
  name: coach
2
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.3
3
+ version: 0.2.0
4
4
  status: beta
5
5
 
6
6
  includes:
7
7
  skills:
8
- - name: droid-coach
8
+ - name: coach
9
9
  required: true
10
10
  commands:
11
- - coach
11
+ - name: coach
12
+ is_alias: false
12
13
  agents: []
13
14
 
14
15
  dependencies: