gherkin-ai 2.4.0 → 2.6.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 +5 -4
- package/dist/commands/autopilot.d.ts +1 -0
- package/dist/commands/autopilot.d.ts.map +1 -1
- package/dist/commands/autopilot.js +130 -32
- package/dist/commands/autopilot.js.map +1 -1
- package/dist/commands/converge.d.ts +7 -0
- package/dist/commands/converge.d.ts.map +1 -0
- package/dist/commands/converge.js +115 -0
- package/dist/commands/converge.js.map +1 -0
- package/dist/commands/diff.d.ts +16 -0
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +38 -2
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doc.d.ts +2 -0
- package/dist/commands/doc.d.ts.map +1 -0
- package/dist/commands/doc.js +20 -0
- package/dist/commands/doc.js.map +1 -0
- package/dist/commands/generate.d.ts +1 -0
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +62 -57
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/impact.d.ts +6 -0
- package/dist/commands/impact.d.ts.map +1 -0
- package/dist/commands/impact.js +65 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/init.d.ts +5 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +77 -56
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/lint.d.ts +8 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +143 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/pr-review.d.ts +6 -0
- package/dist/commands/pr-review.d.ts.map +1 -0
- package/dist/commands/pr-review.js +74 -0
- package/dist/commands/pr-review.js.map +1 -0
- package/dist/commands/quality.d.ts.map +1 -1
- package/dist/commands/quality.js +3 -1
- package/dist/commands/quality.js.map +1 -1
- package/dist/commands/sbom.d.ts +2 -0
- package/dist/commands/sbom.d.ts.map +1 -0
- package/dist/commands/sbom.js +62 -0
- package/dist/commands/sbom.js.map +1 -0
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +251 -25
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/validate.d.ts +1 -0
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +35 -1
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +46 -15
- package/dist/commands/verify.js.map +1 -1
- package/dist/core/agent-adapter.d.ts +7 -0
- package/dist/core/agent-adapter.d.ts.map +1 -1
- package/dist/core/agent-adapter.js +145 -25
- package/dist/core/agent-adapter.js.map +1 -1
- package/dist/core/config.d.ts +2 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +3 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/constitution.d.ts +83 -0
- package/dist/core/constitution.d.ts.map +1 -0
- package/dist/core/constitution.js +317 -0
- package/dist/core/constitution.js.map +1 -0
- package/dist/core/context-security.d.ts +25 -0
- package/dist/core/context-security.d.ts.map +1 -0
- package/dist/core/context-security.js +154 -0
- package/dist/core/context-security.js.map +1 -0
- package/dist/core/convergence-engine.d.ts +21 -0
- package/dist/core/convergence-engine.d.ts.map +1 -0
- package/dist/core/convergence-engine.js +266 -0
- package/dist/core/convergence-engine.js.map +1 -0
- package/dist/core/doc-engine.d.ts +6 -0
- package/dist/core/doc-engine.d.ts.map +1 -0
- package/dist/core/doc-engine.js +105 -0
- package/dist/core/doc-engine.js.map +1 -0
- package/dist/core/error-parser.d.ts +3 -1
- package/dist/core/error-parser.d.ts.map +1 -1
- package/dist/core/error-parser.js +8 -2
- package/dist/core/error-parser.js.map +1 -1
- package/dist/core/execution-sandbox.d.ts +1 -0
- package/dist/core/execution-sandbox.d.ts.map +1 -1
- package/dist/core/execution-sandbox.js +1 -1
- package/dist/core/execution-sandbox.js.map +1 -1
- package/dist/core/gherkin-parser.d.ts +1 -0
- package/dist/core/gherkin-parser.d.ts.map +1 -1
- package/dist/core/gherkin-parser.js +11 -1
- package/dist/core/gherkin-parser.js.map +1 -1
- package/dist/core/guardrails.d.ts +10 -1
- package/dist/core/guardrails.d.ts.map +1 -1
- package/dist/core/guardrails.js +56 -8
- package/dist/core/guardrails.js.map +1 -1
- package/dist/core/impact-analyzer.d.ts +12 -0
- package/dist/core/impact-analyzer.d.ts.map +1 -0
- package/dist/core/impact-analyzer.js +117 -0
- package/dist/core/impact-analyzer.js.map +1 -0
- package/dist/core/ir-builder.d.ts +5 -0
- package/dist/core/ir-builder.d.ts.map +1 -0
- package/dist/core/ir-builder.js +944 -0
- package/dist/core/ir-builder.js.map +1 -0
- package/dist/core/openapi-validator.d.ts +16 -0
- package/dist/core/openapi-validator.d.ts.map +1 -0
- package/dist/core/openapi-validator.js +132 -0
- package/dist/core/openapi-validator.js.map +1 -0
- package/dist/core/plugin-system.d.ts +57 -0
- package/dist/core/plugin-system.d.ts.map +1 -0
- package/dist/core/plugin-system.js +71 -0
- package/dist/core/plugin-system.js.map +1 -0
- package/dist/core/pr-reviewer.d.ts +12 -0
- package/dist/core/pr-reviewer.d.ts.map +1 -0
- package/dist/core/pr-reviewer.js +58 -0
- package/dist/core/pr-reviewer.js.map +1 -0
- package/dist/core/quality-score.d.ts +4 -1
- package/dist/core/quality-score.d.ts.map +1 -1
- package/dist/core/quality-score.js +111 -33
- package/dist/core/quality-score.js.map +1 -1
- package/dist/core/requirement-validator.d.ts +12 -0
- package/dist/core/requirement-validator.d.ts.map +1 -0
- package/dist/core/requirement-validator.js +37 -0
- package/dist/core/requirement-validator.js.map +1 -0
- package/dist/core/security-sanitizer.d.ts +8 -0
- package/dist/core/security-sanitizer.d.ts.map +1 -0
- package/dist/core/security-sanitizer.js +73 -0
- package/dist/core/security-sanitizer.js.map +1 -0
- package/dist/core/semantic-ir.d.ts +179 -0
- package/dist/core/semantic-ir.d.ts.map +1 -0
- package/dist/core/semantic-ir.js +15 -0
- package/dist/core/semantic-ir.js.map +1 -0
- package/dist/core/specification-linter.d.ts +31 -0
- package/dist/core/specification-linter.d.ts.map +1 -0
- package/dist/core/specification-linter.js +463 -0
- package/dist/core/specification-linter.js.map +1 -0
- package/dist/core/step-indexer.d.ts +2 -0
- package/dist/core/step-indexer.d.ts.map +1 -1
- package/dist/core/step-indexer.js +99 -33
- package/dist/core/step-indexer.js.map +1 -1
- package/dist/core/telemetry.d.ts +42 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +111 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/generators/ci-workflow-generator.d.ts +5 -0
- package/dist/generators/ci-workflow-generator.d.ts.map +1 -0
- package/dist/generators/ci-workflow-generator.js +54 -0
- package/dist/generators/ci-workflow-generator.js.map +1 -0
- package/dist/generators/contracts.js +8 -7
- package/dist/generators/contracts.js.map +1 -1
- package/dist/generators/fixtures.d.ts.map +1 -1
- package/dist/generators/fixtures.js +22 -27
- package/dist/generators/fixtures.js.map +1 -1
- package/dist/generators/preset-node-nestjs.d.ts.map +1 -1
- package/dist/generators/preset-node-nestjs.js +39 -18
- package/dist/generators/preset-node-nestjs.js.map +1 -1
- package/dist/generators/prisma-generator.d.ts +6 -0
- package/dist/generators/prisma-generator.d.ts.map +1 -0
- package/dist/generators/prisma-generator.js +143 -0
- package/dist/generators/prisma-generator.js.map +1 -0
- package/dist/generators/prisma-stack.d.ts +7 -0
- package/dist/generators/prisma-stack.d.ts.map +1 -0
- package/dist/generators/prisma-stack.js +77 -0
- package/dist/generators/prisma-stack.js.map +1 -0
- package/dist/generators/prompts.d.ts.map +1 -1
- package/dist/generators/prompts.js +15 -1
- package/dist/generators/prompts.js.map +1 -1
- package/dist/index.js +89 -6
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-server.d.ts.map +1 -1
- package/dist/mcp/mcp-server.js +336 -98
- package/dist/mcp/mcp-server.js.map +1 -1
- package/dist/plugins/core-generators-plugin.d.ts +35 -0
- package/dist/plugins/core-generators-plugin.d.ts.map +1 -0
- package/dist/plugins/core-generators-plugin.js +146 -0
- package/dist/plugins/core-generators-plugin.js.map +1 -0
- package/dist/ui/server.d.ts.map +1 -1
- package/dist/ui/server.js +43 -8
- package/dist/ui/server.js.map +1 -1
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +53 -4
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/spec-dir-resolver.d.ts +6 -0
- package/dist/utils/spec-dir-resolver.d.ts.map +1 -0
- package/dist/utils/spec-dir-resolver.js +32 -0
- package/dist/utils/spec-dir-resolver.js.map +1 -0
- package/dist/utils/workspace-detector.d.ts +4 -1
- package/dist/utils/workspace-detector.d.ts.map +1 -1
- package/dist/utils/workspace-detector.js +23 -2
- package/dist/utils/workspace-detector.js.map +1 -1
- package/docs/MCP_GUIDE.md +14 -11
- package/docs/USAGE_GUIDE.md +10 -6
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## 🌟 Strategic Capabilities (`v2.
|
|
11
|
+
## 🌟 Strategic Capabilities (`v2.6.0` Stable Release)
|
|
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
|
|
|
@@ -17,7 +17,8 @@ While basic AI spec tools only generate text prompts, `gherkin-ai` acts as an **
|
|
|
17
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
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
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 (
|
|
20
|
+
- ⚙️ **Headless CI/CD Mode**: Fully decoupled non-interactive mode (`--yes`, `--non-interactive`, `--project <dir>`) designed for frictionless integration into GitHub Actions, Azure DevOps, and automated pipelines.
|
|
21
|
+
- 📋 **Pre-flight Requirement Validation**: Built-in semantic validator inside `ghk autopilot` that analyzes requirements before triggering LLM agents, preventing token waste on vague features.
|
|
21
22
|
- 🔌 **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.
|
|
22
23
|
- 📦 **Context Engineering & Guardrails Engine (`ghk context`)**: Structurally packages project architecture, conventions, and security policies into `.ghe/`, enforcing strict path protection and agent change limits.
|
|
23
24
|
- 🏗️ **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.
|
|
@@ -25,11 +26,11 @@ While basic AI spec tools only generate text prompts, `gherkin-ai` acts as an **
|
|
|
25
26
|
- ☕ **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.
|
|
26
27
|
- 🕵️ **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.
|
|
27
28
|
- 📡 **Event-Driven & AsyncAPI Support**: Automatically extracts domain events from Gherkin and scaffolds standard `asyncapi.json` contracts.
|
|
28
|
-
- 🔍 **
|
|
29
|
+
- 🔍 **Deep AST Drift Detection (`ghk diff`)**: Validates in CI/CD pipelines if the implemented DTOs and code have drifted from the `.feature` file. Now cross-references semantic fields, HTTP status codes, and API Endpoints.
|
|
29
30
|
|
|
30
31
|
---
|
|
31
32
|
|
|
32
|
-
## 📥 Installation & Execution (`v2.
|
|
33
|
+
## 📥 Installation & Execution (`v2.6.0`)
|
|
33
34
|
|
|
34
35
|
You can use `gherkin-ai` via global `npm` installation, on-demand zero-install `npx`, or as a project local dev dependency:
|
|
35
36
|
|
|
@@ -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":"AAeA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmK1F"}
|
|
@@ -14,50 +14,125 @@ const context_builder_1 = require("../core/context-builder");
|
|
|
14
14
|
const quality_score_1 = require("../core/quality-score");
|
|
15
15
|
const agent_adapter_1 = require("../core/agent-adapter");
|
|
16
16
|
const verify_1 = require("./verify");
|
|
17
|
+
const config_1 = require("../core/config");
|
|
18
|
+
const spec_dir_resolver_1 = require("../utils/spec-dir-resolver");
|
|
19
|
+
const requirement_validator_1 = require("../core/requirement-validator");
|
|
17
20
|
async function handleAutopilotCommand(options = {}) {
|
|
18
21
|
console.log(chalk_1.default.bold.cyan('\n🚀 Launching gherkin-ai Autopilot Autonomous Delivery Orchestrator...\n'));
|
|
19
22
|
const reqFile = options.requirement || 'requirement.md';
|
|
20
|
-
|
|
23
|
+
if (!fs_1.default.existsSync(reqFile)) {
|
|
24
|
+
console.log(chalk_1.default.red(`\n✖ Requirement file not found: ${reqFile}`));
|
|
25
|
+
console.log(chalk_1.default.yellow(` → Fix: Provide a valid path with --requirement <file>`));
|
|
26
|
+
console.log(chalk_1.default.yellow(` → Example: ghk autopilot --requirement docs/user-crud.md\n`));
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const reqContent = fs_1.default.readFileSync(reqFile, 'utf8');
|
|
31
|
+
// Validate requirement before proceeding with agents
|
|
32
|
+
const validation = (0, requirement_validator_1.validateRequirement)(reqContent);
|
|
33
|
+
if (!validation.isValid) {
|
|
34
|
+
console.log(chalk_1.default.red('\n✖ Requirement validation failed:'));
|
|
35
|
+
for (const issue of validation.issues) {
|
|
36
|
+
console.log(chalk_1.default.yellow(` ⚠ ${issue.message}`));
|
|
37
|
+
console.log(chalk_1.default.gray(` → ${issue.suggestion}`));
|
|
38
|
+
}
|
|
39
|
+
process.exitCode = 1;
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const { detectPromptInjection } = require('../core/security-sanitizer');
|
|
43
|
+
const securityCheck = detectPromptInjection(reqContent);
|
|
44
|
+
if (!securityCheck.isSafe) {
|
|
45
|
+
console.log(chalk_1.default.red('\n✖ SECURITY ALERT: Prompt Injection Attempt Blocked!'));
|
|
46
|
+
console.log(chalk_1.default.red(` ⚠ Reason: ${securityCheck.reason}`));
|
|
47
|
+
process.exitCode = 1;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const configInstance = (0, config_1.loadConfig)();
|
|
21
51
|
console.log(chalk_1.default.blue(`1. Analyzing repository & building context package...`));
|
|
22
52
|
const context = (0, context_builder_1.buildProjectContext)();
|
|
23
|
-
const
|
|
24
|
-
|
|
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
|
-
};
|
|
53
|
+
const { resolveLLMConfig } = require('../core/agent-adapter');
|
|
54
|
+
const config = resolveLLMConfig();
|
|
29
55
|
const agent = new agent_adapter_1.RealAgentProvider(config);
|
|
30
56
|
console.log(chalk_1.default.blue(`2. Invoking Spec Agent -> Generating Gherkin AST...`));
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
57
|
+
let specRes;
|
|
58
|
+
try {
|
|
59
|
+
specRes = await agent.executeTask({
|
|
60
|
+
id: 'auto-spec',
|
|
61
|
+
type: 'spec_generation',
|
|
62
|
+
prompt: `Generate a Gherkin .feature file for the following requirement:\n\n${reqContent}\n\nWrap the code in \`\`\`gherkin ... \`\`\` blocks.`,
|
|
63
|
+
contextFiles: ['.ghe/conventions.md']
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.log(chalk_1.default.red(`\n✖ Spec Agent execution crashed: ${error.message}`));
|
|
68
|
+
process.exitCode = 1;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
let specContent = '';
|
|
72
|
+
if (specRes.success && specRes.codeModifications && specRes.codeModifications.length > 0) {
|
|
73
|
+
let specDirPath = process.env.GHK_SPEC_DIR || configInstance.specDir || 'specs';
|
|
74
|
+
try {
|
|
75
|
+
specDirPath = (0, spec_dir_resolver_1.resolveSpecDir)(configInstance.specDir);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Use fallback if none found (specDirPath retains the fallback value)
|
|
79
|
+
}
|
|
39
80
|
for (const mod of specRes.codeModifications) {
|
|
40
|
-
|
|
81
|
+
let p = mod.filePath;
|
|
82
|
+
if (!p.endsWith('.feature')) {
|
|
83
|
+
p = path_1.default.join(specDirPath, p);
|
|
84
|
+
}
|
|
85
|
+
else if (!p.includes('/') && !p.includes('\\')) {
|
|
86
|
+
p = path_1.default.join(specDirPath, p);
|
|
87
|
+
}
|
|
41
88
|
const fullPath = path_1.default.resolve(p);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
89
|
+
if (process.env.GHK_DRY_RUN === 'true') {
|
|
90
|
+
if (process.env.GHK_STDOUT === 'true') {
|
|
91
|
+
console.log(chalk_1.default.yellow(` [DRY RUN] Proposed spec for ${p}:\n${mod.content}`));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const patchDir = path_1.default.resolve('.ghe', 'patches');
|
|
95
|
+
fs_1.default.mkdirSync(patchDir, { recursive: true });
|
|
96
|
+
const patchPath = path_1.default.join(patchDir, path_1.default.basename(p) + '.proposed');
|
|
97
|
+
fs_1.default.writeFileSync(patchPath, mod.content, 'utf8');
|
|
98
|
+
console.log(chalk_1.default.yellow(` [DRY RUN] Saved proposed spec to ${patchPath}`));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
fs_1.default.mkdirSync(path_1.default.dirname(fullPath), { recursive: true });
|
|
103
|
+
fs_1.default.writeFileSync(fullPath, mod.content);
|
|
104
|
+
console.log(chalk_1.default.green(` ✓ Wrote specification to ${p}`));
|
|
105
|
+
}
|
|
45
106
|
if (mod.filePath.endsWith('.feature')) {
|
|
46
107
|
specContent = mod.content;
|
|
47
108
|
}
|
|
48
109
|
}
|
|
49
110
|
}
|
|
50
111
|
else {
|
|
51
|
-
|
|
112
|
+
const { saveFailedAttemptLog } = require('../core/agent-adapter');
|
|
113
|
+
const logPath = saveFailedAttemptLog('auto-spec', reqContent, specRes?.agentResponse || 'No response', 'Failed to extract valid code modifications');
|
|
114
|
+
console.log(chalk_1.default.red(`\n✖ Spec Agent failed to generate valid code blocks.`));
|
|
115
|
+
console.log(chalk_1.default.yellow(` Response from Agent:\n${specRes.agentResponse.substring(0, 300)}...\n`));
|
|
116
|
+
console.log(chalk_1.default.cyan(` → Diagnostics log saved to: ${logPath}\n`));
|
|
117
|
+
process.exitCode = 1;
|
|
118
|
+
return;
|
|
52
119
|
}
|
|
53
120
|
console.log(chalk_1.default.blue(`3. Invoking Scaffolding Agent -> Generating Bindings...`));
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
121
|
+
let scaffoldRes;
|
|
122
|
+
try {
|
|
123
|
+
scaffoldRes = await agent.executeTask({
|
|
124
|
+
id: 'auto-scaffold',
|
|
125
|
+
type: 'scaffold_binding',
|
|
126
|
+
prompt: `Generate step definitions for the following spec:\n\n${specContent}\n\nWrap code in \`\`\`ts ... \`\`\``,
|
|
127
|
+
contextFiles: []
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.log(chalk_1.default.red(`\n✖ Scaffolding Agent execution crashed: ${error.message}`));
|
|
132
|
+
process.exitCode = 1;
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (scaffoldRes.success && scaffoldRes.codeModifications && scaffoldRes.codeModifications.length > 0) {
|
|
61
136
|
const { validateTypeScriptSyntax } = require('../core/syntax-validator');
|
|
62
137
|
for (const mod of scaffoldRes.codeModifications) {
|
|
63
138
|
if (!validateTypeScriptSyntax(mod.filePath, mod.content)) {
|
|
@@ -65,15 +140,38 @@ async function handleAutopilotCommand(options = {}) {
|
|
|
65
140
|
continue;
|
|
66
141
|
}
|
|
67
142
|
const fullPath = path_1.default.resolve(mod.filePath);
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
143
|
+
if (process.env.GHK_DRY_RUN === 'true') {
|
|
144
|
+
if (process.env.GHK_STDOUT === 'true') {
|
|
145
|
+
console.log(chalk_1.default.yellow(` [DRY RUN] Proposed bindings for ${mod.filePath}:\n${mod.content}`));
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
const patchDir = path_1.default.resolve('.ghe', 'patches');
|
|
149
|
+
fs_1.default.mkdirSync(patchDir, { recursive: true });
|
|
150
|
+
const patchPath = path_1.default.join(patchDir, path_1.default.basename(mod.filePath) + '.proposed');
|
|
151
|
+
fs_1.default.writeFileSync(patchPath, mod.content, 'utf8');
|
|
152
|
+
console.log(chalk_1.default.yellow(` [DRY RUN] Saved proposed bindings to ${patchPath}`));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
fs_1.default.mkdirSync(path_1.default.dirname(fullPath), { recursive: true });
|
|
157
|
+
fs_1.default.writeFileSync(fullPath, mod.content);
|
|
158
|
+
console.log(chalk_1.default.green(` ✓ Wrote bindings to ${mod.filePath}`));
|
|
159
|
+
}
|
|
71
160
|
}
|
|
72
161
|
}
|
|
162
|
+
else {
|
|
163
|
+
const { saveFailedAttemptLog } = require('../core/agent-adapter');
|
|
164
|
+
const logPath = saveFailedAttemptLog('auto-scaffold', specContent, scaffoldRes?.agentResponse || 'No response', 'Failed to extract valid code modifications');
|
|
165
|
+
console.log(chalk_1.default.red(`\n✖ Scaffolding Agent failed to generate valid code blocks.`));
|
|
166
|
+
console.log(chalk_1.default.yellow(` Response from Agent:\n${scaffoldRes.agentResponse.substring(0, 300)}...\n`));
|
|
167
|
+
console.log(chalk_1.default.cyan(` → Diagnostics log saved to: ${logPath}\n`));
|
|
168
|
+
process.exitCode = 1;
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
73
171
|
console.log(chalk_1.default.blue(`4. Invoking Verification Agent & Closed-Loop Repair...`));
|
|
74
|
-
await (0, verify_1.handleVerifyCommand)({ autoFix: true, maxRetries: 2 });
|
|
172
|
+
await (0, verify_1.handleVerifyCommand)({ autoFix: true, maxRetries: 2, command: options.command });
|
|
75
173
|
console.log(chalk_1.default.blue(`5. Evaluating Enterprise Quality Score Gate...`));
|
|
76
|
-
const scorecard = (0, quality_score_1.calculateQualityScorecard)();
|
|
174
|
+
const scorecard = (0, quality_score_1.calculateQualityScorecard)(process.cwd(), configInstance.specDir);
|
|
77
175
|
console.log(chalk_1.default.bold.green(`\n✅ Autopilot Execution Complete! Quality Score: ${scorecard.overallScore}%`));
|
|
78
176
|
console.log(chalk_1.default.bold.cyan(` Ready for PR Review & Human Approval.\n`));
|
|
79
177
|
}
|
|
@@ -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":"converge.d.ts","sourceRoot":"","sources":["../../src/commands/converge.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsH/F"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* ==========================================================================
|
|
3
|
+
gherkin-ai-cli - 'converge' Command Handler
|
|
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.handleConvergeCommand = handleConvergeCommand;
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
13
|
+
const gherkin_parser_1 = require("../core/gherkin-parser");
|
|
14
|
+
const convergence_engine_1 = require("../core/convergence-engine");
|
|
15
|
+
async function handleConvergeCommand(options = {}) {
|
|
16
|
+
const threshold = parseInt(options.threshold || '80', 10);
|
|
17
|
+
// Resolve feature files
|
|
18
|
+
let featureFiles = [];
|
|
19
|
+
if (options.feature) {
|
|
20
|
+
featureFiles = [path_1.default.resolve(options.feature)];
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
const { resolveSpecDir } = require('../utils/spec-dir-resolver');
|
|
24
|
+
try {
|
|
25
|
+
const specDir = resolveSpecDir(undefined, process.cwd());
|
|
26
|
+
featureFiles = fs_1.default.readdirSync(specDir)
|
|
27
|
+
.filter(f => f.endsWith('.feature'))
|
|
28
|
+
.map(f => path_1.default.join(specDir, f));
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
console.log(chalk_1.default.yellow('\n⚠ No feature files found. Use --feature <file> or ensure a specs/ directory exists.\n'));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (featureFiles.length === 0) {
|
|
36
|
+
console.log(chalk_1.default.yellow('\n⚠ No .feature files found to analyze.\n'));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
console.log(chalk_1.default.bold.cyan('\n🔄 Running Convergence Analysis...\n'));
|
|
40
|
+
const allReports = [];
|
|
41
|
+
let totalConvergence = 0;
|
|
42
|
+
for (const file of featureFiles) {
|
|
43
|
+
if (!fs_1.default.existsSync(file)) {
|
|
44
|
+
console.log(chalk_1.default.red(` ✖ File not found: ${file}`));
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const content = fs_1.default.readFileSync(file, 'utf8');
|
|
48
|
+
let parsed;
|
|
49
|
+
try {
|
|
50
|
+
parsed = (0, gherkin_parser_1.parseGherkinText)(content);
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
console.log(chalk_1.default.red(` ✖ Parse error in ${path_1.default.basename(file)}: ${e.message}`));
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const report = (0, convergence_engine_1.calculateConvergence)(parsed, file);
|
|
57
|
+
allReports.push(report);
|
|
58
|
+
totalConvergence += report.overallConvergence;
|
|
59
|
+
if (options.json)
|
|
60
|
+
continue;
|
|
61
|
+
// Display convergence report
|
|
62
|
+
const statusColor = report.status === 'CONVERGED' ? chalk_1.default.green :
|
|
63
|
+
report.status === 'PARTIAL' ? chalk_1.default.yellow : chalk_1.default.red;
|
|
64
|
+
const statusIcon = report.status === 'CONVERGED' ? '✓' :
|
|
65
|
+
report.status === 'PARTIAL' ? '⚠' : '✖';
|
|
66
|
+
console.log(chalk_1.default.bold(` 📄 ${path_1.default.basename(file)} — ${report.featureName}`));
|
|
67
|
+
console.log('');
|
|
68
|
+
// Dimension bars
|
|
69
|
+
for (const dim of report.dimensions) {
|
|
70
|
+
const barWidth = 30;
|
|
71
|
+
const filledWidth = Math.round((dim.score / 100) * barWidth);
|
|
72
|
+
const emptyWidth = barWidth - filledWidth;
|
|
73
|
+
const barColor = dim.status === 'pass' ? chalk_1.default.green :
|
|
74
|
+
dim.status === 'warn' ? chalk_1.default.yellow : chalk_1.default.red;
|
|
75
|
+
const bar = barColor('█'.repeat(filledWidth)) + chalk_1.default.gray('░'.repeat(emptyWidth));
|
|
76
|
+
const scoreStr = `${dim.score}%`.padStart(4);
|
|
77
|
+
console.log(` ${dim.name.padEnd(25)} ${bar} ${barColor(scoreStr)}`);
|
|
78
|
+
if (dim.status !== 'pass') {
|
|
79
|
+
for (const detail of dim.details.slice(0, 2)) {
|
|
80
|
+
console.log(chalk_1.default.gray(` ↳ ${detail}`));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
console.log('');
|
|
85
|
+
console.log(` ${'Overall Convergence'.padEnd(25)} ${statusColor.bold(`${report.overallConvergence}%`)} ${statusColor(`[${report.status}]`)}`);
|
|
86
|
+
if (report.recommendations.length > 0) {
|
|
87
|
+
console.log('');
|
|
88
|
+
console.log(chalk_1.default.cyan(' Recommendations:'));
|
|
89
|
+
for (const rec of report.recommendations) {
|
|
90
|
+
console.log(chalk_1.default.cyan(` → ${rec}`));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
console.log('');
|
|
94
|
+
console.log(chalk_1.default.gray(' ' + '─'.repeat(70)));
|
|
95
|
+
console.log('');
|
|
96
|
+
}
|
|
97
|
+
if (options.json) {
|
|
98
|
+
console.log(JSON.stringify(allReports, null, 2));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// Overall summary
|
|
102
|
+
const avgConvergence = allReports.length > 0 ? Math.round(totalConvergence / allReports.length) : 0;
|
|
103
|
+
const overallStatus = avgConvergence >= threshold ? chalk_1.default.green.bold('PASSED ✓') : chalk_1.default.red.bold('FAILED ✖');
|
|
104
|
+
const overallColor = avgConvergence >= 80 ? chalk_1.default.green : avgConvergence >= 60 ? chalk_1.default.yellow : chalk_1.default.red;
|
|
105
|
+
console.log(chalk_1.default.bold('═'.repeat(60)));
|
|
106
|
+
console.log(` ${chalk_1.default.bold('Overall Convergence:')} ${overallColor.bold(`${avgConvergence}%`)} (threshold: ${threshold}%)`);
|
|
107
|
+
console.log(` ${chalk_1.default.bold('Status:')} ${overallStatus}`);
|
|
108
|
+
console.log(` ${chalk_1.default.bold('Features Analyzed:')} ${allReports.length}`);
|
|
109
|
+
console.log(chalk_1.default.bold('═'.repeat(60)));
|
|
110
|
+
console.log('');
|
|
111
|
+
if (avgConvergence < threshold) {
|
|
112
|
+
process.exitCode = 1;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=converge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converge.js","sourceRoot":"","sources":["../../src/commands/converge.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAchF,sDAsHC;AAlID,4CAAoB;AACpB,gDAAwB;AACxB,kDAA0B;AAC1B,2DAA0D;AAC1D,mEAAqF;AAQ9E,KAAK,UAAU,qBAAqB,CAAC,UAAkC,EAAE;IAC9E,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IAE1D,wBAAwB;IACxB,IAAI,YAAY,GAAa,EAAE,CAAC;IAEhC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,YAAY,GAAG,CAAC,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;QACjE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACzD,YAAY,GAAG,YAAE,CAAC,WAAW,CAAC,OAAO,CAAC;iBACnC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;iBACnC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,yFAAyF,CAAC,CAAC,CAAC;YACrH,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAwB,EAAE,CAAC;IAC3C,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,CAAC;YACtD,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,IAAA,iCAAgB,EAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,sBAAsB,cAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAClF,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,yCAAoB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAClD,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,gBAAgB,IAAI,MAAM,CAAC,kBAAkB,CAAC;QAE9C,IAAI,OAAO,CAAC,IAAI;YAAE,SAAS;QAE3B,6BAA6B;QAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC;QAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAE3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,QAAQ,cAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,iBAAiB;QACjB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,EAAE,CAAC;YACpB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;YAE1C,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,CAAC;gBACrC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC;YAElE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YACnF,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAE7C,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAEzE,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC1B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBAC7C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,QAAQ,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,kBAAkB,GAAG,CAAC,KAAK,WAAW,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;QAEnJ,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACjD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,kBAAkB;IAClB,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,MAAM,aAAa,GAAG,cAAc,IAAI,SAAS,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9G,MAAM,YAAY,GAAG,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC;IAE1G,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,cAAc,GAAG,CAAC,gBAAgB,SAAS,IAAI,CAAC,CAAC;IAC7H,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,cAAc,GAAG,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/dist/commands/diff.d.ts
CHANGED
|
@@ -2,5 +2,21 @@ export interface DiffCommandOptions {
|
|
|
2
2
|
feature?: string;
|
|
3
3
|
target?: string;
|
|
4
4
|
}
|
|
5
|
+
export interface DriftReport {
|
|
6
|
+
fieldsSync: {
|
|
7
|
+
field: string;
|
|
8
|
+
status: 'synced' | 'missing' | 'extra';
|
|
9
|
+
}[];
|
|
10
|
+
endpointsSync: {
|
|
11
|
+
endpoint: string;
|
|
12
|
+
status: 'synced' | 'missing';
|
|
13
|
+
}[];
|
|
14
|
+
httpCodesSync: {
|
|
15
|
+
code: string;
|
|
16
|
+
status: 'synced' | 'missing';
|
|
17
|
+
}[];
|
|
18
|
+
scenariosWithoutTests: string[];
|
|
19
|
+
hasDrift: boolean;
|
|
20
|
+
}
|
|
5
21
|
export declare function handleDiffCommand(options?: DiffCommandOptions): Promise<void>;
|
|
6
22
|
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -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,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAA;KAAE,EAAE,CAAC;IACxE,aAAa,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;KAAE,EAAE,CAAC;IACpE,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;KAAE,EAAE,CAAC;IAChE,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmHvF"}
|
package/dist/commands/diff.js
CHANGED
|
@@ -32,13 +32,14 @@ async function handleDiffCommand(options = {}) {
|
|
|
32
32
|
const targetContent = fs_1.default.readFileSync(options.target, 'utf8');
|
|
33
33
|
const parsed = (0, gherkin_parser_1.parseGherkinText)(featureContent);
|
|
34
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}
|
|
35
|
+
if (fields.length === 0 && parsed.scenarios.length === 0) {
|
|
36
|
+
console.log(chalk_1.default.yellow(`⚠ No semantic fields or scenarios found in ${options.feature}.`));
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
39
|
let driftFound = false;
|
|
40
40
|
console.log(chalk_1.default.blue(`Checking synchronization for ${fields.length} semantic fields...\n`));
|
|
41
41
|
let targetProperties = [];
|
|
42
|
+
let targetDecorators = [];
|
|
42
43
|
if (options.target.endsWith('.ts')) {
|
|
43
44
|
try {
|
|
44
45
|
const { Project } = require('ts-morph');
|
|
@@ -51,6 +52,15 @@ async function handleDiffCommand(options = {}) {
|
|
|
51
52
|
}
|
|
52
53
|
for (const cls of classes) {
|
|
53
54
|
targetProperties.push(...cls.getProperties().map((p) => p.getName()));
|
|
55
|
+
// Extract HTTP methods/endpoints via Decorators (NestJS)
|
|
56
|
+
for (const method of cls.getMethods()) {
|
|
57
|
+
const decorators = method.getDecorators();
|
|
58
|
+
for (const dec of decorators) {
|
|
59
|
+
targetDecorators.push(dec.getName());
|
|
60
|
+
const args = dec.getArguments();
|
|
61
|
+
args.forEach((a) => targetDecorators.push(a.getText().replace(/['"]/g, '')));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
54
64
|
}
|
|
55
65
|
}
|
|
56
66
|
catch (e) {
|
|
@@ -69,6 +79,32 @@ async function handleDiffCommand(options = {}) {
|
|
|
69
79
|
console.log(chalk_1.default.green(` ✓ Field '${field.name}' is synchronized.`));
|
|
70
80
|
}
|
|
71
81
|
}
|
|
82
|
+
console.log(chalk_1.default.blue(`\nChecking HTTP Codes and Endpoints...\n`));
|
|
83
|
+
const httpCodes = featureContent.match(/HTTP (?:status )?(\d{3})/gi) || [];
|
|
84
|
+
for (const codeMatch of httpCodes) {
|
|
85
|
+
const code = codeMatch.replace(/[^\d]/g, '');
|
|
86
|
+
if (!targetContent.includes(code)) {
|
|
87
|
+
console.log(chalk_1.default.red(` ✖ Drift Detected! Expected HTTP code ${code} from feature is not explicitly handled in ${options.target}`));
|
|
88
|
+
driftFound = true;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
console.log(chalk_1.default.green(` ✓ HTTP code ${code} is synchronized.`));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const endpoints = featureContent.match(/(?:\/api\/[\w/-]+)/gi) || [];
|
|
95
|
+
for (const endpoint of endpoints) {
|
|
96
|
+
// AST Check for endpoints (checking if path is part of any decorator argument)
|
|
97
|
+
const isEndpointFound = targetDecorators.length > 0
|
|
98
|
+
? targetDecorators.some(d => endpoint.includes(d) || d.includes(endpoint)) || targetDecorators.includes('Controller')
|
|
99
|
+
: targetContent.includes(endpoint);
|
|
100
|
+
if (!isEndpointFound && !targetContent.includes(endpoint)) {
|
|
101
|
+
console.log(chalk_1.default.red(` ✖ Drift Detected! Endpoint ${endpoint} from feature is not explicitly found in ${options.target}`));
|
|
102
|
+
driftFound = true;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
console.log(chalk_1.default.green(` ✓ Endpoint ${endpoint} is synchronized.`));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
72
108
|
if (driftFound) {
|
|
73
109
|
console.log(chalk_1.default.bold.red('\n❌ Drift Detection Failed: The source of truth (.feature) does not match the implementation.'));
|
|
74
110
|
process.exitCode = 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../src/commands/doc.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAatD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleDocCommand = handleDocCommand;
|
|
4
|
+
const doc_engine_1 = require("../core/doc-engine");
|
|
5
|
+
const logger_1 = require("../utils/logger");
|
|
6
|
+
async function handleDocCommand() {
|
|
7
|
+
logger_1.logger.banner();
|
|
8
|
+
logger_1.logger.info('Generating Living Documentation from specifications...');
|
|
9
|
+
try {
|
|
10
|
+
const result = (0, doc_engine_1.generateLivingDocumentation)(process.cwd());
|
|
11
|
+
logger_1.logger.success(`Living Documentation successfully generated!`);
|
|
12
|
+
logger_1.logger.info(`📝 Wrote ${result.filesGenerated} markdown files to: ${result.outputDir}`);
|
|
13
|
+
logger_1.logger.info(`You can now serve this folder using VitePress, Docusaurus, or view it natively in GitHub/GitLab.`);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
logger_1.logger.error(`Failed to generate documentation: ${error.message}`);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=doc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc.js","sourceRoot":"","sources":["../../src/commands/doc.ts"],"names":[],"mappings":";;AAGA,4CAaC;AAhBD,mDAAiE;AACjE,4CAAyC;AAElC,KAAK,UAAU,gBAAgB;IACpC,eAAM,CAAC,MAAM,EAAE,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IAEtE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,wCAA2B,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1D,eAAM,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;QAC/D,eAAM,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,cAAc,uBAAuB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACxF,eAAM,CAAC,IAAI,CAAC,kGAAkG,CAAC,CAAC;IAClH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,eAAM,CAAC,KAAK,CAAC,qCAAqC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -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":"AAkCA,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyHxH"}
|