gherkin-ai 1.3.2 → 1.5.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 (50) hide show
  1. package/README.md +21 -31
  2. package/dist/commands/add.d.ts.map +1 -1
  3. package/dist/commands/add.js +28 -8
  4. package/dist/commands/add.js.map +1 -1
  5. package/dist/commands/create.d.ts +6 -0
  6. package/dist/commands/create.d.ts.map +1 -0
  7. package/dist/commands/create.js +130 -0
  8. package/dist/commands/create.js.map +1 -0
  9. package/dist/commands/lang.d.ts +4 -0
  10. package/dist/commands/lang.d.ts.map +1 -0
  11. package/dist/commands/lang.js +38 -0
  12. package/dist/commands/lang.js.map +1 -0
  13. package/dist/commands/mcp.d.ts +2 -0
  14. package/dist/commands/mcp.d.ts.map +1 -0
  15. package/dist/commands/mcp.js +12 -0
  16. package/dist/commands/mcp.js.map +1 -0
  17. package/dist/generators/contracts-csharp.d.ts +4 -0
  18. package/dist/generators/contracts-csharp.d.ts.map +1 -0
  19. package/dist/generators/contracts-csharp.js +69 -0
  20. package/dist/generators/contracts-csharp.js.map +1 -0
  21. package/dist/generators/contracts-go.d.ts +4 -0
  22. package/dist/generators/contracts-go.d.ts.map +1 -0
  23. package/dist/generators/contracts-go.js +69 -0
  24. package/dist/generators/contracts-go.js.map +1 -0
  25. package/dist/generators/contracts-php.d.ts +4 -0
  26. package/dist/generators/contracts-php.d.ts.map +1 -0
  27. package/dist/generators/contracts-php.js +78 -0
  28. package/dist/generators/contracts-php.js.map +1 -0
  29. package/dist/generators/contracts-python.d.ts +4 -0
  30. package/dist/generators/contracts-python.d.ts.map +1 -0
  31. package/dist/generators/contracts-python.js +61 -0
  32. package/dist/generators/contracts-python.js.map +1 -0
  33. package/dist/generators/contracts.d.ts +7 -2
  34. package/dist/generators/contracts.d.ts.map +1 -1
  35. package/dist/generators/contracts.js +33 -3
  36. package/dist/generators/contracts.js.map +1 -1
  37. package/dist/index.js +35 -2
  38. package/dist/index.js.map +1 -1
  39. package/dist/mcp/mcp-server.d.ts +2 -0
  40. package/dist/mcp/mcp-server.d.ts.map +1 -0
  41. package/dist/mcp/mcp-server.js +185 -0
  42. package/dist/mcp/mcp-server.js.map +1 -0
  43. package/dist/utils/i18n-cli.d.ts +53 -0
  44. package/dist/utils/i18n-cli.d.ts.map +1 -0
  45. package/dist/utils/i18n-cli.js +124 -0
  46. package/dist/utils/i18n-cli.js.map +1 -0
  47. package/docs/ARCHITECTURE.md +35 -16
  48. package/docs/MCP_GUIDE.md +145 -0
  49. package/docs/USAGE_GUIDE.md +96 -69
  50. package/package.json +8 -9
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, OpenAPI specs, 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, Python Pydantic DTOs, PHP 8.2 Classes, Go Structs, C# Records, 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,59 +13,49 @@
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, CQRS Event Store ports, and Architecture Decision Records (ADRs).
16
+ - **Native Model Context Protocol (MCP) Server (`ghk mcp`)**: Exposes stdio MCP JSON-RPC 2.0 tools so Claude Desktop, Cursor, Antigravity, and Windsurf can invoke `gherkin-ai` tools directly.
17
+ - **Native Multi-Language Contracts (`contracts.py`, `contracts.php`, `contracts.go`, `contracts.cs`, `contracts.ts`)**: Strict domain interfaces and DTOs generated natively for your target language (Pydantic v2 in Python, Readonly Classes in PHP 8.2, Structs in Go, Records in C#).
17
18
  - **`openapi.json`**: Auto-generated OpenAPI 3.0 specification derived directly from Gherkin AST schemas.
18
19
  - **`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%.
19
- - **Brownfield Integration (`ghk detect` & `ghk add`)**: Inject contracts directly into existing project module folders without starting from scratch.
20
+ - **Interactive Spec Wizard (`ghk create`)**: Create Gherkin specifications step-by-step directly from your terminal.
21
+ - **Brownfield Integration (`ghk detect` & `ghk add`)**: Inject contracts directly into existing project module folders (Laravel, Rails, .NET, Angular, NestJS, etc.).
20
22
  - **Bilingual Gherkin Parsing**: Native support for English (`Given/When/Then`) and Spanish (`Dado/Cuando/Entonces`).
21
- - **Strict Stack Versions**: Enforces explicit package versions (e.g., NestJS v10 + Prisma + Zod + Redis) so agents never diverge.
22
- - **Runnable Infrastructure**: Includes pre-configured `docker-compose.yml` (PostgreSQL, Redis, RabbitMQ) and native AWS Lambda `serverless.yml` for FaaS architectures.
23
- - **`ghk validate`**: Deep Architectural Linter checking layer boundary import isolation, step coverage, and circular dependency rules.
24
23
 
25
24
  ---
26
25
 
27
- ## 🚀 Usage Modes: Greenfield vs. Brownfield (Existing Projects)
26
+ ## 🚀 Quick Start Commands
28
27
 
29
- ### 1. Existing Projects (Brownfield Mode)
28
+ ### 1. Model Context Protocol (MCP) Server
30
29
 
31
- If you have an existing codebase, auto-detect your stack and inject feature contracts into specific module folders:
30
+ Connect your AI Agent (Claude Desktop, Cursor, Antigravity) directly to `gherkin-ai`:
32
31
 
33
32
  ```bash
34
- # 1. Auto-detect stack (reads package.json, prisma, tsconfig, etc.)
35
- ghk detect
36
-
37
- # 2. Inject contract directly into an existing module folder
38
- ghk add --feature ./specs/payments.feature --target ./src/modules/payments
33
+ ghk mcp
39
34
  ```
40
35
 
41
- ### 2. New Projects (Greenfield Mode)
36
+ *(See the complete [MCP Integration Guide](docs/MCP_GUIDE.md) for step-by-step setup).*
42
37
 
43
- ```bash
44
- # 1. Initialize project configuration interactively
45
- ghk init
46
-
47
- # 2. Generate contracts, OpenAPI, fixtures, and AI agent prompts
48
- ghk generate --feature ./specs/auth.feature
38
+ ### 2. Create a Gherkin Spec Interactively (`ghk create`)
49
39
 
50
- # 3. Perform deep architectural linting and layer boundary checks
51
- ghk validate --feature ./specs/auth.feature
40
+ ```bash
41
+ ghk create # (or: ghk new)
52
42
  ```
53
43
 
54
- ---
44
+ ### 3. Existing Projects (Brownfield Mode)
55
45
 
56
- ## 🏗️ Supported Architecture Styles
46
+ ```bash
47
+ # 1. Auto-detect stack (Laravel, Rails, .NET, NestJS, Angular, Flutter, etc.)
48
+ ghk detect
57
49
 
58
- - **Hexagonal Architecture (Ports & Adapters)**
59
- - **Domain-Driven Design (DDD)**
60
- - **Clean Architecture**
61
- - **CQRS + Event Sourcing (Real Event Store & Aggregate Versions)**
62
- - **Serverless / FaaS (Native AWS Lambda & `serverless.yml`)**
63
- - **Microservices Architecture**
50
+ # 2. Inject native language contract directly into an existing module folder
51
+ ghk add --feature ./specs/payments.feature --target ./src/modules/payments
52
+ ```
64
53
 
65
54
  ---
66
55
 
67
56
  ## 📖 Complete Documentation
68
57
 
58
+ - [Model Context Protocol (MCP) Integration Guide](docs/MCP_GUIDE.md)
69
59
  - [Comprehensive Usage Guide](docs/USAGE_GUIDE.md)
70
60
  - [CLI Architecture & Agent Pipeline](docs/ARCHITECTURE.md)
71
61
  - [Live Web SPA Playground](https://fennereduardo.com/pages/GherkinIATool/)
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAaA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDrH"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAeA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6ErH"}
@@ -8,24 +8,40 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.handleAddCommand = handleAddCommand;
10
10
  const path_1 = __importDefault(require("path"));
11
+ const inquirer_1 = __importDefault(require("inquirer"));
11
12
  const config_1 = require("../core/config");
12
13
  const stack_detector_1 = require("../core/stack-detector");
13
14
  const gherkin_parser_1 = require("../core/gherkin-parser");
14
15
  const contracts_1 = require("../generators/contracts");
15
16
  const prompts_1 = require("../generators/prompts");
17
+ const create_1 = require("./create");
16
18
  const file_system_1 = require("../utils/file-system");
17
19
  const logger_1 = require("../utils/logger");
18
20
  async function handleAddCommand(options) {
19
21
  logger_1.logger.banner();
20
22
  if (!options.feature) {
21
- logger_1.logger.error('Missing required option: --feature <file>');
22
- logger_1.logger.info('Usage: ghk add --feature ./specs/my-feature.feature [--target ./src/modules/my-feature]');
23
- process.exit(1);
23
+ logger_1.logger.info('No --feature file specified. Launching interactive spec wizard...');
24
+ await (0, create_1.handleCreateCommand)({ target: options.target });
25
+ return;
24
26
  }
25
27
  const featurePath = path_1.default.resolve(process.cwd(), options.feature);
26
28
  if (!(0, file_system_1.fileExistsSync)(featurePath)) {
27
- logger_1.logger.error(`Feature file not found at: ${featurePath}`);
28
- process.exit(1);
29
+ logger_1.logger.warn(`Feature file not found at: ${featurePath}`);
30
+ const answer = await inquirer_1.default.prompt([
31
+ {
32
+ type: 'confirm',
33
+ name: 'createNow',
34
+ message: '¿Deseas crear la especificación Gherkin paso a paso ahora (wizard interactivo)?',
35
+ default: true
36
+ }
37
+ ]);
38
+ if (answer.createNow) {
39
+ await (0, create_1.handleCreateCommand)({ output: options.feature, target: options.target });
40
+ return;
41
+ }
42
+ else {
43
+ process.exit(1);
44
+ }
29
45
  }
30
46
  // Load config or auto-detect if config doesn't exist
31
47
  let config = (0, config_1.loadConfig)(options.config);
@@ -42,13 +58,17 @@ async function handleAddCommand(options) {
42
58
  : path_1.default.resolve(process.cwd(), 'src', 'modules', featurePascal.toLowerCase());
43
59
  (0, file_system_1.ensureDirSync)(targetDir);
44
60
  logger_1.logger.info(`Injecting contracts & AI prompts into: ${targetDir}`);
45
- // 1. Generate Contracts & OpenAPI
46
- const { contractsTs, adrMd, openApiJson } = (0, contracts_1.generateContracts)(parsed, config);
61
+ // 1. Generate Contracts, OpenAPI & Native Language Contract
62
+ const { contractsTs, adrMd, openApiJson, nativeContract } = (0, contracts_1.generateContracts)(parsed, config);
47
63
  const contractFileName = `${featurePascal.toLowerCase()}.contract.ts`;
48
64
  (0, file_system_1.writeFileSync)(path_1.default.join(targetDir, contractFileName), contractsTs);
49
65
  (0, file_system_1.writeFileSync)(path_1.default.join(targetDir, `${featurePascal.toLowerCase()}.openapi.json`), openApiJson);
50
66
  (0, file_system_1.writeFileSync)(path_1.default.join(targetDir, `ADR-${featurePascal}.md`), adrMd);
51
67
  logger_1.logger.success(`Created contract file: ${path_1.default.join(targetDir, contractFileName)}`);
68
+ if (nativeContract) {
69
+ (0, file_system_1.writeFileSync)(path_1.default.join(targetDir, nativeContract.filename), nativeContract.content);
70
+ logger_1.logger.success(`Created language-native contract file: ${path_1.default.join(targetDir, nativeContract.filename)}`);
71
+ }
52
72
  // 2. Generate Agent Prompts inside target module
53
73
  const promptsDir = path_1.default.join(targetDir, 'prompts');
54
74
  (0, file_system_1.ensureDirSync)(promptsDir);
@@ -59,6 +79,6 @@ async function handleAddCommand(options) {
59
79
  logger_1.logger.success(`Created specialized AI prompts inside: ${promptsDir}`);
60
80
  logger_1.logger.banner();
61
81
  logger_1.logger.success(`Contracts & AI prompts injected into existing project at ${targetDir}!`);
62
- logger_1.logger.info(`Now your AI Coding Agent can consume ${contractFileName} directly inside your module.`);
82
+ logger_1.logger.info(`Now your AI Coding Agent can consume ${nativeContract ? nativeContract.filename : contractFileName} directly inside your module.`);
63
83
  }
64
84
  //# sourceMappingURL=add.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function handleCreateCommand(options: {
2
+ output?: string;
3
+ target?: string;
4
+ lang?: string;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAWA,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiIrH"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - 'create' Command Handler (Localized Interactive Spec Wizard)
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.handleCreateCommand = handleCreateCommand;
10
+ const path_1 = __importDefault(require("path"));
11
+ const inquirer_1 = __importDefault(require("inquirer"));
12
+ const add_1 = require("./add");
13
+ const i18n_cli_1 = require("../utils/i18n-cli");
14
+ const file_system_1 = require("../utils/file-system");
15
+ const logger_1 = require("../utils/logger");
16
+ async function handleCreateCommand(options) {
17
+ logger_1.logger.banner();
18
+ const locale = await (0, i18n_cli_1.ensureCliLanguage)(options.lang);
19
+ const isEs = locale === 'es';
20
+ logger_1.logger.info(isEs ? 'Asistente Interactivo Gherkin - Creación paso a paso' : 'Interactive Gherkin Spec Wizard - Step-by-step feature creator');
21
+ const answers = await inquirer_1.default.prompt([
22
+ {
23
+ type: 'input',
24
+ name: 'featureName',
25
+ message: (0, i18n_cli_1.t)('featureNamePrompt', locale),
26
+ default: isEs ? 'Autenticación de Doble Factor 2FA' : 'Two Factor Authentication 2FA',
27
+ validate: (input) => input.trim().length > 0 || 'Name cannot be empty.'
28
+ },
29
+ {
30
+ type: 'input',
31
+ name: 'actor',
32
+ message: (0, i18n_cli_1.t)('actorPrompt', locale),
33
+ default: isEs ? 'usuario autenticado del sistema' : 'authenticated system user'
34
+ },
35
+ {
36
+ type: 'input',
37
+ name: 'action',
38
+ message: (0, i18n_cli_1.t)('actionPrompt', locale),
39
+ default: isEs ? 'habilitar y verificar un código OTP de dos factores' : 'enable and verify a two-factor OTP code'
40
+ },
41
+ {
42
+ type: 'input',
43
+ name: 'outcome',
44
+ message: (0, i18n_cli_1.t)('outcomePrompt', locale),
45
+ default: isEs ? 'proteger mi cuenta contra accesos no autorizados' : 'protect my account against unauthorized access'
46
+ },
47
+ {
48
+ type: 'input',
49
+ name: 'scenarioName',
50
+ message: (0, i18n_cli_1.t)('scenarioNamePrompt', locale),
51
+ default: isEs ? 'Habilitar y verificar código 2FA exitosamente' : 'Enable and verify 2FA code successfully'
52
+ }
53
+ ]);
54
+ const steps = [];
55
+ console.log(isEs ? '\n--- Asistente de Pasos Gherkin (Dado / Cuando / Entonces) ---' : '\n--- Step-by-step Gherkin Scenario Builder (Given / When / Then) ---');
56
+ let addMore = true;
57
+ let defaultKw = isEs ? 'Dado' : 'Given';
58
+ const choicesEn = ['Given', 'When', 'Then', 'And', 'But'];
59
+ const choicesEs = ['Dado', 'Cuando', 'Entonces', 'Y', 'Pero'];
60
+ while (addMore) {
61
+ const stepAnswers = await inquirer_1.default.prompt([
62
+ {
63
+ type: 'list',
64
+ name: 'keyword',
65
+ message: (0, i18n_cli_1.t)('stepKeywordPrompt', locale),
66
+ choices: isEs ? choicesEs : choicesEn,
67
+ default: defaultKw
68
+ },
69
+ {
70
+ type: 'input',
71
+ name: 'text',
72
+ message: (0, i18n_cli_1.t)('stepDescPrompt', locale),
73
+ validate: (input) => input.trim().length > 0 || 'Description cannot be empty.'
74
+ },
75
+ {
76
+ type: 'confirm',
77
+ name: 'next',
78
+ message: (0, i18n_cli_1.t)('addAnotherStepPrompt', locale),
79
+ default: true
80
+ }
81
+ ]);
82
+ steps.push({ keyword: stepAnswers.keyword, text: stepAnswers.text });
83
+ if (['Dado', 'Given'].includes(stepAnswers.keyword))
84
+ defaultKw = isEs ? 'Cuando' : 'When';
85
+ else if (['Cuando', 'When'].includes(stepAnswers.keyword))
86
+ defaultKw = isEs ? 'Entonces' : 'Then';
87
+ else
88
+ defaultKw = isEs ? 'Y' : 'And';
89
+ addMore = stepAnswers.next;
90
+ }
91
+ // Construct Gherkin File Content
92
+ const featureKw = isEs ? 'Característica:' : 'Feature:';
93
+ const asKw = isEs ? 'Como' : 'As a';
94
+ const wantKw = isEs ? 'Quiero' : 'I want to';
95
+ const soKw = isEs ? 'Para' : 'So that';
96
+ const scKw = isEs ? 'Escenario:' : 'Scenario:';
97
+ let gherkinContent = `${featureKw} ${answers.featureName}\n`;
98
+ gherkinContent += ` ${asKw} ${answers.actor}\n`;
99
+ gherkinContent += ` ${wantKw} ${answers.action}\n`;
100
+ gherkinContent += ` ${soKw} ${answers.outcome}\n\n`;
101
+ gherkinContent += ` ${scKw} ${answers.scenarioName}\n`;
102
+ steps.forEach(st => {
103
+ gherkinContent += ` ${st.keyword} ${st.text}\n`;
104
+ });
105
+ const defaultFileName = answers.featureName.toLowerCase().replace(/[^a-z0-9]/g, '_') + '.feature';
106
+ const targetSpecPath = options.output
107
+ ? path_1.default.resolve(process.cwd(), options.output)
108
+ : path_1.default.resolve(process.cwd(), 'specs', defaultFileName);
109
+ (0, file_system_1.writeFileSync)(targetSpecPath, gherkinContent);
110
+ logger_1.logger.success(`${(0, i18n_cli_1.t)('specCreated', locale)} ${targetSpecPath}`);
111
+ console.log('\n------------------------------------------------------------');
112
+ console.log(gherkinContent);
113
+ console.log('------------------------------------------------------------\n');
114
+ // Prompt to immediately inject contracts into project
115
+ const injectAnswer = await inquirer_1.default.prompt([
116
+ {
117
+ type: 'confirm',
118
+ name: 'inject',
119
+ message: (0, i18n_cli_1.t)('injectPrompt', locale),
120
+ default: true
121
+ }
122
+ ]);
123
+ if (injectAnswer.inject) {
124
+ await (0, add_1.handleAddCommand)({
125
+ feature: targetSpecPath,
126
+ target: options.target
127
+ });
128
+ }
129
+ }
130
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function handleLangCommand(options: {
2
+ set?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=lang.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lang.d.ts","sourceRoot":"","sources":["../../src/commands/lang.ts"],"names":[],"mappings":"AAQA,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BhF"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - 'lang' Command Handler (Language Switcher)
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.handleLangCommand = handleLangCommand;
10
+ const inquirer_1 = __importDefault(require("inquirer"));
11
+ const i18n_cli_1 = require("../utils/i18n-cli");
12
+ const logger_1 = require("../utils/logger");
13
+ async function handleLangCommand(options) {
14
+ logger_1.logger.banner();
15
+ if (options.set === 'en' || options.set === 'es') {
16
+ (0, i18n_cli_1.saveGlobalUserLocale)(options.set);
17
+ logger_1.logger.success((0, i18n_cli_1.t)('langUpdated', options.set));
18
+ return;
19
+ }
20
+ const current = (0, i18n_cli_1.getGlobalUserLocale)() || 'en';
21
+ logger_1.logger.info(`${(0, i18n_cli_1.t)('langCurrent', current)} ${current === 'es' ? '🇪🇸 Español' : '🇺🇸 English'}`);
22
+ const answer = await inquirer_1.default.prompt([
23
+ {
24
+ type: 'list',
25
+ name: 'locale',
26
+ message: (0, i18n_cli_1.t)('selectLanguagePrompt', current),
27
+ choices: [
28
+ { name: '🇺🇸 English', value: 'en' },
29
+ { name: '🇪🇸 Español', value: 'es' }
30
+ ],
31
+ default: current
32
+ }
33
+ ]);
34
+ const selected = answer.locale;
35
+ (0, i18n_cli_1.saveGlobalUserLocale)(selected);
36
+ logger_1.logger.success((0, i18n_cli_1.t)('langUpdated', selected));
37
+ }
38
+ //# sourceMappingURL=lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lang.js","sourceRoot":"","sources":["../../src/commands/lang.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAMhF,8CA4BC;AAhCD,wDAAgC;AAChC,gDAAqH;AACrH,4CAAyC;AAElC,KAAK,UAAU,iBAAiB,CAAC,OAAyB;IAC/D,eAAM,CAAC,MAAM,EAAE,CAAC;IAEhB,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QACjD,IAAA,+BAAoB,EAAC,OAAO,CAAC,GAAsB,CAAC,CAAC;QACrD,eAAM,CAAC,OAAO,CAAC,IAAA,YAAC,EAAC,aAAa,EAAE,OAAO,CAAC,GAAsB,CAAC,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,8BAAmB,GAAE,IAAI,IAAI,CAAC;IAC9C,eAAM,CAAC,IAAI,CAAC,GAAG,IAAA,YAAC,EAAC,aAAa,EAAE,OAAO,CAAC,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;IAElG,MAAM,MAAM,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACnC;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAAA,YAAC,EAAC,sBAAsB,EAAE,OAAO,CAAC;YAC3C,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE;gBACrC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE;aACtC;YACD,OAAO,EAAE,OAAO;SACjB;KACF,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAyB,CAAC;IAClD,IAAA,+BAAoB,EAAC,QAAQ,CAAC,CAAC;IAC/B,eAAM,CAAC,OAAO,CAAC,IAAA,YAAC,EAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function handleMcpCommand(): Promise<void>;
2
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAMA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGtD"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - 'mcp' Command Handler (Model Context Protocol Server)
4
+ ========================================================================== */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.handleMcpCommand = handleMcpCommand;
7
+ const mcp_server_1 = require("../mcp/mcp-server");
8
+ async function handleMcpCommand() {
9
+ // Silent start for stdio MCP JSON-RPC 2.0 protocol
10
+ (0, mcp_server_1.startMcpServer)();
11
+ }
12
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAIhF,4CAGC;AALD,kDAAmD;AAE5C,KAAK,UAAU,gBAAgB;IACpC,mDAAmD;IACnD,IAAA,2BAAc,GAAE,CAAC;AACnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { ParsedFeature } from '../core/gherkin-parser';
2
+ import { GherkinAIConfig } from '../core/config';
3
+ export declare function generateCsharpContracts(parsed: ParsedFeature, config: GherkinAIConfig): string;
4
+ //# sourceMappingURL=contracts-csharp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts-csharp.d.ts","sourceRoot":"","sources":["../../src/generators/contracts-csharp.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CA8D9F"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - C# 11 Records & Interfaces Generator
4
+ ========================================================================== */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateCsharpContracts = generateCsharpContracts;
7
+ function generateCsharpContracts(parsed, config) {
8
+ const featurePascal = parsed.featureName.replace(/[^a-zA-Z0-9]/g, '');
9
+ return `/* ==========================================================================
10
+ Generated Domain Contracts & C# 11 Records
11
+ Feature: ${parsed.featureName}
12
+ Stack: C# + ${config.stack.framework} + ${config.stack.orm}
13
+ Generated by gherkin-ai CLI v1.5.0
14
+ ========================================================================== */
15
+
16
+ namespace Domain.Contracts.${featurePascal};
17
+
18
+ using System;
19
+ using System.Collections.Generic;
20
+ using System.Threading.Tasks;
21
+
22
+ // --------------------------------------------------------------------------
23
+ // 1. Domain Event Interface & Record Implementations
24
+ // --------------------------------------------------------------------------
25
+ public interface IDomainEvent
26
+ {
27
+ Guid EventId { get; }
28
+ DateTime OccurredOn { get; }
29
+ string EventType { get; }
30
+ }
31
+
32
+ ${parsed.domainAnalysis.events.map((ev, i) => `public record Event${i + 1}(
33
+ Guid EventId,
34
+ DateTime OccurredOn,
35
+ Dictionary<string, object> Payload
36
+ ) : IDomainEvent
37
+ {
38
+ public string EventType => "${ev.replace(/[^a-zA-Z0-9]/g, '')}";
39
+ }`).join('\n\n')}
40
+
41
+ // --------------------------------------------------------------------------
42
+ // 2. Command DTO Record
43
+ // --------------------------------------------------------------------------
44
+ public record ${featurePascal}Command(
45
+ Guid RequestId,
46
+ DateTime Timestamp,
47
+ Dictionary<string, object> Payload
48
+ );
49
+
50
+ // --------------------------------------------------------------------------
51
+ // 3. Domain Repository Port
52
+ // --------------------------------------------------------------------------
53
+ public interface I${featurePascal}Repository
54
+ {
55
+ Task<object?> FindByIdAsync(string id);
56
+ Task SaveAsync(object entity);
57
+ Task DeleteAsync(string id);
58
+ }
59
+
60
+ // --------------------------------------------------------------------------
61
+ // 4. Application Event Publisher Port
62
+ // --------------------------------------------------------------------------
63
+ public interface IEventPublisher
64
+ {
65
+ Task PublishAsync(IDomainEvent domainEvent);
66
+ }
67
+ `;
68
+ }
69
+ //# sourceMappingURL=contracts-csharp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts-csharp.js","sourceRoot":"","sources":["../../src/generators/contracts-csharp.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAKhF,0DA8DC;AA9DD,SAAgB,uBAAuB,CAAC,MAAqB,EAAE,MAAuB;IACpF,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAEtE,OAAO;;cAEK,MAAM,CAAC,WAAW;iBACf,MAAM,CAAC,KAAK,CAAC,SAAS,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG;;;;6BAIhC,aAAa;;;;;;;;;;;;;;;;EAgBxC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC;;;;;;kCAMvC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;EAC/D,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;;;;;gBAKA,aAAa;;;;;;;;;oBAST,aAAa;;;;;;;;;;;;;;CAchC,CAAC;AACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { ParsedFeature } from '../core/gherkin-parser';
2
+ import { GherkinAIConfig } from '../core/config';
3
+ export declare function generateGoContracts(parsed: ParsedFeature, config: GherkinAIConfig): string;
4
+ //# sourceMappingURL=contracts-go.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts-go.d.ts","sourceRoot":"","sources":["../../src/generators/contracts-go.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CA8D1F"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - Go Structs & Domain Interfaces Generator
4
+ ========================================================================== */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateGoContracts = generateGoContracts;
7
+ function generateGoContracts(parsed, config) {
8
+ const featurePascal = parsed.featureName.replace(/[^a-zA-Z0-9]/g, '');
9
+ return `/* ==========================================================================
10
+ Generated Domain Contracts & Go Structs
11
+ Feature: ${parsed.featureName}
12
+ Stack: Go + ${config.stack.framework} + ${config.stack.orm}
13
+ Generated by gherkin-ai CLI v1.5.0
14
+ ========================================================================== */
15
+
16
+ package contracts
17
+
18
+ import (
19
+ "context"
20
+ "time"
21
+ )
22
+
23
+ // --------------------------------------------------------------------------
24
+ // 1. Domain Event Interface
25
+ // --------------------------------------------------------------------------
26
+ type IDomainEvent interface {
27
+ GetEventID() string
28
+ GetOccurredOn() time.Time
29
+ GetEventType() string
30
+ }
31
+
32
+ ${parsed.domainAnalysis.events.map((ev, i) => `type Event${i + 1} struct {
33
+ EventID string \`json:"event_id"\`
34
+ OccurredOn time.Time \`json:"occurred_on"\`
35
+ EventType string \`json:"event_type"\`
36
+ Payload map[string]interface{} \`json:"payload"\`
37
+ }
38
+
39
+ func (e Event${i + 1}) GetEventID() string { return e.EventID }
40
+ func (e Event${i + 1}) GetOccurredOn() time.Time { return e.OccurredOn }
41
+ func (e Event${i + 1}) GetEventType() string { return "${ev.replace(/[^a-zA-Z0-9]/g, '')}" }`).join('\n\n')}
42
+
43
+ // --------------------------------------------------------------------------
44
+ // 2. Command DTO Struct
45
+ // --------------------------------------------------------------------------
46
+ type ${featurePascal}Command struct {
47
+ RequestID string \`json:"request_id" validate:"required,uuid"\`
48
+ Timestamp time.Time \`json:"timestamp" validate:"required"\`
49
+ Payload map[string]interface{} \`json:"payload" validate:"required"\`
50
+ }
51
+
52
+ // --------------------------------------------------------------------------
53
+ // 3. Domain Repository Port
54
+ // --------------------------------------------------------------------------
55
+ type I${featurePascal}Repository interface {
56
+ FindByID(ctx context.Context, id string) (interface{}, error)
57
+ Save(ctx context.Context, entity interface{}) error
58
+ Delete(ctx context.Context, id string) error
59
+ }
60
+
61
+ // --------------------------------------------------------------------------
62
+ // 4. Application Event Publisher Port
63
+ // --------------------------------------------------------------------------
64
+ type IEventPublisher interface {
65
+ Publish(ctx context.Context, event IDomainEvent) error
66
+ }
67
+ `;
68
+ }
69
+ //# sourceMappingURL=contracts-go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts-go.js","sourceRoot":"","sources":["../../src/generators/contracts-go.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAKhF,kDA8DC;AA9DD,SAAgB,mBAAmB,CAAC,MAAqB,EAAE,MAAuB;IAChF,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAEtE,OAAO;;cAEK,MAAM,CAAC,WAAW;iBACf,MAAM,CAAC,KAAK,CAAC,SAAS,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;EAoB3D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC;;;;;;;eAOjD,CAAC,GAAG,CAAC;eACL,CAAC,GAAG,CAAC;eACL,CAAC,GAAG,CAAC,wCAAwC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;;;;;OAKvG,aAAa;;;;;;;;;QASZ,aAAa;;;;;;;;;;;;CAYpB,CAAC;AACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { ParsedFeature } from '../core/gherkin-parser';
2
+ import { GherkinAIConfig } from '../core/config';
3
+ export declare function generatePhpContracts(parsed: ParsedFeature, config: GherkinAIConfig): string;
4
+ //# sourceMappingURL=contracts-php.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts-php.d.ts","sourceRoot":"","sources":["../../src/generators/contracts-php.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAuE3F"}