@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.
- package/.claude/CLAUDE.md +13 -6
- package/CHANGELOG.md +21 -0
- package/README.md +23 -24
- package/dist/bin/droid.js +9 -9
- package/dist/bin/droid.js.map +1 -1
- package/dist/commands/install.d.ts +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +24 -23
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/setup.d.ts +3 -3
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +32 -28
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +60 -53
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/tui.d.ts.map +1 -1
- package/dist/commands/tui.js +213 -319
- package/dist/commands/tui.js.map +1 -1
- package/dist/commands/uninstall.d.ts +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +15 -6
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.d.ts +2 -2
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +9 -9
- package/dist/commands/update.js.map +1 -1
- package/dist/lib/agents.d.ts +11 -10
- package/dist/lib/agents.d.ts.map +1 -1
- package/dist/lib/agents.js +52 -54
- package/dist/lib/agents.js.map +1 -1
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +42 -5
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/platforms.d.ts +41 -0
- package/dist/lib/platforms.d.ts.map +1 -0
- package/dist/lib/platforms.js +52 -0
- package/dist/lib/platforms.js.map +1 -0
- package/dist/lib/skills.d.ts +19 -11
- package/dist/lib/skills.d.ts.map +1 -1
- package/dist/lib/skills.js +127 -106
- package/dist/lib/skills.js.map +1 -1
- package/dist/lib/tools.d.ts +30 -0
- package/dist/lib/tools.d.ts.map +1 -0
- package/dist/lib/tools.js +116 -0
- package/dist/lib/tools.js.map +1 -0
- package/dist/lib/types.d.ts +45 -2
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +24 -5
- package/dist/lib/types.js.map +1 -1
- package/dist/tools/brain/TOOL.yaml +27 -0
- package/dist/tools/coach/TOOL.yaml +21 -0
- package/dist/tools/code-review/TOOL.yaml +18 -0
- package/dist/{skills → tools}/code-review/commands/code-review.md +23 -1
- package/dist/tools/comments/TOOL.yaml +27 -0
- package/dist/tools/project/TOOL.yaml +26 -0
- package/package.json +2 -2
- package/src/bin/droid.ts +9 -9
- package/src/commands/install.ts +24 -23
- package/src/commands/setup.test.ts +2 -2
- package/src/commands/setup.ts +33 -29
- package/src/commands/skills.ts +63 -64
- package/src/commands/tui.tsx +432 -578
- package/src/commands/uninstall.ts +17 -6
- package/src/commands/update.ts +10 -10
- package/src/lib/agents.ts +58 -58
- package/src/lib/config.test.ts +0 -10
- package/src/lib/config.ts +47 -5
- package/src/lib/platforms.ts +59 -0
- package/src/lib/skills.test.ts +53 -28
- package/src/lib/skills.ts +136 -109
- package/src/lib/tools.ts +140 -0
- package/src/lib/types.test.ts +15 -7
- package/src/lib/types.ts +63 -2
- package/src/tools/brain/TOOL.yaml +27 -0
- package/src/tools/coach/TOOL.yaml +21 -0
- package/src/tools/code-review/TOOL.yaml +18 -0
- package/src/{skills → tools}/code-review/commands/code-review.md +23 -1
- package/src/tools/comments/TOOL.yaml +27 -0
- package/src/tools/project/TOOL.yaml +26 -0
- package/dist/agents/README.md +0 -137
- package/src/agents/README.md +0 -137
- /package/dist/{skills → tools}/README.md +0 -0
- /package/dist/{skills → tools}/brain/commands/README.md +0 -0
- /package/dist/{skills → tools}/brain/commands/brain.md +0 -0
- /package/dist/{skills → tools}/brain/commands/scratchpad.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain/SKILL.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain/SKILL.yaml +0 -0
- /package/dist/{skills → tools/brain/skills}/brain/references/metadata.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain/references/naming.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain/references/templates.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain/references/workflows.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain-obsidian/SKILL.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain-obsidian/SKILL.yaml +0 -0
- /package/dist/{skills → tools/brain/skills}/brain-obsidian/references/templates.md +0 -0
- /package/dist/{skills → tools/brain/skills}/brain-obsidian/references/workflows.md +0 -0
- /package/dist/{skills → tools}/coach/commands/README.md +0 -0
- /package/dist/{skills → tools}/coach/commands/coach.md +0 -0
- /package/dist/{skills → tools/coach/skills}/coach/SKILL.md +0 -0
- /package/dist/{skills → tools/coach/skills}/coach/SKILL.yaml +0 -0
- /package/dist/{skills → tools}/code-review/agents/edi-standards-reviewer/AGENT.md +0 -0
- /package/dist/{skills → tools}/code-review/agents/edi-standards-reviewer/AGENT.yaml +0 -0
- /package/dist/{skills → tools}/code-review/agents/error-handling-reviewer/AGENT.md +0 -0
- /package/dist/{skills → tools}/code-review/agents/error-handling-reviewer/AGENT.yaml +0 -0
- /package/dist/{skills → tools}/code-review/agents/test-coverage-analyzer/AGENT.md +0 -0
- /package/dist/{skills → tools}/code-review/agents/test-coverage-analyzer/AGENT.yaml +0 -0
- /package/dist/{skills → tools}/code-review/agents/type-reviewer/AGENT.md +0 -0
- /package/dist/{skills → tools}/code-review/agents/type-reviewer/AGENT.yaml +0 -0
- /package/dist/{skills → tools/code-review/skills}/code-review/SKILL.md +0 -0
- /package/dist/{skills → tools/code-review/skills}/code-review/SKILL.yaml +0 -0
- /package/dist/{skills → tools}/comments/commands/README.md +0 -0
- /package/dist/{skills → tools}/comments/commands/comments.md +0 -0
- /package/dist/{skills → tools/comments/skills}/comments/SKILL.md +0 -0
- /package/dist/{skills → tools/comments/skills}/comments/SKILL.yaml +0 -0
- /package/dist/{skills → tools}/project/commands/README.md +0 -0
- /package/dist/{skills → tools}/project/commands/project.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/SKILL.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/SKILL.yaml +0 -0
- /package/dist/{skills → tools/project/skills}/project/references/changelog.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/references/creating.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/references/loading.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/references/templates.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/references/updating.md +0 -0
- /package/dist/{skills → tools/project/skills}/project/references/versioning.md +0 -0
- /package/src/{skills → tools}/README.md +0 -0
- /package/src/{skills → tools}/brain/commands/README.md +0 -0
- /package/src/{skills → tools}/brain/commands/brain.md +0 -0
- /package/src/{skills → tools}/brain/commands/scratchpad.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain/SKILL.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain/SKILL.yaml +0 -0
- /package/src/{skills → tools/brain/skills}/brain/references/metadata.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain/references/naming.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain/references/templates.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain/references/workflows.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain-obsidian/SKILL.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain-obsidian/SKILL.yaml +0 -0
- /package/src/{skills → tools/brain/skills}/brain-obsidian/references/templates.md +0 -0
- /package/src/{skills → tools/brain/skills}/brain-obsidian/references/workflows.md +0 -0
- /package/src/{skills → tools}/coach/commands/README.md +0 -0
- /package/src/{skills → tools}/coach/commands/coach.md +0 -0
- /package/src/{skills → tools/coach/skills}/coach/SKILL.md +0 -0
- /package/src/{skills → tools/coach/skills}/coach/SKILL.yaml +0 -0
- /package/src/{skills → tools}/code-review/agents/edi-standards-reviewer/AGENT.md +0 -0
- /package/src/{skills → tools}/code-review/agents/edi-standards-reviewer/AGENT.yaml +0 -0
- /package/src/{skills → tools}/code-review/agents/error-handling-reviewer/AGENT.md +0 -0
- /package/src/{skills → tools}/code-review/agents/error-handling-reviewer/AGENT.yaml +0 -0
- /package/src/{skills → tools}/code-review/agents/test-coverage-analyzer/AGENT.md +0 -0
- /package/src/{skills → tools}/code-review/agents/test-coverage-analyzer/AGENT.yaml +0 -0
- /package/src/{skills → tools}/code-review/agents/type-reviewer/AGENT.md +0 -0
- /package/src/{skills → tools}/code-review/agents/type-reviewer/AGENT.yaml +0 -0
- /package/src/{skills → tools/code-review/skills}/code-review/SKILL.md +0 -0
- /package/src/{skills → tools/code-review/skills}/code-review/SKILL.yaml +0 -0
- /package/src/{skills → tools}/comments/commands/README.md +0 -0
- /package/src/{skills → tools}/comments/commands/comments.md +0 -0
- /package/src/{skills → tools/comments/skills}/comments/SKILL.md +0 -0
- /package/src/{skills → tools/comments/skills}/comments/SKILL.yaml +0 -0
- /package/src/{skills → tools}/project/commands/README.md +0 -0
- /package/src/{skills → tools}/project/commands/project.md +0 -0
- /package/src/{skills → tools/project/skills}/project/SKILL.md +0 -0
- /package/src/{skills → tools/project/skills}/project/SKILL.yaml +0 -0
- /package/src/{skills → tools/project/skills}/project/references/changelog.md +0 -0
- /package/src/{skills → tools/project/skills}/project/references/creating.md +0 -0
- /package/src/{skills → tools/project/skills}/project/references/loading.md +0 -0
- /package/src/{skills → tools/project/skills}/project/references/templates.md +0 -0
- /package/src/{skills → tools/project/skills}/project/references/updating.md +0 -0
- /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":"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"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
export declare enum
|
|
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
|
-
|
|
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
|
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,oBAAY,
|
|
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
|
|
2
|
-
(function (
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
})(
|
|
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
|
package/dist/lib/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,
|
|
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
|
-
|
|
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.
|
|
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/
|
|
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('
|
|
35
|
-
.description('Browse and manage available
|
|
34
|
+
.command('tools')
|
|
35
|
+
.description('Browse and manage available tools')
|
|
36
36
|
.action(skillsCommand);
|
|
37
37
|
|
|
38
38
|
program
|
|
39
|
-
.command('install <
|
|
40
|
-
.description('Install a
|
|
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 <
|
|
45
|
-
.description('Uninstall a
|
|
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
|
|
51
|
-
.option('--
|
|
50
|
+
.description('Update droid and installed tools')
|
|
51
|
+
.option('--tools', 'Only update tools')
|
|
52
52
|
.option('--cli', 'Only update the CLI')
|
|
53
|
-
.argument('[
|
|
53
|
+
.argument('[tool]', 'Update a specific tool')
|
|
54
54
|
.action(updateCommand);
|
|
55
55
|
|
|
56
56
|
program
|
package/src/commands/install.ts
CHANGED
|
@@ -1,50 +1,51 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
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(
|
|
7
|
-
// Check if
|
|
8
|
-
const
|
|
9
|
-
const
|
|
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 (!
|
|
12
|
-
console.error(chalk.red(`\n✗
|
|
13
|
-
console.log(chalk.gray('\nAvailable
|
|
14
|
-
for (const
|
|
15
|
-
console.log(chalk.gray(` - ${
|
|
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 (
|
|
22
|
-
console.log(chalk.yellow(`\n⚠
|
|
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 ${
|
|
27
|
+
console.log(chalk.bold(`\n🤖 Installing ${toolName}...\n`));
|
|
28
28
|
|
|
29
|
-
|
|
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(`✓ ${
|
|
34
|
+
console.log(chalk.green(`✓ Installed ${toolName}`));
|
|
33
35
|
|
|
34
|
-
// Check if
|
|
35
|
-
|
|
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(
|
|
39
|
+
const hasRequiredConfig = Object.values(tool.config_schema).some(
|
|
39
40
|
(option) => option.default === undefined
|
|
40
41
|
);
|
|
41
|
-
await promptForSkillConfig(
|
|
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
|
|
47
|
-
console.log(chalk.gray(` - Reconfigure anytime with \`droid
|
|
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 {
|
|
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('
|
|
14
|
+
describe('configurePlatformPermissions', () => {
|
|
15
15
|
beforeEach(() => {
|
|
16
16
|
testHomeDir = join(tmpdir(), `droid-setup-test-${Date.now()}`);
|
|
17
17
|
mkdirSync(testHomeDir, { recursive: true });
|