gherkin-ai 2.0.1 ā 2.2.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/README.md +11 -9
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +19 -3
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/autopilot.d.ts.map +1 -1
- package/dist/commands/autopilot.js +53 -5
- package/dist/commands/autopilot.js.map +1 -1
- package/dist/commands/diff.d.ts +6 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +59 -0
- package/dist/commands/diff.js.map +1 -0
- 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 +24 -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 +16 -0
- package/dist/core/agent-adapter.d.ts.map +1 -1
- package/dist/core/agent-adapter.js +132 -4
- 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/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 +9 -0
- package/dist/core/gherkin-parser.d.ts.map +1 -1
- package/dist/core/gherkin-parser.js +95 -45
- package/dist/core/gherkin-parser.js.map +1 -1
- package/dist/core/quality-score.d.ts +1 -1
- package/dist/core/quality-score.d.ts.map +1 -1
- package/dist/core/quality-score.js +67 -11
- 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/generators/contracts.d.ts +1 -0
- package/dist/generators/contracts.d.ts.map +1 -1
- package/dist/generators/contracts.js +64 -5
- package/dist/generators/contracts.js.map +1 -1
- package/dist/generators/prompt-templates/base.d.ts +23 -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 +19 -62
- package/dist/generators/prompts.js.map +1 -1
- package/dist/index.js +64 -1
- package/dist/index.js.map +1 -1
- 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/package.json +12 -4
package/README.md
CHANGED
|
@@ -8,23 +8,25 @@
|
|
|
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
|
+
- š”ļø **Semantically Typed Contracts**: Extracts variables straight from your Gherkin data tables (like `@validate:email`) and outputs strictly typed Zod DTOs instead of generic objects.
|
|
19
|
+
- š **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
20
|
- š¦ **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
|
-
- š **Autopilot Multi-Agent Delivery (`ghk autopilot`)**: Decomposes product requirements into sub-agent workflows (Planner, Spec, Developer, Tester, Reviewer) and generates ready-to-merge Pull Requests.
|
|
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.
|
|
21
|
+
- š **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.
|
|
22
|
+
- ā **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
23
|
- šµļø **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
|
-
-
|
|
24
|
+
- š” **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 (Single Source of Truth).
|
|
24
26
|
|
|
25
27
|
---
|
|
26
28
|
|
|
27
|
-
## š„ Installation & Execution (`v2.
|
|
29
|
+
## š„ Installation & Execution (`v2.2.0`)
|
|
28
30
|
|
|
29
31
|
You can use `gherkin-ai` via global `npm` installation, on-demand zero-install `npx`, or as a project local dev dependency:
|
|
30
32
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAeA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAeA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8FrH"}
|
package/dist/commands/add.js
CHANGED
|
@@ -58,18 +58,34 @@ async function handleAddCommand(options) {
|
|
|
58
58
|
: path_1.default.resolve(process.cwd(), 'src', 'modules', featurePascal.toLowerCase());
|
|
59
59
|
(0, file_system_1.ensureDirSync)(targetDir);
|
|
60
60
|
logger_1.logger.info(`Injecting contracts & AI prompts into: ${targetDir}`);
|
|
61
|
-
// 1. Generate Contracts, OpenAPI & Native Language Contract
|
|
62
|
-
const { contractsTs, adrMd, openApiJson, nativeContract } = (0, contracts_1.generateContracts)(parsed, config);
|
|
61
|
+
// 1. Generate Contracts, OpenAPI, AsyncAPI & Native Language Contract
|
|
62
|
+
const { contractsTs, adrMd, openApiJson, asyncApiJson, nativeContract } = (0, contracts_1.generateContracts)(parsed, config);
|
|
63
63
|
const contractFileName = `${featurePascal.toLowerCase()}.contract.ts`;
|
|
64
64
|
(0, file_system_1.writeFileSync)(path_1.default.join(targetDir, contractFileName), contractsTs);
|
|
65
65
|
(0, file_system_1.writeFileSync)(path_1.default.join(targetDir, `${featurePascal.toLowerCase()}.openapi.json`), openApiJson);
|
|
66
|
+
(0, file_system_1.writeFileSync)(path_1.default.join(targetDir, `${featurePascal.toLowerCase()}.asyncapi.json`), asyncApiJson);
|
|
66
67
|
(0, file_system_1.writeFileSync)(path_1.default.join(targetDir, `ADR-${featurePascal}.md`), adrMd);
|
|
67
68
|
logger_1.logger.success(`Created contract file: ${path_1.default.join(targetDir, contractFileName)}`);
|
|
68
69
|
if (nativeContract) {
|
|
69
70
|
(0, file_system_1.writeFileSync)(path_1.default.join(targetDir, nativeContract.filename), nativeContract.content);
|
|
70
71
|
logger_1.logger.success(`Created language-native contract file: ${path_1.default.join(targetDir, nativeContract.filename)}`);
|
|
71
72
|
}
|
|
72
|
-
// 2. Generate
|
|
73
|
+
// 2. Generate Test Stubs
|
|
74
|
+
const testsDir = path_1.default.join(targetDir, '__tests__');
|
|
75
|
+
(0, file_system_1.ensureDirSync)(testsDir);
|
|
76
|
+
let stubContent = `// Auto-generated Test Stub for ${featurePascal}\n\n`;
|
|
77
|
+
stubContent += `describe('${parsed.featureName}', () => {\n`;
|
|
78
|
+
parsed.scenarios.forEach(sc => {
|
|
79
|
+
stubContent += ` describe('Scenario: ${sc.name}', () => {\n`;
|
|
80
|
+
sc.steps.forEach(st => {
|
|
81
|
+
stubContent += ` it('${st.keyword} ${st.text.replace(/'/g, "\\'")}', async () => {\n // TODO: Implement step\n });\n`;
|
|
82
|
+
});
|
|
83
|
+
stubContent += ` });\n`;
|
|
84
|
+
});
|
|
85
|
+
stubContent += `});\n`;
|
|
86
|
+
(0, file_system_1.writeFileSync)(path_1.default.join(testsDir, `${featurePascal.toLowerCase()}.stub.spec.ts`), stubContent);
|
|
87
|
+
logger_1.logger.success(`Created test stubs inside: ${testsDir}`);
|
|
88
|
+
// 3. Generate Agent Prompts inside target module
|
|
73
89
|
const promptsDir = path_1.default.join(targetDir, 'prompts');
|
|
74
90
|
(0, file_system_1.ensureDirSync)(promptsDir);
|
|
75
91
|
const prompts = (0, prompts_1.generatePrompts)(parsed, config);
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAahF,
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autopilot.d.ts","sourceRoot":"","sources":["../../src/commands/autopilot.ts"],"names":[],"mappings":"
|
|
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,CAiE1F"}
|
|
@@ -8,18 +8,66 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.handleAutopilotCommand = handleAutopilotCommand;
|
|
10
10
|
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
11
13
|
const context_builder_1 = require("../core/context-builder");
|
|
12
14
|
const quality_score_1 = require("../core/quality-score");
|
|
15
|
+
const agent_adapter_1 = require("../core/agent-adapter");
|
|
16
|
+
const verify_1 = require("./verify");
|
|
13
17
|
async function handleAutopilotCommand(options = {}) {
|
|
14
18
|
console.log(chalk_1.default.bold.cyan('\nš Launching gherkin-ai Autopilot Autonomous Delivery Orchestrator...\n'));
|
|
15
19
|
const reqFile = options.requirement || 'requirement.md';
|
|
20
|
+
const reqContent = fs_1.default.existsSync(reqFile) ? fs_1.default.readFileSync(reqFile, 'utf8') : 'No requirement provided.';
|
|
16
21
|
console.log(chalk_1.default.blue(`1. Analyzing repository & building context package...`));
|
|
17
22
|
const context = (0, context_builder_1.buildProjectContext)();
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
const config = {
|
|
24
|
+
provider: process.env.LLM_PROVIDER || 'ide_delegate',
|
|
25
|
+
model: process.env.LLM_MODEL,
|
|
26
|
+
apiKey: process.env.OPENAI_API_KEY || process.env.ANTHROPIC_API_KEY || process.env.LLM_API_KEY,
|
|
27
|
+
baseUrl: process.env.LLM_BASE_URL
|
|
28
|
+
};
|
|
29
|
+
const agent = new agent_adapter_1.RealAgentProvider(config);
|
|
30
|
+
console.log(chalk_1.default.blue(`2. Invoking Spec Agent -> Generating Gherkin AST...`));
|
|
31
|
+
const specRes = await agent.executeTask({
|
|
32
|
+
id: 'auto-spec',
|
|
33
|
+
type: 'spec_generation',
|
|
34
|
+
prompt: `Generate a Gherkin .feature file for the following requirement:\n\n${reqContent}\n\nWrap the code in \`\`\`gherkin ... \`\`\` blocks.`,
|
|
35
|
+
contextFiles: ['.ghe/conventions.md']
|
|
36
|
+
});
|
|
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
|
+
}
|
|
53
|
+
console.log(chalk_1.default.blue(`3. Invoking Scaffolding Agent -> Generating Bindings...`));
|
|
54
|
+
const scaffoldRes = await agent.executeTask({
|
|
55
|
+
id: 'auto-scaffold',
|
|
56
|
+
type: 'scaffold_binding',
|
|
57
|
+
prompt: `Generate step definitions for the following spec:\n\n${specContent}\n\nWrap code in \`\`\`ts ... \`\`\``,
|
|
58
|
+
contextFiles: []
|
|
59
|
+
});
|
|
60
|
+
if (scaffoldRes.codeModifications && scaffoldRes.codeModifications.length > 0) {
|
|
61
|
+
for (const mod of scaffoldRes.codeModifications) {
|
|
62
|
+
const fullPath = path_1.default.resolve(mod.filePath);
|
|
63
|
+
fs_1.default.mkdirSync(path_1.default.dirname(fullPath), { recursive: true });
|
|
64
|
+
fs_1.default.writeFileSync(fullPath, mod.content);
|
|
65
|
+
console.log(chalk_1.default.green(` ā Wrote bindings to ${mod.filePath}`));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
console.log(chalk_1.default.blue(`4. Invoking Verification Agent & Closed-Loop Repair...`));
|
|
69
|
+
await (0, verify_1.handleVerifyCommand)({ autoFix: true, maxRetries: 2 });
|
|
70
|
+
console.log(chalk_1.default.blue(`5. Evaluating Enterprise Quality Score Gate...`));
|
|
23
71
|
const scorecard = (0, quality_score_1.calculateQualityScorecard)();
|
|
24
72
|
console.log(chalk_1.default.bold.green(`\nā
Autopilot Execution Complete! Quality Score: ${scorecard.overallScore}%`));
|
|
25
73
|
console.log(chalk_1.default.bold.cyan(` Ready for PR Review & Human Approval.\n`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autopilot.js","sourceRoot":"","sources":["../../src/commands/autopilot.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;
|
|
1
|
+
{"version":3,"file":"autopilot.js","sourceRoot":"","sources":["../../src/commands/autopilot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +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,CAqDvF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* ==========================================================================
|
|
3
|
+
gherkin-ai-cli - 'diff' Command Handler (Drift Detection)
|
|
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.handleDiffCommand = handleDiffCommand;
|
|
10
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const gherkin_parser_1 = require("../core/gherkin-parser");
|
|
13
|
+
async function handleDiffCommand(options = {}) {
|
|
14
|
+
console.log(chalk_1.default.bold.cyan('\nš Running Drift Detection (Gherkin vs Code)...\n'));
|
|
15
|
+
if (!options.feature || !options.target) {
|
|
16
|
+
console.log(chalk_1.default.red('Please provide both --feature and --target files.'));
|
|
17
|
+
console.log('Example: ghk diff --feature specs/login.feature --target src/dto/login.dto.ts');
|
|
18
|
+
process.exitCode = 1;
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (!fs_1.default.existsSync(options.feature)) {
|
|
22
|
+
console.log(chalk_1.default.red(`Feature file not found: ${options.feature}`));
|
|
23
|
+
process.exitCode = 1;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (!fs_1.default.existsSync(options.target)) {
|
|
27
|
+
console.log(chalk_1.default.red(`Target code file not found: ${options.target}`));
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const featureContent = fs_1.default.readFileSync(options.feature, 'utf8');
|
|
32
|
+
const targetContent = fs_1.default.readFileSync(options.target, 'utf8');
|
|
33
|
+
const parsed = (0, gherkin_parser_1.parseGherkinText)(featureContent);
|
|
34
|
+
const fields = parsed.domainAnalysis.fields;
|
|
35
|
+
if (fields.length === 0) {
|
|
36
|
+
console.log(chalk_1.default.yellow(`ā No semantic fields found in ${options.feature}. Ensure you use quotes like "email" to define fields.`));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
let driftFound = false;
|
|
40
|
+
console.log(chalk_1.default.blue(`Checking synchronization for ${fields.length} semantic fields...\n`));
|
|
41
|
+
for (const field of fields) {
|
|
42
|
+
// Basic check: Does the target code at least mention the field?
|
|
43
|
+
if (!targetContent.includes(field.name)) {
|
|
44
|
+
console.log(chalk_1.default.red(` ā Drift Detected! Field '${field.name}' from feature is missing in ${options.target}`));
|
|
45
|
+
driftFound = true;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.log(chalk_1.default.green(` ā Field '${field.name}' is synchronized.`));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (driftFound) {
|
|
52
|
+
console.log(chalk_1.default.bold.red('\nā Drift Detection Failed: The source of truth (.feature) does not match the implementation.'));
|
|
53
|
+
process.exitCode = 1;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.log(chalk_1.default.bold.green('\nā
No drift detected. Code is synchronized with the Gherkin specification.'));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":"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"}
|
|
@@ -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,CAqF3F"}
|
package/dist/commands/verify.js
CHANGED
|
@@ -46,7 +46,13 @@ async function handleVerifyCommand(options = {}) {
|
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
48
|
console.log(chalk_1.default.cyan(`\nš¤ Invoking Agent Repair Loop (Attempt ${iteration})...`));
|
|
49
|
-
const
|
|
49
|
+
const config = {
|
|
50
|
+
provider: process.env.LLM_PROVIDER || 'ide_delegate',
|
|
51
|
+
model: process.env.LLM_MODEL,
|
|
52
|
+
apiKey: process.env.OPENAI_API_KEY || process.env.ANTHROPIC_API_KEY || process.env.LLM_API_KEY,
|
|
53
|
+
baseUrl: process.env.LLM_BASE_URL
|
|
54
|
+
};
|
|
55
|
+
const agent = new agent_adapter_1.RealAgentProvider(config);
|
|
50
56
|
const repairResult = await agent.executeTask({
|
|
51
57
|
id: `fix-${iteration}`,
|
|
52
58
|
type: 'auto_fix',
|
|
@@ -55,6 +61,23 @@ async function handleVerifyCommand(options = {}) {
|
|
|
55
61
|
diagnosis
|
|
56
62
|
});
|
|
57
63
|
console.log(chalk_1.default.gray(` ${repairResult.agentResponse.split('\n')[0]}`));
|
|
64
|
+
// Apply Code Modifications if provided by RealAgentProvider
|
|
65
|
+
if (repairResult.codeModifications && repairResult.codeModifications.length > 0) {
|
|
66
|
+
console.log(chalk_1.default.green(` Applying ${repairResult.codeModifications.length} code modification(s)...`));
|
|
67
|
+
for (const mod of repairResult.codeModifications) {
|
|
68
|
+
try {
|
|
69
|
+
const fs = require('fs');
|
|
70
|
+
const path = require('path');
|
|
71
|
+
const fullPath = path.resolve(mod.filePath);
|
|
72
|
+
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
73
|
+
fs.writeFileSync(fullPath, mod.content, 'utf8');
|
|
74
|
+
console.log(chalk_1.default.green(` ā ${mod.filePath} updated.`));
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
console.log(chalk_1.default.red(` ā Failed to write ${mod.filePath}: ${e.message}`));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
58
81
|
iteration++;
|
|
59
82
|
}
|
|
60
83
|
if (!success) {
|
|
@@ -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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/commands/web.ts"],"names":[],"mappings":"AAOA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBlE"}
|