@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 +5 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +284 -0
- package/dist/index.js.map +1 -0
- package/package.json +19 -8
- package/src/index.js +0 -181
package/bin/cli.js
CHANGED
package/dist/index.d.ts
ADDED
|
@@ -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.
|
|
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": "
|
|
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
|
-
"
|
|
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": "
|
|
33
|
+
"author": "David Castillo",
|
|
26
34
|
"license": "MIT",
|
|
27
35
|
"dependencies": {
|
|
28
|
-
"@
|
|
29
|
-
"chalk": "^5.3.0"
|
|
30
|
-
|
|
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
|
-
"
|
|
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
|
-
}
|