gherkin-ai 2.1.0 → 2.3.1
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 +13 -11
- package/dist/commands/autopilot.d.ts.map +1 -1
- package/dist/commands/autopilot.js +29 -10
- package/dist/commands/autopilot.js.map +1 -1
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +50 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +23 -2
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +47 -6
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/skill.d.ts +2 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +73 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +20 -12
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +9 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/web.d.ts +2 -0
- package/dist/commands/web.d.ts.map +1 -0
- package/dist/commands/web.js +30 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/core/agent-adapter.d.ts +1 -0
- package/dist/core/agent-adapter.d.ts.map +1 -1
- package/dist/core/agent-adapter.js +41 -15
- package/dist/core/agent-adapter.js.map +1 -1
- package/dist/core/config.d.ts +3 -2
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/context-extractor.d.ts +9 -0
- package/dist/core/context-extractor.d.ts.map +1 -0
- package/dist/core/context-extractor.js +60 -0
- package/dist/core/context-extractor.js.map +1 -0
- package/dist/core/execution-sandbox.d.ts.map +1 -1
- package/dist/core/execution-sandbox.js +26 -1
- package/dist/core/execution-sandbox.js.map +1 -1
- package/dist/core/gherkin-parser.d.ts.map +1 -1
- package/dist/core/gherkin-parser.js +76 -70
- package/dist/core/gherkin-parser.js.map +1 -1
- package/dist/core/quality-score.d.ts.map +1 -1
- package/dist/core/quality-score.js +25 -6
- package/dist/core/quality-score.js.map +1 -1
- package/dist/core/stack-detector.d.ts.map +1 -1
- package/dist/core/stack-detector.js +103 -2
- package/dist/core/stack-detector.js.map +1 -1
- package/dist/core/step-indexer.d.ts +19 -0
- package/dist/core/step-indexer.d.ts.map +1 -0
- package/dist/core/step-indexer.js +86 -0
- package/dist/core/step-indexer.js.map +1 -0
- package/dist/core/syntax-validator.d.ts +6 -0
- package/dist/core/syntax-validator.d.ts.map +1 -0
- package/dist/core/syntax-validator.js +37 -0
- package/dist/core/syntax-validator.js.map +1 -0
- package/dist/generators/contracts.d.ts.map +1 -1
- package/dist/generators/contracts.js +20 -4
- package/dist/generators/contracts.js.map +1 -1
- package/dist/generators/prompt-templates/base.d.ts +27 -0
- package/dist/generators/prompt-templates/base.d.ts.map +1 -0
- package/dist/generators/prompt-templates/base.js +20 -0
- package/dist/generators/prompt-templates/base.js.map +1 -0
- package/dist/generators/prompt-templates/factory.d.ts +3 -0
- package/dist/generators/prompt-templates/factory.d.ts.map +1 -0
- package/dist/generators/prompt-templates/factory.js +44 -0
- package/dist/generators/prompt-templates/factory.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/desktop-client.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/desktop-client.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/desktop-client.js +28 -0
- package/dist/generators/prompt-templates/stacks/desktop-client.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/dotnet.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/dotnet.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/dotnet.js +30 -0
- package/dist/generators/prompt-templates/stacks/dotnet.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/fallback.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/fallback.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/fallback.js +31 -0
- package/dist/generators/prompt-templates/stacks/fallback.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/flutter.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/flutter.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/flutter.js +29 -0
- package/dist/generators/prompt-templates/stacks/flutter.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/frontend-web.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/frontend-web.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/frontend-web.js +35 -0
- package/dist/generators/prompt-templates/stacks/frontend-web.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/go-backend.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/go-backend.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/go-backend.js +30 -0
- package/dist/generators/prompt-templates/stacks/go-backend.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/ionic.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/ionic.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/ionic.js +29 -0
- package/dist/generators/prompt-templates/stacks/ionic.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/laravel.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/laravel.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/laravel.js +30 -0
- package/dist/generators/prompt-templates/stacks/laravel.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/native-mobile.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/native-mobile.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/native-mobile.js +29 -0
- package/dist/generators/prompt-templates/stacks/native-mobile.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/nestjs.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/nestjs.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/nestjs.js +30 -0
- package/dist/generators/prompt-templates/stacks/nestjs.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/python-backend.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/python-backend.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/python-backend.js +36 -0
- package/dist/generators/prompt-templates/stacks/python-backend.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/react-native.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/react-native.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/react-native.js +29 -0
- package/dist/generators/prompt-templates/stacks/react-native.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/ruby-on-rails.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/ruby-on-rails.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/ruby-on-rails.js +30 -0
- package/dist/generators/prompt-templates/stacks/ruby-on-rails.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/rust-backend.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/rust-backend.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/rust-backend.js +30 -0
- package/dist/generators/prompt-templates/stacks/rust-backend.js.map +1 -0
- package/dist/generators/prompt-templates/stacks/spring-boot.d.ts +3 -0
- package/dist/generators/prompt-templates/stacks/spring-boot.d.ts.map +1 -0
- package/dist/generators/prompt-templates/stacks/spring-boot.js +30 -0
- package/dist/generators/prompt-templates/stacks/spring-boot.js.map +1 -0
- package/dist/generators/prompts.d.ts.map +1 -1
- package/dist/generators/prompts.js +55 -62
- package/dist/generators/prompts.js.map +1 -1
- package/dist/index.js +59 -1
- package/dist/index.js.map +1 -1
- package/dist/ui/public/index.html +156 -0
- package/dist/ui/server.d.ts +2 -0
- package/dist/ui/server.d.ts.map +1 -0
- package/dist/ui/server.js +99 -0
- package/dist/ui/server.js.map +1 -0
- package/dist/utils/workspace-detector.d.ts +2 -0
- package/dist/utils/workspace-detector.d.ts.map +1 -0
- package/dist/utils/workspace-detector.js +65 -0
- package/dist/utils/workspace-detector.js.map +1 -0
- package/docs/ai-skills.md +42 -0
- package/docs/ast-step-indexer.md +47 -0
- package/docs/headless-mode.md +74 -0
- package/package.json +11 -4
package/README.md
CHANGED
|
@@ -8,26 +8,28 @@
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## 🌟 Strategic Capabilities (`v2.
|
|
11
|
+
## 🌟 Strategic Capabilities (`v2.2.0`)
|
|
12
12
|
|
|
13
13
|
While basic AI spec tools only generate text prompts, `gherkin-ai` acts as an **executable contract and verification harness** between Product Intent, AI Agents (Cursor, Claude Code, Windsurf, Antigravity), Code Implementation, and CI/CD Quality Gates:
|
|
14
14
|
|
|
15
|
-
-
|
|
16
|
-
-
|
|
15
|
+
- 🤖 **True Agentic Engine & Self-Healing (`ghk verify --auto-fix` & `ghk autopilot`)**: Natively connects with LLMs (OpenAI, Anthropic, Ollama). It doesn't just log output; it actively writes and modifies your source code, intercepts test failures, and recursively applies repairs in a true **Closed-Loop**.
|
|
16
|
+
- 🌐 **Web Studio UI (`ghk web`)**: Launch a premium local graphical interface to interactively generate your Gherkin specifications, detect your stack, and orchestrate agent prompts visually.
|
|
17
|
+
- 🌳 **Official Cucumber AST Parser**: 100% compliant with the Gherkin standard using the official `@cucumber/gherkin` package. Flawlessly parses DataTables, DocStrings, and advanced scenarios for semantic extraction.
|
|
18
|
+
- 🔗 **AST Step Definitions Indexer**: Prevents AI hallucinations by statically analyzing your E2E project (Cypress/Playwright/Cucumber-JS) via `ts-morph`, extracting existing `Given/When/Then` steps, and forcing the LLM to reuse them.
|
|
19
|
+
- 🛡️ **Semantically Typed Contracts**: Extracts variables straight from your Gherkin data tables (like `@validate:email`) and outputs strictly typed Zod DTOs instead of generic objects.
|
|
20
|
+
- ⚙️ **Headless CI/CD Mode**: Fully decoupled non-interactive mode (`ghk create --headless --config spec.json`) designed for frictionless integration into GitHub Actions, Azure DevOps, and automated pipelines.
|
|
21
|
+
- 🔌 **Native MCP Server & Cursor Skills (`ghk mcp install` & `ghk skill`)**: Zero-config Model Context Protocol (MCP) server. The new `ghk skill` command injects native Cursor and Windsurf `.cursorrules` to let your IDE automatically invoke Gherkin AI as an internal skill.
|
|
17
22
|
- 📦 **Context Engineering & Guardrails Engine (`ghk context`)**: Structurally packages project architecture, conventions, and security policies into `.ghe/`, enforcing strict path protection and agent change limits.
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
- 🎯 **Caveman Mode (`ghk create --caveman`)**: Skip the wizard and generate concise `.feature` specifications instantly from a single plain-text prompt to optimize AI token consumption.
|
|
23
|
+
- 🏗️ **DOM & Data Model Anchor**: Automatically extracts `schema.prisma` models and Page Object Model (POM) `data-test` selectors, injecting them into the agent's context to ensure generated tests are grounded in technical reality.
|
|
24
|
+
- 🏆 **Dynamic Quality Gate Index (`ghk quality`)**: Measures spec coverage, unit tests, E2E, type safety, and security dynamically by parsing your real test coverage (`coverage-summary.json`) and linter outputs.
|
|
25
|
+
- ☕ **Enterprise Java, React, Rust & Go Templates**: Extensive boilerplate support. Scaffolds Spring Boot, Next.js, Rust Axum, Go Fiber, and mobile (Flutter/React Native) architectures out-of-the-box.
|
|
22
26
|
- 🕵️ **Interactive Stack & Pattern Detection (`ghk detect`)**: Auto-detects existing brownfield architectures and intelligently injects industry-standard design patterns (e.g., Hooks, CQRS, MVC) into Agent prompts.
|
|
23
|
-
- 📊 **Enterprise Quality Gate Index (`ghk quality`)**: Measures spec coverage, unit tests, E2E, type safety, and security score before merging by parsing real test coverage and linter outputs.
|
|
24
27
|
- 📡 **Event-Driven & AsyncAPI Support**: Automatically extracts domain events from Gherkin and scaffolds standard `asyncapi.json` contracts.
|
|
25
|
-
- 🔍 **Drift Detection (`ghk diff`)**: Validates in CI/CD pipelines if the implemented DTOs and code have drifted from the `.feature` file
|
|
26
|
-
- 🧩 **Semantic Annotations & Stubs**: Supports custom Gherkin tags (e.g., `@validate:email`) to generate strictly typed Zod validations and auto-generates test stubs during `ghk add`.
|
|
28
|
+
- 🔍 **True AST Drift Detection (`ghk diff`)**: Validates in CI/CD pipelines if the implemented DTOs and code have drifted from the `.feature` file using native TypeScript AST compilation.
|
|
27
29
|
|
|
28
30
|
---
|
|
29
31
|
|
|
30
|
-
## 📥 Installation & Execution (`v2.
|
|
32
|
+
## 📥 Installation & Execution (`v2.2.0`)
|
|
31
33
|
|
|
32
34
|
You can use `gherkin-ai` via global `npm` installation, on-demand zero-install `npx`, or as a project local dev dependency:
|
|
33
35
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autopilot.d.ts","sourceRoot":"","sources":["../../src/commands/autopilot.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"autopilot.d.ts","sourceRoot":"","sources":["../../src/commands/autopilot.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsE1F"}
|
|
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.handleAutopilotCommand = handleAutopilotCommand;
|
|
10
10
|
const chalk_1 = __importDefault(require("chalk"));
|
|
11
11
|
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
12
13
|
const context_builder_1 = require("../core/context-builder");
|
|
13
14
|
const quality_score_1 = require("../core/quality-score");
|
|
14
15
|
const agent_adapter_1 = require("../core/agent-adapter");
|
|
@@ -33,23 +34,41 @@ async function handleAutopilotCommand(options = {}) {
|
|
|
33
34
|
prompt: `Generate a Gherkin .feature file for the following requirement:\n\n${reqContent}\n\nWrap the code in \`\`\`gherkin ... \`\`\` blocks.`,
|
|
34
35
|
contextFiles: ['.ghe/conventions.md']
|
|
35
36
|
});
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
let specContent = 'Feature: Auto-generated feature...';
|
|
38
|
+
if (specRes.codeModifications && specRes.codeModifications.length > 0) {
|
|
39
|
+
for (const mod of specRes.codeModifications) {
|
|
40
|
+
const p = mod.filePath.endsWith('.feature') ? mod.filePath : `specs/${mod.filePath}`;
|
|
41
|
+
const fullPath = path_1.default.resolve(p);
|
|
42
|
+
fs_1.default.mkdirSync(path_1.default.dirname(fullPath), { recursive: true });
|
|
43
|
+
fs_1.default.writeFileSync(fullPath, mod.content);
|
|
44
|
+
console.log(chalk_1.default.green(` ✓ Wrote specification to ${p}`));
|
|
45
|
+
if (mod.filePath.endsWith('.feature')) {
|
|
46
|
+
specContent = mod.content;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.log(chalk_1.default.yellow(` ⚠️ Agent didn't return proper code blocks. Using fallback.`));
|
|
52
|
+
}
|
|
41
53
|
console.log(chalk_1.default.blue(`3. Invoking Scaffolding Agent -> Generating Bindings...`));
|
|
42
54
|
const scaffoldRes = await agent.executeTask({
|
|
43
55
|
id: 'auto-scaffold',
|
|
44
56
|
type: 'scaffold_binding',
|
|
45
57
|
prompt: `Generate step definitions for the following spec:\n\n${specContent}\n\nWrap code in \`\`\`ts ... \`\`\``,
|
|
46
|
-
contextFiles: [
|
|
58
|
+
contextFiles: []
|
|
47
59
|
});
|
|
48
60
|
if (scaffoldRes.codeModifications && scaffoldRes.codeModifications.length > 0) {
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
61
|
+
const { validateTypeScriptSyntax } = require('../core/syntax-validator');
|
|
62
|
+
for (const mod of scaffoldRes.codeModifications) {
|
|
63
|
+
if (!validateTypeScriptSyntax(mod.filePath, mod.content)) {
|
|
64
|
+
console.log(chalk_1.default.yellow(` ✖ Skipped writing ${mod.filePath} due to syntax errors.`));
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const fullPath = path_1.default.resolve(mod.filePath);
|
|
68
|
+
fs_1.default.mkdirSync(path_1.default.dirname(fullPath), { recursive: true });
|
|
69
|
+
fs_1.default.writeFileSync(fullPath, mod.content);
|
|
70
|
+
console.log(chalk_1.default.green(` ✓ Wrote bindings to ${mod.filePath}`));
|
|
71
|
+
}
|
|
53
72
|
}
|
|
54
73
|
console.log(chalk_1.default.blue(`4. Invoking Verification Agent & Closed-Loop Repair...`));
|
|
55
74
|
await (0, verify_1.handleVerifyCommand)({ autoFix: true, maxRetries: 2 });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autopilot.js","sourceRoot":"","sources":["../../src/commands/autopilot.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAehF,
|
|
1
|
+
{"version":3,"file":"autopilot.js","sourceRoot":"","sources":["../../src/commands/autopilot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAWA,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAWA,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoO7K"}
|
package/dist/commands/create.js
CHANGED
|
@@ -18,6 +18,56 @@ async function handleCreateCommand(options) {
|
|
|
18
18
|
const locale = await (0, i18n_cli_1.ensureCliLanguage)(options.lang);
|
|
19
19
|
const isEs = locale === 'es';
|
|
20
20
|
logger_1.logger.info(isEs ? 'Asistente Interactivo Gherkin - Creación paso a paso' : 'Interactive Gherkin Spec Wizard - Step-by-step feature creator');
|
|
21
|
+
if (options.headless) {
|
|
22
|
+
logger_1.logger.info(isEs ? 'Modo Headless (CI/CD) Activado' : 'Headless Mode (CI/CD) Activated');
|
|
23
|
+
let configData = {};
|
|
24
|
+
if (options.config) {
|
|
25
|
+
const fs = require('fs');
|
|
26
|
+
const path = require('path');
|
|
27
|
+
const fullPath = path.resolve(process.cwd(), options.config);
|
|
28
|
+
if (fs.existsSync(fullPath)) {
|
|
29
|
+
configData = JSON.parse(fs.readFileSync(fullPath, 'utf8'));
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
logger_1.logger.error(`Config file not found: ${fullPath}`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
logger_1.logger.error('Headless mode requires a --config file with feature data.');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const featureKw = isEs ? 'Característica:' : 'Feature:';
|
|
41
|
+
const asKw = isEs ? 'Como' : 'As a';
|
|
42
|
+
const wantKw = isEs ? 'Quiero' : 'I want to';
|
|
43
|
+
const soKw = isEs ? 'Para' : 'So that';
|
|
44
|
+
const scKw = isEs ? 'Escenario:' : 'Scenario:';
|
|
45
|
+
let gherkinContent = `${featureKw} ${configData.featureName || 'Headless Feature'}\n`;
|
|
46
|
+
if (configData.actor)
|
|
47
|
+
gherkinContent += ` ${asKw} ${configData.actor}\n`;
|
|
48
|
+
if (configData.action)
|
|
49
|
+
gherkinContent += ` ${wantKw} ${configData.action}\n`;
|
|
50
|
+
if (configData.outcome)
|
|
51
|
+
gherkinContent += ` ${soKw} ${configData.outcome}\n\n`;
|
|
52
|
+
gherkinContent += ` ${scKw} ${configData.scenarioName || 'Headless Scenario'}\n`;
|
|
53
|
+
const steps = configData.steps || [];
|
|
54
|
+
steps.forEach((st) => {
|
|
55
|
+
gherkinContent += ` ${st.keyword} ${st.text}\n`;
|
|
56
|
+
});
|
|
57
|
+
const defaultFileName = (configData.featureName || 'headless').toLowerCase().replace(/[^a-z0-9]/g, '_') + '.feature';
|
|
58
|
+
const targetSpecPath = options.output
|
|
59
|
+
? path_1.default.resolve(process.cwd(), options.output)
|
|
60
|
+
: path_1.default.resolve(process.cwd(), 'specs', defaultFileName);
|
|
61
|
+
(0, file_system_1.writeFileSync)(targetSpecPath, gherkinContent);
|
|
62
|
+
logger_1.logger.success(`${(0, i18n_cli_1.t)('specCreated', locale)} ${targetSpecPath}`);
|
|
63
|
+
if (configData.injectTarget || options.target) {
|
|
64
|
+
await (0, add_1.handleAddCommand)({
|
|
65
|
+
feature: targetSpecPath,
|
|
66
|
+
target: configData.injectTarget || options.target
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
21
71
|
if (options.caveman) {
|
|
22
72
|
logger_1.logger.info(isEs ? 'Modo Caveman Activado - Ingreso Rápido' : 'Caveman Mode Activated - Quick Input');
|
|
23
73
|
const { quickDesc } = await inquirer_1.default.prompt([{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAShF,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6EvF"}
|
package/dist/commands/diff.js
CHANGED
|
@@ -38,9 +38,30 @@ async function handleDiffCommand(options = {}) {
|
|
|
38
38
|
}
|
|
39
39
|
let driftFound = false;
|
|
40
40
|
console.log(chalk_1.default.blue(`Checking synchronization for ${fields.length} semantic fields...\n`));
|
|
41
|
+
let targetProperties = [];
|
|
42
|
+
if (options.target.endsWith('.ts')) {
|
|
43
|
+
try {
|
|
44
|
+
const { Project } = require('ts-morph');
|
|
45
|
+
const project = new Project({ useInMemoryFileSystem: true });
|
|
46
|
+
const sourceFile = project.createSourceFile(options.target, targetContent);
|
|
47
|
+
const interfaces = sourceFile.getInterfaces();
|
|
48
|
+
const classes = sourceFile.getClasses();
|
|
49
|
+
for (const intf of interfaces) {
|
|
50
|
+
targetProperties.push(...intf.getProperties().map((p) => p.getName()));
|
|
51
|
+
}
|
|
52
|
+
for (const cls of classes) {
|
|
53
|
+
targetProperties.push(...cls.getProperties().map((p) => p.getName()));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
console.log(chalk_1.default.yellow(`⚠ Could not parse AST of target file: ${e.message}. Falling back to string match.`));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
41
60
|
for (const field of fields) {
|
|
42
|
-
|
|
43
|
-
|
|
61
|
+
const isFound = targetProperties.length > 0
|
|
62
|
+
? targetProperties.includes(field.name)
|
|
63
|
+
: targetContent.includes(field.name);
|
|
64
|
+
if (!isFound) {
|
|
44
65
|
console.log(chalk_1.default.red(` ✖ Drift Detected! Field '${field.name}' from feature is missing in ${options.target}`));
|
|
45
66
|
driftFound = true;
|
|
46
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAWhF,
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAmCA,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGzG"}
|
|
@@ -16,6 +16,8 @@ const prompts_1 = require("../generators/prompts");
|
|
|
16
16
|
const infra_1 = require("../generators/infra");
|
|
17
17
|
const file_system_1 = require("../utils/file-system");
|
|
18
18
|
const logger_1 = require("../utils/logger");
|
|
19
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
20
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
19
21
|
const DEFAULT_SAMPLE_GHERKIN = `Feature: User Authentication & Token Issuance
|
|
20
22
|
As a registered user
|
|
21
23
|
I want to authenticate using valid credentials
|
|
@@ -65,12 +67,51 @@ async function handleGenerateCommand(options) {
|
|
|
65
67
|
(0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'fixtures.ts'), fixturesTs);
|
|
66
68
|
(0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'seed.sql'), seedSql);
|
|
67
69
|
logger_1.logger.success('Generated fixtures.ts and seed.sql');
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
});
|
|
73
|
-
|
|
70
|
+
console.log(chalk_1.default.bold.cyan('\n🔍 Context Confirmation for AI Agents:'));
|
|
71
|
+
console.log(`- Architecture: ${config.architecture}`);
|
|
72
|
+
console.log(`- Stack: ${config.stack.language} + ${config.stack.framework}`);
|
|
73
|
+
console.log(`- Persistence: ${config.stack.orm} + ${config.stack.database}`);
|
|
74
|
+
console.log(`- Tools: ${config.stack.testing} (Testing), ${config.stack.validation} (Validation)`);
|
|
75
|
+
if (config.stack.aiEngine) {
|
|
76
|
+
console.log(`- AI Tools: ${config.stack.aiEngine}`);
|
|
77
|
+
}
|
|
78
|
+
const { confirmContext } = await inquirer_1.default.prompt([{
|
|
79
|
+
type: 'confirm',
|
|
80
|
+
name: 'confirmContext',
|
|
81
|
+
message: 'Is this technical context correct for the agent prompts?',
|
|
82
|
+
default: true
|
|
83
|
+
}]);
|
|
84
|
+
if (!confirmContext) {
|
|
85
|
+
logger_1.logger.warn('Context rejected. Please update gherkin-ai.config.json or run `ghk detect` and run again.');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
const agentChoices = [
|
|
89
|
+
{ name: 'Domain Architect Agent', value: 'domain-agent.md', checked: true },
|
|
90
|
+
{ name: 'Backend Developer Agent', value: 'backend-agent.md', checked: true },
|
|
91
|
+
{ name: 'QA Automation Agent', value: 'qa-agent.md', checked: true }
|
|
92
|
+
];
|
|
93
|
+
if (config.stack.aiEngine) {
|
|
94
|
+
agentChoices.push({ name: 'AI Engineer Agent (RAG/VectorDB)', value: 'ai-engineer-agent.md', checked: true });
|
|
95
|
+
}
|
|
96
|
+
const { selectedAgents } = await inquirer_1.default.prompt([{
|
|
97
|
+
type: 'checkbox',
|
|
98
|
+
name: 'selectedAgents',
|
|
99
|
+
message: 'Which Agent Prompts do you want to generate?',
|
|
100
|
+
choices: agentChoices
|
|
101
|
+
}]);
|
|
102
|
+
if (selectedAgents.length > 0) {
|
|
103
|
+
// 3. Generate Agent Prompts
|
|
104
|
+
const prompts = (0, prompts_1.generatePrompts)(parsed, config);
|
|
105
|
+
selectedAgents.forEach((filename) => {
|
|
106
|
+
if (prompts[filename]) {
|
|
107
|
+
(0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'prompts', filename), prompts[filename]);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
logger_1.logger.success(`Generated selected prompts in prompts/: ${selectedAgents.join(', ')}`);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
logger_1.logger.warn('No agents selected. Skipping prompt generation.');
|
|
114
|
+
}
|
|
74
115
|
// 4. Generate Infrastructure Config
|
|
75
116
|
const { dockerComposeYaml, serverlessYml, envExample } = (0, infra_1.generateInfra)(config);
|
|
76
117
|
if (config.architecture === 'serverless') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAiChF,sDAsGC;AArID,gDAAwB;AACxB,2CAA4C;AAC5C,2DAA0D;AAC1D,uDAA4D;AAC5D,qDAA0D;AAC1D,mDAAwD;AACxD,+CAAoD;AACpD,sDAAmF;AACnF,4CAAyC;AACzC,wDAAgC;AAChC,kDAA0B;AAE1B,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;CAiB9B,CAAC;AAEK,KAAK,UAAU,qBAAqB,CAAC,OAA8C;IACxF,eAAM,CAAC,MAAM,EAAE,CAAC;IAEhB,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,WAAW,GAAG,sBAAsB,CAAC;IAEzC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,IAAA,4BAAc,EAAC,WAAW,CAAC,EAAE,CAAC;YAChC,WAAW,GAAG,IAAA,0BAAY,EAAC,WAAW,CAAC,CAAC;YACxC,eAAM,CAAC,IAAI,CAAC,sCAAsC,WAAW,EAAE,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,IAAI,CAAC,6BAA6B,WAAW,iCAAiC,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,eAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAChF,CAAC;IAED,eAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,IAAA,iCAAgB,EAAC,WAAW,CAAC,CAAC;IAE7C,eAAM,CAAC,IAAI,CAAC,4BAA4B,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAE5D,uCAAuC;IACvC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAA,6BAAiB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9E,IAAA,2BAAa,EAAC,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,WAAW,CAAC,CAAC;IACxE,IAAA,2BAAa,EAAC,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,mCAAmC,CAAC,EAAE,KAAK,CAAC,CAAC;IACvF,IAAA,2BAAa,EAAC,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,WAAW,CAAC,CAAC;IACxE,eAAM,CAAC,OAAO,CAAC,4EAA4E,CAAC,CAAC;IAE7F,oCAAoC;IACpC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,IAAA,2BAAgB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjE,IAAA,2BAAa,EAAC,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,UAAU,CAAC,CAAC;IACtE,IAAA,2BAAa,EAAC,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;IAChE,eAAM,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IAErD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,QAAQ,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,OAAO,eAAe,MAAM,CAAC,KAAK,CAAC,UAAU,eAAe,CAAC,CAAC;IACnG,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,0DAA0D;YACnE,OAAO,EAAE,IAAI;SACd,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,eAAM,CAAC,IAAI,CAAC,2FAA2F,CAAC,CAAC;QACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG;QACnB,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE;QAC3E,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE;QAC7E,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE;KACrE,CAAC;IAEF,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC1B,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAChH,CAAC;IAED,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,8CAA8C;YACvD,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC,CAAC;IAEJ,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,4BAA4B;QAC5B,MAAM,OAAO,GAAG,IAAA,yBAAe,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,cAAc,CAAC,OAAO,CAAC,CAAC,QAAgB,EAAE,EAAE;YAC1C,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtB,IAAA,2BAAa,EAAC,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACrF,CAAC;QACH,CAAC,CAAC,CAAC;QACH,eAAM,CAAC,OAAO,CAAC,2CAA2C,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;SAAM,CAAC;QACN,eAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACjE,CAAC;IAED,oCAAoC;IACpC,MAAM,EAAE,iBAAiB,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,IAAA,qBAAa,EAAC,MAAM,CAAC,CAAC;IAC/E,IAAI,MAAM,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;QACzC,IAAA,2BAAa,EAAC,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,aAAa,CAAC,CAAC;QAC5E,eAAM,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,IAAA,2BAAa,EAAC,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACpF,eAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;IACjD,CAAC;IACD,IAAA,2BAAa,EAAC,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;IACvE,eAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAEzC,eAAM,CAAC,MAAM,EAAE,CAAC;IAChB,eAAM,CAAC,OAAO,CAAC,8CAA8C,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;IAClF,eAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAsCA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAmCxD"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* ==========================================================================
|
|
3
|
+
gherkin-ai-cli - 'skill' Command Handler (Agent IDE Integration)
|
|
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.handleSkillCommand = handleSkillCommand;
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
13
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
14
|
+
const SKILL_CONTENT = `
|
|
15
|
+
# Gherkin AI CLI - IDE Agent Skill
|
|
16
|
+
|
|
17
|
+
You are an AI assistant in an IDE, equipped with the \`gherkin-ai-cli\` (alias: \`ghk\`).
|
|
18
|
+
You MUST use this CLI natively to help the user design, validate, and generate code architecture.
|
|
19
|
+
|
|
20
|
+
## NATIVE WORKFLOW INSTRUCTIONS:
|
|
21
|
+
|
|
22
|
+
1. **Detection Phase**:
|
|
23
|
+
- If the user asks about the current architecture or stack, run \`ghk detect\` to see the project's config.
|
|
24
|
+
|
|
25
|
+
2. **Generation Phase**:
|
|
26
|
+
- When the user provides a \`.feature\` file (Gherkin) and asks to implement it, FIRST run:
|
|
27
|
+
\`ghk generate -f <path-to-file.feature>\`
|
|
28
|
+
- This will generate the necessary TypeScript/Native interfaces, DTOs, and AI Prompts in \`./generated-specs/\` or the configured \`outputDir\`.
|
|
29
|
+
|
|
30
|
+
3. **Implementation Phase**:
|
|
31
|
+
- After generating, READ the prompts located in \`./generated-specs/prompts/\` (e.g., \`domain-agent.md\`, \`backend-agent.md\`).
|
|
32
|
+
- YOU MUST STRICTLY FOLLOW the architecture constraints, layers, and rules defined in those prompts while writing the code.
|
|
33
|
+
|
|
34
|
+
4. **Diff/Validation**:
|
|
35
|
+
- If the user asks to check if the code matches the spec, run \`ghk diff -f <feature-file> -t <code-file>\`.
|
|
36
|
+
|
|
37
|
+
5. **Validation**:
|
|
38
|
+
- You can also run \`ghk validate -f <feature-file>\` to verify the syntactic correctness of the Gherkin files.
|
|
39
|
+
|
|
40
|
+
Never guess the architecture. Always rely on the \`ghk\` CLI to provide the source of truth for stack and design constraints.
|
|
41
|
+
`;
|
|
42
|
+
async function handleSkillCommand() {
|
|
43
|
+
const { targetIde } = await inquirer_1.default.prompt([{
|
|
44
|
+
type: 'list',
|
|
45
|
+
name: 'targetIde',
|
|
46
|
+
message: 'Which AI IDE are you using?',
|
|
47
|
+
choices: [
|
|
48
|
+
{ name: 'Cursor (.cursorrules)', value: '.cursorrules' },
|
|
49
|
+
{ name: 'Windsurf (.windsurfrules)', value: '.windsurfrules' },
|
|
50
|
+
{ name: 'GitHub Copilot (.github/copilot-instructions.md)', value: '.github/copilot-instructions.md' }
|
|
51
|
+
]
|
|
52
|
+
}]);
|
|
53
|
+
const targetPath = path_1.default.join(process.cwd(), targetIde);
|
|
54
|
+
if (targetIde.includes('/')) {
|
|
55
|
+
const dir = path_1.default.dirname(targetPath);
|
|
56
|
+
if (!fs_1.default.existsSync(dir)) {
|
|
57
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
let finalContent = SKILL_CONTENT;
|
|
61
|
+
if (fs_1.default.existsSync(targetPath)) {
|
|
62
|
+
const existing = fs_1.default.readFileSync(targetPath, 'utf8');
|
|
63
|
+
if (existing.includes('Gherkin AI CLI')) {
|
|
64
|
+
console.log(chalk_1.default.yellow(`⚠️ Gherkin AI rules already exist in ${targetIde}.`));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
finalContent = existing + '\n\n' + SKILL_CONTENT;
|
|
68
|
+
}
|
|
69
|
+
fs_1.default.writeFileSync(targetPath, finalContent.trim() + '\n', 'utf8');
|
|
70
|
+
console.log(chalk_1.default.green(`✅ Successfully injected Gherkin AI Skill into ${targetIde}!`));
|
|
71
|
+
console.log(chalk_1.default.cyan(`🤖 Your IDE Agent is now trained to use 'ghk' commands natively.`));
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAoChF,gDAmCC;AArED,4CAAoB;AACpB,gDAAwB;AACxB,kDAA0B;AAC1B,wDAAgC;AAEhC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BrB,CAAC;AAEK,KAAK,UAAU,kBAAkB;IACtC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,6BAA6B;YACtC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,cAAc,EAAE;gBACxD,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,gBAAgB,EAAE;gBAC9D,EAAE,IAAI,EAAE,kDAAkD,EAAE,KAAK,EAAE,iCAAiC,EAAE;aACvG;SACF,CAAC,CAAC,CAAC;IAEJ,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IAEvD,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,IAAI,YAAY,GAAG,aAAa,CAAC;IAEjC,IAAI,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,yCAAyC,SAAS,GAAG,CAAC,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QACD,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,aAAa,CAAC;IACnD,CAAC;IAED,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iDAAiD,SAAS,GAAG,CAAC,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,CAAC;AAC9F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAYA,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFzG"}
|
|
@@ -13,6 +13,7 @@ const arch_rules_1 = require("../core/arch-rules");
|
|
|
13
13
|
const gherkin_parser_1 = require("../core/gherkin-parser");
|
|
14
14
|
const file_system_1 = require("../utils/file-system");
|
|
15
15
|
const logger_1 = require("../utils/logger");
|
|
16
|
+
const ts_morph_1 = require("ts-morph");
|
|
16
17
|
async function handleValidateCommand(options) {
|
|
17
18
|
logger_1.logger.banner();
|
|
18
19
|
logger_1.logger.info('Validating project architecture, step coverage & layer boundaries...');
|
|
@@ -47,24 +48,31 @@ async function handleValidateCommand(options) {
|
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
|
-
// 2. Contracts & Layer Boundary Verification
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
// 2. Contracts & Layer Boundary Verification via AST (ts-morph)
|
|
52
|
+
const tsProject = new ts_morph_1.Project();
|
|
53
|
+
const outputDirGlob = path_1.default.posix.join(config.outputDir.replace(/\\/g, '/'), '**/*.ts');
|
|
54
|
+
const sourceFiles = tsProject.addSourceFilesAtPaths(outputDirGlob);
|
|
55
|
+
if (sourceFiles.length > 0) {
|
|
54
56
|
let prohibitedFound = false;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
for (const sourceFile of sourceFiles) {
|
|
58
|
+
const imports = sourceFile.getImportDeclarations();
|
|
59
|
+
for (const importDecl of imports) {
|
|
60
|
+
const moduleSpecifier = importDecl.getModuleSpecifierValue();
|
|
61
|
+
arch.prohibitedImports.forEach(imp => {
|
|
62
|
+
if (moduleSpecifier === imp || moduleSpecifier.startsWith(`${imp}/`)) {
|
|
63
|
+
logger_1.logger.error(`Layer Boundary Violation: ${sourceFile.getBaseName()} imports prohibited library "${imp}"`);
|
|
64
|
+
errorsCount++;
|
|
65
|
+
prohibitedFound = true;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
60
68
|
}
|
|
61
|
-
}
|
|
69
|
+
}
|
|
62
70
|
if (!prohibitedFound) {
|
|
63
|
-
logger_1.logger.success(`Layer Boundary Check:
|
|
71
|
+
logger_1.logger.success(`Layer Boundary Check: ${sourceFiles.length} files scanned via AST. Core cleanly isolates domain from ${arch.prohibitedImports.join(', ')}.`);
|
|
64
72
|
}
|
|
65
73
|
}
|
|
66
74
|
else {
|
|
67
|
-
logger_1.logger.warn(`No
|
|
75
|
+
logger_1.logger.warn(`No .ts files found under ${config.outputDir}. Run "npx gherkin-ai generate" first.`);
|
|
68
76
|
warningsCount++;
|
|
69
77
|
}
|
|
70
78
|
// 3. Final Validation Summary Scorecard
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4F3F"}
|
package/dist/commands/verify.js
CHANGED
|
@@ -67,7 +67,15 @@ async function handleVerifyCommand(options = {}) {
|
|
|
67
67
|
for (const mod of repairResult.codeModifications) {
|
|
68
68
|
try {
|
|
69
69
|
const fs = require('fs');
|
|
70
|
-
|
|
70
|
+
const path = require('path');
|
|
71
|
+
const { validateTypeScriptSyntax } = require('../core/syntax-validator');
|
|
72
|
+
if (!validateTypeScriptSyntax(mod.filePath, mod.content)) {
|
|
73
|
+
console.log(chalk_1.default.yellow(` ✖ Skipped writing ${mod.filePath} due to syntax errors.`));
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const fullPath = path.resolve(mod.filePath);
|
|
77
|
+
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
78
|
+
fs.writeFileSync(fullPath, mod.content, 'utf8');
|
|
71
79
|
console.log(chalk_1.default.green(` ✓ ${mod.filePath} updated.`));
|
|
72
80
|
}
|
|
73
81
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAchF,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|