gherkin-ai 1.0.0 → 1.1.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/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
5
 
6
6
  > **Bridge the gap between business specifications and AI Coding Agents.**
7
- > Convert Gherkin `.feature` files into production-ready TypeScript contracts, Zod schemas, deterministic test seeds, and role-specialized executable prompt packages for AI Agents (**Claude Code, Cursor, Antigravity, Windsurf, GitHub Copilot Workspace**).
7
+ > Convert Gherkin `.feature` files into production-ready TypeScript contracts, Zod schemas, OpenAPI specs, deterministic test seeds, and role-specialized executable prompt packages for AI Agents (**Claude Code, Cursor, Antigravity, Windsurf, GitHub Copilot Workspace**).
8
8
 
9
9
  ---
10
10
 
@@ -13,10 +13,12 @@
13
13
  While simple AI prompt generators produce generic text instructions, AI agents often invent conflicting package versions, violate domain boundaries, or fail to write working tests due to missing setup state.
14
14
 
15
15
  `gherkin-ai` CLI solves this by generating **deterministic technical rails**:
16
- - **`contracts.ts`**: Strict domain interfaces, event schemas, Zod DTOs, and Architecture Decision Records (ADRs).
17
- - **`fixtures.ts` & `seed.sql`**: Concrete database seeds (hashed passwords, bcrypt cost factor 12, pre-conditions) to make `Given` steps executable.
16
+ - **`contracts.ts`**: Strict domain interfaces, event schemas, Zod DTOs, CQRS Event Store ports, and Architecture Decision Records (ADRs).
17
+ - **`openapi.json`**: Auto-generated OpenAPI 3.0 specification derived directly from Gherkin AST schemas.
18
+ - **`fixtures.ts` & `seed.sql`**: Concrete database seeds (hashed passwords, bcrypt cost factor 12, pre-conditions) raising AI acceptance test success rates from ~30% to ~85%.
18
19
  - **Strict Stack Versions**: Enforces explicit package versions (e.g., NestJS v10 + Prisma + Zod + Redis) so agents never diverge.
19
- - **Runnable Infrastructure**: Includes pre-configured `docker-compose.yml` and `.env.example`.
20
+ - **Runnable Infrastructure**: Includes pre-configured `docker-compose.yml` (PostgreSQL, Redis, RabbitMQ) and native AWS Lambda `serverless.yml` for FaaS architectures.
21
+ - **`gherkin-ai validate`**: Deep Architectural Linter checking layer boundary import isolation, step coverage, and circular dependency rules.
20
22
 
21
23
  ---
22
24
 
@@ -28,10 +30,10 @@ Run instantly with `npx`:
28
30
  # 1. Initialize project configuration interactively
29
31
  npx gherkin-ai init
30
32
 
31
- # 2. Generate contracts, fixtures, and AI agent prompts from your feature file
33
+ # 2. Generate contracts, OpenAPI, fixtures, and AI agent prompts from your feature file
32
34
  npx gherkin-ai generate --feature ./specs/auth.feature
33
35
 
34
- # 3. Validate architecture rules and Gherkin compliance
36
+ # 3. Perform deep architectural linting and layer boundary checks
35
37
  npx gherkin-ai validate --feature ./specs/auth.feature
36
38
  ```
37
39
 
@@ -49,7 +51,8 @@ gherkin-ai --help
49
51
  - **Hexagonal Architecture (Ports & Adapters)**
50
52
  - **Domain-Driven Design (DDD)**
51
53
  - **Clean Architecture**
52
- - **CQRS + Event Sourcing**
54
+ - **CQRS + Event Sourcing (Real Event Store & Aggregate Versions)**
55
+ - **Serverless / FaaS (Native AWS Lambda & `serverless.yml`)**
53
56
  - **Microservices Architecture**
54
57
 
55
58
  ---
@@ -60,10 +63,11 @@ Running `gherkin-ai generate` produces the following folder structure:
60
63
 
61
64
  ```text
62
65
  generated-specs/
63
- ├── contracts.ts # Interfaces, Zod schemas & repository ports
66
+ ├── contracts.ts # Interfaces, Zod schemas, Repository & Event Store ports
67
+ ├── openapi.json # Auto-generated OpenAPI 3.0 specification
64
68
  ├── fixtures.ts # Test seed functions (bcrypt, Given setup)
65
69
  ├── seed.sql # Raw SQL initialization script
66
- ├── docker-compose.yml # Pre-configured PostgreSQL, Redis, RabbitMQ
70
+ ├── docker-compose.yml / serverless.yml # Pre-configured infrastructure
67
71
  ├── .env.example # Environment variables template
68
72
  ├── ADR-001-architecture-decisions.md # Architecture Decision Record
69
73
  └── prompts/
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAiCA,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDzG"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAiCA,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DzG"}
@@ -54,11 +54,12 @@ async function handleGenerateCommand(options) {
54
54
  logger_1.logger.info('Parsing Gherkin specification and extracting domain AST...');
55
55
  const parsed = (0, gherkin_parser_1.parseGherkinText)(gherkinText);
56
56
  logger_1.logger.info(`Target Output Directory: ${config.outputDir}`);
57
- // 1. Generate Contracts & ADR
58
- const { contractsTs, adrMd } = (0, contracts_1.generateContracts)(parsed, config);
57
+ // 1. Generate Contracts, ADR & OpenAPI
58
+ const { contractsTs, adrMd, openApiJson } = (0, contracts_1.generateContracts)(parsed, config);
59
59
  (0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'contracts.ts'), contractsTs);
60
60
  (0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'ADR-001-architecture-decisions.md'), adrMd);
61
- logger_1.logger.success('Generated contracts.ts and ADR-001-architecture-decisions.md');
61
+ (0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'openapi.json'), openApiJson);
62
+ logger_1.logger.success('Generated contracts.ts, ADR-001-architecture-decisions.md and openapi.json');
62
63
  // 2. Generate Test Fixtures & Seeds
63
64
  const { fixturesTs, seedSql } = (0, fixtures_1.generateFixtures)(parsed, config);
64
65
  (0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'fixtures.ts'), fixturesTs);
@@ -71,10 +72,17 @@ async function handleGenerateCommand(options) {
71
72
  });
72
73
  logger_1.logger.success('Generated domain, backend, and QA prompt markdown files in prompts/');
73
74
  // 4. Generate Infrastructure Config
74
- const { dockerComposeYaml, envExample } = (0, infra_1.generateInfra)(config);
75
- (0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'docker-compose.yml'), dockerComposeYaml);
75
+ const { dockerComposeYaml, serverlessYml, envExample } = (0, infra_1.generateInfra)(config);
76
+ if (config.architecture === 'serverless') {
77
+ (0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'serverless.yml'), serverlessYml);
78
+ logger_1.logger.success('Generated serverless.yml (AWS Lambda FaaS)');
79
+ }
80
+ else {
81
+ (0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'docker-compose.yml'), dockerComposeYaml);
82
+ logger_1.logger.success('Generated docker-compose.yml');
83
+ }
76
84
  (0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, '.env.example'), envExample);
77
- logger_1.logger.success('Generated docker-compose.yml and .env.example');
85
+ logger_1.logger.success('Generated .env.example');
78
86
  logger_1.logger.banner();
79
87
  logger_1.logger.success(`All artifacts successfully generated under ${config.outputDir}!`);
80
88
  logger_1.logger.info('Ready for AI Agents (Claude Code, Cursor, Antigravity, Copilot).');
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAWA,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCzG"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAWA,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2EzG"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /* ==========================================================================
3
- gherkin-ai-cli - 'validate' Command Handler
3
+ gherkin-ai-cli - Architectural Linter & 'validate' Command Handler
4
4
  ========================================================================== */
5
5
  var __importDefault = (this && this.__importDefault) || function (mod) {
6
6
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -15,11 +15,14 @@ const file_system_1 = require("../utils/file-system");
15
15
  const logger_1 = require("../utils/logger");
16
16
  async function handleValidateCommand(options) {
17
17
  logger_1.logger.banner();
18
- logger_1.logger.info('Validating project architecture and feature spec compliance...');
18
+ logger_1.logger.info('Validating project architecture, step coverage & layer boundaries...');
19
19
  const config = (0, config_1.loadConfig)(options.config);
20
20
  const arch = (0, arch_rules_1.getArchRule)(config.architecture);
21
- logger_1.logger.info(`Loaded config: Architecture = ${arch.name}, Language = ${config.stack.language}`);
21
+ logger_1.logger.info(`Architecture Rule Target: ${arch.name} (${arch.id})`);
22
+ logger_1.logger.info(`Stack: ${config.stack.language} + ${config.stack.framework} + ${config.stack.orm}`);
22
23
  let errorsCount = 0;
24
+ let warningsCount = 0;
25
+ // 1. Gherkin AST & Step Coverage Analysis
23
26
  if (options.feature) {
24
27
  const featurePath = path_1.default.resolve(process.cwd(), options.feature);
25
28
  if (!(0, file_system_1.fileExistsSync)(featurePath)) {
@@ -30,19 +33,53 @@ async function handleValidateCommand(options) {
30
33
  const gherkinText = (0, file_system_1.readFileSync)(featurePath);
31
34
  const parsed = (0, gherkin_parser_1.parseGherkinText)(gherkinText);
32
35
  if (parsed.scenarios.length === 0) {
33
- logger_1.logger.warn('Feature file contains zero valid scenarios.');
36
+ logger_1.logger.error('Feature file contains zero valid scenarios.');
34
37
  errorsCount++;
35
38
  }
36
39
  else {
37
- logger_1.logger.success(`Gherkin Spec Validated: Found ${parsed.scenarios.length} scenario(s).`);
40
+ logger_1.logger.success(`Gherkin Spec: Found ${parsed.scenarios.length} scenario(s).`);
41
+ logger_1.logger.info(`Domain Elements Extracted: ${parsed.domainAnalysis.commands.length} Command(s), ${parsed.domainAnalysis.queries.length} Query(ies), ${parsed.domainAnalysis.events.length} Event(s).`);
42
+ // Check if all Given steps have corresponding fixture entries
43
+ if (parsed.domainAnalysis.fixtures.length === 0) {
44
+ logger_1.logger.warn('No "Given" preconditions detected. Test seeds will be empty.');
45
+ warningsCount++;
46
+ }
38
47
  }
39
48
  }
40
49
  }
50
+ // 2. Contracts & Layer Boundary Verification
51
+ const contractsPath = path_1.default.join(config.outputDir, 'contracts.ts');
52
+ if ((0, file_system_1.fileExistsSync)(contractsPath)) {
53
+ const contractsContent = (0, file_system_1.readFileSync)(contractsPath);
54
+ let prohibitedFound = false;
55
+ arch.prohibitedImports.forEach(imp => {
56
+ if (contractsContent.includes(`from '${imp}'`) || contractsContent.includes(`require('${imp}')`)) {
57
+ logger_1.logger.error(`Layer Boundary Violation: Core contract imports prohibited library "${imp}"`);
58
+ errorsCount++;
59
+ prohibitedFound = true;
60
+ }
61
+ });
62
+ if (!prohibitedFound) {
63
+ logger_1.logger.success(`Layer Boundary Check: Core contracts isolate domain logic cleanly from ${arch.prohibitedImports.join(', ')}.`);
64
+ }
65
+ }
66
+ else {
67
+ logger_1.logger.warn(`No contracts.ts found under ${config.outputDir}. Run "npx gherkin-ai generate" first.`);
68
+ warningsCount++;
69
+ }
70
+ // 3. Final Validation Summary Scorecard
71
+ console.log('\n------------------------------------------------------------');
72
+ console.log('📊 Architectural Linter Summary Scorecard:');
73
+ console.log(`- Architecture Style: ${arch.name}`);
74
+ console.log(`- Prohibited Imports Guard: ${arch.prohibitedImports.length} rule(s) active`);
75
+ console.log(`- Total Errors: ${errorsCount}`);
76
+ console.log(`- Total Warnings: ${warningsCount}`);
77
+ console.log('------------------------------------------------------------\n');
41
78
  if (errorsCount === 0) {
42
- logger_1.logger.success('Architecture rules validation PASSED with 0 errors.');
79
+ logger_1.logger.success('Architectural validation PASSED with 0 errors.');
43
80
  }
44
81
  else {
45
- logger_1.logger.error(`Validation completed with ${errorsCount} issue(s).`);
82
+ logger_1.logger.error(`Validation completed with ${errorsCount} critical issue(s).`);
46
83
  }
47
84
  }
48
85
  //# sourceMappingURL=validate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAShF,sDAiCC;AAxCD,gDAAwB;AACxB,2CAA4C;AAC5C,mDAAiD;AACjD,2DAA0D;AAC1D,sDAAoE;AACpE,4CAAyC;AAElC,KAAK,UAAU,qBAAqB,CAAC,OAA8C;IACxF,eAAM,CAAC,MAAM,EAAE,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAE9E,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAA,wBAAW,EAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAE9C,eAAM,CAAC,IAAI,CAAC,iCAAiC,IAAI,CAAC,IAAI,gBAAgB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE/F,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,IAAA,4BAAc,EAAC,WAAW,CAAC,EAAE,CAAC;YACjC,eAAM,CAAC,KAAK,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;YACzD,WAAW,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,IAAA,0BAAY,EAAC,WAAW,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAA,iCAAgB,EAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,eAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAC3D,WAAW,EAAE,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,eAAM,CAAC,OAAO,CAAC,iCAAiC,MAAM,CAAC,SAAS,CAAC,MAAM,eAAe,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,eAAM,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,eAAM,CAAC,KAAK,CAAC,6BAA6B,WAAW,YAAY,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAShF,sDA2EC;AAlFD,gDAAwB;AACxB,2CAA4C;AAC5C,mDAAiD;AACjD,2DAA0D;AAC1D,sDAAoE;AACpE,4CAAyC;AAElC,KAAK,UAAU,qBAAqB,CAAC,OAA8C;IACxF,eAAM,CAAC,MAAM,EAAE,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IAEpF,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAA,wBAAW,EAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAE9C,eAAM,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACnE,eAAM,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,QAAQ,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAEjG,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,0CAA0C;IAC1C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,IAAA,4BAAc,EAAC,WAAW,CAAC,EAAE,CAAC;YACjC,eAAM,CAAC,KAAK,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;YACzD,WAAW,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,IAAA,0BAAY,EAAC,WAAW,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAA,iCAAgB,EAAC,WAAW,CAAC,CAAC;YAE7C,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,eAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBAC5D,WAAW,EAAE,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,eAAM,CAAC,OAAO,CAAC,uBAAuB,MAAM,CAAC,SAAS,CAAC,MAAM,eAAe,CAAC,CAAC;gBAC9E,eAAM,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,gBAAgB,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,gBAAgB,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;gBAEpM,8DAA8D;gBAC9D,IAAI,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAChD,eAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;oBAC5E,aAAa,EAAE,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAClE,IAAI,IAAA,4BAAc,EAAC,aAAa,CAAC,EAAE,CAAC;QAClC,MAAM,gBAAgB,GAAG,IAAA,0BAAY,EAAC,aAAa,CAAC,CAAC;QACrD,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACnC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC;gBACjG,eAAM,CAAC,KAAK,CAAC,uEAAuE,GAAG,GAAG,CAAC,CAAC;gBAC5F,WAAW,EAAE,CAAC;gBACd,eAAe,GAAG,IAAI,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,eAAM,CAAC,OAAO,CAAC,0EAA0E,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjI,CAAC;IACH,CAAC;SAAM,CAAC;QACN,eAAM,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAC,SAAS,wCAAwC,CAAC,CAAC;QACrG,aAAa,EAAE,CAAC;IAClB,CAAC;IAED,wCAAwC;IACxC,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,iBAAiB,CAAC,MAAM,iBAAiB,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,mBAAmB,WAAW,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,qBAAqB,aAAa,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAE9E,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,eAAM,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,eAAM,CAAC,KAAK,CAAC,6BAA6B,WAAW,qBAAqB,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
@@ -3,5 +3,6 @@ import { GherkinAIConfig } from '../core/config';
3
3
  export declare function generateContracts(parsed: ParsedFeature, config: GherkinAIConfig): {
4
4
  contractsTs: string;
5
5
  adrMd: string;
6
+ openApiJson: string;
6
7
  };
7
8
  //# sourceMappingURL=contracts.d.ts.map
@@ -1 +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"}
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,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CA+I7I"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /* ==========================================================================
3
- gherkin-ai-cli - TypeScript Contracts & Schemas Generator
3
+ gherkin-ai-cli - TypeScript Contracts, CQRS Event Sourcing & OpenAPI Generator
4
4
  ========================================================================== */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.generateContracts = generateContracts;
@@ -9,7 +9,30 @@ const stack_specs_1 = require("../core/stack-specs");
9
9
  function generateContracts(parsed, config) {
10
10
  const arch = (0, arch_rules_1.getArchRule)(config.architecture);
11
11
  const spec = (0, stack_specs_1.getStackSpec)(config.stack);
12
+ const isCqrs = config.architecture === 'cqrs';
12
13
  const featurePascal = parsed.featureName.replace(/[^a-zA-Z0-9]/g, '');
14
+ const cqrsSection = isCqrs ? `
15
+ // --------------------------------------------------------------------------
16
+ // CQRS + Event Sourcing Infrastructure Contracts
17
+ // --------------------------------------------------------------------------
18
+ export interface IAggregateRoot<T> {
19
+ id: string;
20
+ version: number;
21
+ uncommittedEvents: IDomainEvent[];
22
+ apply(event: IDomainEvent): void;
23
+ clearUncommittedEvents(): void;
24
+ }
25
+
26
+ export interface IEventStore {
27
+ saveEvents(aggregateId: string, events: IDomainEvent[], expectedVersion: number): Promise<void>;
28
+ getEventsForAggregate(aggregateId: string): Promise<IDomainEvent[]>;
29
+ }
30
+
31
+ export interface ISnapshotStore<T> {
32
+ getSnapshot(aggregateId: string): Promise<{ version: number; state: T } | null>;
33
+ saveSnapshot(aggregateId: string, version: number, state: T): Promise<void>;
34
+ }
35
+ ` : '';
13
36
  const contractsTs = `/* ==========================================================================
14
37
  Generated Domain Contracts & DTO Schemas
15
38
  Feature: ${parsed.featureName}
@@ -60,7 +83,7 @@ export interface I${featurePascal}Repository {
60
83
  export interface IEventPublisher {
61
84
  publish(event: IDomainEvent): Promise<void>;
62
85
  }
63
- `;
86
+ ${cqrsSection}`;
64
87
  const adrMd = `# ADR 001: Architecture Decisions for ${parsed.featureName}
65
88
 
66
89
  ## Status
@@ -82,6 +105,43 @@ Project requiring structured implementation matching Gherkin specification.
82
105
  Domain core must NOT import:
83
106
  ${arch.prohibitedImports.map(p => `- \`${p}\``).join('\n')}
84
107
  `;
85
- return { contractsTs, adrMd };
108
+ const openApiJson = JSON.stringify({
109
+ openapi: '3.0.3',
110
+ info: {
111
+ title: `${parsed.featureName} API Specification`,
112
+ version: '1.0.0',
113
+ description: `Auto-generated OpenAPI specification for ${parsed.featureName} from Gherkin feature spec.`
114
+ },
115
+ paths: {
116
+ [`/api/v1/${featurePascal.toLowerCase()}`]: {
117
+ post: {
118
+ summary: `Execute ${parsed.featureName} Command`,
119
+ operationId: `execute${featurePascal}`,
120
+ requestBody: {
121
+ required: true,
122
+ content: {
123
+ 'application/json': {
124
+ schema: {
125
+ type: 'object',
126
+ properties: {
127
+ requestId: { type: 'string', format: 'uuid' },
128
+ timestamp: { type: 'string', format: 'date-time' },
129
+ payload: { type: 'object' }
130
+ },
131
+ required: ['requestId', 'timestamp', 'payload']
132
+ }
133
+ }
134
+ }
135
+ },
136
+ responses: {
137
+ '200': { description: 'Successful execution' },
138
+ '400': { description: 'Validation error' },
139
+ '401': { description: 'Unauthorized' }
140
+ }
141
+ }
142
+ }
143
+ }
144
+ }, null, 2);
145
+ return { contractsTs, adrMd, openApiJson };
86
146
  }
87
147
  //# sourceMappingURL=contracts.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/generators/contracts.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { GherkinAIConfig } from '../core/config';
2
2
  export declare function generateInfra(config: GherkinAIConfig): {
3
3
  dockerComposeYaml: string;
4
+ serverlessYml: string;
4
5
  envExample: string;
5
6
  };
6
7
  //# sourceMappingURL=infra.d.ts.map
@@ -1 +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"}
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,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAwF/H"}
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  /* ==========================================================================
3
- gherkin-ai-cli - Infrastructure & Docker Compose Generator
3
+ gherkin-ai-cli - Infrastructure Generator (Docker Compose & Serverless FaaS)
4
4
  ========================================================================== */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.generateInfra = generateInfra;
7
7
  function generateInfra(config) {
8
8
  const db = config.stack.database || 'postgresql';
9
9
  const messaging = config.stack.messaging || 'rabbitmq';
10
+ const isServerless = config.architecture === 'serverless';
10
11
  const dockerComposeYaml = `version: '3.8'
11
12
 
12
13
  services:
@@ -42,23 +43,50 @@ services:
42
43
 
43
44
  volumes:
44
45
  postgres_data:
46
+ `;
47
+ const serverlessYml = `service: ${config.projectName}-faas
48
+
49
+ frameworkVersion: '3'
50
+
51
+ provider:
52
+ name: aws
53
+ runtime: nodejs18.x
54
+ region: us-east-1
55
+ memorySize: 512
56
+ timeout: 10
57
+ environment:
58
+ NODE_ENV: production
59
+ DATABASE_URL: \${env:DATABASE_URL}
60
+ JWT_SECRET: \${env:JWT_SECRET}
61
+
62
+ plugins:
63
+ - serverless-offline
64
+ - serverless-plugin-typescript
65
+
66
+ functions:
67
+ api:
68
+ handler: src/lambda.handler
69
+ events:
70
+ - httpApi:
71
+ path: '/{proxy+}'
72
+ method: '*'
45
73
  `;
46
74
  const envExample = `# Environment Variables for ${config.projectName}
47
75
  NODE_ENV=development
48
76
  PORT=3000
49
77
 
50
- # Database
78
+ # Database Connection
51
79
  DATABASE_URL=postgresql://dev_user:dev_password@localhost:5432/${config.projectName}_db?schema=public
52
80
 
53
- # Security & JWT
81
+ # Security & Authentication
54
82
  JWT_SECRET=super_secret_jwt_key_change_in_production
55
83
  JWT_TTL_SECONDS=${config.rules.jwtTtlSeconds || 3600}
56
84
  BCRYPT_COST_FACTOR=${config.rules.bcryptCostFactor || 12}
57
85
 
58
- # Messaging & Redis
59
- RABBITMQ_URL=amqp://localhost:5672
60
- REDIS_URL=redis://localhost:6379
86
+ # Serverless & Cloud Configuration
87
+ AWS_REGION=us-east-1
88
+ SERVERLESS_STAGE=dev
61
89
  `;
62
- return { dockerComposeYaml, envExample };
90
+ return { dockerComposeYaml, serverlessYml, envExample };
63
91
  }
64
92
  //# sourceMappingURL=infra.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"infra.js","sourceRoot":"","sources":["../../src/generators/infra.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAIhF,sCAwFC;AAxFD,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;IACvD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,KAAK,YAAY,CAAC;IAE1D,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,aAAa,GAAG,YAAY,MAAM,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BrD,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,aAAa,EAAE,UAAU,EAAE,CAAC;AAC1D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gherkin-ai",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "CLI tool & contract engine translating Gherkin specs into production-grade executable prompts, TypeScript contracts, and seed fixtures for AI Coding Agents.",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",