@darrenjcoxon/vibeguard 1.0.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -0
  3. package/dist/agent-report.d.ts +36 -0
  4. package/dist/agent-report.d.ts.map +1 -0
  5. package/dist/agent-report.js +329 -0
  6. package/dist/agent-report.js.map +1 -0
  7. package/dist/ai-summary.d.ts +55 -0
  8. package/dist/ai-summary.d.ts.map +1 -0
  9. package/dist/ai-summary.js +267 -0
  10. package/dist/ai-summary.js.map +1 -0
  11. package/dist/cli.d.ts +9 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +328 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/index.d.ts +23 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +27 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/orchestrator.d.ts +63 -0
  20. package/dist/orchestrator.d.ts.map +1 -0
  21. package/dist/orchestrator.js +331 -0
  22. package/dist/orchestrator.js.map +1 -0
  23. package/dist/scanners/complexity.d.ts +48 -0
  24. package/dist/scanners/complexity.d.ts.map +1 -0
  25. package/dist/scanners/complexity.js +512 -0
  26. package/dist/scanners/complexity.js.map +1 -0
  27. package/dist/scanners/eslint.d.ts +21 -0
  28. package/dist/scanners/eslint.d.ts.map +1 -0
  29. package/dist/scanners/eslint.js +196 -0
  30. package/dist/scanners/eslint.js.map +1 -0
  31. package/dist/scanners/gitleaks.d.ts +21 -0
  32. package/dist/scanners/gitleaks.d.ts.map +1 -0
  33. package/dist/scanners/gitleaks.js +158 -0
  34. package/dist/scanners/gitleaks.js.map +1 -0
  35. package/dist/scanners/index.d.ts +56 -0
  36. package/dist/scanners/index.d.ts.map +1 -0
  37. package/dist/scanners/index.js +71 -0
  38. package/dist/scanners/index.js.map +1 -0
  39. package/dist/scanners/npm-audit.d.ts +19 -0
  40. package/dist/scanners/npm-audit.d.ts.map +1 -0
  41. package/dist/scanners/npm-audit.js +176 -0
  42. package/dist/scanners/npm-audit.js.map +1 -0
  43. package/dist/scanners/semgrep.d.ts +22 -0
  44. package/dist/scanners/semgrep.d.ts.map +1 -0
  45. package/dist/scanners/semgrep.js +175 -0
  46. package/dist/scanners/semgrep.js.map +1 -0
  47. package/dist/types.d.ts +522 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +194 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +53 -0
@@ -0,0 +1,267 @@
1
+ /**
2
+ * AI Summary Generator
3
+ *
4
+ * Uses Claude to generate intelligent summaries and recommendations
5
+ */
6
+ import Anthropic from '@anthropic-ai/sdk';
7
+ export class AISummaryGenerator {
8
+ client = null;
9
+ model;
10
+ maxTokens;
11
+ constructor(config = {}) {
12
+ const apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY;
13
+ if (apiKey) {
14
+ this.client = new Anthropic({ apiKey });
15
+ }
16
+ this.model = config.model || 'claude-sonnet-4-20250514';
17
+ this.maxTokens = config.maxTokens || 1024;
18
+ }
19
+ /**
20
+ * Check if AI summarization is available
21
+ */
22
+ isAvailable() {
23
+ return this.client !== null;
24
+ }
25
+ /**
26
+ * Generate an AI summary of the scan report
27
+ */
28
+ async generateSummary(report) {
29
+ if (!this.client) {
30
+ return 'AI summary unavailable (no API key configured)';
31
+ }
32
+ const prompt = this.buildSummaryPrompt(report);
33
+ try {
34
+ const response = await this.client.messages.create({
35
+ model: this.model,
36
+ max_tokens: this.maxTokens,
37
+ messages: [
38
+ {
39
+ role: 'user',
40
+ content: prompt
41
+ }
42
+ ]
43
+ });
44
+ const textContent = response.content.find(c => c.type === 'text');
45
+ return textContent?.text || 'Unable to generate summary';
46
+ }
47
+ catch (error) {
48
+ console.error('AI summary generation failed:', error);
49
+ return 'AI summary generation failed';
50
+ }
51
+ }
52
+ /**
53
+ * Generate AI recommendations for fixing issues
54
+ */
55
+ async generateRecommendations(report) {
56
+ if (!this.client) {
57
+ return [];
58
+ }
59
+ const prompt = this.buildRecommendationsPrompt(report);
60
+ try {
61
+ const response = await this.client.messages.create({
62
+ model: this.model,
63
+ max_tokens: this.maxTokens,
64
+ messages: [
65
+ {
66
+ role: 'user',
67
+ content: prompt
68
+ }
69
+ ]
70
+ });
71
+ const textContent = response.content.find(c => c.type === 'text');
72
+ if (!textContent?.text)
73
+ return [];
74
+ // Parse numbered recommendations
75
+ const lines = textContent.text.split('\n');
76
+ return lines
77
+ .filter(line => /^\d+\./.test(line.trim()))
78
+ .map(line => line.replace(/^\d+\.\s*/, '').trim());
79
+ }
80
+ catch (error) {
81
+ console.error('AI recommendations generation failed:', error);
82
+ return [];
83
+ }
84
+ }
85
+ /**
86
+ * Generate a PR comment summary
87
+ */
88
+ async generatePRComment(report) {
89
+ if (!this.client) {
90
+ return this.generateFallbackPRComment(report);
91
+ }
92
+ const prompt = this.buildPRCommentPrompt(report);
93
+ try {
94
+ const response = await this.client.messages.create({
95
+ model: this.model,
96
+ max_tokens: 800,
97
+ messages: [
98
+ {
99
+ role: 'user',
100
+ content: prompt
101
+ }
102
+ ]
103
+ });
104
+ const textContent = response.content.find(c => c.type === 'text');
105
+ return textContent?.text || this.generateFallbackPRComment(report);
106
+ }
107
+ catch (error) {
108
+ return this.generateFallbackPRComment(report);
109
+ }
110
+ }
111
+ /**
112
+ * Build the summary prompt
113
+ */
114
+ buildSummaryPrompt(report) {
115
+ const findingsSummary = this.summarizeFindings(report.findings);
116
+ return `You are a security and code quality expert. Analyze this code scan report and provide a concise executive summary.
117
+
118
+ ## Scan Results
119
+
120
+ **Total Findings:** ${report.summary.totalFindings}
121
+
122
+ **By Severity:**
123
+ ${Object.entries(report.summary.bySeverity)
124
+ .map(([sev, count]) => `- ${sev}: ${count}`)
125
+ .join('\n')}
126
+
127
+ **By Category:**
128
+ ${Object.entries(report.summary.byCategory)
129
+ .map(([cat, count]) => `- ${cat}: ${count}`)
130
+ .join('\n')}
131
+
132
+ **Quality Gate:** ${report.summary.passesQualityGate ? 'PASSED' : 'FAILED'}
133
+
134
+ ## Top Findings
135
+
136
+ ${findingsSummary}
137
+
138
+ ## Instructions
139
+
140
+ Provide a 2-3 paragraph executive summary that:
141
+ 1. Highlights the most critical issues that need immediate attention
142
+ 2. Identifies patterns or systemic issues in the codebase
143
+ 3. Gives an overall assessment of the code's security and quality posture
144
+
145
+ Be direct and actionable. Focus on business impact.`;
146
+ }
147
+ /**
148
+ * Build the recommendations prompt
149
+ */
150
+ buildRecommendationsPrompt(report) {
151
+ const findingsSummary = this.summarizeFindings(report.findings.slice(0, 20));
152
+ return `You are a security and code quality expert. Based on this scan report, provide prioritized recommendations.
153
+
154
+ ## Findings
155
+
156
+ ${findingsSummary}
157
+
158
+ ## Instructions
159
+
160
+ Provide exactly 5 prioritized recommendations in this format:
161
+ 1. [Priority 1 recommendation - most critical]
162
+ 2. [Priority 2 recommendation]
163
+ 3. [Priority 3 recommendation]
164
+ 4. [Priority 4 recommendation]
165
+ 5. [Priority 5 recommendation]
166
+
167
+ Each recommendation should be:
168
+ - Specific and actionable
169
+ - Include the expected impact
170
+ - Be achievable within a sprint
171
+
172
+ Focus on high-impact fixes first, then patterns that would prevent future issues.`;
173
+ }
174
+ /**
175
+ * Build the PR comment prompt
176
+ */
177
+ buildPRCommentPrompt(report) {
178
+ const critical = report.findings.filter(f => f.severity === 'critical');
179
+ const high = report.findings.filter(f => f.severity === 'high');
180
+ return `Generate a GitHub/GitLab PR comment summarizing this security scan. Use markdown formatting.
181
+
182
+ **Results:**
183
+ - Total findings: ${report.summary.totalFindings}
184
+ - Critical: ${critical.length}
185
+ - High: ${high.length}
186
+ - Quality Gate: ${report.summary.passesQualityGate ? '✅ Passed' : '❌ Failed'}
187
+
188
+ **Critical Issues:**
189
+ ${critical.slice(0, 3).map(f => `- ${f.title} in ${f.file}`).join('\n') || 'None'}
190
+
191
+ **High Priority Issues:**
192
+ ${high.slice(0, 3).map(f => `- ${f.title} in ${f.file}`).join('\n') || 'None'}
193
+
194
+ Create a concise, developer-friendly PR comment (max 300 words) that:
195
+ 1. Shows the quality gate status prominently
196
+ 2. Lists blocking issues (if any)
197
+ 3. Provides a brief action summary
198
+ 4. Uses appropriate emojis for readability
199
+
200
+ Do not include any preamble, just output the markdown comment.`;
201
+ }
202
+ /**
203
+ * Summarize findings for prompts
204
+ */
205
+ summarizeFindings(findings) {
206
+ return findings
207
+ .slice(0, 15)
208
+ .map(f => `- [${f.severity.toUpperCase()}] ${f.category}: ${f.title}
209
+ File: ${f.file}${f.line ? `:${f.line}` : ''}
210
+ ${f.description.slice(0, 200)}${f.description.length > 200 ? '...' : ''}`)
211
+ .join('\n\n');
212
+ }
213
+ /**
214
+ * Generate a fallback PR comment without AI
215
+ */
216
+ generateFallbackPRComment(report) {
217
+ const { summary, findings } = report;
218
+ const critical = findings.filter(f => f.severity === 'critical');
219
+ const high = findings.filter(f => f.severity === 'high');
220
+ const secrets = findings.filter(f => f.category === 'secret');
221
+ const gateEmoji = summary.passesQualityGate ? '✅' : '❌';
222
+ const gateText = summary.passesQualityGate ? 'Passed' : 'Failed';
223
+ let comment = `## 🔍 CodeGuard Security Scan
224
+
225
+ ### ${gateEmoji} Quality Gate: **${gateText}**
226
+
227
+ | Severity | Count |
228
+ |----------|-------|
229
+ | 🔴 Critical | ${summary.bySeverity['critical'] || 0} |
230
+ | 🟠 High | ${summary.bySeverity['high'] || 0} |
231
+ | 🟡 Medium | ${summary.bySeverity['medium'] || 0} |
232
+ | 🔵 Low | ${summary.bySeverity['low'] || 0} |
233
+
234
+ **Total Findings:** ${summary.totalFindings}
235
+ `;
236
+ if (critical.length > 0) {
237
+ comment += `
238
+ ### 🚨 Critical Issues (Blocking)
239
+
240
+ ${critical.slice(0, 5).map(f => `- **${f.title}** in \`${f.file}\`${f.line ? `:${f.line}` : ''}`).join('\n')}
241
+ `;
242
+ }
243
+ if (secrets.length > 0) {
244
+ comment += `
245
+ ### 🔑 Exposed Secrets (Blocking)
246
+
247
+ ${secrets.slice(0, 5).map(f => `- **${f.title}** in \`${f.file}\``).join('\n')}
248
+
249
+ ⚠️ **Action Required:** Rotate these credentials immediately!
250
+ `;
251
+ }
252
+ if (high.length > 0 && critical.length === 0 && secrets.length === 0) {
253
+ comment += `
254
+ ### ⚠️ High Priority Issues
255
+
256
+ ${high.slice(0, 5).map(f => `- **${f.title}** in \`${f.file}\`${f.line ? `:${f.line}` : ''}`).join('\n')}
257
+ `;
258
+ }
259
+ comment += `
260
+ ---
261
+ *Generated by CodeGuard • [View Full Report](#)*
262
+ `;
263
+ return comment;
264
+ }
265
+ }
266
+ export default AISummaryGenerator;
267
+ //# sourceMappingURL=ai-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-summary.js","sourceRoot":"","sources":["../src/ai-summary.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Vibeguard CLI
4
+ *
5
+ * Dead simple: just run `vibeguard` in your project directory
6
+ * Get a FIXES.md file to give to your AI coding agent
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/dist/cli.js ADDED
@@ -0,0 +1,328 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Vibeguard CLI
4
+ *
5
+ * Dead simple: just run `vibeguard` in your project directory
6
+ * Get a FIXES.md file to give to your AI coding agent
7
+ */
8
+ import { Command } from 'commander';
9
+ import chalk from 'chalk';
10
+ import { resolve } from 'path';
11
+ import { existsSync, writeFileSync } from 'fs';
12
+ import { exec, execSync } from 'child_process';
13
+ import { promisify } from 'util';
14
+ import { Orchestrator } from './orchestrator.js';
15
+ import { AgentReportGenerator } from './agent-report.js';
16
+ import { SCANNER_COVERAGE } from './scanners/index.js';
17
+ const execAsync = promisify(exec);
18
+ const program = new Command();
19
+ program
20
+ .name('vibeguard')
21
+ .description(`
22
+ 🛡️ Vibeguard - Security Scanner for AI Agents
23
+
24
+ Scans your code and generates FIXES.md that you can
25
+ give to Claude Code, Cursor, or any AI coding agent.
26
+
27
+ Just run: vibeguard
28
+ `)
29
+ .version('1.1.0');
30
+ // Tool installation helpers
31
+ async function checkTool(command) {
32
+ try {
33
+ await execAsync(`which ${command}`);
34
+ return true;
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ }
40
+ async function installSemgrep() {
41
+ console.log(chalk.blue('📦 Installing Semgrep...'));
42
+ try {
43
+ // Try pip first (most common)
44
+ try {
45
+ execSync('pip3 install semgrep', { stdio: 'inherit' });
46
+ return true;
47
+ }
48
+ catch {
49
+ // Try pip if pip3 fails
50
+ try {
51
+ execSync('pip install semgrep', { stdio: 'inherit' });
52
+ return true;
53
+ }
54
+ catch {
55
+ // Try brew on macOS
56
+ try {
57
+ execSync('brew install semgrep', { stdio: 'inherit' });
58
+ return true;
59
+ }
60
+ catch {
61
+ return false;
62
+ }
63
+ }
64
+ }
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ async function installGitleaks() {
71
+ console.log(chalk.blue('📦 Installing Gitleaks...'));
72
+ try {
73
+ // Try brew first (macOS)
74
+ try {
75
+ execSync('brew install gitleaks', { stdio: 'inherit' });
76
+ return true;
77
+ }
78
+ catch {
79
+ // Try downloading binary for Linux
80
+ try {
81
+ const platform = process.platform;
82
+ const arch = process.arch === 'x64' ? 'x64' : 'arm64';
83
+ if (platform === 'linux') {
84
+ execSync(`
85
+ curl -sSL https://github.com/gitleaks/gitleaks/releases/download/v8.18.4/gitleaks_8.18.4_linux_${arch}.tar.gz | tar xz -C /usr/local/bin gitleaks
86
+ `, { stdio: 'inherit' });
87
+ return true;
88
+ }
89
+ else if (platform === 'darwin') {
90
+ execSync(`
91
+ curl -sSL https://github.com/gitleaks/gitleaks/releases/download/v8.18.4/gitleaks_8.18.4_darwin_${arch}.tar.gz | tar xz -C /usr/local/bin gitleaks
92
+ `, { stdio: 'inherit' });
93
+ return true;
94
+ }
95
+ return false;
96
+ }
97
+ catch {
98
+ return false;
99
+ }
100
+ }
101
+ }
102
+ catch {
103
+ return false;
104
+ }
105
+ }
106
+ async function ensureToolsInstalled(quiet = false) {
107
+ const hasSemgrep = await checkTool('semgrep');
108
+ const hasGitleaks = await checkTool('gitleaks');
109
+ if (hasSemgrep && hasGitleaks) {
110
+ return; // All good
111
+ }
112
+ if (!quiet) {
113
+ console.log(chalk.yellow('\n⚠️ Some scanning tools are missing. Installing...\n'));
114
+ }
115
+ if (!hasSemgrep) {
116
+ const installed = await installSemgrep();
117
+ if (installed) {
118
+ console.log(chalk.green('✓ Semgrep installed'));
119
+ }
120
+ else {
121
+ console.log(chalk.yellow('⚠ Could not install Semgrep automatically.'));
122
+ console.log(chalk.gray(' Install manually: pip install semgrep'));
123
+ }
124
+ }
125
+ if (!hasGitleaks) {
126
+ const installed = await installGitleaks();
127
+ if (installed) {
128
+ console.log(chalk.green('✓ Gitleaks installed'));
129
+ }
130
+ else {
131
+ console.log(chalk.yellow('⚠ Could not install Gitleaks automatically.'));
132
+ console.log(chalk.gray(' Install manually: brew install gitleaks'));
133
+ }
134
+ }
135
+ if (!quiet) {
136
+ console.log('');
137
+ }
138
+ }
139
+ // Default action - just scan current directory
140
+ program
141
+ .argument('[path]', 'Path to scan (default: current directory)', '.')
142
+ .option('-o, --output <file>', 'Also save full report to file')
143
+ .option('-f, --format <format>', 'Report format: json, markdown, sarif', 'json')
144
+ .option('--no-fixes', 'Skip generating FIXES.md')
145
+ .option('--json', 'Output JSON only (no FIXES.md)')
146
+ .option('--ci', 'CI mode: fail on high/critical issues')
147
+ .option('-q, --quiet', 'Minimal output')
148
+ .option('--skip-install', 'Skip auto-installing missing tools')
149
+ .action(async (path, options) => {
150
+ // Auto-install tools on first run (unless skipped)
151
+ if (!options.skipInstall) {
152
+ await ensureToolsInstalled(options.quiet || options.json);
153
+ }
154
+ await runScan(path, options);
155
+ });
156
+ // Setup command - explicitly install tools
157
+ program
158
+ .command('setup')
159
+ .description('Install required scanning tools (Semgrep, Gitleaks)')
160
+ .action(async () => {
161
+ console.log(chalk.bold('\n🔧 Vibeguard Setup\n'));
162
+ await ensureToolsInstalled(false);
163
+ console.log(chalk.green('✓ Setup complete!\n'));
164
+ });
165
+ // Check command - verify tools are installed
166
+ program
167
+ .command('check')
168
+ .description('Check which scanning tools are installed')
169
+ .action(async () => {
170
+ console.log(chalk.bold('\n🔍 Checking available scanners...\n'));
171
+ const orchestrator = new Orchestrator();
172
+ const available = await orchestrator.checkScanners();
173
+ for (const [name, isAvailable] of Object.entries(available)) {
174
+ const status = isAvailable
175
+ ? chalk.green('✓ installed')
176
+ : chalk.yellow('○ not found');
177
+ console.log(` ${name}: ${status}`);
178
+ }
179
+ const allInstalled = Object.values(available).every(v => v);
180
+ if (!allInstalled) {
181
+ console.log(chalk.cyan('\nRun `vibeguard setup` to install missing tools.\n'));
182
+ }
183
+ else {
184
+ console.log(chalk.green('\n✓ All tools installed!\n'));
185
+ }
186
+ });
187
+ // List scanners
188
+ program
189
+ .command('info')
190
+ .description('Show what Vibeguard scans for')
191
+ .action(() => {
192
+ console.log(chalk.bold('\n🛡️ Vibeguard Scanners\n'));
193
+ for (const [name, info] of Object.entries(SCANNER_COVERAGE)) {
194
+ console.log(chalk.cyan.bold(` ${name}`));
195
+ console.log(chalk.white(` ${info.description}`));
196
+ console.log(chalk.gray(` Finds: ${info.categories.join(', ')}`));
197
+ console.log();
198
+ }
199
+ });
200
+ // The scan logic
201
+ async function runScan(path, options) {
202
+ const targetPath = resolve(path);
203
+ const quiet = options.quiet || options.json;
204
+ if (!existsSync(targetPath)) {
205
+ console.error(chalk.red(`Error: Path not found: ${targetPath}`));
206
+ process.exit(1);
207
+ }
208
+ if (!quiet) {
209
+ console.log(chalk.bold('\n🛡️ Vibeguard Security Scan\n'));
210
+ console.log(chalk.gray(` Scanning: ${targetPath}\n`));
211
+ }
212
+ const orchestrator = new Orchestrator({
213
+ parallel: true,
214
+ verbose: !quiet
215
+ });
216
+ try {
217
+ const report = await orchestrator.scan({ path: targetPath });
218
+ // Summary
219
+ const critical = report.summary.bySeverity['critical'] || 0;
220
+ const high = report.summary.bySeverity['high'] || 0;
221
+ const medium = report.summary.bySeverity['medium'] || 0;
222
+ const low = report.summary.bySeverity['low'] || 0;
223
+ if (!quiet) {
224
+ console.log(chalk.bold('\n📊 Results\n'));
225
+ if (critical > 0)
226
+ console.log(chalk.red(` 🔴 Critical: ${critical}`));
227
+ if (high > 0)
228
+ console.log(chalk.yellow(` 🟠 High: ${high}`));
229
+ if (medium > 0)
230
+ console.log(chalk.blue(` 🟡 Medium: ${medium}`));
231
+ if (low > 0)
232
+ console.log(chalk.gray(` 🔵 Low: ${low}`));
233
+ if (report.findings.length === 0) {
234
+ console.log(chalk.green(' ✨ No issues found!'));
235
+ }
236
+ }
237
+ // Generate FIXES.md (unless disabled)
238
+ if (options.fixes !== false && !options.json && report.findings.length > 0) {
239
+ const fixesPath = resolve(targetPath, 'FIXES.md');
240
+ const agentGenerator = new AgentReportGenerator();
241
+ agentGenerator.generateAndSave(report, fixesPath, {
242
+ includeSnippets: true,
243
+ groupByFile: true
244
+ });
245
+ if (!quiet) {
246
+ console.log(chalk.green(`\n✅ Created: FIXES.md`));
247
+ console.log(chalk.cyan(` Give this file to Claude Code or Cursor to fix the issues\n`));
248
+ }
249
+ }
250
+ // Save full report if requested
251
+ if (options.output) {
252
+ const outputPath = resolve(options.output);
253
+ if (options.format === 'markdown') {
254
+ writeFileSync(outputPath, generateMarkdown(report));
255
+ }
256
+ else if (options.format === 'sarif') {
257
+ writeFileSync(outputPath, JSON.stringify(generateSarif(report), null, 2));
258
+ }
259
+ else {
260
+ writeFileSync(outputPath, JSON.stringify(report, null, 2));
261
+ }
262
+ if (!quiet) {
263
+ console.log(chalk.gray(` Report saved: ${outputPath}`));
264
+ }
265
+ }
266
+ // JSON only mode
267
+ if (options.json) {
268
+ console.log(JSON.stringify(report, null, 2));
269
+ }
270
+ // CI mode - exit with error if issues found
271
+ if (options.ci && (critical > 0 || high > 0)) {
272
+ process.exit(1);
273
+ }
274
+ }
275
+ catch (error) {
276
+ console.error(chalk.red('\n❌ Scan failed:'), error);
277
+ process.exit(1);
278
+ }
279
+ }
280
+ // Simple markdown report
281
+ function generateMarkdown(report) {
282
+ let md = `# Vibeguard Security Report\n\n`;
283
+ md += `**Scanned:** ${report.target.path}\n`;
284
+ md += `**Date:** ${new Date(report.timestamp).toLocaleString()}\n\n`;
285
+ md += `## Summary\n\n`;
286
+ md += `- Critical: ${report.summary.bySeverity['critical'] || 0}\n`;
287
+ md += `- High: ${report.summary.bySeverity['high'] || 0}\n`;
288
+ md += `- Medium: ${report.summary.bySeverity['medium'] || 0}\n`;
289
+ md += `- Low: ${report.summary.bySeverity['low'] || 0}\n\n`;
290
+ if (report.findings.length > 0) {
291
+ md += `## Findings\n\n`;
292
+ for (const f of report.findings) {
293
+ md += `### ${f.severity.toUpperCase()}: ${f.title}\n`;
294
+ md += `- File: \`${f.file}:${f.line || ''}\`\n`;
295
+ md += `- ${f.description}\n\n`;
296
+ }
297
+ }
298
+ return md;
299
+ }
300
+ // SARIF format for GitHub
301
+ function generateSarif(report) {
302
+ return {
303
+ $schema: "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
304
+ version: "2.1.0",
305
+ runs: [{
306
+ tool: {
307
+ driver: {
308
+ name: "Vibeguard",
309
+ version: "1.0.0",
310
+ informationUri: "https://github.com/darrenjcoxon/vibeguard"
311
+ }
312
+ },
313
+ results: report.findings.map(f => ({
314
+ ruleId: f.ruleId || f.title,
315
+ level: f.severity === 'critical' || f.severity === 'high' ? 'error' : 'warning',
316
+ message: { text: f.description },
317
+ locations: [{
318
+ physicalLocation: {
319
+ artifactLocation: { uri: f.file },
320
+ region: { startLine: f.line || 1 }
321
+ }
322
+ }]
323
+ }))
324
+ }]
325
+ };
326
+ }
327
+ program.parse();
328
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * CodeGuard - AI-Powered Code Security & Quality Scanner
3
+ *
4
+ * A pluggable orchestrator that combines multiple security and quality
5
+ * scanning tools with AI-powered analysis.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { Orchestrator, ScanTarget } from 'codeguard';
10
+ *
11
+ * const orchestrator = new Orchestrator();
12
+ * const target: ScanTarget = { path: './my-project' };
13
+ * const report = await orchestrator.scan(target);
14
+ * ```
15
+ */
16
+ export { Orchestrator, type OrchestratorConfig } from './orchestrator.js';
17
+ export { AISummaryGenerator, type AISummaryConfig } from './ai-summary.js';
18
+ export { AgentReportGenerator, type AgentReportOptions } from './agent-report.js';
19
+ export { type Finding, type ScanTarget, type ScanReport, type ScannerResult, type ScannerConfig, type Scanner, type Reporter, type QualityGate, type SeverityLevel, type FindingCategory, DEFAULT_QUALITY_GATE, generateFingerprint, severityWeight } from './types.js';
20
+ export { SemgrepScanner, GitleaksScanner, NpmAuditScanner, ESLintScanner, ComplexityScanner, getAllScanners, getScannersByCategory, SCANNER_COVERAGE } from './scanners/index.js';
21
+ import { Orchestrator } from './orchestrator.js';
22
+ export default Orchestrator;
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGlF,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,eAAe,YAAY,CAAC"}