sdd-toolkit 1.0.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.
@@ -0,0 +1,72 @@
1
+ name: QA Engineer
2
+ role: QA Agent / Code Review
3
+ emoji: 🔍
4
+ systemPrompt: |
5
+ # SYSTEM ROLE & IDENTITY
6
+ You are the **Senior QA Engineer / Code Reviewer**.
7
+ Your mission is to be the guardian of code quality. You are meticulous, technical, and objective.
8
+ Your philosophy: "Untested code is broken code."
9
+
10
+ # INPUT CONTEXT & WORKFLOW
11
+ 1. **Context Reading (Mandatory):**
12
+ - Read `docs/requirements.md` (To understand stack and business rules).
13
+ - Read `docs/task.md` (To know what was the task objective).
14
+ - **Read `work_log.md`** (To see developer execution log and changed files).
15
+ - Read source code files listed in `work_log.md`.
16
+
17
+ 2. **Review Process (Action Checklist):**
18
+ - **[ ] Static Analysis (Simulated):** Check code for obvious violations of guidelines defined in `coder.toml` (e.g., use of `any`, lack of error handling, bad variable names).
19
+ - **[ ] Requirement Compliance:** Confirm if delivered code meets Acceptance Criteria defined in `docs/requirements.md` for the corresponding task.
20
+ - **[ ] Testing Verification (If Applicable):**
21
+ - **Check:** Verify if `docs/requirements.md` mandates testing.
22
+ - **If yes:** Confirm if test files were created and execute `npm run test` (or equivalent).
23
+ - **If no:** Skip this check.
24
+ - **[ ] DoD (Definition of Done) Validation:** Mark if task "Definition of Done" was indeed achieved.
25
+
26
+ 3. **Decision Making (Binary):**
27
+ - **IF** all checks above pass: Status is **APPROVED**.
28
+ - **IF** any check fails: Status is **REJECTED**.
29
+
30
+ # MODES OF OPERATION
31
+
32
+ ## MODE 1: Approval
33
+ *Activated if review is successful.*
34
+ 1. Generate report `docs/logs/review_log.md` with `status: Approved`.
35
+ 2. Instruct user on next step (e.g., "Code approved. Ready for merge or deploy. Execute /deploy if available.").
36
+
37
+ ## MODE 2: Rejection with Feedback
38
+ *Activated if review fails.*
39
+ 1. Generate report `docs/logs/review_log.md` with `status: Rejected`.
40
+ 2. **CRITICAL:** Fill "Items for Correction" section with clear and actionable feedback. Be specific about file, line, and violated rule.
41
+ 3. Instruct user to trigger development agent again (e.g., "Review failed. Execute /dev:coder <Task_ID> for developer to fix listed points.").
42
+
43
+ # OUTPUT STRUCTURE (docs/logs/review_log.md)
44
+ Use this template to register result (Append).
45
+
46
+ ---
47
+ ### 🔬 REVIEW RECORD
48
+ **Task_ID:** [Task ID from work_log]
49
+ **Reviewer:** Senior QA Engineer
50
+ **Timestamp:** [YYYY-MM-DD HH:MM]
51
+ **Status:** [Approved/Rejected]
52
+
53
+ **Analysis Summary:**
54
+ - [x] Static Analysis: [Pass/Fail]
55
+ - [x] Requirement Compliance: [Pass/Fail]
56
+ - [x] Testing Verification: [Pass/Fail]
57
+
58
+ **Items for Correction (if Rejected):**
59
+ | File | Line(s) | Problem | Correction Suggestion |
60
+ | :--- | :--- | :--- | :--- |
61
+ | `example/file.ts` | 10-15 | `any` used in function return. | Type return with `IUserResponse` interface. |
62
+ | `other/file.js`| 25 | Lack of error handling in API call. | Wrap `axios.get` call in `try/catch` block. |
63
+
64
+ ---
65
+
66
+ # INSTRUCTION
67
+ Analyze latest `work_log.md` entry, read associated files, execute your review checklist and generate `docs/review_log.md` with your decision.
68
+ rules:
69
+ - "**OBJECTIVITY:** Base all rejection on an explicit rule from requirements files or agent prompts."
70
+ - "**DO NOT REWRITE CODE:** Your function is to point out error and suggest correction, not implement solution."
71
+ - "**ASSERTIVENESS:** Do not approve code that violates a critical rule, even if it looks functional."
72
+ - "Language Adaptability: Respond in English by default. If the user speaks in another language, mirror their language."
@@ -0,0 +1,70 @@
1
+ name: Task Planner
2
+ role: Generates technical tasks
3
+ emoji: 📋
4
+ systemPrompt: |
5
+ # SYSTEM ROLE & IDENTITY
6
+ You are the **Engineering Planning Lead**.
7
+ Your function is to transform Milestones (What) and Requirements (How/Rules) into an execution checklist for developers.
8
+ You strictly follow Tech Stack defined in `docs/requirements.md`.
9
+
10
+ # INPUT CONTEXT & WORKFLOW
11
+ 1. **Context Reading (Mandatory):**
12
+ - Read `docs/milestones.md` (To know which phase to attack).
13
+ - Read `docs/requirements.md` (To know LIBS, DATABASE, and RULES).
14
+ - *If `docs/requirements.md` not found:* Warn user and ask for stack manually.
15
+
16
+ 2. **Selection:**
17
+ - List Milestones.
18
+ - Ask: "Which Milestone shall we detail?"
19
+
20
+ 3. **Task Generation (Tech-Aware):**
21
+ - When creating a task, consult "Tech Stack" section of `docs/requirements.md`.
22
+ - **Example:** If requirement asks for validation and stack says "Zod", task MUST be "Implement Zod schema", not just "Validate data".
23
+ - **Linking:** If possible, cite requirement ID in task (e.g., "Verify rule [BR-01]").
24
+
25
+ # OUTPUT STRUCTURE (docs/task.md)
26
+ The file must be formatted as Markdown Checklist.
27
+
28
+ ---
29
+ title: Tasks Sprint - [Milestone Name]
30
+ milestone_ref: [Name]
31
+ tech_stack: [Stack Summary read in docs/requirements.md]
32
+ ---
33
+
34
+ # Execution Backlog: [Milestone Name]
35
+
36
+ ## Technical Summary
37
+ (Target Stack: [e.g., Next.js + Prisma + Zod])
38
+
39
+ ## Tasks Checklist
40
+
41
+ - [ ] **[M1-T01] Initial Environment Setup**
42
+ - [ ] Install dependencies ([List libs from docs/requirements.md])
43
+ - [ ] Configure Database connection ([Cite database from docs/requirements.md])
44
+ - **DoD:** Environment running and connected.
45
+
46
+ - [ ] **[M1-T02] Implement [Feature Name]**
47
+ - [ ] Create Data Model (According to Schema in docs/requirements.md)
48
+ - [ ] Implement Business Logic (Meeting BR-XX)
49
+ - [ ] **Create Tests (Using [Defined Test Lib])**
50
+ - **Acceptance Criteria:**
51
+ - [ ] Must pass success flow [FR-XX]
52
+ - [ ] Must handle error [Cite error scenario from docs/requirements.md]
53
+
54
+ ...
55
+
56
+ ---
57
+
58
+ # HANDOFF & NEXT STEPS (Workflow Link)
59
+ At the end of the response (in chat, not in file), you MUST instruct the user on the logical next step:
60
+ "✅ **Task backlog created.** The next step is to start development.
61
+ 👉 **Execute command: `/dev:coder <Task_ID>`** to start coding the first task."
62
+
63
+ # INSTRUCTION
64
+ Analyze `docs/milestones.md` and `docs/requirements.md`. Ask target milestone, generate technical tasks and link to command `/dev:coder`.
65
+ rules:
66
+ - "**CONSISTENCY:** If `docs/requirements.md` says \"PostgreSQL\", NEVER create a task to \"Configure MongoDB\"."
67
+ - "**TRACEABILITY:** Try to link tasks to Requirement IDs (FR-01, BR-02) whenever context allows."
68
+ - "**TESTING:** Always include test subtasks using library specified in requirements."
69
+ - "**FILE OPS:** Save strictly as `docs/task.md`."
70
+ - "Language Adaptability: Respond in English by default. If the user speaks in another language, mirror their language."
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "sdd-toolkit",
3
+ "version": "1.0.0",
4
+ "description": "Instalador automático dos agentes de desenvolvimento",
5
+ "main": "src/index.js",
6
+ "bin": {
7
+ "sdd-toolkit": "./src/index.js"
8
+ },
9
+ "scripts": {
10
+ "start": "node src/index.js",
11
+ "test": "echo \"Error: no test specified\" && exit 1"
12
+ },
13
+ "dependencies": {
14
+ "@clack/prompts": "^0.7.0",
15
+ "js-yaml": "^4.1.0",
16
+ "picocolors": "^1.0.0",
17
+ "zod": "^4.2.1"
18
+ },
19
+ "author": "",
20
+ "license": "MIT",
21
+ "files": [
22
+ "src",
23
+ "definitions",
24
+ "README.md"
25
+ ],
26
+ "keywords": [
27
+ "ai",
28
+ "agents",
29
+ "cli",
30
+ "dev-tools",
31
+ "llm",
32
+ "gemini",
33
+ "roo-code",
34
+ "cline"
35
+ ],
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/filipeoliveira93/agents.dev"
39
+ }
40
+ }
package/src/index.js ADDED
@@ -0,0 +1,183 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('fs');
4
+ const fsp = require('fs/promises');
5
+ const path = require('path');
6
+ const { intro, outro, multiselect, spinner, note } = require('@clack/prompts');
7
+ const pc = require('picocolors');
8
+
9
+ // Módulos Internos
10
+ const { loadAgents } = require('./lib/agents');
11
+ const {
12
+ toGeminiTOML,
13
+ toRooConfig,
14
+ toKiloMarkdown,
15
+ toCopilotInstructions,
16
+ toCursorMDC,
17
+ toWindsurfRules,
18
+ toPlainSystemPrompt,
19
+ toTraeRules
20
+ } = require('./lib/transformers');
21
+ const { generateWorkflowGuide } = require('./lib/docs');
22
+
23
+ async function main() {
24
+ console.clear();
25
+ intro(pc.bgMagenta(pc.white(' UNIVERSAL SPEC CLI ')));
26
+
27
+ // 1. Scaffold Automático (Sempre executa)
28
+ const created = generateWorkflowGuide(process.cwd());
29
+ if (created) {
30
+ console.log(pc.green('✔ Estrutura de pastas (docs/) verificada.'));
31
+ }
32
+
33
+ // 2. Seleção de Ferramentas (Múltipla escolha)
34
+ const tools = await multiselect({
35
+ message: 'Para quais ferramentas você deseja instalar os Agentes?',
36
+ options: [
37
+ { value: 'gemini', label: 'Gemini CLI', hint: '.gemini/commands/dev' },
38
+ { value: 'roo', label: 'Roo Code', hint: '.roo/ & custom_modes.json' },
39
+ { value: 'cline', label: 'Cline', hint: '.cline/ & custom_modes.json' },
40
+ { value: 'cursor', label: 'Cursor', hint: '.cursor/rules/*.mdc' },
41
+ { value: 'windsurf', label: 'Windsurf', hint: '.windsurfrules' },
42
+ { value: 'trae', label: 'Trae IDE', hint: '.trae/instructions.md' },
43
+ { value: 'kilo', label: 'Kilo Code', hint: '.kilo/prompts/*.md' },
44
+ { value: 'copilot', label: 'GitHub Copilot', hint: '.github/copilot-instructions.md' },
45
+ { value: 'web', label: 'OpenAI / Claude', hint: 'prompts/*.txt' },
46
+ { value: 'opencode', label: 'OpenCode', hint: '.opencode/*.md' },
47
+ ],
48
+ required: true,
49
+ hint: 'Espaço para selecionar, Enter para confirmar'
50
+ });
51
+
52
+ if (!tools || tools.length === 0) {
53
+ outro('Nenhuma ferramenta selecionada. Operação cancelada.');
54
+ process.exit(0);
55
+ }
56
+
57
+ await processAgentsInstallation(tools);
58
+
59
+ outro(pc.green('Configuração concluída com sucesso! 🚀'));
60
+ }
61
+
62
+ async function processAgentsInstallation(tools) {
63
+ const s = spinner();
64
+ s.start('Carregando definições...');
65
+
66
+ try {
67
+ const validAgents = await loadAgents();
68
+
69
+ if (validAgents.length === 0) {
70
+ s.stop('Nenhum agente válido encontrado.');
71
+ return;
72
+ }
73
+
74
+ s.message(`Instalando agentes para: ${tools.join(', ')}...`);
75
+
76
+ // Itera sobre cada ferramenta selecionada
77
+ for (const tool of tools) {
78
+
79
+ // Instalação Específica por Ferramenta
80
+ if (tool === 'gemini') {
81
+ const targetDir = path.join(process.cwd(), '.gemini', 'commands', 'dev');
82
+ await fsp.mkdir(targetDir, { recursive: true });
83
+
84
+ await Promise.all(validAgents.map(agent => {
85
+ const toml = toGeminiTOML(agent);
86
+ const fileName = `${agent.originalName}.toml`;
87
+ return fsp.writeFile(path.join(targetDir, fileName), toml);
88
+ }));
89
+ }
90
+ else if (tool === 'roo' || tool === 'cline') {
91
+ const configDir = tool === 'roo' ? '.roo' : '.cline';
92
+ const targetDir = path.join(process.cwd(), configDir);
93
+ await fsp.mkdir(targetDir, { recursive: true });
94
+
95
+ await Promise.all(validAgents.map(agent => {
96
+ const md = toKiloMarkdown(agent);
97
+ return fsp.writeFile(path.join(targetDir, `${agent.slug}.md`), md);
98
+ }));
99
+
100
+ const modes = validAgents.map(agent => toRooConfig(agent, agent.slug));
101
+ const jsonContent = JSON.stringify({ customModes: modes }, null, 2);
102
+ const fileName = `${tool}_custom_modes.json`;
103
+ await fsp.writeFile(path.join(process.cwd(), fileName), jsonContent);
104
+ }
105
+ else if (tool === 'kilo') {
106
+ const targetDir = path.join(process.cwd(), '.kilo', 'prompts');
107
+ await fsp.mkdir(targetDir, { recursive: true });
108
+
109
+ await Promise.all(validAgents.map(agent => {
110
+ const md = toKiloMarkdown(agent);
111
+ return fsp.writeFile(path.join(targetDir, `${agent.slug}.md`), md);
112
+ }));
113
+ }
114
+ else if (tool === 'copilot') {
115
+ const githubDir = path.join(process.cwd(), '.github');
116
+ const agentsDir = path.join(githubDir, 'agents');
117
+ await fsp.mkdir(agentsDir, { recursive: true });
118
+
119
+ await Promise.all(validAgents.map(agent => {
120
+ const md = toCopilotInstructions(agent);
121
+ return fsp.writeFile(path.join(agentsDir, `${agent.slug}.md`), md);
122
+ }));
123
+
124
+ const mainAgent = validAgents.find(a => a.slug.includes('coder')) || validAgents[0];
125
+ const mainInstructions = toCopilotInstructions(mainAgent);
126
+ await fsp.writeFile(path.join(githubDir, 'copilot-instructions.md'), mainInstructions);
127
+ }
128
+ else if (tool === 'cursor') {
129
+ const rulesDir = path.join(process.cwd(), '.cursor', 'rules');
130
+ await fsp.mkdir(rulesDir, { recursive: true });
131
+
132
+ await Promise.all(validAgents.map(agent => {
133
+ const mdc = toCursorMDC(agent);
134
+ return fsp.writeFile(path.join(rulesDir, `${agent.slug}.mdc`), mdc);
135
+ }));
136
+ }
137
+ else if (tool === 'windsurf') {
138
+ const mainAgent = validAgents.find(a => a.slug.includes('coder')) || validAgents[0];
139
+ const rules = toWindsurfRules(mainAgent);
140
+ await fsp.writeFile(path.join(process.cwd(), '.windsurfrules'), rules);
141
+ }
142
+ else if (tool === 'trae') {
143
+ const traeDir = path.join(process.cwd(), '.trae');
144
+ await fsp.mkdir(traeDir, { recursive: true });
145
+
146
+ const mainAgent = validAgents.find(a => a.slug.includes('coder')) || validAgents[0];
147
+ const rules = toTraeRules(mainAgent);
148
+ await fsp.writeFile(path.join(traeDir, 'instructions.md'), rules);
149
+ }
150
+ else if (tool === 'web') {
151
+ const targetDir = path.join(process.cwd(), 'prompts');
152
+ await fsp.mkdir(targetDir, { recursive: true });
153
+
154
+ await Promise.all(validAgents.map(agent => {
155
+ const txt = toPlainSystemPrompt(agent);
156
+ return fsp.writeFile(path.join(targetDir, `${agent.slug}.txt`), txt);
157
+ }));
158
+ }
159
+ else if (tool === 'opencode') {
160
+ const targetDir = path.join(process.cwd(), '.opencode');
161
+ await fsp.mkdir(targetDir, { recursive: true });
162
+
163
+ await Promise.all(validAgents.map(agent => {
164
+ const md = toKiloMarkdown(agent);
165
+ return fsp.writeFile(path.join(targetDir, `${agent.slug}.md`), md);
166
+ }));
167
+ }
168
+ }
169
+
170
+ s.stop('Instalação finalizada!');
171
+
172
+ // Feedback consolidado
173
+ if (tools.includes('roo') || tools.includes('cline')) {
174
+ note('Lembre-se de configurar os Custom Modes no settings.json para Roo/Cline.', 'Aviso');
175
+ }
176
+
177
+ } catch (e) {
178
+ s.stop('Falha');
179
+ console.error(pc.red(e.message));
180
+ }
181
+ }
182
+
183
+ main().catch(console.error);
@@ -0,0 +1,68 @@
1
+ const fs = require('fs/promises');
2
+ const path = require('path');
3
+ const yaml = require('js-yaml');
4
+ const { AgentSchema } = require('./schema');
5
+ const pc = require('picocolors');
6
+
7
+ /**
8
+ * Carrega e valida todas as definições de agentes da pasta definitions
9
+ * @returns {Promise<Array>} Lista de agentes validados
10
+ */
11
+ async function loadAgents() {
12
+ const definitionsDir = path.join(__dirname, '..', '..', 'definitions');
13
+
14
+ try {
15
+ await fs.access(definitionsDir);
16
+ } catch {
17
+ throw new Error(`Pasta de definições não encontrada: ${definitionsDir}`);
18
+ }
19
+
20
+ const files = await fs.readdir(definitionsDir);
21
+ const yamlFiles = files.filter(f => f.endsWith('.yaml') || f.endsWith('.yml'));
22
+
23
+ // Leitura e processamento em paralelo
24
+ const results = await Promise.all(yamlFiles.map(async (file) => {
25
+ try {
26
+ const content = await fs.readFile(path.join(definitionsDir, file), 'utf8');
27
+ const raw = yaml.load(content);
28
+
29
+ const parsed = AgentSchema.safeParse(raw);
30
+ if (!parsed.success) {
31
+ return {
32
+ success: false,
33
+ file,
34
+ error: 'Validação do Schema falhou',
35
+ details: parsed.error.format()
36
+ };
37
+ }
38
+
39
+ const agent = parsed.data;
40
+ // Normaliza o slug: dev.coder -> dev-coder
41
+ agent.slug = file.replace(/\.ya?ml$/, '').replace(/\./g, '-');
42
+ // Mantém o nome original do arquivo para referência (útil para Gemini CLI)
43
+ agent.originalName = file.replace(/\.ya?ml$/, '');
44
+
45
+ return { success: true, agent };
46
+
47
+ } catch (e) {
48
+ return { success: false, file, error: e.message };
49
+ }
50
+ }));
51
+
52
+ // Separa sucessos e falhas
53
+ const validAgents = [];
54
+ const errors = [];
55
+
56
+ results.forEach(res => {
57
+ if (res.success) {
58
+ validAgents.push(res.agent);
59
+ } else {
60
+ errors.push(res);
61
+ console.warn(pc.yellow(`⚠️ Ignorando ${res.file}: ${res.error}`));
62
+ }
63
+ });
64
+
65
+ return validAgents;
66
+ }
67
+
68
+ module.exports = { loadAgents };
@@ -0,0 +1,104 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const pc = require('picocolors');
4
+
5
+ /**
6
+ * Gera o guia de workflow e a estrutura de pastas necessária para os agentes
7
+ */
8
+ function generateWorkflowGuide(baseDir) {
9
+ const docsDir = path.join(baseDir, 'docs');
10
+ const logsDir = path.join(docsDir, 'logs');
11
+
12
+ // Cria a estrutura de pastas recursivamente (Funciona em Windows, Mac e Linux)
13
+ if (!fs.existsSync(logsDir)) {
14
+ fs.mkdirSync(logsDir, { recursive: true });
15
+ }
16
+
17
+ // Conteúdo do README.md
18
+ const content = `# 🤖 Agent Workflow Guide
19
+
20
+ Este documento descreve o fluxo de desenvolvimento padrão usando os Agentes instalados.
21
+ O sistema segue um processo **Waterfall** para planejamento (precisão) e **Iterativo** para execução.
22
+
23
+ ---
24
+
25
+ ## 1. 🏗️ Project Spec (@Project Architect)
26
+ **Role:** O Visionário.
27
+ **Goal:** Traduzir sua ideia vaga em uma Especificação concreta com "Project Principles" definidos.
28
+ - **Comando:** \\
29
+ /dev:project "Eu quero um App de Todo que..."
30
+ - **Saída:**
31
+ \`docs/project.md\`
32
+
33
+ ## 2. 🧱 Requirements Engineering (@Requirements Engineer)
34
+ **Role:** O Tech Lead.
35
+ **Goal:** Fechar decisões técnicas (Stack, Banco de Dados, Libs).
36
+ - **Why?** Evita que o Coder "invente" arquitetura. Cria o "Contrato".
37
+ - **Comando:**
38
+ /dev:requirements
39
+ - **Saída:**
40
+ \`docs/requirements.md\`
41
+
42
+ ## 3. 🗺️ Roadmap Strategy (@Milestone Manager)
43
+ **Role:** O Estrategista.
44
+ **Goal:** Fatiar o projeto em fases de entrega (MVPs).
45
+ - **Comando:**
46
+ /dev:milestone
47
+ - **Saída:**
48
+ \`docs/milestones.md\`
49
+
50
+ ## 4. 📋 Task Planning (@Task Planner)
51
+ **Role:** O Gerente.
52
+ **Goal:** Quebrar um Milestone específico em tarefas atômicas para desenvolvedores.
53
+ - **Why?** IAs falham com contextos gigantes. Tarefas pequenas = Código perfeito.
54
+ - **Comando:**
55
+ /dev:tasks <Milestone_ID>
56
+ - **Saída:**
57
+ \`docs/task.md\`
58
+
59
+ ## 5. 🕵️ Blueprint Audit (@Auditor)
60
+ **Role:** O Guardião.
61
+ **Goal:** Validar consistência entre **Requirements** e **Tasks**.
62
+ - **Comando:**
63
+ /dev:auditor
64
+ - **Saída:**
65
+ \`audit_report.md\`
66
+
67
+ ## 6. 💻 Implementation (@Coder)
68
+ **Role:** O Construtor.
69
+ **Goal:** Executar *uma tarefa por vez* do arquivo
70
+ \`task.md\`.
71
+ - **Comando:**
72
+ /dev:coder <Task_ID>
73
+ - **Buffer:**
74
+ \`work_log.md\`
75
+
76
+ ## 7. ⚖️ Quality Assurance (@QA Engineer)
77
+ **Role:** O Inspetor.
78
+ **Goal:** Verificar se a implementação bate com os Requisitos.
79
+ - **Comando:**
80
+ /dev:review <Task_ID>
81
+ - **Saída:**
82
+ \`docs/logs/review_log.md\`
83
+
84
+ ## 8. 📦 Release Management (@Release Manager)
85
+ **Role:** O Historiador.
86
+ **Goal:** Consolidar o
87
+ \`work_log.md\` em um
88
+ \`changelog.md\` permanente.
89
+ - **Comando:**
90
+ /dev:log
91
+ - **Saída:**
92
+ \`changelog.md\`
93
+ `;
94
+
95
+ const readmePath = path.join(docsDir, 'README.md');
96
+ if (!fs.existsSync(readmePath)) {
97
+ fs.writeFileSync(readmePath, content);
98
+ return true;
99
+ }
100
+
101
+ return true; // Retorna true indicando que a estrutura foi garantida
102
+ }
103
+
104
+ module.exports = { generateWorkflowGuide };
@@ -0,0 +1,13 @@
1
+ const { z } = require('zod');
2
+
3
+ const AgentSchema = z.object({
4
+ name: z.string().min(1, "Nome é obrigatório"),
5
+ role: z.string().min(1, "Papel (Role) é obrigatório"),
6
+ emoji: z.string().optional().default('🤖'),
7
+ systemPrompt: z.string().min(10, "System Prompt deve ter pelo menos 10 caracteres"),
8
+ rules: z.array(z.string()).optional().default([]),
9
+ tools: z.array(z.string()).optional().default([]),
10
+ description: z.string().optional()
11
+ });
12
+
13
+ module.exports = { AgentSchema };