gherkin-ai 1.2.0 → 1.3.2

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
@@ -16,32 +16,39 @@ While simple AI prompt generators produce generic text instructions, AI agents o
16
16
  - **`contracts.ts`**: Strict domain interfaces, event schemas, Zod DTOs, CQRS Event Store ports, and Architecture Decision Records (ADRs).
17
17
  - **`openapi.json`**: Auto-generated OpenAPI 3.0 specification derived directly from Gherkin AST schemas.
18
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%.
19
+ - **Brownfield Integration (`ghk detect` & `ghk add`)**: Inject contracts directly into existing project module folders without starting from scratch.
20
+ - **Bilingual Gherkin Parsing**: Native support for English (`Given/When/Then`) and Spanish (`Dado/Cuando/Entonces`).
19
21
  - **Strict Stack Versions**: Enforces explicit package versions (e.g., NestJS v10 + Prisma + Zod + Redis) so agents never diverge.
20
22
  - **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.
23
+ - **`ghk validate`**: Deep Architectural Linter checking layer boundary import isolation, step coverage, and circular dependency rules.
22
24
 
23
25
  ---
24
26
 
25
- ## 🚀 Quick Start & Short Aliases
27
+ ## 🚀 Usage Modes: Greenfield vs. Brownfield (Existing Projects)
26
28
 
27
- You can use the short command alias **`ghk`** (or `gherkin-cli` / `gherkin-ia`) for fast typing:
29
+ ### 1. Existing Projects (Brownfield Mode)
28
30
 
29
- ```bash
30
- # 1. Initialize project configuration interactively
31
- ghk init # (or: npx ghk init)
31
+ If you have an existing codebase, auto-detect your stack and inject feature contracts into specific module folders:
32
32
 
33
- # 2. Generate contracts, OpenAPI, fixtures, and AI agent prompts from your feature file
34
- ghk generate --feature ./specs/auth.feature # (or short alias: ghk g)
33
+ ```bash
34
+ # 1. Auto-detect stack (reads package.json, prisma, tsconfig, etc.)
35
+ ghk detect
35
36
 
36
- # 3. Perform deep architectural linting and layer boundary checks
37
- ghk validate --feature ./specs/auth.feature # (or short alias: ghk v)
37
+ # 2. Inject contract directly into an existing module folder
38
+ ghk add --feature ./specs/payments.feature --target ./src/modules/payments
38
39
  ```
39
40
 
40
- Or install globally:
41
+ ### 2. New Projects (Greenfield Mode)
41
42
 
42
43
  ```bash
43
- npm install -g gherkin-ai
44
- ghk --help
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
49
+
50
+ # 3. Perform deep architectural linting and layer boundary checks
51
+ ghk validate --feature ./specs/auth.feature
45
52
  ```
46
53
 
47
54
  ---
@@ -57,27 +64,6 @@ ghk --help
57
64
 
58
65
  ---
59
66
 
60
- ## 📦 Generated Artifacts Structure
61
-
62
- Running `gherkin-ai generate` (or `ghk g`) produces the following folder structure:
63
-
64
- ```text
65
- generated-specs/
66
- ├── contracts.ts # Interfaces, Zod schemas, Repository & Event Store ports
67
- ├── openapi.json # Auto-generated OpenAPI 3.0 specification
68
- ├── fixtures.ts # Test seed functions (bcrypt, Given setup)
69
- ├── seed.sql # Raw SQL initialization script
70
- ├── docker-compose.yml / serverless.yml # Pre-configured infrastructure
71
- ├── .env.example # Environment variables template
72
- ├── ADR-001-architecture-decisions.md # Architecture Decision Record
73
- └── prompts/
74
- ├── domain-agent.md # Instructions for Domain Architect Agent
75
- ├── backend-agent.md # Instructions for Backend Developer Agent
76
- └── qa-agent.md # Instructions for QA Automation Agent
77
- ```
78
-
79
- ---
80
-
81
67
  ## 📖 Complete Documentation
82
68
 
83
69
  - [Comprehensive Usage Guide](docs/USAGE_GUIDE.md)
@@ -0,0 +1,6 @@
1
+ export declare function handleAddCommand(options: {
2
+ feature?: string;
3
+ target?: string;
4
+ config?: string;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - 'add' Command Handler (Brownfield Contract Injector)
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.handleAddCommand = handleAddCommand;
10
+ const path_1 = __importDefault(require("path"));
11
+ const config_1 = require("../core/config");
12
+ const stack_detector_1 = require("../core/stack-detector");
13
+ const gherkin_parser_1 = require("../core/gherkin-parser");
14
+ const contracts_1 = require("../generators/contracts");
15
+ const prompts_1 = require("../generators/prompts");
16
+ const file_system_1 = require("../utils/file-system");
17
+ const logger_1 = require("../utils/logger");
18
+ async function handleAddCommand(options) {
19
+ logger_1.logger.banner();
20
+ 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);
24
+ }
25
+ const featurePath = path_1.default.resolve(process.cwd(), options.feature);
26
+ if (!(0, file_system_1.fileExistsSync)(featurePath)) {
27
+ logger_1.logger.error(`Feature file not found at: ${featurePath}`);
28
+ process.exit(1);
29
+ }
30
+ // Load config or auto-detect if config doesn't exist
31
+ let config = (0, config_1.loadConfig)(options.config);
32
+ if (!options.config && !(0, file_system_1.fileExistsSync)(path_1.default.join(process.cwd(), 'gherkin-ai.config.json'))) {
33
+ logger_1.logger.info('No config file found. Auto-detecting existing project stack...');
34
+ config = (0, stack_detector_1.detectExistingStack)(process.cwd());
35
+ }
36
+ logger_1.logger.info(`Reading Gherkin spec from: ${featurePath}`);
37
+ const gherkinText = (0, file_system_1.readFileSync)(featurePath);
38
+ const parsed = (0, gherkin_parser_1.parseGherkinText)(gherkinText);
39
+ const featurePascal = parsed.featureName.replace(/[^a-zA-Z0-9]/g, '') || 'Feature';
40
+ const targetDir = options.target
41
+ ? path_1.default.resolve(process.cwd(), options.target)
42
+ : path_1.default.resolve(process.cwd(), 'src', 'modules', featurePascal.toLowerCase());
43
+ (0, file_system_1.ensureDirSync)(targetDir);
44
+ 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);
47
+ const contractFileName = `${featurePascal.toLowerCase()}.contract.ts`;
48
+ (0, file_system_1.writeFileSync)(path_1.default.join(targetDir, contractFileName), contractsTs);
49
+ (0, file_system_1.writeFileSync)(path_1.default.join(targetDir, `${featurePascal.toLowerCase()}.openapi.json`), openApiJson);
50
+ (0, file_system_1.writeFileSync)(path_1.default.join(targetDir, `ADR-${featurePascal}.md`), adrMd);
51
+ logger_1.logger.success(`Created contract file: ${path_1.default.join(targetDir, contractFileName)}`);
52
+ // 2. Generate Agent Prompts inside target module
53
+ const promptsDir = path_1.default.join(targetDir, 'prompts');
54
+ (0, file_system_1.ensureDirSync)(promptsDir);
55
+ const prompts = (0, prompts_1.generatePrompts)(parsed, config);
56
+ Object.keys(prompts).forEach(filename => {
57
+ (0, file_system_1.writeFileSync)(path_1.default.join(promptsDir, filename), prompts[filename]);
58
+ });
59
+ logger_1.logger.success(`Created specialized AI prompts inside: ${promptsDir}`);
60
+ logger_1.logger.banner();
61
+ 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.`);
63
+ }
64
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function handleDetectCommand(): Promise<void>;
2
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/commands/detect.ts"],"names":[],"mappings":"AASA,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBzD"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - 'detect' Command Handler (Brownfield Project Detector)
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.handleDetectCommand = handleDetectCommand;
10
+ const path_1 = __importDefault(require("path"));
11
+ const stack_detector_1 = require("../core/stack-detector");
12
+ const config_1 = require("../core/config");
13
+ const logger_1 = require("../utils/logger");
14
+ async function handleDetectCommand() {
15
+ logger_1.logger.banner();
16
+ logger_1.logger.info('Scanning project directory for existing stack & architecture...');
17
+ const detectedConfig = (0, stack_detector_1.detectExistingStack)(process.cwd());
18
+ console.log('\n------------------------------------------------------------');
19
+ console.log('🔍 Existing Project Stack & Architecture Detected:');
20
+ console.log(`- Project Name: ${detectedConfig.projectName}`);
21
+ console.log(`- Project Mode: ${detectedConfig.projectMode}`);
22
+ console.log(`- Architecture Style: ${detectedConfig.architecture}`);
23
+ console.log(`- Language / Runtime: ${detectedConfig.stack.language}`);
24
+ console.log(`- Framework: ${detectedConfig.stack.framework}`);
25
+ console.log(`- ORM / Persistence: ${detectedConfig.stack.orm}`);
26
+ console.log(`- Database: ${detectedConfig.stack.database}`);
27
+ console.log(`- Validation Library: ${detectedConfig.stack.validation}`);
28
+ console.log(`- Testing Framework: ${detectedConfig.stack.testing}`);
29
+ console.log('------------------------------------------------------------\n');
30
+ const targetPath = path_1.default.join(process.cwd(), 'gherkin-ai.config.json');
31
+ (0, config_1.saveConfig)(detectedConfig, targetPath);
32
+ logger_1.logger.success(`Saved detected project configuration to: ${targetPath}`);
33
+ logger_1.logger.info('You can now add feature contracts directly to your project using:');
34
+ logger_1.logger.info(' ghk add --feature ./specs/my-feature.feature --target ./src/modules/my-feature');
35
+ }
36
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/commands/detect.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAOhF,kDAyBC;AA9BD,gDAAwB;AACxB,2DAA6D;AAC7D,2CAA4C;AAC5C,4CAAyC;AAElC,KAAK,UAAU,mBAAmB;IACvC,eAAM,CAAC,MAAM,EAAE,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAE/E,MAAM,cAAc,GAAG,IAAA,oCAAmB,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE1D,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,mBAAmB,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,mBAAmB,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,yBAAyB,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,yBAAyB,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,gBAAgB,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,wBAAwB,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,eAAe,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,yBAAyB,cAAc,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,wBAAwB,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAE9E,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,wBAAwB,CAAC,CAAC;IACtE,IAAA,mBAAU,EAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAEvC,eAAM,CAAC,OAAO,CAAC,4CAA4C,UAAU,EAAE,CAAC,CAAC;IACzE,eAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IACjF,eAAM,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;AAClG,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export interface GherkinAIConfig {
2
2
  projectName: string;
3
+ projectMode?: 'greenfield' | 'brownfield';
3
4
  architecture: 'ddd' | 'hexagonal' | 'clean' | 'cqrs' | 'microservices' | 'monolith' | 'modular' | 'api-rest' | 'serverless' | 'event-driven';
4
5
  stack: {
5
6
  language: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,KAAK,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,eAAe,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,cAAc,CAAC;IAC7I,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,KAAK,EAAE;QACL,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,aAAa,EAAE,eAoB3B,CAAC;AAEF,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,eAAe,CAc/D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAG7E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC;IAC1C,YAAY,EAAE,KAAK,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,eAAe,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,cAAc,CAAC;IAC7I,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,KAAK,EAAE;QACL,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,aAAa,EAAE,eAqB3B,CAAC;AAEF,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,eAAe,CAc/D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAG7E"}
@@ -13,6 +13,7 @@ const path_1 = __importDefault(require("path"));
13
13
  const file_system_1 = require("../utils/file-system");
14
14
  exports.defaultConfig = {
15
15
  projectName: 'my-gherkin-service',
16
+ projectMode: 'greenfield',
16
17
  architecture: 'hexagonal',
17
18
  stack: {
18
19
  language: 'typescript',
@@ -1 +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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;;AAmDhF,gCAcC;AAED,gCAGC;AApED,gDAAwB;AACxB,sDAAmF;AAyBtE,QAAA,aAAa,GAAoB;IAC5C,WAAW,EAAE,oBAAoB;IACjC,WAAW,EAAE,YAAY;IACzB,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"}
@@ -1 +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"}
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,CAyFnE"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /* ==========================================================================
3
- gherkin-ai-cli - Gherkin Feature Parser & AST Model
3
+ gherkin-ai-cli - Gherkin Feature Parser & AST Model (English & Spanish i18n)
4
4
  ========================================================================== */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.parseGherkinText = parseGherkinText;
@@ -15,14 +15,16 @@ function parseGherkinText(gherkinText) {
15
15
  const line = rawLine.trim();
16
16
  if (!line || line.startsWith('#'))
17
17
  continue;
18
- if (line.startsWith('Feature:')) {
19
- featureName = line.replace('Feature:', '').trim();
18
+ // Feature / Característica Header
19
+ if (/^(Feature|Característica|Requerimiento):/i.test(line)) {
20
+ featureName = line.replace(/^(Feature|Característica|Requerimiento):/i, '').trim();
20
21
  inHeader = true;
21
22
  continue;
22
23
  }
23
- if (line.startsWith('Scenario:') || line.startsWith('Scenario Outline:')) {
24
+ // Scenario / Escenario Header
25
+ if (/^(Scenario|Escenario|Scenario Outline|Esquema del escenario):/i.test(line)) {
24
26
  inHeader = false;
25
- const name = line.replace(/Scenario( Outline)?:/, '').trim();
27
+ const name = line.replace(/^(Scenario|Escenario|Scenario Outline|Esquema del escenario):/i, '').trim();
26
28
  currentScenario = { name, steps: [] };
27
29
  scenarios.push(currentScenario);
28
30
  continue;
@@ -31,9 +33,21 @@ function parseGherkinText(gherkinText) {
31
33
  descriptionLines.push(line);
32
34
  continue;
33
35
  }
34
- const stepMatch = line.match(/^(Given|When|Then|And|But)\s+(.+)$/i);
36
+ // Steps Matching (EN & ES)
37
+ const stepMatch = line.match(/^(Given|Dado|Dada|Dados|Dadas|When|Cuando|Then|Entonces|And|Y|E|But|Pero)\s+(.+)$/i);
35
38
  if (stepMatch && currentScenario) {
36
- const keyword = (stepMatch[1].charAt(0).toUpperCase() + stepMatch[1].slice(1).toLowerCase());
39
+ const rawKw = stepMatch[1].toLowerCase();
40
+ let keyword = 'Given';
41
+ if (['given', 'dado', 'dada', 'dados', 'dadas'].includes(rawKw))
42
+ keyword = 'Given';
43
+ else if (['when', 'cuando'].includes(rawKw))
44
+ keyword = 'When';
45
+ else if (['then', 'entonces'].includes(rawKw))
46
+ keyword = 'Then';
47
+ else if (['and', 'y', 'e'].includes(rawKw))
48
+ keyword = 'And';
49
+ else if (['but', 'pero'].includes(rawKw))
50
+ keyword = 'But';
37
51
  currentScenario.steps.push({ keyword, text: stepMatch[2].trim() });
38
52
  }
39
53
  }
@@ -56,7 +70,7 @@ function parseGherkinText(gherkinText) {
56
70
  commands.push(st.text);
57
71
  }
58
72
  else if (st.keyword === 'Then') {
59
- if (/event|publishes|emits|broadcasts|evento/i.test(st.text)) {
73
+ if (/event|publishes|emits|broadcasts|evento|emite/i.test(st.text)) {
60
74
  events.push(st.text);
61
75
  }
62
76
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"gherkin-parser.js","sourceRoot":"","sources":["../../src/core/gherkin-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gherkin-parser.js","sourceRoot":"","sources":["../../src/core/gherkin-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { GherkinAIConfig } from './config';
2
+ export declare function detectExistingStack(rootDir?: string): GherkinAIConfig;
3
+ //# sourceMappingURL=stack-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-detector.d.ts","sourceRoot":"","sources":["../../src/core/stack-detector.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAiB,MAAM,UAAU,CAAC;AAE1D,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,MAAsB,GAAG,eAAe,CAmNpF"}
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ /* ==========================================================================
3
+ gherkin-ai-cli - Multi-Language Stack & Architecture Auto-Detector
4
+ Supports: PHP/Laravel, Ruby/Rails, C#/.NET, Java/Spring, Python/Django/FastAPI,
5
+ Go, Node/Nest/Express, Angular, Ionic, React, Vue, Svelte, Flutter.
6
+ ========================================================================== */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.detectExistingStack = detectExistingStack;
12
+ const path_1 = __importDefault(require("path"));
13
+ const file_system_1 = require("../utils/file-system");
14
+ const config_1 = require("./config");
15
+ function detectExistingStack(rootDir = process.cwd()) {
16
+ const detected = {
17
+ projectName: path_1.default.basename(rootDir) || 'existing-project',
18
+ projectMode: 'brownfield',
19
+ architecture: 'hexagonal',
20
+ stack: { ...config_1.defaultConfig.stack },
21
+ rules: { ...config_1.defaultConfig.rules },
22
+ outputDir: './src'
23
+ };
24
+ const gemfilePath = path_1.default.join(rootDir, 'Gemfile');
25
+ const composerJsonPath = path_1.default.join(rootDir, 'composer.json');
26
+ const artisanPath = path_1.default.join(rootDir, 'artisan');
27
+ const goModPath = path_1.default.join(rootDir, 'go.mod');
28
+ const pyProjectPath = path_1.default.join(rootDir, 'pyproject.toml');
29
+ const reqTxtPath = path_1.default.join(rootDir, 'requirements.txt');
30
+ const managePyPath = path_1.default.join(rootDir, 'manage.py');
31
+ const pomXmlPath = path_1.default.join(rootDir, 'pom.xml');
32
+ const buildGradlePath = path_1.default.join(rootDir, 'build.gradle');
33
+ const angularJsonPath = path_1.default.join(rootDir, 'angular.json');
34
+ const pubspecPath = path_1.default.join(rootDir, 'pubspec.yaml');
35
+ const packageJsonPath = path_1.default.join(rootDir, 'package.json');
36
+ // 1. Ruby on Rails Stack Detection
37
+ if ((0, file_system_1.fileExistsSync)(gemfilePath)) {
38
+ detected.stack.language = 'ruby';
39
+ detected.stack.framework = 'rails';
40
+ detected.stack.orm = 'active-record';
41
+ detected.stack.database = 'postgresql';
42
+ detected.stack.validation = 'active-model-validations';
43
+ detected.stack.testing = 'rspec';
44
+ detected.architecture = 'monolith';
45
+ detected.outputDir = './app';
46
+ try {
47
+ const gemContent = (0, file_system_1.readFileSync)(gemfilePath);
48
+ if (gemContent.includes('rspec-rails'))
49
+ detected.stack.testing = 'rspec';
50
+ else
51
+ detected.stack.testing = 'minitest';
52
+ }
53
+ catch {
54
+ // Ignore
55
+ }
56
+ }
57
+ // 2. C# / .NET / ASP.NET Core Stack Detection
58
+ else if ((0, file_system_1.fileExistsSync)(path_1.default.join(rootDir, 'Program.cs')) || (0, file_system_1.fileExistsSync)(path_1.default.join(rootDir, 'appsettings.json'))) {
59
+ detected.stack.language = 'csharp';
60
+ detected.stack.framework = 'dotnet-aspnetcore';
61
+ detected.stack.orm = 'entity-framework-core';
62
+ detected.stack.database = 'sql-server';
63
+ detected.stack.validation = 'fluent-validation';
64
+ detected.stack.testing = 'xunit';
65
+ }
66
+ // 3. PHP / Laravel Stack Detection
67
+ else if ((0, file_system_1.fileExistsSync)(artisanPath) || (0, file_system_1.fileExistsSync)(composerJsonPath)) {
68
+ detected.stack.language = 'php';
69
+ detected.stack.framework = 'laravel';
70
+ detected.stack.orm = 'eloquent';
71
+ detected.stack.database = 'postgresql';
72
+ detected.stack.validation = 'laravel-validation';
73
+ detected.stack.auth = 'laravel-sanctum';
74
+ detected.stack.testing = 'phpunit';
75
+ detected.architecture = 'monolith';
76
+ detected.outputDir = './app';
77
+ if ((0, file_system_1.fileExistsSync)(composerJsonPath)) {
78
+ try {
79
+ const raw = (0, file_system_1.readFileSync)(composerJsonPath);
80
+ const composer = JSON.parse(raw);
81
+ if (composer.name)
82
+ detected.projectName = composer.name.split('/')[1] || composer.name;
83
+ const reqs = { ...(composer.require || {}), ...(composer['require-dev'] || {}) };
84
+ if (reqs['pestphp/pest'])
85
+ detected.stack.testing = 'pest';
86
+ if (reqs['symfony/symfony']) {
87
+ detected.stack.framework = 'symfony';
88
+ detected.stack.orm = 'doctrine';
89
+ }
90
+ }
91
+ catch {
92
+ // Ignore
93
+ }
94
+ }
95
+ }
96
+ // 4. Flutter / Dart Mobile Detection
97
+ else if ((0, file_system_1.fileExistsSync)(pubspecPath)) {
98
+ detected.stack.language = 'dart';
99
+ detected.stack.framework = 'flutter';
100
+ detected.stack.orm = 'sqflite';
101
+ detected.stack.database = 'sqlite';
102
+ detected.stack.validation = 'form-validation';
103
+ detected.stack.testing = 'flutter_test';
104
+ detected.outputDir = './lib';
105
+ }
106
+ // 5. Python Stack Detection (Django / FastAPI / Flask)
107
+ else if ((0, file_system_1.fileExistsSync)(managePyPath) || (0, file_system_1.fileExistsSync)(pyProjectPath) || (0, file_system_1.fileExistsSync)(reqTxtPath)) {
108
+ detected.stack.language = 'python';
109
+ detected.stack.testing = 'pytest';
110
+ detected.stack.database = 'postgresql';
111
+ if ((0, file_system_1.fileExistsSync)(managePyPath)) {
112
+ detected.stack.framework = 'django';
113
+ detected.stack.orm = 'django-orm';
114
+ detected.stack.validation = 'django-forms';
115
+ }
116
+ else {
117
+ detected.stack.framework = 'fastapi';
118
+ detected.stack.orm = 'sqlalchemy';
119
+ detected.stack.validation = 'pydantic';
120
+ }
121
+ }
122
+ // 6. Go Stack Detection
123
+ else if ((0, file_system_1.fileExistsSync)(goModPath)) {
124
+ detected.stack.language = 'go';
125
+ detected.stack.framework = 'gin';
126
+ detected.stack.orm = 'gorm';
127
+ detected.stack.database = 'postgresql';
128
+ detected.stack.validation = 'validator-v10';
129
+ detected.stack.testing = 'testing';
130
+ }
131
+ // 7. Java / Kotlin Stack Detection
132
+ else if ((0, file_system_1.fileExistsSync)(pomXmlPath) || (0, file_system_1.fileExistsSync)(buildGradlePath)) {
133
+ detected.stack.language = 'java';
134
+ detected.stack.framework = 'spring-boot';
135
+ detected.stack.orm = 'hibernate';
136
+ detected.stack.database = 'postgresql';
137
+ detected.stack.validation = 'jakarta-validation';
138
+ detected.stack.testing = 'junit';
139
+ }
140
+ // 8. Node.js / Frontend / Ionic / Angular / React / Vue Stack Detection
141
+ else if ((0, file_system_1.fileExistsSync)(packageJsonPath)) {
142
+ try {
143
+ const raw = (0, file_system_1.readFileSync)(packageJsonPath);
144
+ const pkg = JSON.parse(raw);
145
+ const allDeps = { ...(pkg.dependencies || {}), ...(pkg.devDependencies || {}) };
146
+ if (pkg.name)
147
+ detected.projectName = pkg.name;
148
+ // Language Detection (TypeScript if angular, tsconfig or typescript dep exists)
149
+ if (allDeps['typescript'] || (0, file_system_1.fileExistsSync)(path_1.default.join(rootDir, 'tsconfig.json')) || (0, file_system_1.fileExistsSync)(angularJsonPath) || allDeps['@angular/core']) {
150
+ detected.stack.language = 'typescript';
151
+ }
152
+ else {
153
+ detected.stack.language = 'javascript';
154
+ }
155
+ // Angular / Ionic Frontend Detection
156
+ if ((0, file_system_1.fileExistsSync)(angularJsonPath) || allDeps['@angular/core']) {
157
+ if (allDeps['@ionic/angular']) {
158
+ detected.stack.framework = 'ionic-angular';
159
+ }
160
+ else {
161
+ detected.stack.framework = 'angular';
162
+ }
163
+ detected.stack.orm = 'http-client-rxjs';
164
+ detected.stack.database = 'localstorage-indexeddb';
165
+ detected.stack.validation = 'angular-reactive-forms';
166
+ detected.stack.testing = 'jasmine-karma';
167
+ detected.architecture = 'modular';
168
+ detected.outputDir = './src/app';
169
+ }
170
+ // React Native Detection
171
+ else if (allDeps['react-native']) {
172
+ detected.stack.framework = 'react-native';
173
+ detected.stack.orm = 'async-storage';
174
+ detected.stack.database = 'sqlite-capacitor';
175
+ detected.stack.validation = 'zod';
176
+ detected.stack.testing = 'jest';
177
+ detected.architecture = 'modular';
178
+ }
179
+ // React / Next.js Frontend
180
+ else if (allDeps['react'] || allDeps['next']) {
181
+ detected.stack.framework = allDeps['next'] ? 'nextjs' : 'react';
182
+ detected.stack.orm = allDeps['prisma'] ? 'prisma' : 'tanstack-query';
183
+ detected.stack.database = 'postgresql';
184
+ detected.stack.validation = 'zod';
185
+ detected.stack.testing = 'vitest';
186
+ }
187
+ // Vue / Nuxt Frontend
188
+ else if (allDeps['vue'] || allDeps['nuxt']) {
189
+ detected.stack.framework = allDeps['nuxt'] ? 'nuxtjs' : 'vue';
190
+ detected.stack.orm = 'pinia-axios';
191
+ detected.stack.database = 'localstorage';
192
+ detected.stack.validation = 'vee-validate';
193
+ detected.stack.testing = 'vitest';
194
+ }
195
+ // Node.js Backend Frameworks (NestJS, Express, Fastify)
196
+ else if (allDeps['@nestjs/core']) {
197
+ detected.stack.framework = 'nestjs';
198
+ detected.stack.orm = allDeps['prisma'] ? 'prisma' : 'typeorm';
199
+ detected.stack.validation = 'zod';
200
+ detected.stack.testing = 'jest';
201
+ }
202
+ else if (allDeps['express']) {
203
+ detected.stack.framework = 'express';
204
+ detected.stack.orm = allDeps['prisma'] ? 'prisma' : 'sequelize';
205
+ detected.stack.validation = 'zod';
206
+ detected.stack.testing = 'jest';
207
+ }
208
+ }
209
+ catch {
210
+ // Ignore JSON parse errors
211
+ }
212
+ }
213
+ // 9. Architecture Style Heuristic Detection
214
+ if ((0, file_system_1.fileExistsSync)(path_1.default.join(rootDir, 'src', 'domain')) && (0, file_system_1.fileExistsSync)(path_1.default.join(rootDir, 'src', 'ports'))) {
215
+ detected.architecture = 'hexagonal';
216
+ }
217
+ else if ((0, file_system_1.fileExistsSync)(path_1.default.join(rootDir, 'src', 'events')) && (0, file_system_1.fileExistsSync)(path_1.default.join(rootDir, 'src', 'commands'))) {
218
+ detected.architecture = 'cqrs';
219
+ }
220
+ else if ((0, file_system_1.fileExistsSync)(path_1.default.join(rootDir, 'serverless.yml'))) {
221
+ detected.architecture = 'serverless';
222
+ }
223
+ else if ((0, file_system_1.fileExistsSync)(path_1.default.join(rootDir, 'app', 'Http', 'Controllers')) || (0, file_system_1.fileExistsSync)(artisanPath)) {
224
+ detected.architecture = 'monolith';
225
+ }
226
+ else if ((0, file_system_1.fileExistsSync)(path_1.default.join(rootDir, 'src', 'modules')) || (0, file_system_1.fileExistsSync)(path_1.default.join(rootDir, 'src', 'app'))) {
227
+ detected.architecture = 'modular';
228
+ }
229
+ return detected;
230
+ }
231
+ //# sourceMappingURL=stack-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-detector.js","sourceRoot":"","sources":["../../src/core/stack-detector.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -8,16 +8,19 @@ const init_1 = require("./commands/init");
8
8
  const generate_1 = require("./commands/generate");
9
9
  const validate_1 = require("./commands/validate");
10
10
  const export_1 = require("./commands/export");
11
+ const detect_1 = require("./commands/detect");
12
+ const add_1 = require("./commands/add");
11
13
  // Dynamic version from package.json
12
14
  const pkg = require('../package.json');
13
15
  const program = new commander_1.Command();
14
16
  program
15
17
  .name('gherkin-ai')
16
18
  .description('CLI tool & contract engine translating Gherkin specs into executable prompts, TypeScript contracts, and seed fixtures for AI Agents.')
17
- .version(pkg.version || '1.2.0')
19
+ .version(pkg.version || '1.3.0')
18
20
  .option('--init', 'Alias for init command')
19
21
  .option('--generate', 'Alias for generate command')
20
- .option('--validate', 'Alias for validate command');
22
+ .option('--validate', 'Alias for validate command')
23
+ .option('--detect', 'Alias for detect command');
21
24
  program
22
25
  .command('init')
23
26
  .alias('i')
@@ -25,6 +28,23 @@ program
25
28
  .action(async () => {
26
29
  await (0, init_1.handleInitCommand)();
27
30
  });
31
+ program
32
+ .command('detect')
33
+ .alias('d')
34
+ .description('Auto-detect tech stack & architecture of an existing project (Brownfield mode)')
35
+ .action(async () => {
36
+ await (0, detect_1.handleDetectCommand)();
37
+ });
38
+ program
39
+ .command('add')
40
+ .alias('a')
41
+ .description('Inject contracts & AI agent prompts into an existing project module (Brownfield mode)')
42
+ .option('-f, --feature <file>', 'Path to Gherkin .feature file')
43
+ .option('-t, --target <directory>', 'Target directory inside existing project')
44
+ .option('-c, --config <file>', 'Path to custom gherkin-ai.config.json file')
45
+ .action(async (options) => {
46
+ await (0, add_1.handleAddCommand)(options);
47
+ });
28
48
  program
29
49
  .command('generate')
30
50
  .alias('g')
@@ -53,11 +73,14 @@ program
53
73
  .action(async (options) => {
54
74
  await (0, export_1.handleExportCommand)(options);
55
75
  });
56
- // Action fallback for root flags (--init, --generate, --validate)
76
+ // Action fallback for root flags (--init, --generate, --validate, --detect)
57
77
  program.action(async (options) => {
58
78
  if (options.init) {
59
79
  await (0, init_1.handleInitCommand)();
60
80
  }
81
+ else if (options.detect) {
82
+ await (0, detect_1.handleDetectCommand)();
83
+ }
61
84
  else if (options.generate) {
62
85
  await (0, generate_1.handleGenerateCommand)({});
63
86
  }
package/dist/index.js.map CHANGED
@@ -1 +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,oCAAoC;AACpC,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEvC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,sIAAsI,CAAC;KACnJ,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;KAC/B,MAAM,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC1C,MAAM,CAAC,YAAY,EAAE,4BAA4B,CAAC;KAClD,MAAM,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;AAEtD,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,KAAK,CAAC,GAAG,CAAC;KACV,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,KAAK,CAAC,GAAG,CAAC;KACV,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,KAAK,CAAC,GAAG,CAAC;KACV,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,KAAK,CAAC,GAAG,CAAC;KACV,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,kEAAkE;AAClE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAC/B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAA,wBAAiB,GAAE,CAAC;IAC5B,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAA,gCAAqB,EAAC,EAAE,CAAC,CAAC;IAClC,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAA,gCAAqB,EAAC,EAAE,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,6 @@ export declare function ensureDirSync(dirPath: string): void;
2
2
  export declare function writeFileSync(filePath: string, content: string): void;
3
3
  export declare function readFileSync(filePath: string): string;
4
4
  export declare function fileExistsSync(filePath: string): boolean;
5
+ export declare function removeFileSync(filePath: string): void;
6
+ export declare function removeDirSync(dirPath: string): void;
5
7
  //# sourceMappingURL=file-system.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAOA,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAInD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAIrE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD"}
1
+ {"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAOA,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAInD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAIrE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAIrD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAInD"}
@@ -10,6 +10,8 @@ exports.ensureDirSync = ensureDirSync;
10
10
  exports.writeFileSync = writeFileSync;
11
11
  exports.readFileSync = readFileSync;
12
12
  exports.fileExistsSync = fileExistsSync;
13
+ exports.removeFileSync = removeFileSync;
14
+ exports.removeDirSync = removeDirSync;
13
15
  const fs_1 = __importDefault(require("fs"));
14
16
  const path_1 = __importDefault(require("path"));
15
17
  function ensureDirSync(dirPath) {
@@ -28,4 +30,14 @@ function readFileSync(filePath) {
28
30
  function fileExistsSync(filePath) {
29
31
  return fs_1.default.existsSync(filePath);
30
32
  }
33
+ function removeFileSync(filePath) {
34
+ if (fs_1.default.existsSync(filePath)) {
35
+ fs_1.default.unlinkSync(filePath);
36
+ }
37
+ }
38
+ function removeDirSync(dirPath) {
39
+ if (fs_1.default.existsSync(dirPath)) {
40
+ fs_1.default.rmSync(dirPath, { recursive: true, force: true });
41
+ }
42
+ }
31
43
  //# sourceMappingURL=file-system.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAKhF,sCAIC;AAED,sCAIC;AAED,oCAEC;AAED,wCAEC;AArBD,4CAAoB;AACpB,gDAAwB;AAExB,SAAgB,aAAa,CAAC,OAAe;IAC3C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,YAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,QAAgB,EAAE,OAAe;IAC7D,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,aAAa,CAAC,GAAG,CAAC,CAAC;IACnB,YAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,YAAY,CAAC,QAAgB;IAC3C,OAAO,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,cAAc,CAAC,QAAgB;IAC7C,OAAO,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAKhF,sCAIC;AAED,sCAIC;AAED,oCAEC;AAED,wCAEC;AAED,wCAIC;AAED,sCAIC;AAjCD,4CAAoB;AACpB,gDAAwB;AAExB,SAAgB,aAAa,CAAC,OAAe;IAC3C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,YAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,QAAgB,EAAE,OAAe;IAC7D,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,aAAa,CAAC,GAAG,CAAC,CAAC;IACnB,YAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,YAAY,CAAC,QAAgB;IAC3C,OAAO,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,cAAc,CAAC,QAAgB;IAC7C,OAAO,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,cAAc,CAAC,QAAgB;IAC7C,IAAI,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,OAAe;IAC3C,IAAI,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,YAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gherkin-ai",
3
- "version": "1.2.0",
3
+ "version": "1.3.2",
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",
@@ -31,7 +31,19 @@
31
31
  "claude-code",
32
32
  "cursor",
33
33
  "antigravity",
34
- "ghk"
34
+ "ghk",
35
+ "brownfield",
36
+ "detect",
37
+ "laravel",
38
+ "php",
39
+ "ruby",
40
+ "rails",
41
+ "dotnet",
42
+ "csharp",
43
+ "angular",
44
+ "ionic",
45
+ "react-native",
46
+ "flutter"
35
47
  ],
36
48
  "author": "Fenner Eduardo <contact@fennereduardo.com> (https://fennereduardo.com)",
37
49
  "license": "MIT",