gherkin-ai 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +87 -0
  3. package/bin/gherkin-ai.js +21 -0
  4. package/dist/commands/export.d.ts +6 -0
  5. package/dist/commands/export.d.ts.map +1 -0
  6. package/dist/commands/export.js +42 -0
  7. package/dist/commands/export.js.map +1 -0
  8. package/dist/commands/generate.d.ts +5 -0
  9. package/dist/commands/generate.d.ts.map +1 -0
  10. package/dist/commands/generate.js +82 -0
  11. package/dist/commands/generate.js.map +1 -0
  12. package/dist/commands/init.d.ts +2 -0
  13. package/dist/commands/init.d.ts.map +1 -0
  14. package/dist/commands/init.js +91 -0
  15. package/dist/commands/init.js.map +1 -0
  16. package/dist/commands/validate.d.ts +5 -0
  17. package/dist/commands/validate.d.ts.map +1 -0
  18. package/dist/commands/validate.js +48 -0
  19. package/dist/commands/validate.js.map +1 -0
  20. package/dist/core/arch-rules.d.ts +11 -0
  21. package/dist/core/arch-rules.d.ts.map +1 -0
  22. package/dist/core/arch-rules.js +91 -0
  23. package/dist/core/arch-rules.js.map +1 -0
  24. package/dist/core/config.d.ts +25 -0
  25. package/dist/core/config.d.ts.map +1 -0
  26. package/dist/core/config.js +53 -0
  27. package/dist/core/config.js.map +1 -0
  28. package/dist/core/gherkin-parser.d.ts +22 -0
  29. package/dist/core/gherkin-parser.d.ts.map +1 -0
  30. package/dist/core/gherkin-parser.js +81 -0
  31. package/dist/core/gherkin-parser.js.map +1 -0
  32. package/dist/core/stack-specs.d.ts +19 -0
  33. package/dist/core/stack-specs.d.ts.map +1 -0
  34. package/dist/core/stack-specs.js +26 -0
  35. package/dist/core/stack-specs.js.map +1 -0
  36. package/dist/generators/contracts.d.ts +7 -0
  37. package/dist/generators/contracts.d.ts.map +1 -0
  38. package/dist/generators/contracts.js +87 -0
  39. package/dist/generators/contracts.js.map +1 -0
  40. package/dist/generators/fixtures.d.ts +7 -0
  41. package/dist/generators/fixtures.d.ts.map +1 -0
  42. package/dist/generators/fixtures.js +61 -0
  43. package/dist/generators/fixtures.js.map +1 -0
  44. package/dist/generators/infra.d.ts +6 -0
  45. package/dist/generators/infra.d.ts.map +1 -0
  46. package/dist/generators/infra.js +64 -0
  47. package/dist/generators/infra.js.map +1 -0
  48. package/dist/generators/prompts.d.ts +4 -0
  49. package/dist/generators/prompts.d.ts.map +1 -0
  50. package/dist/generators/prompts.js +74 -0
  51. package/dist/generators/prompts.js.map +1 -0
  52. package/dist/index.d.ts +2 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +48 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/utils/file-system.d.ts +5 -0
  57. package/dist/utils/file-system.d.ts.map +1 -0
  58. package/dist/utils/file-system.js +31 -0
  59. package/dist/utils/file-system.js.map +1 -0
  60. package/dist/utils/logger.d.ts +8 -0
  61. package/dist/utils/logger.d.ts.map +1 -0
  62. package/dist/utils/logger.js +28 -0
  63. package/dist/utils/logger.js.map +1 -0
  64. package/docs/ARCHITECTURE.md +63 -0
  65. package/docs/USAGE_GUIDE.md +125 -0
  66. package/package.json +62 -0
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - Configuration Schema & Reader
4
+ ========================================================================== */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.defaultConfig = void 0;
10
+ exports.loadConfig = loadConfig;
11
+ exports.saveConfig = saveConfig;
12
+ const path_1 = __importDefault(require("path"));
13
+ const file_system_1 = require("../utils/file-system");
14
+ exports.defaultConfig = {
15
+ projectName: 'my-gherkin-service',
16
+ architecture: 'hexagonal',
17
+ stack: {
18
+ language: 'typescript',
19
+ framework: 'nestjs',
20
+ orm: 'prisma',
21
+ database: 'postgresql',
22
+ validation: 'zod',
23
+ auth: 'jwt-bcrypt',
24
+ messaging: 'rabbitmq',
25
+ testing: 'jest'
26
+ },
27
+ rules: {
28
+ bcryptCostFactor: 12,
29
+ jwtTtlSeconds: 3600,
30
+ strictLayerBoundaries: true,
31
+ coverageTarget: 85
32
+ },
33
+ outputDir: './generated-specs'
34
+ };
35
+ function loadConfig(configPath) {
36
+ const targetPath = configPath || path_1.default.join(process.cwd(), 'gherkin-ai.config.json');
37
+ if (!(0, file_system_1.fileExistsSync)(targetPath)) {
38
+ return exports.defaultConfig;
39
+ }
40
+ try {
41
+ const raw = (0, file_system_1.readFileSync)(targetPath);
42
+ const parsed = JSON.parse(raw);
43
+ return { ...exports.defaultConfig, ...parsed, stack: { ...exports.defaultConfig.stack, ...(parsed.stack || {}) } };
44
+ }
45
+ catch (err) {
46
+ throw new Error(`Failed to parse config file at ${targetPath}: ${err.message}`);
47
+ }
48
+ }
49
+ function saveConfig(config, configPath) {
50
+ const targetPath = configPath || path_1.default.join(process.cwd(), 'gherkin-ai.config.json');
51
+ (0, file_system_1.writeFileSync)(targetPath, JSON.stringify(config, null, 2));
52
+ }
53
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;;AAiDhF,gCAcC;AAED,gCAGC;AAlED,gDAAwB;AACxB,sDAAmF;AAwBtE,QAAA,aAAa,GAAoB;IAC5C,WAAW,EAAE,oBAAoB;IACjC,YAAY,EAAE,WAAW;IACzB,KAAK,EAAE;QACL,QAAQ,EAAE,YAAY;QACtB,SAAS,EAAE,QAAQ;QACnB,GAAG,EAAE,QAAQ;QACb,QAAQ,EAAE,YAAY;QACtB,UAAU,EAAE,KAAK;QACjB,IAAI,EAAE,YAAY;QAClB,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,MAAM;KAChB;IACD,KAAK,EAAE;QACL,gBAAgB,EAAE,EAAE;QACpB,aAAa,EAAE,IAAI;QACnB,qBAAqB,EAAE,IAAI;QAC3B,cAAc,EAAE,EAAE;KACnB;IACD,SAAS,EAAE,mBAAmB;CAC/B,CAAC;AAEF,SAAgB,UAAU,CAAC,UAAmB;IAC5C,MAAM,UAAU,GAAG,UAAU,IAAI,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,wBAAwB,CAAC,CAAC;IAEpF,IAAI,CAAC,IAAA,4BAAc,EAAC,UAAU,CAAC,EAAE,CAAC;QAChC,OAAO,qBAAa,CAAC;IACvB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,0BAAY,EAAC,UAAU,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,EAAE,GAAG,qBAAa,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,qBAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;IACrG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kCAAkC,UAAU,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,MAAuB,EAAE,UAAmB;IACrE,MAAM,UAAU,GAAG,UAAU,IAAI,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,wBAAwB,CAAC,CAAC;IACpF,IAAA,2BAAa,EAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,22 @@
1
+ export interface StepModel {
2
+ keyword: 'Given' | 'When' | 'Then' | 'And' | 'But';
3
+ text: string;
4
+ }
5
+ export interface ScenarioModel {
6
+ name: string;
7
+ steps: StepModel[];
8
+ }
9
+ export interface ParsedFeature {
10
+ featureName: string;
11
+ descriptionLines: string[];
12
+ scenarios: ScenarioModel[];
13
+ domainAnalysis: {
14
+ actors: string[];
15
+ commands: string[];
16
+ queries: string[];
17
+ events: string[];
18
+ fixtures: string[];
19
+ };
20
+ }
21
+ export declare function parseGherkinText(gherkinText: string): ParsedFeature;
22
+ //# sourceMappingURL=gherkin-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gherkin-parser.d.ts","sourceRoot":"","sources":["../../src/core/gherkin-parser.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IACnD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,cAAc,EAAE;QACd,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA8EnE"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - Gherkin Feature Parser & AST Model
4
+ ========================================================================== */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseGherkinText = parseGherkinText;
7
+ function parseGherkinText(gherkinText) {
8
+ const lines = gherkinText.split('\n');
9
+ let featureName = 'Feature Specification';
10
+ const descriptionLines = [];
11
+ const scenarios = [];
12
+ let currentScenario = null;
13
+ let inHeader = true;
14
+ for (let rawLine of lines) {
15
+ const line = rawLine.trim();
16
+ if (!line || line.startsWith('#'))
17
+ continue;
18
+ if (line.startsWith('Feature:')) {
19
+ featureName = line.replace('Feature:', '').trim();
20
+ inHeader = true;
21
+ continue;
22
+ }
23
+ if (line.startsWith('Scenario:') || line.startsWith('Scenario Outline:')) {
24
+ inHeader = false;
25
+ const name = line.replace(/Scenario( Outline)?:/, '').trim();
26
+ currentScenario = { name, steps: [] };
27
+ scenarios.push(currentScenario);
28
+ continue;
29
+ }
30
+ if (inHeader) {
31
+ descriptionLines.push(line);
32
+ continue;
33
+ }
34
+ const stepMatch = line.match(/^(Given|When|Then|And|But)\s+(.+)$/i);
35
+ if (stepMatch && currentScenario) {
36
+ const keyword = (stepMatch[1].charAt(0).toUpperCase() + stepMatch[1].slice(1).toLowerCase());
37
+ currentScenario.steps.push({ keyword, text: stepMatch[2].trim() });
38
+ }
39
+ }
40
+ // Domain Elements Extraction
41
+ const actors = new Set();
42
+ const commands = [];
43
+ const queries = [];
44
+ const events = [];
45
+ const fixtures = [];
46
+ descriptionLines.forEach(line => {
47
+ if (/as a|as an|como/i.test(line))
48
+ actors.add(line);
49
+ });
50
+ scenarios.forEach(sc => {
51
+ sc.steps.forEach(st => {
52
+ if (st.keyword === 'Given') {
53
+ fixtures.push(st.text);
54
+ }
55
+ else if (st.keyword === 'When') {
56
+ commands.push(st.text);
57
+ }
58
+ else if (st.keyword === 'Then') {
59
+ if (/event|publishes|emits|broadcasts|evento/i.test(st.text)) {
60
+ events.push(st.text);
61
+ }
62
+ else {
63
+ queries.push(st.text);
64
+ }
65
+ }
66
+ });
67
+ });
68
+ return {
69
+ featureName,
70
+ descriptionLines,
71
+ scenarios,
72
+ domainAnalysis: {
73
+ actors: Array.from(actors),
74
+ commands,
75
+ queries,
76
+ events,
77
+ fixtures
78
+ }
79
+ };
80
+ }
81
+ //# sourceMappingURL=gherkin-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gherkin-parser.js","sourceRoot":"","sources":["../../src/core/gherkin-parser.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAyBhF,4CA8EC;AA9ED,SAAgB,gBAAgB,CAAC,WAAmB;IAClD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,WAAW,GAAG,uBAAuB,CAAC;IAC1C,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,MAAM,SAAS,GAAoB,EAAE,CAAC;IAEtC,IAAI,eAAe,GAAyB,IAAI,CAAC;IACjD,IAAI,QAAQ,GAAG,IAAI,CAAC;IAEpB,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAE5C,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAClD,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACzE,QAAQ,GAAG,KAAK,CAAC;YACjB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7D,eAAe,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YACtC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACpE,IAAI,SAAS,IAAI,eAAe,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAyB,CAAC;YACrH,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC9B,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;QACrB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YACpB,IAAI,EAAE,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;iBAAM,IAAI,EAAE,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;iBAAM,IAAI,EAAE,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;gBACjC,IAAI,0CAA0C,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7D,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,WAAW;QACX,gBAAgB;QAChB,SAAS;QACT,cAAc,EAAE;YACd,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1B,QAAQ;YACR,OAAO;YACP,MAAM;YACN,QAAQ;SACT;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface StackSpec {
2
+ language: string;
3
+ framework: string;
4
+ frameworkVersion: string;
5
+ orm: string;
6
+ ormPackage: string;
7
+ validation: string;
8
+ validationPackage: string;
9
+ auth: string;
10
+ authPackages: string[];
11
+ bcryptCostFactor: number;
12
+ jwtTtlSeconds: number;
13
+ messaging?: string;
14
+ messagingPackage?: string;
15
+ testing: string;
16
+ testPackages: string[];
17
+ }
18
+ export declare function getStackSpec(stackConfig: Record<string, any>): StackSpec;
19
+ //# sourceMappingURL=stack-specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-specs.d.ts","sourceRoot":"","sources":["../../src/core/stack-specs.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAkBxE"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - Technical Stack Specifications & Package Versions
4
+ ========================================================================== */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getStackSpec = getStackSpec;
7
+ function getStackSpec(stackConfig) {
8
+ return {
9
+ language: stackConfig.language || 'typescript',
10
+ framework: stackConfig.framework || 'nestjs',
11
+ frameworkVersion: '^10.3.0',
12
+ orm: stackConfig.orm || 'prisma',
13
+ ormPackage: '@prisma/client@^5.10.0',
14
+ validation: stackConfig.validation || 'zod',
15
+ validationPackage: 'zod@^3.22.4',
16
+ auth: stackConfig.auth || 'jwt-bcrypt',
17
+ authPackages: ['@nestjs/jwt@^10.2.0', '@nestjs/passport@^10.0.3', 'bcrypt@^5.1.1', 'passport-jwt@^4.0.1'],
18
+ bcryptCostFactor: stackConfig.bcryptCostFactor || 12,
19
+ jwtTtlSeconds: stackConfig.jwtTtlSeconds || 3600,
20
+ messaging: stackConfig.messaging || 'rabbitmq',
21
+ messagingPackage: 'amqplib@^0.10.3',
22
+ testing: stackConfig.testing || 'jest',
23
+ testPackages: ['jest@^29.7.0', '@types/jest@^29.5.12', 'ts-jest@^29.1.2', 'supertest@^6.3.4']
24
+ };
25
+ }
26
+ //# sourceMappingURL=stack-specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-specs.js","sourceRoot":"","sources":["../../src/core/stack-specs.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAoBhF,oCAkBC;AAlBD,SAAgB,YAAY,CAAC,WAAgC;IAC3D,OAAO;QACL,QAAQ,EAAE,WAAW,CAAC,QAAQ,IAAI,YAAY;QAC9C,SAAS,EAAE,WAAW,CAAC,SAAS,IAAI,QAAQ;QAC5C,gBAAgB,EAAE,SAAS;QAC3B,GAAG,EAAE,WAAW,CAAC,GAAG,IAAI,QAAQ;QAChC,UAAU,EAAE,wBAAwB;QACpC,UAAU,EAAE,WAAW,CAAC,UAAU,IAAI,KAAK;QAC3C,iBAAiB,EAAE,aAAa;QAChC,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,YAAY;QACtC,YAAY,EAAE,CAAC,qBAAqB,EAAE,0BAA0B,EAAE,eAAe,EAAE,qBAAqB,CAAC;QACzG,gBAAgB,EAAE,WAAW,CAAC,gBAAgB,IAAI,EAAE;QACpD,aAAa,EAAE,WAAW,CAAC,aAAa,IAAI,IAAI;QAChD,SAAS,EAAE,WAAW,CAAC,SAAS,IAAI,UAAU;QAC9C,gBAAgB,EAAE,iBAAiB;QACnC,OAAO,EAAE,WAAW,CAAC,OAAO,IAAI,MAAM;QACtC,YAAY,EAAE,CAAC,cAAc,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC;KAC9F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { ParsedFeature } from '../core/gherkin-parser';
2
+ import { GherkinAIConfig } from '../core/config';
3
+ export declare function generateContracts(parsed: ParsedFeature, config: GherkinAIConfig): {
4
+ contractsTs: string;
5
+ adrMd: string;
6
+ };
7
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/generators/contracts.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAIjD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAiFxH"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - TypeScript Contracts & Schemas Generator
4
+ ========================================================================== */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateContracts = generateContracts;
7
+ const arch_rules_1 = require("../core/arch-rules");
8
+ const stack_specs_1 = require("../core/stack-specs");
9
+ function generateContracts(parsed, config) {
10
+ const arch = (0, arch_rules_1.getArchRule)(config.architecture);
11
+ const spec = (0, stack_specs_1.getStackSpec)(config.stack);
12
+ const featurePascal = parsed.featureName.replace(/[^a-zA-Z0-9]/g, '');
13
+ const contractsTs = `/* ==========================================================================
14
+ Generated Domain Contracts & DTO Schemas
15
+ Feature: ${parsed.featureName}
16
+ Architecture: ${arch.name}
17
+ Stack: ${config.stack.language} + ${config.stack.framework} + ${config.stack.orm}
18
+ Generated by gherkin-ai CLI v1.0.0
19
+ ========================================================================== */
20
+
21
+ import { z } from '${spec.validationPackage.split('@')[0]}';
22
+
23
+ // --------------------------------------------------------------------------
24
+ // 1. Domain Event Interfaces
25
+ // --------------------------------------------------------------------------
26
+ export interface IDomainEvent {
27
+ eventId: string;
28
+ occurredOn: Date;
29
+ eventType: string;
30
+ }
31
+
32
+ ${parsed.domainAnalysis.events.map((ev, i) => `export interface Event${i + 1} extends IDomainEvent {
33
+ eventType: '${ev.replace(/[^a-zA-Z0-9]/g, '')}';
34
+ payload: Record<string, unknown>;
35
+ }`).join('\n\n')}
36
+
37
+ // --------------------------------------------------------------------------
38
+ // 2. Command DTO Schemas (Zod Validation)
39
+ // --------------------------------------------------------------------------
40
+ export const ${featurePascal}CommandSchema = z.object({
41
+ requestId: z.string().uuid(),
42
+ timestamp: z.string().datetime(),
43
+ payload: z.record(z.unknown())
44
+ });
45
+
46
+ export type ${featurePascal}Command = z.infer<typeof ${featurePascal}CommandSchema>;
47
+
48
+ // --------------------------------------------------------------------------
49
+ // 3. Domain Repository Port (Outbound Interface)
50
+ // --------------------------------------------------------------------------
51
+ export interface I${featurePascal}Repository {
52
+ findById(id: string): Promise<unknown | null>;
53
+ save(entity: unknown): Promise<void>;
54
+ delete(id: string): Promise<void>;
55
+ }
56
+
57
+ // --------------------------------------------------------------------------
58
+ // 4. Application Event Publisher Port
59
+ // --------------------------------------------------------------------------
60
+ export interface IEventPublisher {
61
+ publish(event: IDomainEvent): Promise<void>;
62
+ }
63
+ `;
64
+ const adrMd = `# ADR 001: Architecture Decisions for ${parsed.featureName}
65
+
66
+ ## Status
67
+ Accepted
68
+
69
+ ## Context
70
+ Project requiring structured implementation matching Gherkin specification.
71
+
72
+ ## Decisions
73
+ - **Architecture Style**: ${arch.name} (${arch.id})
74
+ - **Primary Language**: ${config.stack.language}
75
+ - **Framework**: ${config.stack.framework} (${spec.frameworkVersion})
76
+ - **ORM / Persistence**: ${config.stack.orm} (${spec.ormPackage})
77
+ - **Validation**: ${config.stack.validation} (${spec.validationPackage})
78
+ - **Authentication**: ${config.stack.auth} (bcrypt cost factor ${spec.bcryptCostFactor}, JWT TTL ${spec.jwtTtlSeconds}s)
79
+ - **Testing Framework**: ${config.stack.testing} (${spec.testPackages.join(', ')})
80
+
81
+ ## Prohibited Layer Dependencies
82
+ Domain core must NOT import:
83
+ ${arch.prohibitedImports.map(p => `- \`${p}\``).join('\n')}
84
+ `;
85
+ return { contractsTs, adrMd };
86
+ }
87
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/generators/contracts.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAOhF,8CAiFC;AApFD,mDAAiD;AACjD,qDAAmD;AAEnD,SAAgB,iBAAiB,CAAC,MAAqB,EAAE,MAAuB;IAC9E,MAAM,IAAI,GAAG,IAAA,wBAAW,EAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAA,0BAAY,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAExC,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAEtE,MAAM,WAAW,GAAG;;cAER,MAAM,CAAC,WAAW;mBACb,IAAI,CAAC,IAAI;YAChB,MAAM,CAAC,KAAK,CAAC,QAAQ,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG;;;;qBAI9D,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;;;;;;;;;;EAWvD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,GAAG,CAAC;gBAC5D,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;;EAE7C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;;;;;eAKD,aAAa;;;;;;cAMd,aAAa,4BAA4B,aAAa;;;;;oBAKhD,aAAa;;;;;;;;;;;;CAYhC,CAAC;IAEA,MAAM,KAAK,GAAG,yCAAyC,MAAM,CAAC,WAAW;;;;;;;;;4BAS/C,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE;0BACvB,MAAM,CAAC,KAAK,CAAC,QAAQ;mBAC5B,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,gBAAgB;2BACxC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,UAAU;oBAC3C,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,iBAAiB;wBAC9C,MAAM,CAAC,KAAK,CAAC,IAAI,wBAAwB,IAAI,CAAC,gBAAgB,aAAa,IAAI,CAAC,aAAa;2BAC1F,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;;;EAI9E,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CACzD,CAAC;IAEA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { ParsedFeature } from '../core/gherkin-parser';
2
+ import { GherkinAIConfig } from '../core/config';
3
+ export declare function generateFixtures(parsed: ParsedFeature, config: GherkinAIConfig): {
4
+ fixturesTs: string;
5
+ seedSql: string;
6
+ };
7
+ //# sourceMappingURL=fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/generators/fixtures.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAuDxH"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - Executable Test Seeds & Fixtures Generator
4
+ ========================================================================== */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateFixtures = generateFixtures;
7
+ const stack_specs_1 = require("../core/stack-specs");
8
+ function generateFixtures(parsed, config) {
9
+ const spec = (0, stack_specs_1.getStackSpec)(config.stack);
10
+ const fixturesTs = `/* ==========================================================================
11
+ Generated Test Fixtures & Seed Setup
12
+ Feature: ${parsed.featureName}
13
+ Generated by gherkin-ai CLI v1.0.0
14
+ ========================================================================== */
15
+
16
+ import bcrypt from 'bcrypt';
17
+
18
+ export interface TestUserFixture {
19
+ id: string;
20
+ email: string;
21
+ passwordRaw: string;
22
+ passwordHash: string;
23
+ role: string;
24
+ isActive: boolean;
25
+ }
26
+
27
+ export async function createTestUserFixture(): Promise<TestUserFixture> {
28
+ const saltRounds = ${spec.bcryptCostFactor};
29
+ const passwordRaw = 'Pass123!';
30
+ const passwordHash = await bcrypt.hash(passwordRaw, saltRounds);
31
+
32
+ return {
33
+ id: 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
34
+ email: 'dev@example.com',
35
+ passwordRaw,
36
+ passwordHash,
37
+ role: 'ADMIN',
38
+ isActive: true
39
+ };
40
+ }
41
+
42
+ export const GHERKIN_GIVEN_PRECONDITIONS = [
43
+ ${parsed.domainAnalysis.fixtures.map(f => ` ${JSON.stringify(f)}`).join(',\n')}
44
+ ];
45
+ `;
46
+ const seedSql = `-- Generated Seed SQL Fixtures for PostgreSQL / MySQL
47
+ -- Feature: ${parsed.featureName}
48
+
49
+ INSERT INTO users (id, email, password_hash, role, is_active, created_at)
50
+ VALUES (
51
+ 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
52
+ 'dev@example.com',
53
+ '$2b$12$eImiTXuWVxfM37uY4JANjO5E.y5bXm8A8fK0iE8zK4aM4iO2oU7pS', -- 'Pass123!' hashed with bcrypt cost 12
54
+ 'ADMIN',
55
+ true,
56
+ NOW()
57
+ ) ON CONFLICT (email) DO NOTHING;
58
+ `;
59
+ return { fixturesTs, seedSql };
60
+ }
61
+ //# sourceMappingURL=fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/generators/fixtures.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAMhF,4CAuDC;AAzDD,qDAAmD;AAEnD,SAAgB,gBAAgB,CAAC,MAAqB,EAAE,MAAuB;IAC7E,MAAM,IAAI,GAAG,IAAA,0BAAY,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAExC,MAAM,UAAU,GAAG;;cAEP,MAAM,CAAC,WAAW;;;;;;;;;;;;;;;;uBAgBT,IAAI,CAAC,gBAAgB;;;;;;;;;;;;;;;EAe1C,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;;CAE9E,CAAC;IAEA,MAAM,OAAO,GAAG;cACJ,MAAM,CAAC,WAAW;;;;;;;;;;;CAW/B,CAAC;IAEA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { GherkinAIConfig } from '../core/config';
2
+ export declare function generateInfra(config: GherkinAIConfig): {
3
+ dockerComposeYaml: string;
4
+ envExample: string;
5
+ };
6
+ //# sourceMappingURL=infra.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra.d.ts","sourceRoot":"","sources":["../../src/generators/infra.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CA2DxG"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - Infrastructure & Docker Compose Generator
4
+ ========================================================================== */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateInfra = generateInfra;
7
+ function generateInfra(config) {
8
+ const db = config.stack.database || 'postgresql';
9
+ const messaging = config.stack.messaging || 'rabbitmq';
10
+ const dockerComposeYaml = `version: '3.8'
11
+
12
+ services:
13
+ # Database Service
14
+ ${db}:
15
+ image: postgres:16-alpine
16
+ container_name: ${config.projectName}-db
17
+ restart: always
18
+ environment:
19
+ POSTGRES_DB: ${config.projectName}_db
20
+ POSTGRES_USER: dev_user
21
+ POSTGRES_PASSWORD: dev_password
22
+ ports:
23
+ - "5432:5432"
24
+ volumes:
25
+ - postgres_data:/var/lib/postgresql/data
26
+
27
+ # Message Broker
28
+ ${messaging}:
29
+ image: rabbitmq:3-management-alpine
30
+ container_name: ${config.projectName}-mq
31
+ restart: always
32
+ ports:
33
+ - "5672:5672"
34
+ - "15672:15672"
35
+
36
+ # Redis Cache
37
+ redis:
38
+ image: redis:7-alpine
39
+ container_name: ${config.projectName}-redis
40
+ ports:
41
+ - "6379:6379"
42
+
43
+ volumes:
44
+ postgres_data:
45
+ `;
46
+ const envExample = `# Environment Variables for ${config.projectName}
47
+ NODE_ENV=development
48
+ PORT=3000
49
+
50
+ # Database
51
+ DATABASE_URL=postgresql://dev_user:dev_password@localhost:5432/${config.projectName}_db?schema=public
52
+
53
+ # Security & JWT
54
+ JWT_SECRET=super_secret_jwt_key_change_in_production
55
+ JWT_TTL_SECONDS=${config.rules.jwtTtlSeconds || 3600}
56
+ BCRYPT_COST_FACTOR=${config.rules.bcryptCostFactor || 12}
57
+
58
+ # Messaging & Redis
59
+ RABBITMQ_URL=amqp://localhost:5672
60
+ REDIS_URL=redis://localhost:6379
61
+ `;
62
+ return { dockerComposeYaml, envExample };
63
+ }
64
+ //# sourceMappingURL=infra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra.js","sourceRoot":"","sources":["../../src/generators/infra.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAIhF,sCA2DC;AA3DD,SAAgB,aAAa,CAAC,MAAuB;IACnD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,YAAY,CAAC;IACjD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,UAAU,CAAC;IAEvD,MAAM,iBAAiB,GAAG;;;;IAIxB,EAAE;;sBAEgB,MAAM,CAAC,WAAW;;;qBAGnB,MAAM,CAAC,WAAW;;;;;;;;;IASnC,SAAS;;sBAES,MAAM,CAAC,WAAW;;;;;;;;;sBASlB,MAAM,CAAC,WAAW;;;;;;CAMvC,CAAC;IAEA,MAAM,UAAU,GAAG,+BAA+B,MAAM,CAAC,WAAW;;;;;iEAKL,MAAM,CAAC,WAAW;;;;kBAIjE,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI;qBAC/B,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE;;;;;CAKvD,CAAC;IAEA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { ParsedFeature } from '../core/gherkin-parser';
2
+ import { GherkinAIConfig } from '../core/config';
3
+ export declare function generatePrompts(parsed: ParsedFeature, config: GherkinAIConfig): Record<string, string>;
4
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/generators/prompts.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAIjD,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoEtG"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - Executable AI Agent Prompt Generator
4
+ ========================================================================== */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generatePrompts = generatePrompts;
7
+ const arch_rules_1 = require("../core/arch-rules");
8
+ const stack_specs_1 = require("../core/stack-specs");
9
+ function generatePrompts(parsed, config) {
10
+ const arch = (0, arch_rules_1.getArchRule)(config.architecture);
11
+ const spec = (0, stack_specs_1.getStackSpec)(config.stack);
12
+ const domainPrompt = `🤖 ROLE: DOMAIN ARCHITECT AGENT
13
+ Objective: Implement domain entities, value objects, aggregates, and domain event ports according to ${arch.name}.
14
+
15
+ 📌 Feature Specification: ${parsed.featureName}
16
+ ${parsed.descriptionLines.map(l => `> ${l}`).join('\n')}
17
+
18
+ 🏗️ Strict Architectural Patterns:
19
+ ${arch.patterns.map(p => `- ${p}`).join('\n')}
20
+
21
+ 🛠️ Technical Rails:
22
+ - Language: ${config.stack.language} (ES2022 / Strict TypeScript)
23
+ - Layer Boundary Rule: Core domain must NEVER import framework libraries.
24
+ - Prohibited Core Imports: ${arch.prohibitedImports.join(', ')}
25
+
26
+ 📂 Folder Structure Target:
27
+ ${arch.folderStructure}
28
+
29
+ 🎯 Scenarios to Fulfill:
30
+ ${parsed.scenarios.map((sc, i) => `${i + 1}. "${sc.name}"`).join('\n')}
31
+
32
+ Must Output:
33
+ 1. Pure TypeScript Entities & Aggregates in src/domain/
34
+ 2. Domain Event Interfaces & Repository Ports in src/domain/ports/
35
+ `;
36
+ const backendPrompt = `🤖 ROLE: BACKEND DEVELOPER AGENT
37
+ Objective: Implement Use Cases, Handlers, Controllers, DTOs, and ORM Persistence.
38
+
39
+ 🛠️ Target Technology Stack & Packages:
40
+ - Framework: ${config.stack.framework} (${spec.frameworkVersion})
41
+ - ORM / Persistence: ${config.stack.orm} (${spec.ormPackage})
42
+ - Validation: ${config.stack.validation} (${spec.validationPackage})
43
+ - Auth & Hash: ${config.stack.auth} (${spec.authPackages.join(', ')}, bcrypt cost ${spec.bcryptCostFactor})
44
+ - Messaging: ${config.stack.messaging} (${spec.messagingPackage})
45
+
46
+ 📌 Contract References:
47
+ - Read interfaces from ./contracts.ts
48
+ - Use Zod schemas for input validation
49
+
50
+ 🎯 Execution Tasks:
51
+ 1. Implement Use Case handlers matching command schemas.
52
+ 2. Implement Repository persistence adapters for ${config.stack.database}.
53
+ 3. Create API controller endpoints for each scenario:
54
+ ${parsed.scenarios.map(sc => ` - Endpoint for: "${sc.name}"`).join('\n')}
55
+ `;
56
+ const qaPrompt = `🤖 ROLE: QA & AUTOMATION ENGINEER AGENT
57
+ Objective: Implement automated tests (Unit, Integration, BDD) using ${config.stack.testing} (${spec.testPackages.join(', ')}).
58
+
59
+ 📌 Fixture Reference:
60
+ - Use test fixture setup from ./fixtures.ts
61
+
62
+ 🎯 Testing Deliverables:
63
+ 1. Unit tests for Domain Core with >= 85% branch coverage.
64
+ 2. Integration tests for Repository adapters and API controllers.
65
+ 3. Automated BDD step definitions matching Gherkin scenarios:
66
+ ${parsed.scenarios.map(sc => ` * ${sc.name}`).join('\n')}
67
+ `;
68
+ return {
69
+ 'domain-agent.md': domainPrompt,
70
+ 'backend-agent.md': backendPrompt,
71
+ 'qa-agent.md': qaPrompt
72
+ };
73
+ }
74
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/generators/prompts.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAOhF,0CAoEC;AAvED,mDAAiD;AACjD,qDAAmD;AAEnD,SAAgB,eAAe,CAAC,MAAqB,EAAE,MAAuB;IAC5E,MAAM,IAAI,GAAG,IAAA,wBAAW,EAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAA,0BAAY,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAExC,MAAM,YAAY,GAAG;uGACgF,IAAI,CAAC,IAAI;;4BAEpF,MAAM,CAAC,WAAW;EAC5C,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAGrD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;cAG/B,MAAM,CAAC,KAAK,CAAC,QAAQ;;6BAEN,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAG5D,IAAI,CAAC,eAAe;;;EAGpB,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;CAKrE,CAAC;IAEA,MAAM,aAAa,GAAG;;;;eAIT,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,gBAAgB;uBACxC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,UAAU;gBAC3C,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,iBAAiB;iBACjD,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,gBAAgB;eAC1F,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,gBAAgB;;;;;;;;mDAQZ,MAAM,CAAC,KAAK,CAAC,QAAQ;;EAEtE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,uBAAuB,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CACzE,CAAC;IAEA,MAAM,QAAQ,GAAG;sEACmD,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;EASzH,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CACzD,CAAC;IAEA,OAAO;QACL,iBAAiB,EAAE,YAAY;QAC/B,kBAAkB,EAAE,aAAa;QACjC,aAAa,EAAE,QAAQ;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - Main Commander CLI Entry Point
4
+ ========================================================================== */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const commander_1 = require("commander");
7
+ const init_1 = require("./commands/init");
8
+ const generate_1 = require("./commands/generate");
9
+ const validate_1 = require("./commands/validate");
10
+ const export_1 = require("./commands/export");
11
+ const program = new commander_1.Command();
12
+ program
13
+ .name('gherkin-ai')
14
+ .description('CLI tool & contract engine translating Gherkin specs into executable prompts, TypeScript contracts, and seed fixtures for AI Agents.')
15
+ .version('1.0.0');
16
+ program
17
+ .command('init')
18
+ .description('Initialize interactive gherkin-ai project configuration (gherkin-ai.config.json)')
19
+ .action(async () => {
20
+ await (0, init_1.handleInitCommand)();
21
+ });
22
+ program
23
+ .command('generate')
24
+ .description('Generate TypeScript contracts, DTO schemas, test fixtures, docker-compose, and agent prompts from Gherkin feature spec')
25
+ .option('-f, --feature <file>', 'Path to Gherkin .feature file')
26
+ .option('-c, --config <file>', 'Path to custom gherkin-ai.config.json file')
27
+ .action(async (options) => {
28
+ await (0, generate_1.handleGenerateCommand)(options);
29
+ });
30
+ program
31
+ .command('validate')
32
+ .description('Validate Gherkin specification and architecture rules compliance')
33
+ .option('-f, --feature <file>', 'Path to Gherkin .feature file')
34
+ .option('-c, --config <file>', 'Path to custom gherkin-ai.config.json file')
35
+ .action(async (options) => {
36
+ await (0, validate_1.handleValidateCommand)(options);
37
+ });
38
+ program
39
+ .command('export')
40
+ .description('Export single AI Agent context bundle (Markdown or JSON)')
41
+ .option('-f, --feature <file>', 'Path to Gherkin .feature file')
42
+ .option('--format <type>', 'Export format (json or md)', 'md')
43
+ .option('-o, --output <file>', 'Output destination file path')
44
+ .action(async (options) => {
45
+ await (0, export_1.handleExportCommand)(options);
46
+ });
47
+ program.parse(process.argv);
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAEhF,yCAAoC;AACpC,0CAAoD;AACpD,kDAA4D;AAC5D,kDAA4D;AAC5D,8CAAwD;AAExD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,sIAAsI,CAAC;KACnJ,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kFAAkF,CAAC;KAC/F,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAA,wBAAiB,GAAE,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,wHAAwH,CAAC;KACrI,MAAM,CAAC,sBAAsB,EAAE,+BAA+B,CAAC;KAC/D,MAAM,CAAC,qBAAqB,EAAE,4CAA4C,CAAC;KAC3E,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,IAAA,gCAAqB,EAAC,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,sBAAsB,EAAE,+BAA+B,CAAC;KAC/D,MAAM,CAAC,qBAAqB,EAAE,4CAA4C,CAAC;KAC3E,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,IAAA,gCAAqB,EAAC,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,sBAAsB,EAAE,+BAA+B,CAAC;KAC/D,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,EAAE,IAAI,CAAC;KAC7D,MAAM,CAAC,qBAAqB,EAAE,8BAA8B,CAAC;KAC7D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,IAAA,4BAAmB,EAAC,OAAO,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}