sdd-toolkit 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/index.js +21 -191
- package/src/lib/handlers/antigravity.js +34 -0
- package/src/lib/handlers/claude.js +40 -0
- package/src/lib/handlers/cursor.js +34 -0
- package/src/lib/handlers/gemini.js +34 -0
- package/src/lib/handlers/index.js +17 -0
- package/src/lib/handlers/kilo.js +34 -0
- package/src/lib/handlers/opencode.js +36 -0
- package/src/lib/handlers/roo.js +27 -0
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -9,24 +9,9 @@ const pc = require('picocolors');
|
|
|
9
9
|
// Internal Modules
|
|
10
10
|
const { loadAgents } = require('./lib/agents');
|
|
11
11
|
const { setLocale, t, getLocale } = require('./lib/i18n');
|
|
12
|
-
const {
|
|
13
|
-
toGeminiTOML,
|
|
14
|
-
toGeminiSkill,
|
|
15
|
-
toRooSkill,
|
|
16
|
-
toKiloMarkdown,
|
|
17
|
-
toKiloSkill,
|
|
18
|
-
toCursorMDC,
|
|
19
|
-
toCursorSkill,
|
|
20
|
-
toClaudeCommand,
|
|
21
|
-
toClaudeSkill,
|
|
22
|
-
toClaudeSubagent,
|
|
23
|
-
toOpenCodeSkill,
|
|
24
|
-
toOpenCodeSubagent,
|
|
25
|
-
toAntigravitySkill,
|
|
26
|
-
toAntigravityWorkflow
|
|
27
|
-
} = require('./lib/transformers');
|
|
28
12
|
const { generateWorkflowGuide } = require('./lib/docs');
|
|
29
13
|
const { view } = require('./commands/view');
|
|
14
|
+
const handlers = require('./lib/handlers');
|
|
30
15
|
|
|
31
16
|
async function main() {
|
|
32
17
|
console.clear();
|
|
@@ -71,20 +56,30 @@ async function main() {
|
|
|
71
56
|
if (fs.existsSync(path.join(process.cwd(), '.roo'))) tools.push('roo');
|
|
72
57
|
if (fs.existsSync(path.join(process.cwd(), '.cline'))) tools.push('cline');
|
|
73
58
|
if (fs.existsSync(path.join(process.cwd(), '.cursor'))) tools.push('cursor');
|
|
74
|
-
if (fs.existsSync(path.join(process.cwd(), '.windsurf'))) tools.push('windsurf');
|
|
75
59
|
if (fs.existsSync(path.join(process.cwd(), '.claude'))) tools.push('claude');
|
|
76
|
-
if (fs.existsSync(path.join(process.cwd(), '.trae'))) tools.push('trae');
|
|
77
60
|
if (fs.existsSync(path.join(process.cwd(), '.kilocode'))) tools.push('kilo');
|
|
78
|
-
if (fs.existsSync(path.join(process.cwd(), '.github'))) tools.push('copilot');
|
|
79
|
-
if (fs.existsSync(path.join(process.cwd(), '.roo'))) tools.push('roo');
|
|
80
61
|
if (fs.existsSync(path.join(process.cwd(), '.opencode'))) tools.push('opencode');
|
|
81
|
-
if (fs.existsSync(path.join(process.cwd(), '
|
|
82
|
-
|
|
83
|
-
if (fs.existsSync(path.join(process.cwd(), '.antigravity'))) tools.push('antigravity');
|
|
62
|
+
if (fs.existsSync(path.join(process.cwd(), '.antigravity')) || fs.existsSync(path.join(process.cwd(), '.agent'))) tools.push('antigravity');
|
|
84
63
|
if (tools.length === 0) {
|
|
85
64
|
note(t('UPGRADE.NO_CONFIG'), t('UPGRADE.NO_CONFIG_TITLE'));
|
|
86
65
|
} else {
|
|
87
66
|
note(t('UPGRADE.DETECTED_TOOLS', tools.join(', ')), t('UPGRADE.DETECTED_TITLE'));
|
|
67
|
+
|
|
68
|
+
// 1. Smart Scaffolding (Update folders, preserve files)
|
|
69
|
+
const s = spinner();
|
|
70
|
+
s.start(t('SCAFFOLD.LOADING'));
|
|
71
|
+
try {
|
|
72
|
+
const stats = generateWorkflowGuide(process.cwd());
|
|
73
|
+
if (stats.created > 0) {
|
|
74
|
+
s.stop(`${t('SCAFFOLD.SUCCESS')} (${stats.created} new, ${stats.verified} verified)`);
|
|
75
|
+
} else {
|
|
76
|
+
s.stop(t('SCAFFOLD.ALREADY_EXISTS'));
|
|
77
|
+
}
|
|
78
|
+
} catch (e) {
|
|
79
|
+
s.stop(pc.red(t('SCAFFOLD.ERROR')));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// 2. Update Agents
|
|
88
83
|
await processAgentsInstallation(tools, { locale: getLocale() });
|
|
89
84
|
outro(pc.green(t('UPGRADE.SUCCESS')));
|
|
90
85
|
process.exit(0);
|
|
@@ -163,175 +158,10 @@ async function processAgentsInstallation(tools, options) {
|
|
|
163
158
|
|
|
164
159
|
s.message(t('INSTALL.INSTALLING', tools.join(', ')));
|
|
165
160
|
|
|
166
|
-
const toolHandlers = {
|
|
167
|
-
gemini: async (validAgents, options) => {
|
|
168
|
-
const commandsDir = path.join(process.cwd(), '.gemini', 'commands', 'dev');
|
|
169
|
-
const skillsDir = path.join(process.cwd(), '.gemini', 'skills');
|
|
170
|
-
|
|
171
|
-
await fsp.mkdir(commandsDir, { recursive: true });
|
|
172
|
-
await fsp.mkdir(skillsDir, { recursive: true });
|
|
173
|
-
|
|
174
|
-
await Promise.all(
|
|
175
|
-
validAgents.map(async (agent) => {
|
|
176
|
-
// Generate Command (TOML)
|
|
177
|
-
const toml = toGeminiTOML(agent, options);
|
|
178
|
-
const fileName = `${agent.originalName}.toml`;
|
|
179
|
-
await fsp.writeFile(path.join(commandsDir, fileName), toml);
|
|
180
|
-
|
|
181
|
-
// Generate Skill
|
|
182
|
-
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
183
|
-
const agentSkillDir = path.join(skillsDir, skillName);
|
|
184
|
-
await fsp.mkdir(agentSkillDir, { recursive: true });
|
|
185
|
-
const skillContent = toGeminiSkill(agent, options);
|
|
186
|
-
await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
|
|
187
|
-
})
|
|
188
|
-
);
|
|
189
|
-
},
|
|
190
|
-
roo: async (validAgents, options) => {
|
|
191
|
-
const skillsDir = path.join(process.cwd(), '.roo', 'skills');
|
|
192
|
-
await fsp.mkdir(skillsDir, { recursive: true });
|
|
193
|
-
|
|
194
|
-
await Promise.all(
|
|
195
|
-
validAgents.map(async (agent) => {
|
|
196
|
-
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
197
|
-
|
|
198
|
-
// Generate Skill: .roo/skills/[agent-slug]/SKILL.md
|
|
199
|
-
const agentSkillDir = path.join(skillsDir, skillName);
|
|
200
|
-
await fsp.mkdir(agentSkillDir, { recursive: true });
|
|
201
|
-
const skillContent = toRooSkill(agent, options);
|
|
202
|
-
await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
|
|
203
|
-
})
|
|
204
|
-
);
|
|
205
|
-
},
|
|
206
|
-
claude: async (validAgents, options) => {
|
|
207
|
-
const commandsDir = path.join(process.cwd(), '.claude', 'commands', 'agents');
|
|
208
|
-
const skillsDir = path.join(process.cwd(), '.claude', 'skills');
|
|
209
|
-
const agentsDir = path.join(process.cwd(), '.claude', 'agents');
|
|
210
|
-
|
|
211
|
-
await fsp.mkdir(commandsDir, { recursive: true });
|
|
212
|
-
await fsp.mkdir(skillsDir, { recursive: true });
|
|
213
|
-
await fsp.mkdir(agentsDir, { recursive: true });
|
|
214
|
-
|
|
215
|
-
await Promise.all(
|
|
216
|
-
validAgents.map(async (agent) => {
|
|
217
|
-
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
218
|
-
|
|
219
|
-
// Generate Command
|
|
220
|
-
const command = toClaudeCommand(agent, options);
|
|
221
|
-
await fsp.writeFile(path.join(commandsDir, `${agent.slug}.md`), command);
|
|
222
|
-
|
|
223
|
-
// Generate Skill
|
|
224
|
-
const agentSkillDir = path.join(skillsDir, skillName);
|
|
225
|
-
await fsp.mkdir(agentSkillDir, { recursive: true });
|
|
226
|
-
const skill = toClaudeSkill(agent, options);
|
|
227
|
-
await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skill);
|
|
228
|
-
|
|
229
|
-
// Generate Subagent
|
|
230
|
-
const subagent = toClaudeSubagent(agent, options);
|
|
231
|
-
await fsp.writeFile(path.join(agentsDir, `${skillName}.md`), subagent);
|
|
232
|
-
})
|
|
233
|
-
);
|
|
234
|
-
},
|
|
235
|
-
cursor: async (validAgents, options) => {
|
|
236
|
-
const commandsDir = path.join(process.cwd(), '.cursor', 'commands');
|
|
237
|
-
const skillsDir = path.join(process.cwd(), '.cursor', 'skills');
|
|
238
|
-
|
|
239
|
-
await fsp.mkdir(commandsDir, { recursive: true });
|
|
240
|
-
await fsp.mkdir(skillsDir, { recursive: true });
|
|
241
|
-
|
|
242
|
-
await Promise.all(
|
|
243
|
-
validAgents.map(async (agent) => {
|
|
244
|
-
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
245
|
-
|
|
246
|
-
// Generate Commands (.mdc)
|
|
247
|
-
const mdc = toCursorMDC(agent, options);
|
|
248
|
-
await fsp.writeFile(path.join(commandsDir, `${agent.slug}.mdc`), mdc);
|
|
249
|
-
|
|
250
|
-
// Generate Skills (SKILL.md)
|
|
251
|
-
const skillDir = path.join(skillsDir, skillName);
|
|
252
|
-
await fsp.mkdir(skillDir, { recursive: true });
|
|
253
|
-
const skill = toCursorSkill(agent, options);
|
|
254
|
-
await fsp.writeFile(path.join(skillDir, 'SKILL.md'), skill);
|
|
255
|
-
})
|
|
256
|
-
);
|
|
257
|
-
},
|
|
258
|
-
kilo: async (validAgents, options) => {
|
|
259
|
-
const workflowsDir = path.join(process.cwd(), '.kilocode', 'workflows');
|
|
260
|
-
const skillsDir = path.join(process.cwd(), '.kilocode', 'skills');
|
|
261
|
-
|
|
262
|
-
await fsp.mkdir(workflowsDir, { recursive: true });
|
|
263
|
-
await fsp.mkdir(skillsDir, { recursive: true });
|
|
264
|
-
|
|
265
|
-
await Promise.all(
|
|
266
|
-
validAgents.map(async (agent) => {
|
|
267
|
-
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
268
|
-
|
|
269
|
-
// Generate Workflow
|
|
270
|
-
const workflow = toKiloMarkdown(agent, options);
|
|
271
|
-
await fsp.writeFile(path.join(workflowsDir, `${agent.slug}.md`), workflow);
|
|
272
|
-
|
|
273
|
-
// Generate Skill
|
|
274
|
-
const agentSkillDir = path.join(skillsDir, skillName);
|
|
275
|
-
await fsp.mkdir(agentSkillDir, { recursive: true });
|
|
276
|
-
const skill = toKiloSkill(agent, options);
|
|
277
|
-
await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skill);
|
|
278
|
-
})
|
|
279
|
-
);
|
|
280
|
-
},
|
|
281
|
-
opencode: async (validAgents, options) => {
|
|
282
|
-
const skillsDir = path.join(process.cwd(), '.opencode', 'skills');
|
|
283
|
-
const agentsDir = path.join(process.cwd(), '.opencode', 'agents');
|
|
284
|
-
|
|
285
|
-
// Ensure base directories exist
|
|
286
|
-
await fsp.mkdir(skillsDir, { recursive: true });
|
|
287
|
-
await fsp.mkdir(agentsDir, { recursive: true });
|
|
288
|
-
|
|
289
|
-
await Promise.all(
|
|
290
|
-
validAgents.map(async (agent) => {
|
|
291
|
-
// Ensure compatibility with naming rules (lowercase, alphanumeric, single hyphens)
|
|
292
|
-
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
293
|
-
|
|
294
|
-
// Generate Skill: .opencode/skills/[agent-slug]/SKILL.md
|
|
295
|
-
const agentSkillDir = path.join(skillsDir, skillName);
|
|
296
|
-
await fsp.mkdir(agentSkillDir, { recursive: true });
|
|
297
|
-
const skillContent = toOpenCodeSkill(agent, options);
|
|
298
|
-
await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
|
|
299
|
-
|
|
300
|
-
// Generate Subagent: .opencode/agents/[agent-slug].md
|
|
301
|
-
const subagentContent = toOpenCodeSubagent(agent, options);
|
|
302
|
-
await fsp.writeFile(path.join(agentsDir, `${skillName}.md`), subagentContent);
|
|
303
|
-
})
|
|
304
|
-
);
|
|
305
|
-
},
|
|
306
|
-
antigravity: async (validAgents, options) => {
|
|
307
|
-
const skillsDir = path.join(process.cwd(), '.agent', 'skills');
|
|
308
|
-
const workflowsDir = path.join(process.cwd(), '.agent', 'workflows');
|
|
309
|
-
|
|
310
|
-
await fsp.mkdir(skillsDir, { recursive: true });
|
|
311
|
-
await fsp.mkdir(workflowsDir, { recursive: true });
|
|
312
|
-
|
|
313
|
-
await Promise.all(
|
|
314
|
-
validAgents.map(async (agent) => {
|
|
315
|
-
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
316
|
-
|
|
317
|
-
// Generate Skill: .agent/skills/[agent-slug]/SKILL.md
|
|
318
|
-
const agentSkillDir = path.join(skillsDir, skillName);
|
|
319
|
-
await fsp.mkdir(agentSkillDir, { recursive: true });
|
|
320
|
-
const skillContent = toAntigravitySkill(agent, options);
|
|
321
|
-
await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
|
|
322
|
-
|
|
323
|
-
// Generate Workflow: .agent/workflows/[agent-slug].md
|
|
324
|
-
const workflowContent = toAntigravityWorkflow(agent, options);
|
|
325
|
-
await fsp.writeFile(path.join(workflowsDir, `${skillName}.md`), workflowContent);
|
|
326
|
-
})
|
|
327
|
-
);
|
|
328
|
-
}
|
|
329
|
-
};
|
|
330
|
-
|
|
331
161
|
for (const tool of tools) {
|
|
332
|
-
const handler =
|
|
333
|
-
if (handler) {
|
|
334
|
-
await handler(validAgents, options);
|
|
162
|
+
const handler = handlers[tool];
|
|
163
|
+
if (handler && typeof handler.install === 'function') {
|
|
164
|
+
await handler.install(validAgents, options);
|
|
335
165
|
}
|
|
336
166
|
}
|
|
337
167
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const fsp = require('fs/promises');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { toAntigravitySkill, toAntigravityWorkflow } = require('../transformers');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Handles installation for Antigravity
|
|
7
|
+
* @param {Array} agents - List of agents to install
|
|
8
|
+
* @param {Object} options - Installation options
|
|
9
|
+
*/
|
|
10
|
+
async function install(agents, options) {
|
|
11
|
+
const skillsDir = path.join(process.cwd(), '.agent', 'skills');
|
|
12
|
+
const workflowsDir = path.join(process.cwd(), '.agent', 'workflows');
|
|
13
|
+
|
|
14
|
+
await fsp.mkdir(skillsDir, { recursive: true });
|
|
15
|
+
await fsp.mkdir(workflowsDir, { recursive: true });
|
|
16
|
+
|
|
17
|
+
await Promise.all(
|
|
18
|
+
agents.map(async (agent) => {
|
|
19
|
+
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
20
|
+
|
|
21
|
+
// Generate Skill: .agent/skills/[agent-slug]/SKILL.md
|
|
22
|
+
const agentSkillDir = path.join(skillsDir, skillName);
|
|
23
|
+
await fsp.mkdir(agentSkillDir, { recursive: true });
|
|
24
|
+
const skillContent = toAntigravitySkill(agent, options);
|
|
25
|
+
await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
|
|
26
|
+
|
|
27
|
+
// Generate Workflow: .agent/workflows/[agent-slug].md
|
|
28
|
+
const workflowContent = toAntigravityWorkflow(agent, options);
|
|
29
|
+
await fsp.writeFile(path.join(workflowsDir, `${skillName}.md`), workflowContent);
|
|
30
|
+
})
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = { install };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const fsp = require('fs/promises');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { toClaudeCommand, toClaudeSkill, toClaudeSubagent } = require('../transformers');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Handles installation for Claude Code
|
|
7
|
+
* @param {Array} agents - List of agents to install
|
|
8
|
+
* @param {Object} options - Installation options
|
|
9
|
+
*/
|
|
10
|
+
async function install(agents, options) {
|
|
11
|
+
const commandsDir = path.join(process.cwd(), '.claude', 'commands', 'agents');
|
|
12
|
+
const skillsDir = path.join(process.cwd(), '.claude', 'skills');
|
|
13
|
+
const agentsDir = path.join(process.cwd(), '.claude', 'agents');
|
|
14
|
+
|
|
15
|
+
await fsp.mkdir(commandsDir, { recursive: true });
|
|
16
|
+
await fsp.mkdir(skillsDir, { recursive: true });
|
|
17
|
+
await fsp.mkdir(agentsDir, { recursive: true });
|
|
18
|
+
|
|
19
|
+
await Promise.all(
|
|
20
|
+
agents.map(async (agent) => {
|
|
21
|
+
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
22
|
+
|
|
23
|
+
// Generate Command
|
|
24
|
+
const command = toClaudeCommand(agent, options);
|
|
25
|
+
await fsp.writeFile(path.join(commandsDir, `${agent.slug}.md`), command);
|
|
26
|
+
|
|
27
|
+
// Generate Skill
|
|
28
|
+
const agentSkillDir = path.join(skillsDir, skillName);
|
|
29
|
+
await fsp.mkdir(agentSkillDir, { recursive: true });
|
|
30
|
+
const skill = toClaudeSkill(agent, options);
|
|
31
|
+
await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skill);
|
|
32
|
+
|
|
33
|
+
// Generate Subagent
|
|
34
|
+
const subagent = toClaudeSubagent(agent, options);
|
|
35
|
+
await fsp.writeFile(path.join(agentsDir, `${skillName}.md`), subagent);
|
|
36
|
+
})
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
module.exports = { install };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const fsp = require('fs/promises');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { toCursorMDC, toCursorSkill } = require('../transformers');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Handles installation for Cursor
|
|
7
|
+
* @param {Array} agents - List of agents to install
|
|
8
|
+
* @param {Object} options - Installation options
|
|
9
|
+
*/
|
|
10
|
+
async function install(agents, options) {
|
|
11
|
+
const commandsDir = path.join(process.cwd(), '.cursor', 'commands');
|
|
12
|
+
const skillsDir = path.join(process.cwd(), '.cursor', 'skills');
|
|
13
|
+
|
|
14
|
+
await fsp.mkdir(commandsDir, { recursive: true });
|
|
15
|
+
await fsp.mkdir(skillsDir, { recursive: true });
|
|
16
|
+
|
|
17
|
+
await Promise.all(
|
|
18
|
+
agents.map(async (agent) => {
|
|
19
|
+
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
20
|
+
|
|
21
|
+
// Generate Commands (.mdc)
|
|
22
|
+
const mdc = toCursorMDC(agent, options);
|
|
23
|
+
await fsp.writeFile(path.join(commandsDir, `${agent.slug}.mdc`), mdc);
|
|
24
|
+
|
|
25
|
+
// Generate Skills (SKILL.md)
|
|
26
|
+
const skillDir = path.join(skillsDir, skillName);
|
|
27
|
+
await fsp.mkdir(skillDir, { recursive: true });
|
|
28
|
+
const skill = toCursorSkill(agent, options);
|
|
29
|
+
await fsp.writeFile(path.join(skillDir, 'SKILL.md'), skill);
|
|
30
|
+
})
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = { install };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const fsp = require('fs/promises');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { toGeminiTOML, toGeminiSkill } = require('../transformers');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Handles installation for Gemini
|
|
7
|
+
* @param {Array} agents - List of agents to install
|
|
8
|
+
* @param {Object} options - Installation options
|
|
9
|
+
*/
|
|
10
|
+
async function install(agents, options) {
|
|
11
|
+
const commandsDir = path.join(process.cwd(), '.gemini', 'commands', 'dev');
|
|
12
|
+
const skillsDir = path.join(process.cwd(), '.gemini', 'skills');
|
|
13
|
+
|
|
14
|
+
await fsp.mkdir(commandsDir, { recursive: true });
|
|
15
|
+
await fsp.mkdir(skillsDir, { recursive: true });
|
|
16
|
+
|
|
17
|
+
await Promise.all(
|
|
18
|
+
agents.map(async (agent) => {
|
|
19
|
+
// Generate Command (TOML)
|
|
20
|
+
const toml = toGeminiTOML(agent, options);
|
|
21
|
+
const fileName = `${agent.originalName}.toml`;
|
|
22
|
+
await fsp.writeFile(path.join(commandsDir, fileName), toml);
|
|
23
|
+
|
|
24
|
+
// Generate Skill
|
|
25
|
+
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
26
|
+
const agentSkillDir = path.join(skillsDir, skillName);
|
|
27
|
+
await fsp.mkdir(agentSkillDir, { recursive: true });
|
|
28
|
+
const skillContent = toGeminiSkill(agent, options);
|
|
29
|
+
await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
|
|
30
|
+
})
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = { install };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const gemini = require('./gemini');
|
|
2
|
+
const roo = require('./roo');
|
|
3
|
+
const claude = require('./claude');
|
|
4
|
+
const cursor = require('./cursor');
|
|
5
|
+
const kilo = require('./kilo');
|
|
6
|
+
const opencode = require('./opencode');
|
|
7
|
+
const antigravity = require('./antigravity');
|
|
8
|
+
|
|
9
|
+
module.exports = {
|
|
10
|
+
gemini,
|
|
11
|
+
roo,
|
|
12
|
+
claude,
|
|
13
|
+
cursor,
|
|
14
|
+
kilo,
|
|
15
|
+
opencode,
|
|
16
|
+
antigravity
|
|
17
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const fsp = require('fs/promises');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { toKiloMarkdown, toKiloSkill } = require('../transformers');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Handles installation for Kilo Code
|
|
7
|
+
* @param {Array} agents - List of agents to install
|
|
8
|
+
* @param {Object} options - Installation options
|
|
9
|
+
*/
|
|
10
|
+
async function install(agents, options) {
|
|
11
|
+
const workflowsDir = path.join(process.cwd(), '.kilocode', 'workflows');
|
|
12
|
+
const skillsDir = path.join(process.cwd(), '.kilocode', 'skills');
|
|
13
|
+
|
|
14
|
+
await fsp.mkdir(workflowsDir, { recursive: true });
|
|
15
|
+
await fsp.mkdir(skillsDir, { recursive: true });
|
|
16
|
+
|
|
17
|
+
await Promise.all(
|
|
18
|
+
agents.map(async (agent) => {
|
|
19
|
+
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
20
|
+
|
|
21
|
+
// Generate Workflow
|
|
22
|
+
const workflow = toKiloMarkdown(agent, options);
|
|
23
|
+
await fsp.writeFile(path.join(workflowsDir, `${agent.slug}.md`), workflow);
|
|
24
|
+
|
|
25
|
+
// Generate Skill
|
|
26
|
+
const agentSkillDir = path.join(skillsDir, skillName);
|
|
27
|
+
await fsp.mkdir(agentSkillDir, { recursive: true });
|
|
28
|
+
const skill = toKiloSkill(agent, options);
|
|
29
|
+
await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skill);
|
|
30
|
+
})
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = { install };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const fsp = require('fs/promises');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { toOpenCodeSkill, toOpenCodeSubagent } = require('../transformers');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Handles installation for OpenCode
|
|
7
|
+
* @param {Array} agents - List of agents to install
|
|
8
|
+
* @param {Object} options - Installation options
|
|
9
|
+
*/
|
|
10
|
+
async function install(agents, options) {
|
|
11
|
+
const skillsDir = path.join(process.cwd(), '.opencode', 'skills');
|
|
12
|
+
const agentsDir = path.join(process.cwd(), '.opencode', 'agents');
|
|
13
|
+
|
|
14
|
+
// Ensure base directories exist
|
|
15
|
+
await fsp.mkdir(skillsDir, { recursive: true });
|
|
16
|
+
await fsp.mkdir(agentsDir, { recursive: true });
|
|
17
|
+
|
|
18
|
+
await Promise.all(
|
|
19
|
+
agents.map(async (agent) => {
|
|
20
|
+
// Ensure compatibility with naming rules (lowercase, alphanumeric, single hyphens)
|
|
21
|
+
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
22
|
+
|
|
23
|
+
// Generate Skill: .opencode/skills/[agent-slug]/SKILL.md
|
|
24
|
+
const agentSkillDir = path.join(skillsDir, skillName);
|
|
25
|
+
await fsp.mkdir(agentSkillDir, { recursive: true });
|
|
26
|
+
const skillContent = toOpenCodeSkill(agent, options);
|
|
27
|
+
await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
|
|
28
|
+
|
|
29
|
+
// Generate Subagent: .opencode/agents/[agent-slug].md
|
|
30
|
+
const subagentContent = toOpenCodeSubagent(agent, options);
|
|
31
|
+
await fsp.writeFile(path.join(agentsDir, `${skillName}.md`), subagentContent);
|
|
32
|
+
})
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
module.exports = { install };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const fsp = require('fs/promises');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { toRooSkill } = require('../transformers');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Handles installation for Roo Code
|
|
7
|
+
* @param {Array} agents - List of agents to install
|
|
8
|
+
* @param {Object} options - Installation options
|
|
9
|
+
*/
|
|
10
|
+
async function install(agents, options) {
|
|
11
|
+
const skillsDir = path.join(process.cwd(), '.roo', 'skills');
|
|
12
|
+
await fsp.mkdir(skillsDir, { recursive: true });
|
|
13
|
+
|
|
14
|
+
await Promise.all(
|
|
15
|
+
agents.map(async (agent) => {
|
|
16
|
+
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
17
|
+
|
|
18
|
+
// Generate Skill: .roo/skills/[agent-slug]/SKILL.md
|
|
19
|
+
const agentSkillDir = path.join(skillsDir, skillName);
|
|
20
|
+
await fsp.mkdir(agentSkillDir, { recursive: true });
|
|
21
|
+
const skillContent = toRooSkill(agent, options);
|
|
22
|
+
await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
|
|
23
|
+
})
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
module.exports = { install };
|