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