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.
Files changed (166) hide show
  1. package/README.md +77 -18
  2. package/lib/api/copilot-sdk.d.ts.map +1 -1
  3. package/lib/api/copilot-sdk.js +63 -36
  4. package/lib/api/copilot-sdk.js.map +1 -1
  5. package/lib/api/copilot.d.ts.map +1 -1
  6. package/lib/api/copilot.js +6 -6
  7. package/lib/api/copilot.js.map +1 -1
  8. package/lib/api/gemini.d.ts.map +1 -1
  9. package/lib/api/gemini.js +2 -2
  10. package/lib/api/gemini.js.map +1 -1
  11. package/lib/api/groq-sdk.d.ts +11 -0
  12. package/lib/api/groq-sdk.d.ts.map +1 -0
  13. package/lib/api/groq-sdk.js +131 -0
  14. package/lib/api/groq-sdk.js.map +1 -0
  15. package/lib/api/groq.d.ts +10 -0
  16. package/lib/api/groq.d.ts.map +1 -0
  17. package/lib/api/groq.js +36 -0
  18. package/lib/api/groq.js.map +1 -0
  19. package/lib/api/openrouter-sdk.d.ts.map +1 -1
  20. package/lib/api/openrouter-sdk.js +58 -73
  21. package/lib/api/openrouter-sdk.js.map +1 -1
  22. package/lib/api/openrouter.d.ts.map +1 -1
  23. package/lib/api/openrouter.js +2 -2
  24. package/lib/api/openrouter.js.map +1 -1
  25. package/lib/api/trello.d.ts +16 -1
  26. package/lib/api/trello.d.ts.map +1 -1
  27. package/lib/api/trello.js +90 -2
  28. package/lib/api/trello.js.map +1 -1
  29. package/lib/cli/input.d.ts +1 -9
  30. package/lib/cli/input.d.ts.map +1 -1
  31. package/lib/cli/input.js +428 -169
  32. package/lib/cli/input.js.map +1 -1
  33. package/lib/cli/menu.d.ts.map +1 -1
  34. package/lib/cli/menu.js +33 -20
  35. package/lib/cli/menu.js.map +1 -1
  36. package/lib/core/copilot-setup.d.ts +6 -1
  37. package/lib/core/copilot-setup.d.ts.map +1 -1
  38. package/lib/core/copilot-setup.js +40 -34
  39. package/lib/core/copilot-setup.js.map +1 -1
  40. package/lib/core/gemini-setup.d.ts.map +1 -1
  41. package/lib/core/gemini-setup.js +7 -13
  42. package/lib/core/gemini-setup.js.map +1 -1
  43. package/lib/core/github-setup.d.ts.map +1 -1
  44. package/lib/core/github-setup.js +13 -7
  45. package/lib/core/github-setup.js.map +1 -1
  46. package/lib/core/gitlab-setup.d.ts.map +1 -1
  47. package/lib/core/gitlab-setup.js +13 -6
  48. package/lib/core/gitlab-setup.js.map +1 -1
  49. package/lib/core/groq-setup.d.ts +5 -0
  50. package/lib/core/groq-setup.d.ts.map +1 -0
  51. package/lib/core/groq-setup.js +67 -0
  52. package/lib/core/groq-setup.js.map +1 -0
  53. package/lib/core/openrouter-setup.d.ts.map +1 -1
  54. package/lib/core/openrouter-setup.js +11 -21
  55. package/lib/core/openrouter-setup.js.map +1 -1
  56. package/lib/core/setup.d.ts +2 -1
  57. package/lib/core/setup.d.ts.map +1 -1
  58. package/lib/core/setup.js +44 -7
  59. package/lib/core/setup.js.map +1 -1
  60. package/lib/index.js +25 -0
  61. package/lib/index.js.map +1 -1
  62. package/lib/types/index.d.ts +9 -1
  63. package/lib/types/index.d.ts.map +1 -1
  64. package/lib/utils/ai-workflow.d.ts +10 -2
  65. package/lib/utils/ai-workflow.d.ts.map +1 -1
  66. package/lib/utils/ai-workflow.js +15 -0
  67. package/lib/utils/ai-workflow.js.map +1 -1
  68. package/lib/utils/branch-naming.d.ts +2 -1
  69. package/lib/utils/branch-naming.d.ts.map +1 -1
  70. package/lib/utils/branch-naming.js +114 -68
  71. package/lib/utils/branch-naming.js.map +1 -1
  72. package/lib/utils/config.d.ts +11 -3
  73. package/lib/utils/config.d.ts.map +1 -1
  74. package/lib/utils/config.js +46 -18
  75. package/lib/utils/config.js.map +1 -1
  76. package/lib/utils/exec.d.ts.map +1 -1
  77. package/lib/utils/exec.js +10 -2
  78. package/lib/utils/exec.js.map +1 -1
  79. package/lib/utils/git-ai-errors.d.ts.map +1 -1
  80. package/lib/utils/git-ai-errors.js +5 -1
  81. package/lib/utils/git-ai-errors.js.map +1 -1
  82. package/lib/utils/git-ai.d.ts +8 -7
  83. package/lib/utils/git-ai.d.ts.map +1 -1
  84. package/lib/utils/git-ai.js +239 -117
  85. package/lib/utils/git-ai.js.map +1 -1
  86. package/lib/utils/logging.d.ts.map +1 -1
  87. package/lib/utils/logging.js +14 -3
  88. package/lib/utils/logging.js.map +1 -1
  89. package/lib/utils/menu-builders.js +1 -1
  90. package/lib/utils/menu-builders.js.map +1 -1
  91. package/lib/utils/prompts-embedded.d.ts.map +1 -1
  92. package/lib/utils/prompts-embedded.js +0 -81
  93. package/lib/utils/prompts-embedded.js.map +1 -1
  94. package/lib/utils/scramble.d.ts.map +1 -1
  95. package/lib/utils/scramble.js +14 -3
  96. package/lib/utils/scramble.js.map +1 -1
  97. package/lib/utils/state.d.ts.map +1 -1
  98. package/lib/utils/state.js +12 -1
  99. package/lib/utils/state.js.map +1 -1
  100. package/lib/version.d.ts +1 -1
  101. package/lib/version.d.ts.map +1 -1
  102. package/lib/version.js +1 -1
  103. package/lib/version.js.map +1 -1
  104. package/lib/workflows/ai-provider.d.ts +3 -1
  105. package/lib/workflows/ai-provider.d.ts.map +1 -1
  106. package/lib/workflows/ai-provider.js +8 -2
  107. package/lib/workflows/ai-provider.js.map +1 -1
  108. package/lib/workflows/branch-helpers.d.ts.map +1 -1
  109. package/lib/workflows/branch-helpers.js +142 -71
  110. package/lib/workflows/branch-helpers.js.map +1 -1
  111. package/lib/workflows/branch.d.ts.map +1 -1
  112. package/lib/workflows/branch.js +97 -58
  113. package/lib/workflows/branch.js.map +1 -1
  114. package/lib/workflows/commit.d.ts +1 -1
  115. package/lib/workflows/commit.d.ts.map +1 -1
  116. package/lib/workflows/commit.js +97 -35
  117. package/lib/workflows/commit.js.map +1 -1
  118. package/lib/workflows/dry-run.d.ts.map +1 -1
  119. package/lib/workflows/dry-run.js +6 -0
  120. package/lib/workflows/dry-run.js.map +1 -1
  121. package/lib/workflows/issue.d.ts.map +1 -1
  122. package/lib/workflows/issue.js +12 -12
  123. package/lib/workflows/issue.js.map +1 -1
  124. package/lib/workflows/main-helpers.d.ts +3 -1
  125. package/lib/workflows/main-helpers.d.ts.map +1 -1
  126. package/lib/workflows/main-helpers.js +30 -26
  127. package/lib/workflows/main-helpers.js.map +1 -1
  128. package/lib/workflows/main.d.ts.map +1 -1
  129. package/lib/workflows/main.js +164 -13
  130. package/lib/workflows/main.js.map +1 -1
  131. package/lib/workflows/pr.d.ts.map +1 -1
  132. package/lib/workflows/pr.js +12 -12
  133. package/lib/workflows/pr.js.map +1 -1
  134. package/lib/workflows/release-merge.d.ts.map +1 -1
  135. package/lib/workflows/release-merge.js +65 -11
  136. package/lib/workflows/release-merge.js.map +1 -1
  137. package/lib/workflows/release-sync.d.ts.map +1 -1
  138. package/lib/workflows/release-sync.js +87 -12
  139. package/lib/workflows/release-sync.js.map +1 -1
  140. package/lib/workflows/release.d.ts.map +1 -1
  141. package/lib/workflows/release.js +130 -15
  142. package/lib/workflows/release.js.map +1 -1
  143. package/lib/workflows/repo-settings.d.ts.map +1 -1
  144. package/lib/workflows/repo-settings.js +35 -8
  145. package/lib/workflows/repo-settings.js.map +1 -1
  146. package/lib/workflows/reword.d.ts.map +1 -1
  147. package/lib/workflows/reword.js +60 -17
  148. package/lib/workflows/reword.js.map +1 -1
  149. package/lib/workflows/settings.d.ts +3 -1
  150. package/lib/workflows/settings.d.ts.map +1 -1
  151. package/lib/workflows/settings.js +393 -75
  152. package/lib/workflows/settings.js.map +1 -1
  153. package/lib/workflows/submodules.d.ts +6 -0
  154. package/lib/workflows/submodules.d.ts.map +1 -0
  155. package/lib/workflows/submodules.js +344 -0
  156. package/lib/workflows/submodules.js.map +1 -0
  157. package/lib/workflows/trello-menu.d.ts +0 -3
  158. package/lib/workflows/trello-menu.d.ts.map +1 -1
  159. package/lib/workflows/trello-menu.js +349 -19
  160. package/lib/workflows/trello-menu.js.map +1 -1
  161. package/package.json +13 -2
  162. package/lib/workflows/security-gate.d.ts +0 -8
  163. package/lib/workflows/security-gate.d.ts.map +0 -1
  164. package/lib/workflows/security-gate.js +0 -455
  165. package/lib/workflows/security-gate.js.map +0 -1
  166. 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]