@orderful/droid 0.15.0 → 0.16.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 +18 -40
- package/AGENTS.md +75 -0
- package/CHANGELOG.md +25 -0
- package/dist/bin/droid.js +3064 -54
- package/dist/commands/setup.d.ts +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/tui/components/Badge.d.ts +13 -0
- package/dist/commands/tui/components/Badge.d.ts.map +1 -0
- package/dist/commands/tui/components/Markdown.d.ts +5 -0
- package/dist/commands/tui/components/Markdown.d.ts.map +1 -0
- package/dist/commands/tui/components/SettingsDetails.d.ts +5 -0
- package/dist/commands/tui/components/SettingsDetails.d.ts.map +1 -0
- package/dist/commands/tui/components/TabBar.d.ts +10 -0
- package/dist/commands/tui/components/TabBar.d.ts.map +1 -0
- package/dist/commands/tui/components/ToolDetails.d.ts +8 -0
- package/dist/commands/tui/components/ToolDetails.d.ts.map +1 -0
- package/dist/commands/tui/components/ToolItem.d.ts +9 -0
- package/dist/commands/tui/components/ToolItem.d.ts.map +1 -0
- package/dist/commands/tui/constants.d.ts +16 -0
- package/dist/commands/tui/constants.d.ts.map +1 -0
- package/dist/commands/tui/hooks/useAppUpdate.d.ts +13 -0
- package/dist/commands/tui/hooks/useAppUpdate.d.ts.map +1 -0
- package/dist/commands/tui/hooks/useToolUpdates.d.ts +22 -0
- package/dist/commands/tui/hooks/useToolUpdates.d.ts.map +1 -0
- package/dist/commands/tui/types.d.ts +5 -0
- package/dist/commands/tui/types.d.ts.map +1 -0
- package/dist/commands/tui/views/ReadmeViewer.d.ts +7 -0
- package/dist/commands/tui/views/ReadmeViewer.d.ts.map +1 -0
- package/dist/commands/tui/views/SetupScreen.d.ts +8 -0
- package/dist/commands/tui/views/SetupScreen.d.ts.map +1 -0
- package/dist/commands/tui/views/SkillConfigScreen.d.ts +8 -0
- package/dist/commands/tui/views/SkillConfigScreen.d.ts.map +1 -0
- package/dist/commands/tui/views/ToolExplorer.d.ts +8 -0
- package/dist/commands/tui/views/ToolExplorer.d.ts.map +1 -0
- package/dist/commands/tui/views/ToolUpdatePrompt.d.ts +10 -0
- package/dist/commands/tui/views/ToolUpdatePrompt.d.ts.map +1 -0
- package/dist/commands/tui/views/WelcomeScreen.d.ts +11 -0
- package/dist/commands/tui/views/WelcomeScreen.d.ts.map +1 -0
- package/dist/commands/tui.d.ts.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +952 -6
- package/dist/lib/agents.d.ts +1 -1
- package/dist/lib/agents.d.ts.map +1 -1
- package/dist/lib/config.d.ts +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/platforms.d.ts +1 -1
- package/dist/lib/platforms.d.ts.map +1 -1
- package/dist/lib/skill-config.d.ts +1 -1
- package/dist/lib/skill-config.d.ts.map +1 -1
- package/dist/lib/skills.d.ts +1 -1
- package/dist/lib/skills.d.ts.map +1 -1
- package/dist/lib/tools.d.ts +1 -1
- package/dist/lib/tools.d.ts.map +1 -1
- package/package.json +3 -3
- package/scripts/build.ts +78 -0
- package/src/bin/droid.ts +8 -8
- package/src/commands/config.ts +1 -1
- package/src/commands/install.ts +3 -3
- package/src/commands/setup.test.ts +1 -1
- package/src/commands/setup.ts +3 -3
- package/src/commands/skills.ts +4 -4
- package/src/commands/tui/components/Badge.tsx +86 -0
- package/src/commands/tui/components/Markdown.tsx +48 -0
- package/src/commands/tui/components/SettingsDetails.tsx +70 -0
- package/src/commands/tui/components/TabBar.tsx +26 -0
- package/src/commands/tui/components/ToolDetails.tsx +117 -0
- package/src/commands/tui/components/ToolItem.tsx +39 -0
- package/src/commands/tui/constants.ts +17 -0
- package/src/commands/tui/hooks/useAppUpdate.ts +67 -0
- package/src/commands/tui/hooks/useToolUpdates.ts +110 -0
- package/src/commands/tui/types.ts +4 -0
- package/src/commands/tui/views/ReadmeViewer.tsx +93 -0
- package/src/commands/tui/views/SetupScreen.tsx +242 -0
- package/src/commands/tui/views/SkillConfigScreen.tsx +278 -0
- package/src/commands/tui/views/ToolExplorer.tsx +190 -0
- package/src/commands/tui/views/ToolUpdatePrompt.tsx +109 -0
- package/src/commands/tui/views/WelcomeScreen.tsx +149 -0
- package/src/commands/tui.tsx +65 -1587
- package/src/commands/uninstall.ts +2 -2
- package/src/commands/update.ts +1 -1
- package/src/index.ts +4 -4
- package/src/lib/agents.ts +4 -4
- package/src/lib/config.ts +1 -1
- package/src/lib/platforms.ts +1 -1
- package/src/lib/skill-config.ts +2 -2
- package/src/lib/skills.test.ts +2 -2
- package/src/lib/skills.ts +5 -5
- package/src/lib/tools.ts +3 -3
- package/src/lib/types.test.ts +1 -1
- package/src/lib/version.test.ts +1 -1
- package/dist/bin/droid.js.map +0 -1
- package/dist/commands/config.js +0 -67
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/install.js +0 -45
- package/dist/commands/install.js.map +0 -1
- package/dist/commands/setup.js +0 -269
- package/dist/commands/setup.js.map +0 -1
- package/dist/commands/skills.js +0 -144
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/tui.js +0 -1008
- package/dist/commands/tui.js.map +0 -1
- package/dist/commands/uninstall.js +0 -26
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/commands/update.js +0 -45
- package/dist/commands/update.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/agents.js +0 -248
- package/dist/lib/agents.js.map +0 -1
- package/dist/lib/config.js +0 -196
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/platforms.js +0 -52
- package/dist/lib/platforms.js.map +0 -1
- package/dist/lib/quotes.js +0 -24
- package/dist/lib/quotes.js.map +0 -1
- package/dist/lib/skill-config.js +0 -80
- package/dist/lib/skill-config.js.map +0 -1
- package/dist/lib/skills.js +0 -582
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/tools.js +0 -145
- package/dist/lib/tools.js.map +0 -1
- package/dist/lib/types.js +0 -50
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/version.js +0 -100
- package/dist/lib/version.js.map +0 -1
package/dist/lib/agents.d.ts
CHANGED
package/dist/lib/agents.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOnC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrC,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA2BzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,EAAE,CA+BlD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAU7D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAG9C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAK3D;AA+CD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAsChH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAMrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAevF"}
|
package/dist/lib/config.d.ts
CHANGED
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,WAAW,EAA0B,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,WAAW,EAA0B,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAgDxI;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,WAAW,CA2BxC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAKpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAanD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAchE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAapE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,IAAI,CAUrF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAMtD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAQ5E"}
|
package/dist/lib/platforms.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platforms.d.ts","sourceRoot":"","sources":["../../src/lib/platforms.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"platforms.d.ts","sourceRoot":"","sources":["../../src/lib/platforms.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;CAajB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAE5D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,aAAa,CAElE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAExD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-config.d.ts","sourceRoot":"","sources":["../../src/lib/skill-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"skill-config.d.ts","sourceRoot":"","sources":["../../src/lib/skill-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnF;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC1C,QAAQ,GAAE,OAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAgFf"}
|
package/dist/lib/skills.d.ts
CHANGED
package/dist/lib/skills.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAsC,MAAM,
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/tools.d.ts
CHANGED
package/dist/lib/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/lib/tools.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,YAAY,EAAuC,MAAM,
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/lib/tools.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,YAAY,EAAuC,MAAM,SAAS,CAAC;AAMjF;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAyBrE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,EAAE,CAmBhD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAczD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBvE;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAuBpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,EAAE,CAyBtD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orderful/droid",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.1",
|
|
4
4
|
"description": "AI workflow toolkit for sharing skills, commands, and agents across the team",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
},
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"scripts": {
|
|
11
|
-
"build": "
|
|
11
|
+
"build": "bun run lint && bun scripts/build.ts",
|
|
12
12
|
"dev": "tsc --watch",
|
|
13
13
|
"start": "bun dist/bin/droid.js",
|
|
14
14
|
"test": "bun test src/",
|
|
15
15
|
"test:watch": "bun test src/ --watch",
|
|
16
|
-
"lint": "eslint src --ext .ts",
|
|
16
|
+
"lint": "eslint src --ext .ts,.tsx",
|
|
17
17
|
"format": "prettier --write 'src/**/*.ts'",
|
|
18
18
|
"changeset": "changeset",
|
|
19
19
|
"version": "changeset version",
|
package/scripts/build.ts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Build script using esbuild for proper ESM bundling
|
|
4
|
+
*
|
|
5
|
+
* This bundles the CLI entry point so Node ESM can resolve imports
|
|
6
|
+
* without explicit .js extensions (which TypeScript doesn't add).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { build, type Plugin } from 'esbuild';
|
|
10
|
+
import { execSync } from 'child_process';
|
|
11
|
+
import { cpSync, rmSync } from 'fs';
|
|
12
|
+
|
|
13
|
+
// Plugin to stub out optional dependencies that may not be installed
|
|
14
|
+
const stubOptionalDeps: Plugin = {
|
|
15
|
+
name: 'stub-optional-deps',
|
|
16
|
+
setup(build) {
|
|
17
|
+
// Stub react-devtools-core (optional Ink dependency for debugging)
|
|
18
|
+
build.onResolve({ filter: /^react-devtools-core$/ }, () => ({
|
|
19
|
+
path: 'react-devtools-core',
|
|
20
|
+
namespace: 'stub',
|
|
21
|
+
}));
|
|
22
|
+
build.onLoad({ filter: /.*/, namespace: 'stub' }, () => ({
|
|
23
|
+
contents: 'export default undefined; export const connectToDevTools = () => {};',
|
|
24
|
+
}));
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
async function main() {
|
|
29
|
+
// Clean dist
|
|
30
|
+
rmSync('dist', { recursive: true, force: true });
|
|
31
|
+
|
|
32
|
+
// Run TypeScript for type checking and declaration files
|
|
33
|
+
console.log('Running TypeScript type check...');
|
|
34
|
+
execSync('tsc --emitDeclarationOnly', { stdio: 'inherit' });
|
|
35
|
+
|
|
36
|
+
// Bundle CLI with esbuild
|
|
37
|
+
console.log('Bundling CLI with esbuild...');
|
|
38
|
+
await build({
|
|
39
|
+
entryPoints: ['src/bin/droid.ts'],
|
|
40
|
+
bundle: true,
|
|
41
|
+
platform: 'node',
|
|
42
|
+
target: 'node18',
|
|
43
|
+
format: 'esm',
|
|
44
|
+
outfile: 'dist/bin/droid.js',
|
|
45
|
+
// Note: shebang is preserved from source file, no banner needed
|
|
46
|
+
plugins: [stubOptionalDeps],
|
|
47
|
+
// Keep npm dependencies external - they'll be installed via package.json
|
|
48
|
+
// Only bundle our own code to fix ESM import resolution
|
|
49
|
+
packages: 'external',
|
|
50
|
+
// Handle React JSX
|
|
51
|
+
jsx: 'automatic',
|
|
52
|
+
jsxImportSource: 'react',
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Bundle index.ts for library exports
|
|
56
|
+
console.log('Bundling library exports...');
|
|
57
|
+
await build({
|
|
58
|
+
entryPoints: ['src/index.ts'],
|
|
59
|
+
bundle: true,
|
|
60
|
+
platform: 'node',
|
|
61
|
+
target: 'node18',
|
|
62
|
+
format: 'esm',
|
|
63
|
+
outfile: 'dist/index.js',
|
|
64
|
+
plugins: [stubOptionalDeps],
|
|
65
|
+
packages: 'external',
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Copy tools directory
|
|
69
|
+
console.log('Copying tools...');
|
|
70
|
+
cpSync('src/tools', 'dist/tools', { recursive: true });
|
|
71
|
+
|
|
72
|
+
console.log('Build complete!');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
main().catch((err) => {
|
|
76
|
+
console.error(err);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
});
|
package/src/bin/droid.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
import { program } from 'commander';
|
|
4
|
-
import { setupCommand } from '../commands/setup
|
|
5
|
-
import { configCommand } from '../commands/config
|
|
6
|
-
import { skillsCommand } from '../commands/skills
|
|
7
|
-
import { installCommand } from '../commands/install
|
|
8
|
-
import { uninstallCommand } from '../commands/uninstall
|
|
9
|
-
import { updateCommand } from '../commands/update
|
|
10
|
-
import { tuiCommand } from '../commands/tui
|
|
11
|
-
import { getVersion } from '../lib/version
|
|
4
|
+
import { setupCommand } from '../commands/setup';
|
|
5
|
+
import { configCommand } from '../commands/config';
|
|
6
|
+
import { skillsCommand } from '../commands/skills';
|
|
7
|
+
import { installCommand } from '../commands/install';
|
|
8
|
+
import { uninstallCommand } from '../commands/uninstall';
|
|
9
|
+
import { updateCommand } from '../commands/update';
|
|
10
|
+
import { tuiCommand } from '../commands/tui';
|
|
11
|
+
import { getVersion } from '../lib/version';
|
|
12
12
|
|
|
13
13
|
const version = getVersion();
|
|
14
14
|
|
package/src/commands/config.ts
CHANGED
package/src/commands/install.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import { installSkill } from '../lib/skills
|
|
3
|
-
import { getBundledTools, isToolInstalled } from '../lib/tools
|
|
4
|
-
import { promptForSkillConfig } from '../lib/skill-config
|
|
2
|
+
import { installSkill } from '../lib/skills';
|
|
3
|
+
import { getBundledTools, isToolInstalled } from '../lib/tools';
|
|
4
|
+
import { promptForSkillConfig } from '../lib/skill-config';
|
|
5
5
|
|
|
6
6
|
export async function installCommand(toolName: string): Promise<void> {
|
|
7
7
|
// Check if tool exists
|
|
@@ -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 { Platform } from '../lib/types
|
|
5
|
+
import { Platform } from '../lib/types';
|
|
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
|
package/src/commands/setup.ts
CHANGED
|
@@ -4,9 +4,9 @@ import { execSync } from 'child_process';
|
|
|
4
4
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
5
5
|
import { join } from 'path';
|
|
6
6
|
import { homedir } from 'os';
|
|
7
|
-
import { loadConfig, saveConfig, configExists } from '../lib/config
|
|
8
|
-
import { getBundledSkills } from '../lib/skills
|
|
9
|
-
import { Platform, BuiltInOutput, type DroidConfig, type OutputPreference } from '../lib/types
|
|
7
|
+
import { loadConfig, saveConfig, configExists } from '../lib/config';
|
|
8
|
+
import { getBundledSkills } from '../lib/skills';
|
|
9
|
+
import { Platform, BuiltInOutput, type DroidConfig, type OutputPreference } from '../lib/types';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Permissions droid needs to operate without constant prompts
|
package/src/commands/skills.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import inquirer from 'inquirer';
|
|
2
2
|
import chalk from 'chalk';
|
|
3
|
-
import { installSkill, uninstallSkill } from '../lib/skills
|
|
4
|
-
import { getBundledTools, isToolInstalled, getInstalledToolVersion } from '../lib/tools
|
|
5
|
-
import { promptForSkillConfig } from '../lib/skill-config
|
|
6
|
-
import { SkillStatus, type ToolManifest } from '../lib/types
|
|
3
|
+
import { installSkill, uninstallSkill } from '../lib/skills';
|
|
4
|
+
import { getBundledTools, isToolInstalled, getInstalledToolVersion } from '../lib/tools';
|
|
5
|
+
import { promptForSkillConfig } from '../lib/skill-config';
|
|
6
|
+
import { SkillStatus, type ToolManifest } from '../lib/types';
|
|
7
7
|
|
|
8
8
|
function formatToolChoice(tool: ToolManifest): string {
|
|
9
9
|
const installed = isToolInstalled(tool.name);
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Box, Text } from 'ink';
|
|
2
|
+
import type { ComponentType } from '../types';
|
|
3
|
+
import { colors } from '../constants';
|
|
4
|
+
import type { ToolManifest } from '../../../lib/types';
|
|
5
|
+
|
|
6
|
+
export function Badge({
|
|
7
|
+
type,
|
|
8
|
+
label,
|
|
9
|
+
isSelected = false,
|
|
10
|
+
dimmed = false,
|
|
11
|
+
}: {
|
|
12
|
+
type: ComponentType;
|
|
13
|
+
label?: string;
|
|
14
|
+
isSelected?: boolean;
|
|
15
|
+
dimmed?: boolean;
|
|
16
|
+
}) {
|
|
17
|
+
const color = colors[type];
|
|
18
|
+
const displayLabel = label || type.charAt(0).toUpperCase() + type.slice(1);
|
|
19
|
+
|
|
20
|
+
if (dimmed) {
|
|
21
|
+
return (
|
|
22
|
+
<Text color={colors.textDim}>{displayLabel}</Text>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<Text
|
|
28
|
+
backgroundColor={isSelected ? color : undefined}
|
|
29
|
+
color={isSelected ? '#000000' : color}
|
|
30
|
+
bold={isSelected}
|
|
31
|
+
>
|
|
32
|
+
{isSelected ? ` ${displayLabel} ` : displayLabel}
|
|
33
|
+
</Text>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function ComponentBadges({ tool, compact = false }: { tool: ToolManifest; compact?: boolean }) {
|
|
38
|
+
const hasSkills = tool.includes.skills.length > 0;
|
|
39
|
+
const hasCommands = tool.includes.commands.length > 0;
|
|
40
|
+
const hasAgents = tool.includes.agents.length > 0;
|
|
41
|
+
|
|
42
|
+
if (compact) {
|
|
43
|
+
// Show colored squares for list view (single char with spacing)
|
|
44
|
+
const parts: string[] = [];
|
|
45
|
+
if (hasSkills) parts.push('skill');
|
|
46
|
+
if (hasCommands) parts.push('command');
|
|
47
|
+
if (hasAgents) parts.push('agent');
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<Box flexDirection="row">
|
|
51
|
+
{parts.map((type, i) => (
|
|
52
|
+
<Text key={type}>
|
|
53
|
+
<Text backgroundColor={colors[type as ComponentType]}> </Text>
|
|
54
|
+
{i < parts.length - 1 && ' '}
|
|
55
|
+
</Text>
|
|
56
|
+
))}
|
|
57
|
+
</Box>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<Box flexDirection="row">
|
|
63
|
+
{hasSkills && (
|
|
64
|
+
<Box marginRight={1}>
|
|
65
|
+
<Text backgroundColor={colors.skill} color="#000000" bold>
|
|
66
|
+
{` ${tool.includes.skills.length} skill${tool.includes.skills.length > 1 ? 's' : ''} `}
|
|
67
|
+
</Text>
|
|
68
|
+
</Box>
|
|
69
|
+
)}
|
|
70
|
+
{hasCommands && (
|
|
71
|
+
<Box marginRight={1}>
|
|
72
|
+
<Text backgroundColor={colors.command} color="#000000" bold>
|
|
73
|
+
{` ${tool.includes.commands.length} cmd${tool.includes.commands.length > 1 ? 's' : ''} `}
|
|
74
|
+
</Text>
|
|
75
|
+
</Box>
|
|
76
|
+
)}
|
|
77
|
+
{hasAgents && (
|
|
78
|
+
<Box marginRight={1}>
|
|
79
|
+
<Text backgroundColor={colors.agent} color="#000000" bold>
|
|
80
|
+
{` ${tool.includes.agents.length} agent${tool.includes.agents.length > 1 ? 's' : ''} `}
|
|
81
|
+
</Text>
|
|
82
|
+
</Box>
|
|
83
|
+
)}
|
|
84
|
+
</Box>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Text } from 'ink';
|
|
2
|
+
import { colors } from '../constants';
|
|
3
|
+
|
|
4
|
+
export function MarkdownLine({ line, inCodeBlock }: { line: string; inCodeBlock: boolean }) {
|
|
5
|
+
// Code block content
|
|
6
|
+
if (inCodeBlock) {
|
|
7
|
+
return <Text color="#a5d6ff">{line || ' '}</Text>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Code block delimiter
|
|
11
|
+
if (line.startsWith('```')) {
|
|
12
|
+
return <Text color={colors.textDim}>{line}</Text>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Headers
|
|
16
|
+
if (line.startsWith('# ')) {
|
|
17
|
+
return <Text color={colors.text} bold>{line.slice(2)}</Text>;
|
|
18
|
+
}
|
|
19
|
+
if (line.startsWith('## ')) {
|
|
20
|
+
return <Text color={colors.text} bold>{line.slice(3)}</Text>;
|
|
21
|
+
}
|
|
22
|
+
if (line.startsWith('### ')) {
|
|
23
|
+
return <Text color="#c9d1d9" bold>{line.slice(4)}</Text>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// YAML frontmatter delimiter
|
|
27
|
+
if (line === '---') {
|
|
28
|
+
return <Text color={colors.textDim}>{line}</Text>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// List items
|
|
32
|
+
if (line.match(/^[\s]*[-*]\s/)) {
|
|
33
|
+
return <Text color={colors.textMuted}>{line}</Text>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Blockquotes
|
|
37
|
+
if (line.startsWith('>')) {
|
|
38
|
+
return <Text color="#8b949e" italic>{line}</Text>;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Table rows
|
|
42
|
+
if (line.includes('|')) {
|
|
43
|
+
return <Text color={colors.textMuted}>{line}</Text>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Default
|
|
47
|
+
return <Text color={colors.textMuted}>{line || ' '}</Text>;
|
|
48
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Box, Text } from 'ink';
|
|
2
|
+
import { loadConfig, getAutoUpdateConfig } from '../../../lib/config';
|
|
3
|
+
import { Platform } from '../../../lib/types';
|
|
4
|
+
import { colors } from '../constants';
|
|
5
|
+
|
|
6
|
+
export interface SettingsDetailsProps {
|
|
7
|
+
isFocused: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function SettingsDetails({
|
|
11
|
+
isFocused,
|
|
12
|
+
}: SettingsDetailsProps) {
|
|
13
|
+
const config = loadConfig();
|
|
14
|
+
const autoUpdateConfig = getAutoUpdateConfig();
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<Box flexDirection="column" paddingLeft={2} flexGrow={1}>
|
|
18
|
+
<Text color={colors.text} bold>Settings</Text>
|
|
19
|
+
|
|
20
|
+
<Box flexDirection="column" marginTop={1}>
|
|
21
|
+
<Text>
|
|
22
|
+
<Text color={colors.textDim}>Platform: </Text>
|
|
23
|
+
<Text color={colors.text}>
|
|
24
|
+
{config.platform === Platform.ClaudeCode ? 'Claude Code' : 'OpenCode'}
|
|
25
|
+
</Text>
|
|
26
|
+
</Text>
|
|
27
|
+
<Text>
|
|
28
|
+
<Text color={colors.textDim}>Your @mention: </Text>
|
|
29
|
+
<Text color={colors.text}>{config.user_mention}</Text>
|
|
30
|
+
</Text>
|
|
31
|
+
<Text>
|
|
32
|
+
<Text color={colors.textDim}>Auto-update tools: </Text>
|
|
33
|
+
<Text color={colors.text}>{autoUpdateConfig.tools ? 'enabled' : 'disabled'}</Text>
|
|
34
|
+
</Text>
|
|
35
|
+
<Text>
|
|
36
|
+
<Text color={colors.textDim}>Auto-update app: </Text>
|
|
37
|
+
<Text color={colors.text}>{autoUpdateConfig.app ? 'enabled' : 'disabled'}</Text>
|
|
38
|
+
</Text>
|
|
39
|
+
</Box>
|
|
40
|
+
|
|
41
|
+
<Box marginTop={2}>
|
|
42
|
+
<Text color={colors.textDim}>Config: ~/.droid/config.yaml</Text>
|
|
43
|
+
</Box>
|
|
44
|
+
|
|
45
|
+
{isFocused && (
|
|
46
|
+
<Box marginTop={2}>
|
|
47
|
+
<Text
|
|
48
|
+
backgroundColor={colors.primary}
|
|
49
|
+
color="#ffffff"
|
|
50
|
+
bold
|
|
51
|
+
>
|
|
52
|
+
{' '}Edit{' '}
|
|
53
|
+
</Text>
|
|
54
|
+
</Box>
|
|
55
|
+
)}
|
|
56
|
+
|
|
57
|
+
{isFocused && (
|
|
58
|
+
<Box marginTop={1}>
|
|
59
|
+
<Text color={colors.textDim}>enter edit · esc back</Text>
|
|
60
|
+
</Box>
|
|
61
|
+
)}
|
|
62
|
+
|
|
63
|
+
{!isFocused && (
|
|
64
|
+
<Box marginTop={2}>
|
|
65
|
+
<Text color={colors.textDim}>press enter to edit</Text>
|
|
66
|
+
</Box>
|
|
67
|
+
)}
|
|
68
|
+
</Box>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Box, Text } from 'ink';
|
|
2
|
+
import type { Tab } from '../types';
|
|
3
|
+
import { colors } from '../constants';
|
|
4
|
+
|
|
5
|
+
export interface TabBarProps {
|
|
6
|
+
tabs: { id: Tab; label: string }[];
|
|
7
|
+
activeTab: Tab;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function TabBar({ tabs, activeTab }: TabBarProps) {
|
|
11
|
+
return (
|
|
12
|
+
<Box flexDirection="row" flexWrap="wrap">
|
|
13
|
+
{tabs.map((tab) => (
|
|
14
|
+
<Text
|
|
15
|
+
key={tab.id}
|
|
16
|
+
backgroundColor={tab.id === activeTab ? colors.primary : undefined}
|
|
17
|
+
color={tab.id === activeTab ? '#ffffff' : colors.textMuted}
|
|
18
|
+
bold={tab.id === activeTab}
|
|
19
|
+
wrap="truncate"
|
|
20
|
+
>
|
|
21
|
+
{' '}{tab.label}{' '}
|
|
22
|
+
</Text>
|
|
23
|
+
))}
|
|
24
|
+
</Box>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Box, Text } from 'ink';
|
|
2
|
+
import { isToolInstalled, getInstalledToolVersion, getToolUpdateStatus } from '../../../lib/tools';
|
|
3
|
+
import type { ToolManifest } from '../../../lib/types';
|
|
4
|
+
import { colors } from '../constants';
|
|
5
|
+
import { ComponentBadges } from './Badge';
|
|
6
|
+
|
|
7
|
+
export interface ToolDetailsProps {
|
|
8
|
+
tool: ToolManifest | null;
|
|
9
|
+
isFocused: boolean;
|
|
10
|
+
selectedAction: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function ToolDetails({
|
|
14
|
+
tool,
|
|
15
|
+
isFocused,
|
|
16
|
+
selectedAction,
|
|
17
|
+
}: ToolDetailsProps) {
|
|
18
|
+
if (!tool) {
|
|
19
|
+
return (
|
|
20
|
+
<Box paddingLeft={2} flexGrow={1}>
|
|
21
|
+
<Text color={colors.textDim}>Select a tool</Text>
|
|
22
|
+
</Box>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const installed = isToolInstalled(tool.name);
|
|
27
|
+
const installedVersion = getInstalledToolVersion(tool.name);
|
|
28
|
+
const updateStatus = getToolUpdateStatus(tool.name);
|
|
29
|
+
const isSystemTool = (tool as ToolManifest & { system?: boolean }).system === true;
|
|
30
|
+
|
|
31
|
+
const actions = installed
|
|
32
|
+
? [
|
|
33
|
+
{ id: 'explore', label: 'Explore', variant: 'default' },
|
|
34
|
+
...(updateStatus.hasUpdate
|
|
35
|
+
? [{ id: 'update', label: `Update (${updateStatus.bundledVersion})`, variant: 'primary' }]
|
|
36
|
+
: []),
|
|
37
|
+
{ id: 'configure', label: 'Configure', variant: 'default' },
|
|
38
|
+
// System tools can't be uninstalled
|
|
39
|
+
...(!isSystemTool ? [{ id: 'uninstall', label: 'Uninstall', variant: 'danger' }] : []),
|
|
40
|
+
]
|
|
41
|
+
: [
|
|
42
|
+
{ id: 'explore', label: 'Explore', variant: 'default' },
|
|
43
|
+
// System tools auto-install, but show Install for manual trigger if needed
|
|
44
|
+
{ id: 'install', label: 'Install', variant: 'primary' },
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<Box flexDirection="column" paddingLeft={2} flexGrow={1}>
|
|
49
|
+
<Text color={colors.text} bold>{tool.name}</Text>
|
|
50
|
+
|
|
51
|
+
<Box marginTop={1}>
|
|
52
|
+
<Text color={colors.textDim}>
|
|
53
|
+
{tool.version}
|
|
54
|
+
{tool.status && ` · ${tool.status}`}
|
|
55
|
+
{installed && <Text color={colors.success}> · installed</Text>}
|
|
56
|
+
{updateStatus.hasUpdate && (
|
|
57
|
+
<Text color={colors.primary}> · update ({installedVersion} → {updateStatus.bundledVersion})</Text>
|
|
58
|
+
)}
|
|
59
|
+
</Text>
|
|
60
|
+
</Box>
|
|
61
|
+
|
|
62
|
+
<Box marginTop={1}>
|
|
63
|
+
<Text color={colors.textMuted}>{tool.description}</Text>
|
|
64
|
+
</Box>
|
|
65
|
+
|
|
66
|
+
{/* Colored component badges */}
|
|
67
|
+
<Box flexDirection="column" marginTop={1}>
|
|
68
|
+
<Text color={colors.textDim}>Includes:</Text>
|
|
69
|
+
<Box marginTop={1}>
|
|
70
|
+
<ComponentBadges tool={tool} />
|
|
71
|
+
</Box>
|
|
72
|
+
{/* Show names below badges */}
|
|
73
|
+
<Box flexDirection="column" marginTop={1} marginLeft={1}>
|
|
74
|
+
{tool.includes.skills.length > 0 && (
|
|
75
|
+
<Text>
|
|
76
|
+
<Text color={colors.skill}>Skills: </Text>
|
|
77
|
+
<Text color={colors.textMuted}>{tool.includes.skills.map(s => s.name).join(', ')}</Text>
|
|
78
|
+
</Text>
|
|
79
|
+
)}
|
|
80
|
+
{tool.includes.commands.length > 0 && (
|
|
81
|
+
<Text>
|
|
82
|
+
<Text color={colors.command}>Commands: </Text>
|
|
83
|
+
<Text color={colors.textMuted}>{tool.includes.commands.map(c => `/${c}`).join(', ')}</Text>
|
|
84
|
+
</Text>
|
|
85
|
+
)}
|
|
86
|
+
{tool.includes.agents.length > 0 && (
|
|
87
|
+
<Text>
|
|
88
|
+
<Text color={colors.agent}>Agents: </Text>
|
|
89
|
+
<Text color={colors.textMuted}>{tool.includes.agents.join(', ')}</Text>
|
|
90
|
+
</Text>
|
|
91
|
+
)}
|
|
92
|
+
</Box>
|
|
93
|
+
</Box>
|
|
94
|
+
|
|
95
|
+
{isFocused && (
|
|
96
|
+
<Box flexDirection="row" marginTop={1}>
|
|
97
|
+
{actions.map((action, index) => (
|
|
98
|
+
<Text
|
|
99
|
+
key={action.id}
|
|
100
|
+
backgroundColor={
|
|
101
|
+
selectedAction === index
|
|
102
|
+
? action.variant === 'danger'
|
|
103
|
+
? colors.error
|
|
104
|
+
: colors.primary
|
|
105
|
+
: colors.bgSelected
|
|
106
|
+
}
|
|
107
|
+
color={selectedAction === index ? '#ffffff' : colors.textMuted}
|
|
108
|
+
bold={selectedAction === index}
|
|
109
|
+
>
|
|
110
|
+
{' '}{action.label}{' '}
|
|
111
|
+
</Text>
|
|
112
|
+
))}
|
|
113
|
+
</Box>
|
|
114
|
+
)}
|
|
115
|
+
</Box>
|
|
116
|
+
);
|
|
117
|
+
}
|