gherkin-ai 2.5.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 +2 -2
- package/dist/commands/autopilot.d.ts +1 -0
- package/dist/commands/autopilot.d.ts.map +1 -1
- package/dist/commands/autopilot.js +94 -31
- 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.map +1 -1
- package/dist/commands/diff.js +15 -1
- 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.map +1 -1
- package/dist/commands/generate.js +45 -48
- 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/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 +43 -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/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/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 +3 -0
- package/dist/core/quality-score.d.ts.map +1 -1
- package/dist/core/quality-score.js +108 -35
- package/dist/core/quality-score.js.map +1 -1
- package/dist/core/requirement-validator.d.ts.map +1 -1
- package/dist/core/requirement-validator.js +10 -2
- package/dist/core/requirement-validator.js.map +1 -1
- 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/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 +80 -5
- 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/utils/logger.d.ts +3 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +31 -4
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/spec-dir-resolver.d.ts.map +1 -1
- package/dist/utils/spec-dir-resolver.js +4 -3
- package/dist/utils/spec-dir-resolver.js.map +1 -1
- package/dist/utils/workspace-detector.d.ts.map +1 -1
- package/dist/utils/workspace-detector.js +13 -5
- 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
|
|
|
@@ -30,7 +30,7 @@ While basic AI spec tools only generate text prompts, `gherkin-ai` acts as an **
|
|
|
30
30
|
|
|
31
31
|
---
|
|
32
32
|
|
|
33
|
-
## š„ Installation & Execution (`v2.
|
|
33
|
+
## š„ Installation & Execution (`v2.6.0`)
|
|
34
34
|
|
|
35
35
|
You can use `gherkin-ai` via global `npm` installation, on-demand zero-install `npx`, or as a project local dev dependency:
|
|
36
36
|
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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"}
|
|
@@ -39,31 +39,43 @@ async function handleAutopilotCommand(options = {}) {
|
|
|
39
39
|
process.exitCode = 1;
|
|
40
40
|
return;
|
|
41
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
|
+
}
|
|
42
50
|
const configInstance = (0, config_1.loadConfig)();
|
|
43
51
|
console.log(chalk_1.default.blue(`1. Analyzing repository & building context package...`));
|
|
44
52
|
const context = (0, context_builder_1.buildProjectContext)();
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
model: process.env.LLM_MODEL,
|
|
48
|
-
apiKey: process.env.OPENAI_API_KEY || process.env.ANTHROPIC_API_KEY || process.env.LLM_API_KEY,
|
|
49
|
-
baseUrl: process.env.LLM_BASE_URL
|
|
50
|
-
};
|
|
53
|
+
const { resolveLLMConfig } = require('../core/agent-adapter');
|
|
54
|
+
const config = resolveLLMConfig();
|
|
51
55
|
const agent = new agent_adapter_1.RealAgentProvider(config);
|
|
52
56
|
console.log(chalk_1.default.blue(`2. Invoking Spec Agent -> Generating Gherkin AST...`));
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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';
|
|
62
74
|
try {
|
|
63
75
|
specDirPath = (0, spec_dir_resolver_1.resolveSpecDir)(configInstance.specDir);
|
|
64
76
|
}
|
|
65
77
|
catch {
|
|
66
|
-
// Use fallback if none found
|
|
78
|
+
// Use fallback if none found (specDirPath retains the fallback value)
|
|
67
79
|
}
|
|
68
80
|
for (const mod of specRes.codeModifications) {
|
|
69
81
|
let p = mod.filePath;
|
|
@@ -74,25 +86,53 @@ async function handleAutopilotCommand(options = {}) {
|
|
|
74
86
|
p = path_1.default.join(specDirPath, p);
|
|
75
87
|
}
|
|
76
88
|
const fullPath = path_1.default.resolve(p);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
+
}
|
|
80
106
|
if (mod.filePath.endsWith('.feature')) {
|
|
81
107
|
specContent = mod.content;
|
|
82
108
|
}
|
|
83
109
|
}
|
|
84
110
|
}
|
|
85
111
|
else {
|
|
86
|
-
|
|
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;
|
|
87
119
|
}
|
|
88
120
|
console.log(chalk_1.default.blue(`3. Invoking Scaffolding Agent -> Generating Bindings...`));
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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) {
|
|
96
136
|
const { validateTypeScriptSyntax } = require('../core/syntax-validator');
|
|
97
137
|
for (const mod of scaffoldRes.codeModifications) {
|
|
98
138
|
if (!validateTypeScriptSyntax(mod.filePath, mod.content)) {
|
|
@@ -100,13 +140,36 @@ async function handleAutopilotCommand(options = {}) {
|
|
|
100
140
|
continue;
|
|
101
141
|
}
|
|
102
142
|
const fullPath = path_1.default.resolve(mod.filePath);
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
+
}
|
|
106
160
|
}
|
|
107
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
|
+
}
|
|
108
171
|
console.log(chalk_1.default.blue(`4. Invoking Verification Agent & Closed-Loop Repair...`));
|
|
109
|
-
await (0, verify_1.handleVerifyCommand)({ autoFix: true, maxRetries: 2 });
|
|
172
|
+
await (0, verify_1.handleVerifyCommand)({ autoFix: true, maxRetries: 2, command: options.command });
|
|
110
173
|
console.log(chalk_1.default.blue(`5. Evaluating Enterprise Quality Score Gate...`));
|
|
111
174
|
const scorecard = (0, quality_score_1.calculateQualityScorecard)(process.cwd(), configInstance.specDir);
|
|
112
175
|
console.log(chalk_1.default.bold.green(`\nā
Autopilot Execution Complete! Quality Score: ${scorecard.overallScore}%`));
|
|
@@ -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":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,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,
|
|
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
|
@@ -39,6 +39,7 @@ async function handleDiffCommand(options = {}) {
|
|
|
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) {
|
|
@@ -83,7 +93,11 @@ async function handleDiffCommand(options = {}) {
|
|
|
83
93
|
}
|
|
84
94
|
const endpoints = featureContent.match(/(?:\/api\/[\w/-]+)/gi) || [];
|
|
85
95
|
for (const endpoint of endpoints) {
|
|
86
|
-
if
|
|
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)) {
|
|
87
101
|
console.log(chalk_1.default.red(` ā Drift Detected! Endpoint ${endpoint} from feature is not explicitly found in ${options.target}`));
|
|
88
102
|
driftFound = true;
|
|
89
103
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAmBhF,
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;AAmBhF,8CAmHC;AApID,kDAA0B;AAC1B,4CAAoB;AACpB,2DAA0D;AAenD,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,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,8CAA8C,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAC5F,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,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;gBAE3E,yDAAyD;gBACzD,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;oBACtC,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;oBAC1C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;wBAC7B,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;wBACrC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;wBAChC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;oBACpF,CAAC;gBACH,CAAC;YACH,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,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,4BAA4B,CAAC,IAAI,EAAE,CAAC;IAC3E,KAAK,MAAM,SAAS,IAAI,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,0CAA0C,IAAI,8CAA8C,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACrI,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iBAAiB,IAAI,mBAAmB,CAAC,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;IACrE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,+EAA+E;QAC/E,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC;YACjD,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC;YACrH,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAErC,IAAI,CAAC,eAAe,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,gCAAgC,QAAQ,4CAA4C,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7H,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,gBAAgB,QAAQ,mBAAmB,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,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"}
|
|
@@ -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"}
|
|
@@ -10,10 +10,9 @@ exports.handleGenerateCommand = handleGenerateCommand;
|
|
|
10
10
|
const path_1 = __importDefault(require("path"));
|
|
11
11
|
const config_1 = require("../core/config");
|
|
12
12
|
const gherkin_parser_1 = require("../core/gherkin-parser");
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const infra_1 = require("../generators/infra");
|
|
13
|
+
const ir_builder_1 = require("../core/ir-builder");
|
|
14
|
+
const plugin_system_1 = require("../core/plugin-system");
|
|
15
|
+
const core_generators_plugin_1 = require("../plugins/core-generators-plugin");
|
|
17
16
|
const file_system_1 = require("../utils/file-system");
|
|
18
17
|
const logger_1 = require("../utils/logger");
|
|
19
18
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
@@ -53,27 +52,25 @@ async function handleGenerateCommand(options) {
|
|
|
53
52
|
else {
|
|
54
53
|
logger_1.logger.info('No feature file specified. Using built-in sample feature spec.');
|
|
55
54
|
}
|
|
55
|
+
const { detectPromptInjection } = require('../core/security-sanitizer');
|
|
56
|
+
const securityCheck = detectPromptInjection(gherkinText);
|
|
57
|
+
if (!securityCheck.isSafe) {
|
|
58
|
+
logger_1.logger.error('SECURITY ALERT: Prompt Injection Attempt Blocked!');
|
|
59
|
+
logger_1.logger.error(`Reason: ${securityCheck.reason}`);
|
|
60
|
+
process.exitCode = 1;
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
56
63
|
logger_1.logger.info('Parsing Gherkin specification and extracting domain AST...');
|
|
57
64
|
const parsed = (0, gherkin_parser_1.parseGherkinText)(gherkinText);
|
|
65
|
+
logger_1.logger.info('Building Semantic IR...');
|
|
66
|
+
const ir = (0, ir_builder_1.buildIR)(parsed, options.feature || 'sample.feature');
|
|
58
67
|
logger_1.logger.info(`Target Output Directory: ${config.outputDir}`);
|
|
59
|
-
//
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
// 2. Generate Test Fixtures & Seeds
|
|
66
|
-
const { fixturesTs, seedSql } = (0, fixtures_1.generateFixtures)(parsed, config);
|
|
67
|
-
(0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'fixtures.ts'), fixturesTs);
|
|
68
|
-
(0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'seed.sql'), seedSql);
|
|
69
|
-
logger_1.logger.success('Generated fixtures.ts and seed.sql');
|
|
70
|
-
// 2.5 Generate Boilerplate Presets (Step Definitions)
|
|
71
|
-
const { generatePresets } = require('../generators/presets');
|
|
72
|
-
const presets = generatePresets(parsed, config);
|
|
73
|
-
presets.forEach((preset) => {
|
|
74
|
-
(0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, preset.filename), preset.content);
|
|
75
|
-
logger_1.logger.success(`Generated boilerplate preset: ${preset.filename}`);
|
|
76
|
-
});
|
|
68
|
+
// Initialize Plugin Architecture
|
|
69
|
+
plugin_system_1.pluginRegistry.initialize({ config, constitution: null, projectDir: process.cwd() });
|
|
70
|
+
// Only register core plugins if not already registered (to prevent duplicate throws)
|
|
71
|
+
if (plugin_system_1.pluginRegistry.getPlugins().length === 0) {
|
|
72
|
+
(0, core_generators_plugin_1.registerCorePlugins)(plugin_system_1.pluginRegistry);
|
|
73
|
+
}
|
|
77
74
|
console.log(chalk_1.default.bold.cyan('\nš Context Confirmation for AI Agents:'));
|
|
78
75
|
console.log(`- Architecture: ${config.architecture}`);
|
|
79
76
|
console.log(`- Stack: ${config.stack.language} + ${config.stack.framework}`);
|
|
@@ -82,8 +79,9 @@ async function handleGenerateCommand(options) {
|
|
|
82
79
|
if (config.stack.aiEngine) {
|
|
83
80
|
console.log(`- AI Tools: ${config.stack.aiEngine}`);
|
|
84
81
|
}
|
|
82
|
+
const isNonInteractive = options.yes || process.env.GHK_NON_INTERACTIVE === 'true' || !!process.env.CI;
|
|
85
83
|
let confirmContext = true;
|
|
86
|
-
if (!
|
|
84
|
+
if (!isNonInteractive) {
|
|
87
85
|
const answer = await inquirer_1.default.prompt([{
|
|
88
86
|
type: 'confirm',
|
|
89
87
|
name: 'confirmContext',
|
|
@@ -105,7 +103,7 @@ async function handleGenerateCommand(options) {
|
|
|
105
103
|
agentChoices.push({ name: 'AI Engineer Agent (RAG/VectorDB)', value: 'ai-engineer-agent.md', checked: true });
|
|
106
104
|
}
|
|
107
105
|
let selectedAgents = agentChoices.map(c => c.value);
|
|
108
|
-
if (!
|
|
106
|
+
if (!isNonInteractive) {
|
|
109
107
|
const answer = await inquirer_1.default.prompt([{
|
|
110
108
|
type: 'checkbox',
|
|
111
109
|
name: 'selectedAgents',
|
|
@@ -114,31 +112,30 @@ async function handleGenerateCommand(options) {
|
|
|
114
112
|
}]);
|
|
115
113
|
selectedAgents = answer.selectedAgents;
|
|
116
114
|
}
|
|
117
|
-
if (selectedAgents.length
|
|
118
|
-
|
|
119
|
-
const prompts = (0, prompts_1.generatePrompts)(parsed, config);
|
|
120
|
-
selectedAgents.forEach((filename) => {
|
|
121
|
-
if (prompts[filename]) {
|
|
122
|
-
(0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'prompts', filename), prompts[filename]);
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
logger_1.logger.success(`Generated selected prompts in prompts/: ${selectedAgents.join(', ')}`);
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
logger_1.logger.warn('No agents selected. Skipping prompt generation.');
|
|
129
|
-
}
|
|
130
|
-
// 4. Generate Infrastructure Config
|
|
131
|
-
const { dockerComposeYaml, serverlessYml, envExample } = (0, infra_1.generateInfra)(config);
|
|
132
|
-
if (config.architecture === 'serverless') {
|
|
133
|
-
(0, file_system_1.writeFileSync)(path_1.default.join(config.outputDir, 'serverless.yml'), serverlessYml);
|
|
134
|
-
logger_1.logger.success('Generated serverless.yml (AWS Lambda FaaS)');
|
|
115
|
+
if (selectedAgents.length === 0) {
|
|
116
|
+
logger_1.logger.warn('No agents selected. Filtering out prompt generation.');
|
|
135
117
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
118
|
+
// Generate all artifacts via Plugin System
|
|
119
|
+
logger_1.logger.info('Running Generation Plugins...');
|
|
120
|
+
const artifacts = plugin_system_1.pluginRegistry.runGeneration(ir, config);
|
|
121
|
+
// Filter out unselected prompts
|
|
122
|
+
const filteredArtifacts = artifacts.filter(a => {
|
|
123
|
+
if (a.type === 'prompt') {
|
|
124
|
+
const filename = path_1.default.basename(a.filePath);
|
|
125
|
+
return selectedAgents.includes(filename);
|
|
126
|
+
}
|
|
127
|
+
return true;
|
|
128
|
+
});
|
|
129
|
+
const fs = require('fs');
|
|
130
|
+
filteredArtifacts.forEach(artifact => {
|
|
131
|
+
const fullPath = path_1.default.join(config.outputDir, artifact.filePath);
|
|
132
|
+
const dir = path_1.default.dirname(fullPath);
|
|
133
|
+
if (!fs.existsSync(dir)) {
|
|
134
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
135
|
+
}
|
|
136
|
+
(0, file_system_1.writeFileSync)(fullPath, artifact.content);
|
|
137
|
+
logger_1.logger.success(`[Plugin ${artifact.type}] Generated: ${artifact.filePath}`);
|
|
138
|
+
});
|
|
142
139
|
logger_1.logger.banner();
|
|
143
140
|
logger_1.logger.success(`All artifacts successfully generated under ${config.outputDir}!`);
|
|
144
141
|
logger_1.logger.info('Ready for AI Agents (Claude Code, Cursor, Antigravity, Copilot).');
|