specforge-mcp 0.2.2 → 0.4.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/engine/skill-generator/sections-skills.d.ts +4 -0
- package/dist/engine/skill-generator/sections-skills.d.ts.map +1 -0
- package/dist/engine/skill-generator/sections-skills.js +51 -0
- package/dist/engine/skill-generator/sections-skills.js.map +1 -0
- package/dist/engine/skill-generator/sections.d.ts +1 -0
- package/dist/engine/skill-generator/sections.d.ts.map +1 -1
- package/dist/engine/skill-generator/sections.js +2 -1
- package/dist/engine/skill-generator/sections.js.map +1 -1
- package/dist/engine/skill-generator.d.ts +3 -1
- package/dist/engine/skill-generator.d.ts.map +1 -1
- package/dist/engine/skill-generator.js +11 -2
- package/dist/engine/skill-generator.js.map +1 -1
- package/dist/engine/test-plan-generator.d.ts +3 -0
- package/dist/engine/test-plan-generator.d.ts.map +1 -0
- package/dist/engine/test-plan-generator.js +166 -0
- package/dist/engine/test-plan-generator.js.map +1 -0
- package/dist/engine/test-spec-generator.d.ts +8 -0
- package/dist/engine/test-spec-generator.d.ts.map +1 -0
- package/dist/engine/test-spec-generator.js +348 -0
- package/dist/engine/test-spec-generator.js.map +1 -0
- package/dist/tools/generate-rules.d.ts.map +1 -1
- package/dist/tools/generate-rules.js +20 -0
- package/dist/tools/generate-rules.js.map +1 -1
- package/dist/tools/generate-tests/generators/database-test-generator.d.ts +11 -0
- package/dist/tools/generate-tests/generators/database-test-generator.d.ts.map +1 -0
- package/dist/tools/generate-tests/generators/database-test-generator.js +329 -0
- package/dist/tools/generate-tests/generators/database-test-generator.js.map +1 -0
- package/dist/tools/generate-tests/generators/graphql-test-generator.d.ts +17 -0
- package/dist/tools/generate-tests/generators/graphql-test-generator.d.ts.map +1 -0
- package/dist/tools/generate-tests/generators/graphql-test-generator.js +235 -0
- package/dist/tools/generate-tests/generators/graphql-test-generator.js.map +1 -0
- package/dist/tools/generate-tests/generators/grpc-test-generator.d.ts +17 -0
- package/dist/tools/generate-tests/generators/grpc-test-generator.d.ts.map +1 -0
- package/dist/tools/generate-tests/generators/grpc-test-generator.js +283 -0
- package/dist/tools/generate-tests/generators/grpc-test-generator.js.map +1 -0
- package/dist/tools/generate-tests/generators/microservices-test-generator.d.ts +10 -0
- package/dist/tools/generate-tests/generators/microservices-test-generator.d.ts.map +1 -0
- package/dist/tools/generate-tests/generators/microservices-test-generator.js +341 -0
- package/dist/tools/generate-tests/generators/microservices-test-generator.js.map +1 -0
- package/dist/tools/generate-tests/generators/security-test-generator.d.ts +11 -0
- package/dist/tools/generate-tests/generators/security-test-generator.d.ts.map +1 -0
- package/dist/tools/generate-tests/generators/security-test-generator.js +318 -0
- package/dist/tools/generate-tests/generators/security-test-generator.js.map +1 -0
- package/dist/tools/generate-tests/generators/visual-regression-generator.d.ts +19 -0
- package/dist/tools/generate-tests/generators/visual-regression-generator.d.ts.map +1 -0
- package/dist/tools/generate-tests/generators/visual-regression-generator.js +304 -0
- package/dist/tools/generate-tests/generators/visual-regression-generator.js.map +1 -0
- package/dist/tools/generate-tests/generators/websocket-test-generator.d.ts +17 -0
- package/dist/tools/generate-tests/generators/websocket-test-generator.d.ts.map +1 -0
- package/dist/tools/generate-tests/generators/websocket-test-generator.js +243 -0
- package/dist/tools/generate-tests/generators/websocket-test-generator.js.map +1 -0
- package/dist/tools/generate-tests/plan-mode-handler.d.ts +3 -0
- package/dist/tools/generate-tests/plan-mode-handler.d.ts.map +1 -0
- package/dist/tools/generate-tests/plan-mode-handler.js +54 -0
- package/dist/tools/generate-tests/plan-mode-handler.js.map +1 -0
- package/dist/tools/generate-tests/spec-dispatcher.d.ts.map +1 -1
- package/dist/tools/generate-tests/spec-dispatcher.js +46 -0
- package/dist/tools/generate-tests/spec-dispatcher.js.map +1 -1
- package/dist/tools/generate-tests/test-helpers.d.ts +8 -0
- package/dist/tools/generate-tests/test-helpers.d.ts.map +1 -0
- package/dist/tools/generate-tests/test-helpers.js +120 -0
- package/dist/tools/generate-tests/test-helpers.js.map +1 -0
- package/dist/tools/generate-tests.d.ts.map +1 -1
- package/dist/tools/generate-tests.js +6 -118
- package/dist/tools/generate-tests.js.map +1 -1
- package/dist/tools/init-project/handler.d.ts.map +1 -1
- package/dist/tools/init-project/handler.js +29 -0
- package/dist/tools/init-project/handler.js.map +1 -1
- package/dist/types/stack/recommend.d.ts +2 -0
- package/dist/types/stack/recommend.d.ts.map +1 -1
- package/dist/types/testing.d.ts +51 -0
- package/dist/types/testing.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/i18n/messages/en.json +333 -0
- package/src/i18n/messages/es.json +333 -0
- package/src/i18n/messages/pt.json +333 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { RecommendedSkill, RuleSection } from '../../types/index.js';
|
|
2
|
+
export declare function buildRecommendedSkillsSection(skills: RecommendedSkill[]): RuleSection | null;
|
|
3
|
+
export declare function injectManagedSkillsBlock(existingContent: string, skills: RecommendedSkill[]): string;
|
|
4
|
+
//# sourceMappingURL=sections-skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections-skills.d.ts","sourceRoot":"","sources":["../../../src/engine/skill-generator/sections-skills.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAK1E,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,WAAW,GAAG,IAAI,CAc5F;AAED,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,gBAAgB,EAAE,GACzB,MAAM,CAkBR"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Build recommended skills section for generated rules files
|
|
2
|
+
// Uses managed markers so updates don't destroy user content
|
|
3
|
+
const MANAGED_START = '<!-- specforge:skills:start -->';
|
|
4
|
+
const MANAGED_END = '<!-- specforge:skills:end -->';
|
|
5
|
+
export function buildRecommendedSkillsSection(skills) {
|
|
6
|
+
if (skills.length === 0) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const rules = skills.map((s) => ({
|
|
10
|
+
rule: `\`${s.name}\` — ${s.description}. Install: \`${s.installCommand}\`. ${s.justification}`,
|
|
11
|
+
enforcement: 'recommended',
|
|
12
|
+
}));
|
|
13
|
+
return {
|
|
14
|
+
title: 'Recommended Skills (auto-managed by SpecForge)',
|
|
15
|
+
rules,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function injectManagedSkillsBlock(existingContent, skills) {
|
|
19
|
+
const block = buildSkillsMarkdownBlock(skills);
|
|
20
|
+
const startIdx = existingContent.indexOf(MANAGED_START);
|
|
21
|
+
const endIdx = existingContent.indexOf(MANAGED_END);
|
|
22
|
+
if (startIdx !== -1 && endIdx !== -1) {
|
|
23
|
+
// Replace existing managed block
|
|
24
|
+
return (existingContent.substring(0, startIdx) +
|
|
25
|
+
block +
|
|
26
|
+
existingContent.substring(endIdx + MANAGED_END.length));
|
|
27
|
+
}
|
|
28
|
+
// Append managed block at the end
|
|
29
|
+
const trimmed = existingContent.trimEnd();
|
|
30
|
+
return `${trimmed}\n\n${block}\n`;
|
|
31
|
+
}
|
|
32
|
+
function buildSkillsMarkdownBlock(skills) {
|
|
33
|
+
if (skills.length === 0) {
|
|
34
|
+
return '';
|
|
35
|
+
}
|
|
36
|
+
const lines = [
|
|
37
|
+
MANAGED_START,
|
|
38
|
+
'## Recommended Skills (auto-managed by SpecForge)',
|
|
39
|
+
'',
|
|
40
|
+
'| Skill | Description | Install |',
|
|
41
|
+
'|-------|-------------|---------|',
|
|
42
|
+
];
|
|
43
|
+
for (const s of skills) {
|
|
44
|
+
lines.push(`| ${s.name} | ${s.description} | \`${s.installCommand}\` |`);
|
|
45
|
+
}
|
|
46
|
+
lines.push('');
|
|
47
|
+
lines.push(`*Auto-detected from project stack. Updated: ${new Date().toISOString().split('T')[0]}*`);
|
|
48
|
+
lines.push(MANAGED_END);
|
|
49
|
+
return lines.join('\n');
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=sections-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections-skills.js","sourceRoot":"","sources":["../../../src/engine/skill-generator/sections-skills.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,6DAA6D;AAI7D,MAAM,aAAa,GAAG,iCAAiC,CAAC;AACxD,MAAM,WAAW,GAAG,+BAA+B,CAAC;AAEpD,MAAM,UAAU,6BAA6B,CAAC,MAA0B;IACtE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,WAAW,gBAAgB,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC,aAAa,EAAE;QAC9F,WAAW,EAAE,aAAsB;KACpC,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,KAAK,EAAE,gDAAgD;QACvD,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,eAAuB,EACvB,MAA0B;IAE1B,MAAM,KAAK,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAEpD,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACrC,iCAAiC;QACjC,OAAO,CACL,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC;YACtC,KAAK;YACL,eAAe,CAAC,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CACvD,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,CAAC;IAC1C,OAAO,GAAG,OAAO,OAAO,KAAK,IAAI,CAAC;AACpC,CAAC;AAED,SAAS,wBAAwB,CAAC,MAA0B;IAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAa;QACtB,aAAa;QACb,mDAAmD;QACnD,EAAE;QACF,mCAAmC;QACnC,mCAAmC;KACpC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,WAAW,QAAQ,CAAC,CAAC,cAAc,MAAM,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,+CAA+C,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CACzF,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAExB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { buildProjectOverviewSection, buildArchitectureSection, buildConventionsSection, buildQualitySection, buildWorkflowSection, buildConstitutionSection, } from './sections-knowledge.js';
|
|
2
2
|
export { buildSessionOptimizationSection } from './sections-platform.js';
|
|
3
|
+
export { buildRecommendedSkillsSection, injectManagedSkillsBlock } from './sections-skills.js';
|
|
3
4
|
//# sourceMappingURL=sections.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sections.d.ts","sourceRoot":"","sources":["../../../src/engine/skill-generator/sections.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"sections.d.ts","sourceRoot":"","sources":["../../../src/engine/skill-generator/sections.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AAEzE,OAAO,EAAE,6BAA6B,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// Barrel re-export — split into sections-knowledge.ts
|
|
1
|
+
// Barrel re-export — split into sections-knowledge.ts, sections-platform.ts, sections-skills.ts
|
|
2
2
|
export { buildProjectOverviewSection, buildArchitectureSection, buildConventionsSection, buildQualitySection, buildWorkflowSection, buildConstitutionSection, } from './sections-knowledge.js';
|
|
3
3
|
export { buildSessionOptimizationSection } from './sections-platform.js';
|
|
4
|
+
export { buildRecommendedSkillsSection, injectManagedSkillsBlock } from './sections-skills.js';
|
|
4
5
|
//# sourceMappingURL=sections.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sections.js","sourceRoot":"","sources":["../../../src/engine/skill-generator/sections.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sections.js","sourceRoot":"","sources":["../../../src/engine/skill-generator/sections.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAEhG,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AAEzE,OAAO,EAAE,6BAA6B,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { AgentPlatform, GenerateSkillResult, GenerateRulesResult, ProjectKnowledge, Constitution } from '../types/index.js';
|
|
1
|
+
import type { AgentPlatform, GenerateSkillResult, GenerateRulesResult, ProjectKnowledge, Constitution, RecommendedSkill } from '../types/index.js';
|
|
2
2
|
export { getAgentConfig, detectAgentPlatform, detectAgentPlatformFromFiles, } from './skill-generator/detect.js';
|
|
3
3
|
export { buildSessionOptimizationSection } from './skill-generator/sections.js';
|
|
4
|
+
export { injectManagedSkillsBlock } from './skill-generator/sections.js';
|
|
4
5
|
export { generateOrchestrationScript } from './skill-generator/skills.js';
|
|
5
6
|
/**
|
|
6
7
|
* Generate a skill file for a specific AI agent platform.
|
|
@@ -15,5 +16,6 @@ export declare function generateRules(platform: AgentPlatform, knowledge: Projec
|
|
|
15
16
|
includeQuality?: boolean;
|
|
16
17
|
includeWorkflow?: boolean;
|
|
17
18
|
customRules?: string[];
|
|
19
|
+
recommendedSkills?: RecommendedSkill[];
|
|
18
20
|
}): Promise<GenerateRulesResult>;
|
|
19
21
|
//# sourceMappingURL=skill-generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-generator.d.ts","sourceRoot":"","sources":["../../src/engine/skill-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EAEnB,gBAAgB,EAChB,YAAY,
|
|
1
|
+
{"version":3,"file":"skill-generator.d.ts","sourceRoot":"","sources":["../../src/engine/skill-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EAEnB,gBAAgB,EAChB,YAAY,EAEZ,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAyB3B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAI1E;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,eAAe,GAAG,cAAc,GAAG,UAAU,GAAG,YAAY,EACvE,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,EAC3B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,mBAAmB,CAAC,CAwC9B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,gBAAgB,EAC3B,YAAY,CAAC,EAAE,YAAY,EAC3B,OAAO,GAAE;IACP,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACnC,GACL,OAAO,CAAC,mBAAmB,CAAC,CAgH9B"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
// SpecForge — Skill & Rules Generator Engine
|
|
2
2
|
// Orchestrator: imports from subdirectory modules and re-exports public API
|
|
3
3
|
import { loadPlatforms } from './skill-generator/detect.js';
|
|
4
|
-
import { buildProjectOverviewSection, buildArchitectureSection, buildConventionsSection, buildQualitySection, buildWorkflowSection, buildConstitutionSection, buildSessionOptimizationSection as _buildSessionOptimizationSection, } from './skill-generator/sections.js';
|
|
4
|
+
import { buildProjectOverviewSection, buildArchitectureSection, buildConventionsSection, buildQualitySection, buildWorkflowSection, buildConstitutionSection, buildSessionOptimizationSection as _buildSessionOptimizationSection, buildRecommendedSkillsSection, } from './skill-generator/sections.js';
|
|
5
5
|
import { formatRulesForPlatform } from './skill-generator/format.js';
|
|
6
6
|
import { generateProjectRulesSkill, generateDomainSkill, generateWorkflowSkill, generateConventionSkill, generateSddWorkflowSkillContent, buildInstallInstructions, generateOrchestrationScript as _generateOrchestrationScript, } from './skill-generator/skills.js';
|
|
7
7
|
// Re-exports for consumers who import from skill-generator.js
|
|
8
8
|
export { getAgentConfig, detectAgentPlatform, detectAgentPlatformFromFiles, } from './skill-generator/detect.js';
|
|
9
9
|
export { buildSessionOptimizationSection } from './skill-generator/sections.js';
|
|
10
|
+
export { injectManagedSkillsBlock } from './skill-generator/sections.js';
|
|
10
11
|
export { generateOrchestrationScript } from './skill-generator/skills.js';
|
|
11
12
|
// === Public API ===
|
|
12
13
|
/**
|
|
@@ -61,9 +62,10 @@ export async function generateRules(platform, knowledge, constitution, options =
|
|
|
61
62
|
additionalFiles: [],
|
|
62
63
|
rulesCount: 0,
|
|
63
64
|
categories: [],
|
|
65
|
+
recommendedSkills: [],
|
|
64
66
|
};
|
|
65
67
|
}
|
|
66
|
-
const { includeArchitecture = true, includeConventions = true, includeQuality = true, includeWorkflow = true, customRules = [], } = options;
|
|
68
|
+
const { includeArchitecture = true, includeConventions = true, includeQuality = true, includeWorkflow = true, customRules = [], recommendedSkills = [], } = options;
|
|
67
69
|
const sections = [];
|
|
68
70
|
const categories = [];
|
|
69
71
|
// Project overview
|
|
@@ -100,6 +102,12 @@ export async function generateRules(platform, knowledge, constitution, options =
|
|
|
100
102
|
sections.push(sessionSection);
|
|
101
103
|
categories.push('session-optimization');
|
|
102
104
|
}
|
|
105
|
+
// Recommended skills (auto-fetched from skills.sh)
|
|
106
|
+
const skillsSection = buildRecommendedSkillsSection(recommendedSkills);
|
|
107
|
+
if (skillsSection) {
|
|
108
|
+
sections.push(skillsSection);
|
|
109
|
+
categories.push('recommended-skills');
|
|
110
|
+
}
|
|
103
111
|
// Custom rules
|
|
104
112
|
if (customRules.length > 0) {
|
|
105
113
|
sections.push({
|
|
@@ -130,6 +138,7 @@ export async function generateRules(platform, knowledge, constitution, options =
|
|
|
130
138
|
additionalFiles,
|
|
131
139
|
rulesCount,
|
|
132
140
|
categories,
|
|
141
|
+
recommendedSkills,
|
|
133
142
|
};
|
|
134
143
|
}
|
|
135
144
|
//# sourceMappingURL=skill-generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-generator.js","sourceRoot":"","sources":["../../src/engine/skill-generator.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,4EAA4E;
|
|
1
|
+
{"version":3,"file":"skill-generator.js","sourceRoot":"","sources":["../../src/engine/skill-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-plan-generator.d.ts","sourceRoot":"","sources":["../../src/engine/test-plan-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAiB,MAAM,mBAAmB,CAAC;AA4JnF,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,gBAAgB,GAAG,QAAQ,CAkGtE"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// Hours estimate per layer type
|
|
2
|
+
const LAYER_HOURS = {
|
|
3
|
+
unit: 2,
|
|
4
|
+
integration: 4,
|
|
5
|
+
e2e: 6,
|
|
6
|
+
contract: 4,
|
|
7
|
+
visual: 3,
|
|
8
|
+
load: 3,
|
|
9
|
+
security: 4,
|
|
10
|
+
a11y: 2,
|
|
11
|
+
};
|
|
12
|
+
// Priority order (lower index = higher priority for sort)
|
|
13
|
+
const PRIORITY_ORDER = {
|
|
14
|
+
critical: 0,
|
|
15
|
+
high: 1,
|
|
16
|
+
medium: 2,
|
|
17
|
+
low: 3,
|
|
18
|
+
};
|
|
19
|
+
function hasUiApps(knowledge) {
|
|
20
|
+
return knowledge.apps.some((a) => a.type === 'frontend' ||
|
|
21
|
+
a.type === 'mobile' ||
|
|
22
|
+
a.type === 'ios' ||
|
|
23
|
+
a.type === 'android' ||
|
|
24
|
+
a.type === 'desktop');
|
|
25
|
+
}
|
|
26
|
+
function hasWebUiApps(knowledge) {
|
|
27
|
+
return knowledge.apps.some((a) => a.type === 'frontend');
|
|
28
|
+
}
|
|
29
|
+
function hasBackendApps(knowledge) {
|
|
30
|
+
return knowledge.apps.some((a) => a.type === 'backend' || a.type === 'worker');
|
|
31
|
+
}
|
|
32
|
+
function hasFullstackApps(knowledge) {
|
|
33
|
+
return knowledge.apps.some((a) => a.type === 'frontend' || a.type === 'backend');
|
|
34
|
+
}
|
|
35
|
+
function isMicroservices(knowledge) {
|
|
36
|
+
const arch = knowledge.architecture.primary;
|
|
37
|
+
return (arch === 'microservices' ||
|
|
38
|
+
knowledge.apps.filter((a) => a.type === 'backend' || a.type === 'worker').length > 1);
|
|
39
|
+
}
|
|
40
|
+
function hasAuth(knowledge) {
|
|
41
|
+
const authTerms = ['auth', 'jwt', 'oauth', 'passport', 'keycloak', 'auth0', 'clerk', 'supabase'];
|
|
42
|
+
return authTerms.some((term) => knowledge.stack.some((s) => s.toLowerCase().includes(term)));
|
|
43
|
+
}
|
|
44
|
+
function detectFrameworksForLayer(layerType, knowledge) {
|
|
45
|
+
const lang = knowledge.language;
|
|
46
|
+
const unitFrameworks = {
|
|
47
|
+
typescript: ['vitest', 'jest'],
|
|
48
|
+
javascript: ['vitest', 'jest'],
|
|
49
|
+
python: ['pytest'],
|
|
50
|
+
go: ['go test'],
|
|
51
|
+
rust: ['cargo test'],
|
|
52
|
+
java: ['JUnit 5'],
|
|
53
|
+
kotlin: ['JUnit 5', 'Kotest'],
|
|
54
|
+
swift: ['XCTest'],
|
|
55
|
+
dart: ['flutter_test'],
|
|
56
|
+
csharp: ['xUnit', 'NUnit'],
|
|
57
|
+
php: ['PHPUnit'],
|
|
58
|
+
ruby: ['RSpec'],
|
|
59
|
+
};
|
|
60
|
+
const e2eFrameworks = knowledge.stack.includes('playwright')
|
|
61
|
+
? ['Playwright']
|
|
62
|
+
: knowledge.stack.includes('cypress')
|
|
63
|
+
? ['Cypress']
|
|
64
|
+
: ['Playwright'];
|
|
65
|
+
const frameworkMap = {
|
|
66
|
+
unit: unitFrameworks[lang] ?? ['vitest'],
|
|
67
|
+
integration: unitFrameworks[lang] ?? ['vitest'],
|
|
68
|
+
e2e: e2eFrameworks,
|
|
69
|
+
contract: ['Pact', 'Schemathesis'],
|
|
70
|
+
visual: ['Playwright', 'Percy', 'Chromatic'],
|
|
71
|
+
load: ['k6', 'Locust', 'Gatling'],
|
|
72
|
+
security: ['OWASP ZAP', 'Trivy', 'Snyk'],
|
|
73
|
+
a11y: ['axe-core', 'Playwright', 'pa11y'],
|
|
74
|
+
};
|
|
75
|
+
return frameworkMap[layerType] ?? [];
|
|
76
|
+
}
|
|
77
|
+
function detectToolsForLayer(layerType, knowledge) {
|
|
78
|
+
const toolMap = {
|
|
79
|
+
unit: ['Coverage reporter', 'Test runner'],
|
|
80
|
+
integration: ['Supertest', 'Testcontainers', 'Docker Compose'],
|
|
81
|
+
e2e: knowledge.stack.includes('playwright') ? ['Playwright', 'playwright MCP'] : ['Playwright'],
|
|
82
|
+
contract: ['Pact Broker', 'Swagger Validator'],
|
|
83
|
+
visual: ['Percy', 'Chromatic', 'BackstopJS'],
|
|
84
|
+
load: ['k6', 'Artillery', 'autocannon'],
|
|
85
|
+
security: ['OWASP ZAP', 'Semgrep', 'Snyk', 'Trivy'],
|
|
86
|
+
a11y: ['axe DevTools', 'Lighthouse CI', 'chrome-devtools MCP'],
|
|
87
|
+
};
|
|
88
|
+
const tools = toolMap[layerType] ?? [];
|
|
89
|
+
// Add language-specific tools
|
|
90
|
+
if (layerType === 'unit' && knowledge.language === 'python') {
|
|
91
|
+
return ['pytest-cov', 'pytest-mock'];
|
|
92
|
+
}
|
|
93
|
+
if (layerType === 'integration' && knowledge.database !== 'unknown') {
|
|
94
|
+
return [...tools, 'Testcontainers'];
|
|
95
|
+
}
|
|
96
|
+
return tools;
|
|
97
|
+
}
|
|
98
|
+
function buildLayer(type, needed, reason, priority, knowledge) {
|
|
99
|
+
return {
|
|
100
|
+
type,
|
|
101
|
+
needed,
|
|
102
|
+
reason,
|
|
103
|
+
priority,
|
|
104
|
+
estimatedHours: needed ? LAYER_HOURS[type] : 0,
|
|
105
|
+
tools: needed ? detectToolsForLayer(type, knowledge) : [],
|
|
106
|
+
frameworks: needed ? detectFrameworksForLayer(type, knowledge) : [],
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function buildMcpRecommendations(knowledge) {
|
|
110
|
+
const recs = [];
|
|
111
|
+
if (hasWebUiApps(knowledge) || hasUiApps(knowledge)) {
|
|
112
|
+
recs.push('playwright MCP — browser automation for e2e and visual tests');
|
|
113
|
+
}
|
|
114
|
+
if (hasUiApps(knowledge)) {
|
|
115
|
+
recs.push('chrome-devtools MCP — accessibility audits and performance snapshots');
|
|
116
|
+
}
|
|
117
|
+
return recs;
|
|
118
|
+
}
|
|
119
|
+
export function generateTestPlan(knowledge) {
|
|
120
|
+
const hasDatabase = knowledge.database !== 'unknown';
|
|
121
|
+
const hasExternalServices = knowledge.externalServices.length > 0;
|
|
122
|
+
const hasApiContracts = knowledge.apiContracts.length > 0;
|
|
123
|
+
const hasMultipleLayers = knowledge.layers.length > 1 || knowledge.apps.length > 1;
|
|
124
|
+
const noApps = knowledge.apps.length === 0;
|
|
125
|
+
const layers = [
|
|
126
|
+
buildLayer('unit', true, 'Every project needs unit tests for business logic', 'high', knowledge),
|
|
127
|
+
buildLayer('integration', hasMultipleLayers || hasExternalServices || hasDatabase, hasDatabase
|
|
128
|
+
? 'Database detected — integration tests required'
|
|
129
|
+
: hasExternalServices
|
|
130
|
+
? 'External services detected — integration tests required'
|
|
131
|
+
: 'Multiple layers detected — integration tests required', 'high', knowledge),
|
|
132
|
+
buildLayer('e2e', hasUiApps(knowledge) || hasFullstackApps(knowledge), hasUiApps(knowledge)
|
|
133
|
+
? 'UI application detected — e2e user flows required'
|
|
134
|
+
: 'Fullstack app detected — e2e tests required', 'high', knowledge),
|
|
135
|
+
buildLayer('contract', isMicroservices(knowledge) || hasApiContracts || knowledge.apps.length > 1, isMicroservices(knowledge)
|
|
136
|
+
? 'Microservices architecture — contract tests prevent integration drift'
|
|
137
|
+
: hasApiContracts
|
|
138
|
+
? 'API contracts detected — consumer-driven contract tests recommended'
|
|
139
|
+
: 'Multiple services detected — contract tests recommended', 'high', knowledge),
|
|
140
|
+
buildLayer('visual', hasUiApps(knowledge), 'UI framework detected — visual regression tests prevent unintended style changes', 'medium', knowledge),
|
|
141
|
+
buildLayer('load', hasBackendApps(knowledge) || hasFullstackApps(knowledge), 'API endpoints detected — load tests validate performance under traffic', 'medium', knowledge),
|
|
142
|
+
buildLayer('security', hasAuth(knowledge) || knowledge.externalServices.length > 0, hasAuth(knowledge)
|
|
143
|
+
? 'Authentication detected — security tests required for auth flows'
|
|
144
|
+
: 'External services detected — security scanning recommended', 'critical', knowledge),
|
|
145
|
+
buildLayer('a11y', hasWebUiApps(knowledge), 'Web frontend detected — accessibility tests required for WCAG compliance', 'medium', knowledge),
|
|
146
|
+
];
|
|
147
|
+
// Sort needed layers by priority, then keep all layers in result
|
|
148
|
+
layers.sort((a, b) => {
|
|
149
|
+
if (a.needed !== b.needed) {
|
|
150
|
+
return a.needed ? -1 : 1;
|
|
151
|
+
}
|
|
152
|
+
return PRIORITY_ORDER[a.priority] - PRIORITY_ORDER[b.priority];
|
|
153
|
+
});
|
|
154
|
+
const totalEstimatedHours = layers
|
|
155
|
+
.filter((l) => l.needed)
|
|
156
|
+
.reduce((sum, l) => sum + l.estimatedHours, 0);
|
|
157
|
+
return {
|
|
158
|
+
projectId: knowledge.projectId,
|
|
159
|
+
generatedAt: new Date().toISOString(),
|
|
160
|
+
layers,
|
|
161
|
+
totalEstimatedHours,
|
|
162
|
+
mcpRecommendations: buildMcpRecommendations(knowledge),
|
|
163
|
+
starterKit: noApps || knowledge.language === 'unknown',
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=test-plan-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-plan-generator.js","sourceRoot":"","sources":["../../src/engine/test-plan-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { TestSpec } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generates a TestSpec from a list of acceptance criteria strings.
|
|
4
|
+
* Each criterion produces at least 2 scenarios (happy-path + error).
|
|
5
|
+
* Criteria containing boundary keywords also get an edge-case scenario.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateTestSpec(specId: string, specTitle: string, criteria: string[], locale: string): TestSpec;
|
|
8
|
+
//# sourceMappingURL=test-spec-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-spec-generator.d.ts","sourceRoot":"","sources":["../../src/engine/test-spec-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,QAAQ,EAKT,MAAM,mBAAmB,CAAC;AAiW3B;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,EAAE,MAAM,GACb,QAAQ,CAmBV"}
|