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.
Files changed (192) hide show
  1. package/README.md +5 -4
  2. package/dist/commands/autopilot.d.ts +1 -0
  3. package/dist/commands/autopilot.d.ts.map +1 -1
  4. package/dist/commands/autopilot.js +130 -32
  5. package/dist/commands/autopilot.js.map +1 -1
  6. package/dist/commands/converge.d.ts +7 -0
  7. package/dist/commands/converge.d.ts.map +1 -0
  8. package/dist/commands/converge.js +115 -0
  9. package/dist/commands/converge.js.map +1 -0
  10. package/dist/commands/diff.d.ts +16 -0
  11. package/dist/commands/diff.d.ts.map +1 -1
  12. package/dist/commands/diff.js +38 -2
  13. package/dist/commands/diff.js.map +1 -1
  14. package/dist/commands/doc.d.ts +2 -0
  15. package/dist/commands/doc.d.ts.map +1 -0
  16. package/dist/commands/doc.js +20 -0
  17. package/dist/commands/doc.js.map +1 -0
  18. package/dist/commands/generate.d.ts +1 -0
  19. package/dist/commands/generate.d.ts.map +1 -1
  20. package/dist/commands/generate.js +62 -57
  21. package/dist/commands/generate.js.map +1 -1
  22. package/dist/commands/impact.d.ts +6 -0
  23. package/dist/commands/impact.d.ts.map +1 -0
  24. package/dist/commands/impact.js +65 -0
  25. package/dist/commands/impact.js.map +1 -0
  26. package/dist/commands/init.d.ts +5 -1
  27. package/dist/commands/init.d.ts.map +1 -1
  28. package/dist/commands/init.js +77 -56
  29. package/dist/commands/init.js.map +1 -1
  30. package/dist/commands/lint.d.ts +8 -0
  31. package/dist/commands/lint.d.ts.map +1 -0
  32. package/dist/commands/lint.js +143 -0
  33. package/dist/commands/lint.js.map +1 -0
  34. package/dist/commands/pr-review.d.ts +6 -0
  35. package/dist/commands/pr-review.d.ts.map +1 -0
  36. package/dist/commands/pr-review.js +74 -0
  37. package/dist/commands/pr-review.js.map +1 -0
  38. package/dist/commands/quality.d.ts.map +1 -1
  39. package/dist/commands/quality.js +3 -1
  40. package/dist/commands/quality.js.map +1 -1
  41. package/dist/commands/sbom.d.ts +2 -0
  42. package/dist/commands/sbom.d.ts.map +1 -0
  43. package/dist/commands/sbom.js +62 -0
  44. package/dist/commands/sbom.js.map +1 -0
  45. package/dist/commands/skill.d.ts.map +1 -1
  46. package/dist/commands/skill.js +251 -25
  47. package/dist/commands/skill.js.map +1 -1
  48. package/dist/commands/validate.d.ts +1 -0
  49. package/dist/commands/validate.d.ts.map +1 -1
  50. package/dist/commands/validate.js +35 -1
  51. package/dist/commands/validate.js.map +1 -1
  52. package/dist/commands/verify.d.ts.map +1 -1
  53. package/dist/commands/verify.js +46 -15
  54. package/dist/commands/verify.js.map +1 -1
  55. package/dist/core/agent-adapter.d.ts +7 -0
  56. package/dist/core/agent-adapter.d.ts.map +1 -1
  57. package/dist/core/agent-adapter.js +145 -25
  58. package/dist/core/agent-adapter.js.map +1 -1
  59. package/dist/core/config.d.ts +2 -0
  60. package/dist/core/config.d.ts.map +1 -1
  61. package/dist/core/config.js +3 -1
  62. package/dist/core/config.js.map +1 -1
  63. package/dist/core/constitution.d.ts +83 -0
  64. package/dist/core/constitution.d.ts.map +1 -0
  65. package/dist/core/constitution.js +317 -0
  66. package/dist/core/constitution.js.map +1 -0
  67. package/dist/core/context-security.d.ts +25 -0
  68. package/dist/core/context-security.d.ts.map +1 -0
  69. package/dist/core/context-security.js +154 -0
  70. package/dist/core/context-security.js.map +1 -0
  71. package/dist/core/convergence-engine.d.ts +21 -0
  72. package/dist/core/convergence-engine.d.ts.map +1 -0
  73. package/dist/core/convergence-engine.js +266 -0
  74. package/dist/core/convergence-engine.js.map +1 -0
  75. package/dist/core/doc-engine.d.ts +6 -0
  76. package/dist/core/doc-engine.d.ts.map +1 -0
  77. package/dist/core/doc-engine.js +105 -0
  78. package/dist/core/doc-engine.js.map +1 -0
  79. package/dist/core/error-parser.d.ts +3 -1
  80. package/dist/core/error-parser.d.ts.map +1 -1
  81. package/dist/core/error-parser.js +8 -2
  82. package/dist/core/error-parser.js.map +1 -1
  83. package/dist/core/execution-sandbox.d.ts +1 -0
  84. package/dist/core/execution-sandbox.d.ts.map +1 -1
  85. package/dist/core/execution-sandbox.js +1 -1
  86. package/dist/core/execution-sandbox.js.map +1 -1
  87. package/dist/core/gherkin-parser.d.ts +1 -0
  88. package/dist/core/gherkin-parser.d.ts.map +1 -1
  89. package/dist/core/gherkin-parser.js +11 -1
  90. package/dist/core/gherkin-parser.js.map +1 -1
  91. package/dist/core/guardrails.d.ts +10 -1
  92. package/dist/core/guardrails.d.ts.map +1 -1
  93. package/dist/core/guardrails.js +56 -8
  94. package/dist/core/guardrails.js.map +1 -1
  95. package/dist/core/impact-analyzer.d.ts +12 -0
  96. package/dist/core/impact-analyzer.d.ts.map +1 -0
  97. package/dist/core/impact-analyzer.js +117 -0
  98. package/dist/core/impact-analyzer.js.map +1 -0
  99. package/dist/core/ir-builder.d.ts +5 -0
  100. package/dist/core/ir-builder.d.ts.map +1 -0
  101. package/dist/core/ir-builder.js +944 -0
  102. package/dist/core/ir-builder.js.map +1 -0
  103. package/dist/core/openapi-validator.d.ts +16 -0
  104. package/dist/core/openapi-validator.d.ts.map +1 -0
  105. package/dist/core/openapi-validator.js +132 -0
  106. package/dist/core/openapi-validator.js.map +1 -0
  107. package/dist/core/plugin-system.d.ts +57 -0
  108. package/dist/core/plugin-system.d.ts.map +1 -0
  109. package/dist/core/plugin-system.js +71 -0
  110. package/dist/core/plugin-system.js.map +1 -0
  111. package/dist/core/pr-reviewer.d.ts +12 -0
  112. package/dist/core/pr-reviewer.d.ts.map +1 -0
  113. package/dist/core/pr-reviewer.js +58 -0
  114. package/dist/core/pr-reviewer.js.map +1 -0
  115. package/dist/core/quality-score.d.ts +4 -1
  116. package/dist/core/quality-score.d.ts.map +1 -1
  117. package/dist/core/quality-score.js +111 -33
  118. package/dist/core/quality-score.js.map +1 -1
  119. package/dist/core/requirement-validator.d.ts +12 -0
  120. package/dist/core/requirement-validator.d.ts.map +1 -0
  121. package/dist/core/requirement-validator.js +37 -0
  122. package/dist/core/requirement-validator.js.map +1 -0
  123. package/dist/core/security-sanitizer.d.ts +8 -0
  124. package/dist/core/security-sanitizer.d.ts.map +1 -0
  125. package/dist/core/security-sanitizer.js +73 -0
  126. package/dist/core/security-sanitizer.js.map +1 -0
  127. package/dist/core/semantic-ir.d.ts +179 -0
  128. package/dist/core/semantic-ir.d.ts.map +1 -0
  129. package/dist/core/semantic-ir.js +15 -0
  130. package/dist/core/semantic-ir.js.map +1 -0
  131. package/dist/core/specification-linter.d.ts +31 -0
  132. package/dist/core/specification-linter.d.ts.map +1 -0
  133. package/dist/core/specification-linter.js +463 -0
  134. package/dist/core/specification-linter.js.map +1 -0
  135. package/dist/core/step-indexer.d.ts +2 -0
  136. package/dist/core/step-indexer.d.ts.map +1 -1
  137. package/dist/core/step-indexer.js +99 -33
  138. package/dist/core/step-indexer.js.map +1 -1
  139. package/dist/core/telemetry.d.ts +42 -0
  140. package/dist/core/telemetry.d.ts.map +1 -0
  141. package/dist/core/telemetry.js +111 -0
  142. package/dist/core/telemetry.js.map +1 -0
  143. package/dist/generators/ci-workflow-generator.d.ts +5 -0
  144. package/dist/generators/ci-workflow-generator.d.ts.map +1 -0
  145. package/dist/generators/ci-workflow-generator.js +54 -0
  146. package/dist/generators/ci-workflow-generator.js.map +1 -0
  147. package/dist/generators/contracts.js +8 -7
  148. package/dist/generators/contracts.js.map +1 -1
  149. package/dist/generators/fixtures.d.ts.map +1 -1
  150. package/dist/generators/fixtures.js +22 -27
  151. package/dist/generators/fixtures.js.map +1 -1
  152. package/dist/generators/preset-node-nestjs.d.ts.map +1 -1
  153. package/dist/generators/preset-node-nestjs.js +39 -18
  154. package/dist/generators/preset-node-nestjs.js.map +1 -1
  155. package/dist/generators/prisma-generator.d.ts +6 -0
  156. package/dist/generators/prisma-generator.d.ts.map +1 -0
  157. package/dist/generators/prisma-generator.js +143 -0
  158. package/dist/generators/prisma-generator.js.map +1 -0
  159. package/dist/generators/prisma-stack.d.ts +7 -0
  160. package/dist/generators/prisma-stack.d.ts.map +1 -0
  161. package/dist/generators/prisma-stack.js +77 -0
  162. package/dist/generators/prisma-stack.js.map +1 -0
  163. package/dist/generators/prompts.d.ts.map +1 -1
  164. package/dist/generators/prompts.js +15 -1
  165. package/dist/generators/prompts.js.map +1 -1
  166. package/dist/index.js +89 -6
  167. package/dist/index.js.map +1 -1
  168. package/dist/mcp/mcp-server.d.ts.map +1 -1
  169. package/dist/mcp/mcp-server.js +336 -98
  170. package/dist/mcp/mcp-server.js.map +1 -1
  171. package/dist/plugins/core-generators-plugin.d.ts +35 -0
  172. package/dist/plugins/core-generators-plugin.d.ts.map +1 -0
  173. package/dist/plugins/core-generators-plugin.js +146 -0
  174. package/dist/plugins/core-generators-plugin.js.map +1 -0
  175. package/dist/ui/server.d.ts.map +1 -1
  176. package/dist/ui/server.js +43 -8
  177. package/dist/ui/server.js.map +1 -1
  178. package/dist/utils/logger.d.ts +13 -0
  179. package/dist/utils/logger.d.ts.map +1 -1
  180. package/dist/utils/logger.js +53 -4
  181. package/dist/utils/logger.js.map +1 -1
  182. package/dist/utils/spec-dir-resolver.d.ts +6 -0
  183. package/dist/utils/spec-dir-resolver.d.ts.map +1 -0
  184. package/dist/utils/spec-dir-resolver.js +32 -0
  185. package/dist/utils/spec-dir-resolver.js.map +1 -0
  186. package/dist/utils/workspace-detector.d.ts +4 -1
  187. package/dist/utils/workspace-detector.d.ts.map +1 -1
  188. package/dist/utils/workspace-detector.js +23 -2
  189. package/dist/utils/workspace-detector.js.map +1 -1
  190. package/docs/MCP_GUIDE.md +14 -11
  191. package/docs/USAGE_GUIDE.md +10 -6
  192. package/package.json +5 -2
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  ---
10
10
 
11
- ## 🌟 Strategic Capabilities (`v2.4.0-beta.0`)
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 (`ghk create --headless --config spec.json`) designed for frictionless integration into GitHub Actions, Azure DevOps, and automated pipelines.
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
- - 🔍 **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.
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.4.0-beta.0`)
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,6 +1,7 @@
1
1
  export interface AutopilotOptions {
2
2
  requirement?: string;
3
3
  autonomous?: boolean;
4
+ command?: string;
4
5
  }
5
6
  export declare function handleAutopilotCommand(options?: AutopilotOptions): Promise<void>;
6
7
  //# sourceMappingURL=autopilot.d.ts.map
@@ -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,CAsE1F"}
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
- const reqContent = fs_1.default.existsSync(reqFile) ? fs_1.default.readFileSync(reqFile, 'utf8') : 'No requirement provided.';
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 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
- };
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
- 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) {
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
- const p = mod.filePath.endsWith('.feature') ? mod.filePath : `specs/${mod.filePath}`;
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
- 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}`));
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
- console.log(chalk_1.default.yellow(` ⚠️ Agent didn't return proper code blocks. Using fallback.`));
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
- 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) {
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
- 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}`));
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":"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"}
1
+ {"version":3,"file":"autopilot.js","sourceRoot":"","sources":["../../src/commands/autopilot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface ConvergeCommandOptions {
2
+ feature?: string;
3
+ threshold?: string;
4
+ json?: boolean;
5
+ }
6
+ export declare function handleConvergeCommand(options?: ConvergeCommandOptions): Promise<void>;
7
+ //# sourceMappingURL=converge.d.ts.map
@@ -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":"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"}
@@ -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,CA6EvF"}
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"}
@@ -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}. Ensure you use quotes like "email" to define fields.`));
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;;;;;AAWhF,8CA6EC;AAtFD,kDAA0B;AAC1B,4CAAoB;AACpB,2DAA0D;AAOnD,KAAK,UAAU,iBAAiB,CAAC,UAA8B,EAAE;IACtE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;IAEpF,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;QAC7F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACV,CAAC;IAED,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,2BAA2B,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACV,CAAC;IAED,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,+BAA+B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACV,CAAC;IAED,MAAM,cAAc,GAAG,YAAE,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,YAAE,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9D,MAAM,MAAM,GAAG,IAAA,iCAAgB,EAAC,cAAc,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;IAE5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,iCAAiC,OAAO,CAAC,OAAO,wDAAwD,CAAC,CAAC,CAAC;QACpI,OAAO;IACX,CAAC;IAED,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,MAAM,uBAAuB,CAAC,CAAC,CAAC;IAE9F,IAAI,gBAAgB,GAAa,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;YAE3E,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC;YAExC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,gBAAgB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9E,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,gBAAgB,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,OAAO,iCAAiC,CAAC,CAAC,CAAC;QAClH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC;YACzC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YACvC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,8BAA8B,KAAK,CAAC,IAAI,gCAAgC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACjH,UAAU,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC;QAC3E,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,+FAA+F,CAAC,CAAC,CAAC;QAC7H,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC,CAAC;IACjH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function handleDocCommand(): Promise<void>;
2
+ //# sourceMappingURL=doc.d.ts.map
@@ -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,5 +1,6 @@
1
1
  export declare function handleGenerateCommand(options: {
2
2
  feature?: string;
3
3
  config?: string;
4
+ yes?: boolean;
4
5
  }): Promise<void>;
5
6
  //# sourceMappingURL=generate.d.ts.map
@@ -1 +1 @@
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,CA8GzG"}
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"}