@maestro-ai/mcp-server 5.5.2 → 5.6.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/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/content/skills/specialist-prototipagem-stitch/SKILL.md +12 -6
- package/dist/content/skills/specialist-ux-design/SKILL.md +9 -30
- package/dist/content/skills/specialist-ux-design/resources/checklists/ux-validation.md +1 -4
- package/dist/content/skills/specialist-ux-design/resources/reference/ux-guide.md +2 -2
- package/dist/errors/index.js +2 -2
- package/dist/errors/index.js.map +1 -1
- package/dist/flows/onboarding-orchestrator.js +1 -1
- package/dist/flows/onboarding-orchestrator.js.map +1 -1
- package/dist/handlers/field-normalizer.d.ts +31 -0
- package/dist/handlers/field-normalizer.d.ts.map +1 -0
- package/dist/handlers/field-normalizer.js +70 -0
- package/dist/handlers/field-normalizer.js.map +1 -0
- package/dist/handlers/prd-scorer.d.ts +60 -0
- package/dist/handlers/prd-scorer.d.ts.map +1 -0
- package/dist/handlers/prd-scorer.js +157 -0
- package/dist/handlers/prd-scorer.js.map +1 -0
- package/dist/handlers/prototype-phase-handler.js.map +1 -1
- package/dist/handlers/shared-prompt-handler.js +3 -1
- package/dist/handlers/shared-prompt-handler.js.map +1 -1
- package/dist/handlers/specialist-formatters.d.ts +42 -0
- package/dist/handlers/specialist-formatters.d.ts.map +1 -0
- package/dist/handlers/specialist-formatters.js +272 -0
- package/dist/handlers/specialist-formatters.js.map +1 -0
- package/dist/handlers/specialist-phase-handler.d.ts +1 -10
- package/dist/handlers/specialist-phase-handler.d.ts.map +1 -1
- package/dist/handlers/specialist-phase-handler.js +11 -501
- package/dist/handlers/specialist-phase-handler.js.map +1 -1
- package/dist/legacy-tools.d.ts +21 -0
- package/dist/legacy-tools.d.ts.map +1 -0
- package/dist/legacy-tools.js +377 -0
- package/dist/legacy-tools.js.map +1 -0
- package/dist/router.d.ts +2 -2
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +6 -378
- package/dist/router.js.map +1 -1
- package/dist/server.d.ts +18 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +70 -1
- package/dist/server.js.map +1 -1
- package/dist/services/flow-engine.d.ts.map +1 -1
- package/dist/services/flow-engine.js +1 -2
- package/dist/services/flow-engine.js.map +1 -1
- package/dist/services/onboarding.service.js.map +1 -1
- package/dist/services/scoring-config.d.ts +47 -0
- package/dist/services/scoring-config.d.ts.map +1 -0
- package/dist/services/scoring-config.js +88 -0
- package/dist/services/scoring-config.js.map +1 -0
- package/dist/services/state.service.d.ts.map +1 -1
- package/dist/services/state.service.js +3 -9
- package/dist/services/state.service.js.map +1 -1
- package/dist/services/static-validator.service.d.ts +28 -0
- package/dist/services/static-validator.service.d.ts.map +1 -0
- package/dist/services/static-validator.service.js +55 -0
- package/dist/services/static-validator.service.js.map +1 -0
- package/dist/services/task-decomposer.service.d.ts +59 -0
- package/dist/services/task-decomposer.service.d.ts.map +1 -0
- package/dist/services/task-decomposer.service.js +162 -0
- package/dist/services/task-decomposer.service.js.map +1 -0
- package/dist/services/test-stub-generator.service.d.ts +32 -0
- package/dist/services/test-stub-generator.service.d.ts.map +1 -0
- package/dist/services/test-stub-generator.service.js +71 -0
- package/dist/services/test-stub-generator.service.js.map +1 -0
- package/dist/stdio.js +7 -71
- package/dist/stdio.js.map +1 -1
- package/dist/tools/brainstorm.js.map +1 -1
- package/dist/tools/consolidated/avancar.d.ts.map +1 -1
- package/dist/tools/consolidated/avancar.js +27 -19
- package/dist/tools/consolidated/avancar.js.map +1 -1
- package/dist/tools/discovery.js.map +1 -1
- package/dist/tools/iniciar-projeto.js.map +1 -1
- package/dist/tools/maestro-tool.d.ts.map +1 -1
- package/dist/tools/maestro-tool.js +23 -14
- package/dist/tools/maestro-tool.js.map +1 -1
- package/dist/tools/next-steps-dashboard.js.map +1 -1
- package/dist/tools/prd-writer.js.map +1 -1
- package/dist/tools/proximo.d.ts.map +1 -1
- package/dist/tools/proximo.js +34 -6
- package/dist/tools/proximo.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/ide-paths.d.ts +2 -1
- package/dist/utils/ide-paths.d.ts.map +1 -1
- package/dist/utils/ide-paths.js +48 -9
- package/dist/utils/ide-paths.js.map +1 -1
- package/dist/utils/instructions.d.ts.map +1 -1
- package/dist/utils/instructions.js +4 -3
- package/dist/utils/instructions.js.map +1 -1
- package/package.json +3 -2
- package/dist/content/skills/specialist-ux-design/resources/templates/jornada-usuario.md +0 -126
- package/dist/content/skills/specialist-ux-design/resources/templates/wireframes.md +0 -155
- package/dist/gates/tiers.test.d.ts +0 -2
- package/dist/gates/tiers.test.d.ts.map +0 -1
- package/dist/gates/tiers.test.js +0 -86
- package/dist/gates/tiers.test.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -343
- package/dist/index.js.map +0 -1
- package/dist/tests/aprovar-gate.test.d.ts +0 -2
- package/dist/tests/aprovar-gate.test.d.ts.map +0 -1
- package/dist/tests/aprovar-gate.test.js +0 -113
- package/dist/tests/aprovar-gate.test.js.map +0 -1
- package/dist/tests/brainstorm-prd.test.d.ts +0 -5
- package/dist/tests/brainstorm-prd.test.d.ts.map +0 -1
- package/dist/tests/brainstorm-prd.test.js +0 -291
- package/dist/tests/brainstorm-prd.test.js.map +0 -1
- package/dist/tests/classificacao-progressiva.test.d.ts +0 -5
- package/dist/tests/classificacao-progressiva.test.d.ts.map +0 -1
- package/dist/tests/classificacao-progressiva.test.js +0 -372
- package/dist/tests/classificacao-progressiva.test.js.map +0 -1
- package/dist/tests/content-resolver.test.d.ts +0 -5
- package/dist/tests/content-resolver.test.d.ts.map +0 -1
- package/dist/tests/content-resolver.test.js +0 -157
- package/dist/tests/content-resolver.test.js.map +0 -1
- package/dist/tests/deliverable-validator.test.d.ts +0 -12
- package/dist/tests/deliverable-validator.test.d.ts.map +0 -1
- package/dist/tests/deliverable-validator.test.js +0 -214
- package/dist/tests/deliverable-validator.test.js.map +0 -1
- package/dist/tests/flow-engine.test.d.ts +0 -2
- package/dist/tests/flow-engine.test.d.ts.map +0 -1
- package/dist/tests/flow-engine.test.js +0 -85
- package/dist/tests/flow-engine.test.js.map +0 -1
- package/dist/tests/gate-orientation.test.d.ts +0 -2
- package/dist/tests/gate-orientation.test.d.ts.map +0 -1
- package/dist/tests/gate-orientation.test.js +0 -59
- package/dist/tests/gate-orientation.test.js.map +0 -1
- package/dist/tests/middleware.test.d.ts +0 -5
- package/dist/tests/middleware.test.d.ts.map +0 -1
- package/dist/tests/middleware.test.js +0 -254
- package/dist/tests/middleware.test.js.map +0 -1
- package/dist/tests/migracao-skills.test.d.ts +0 -2
- package/dist/tests/migracao-skills.test.d.ts.map +0 -1
- package/dist/tests/migracao-skills.test.js +0 -208
- package/dist/tests/migracao-skills.test.js.map +0 -1
- package/dist/tests/onboarding-flow.test.d.ts +0 -5
- package/dist/tests/onboarding-flow.test.d.ts.map +0 -1
- package/dist/tests/onboarding-flow.test.js +0 -231
- package/dist/tests/onboarding-flow.test.js.map +0 -1
- package/dist/tests/prd-validation.test.d.ts +0 -6
- package/dist/tests/prd-validation.test.d.ts.map +0 -1
- package/dist/tests/prd-validation.test.js +0 -164
- package/dist/tests/prd-validation.test.js.map +0 -1
- package/dist/tests/readiness-dashboard.test.d.ts +0 -5
- package/dist/tests/readiness-dashboard.test.d.ts.map +0 -1
- package/dist/tests/readiness-dashboard.test.js +0 -252
- package/dist/tests/readiness-dashboard.test.js.map +0 -1
- package/dist/tests/skill-loader.test.d.ts +0 -5
- package/dist/tests/skill-loader.test.d.ts.map +0 -1
- package/dist/tests/skill-loader.test.js +0 -244
- package/dist/tests/skill-loader.test.js.map +0 -1
- package/dist/tests/v52-integration.test.d.ts +0 -14
- package/dist/tests/v52-integration.test.d.ts.map +0 -1
- package/dist/tests/v52-integration.test.js +0 -225
- package/dist/tests/v52-integration.test.js.map +0 -1
- package/dist/tests/watcher.service.test.d.ts +0 -2
- package/dist/tests/watcher.service.test.d.ts.map +0 -1
- package/dist/tests/watcher.service.test.js +0 -119
- package/dist/tests/watcher.service.test.js.map +0 -1
- package/dist/utils/__tests__/prompt-mapper.test.d.ts +0 -2
- package/dist/utils/__tests__/prompt-mapper.test.d.ts.map +0 -1
- package/dist/utils/__tests__/prompt-mapper.test.js +0 -184
- package/dist/utils/__tests__/prompt-mapper.test.js.map +0 -1
|
@@ -1 +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,
|
|
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,OAAO,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oCAAoC,CAChD,SAAiB,EACjB,IAAwC,EACxC,YAAoB,2BAA2B;IAE/C,MAAM,eAAe,GAAyB;QAC1C,SAAS;QACT,MAAM,EAAE,QAAQ;QAChB,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,CAAC;QACnB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC;IAEF,OAAO;QACH,SAAS;QACT,KAAK,EAAE,mBAAmB;QAC1B,eAAe;QACf,oDAAoD;QACpD,eAAe,EAAE,SAAS;QAC1B,eAAe,EAAE,EAAE;QACnB,kBAAkB,EAAE,EAAE;QACtB,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,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,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuração de scoring contextual por tipo de fase.
|
|
3
|
+
*
|
|
4
|
+
* Fases de documento (PRD, Requisitos) têm critérios diferentes de
|
|
5
|
+
* fases de código (Backend, Frontend).
|
|
6
|
+
*
|
|
7
|
+
* @since v6.5
|
|
8
|
+
*/
|
|
9
|
+
export interface ScoreWeights {
|
|
10
|
+
estrutura: number;
|
|
11
|
+
checklist: number;
|
|
12
|
+
qualidade: number;
|
|
13
|
+
threshold: number;
|
|
14
|
+
}
|
|
15
|
+
export type PhaseCategory = 'documento' | 'design' | 'codigo';
|
|
16
|
+
/**
|
|
17
|
+
* Pesos de scoring por categoria de fase.
|
|
18
|
+
*
|
|
19
|
+
* - documento: PRD, Requisitos — foco em checklist e qualidade de conteúdo
|
|
20
|
+
* - design: UX, Arquitetura — foco em estrutura e consistência
|
|
21
|
+
* - codigo: Backend, Frontend, Testes — foco em qualidade (testes, tipos)
|
|
22
|
+
*/
|
|
23
|
+
export declare const SCORE_WEIGHTS: Record<PhaseCategory, ScoreWeights>;
|
|
24
|
+
/**
|
|
25
|
+
* Determina a categoria de uma fase pelo nome.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getPhaseCategory(faseName: string): PhaseCategory;
|
|
28
|
+
/**
|
|
29
|
+
* Retorna os pesos de scoring para uma fase específica.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getScoreWeights(faseName: string): ScoreWeights;
|
|
32
|
+
/**
|
|
33
|
+
* Calcula score de qualidade usando pesos contextuais.
|
|
34
|
+
*
|
|
35
|
+
* @param estruturaScore - Score de estrutura (0-100)
|
|
36
|
+
* @param checklistScore - Score de checklist (0-100)
|
|
37
|
+
* @param qualidadeScore - Score de qualidade/tamanho (0-100)
|
|
38
|
+
* @param faseName - Nome da fase para determinar pesos
|
|
39
|
+
* @returns Score final (0-100) e se está aprovado
|
|
40
|
+
*/
|
|
41
|
+
export declare function calcularScoreContextual(estruturaScore: number, checklistScore: number, qualidadeScore: number, faseName: string): {
|
|
42
|
+
score: number;
|
|
43
|
+
approved: boolean;
|
|
44
|
+
weights: ScoreWeights;
|
|
45
|
+
category: PhaseCategory;
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=scoring-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring-config.d.ts","sourceRoot":"","sources":["../../src/services/scoring-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,YAAY,CAI7D,CAAC;AA6BF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAUhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAG9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACnC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,CAgBtF"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuração de scoring contextual por tipo de fase.
|
|
3
|
+
*
|
|
4
|
+
* Fases de documento (PRD, Requisitos) têm critérios diferentes de
|
|
5
|
+
* fases de código (Backend, Frontend).
|
|
6
|
+
*
|
|
7
|
+
* @since v6.5
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Pesos de scoring por categoria de fase.
|
|
11
|
+
*
|
|
12
|
+
* - documento: PRD, Requisitos — foco em checklist e qualidade de conteúdo
|
|
13
|
+
* - design: UX, Arquitetura — foco em estrutura e consistência
|
|
14
|
+
* - codigo: Backend, Frontend, Testes — foco em qualidade (testes, tipos)
|
|
15
|
+
*/
|
|
16
|
+
export const SCORE_WEIGHTS = {
|
|
17
|
+
documento: { estrutura: 0.20, checklist: 0.40, qualidade: 0.40, threshold: 65 },
|
|
18
|
+
design: { estrutura: 0.30, checklist: 0.30, qualidade: 0.40, threshold: 70 },
|
|
19
|
+
codigo: { estrutura: 0.10, checklist: 0.30, qualidade: 0.60, threshold: 75 },
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Mapeamento de nomes de fase para categorias.
|
|
23
|
+
* Se a fase não for encontrada, usa 'documento' como default.
|
|
24
|
+
*/
|
|
25
|
+
const PHASE_CATEGORY_MAP = {
|
|
26
|
+
// Documentos
|
|
27
|
+
'Produto': 'documento',
|
|
28
|
+
'PRD': 'documento',
|
|
29
|
+
'Requisitos': 'documento',
|
|
30
|
+
'Requisitos Técnicos': 'documento',
|
|
31
|
+
// Design
|
|
32
|
+
'UX/UI': 'design',
|
|
33
|
+
'Design': 'design',
|
|
34
|
+
'Arquitetura': 'design',
|
|
35
|
+
'Arquitetura Técnica': 'design',
|
|
36
|
+
'Prototipagem': 'design',
|
|
37
|
+
// Código
|
|
38
|
+
'Backend': 'codigo',
|
|
39
|
+
'Frontend': 'codigo',
|
|
40
|
+
'Integração': 'codigo',
|
|
41
|
+
'Testes': 'codigo',
|
|
42
|
+
'Deploy': 'codigo',
|
|
43
|
+
'Implementação': 'codigo',
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Determina a categoria de uma fase pelo nome.
|
|
47
|
+
*/
|
|
48
|
+
export function getPhaseCategory(faseName) {
|
|
49
|
+
// Busca exata
|
|
50
|
+
if (PHASE_CATEGORY_MAP[faseName])
|
|
51
|
+
return PHASE_CATEGORY_MAP[faseName];
|
|
52
|
+
// Busca parcial (contém)
|
|
53
|
+
for (const [key, category] of Object.entries(PHASE_CATEGORY_MAP)) {
|
|
54
|
+
if (faseName.toLowerCase().includes(key.toLowerCase()))
|
|
55
|
+
return category;
|
|
56
|
+
}
|
|
57
|
+
return 'documento'; // Default
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Retorna os pesos de scoring para uma fase específica.
|
|
61
|
+
*/
|
|
62
|
+
export function getScoreWeights(faseName) {
|
|
63
|
+
const category = getPhaseCategory(faseName);
|
|
64
|
+
return SCORE_WEIGHTS[category];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Calcula score de qualidade usando pesos contextuais.
|
|
68
|
+
*
|
|
69
|
+
* @param estruturaScore - Score de estrutura (0-100)
|
|
70
|
+
* @param checklistScore - Score de checklist (0-100)
|
|
71
|
+
* @param qualidadeScore - Score de qualidade/tamanho (0-100)
|
|
72
|
+
* @param faseName - Nome da fase para determinar pesos
|
|
73
|
+
* @returns Score final (0-100) e se está aprovado
|
|
74
|
+
*/
|
|
75
|
+
export function calcularScoreContextual(estruturaScore, checklistScore, qualidadeScore, faseName) {
|
|
76
|
+
const weights = getScoreWeights(faseName);
|
|
77
|
+
const category = getPhaseCategory(faseName);
|
|
78
|
+
const score = Math.round((estruturaScore * weights.estrutura) +
|
|
79
|
+
(checklistScore * weights.checklist) +
|
|
80
|
+
(qualidadeScore * weights.qualidade));
|
|
81
|
+
return {
|
|
82
|
+
score,
|
|
83
|
+
approved: score >= weights.threshold,
|
|
84
|
+
weights,
|
|
85
|
+
category,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=scoring-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring-config.js","sourceRoot":"","sources":["../../src/services/scoring-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAwC;IAC9D,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;IAC/E,MAAM,EAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;IAC/E,MAAM,EAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;CAClF,CAAC;AAEF;;;GAGG;AACH,MAAM,kBAAkB,GAAkC;IACtD,aAAa;IACb,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,WAAW;IAClB,YAAY,EAAE,WAAW;IACzB,qBAAqB,EAAE,WAAW;IAElC,SAAS;IACT,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,QAAQ;IAClB,aAAa,EAAE,QAAQ;IACvB,qBAAqB,EAAE,QAAQ;IAC/B,cAAc,EAAE,QAAQ;IAExB,SAAS;IACT,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE,QAAQ;IACpB,YAAY,EAAE,QAAQ;IACtB,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,QAAQ;IAClB,eAAe,EAAE,QAAQ;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC7C,cAAc;IACd,IAAI,kBAAkB,CAAC,QAAQ,CAAC;QAAE,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAEtE,yBAAyB;IACzB,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC/D,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YAAE,OAAO,QAAQ,CAAC;IAC5E,CAAC;IAED,OAAO,WAAW,CAAC,CAAC,UAAU;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC5C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CACnC,cAAsB,EACtB,cAAsB,EACtB,cAAsB,EACtB,QAAgB;IAEhB,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CACpB,CAAC,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;QACpC,CAAC,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;QACpC,CAAC,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CACvC,CAAC;IAEF,OAAO;QACH,KAAK;QACL,QAAQ,EAAE,KAAK,IAAI,OAAO,CAAC,SAAS;QACpC,OAAO;QACP,QAAQ;KACX,CAAC;AACN,CAAC"}
|
|
@@ -1 +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;AAIvD,qBAAa,YAAY;IAIT,OAAO,CAAC,SAAS;IAH7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;gBAEP,SAAS,EAAE,MAAM;IAQrC;;;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;
|
|
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;AAIvD,qBAAa,YAAY;IAIT,OAAO,CAAC,SAAS;IAH7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;gBAEP,SAAS,EAAE,MAAM;IAQrC;;;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;IAYvE;;;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;IAiBjF;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGtB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAElE"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { readFile, writeFile, mkdir } from "fs/promises";
|
|
11
11
|
import { existsSync } from "fs";
|
|
12
|
-
import { join } from "path";
|
|
12
|
+
import { join, dirname } from "path";
|
|
13
13
|
import { parsearEstado, serializarEstado } from "../state/storage.js";
|
|
14
14
|
import { resolveProjectPath } from "../utils/files.js";
|
|
15
15
|
export class StateService {
|
|
@@ -76,10 +76,7 @@ export class StateService {
|
|
|
76
76
|
async saveFile(relativePath, content) {
|
|
77
77
|
try {
|
|
78
78
|
const fullPath = join(this.diretorio, relativePath);
|
|
79
|
-
|
|
80
|
-
// Normalize for Windows
|
|
81
|
-
const dirNormalized = dir.replace(/\//g, join("a", "b").includes("\\") ? "\\" : "/");
|
|
82
|
-
await mkdir(fullPath.substring(0, fullPath.replace(/\\/g, "/").lastIndexOf("/")), { recursive: true });
|
|
79
|
+
await mkdir(dirname(fullPath), { recursive: true });
|
|
83
80
|
await writeFile(fullPath, content, "utf-8");
|
|
84
81
|
return true;
|
|
85
82
|
}
|
|
@@ -95,14 +92,11 @@ export class StateService {
|
|
|
95
92
|
async saveFiles(files) {
|
|
96
93
|
let saved = 0;
|
|
97
94
|
for (const file of files) {
|
|
98
|
-
// Se path é absoluto, usar diretamente; se relativo, usar join
|
|
99
95
|
const fullPath = file.path.startsWith(this.diretorio)
|
|
100
96
|
? file.path
|
|
101
97
|
: join(this.diretorio, file.path);
|
|
102
98
|
try {
|
|
103
|
-
|
|
104
|
-
const dirOnly = dirPart.substring(0, dirPart.lastIndexOf("/"));
|
|
105
|
-
await mkdir(dirOnly, { recursive: true });
|
|
99
|
+
await mkdir(dirname(fullPath), { recursive: true });
|
|
106
100
|
await writeFile(fullPath, file.content, "utf-8");
|
|
107
101
|
saved++;
|
|
108
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.service.js","sourceRoot":"","sources":["../../src/services/state.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"state.service.js","sourceRoot":"","sources":["../../src/services/state.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StaticValidator — Validação estática de código TypeScript
|
|
3
|
+
*
|
|
4
|
+
* Usa a TypeScript Compiler API para verificar sintaxe sem executar tsc.
|
|
5
|
+
* Best-effort: se typescript não estiver disponível, retorna resultado vazio.
|
|
6
|
+
*
|
|
7
|
+
* @since v6.5
|
|
8
|
+
*/
|
|
9
|
+
export interface StaticValidationResult {
|
|
10
|
+
valid: boolean;
|
|
11
|
+
errors: Array<{
|
|
12
|
+
line: number;
|
|
13
|
+
message: string;
|
|
14
|
+
severity: 'error' | 'warning';
|
|
15
|
+
}>;
|
|
16
|
+
stats: {
|
|
17
|
+
totalLines: number;
|
|
18
|
+
imports: number;
|
|
19
|
+
exports: number;
|
|
20
|
+
anyCount: number;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Valida código TypeScript estaticamente.
|
|
25
|
+
* Retorna erros de sintaxe e estatísticas básicas.
|
|
26
|
+
*/
|
|
27
|
+
export declare function validateTypeScript(code: string, fileName?: string): Promise<StaticValidationResult>;
|
|
28
|
+
//# sourceMappingURL=static-validator.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-validator.service.d.ts","sourceRoot":"","sources":["../../src/services/static-validator.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,sBAAsB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IAChF,KAAK,EAAE;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KACpB,CAAC;CACL;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkDpH"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StaticValidator — Validação estática de código TypeScript
|
|
3
|
+
*
|
|
4
|
+
* Usa a TypeScript Compiler API para verificar sintaxe sem executar tsc.
|
|
5
|
+
* Best-effort: se typescript não estiver disponível, retorna resultado vazio.
|
|
6
|
+
*
|
|
7
|
+
* @since v6.5
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Valida código TypeScript estaticamente.
|
|
11
|
+
* Retorna erros de sintaxe e estatísticas básicas.
|
|
12
|
+
*/
|
|
13
|
+
export async function validateTypeScript(code, fileName = 'file.ts') {
|
|
14
|
+
try {
|
|
15
|
+
// Tentar importar typescript dinamicamente
|
|
16
|
+
const ts = await import('typescript');
|
|
17
|
+
const sourceFile = ts.createSourceFile(fileName, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
18
|
+
const errors = [];
|
|
19
|
+
// Estatísticas básicas
|
|
20
|
+
let imports = 0;
|
|
21
|
+
let exports = 0;
|
|
22
|
+
let anyCount = 0;
|
|
23
|
+
function visit(node) {
|
|
24
|
+
if (ts.isImportDeclaration(node))
|
|
25
|
+
imports++;
|
|
26
|
+
if (ts.isExportDeclaration(node) || ts.isExportAssignment(node))
|
|
27
|
+
exports++;
|
|
28
|
+
// Contar 'any' type annotations
|
|
29
|
+
if (node.kind === ts.SyntaxKind.AnyKeyword)
|
|
30
|
+
anyCount++;
|
|
31
|
+
ts.forEachChild(node, visit);
|
|
32
|
+
}
|
|
33
|
+
visit(sourceFile);
|
|
34
|
+
const totalLines = code.split('\n').length;
|
|
35
|
+
return {
|
|
36
|
+
valid: errors.length === 0,
|
|
37
|
+
errors,
|
|
38
|
+
stats: { totalLines, imports, exports, anyCount },
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// typescript não disponível — retorna resultado vazio (best-effort)
|
|
43
|
+
return {
|
|
44
|
+
valid: true, // Não bloqueia se não puder validar
|
|
45
|
+
errors: [],
|
|
46
|
+
stats: {
|
|
47
|
+
totalLines: code.split('\n').length,
|
|
48
|
+
imports: 0,
|
|
49
|
+
exports: 0,
|
|
50
|
+
anyCount: 0,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=static-validator.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-validator.service.js","sourceRoot":"","sources":["../../src/services/static-validator.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,WAAmB,SAAS;IAC/E,IAAI,CAAC;QACD,2CAA2C;QAC3C,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAEtC,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAClC,QAAQ,EACR,IAAI,EACJ,EAAE,CAAC,YAAY,CAAC,MAAM,EACtB,IAAI,EACJ,EAAE,CAAC,UAAU,CAAC,EAAE,CACnB,CAAC;QAEF,MAAM,MAAM,GAAqC,EAAE,CAAC;QAEpD,uBAAuB;QACvB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,SAAS,KAAK,CAAC,IAAS;YACpB,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC5C,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC3E,gCAAgC;YAChC,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,UAAU;gBAAE,QAAQ,EAAE,CAAC;YACvD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,CAAC;QAElB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAE3C,OAAO;YACH,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;YACN,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE;SACpD,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACL,oEAAoE;QACpE,OAAO;YACH,KAAK,EAAE,IAAI,EAAE,oCAAoC;YACjD,MAAM,EAAE,EAAE;YACV,KAAK,EAAE;gBACH,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;gBACnC,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;gBACV,QAAQ,EAAE,CAAC;aACd;SACJ,CAAC;IACN,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskDecomposer — Decompõe entregável de arquitetura em tasks executáveis
|
|
3
|
+
*
|
|
4
|
+
* Recebe o documento de arquitetura e gera uma hierarquia de tasks:
|
|
5
|
+
* - Epics: módulos principais (ex: "API Auth", "API Users")
|
|
6
|
+
* - Stories: funcionalidades dentro do módulo (ex: "Login endpoint")
|
|
7
|
+
* - Tasks: unidades de trabalho (ex: "Criar route handler", "Criar testes")
|
|
8
|
+
*
|
|
9
|
+
* @since v6.5
|
|
10
|
+
*/
|
|
11
|
+
export interface TaskItem {
|
|
12
|
+
id: string;
|
|
13
|
+
type: 'epic' | 'feature' | 'story' | 'task' | 'subtask';
|
|
14
|
+
title: string;
|
|
15
|
+
description: string;
|
|
16
|
+
status: 'todo' | 'in_progress' | 'blocked' | 'review' | 'done';
|
|
17
|
+
priority: 'critical' | 'high' | 'medium' | 'low';
|
|
18
|
+
parent_id?: string;
|
|
19
|
+
children_ids: string[];
|
|
20
|
+
dependencies: string[];
|
|
21
|
+
phase?: number;
|
|
22
|
+
estimate_hours?: number;
|
|
23
|
+
created_at: string;
|
|
24
|
+
updated_at: string;
|
|
25
|
+
tags: string[];
|
|
26
|
+
metadata?: {
|
|
27
|
+
files?: string[];
|
|
28
|
+
tests?: string[];
|
|
29
|
+
acceptance_criteria?: string[];
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Gera uma estrutura de tasks a partir do entregável de arquitetura.
|
|
34
|
+
*
|
|
35
|
+
* A IA fornece o documento de arquitetura como texto. Este serviço extrai:
|
|
36
|
+
* - Seções com ## ou ### como potenciais epics/stories
|
|
37
|
+
* - Listas de itens como tasks
|
|
38
|
+
* - Referências a arquivos como metadata.files
|
|
39
|
+
*
|
|
40
|
+
* @param arquiteturaContent - Conteúdo do documento de arquitetura (Markdown)
|
|
41
|
+
* @param faseNumero - Número da fase de código (ex: 5 para Backend, 6 para Frontend)
|
|
42
|
+
* @returns Array de TaskItem hierárquicas
|
|
43
|
+
*/
|
|
44
|
+
export declare function decomposeArchitectureToTasks(arquiteturaContent: string, faseNumero: number): TaskItem[];
|
|
45
|
+
/**
|
|
46
|
+
* Retorna a próxima task a ser executada (status=todo, sem dependências bloqueadas).
|
|
47
|
+
*/
|
|
48
|
+
export declare function getNextTask(tasks: TaskItem[]): TaskItem | null;
|
|
49
|
+
/**
|
|
50
|
+
* Calcula progresso das tasks para uma fase específica.
|
|
51
|
+
*/
|
|
52
|
+
export declare function getTaskProgress(tasks: TaskItem[], phase: number): {
|
|
53
|
+
total: number;
|
|
54
|
+
done: number;
|
|
55
|
+
inProgress: number;
|
|
56
|
+
blocked: number;
|
|
57
|
+
percentage: number;
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=task-decomposer.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-decomposer.service.d.ts","sourceRoot":"","sources":["../../src/services/task-decomposer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/D,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;KAClC,CAAC;CACL;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,4BAA4B,CACxC,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,MAAM,GACnB,QAAQ,EAAE,CA2EZ;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,GAAG,IAAI,CAS9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACtB,CAaA"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskDecomposer — Decompõe entregável de arquitetura em tasks executáveis
|
|
3
|
+
*
|
|
4
|
+
* Recebe o documento de arquitetura e gera uma hierarquia de tasks:
|
|
5
|
+
* - Epics: módulos principais (ex: "API Auth", "API Users")
|
|
6
|
+
* - Stories: funcionalidades dentro do módulo (ex: "Login endpoint")
|
|
7
|
+
* - Tasks: unidades de trabalho (ex: "Criar route handler", "Criar testes")
|
|
8
|
+
*
|
|
9
|
+
* @since v6.5
|
|
10
|
+
*/
|
|
11
|
+
import { randomUUID } from "crypto";
|
|
12
|
+
/**
|
|
13
|
+
* Gera uma estrutura de tasks a partir do entregável de arquitetura.
|
|
14
|
+
*
|
|
15
|
+
* A IA fornece o documento de arquitetura como texto. Este serviço extrai:
|
|
16
|
+
* - Seções com ## ou ### como potenciais epics/stories
|
|
17
|
+
* - Listas de itens como tasks
|
|
18
|
+
* - Referências a arquivos como metadata.files
|
|
19
|
+
*
|
|
20
|
+
* @param arquiteturaContent - Conteúdo do documento de arquitetura (Markdown)
|
|
21
|
+
* @param faseNumero - Número da fase de código (ex: 5 para Backend, 6 para Frontend)
|
|
22
|
+
* @returns Array de TaskItem hierárquicas
|
|
23
|
+
*/
|
|
24
|
+
export function decomposeArchitectureToTasks(arquiteturaContent, faseNumero) {
|
|
25
|
+
const tasks = [];
|
|
26
|
+
// Extrair seções H2 como epics
|
|
27
|
+
const epicSections = extractSections(arquiteturaContent, 2);
|
|
28
|
+
for (const section of epicSections) {
|
|
29
|
+
const epicId = generateId();
|
|
30
|
+
const childIds = [];
|
|
31
|
+
// Extrair subsections H3 como stories
|
|
32
|
+
const storySections = extractSections(section.content, 3);
|
|
33
|
+
for (const story of storySections) {
|
|
34
|
+
const storyId = generateId();
|
|
35
|
+
childIds.push(storyId);
|
|
36
|
+
// Gerar tasks padrão para cada story
|
|
37
|
+
const taskIds = [];
|
|
38
|
+
// Task: implementação
|
|
39
|
+
const implTaskId = generateId();
|
|
40
|
+
taskIds.push(implTaskId);
|
|
41
|
+
tasks.push(createTask({
|
|
42
|
+
id: implTaskId,
|
|
43
|
+
type: 'task',
|
|
44
|
+
title: `Implementar: ${story.title}`,
|
|
45
|
+
description: `Implementar a funcionalidade "${story.title}" conforme especificado na arquitetura.`,
|
|
46
|
+
parent_id: storyId,
|
|
47
|
+
phase: faseNumero,
|
|
48
|
+
tags: ['implementation'],
|
|
49
|
+
metadata: { acceptance_criteria: extractListItems(story.content) },
|
|
50
|
+
}));
|
|
51
|
+
// Task: testes
|
|
52
|
+
const testTaskId = generateId();
|
|
53
|
+
taskIds.push(testTaskId);
|
|
54
|
+
tasks.push(createTask({
|
|
55
|
+
id: testTaskId,
|
|
56
|
+
type: 'task',
|
|
57
|
+
title: `Testes: ${story.title}`,
|
|
58
|
+
description: `Criar testes unitários e de integração para "${story.title}".`,
|
|
59
|
+
parent_id: storyId,
|
|
60
|
+
phase: faseNumero,
|
|
61
|
+
dependencies: [implTaskId],
|
|
62
|
+
tags: ['testing'],
|
|
63
|
+
}));
|
|
64
|
+
// Story
|
|
65
|
+
tasks.push(createTask({
|
|
66
|
+
id: storyId,
|
|
67
|
+
type: 'story',
|
|
68
|
+
title: story.title,
|
|
69
|
+
description: story.content.substring(0, 200),
|
|
70
|
+
parent_id: epicId,
|
|
71
|
+
children_ids: taskIds,
|
|
72
|
+
phase: faseNumero,
|
|
73
|
+
tags: ['story'],
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
// Epic
|
|
77
|
+
tasks.push(createTask({
|
|
78
|
+
id: epicId,
|
|
79
|
+
type: 'epic',
|
|
80
|
+
title: section.title,
|
|
81
|
+
description: `Epic: ${section.title}`,
|
|
82
|
+
children_ids: childIds,
|
|
83
|
+
phase: faseNumero,
|
|
84
|
+
priority: 'high',
|
|
85
|
+
tags: ['epic'],
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
return tasks;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Retorna a próxima task a ser executada (status=todo, sem dependências bloqueadas).
|
|
92
|
+
*/
|
|
93
|
+
export function getNextTask(tasks) {
|
|
94
|
+
const doneTasks = new Set(tasks.filter(t => t.status === 'done').map(t => t.id));
|
|
95
|
+
return tasks.find(t => {
|
|
96
|
+
if (t.type !== 'task' && t.type !== 'subtask')
|
|
97
|
+
return false;
|
|
98
|
+
if (t.status !== 'todo')
|
|
99
|
+
return false;
|
|
100
|
+
// Verificar se todas as dependências estão done
|
|
101
|
+
return t.dependencies.every(dep => doneTasks.has(dep));
|
|
102
|
+
}) || null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Calcula progresso das tasks para uma fase específica.
|
|
106
|
+
*/
|
|
107
|
+
export function getTaskProgress(tasks, phase) {
|
|
108
|
+
const phaseTasks = tasks.filter(t => t.phase === phase && (t.type === 'task' || t.type === 'subtask'));
|
|
109
|
+
const done = phaseTasks.filter(t => t.status === 'done').length;
|
|
110
|
+
const inProgress = phaseTasks.filter(t => t.status === 'in_progress').length;
|
|
111
|
+
const blocked = phaseTasks.filter(t => t.status === 'blocked').length;
|
|
112
|
+
return {
|
|
113
|
+
total: phaseTasks.length,
|
|
114
|
+
done,
|
|
115
|
+
inProgress,
|
|
116
|
+
blocked,
|
|
117
|
+
percentage: phaseTasks.length > 0 ? Math.round((done / phaseTasks.length) * 100) : 0,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// === HELPERS ===
|
|
121
|
+
function generateId() {
|
|
122
|
+
return `task-${randomUUID().substring(0, 8)}`;
|
|
123
|
+
}
|
|
124
|
+
function extractSections(markdown, level) {
|
|
125
|
+
const prefix = '#'.repeat(level) + ' ';
|
|
126
|
+
const lines = markdown.split('\n');
|
|
127
|
+
const sections = [];
|
|
128
|
+
let current = null;
|
|
129
|
+
for (const line of lines) {
|
|
130
|
+
if (line.startsWith(prefix)) {
|
|
131
|
+
if (current)
|
|
132
|
+
sections.push(current);
|
|
133
|
+
current = { title: line.substring(prefix.length).trim(), content: '' };
|
|
134
|
+
}
|
|
135
|
+
else if (current) {
|
|
136
|
+
current.content += line + '\n';
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (current)
|
|
140
|
+
sections.push(current);
|
|
141
|
+
return sections;
|
|
142
|
+
}
|
|
143
|
+
function extractListItems(content) {
|
|
144
|
+
return content.split('\n')
|
|
145
|
+
.filter(line => line.trim().startsWith('- ') || line.trim().startsWith('* '))
|
|
146
|
+
.map(line => line.trim().replace(/^[-*]\s+/, ''));
|
|
147
|
+
}
|
|
148
|
+
function createTask(partial) {
|
|
149
|
+
const now = new Date().toISOString();
|
|
150
|
+
return {
|
|
151
|
+
description: '',
|
|
152
|
+
status: 'todo',
|
|
153
|
+
priority: 'medium',
|
|
154
|
+
children_ids: [],
|
|
155
|
+
dependencies: [],
|
|
156
|
+
tags: [],
|
|
157
|
+
created_at: now,
|
|
158
|
+
updated_at: now,
|
|
159
|
+
...partial,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=task-decomposer.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-decomposer.service.js","sourceRoot":"","sources":["../../src/services/task-decomposer.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestStubGenerator — Gera stubs de teste a partir de tasks
|
|
3
|
+
*
|
|
4
|
+
* Para cada task de implementação, gera um arquivo .test.ts com
|
|
5
|
+
* describe/it blocks baseados nos acceptance criteria e na descrição.
|
|
6
|
+
*
|
|
7
|
+
* Os testes são gerados com `it.todo()` para que a IA preencha.
|
|
8
|
+
*
|
|
9
|
+
* @since v6.5
|
|
10
|
+
*/
|
|
11
|
+
import type { TaskItem } from "./task-decomposer.service.js";
|
|
12
|
+
/**
|
|
13
|
+
* Gera conteúdo de arquivo de teste stub para uma task.
|
|
14
|
+
*
|
|
15
|
+
* @param task - Task de implementação
|
|
16
|
+
* @param framework - Framework de teste ('vitest' | 'jest')
|
|
17
|
+
* @returns Conteúdo do arquivo .test.ts
|
|
18
|
+
*/
|
|
19
|
+
export declare function generateTestStub(task: TaskItem, framework?: 'vitest' | 'jest'): string;
|
|
20
|
+
/**
|
|
21
|
+
* Gera stubs de teste para todas as tasks de implementação de uma fase.
|
|
22
|
+
*
|
|
23
|
+
* @param tasks - Todas as tasks do projeto
|
|
24
|
+
* @param phase - Número da fase
|
|
25
|
+
* @param testDir - Diretório base para os arquivos de teste
|
|
26
|
+
* @returns Array de { path, content } para cada arquivo de teste
|
|
27
|
+
*/
|
|
28
|
+
export declare function generatePhaseTestStubs(tasks: TaskItem[], phase: number, testDir?: string): Array<{
|
|
29
|
+
path: string;
|
|
30
|
+
content: string;
|
|
31
|
+
}>;
|
|
32
|
+
//# sourceMappingURL=test-stub-generator.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-stub-generator.service.d.ts","sourceRoot":"","sources":["../../src/services/test-stub-generator.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE7D;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,QAAQ,EACd,SAAS,GAAE,QAAQ,GAAG,MAAiB,GACxC,MAAM,CAyBR;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAClC,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAoB,GAC9B,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAY1C"}
|