@brookmind/ai-toolkit 1.0.0 → 1.0.5

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/bin/cli.js CHANGED
@@ -1,5 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { run } from '../src/index.js';
3
+ import { run } from '../dist/index.js';
4
4
 
5
- run().catch(console.error);
5
+ run().catch((error) => {
6
+ console.error(error);
7
+ process.exit(1);
8
+ });
@@ -0,0 +1,2 @@
1
+ export declare function run(): Promise<void>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuEA,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAkQzC"}
package/dist/index.js ADDED
@@ -0,0 +1,284 @@
1
+ import * as p from '@clack/prompts';
2
+ import chalk from 'chalk';
3
+ import { readdir, cp, mkdir, access, readFile } from 'fs/promises';
4
+ import { join, dirname } from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import { homedir } from 'os';
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ const ROOT_DIR = join(__dirname, '..');
9
+ async function getDirectories(path) {
10
+ try {
11
+ const entries = await readdir(path, { withFileTypes: true });
12
+ return entries.filter(e => e.isDirectory()).map(e => e.name);
13
+ }
14
+ catch {
15
+ return [];
16
+ }
17
+ }
18
+ async function getFiles(path, extension) {
19
+ try {
20
+ const entries = await readdir(path, { withFileTypes: true });
21
+ return entries
22
+ .filter(e => e.isFile() && e.name.endsWith(extension))
23
+ .map(e => e.name.replace(extension, ''));
24
+ }
25
+ catch {
26
+ return [];
27
+ }
28
+ }
29
+ async function exists(path) {
30
+ try {
31
+ await access(path);
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ async function getInstalledClaudeMcps() {
39
+ try {
40
+ const home = homedir();
41
+ const configPath = join(home, '.claude.json');
42
+ const content = await readFile(configPath, 'utf-8');
43
+ const config = JSON.parse(content);
44
+ if (config.mcpServers) {
45
+ return new Set(Object.keys(config.mcpServers));
46
+ }
47
+ return new Set();
48
+ }
49
+ catch {
50
+ return new Set();
51
+ }
52
+ }
53
+ async function getInstalledOpencodeMcps() {
54
+ try {
55
+ const home = homedir();
56
+ const configPath = join(home, '.config', 'opencode', 'opencode.json');
57
+ const content = await readFile(configPath, 'utf-8');
58
+ const config = JSON.parse(content);
59
+ if (config.mcp) {
60
+ return new Set(Object.keys(config.mcp));
61
+ }
62
+ return new Set();
63
+ }
64
+ catch {
65
+ return new Set();
66
+ }
67
+ }
68
+ export async function run() {
69
+ console.clear();
70
+ p.intro(chalk.bgMagenta.white(' AI Toolkit Installer '));
71
+ // Get available items
72
+ const agents = await getFiles(join(ROOT_DIR, 'agents'), '.md');
73
+ const skills = await getDirectories(join(ROOT_DIR, 'skills'));
74
+ const mcps = await getDirectories(join(ROOT_DIR, 'mcps'));
75
+ const home = homedir();
76
+ // State
77
+ let step = 1;
78
+ let platform = null;
79
+ let selectedAgents = [];
80
+ let selectedSkills = [];
81
+ let selectedMcps = [];
82
+ // Step loop with back navigation
83
+ while (step <= 5) {
84
+ if (step === 1) {
85
+ // Step 1: Platform
86
+ p.log.info(chalk.cyan('Step 1/5: Platform'));
87
+ const result = await p.select({
88
+ message: 'Where do you want to install?',
89
+ options: [
90
+ { value: 'claude', label: 'Claude Code' },
91
+ { value: 'opencode', label: 'OpenCode' },
92
+ { value: 'both', label: 'Both' },
93
+ ],
94
+ });
95
+ if (p.isCancel(result)) {
96
+ p.cancel('Installation cancelled.');
97
+ process.exit(0);
98
+ }
99
+ platform = result;
100
+ step = 2;
101
+ }
102
+ else if (step === 2) {
103
+ // Step 2: Agents
104
+ p.log.info(chalk.cyan('Step 2/5: Agents'));
105
+ if (agents.length > 0) {
106
+ const agentOptions = [];
107
+ for (const agent of agents) {
108
+ let isInstalled = false;
109
+ if (platform === 'claude' || platform === 'both') {
110
+ if (await exists(join(home, '.claude', 'agents', `${agent}.md`))) {
111
+ isInstalled = true;
112
+ }
113
+ }
114
+ if (platform === 'opencode' || platform === 'both') {
115
+ if (await exists(join(home, '.config', 'opencode', 'agent', `${agent}.md`))) {
116
+ isInstalled = true;
117
+ }
118
+ }
119
+ agentOptions.push({
120
+ value: agent,
121
+ label: isInstalled ? `${agent} ${chalk.yellow('(installed)')}` : agent,
122
+ });
123
+ }
124
+ const result = await p.multiselect({
125
+ message: 'Select agents (space to toggle, enter to continue)',
126
+ options: agentOptions,
127
+ required: false,
128
+ });
129
+ if (p.isCancel(result)) {
130
+ p.cancel('Installation cancelled.');
131
+ process.exit(0);
132
+ }
133
+ selectedAgents = result;
134
+ }
135
+ step = 3;
136
+ }
137
+ else if (step === 3) {
138
+ // Step 3: Skills
139
+ p.log.info(chalk.cyan('Step 3/5: Skills'));
140
+ if (skills.length > 0) {
141
+ const skillOptions = [];
142
+ for (const skill of skills) {
143
+ let isInstalled = false;
144
+ if (platform === 'claude' || platform === 'both') {
145
+ if (await exists(join(home, '.claude', 'skills', skill))) {
146
+ isInstalled = true;
147
+ }
148
+ }
149
+ skillOptions.push({
150
+ value: skill,
151
+ label: isInstalled ? `${skill} ${chalk.yellow('(installed)')}` : skill,
152
+ });
153
+ }
154
+ const result = await p.multiselect({
155
+ message: 'Select skills (space to toggle, enter to continue)',
156
+ options: skillOptions,
157
+ required: false,
158
+ });
159
+ if (p.isCancel(result)) {
160
+ p.cancel('Installation cancelled.');
161
+ process.exit(0);
162
+ }
163
+ selectedSkills = result;
164
+ }
165
+ step = 4;
166
+ }
167
+ else if (step === 4) {
168
+ // Step 4: MCPs
169
+ p.log.info(chalk.cyan('Step 4/5: MCPs'));
170
+ if (mcps.length > 0) {
171
+ // Check installed MCPs for both platforms
172
+ const claudeMcps = platform === 'claude' || platform === 'both'
173
+ ? await getInstalledClaudeMcps()
174
+ : new Set();
175
+ const opencodeMcps = platform === 'opencode' || platform === 'both'
176
+ ? await getInstalledOpencodeMcps()
177
+ : new Set();
178
+ const mcpOptions = mcps.map(mcp => {
179
+ const inClaude = claudeMcps.has(mcp);
180
+ const inOpencode = opencodeMcps.has(mcp);
181
+ let label = mcp;
182
+ if (platform === 'both') {
183
+ const tags = [];
184
+ if (inClaude)
185
+ tags.push('Claude');
186
+ if (inOpencode)
187
+ tags.push('OpenCode');
188
+ if (tags.length > 0) {
189
+ label += ` ${chalk.yellow(`(${tags.join(', ')})`)}`;
190
+ }
191
+ }
192
+ else if (inClaude || inOpencode) {
193
+ label += ` ${chalk.yellow('(installed)')}`;
194
+ }
195
+ return { value: mcp, label };
196
+ });
197
+ const result = await p.multiselect({
198
+ message: 'Select MCPs (space to toggle, enter to continue)',
199
+ options: mcpOptions,
200
+ required: false,
201
+ });
202
+ if (p.isCancel(result)) {
203
+ p.cancel('Installation cancelled.');
204
+ process.exit(0);
205
+ }
206
+ selectedMcps = result;
207
+ }
208
+ step = 5;
209
+ }
210
+ else if (step === 5) {
211
+ // Step 5: Confirm
212
+ p.log.info(chalk.cyan('Step 5/5: Confirm'));
213
+ const summary = [
214
+ `Platform: ${platform}`,
215
+ `Agents: ${selectedAgents.length > 0 ? selectedAgents.join(', ') : 'none'}`,
216
+ `Skills: ${selectedSkills.length > 0 ? selectedSkills.join(', ') : 'none'}`,
217
+ `MCPs: ${selectedMcps.length > 0 ? selectedMcps.join(', ') : 'none'}`,
218
+ ].join('\n');
219
+ p.note(summary, 'Summary');
220
+ const confirm = await p.confirm({
221
+ message: 'Proceed with installation?',
222
+ });
223
+ if (p.isCancel(confirm) || !confirm) {
224
+ p.cancel('Installation cancelled.');
225
+ process.exit(0);
226
+ }
227
+ // Proceed with installation
228
+ break;
229
+ }
230
+ }
231
+ // Installation
232
+ const s = p.spinner();
233
+ s.start('Installing...');
234
+ async function installClaude() {
235
+ const claudeDir = join(home, '.claude');
236
+ const agentsDir = join(claudeDir, 'agents');
237
+ const skillsDir = join(claudeDir, 'skills');
238
+ await mkdir(agentsDir, { recursive: true });
239
+ await mkdir(skillsDir, { recursive: true });
240
+ for (const agent of selectedAgents) {
241
+ const src = join(ROOT_DIR, 'agents', `${agent}.md`);
242
+ const dest = join(agentsDir, `${agent}.md`);
243
+ await cp(src, dest);
244
+ }
245
+ for (const skill of selectedSkills) {
246
+ const src = join(ROOT_DIR, 'skills', skill);
247
+ const dest = join(skillsDir, skill);
248
+ await cp(src, dest, { recursive: true, force: true });
249
+ }
250
+ }
251
+ async function installOpencode() {
252
+ const opencodeDir = join(home, '.config', 'opencode');
253
+ const agentsDir = join(opencodeDir, 'agent');
254
+ const commandsDir = join(opencodeDir, 'command');
255
+ await mkdir(agentsDir, { recursive: true });
256
+ await mkdir(commandsDir, { recursive: true });
257
+ for (const agent of selectedAgents) {
258
+ const src = join(ROOT_DIR, 'agents', `${agent}.md`);
259
+ const dest = join(agentsDir, `${agent}.md`);
260
+ await cp(src, dest);
261
+ }
262
+ }
263
+ try {
264
+ if (platform === 'claude' || platform === 'both') {
265
+ await installClaude();
266
+ }
267
+ if (platform === 'opencode' || platform === 'both') {
268
+ await installOpencode();
269
+ }
270
+ s.stop('Installation complete!');
271
+ }
272
+ catch (error) {
273
+ s.stop('Installation failed');
274
+ p.log.error(error instanceof Error ? error.message : String(error));
275
+ process.exit(1);
276
+ }
277
+ // MCP instructions
278
+ if (selectedMcps.length > 0) {
279
+ const mcpInstructions = selectedMcps.map(mcp => ` → mcps/${mcp}/README.md`).join('\n');
280
+ p.note(mcpInstructions, 'MCP Setup Instructions');
281
+ }
282
+ p.outro(chalk.green('Done! Your tools are ready.'));
283
+ }
284
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,17 +1,25 @@
1
1
  {
2
2
  "name": "@brookmind/ai-toolkit",
3
- "version": "1.0.0",
3
+ "version": "1.0.5",
4
4
  "description": "AI Toolkit installer for Claude Code and OpenCode - agents, skills, and MCPs",
5
5
  "type": "module",
6
- "main": "src/index.js",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
7
8
  "bin": {
8
9
  "ai-toolkit": "./bin/cli.js"
9
10
  },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/davidcastillog/ai-toolkit.git"
14
+ },
10
15
  "publishConfig": {
16
+ "registry": "https://registry.npmjs.org",
11
17
  "access": "public"
12
18
  },
13
19
  "scripts": {
14
- "start": "node bin/cli.js"
20
+ "build": "tsc",
21
+ "start": "npm run build && node bin/cli.js",
22
+ "prepublishOnly": "npm run build"
15
23
  },
16
24
  "keywords": [
17
25
  "claude",
@@ -22,19 +30,22 @@
22
30
  "skills",
23
31
  "mcp"
24
32
  ],
25
- "author": "CKW",
33
+ "author": "David Castillo",
26
34
  "license": "MIT",
27
35
  "dependencies": {
28
- "@inquirer/prompts": "^7.0.0",
29
- "chalk": "^5.3.0",
30
- "ora": "^8.0.0"
36
+ "@clack/prompts": "^0.11.0",
37
+ "chalk": "^5.3.0"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^25.0.9",
41
+ "typescript": "^5.9.3"
31
42
  },
32
43
  "engines": {
33
44
  "node": ">=18.0.0"
34
45
  },
35
46
  "files": [
36
47
  "bin",
37
- "src",
48
+ "dist",
38
49
  "agents",
39
50
  "skills",
40
51
  "mcps"
package/src/index.js DELETED
@@ -1,181 +0,0 @@
1
- import { select, checkbox, confirm } from '@inquirer/prompts';
2
- import chalk from 'chalk';
3
- import ora from 'ora';
4
- import { readdir, cp, mkdir } from 'fs/promises';
5
- import { existsSync } from 'fs';
6
- import { join, dirname } from 'path';
7
- import { fileURLToPath } from 'url';
8
- import { homedir } from 'os';
9
-
10
- const __dirname = dirname(fileURLToPath(import.meta.url));
11
- const ROOT_DIR = join(__dirname, '..');
12
-
13
- async function getDirectories(path) {
14
- try {
15
- const entries = await readdir(path, { withFileTypes: true });
16
- return entries.filter(e => e.isDirectory()).map(e => e.name);
17
- } catch {
18
- return [];
19
- }
20
- }
21
-
22
- async function getFiles(path, extension) {
23
- try {
24
- const entries = await readdir(path, { withFileTypes: true });
25
- return entries
26
- .filter(e => e.isFile() && e.name.endsWith(extension))
27
- .map(e => e.name.replace(extension, ''));
28
- } catch {
29
- return [];
30
- }
31
- }
32
-
33
- export async function run() {
34
- console.clear();
35
-
36
- // Header
37
- console.log('');
38
- console.log(chalk.magenta('╔═══════════════════════════════════════════════════╗'));
39
- console.log(chalk.magenta('║ ║'));
40
- console.log(chalk.magenta('║') + chalk.white.bold(' CKW AI Toolkit Installer ') + chalk.magenta('║'));
41
- console.log(chalk.magenta('║ ║'));
42
- console.log(chalk.magenta('╚═══════════════════════════════════════════════════╝'));
43
- console.log('');
44
-
45
- // Get available items
46
- const agents = await getFiles(join(ROOT_DIR, 'agents'), '.md');
47
- const skills = await getDirectories(join(ROOT_DIR, 'skills'));
48
- const mcps = await getDirectories(join(ROOT_DIR, 'mcps'));
49
-
50
- // Step 1: Platform
51
- console.log(chalk.cyan('Step 1/4: Platform'));
52
- const platform = await select({
53
- message: 'Where do you want to install?',
54
- choices: [
55
- { name: 'Claude Code', value: 'claude' },
56
- { name: 'OpenCode', value: 'opencode' },
57
- { name: 'Both', value: 'both' }
58
- ]
59
- });
60
-
61
- // Step 2: Agents
62
- console.log('');
63
- console.log(chalk.cyan('Step 2/4: Agents'));
64
- const selectedAgents = agents.length > 0
65
- ? await checkbox({
66
- message: 'Select agents to install',
67
- choices: agents.map(a => ({ name: a, value: a }))
68
- })
69
- : [];
70
-
71
- // Step 3: Skills
72
- console.log('');
73
- console.log(chalk.cyan('Step 3/4: Skills'));
74
- const selectedSkills = skills.length > 0
75
- ? await checkbox({
76
- message: 'Select skills to install',
77
- choices: skills.map(s => ({ name: s, value: s }))
78
- })
79
- : [];
80
-
81
- // Step 4: MCPs
82
- console.log('');
83
- console.log(chalk.cyan('Step 4/4: MCPs'));
84
- const selectedMcps = mcps.length > 0
85
- ? await checkbox({
86
- message: 'Select MCPs to install',
87
- choices: mcps.map(m => ({ name: m, value: m }))
88
- })
89
- : [];
90
-
91
- // Summary
92
- console.log('');
93
- console.log(chalk.yellow('Summary'));
94
- console.log('');
95
- console.log(` Platform: ${chalk.white(platform)}`);
96
- console.log(` Agents: ${chalk.white(selectedAgents.length > 0 ? selectedAgents.join(', ') : 'none')}`);
97
- console.log(` Skills: ${chalk.white(selectedSkills.length > 0 ? selectedSkills.join(', ') : 'none')}`);
98
- console.log(` MCPs: ${chalk.white(selectedMcps.length > 0 ? selectedMcps.join(', ') : 'none')}`);
99
- console.log('');
100
-
101
- const proceed = await confirm({ message: 'Proceed with installation?' });
102
-
103
- if (!proceed) {
104
- console.log(chalk.yellow('Installation cancelled.'));
105
- return;
106
- }
107
-
108
- // Installation
109
- console.log('');
110
- const spinner = ora('Installing...').start();
111
-
112
- const home = homedir();
113
-
114
- async function installClaude() {
115
- const claudeDir = join(home, '.claude');
116
- const agentsDir = join(claudeDir, 'agents');
117
- const skillsDir = join(claudeDir, 'skills');
118
-
119
- await mkdir(agentsDir, { recursive: true });
120
- await mkdir(skillsDir, { recursive: true });
121
-
122
- for (const agent of selectedAgents) {
123
- const src = join(ROOT_DIR, 'agents', `${agent}.md`);
124
- const dest = join(agentsDir, `${agent}.md`);
125
- await cp(src, dest);
126
- }
127
-
128
- for (const skill of selectedSkills) {
129
- const src = join(ROOT_DIR, 'skills', skill);
130
- const dest = join(skillsDir, skill);
131
- await cp(src, dest, { recursive: true });
132
- }
133
- }
134
-
135
- async function installOpencode() {
136
- const opencodeDir = join(home, '.config', 'opencode');
137
- const agentsDir = join(opencodeDir, 'agent');
138
- const commandsDir = join(opencodeDir, 'command');
139
-
140
- await mkdir(agentsDir, { recursive: true });
141
- await mkdir(commandsDir, { recursive: true });
142
-
143
- for (const agent of selectedAgents) {
144
- const src = join(ROOT_DIR, 'agents', `${agent}.md`);
145
- const dest = join(agentsDir, `${agent}.md`);
146
- await cp(src, dest);
147
- }
148
- }
149
-
150
- try {
151
- if (platform === 'claude' || platform === 'both') {
152
- await installClaude();
153
- }
154
- if (platform === 'opencode' || platform === 'both') {
155
- await installOpencode();
156
- }
157
-
158
- spinner.succeed('Installation complete!');
159
- } catch (error) {
160
- spinner.fail('Installation failed');
161
- console.error(chalk.red(error.message));
162
- return;
163
- }
164
-
165
- // Done
166
- console.log('');
167
- console.log(chalk.green('╔═══════════════════════════════════════════════════╗'));
168
- console.log(chalk.green('║') + chalk.white.bold(' ✓ Installation Complete! ') + chalk.green('║'));
169
- console.log(chalk.green('╚═══════════════════════════════════════════════════╝'));
170
-
171
- if (selectedMcps.length > 0) {
172
- console.log('');
173
- console.log(chalk.yellow('MCP Setup Instructions:'));
174
- console.log('');
175
- for (const mcp of selectedMcps) {
176
- console.log(` → ${chalk.cyan(`mcps/${mcp}/README.md`)}`);
177
- }
178
- }
179
-
180
- console.log('');
181
- }