@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.
- package/.claude-plugin/marketplace.json +7 -7
- package/AGENTS.md +36 -32
- package/CHANGELOG.md +29 -0
- package/dist/bin/droid.js +102 -24
- package/dist/index.js +59 -25
- package/dist/lib/migrations.d.ts +8 -0
- package/dist/lib/migrations.d.ts.map +1 -1
- package/dist/lib/skills.d.ts.map +1 -1
- package/dist/lib/tools.d.ts.map +1 -1
- package/dist/lib/types.d.ts +10 -2
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/tools/brain/.claude-plugin/plugin.json +1 -1
- package/dist/tools/brain/TOOL.yaml +7 -5
- package/dist/tools/brain/commands/brain.md +17 -49
- package/dist/tools/brain/commands/scratchpad.md +13 -50
- package/{src/tools/brain/skills/droid-brain → dist/tools/brain/skills/brain}/SKILL.md +5 -5
- package/dist/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/SKILL.md +8 -8
- package/dist/tools/coach/.claude-plugin/plugin.json +1 -1
- package/dist/tools/coach/TOOL.yaml +4 -3
- package/dist/tools/coach/commands/coach.md +14 -54
- package/{src/tools/coach/skills/droid-coach → dist/tools/coach/skills/coach}/SKILL.md +4 -3
- package/dist/tools/code-review/.claude-plugin/plugin.json +1 -1
- package/dist/tools/code-review/TOOL.yaml +4 -3
- package/dist/tools/code-review/commands/code-review.md +18 -102
- package/dist/tools/code-review/skills/code-review/SKILL.md +154 -0
- package/dist/tools/codex/.claude-plugin/plugin.json +1 -1
- package/dist/tools/codex/TOOL.yaml +4 -3
- package/dist/tools/codex/commands/codex.md +18 -65
- package/dist/tools/codex/skills/{droid-codex → codex}/SKILL.md +64 -45
- package/{src/tools/codex/skills/droid-codex → dist/tools/codex/skills/codex}/references/loading.md +94 -55
- package/dist/tools/codex/skills/codex/scripts/git-finish-write.d.ts.map +1 -0
- package/dist/tools/codex/skills/codex/scripts/git-preamble.d.ts.map +1 -0
- package/dist/tools/codex/skills/codex/scripts/git-start-write.d.ts.map +1 -0
- package/dist/tools/comments/.claude-plugin/plugin.json +1 -1
- package/dist/tools/comments/TOOL.yaml +4 -3
- package/dist/tools/comments/commands/comments.md +12 -14
- package/{src/tools/comments/skills/droid-comments → dist/tools/comments/skills/comments}/SKILL.md +3 -1
- package/dist/tools/project/.claude-plugin/plugin.json +1 -1
- package/dist/tools/project/TOOL.yaml +4 -3
- package/dist/tools/project/commands/project.md +12 -27
- package/dist/tools/project/skills/{droid-project → project}/SKILL.md +12 -11
- package/dist/tools/tech-design/.claude-plugin/plugin.json +1 -1
- package/dist/tools/tech-design/TOOL.yaml +4 -3
- package/dist/tools/tech-design/commands/tech-design.md +18 -80
- package/{src/tools/tech-design/skills/droid-tech-design → dist/tools/tech-design/skills/tech-design}/SKILL.md +1 -1
- package/package.json +1 -1
- package/src/commands/tui/components/Badge.test.tsx +10 -4
- package/src/commands/tui.tsx +4 -4
- package/src/lib/migrations.ts +95 -4
- package/src/lib/skills.test.ts +199 -74
- package/src/lib/skills.ts +55 -54
- package/src/lib/tools.ts +19 -12
- package/src/lib/types.ts +20 -5
- package/src/tools/brain/.claude-plugin/plugin.json +1 -1
- package/src/tools/brain/TOOL.yaml +7 -5
- package/src/tools/brain/commands/brain.md +17 -49
- package/src/tools/brain/commands/scratchpad.md +13 -50
- package/{dist/tools/brain/skills/droid-brain → src/tools/brain/skills/brain}/SKILL.md +5 -5
- package/src/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/SKILL.md +8 -8
- package/src/tools/coach/.claude-plugin/plugin.json +1 -1
- package/src/tools/coach/TOOL.yaml +4 -3
- package/src/tools/coach/commands/coach.md +14 -54
- package/{dist/tools/coach/skills/droid-coach → src/tools/coach/skills/coach}/SKILL.md +4 -3
- package/src/tools/code-review/.claude-plugin/plugin.json +1 -1
- package/src/tools/code-review/TOOL.yaml +4 -3
- package/src/tools/code-review/commands/code-review.md +18 -102
- package/src/tools/code-review/skills/code-review/SKILL.md +154 -0
- package/src/tools/codex/.claude-plugin/plugin.json +1 -1
- package/src/tools/codex/TOOL.yaml +4 -3
- package/src/tools/codex/commands/codex.md +18 -65
- package/src/tools/codex/skills/{droid-codex → codex}/SKILL.md +64 -45
- package/{dist/tools/codex/skills/droid-codex → src/tools/codex/skills/codex}/references/loading.md +94 -55
- package/src/tools/comments/.claude-plugin/plugin.json +1 -1
- package/src/tools/comments/TOOL.yaml +4 -3
- package/src/tools/comments/commands/comments.md +12 -14
- package/{dist/tools/comments/skills/droid-comments → src/tools/comments/skills/comments}/SKILL.md +3 -1
- package/src/tools/project/.claude-plugin/plugin.json +1 -1
- package/src/tools/project/TOOL.yaml +4 -3
- package/src/tools/project/commands/project.md +12 -27
- package/src/tools/project/skills/{droid-project → project}/SKILL.md +12 -11
- package/src/tools/tech-design/.claude-plugin/plugin.json +1 -1
- package/src/tools/tech-design/TOOL.yaml +4 -3
- package/src/tools/tech-design/commands/tech-design.md +18 -80
- package/{dist/tools/tech-design/skills/droid-tech-design → src/tools/tech-design/skills/tech-design}/SKILL.md +1 -1
- package/dist/tools/code-review/skills/droid-code-review/SKILL.md +0 -55
- package/dist/tools/codex/skills/droid-codex/scripts/git-finish-write.d.ts.map +0 -1
- package/dist/tools/codex/skills/droid-codex/scripts/git-preamble.d.ts.map +0 -1
- package/dist/tools/codex/skills/droid-codex/scripts/git-start-write.d.ts.map +0 -1
- package/src/tools/code-review/skills/droid-code-review/SKILL.md +0 -55
- /package/dist/tools/brain/skills/{droid-brain → brain}/references/metadata.md +0 -0
- /package/dist/tools/brain/skills/{droid-brain → brain}/references/naming.md +0 -0
- /package/dist/tools/brain/skills/{droid-brain → brain}/references/templates.md +0 -0
- /package/dist/tools/brain/skills/{droid-brain → brain}/references/workflows.md +0 -0
- /package/dist/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/templates.md +0 -0
- /package/dist/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/workflows.md +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/references/creating.md +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/references/decisions.md +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/references/topics.md +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-finish-write.d.ts +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-finish-write.ts +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-preamble.d.ts +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-preamble.ts +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-scripts.test.ts +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-start-write.d.ts +0 -0
- /package/dist/tools/codex/skills/{droid-codex → codex}/scripts/git-start-write.ts +0 -0
- /package/dist/tools/project/skills/{droid-project → project}/references/changelog.md +0 -0
- /package/dist/tools/project/skills/{droid-project → project}/references/creating.md +0 -0
- /package/dist/tools/project/skills/{droid-project → project}/references/loading.md +0 -0
- /package/dist/tools/project/skills/{droid-project → project}/references/templates.md +0 -0
- /package/dist/tools/project/skills/{droid-project → project}/references/updating.md +0 -0
- /package/dist/tools/project/skills/{droid-project → project}/references/versioning.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/draft.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/gaps.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/publish.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/research-doc-template.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/rollup-template.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/start.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/think.md +0 -0
- /package/dist/tools/tech-design/skills/{droid-tech-design → tech-design}/references/thought-doc-template.md +0 -0
- /package/src/tools/brain/skills/{droid-brain → brain}/references/metadata.md +0 -0
- /package/src/tools/brain/skills/{droid-brain → brain}/references/naming.md +0 -0
- /package/src/tools/brain/skills/{droid-brain → brain}/references/templates.md +0 -0
- /package/src/tools/brain/skills/{droid-brain → brain}/references/workflows.md +0 -0
- /package/src/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/templates.md +0 -0
- /package/src/tools/brain/skills/{droid-brain-obsidian → brain-obsidian}/references/workflows.md +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/references/creating.md +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/references/decisions.md +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/references/topics.md +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-finish-write.ts +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-preamble.ts +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-scripts.test.ts +0 -0
- /package/src/tools/codex/skills/{droid-codex → codex}/scripts/git-start-write.ts +0 -0
- /package/src/tools/project/skills/{droid-project → project}/references/changelog.md +0 -0
- /package/src/tools/project/skills/{droid-project → project}/references/creating.md +0 -0
- /package/src/tools/project/skills/{droid-project → project}/references/loading.md +0 -0
- /package/src/tools/project/skills/{droid-project → project}/references/templates.md +0 -0
- /package/src/tools/project/skills/{droid-project → project}/references/updating.md +0 -0
- /package/src/tools/project/skills/{droid-project → project}/references/versioning.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/draft.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/gaps.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/publish.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/research-doc-template.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/rollup-template.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/start.md +0 -0
- /package/src/tools/tech-design/skills/{droid-tech-design → tech-design}/references/think.md +0 -0
- /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
|
|
432
|
-
//
|
|
433
|
-
//
|
|
434
|
-
//
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
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(
|
|
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 ${
|
|
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
|
-
|
|
472
|
-
|
|
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
|
|
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
|
|
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
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
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 {
|
|
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(
|
|
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;
|
|
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?:
|
|
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(
|
|
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(
|
|
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:
|
|
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.
|
|
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.
|
|
3
|
+
version: 0.3.0
|
|
4
4
|
status: beta
|
|
5
5
|
|
|
6
6
|
includes:
|
|
7
7
|
skills:
|
|
8
|
-
- name:
|
|
8
|
+
- name: brain
|
|
9
9
|
required: true
|
|
10
|
-
- name:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
9
|
+
**User invoked:** `/brain $ARGUMENTS`
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
## Arguments
|
|
14
|
-
|
|
15
|
-
$ARGUMENTS
|
|
16
|
-
|
|
17
|
-
## Default Behavior
|
|
11
|
+
**Your task:** Invoke the **brain skill** with these arguments.
|
|
18
12
|
|
|
19
|
-
**
|
|
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
|
-
|
|
40
|
-
- `inbox_folder` - Root for type folders (e.g., `0-Inbox`)
|
|
15
|
+
## Examples
|
|
41
16
|
|
|
42
|
-
|
|
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
|
-
|
|
21
|
+
## Quick Reference
|
|
45
22
|
|
|
46
23
|
```
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
33
|
+
See the **brain skill** for complete documentation and procedures.
|
|
@@ -1,65 +1,28 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
8
|
+
**User invoked:** `/scratchpad $ARGUMENTS`
|
|
10
9
|
|
|
11
|
-
|
|
10
|
+
**Your task:** Invoke the **brain skill** with these arguments (scratchpad is an alias for brain).
|
|
12
11
|
|
|
13
|
-
##
|
|
12
|
+
## Examples
|
|
14
13
|
|
|
15
|
-
|
|
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
|
-
##
|
|
17
|
+
## Quick Reference
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
## Usage
|
|
19
|
+
Same as `/brain` - use whichever name feels natural:
|
|
22
20
|
|
|
23
21
|
```
|
|
24
|
-
/scratchpad
|
|
25
|
-
/scratchpad {topic}
|
|
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
|
-
|
|
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
|
-
|
|
28
|
+
See `/brain` or the **brain skill** for complete documentation.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
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:
|
|
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.
|
|
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.
|
|
3
|
+
version: 0.2.0
|
|
4
4
|
status: beta
|
|
5
5
|
|
|
6
6
|
includes:
|
|
7
7
|
skills:
|
|
8
|
-
- name:
|
|
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:
|