@maestro-ai/mcp-server 2.6.2 → 5.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.
- package/dist/content/.version.json +16 -0
- package/dist/data/project-templates.d.ts +37 -0
- package/dist/data/project-templates.d.ts.map +1 -0
- package/dist/data/project-templates.js +208 -0
- package/dist/data/project-templates.js.map +1 -0
- package/dist/errors/index.d.ts +84 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +158 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/flows/onboarding-orchestrator.d.ts.map +1 -1
- package/dist/flows/onboarding-orchestrator.js +126 -91
- package/dist/flows/onboarding-orchestrator.js.map +1 -1
- package/dist/gates/validator.d.ts +2 -1
- package/dist/gates/validator.d.ts.map +1 -1
- package/dist/gates/validator.js +33 -2
- package/dist/gates/validator.js.map +1 -1
- package/dist/index.js +19 -164
- package/dist/index.js.map +1 -1
- package/dist/middleware/flow-engine.middleware.d.ts +14 -0
- package/dist/middleware/flow-engine.middleware.d.ts.map +1 -0
- package/dist/middleware/flow-engine.middleware.js +51 -0
- package/dist/middleware/flow-engine.middleware.js.map +1 -0
- package/dist/middleware/index.d.ts +36 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +45 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/persistence.middleware.d.ts +14 -0
- package/dist/middleware/persistence.middleware.d.ts.map +1 -0
- package/dist/middleware/persistence.middleware.js +55 -0
- package/dist/middleware/persistence.middleware.js.map +1 -0
- package/dist/middleware/skill-injection.middleware.d.ts +15 -0
- package/dist/middleware/skill-injection.middleware.d.ts.map +1 -0
- package/dist/middleware/skill-injection.middleware.js +63 -0
- package/dist/middleware/skill-injection.middleware.js.map +1 -0
- package/dist/middleware/state-loader.middleware.d.ts +13 -0
- package/dist/middleware/state-loader.middleware.d.ts.map +1 -0
- package/dist/middleware/state-loader.middleware.js +36 -0
- package/dist/middleware/state-loader.middleware.js.map +1 -0
- package/dist/router.d.ts +46 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +441 -0
- package/dist/router.js.map +1 -0
- package/dist/services/content-resolver.service.d.ts +96 -0
- package/dist/services/content-resolver.service.d.ts.map +1 -0
- package/dist/services/content-resolver.service.js +280 -0
- package/dist/services/content-resolver.service.js.map +1 -0
- package/dist/services/flow-engine.d.ts +82 -0
- package/dist/services/flow-engine.d.ts.map +1 -0
- package/dist/services/flow-engine.js +270 -0
- package/dist/services/flow-engine.js.map +1 -0
- package/dist/services/onboarding.service.d.ts +20 -0
- package/dist/services/onboarding.service.d.ts.map +1 -0
- package/dist/services/onboarding.service.js +49 -0
- package/dist/services/onboarding.service.js.map +1 -0
- package/dist/services/skill-loader.service.d.ts +81 -0
- package/dist/services/skill-loader.service.d.ts.map +1 -0
- package/dist/services/skill-loader.service.js +321 -0
- package/dist/services/skill-loader.service.js.map +1 -0
- package/dist/services/specialist.service.d.ts +20 -0
- package/dist/services/specialist.service.d.ts.map +1 -0
- package/dist/services/specialist.service.js +115 -0
- package/dist/services/specialist.service.js.map +1 -0
- package/dist/services/state.service.d.ts +59 -0
- package/dist/services/state.service.d.ts.map +1 -0
- package/dist/services/state.service.js +131 -0
- package/dist/services/state.service.js.map +1 -0
- package/dist/stdio.js +329 -437
- package/dist/stdio.js.map +1 -1
- package/dist/tests/content-resolver.test.d.ts +5 -0
- package/dist/tests/content-resolver.test.d.ts.map +1 -0
- package/dist/tests/content-resolver.test.js +157 -0
- package/dist/tests/content-resolver.test.js.map +1 -0
- package/dist/tests/middleware.test.d.ts +5 -0
- package/dist/tests/middleware.test.d.ts.map +1 -0
- package/dist/tests/middleware.test.js +228 -0
- package/dist/tests/middleware.test.js.map +1 -0
- package/dist/tests/skill-loader.test.d.ts +5 -0
- package/dist/tests/skill-loader.test.d.ts.map +1 -0
- package/dist/tests/skill-loader.test.js +242 -0
- package/dist/tests/skill-loader.test.js.map +1 -0
- package/dist/tools/aprovar-gate.d.ts.map +1 -1
- package/dist/tools/aprovar-gate.js +35 -0
- package/dist/tools/aprovar-gate.js.map +1 -1
- package/dist/tools/brainstorm.d.ts.map +1 -1
- package/dist/tools/brainstorm.js +90 -49
- package/dist/tools/brainstorm.js.map +1 -1
- package/dist/tools/classificar.d.ts.map +1 -1
- package/dist/tools/classificar.js +20 -1
- package/dist/tools/classificar.js.map +1 -1
- package/dist/tools/confirmar-classificacao.d.ts.map +1 -1
- package/dist/tools/confirmar-classificacao.js +20 -1
- package/dist/tools/confirmar-classificacao.js.map +1 -1
- package/dist/tools/consolidated/analisar.d.ts +56 -0
- package/dist/tools/consolidated/analisar.d.ts.map +1 -0
- package/dist/tools/consolidated/analisar.js +96 -0
- package/dist/tools/consolidated/analisar.js.map +1 -0
- package/dist/tools/consolidated/avancar.d.ts +67 -0
- package/dist/tools/consolidated/avancar.d.ts.map +1 -0
- package/dist/tools/consolidated/avancar.js +132 -0
- package/dist/tools/consolidated/avancar.js.map +1 -0
- package/dist/tools/consolidated/checkpoint-tool.d.ts +66 -0
- package/dist/tools/consolidated/checkpoint-tool.d.ts.map +1 -0
- package/dist/tools/consolidated/checkpoint-tool.js +111 -0
- package/dist/tools/consolidated/checkpoint-tool.js.map +1 -0
- package/dist/tools/consolidated/validar.d.ts +63 -0
- package/dist/tools/consolidated/validar.d.ts.map +1 -0
- package/dist/tools/consolidated/validar.js +104 -0
- package/dist/tools/consolidated/validar.js.map +1 -0
- package/dist/tools/contexto.d.ts.map +1 -1
- package/dist/tools/contexto.js +18 -0
- package/dist/tools/contexto.js.map +1 -1
- package/dist/tools/iniciar-projeto.d.ts +1 -0
- package/dist/tools/iniciar-projeto.d.ts.map +1 -1
- package/dist/tools/iniciar-projeto.js +109 -38
- package/dist/tools/iniciar-projeto.js.map +1 -1
- package/dist/tools/maestro-tool.d.ts +51 -0
- package/dist/tools/maestro-tool.d.ts.map +1 -0
- package/dist/tools/maestro-tool.js +224 -0
- package/dist/tools/maestro-tool.js.map +1 -0
- package/dist/tools/prd-writer.d.ts.map +1 -1
- package/dist/tools/prd-writer.js +13 -0
- package/dist/tools/prd-writer.js.map +1 -1
- package/dist/tools/proximo.d.ts.map +1 -1
- package/dist/tools/proximo.js +22 -16
- package/dist/tools/proximo.js.map +1 -1
- package/dist/tools/salvar.d.ts.map +1 -1
- package/dist/tools/salvar.js +13 -0
- package/dist/tools/salvar.js.map +1 -1
- package/dist/tools/setup-inicial.d.ts.map +1 -1
- package/dist/tools/setup-inicial.js +12 -0
- package/dist/tools/setup-inicial.js.map +1 -1
- package/dist/tools/status.d.ts.map +1 -1
- package/dist/tools/status.js +6 -0
- package/dist/tools/status.js.map +1 -1
- package/dist/tools/validar-gate.d.ts.map +1 -1
- package/dist/tools/validar-gate.js +25 -0
- package/dist/tools/validar-gate.js.map +1 -1
- package/dist/types/index.d.ts +8 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/response.d.ts +49 -0
- package/dist/types/response.d.ts.map +1 -1
- package/dist/types/response.js.map +1 -1
- package/dist/utils/smart-defaults.d.ts +56 -0
- package/dist/utils/smart-defaults.d.ts.map +1 -0
- package/dist/utils/smart-defaults.js +113 -0
- package/dist/utils/smart-defaults.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SkillLoaderService — Carregamento Ativo de Skills com Budget de Tokens
|
|
3
|
+
*
|
|
4
|
+
* Monta "pacote de contexto" por fase, controlando o volume de conteúdo
|
|
5
|
+
* injetado na resposta para evitar estouro de contexto.
|
|
6
|
+
*
|
|
7
|
+
* Usa ContentResolverService para resolver caminhos.
|
|
8
|
+
* Usa FASE_SKILL_MAP para mapear fases → skills.
|
|
9
|
+
*/
|
|
10
|
+
import { getSkillParaFase } from "../utils/prompt-mapper.js";
|
|
11
|
+
import { getSpecialistPersona } from "./specialist.service.js";
|
|
12
|
+
/**
|
|
13
|
+
* Budgets de tokens por modo
|
|
14
|
+
*/
|
|
15
|
+
const TOKEN_BUDGETS = {
|
|
16
|
+
economy: { skill: 400, template: 300, checklist: 200, total: 1500 },
|
|
17
|
+
balanced: { skill: 1500, template: 800, checklist: 300, total: 4000 },
|
|
18
|
+
quality: { skill: 3000, template: 1200, checklist: 400, total: 8000 },
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Seções essenciais que sempre devem ser incluídas do SKILL.md
|
|
22
|
+
*/
|
|
23
|
+
const ESSENTIAL_SECTIONS = [
|
|
24
|
+
"missão", "missao",
|
|
25
|
+
"quando ativar",
|
|
26
|
+
"inputs obrigatórios", "inputs obrigatorios",
|
|
27
|
+
"outputs gerados",
|
|
28
|
+
"quality gate",
|
|
29
|
+
"processo otimizado", "processo",
|
|
30
|
+
"recursos disponíveis", "recursos disponiveis",
|
|
31
|
+
];
|
|
32
|
+
/**
|
|
33
|
+
* Seções opcionais (incluídas em balanced/quality)
|
|
34
|
+
*/
|
|
35
|
+
const OPTIONAL_SECTIONS = [
|
|
36
|
+
"context flow",
|
|
37
|
+
"princípios críticos", "principios criticos",
|
|
38
|
+
"stack padrão", "stack padrao",
|
|
39
|
+
"métricas de sucesso", "metricas de sucesso",
|
|
40
|
+
];
|
|
41
|
+
/**
|
|
42
|
+
* Seções de referência (incluídas apenas em quality)
|
|
43
|
+
*/
|
|
44
|
+
const REFERENCE_SECTIONS = [
|
|
45
|
+
"mcp integration",
|
|
46
|
+
"documentação completa", "documentacao completa",
|
|
47
|
+
"exemplos", "examples",
|
|
48
|
+
];
|
|
49
|
+
export class SkillLoaderService {
|
|
50
|
+
contentResolver;
|
|
51
|
+
constructor(contentResolver) {
|
|
52
|
+
this.contentResolver = contentResolver;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Carrega pacote completo de contexto para uma fase.
|
|
56
|
+
* Retorna null se a fase não tem skill mapeada.
|
|
57
|
+
*/
|
|
58
|
+
async loadForPhase(faseNome, mode = "balanced") {
|
|
59
|
+
const skillName = getSkillParaFase(faseNome);
|
|
60
|
+
if (!skillName)
|
|
61
|
+
return null;
|
|
62
|
+
const budget = TOKEN_BUDGETS[mode];
|
|
63
|
+
const specialist = getSpecialistPersona(faseNome);
|
|
64
|
+
// Carregar conteúdos em paralelo
|
|
65
|
+
const [rawSkill, rawTemplate, rawChecklist, templateFiles, checklistFiles] = await Promise.all([
|
|
66
|
+
this.contentResolver.readSkillFile(skillName, "SKILL.md"),
|
|
67
|
+
this.contentResolver.readFirstTemplate(skillName),
|
|
68
|
+
this.contentResolver.readFirstChecklist(skillName),
|
|
69
|
+
this.contentResolver.listSkillResources(skillName, "templates"),
|
|
70
|
+
this.contentResolver.listSkillResources(skillName, "checklists"),
|
|
71
|
+
]);
|
|
72
|
+
// Processar skill com budget
|
|
73
|
+
const skillContent = rawSkill
|
|
74
|
+
? this.processSkillContent(rawSkill, mode, budget.skill)
|
|
75
|
+
: "";
|
|
76
|
+
// Processar template com budget
|
|
77
|
+
const templateContent = rawTemplate
|
|
78
|
+
? this.processTemplateContent(rawTemplate, mode, budget.template)
|
|
79
|
+
: "";
|
|
80
|
+
// Checklist sempre completo (é curto)
|
|
81
|
+
const checklistContent = rawChecklist
|
|
82
|
+
? this.truncateToTokenBudget(rawChecklist, budget.checklist)
|
|
83
|
+
: "";
|
|
84
|
+
// Links de referência para recursos adicionais
|
|
85
|
+
const referenceLinks = [];
|
|
86
|
+
for (const t of templateFiles) {
|
|
87
|
+
referenceLinks.push(`maestro://skills/${skillName}/templates/${t}`);
|
|
88
|
+
}
|
|
89
|
+
for (const c of checklistFiles) {
|
|
90
|
+
referenceLinks.push(`maestro://skills/${skillName}/checklists/${c}`);
|
|
91
|
+
}
|
|
92
|
+
const totalTokens = this.estimateTokens(skillContent) +
|
|
93
|
+
this.estimateTokens(templateContent) +
|
|
94
|
+
this.estimateTokens(checklistContent);
|
|
95
|
+
const resultMode = mode === "economy" ? "summary" : mode === "balanced" ? "summary" : "full";
|
|
96
|
+
return {
|
|
97
|
+
skillName,
|
|
98
|
+
specialist,
|
|
99
|
+
skillContent,
|
|
100
|
+
templateContent,
|
|
101
|
+
checklistContent,
|
|
102
|
+
referenceLinks,
|
|
103
|
+
tokenEstimate: totalTokens,
|
|
104
|
+
mode: resultMode,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Carrega apenas o checklist de gate de uma fase.
|
|
109
|
+
*/
|
|
110
|
+
async loadChecklist(faseNome) {
|
|
111
|
+
const skillName = getSkillParaFase(faseNome);
|
|
112
|
+
if (!skillName)
|
|
113
|
+
return null;
|
|
114
|
+
return this.contentResolver.readFirstChecklist(skillName);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Carrega apenas o template de uma fase.
|
|
118
|
+
*/
|
|
119
|
+
async loadTemplate(faseNome) {
|
|
120
|
+
const skillName = getSkillParaFase(faseNome);
|
|
121
|
+
if (!skillName)
|
|
122
|
+
return null;
|
|
123
|
+
return this.contentResolver.readFirstTemplate(skillName);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Formata ContextPackage como markdown para injeção na resposta.
|
|
127
|
+
*/
|
|
128
|
+
formatAsMarkdown(pkg) {
|
|
129
|
+
const parts = [];
|
|
130
|
+
// Persona do especialista
|
|
131
|
+
if (pkg.specialist) {
|
|
132
|
+
parts.push(`## 🤖 Especialista: ${pkg.specialist.name}\n`);
|
|
133
|
+
parts.push(`**Tom:** ${pkg.specialist.tone}`);
|
|
134
|
+
parts.push(`**Expertise:** ${pkg.specialist.expertise.join(", ")}`);
|
|
135
|
+
parts.push(`**Instruções:** ${pkg.specialist.instructions}\n`);
|
|
136
|
+
}
|
|
137
|
+
// Conteúdo da skill
|
|
138
|
+
if (pkg.skillContent) {
|
|
139
|
+
parts.push(`## 📋 Instruções do Especialista\n`);
|
|
140
|
+
parts.push(pkg.skillContent);
|
|
141
|
+
parts.push("");
|
|
142
|
+
}
|
|
143
|
+
// Template do entregável
|
|
144
|
+
if (pkg.templateContent) {
|
|
145
|
+
parts.push(`## 📝 Template do Entregável\n`);
|
|
146
|
+
parts.push(pkg.templateContent);
|
|
147
|
+
parts.push("");
|
|
148
|
+
}
|
|
149
|
+
// Checklist de gate
|
|
150
|
+
if (pkg.checklistContent) {
|
|
151
|
+
parts.push(`## ✅ Checklist de Validação (Gate)\n`);
|
|
152
|
+
parts.push(pkg.checklistContent);
|
|
153
|
+
parts.push("");
|
|
154
|
+
}
|
|
155
|
+
// Links de referência
|
|
156
|
+
if (pkg.referenceLinks.length > 0) {
|
|
157
|
+
parts.push(`## 📚 Recursos Adicionais\n`);
|
|
158
|
+
for (const link of pkg.referenceLinks) {
|
|
159
|
+
parts.push(`- \`${link}\``);
|
|
160
|
+
}
|
|
161
|
+
parts.push("");
|
|
162
|
+
}
|
|
163
|
+
// Info de budget
|
|
164
|
+
parts.push(`---`);
|
|
165
|
+
parts.push(`> 📊 Contexto injetado: ~${pkg.tokenEstimate} tokens (modo: ${pkg.mode})`);
|
|
166
|
+
return parts.join("\n");
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Processa conteúdo do SKILL.md respeitando budget.
|
|
170
|
+
* Seleciona seções essenciais primeiro, depois opcionais, depois referência.
|
|
171
|
+
*/
|
|
172
|
+
processSkillContent(rawContent, mode, tokenBudget) {
|
|
173
|
+
const sections = this.parseMarkdownSections(rawContent);
|
|
174
|
+
const selected = [];
|
|
175
|
+
let usedTokens = 0;
|
|
176
|
+
// Remover frontmatter YAML se presente
|
|
177
|
+
const contentWithoutFrontmatter = rawContent.replace(/^---[\s\S]*?---\n*/m, "");
|
|
178
|
+
// Fase 1: Seções essenciais (sempre incluídas)
|
|
179
|
+
for (const section of sections) {
|
|
180
|
+
if (this.isSectionMatch(section.heading, ESSENTIAL_SECTIONS)) {
|
|
181
|
+
if (usedTokens + section.tokenEstimate <= tokenBudget) {
|
|
182
|
+
selected.push(section);
|
|
183
|
+
usedTokens += section.tokenEstimate;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Fase 2: Seções opcionais (balanced/quality)
|
|
188
|
+
if (mode !== "economy") {
|
|
189
|
+
for (const section of sections) {
|
|
190
|
+
if (this.isSectionMatch(section.heading, OPTIONAL_SECTIONS)) {
|
|
191
|
+
if (usedTokens + section.tokenEstimate <= tokenBudget) {
|
|
192
|
+
selected.push(section);
|
|
193
|
+
usedTokens += section.tokenEstimate;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Fase 3: Seções de referência (apenas quality)
|
|
199
|
+
if (mode === "quality") {
|
|
200
|
+
for (const section of sections) {
|
|
201
|
+
if (this.isSectionMatch(section.heading, REFERENCE_SECTIONS)) {
|
|
202
|
+
if (usedTokens + section.tokenEstimate <= tokenBudget) {
|
|
203
|
+
selected.push(section);
|
|
204
|
+
usedTokens += section.tokenEstimate;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (selected.length === 0) {
|
|
210
|
+
// Fallback: truncar conteúdo bruto
|
|
211
|
+
return this.truncateToTokenBudget(contentWithoutFrontmatter, tokenBudget);
|
|
212
|
+
}
|
|
213
|
+
return selected
|
|
214
|
+
.map(s => `${"#".repeat(s.level)} ${s.heading}\n${s.content}`)
|
|
215
|
+
.join("\n\n");
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Processa template do entregável respeitando budget.
|
|
219
|
+
* Em economy mode: apenas títulos (skeleton).
|
|
220
|
+
* Em balanced/quality: template completo.
|
|
221
|
+
*/
|
|
222
|
+
processTemplateContent(rawContent, mode, tokenBudget) {
|
|
223
|
+
if (mode === "economy") {
|
|
224
|
+
// Skeleton: apenas headings
|
|
225
|
+
return this.extractHeadingsOnly(rawContent);
|
|
226
|
+
}
|
|
227
|
+
return this.truncateToTokenBudget(rawContent, tokenBudget);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Parseia markdown em seções por headings.
|
|
231
|
+
*/
|
|
232
|
+
parseMarkdownSections(content) {
|
|
233
|
+
const lines = content.split("\n");
|
|
234
|
+
const sections = [];
|
|
235
|
+
let currentHeading = "";
|
|
236
|
+
let currentLevel = 0;
|
|
237
|
+
let currentContent = [];
|
|
238
|
+
for (const line of lines) {
|
|
239
|
+
const headingMatch = line.match(/^(#{1,4})\s+(.+)$/);
|
|
240
|
+
if (headingMatch) {
|
|
241
|
+
// Salvar seção anterior
|
|
242
|
+
if (currentHeading) {
|
|
243
|
+
const contentStr = currentContent.join("\n").trim();
|
|
244
|
+
sections.push({
|
|
245
|
+
heading: currentHeading,
|
|
246
|
+
level: currentLevel,
|
|
247
|
+
content: contentStr,
|
|
248
|
+
charCount: contentStr.length,
|
|
249
|
+
tokenEstimate: this.estimateTokens(contentStr),
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
currentHeading = headingMatch[2];
|
|
253
|
+
currentLevel = headingMatch[1].length;
|
|
254
|
+
currentContent = [];
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
currentContent.push(line);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// Última seção
|
|
261
|
+
if (currentHeading) {
|
|
262
|
+
const contentStr = currentContent.join("\n").trim();
|
|
263
|
+
sections.push({
|
|
264
|
+
heading: currentHeading,
|
|
265
|
+
level: currentLevel,
|
|
266
|
+
content: contentStr,
|
|
267
|
+
charCount: contentStr.length,
|
|
268
|
+
tokenEstimate: this.estimateTokens(contentStr),
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
return sections;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Verifica se o heading da seção corresponde a uma das seções alvo.
|
|
275
|
+
*/
|
|
276
|
+
isSectionMatch(heading, targets) {
|
|
277
|
+
const normalized = heading
|
|
278
|
+
.toLowerCase()
|
|
279
|
+
.normalize("NFD")
|
|
280
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
281
|
+
.replace(/[^\w\s]/g, "")
|
|
282
|
+
.trim();
|
|
283
|
+
return targets.some(t => normalized.includes(t));
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Extrai apenas os headings de um markdown (skeleton).
|
|
287
|
+
*/
|
|
288
|
+
extractHeadingsOnly(content) {
|
|
289
|
+
const lines = content.split("\n");
|
|
290
|
+
const headings = lines.filter(line => line.match(/^#{1,4}\s+/));
|
|
291
|
+
return headings.join("\n");
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Estima tokens a partir de caracteres (~4 chars = 1 token).
|
|
295
|
+
*/
|
|
296
|
+
estimateTokens(text) {
|
|
297
|
+
return Math.ceil(text.length / 4);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Trunca texto para caber no budget de tokens.
|
|
301
|
+
*/
|
|
302
|
+
truncateToTokenBudget(text, tokenBudget) {
|
|
303
|
+
const maxChars = tokenBudget * 4;
|
|
304
|
+
if (text.length <= maxChars)
|
|
305
|
+
return text;
|
|
306
|
+
const truncated = text.substring(0, maxChars);
|
|
307
|
+
// Cortar no último parágrafo completo
|
|
308
|
+
const lastNewline = truncated.lastIndexOf("\n\n");
|
|
309
|
+
if (lastNewline > maxChars * 0.7) {
|
|
310
|
+
return truncated.substring(0, lastNewline) + "\n\n> ⚡ *Conteúdo truncado. Consulte o recurso completo via MCP Resources.*";
|
|
311
|
+
}
|
|
312
|
+
return truncated + "\n\n> ⚡ *Conteúdo truncado. Consulte o recurso completo via MCP Resources.*";
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Factory function para criar SkillLoaderService.
|
|
317
|
+
*/
|
|
318
|
+
export function createSkillLoader(contentResolver) {
|
|
319
|
+
return new SkillLoaderService(contentResolver);
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=skill-loader.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-loader.service.js","sourceRoot":"","sources":["../../src/services/skill-loader.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serviço de Specialist Persona
|
|
3
|
+
* Mapeia fases do fluxo para personas de especialista estruturadas.
|
|
4
|
+
* Usado por tools que retornam specialist_persona no MaestroResponse.
|
|
5
|
+
*/
|
|
6
|
+
import type { SpecialistPersona } from "../types/response.js";
|
|
7
|
+
/**
|
|
8
|
+
* Obtém a persona de especialista para uma fase específica.
|
|
9
|
+
* Retorna null se não houver mapeamento.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getSpecialistPersona(faseName: string): SpecialistPersona | null;
|
|
12
|
+
/**
|
|
13
|
+
* Obtém persona de especialista por nome do especialista (fallback).
|
|
14
|
+
*/
|
|
15
|
+
export declare function getSpecialistByName(name: string): SpecialistPersona | null;
|
|
16
|
+
/**
|
|
17
|
+
* Lista todas as personas disponíveis.
|
|
18
|
+
*/
|
|
19
|
+
export declare function listSpecialists(): SpecialistPersona[];
|
|
20
|
+
//# sourceMappingURL=specialist.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specialist.service.d.ts","sourceRoot":"","sources":["../../src/services/specialist.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA4F9D;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAE/E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAK1E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,EAAE,CAErD"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serviço de Specialist Persona
|
|
3
|
+
* Mapeia fases do fluxo para personas de especialista estruturadas.
|
|
4
|
+
* Usado por tools que retornam specialist_persona no MaestroResponse.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Mapeamento fase → persona de especialista
|
|
8
|
+
*/
|
|
9
|
+
const SPECIALIST_MAP = {
|
|
10
|
+
"Produto": {
|
|
11
|
+
name: "Gestão de Produto",
|
|
12
|
+
tone: "Estratégico e orientado ao usuário",
|
|
13
|
+
expertise: ["product discovery", "lean startup", "user stories", "MVP definition"],
|
|
14
|
+
instructions: "Foque em entender o problema antes da solução. Questione premissas. Priorize por impacto no usuário.",
|
|
15
|
+
},
|
|
16
|
+
"Requisitos": {
|
|
17
|
+
name: "Engenharia de Requisitos",
|
|
18
|
+
tone: "Preciso e analítico",
|
|
19
|
+
expertise: ["requisitos funcionais", "requisitos não-funcionais", "critérios de aceite", "rastreabilidade"],
|
|
20
|
+
instructions: "Seja específico. Cada requisito deve ter ID único, critério de aceite mensurável e prioridade clara.",
|
|
21
|
+
},
|
|
22
|
+
"UX Design": {
|
|
23
|
+
name: "UX Design",
|
|
24
|
+
tone: "Empático e centrado no usuário",
|
|
25
|
+
expertise: ["wireframes", "jornadas de usuário", "design system", "acessibilidade", "usabilidade"],
|
|
26
|
+
instructions: "Pense primeiro no usuário. Valide hipóteses com dados. Priorize simplicidade sobre complexidade visual.",
|
|
27
|
+
},
|
|
28
|
+
"Arquitetura": {
|
|
29
|
+
name: "Arquitetura de Software",
|
|
30
|
+
tone: "Técnico e pragmático",
|
|
31
|
+
expertise: ["design patterns", "C4 model", "ADRs", "trade-offs", "escalabilidade"],
|
|
32
|
+
instructions: "Documente decisões (ADRs). Considere trade-offs explicitamente. Prefira simplicidade inicial com caminho de evolução.",
|
|
33
|
+
},
|
|
34
|
+
"Backlog": {
|
|
35
|
+
name: "Plano de Execução",
|
|
36
|
+
tone: "Organizado e prático",
|
|
37
|
+
expertise: ["épicos", "histórias de usuário", "estimativas", "priorização", "definition of done"],
|
|
38
|
+
instructions: "Quebre em incrementos entregáveis. Priorize por valor de negócio e risco técnico. Defina DoD claro.",
|
|
39
|
+
},
|
|
40
|
+
"Frontend": {
|
|
41
|
+
name: "Desenvolvimento Frontend",
|
|
42
|
+
tone: "Criativo e detalhista",
|
|
43
|
+
expertise: ["componentes", "responsividade", "acessibilidade", "performance web", "design system"],
|
|
44
|
+
instructions: "Implemente componentes isolados primeiro. Teste contra mocks. Garanta acessibilidade WCAG 2.1 AA.",
|
|
45
|
+
},
|
|
46
|
+
"Backend": {
|
|
47
|
+
name: "Desenvolvimento Backend",
|
|
48
|
+
tone: "Robusto e orientado a contratos",
|
|
49
|
+
expertise: ["APIs REST/GraphQL", "banco de dados", "testes", "segurança", "performance"],
|
|
50
|
+
instructions: "Defina contratos de API primeiro. Implemente com testes. Valide segurança (OWASP). Documente endpoints.",
|
|
51
|
+
},
|
|
52
|
+
"DevOps": {
|
|
53
|
+
name: "DevOps & Infraestrutura",
|
|
54
|
+
tone: "Automatizado e resiliente",
|
|
55
|
+
expertise: ["CI/CD", "containers", "monitoramento", "IaC", "observabilidade"],
|
|
56
|
+
instructions: "Automatize tudo. Defina pipeline CI/CD. Configure monitoramento e alertas. Documente runbooks.",
|
|
57
|
+
},
|
|
58
|
+
"Testes": {
|
|
59
|
+
name: "Quality Assurance",
|
|
60
|
+
tone: "Meticuloso e preventivo",
|
|
61
|
+
expertise: ["testes unitários", "testes de integração", "testes E2E", "cobertura", "TDD"],
|
|
62
|
+
instructions: "Escreva testes antes do código quando possível. Cubra edge cases. Meça cobertura. Automatize regressão.",
|
|
63
|
+
},
|
|
64
|
+
"Segurança": {
|
|
65
|
+
name: "Segurança da Informação",
|
|
66
|
+
tone: "Cauteloso e preventivo",
|
|
67
|
+
expertise: ["OWASP Top 10", "autenticação", "autorização", "criptografia", "compliance"],
|
|
68
|
+
instructions: "Assuma que atacantes existem. Valide toda entrada. Use princípio do menor privilégio. Documente riscos.",
|
|
69
|
+
},
|
|
70
|
+
"Integração": {
|
|
71
|
+
name: "Integração de Sistemas",
|
|
72
|
+
tone: "Metódico e orientado a contratos",
|
|
73
|
+
expertise: ["APIs", "webhooks", "filas", "sincronização", "resiliência"],
|
|
74
|
+
instructions: "Defina contratos claros. Implemente circuit breakers. Teste cenários de falha. Documente dependências.",
|
|
75
|
+
},
|
|
76
|
+
"Discovery": {
|
|
77
|
+
name: "Product Discovery",
|
|
78
|
+
tone: "Curioso e exploratório",
|
|
79
|
+
expertise: ["entrevistas", "mapeamento de problemas", "validação de hipóteses", "análise de mercado"],
|
|
80
|
+
instructions: "Faça perguntas abertas. Não assuma soluções. Identifique o problema raiz antes de propor funcionalidades.",
|
|
81
|
+
},
|
|
82
|
+
"Brainstorm": {
|
|
83
|
+
name: "Facilitador de Brainstorm",
|
|
84
|
+
tone: "Encorajador e criativo",
|
|
85
|
+
expertise: ["ideação", "design thinking", "análise SWOT", "priorização", "convergência"],
|
|
86
|
+
instructions: "Encoraje todas as ideias primeiro. Depois filtre por viabilidade e impacto. Documente decisões.",
|
|
87
|
+
},
|
|
88
|
+
"PRD": {
|
|
89
|
+
name: "Product Requirements Writer",
|
|
90
|
+
tone: "Completo e estruturado",
|
|
91
|
+
expertise: ["PRDs", "especificações", "escopo", "métricas de sucesso", "riscos"],
|
|
92
|
+
instructions: "Seja exaustivo nas seções do PRD. Inclua métricas mensuráveis. Defina o que está fora do escopo.",
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Obtém a persona de especialista para uma fase específica.
|
|
97
|
+
* Retorna null se não houver mapeamento.
|
|
98
|
+
*/
|
|
99
|
+
export function getSpecialistPersona(faseName) {
|
|
100
|
+
return SPECIALIST_MAP[faseName] || null;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Obtém persona de especialista por nome do especialista (fallback).
|
|
104
|
+
*/
|
|
105
|
+
export function getSpecialistByName(name) {
|
|
106
|
+
const entry = Object.values(SPECIALIST_MAP).find(s => s.name.toLowerCase() === name.toLowerCase());
|
|
107
|
+
return entry || null;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Lista todas as personas disponíveis.
|
|
111
|
+
*/
|
|
112
|
+
export function listSpecialists() {
|
|
113
|
+
return Object.values(SPECIALIST_MAP);
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=specialist.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specialist.service.js","sourceRoot":"","sources":["../../src/services/specialist.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StateService — Persistência Ativa
|
|
3
|
+
*
|
|
4
|
+
* O MCP agora pode gravar estado diretamente no filesystem,
|
|
5
|
+
* sem depender da IA para salvar arquivos.
|
|
6
|
+
*
|
|
7
|
+
* Fallback: continua retornando files[] e estado_atualizado
|
|
8
|
+
* para IDEs que preferem controlar a persistência.
|
|
9
|
+
*/
|
|
10
|
+
import type { EstadoProjeto } from "../types/index.js";
|
|
11
|
+
export declare class StateService {
|
|
12
|
+
private diretorio;
|
|
13
|
+
private maestroDir;
|
|
14
|
+
private estadoPath;
|
|
15
|
+
constructor(diretorio: string);
|
|
16
|
+
/**
|
|
17
|
+
* Carrega estado do projeto do filesystem.
|
|
18
|
+
* Retorna null se não existir ou falhar.
|
|
19
|
+
*/
|
|
20
|
+
load(): Promise<EstadoProjeto | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Salva estado no filesystem.
|
|
23
|
+
* Cria diretório .maestro se não existir.
|
|
24
|
+
* Retorna true se salvou com sucesso, false se falhou (fallback para files[]).
|
|
25
|
+
*/
|
|
26
|
+
save(estado: EstadoProjeto): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Aplica patch parcial ao estado e salva.
|
|
29
|
+
* Carrega estado atual, aplica as mudanças, e persiste.
|
|
30
|
+
*/
|
|
31
|
+
patch(changes: Partial<EstadoProjeto>): Promise<EstadoProjeto | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Salva arquivo genérico no diretório do projeto.
|
|
34
|
+
* Usado para entregáveis, resumos, etc.
|
|
35
|
+
*/
|
|
36
|
+
saveFile(relativePath: string, content: string): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* Salva múltiplos arquivos de uma vez.
|
|
39
|
+
* Retorna quantos foram salvos com sucesso.
|
|
40
|
+
*/
|
|
41
|
+
saveFiles(files: Array<{
|
|
42
|
+
path: string;
|
|
43
|
+
content: string;
|
|
44
|
+
}>): Promise<number>;
|
|
45
|
+
/**
|
|
46
|
+
* Verifica se o diretório .maestro existe (projeto inicializado).
|
|
47
|
+
*/
|
|
48
|
+
exists(): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Verifica se tem estado salvo.
|
|
51
|
+
*/
|
|
52
|
+
hasState(): boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Factory function para criar StateService.
|
|
56
|
+
* Facilita o uso em tools que recebem diretorio como argumento.
|
|
57
|
+
*/
|
|
58
|
+
export declare function createStateService(diretorio: string): StateService;
|
|
59
|
+
//# sourceMappingURL=state.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.service.d.ts","sourceRoot":"","sources":["../../src/services/state.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,qBAAa,YAAY;IAIT,OAAO,CAAC,SAAS;IAH7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;gBAEP,SAAS,EAAE,MAAM;IAKrC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAU3C;;;;OAIG;IACG,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAanD;;;OAGG;IACG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAS3E;;;OAGG;IACG,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAevE;;;OAGG;IACG,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBjF;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGtB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAElE"}
|