devrail 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/cli/commands/check.ts","../../src/cli/commands/explain.ts","../../src/cli/commands/ci.ts","../../src/cli/commands/baseline.ts","../../src/cli/commands/fix.ts","../../src/cli/commands/watch.ts","../../src/cli/commands/report.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { initCommand } from './commands/init.js';\nimport { checkCommand } from './commands/check.js';\nimport { explainCommand } from './commands/explain.js';\nimport { ciCommand } from './commands/ci.js';\nimport { autofixCommand } from './commands/autofix.js';\nimport { baselineCommand } from './commands/baseline.js';\nimport { fixCommand } from './commands/fix.js';\nimport { watchCommand } from './commands/watch.js';\nimport { reportCommand } from './commands/report.js';\n\nconst program = new Command();\n\nprogram\n .name('dr')\n .description('Devrail - Security & Quality Guardrails')\n .version('0.1.0');\n\nprogram\n .command('init')\n .description('Initialize Devrail in your project')\n .option('-p, --preset <preset>', 'Preset to use (auto-detected if not specified)')\n .option('-l, --level <level>', 'Level (basic, standard, strict)', 'standard')\n .option('--no-hooks', 'Skip git hooks setup')\n .option('--no-ci', 'Skip CI template generation')\n .action(initCommand);\n\nprogram\n .command('check')\n .description('Run local checks (fast)')\n .option('-f, --fix', 'Apply safe autofixes')\n .option('--changed', 'Only check changed files')\n .option('--json', 'Output as JSON')\n .action(checkCommand);\n\nprogram\n .command('ci')\n .description('Run full CI checks (blocking)')\n .option('--fail-on <severity>', 'Fail on severity level (info, warn, error)', 'error')\n .option('--format <format>', 'Output format (console, json, sarif)', 'console')\n .option('--new-only', 'Only fail on NEW issues (not baselined)', true)\n .option('--no-new-only', 'Fail on ALL issues (ignore baseline)')\n .option('--diff-only', 'Only check changed files')\n .action(ciCommand);\n\nprogram\n .command('explain <ruleId>')\n .description('Explain a rule and how to fix it')\n .action(explainCommand);\n\nprogram\n .command('fix')\n .description('Apply safe auto-fixes')\n .option('--dry-run', 'Show what would be fixed without applying')\n .option('--all', 'Include fixes that need review')\n .action(fixCommand);\n\nprogram\n .command('baseline')\n .description('Accept existing issues, block only new ones')\n .option('--update', 'Update existing baseline with current issues')\n .option('--show', 'Show current baseline status')\n .action(baselineCommand);\n\nprogram\n .command('guard')\n .alias('watch')\n .description('Watch mode - continuous feedback while coding')\n .option('--debounce <ms>', 'Debounce interval in milliseconds', '500')\n .action(watchCommand);\n\nprogram\n .command('report')\n .description('Generate security posture report')\n .option('--format <format>', 'Output format (console, json, markdown)', 'console')\n .option('-o, --output <file>', 'Output file path')\n .action(reportCommand);\n\nprogram\n .command('rules')\n .description('List all available rules')\n .option('-c, --category <category>', 'Filter by category')\n .option('-l, --level <level>', 'Filter by level')\n .action(async (options) => {\n const { rules } = await import('../rules/index.js');\n\n let filtered = rules;\n\n if (options.category) {\n filtered = filtered.filter((r) => r.category === options.category);\n }\n\n if (options.level) {\n filtered = filtered.filter((r) => r.levels[options.level as keyof typeof r.levels]);\n }\n\n console.log(chalk.bold('\\nDevrail Rules\\n'));\n\n const categories = [...new Set(filtered.map((r) => r.category))];\n\n for (const category of categories) {\n console.log(chalk.cyan.bold(`\\n${category.toUpperCase()}`));\n const categoryRules = filtered.filter((r) => r.category === category);\n\n for (const rule of categoryRules) {\n const severityColor =\n rule.severity === 'error' ? chalk.red : rule.severity === 'warn' ? chalk.yellow : chalk.blue;\n const autofix = rule.autofix ? chalk.green(' [autofix]') : '';\n console.log(` ${severityColor('ā—')} ${chalk.bold(rule.id)}${autofix}`);\n console.log(` ${chalk.dim(rule.description)}`);\n }\n }\n\n console.log(`\\n${chalk.dim(`Total: ${filtered.length} rules`)}\\n`);\n });\n\nprogram.parse();\n","import { writeFile, mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport type { Preset, Level } from '../../types/index.js';\nimport { getPreset } from '../../presets/index.js';\nimport { detectStack } from '../../engine/stack-detector.js';\nimport { runBuiltinChecks } from '../../tools/builtin.js';\n\ninterface InitOptions {\n preset?: string;\n level: string;\n hooks: boolean;\n ci: boolean;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n console.log(chalk.bold.cyan('\\nšŸ›¤ļø Devrail - Security & Quality Guardrails\\n'));\n\n const spinner = ora('Detecting your stack...').start();\n\n try {\n // Auto-detect stack if no preset specified\n const detected = await detectStack(cwd);\n const preset = (options.preset as Preset) ?? detected.preset;\n const level = options.level as Level;\n\n spinner.succeed(chalk.green('Stack detected!'));\n\n // Show detection results\n console.log('\\n' + chalk.bold('šŸ“¦ Project Analysis:'));\n console.log(` Language: ${chalk.cyan(detected.language)}`);\n if (detected.framework) {\n console.log(` Framework: ${chalk.cyan(detected.framework)}`);\n }\n console.log(` Preset: ${chalk.cyan(preset)} ${detected.confidence < 80 ? chalk.dim('(suggested)') : ''}`);\n console.log(` TypeScript: ${detected.hasTypeScript ? chalk.green('āœ“') : chalk.dim('āœ—')}`);\n console.log(` Tests: ${detected.hasTests ? chalk.green('āœ“') : chalk.yellow('āœ— missing')}`);\n console.log(` CI/CD: ${detected.hasCi ? chalk.green('āœ“') : chalk.yellow('āœ— missing')}`);\n\n // Quick scan for \"wow moment\"\n spinner.start('Running quick security scan...');\n const quickResults = await runBuiltinChecks(cwd, [\n 'secrets.gitignore-required',\n 'secrets.no-env-commit',\n 'deps.lockfile.required',\n 'deps.no-unpinned',\n 'tests.unit.required',\n 'code.strict-mode',\n 'config.node-version',\n ]);\n spinner.stop();\n\n // Show issues found (the \"wow moment\")\n const errors = quickResults.filter((r) => r.severity === 'error');\n const warnings = quickResults.filter((r) => r.severity === 'warn');\n\n if (quickResults.length > 0 || detected.issues.length > 0) {\n console.log('\\n' + chalk.bold.yellow('āš ļø Issues Found:'));\n\n for (const issue of detected.issues) {\n console.log(` ${chalk.red('ā—')} ${issue}`);\n }\n for (const result of errors) {\n console.log(` ${chalk.red('ā—')} ${result.message}`);\n }\n for (const result of warnings.slice(0, 5)) {\n console.log(` ${chalk.yellow('ā—')} ${result.message}`);\n }\n if (warnings.length > 5) {\n console.log(chalk.dim(` ... and ${warnings.length - 5} more warnings`));\n }\n }\n\n // Create config\n spinner.start('Creating configuration...');\n await createConfigFile(cwd, preset, level);\n\n if (options.hooks) {\n spinner.text = 'Setting up git hooks...';\n await setupGitHooks(cwd);\n }\n\n if (options.ci && !detected.hasCi) {\n spinner.text = 'Creating CI templates...';\n await createCITemplates(cwd, preset, level);\n }\n\n await updateGitignore(cwd);\n spinner.succeed(chalk.green('Devrail initialized!'));\n\n // Show next actions (max 3)\n const presetConfig = getPreset(preset);\n console.log('\\n' + chalk.bold('šŸš€ Next Actions:'));\n\n if (errors.length > 0 || warnings.length > 0) {\n console.log(` 1. ${chalk.cyan('npx devrail fix')} Fix ${errors.length + Math.min(warnings.length, 5)} auto-fixable issues`);\n console.log(` 2. ${chalk.cyan('npx devrail baseline')} Accept existing issues, block new ones`);\n console.log(` 3. ${chalk.cyan('npx devrail ci')} Run full CI check`);\n } else {\n console.log(` 1. ${chalk.cyan('npx devrail check')} Run security scan`);\n console.log(` 2. ${chalk.cyan('npx devrail ci')} Run full CI check`);\n }\n\n console.log('\\n' + chalk.dim(`Config: devrail.config.yaml | ${presetConfig.rules[level]?.length ?? 0} rules active\\n`));\n } catch (error) {\n spinner.fail(chalk.red('Initialization failed'));\n console.error(error);\n process.exit(1);\n }\n}\n\nasync function createConfigFile(cwd: string, preset: Preset, level: Level): Promise<void> {\n const config = `# Devrail Configuration\n# Docs: https://devrail.dev/docs/config\n\ndevrail:\n preset: \"${preset}\"\n level: \"${level}\"\n\n # Baseline: accept existing issues, block new ones\n baseline: \".devrail/baseline.json\"\n\n # Override specific rules (optional)\n # rules:\n # secrets.no-plaintext:\n # enabled: true\n # severity: error\n # deps.no-unpinned:\n # enabled: false\n\n # CI configuration\n ci:\n failOn: error\n # Only fail on NEW issues (not baselined)\n newOnly: true\n reportFormat: console\n\n # Tool toggles\n tools:\n eslint: true\n semgrep: true\n gitleaks: true\n osvScanner: true\n`;\n\n await writeFile(join(cwd, 'devrail.config.yaml'), config, 'utf-8');\n}\n\nasync function setupGitHooks(cwd: string): Promise<void> {\n const hooksDir = join(cwd, '.husky');\n\n try {\n await mkdir(hooksDir, { recursive: true });\n\n const preCommitHook = `#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\nnpx devrail check --changed\n`;\n\n await writeFile(join(hooksDir, 'pre-commit'), preCommitHook, { mode: 0o755 });\n\n const prePushHook = `#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\nnpx devrail ci\n`;\n\n await writeFile(join(hooksDir, 'pre-push'), prePushHook, { mode: 0o755 });\n } catch {\n // Husky might not be set up, create simple git hooks\n const gitHooksDir = join(cwd, '.git', 'hooks');\n\n try {\n const preCommitHook = `#!/usr/bin/env sh\nnpx devrail check --changed\n`;\n await writeFile(join(gitHooksDir, 'pre-commit'), preCommitHook, { mode: 0o755 });\n } catch {\n // Git hooks dir might not exist, skip\n }\n }\n}\n\nasync function createCITemplates(cwd: string, preset: Preset, level: Level): Promise<void> {\n const githubDir = join(cwd, '.github', 'workflows');\n await mkdir(githubDir, { recursive: true });\n\n const workflow = `name: VibeGuard Security & Quality\n\non:\n push:\n branches: [main, master]\n pull_request:\n branches: [main, master]\n\njobs:\n vibeguard:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n cache: 'npm'\n\n - name: Install dependencies\n run: npm ci\n\n - name: Install security tools\n run: |\n # Install gitleaks\n curl -sSfL https://github.com/gitleaks/gitleaks/releases/download/v8.18.0/gitleaks_8.18.0_linux_x64.tar.gz | tar -xz\n sudo mv gitleaks /usr/local/bin/\n\n # Install osv-scanner\n curl -sSfL https://github.com/google/osv-scanner/releases/download/v1.7.0/osv-scanner_linux_amd64 -o osv-scanner\n chmod +x osv-scanner\n sudo mv osv-scanner /usr/local/bin/\n\n # Install semgrep\n pip install semgrep\n\n - name: Run VibeGuard CI\n run: npx vg ci --format sarif > vibeguard-results.sarif\n continue-on-error: true\n\n - name: Upload SARIF results\n uses: github/codeql-action/upload-sarif@v3\n with:\n sarif_file: vibeguard-results.sarif\n if: always()\n\n - name: Run VibeGuard CI (blocking)\n run: npx vg ci --fail-on error\n`;\n\n await writeFile(join(githubDir, 'vibeguard.yml'), workflow, 'utf-8');\n}\n\nasync function updateGitignore(cwd: string): Promise<void> {\n const gitignorePath = join(cwd, '.gitignore');\n const entries = `\n# VibeGuard\n.vibeguard-cache/\nvibeguard-report.json\nvibeguard-report.sarif\n`;\n\n try {\n const { readFile } = await import('node:fs/promises');\n const existing = await readFile(gitignorePath, 'utf-8');\n if (!existing.includes('.vibeguard-cache')) {\n await writeFile(gitignorePath, existing + entries, 'utf-8');\n }\n } catch {\n await writeFile(gitignorePath, entries.trim() + '\\n', 'utf-8');\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { loadConfig, getDefaultConfig } from '../../engine/config-loader.js';\nimport { resolveRules, groupRulesByTool, calculateScore } from '../../engine/rule-engine.js';\nimport { gitleaksRunner, semgrepRunner, osvScannerRunner, runBuiltinChecks } from '../../tools/index.js';\nimport type { CheckResult, CheckReport } from '../../types/index.js';\n\ninterface CheckOptions {\n fix?: boolean;\n changed?: boolean;\n json?: boolean;\n}\n\nexport async function checkCommand(options: CheckOptions): Promise<void> {\n const cwd = process.cwd();\n const startTime = Date.now();\n\n const spinner = options.json ? null : ora('Loading configuration...').start();\n\n try {\n const loaded = await loadConfig(cwd);\n const config = loaded?.config ?? getDefaultConfig();\n\n if (spinner) spinner.text = 'Resolving rules...';\n const resolvedRules = resolveRules(config);\n const rulesByTool = groupRulesByTool(resolvedRules);\n\n const allResults: CheckResult[] = [];\n const toolStats: CheckReport['tools'] = [];\n\n if (spinner) spinner.text = 'Running builtin checks...';\n const builtinRules = rulesByTool.get('builtin') ?? [];\n if (builtinRules.length > 0) {\n const builtinStart = Date.now();\n const builtinResults = await runBuiltinChecks(\n cwd,\n builtinRules.map((r) => r.definition.id)\n );\n allResults.push(...builtinResults);\n toolStats.push({\n name: 'builtin',\n duration: Date.now() - builtinStart,\n results: builtinResults.length,\n });\n }\n\n if (config.tools?.gitleaks !== false) {\n if (spinner) spinner.text = 'Running gitleaks (secret scanning)...';\n const isInstalled = await gitleaksRunner.isInstalled();\n if (isInstalled) {\n const toolStart = Date.now();\n const results = await gitleaksRunner.run(cwd);\n allResults.push(...results);\n toolStats.push({\n name: 'gitleaks',\n version: (await gitleaksRunner.getVersion()) ?? undefined,\n duration: Date.now() - toolStart,\n results: results.length,\n });\n } else if (spinner) {\n spinner.warn(chalk.yellow('gitleaks not installed, skipping secret scanning'));\n spinner.start();\n }\n }\n\n if (config.tools?.osvScanner !== false) {\n if (spinner) spinner.text = 'Running osv-scanner (dependency vulnerabilities)...';\n const isInstalled = await osvScannerRunner.isInstalled();\n if (isInstalled) {\n const toolStart = Date.now();\n const results = await osvScannerRunner.run(cwd);\n allResults.push(...results);\n toolStats.push({\n name: 'osv-scanner',\n version: (await osvScannerRunner.getVersion()) ?? undefined,\n duration: Date.now() - toolStart,\n results: results.length,\n });\n } else if (spinner) {\n spinner.warn(chalk.yellow('osv-scanner not installed, skipping dependency scanning'));\n spinner.start();\n }\n }\n\n if (config.tools?.semgrep !== false) {\n if (spinner) spinner.text = 'Running semgrep (SAST)...';\n const isInstalled = await semgrepRunner.isInstalled();\n if (isInstalled) {\n const toolStart = Date.now();\n const results = await semgrepRunner.run(cwd);\n allResults.push(...results);\n toolStats.push({\n name: 'semgrep',\n version: (await semgrepRunner.getVersion()) ?? undefined,\n duration: Date.now() - toolStart,\n results: results.length,\n });\n } else if (spinner) {\n spinner.warn(chalk.yellow('semgrep not installed, skipping SAST'));\n spinner.start();\n }\n }\n\n const duration = Date.now() - startTime;\n const score = calculateScore(allResults);\n\n const report: CheckReport = {\n timestamp: new Date().toISOString(),\n duration,\n preset: config.preset,\n level: config.level ?? 'standard',\n summary: {\n total: allResults.length,\n errors: allResults.filter((r) => r.severity === 'error').length,\n warnings: allResults.filter((r) => r.severity === 'warn').length,\n infos: allResults.filter((r) => r.severity === 'info').length,\n fixed: 0,\n },\n score,\n results: allResults,\n tools: toolStats,\n };\n\n if (options.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n\n if (spinner) spinner.stop();\n\n printReport(report);\n\n if (report.summary.errors > 0) {\n process.exit(1);\n }\n } catch (error) {\n if (spinner) spinner.fail(chalk.red('Check failed'));\n console.error(error);\n process.exit(1);\n }\n}\n\nfunction printReport(report: CheckReport): void {\n console.log('\\n' + chalk.bold('Devrail Check Results'));\n console.log(chalk.dim('─'.repeat(50)));\n\n const scoreColor = report.score >= 80 ? chalk.green : report.score >= 50 ? chalk.yellow : chalk.red;\n console.log(`\\nScore: ${scoreColor.bold(report.score + '/100')}`);\n\n console.log(`\\nSummary:`);\n console.log(` ${chalk.red('ā—')} Errors: ${report.summary.errors}`);\n console.log(` ${chalk.yellow('ā—')} Warnings: ${report.summary.warnings}`);\n console.log(` ${chalk.blue('ā—')} Info: ${report.summary.infos}`);\n\n if (report.results.length > 0) {\n console.log('\\n' + chalk.bold('Issues:'));\n\n const grouped = new Map<string, CheckResult[]>();\n for (const result of report.results) {\n const key = result.file ?? 'General';\n const existing = grouped.get(key) ?? [];\n existing.push(result);\n grouped.set(key, existing);\n }\n\n for (const [file, results] of grouped) {\n console.log(`\\n ${chalk.cyan(file)}`);\n for (const result of results) {\n const severityIcon =\n result.severity === 'error'\n ? chalk.red('āœ–')\n : result.severity === 'warn'\n ? chalk.yellow('⚠')\n : chalk.blue('ℹ');\n const location = result.line ? `:${result.line}` : '';\n console.log(` ${severityIcon} ${result.message}`);\n console.log(` ${chalk.dim(result.ruleId)}${chalk.dim(location)}`);\n }\n }\n } else {\n console.log('\\n' + chalk.green('āœ“ All clear! No issues found.'));\n }\n\n console.log('\\n' + chalk.dim(`Duration: ${report.duration}ms`));\n console.log(chalk.dim(`Tools: ${report.tools.map((t) => t.name).join(', ')}`));\n console.log();\n}\n","import chalk from 'chalk';\nimport { getRuleById } from '../../rules/index.js';\n\nexport async function explainCommand(ruleId: string): Promise<void> {\n const rule = getRuleById(ruleId);\n\n if (!rule) {\n console.error(chalk.red(`Rule not found: ${ruleId}`));\n console.log(chalk.dim('\\nRun `vg rules` to see all available rules.'));\n process.exit(1);\n }\n\n console.log('\\n' + chalk.bold.cyan(`Rule: ${rule.id}`));\n console.log(chalk.dim('─'.repeat(50)));\n\n console.log(`\\n${chalk.bold('Name:')} ${rule.name}`);\n console.log(`${chalk.bold('Category:')} ${rule.category}`);\n\n const severityColor =\n rule.severity === 'error' ? chalk.red : rule.severity === 'warn' ? chalk.yellow : chalk.blue;\n console.log(`${chalk.bold('Severity:')} ${severityColor(rule.severity)}`);\n\n console.log(`${chalk.bold('Blocking:')} ${rule.blocking ? chalk.red('Yes') : chalk.green('No')}`);\n console.log(`${chalk.bold('Autofix:')} ${rule.autofix ? chalk.green('Yes') : chalk.dim('No')}`);\n console.log(`${chalk.bold('Tool:')} ${rule.tool}`);\n\n console.log(`\\n${chalk.bold('Description:')}`);\n console.log(` ${rule.description}`);\n\n console.log(`\\n${chalk.bold('Why this matters:')}`);\n console.log(` ${rule.rationale}`);\n\n console.log(`\\n${chalk.bold('How to fix:')}`);\n console.log(` ${rule.fix}`);\n\n if (rule.examples) {\n console.log(`\\n${chalk.bold('Examples:')}`);\n if (rule.examples.bad) {\n console.log(`\\n ${chalk.red('āœ– Bad:')}`);\n console.log(chalk.dim(' ```'));\n console.log(` ${rule.examples.bad.split('\\n').join('\\n ')}`);\n console.log(chalk.dim(' ```'));\n }\n if (rule.examples.good) {\n console.log(`\\n ${chalk.green('āœ“ Good:')}`);\n console.log(chalk.dim(' ```'));\n console.log(` ${rule.examples.good.split('\\n').join('\\n ')}`);\n console.log(chalk.dim(' ```'));\n }\n }\n\n console.log(`\\n${chalk.bold('Active in levels:')}`);\n const levels = [];\n if (rule.levels.basic) levels.push(chalk.green('basic'));\n if (rule.levels.standard) levels.push(chalk.yellow('standard'));\n if (rule.levels.strict) levels.push(chalk.red('strict'));\n console.log(` ${levels.join(', ')}`);\n\n console.log(`\\n${chalk.dim(`Docs: ${rule.docs}`)}\\n`);\n}\n","import chalk from 'chalk';\nimport { loadConfig, getDefaultConfig } from '../../engine/config-loader.js';\nimport { resolveRules, groupRulesByTool, calculateScore, shouldFail } from '../../engine/rule-engine.js';\nimport { loadBaseline, filterNewIssues, getBaselineStats } from '../../engine/baseline.js';\nimport { getChangedFiles, filterResultsByFiles } from '../../engine/diff-mode.js';\nimport { gitleaksRunner, semgrepRunner, osvScannerRunner, runBuiltinChecks } from '../../tools/index.js';\nimport type { CheckResult, CheckReport, RuleSeverity } from '../../types/index.js';\n\ninterface CIOptions {\n failOn?: string;\n format?: string;\n newOnly?: boolean;\n diffOnly?: boolean;\n}\n\ninterface CIReport extends CheckReport {\n baseline?: {\n total: number;\n new: number;\n baselined: number;\n fixed: number;\n };\n newIssues: CheckResult[];\n diffOnly: boolean;\n changedFiles: number;\n}\n\nexport async function ciCommand(options: CIOptions): Promise<void> {\n const cwd = process.cwd();\n const startTime = Date.now();\n const failOn = (options.failOn ?? 'error') as RuleSeverity;\n const format = options.format ?? 'console';\n const useBaseline = options.newOnly ?? true; // Default: only fail on NEW issues\n const useDiffOnly = options.diffOnly ?? false;\n\n try {\n const loaded = await loadConfig(cwd);\n const config = loaded?.config ?? getDefaultConfig();\n\n // Load baseline for PR gate\n const baseline = useBaseline ? await loadBaseline(cwd) : null;\n\n // Get changed files for diff-only mode\n const changedFiles = useDiffOnly ? await getChangedFiles(cwd) : [];\n\n const resolvedRules = resolveRules(config);\n const rulesByTool = groupRulesByTool(resolvedRules);\n\n const allResults: CheckResult[] = [];\n const toolStats: CheckReport['tools'] = [];\n\n const builtinRules = rulesByTool.get('builtin') ?? [];\n if (builtinRules.length > 0) {\n const builtinStart = Date.now();\n const builtinResults = await runBuiltinChecks(\n cwd,\n builtinRules.map((r) => r.definition.id)\n );\n allResults.push(...builtinResults);\n toolStats.push({\n name: 'builtin',\n duration: Date.now() - builtinStart,\n results: builtinResults.length,\n });\n }\n\n if (config.tools?.gitleaks !== false) {\n const isInstalled = await gitleaksRunner.isInstalled();\n if (isInstalled) {\n const toolStart = Date.now();\n const results = await gitleaksRunner.run(cwd);\n allResults.push(...results);\n toolStats.push({\n name: 'gitleaks',\n version: (await gitleaksRunner.getVersion()) ?? undefined,\n duration: Date.now() - toolStart,\n results: results.length,\n });\n }\n }\n\n if (config.tools?.osvScanner !== false) {\n const isInstalled = await osvScannerRunner.isInstalled();\n if (isInstalled) {\n const toolStart = Date.now();\n const results = await osvScannerRunner.run(cwd);\n allResults.push(...results);\n toolStats.push({\n name: 'osv-scanner',\n version: (await osvScannerRunner.getVersion()) ?? undefined,\n duration: Date.now() - toolStart,\n results: results.length,\n });\n }\n }\n\n if (config.tools?.semgrep !== false) {\n const isInstalled = await semgrepRunner.isInstalled();\n if (isInstalled) {\n const toolStart = Date.now();\n const results = await semgrepRunner.run(cwd);\n allResults.push(...results);\n toolStats.push({\n name: 'semgrep',\n version: (await semgrepRunner.getVersion()) ?? undefined,\n duration: Date.now() - toolStart,\n results: results.length,\n });\n }\n }\n\n // Apply diff-only filter if enabled\n const filteredResults: CheckResult[] = useDiffOnly && changedFiles.length > 0\n ? filterResultsByFiles(allResults, changedFiles) as CheckResult[]\n : allResults;\n\n // Apply baseline filter - only NEW issues will cause failure\n const newIssues = filterNewIssues(filteredResults, baseline);\n const baselineStats = getBaselineStats(allResults, baseline);\n\n const duration = Date.now() - startTime;\n const score = calculateScore(allResults); // Score on ALL issues\n\n const report: CIReport = {\n timestamp: new Date().toISOString(),\n duration,\n preset: config.preset,\n level: config.level ?? 'standard',\n summary: {\n total: allResults.length,\n errors: allResults.filter((r) => r.severity === 'error').length,\n warnings: allResults.filter((r) => r.severity === 'warn').length,\n infos: allResults.filter((r) => r.severity === 'info').length,\n fixed: 0,\n },\n score,\n results: allResults,\n tools: toolStats,\n // PR Gate stats\n baseline: baseline ? {\n total: baselineStats.total,\n new: baselineStats.new,\n baselined: baselineStats.baselined,\n fixed: baselineStats.fixed,\n } : undefined,\n newIssues,\n diffOnly: useDiffOnly,\n changedFiles: changedFiles.length,\n };\n\n if (format === 'json') {\n console.log(JSON.stringify(report, null, 2));\n } else if (format === 'sarif') {\n console.log(JSON.stringify(toSarif(report), null, 2));\n } else {\n printCIReport(report, useBaseline);\n }\n\n // PR Gate: Only fail on NEW issues (not baselined)\n const issuesToCheck = useBaseline ? newIssues : allResults;\n if (shouldFail(issuesToCheck, failOn)) {\n if (useBaseline && newIssues.length > 0) {\n console.log(chalk.red(`\\nāŒ CI failed: ${newIssues.length} NEW issue(s) detected\\n`));\n }\n process.exit(1);\n }\n\n if (useBaseline && baseline) {\n console.log(chalk.green(`\\nāœ“ CI passed (${baselineStats.baselined} baselined issues ignored)\\n`));\n }\n } catch (error) {\n console.error(chalk.red('CI check failed:'), error);\n process.exit(1);\n }\n}\n\nfunction printCIReport(report: CIReport, useBaseline: boolean): void {\n console.log(chalk.bold('\\nšŸ›¤ļø Devrail CI Report\\n'));\n\n const scoreColor = report.score >= 80 ? chalk.green : report.score >= 50 ? chalk.yellow : chalk.red;\n console.log(`Score: ${scoreColor.bold(report.score + '/100')}`);\n\n // Show baseline stats if available\n if (useBaseline && report.baseline) {\n console.log(chalk.bold('\\nšŸ“Š PR Gate Status:'));\n console.log(` Total issues: ${report.baseline.total}`);\n console.log(` ${chalk.green('Fixed:')} ${report.baseline.fixed}`);\n console.log(` ${chalk.dim('Baselined:')} ${report.baseline.baselined}`);\n console.log(` ${chalk.red('NEW:')} ${report.baseline.new}`);\n }\n\n console.log(`\\nAll Findings:`);\n console.log(` ${chalk.red('Errors:')} ${report.summary.errors}`);\n console.log(` ${chalk.yellow('Warnings:')} ${report.summary.warnings}`);\n console.log(` ${chalk.blue('Info:')} ${report.summary.infos}`);\n\n // Show NEW issues prominently\n if (report.newIssues.length > 0) {\n console.log('\\n' + chalk.bold.red('🚨 NEW Issues (will fail CI):'));\n for (const result of report.newIssues) {\n const icon =\n result.severity === 'error'\n ? chalk.red('āœ–')\n : result.severity === 'warn'\n ? chalk.yellow('⚠')\n : chalk.blue('ℹ');\n const location = result.file ? `${result.file}${result.line ? `:${result.line}` : ''}` : '';\n console.log(` ${icon} [${result.ruleId}] ${result.message}`);\n if (location) console.log(` ${chalk.dim(location)}`);\n }\n } else if (useBaseline && report.baseline && report.baseline.baselined > 0) {\n console.log('\\n' + chalk.green('āœ“ No NEW issues! Baselined issues are ignored.'));\n }\n\n if (report.diffOnly) {\n console.log(chalk.dim(`\\nMode: diff-only (${report.changedFiles} files changed)`));\n }\n\n console.log(`\\n${chalk.dim(`Duration: ${report.duration}ms | Tools: ${report.tools.map((t) => t.name).join(', ')}`)}`);\n}\n\nfunction toSarif(report: CheckReport): object {\n return {\n $schema: 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json',\n version: '2.1.0',\n runs: [\n {\n tool: {\n driver: {\n name: 'VibeGuard',\n version: '0.1.0',\n informationUri: 'https://vibeguard.dev',\n rules: report.results.map((r) => ({\n id: r.ruleId,\n shortDescription: { text: r.message },\n })),\n },\n },\n results: report.results.map((r) => ({\n ruleId: r.ruleId,\n level: r.severity === 'error' ? 'error' : r.severity === 'warn' ? 'warning' : 'note',\n message: { text: r.message },\n locations: r.file\n ? [\n {\n physicalLocation: {\n artifactLocation: { uri: r.file },\n region: r.line\n ? {\n startLine: r.line,\n startColumn: r.column ?? 1,\n endLine: r.endLine ?? r.line,\n endColumn: r.endColumn ?? r.column ?? 1,\n }\n : undefined,\n },\n },\n ]\n : [],\n })),\n },\n ],\n };\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { loadConfig, getDefaultConfig } from '../../engine/config-loader.js';\nimport { resolveRules, groupRulesByTool } from '../../engine/rule-engine.js';\nimport {\n loadBaseline,\n saveBaseline,\n createBaseline,\n updateBaseline,\n getBaselineStats,\n} from '../../engine/baseline.js';\nimport { gitleaksRunner, semgrepRunner, osvScannerRunner, runBuiltinChecks } from '../../tools/index.js';\nimport type { CheckResult } from '../../types/index.js';\n\ninterface BaselineOptions {\n update?: boolean;\n show?: boolean;\n}\n\nexport async function baselineCommand(options: BaselineOptions): Promise<void> {\n const cwd = process.cwd();\n const spinner = ora('Loading configuration...').start();\n\n try {\n const loaded = await loadConfig(cwd);\n const config = loaded?.config ?? getDefaultConfig();\n\n // Load existing baseline\n const existingBaseline = await loadBaseline(cwd);\n\n if (options.show) {\n spinner.stop();\n await showBaselineStatus(cwd, existingBaseline);\n return;\n }\n\n // Run full scan\n spinner.text = 'Running full scan...';\n const allResults = await runFullScan(cwd, config);\n\n if (existingBaseline && !options.update) {\n // Show comparison\n spinner.stop();\n const stats = getBaselineStats(allResults, existingBaseline);\n\n console.log(chalk.bold('\\nšŸ“Š Baseline Status:\\n'));\n console.log(` Total issues: ${chalk.cyan(stats.total)}`);\n console.log(` ${chalk.green('Fixed since baseline:')} ${stats.fixed}`);\n console.log(` ${chalk.yellow('Baselined (ignored):')} ${stats.baselined}`);\n console.log(` ${chalk.red('New issues:')} ${stats.new}`);\n\n if (stats.new > 0) {\n console.log(chalk.red(`\\nāš ļø ${stats.new} new issue(s) detected!`));\n console.log(chalk.dim('Run `devrail baseline --update` to add them to baseline.'));\n } else if (stats.fixed > 0) {\n console.log(chalk.green(`\\nāœ“ ${stats.fixed} issue(s) fixed since baseline!`));\n console.log(chalk.dim('Run `devrail baseline --update` to update the baseline.'));\n } else {\n console.log(chalk.green('\\nāœ“ No changes since baseline.'));\n }\n\n console.log(chalk.dim(`\\nBaseline: .devrail/baseline.json (${existingBaseline.entries.length} entries)\\n`));\n return;\n }\n\n // Create or update baseline\n let baseline;\n if (existingBaseline && options.update) {\n spinner.text = 'Updating baseline...';\n baseline = updateBaseline(existingBaseline, allResults);\n } else {\n spinner.text = 'Creating baseline...';\n baseline = createBaseline(allResults);\n }\n\n await saveBaseline(cwd, baseline);\n\n spinner.succeed(chalk.green('Baseline saved!'));\n\n console.log(chalk.bold('\\nšŸ“‹ Baseline Summary:\\n'));\n console.log(` Total issues baselined: ${chalk.cyan(baseline.entries.length)}`);\n console.log(` Created: ${chalk.dim(baseline.createdAt)}`);\n\n const byCategory = new Map<string, number>();\n for (const entry of baseline.entries) {\n const category = entry.ruleId.split('.')[0] ?? 'other';\n byCategory.set(category, (byCategory.get(category) ?? 0) + 1);\n }\n\n console.log('\\n By category:');\n for (const [category, count] of byCategory) {\n console.log(` ${category}: ${count}`);\n }\n\n console.log(chalk.bold('\\nšŸš€ What this means:\\n'));\n console.log(' • These issues are now \"accepted\" and won\\'t fail CI');\n console.log(' • New issues in the same categories WILL fail CI');\n console.log(' • Fix baselined issues over time to improve your score');\n\n console.log(chalk.dim('\\nRun `devrail ci` to verify only new issues are blocked.\\n'));\n } catch (error) {\n spinner.fail(chalk.red('Baseline failed'));\n console.error(error);\n process.exit(1);\n }\n}\n\nasync function showBaselineStatus(cwd: string, baseline: ReturnType<typeof loadBaseline> extends Promise<infer T> ? T : never): Promise<void> {\n if (!baseline) {\n console.log(chalk.yellow('\\nāš ļø No baseline found.'));\n console.log(chalk.dim('Run `devrail baseline` to create one.\\n'));\n return;\n }\n\n console.log(chalk.bold('\\nšŸ“‹ Current Baseline:\\n'));\n console.log(` Entries: ${chalk.cyan(baseline.entries.length)}`);\n console.log(` Created: ${chalk.dim(baseline.createdAt)}`);\n console.log(` Updated: ${chalk.dim(baseline.updatedAt)}`);\n\n const byRule = new Map<string, number>();\n for (const entry of baseline.entries) {\n byRule.set(entry.ruleId, (byRule.get(entry.ruleId) ?? 0) + 1);\n }\n\n console.log('\\n Top issues:');\n const sorted = [...byRule.entries()].sort((a, b) => b[1] - a[1]).slice(0, 10);\n for (const [rule, count] of sorted) {\n console.log(` ${chalk.dim(rule)}: ${count}`);\n }\n\n console.log();\n}\n\nasync function runFullScan(cwd: string, config: ReturnType<typeof getDefaultConfig>): Promise<CheckResult[]> {\n const allResults: CheckResult[] = [];\n\n // Builtin checks\n const builtinResults = await runBuiltinChecks(cwd, [\n 'secrets.gitignore-required',\n 'secrets.no-env-commit',\n 'deps.lockfile.required',\n 'deps.no-unpinned',\n 'deps.no-git-deps',\n 'tests.unit.required',\n 'code.strict-mode',\n 'config.node-version',\n 'config.editor-config',\n ]);\n allResults.push(...builtinResults);\n\n // External tools\n if (config.tools?.gitleaks !== false && (await gitleaksRunner.isInstalled())) {\n const results = await gitleaksRunner.run(cwd);\n allResults.push(...results);\n }\n\n if (config.tools?.osvScanner !== false && (await osvScannerRunner.isInstalled())) {\n const results = await osvScannerRunner.run(cwd);\n allResults.push(...results);\n }\n\n if (config.tools?.semgrep !== false && (await semgrepRunner.isInstalled())) {\n const results = await semgrepRunner.run(cwd);\n allResults.push(...results);\n }\n\n return allResults;\n}\n","import { writeFile, readFile, mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { loadConfig, getDefaultConfig } from '../../engine/config-loader.js';\n\ninterface FixOptions {\n dryRun?: boolean;\n all?: boolean;\n}\n\ninterface FixAction {\n file: string;\n ruleId: string;\n description: string;\n safe: boolean;\n action: () => Promise<void>;\n}\n\nexport async function fixCommand(options: FixOptions): Promise<void> {\n const cwd = process.cwd();\n const spinner = ora('Analyzing project for fixes...').start();\n\n try {\n const fixes: FixAction[] = [];\n\n // Collect all available fixes\n spinner.text = 'Checking .gitignore...';\n fixes.push(...(await getGitignoreFixes(cwd)));\n\n spinner.text = 'Checking .editorconfig...';\n fixes.push(...(await getEditorConfigFixes(cwd)));\n\n spinner.text = 'Checking tsconfig.json...';\n fixes.push(...(await getTsConfigFixes(cwd)));\n\n spinner.text = 'Checking Node version...';\n fixes.push(...(await getNodeVersionFixes(cwd)));\n\n spinner.text = 'Checking security headers...';\n fixes.push(...(await getSecurityFixes(cwd)));\n\n spinner.stop();\n\n // Filter to safe fixes only unless --all\n const applicableFixes = options.all ? fixes : fixes.filter((f) => f.safe);\n\n if (applicableFixes.length === 0) {\n console.log(chalk.green('\\nāœ“ No auto-fixable issues found!\\n'));\n return;\n }\n\n console.log(chalk.bold(`\\nšŸ”§ Found ${applicableFixes.length} fix(es):\\n`));\n\n for (const fix of applicableFixes) {\n const safeLabel = fix.safe ? chalk.green('[safe]') : chalk.yellow('[review]');\n console.log(` ${safeLabel} ${chalk.cyan(fix.file)}`);\n console.log(` ${chalk.dim(fix.ruleId)}: ${fix.description}`);\n }\n\n if (options.dryRun) {\n console.log(chalk.yellow('\\n[Dry run] No changes applied.'));\n console.log(chalk.dim('Run without --dry-run to apply fixes.\\n'));\n return;\n }\n\n console.log();\n const applySpinner = ora('Applying fixes...').start();\n\n let applied = 0;\n for (const fix of applicableFixes) {\n applySpinner.text = `Fixing ${fix.file}...`;\n try {\n await fix.action();\n applied++;\n } catch (error) {\n // Log but continue\n console.error(chalk.red(`Failed to fix ${fix.file}: ${error}`));\n }\n }\n\n applySpinner.succeed(chalk.green(`Applied ${applied}/${applicableFixes.length} fix(es)`));\n\n console.log(chalk.bold('\\nšŸš€ Next steps:\\n'));\n console.log(` 1. ${chalk.cyan('git diff')} Review the changes`);\n console.log(` 2. ${chalk.cyan('devrail check')} Verify fixes worked`);\n console.log(` 3. ${chalk.cyan('git commit')} Commit the fixes\\n`);\n } catch (error) {\n spinner.fail(chalk.red('Fix failed'));\n console.error(error);\n process.exit(1);\n }\n}\n\nasync function getGitignoreFixes(cwd: string): Promise<FixAction[]> {\n const fixes: FixAction[] = [];\n const gitignorePath = join(cwd, '.gitignore');\n\n const requiredPatterns = [\n '# Environment',\n '.env',\n '.env.local',\n '.env*.local',\n '',\n '# Dependencies',\n 'node_modules/',\n '',\n '# Build',\n 'dist/',\n 'build/',\n '.next/',\n '',\n '# Devrail',\n '.devrail/',\n ];\n\n try {\n const content = await readFile(gitignorePath, 'utf-8');\n const missingPatterns = requiredPatterns.filter(\n (p) => p && !content.includes(p.replace('/', ''))\n );\n\n if (missingPatterns.length > 3) {\n fixes.push({\n file: '.gitignore',\n ruleId: 'secrets.gitignore-required',\n description: 'Add missing patterns for env files and build artifacts',\n safe: true,\n action: async () => {\n const newContent = content.trimEnd() + '\\n\\n' + missingPatterns.join('\\n') + '\\n';\n await writeFile(gitignorePath, newContent, 'utf-8');\n },\n });\n }\n } catch {\n fixes.push({\n file: '.gitignore',\n ruleId: 'secrets.gitignore-required',\n description: 'Create .gitignore with security patterns',\n safe: true,\n action: async () => {\n await writeFile(gitignorePath, requiredPatterns.join('\\n') + '\\n', 'utf-8');\n },\n });\n }\n\n return fixes;\n}\n\nasync function getEditorConfigFixes(cwd: string): Promise<FixAction[]> {\n const fixes: FixAction[] = [];\n const editorConfigPath = join(cwd, '.editorconfig');\n\n const defaultConfig = `# EditorConfig - https://editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\ntrim_trailing_whitespace = false\n`;\n\n try {\n await readFile(editorConfigPath, 'utf-8');\n } catch {\n fixes.push({\n file: '.editorconfig',\n ruleId: 'config.editor-config',\n description: 'Create .editorconfig for consistent formatting',\n safe: true,\n action: async () => {\n await writeFile(editorConfigPath, defaultConfig, 'utf-8');\n },\n });\n }\n\n return fixes;\n}\n\nasync function getTsConfigFixes(cwd: string): Promise<FixAction[]> {\n const fixes: FixAction[] = [];\n const tsconfigPath = join(cwd, 'tsconfig.json');\n\n try {\n const content = await readFile(tsconfigPath, 'utf-8');\n const tsconfig = JSON.parse(content);\n\n if (!tsconfig.compilerOptions?.strict) {\n fixes.push({\n file: 'tsconfig.json',\n ruleId: 'code.strict-mode',\n description: 'Enable TypeScript strict mode',\n safe: false, // May break existing code\n action: async () => {\n tsconfig.compilerOptions = tsconfig.compilerOptions || {};\n tsconfig.compilerOptions.strict = true;\n await writeFile(tsconfigPath, JSON.stringify(tsconfig, null, 2) + '\\n', 'utf-8');\n },\n });\n }\n } catch {\n // No tsconfig, skip\n }\n\n return fixes;\n}\n\nasync function getNodeVersionFixes(cwd: string): Promise<FixAction[]> {\n const fixes: FixAction[] = [];\n const nvmrcPath = join(cwd, '.nvmrc');\n\n try {\n await readFile(nvmrcPath, 'utf-8');\n } catch {\n try {\n const pkgPath = join(cwd, 'package.json');\n const pkgContent = await readFile(pkgPath, 'utf-8');\n const pkg = JSON.parse(pkgContent);\n\n if (!pkg.engines?.node) {\n fixes.push({\n file: '.nvmrc',\n ruleId: 'config.node-version',\n description: 'Create .nvmrc with Node.js LTS version',\n safe: true,\n action: async () => {\n await writeFile(nvmrcPath, '20\\n', 'utf-8');\n },\n });\n }\n } catch {\n // No package.json, skip\n }\n }\n\n return fixes;\n}\n\nasync function getSecurityFixes(cwd: string): Promise<FixAction[]> {\n const fixes: FixAction[] = [];\n\n // Check for Next.js security headers\n const nextConfigPath = join(cwd, 'next.config.js');\n const nextConfigMjsPath = join(cwd, 'next.config.mjs');\n\n try {\n let configPath = nextConfigPath;\n let content: string;\n try {\n content = await readFile(nextConfigPath, 'utf-8');\n } catch {\n content = await readFile(nextConfigMjsPath, 'utf-8');\n configPath = nextConfigMjsPath;\n }\n\n if (!content.includes('headers')) {\n fixes.push({\n file: configPath.split('/').pop() ?? 'next.config.js',\n ruleId: 'security.headers.required',\n description: 'Add security headers configuration (manual review needed)',\n safe: false,\n action: async () => {\n // This is a complex fix, just create a comment/TODO\n const headerComment = `\n// TODO: Add security headers\n// See: https://nextjs.org/docs/app/api-reference/next-config-js/headers\n// async headers() {\n// return [\n// {\n// source: '/:path*',\n// headers: [\n// { key: 'X-Frame-Options', value: 'DENY' },\n// { key: 'X-Content-Type-Options', value: 'nosniff' },\n// { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },\n// ],\n// },\n// ];\n// },\n`;\n const newContent = content.replace(\n 'module.exports',\n headerComment + '\\nmodule.exports'\n );\n await writeFile(configPath, newContent, 'utf-8');\n },\n });\n }\n } catch {\n // Not a Next.js project or no config\n }\n\n return fixes;\n}\n","import { watch } from 'node:fs';\nimport { resolve } from 'node:path';\nimport chalk from 'chalk';\nimport { loadConfig, getDefaultConfig } from '../../engine/config-loader.js';\nimport { runBuiltinChecks } from '../../tools/builtin.js';\nimport type { CheckResult } from '../../types/index.js';\n\ninterface WatchOptions {\n debounce?: number;\n}\n\nexport async function watchCommand(options: WatchOptions): Promise<void> {\n const cwd = process.cwd();\n const debounceMs = options.debounce ?? 500;\n\n console.log(chalk.bold.cyan('\\nšŸ›¤ļø Devrail Guard Mode\\n'));\n console.log(chalk.dim('Watching for changes... Press Ctrl+C to stop.\\n'));\n\n let lastRun = 0;\n let timeout: NodeJS.Timeout | null = null;\n\n const runCheck = async () => {\n const now = Date.now();\n if (now - lastRun < debounceMs) return;\n lastRun = now;\n\n console.clear();\n console.log(chalk.bold.cyan('šŸ›¤ļø Devrail Guard Mode'));\n console.log(chalk.dim(`Last check: ${new Date().toLocaleTimeString()}\\n`));\n\n try {\n const results = await runBuiltinChecks(cwd, [\n 'secrets.gitignore-required',\n 'secrets.no-env-commit',\n 'deps.lockfile.required',\n 'tests.unit.required',\n 'code.strict-mode',\n ]);\n\n const errors = results.filter((r) => r.severity === 'error');\n const warnings = results.filter((r) => r.severity === 'warn');\n\n if (results.length === 0) {\n console.log(chalk.green.bold('āœ“ All clear!\\n'));\n } else {\n console.log(chalk.bold('Issues:'));\n \n for (const result of errors) {\n console.log(` ${chalk.red('āœ–')} ${result.message}`);\n console.log(` ${chalk.dim(result.ruleId)}`);\n }\n \n for (const result of warnings.slice(0, 5)) {\n console.log(` ${chalk.yellow('⚠')} ${result.message}`);\n console.log(` ${chalk.dim(result.ruleId)}`);\n }\n\n if (warnings.length > 5) {\n console.log(chalk.dim(`\\n ... and ${warnings.length - 5} more warnings`));\n }\n\n console.log(`\\n${chalk.red('Errors:')} ${errors.length} | ${chalk.yellow('Warnings:')} ${warnings.length}`);\n }\n\n // Quick score\n const score = Math.max(0, 100 - errors.length * 10 - warnings.length * 3);\n const scoreColor = score >= 80 ? chalk.green : score >= 50 ? chalk.yellow : chalk.red;\n console.log(`\\nScore: ${scoreColor.bold(score + '/100')}`);\n\n console.log(chalk.dim('\\nWatching for changes...'));\n } catch (error) {\n console.error(chalk.red('Check failed:'), error);\n }\n };\n\n // Initial run\n await runCheck();\n\n // Watch for changes\n const watcher = watch(cwd, { recursive: true }, (eventType, filename) => {\n if (!filename) return;\n \n // Ignore node_modules, dist, .git\n if (\n filename.includes('node_modules') ||\n filename.includes('dist') ||\n filename.includes('.git') ||\n filename.includes('.devrail')\n ) {\n return;\n }\n\n // Debounce\n if (timeout) clearTimeout(timeout);\n timeout = setTimeout(runCheck, debounceMs);\n });\n\n // Handle exit\n process.on('SIGINT', () => {\n watcher.close();\n console.log(chalk.dim('\\n\\nStopped watching.\\n'));\n process.exit(0);\n });\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { loadConfig, getDefaultConfig } from '../../engine/config-loader.js';\nimport { loadBaseline, getBaselineStats } from '../../engine/baseline.js';\nimport { gitleaksRunner, semgrepRunner, osvScannerRunner, runBuiltinChecks } from '../../tools/index.js';\nimport type { CheckResult } from '../../types/index.js';\n\ninterface ReportOptions {\n format?: 'console' | 'json' | 'markdown';\n output?: string;\n}\n\ninterface PostureScore {\n overall: number;\n categories: {\n secrets: { score: number; issues: number };\n deps: { score: number; issues: number };\n security: { score: number; issues: number };\n tests: { score: number; issues: number };\n config: { score: number; issues: number };\n };\n trend?: 'improving' | 'stable' | 'declining';\n previousScore?: number;\n}\n\nexport async function reportCommand(options: ReportOptions): Promise<void> {\n const cwd = process.cwd();\n const format = options.format ?? 'console';\n const spinner = ora('Generating security posture report...').start();\n\n try {\n const loaded = await loadConfig(cwd);\n const config = loaded?.config ?? getDefaultConfig();\n\n // Run all checks\n const allResults: CheckResult[] = [];\n\n spinner.text = 'Running builtin checks...';\n const builtinResults = await runBuiltinChecks(cwd, [\n 'secrets.gitignore-required',\n 'secrets.no-env-commit',\n 'deps.lockfile.required',\n 'deps.no-unpinned',\n 'deps.no-git-deps',\n 'tests.unit.required',\n 'code.strict-mode',\n 'config.node-version',\n 'config.editor-config',\n ]);\n allResults.push(...builtinResults);\n\n if (await gitleaksRunner.isInstalled()) {\n spinner.text = 'Running secret scan...';\n const results = await gitleaksRunner.run(cwd);\n allResults.push(...results);\n }\n\n if (await osvScannerRunner.isInstalled()) {\n spinner.text = 'Running dependency scan...';\n const results = await osvScannerRunner.run(cwd);\n allResults.push(...results);\n }\n\n // Load baseline for trend\n const baseline = await loadBaseline(cwd);\n const baselineStats = getBaselineStats(allResults, baseline);\n\n // Calculate posture score\n const posture = calculatePosture(allResults, baseline);\n\n spinner.stop();\n\n if (format === 'json') {\n const report = {\n timestamp: new Date().toISOString(),\n posture,\n issues: allResults,\n baseline: baseline ? baselineStats : undefined,\n };\n \n if (options.output) {\n await writeFile(options.output, JSON.stringify(report, null, 2));\n console.log(chalk.green(`Report saved to ${options.output}`));\n } else {\n console.log(JSON.stringify(report, null, 2));\n }\n } else if (format === 'markdown') {\n const md = generateMarkdownReport(posture, allResults, baselineStats);\n \n if (options.output) {\n await writeFile(options.output, md);\n console.log(chalk.green(`Report saved to ${options.output}`));\n } else {\n console.log(md);\n }\n } else {\n printConsoleReport(posture, allResults, baselineStats);\n }\n } catch (error) {\n spinner.fail(chalk.red('Report generation failed'));\n console.error(error);\n process.exit(1);\n }\n}\n\nfunction calculatePosture(results: CheckResult[], baseline: any): PostureScore {\n const categories = {\n secrets: { score: 100, issues: 0 },\n deps: { score: 100, issues: 0 },\n security: { score: 100, issues: 0 },\n tests: { score: 100, issues: 0 },\n config: { score: 100, issues: 0 },\n };\n\n for (const result of results) {\n const category = result.ruleId.split('.')[0] as keyof typeof categories;\n if (categories[category]) {\n categories[category].issues++;\n const penalty = result.severity === 'error' ? 15 : result.severity === 'warn' ? 5 : 2;\n categories[category].score = Math.max(0, categories[category].score - penalty);\n }\n }\n\n const overall = Math.round(\n (categories.secrets.score * 0.3 +\n categories.deps.score * 0.25 +\n categories.security.score * 0.2 +\n categories.tests.score * 0.15 +\n categories.config.score * 0.1)\n );\n\n // Determine trend based on baseline\n let trend: 'improving' | 'stable' | 'declining' | undefined;\n let previousScore: number | undefined;\n\n if (baseline) {\n previousScore = baseline.entries.length > 0 \n ? Math.max(0, 100 - baseline.entries.length * 3)\n : 100;\n \n if (overall > previousScore + 5) trend = 'improving';\n else if (overall < previousScore - 5) trend = 'declining';\n else trend = 'stable';\n }\n\n return { overall, categories, trend, previousScore };\n}\n\nfunction printConsoleReport(posture: PostureScore, results: CheckResult[], baselineStats: any): void {\n console.log(chalk.bold.cyan('\\nšŸ“Š Devrail Security Posture Report\\n'));\n console.log(chalk.dim('─'.repeat(50)));\n\n // Overall score with visual bar\n const scoreColor = posture.overall >= 80 ? chalk.green : posture.overall >= 50 ? chalk.yellow : chalk.red;\n const filledBars = Math.round(posture.overall / 5);\n const emptyBars = 20 - filledBars;\n const bar = scoreColor('ā–ˆ'.repeat(filledBars)) + chalk.dim('ā–‘'.repeat(emptyBars));\n \n console.log(`\\n${chalk.bold('Overall Score:')} ${scoreColor.bold(posture.overall + '/100')}`);\n console.log(` ${bar}`);\n\n // Trend\n if (posture.trend) {\n const trendIcon = posture.trend === 'improving' ? chalk.green('↑') \n : posture.trend === 'declining' ? chalk.red('↓') \n : chalk.dim('→');\n console.log(` ${trendIcon} ${posture.trend} (was ${posture.previousScore})`);\n }\n\n // Category breakdown\n console.log(chalk.bold('\\nšŸ“ˆ Category Breakdown:\\n'));\n\n const cats = [\n { name: 'Secrets Hygiene', key: 'secrets', weight: '30%' },\n { name: 'Dependencies', key: 'deps', weight: '25%' },\n { name: 'Security Patterns', key: 'security', weight: '20%' },\n { name: 'Test Coverage', key: 'tests', weight: '15%' },\n { name: 'Configuration', key: 'config', weight: '10%' },\n ];\n\n for (const cat of cats) {\n const data = posture.categories[cat.key as keyof typeof posture.categories];\n const color = data.score >= 80 ? chalk.green : data.score >= 50 ? chalk.yellow : chalk.red;\n const miniBar = color('ā–ˆ'.repeat(Math.round(data.score / 10))) + chalk.dim('ā–‘'.repeat(10 - Math.round(data.score / 10)));\n console.log(` ${miniBar} ${color(data.score.toString().padStart(3))} ${cat.name} (${cat.weight})`);\n if (data.issues > 0) {\n console.log(` ${chalk.dim(`${data.issues} issue(s)`)}`);\n }\n }\n\n // Baseline status\n if (baselineStats && baselineStats.baselined > 0) {\n console.log(chalk.bold('\\nšŸ“‹ Technical Debt:\\n'));\n console.log(` Baselined issues: ${chalk.yellow(baselineStats.baselined)}`);\n console.log(` Fixed since baseline: ${chalk.green(baselineStats.fixed)}`);\n console.log(` New issues: ${chalk.red(baselineStats.new)}`);\n }\n\n // Top 3 actions\n console.log(chalk.bold('\\nšŸŽÆ Top Actions:\\n'));\n \n const actions: string[] = [];\n if (posture.categories.secrets.issues > 0) {\n actions.push('Fix secret/credential issues');\n }\n if (posture.categories.deps.issues > 0) {\n actions.push('Update vulnerable dependencies');\n }\n if (posture.categories.tests.issues > 0) {\n actions.push('Add unit tests');\n }\n if (posture.categories.security.issues > 0) {\n actions.push('Address security patterns');\n }\n if (posture.categories.config.issues > 0) {\n actions.push('Improve project configuration');\n }\n\n for (let i = 0; i < Math.min(3, actions.length); i++) {\n console.log(` ${i + 1}. ${actions[i]}`);\n }\n\n if (actions.length === 0) {\n console.log(chalk.green(' āœ“ No critical actions needed!'));\n }\n\n console.log();\n}\n\nfunction generateMarkdownReport(posture: PostureScore, results: CheckResult[], baselineStats: any): string {\n const lines: string[] = [];\n \n lines.push('# šŸ“Š Devrail Security Posture Report');\n lines.push('');\n lines.push(`**Date:** ${new Date().toLocaleDateString()}`);\n lines.push(`**Overall Score:** ${posture.overall}/100`);\n \n if (posture.trend) {\n const emoji = posture.trend === 'improving' ? 'šŸ“ˆ' : posture.trend === 'declining' ? 'šŸ“‰' : 'āž”ļø';\n lines.push(`**Trend:** ${emoji} ${posture.trend}`);\n }\n \n lines.push('');\n lines.push('## Category Breakdown');\n lines.push('');\n lines.push('| Category | Score | Issues |');\n lines.push('|----------|-------|--------|');\n \n const cats = [\n { name: 'Secrets Hygiene', key: 'secrets' },\n { name: 'Dependencies', key: 'deps' },\n { name: 'Security Patterns', key: 'security' },\n { name: 'Test Coverage', key: 'tests' },\n { name: 'Configuration', key: 'config' },\n ];\n \n for (const cat of cats) {\n const data = posture.categories[cat.key as keyof typeof posture.categories];\n const emoji = data.score >= 80 ? 'āœ…' : data.score >= 50 ? 'āš ļø' : 'āŒ';\n lines.push(`| ${cat.name} | ${emoji} ${data.score}/100 | ${data.issues} |`);\n }\n \n if (baselineStats && baselineStats.baselined > 0) {\n lines.push('');\n lines.push('## Technical Debt');\n lines.push('');\n lines.push(`- **Baselined:** ${baselineStats.baselined} issues`);\n lines.push(`- **Fixed:** ${baselineStats.fixed} issues`);\n lines.push(`- **New:** ${baselineStats.new} issues`);\n }\n \n lines.push('');\n lines.push('---');\n lines.push('*Generated by [Devrail](https://devrail.dev)*');\n \n return lines.join('\\n');\n}\n"],"mappings":"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","names":["chalk","readFile","chalk","ora","ora","chalk","chalk","chalk","chalk","chalk","chalk","ora","ora","chalk","writeFile","join","chalk","ora","chalk","chalk","writeFile","chalk","ora","ora","writeFile","chalk","chalk"]}
@@ -0,0 +1,312 @@
1
+ import { z } from 'zod';
2
+
3
+ declare const RuleSeveritySchema: z.ZodEnum<["info", "warn", "error"]>;
4
+ type RuleSeverity = z.infer<typeof RuleSeveritySchema>;
5
+ declare const RuleScopeSchema: z.ZodEnum<["changed", "all"]>;
6
+ type RuleScope = z.infer<typeof RuleScopeSchema>;
7
+ declare const LevelSchema: z.ZodEnum<["basic", "standard", "strict"]>;
8
+ type Level = z.infer<typeof LevelSchema>;
9
+ declare const PresetSchema: z.ZodEnum<["node-api", "nextjs-app", "python-api", "cli-tool", "library", "monorepo"]>;
10
+ type Preset = z.infer<typeof PresetSchema>;
11
+ declare const RuleConfigSchema: z.ZodObject<{
12
+ enabled: z.ZodDefault<z.ZodBoolean>;
13
+ severity: z.ZodOptional<z.ZodEnum<["info", "warn", "error"]>>;
14
+ autofix: z.ZodOptional<z.ZodBoolean>;
15
+ blocking: z.ZodOptional<z.ZodBoolean>;
16
+ scope: z.ZodOptional<z.ZodEnum<["changed", "all"]>>;
17
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
18
+ }, "strip", z.ZodTypeAny, {
19
+ enabled: boolean;
20
+ options?: Record<string, unknown> | undefined;
21
+ severity?: "info" | "warn" | "error" | undefined;
22
+ autofix?: boolean | undefined;
23
+ blocking?: boolean | undefined;
24
+ scope?: "changed" | "all" | undefined;
25
+ }, {
26
+ options?: Record<string, unknown> | undefined;
27
+ enabled?: boolean | undefined;
28
+ severity?: "info" | "warn" | "error" | undefined;
29
+ autofix?: boolean | undefined;
30
+ blocking?: boolean | undefined;
31
+ scope?: "changed" | "all" | undefined;
32
+ }>;
33
+ type RuleConfig = z.infer<typeof RuleConfigSchema>;
34
+ declare const VibeGuardConfigSchema: z.ZodObject<{
35
+ preset: z.ZodOptional<z.ZodEnum<["node-api", "nextjs-app", "python-api", "cli-tool", "library", "monorepo"]>>;
36
+ level: z.ZodDefault<z.ZodEnum<["basic", "standard", "strict"]>>;
37
+ rules: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodBoolean, z.ZodObject<{
38
+ enabled: z.ZodDefault<z.ZodBoolean>;
39
+ severity: z.ZodOptional<z.ZodEnum<["info", "warn", "error"]>>;
40
+ autofix: z.ZodOptional<z.ZodBoolean>;
41
+ blocking: z.ZodOptional<z.ZodBoolean>;
42
+ scope: z.ZodOptional<z.ZodEnum<["changed", "all"]>>;
43
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
44
+ }, "strip", z.ZodTypeAny, {
45
+ enabled: boolean;
46
+ options?: Record<string, unknown> | undefined;
47
+ severity?: "info" | "warn" | "error" | undefined;
48
+ autofix?: boolean | undefined;
49
+ blocking?: boolean | undefined;
50
+ scope?: "changed" | "all" | undefined;
51
+ }, {
52
+ options?: Record<string, unknown> | undefined;
53
+ enabled?: boolean | undefined;
54
+ severity?: "info" | "warn" | "error" | undefined;
55
+ autofix?: boolean | undefined;
56
+ blocking?: boolean | undefined;
57
+ scope?: "changed" | "all" | undefined;
58
+ }>]>>>;
59
+ include: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
60
+ exclude: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
61
+ ci: z.ZodOptional<z.ZodObject<{
62
+ failOn: z.ZodDefault<z.ZodEnum<["info", "warn", "error"]>>;
63
+ reportFormat: z.ZodDefault<z.ZodEnum<["console", "json", "sarif"]>>;
64
+ }, "strip", z.ZodTypeAny, {
65
+ failOn: "info" | "warn" | "error";
66
+ reportFormat: "console" | "json" | "sarif";
67
+ }, {
68
+ failOn?: "info" | "warn" | "error" | undefined;
69
+ reportFormat?: "console" | "json" | "sarif" | undefined;
70
+ }>>;
71
+ tools: z.ZodOptional<z.ZodObject<{
72
+ eslint: z.ZodDefault<z.ZodBoolean>;
73
+ semgrep: z.ZodDefault<z.ZodBoolean>;
74
+ gitleaks: z.ZodDefault<z.ZodBoolean>;
75
+ osvScanner: z.ZodDefault<z.ZodBoolean>;
76
+ }, "strip", z.ZodTypeAny, {
77
+ eslint: boolean;
78
+ semgrep: boolean;
79
+ gitleaks: boolean;
80
+ osvScanner: boolean;
81
+ }, {
82
+ eslint?: boolean | undefined;
83
+ semgrep?: boolean | undefined;
84
+ gitleaks?: boolean | undefined;
85
+ osvScanner?: boolean | undefined;
86
+ }>>;
87
+ }, "strip", z.ZodTypeAny, {
88
+ level: "basic" | "standard" | "strict";
89
+ preset?: "node-api" | "nextjs-app" | "python-api" | "cli-tool" | "library" | "monorepo" | undefined;
90
+ rules?: Record<string, boolean | {
91
+ enabled: boolean;
92
+ options?: Record<string, unknown> | undefined;
93
+ severity?: "info" | "warn" | "error" | undefined;
94
+ autofix?: boolean | undefined;
95
+ blocking?: boolean | undefined;
96
+ scope?: "changed" | "all" | undefined;
97
+ }> | undefined;
98
+ include?: string[] | undefined;
99
+ exclude?: string[] | undefined;
100
+ ci?: {
101
+ failOn: "info" | "warn" | "error";
102
+ reportFormat: "console" | "json" | "sarif";
103
+ } | undefined;
104
+ tools?: {
105
+ eslint: boolean;
106
+ semgrep: boolean;
107
+ gitleaks: boolean;
108
+ osvScanner: boolean;
109
+ } | undefined;
110
+ }, {
111
+ preset?: "node-api" | "nextjs-app" | "python-api" | "cli-tool" | "library" | "monorepo" | undefined;
112
+ level?: "basic" | "standard" | "strict" | undefined;
113
+ rules?: Record<string, boolean | {
114
+ options?: Record<string, unknown> | undefined;
115
+ enabled?: boolean | undefined;
116
+ severity?: "info" | "warn" | "error" | undefined;
117
+ autofix?: boolean | undefined;
118
+ blocking?: boolean | undefined;
119
+ scope?: "changed" | "all" | undefined;
120
+ }> | undefined;
121
+ include?: string[] | undefined;
122
+ exclude?: string[] | undefined;
123
+ ci?: {
124
+ failOn?: "info" | "warn" | "error" | undefined;
125
+ reportFormat?: "console" | "json" | "sarif" | undefined;
126
+ } | undefined;
127
+ tools?: {
128
+ eslint?: boolean | undefined;
129
+ semgrep?: boolean | undefined;
130
+ gitleaks?: boolean | undefined;
131
+ osvScanner?: boolean | undefined;
132
+ } | undefined;
133
+ }>;
134
+ type VibeGuardConfig = z.infer<typeof VibeGuardConfigSchema>;
135
+ interface RuleDefinition {
136
+ id: string;
137
+ name: string;
138
+ description: string;
139
+ category: RuleCategory;
140
+ severity: RuleSeverity;
141
+ autofix: boolean;
142
+ blocking: boolean;
143
+ scope: RuleScope;
144
+ tool: ToolType;
145
+ docs: string;
146
+ rationale: string;
147
+ fix: string;
148
+ examples?: {
149
+ bad?: string;
150
+ good?: string;
151
+ };
152
+ levels: {
153
+ basic: boolean;
154
+ standard: boolean;
155
+ strict: boolean;
156
+ };
157
+ }
158
+ type RuleCategory = 'secrets' | 'deps' | 'security' | 'auth' | 'api' | 'sql' | 'tests' | 'logging' | 'code' | 'config';
159
+ type ToolType = 'eslint' | 'semgrep' | 'gitleaks' | 'osv-scanner' | 'vitest' | 'jest' | 'custom' | 'builtin';
160
+ interface CheckResult {
161
+ ruleId: string;
162
+ severity: RuleSeverity;
163
+ message: string;
164
+ file?: string;
165
+ line?: number;
166
+ column?: number;
167
+ endLine?: number;
168
+ endColumn?: number;
169
+ fix?: {
170
+ description: string;
171
+ replacement?: string;
172
+ };
173
+ }
174
+ interface CheckReport {
175
+ timestamp: string;
176
+ duration: number;
177
+ preset?: Preset;
178
+ level: Level;
179
+ summary: {
180
+ total: number;
181
+ errors: number;
182
+ warnings: number;
183
+ infos: number;
184
+ fixed: number;
185
+ };
186
+ score: number;
187
+ results: CheckResult[];
188
+ tools: {
189
+ name: string;
190
+ version?: string;
191
+ duration: number;
192
+ results: number;
193
+ }[];
194
+ }
195
+
196
+ declare const rules: RuleDefinition[];
197
+ declare const ruleMap: Map<string, RuleDefinition>;
198
+ declare function getRuleById(id: string): RuleDefinition | undefined;
199
+ declare function getRulesByCategory(category: string): RuleDefinition[];
200
+ declare function getRulesByLevel(level: 'basic' | 'standard' | 'strict'): RuleDefinition[];
201
+ declare function getRulesByTool(tool: string): RuleDefinition[];
202
+
203
+ interface PresetConfig {
204
+ name: Preset;
205
+ description: string;
206
+ rules: Record<Level, string[]>;
207
+ tools: string[];
208
+ eslintExtends: string[];
209
+ semgrepRules: string[];
210
+ }
211
+
212
+ declare const presets: Record<Preset, PresetConfig>;
213
+ declare function getPreset(name: Preset): PresetConfig;
214
+ declare function listPresets(): Preset[];
215
+
216
+ interface LoadedConfig {
217
+ config: VibeGuardConfig;
218
+ filepath: string;
219
+ isEmpty: boolean;
220
+ }
221
+ declare function loadConfig(cwd?: string): Promise<LoadedConfig | null>;
222
+ declare function loadConfigFromFile(filepath: string): Promise<LoadedConfig>;
223
+ declare function getDefaultConfig(): VibeGuardConfig;
224
+
225
+ interface ResolvedRule {
226
+ definition: RuleDefinition;
227
+ severity: RuleSeverity;
228
+ enabled: boolean;
229
+ blocking: boolean;
230
+ autofix: boolean;
231
+ }
232
+ declare function resolveRules(config: VibeGuardConfig): ResolvedRule[];
233
+ declare function groupRulesByTool(resolvedRules: ResolvedRule[]): Map<string, ResolvedRule[]>;
234
+ declare function calculateScore(results: CheckResult[]): number;
235
+ declare function shouldFail(results: CheckResult[], failOn: RuleSeverity): boolean;
236
+
237
+ interface DetectedStack {
238
+ preset: Preset;
239
+ confidence: number;
240
+ language: 'typescript' | 'javascript' | 'python' | 'unknown';
241
+ framework?: string;
242
+ packageManager?: 'npm' | 'yarn' | 'pnpm' | 'bun';
243
+ hasTests: boolean;
244
+ hasTypeScript: boolean;
245
+ hasCi: boolean;
246
+ issues: string[];
247
+ }
248
+ declare function detectStack(cwd: string): Promise<DetectedStack>;
249
+
250
+ interface BaselineEntry {
251
+ ruleId: string;
252
+ file?: string;
253
+ line?: number;
254
+ fingerprint: string;
255
+ message: string;
256
+ createdAt: string;
257
+ }
258
+ interface Baseline {
259
+ version: string;
260
+ createdAt: string;
261
+ updatedAt: string;
262
+ entries: BaselineEntry[];
263
+ }
264
+ declare function createFingerprint(result: CheckResult): string;
265
+ declare function loadBaseline(cwd: string, path?: string): Promise<Baseline | null>;
266
+ declare function saveBaseline(cwd: string, baseline: Baseline, path?: string): Promise<void>;
267
+ declare function createBaseline(results: CheckResult[]): Baseline;
268
+ declare function filterNewIssues(results: CheckResult[], baseline: Baseline | null): CheckResult[];
269
+ declare function getBaselinedIssues(results: CheckResult[], baseline: Baseline | null): CheckResult[];
270
+ interface BaselineStats {
271
+ total: number;
272
+ new: number;
273
+ baselined: number;
274
+ fixed: number;
275
+ }
276
+ declare function getBaselineStats(results: CheckResult[], baseline: Baseline | null): BaselineStats;
277
+ declare function updateBaseline(baseline: Baseline, results: CheckResult[]): Baseline;
278
+
279
+ interface ChangedFile {
280
+ path: string;
281
+ status: 'added' | 'modified' | 'deleted' | 'renamed';
282
+ }
283
+ declare function getChangedFiles(cwd: string, base?: string): Promise<ChangedFile[]>;
284
+ declare function getUncommittedChanges(cwd: string): Promise<ChangedFile[]>;
285
+ declare function getStagedFiles(cwd: string): Promise<ChangedFile[]>;
286
+ declare function filterResultsByFiles(results: Array<{
287
+ file?: string;
288
+ }>, changedFiles: ChangedFile[]): typeof results;
289
+
290
+ interface ToolRunner {
291
+ name: string;
292
+ isInstalled(): Promise<boolean>;
293
+ getVersion(): Promise<string | null>;
294
+ run(cwd: string, files?: string[]): Promise<CheckResult[]>;
295
+ }
296
+ declare function checkCommand(command: string): Promise<boolean>;
297
+ declare function runCommand(command: string, args: string[], cwd: string): Promise<{
298
+ stdout: string;
299
+ stderr: string;
300
+ exitCode: number;
301
+ }>;
302
+ declare function parseSeverity(level: string): RuleSeverity;
303
+
304
+ declare const gitleaksRunner: ToolRunner;
305
+
306
+ declare const semgrepRunner: ToolRunner;
307
+
308
+ declare const osvScannerRunner: ToolRunner;
309
+
310
+ declare function runBuiltinChecks(cwd: string, ruleIds: string[]): Promise<CheckResult[]>;
311
+
312
+ export { type Baseline, type BaselineEntry, type BaselineStats, type ChangedFile, type CheckReport, type CheckResult, type DetectedStack, type Level, LevelSchema, type LoadedConfig, type Preset, type PresetConfig, PresetSchema, type ResolvedRule, type RuleCategory, type RuleConfig, RuleConfigSchema, type RuleDefinition, type RuleScope, RuleScopeSchema, type RuleSeverity, RuleSeveritySchema, type ToolRunner, type ToolType, type VibeGuardConfig, VibeGuardConfigSchema, calculateScore, checkCommand, createBaseline, createFingerprint, detectStack, filterNewIssues, filterResultsByFiles, getBaselineStats, getBaselinedIssues, getChangedFiles, getDefaultConfig, getPreset, getRuleById, getRulesByCategory, getRulesByLevel, getRulesByTool, getStagedFiles, getUncommittedChanges, gitleaksRunner, groupRulesByTool, listPresets, loadBaseline, loadConfig, loadConfigFromFile, osvScannerRunner, parseSeverity, presets, resolveRules, ruleMap, rules, runBuiltinChecks, runCommand, saveBaseline, semgrepRunner, shouldFail, updateBaseline };
package/dist/index.js ADDED
@@ -0,0 +1,91 @@
1
+ import {
2
+ LevelSchema,
3
+ PresetSchema,
4
+ RuleConfigSchema,
5
+ RuleScopeSchema,
6
+ RuleSeveritySchema,
7
+ VibeGuardConfigSchema,
8
+ calculateScore,
9
+ checkCommand,
10
+ createBaseline,
11
+ createFingerprint,
12
+ detectStack,
13
+ filterNewIssues,
14
+ filterResultsByFiles,
15
+ getBaselineStats,
16
+ getBaselinedIssues,
17
+ getChangedFiles,
18
+ getDefaultConfig,
19
+ getPreset,
20
+ getStagedFiles,
21
+ getUncommittedChanges,
22
+ gitleaksRunner,
23
+ groupRulesByTool,
24
+ listPresets,
25
+ loadBaseline,
26
+ loadConfig,
27
+ loadConfigFromFile,
28
+ osvScannerRunner,
29
+ parseSeverity,
30
+ presets,
31
+ resolveRules,
32
+ runBuiltinChecks,
33
+ runCommand,
34
+ saveBaseline,
35
+ semgrepRunner,
36
+ shouldFail,
37
+ updateBaseline
38
+ } from "./chunk-ZDEEHXE7.js";
39
+ import {
40
+ getRuleById,
41
+ getRulesByCategory,
42
+ getRulesByLevel,
43
+ getRulesByTool,
44
+ ruleMap,
45
+ rules
46
+ } from "./chunk-J22FFU7Z.js";
47
+ export {
48
+ LevelSchema,
49
+ PresetSchema,
50
+ RuleConfigSchema,
51
+ RuleScopeSchema,
52
+ RuleSeveritySchema,
53
+ VibeGuardConfigSchema,
54
+ calculateScore,
55
+ checkCommand,
56
+ createBaseline,
57
+ createFingerprint,
58
+ detectStack,
59
+ filterNewIssues,
60
+ filterResultsByFiles,
61
+ getBaselineStats,
62
+ getBaselinedIssues,
63
+ getChangedFiles,
64
+ getDefaultConfig,
65
+ getPreset,
66
+ getRuleById,
67
+ getRulesByCategory,
68
+ getRulesByLevel,
69
+ getRulesByTool,
70
+ getStagedFiles,
71
+ getUncommittedChanges,
72
+ gitleaksRunner,
73
+ groupRulesByTool,
74
+ listPresets,
75
+ loadBaseline,
76
+ loadConfig,
77
+ loadConfigFromFile,
78
+ osvScannerRunner,
79
+ parseSeverity,
80
+ presets,
81
+ resolveRules,
82
+ ruleMap,
83
+ rules,
84
+ runBuiltinChecks,
85
+ runCommand,
86
+ saveBaseline,
87
+ semgrepRunner,
88
+ shouldFail,
89
+ updateBaseline
90
+ };
91
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,17 @@
1
+ import {
2
+ getRuleById,
3
+ getRulesByCategory,
4
+ getRulesByLevel,
5
+ getRulesByTool,
6
+ ruleMap,
7
+ rules
8
+ } from "./chunk-J22FFU7Z.js";
9
+ export {
10
+ getRuleById,
11
+ getRulesByCategory,
12
+ getRulesByLevel,
13
+ getRulesByTool,
14
+ ruleMap,
15
+ rules
16
+ };
17
+ //# sourceMappingURL=rules-XIWD4KI4.js.map