@maestro-ai/mcp-server 2.6.1 → 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.
Files changed (153) hide show
  1. package/dist/content/.version.json +16 -0
  2. package/dist/data/project-templates.d.ts +37 -0
  3. package/dist/data/project-templates.d.ts.map +1 -0
  4. package/dist/data/project-templates.js +208 -0
  5. package/dist/data/project-templates.js.map +1 -0
  6. package/dist/errors/index.d.ts +84 -0
  7. package/dist/errors/index.d.ts.map +1 -0
  8. package/dist/errors/index.js +158 -0
  9. package/dist/errors/index.js.map +1 -0
  10. package/dist/flows/onboarding-orchestrator.d.ts.map +1 -1
  11. package/dist/flows/onboarding-orchestrator.js +126 -91
  12. package/dist/flows/onboarding-orchestrator.js.map +1 -1
  13. package/dist/gates/validator.d.ts +2 -1
  14. package/dist/gates/validator.d.ts.map +1 -1
  15. package/dist/gates/validator.js +33 -2
  16. package/dist/gates/validator.js.map +1 -1
  17. package/dist/index.js +19 -164
  18. package/dist/index.js.map +1 -1
  19. package/dist/middleware/flow-engine.middleware.d.ts +14 -0
  20. package/dist/middleware/flow-engine.middleware.d.ts.map +1 -0
  21. package/dist/middleware/flow-engine.middleware.js +51 -0
  22. package/dist/middleware/flow-engine.middleware.js.map +1 -0
  23. package/dist/middleware/index.d.ts +36 -0
  24. package/dist/middleware/index.d.ts.map +1 -0
  25. package/dist/middleware/index.js +45 -0
  26. package/dist/middleware/index.js.map +1 -0
  27. package/dist/middleware/persistence.middleware.d.ts +14 -0
  28. package/dist/middleware/persistence.middleware.d.ts.map +1 -0
  29. package/dist/middleware/persistence.middleware.js +55 -0
  30. package/dist/middleware/persistence.middleware.js.map +1 -0
  31. package/dist/middleware/skill-injection.middleware.d.ts +15 -0
  32. package/dist/middleware/skill-injection.middleware.d.ts.map +1 -0
  33. package/dist/middleware/skill-injection.middleware.js +63 -0
  34. package/dist/middleware/skill-injection.middleware.js.map +1 -0
  35. package/dist/middleware/state-loader.middleware.d.ts +13 -0
  36. package/dist/middleware/state-loader.middleware.d.ts.map +1 -0
  37. package/dist/middleware/state-loader.middleware.js +36 -0
  38. package/dist/middleware/state-loader.middleware.js.map +1 -0
  39. package/dist/router.d.ts +46 -0
  40. package/dist/router.d.ts.map +1 -0
  41. package/dist/router.js +441 -0
  42. package/dist/router.js.map +1 -0
  43. package/dist/services/content-resolver.service.d.ts +96 -0
  44. package/dist/services/content-resolver.service.d.ts.map +1 -0
  45. package/dist/services/content-resolver.service.js +280 -0
  46. package/dist/services/content-resolver.service.js.map +1 -0
  47. package/dist/services/flow-engine.d.ts +82 -0
  48. package/dist/services/flow-engine.d.ts.map +1 -0
  49. package/dist/services/flow-engine.js +270 -0
  50. package/dist/services/flow-engine.js.map +1 -0
  51. package/dist/services/onboarding.service.d.ts +20 -0
  52. package/dist/services/onboarding.service.d.ts.map +1 -0
  53. package/dist/services/onboarding.service.js +49 -0
  54. package/dist/services/onboarding.service.js.map +1 -0
  55. package/dist/services/skill-loader.service.d.ts +81 -0
  56. package/dist/services/skill-loader.service.d.ts.map +1 -0
  57. package/dist/services/skill-loader.service.js +321 -0
  58. package/dist/services/skill-loader.service.js.map +1 -0
  59. package/dist/services/specialist.service.d.ts +20 -0
  60. package/dist/services/specialist.service.d.ts.map +1 -0
  61. package/dist/services/specialist.service.js +115 -0
  62. package/dist/services/specialist.service.js.map +1 -0
  63. package/dist/services/state.service.d.ts +59 -0
  64. package/dist/services/state.service.d.ts.map +1 -0
  65. package/dist/services/state.service.js +131 -0
  66. package/dist/services/state.service.js.map +1 -0
  67. package/dist/stdio.js +329 -437
  68. package/dist/stdio.js.map +1 -1
  69. package/dist/tests/content-resolver.test.d.ts +5 -0
  70. package/dist/tests/content-resolver.test.d.ts.map +1 -0
  71. package/dist/tests/content-resolver.test.js +157 -0
  72. package/dist/tests/content-resolver.test.js.map +1 -0
  73. package/dist/tests/middleware.test.d.ts +5 -0
  74. package/dist/tests/middleware.test.d.ts.map +1 -0
  75. package/dist/tests/middleware.test.js +228 -0
  76. package/dist/tests/middleware.test.js.map +1 -0
  77. package/dist/tests/skill-loader.test.d.ts +5 -0
  78. package/dist/tests/skill-loader.test.d.ts.map +1 -0
  79. package/dist/tests/skill-loader.test.js +242 -0
  80. package/dist/tests/skill-loader.test.js.map +1 -0
  81. package/dist/tools/aprovar-gate.d.ts.map +1 -1
  82. package/dist/tools/aprovar-gate.js +35 -0
  83. package/dist/tools/aprovar-gate.js.map +1 -1
  84. package/dist/tools/brainstorm.d.ts.map +1 -1
  85. package/dist/tools/brainstorm.js +90 -49
  86. package/dist/tools/brainstorm.js.map +1 -1
  87. package/dist/tools/classificar.d.ts.map +1 -1
  88. package/dist/tools/classificar.js +20 -1
  89. package/dist/tools/classificar.js.map +1 -1
  90. package/dist/tools/confirmar-classificacao.d.ts.map +1 -1
  91. package/dist/tools/confirmar-classificacao.js +20 -1
  92. package/dist/tools/confirmar-classificacao.js.map +1 -1
  93. package/dist/tools/consolidated/analisar.d.ts +56 -0
  94. package/dist/tools/consolidated/analisar.d.ts.map +1 -0
  95. package/dist/tools/consolidated/analisar.js +96 -0
  96. package/dist/tools/consolidated/analisar.js.map +1 -0
  97. package/dist/tools/consolidated/avancar.d.ts +67 -0
  98. package/dist/tools/consolidated/avancar.d.ts.map +1 -0
  99. package/dist/tools/consolidated/avancar.js +132 -0
  100. package/dist/tools/consolidated/avancar.js.map +1 -0
  101. package/dist/tools/consolidated/checkpoint-tool.d.ts +66 -0
  102. package/dist/tools/consolidated/checkpoint-tool.d.ts.map +1 -0
  103. package/dist/tools/consolidated/checkpoint-tool.js +111 -0
  104. package/dist/tools/consolidated/checkpoint-tool.js.map +1 -0
  105. package/dist/tools/consolidated/validar.d.ts +63 -0
  106. package/dist/tools/consolidated/validar.d.ts.map +1 -0
  107. package/dist/tools/consolidated/validar.js +104 -0
  108. package/dist/tools/consolidated/validar.js.map +1 -0
  109. package/dist/tools/contexto.d.ts.map +1 -1
  110. package/dist/tools/contexto.js +18 -0
  111. package/dist/tools/contexto.js.map +1 -1
  112. package/dist/tools/discovery.d.ts +10 -10
  113. package/dist/tools/discovery.d.ts.map +1 -1
  114. package/dist/tools/discovery.js +82 -56
  115. package/dist/tools/discovery.js.map +1 -1
  116. package/dist/tools/iniciar-projeto.d.ts +48 -0
  117. package/dist/tools/iniciar-projeto.d.ts.map +1 -1
  118. package/dist/tools/iniciar-projeto.js +234 -45
  119. package/dist/tools/iniciar-projeto.js.map +1 -1
  120. package/dist/tools/maestro-tool.d.ts +51 -0
  121. package/dist/tools/maestro-tool.d.ts.map +1 -0
  122. package/dist/tools/maestro-tool.js +224 -0
  123. package/dist/tools/maestro-tool.js.map +1 -0
  124. package/dist/tools/prd-writer.d.ts +1 -1
  125. package/dist/tools/prd-writer.d.ts.map +1 -1
  126. package/dist/tools/prd-writer.js +138 -2
  127. package/dist/tools/prd-writer.js.map +1 -1
  128. package/dist/tools/proximo.d.ts.map +1 -1
  129. package/dist/tools/proximo.js +22 -16
  130. package/dist/tools/proximo.js.map +1 -1
  131. package/dist/tools/salvar.d.ts.map +1 -1
  132. package/dist/tools/salvar.js +13 -0
  133. package/dist/tools/salvar.js.map +1 -1
  134. package/dist/tools/setup-inicial.d.ts.map +1 -1
  135. package/dist/tools/setup-inicial.js +12 -0
  136. package/dist/tools/setup-inicial.js.map +1 -1
  137. package/dist/tools/status.d.ts.map +1 -1
  138. package/dist/tools/status.js +6 -0
  139. package/dist/tools/status.js.map +1 -1
  140. package/dist/tools/validar-gate.d.ts.map +1 -1
  141. package/dist/tools/validar-gate.js +25 -0
  142. package/dist/tools/validar-gate.js.map +1 -1
  143. package/dist/types/index.d.ts +20 -1
  144. package/dist/types/index.d.ts.map +1 -1
  145. package/dist/types/index.js.map +1 -1
  146. package/dist/types/response.d.ts +49 -0
  147. package/dist/types/response.d.ts.map +1 -1
  148. package/dist/types/response.js.map +1 -1
  149. package/dist/utils/smart-defaults.d.ts +56 -0
  150. package/dist/utils/smart-defaults.d.ts.map +1 -0
  151. package/dist/utils/smart-defaults.js +113 -0
  152. package/dist/utils/smart-defaults.js.map +1 -0
  153. package/package.json +1 -1
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Flow Engine — State Machine para Fluxos do Maestro
3
+ *
4
+ * Codifica transições de fase como state machine declarativa.
5
+ * Qualquer tool pode perguntar "qual o próximo passo?" ao flow engine.
6
+ * Gera next_action automaticamente baseado no estado atual.
7
+ */
8
+ import { getFaseComStitch } from "../flows/types.js";
9
+ import { getSpecialistPersona } from "./specialist.service.js";
10
+ /**
11
+ * Fluxo de onboarding (setup → discovery → brainstorm → PRD)
12
+ */
13
+ const ONBOARDING_FLOW = [
14
+ {
15
+ from: "none",
16
+ to: "setup",
17
+ tool: "setup_inicial",
18
+ description: "Configurar preferências globais do Maestro",
19
+ condition: (s) => !s.hasGlobalConfig,
20
+ requires_user_input: true,
21
+ user_prompt: "Vamos configurar suas preferências (IDE, modo, etc.)",
22
+ },
23
+ {
24
+ from: "none",
25
+ to: "iniciar",
26
+ tool: "iniciar_projeto",
27
+ description: "Iniciar um novo projeto",
28
+ condition: (s) => s.hasGlobalConfig && !s.hasProject,
29
+ requires_user_input: true,
30
+ user_prompt: "Qual o nome e descrição do projeto?",
31
+ },
32
+ {
33
+ from: "setup",
34
+ to: "iniciar",
35
+ tool: "iniciar_projeto",
36
+ description: "Iniciar um novo projeto após configuração",
37
+ requires_user_input: true,
38
+ user_prompt: "Configuração concluída! Qual o nome e descrição do projeto?",
39
+ },
40
+ {
41
+ from: "iniciar",
42
+ to: "confirmar",
43
+ tool: "confirmar_projeto",
44
+ description: "Confirmar criação do projeto com tipo e complexidade",
45
+ requires_user_input: true,
46
+ user_prompt: "Confirme o tipo e complexidade do projeto.",
47
+ },
48
+ {
49
+ from: "confirmar",
50
+ to: "discovery",
51
+ tool: "onboarding_orchestrator",
52
+ description: "Iniciar discovery do projeto",
53
+ requires_user_input: true,
54
+ user_prompt: "Vamos coletar informações sobre o projeto em blocos.",
55
+ },
56
+ {
57
+ from: "discovery_in_progress",
58
+ to: "discovery_next_block",
59
+ tool: "onboarding_orchestrator",
60
+ description: "Responder próximo bloco do discovery",
61
+ requires_user_input: true,
62
+ user_prompt: "Responda as perguntas do próximo bloco de discovery.",
63
+ },
64
+ {
65
+ from: "discovery_complete",
66
+ to: "brainstorm",
67
+ tool: "brainstorm",
68
+ description: "Brainstorm exploratório para refinar ideias",
69
+ condition: (s) => s.mode !== "economy" && s.wantsBrainstorm,
70
+ requires_user_input: true,
71
+ user_prompt: "Discovery completo! Deseja fazer um brainstorm para explorar ideias?",
72
+ },
73
+ {
74
+ from: "discovery_complete",
75
+ to: "prd",
76
+ tool: "prd_writer",
77
+ description: "Gerar PRD a partir do discovery",
78
+ condition: (s) => s.mode === "economy" || !s.wantsBrainstorm,
79
+ requires_user_input: false,
80
+ auto_execute: true,
81
+ },
82
+ {
83
+ from: "brainstorm_complete",
84
+ to: "prd",
85
+ tool: "prd_writer",
86
+ description: "Gerar PRD a partir do discovery + brainstorm",
87
+ requires_user_input: false,
88
+ auto_execute: true,
89
+ },
90
+ {
91
+ from: "prd_complete",
92
+ to: "confirmar_classificacao",
93
+ tool: "confirmar_classificacao",
94
+ description: "Confirmar classificação do projeto baseada no PRD",
95
+ requires_user_input: true,
96
+ user_prompt: "PRD gerado! Confirme a classificação sugerida.",
97
+ },
98
+ ];
99
+ /**
100
+ * Fluxo de desenvolvimento (fases pós-onboarding)
101
+ */
102
+ const DEVELOPMENT_FLOW = [
103
+ {
104
+ from: "aguardando_aprovacao",
105
+ to: "aprovar_gate",
106
+ tool: "aprovar_gate",
107
+ description: "Projeto aguardando aprovação do usuário",
108
+ requires_user_input: true,
109
+ user_prompt: "O projeto está bloqueado. Deseja aprovar ou rejeitar?",
110
+ },
111
+ {
112
+ from: "aguardando_classificacao",
113
+ to: "confirmar_classificacao",
114
+ tool: "confirmar_classificacao",
115
+ description: "Confirmar classificação antes de avançar",
116
+ requires_user_input: true,
117
+ user_prompt: "Confirme a classificação do projeto.",
118
+ },
119
+ {
120
+ from: "fase_ativa",
121
+ to: "gerar_entregavel",
122
+ tool: "proximo",
123
+ description: "Gerar entregável da fase atual e avançar",
124
+ requires_user_input: true,
125
+ user_prompt: "Trabalhe com o especialista para gerar o entregável da fase.",
126
+ },
127
+ {
128
+ from: "fase_concluida",
129
+ to: "validar_gate",
130
+ tool: "validar_gate",
131
+ description: "Validar checklist de saída da fase",
132
+ requires_user_input: false,
133
+ auto_execute: true,
134
+ },
135
+ {
136
+ from: "projeto_concluido",
137
+ to: "status_final",
138
+ tool: "status",
139
+ description: "Projeto concluído! Ver status final",
140
+ requires_user_input: false,
141
+ },
142
+ ];
143
+ /**
144
+ * Extrai estado do fluxo a partir do estado do projeto
145
+ */
146
+ export function getFlowState(estado, diretorio) {
147
+ const onboarding = estado.onboarding;
148
+ return {
149
+ hasGlobalConfig: !!estado.config?.setup?.completed,
150
+ hasProject: !!estado.projeto_id,
151
+ currentPhase: determineCurrentPhase(estado),
152
+ faseNumero: estado.fase_atual,
153
+ totalFases: estado.total_fases,
154
+ gatesValidados: estado.gates_validados || [],
155
+ mode: (estado.config?.mode || "balanced"),
156
+ discoveryStatus: onboarding?.discoveryStatus || "pending",
157
+ brainstormStatus: onboarding?.brainstormStatus || "pending",
158
+ prdStatus: onboarding?.prdStatus || "pending",
159
+ aguardandoAprovacao: estado.aguardando_aprovacao || false,
160
+ aguardandoClassificacao: estado.aguardando_classificacao || false,
161
+ wantsBrainstorm: true,
162
+ nivel: estado.nivel,
163
+ usarStitch: estado.usar_stitch || false,
164
+ diretorio,
165
+ };
166
+ }
167
+ /**
168
+ * Determina a fase atual com base no estado
169
+ */
170
+ function determineCurrentPhase(estado) {
171
+ if (estado.aguardando_aprovacao)
172
+ return "aguardando_aprovacao";
173
+ if (estado.aguardando_classificacao)
174
+ return "aguardando_classificacao";
175
+ const onboarding = estado.onboarding;
176
+ if (onboarding) {
177
+ if (onboarding.discoveryStatus === "in_progress")
178
+ return "discovery_in_progress";
179
+ if (onboarding.discoveryStatus === "completed" && onboarding.brainstormStatus === "pending")
180
+ return "discovery_complete";
181
+ if (onboarding.brainstormStatus === "in_progress")
182
+ return "brainstorm_in_progress";
183
+ if (onboarding.brainstormStatus === "completed" && onboarding.prdStatus === "pending")
184
+ return "brainstorm_complete";
185
+ if (onboarding.prdStatus === "completed")
186
+ return "prd_complete";
187
+ }
188
+ if (estado.fase_atual >= estado.total_fases && estado.gates_validados.includes(estado.total_fases)) {
189
+ return "projeto_concluido";
190
+ }
191
+ return "fase_ativa";
192
+ }
193
+ /**
194
+ * Obtém o próximo passo recomendado pelo flow engine
195
+ */
196
+ export function getNextStep(estado, diretorio) {
197
+ const flowState = getFlowState(estado, diretorio);
198
+ const currentPhase = flowState.currentPhase;
199
+ // Buscar em ambos os fluxos
200
+ const allTransitions = [...ONBOARDING_FLOW, ...DEVELOPMENT_FLOW];
201
+ const transition = allTransitions.find((t) => t.from === currentPhase && (!t.condition || t.condition(flowState)));
202
+ if (!transition) {
203
+ // Fallback: retornar status
204
+ return {
205
+ phase: currentPhase,
206
+ tool: "status",
207
+ description: "Ver status atual do projeto",
208
+ args_template: { estado_json: "{{estado_json}}", diretorio },
209
+ requires_user_input: false,
210
+ };
211
+ }
212
+ const faseInfo = getFaseComStitch(estado.nivel, estado.fase_atual, estado.usar_stitch);
213
+ const specialist = faseInfo ? getSpecialistPersona(faseInfo.nome) : null;
214
+ return {
215
+ phase: transition.to,
216
+ tool: transition.tool,
217
+ description: transition.description,
218
+ args_template: { estado_json: "{{estado_json}}", diretorio },
219
+ requires_user_input: transition.requires_user_input,
220
+ user_prompt: transition.user_prompt,
221
+ auto_execute: transition.auto_execute,
222
+ specialist,
223
+ };
224
+ }
225
+ /**
226
+ * Converte FlowStep em NextAction para resposta de tool
227
+ */
228
+ export function flowStepToNextAction(step) {
229
+ return {
230
+ tool: step.tool,
231
+ description: step.description,
232
+ args_template: step.args_template,
233
+ requires_user_input: step.requires_user_input,
234
+ user_prompt: step.user_prompt,
235
+ auto_execute: step.auto_execute,
236
+ };
237
+ }
238
+ /**
239
+ * Calcula progresso atual do fluxo
240
+ */
241
+ export function getFlowProgress(estado) {
242
+ const faseInfo = getFaseComStitch(estado.nivel, estado.fase_atual, estado.usar_stitch);
243
+ return {
244
+ current_phase: faseInfo?.nome || `Fase ${estado.fase_atual}`,
245
+ total_phases: estado.total_fases,
246
+ completed_phases: estado.gates_validados?.length || 0,
247
+ percentage: Math.round(((estado.gates_validados?.length || 0) / estado.total_fases) * 100),
248
+ };
249
+ }
250
+ /**
251
+ * Verifica se o projeto está no fluxo de onboarding
252
+ */
253
+ export function isInOnboarding(estado) {
254
+ const phase = determineCurrentPhase(estado);
255
+ return [
256
+ "none", "setup", "iniciar", "confirmar",
257
+ "discovery", "discovery_in_progress", "discovery_next_block",
258
+ "discovery_complete", "brainstorm", "brainstorm_in_progress",
259
+ "brainstorm_complete", "prd", "prd_complete", "confirmar_classificacao",
260
+ ].includes(phase);
261
+ }
262
+ /**
263
+ * Lista todas as transições disponíveis a partir do estado atual
264
+ */
265
+ export function getAvailableTransitions(estado, diretorio) {
266
+ const flowState = getFlowState(estado, diretorio);
267
+ const allTransitions = [...ONBOARDING_FLOW, ...DEVELOPMENT_FLOW];
268
+ return allTransitions.filter((t) => t.from === flowState.currentPhase && (!t.condition || t.condition(flowState)));
269
+ }
270
+ //# sourceMappingURL=flow-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-engine.js","sourceRoot":"","sources":["../../src/services/flow-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Serviço compartilhado de onboarding
3
+ * Centraliza criação e manipulação de estado de onboarding
4
+ * Elimina duplicação entre iniciar-projeto.ts e onboarding-orchestrator.ts
5
+ */
6
+ import type { EstadoProjeto } from "../types/index.js";
7
+ import type { OnboardingState } from "../types/onboarding.js";
8
+ /**
9
+ * Cria estado inicial de onboarding (ÚNICO LUGAR - antes duplicado em 2 arquivos)
10
+ */
11
+ export declare function criarEstadoOnboardingInicial(projectId: string, modo: 'economy' | 'balanced' | 'quality'): OnboardingState;
12
+ /**
13
+ * Obtém estado de onboarding do estado do projeto
14
+ */
15
+ export declare function obterEstadoOnboarding(estado: EstadoProjeto): OnboardingState | null;
16
+ /**
17
+ * Salva estado de onboarding no estado do projeto
18
+ */
19
+ export declare function salvarEstadoOnboarding(estado: EstadoProjeto, onboarding: OnboardingState): EstadoProjeto;
20
+ //# sourceMappingURL=onboarding.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.service.d.ts","sourceRoot":"","sources":["../../src/services/onboarding.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D;;GAEG;AACH,wBAAgB,4BAA4B,CACxC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GACzC,eAAe,CAuBjB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,GAAG,IAAI,CAEnF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,GAAG,aAAa,CAMxG"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Serviço compartilhado de onboarding
3
+ * Centraliza criação e manipulação de estado de onboarding
4
+ * Elimina duplicação entre iniciar-projeto.ts e onboarding-orchestrator.ts
5
+ */
6
+ import { gerarBlocosDiscovery } from "../utils/discovery-adapter.js";
7
+ /**
8
+ * Cria estado inicial de onboarding (ÚNICO LUGAR - antes duplicado em 2 arquivos)
9
+ */
10
+ export function criarEstadoOnboardingInicial(projectId, modo) {
11
+ const blocosDiscovery = gerarBlocosDiscovery({
12
+ mode: modo,
13
+ skipCompletedBlocks: false,
14
+ prioritizeByMode: true,
15
+ allowBatchInput: true,
16
+ });
17
+ return {
18
+ projectId,
19
+ phase: 'discovery',
20
+ discoveryStatus: 'in_progress',
21
+ discoveryBlocks: blocosDiscovery,
22
+ discoveryResponses: {},
23
+ discoveryStartedAt: new Date().toISOString(),
24
+ brainstormStatus: 'pending',
25
+ brainstormSections: [],
26
+ prdStatus: 'pending',
27
+ prdScore: 0,
28
+ mode: modo,
29
+ totalInteractions: 0,
30
+ lastInteractionAt: new Date().toISOString(),
31
+ };
32
+ }
33
+ /**
34
+ * Obtém estado de onboarding do estado do projeto
35
+ */
36
+ export function obterEstadoOnboarding(estado) {
37
+ return estado.onboarding || null;
38
+ }
39
+ /**
40
+ * Salva estado de onboarding no estado do projeto
41
+ */
42
+ export function salvarEstadoOnboarding(estado, onboarding) {
43
+ return {
44
+ ...estado,
45
+ onboarding: onboarding,
46
+ atualizado_em: new Date().toISOString(),
47
+ };
48
+ }
49
+ //# sourceMappingURL=onboarding.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.service.js","sourceRoot":"","sources":["../../src/services/onboarding.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE;;GAEG;AACH,MAAM,UAAU,4BAA4B,CACxC,SAAiB,EACjB,IAAwC;IAExC,MAAM,eAAe,GAAG,oBAAoB,CAAC;QACzC,IAAI,EAAE,IAAI;QACV,mBAAmB,EAAE,KAAK;QAC1B,gBAAgB,EAAE,IAAI;QACtB,eAAe,EAAE,IAAI;KACxB,CAAC,CAAC;IAEH,OAAO;QACH,SAAS;QACT,KAAK,EAAE,WAAW;QAClB,eAAe,EAAE,aAAa;QAC9B,eAAe,EAAE,eAAe;QAChC,kBAAkB,EAAE,EAAE;QACtB,kBAAkB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5C,gBAAgB,EAAE,SAAS;QAC3B,kBAAkB,EAAE,EAAE;QACtB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,IAAI;QACV,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC9C,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IACvD,OAAQ,MAAc,CAAC,UAAU,IAAI,IAAI,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAqB,EAAE,UAA2B;IACrF,OAAO;QACH,GAAG,MAAM;QACT,UAAU,EAAE,UAAiB;QAC7B,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC1C,CAAC;AACN,CAAC"}
@@ -0,0 +1,81 @@
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 { ContentResolverService } from "./content-resolver.service.js";
11
+ import type { SpecialistPersona } from "../types/response.js";
12
+ /**
13
+ * Pacote de contexto montado para uma fase
14
+ */
15
+ export interface ContextPackage {
16
+ skillName: string;
17
+ specialist: SpecialistPersona | null;
18
+ skillContent: string;
19
+ templateContent: string;
20
+ checklistContent: string;
21
+ referenceLinks: string[];
22
+ tokenEstimate: number;
23
+ mode: "full" | "summary" | "skeleton";
24
+ }
25
+ export declare class SkillLoaderService {
26
+ private contentResolver;
27
+ constructor(contentResolver: ContentResolverService);
28
+ /**
29
+ * Carrega pacote completo de contexto para uma fase.
30
+ * Retorna null se a fase não tem skill mapeada.
31
+ */
32
+ loadForPhase(faseNome: string, mode?: "economy" | "balanced" | "quality"): Promise<ContextPackage | null>;
33
+ /**
34
+ * Carrega apenas o checklist de gate de uma fase.
35
+ */
36
+ loadChecklist(faseNome: string): Promise<string | null>;
37
+ /**
38
+ * Carrega apenas o template de uma fase.
39
+ */
40
+ loadTemplate(faseNome: string): Promise<string | null>;
41
+ /**
42
+ * Formata ContextPackage como markdown para injeção na resposta.
43
+ */
44
+ formatAsMarkdown(pkg: ContextPackage): string;
45
+ /**
46
+ * Processa conteúdo do SKILL.md respeitando budget.
47
+ * Seleciona seções essenciais primeiro, depois opcionais, depois referência.
48
+ */
49
+ private processSkillContent;
50
+ /**
51
+ * Processa template do entregável respeitando budget.
52
+ * Em economy mode: apenas títulos (skeleton).
53
+ * Em balanced/quality: template completo.
54
+ */
55
+ private processTemplateContent;
56
+ /**
57
+ * Parseia markdown em seções por headings.
58
+ */
59
+ private parseMarkdownSections;
60
+ /**
61
+ * Verifica se o heading da seção corresponde a uma das seções alvo.
62
+ */
63
+ private isSectionMatch;
64
+ /**
65
+ * Extrai apenas os headings de um markdown (skeleton).
66
+ */
67
+ private extractHeadingsOnly;
68
+ /**
69
+ * Estima tokens a partir de caracteres (~4 chars = 1 token).
70
+ */
71
+ private estimateTokens;
72
+ /**
73
+ * Trunca texto para caber no budget de tokens.
74
+ */
75
+ private truncateToTokenBudget;
76
+ }
77
+ /**
78
+ * Factory function para criar SkillLoaderService.
79
+ */
80
+ export declare function createSkillLoader(contentResolver: ContentResolverService): SkillLoaderService;
81
+ //# sourceMappingURL=skill-loader.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loader.service.d.ts","sourceRoot":"","sources":["../../src/services/skill-loader.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;CACzC;AAsDD,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,eAAe,CAAyB;gBAEpC,eAAe,EAAE,sBAAsB;IAInD;;;OAGG;IACG,YAAY,CACd,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,SAAS,GAAG,UAAU,GAAG,SAAsB,GACtD,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA6DjC;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAM7D;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAM5D;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;IAgD7C;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAwD3B;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA4C7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAYhC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,sBAAsB,GAAG,kBAAkB,CAE7F"}