@orderful/droid 0.10.5 → 0.11.1
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 +19 -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 +125 -99
- 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/tools/comments/TOOL.yaml +27 -0
- package/dist/{skills → tools/comments/skills}/comments/SKILL.md +12 -3
- package/dist/{skills → tools/comments/skills}/comments/SKILL.yaml +1 -1
- 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 +134 -101
- 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/tools/comments/TOOL.yaml +27 -0
- package/src/{skills → tools/comments/skills}/comments/SKILL.md +12 -3
- package/src/{skills → tools/comments/skills}/comments/SKILL.yaml +1 -1
- 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/commands/code-review.md +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}/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/commands/code-review.md +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}/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 @@
|
|
|
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: []
|
|
@@ -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.3
|
|
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
|
|
@@ -79,13 +79,22 @@ When you find a `@droid` marker:
|
|
|
79
79
|
|
|
80
80
|
### On `/comments check`:
|
|
81
81
|
|
|
82
|
+
**Use a two-pass approach for coherent responses:**
|
|
83
|
+
|
|
84
|
+
#### Pass 1: Read & Analyse
|
|
82
85
|
1. **Read config first:** Check `~/.droid/skills/comments/overrides.yaml` for `preserve_comments` setting (default: `true`)
|
|
83
|
-
2. Search for `> @droid` (and any configured `ai_mentions`) in the specified scope
|
|
86
|
+
2. Search for ALL `> @droid` comments (and any configured `ai_mentions`) in the specified scope
|
|
84
87
|
3. If there's a `git diff`, check those files first for relevant context
|
|
85
|
-
4.
|
|
88
|
+
4. **Read all comments before responding** - understand the full picture
|
|
89
|
+
5. Look for connections between comments (one may inform another)
|
|
90
|
+
6. Note any contradictions or tensions to address
|
|
91
|
+
|
|
92
|
+
#### Pass 2: Respond & Write
|
|
93
|
+
1. For each comment, determine intent:
|
|
86
94
|
- **Action request** ("do X", "add Y", "fix Z") → Execute the action
|
|
87
95
|
- **Question** ("what do you think", "should we") → Respond with `> @{user_mention}`
|
|
88
|
-
|
|
96
|
+
2. Ensure responses are coherent across all comments (don't contradict yourself)
|
|
97
|
+
3. **Handle original comment based on `preserve_comments`:**
|
|
89
98
|
- If `preserve_comments: true` → Keep the original `@droid` comment (add response below it)
|
|
90
99
|
- If `preserve_comments: false` → Remove the original comment after addressing
|
|
91
100
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
name: comments
|
|
2
2
|
description: "Enable inline conversations using @droid/@user markers. Tag @droid to ask the AI, AI responds with @{your-name}. Use /comments check to address markers, /comments cleanup to remove resolved threads. Ideal for code review notes and async collaboration."
|
|
3
|
-
version: 0.2.
|
|
3
|
+
version: 0.2.3
|
|
4
4
|
status: beta
|
|
5
5
|
dependencies: []
|
|
6
6
|
provides_output: false
|
|
@@ -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.1",
|
|
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 });
|
package/src/commands/setup.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { join } from 'path';
|
|
|
6
6
|
import { homedir } from 'os';
|
|
7
7
|
import { loadConfig, saveConfig, configExists } from '../lib/config.js';
|
|
8
8
|
import { getBundledSkills } from '../lib/skills.js';
|
|
9
|
-
import {
|
|
9
|
+
import { Platform, BuiltInOutput, type DroidConfig, type OutputPreference } from '../lib/types.js';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Permissions droid needs to operate without constant prompts
|
|
@@ -20,19 +20,19 @@ const DROID_PERMISSIONS = [
|
|
|
20
20
|
];
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
|
-
* Detect which
|
|
23
|
+
* Detect which platform is installed
|
|
24
24
|
*/
|
|
25
|
-
function
|
|
25
|
+
function detectPlatform(): Platform | null {
|
|
26
26
|
try {
|
|
27
27
|
execSync('claude --version', { stdio: 'ignore' });
|
|
28
|
-
return
|
|
28
|
+
return Platform.ClaudeCode;
|
|
29
29
|
} catch {
|
|
30
30
|
// Claude Code not found
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
try {
|
|
34
34
|
execSync('opencode --version', { stdio: 'ignore' });
|
|
35
|
-
return
|
|
35
|
+
return Platform.OpenCode;
|
|
36
36
|
} catch {
|
|
37
37
|
// OpenCode not found
|
|
38
38
|
}
|
|
@@ -59,12 +59,12 @@ function detectGitUsername(): string {
|
|
|
59
59
|
const OPENCODE_SKILLS_PLUGIN = 'opencode-skills';
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
|
-
* Configure
|
|
62
|
+
* Configure platform permissions for droid
|
|
63
63
|
*/
|
|
64
|
-
export function
|
|
64
|
+
export function configurePlatformPermissions(platform: Platform): { added: string[]; alreadyPresent: boolean; error?: string } {
|
|
65
65
|
const added: string[] = [];
|
|
66
66
|
|
|
67
|
-
if (
|
|
67
|
+
if (platform === Platform.ClaudeCode) {
|
|
68
68
|
const settingsPath = join(homedir(), '.claude', 'settings.json');
|
|
69
69
|
|
|
70
70
|
// Ensure .claude directory exists
|
|
@@ -113,7 +113,7 @@ export function configureAIToolPermissions(aiTool: AITool): { added: string[]; a
|
|
|
113
113
|
return { added, alreadyPresent: added.length === 0 };
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
if (
|
|
116
|
+
if (platform === Platform.OpenCode) {
|
|
117
117
|
// OpenCode uses opencode.json for config
|
|
118
118
|
// Check global config location: ~/.config/opencode/opencode.json
|
|
119
119
|
const globalConfigDir = join(homedir(), '.config', 'opencode');
|
|
@@ -188,8 +188,8 @@ function getOutputOptions(): Array<{ name: string; value: OutputPreference }> {
|
|
|
188
188
|
export async function setupCommand(): Promise<void> {
|
|
189
189
|
console.log(chalk.bold('\n🤖 Droid Setup\n'));
|
|
190
190
|
|
|
191
|
-
const
|
|
192
|
-
if (
|
|
191
|
+
const hasExistingConfig = configExists();
|
|
192
|
+
if (hasExistingConfig) {
|
|
193
193
|
const { overwrite } = await inquirer.prompt<{ overwrite: boolean }>([
|
|
194
194
|
{
|
|
195
195
|
type: 'confirm',
|
|
@@ -205,12 +205,12 @@ export async function setupCommand(): Promise<void> {
|
|
|
205
205
|
}
|
|
206
206
|
}
|
|
207
207
|
|
|
208
|
-
// Detect
|
|
209
|
-
const
|
|
210
|
-
if (
|
|
211
|
-
console.log(chalk.green(`✓ Detected ${
|
|
208
|
+
// Detect platform
|
|
209
|
+
const detectedPlatform = detectPlatform();
|
|
210
|
+
if (detectedPlatform) {
|
|
211
|
+
console.log(chalk.green(`✓ Detected ${detectedPlatform}\n`));
|
|
212
212
|
} else {
|
|
213
|
-
console.log(chalk.yellow('⚠ No
|
|
213
|
+
console.log(chalk.yellow('⚠ No platform detected (Claude Code or OpenCode)\n'));
|
|
214
214
|
}
|
|
215
215
|
|
|
216
216
|
// Detect git username
|
|
@@ -220,20 +220,20 @@ export async function setupCommand(): Promise<void> {
|
|
|
220
220
|
const outputOptions = getOutputOptions();
|
|
221
221
|
|
|
222
222
|
const answers = await inquirer.prompt<{
|
|
223
|
-
|
|
223
|
+
platform: Platform;
|
|
224
224
|
user_mention: string;
|
|
225
225
|
output_preference: OutputPreference;
|
|
226
226
|
git_username: string;
|
|
227
227
|
}>([
|
|
228
228
|
{
|
|
229
229
|
type: 'list',
|
|
230
|
-
name: '
|
|
231
|
-
message: 'Which
|
|
230
|
+
name: 'platform',
|
|
231
|
+
message: 'Which platform are you using?',
|
|
232
232
|
choices: [
|
|
233
|
-
{ name: 'Claude Code', value:
|
|
234
|
-
{ name: 'OpenCode', value:
|
|
233
|
+
{ name: 'Claude Code', value: Platform.ClaudeCode },
|
|
234
|
+
{ name: 'OpenCode', value: Platform.OpenCode },
|
|
235
235
|
],
|
|
236
|
-
default:
|
|
236
|
+
default: detectedPlatform || Platform.ClaudeCode,
|
|
237
237
|
},
|
|
238
238
|
{
|
|
239
239
|
type: 'input',
|
|
@@ -260,27 +260,31 @@ export async function setupCommand(): Promise<void> {
|
|
|
260
260
|
},
|
|
261
261
|
]);
|
|
262
262
|
|
|
263
|
+
const existingConfig = loadConfig();
|
|
263
264
|
const config: DroidConfig = {
|
|
264
|
-
...
|
|
265
|
-
|
|
265
|
+
...existingConfig,
|
|
266
|
+
platform: answers.platform,
|
|
267
|
+
user_mention: answers.user_mention,
|
|
268
|
+
output_preference: answers.output_preference,
|
|
269
|
+
git_username: answers.git_username,
|
|
266
270
|
};
|
|
267
271
|
|
|
268
272
|
saveConfig(config);
|
|
269
273
|
|
|
270
274
|
console.log(chalk.green('\n✓ Config saved to ~/.droid/config.yaml'));
|
|
271
275
|
|
|
272
|
-
// Configure
|
|
273
|
-
const { added, alreadyPresent, error } =
|
|
276
|
+
// Configure platform permissions/plugins
|
|
277
|
+
const { added, alreadyPresent, error } = configurePlatformPermissions(answers.platform);
|
|
274
278
|
if (error) {
|
|
275
279
|
console.log(chalk.red(`✗ ${error}`));
|
|
276
|
-
console.log(chalk.yellow(' You may need to manually configure your
|
|
277
|
-
} else if (answers.
|
|
280
|
+
console.log(chalk.yellow(' You may need to manually configure your platform'));
|
|
281
|
+
} else if (answers.platform === Platform.ClaudeCode) {
|
|
278
282
|
if (added.length > 0) {
|
|
279
283
|
console.log(chalk.green(`✓ Added droid permissions to Claude Code settings`));
|
|
280
284
|
} else if (alreadyPresent) {
|
|
281
285
|
console.log(chalk.gray(` Droid permissions already configured in Claude Code`));
|
|
282
286
|
}
|
|
283
|
-
} else if (answers.
|
|
287
|
+
} else if (answers.platform === Platform.OpenCode) {
|
|
284
288
|
if (added.length > 0) {
|
|
285
289
|
console.log(chalk.green(`✓ Added opencode-skills plugin to OpenCode config`));
|
|
286
290
|
console.log(chalk.gray(` This enables Claude Code-style skills in OpenCode`));
|