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.
Files changed (76) hide show
  1. package/dist/engine/skill-generator/sections-skills.d.ts +4 -0
  2. package/dist/engine/skill-generator/sections-skills.d.ts.map +1 -0
  3. package/dist/engine/skill-generator/sections-skills.js +51 -0
  4. package/dist/engine/skill-generator/sections-skills.js.map +1 -0
  5. package/dist/engine/skill-generator/sections.d.ts +1 -0
  6. package/dist/engine/skill-generator/sections.d.ts.map +1 -1
  7. package/dist/engine/skill-generator/sections.js +2 -1
  8. package/dist/engine/skill-generator/sections.js.map +1 -1
  9. package/dist/engine/skill-generator.d.ts +3 -1
  10. package/dist/engine/skill-generator.d.ts.map +1 -1
  11. package/dist/engine/skill-generator.js +11 -2
  12. package/dist/engine/skill-generator.js.map +1 -1
  13. package/dist/engine/test-plan-generator.d.ts +3 -0
  14. package/dist/engine/test-plan-generator.d.ts.map +1 -0
  15. package/dist/engine/test-plan-generator.js +166 -0
  16. package/dist/engine/test-plan-generator.js.map +1 -0
  17. package/dist/engine/test-spec-generator.d.ts +8 -0
  18. package/dist/engine/test-spec-generator.d.ts.map +1 -0
  19. package/dist/engine/test-spec-generator.js +348 -0
  20. package/dist/engine/test-spec-generator.js.map +1 -0
  21. package/dist/tools/generate-rules.d.ts.map +1 -1
  22. package/dist/tools/generate-rules.js +20 -0
  23. package/dist/tools/generate-rules.js.map +1 -1
  24. package/dist/tools/generate-tests/generators/database-test-generator.d.ts +11 -0
  25. package/dist/tools/generate-tests/generators/database-test-generator.d.ts.map +1 -0
  26. package/dist/tools/generate-tests/generators/database-test-generator.js +329 -0
  27. package/dist/tools/generate-tests/generators/database-test-generator.js.map +1 -0
  28. package/dist/tools/generate-tests/generators/graphql-test-generator.d.ts +17 -0
  29. package/dist/tools/generate-tests/generators/graphql-test-generator.d.ts.map +1 -0
  30. package/dist/tools/generate-tests/generators/graphql-test-generator.js +235 -0
  31. package/dist/tools/generate-tests/generators/graphql-test-generator.js.map +1 -0
  32. package/dist/tools/generate-tests/generators/grpc-test-generator.d.ts +17 -0
  33. package/dist/tools/generate-tests/generators/grpc-test-generator.d.ts.map +1 -0
  34. package/dist/tools/generate-tests/generators/grpc-test-generator.js +283 -0
  35. package/dist/tools/generate-tests/generators/grpc-test-generator.js.map +1 -0
  36. package/dist/tools/generate-tests/generators/microservices-test-generator.d.ts +10 -0
  37. package/dist/tools/generate-tests/generators/microservices-test-generator.d.ts.map +1 -0
  38. package/dist/tools/generate-tests/generators/microservices-test-generator.js +341 -0
  39. package/dist/tools/generate-tests/generators/microservices-test-generator.js.map +1 -0
  40. package/dist/tools/generate-tests/generators/security-test-generator.d.ts +11 -0
  41. package/dist/tools/generate-tests/generators/security-test-generator.d.ts.map +1 -0
  42. package/dist/tools/generate-tests/generators/security-test-generator.js +318 -0
  43. package/dist/tools/generate-tests/generators/security-test-generator.js.map +1 -0
  44. package/dist/tools/generate-tests/generators/visual-regression-generator.d.ts +19 -0
  45. package/dist/tools/generate-tests/generators/visual-regression-generator.d.ts.map +1 -0
  46. package/dist/tools/generate-tests/generators/visual-regression-generator.js +304 -0
  47. package/dist/tools/generate-tests/generators/visual-regression-generator.js.map +1 -0
  48. package/dist/tools/generate-tests/generators/websocket-test-generator.d.ts +17 -0
  49. package/dist/tools/generate-tests/generators/websocket-test-generator.d.ts.map +1 -0
  50. package/dist/tools/generate-tests/generators/websocket-test-generator.js +243 -0
  51. package/dist/tools/generate-tests/generators/websocket-test-generator.js.map +1 -0
  52. package/dist/tools/generate-tests/plan-mode-handler.d.ts +3 -0
  53. package/dist/tools/generate-tests/plan-mode-handler.d.ts.map +1 -0
  54. package/dist/tools/generate-tests/plan-mode-handler.js +54 -0
  55. package/dist/tools/generate-tests/plan-mode-handler.js.map +1 -0
  56. package/dist/tools/generate-tests/spec-dispatcher.d.ts.map +1 -1
  57. package/dist/tools/generate-tests/spec-dispatcher.js +46 -0
  58. package/dist/tools/generate-tests/spec-dispatcher.js.map +1 -1
  59. package/dist/tools/generate-tests/test-helpers.d.ts +8 -0
  60. package/dist/tools/generate-tests/test-helpers.d.ts.map +1 -0
  61. package/dist/tools/generate-tests/test-helpers.js +120 -0
  62. package/dist/tools/generate-tests/test-helpers.js.map +1 -0
  63. package/dist/tools/generate-tests.d.ts.map +1 -1
  64. package/dist/tools/generate-tests.js +6 -118
  65. package/dist/tools/generate-tests.js.map +1 -1
  66. package/dist/tools/init-project/handler.d.ts.map +1 -1
  67. package/dist/tools/init-project/handler.js +29 -0
  68. package/dist/tools/init-project/handler.js.map +1 -1
  69. package/dist/types/stack/recommend.d.ts +2 -0
  70. package/dist/types/stack/recommend.d.ts.map +1 -1
  71. package/dist/types/testing.d.ts +51 -0
  72. package/dist/types/testing.d.ts.map +1 -1
  73. package/package.json +3 -2
  74. package/src/i18n/messages/en.json +333 -0
  75. package/src/i18n/messages/es.json +333 -0
  76. 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 and sections-platform.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,+EAA+E;AAE/E,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.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,EAEb,MAAM,mBAAmB,CAAC;AAwB3B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAEhF,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;CACnB,GACL,OAAO,CAAC,mBAAmB,CAAC,CAsG9B"}
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":"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"}
1
+ {"version":3,"file":"skill-generator.js","sourceRoot":"","sources":["../../src/engine/skill-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ProjectKnowledge, TestPlan } from '../types/index.js';
2
+ export declare function generateTestPlan(knowledge: ProjectKnowledge): TestPlan;
3
+ //# sourceMappingURL=test-plan-generator.d.ts.map
@@ -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"}