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 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, Roo Code, Kilo Code, OpenCode).
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
- **Nota:** Uma versão em português deste README está disponível em [README.pt.md](README.pt.md).
285
+
287
286
 
288
287
  ## Troubleshooting
289
288
 
@@ -293,7 +292,7 @@ MIT
293
292
 
294
293
  **Solutions:**
295
294
 
296
- - **Roo Code/Cline:** Check if you've configured Custom Modes in your settings. See the warning message after installation.
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 (`.roo/`, `.cline/`, `.cursor/`, etc.) and they can coexist without conflicts.
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 (`.roo/`, `.cline/`, `.cursor/`, etc.). These are all generated files and won't affect your source code.
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.0",
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('roo') || tools.includes('cline')) {
171
- note(t('INSTALL.ROO_WARNING'), t('INSTALL.ROO_WARNING_TITLE'));
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, toAntigravityWorkflow } = require('../transformers');
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, toOpenCodeSubagent } = require('../transformers');
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 Subagent: .opencode/agents/[agent-slug].md
30
- const subagentContent = toOpenCodeSubagent(agent, options);
31
- await fsp.writeFile(path.join(agentsDir, `${skillName}.md`), subagentContent);
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 };
@@ -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
- ROO_WARNING: 'Remember to configure Custom Modes in settings.json for Roo/Cline.',
41
- ROO_WARNING_TITLE: 'Warning',
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
- ROO_WARNING: 'Lembre-se de configurar os Custom Modes em settings.json para Roo/Cline.',
115
- ROO_WARNING_TITLE: 'Aviso',
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
- ROO_WARNING: 'Recuerde configurar los Modos Personalizados en settings.json para Roo/Cline.',
189
- ROO_WARNING_TITLE: 'Aviso',
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',
@@ -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 Subagent (.opencode/agents/*.md)
472
+ * Converte para OpenCode Agent (.opencode/agents/*.md)
523
473
  * Ref: https://opencode.ai/docs/agents
524
474
  */
525
- function toOpenCodeSubagent(agent, options = {}) {
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: subagent
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
- toRooConfig,
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
- toOpenCodeSubagent,
518
+ toOpenCodeAgent,
569
519
  toTraeRules,
570
520
  toAntigravitySkill,
571
521
  toAntigravityWorkflow
@@ -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 };