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 +20 -34
- package/dist/commands/add.d.ts +6 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +64 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/detect.d.ts +2 -0
- package/dist/commands/detect.d.ts.map +1 -0
- package/dist/commands/detect.js +36 -0
- package/dist/commands/detect.js.map +1 -0
- package/dist/core/config.d.ts +1 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +1 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/gherkin-parser.d.ts.map +1 -1
- package/dist/core/gherkin-parser.js +22 -8
- package/dist/core/gherkin-parser.js.map +1 -1
- package/dist/core/stack-detector.d.ts +3 -0
- package/dist/core/stack-detector.d.ts.map +1 -0
- package/dist/core/stack-detector.js +231 -0
- package/dist/core/stack-detector.js.map +1 -0
- package/dist/index.js +26 -3
- package/dist/index.js.map +1 -1
- package/dist/utils/file-system.d.ts +2 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +12 -0
- package/dist/utils/file-system.js.map +1 -1
- package/package.json +14 -2
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
|
-
- **`
|
|
23
|
+
- **`ghk validate`**: Deep Architectural Linter checking layer boundary import isolation, step coverage, and circular dependency rules.
|
|
22
24
|
|
|
23
25
|
---
|
|
24
26
|
|
|
25
|
-
## 🚀
|
|
27
|
+
## 🚀 Usage Modes: Greenfield vs. Brownfield (Existing Projects)
|
|
26
28
|
|
|
27
|
-
|
|
29
|
+
### 1. Existing Projects (Brownfield Mode)
|
|
28
30
|
|
|
29
|
-
|
|
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
|
-
|
|
34
|
-
|
|
33
|
+
```bash
|
|
34
|
+
# 1. Auto-detect stack (reads package.json, prisma, tsconfig, etc.)
|
|
35
|
+
ghk detect
|
|
35
36
|
|
|
36
|
-
#
|
|
37
|
-
ghk
|
|
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
|
-
|
|
41
|
+
### 2. New Projects (Greenfield Mode)
|
|
41
42
|
|
|
42
43
|
```bash
|
|
43
|
-
|
|
44
|
-
ghk
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/core/config.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/core/config.js
CHANGED
|
@@ -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',
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;;
|
|
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,
|
|
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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
|
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":";AAAA;;gFAEgF;;AAyBhF,
|
|
1
|
+
{"version":3,"file":"gherkin-parser.js","sourceRoot":"","sources":["../../src/core/gherkin-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -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.
|
|
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;
|
|
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;
|
|
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
|
|
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",
|