geeto 0.9.0 → 0.10.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 +77 -18
- package/lib/api/copilot-sdk.d.ts.map +1 -1
- package/lib/api/copilot-sdk.js +63 -36
- package/lib/api/copilot-sdk.js.map +1 -1
- package/lib/api/copilot.d.ts.map +1 -1
- package/lib/api/copilot.js +6 -6
- package/lib/api/copilot.js.map +1 -1
- package/lib/api/gemini.d.ts.map +1 -1
- package/lib/api/gemini.js +2 -2
- package/lib/api/gemini.js.map +1 -1
- package/lib/api/groq-sdk.d.ts +11 -0
- package/lib/api/groq-sdk.d.ts.map +1 -0
- package/lib/api/groq-sdk.js +131 -0
- package/lib/api/groq-sdk.js.map +1 -0
- package/lib/api/groq.d.ts +10 -0
- package/lib/api/groq.d.ts.map +1 -0
- package/lib/api/groq.js +36 -0
- package/lib/api/groq.js.map +1 -0
- package/lib/api/openrouter-sdk.d.ts.map +1 -1
- package/lib/api/openrouter-sdk.js +58 -73
- package/lib/api/openrouter-sdk.js.map +1 -1
- package/lib/api/openrouter.d.ts.map +1 -1
- package/lib/api/openrouter.js +2 -2
- package/lib/api/openrouter.js.map +1 -1
- package/lib/api/trello.d.ts +16 -1
- package/lib/api/trello.d.ts.map +1 -1
- package/lib/api/trello.js +90 -2
- package/lib/api/trello.js.map +1 -1
- package/lib/cli/input.d.ts +1 -9
- package/lib/cli/input.d.ts.map +1 -1
- package/lib/cli/input.js +428 -169
- package/lib/cli/input.js.map +1 -1
- package/lib/cli/menu.d.ts.map +1 -1
- package/lib/cli/menu.js +33 -20
- package/lib/cli/menu.js.map +1 -1
- package/lib/core/copilot-setup.d.ts +6 -1
- package/lib/core/copilot-setup.d.ts.map +1 -1
- package/lib/core/copilot-setup.js +40 -34
- package/lib/core/copilot-setup.js.map +1 -1
- package/lib/core/gemini-setup.d.ts.map +1 -1
- package/lib/core/gemini-setup.js +7 -13
- package/lib/core/gemini-setup.js.map +1 -1
- package/lib/core/github-setup.d.ts.map +1 -1
- package/lib/core/github-setup.js +13 -7
- package/lib/core/github-setup.js.map +1 -1
- package/lib/core/gitlab-setup.d.ts.map +1 -1
- package/lib/core/gitlab-setup.js +13 -6
- package/lib/core/gitlab-setup.js.map +1 -1
- package/lib/core/groq-setup.d.ts +5 -0
- package/lib/core/groq-setup.d.ts.map +1 -0
- package/lib/core/groq-setup.js +67 -0
- package/lib/core/groq-setup.js.map +1 -0
- package/lib/core/openrouter-setup.d.ts.map +1 -1
- package/lib/core/openrouter-setup.js +11 -21
- package/lib/core/openrouter-setup.js.map +1 -1
- package/lib/core/setup.d.ts +2 -1
- package/lib/core/setup.d.ts.map +1 -1
- package/lib/core/setup.js +44 -7
- package/lib/core/setup.js.map +1 -1
- package/lib/index.js +25 -0
- package/lib/index.js.map +1 -1
- package/lib/types/index.d.ts +9 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/utils/ai-workflow.d.ts +10 -2
- package/lib/utils/ai-workflow.d.ts.map +1 -1
- package/lib/utils/ai-workflow.js +15 -0
- package/lib/utils/ai-workflow.js.map +1 -1
- package/lib/utils/branch-naming.d.ts +2 -1
- package/lib/utils/branch-naming.d.ts.map +1 -1
- package/lib/utils/branch-naming.js +114 -68
- package/lib/utils/branch-naming.js.map +1 -1
- package/lib/utils/config.d.ts +11 -3
- package/lib/utils/config.d.ts.map +1 -1
- package/lib/utils/config.js +46 -18
- package/lib/utils/config.js.map +1 -1
- package/lib/utils/exec.d.ts.map +1 -1
- package/lib/utils/exec.js +10 -2
- package/lib/utils/exec.js.map +1 -1
- package/lib/utils/git-ai-errors.d.ts.map +1 -1
- package/lib/utils/git-ai-errors.js +5 -1
- package/lib/utils/git-ai-errors.js.map +1 -1
- package/lib/utils/git-ai.d.ts +8 -7
- package/lib/utils/git-ai.d.ts.map +1 -1
- package/lib/utils/git-ai.js +239 -117
- package/lib/utils/git-ai.js.map +1 -1
- package/lib/utils/logging.d.ts.map +1 -1
- package/lib/utils/logging.js +14 -3
- package/lib/utils/logging.js.map +1 -1
- package/lib/utils/menu-builders.js +1 -1
- package/lib/utils/menu-builders.js.map +1 -1
- package/lib/utils/prompts-embedded.d.ts.map +1 -1
- package/lib/utils/prompts-embedded.js +0 -81
- package/lib/utils/prompts-embedded.js.map +1 -1
- package/lib/utils/scramble.d.ts.map +1 -1
- package/lib/utils/scramble.js +14 -3
- package/lib/utils/scramble.js.map +1 -1
- package/lib/utils/state.d.ts.map +1 -1
- package/lib/utils/state.js +12 -1
- package/lib/utils/state.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.d.ts.map +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/lib/workflows/ai-provider.d.ts +3 -1
- package/lib/workflows/ai-provider.d.ts.map +1 -1
- package/lib/workflows/ai-provider.js +8 -2
- package/lib/workflows/ai-provider.js.map +1 -1
- package/lib/workflows/branch-helpers.d.ts.map +1 -1
- package/lib/workflows/branch-helpers.js +142 -71
- package/lib/workflows/branch-helpers.js.map +1 -1
- package/lib/workflows/branch.d.ts.map +1 -1
- package/lib/workflows/branch.js +97 -58
- package/lib/workflows/branch.js.map +1 -1
- package/lib/workflows/commit.d.ts +1 -1
- package/lib/workflows/commit.d.ts.map +1 -1
- package/lib/workflows/commit.js +97 -35
- package/lib/workflows/commit.js.map +1 -1
- package/lib/workflows/dry-run.d.ts.map +1 -1
- package/lib/workflows/dry-run.js +6 -0
- package/lib/workflows/dry-run.js.map +1 -1
- package/lib/workflows/issue.d.ts.map +1 -1
- package/lib/workflows/issue.js +12 -12
- package/lib/workflows/issue.js.map +1 -1
- package/lib/workflows/main-helpers.d.ts +3 -1
- package/lib/workflows/main-helpers.d.ts.map +1 -1
- package/lib/workflows/main-helpers.js +30 -26
- package/lib/workflows/main-helpers.js.map +1 -1
- package/lib/workflows/main.d.ts.map +1 -1
- package/lib/workflows/main.js +164 -13
- package/lib/workflows/main.js.map +1 -1
- package/lib/workflows/pr.d.ts.map +1 -1
- package/lib/workflows/pr.js +12 -12
- package/lib/workflows/pr.js.map +1 -1
- package/lib/workflows/release-merge.d.ts.map +1 -1
- package/lib/workflows/release-merge.js +65 -11
- package/lib/workflows/release-merge.js.map +1 -1
- package/lib/workflows/release-sync.d.ts.map +1 -1
- package/lib/workflows/release-sync.js +87 -12
- package/lib/workflows/release-sync.js.map +1 -1
- package/lib/workflows/release.d.ts.map +1 -1
- package/lib/workflows/release.js +130 -15
- package/lib/workflows/release.js.map +1 -1
- package/lib/workflows/repo-settings.d.ts.map +1 -1
- package/lib/workflows/repo-settings.js +35 -8
- package/lib/workflows/repo-settings.js.map +1 -1
- package/lib/workflows/reword.d.ts.map +1 -1
- package/lib/workflows/reword.js +60 -17
- package/lib/workflows/reword.js.map +1 -1
- package/lib/workflows/settings.d.ts +3 -1
- package/lib/workflows/settings.d.ts.map +1 -1
- package/lib/workflows/settings.js +393 -75
- package/lib/workflows/settings.js.map +1 -1
- package/lib/workflows/submodules.d.ts +6 -0
- package/lib/workflows/submodules.d.ts.map +1 -0
- package/lib/workflows/submodules.js +344 -0
- package/lib/workflows/submodules.js.map +1 -0
- package/lib/workflows/trello-menu.d.ts +0 -3
- package/lib/workflows/trello-menu.d.ts.map +1 -1
- package/lib/workflows/trello-menu.js +349 -19
- package/lib/workflows/trello-menu.js.map +1 -1
- package/package.json +13 -2
- package/lib/workflows/security-gate.d.ts +0 -8
- package/lib/workflows/security-gate.d.ts.map +0 -1
- package/lib/workflows/security-gate.js +0 -455
- package/lib/workflows/security-gate.js.map +0 -1
- package/prompts/security-gate-prompt.md +0 -80
|
@@ -1,455 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Security & Quality Gate - AI-powered security and code quality analyzer
|
|
3
|
-
*/
|
|
4
|
-
import fs from 'node:fs/promises';
|
|
5
|
-
import path from 'node:path';
|
|
6
|
-
import { confirm } from '../cli/input.js';
|
|
7
|
-
import { multiSelect, select } from '../cli/menu.js';
|
|
8
|
-
import { colors } from '../utils/colors.js';
|
|
9
|
-
import { exec } from '../utils/exec.js';
|
|
10
|
-
import { generateCommitMessageWithProvider } from '../utils/git-ai.js';
|
|
11
|
-
import { getCurrentBranch, getStagedFiles } from '../utils/git.js';
|
|
12
|
-
import { log } from '../utils/logging.js';
|
|
13
|
-
import { loadPromptWithVars } from '../utils/prompt-loader.js';
|
|
14
|
-
import { loadState } from '../utils/state.js';
|
|
15
|
-
/**
|
|
16
|
-
* Collect data for security analysis
|
|
17
|
-
*/
|
|
18
|
-
function collectSecurityData() {
|
|
19
|
-
// Get staged files or all changed files
|
|
20
|
-
const stagedFiles = getStagedFiles();
|
|
21
|
-
const files = stagedFiles.length > 0 ? stagedFiles : [];
|
|
22
|
-
// Get diff
|
|
23
|
-
let diff = '';
|
|
24
|
-
try {
|
|
25
|
-
if (stagedFiles.length > 0) {
|
|
26
|
-
diff = exec('git diff --cached', true);
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
diff = exec('git diff HEAD', true);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
diff = 'No diff available';
|
|
34
|
-
}
|
|
35
|
-
// Truncate if too long
|
|
36
|
-
const truncatedDiff = diff.length > 10000 ? diff.slice(0, 10000) + '\n\n... (diff truncated)' : diff;
|
|
37
|
-
// Check for dependency changes
|
|
38
|
-
const hasDependencies = files.some((f) => f.includes('package.json') ||
|
|
39
|
-
f.includes('requirements.txt') ||
|
|
40
|
-
f.includes('Gemfile') ||
|
|
41
|
-
f.includes('pom.xml') ||
|
|
42
|
-
f.includes('go.mod'));
|
|
43
|
-
return {
|
|
44
|
-
diff: truncatedDiff,
|
|
45
|
-
files,
|
|
46
|
-
hasDependencies,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Collect data from specific commits for security analysis
|
|
51
|
-
*/
|
|
52
|
-
function collectCommitData(commitHashes) {
|
|
53
|
-
let diff = '';
|
|
54
|
-
const allFiles = new Set();
|
|
55
|
-
for (const hash of commitHashes) {
|
|
56
|
-
try {
|
|
57
|
-
const commitDiff = exec(`git show ${hash} --format="" --patch`, true);
|
|
58
|
-
diff += commitDiff + '\n';
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
// skip if commit can't be read
|
|
62
|
-
}
|
|
63
|
-
try {
|
|
64
|
-
const files = exec(`git show ${hash} --format="" --name-only`, true)
|
|
65
|
-
.split('\n')
|
|
66
|
-
.filter(Boolean);
|
|
67
|
-
for (const f of files)
|
|
68
|
-
allFiles.add(f);
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
// skip
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
const files = [...allFiles];
|
|
75
|
-
// Truncate if too long
|
|
76
|
-
const truncatedDiff = diff.length > 10000 ? diff.slice(0, 10000) + '\n\n... (diff truncated)' : diff;
|
|
77
|
-
const hasDependencies = files.some((f) => f.includes('package.json') ||
|
|
78
|
-
f.includes('requirements.txt') ||
|
|
79
|
-
f.includes('Gemfile') ||
|
|
80
|
-
f.includes('pom.xml') ||
|
|
81
|
-
f.includes('go.mod'));
|
|
82
|
-
return { diff: truncatedDiff, files, hasDependencies };
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Get recent commits for selection
|
|
86
|
-
*/
|
|
87
|
-
function getRecentCommits(count = 30) {
|
|
88
|
-
try {
|
|
89
|
-
const logOutput = exec(`git log -${count} --no-merges --format="%H|%h|%s|%cr"`, true);
|
|
90
|
-
return logOutput
|
|
91
|
-
.split('\n')
|
|
92
|
-
.filter(Boolean)
|
|
93
|
-
.map((line) => {
|
|
94
|
-
const [hash, shortHash, subject, date] = line.split('|');
|
|
95
|
-
return {
|
|
96
|
-
hash: hash ?? '',
|
|
97
|
-
shortHash: shortHash ?? '',
|
|
98
|
-
subject: subject ?? '',
|
|
99
|
-
date: date ?? '',
|
|
100
|
-
};
|
|
101
|
-
})
|
|
102
|
-
.filter((c) => c.hash !== '');
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
return [];
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Build AI prompt for security analysis
|
|
110
|
-
*/
|
|
111
|
-
function buildSecurityPrompt(data) {
|
|
112
|
-
const { diff, files, hasDependencies } = data;
|
|
113
|
-
return loadPromptWithVars('security-gate-prompt.md', {
|
|
114
|
-
filesCount: String(files.length),
|
|
115
|
-
changedFiles: files.slice(0, 10).join(', ') + (files.length > 10 ? ' ...' : ''),
|
|
116
|
-
hasDependencies: hasDependencies ? 'Yes' : 'No',
|
|
117
|
-
diff,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Parse AI response into structured security result
|
|
122
|
-
*/
|
|
123
|
-
function parseSecurityResponse(response) {
|
|
124
|
-
const lines = response.split('\n');
|
|
125
|
-
const securityWarnings = [];
|
|
126
|
-
const qualityIssues = [];
|
|
127
|
-
let summary = 'No issues detected';
|
|
128
|
-
let overallRisk = 'none';
|
|
129
|
-
let section = '';
|
|
130
|
-
let currentIssue = {};
|
|
131
|
-
for (const line of lines) {
|
|
132
|
-
const trimmed = line.trim();
|
|
133
|
-
if (trimmed.startsWith('SECURITY_WARNINGS:')) {
|
|
134
|
-
section = 'security';
|
|
135
|
-
currentIssue = {};
|
|
136
|
-
}
|
|
137
|
-
else if (trimmed.startsWith('QUALITY_ISSUES:')) {
|
|
138
|
-
section = 'quality';
|
|
139
|
-
currentIssue = {};
|
|
140
|
-
}
|
|
141
|
-
else if (trimmed.startsWith('OVERALL_RISK:')) {
|
|
142
|
-
const risk = trimmed.replace('OVERALL_RISK:', '').trim().toLowerCase();
|
|
143
|
-
if (risk === 'high' || risk === 'medium' || risk === 'low' || risk === 'none') {
|
|
144
|
-
overallRisk = risk;
|
|
145
|
-
}
|
|
146
|
-
section = '';
|
|
147
|
-
}
|
|
148
|
-
else if (trimmed.startsWith('SUMMARY:')) {
|
|
149
|
-
section = 'summary';
|
|
150
|
-
}
|
|
151
|
-
else if (section === 'summary' && trimmed) {
|
|
152
|
-
summary = trimmed;
|
|
153
|
-
}
|
|
154
|
-
else if ((section === 'security' || section === 'quality') &&
|
|
155
|
-
trimmed.startsWith('- SEVERITY:')) {
|
|
156
|
-
// Save previous issue if exists
|
|
157
|
-
if (currentIssue.title) {
|
|
158
|
-
const issue = {
|
|
159
|
-
type: section,
|
|
160
|
-
severity: currentIssue.severity ?? 'low',
|
|
161
|
-
title: currentIssue.title ?? 'Unknown issue',
|
|
162
|
-
description: currentIssue.description ?? '',
|
|
163
|
-
location: currentIssue.location,
|
|
164
|
-
suggestion: currentIssue.suggestion ?? 'Review and fix',
|
|
165
|
-
};
|
|
166
|
-
if (section === 'security') {
|
|
167
|
-
securityWarnings.push(issue);
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
qualityIssues.push(issue);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
// Start new issue
|
|
174
|
-
const severity = trimmed.replace('- SEVERITY:', '').trim().toLowerCase();
|
|
175
|
-
currentIssue = {
|
|
176
|
-
severity: severity === 'high' || severity === 'medium' || severity === 'low' ? severity : 'low',
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
else if ((section === 'security' || section === 'quality') &&
|
|
180
|
-
trimmed.startsWith('- TITLE:')) {
|
|
181
|
-
currentIssue.title = trimmed.replace('- TITLE:', '').trim();
|
|
182
|
-
}
|
|
183
|
-
else if ((section === 'security' || section === 'quality') &&
|
|
184
|
-
trimmed.startsWith('- DESCRIPTION:')) {
|
|
185
|
-
currentIssue.description = trimmed.replace('- DESCRIPTION:', '').trim();
|
|
186
|
-
}
|
|
187
|
-
else if ((section === 'security' || section === 'quality') &&
|
|
188
|
-
trimmed.startsWith('- LOCATION:')) {
|
|
189
|
-
currentIssue.location = trimmed.replace('- LOCATION:', '').trim();
|
|
190
|
-
}
|
|
191
|
-
else if ((section === 'security' || section === 'quality') &&
|
|
192
|
-
trimmed.startsWith('- SUGGESTION:')) {
|
|
193
|
-
currentIssue.suggestion = trimmed.replace('- SUGGESTION:', '').trim();
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
// Save last issue
|
|
197
|
-
if (currentIssue.title) {
|
|
198
|
-
const issue = {
|
|
199
|
-
type: section === 'security' ? 'security' : 'quality',
|
|
200
|
-
severity: currentIssue.severity ?? 'low',
|
|
201
|
-
title: currentIssue.title ?? 'Unknown issue',
|
|
202
|
-
description: currentIssue.description ?? '',
|
|
203
|
-
location: currentIssue.location,
|
|
204
|
-
suggestion: currentIssue.suggestion ?? 'Review and fix',
|
|
205
|
-
};
|
|
206
|
-
if (section === 'security') {
|
|
207
|
-
securityWarnings.push(issue);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
qualityIssues.push(issue);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return {
|
|
214
|
-
securityWarnings,
|
|
215
|
-
qualityIssues,
|
|
216
|
-
summary,
|
|
217
|
-
overallRisk,
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Run security scan with AI
|
|
222
|
-
*/
|
|
223
|
-
async function runSecurityScan(data, aiProvider, model) {
|
|
224
|
-
const prompt = buildSecurityPrompt(data);
|
|
225
|
-
const spinner = log.spinner();
|
|
226
|
-
try {
|
|
227
|
-
const modelInfo = model ? ` (${model})` : '';
|
|
228
|
-
console.log('');
|
|
229
|
-
spinner.start(`Analyzing code security and quality with ${aiProvider}${modelInfo}...`);
|
|
230
|
-
let result = null;
|
|
231
|
-
// Use generateCommitMessage as a generic text generator
|
|
232
|
-
result = await generateCommitMessageWithProvider(aiProvider, prompt, undefined, model, model, model);
|
|
233
|
-
spinner.stop();
|
|
234
|
-
if (result) {
|
|
235
|
-
return result;
|
|
236
|
-
}
|
|
237
|
-
log.warn('AI returned empty response');
|
|
238
|
-
return null;
|
|
239
|
-
}
|
|
240
|
-
catch (error) {
|
|
241
|
-
spinner.fail(`Failed to analyze security: ${error}`);
|
|
242
|
-
return null;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* Display security scan results
|
|
247
|
-
*/
|
|
248
|
-
function displaySecurityResults(result) {
|
|
249
|
-
console.log('');
|
|
250
|
-
console.log(`${colors.cyan}┌─ Security & Quality Gate ───────────────────────────────┐${colors.reset}`);
|
|
251
|
-
// Overall risk
|
|
252
|
-
const riskColor = result.overallRisk === 'high'
|
|
253
|
-
? colors.red
|
|
254
|
-
: result.overallRisk === 'medium'
|
|
255
|
-
? colors.yellow
|
|
256
|
-
: colors.green;
|
|
257
|
-
console.log(`${colors.cyan}│${colors.reset} Overall Risk: ${riskColor}${result.overallRisk.toUpperCase()}${colors.reset}`);
|
|
258
|
-
console.log(`${colors.cyan}│${colors.reset} Summary: ${result.summary}`);
|
|
259
|
-
console.log(`${colors.cyan}│${colors.reset} Security Warnings: ${result.securityWarnings.length > 0 ? colors.red + result.securityWarnings.length : colors.green + '0'}${colors.reset}`);
|
|
260
|
-
console.log(`${colors.cyan}│${colors.reset} Quality Issues: ${result.qualityIssues.length > 0 ? colors.yellow + result.qualityIssues.length : colors.green + '0'}${colors.reset}`);
|
|
261
|
-
console.log(`${colors.cyan}└─────────────────────────────────────────────────────────┘${colors.reset}`);
|
|
262
|
-
console.log('');
|
|
263
|
-
// Security warnings
|
|
264
|
-
if (result.securityWarnings.length > 0) {
|
|
265
|
-
console.log(colors.red + colors.bright + '⚠ SECURITY WARNINGS:' + colors.reset + '\n');
|
|
266
|
-
for (const warning of result.securityWarnings) {
|
|
267
|
-
const sevColor = warning.severity === 'high'
|
|
268
|
-
? colors.red
|
|
269
|
-
: warning.severity === 'medium'
|
|
270
|
-
? colors.yellow
|
|
271
|
-
: colors.blue;
|
|
272
|
-
console.log(` ${sevColor}●${colors.reset} ${colors.bright}${warning.title}${colors.reset} [${sevColor}${warning.severity}${colors.reset}]`);
|
|
273
|
-
console.log(` ${colors.gray}Description:${colors.reset} ${warning.description}`);
|
|
274
|
-
if (warning.location) {
|
|
275
|
-
console.log(` ${colors.gray}Location:${colors.reset} ${warning.location}`);
|
|
276
|
-
}
|
|
277
|
-
console.log(` ${colors.green}Suggestion:${colors.reset} ${warning.suggestion}`);
|
|
278
|
-
console.log('');
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
// Quality issues
|
|
282
|
-
if (result.qualityIssues.length > 0) {
|
|
283
|
-
console.log(colors.yellow + colors.bright + '📋 QUALITY ISSUES:' + colors.reset + '\n');
|
|
284
|
-
for (const issue of result.qualityIssues) {
|
|
285
|
-
const sevColor = issue.severity === 'high'
|
|
286
|
-
? colors.red
|
|
287
|
-
: issue.severity === 'medium'
|
|
288
|
-
? colors.yellow
|
|
289
|
-
: colors.blue;
|
|
290
|
-
console.log(` ${sevColor}●${colors.reset} ${colors.bright}${issue.title}${colors.reset} [${sevColor}${issue.severity}${colors.reset}]`);
|
|
291
|
-
console.log(` ${colors.gray}Description:${colors.reset} ${issue.description}`);
|
|
292
|
-
if (issue.location) {
|
|
293
|
-
console.log(` ${colors.gray}Location:${colors.reset} ${issue.location}`);
|
|
294
|
-
}
|
|
295
|
-
console.log(` ${colors.green}Suggestion:${colors.reset} ${issue.suggestion}`);
|
|
296
|
-
console.log('');
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
/**
|
|
301
|
-
* Save security report to file
|
|
302
|
-
*/
|
|
303
|
-
async function saveSecurityReport(result, filename) {
|
|
304
|
-
const outputDir = path.join(process.cwd(), '.geeto');
|
|
305
|
-
await fs.mkdir(outputDir, { recursive: true });
|
|
306
|
-
let report = `# Security & Quality Gate Report\n\n`;
|
|
307
|
-
report += `**Generated:** ${new Date().toISOString()}\n`;
|
|
308
|
-
report += `**Branch:** ${getCurrentBranch()}\n`;
|
|
309
|
-
report += `**Overall Risk:** ${result.overallRisk.toUpperCase()}\n\n`;
|
|
310
|
-
report += `## Summary\n\n${result.summary}\n\n`;
|
|
311
|
-
if (result.securityWarnings.length > 0) {
|
|
312
|
-
report += `## Security Warnings\n\n`;
|
|
313
|
-
for (const warning of result.securityWarnings) {
|
|
314
|
-
report += `### ${warning.title} [${warning.severity.toUpperCase()}]\n\n`;
|
|
315
|
-
report += `**Description:** ${warning.description}\n\n`;
|
|
316
|
-
if (warning.location) {
|
|
317
|
-
report += `**Location:** ${warning.location}\n\n`;
|
|
318
|
-
}
|
|
319
|
-
report += `**Suggestion:** ${warning.suggestion}\n\n`;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
if (result.qualityIssues.length > 0) {
|
|
323
|
-
report += `## Quality Issues\n\n`;
|
|
324
|
-
for (const issue of result.qualityIssues) {
|
|
325
|
-
report += `### ${issue.title} [${issue.severity.toUpperCase()}]\n\n`;
|
|
326
|
-
report += `**Description:** ${issue.description}\n\n`;
|
|
327
|
-
if (issue.location) {
|
|
328
|
-
report += `**Location:** ${issue.location}\n\n`;
|
|
329
|
-
}
|
|
330
|
-
report += `**Suggestion:** ${issue.suggestion}\n\n`;
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
const filePath = path.join(outputDir, filename);
|
|
334
|
-
await fs.writeFile(filePath, report, 'utf8');
|
|
335
|
-
log.success(`Security report saved to: ${colors.cyan}${filePath}${colors.reset}`);
|
|
336
|
-
}
|
|
337
|
-
/**
|
|
338
|
-
* Main Security Gate workflow
|
|
339
|
-
*/
|
|
340
|
-
export async function showSecurityGateMenu() {
|
|
341
|
-
log.step('Security & Quality Gate');
|
|
342
|
-
// Get current state to check AI provider
|
|
343
|
-
const state = loadState();
|
|
344
|
-
if (!state?.aiProvider || state.aiProvider === 'manual') {
|
|
345
|
-
log.warn('No AI provider configured. Please run main workflow first to set up AI provider.');
|
|
346
|
-
const setupNow = confirm('Set up AI provider now?');
|
|
347
|
-
if (setupNow) {
|
|
348
|
-
const { handleAIProviderSelection } = await import('./ai-provider.js');
|
|
349
|
-
const selection = await handleAIProviderSelection();
|
|
350
|
-
if (!selection.aiProvider || selection.aiProvider === 'manual') {
|
|
351
|
-
log.error('AI provider required for security analysis. Exiting.');
|
|
352
|
-
return;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
else {
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
// Reload state after potential AI provider setup
|
|
360
|
-
const currentState = loadState();
|
|
361
|
-
if (!currentState?.aiProvider) {
|
|
362
|
-
log.error('AI provider not configured.');
|
|
363
|
-
return;
|
|
364
|
-
}
|
|
365
|
-
const currentBranch = getCurrentBranch();
|
|
366
|
-
log.info(`Current branch: ${colors.cyan}${currentBranch}${colors.reset}`);
|
|
367
|
-
// Choose what to analyze
|
|
368
|
-
const scanChoice = await select('What would you like to analyze?', [
|
|
369
|
-
{ label: 'Staged changes', value: 'staged' },
|
|
370
|
-
{ label: 'All uncommitted changes', value: 'all' },
|
|
371
|
-
{ label: 'Specific commits', value: 'commits' },
|
|
372
|
-
{ label: 'Cancel', value: 'cancel' },
|
|
373
|
-
]);
|
|
374
|
-
if (scanChoice === 'cancel') {
|
|
375
|
-
return;
|
|
376
|
-
}
|
|
377
|
-
let scanData;
|
|
378
|
-
if (scanChoice === 'commits') {
|
|
379
|
-
// Fetch recent commits and let user pick
|
|
380
|
-
const commits = getRecentCommits();
|
|
381
|
-
if (commits.length === 0) {
|
|
382
|
-
log.warn('No commits found.');
|
|
383
|
-
return;
|
|
384
|
-
}
|
|
385
|
-
const commitChoices = commits.map((c) => ({
|
|
386
|
-
label: `${colors.yellow}${c.shortHash}${colors.reset} ${c.subject} ${colors.gray}(${c.date})${colors.reset}`,
|
|
387
|
-
value: c.hash,
|
|
388
|
-
}));
|
|
389
|
-
const selectedHashes = await multiSelect('Select commits to analyze:', commitChoices);
|
|
390
|
-
if (selectedHashes.length === 0) {
|
|
391
|
-
log.warn('No commits selected. Cancelled.');
|
|
392
|
-
return;
|
|
393
|
-
}
|
|
394
|
-
log.info(`Analyzing ${colors.cyan}${selectedHashes.length}${colors.reset} commits`);
|
|
395
|
-
const spinner = log.spinner();
|
|
396
|
-
spinner.start('Collecting commit changes...');
|
|
397
|
-
scanData = collectCommitData(selectedHashes);
|
|
398
|
-
spinner.stop();
|
|
399
|
-
}
|
|
400
|
-
else {
|
|
401
|
-
// Collect staged or all uncommitted changes
|
|
402
|
-
const spinner = log.spinner();
|
|
403
|
-
spinner.start('Collecting code changes...');
|
|
404
|
-
scanData = collectSecurityData();
|
|
405
|
-
spinner.stop();
|
|
406
|
-
}
|
|
407
|
-
if (!scanData.diff || scanData.diff === 'No diff available' || scanData.diff.trim() === '') {
|
|
408
|
-
log.warn('No code changes detected. Nothing to analyze.');
|
|
409
|
-
return;
|
|
410
|
-
}
|
|
411
|
-
log.info(`Files to analyze: ${scanData.files.length}`);
|
|
412
|
-
if (scanData.hasDependencies) {
|
|
413
|
-
log.warn('Dependency changes detected - will check for known vulnerabilities');
|
|
414
|
-
}
|
|
415
|
-
// Run security scan
|
|
416
|
-
const aiResponse = await runSecurityScan(scanData, currentState.aiProvider, currentState.copilotModel ?? currentState.openrouterModel ?? currentState.geminiModel);
|
|
417
|
-
if (!aiResponse) {
|
|
418
|
-
log.error('Failed to complete security analysis');
|
|
419
|
-
return;
|
|
420
|
-
}
|
|
421
|
-
// Parse and display
|
|
422
|
-
const scanResult = parseSecurityResponse(aiResponse);
|
|
423
|
-
displaySecurityResults(scanResult);
|
|
424
|
-
// Ask to save report
|
|
425
|
-
if (scanResult.securityWarnings.length > 0 || scanResult.qualityIssues.length > 0) {
|
|
426
|
-
const shouldSave = confirm('Save security report to file?');
|
|
427
|
-
if (shouldSave) {
|
|
428
|
-
const filename = `security-report-${currentBranch.replaceAll(/[^a-z0-9-]/gi, '-')}-${Date.now()}.md`;
|
|
429
|
-
await saveSecurityReport(scanResult, filename);
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
// Warning for high-risk findings
|
|
433
|
-
if (scanResult.overallRisk === 'high') {
|
|
434
|
-
console.log(colors.red +
|
|
435
|
-
colors.bright +
|
|
436
|
-
'⚠ HIGH RISK detected - Please review and address security warnings before proceeding' +
|
|
437
|
-
colors.reset);
|
|
438
|
-
}
|
|
439
|
-
else if (scanResult.overallRisk === 'medium') {
|
|
440
|
-
console.log(colors.yellow + '⚠ MEDIUM RISK - Consider addressing the issues identified' + colors.reset);
|
|
441
|
-
}
|
|
442
|
-
console.log('');
|
|
443
|
-
log.success('Security gate analysis complete!');
|
|
444
|
-
console.log('');
|
|
445
|
-
// Back to menu option
|
|
446
|
-
const backChoice = await select('What would you like to do next?', [
|
|
447
|
-
{ label: 'Back to main menu', value: 'back' },
|
|
448
|
-
{ label: 'Exit', value: 'exit' },
|
|
449
|
-
]);
|
|
450
|
-
if (backChoice === 'back') {
|
|
451
|
-
const { main } = await import('./main.js');
|
|
452
|
-
await main();
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
//# sourceMappingURL=security-gate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"security-gate.js","sourceRoot":"","sources":["../../src/workflows/security-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
You are an AI Security Reviewer for application code.
|
|
2
|
-
|
|
3
|
-
**Context:**
|
|
4
|
-
|
|
5
|
-
- Files changed: {{filesCount}}
|
|
6
|
-
- Changed files: {{changedFiles}}
|
|
7
|
-
- Dependency changes: {{hasDependencies}}
|
|
8
|
-
|
|
9
|
-
**Code Changes (diff):**
|
|
10
|
-
|
|
11
|
-
```diff
|
|
12
|
-
{{diff}}
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
**Your Task:**
|
|
16
|
-
Analyze the code for potential security and quality issues.
|
|
17
|
-
|
|
18
|
-
**Security Analysis - Look for:**
|
|
19
|
-
|
|
20
|
-
1. Hardcoded secrets (API keys, passwords, tokens)
|
|
21
|
-
2. Exposed credentials or sensitive data
|
|
22
|
-
3. Risky dependencies or known vulnerabilities
|
|
23
|
-
4. Vulnerable code patterns:
|
|
24
|
-
- SQL injection risks
|
|
25
|
-
- XSS (Cross-Site Scripting) vulnerabilities
|
|
26
|
-
- Command injection
|
|
27
|
-
- Path traversal
|
|
28
|
-
- Insecure random number generation
|
|
29
|
-
- Weak cryptography
|
|
30
|
-
- Authentication/authorization bypasses
|
|
31
|
-
5. Configuration issues (exposed debug mode, unsafe CORS, etc.)
|
|
32
|
-
|
|
33
|
-
**Quality Analysis - Look for:**
|
|
34
|
-
|
|
35
|
-
1. Overly complex logic (nested loops, deep conditionals)
|
|
36
|
-
2. Code duplication
|
|
37
|
-
3. Violations of common best practices
|
|
38
|
-
4. Missing error handling
|
|
39
|
-
5. Inconsistent naming or patterns
|
|
40
|
-
|
|
41
|
-
**Important:**
|
|
42
|
-
|
|
43
|
-
- Focus on REAL issues, not theoretical ones
|
|
44
|
-
- Provide practical explanations: WHY is it dangerous or problematic?
|
|
45
|
-
- Suggest realistic, actionable fixes
|
|
46
|
-
- Do NOT block the workflow - focus on education and risk mitigation
|
|
47
|
-
- If no issues found, say so clearly
|
|
48
|
-
|
|
49
|
-
**Output Format (use this exact structure):**
|
|
50
|
-
|
|
51
|
-
SECURITY_WARNINGS:
|
|
52
|
-
[If found, list each warning as:]
|
|
53
|
-
|
|
54
|
-
- SEVERITY: [high/medium/low]
|
|
55
|
-
- TITLE: [short title]
|
|
56
|
-
- DESCRIPTION: [why is this dangerous?]
|
|
57
|
-
- LOCATION: [file:line or general area]
|
|
58
|
-
- SUGGESTION: [how to fix it]
|
|
59
|
-
|
|
60
|
-
[If no security warnings:]
|
|
61
|
-
|
|
62
|
-
- None detected
|
|
63
|
-
|
|
64
|
-
QUALITY_ISSUES:
|
|
65
|
-
[If found, list each issue as:]
|
|
66
|
-
|
|
67
|
-
- SEVERITY: [high/medium/low]
|
|
68
|
-
- TITLE: [short title]
|
|
69
|
-
- DESCRIPTION: [what's the problem?]
|
|
70
|
-
- LOCATION: [file:line or general area]
|
|
71
|
-
- SUGGESTION: [how to improve it]
|
|
72
|
-
|
|
73
|
-
[If no quality issues:]
|
|
74
|
-
|
|
75
|
-
- None detected
|
|
76
|
-
|
|
77
|
-
OVERALL_RISK: [high/medium/low/none]
|
|
78
|
-
|
|
79
|
-
SUMMARY:
|
|
80
|
-
[1-2 sentence summary of findings]
|