sdd-toolkit 3.1.0 → 3.1.2
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/README.md +5 -6
- package/package.json +2 -4
- package/src/index.js +2 -4
- package/src/lib/handlers/antigravity.js +21 -7
- package/src/lib/handlers/index.js +0 -2
- package/src/lib/handlers/opencode.js +24 -4
- package/src/lib/messages.js +6 -9
- package/src/lib/transformers.js +6 -56
- package/src/lib/handlers/roo.js +0 -27
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ CLI tool to automatically set up the development environment and install AI agen
|
|
|
8
8
|
|
|
9
9
|
## Overview
|
|
10
10
|
|
|
11
|
-
**sdd-toolkit** is an "AI Agent Package Manager". It defines a standard squad of AI Developers and installs them directly into the context of your favorite AI Coding Assistant (such as Gemini,
|
|
11
|
+
**sdd-toolkit** is an "AI Agent Package Manager". It defines a standard squad of AI Developers and installs them directly into the context of your favorite AI Coding Assistant (such as Gemini, Cline, Kilo Code, OpenCode).
|
|
12
12
|
|
|
13
13
|
The main idea is to stop creating prompts from scratch and install a proven, structured workflow.
|
|
14
14
|
|
|
@@ -45,7 +45,6 @@ The toolkit supports English, Portuguese (Brazil), and Spanish. Agents automatic
|
|
|
45
45
|
Reads agnostic definitions (YAML) and converts them to specific formats:
|
|
46
46
|
|
|
47
47
|
- **Gemini CLI:** Generates `.toml` configuration files.
|
|
48
|
-
- **Roo Code:** Generates agents in `.roo/commands/*.md`.
|
|
49
48
|
- **Cline:** Generates custom modes (`_custom_modes.json`) and context rules in `.cline/`.
|
|
50
49
|
- **GitHub Copilot:** Generates instructions in `.github/prompts.md` and agents in `.github/prompts/*.md`.
|
|
51
50
|
- **Cursor:** Generates rules in `.cursor/commands/*.mdc`.
|
|
@@ -283,7 +282,7 @@ MIT
|
|
|
283
282
|
|
|
284
283
|
---
|
|
285
284
|
|
|
286
|
-
|
|
285
|
+
|
|
287
286
|
|
|
288
287
|
## Troubleshooting
|
|
289
288
|
|
|
@@ -293,7 +292,7 @@ MIT
|
|
|
293
292
|
|
|
294
293
|
**Solutions:**
|
|
295
294
|
|
|
296
|
-
- **
|
|
295
|
+
- **Cline:** Check if you've configured Custom Modes in your settings. See the warning message after installation.
|
|
297
296
|
- **Cursor:** Restart the IDE after installation.
|
|
298
297
|
- **OpenCode:** Refresh the command palette.
|
|
299
298
|
- **Gemini CLI:** Verify `.gemini/commands/dev/` folder exists with `.toml` files.
|
|
@@ -341,7 +340,7 @@ MIT
|
|
|
341
340
|
|
|
342
341
|
**Q: Can I use multiple AI assistants simultaneously?**
|
|
343
342
|
|
|
344
|
-
A: Yes! You can install agents for multiple AI tools in the same project. Each tool has its own folder structure (`.
|
|
343
|
+
A: Yes! You can install agents for multiple AI tools in the same project. Each tool has its own folder structure (`.cline/`, `.cursor/`, etc.) and they can coexist without conflicts.
|
|
345
344
|
|
|
346
345
|
**Q: How do I update agents after initial setup?**
|
|
347
346
|
|
|
@@ -365,7 +364,7 @@ A: Yes, it's recommended. The `.sdd-toolkit/` folder contains your project docum
|
|
|
365
364
|
|
|
366
365
|
**Q: How do I remove sdd-toolkit from my project?**
|
|
367
366
|
|
|
368
|
-
A: Simply delete the `.sdd-toolkit/` folder and any tool-specific folders (`.
|
|
367
|
+
A: Simply delete the `.sdd-toolkit/` folder and any tool-specific folders (`.cline/`, `.cursor/`, etc.). These are all generated files and won't affect your source code.
|
|
369
368
|
|
|
370
369
|
**Q: Are my code changes tracked by sdd-toolkit?**
|
|
371
370
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sdd-toolkit",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.2",
|
|
4
4
|
"description": "Instalador automatico dos agentes de desenvolvimento",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -22,8 +22,7 @@
|
|
|
22
22
|
"src",
|
|
23
23
|
"definitions",
|
|
24
24
|
"templates",
|
|
25
|
-
"README.md"
|
|
26
|
-
"README.pt.md"
|
|
25
|
+
"README.md"
|
|
27
26
|
],
|
|
28
27
|
"keywords": [
|
|
29
28
|
"ai",
|
|
@@ -32,7 +31,6 @@
|
|
|
32
31
|
"dev-tools",
|
|
33
32
|
"llm",
|
|
34
33
|
"gemini",
|
|
35
|
-
"roo-code",
|
|
36
34
|
"cline"
|
|
37
35
|
],
|
|
38
36
|
"repository": {
|
package/src/index.js
CHANGED
|
@@ -53,7 +53,6 @@ async function main() {
|
|
|
53
53
|
|
|
54
54
|
const tools = [];
|
|
55
55
|
if (fs.existsSync(path.join(process.cwd(), '.gemini'))) tools.push('gemini');
|
|
56
|
-
if (fs.existsSync(path.join(process.cwd(), '.roo'))) tools.push('roo');
|
|
57
56
|
if (fs.existsSync(path.join(process.cwd(), '.cline'))) tools.push('cline');
|
|
58
57
|
if (fs.existsSync(path.join(process.cwd(), '.cursor'))) tools.push('cursor');
|
|
59
58
|
if (fs.existsSync(path.join(process.cwd(), '.claude'))) tools.push('claude');
|
|
@@ -118,7 +117,6 @@ async function main() {
|
|
|
118
117
|
message: t('SETUP.TOOL_SELECT'),
|
|
119
118
|
options: [
|
|
120
119
|
{ value: 'gemini', label: t('TOOLS.GEMINI'), hint: '.gemini/commands/* & skills/*' },
|
|
121
|
-
{ value: 'roo', label: t('TOOLS.ROO'), hint: '.roo/skills/*' },
|
|
122
120
|
{ value: 'cursor', label: t('TOOLS.CURSOR'), hint: '.cursor/commands/* & skills/*' },
|
|
123
121
|
{ value: 'claude', label: 'Claude Code', hint: '.claude/commands/* & skills/* & agents/*' },
|
|
124
122
|
{ value: 'kilo', label: t('TOOLS.KILO'), hint: '.kilocode/workflows/* & skills/*' },
|
|
@@ -167,8 +165,8 @@ async function processAgentsInstallation(tools, options) {
|
|
|
167
165
|
|
|
168
166
|
s.stop(t('INSTALL.FINISHED'));
|
|
169
167
|
|
|
170
|
-
if (tools.includes('
|
|
171
|
-
note(t('INSTALL.
|
|
168
|
+
if (tools.includes('cline')) {
|
|
169
|
+
note(t('INSTALL.CLINE_WARNING'), t('INSTALL.CLINE_WARNING_TITLE'));
|
|
172
170
|
}
|
|
173
171
|
} catch (e) {
|
|
174
172
|
s.stop(pc.red(`${t('INSTALL.FAILED')}: ${e.message}`));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const fsp = require('fs/promises');
|
|
2
2
|
const path = require('path');
|
|
3
|
-
const { toAntigravitySkill
|
|
3
|
+
const { toAntigravitySkill } = require('../transformers');
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Handles installation for Antigravity
|
|
@@ -9,10 +9,8 @@ const { toAntigravitySkill, toAntigravityWorkflow } = require('../transformers')
|
|
|
9
9
|
*/
|
|
10
10
|
async function install(agents, options) {
|
|
11
11
|
const skillsDir = path.join(process.cwd(), '.agent', 'skills');
|
|
12
|
-
const workflowsDir = path.join(process.cwd(), '.agent', 'workflows');
|
|
13
12
|
|
|
14
13
|
await fsp.mkdir(skillsDir, { recursive: true });
|
|
15
|
-
await fsp.mkdir(workflowsDir, { recursive: true });
|
|
16
14
|
|
|
17
15
|
await Promise.all(
|
|
18
16
|
agents.map(async (agent) => {
|
|
@@ -23,12 +21,28 @@ async function install(agents, options) {
|
|
|
23
21
|
await fsp.mkdir(agentSkillDir, { recursive: true });
|
|
24
22
|
const skillContent = toAntigravitySkill(agent, options);
|
|
25
23
|
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
24
|
})
|
|
31
25
|
);
|
|
26
|
+
|
|
27
|
+
// Install Pre-defined Skills (from definitions/skills)
|
|
28
|
+
const predefinedSkillsDir = path.join(__dirname, '..', '..', '..', 'definitions', 'skills');
|
|
29
|
+
try {
|
|
30
|
+
await fsp.access(predefinedSkillsDir);
|
|
31
|
+
const skillFolders = await fsp.readdir(predefinedSkillsDir);
|
|
32
|
+
|
|
33
|
+
await Promise.all(skillFolders.map(async (folder) => {
|
|
34
|
+
const srcPath = path.join(predefinedSkillsDir, folder);
|
|
35
|
+
const stats = await fsp.stat(srcPath);
|
|
36
|
+
|
|
37
|
+
if (stats.isDirectory()) {
|
|
38
|
+
const destPath = path.join(skillsDir, folder);
|
|
39
|
+
await fsp.cp(srcPath, destPath, { recursive: true, force: true });
|
|
40
|
+
}
|
|
41
|
+
}));
|
|
42
|
+
} catch (e) {
|
|
43
|
+
// Silently ignore if definitions/skills doesn't exist or is inaccessible
|
|
44
|
+
// console.error('Error installing predefined skills:', e);
|
|
45
|
+
}
|
|
32
46
|
}
|
|
33
47
|
|
|
34
48
|
module.exports = { install };
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
const gemini = require('./gemini');
|
|
2
|
-
const roo = require('./roo');
|
|
3
2
|
const claude = require('./claude');
|
|
4
3
|
const cursor = require('./cursor');
|
|
5
4
|
const kilo = require('./kilo');
|
|
@@ -8,7 +7,6 @@ const antigravity = require('./antigravity');
|
|
|
8
7
|
|
|
9
8
|
module.exports = {
|
|
10
9
|
gemini,
|
|
11
|
-
roo,
|
|
12
10
|
claude,
|
|
13
11
|
cursor,
|
|
14
12
|
kilo,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const fsp = require('fs/promises');
|
|
2
2
|
const path = require('path');
|
|
3
|
-
const { toOpenCodeSkill,
|
|
3
|
+
const { toOpenCodeSkill, toOpenCodeAgent } = require('../transformers');
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Handles installation for OpenCode
|
|
@@ -26,11 +26,31 @@ async function install(agents, options) {
|
|
|
26
26
|
const skillContent = toOpenCodeSkill(agent, options);
|
|
27
27
|
await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
|
|
28
28
|
|
|
29
|
-
// Generate
|
|
30
|
-
const
|
|
31
|
-
await fsp.writeFile(path.join(agentsDir, `${skillName}.md`),
|
|
29
|
+
// Generate Agent: .opencode/agents/[agent-slug].md
|
|
30
|
+
const agentContent = toOpenCodeAgent(agent, { ...options, mode: 'all' });
|
|
31
|
+
await fsp.writeFile(path.join(agentsDir, `${skillName}.md`), agentContent);
|
|
32
32
|
})
|
|
33
33
|
);
|
|
34
|
+
|
|
35
|
+
// Install Pre-defined Skills (from definitions/skills)
|
|
36
|
+
const predefinedSkillsDir = path.join(__dirname, '..', '..', '..', 'definitions', 'skills');
|
|
37
|
+
try {
|
|
38
|
+
await fsp.access(predefinedSkillsDir);
|
|
39
|
+
const skillFolders = await fsp.readdir(predefinedSkillsDir);
|
|
40
|
+
|
|
41
|
+
await Promise.all(skillFolders.map(async (folder) => {
|
|
42
|
+
const srcPath = path.join(predefinedSkillsDir, folder);
|
|
43
|
+
const stats = await fsp.stat(srcPath);
|
|
44
|
+
|
|
45
|
+
if (stats.isDirectory()) {
|
|
46
|
+
const destPath = path.join(skillsDir, folder);
|
|
47
|
+
await fsp.cp(srcPath, destPath, { recursive: true, force: true });
|
|
48
|
+
}
|
|
49
|
+
}));
|
|
50
|
+
} catch (e) {
|
|
51
|
+
// Silently ignore if definitions/skills doesn't exist or is inaccessible
|
|
52
|
+
// console.error('Error installing predefined skills:', e);
|
|
53
|
+
}
|
|
34
54
|
}
|
|
35
55
|
|
|
36
56
|
module.exports = { install };
|
package/src/lib/messages.js
CHANGED
|
@@ -37,13 +37,12 @@ const EN = {
|
|
|
37
37
|
NO_AGENTS: 'No valid agents found.',
|
|
38
38
|
INSTALLING: (tools) => `Installing agents for: ${tools}...`,
|
|
39
39
|
FINISHED: 'Installation finished!',
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
CLINE_WARNING: 'Remember to configure Custom Modes in settings.json for Cline.',
|
|
41
|
+
CLINE_WARNING_TITLE: 'Warning',
|
|
42
42
|
FAILED: 'Failed',
|
|
43
43
|
},
|
|
44
44
|
TOOLS: {
|
|
45
45
|
GEMINI: 'Gemini CLI',
|
|
46
|
-
ROO: 'Roo Code',
|
|
47
46
|
CLINE: 'Cline',
|
|
48
47
|
CURSOR: 'Cursor',
|
|
49
48
|
WINDSURF: 'Windsurf',
|
|
@@ -111,13 +110,12 @@ const PT_BR = {
|
|
|
111
110
|
NO_AGENTS: 'Nenhum agente válido encontrado.',
|
|
112
111
|
INSTALLING: (tools) => `Instalando agentes para: ${tools}...`,
|
|
113
112
|
FINISHED: 'Instalação finalizada!',
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
CLINE_WARNING: 'Lembre-se de configurar os Custom Modes em settings.json para Cline.',
|
|
114
|
+
CLINE_WARNING_TITLE: 'Aviso',
|
|
116
115
|
FAILED: 'Falhou',
|
|
117
116
|
},
|
|
118
117
|
TOOLS: {
|
|
119
118
|
GEMINI: 'Gemini CLI',
|
|
120
|
-
ROO: 'Roo Code',
|
|
121
119
|
CLINE: 'Cline',
|
|
122
120
|
CURSOR: 'Cursor',
|
|
123
121
|
WINDSURF: 'Windsurf',
|
|
@@ -185,13 +183,12 @@ const ES = {
|
|
|
185
183
|
NO_AGENTS: 'No se encontraron agentes válidos.',
|
|
186
184
|
INSTALLING: (tools) => `Instalando agentes para: ${tools}...`,
|
|
187
185
|
FINISHED: '¡Instalación finalizada!',
|
|
188
|
-
|
|
189
|
-
|
|
186
|
+
CLINE_WARNING: 'Recuerde configurar los Modos Personalizados en settings.json para Cline.',
|
|
187
|
+
CLINE_WARNING_TITLE: 'Aviso',
|
|
190
188
|
FAILED: 'Falló',
|
|
191
189
|
},
|
|
192
190
|
TOOLS: {
|
|
193
191
|
GEMINI: 'Gemini CLI',
|
|
194
|
-
ROO: 'Roo Code',
|
|
195
192
|
CLINE: 'Cline',
|
|
196
193
|
CURSOR: 'Cursor',
|
|
197
194
|
WINDSURF: 'Windsurf',
|
package/src/lib/transformers.js
CHANGED
|
@@ -92,56 +92,6 @@ ${allRules.length > 0 ? '## Rules & Guidelines\n' + allRules.map(r => `- ${r}`).
|
|
|
92
92
|
`;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
/**
|
|
96
|
-
* Converte para configuração de Custom Mode do Roo Code / Cline (JSON)
|
|
97
|
-
*/
|
|
98
|
-
function toRooConfig(agent, slug, options = {}) {
|
|
99
|
-
const languageRule = getLanguageRule(options.locale);
|
|
100
|
-
const parts = [
|
|
101
|
-
`# ${agent.name} (${agent.role})`,
|
|
102
|
-
`\n${agent.systemPrompt.trim()}\n`
|
|
103
|
-
];
|
|
104
|
-
|
|
105
|
-
const allRules = [languageRule, ...(agent.rules || [])];
|
|
106
|
-
|
|
107
|
-
if (allRules.length > 0) {
|
|
108
|
-
parts.push(`## Rules & Guidelines`);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return {
|
|
112
|
-
slug: slug,
|
|
113
|
-
roleDefinition: parts.join('\n'),
|
|
114
|
-
groups: ["read", "edit", "browser", "command", "mcp"]
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Converte para Roo Code Skill (.roo/skills/<nome>/SKILL.md)
|
|
120
|
-
* Ref: https://docs.roocode.com/features/skills
|
|
121
|
-
*/
|
|
122
|
-
function toRooSkill(agent, options = {}) {
|
|
123
|
-
const languageRule = getLanguageRule(options.locale);
|
|
124
|
-
const allRules = [languageRule, ...(agent.rules || [])];
|
|
125
|
-
const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
126
|
-
|
|
127
|
-
return `---
|
|
128
|
-
name: ${skillName}
|
|
129
|
-
description: ${agent.description || agent.role}. Use when working on ${agent.role.toLowerCase()} tasks.
|
|
130
|
-
---
|
|
131
|
-
# ${agent.name} ${agent.emoji}
|
|
132
|
-
|
|
133
|
-
**Role**: ${agent.role}
|
|
134
|
-
|
|
135
|
-
## When to Use
|
|
136
|
-
- Use this skill when working on ${agent.role.toLowerCase()} tasks
|
|
137
|
-
- This skill is helpful for ${agent.description || agent.role}
|
|
138
|
-
|
|
139
|
-
## Instructions
|
|
140
|
-
${agent.systemPrompt.trim()}
|
|
141
|
-
|
|
142
|
-
${allRules.length > 0 ? '## Rules & Guidelines\n' + allRules.map(r => `- ${r}`).join('\n') : ''}
|
|
143
|
-
`;
|
|
144
|
-
}
|
|
145
95
|
|
|
146
96
|
/**
|
|
147
97
|
* Converte para Markdown do Kilo Code
|
|
@@ -519,12 +469,13 @@ ${allRules.length > 0 ? '## Rules & Guidelines\n' + allRules.map(r => `- ${r}`).
|
|
|
519
469
|
}
|
|
520
470
|
|
|
521
471
|
/**
|
|
522
|
-
* Converte para OpenCode
|
|
472
|
+
* Converte para OpenCode Agent (.opencode/agents/*.md)
|
|
523
473
|
* Ref: https://opencode.ai/docs/agents
|
|
524
474
|
*/
|
|
525
|
-
function
|
|
475
|
+
function toOpenCodeAgent(agent, options = {}) {
|
|
526
476
|
const languageRule = getLanguageRule(options.locale);
|
|
527
477
|
const allRules = [languageRule, ...(agent.rules || [])];
|
|
478
|
+
const mode = options.mode || 'all';
|
|
528
479
|
|
|
529
480
|
// Determine tool permissions based on agent role
|
|
530
481
|
const roleLower = (agent.slug || '').toLowerCase();
|
|
@@ -532,7 +483,7 @@ function toOpenCodeSubagent(agent, options = {}) {
|
|
|
532
483
|
|
|
533
484
|
return `---
|
|
534
485
|
description: ${agent.description || agent.role}
|
|
535
|
-
mode:
|
|
486
|
+
mode: ${mode}
|
|
536
487
|
tools:
|
|
537
488
|
write: ${!isReadOnly}
|
|
538
489
|
edit: ${!isReadOnly}
|
|
@@ -552,8 +503,7 @@ ${allRules.length > 0 ? '## Rules & Guidelines\n' + allRules.map(r => `- ${r}`).
|
|
|
552
503
|
module.exports = {
|
|
553
504
|
toGeminiTOML,
|
|
554
505
|
toGeminiSkill,
|
|
555
|
-
|
|
556
|
-
toRooSkill,
|
|
506
|
+
|
|
557
507
|
toKiloMarkdown,
|
|
558
508
|
toKiloSkill,
|
|
559
509
|
toCopilotInstructions,
|
|
@@ -565,7 +515,7 @@ module.exports = {
|
|
|
565
515
|
toClaudeSubagent,
|
|
566
516
|
toPlainSystemPrompt,
|
|
567
517
|
toOpenCodeSkill,
|
|
568
|
-
|
|
518
|
+
toOpenCodeAgent,
|
|
569
519
|
toTraeRules,
|
|
570
520
|
toAntigravitySkill,
|
|
571
521
|
toAntigravityWorkflow
|
package/src/lib/handlers/roo.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
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 };
|