@shakecodeslikecray/whiterose 1.0.10 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -8
- package/dist/cli/index.js +54 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +48 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/utils/path-input.ts","../../src/providers/detect.ts","../../src/providers/executors/claude-code.ts","../../src/providers/executors/codex.ts","../../src/providers/executors/gemini.ts","../../src/providers/executors/aider.ts","../../src/providers/executors/ollama.ts","../../src/providers/executors/index.ts","../../src/providers/prompts/flow-analysis-prompts.ts","../../src/providers/prompts/cwe-patterns.ts","../../src/providers/prompts/multipass-prompts.ts","../../src/providers/prompts/constants.ts","../../src/providers/prompts/understanding.ts","../../src/core/multipass-scanner.ts","../../src/core/flow-analyzer.ts","../../src/core/utils.ts","../../src/core/scanner.ts","../../src/core/scanner/index.ts","../../src/core/contracts/intent.ts","../../src/core/docs.ts","../../src/cli/commands/init.ts","../../src/types.ts","../../src/core/config.ts","../../src/analysis/static.ts","../../src/output/sarif.ts","../../src/output/markdown.ts","../../src/output/human-readable.ts","../../src/core/bug-merger.ts","../../src/core/cross-file-analyzer.ts","../../src/core/contract-analyzer.ts","../../src/core/findings.ts","../../src/cli/components/progress.ts","../../src/cli/components/card.ts","../../src/cli/commands/scan.ts","../../src/tui/screens/Dashboard.tsx","../../src/tui/screens/BugList.tsx","../../src/tui/screens/BugDetail.tsx","../../src/tui/screens/FixConfirm.tsx","../../src/tui/App.tsx","../../src/core/git.ts","../../src/core/bug-status.ts","../../src/core/fixer.ts","../../src/tui/index.tsx","../../src/cli/commands/fix.ts","../../src/cli/commands/refresh.ts","../../src/cli/commands/status.ts","../../src/cli/commands/report.ts","../../src/cli/commands/clear.ts","../../src/cli/index.ts"],"names":["resolve","existsSync","statSync","dirname","basename","readdirSync","chalk","execa","join","p","fg","readFileSync","line","writeFileSync","rmSync","YAML","relative","mkdirSync","p2","normalizeFilePath","isAbsolute","text","formatCategory","useState","useInput","jsxs","Box","jsx","Text","getSeverityColor","getConfidenceColor","Fragment","newContent","mkdtempSync","tmpdir","bugs","baseConfig","config","confirm","p4","getRepoName","p5","bugStats","p6","p7","__filename","__dirname","p8","pathInput"],"mappings":"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","file":"index.js","sourcesContent":["import { readdirSync, statSync, existsSync } from 'fs';\nimport { dirname, basename, resolve } from 'path';\nimport chalk from 'chalk';\nimport * as readline from 'readline';\n\n/**\n * Get directory completions for a partial path\n */\nfunction getPathCompletions(partial: string): string[] {\n try {\n if (!partial) partial = '.';\n\n const resolved = resolve(partial);\n let dir: string;\n let prefix: string;\n\n // Check if partial is a directory (ends with / or is a directory)\n if (partial.endsWith('/') || (existsSync(resolved) && statSync(resolved).isDirectory())) {\n dir = resolved;\n prefix = '';\n } else {\n dir = dirname(resolved);\n prefix = basename(partial);\n }\n\n if (!existsSync(dir)) {\n return [];\n }\n\n const entries = readdirSync(dir, { withFileTypes: true });\n const matches = entries\n .filter((entry) => entry.isDirectory())\n .filter((entry) => entry.name.toLowerCase().startsWith(prefix.toLowerCase()))\n .filter((entry) => !entry.name.startsWith('.') || prefix.startsWith('.'))\n .map((entry) => {\n if (partial.endsWith('/') || prefix === '') {\n return partial + entry.name + '/';\n }\n const base = partial.slice(0, partial.length - prefix.length);\n return base + entry.name + '/';\n })\n .sort();\n\n return matches;\n } catch {\n return [];\n }\n}\n\n/**\n * Find longest common prefix among strings\n */\nfunction longestCommonPrefix(strings: string[]): string {\n if (strings.length === 0) return '';\n if (strings.length === 1) return strings[0];\n\n let prefix = strings[0];\n for (let i = 1; i < strings.length; i++) {\n while (!strings[i].startsWith(prefix)) {\n prefix = prefix.slice(0, -1);\n if (prefix === '') return '';\n }\n }\n return prefix;\n}\n\nexport interface PathInputOptions {\n message: string;\n defaultValue?: string;\n validate?: (path: string) => string | undefined;\n}\n\n/**\n * Prompt for a path with Tab completion (bash-style)\n */\nexport function pathInput(options: PathInputOptions): Promise<string | null> {\n return new Promise((resolvePromise) => {\n const { message, defaultValue = '', validate } = options;\n\n // Display prompt\n const promptText = chalk.cyan('◆') + ' ' + chalk.bold(message);\n const hint = defaultValue ? chalk.dim(` (default: ${defaultValue})`) : '';\n const tabHint = chalk.dim(' [Tab to autocomplete]');\n\n process.stdout.write(promptText + hint + tabHint + '\\n');\n process.stdout.write(chalk.cyan('│') + ' ');\n\n let input = '';\n let cursorPos = 0;\n\n // Enable raw mode for key-by-key input\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n process.stdin.setEncoding('utf8');\n\n const redrawLine = () => {\n // Clear current line and redraw\n readline.clearLine(process.stdout, 0);\n readline.cursorTo(process.stdout, 0);\n process.stdout.write(chalk.cyan('│') + ' ' + input);\n // Position cursor\n readline.cursorTo(process.stdout, 2 + cursorPos);\n };\n\n const cleanup = () => {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n process.stdin.pause();\n process.stdin.removeAllListeners('data');\n };\n\n const finish = (result: string | null) => {\n cleanup();\n console.log(); // New line after input\n resolvePromise(result);\n };\n\n process.stdin.on('data', (key: string) => {\n const code = key.charCodeAt(0);\n\n // Ctrl+C - cancel\n if (code === 3) {\n console.log();\n finish(null);\n return;\n }\n\n // Enter - submit\n if (code === 13) {\n const finalPath = input.trim() || defaultValue;\n\n if (validate) {\n const error = validate(finalPath);\n if (error) {\n console.log();\n process.stdout.write(chalk.red('│') + ' ' + chalk.red(error) + '\\n');\n process.stdout.write(chalk.cyan('│') + ' ' + input);\n return;\n }\n }\n\n finish(finalPath);\n return;\n }\n\n // Tab - autocomplete\n if (code === 9) {\n const completions = getPathCompletions(input || '.');\n\n if (completions.length === 1) {\n // Single match - complete it\n input = completions[0];\n cursorPos = input.length;\n redrawLine();\n } else if (completions.length > 1) {\n // Multiple matches - complete common prefix and show options\n const common = longestCommonPrefix(completions);\n if (common.length > input.length) {\n input = common;\n cursorPos = input.length;\n redrawLine();\n } else {\n // Show available completions\n console.log();\n const maxShow = 10;\n const shown = completions.slice(0, maxShow);\n process.stdout.write(chalk.dim('│ ') + shown.map(c => chalk.cyan(basename(c.slice(0, -1)))).join(' '));\n if (completions.length > maxShow) {\n process.stdout.write(chalk.dim(` ... +${completions.length - maxShow} more`));\n }\n console.log();\n process.stdout.write(chalk.cyan('│') + ' ' + input);\n }\n }\n return;\n }\n\n // Backspace\n if (code === 127 || code === 8) {\n if (cursorPos > 0) {\n input = input.slice(0, cursorPos - 1) + input.slice(cursorPos);\n cursorPos--;\n redrawLine();\n }\n return;\n }\n\n // Arrow keys (escape sequences)\n if (key === '\\u001b[D') {\n // Left arrow\n if (cursorPos > 0) {\n cursorPos--;\n redrawLine();\n }\n return;\n }\n if (key === '\\u001b[C') {\n // Right arrow\n if (cursorPos < input.length) {\n cursorPos++;\n redrawLine();\n }\n return;\n }\n\n // Ignore other escape sequences\n if (key.startsWith('\\u001b')) {\n return;\n }\n\n // Regular character - insert at cursor position\n if (code >= 32 && code < 127) {\n input = input.slice(0, cursorPos) + key + input.slice(cursorPos);\n cursorPos++;\n redrawLine();\n }\n });\n });\n}\n","import { execa } from 'execa';\nimport { existsSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { ProviderType } from '../types.js';\n\ninterface ProviderCheck {\n name: ProviderType;\n command: string;\n args: string[];\n // Common installation paths to check\n paths?: string[];\n}\n\nconst providerChecks: ProviderCheck[] = [\n {\n name: 'claude-code',\n command: 'claude',\n args: ['--version'],\n paths: [\n join(homedir(), '.local', 'bin', 'claude'),\n '/usr/local/bin/claude',\n '/opt/homebrew/bin/claude',\n ],\n },\n {\n name: 'aider',\n command: 'aider',\n args: ['--version'],\n paths: [\n join(homedir(), '.local', 'bin', 'aider'),\n '/usr/local/bin/aider',\n '/opt/homebrew/bin/aider',\n ],\n },\n {\n name: 'codex',\n command: 'codex',\n args: ['--version'],\n paths: [\n join(homedir(), '.local', 'bin', 'codex'),\n '/usr/local/bin/codex',\n '/opt/homebrew/bin/codex',\n ],\n },\n {\n name: 'opencode',\n command: 'opencode',\n args: ['--version'],\n paths: [\n join(homedir(), '.local', 'bin', 'opencode'),\n '/usr/local/bin/opencode',\n '/opt/homebrew/bin/opencode',\n ],\n },\n {\n name: 'gemini',\n command: 'gemini',\n args: ['--version'],\n paths: [\n join(homedir(), '.local', 'bin', 'gemini'),\n '/usr/local/bin/gemini',\n '/opt/homebrew/bin/gemini',\n ],\n },\n {\n name: 'ollama',\n command: 'ollama',\n args: ['--version'],\n paths: [\n join(homedir(), '.local', 'bin', 'ollama'),\n '/usr/local/bin/ollama',\n '/opt/homebrew/bin/ollama',\n ],\n },\n];\n\n// Cache resolved command paths\nconst resolvedPaths: Map<ProviderType, string> = new Map();\n\n/**\n * Find the actual command path, checking common installation locations\n */\nasync function findCommand(check: ProviderCheck): Promise<string | null> {\n // First try the command directly (in case it's in PATH)\n try {\n await execa(check.command, check.args, { timeout: 5000 });\n return check.command;\n } catch {\n // Not in PATH, check common paths\n }\n\n // Check common installation paths\n if (check.paths) {\n for (const path of check.paths) {\n if (existsSync(path)) {\n try {\n await execa(path, check.args, { timeout: 5000 });\n return path;\n } catch {\n // Path exists but command failed, continue\n }\n }\n }\n }\n\n return null;\n}\n\nexport async function detectProvider(): Promise<ProviderType[]> {\n const available: ProviderType[] = [];\n\n for (const check of providerChecks) {\n const commandPath = await findCommand(check);\n if (commandPath) {\n resolvedPaths.set(check.name, commandPath);\n available.push(check.name);\n }\n }\n\n return available;\n}\n\nexport async function isProviderAvailable(name: ProviderType): Promise<boolean> {\n const check = providerChecks.find((c) => c.name === name);\n if (!check) return false;\n\n const commandPath = await findCommand(check);\n if (commandPath) {\n resolvedPaths.set(name, commandPath);\n return true;\n }\n return false;\n}\n\n/**\n * Get the resolved command path for a provider.\n * Returns the cached path if available, otherwise uses the default command name.\n */\nexport function getProviderCommand(name: ProviderType): string {\n // Check if we have a cached resolved path\n const cached = resolvedPaths.get(name);\n if (cached) return cached;\n\n // Fallback to the provider's expected command name\n const check = providerChecks.find((c) => c.name === name);\n return check?.command || name;\n}\n","/**\n * Claude Code Executor - Simple prompt execution\n *\n * This is a \"dumb\" executor that just runs prompts via Claude CLI.\n * All scanning logic lives in CoreScanner.\n */\n\nimport { execa } from 'execa';\nimport { PromptExecutor, PromptOptions, PromptResult } from '../../core/scanner.js';\nimport { isProviderAvailable, getProviderCommand } from '../detect.js';\n\nconst CLAUDE_TIMEOUT = 300000; // 5 minutes\n\nexport class ClaudeCodeExecutor implements PromptExecutor {\n name = 'claude-code';\n\n async isAvailable(): Promise<boolean> {\n return isProviderAvailable('claude-code');\n }\n\n async runPrompt(prompt: string, options: PromptOptions): Promise<PromptResult> {\n const claudeCommand = getProviderCommand('claude-code');\n\n if (process.env.WHITEROSE_DEBUG) {\n console.log('\\n[DEBUG] Running Claude Code command:', claudeCommand);\n console.log('[DEBUG] Prompt length:', prompt.length);\n console.log('[DEBUG] CWD:', options.cwd);\n console.log('[DEBUG] First 500 chars of prompt:');\n console.log(prompt.substring(0, 500));\n }\n\n try {\n const { stdout, stderr } = await execa(\n claudeCommand,\n [\n '-p', prompt,\n '--dangerously-skip-permissions', // Allow file reads without prompts\n '--output-format', 'text', // Ensure non-interactive output\n ],\n {\n cwd: options.cwd,\n timeout: options.timeout || CLAUDE_TIMEOUT,\n env: {\n ...process.env,\n NO_COLOR: '1',\n },\n reject: false,\n stdin: 'ignore', // Prevent waiting for stdin\n }\n );\n\n // Check for API errors in stderr before returning\n if (stderr) {\n // Rate limit errors\n if (stderr.includes('429') || stderr.includes('rate limit') || stderr.includes('too many requests')) {\n throw new Error('Claude API rate limit reached. Try again later.');\n }\n // Authentication errors\n if (stderr.includes('401') || stderr.includes('unauthorized') || stderr.includes('invalid api key')) {\n throw new Error('Claude API authentication failed. Check your API key.');\n }\n // Credit/billing errors\n if (stderr.includes('402') || stderr.includes('insufficient') || stderr.includes('billing')) {\n throw new Error('Claude API billing error. Check your account credits.');\n }\n // Generic errors that indicate complete failure\n if (stderr.includes('Error:') && !stdout) {\n throw new Error(`Claude Code error: ${stderr.substring(0, 200)}`);\n }\n }\n\n // Debug: log output and errors\n if (process.env.WHITEROSE_DEBUG) {\n console.log('\\n[DEBUG] Claude Code stdout length:', stdout?.length || 0);\n console.log('[DEBUG] Claude Code stderr:', stderr?.substring(0, 300) || '(none)');\n console.log('[DEBUG] First 1000 chars of stdout:');\n console.log(stdout?.substring(0, 1000) || '(empty)');\n console.log('[DEBUG] End response\\n');\n }\n\n return {\n output: stdout || '',\n error: stderr || undefined,\n };\n } catch (error: any) {\n if (error.message?.includes('ENOENT')) {\n throw new Error('Claude Code not found. Install: npm install -g @anthropic-ai/claude-code');\n }\n throw error;\n }\n }\n}\n","/**\n * Codex Executor - Simple prompt execution\n *\n * This is a \"dumb\" executor that just runs prompts via Codex CLI.\n * All scanning logic lives in CoreScanner.\n */\n\nimport { execa } from 'execa';\nimport { mkdtempSync, rmSync, existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { tmpdir } from 'os';\nimport { PromptExecutor, PromptOptions, PromptResult } from '../../core/scanner.js';\nimport { isProviderAvailable, getProviderCommand } from '../detect.js';\n\nconst CODEX_TIMEOUT = 300000; // 5 minutes\n\nexport class CodexExecutor implements PromptExecutor {\n name = 'codex';\n\n async isAvailable(): Promise<boolean> {\n return isProviderAvailable('codex');\n }\n\n async runPrompt(prompt: string, options: PromptOptions): Promise<PromptResult> {\n const codexCommand = getProviderCommand('codex');\n const tempDir = mkdtempSync(join(tmpdir(), 'whiterose-codex-'));\n const outputFile = join(tempDir, 'output.txt');\n\n try {\n const { stdout, stderr } = await execa(\n codexCommand,\n [\n 'exec',\n '--skip-git-repo-check',\n '-o', outputFile,\n '-', // Read from stdin\n ],\n {\n cwd: options.cwd,\n input: prompt,\n timeout: options.timeout || CODEX_TIMEOUT,\n env: {\n ...process.env,\n NO_COLOR: '1',\n },\n reject: false,\n }\n );\n\n // Check for API errors in stderr before processing output\n if (stderr) {\n // Rate limit / usage limit errors\n if (stderr.includes('429') || stderr.includes('usage_limit') || stderr.includes('rate limit')) {\n throw new Error('Codex API rate limit reached. Try again later or upgrade your plan.');\n }\n // Authentication errors\n if (stderr.includes('401') || stderr.includes('unauthorized') || stderr.includes('authentication')) {\n throw new Error('Codex API authentication failed. Check your API key.');\n }\n // Generic API errors\n if (stderr.includes('ERROR:') || stderr.includes('error=http')) {\n // Extract the error message\n const errorMatch = stderr.match(/ERROR:\\s*(.+?)(?:\\n|$)/i) || stderr.match(/error=(.+?)(?:\\n|$)/);\n const errorMsg = errorMatch ? errorMatch[1].trim() : stderr.substring(0, 200);\n throw new Error(`Codex API error: ${errorMsg}`);\n }\n }\n\n // Try to read from output file first\n let output = stdout || '';\n if (existsSync(outputFile)) {\n try {\n output = readFileSync(outputFile, 'utf-8');\n } catch {\n // Fall back to stdout\n }\n }\n\n return {\n output,\n error: stderr || undefined,\n };\n } catch (error: any) {\n if (error.message?.includes('ENOENT')) {\n throw new Error('Codex not found. Install: npm install -g @openai/codex');\n }\n throw error;\n } finally {\n // Cleanup\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n}\n","/**\n * Gemini Executor - Simple prompt execution\n *\n * This is a \"dumb\" executor that just runs prompts via Gemini CLI.\n * All scanning logic lives in CoreScanner.\n */\n\nimport { execa } from 'execa';\nimport { PromptExecutor, PromptOptions, PromptResult } from '../../core/scanner.js';\nimport { isProviderAvailable, getProviderCommand } from '../detect.js';\n\nconst GEMINI_TIMEOUT = 300000; // 5 minutes\n\nexport class GeminiExecutor implements PromptExecutor {\n name = 'gemini';\n\n async isAvailable(): Promise<boolean> {\n return isProviderAvailable('gemini');\n }\n\n async runPrompt(prompt: string, options: PromptOptions): Promise<PromptResult> {\n const geminiCommand = getProviderCommand('gemini');\n\n try {\n const { stdout, stderr } = await execa(\n geminiCommand,\n ['-p', prompt],\n {\n cwd: options.cwd,\n timeout: options.timeout || GEMINI_TIMEOUT,\n env: {\n ...process.env,\n NO_COLOR: '1',\n },\n reject: false,\n }\n );\n\n // Check for API errors in stderr before returning\n if (stderr) {\n // Rate limit errors\n if (stderr.includes('429') || stderr.includes('rate limit') || stderr.includes('quota exceeded')) {\n throw new Error('Gemini API rate limit reached. Try again later.');\n }\n // Authentication errors\n if (stderr.includes('401') || stderr.includes('403') || stderr.includes('unauthorized') || stderr.includes('invalid api key')) {\n throw new Error('Gemini API authentication failed. Check your API key.');\n }\n // Generic errors that indicate complete failure\n if ((stderr.includes('Error') || stderr.includes('error')) && !stdout) {\n throw new Error(`Gemini error: ${stderr.substring(0, 200)}`);\n }\n }\n\n return {\n output: stdout || '',\n error: stderr || undefined,\n };\n } catch (error: any) {\n if (error.message?.includes('ENOENT')) {\n throw new Error('Gemini CLI not found. Install: npm install -g @google/gemini-cli');\n }\n throw error;\n }\n }\n}\n","/**\n * Aider Executor - Simple prompt execution\n *\n * This is a \"dumb\" executor that just runs prompts via Aider CLI.\n * All scanning logic lives in CoreScanner.\n *\n * Note: Aider is primarily designed for editing files, but we use\n * its --message mode for analysis prompts.\n */\n\nimport { execa } from 'execa';\nimport { PromptExecutor, PromptOptions, PromptResult } from '../../core/scanner.js';\nimport { isProviderAvailable, getProviderCommand } from '../detect.js';\n\nconst AIDER_TIMEOUT = 300000; // 5 minutes\n\nexport class AiderExecutor implements PromptExecutor {\n name = 'aider';\n\n async isAvailable(): Promise<boolean> {\n return isProviderAvailable('aider');\n }\n\n async runPrompt(prompt: string, options: PromptOptions): Promise<PromptResult> {\n const aiderCommand = getProviderCommand('aider');\n\n try {\n const { stdout, stderr } = await execa(\n aiderCommand,\n [\n '--message', prompt,\n '--no-auto-commits',\n '--yes', // Auto-confirm\n ],\n {\n cwd: options.cwd,\n timeout: options.timeout || AIDER_TIMEOUT,\n env: {\n ...process.env,\n NO_COLOR: '1',\n },\n reject: false,\n }\n );\n\n // Check for API errors in stderr before returning\n if (stderr) {\n // Rate limit errors (aider uses OpenAI/Anthropic/etc APIs)\n if (stderr.includes('429') || stderr.includes('rate limit') || stderr.includes('RateLimitError')) {\n throw new Error('Aider API rate limit reached. Try again later.');\n }\n // Authentication errors\n if (stderr.includes('401') || stderr.includes('AuthenticationError') || stderr.includes('invalid api key')) {\n throw new Error('Aider API authentication failed. Check your API key.');\n }\n // Credit/billing errors\n if (stderr.includes('402') || stderr.includes('insufficient') || stderr.includes('billing')) {\n throw new Error('Aider API billing error. Check your account credits.');\n }\n // Generic errors that indicate complete failure\n if ((stderr.includes('Error') || stderr.includes('error')) && !stdout) {\n throw new Error(`Aider error: ${stderr.substring(0, 200)}`);\n }\n }\n\n return {\n output: stdout || '',\n error: stderr || undefined,\n };\n } catch (error: any) {\n if (error.message?.includes('ENOENT')) {\n throw new Error('Aider not found. Install: pip install aider-chat');\n }\n throw error;\n }\n }\n}\n","/**\n * Ollama Executor - Local LLM support\n *\n * Runs prompts via local Ollama server.\n * Requires: ollama installed and a model pulled (e.g., ollama pull codellama)\n */\n\nimport { execa } from 'execa';\nimport { PromptExecutor, PromptOptions, PromptResult } from '../../core/scanner.js';\nimport { isProviderAvailable, getProviderCommand } from '../detect.js';\n\nconst OLLAMA_TIMEOUT = 600000; // 10 minutes (local models can be slow)\nconst DEFAULT_MODEL = 'codellama'; // Good for code analysis\n\nexport class OllamaExecutor implements PromptExecutor {\n name = 'ollama';\n private model: string;\n\n constructor(model: string = DEFAULT_MODEL) {\n this.model = model;\n }\n\n async isAvailable(): Promise<boolean> {\n return isProviderAvailable('ollama');\n }\n\n async runPrompt(prompt: string, options: PromptOptions): Promise<PromptResult> {\n const ollamaCommand = getProviderCommand('ollama');\n\n try {\n const { stdout, stderr } = await execa(\n ollamaCommand,\n ['run', this.model, prompt],\n {\n cwd: options.cwd,\n timeout: options.timeout || OLLAMA_TIMEOUT,\n env: {\n ...process.env,\n NO_COLOR: '1',\n },\n reject: false,\n }\n );\n\n // Check for errors in stderr before returning\n if (stderr) {\n // Connection errors (ollama server not running)\n if (stderr.includes('connection refused') || stderr.includes('ECONNREFUSED')) {\n throw new Error('Ollama server not running. Start it with: ollama serve');\n }\n // Model not found\n if (stderr.includes('model') && (stderr.includes('not found') || stderr.includes('does not exist'))) {\n throw new Error(`Ollama model '${this.model}' not found. Run: ollama pull ${this.model}`);\n }\n // Out of memory\n if (stderr.includes('out of memory') || stderr.includes('OOM')) {\n throw new Error('Ollama out of memory. Try a smaller model or increase system memory.');\n }\n // Generic errors that indicate complete failure\n if ((stderr.includes('Error') || stderr.includes('error')) && !stdout) {\n throw new Error(`Ollama error: ${stderr.substring(0, 200)}`);\n }\n }\n\n return {\n output: stdout || '',\n error: stderr || undefined,\n };\n } catch (error: any) {\n if (error.message?.includes('ENOENT')) {\n throw new Error('Ollama not found. Install from: https://ollama.ai');\n }\n if (error.message?.includes('model') && error.message?.includes('not found')) {\n throw new Error(`Ollama model '${this.model}' not found. Run: ollama pull ${this.model}`);\n }\n throw error;\n }\n }\n}\n","/**\n * Provider Executors - Simple prompt execution implementations\n *\n * All executors implement the PromptExecutor interface.\n * No scanning logic - just run prompts and return results.\n */\n\nimport { PromptExecutor } from '../../core/scanner.js';\nimport { ClaudeCodeExecutor } from './claude-code.js';\nimport { CodexExecutor } from './codex.js';\nimport { GeminiExecutor } from './gemini.js';\nimport { AiderExecutor } from './aider.js';\nimport { OllamaExecutor } from './ollama.js';\nimport { ProviderType } from '../../types.js';\n\nconst executors: Record<string, () => PromptExecutor> = {\n 'claude-code': () => new ClaudeCodeExecutor(),\n 'codex': () => new CodexExecutor(),\n 'gemini': () => new GeminiExecutor(),\n 'aider': () => new AiderExecutor(),\n 'ollama': () => new OllamaExecutor(),\n};\n\n/**\n * Get a prompt executor by provider name\n */\nexport function getExecutor(name: ProviderType): PromptExecutor {\n const factory = executors[name];\n if (!factory) {\n throw new Error(`Unknown provider: ${name}. Available: ${Object.keys(executors).join(', ')}`);\n }\n return factory();\n}\n\n/**\n * Get all available executors\n */\nexport async function getAvailableExecutors(): Promise<PromptExecutor[]> {\n const available: PromptExecutor[] = [];\n\n for (const factory of Object.values(executors)) {\n const executor = factory();\n if (await executor.isAvailable()) {\n available.push(executor);\n }\n }\n\n return available;\n}\n\nexport { ClaudeCodeExecutor } from './claude-code.js';\nexport { CodexExecutor } from './codex.js';\nexport { GeminiExecutor } from './gemini.js';\nexport { AiderExecutor } from './aider.js';\nexport { OllamaExecutor } from './ollama.js';\n","/**\n * Flow Analysis Prompts - Integration & E2E Bug Hunting\n *\n * These prompts tell Claude to TRACE actual code flows, not just pattern match.\n * This is the difference between finding \"there's a SQL query here\" and\n * finding \"user input from /api/users reaches this SQL query without validation\".\n */\n\nimport { FlowPassConfig } from '../../core/flow-analyzer.js';\n\nexport interface StaticFinding {\n tool: string;\n file: string;\n line: number;\n message: string;\n severity: string;\n}\n\nexport interface FlowPromptContext {\n pass: FlowPassConfig;\n projectType: string;\n framework: string;\n language: string;\n totalFiles: number;\n entryPoints?: string[];\n previousFindings?: Array<{\n title: string;\n file: string;\n line: number;\n category: string;\n severity: string;\n }>;\n staticFindings?: StaticFinding[];\n}\n\n/**\n * Build a flow analysis prompt that actually traces code paths\n */\nexport function buildFlowAnalysisPrompt(ctx: FlowPromptContext): string {\n const { pass, projectType, framework, language, totalFiles, entryPoints, previousFindings, staticFindings } = ctx;\n\n const entryPointsSection = entryPoints?.length\n ? `\n## SUGGESTED STARTING POINTS\n${entryPoints.map(e => `- ${e}`).join('\\n')}\n`\n : '';\n\n const previousFindingsSection = previousFindings?.length\n ? `\n## PREVIOUS FINDINGS TO BUILD ON\nThese issues were found in earlier passes. Use them to find chains and deeper issues:\n${previousFindings.map(f => `- [${f.severity}] ${f.title} at ${f.file}:${f.line} (${f.category})`).join('\\n')}\n`\n : '';\n\n const staticSection = staticFindings?.length\n ? `\n## STATIC ANALYSIS SIGNALS (from tsc/eslint - run BEFORE you)\n${staticFindings.slice(0, 15).map(f => `- ${f.tool}: ${f.file}:${f.line} - ${f.message}`).join('\\n')}\n${staticFindings.length > 15 ? `... and ${staticFindings.length - 15} more` : ''}\n\nNOTE: Static tools already verified control flow. Don't report issues they would have caught.\n`\n : '';\n\n const levelDescription = pass.level === 'integration'\n ? 'how components interact across the codebase'\n : 'complete attack scenarios from start to exploitation';\n\n return `You are a security auditor doing ${pass.level.toUpperCase()}-LEVEL analysis.\n\n## YOUR MISSION: ${pass.name.toUpperCase()}\n${pass.description}\n\nYou are looking at ${levelDescription}. This is NOT pattern matching - you must TRACE actual code paths.\n\n## PROJECT CONTEXT\n- Type: ${projectType}\n- Framework: ${framework || 'Unknown'}\n- Language: ${language}\n- Size: ${totalFiles} files\n${entryPointsSection}\n${previousFindingsSection}\n${staticSection}\n## WHAT YOU'RE LOOKING FOR\n${pass.whatToFind.map(w => `- ${w}`).join('\\n')}\n\n## HOW TO DO THIS ANALYSIS\n\n${pass.traceInstructions}\n\n## ENTRY POINTS TO START FROM\n${pass.entryPointPatterns.map(p => `- ${p}`).join('\\n')}\n\n## EXAMPLE VULNERABILITY\nThis is what a real finding looks like for this pass:\n\n\\`\\`\\`\n${pass.exampleVulnerability}\n\\`\\`\\`\n\n## CRITICAL: TRACE, DON'T PATTERN MATCH\n\n❌ WRONG: \"I found exec() in this file, might be command injection\"\n✅ RIGHT: \"User input from req.query.cmd at routes/admin.ts:15 flows through\n buildCommand() at utils/cmd.ts:42 and reaches exec() at utils/cmd.ts:58\n without any sanitization. The full path is:\n 1. routes/admin.ts:15 - cmd = req.query.cmd (user input)\n 2. routes/admin.ts:18 - adminService.runCommand(cmd)\n 3. services/admin.ts:23 - buildCommand(cmd)\n 4. utils/cmd.ts:42 - return 'ls ' + directory (concatenation!)\n 5. utils/cmd.ts:58 - exec(command) (SINK)\n Trigger: GET /admin/run?cmd=; rm -rf /\"\n\n## REPORTING FORMAT\n\nWhen you find a CONFIRMED flow vulnerability:\n\n<json>\n{\n \"type\": \"bug\",\n \"data\": {\n \"file\": \"src/routes/admin.ts\",\n \"line\": 15,\n \"endLine\": 18,\n \"title\": \"Command injection via admin endpoint\",\n \"description\": \"User input from req.query.cmd reaches exec() without sanitization through a 5-step call chain.\",\n \"category\": \"injection\",\n \"severity\": \"critical\",\n \"confidence\": \"high\",\n \"flowType\": \"${pass.level}\",\n \"passName\": \"${pass.name}\",\n \"dataFlow\": [\n {\"step\": 1, \"file\": \"src/routes/admin.ts\", \"line\": 15, \"code\": \"const cmd = req.query.cmd\", \"type\": \"source\", \"explanation\": \"User input enters the system\"},\n {\"step\": 2, \"file\": \"src/routes/admin.ts\", \"line\": 18, \"code\": \"adminService.runCommand(cmd)\", \"type\": \"propagation\", \"explanation\": \"Passed to service layer\"},\n {\"step\": 3, \"file\": \"src/services/admin.ts\", \"line\": 23, \"code\": \"buildCommand(cmd)\", \"type\": \"propagation\", \"explanation\": \"Passed to utility function\"},\n {\"step\": 4, \"file\": \"src/utils/cmd.ts\", \"line\": 42, \"code\": \"return 'ls ' + directory\", \"type\": \"transformation\", \"explanation\": \"Concatenated into command string - NO SANITIZATION\"},\n {\"step\": 5, \"file\": \"src/utils/cmd.ts\", \"line\": 58, \"code\": \"exec(command)\", \"type\": \"sink\", \"explanation\": \"Executed as shell command\"}\n ],\n \"triggerScenario\": \"1. Attacker sends GET /admin/run?cmd=; rm -rf /\\\\n2. Input flows through buildCommand()\\\\n3. exec() runs: ls ; rm -rf /\\\\n4. Server filesystem deleted\",\n \"evidence\": [\n \"No input validation at entry point\",\n \"No sanitization in buildCommand()\",\n \"Direct string concatenation\",\n \"exec() called with user-tainted data\"\n ],\n \"securityControls\": {\n \"present\": [\"Admin route requires auth\"],\n \"missing\": [\"Input sanitization\", \"Command allowlist\", \"Shell escaping\"],\n \"bypassable\": []\n },\n \"suggestedFix\": \"const allowedCommands = ['ls', 'pwd', 'whoami'];\\\\nif (!allowedCommands.includes(cmd)) throw new Error('Invalid command');\\\\nexecFile(cmd, [], callback); // Use execFile with no shell\"\n }\n}\n</json>\n\nFor ${pass.level === 'e2e' ? 'attack chains' : 'integration issues'}, include the FULL flow across all files involved.\n\nProgress updates:\n###SCANNING:path/to/file.ts\n\nWhen done:\n###COMPLETE\n\n## BEGIN\n\nStart by finding ${pass.entryPointPatterns[0]}. Then TRACE the flow through the codebase. Report only CONFIRMED vulnerabilities where you've traced the complete path.\n\nRemember: You're not looking for \"might be vulnerable\" - you're looking for \"I traced the input from A to B to C and it's definitely exploitable because...\"`;\n}\n\n/**\n * Build a prompt for attack chain analysis (uses previous findings)\n */\nexport function buildAttackChainPrompt(\n _ctx: FlowPromptContext,\n allFindings: Array<{\n id: string;\n title: string;\n file: string;\n line: number;\n category: string;\n severity: string;\n description: string;\n }>\n): string {\n const findingsList = allFindings.map(f =>\n `- [${f.id}] ${f.title} (${f.category}, ${f.severity})\n File: ${f.file}:${f.line}\n ${f.description.slice(0, 200)}${f.description.length > 200 ? '...' : ''}`\n ).join('\\n');\n\n return `You are a security auditor looking for ATTACK CHAINS.\n\n## YOUR MISSION\nFind combinations of vulnerabilities that create more severe exploits.\n\nIndividual bugs may be low/medium severity. Combined, they become critical.\n\n## ALL FINDINGS FROM PREVIOUS PASSES\n${findingsList}\n\n## COMMON CHAINS TO LOOK FOR\n\n1. **XSS + Missing CSRF** → Full Account Takeover\n - XSS lets attacker run JS in victim's browser\n - Missing CSRF lets that JS perform actions as victim\n - Combined: Attacker sends XSS link, steals account\n\n2. **Information Disclosure + IDOR** → Mass Data Breach\n - Info disclosure reveals user IDs/patterns\n - IDOR allows accessing any user by ID\n - Combined: Enumerate and dump all user data\n\n3. **SSRF + Cloud Metadata** → Credential Theft\n - SSRF allows internal requests\n - Cloud metadata (169.254.169.254) has credentials\n - Combined: Steal AWS/GCP keys, pivot to infrastructure\n\n4. **Open Redirect + OAuth** → Token Theft\n - Open redirect can redirect anywhere\n - OAuth redirects token to redirect_uri\n - Combined: Redirect OAuth flow to attacker's server\n\n5. **Low-Priv SQLi + Credential Storage** → Full Compromise\n - SQLi with read access only\n - Password hashes in database\n - Combined: Dump hashes, crack passwords, escalate\n\n6. **Race Condition + Financial** → Money Theft\n - Race condition in balance check\n - Financial transaction endpoint\n - Combined: Overdraw account, double-spend\n\n## ANALYSIS INSTRUCTIONS\n\n1. For each finding, ask: \"What else could an attacker do with this?\"\n2. Look for findings that ENABLE each other\n3. Look for findings in the same USER FLOW\n4. Consider: If attacker has A, how does that help exploit B?\n\n## REPORTING FORMAT\n\nWhen you find a chain:\n\n<json>\n{\n \"type\": \"bug\",\n \"data\": {\n \"title\": \"Attack Chain: XSS + Missing CSRF = Account Takeover\",\n \"description\": \"Combining reflected XSS (WR-003) with missing CSRF on profile update (WR-007) allows complete account takeover.\",\n \"category\": \"auth-bypass\",\n \"severity\": \"critical\",\n \"confidence\": \"high\",\n \"flowType\": \"e2e\",\n \"passName\": \"attack-chain-analysis\",\n \"chain\": {\n \"components\": [\"WR-003\", \"WR-007\"],\n \"steps\": [\n \"1. Attacker crafts URL with XSS payload targeting /search endpoint\",\n \"2. Victim (admin) clicks link, XSS executes in their browser\",\n \"3. XSS payload calls /api/profile/update with attacker's email\",\n \"4. No CSRF token required - request succeeds\",\n \"5. Password reset sent to attacker's email\",\n \"6. Attacker now controls admin account\"\n ],\n \"individualSeverities\": [\"medium\", \"medium\"],\n \"combinedSeverity\": \"critical\",\n \"amplification\": \"Medium + Medium = Critical account takeover\"\n },\n \"evidence\": [\n \"XSS confirmed exploitable at /search\",\n \"Profile update has no CSRF protection\",\n \"Both endpoints accessible in same origin\"\n ],\n \"suggestedFix\": \"1. Fix XSS: Encode output in search results\\\\n2. Add CSRF tokens to all state-changing requests\\\\n3. Require password for email changes\"\n }\n}\n</json>\n\n## BEGIN\n\nReview all findings. Find chains. Report only CONFIRMED chains where you've verified both components work together.`;\n}\n\n/**\n * Build prompt for validating a specific flow finding\n */\nexport function buildFlowValidationPrompt(finding: {\n title: string;\n file: string;\n line: number;\n description: string;\n dataFlow: Array<{ step: number; file: string; line: number; explanation: string }>;\n}): string {\n const flowSteps = finding.dataFlow.map(s =>\n `${s.step}. ${s.file}:${s.line} - ${s.explanation}`\n ).join('\\n');\n\n return `You are validating a flow-based vulnerability finding. Your job is to CHALLENGE it.\n\n## FINDING TO VALIDATE\n- Title: ${finding.title}\n- Location: ${finding.file}:${finding.line}\n- Description: ${finding.description}\n\n## CLAIMED DATA FLOW\n${flowSteps}\n\n## YOUR TASK\n\n1. Read EACH file in the flow\n2. Verify the data actually flows as claimed\n3. Look for GUARDS that might prevent exploitation:\n - Validation between steps\n - Type checking\n - Sanitization\n - Error handling that stops the flow\n\n## QUESTIONS TO ANSWER\n\n1. Does the input actually reach step 1 as claimed?\n2. At each step, is data passed WITHOUT transformation?\n3. Are there guards between any steps?\n4. Does the final sink actually execute with tainted data?\n5. Is this flow actually reachable in production?\n\n## REPORT FORMAT\n\n<json>\n{\n \"verdict\": \"confirmed|rejected|needs-review\",\n \"confidence\": \"high|medium|low\",\n \"flowVerified\": true|false,\n \"guardsFound\": [\n {\"location\": \"file:line\", \"type\": \"validation|sanitization|error-handling\", \"description\": \"What it does\"}\n ],\n \"reasoning\": \"Detailed explanation of your verdict\",\n \"adjustedSeverity\": \"critical|high|medium|low|null\"\n}\n</json>\n\nIf you find guards, explain whether they actually prevent exploitation or can be bypassed.`;\n}\n\n/**\n * Get the full analysis pipeline order\n * Unit passes → Integration passes → E2E passes\n */\nexport function getFullAnalysisPipeline(): { phase: string; passes: string[] }[] {\n return [\n {\n phase: 'Unit Analysis',\n passes: [\n 'injection',\n 'auth-bypass',\n 'null-safety',\n 'type-safety',\n 'resource-leaks',\n 'async-issues',\n 'data-validation',\n 'secrets-exposure',\n 'logic-errors',\n ],\n },\n {\n phase: 'Integration Analysis',\n passes: [\n 'auth-flow-trace',\n 'data-flow-trace',\n 'validation-boundary-trace',\n 'error-propagation-trace',\n 'trust-boundary-trace',\n ],\n },\n {\n phase: 'E2E Analysis',\n passes: [\n 'attack-chain-analysis',\n 'privilege-escalation-trace',\n 'session-lifecycle-trace',\n 'user-journey-simulation',\n 'api-contract-verification',\n ],\n },\n ];\n}\n","/**\n * CWE (Common Weakness Enumeration) Patterns Database\n *\n * RAG-style retrieval of known vulnerability patterns based on project type.\n * These patterns are injected into prompts to guide the LLM on what to look for.\n */\n\nexport interface CWEPattern {\n id: string;\n name: string;\n description: string;\n category: string;\n codePatterns: string[];\n languages: string[];\n projectTypes: string[];\n}\n\n// Top 25 CWE patterns most relevant for modern web/API development\nexport const CWE_PATTERNS: CWEPattern[] = [\n // INJECTION VULNERABILITIES\n {\n id: 'CWE-89',\n name: 'SQL Injection',\n description: 'User input concatenated into SQL queries without parameterization',\n category: 'injection',\n codePatterns: [\n 'String concatenation in SQL: query = \"SELECT * FROM users WHERE id = \" + userId',\n 'Template literals in SQL: `SELECT * FROM ${table} WHERE ${column} = ${value}`',\n 'Missing parameterized queries when using raw SQL',\n ],\n languages: ['javascript', 'typescript', 'python', 'java', 'go'],\n projectTypes: ['api', 'fullstack', 'web-app'],\n },\n {\n id: 'CWE-79',\n name: 'Cross-Site Scripting (XSS)',\n description: 'User input rendered in HTML without proper escaping',\n category: 'injection',\n codePatterns: [\n 'innerHTML = userInput',\n 'dangerouslySetInnerHTML={{ __html: userContent }}',\n 'document.write(userInput)',\n 'eval(userInput)',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['web-app', 'fullstack'],\n },\n {\n id: 'CWE-78',\n name: 'OS Command Injection',\n description: 'User input passed to shell commands without sanitization',\n category: 'injection',\n codePatterns: [\n 'exec(userInput)',\n 'spawn(command + userInput)',\n 'child_process with unsanitized input',\n 'shell: true with user-controlled arguments',\n ],\n languages: ['javascript', 'typescript', 'python'],\n projectTypes: ['api', 'cli', 'fullstack'],\n },\n {\n id: 'CWE-22',\n name: 'Path Traversal',\n description: 'User input used in file paths without validation, allowing ../../../ attacks',\n category: 'injection',\n codePatterns: [\n 'readFile(basePath + userInput)',\n 'join(uploadDir, filename) without basename extraction',\n 'Missing path.resolve and startsWith check',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'cli', 'fullstack'],\n },\n\n // AUTHENTICATION/AUTHORIZATION\n {\n id: 'CWE-287',\n name: 'Improper Authentication',\n description: 'Missing or bypassable authentication checks',\n category: 'auth-bypass',\n codePatterns: [\n 'API routes without auth middleware',\n 'Authentication check returns early but continues execution',\n 'Token verification that catches exceptions and continues',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'web-app'],\n },\n {\n id: 'CWE-862',\n name: 'Missing Authorization',\n description: 'Actions performed without checking user permissions',\n category: 'auth-bypass',\n codePatterns: [\n 'Delete/update operations without ownership check',\n 'Admin endpoints accessible to regular users',\n 'Missing role-based access control',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack'],\n },\n {\n id: 'CWE-306',\n name: 'Missing Authentication for Critical Function',\n description: 'Sensitive operations without requiring authentication',\n category: 'auth-bypass',\n codePatterns: [\n 'Password reset without token verification',\n 'Account deletion without re-authentication',\n 'Payment processing without session validation',\n ],\n languages: ['javascript', 'typescript', 'python'],\n projectTypes: ['api', 'fullstack', 'web-app'],\n },\n\n // SENSITIVE DATA EXPOSURE\n {\n id: 'CWE-798',\n name: 'Hardcoded Credentials',\n description: 'Passwords, API keys, or secrets hardcoded in source code',\n category: 'secrets-exposure',\n codePatterns: [\n 'const API_KEY = \"sk-...\"',\n 'password = \"admin123\"',\n 'Credentials in config files committed to repo',\n ],\n languages: ['javascript', 'typescript', 'python', 'go', 'java'],\n projectTypes: ['api', 'fullstack', 'cli', 'library'],\n },\n {\n id: 'CWE-532',\n name: 'Sensitive Info in Logs',\n description: 'Passwords, tokens, or PII written to log files',\n category: 'secrets-exposure',\n codePatterns: [\n 'console.log(user) where user contains password',\n 'logger.info(request.body) with sensitive fields',\n 'Error messages exposing database credentials',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'cli'],\n },\n\n // NULL REFERENCE / UNDEFINED\n {\n id: 'CWE-476',\n name: 'NULL Pointer Dereference',\n description: 'Accessing properties of null/undefined without checking',\n category: 'null-reference',\n codePatterns: [\n 'user.profile.name without null check on user or profile',\n 'array[0].property when array might be empty',\n 'Optional chaining missing: obj.prop instead of obj?.prop',\n 'Async function returns null but caller assumes object',\n ],\n languages: ['javascript', 'typescript', 'go', 'java'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // RESOURCE MANAGEMENT\n {\n id: 'CWE-772',\n name: 'Missing Release of Resource',\n description: 'File handles, connections, or timers not properly closed/cleared',\n category: 'resource-leak',\n codePatterns: [\n 'setInterval without corresponding clearInterval',\n 'Database connection opened but not closed in error path',\n 'File opened with fs.open but not closed on exception',\n 'Event listeners added but never removed',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'cli', 'library'],\n },\n {\n id: 'CWE-401',\n name: 'Memory Leak',\n description: 'Memory allocated but never freed, growing unboundedly',\n category: 'resource-leak',\n codePatterns: [\n 'Global arrays/maps that grow without bounds',\n 'Closures holding references preventing garbage collection',\n 'Cache without eviction policy',\n ],\n languages: ['javascript', 'typescript', 'go'],\n projectTypes: ['api', 'fullstack', 'cli'],\n },\n\n // ASYNC ISSUES\n {\n id: 'CWE-367',\n name: 'Time-of-Check Time-of-Use (TOCTOU)',\n description: 'Race condition between checking a condition and using the result',\n category: 'async-issue',\n codePatterns: [\n 'if (exists(file)) { read(file) } - file could be deleted between check and read',\n 'Check balance then deduct - concurrent requests could overdraw',\n 'Verify permission then perform action without transaction',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack'],\n },\n {\n id: 'CWE-662',\n name: 'Improper Synchronization',\n description: 'Missing await, unhandled promises, or race conditions',\n category: 'async-issue',\n codePatterns: [\n 'async function called without await',\n 'Promise.all with no error handling',\n '.then() without .catch()',\n 'Shared state modified in parallel without locking',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli'],\n },\n\n // INPUT VALIDATION\n {\n id: 'CWE-20',\n name: 'Improper Input Validation',\n description: 'User input not validated before processing',\n category: 'data-validation',\n codePatterns: [\n 'req.body used directly without schema validation',\n 'parseInt(userInput) without checking for NaN',\n 'Array index from user input without bounds check',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'web-app'],\n },\n {\n id: 'CWE-1284',\n name: 'Improper Validation of Array Index',\n description: 'Array accessed with user-controlled index without bounds checking',\n category: 'boundary-error',\n codePatterns: [\n 'items[userIndex] without checking userIndex < items.length',\n 'Negative index not checked: items[id] where id could be -1',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'library'],\n },\n\n // TYPE COERCION\n {\n id: 'CWE-843',\n name: 'Type Confusion',\n description: 'Incorrect type assumptions leading to unexpected behavior',\n category: 'type-coercion',\n codePatterns: [\n 'if (value) when value could be 0 or empty string (both falsy but valid)',\n '== instead of === causing type coercion',\n 'JSON.parse result used without type checking',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'library'],\n },\n\n // LOGIC ERRORS\n {\n id: 'CWE-670',\n name: 'Always-Incorrect Control Flow',\n description: 'Logic that always takes wrong branch or never executes',\n category: 'logic-error',\n codePatterns: [\n 'if (x = 5) instead of if (x === 5) - assignment instead of comparison',\n 'if (a && a) - duplicate condition',\n 'Loop that never executes or never terminates',\n 'Return statement before important code',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n {\n id: 'CWE-480',\n name: 'Use of Incorrect Operator',\n description: 'Wrong operator used (& vs &&, | vs ||, etc.)',\n category: 'logic-error',\n codePatterns: [\n '& instead of && (bitwise vs logical)',\n '| instead of || (bitwise vs logical)',\n '+ with strings causing concatenation instead of addition',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'library'],\n },\n\n // INSECURE RANDOMNESS\n {\n id: 'CWE-330',\n name: 'Insufficient Randomness',\n description: 'Using weak random number generators for security-sensitive operations',\n category: 'secrets-exposure',\n codePatterns: [\n 'Math.random() used for IDs, tokens, or keys',\n 'Math.random().toString(36) for unique identifiers',\n 'Date.now() as sole source of uniqueness',\n 'Sequential IDs that can be guessed',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // UNSAFE TYPE ASSERTIONS\n {\n id: 'CWE-704',\n name: 'Incorrect Type Conversion',\n description: 'Unsafe type assertions that bypass type checking',\n category: 'type-coercion',\n codePatterns: [\n 'as any - bypasses all type checking',\n 'as unknown as T - double assertion to force types',\n '! (non-null assertion) - assumes value is not null without checking',\n 'Type assertion on API response without validation',\n ],\n languages: ['typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // UNSAFE JSON PARSING\n {\n id: 'CWE-502',\n name: 'Unsafe Deserialization',\n description: 'JSON.parse or similar without validation or error handling',\n category: 'data-validation',\n codePatterns: [\n 'JSON.parse(input) without try/catch',\n 'JSON.parse result used directly without schema validation',\n 'Zod/Joi schema exists but not used for parsing',\n 'Type assertion after JSON.parse: JSON.parse(x) as MyType',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // REGEX ISSUES\n {\n id: 'CWE-185',\n name: 'Incorrect Regular Expression',\n description: 'Regex that matches unintended content or misses edge cases',\n category: 'logic-error',\n codePatterns: [\n 'Regex matching braces/brackets without skipping strings: line.match(/{/g)',\n 'Unanchored regex that matches substrings: /pattern/ instead of /^pattern$/',\n 'Regex without escaping special chars in user input',\n 'Greedy matching that captures too much: .* instead of .*?',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // STRING MANIPULATION ERRORS\n {\n id: 'CWE-131',\n name: 'Incorrect Buffer Size',\n description: 'String slice/substring with incorrect bounds',\n category: 'boundary-error',\n codePatterns: [\n 'str.slice(0, str.length - x) where x could exceed length',\n 'str.substring(start, end) without validating start < end',\n 'Array index from string length calculation without bounds check',\n 'Negative index to slice without checking string length',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // MISSING NULL CHECKS BEFORE METHOD CALLS\n {\n id: 'CWE-252',\n name: 'Unchecked Return Value',\n description: 'Calling methods on values that could be null/undefined',\n category: 'null-reference',\n codePatterns: [\n '.map() on potentially undefined array: items.map() without items &&',\n '.filter()/.reduce() on optional property without null check',\n 'Object.keys(obj) where obj could be undefined',\n 'Chained method calls without optional chaining: a.b.c.map()',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // WEAK VALIDATION\n {\n id: 'CWE-183',\n name: 'Permissive Whitelist',\n description: 'Validation logic that accepts invalid input',\n category: 'data-validation',\n codePatterns: [\n 'Validation that accepts if ANY condition passes instead of ALL',\n 'Length-based validation as only check for correctness',\n 'Regex that allows injection via alternation: (valid|.+)',\n 'Fallback to default on validation failure instead of rejecting',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n];\n\n/**\n * Get relevant CWE patterns for a specific project type and language\n */\nexport function getRelevantPatterns(\n projectType: string,\n language: string\n): CWEPattern[] {\n return CWE_PATTERNS.filter(pattern =>\n pattern.projectTypes.includes(projectType) &&\n pattern.languages.includes(language.toLowerCase())\n );\n}\n\n/**\n * Get patterns for a specific bug category\n */\nexport function getPatternsForCategory(category: string): CWEPattern[] {\n return CWE_PATTERNS.filter(pattern => pattern.category === category);\n}\n\n/**\n * Format patterns for injection into prompt (RAG-style)\n */\nexport function formatPatternsForPrompt(patterns: CWEPattern[]): string {\n if (patterns.length === 0) return '';\n\n const sections: string[] = [];\n\n // Group by category\n const byCategory = new Map<string, CWEPattern[]>();\n for (const pattern of patterns) {\n const existing = byCategory.get(pattern.category) || [];\n existing.push(pattern);\n byCategory.set(pattern.category, existing);\n }\n\n for (const [category, categoryPatterns] of byCategory) {\n const categoryLines = [`## ${category.toUpperCase()} Vulnerabilities to Check:`];\n\n for (const pattern of categoryPatterns) {\n categoryLines.push(`\\n### ${pattern.id}: ${pattern.name}`);\n categoryLines.push(`${pattern.description}`);\n categoryLines.push(`Look for patterns like:`);\n for (const code of pattern.codePatterns) {\n categoryLines.push(` - ${code}`);\n }\n }\n\n sections.push(categoryLines.join('\\n'));\n }\n\n return sections.join('\\n\\n');\n}\n\n/**\n * Get a focused set of patterns for category-specific analysis\n */\nexport function getCategoryFocusedPatterns(category: string): string {\n const patterns = getPatternsForCategory(category);\n if (patterns.length === 0) return '';\n\n const lines = [`KNOWN ${category.toUpperCase()} PATTERNS TO DETECT:\\n`];\n\n for (const pattern of patterns) {\n lines.push(`${pattern.id} - ${pattern.name}:`);\n lines.push(` ${pattern.description}`);\n lines.push(` Common code patterns:`);\n for (const code of pattern.codePatterns) {\n lines.push(` * ${code}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","/**\n * Multi-Pass Prompts - Laser-focused prompts for each bug category\n *\n * Each prompt is designed to:\n * 1. Focus on ONE category only - no distractions\n * 2. Provide specific search patterns and grep queries\n * 3. Give clear methodology for finding bugs\n * 4. Include false positive hints to reduce noise\n * 5. Require exact fix code for confirmation\n */\n\nimport { PassConfig } from '../../core/multipass-scanner.js';\nimport { getCategoryFocusedPatterns } from './cwe-patterns.js';\n\nexport interface StaticFinding {\n tool: string;\n file: string;\n line: number;\n message: string;\n severity: string;\n}\n\nexport interface PassPromptContext {\n pass: PassConfig;\n projectType: string;\n framework: string;\n language: string;\n totalFiles: number;\n entryPoints?: string[];\n staticFindings?: StaticFinding[];\n}\n\n/**\n * Build a laser-focused prompt for a single pass\n */\nexport function buildPassPrompt(ctx: PassPromptContext): string {\n const { pass, projectType, framework, language, totalFiles, entryPoints } = ctx;\n\n // Get CWE patterns for this category\n const cwePatterns = getCategoryFocusedPatterns(pass.category);\n\n const entryPointsSection = entryPoints?.length\n ? `\n## STARTING POINTS\nThese files are likely entry points - good places to start tracing data flow:\n${entryPoints.map(e => `- ${e}`).join('\\n')}\n`\n : '';\n\n // Include static analysis findings if available\n const staticSection = ctx.staticFindings?.length\n ? `\n## STATIC ANALYSIS SIGNALS (from tsc/eslint - run BEFORE you)\nThese issues were found by static analysis tools. Use them as starting points:\n${ctx.staticFindings.slice(0, 20).map(f => `- ${f.tool}: ${f.file}:${f.line} - ${f.message}`).join('\\n')}\n${ctx.staticFindings.length > 20 ? `\\n... and ${ctx.staticFindings.length - 20} more` : ''}\n\nIMPORTANT: Static tools already checked control flow, types, and reachability.\nIf they didn't flag something, it's likely NOT a bug (early returns, guards, etc. are handled).\nFocus on SEMANTIC issues static tools can't catch (logic errors, business logic, auth bypass).\n`\n : '';\n\n return `You are a security specialist. Your ONLY job is to find ${pass.name.toUpperCase()} bugs.\n\n## YOUR SINGLE MISSION\nFind ${pass.description} vulnerabilities in this codebase. IGNORE everything else.\n\n## PROJECT CONTEXT\n- Type: ${projectType}\n- Framework: ${framework || 'Unknown'}\n- Language: ${language}\n- Size: ${totalFiles} files\n${entryPointsSection}\n${staticSection}\n## WHAT TO LOOK FOR\n\n${pass.searchPatterns.map(p => `- ${p}`).join('\\n')}\n\n## SEARCH STRATEGY\n\nUse these grep patterns to find potential issues:\n${pass.grepPatterns.map(p => `\\`${p}\\``).join('\\n')}\n\n## METHODOLOGY\n\n${pass.methodology}\n\n## FALSE POSITIVE HINTS\n\nThese are often NOT bugs - verify before reporting:\n${pass.falsePositiveHints.map(h => `- ${h}`).join('\\n')}\n\n${cwePatterns ? `## KNOWN VULNERABILITY PATTERNS\\n${cwePatterns}` : ''}\n\n## REPORTING GUIDELINES\n\n1. **ONLY ${pass.name.toUpperCase()} ISSUES** - Focus on this category\n2. **REPORT POTENTIAL ISSUES** - If something looks suspicious, report it. Better to flag potential issues than miss real bugs.\n3. **INCLUDE CODE SMELLS** - Report risky patterns even if not immediately exploitable (set kind: \"smell\")\n4. **TRACE THE DATA** - Follow user input to potentially vulnerable sinks\n5. **BE SPECIFIC** - Include exact file, line number, and what makes it suspicious\n6. **SUGGESTED FIX IS OPTIONAL** - Nice to have but not required. Report the issue even without a fix.\n\n## REPORTING FORMAT\n\nWhen you find a ${pass.name} issue (bug or code smell):\n\n<json>\n{\n \"type\": \"bug\",\n \"data\": {\n \"file\": \"src/api/users.ts\",\n \"line\": 42,\n \"endLine\": 45,\n \"title\": \"Short description of the issue\",\n \"description\": \"Explanation of why this is problematic and potential impact.\",\n \"kind\": \"bug|smell\",\n \"category\": \"${pass.category}\",\n \"severity\": \"critical|high|medium|low\",\n \"confidence\": \"high|medium|low\",\n \"evidence\": [\n \"Evidence point 1\",\n \"Evidence point 2\"\n ],\n \"suggestedFix\": \"Optional: how to fix it\"\n }\n}\n</json>\n\nUse kind=\"bug\" for confirmed vulnerabilities, kind=\"smell\" for risky patterns that need review.\n\nProgress updates:\n###SCANNING:path/to/file.ts\n\nWhen done:\n###COMPLETE\n\n## BEGIN\n\nStart by searching for ${pass.name} patterns using grep. Read at least 10-15 files that match the patterns. Report issues as you find them.\n\nIMPORTANT:\n- Report ANYTHING suspicious - we'll filter false positives later\n- Include code smells and risky patterns, not just confirmed exploits\n- If unsure, report it with confidence=\"low\"\n- Aim for thoroughness - finding 10 potential issues is better than finding 0 confirmed bugs`;\n}\n\n/**\n * Build prompt for the final adversarial validation pass\n */\nexport function buildAdversarialPassPrompt(bugs: Array<{\n id: string;\n title: string;\n file: string;\n line: number;\n description: string;\n category: string;\n severity: string;\n}>): string {\n const bugList = bugs.map((b, i) => `\n### Bug ${i + 1}: ${b.title}\n- File: ${b.file}:${b.line}\n- Category: ${b.category}\n- Severity: ${b.severity}\n- Description: ${b.description}\n`).join('\\n');\n\n return `You are a senior engineer reviewing bug reports. Your job is to CHALLENGE each finding.\n\n## YOUR MISSION\nFor each bug, try to prove it's a FALSE POSITIVE. Look for:\n- Guards or validation that were missed\n- Framework protections that make it safe\n- Context that makes the scenario unrealistic\n- Misunderstanding of the code's purpose\n\n## BUGS TO REVIEW\n${bugList}\n\n## METHODOLOGY\n\nFor each bug:\n1. Read the code at the reported location\n2. Look UPSTREAM for validation/guards\n3. Check framework documentation for built-in protections\n4. Consider if the attack scenario is realistic\n5. Try to construct a counter-argument\n\n## REPORTING FORMAT\n\nFor each bug, report your findings:\n\n<json>\n{\n \"bugId\": \"WR-001\",\n \"verdict\": \"confirmed|rejected|needs-review\",\n \"confidence\": \"high|medium|low\",\n \"counterArguments\": [\n \"Counter argument 1\",\n \"Counter argument 2\"\n ],\n \"additionalEvidence\": [\n \"Evidence supporting rejection\"\n ],\n \"reasoning\": \"Explanation of your verdict\"\n}\n</json>\n\nWhen done with all bugs:\n###COMPLETE\n\n## BEGIN\n\nReview each bug. Be skeptical. Reject anything that isn't clearly exploitable.`;\n}\n\n/**\n * Build a quick summary prompt to describe findings in human terms\n */\nexport function buildHumanReadableSummaryPrompt(bug: {\n title: string;\n file: string;\n line: number;\n description: string;\n category: string;\n severity: string;\n evidence: string[];\n suggestedFix?: string;\n}): string {\n return `Convert this technical bug report into a tester-friendly format.\n\n## ORIGINAL BUG\n- Title: ${bug.title}\n- File: ${bug.file}:${bug.line}\n- Category: ${bug.category}\n- Severity: ${bug.severity}\n- Description: ${bug.description}\n- Evidence: ${bug.evidence.join(', ')}\n${bug.suggestedFix ? `- Fix: ${bug.suggestedFix}` : ''}\n\n## CONVERT TO TESTER FORMAT\n\nCreate a report with:\n1. **Title** = What goes wrong (outcome, not implementation)\n2. **What happens** = Plain English consequence (no code terms)\n3. **How to trigger** = Steps a QA tester would take\n4. **Impact** = Why the business/user should care\n5. **Technical details** = Original technical info (for devs)\n\nRespond with JSON:\n<json>\n{\n \"humanTitle\": \"User-friendly title describing the problem\",\n \"whatHappens\": \"Plain English explanation of the bug's effect\",\n \"howToTrigger\": [\"Step 1\", \"Step 2\", \"Step 3\"],\n \"impact\": \"Business impact statement\",\n \"technicalTitle\": \"${bug.title}\",\n \"technicalDetails\": \"Original technical description\"\n}\n</json>`;\n}\n\n/**\n * Severity-specific guidance for prompts\n */\nexport const SEVERITY_THRESHOLDS = {\n critical: {\n description: 'Immediate exploitation possible, data breach or RCE',\n examples: [\n 'SQL injection in login endpoint',\n 'Command injection with user input',\n 'Hardcoded admin credentials',\n 'Auth bypass in payment flow',\n ],\n },\n high: {\n description: 'Significant risk with some exploitation barriers',\n examples: [\n 'XSS requiring social engineering',\n 'IDOR accessing other users data',\n 'Path traversal with limited scope',\n 'Weak crypto in sensitive operations',\n ],\n },\n medium: {\n description: 'Moderate risk, requires specific conditions',\n examples: [\n 'Information disclosure in errors',\n 'Missing rate limiting on auth',\n 'Unsafe deserialization of trusted input',\n 'Type confusion in edge cases',\n ],\n },\n low: {\n description: 'Minor issues, defense in depth concerns',\n examples: [\n 'Verbose error messages',\n 'Missing security headers',\n 'Deprecated crypto (but not broken)',\n 'Code quality issues with security implications',\n ],\n },\n};\n\n/**\n * Category-specific pass order (can be customized based on project type)\n */\nexport function getPassOrderForProject(projectType: string): string[] {\n const baseOrder = [\n 'injection',\n 'auth-bypass',\n 'secrets-exposure',\n 'null-safety',\n 'type-safety',\n 'async-issues',\n 'data-validation',\n 'resource-leaks',\n 'logic-errors',\n 'cross-file-flow',\n ];\n\n // Prioritize passes based on project type\n switch (projectType.toLowerCase()) {\n case 'api':\n case 'backend':\n // APIs: focus on injection and auth first\n return ['injection', 'auth-bypass', 'data-validation', 'secrets-exposure', ...baseOrder.filter(p => !['injection', 'auth-bypass', 'data-validation', 'secrets-exposure'].includes(p))];\n\n case 'web-app':\n case 'frontend':\n // Frontend: XSS and client-side issues\n return ['injection', 'secrets-exposure', 'type-safety', 'null-safety', ...baseOrder.filter(p => !['injection', 'secrets-exposure', 'type-safety', 'null-safety'].includes(p))];\n\n case 'cli':\n // CLI: command injection and path traversal\n return ['injection', 'data-validation', 'null-safety', 'async-issues', ...baseOrder.filter(p => !['injection', 'data-validation', 'null-safety', 'async-issues'].includes(p))];\n\n case 'library':\n // Libraries: type safety and API contracts\n return ['type-safety', 'null-safety', 'cross-file-flow', 'logic-errors', ...baseOrder.filter(p => !['type-safety', 'null-safety', 'cross-file-flow', 'logic-errors'].includes(p))];\n\n default:\n return baseOrder;\n }\n}\n","/**\n * Shared constants for whiterose prompts\n */\n\n// ─────────────────────────────────────────────────────────────\n// LOC Slabs for tiered scanning\n// ─────────────────────────────────────────────────────────────\n\nexport type Slab = 'XS' | 'S' | 'M' | 'L' | 'XL';\n\nexport const SLAB_THRESHOLDS = {\n XS: 5000, // < 5K LOC\n S: 20000, // 5K - 20K LOC\n M: 100000, // 20K - 100K LOC\n L: 500000, // 100K - 500K LOC\n // XL: > 500K LOC\n} as const;\n\nexport function detectSlab(totalLOC: number): Slab {\n if (totalLOC < SLAB_THRESHOLDS.XS) return 'XS';\n if (totalLOC < SLAB_THRESHOLDS.S) return 'S';\n if (totalLOC < SLAB_THRESHOLDS.M) return 'M';\n if (totalLOC < SLAB_THRESHOLDS.L) return 'L';\n return 'XL';\n}\n\nexport function getScopeInstructions(slab: Slab): string {\n switch (slab) {\n case 'XS':\n case 'S':\n return 'SCOPE: Analyze ALL files in the codebase. This is a small project - be thorough.';\n case 'M':\n return 'SCOPE: Focus on entry points, API routes, and data processing. You may read other files for context but prioritize critical paths (auth, payments, user data).';\n case 'L':\n return 'SCOPE: Focus on security boundaries and critical data flows. Trace user input through processing to output. Prioritize: authentication, authorization, database operations, file handling.';\n case 'XL':\n return 'SCOPE: STRICT - Focus only on changed files and their immediate dependencies. Do not explore the entire codebase. Analyze security implications of changes.';\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Bug Categories\n// ─────────────────────────────────────────────────────────────\n\nexport const BUG_CATEGORIES_PROMPT = `BUG CATEGORIES (use EXACTLY these strings):\nSECURITY:\n- injection: SQL injection, XSS, command injection, path traversal, SSRF\n- auth-bypass: Authentication/authorization flaws, privilege escalation, session issues\n- secrets-exposure: Hardcoded credentials, leaked tokens, exposed API keys, sensitive data in logs\n\nRELIABILITY:\n- null-reference: Null/undefined dereference, missing optional chaining, unchecked return values\n- boundary-error: Off-by-one, array out of bounds, integer overflow/underflow, loop boundary issues\n- resource-leak: Unclosed connections, file handles, memory leaks, uncleared timers/intervals\n- async-issue: Missing await, unhandled promise rejections, race conditions, callback errors\n\nCORRECTNESS:\n- logic-error: Wrong operators, incorrect conditions, bad math, wrong comparisons, inverted logic\n- data-validation: Missing input validation, format checking, sanitization, constraint violations\n- type-coercion: Implicit coercion bugs, wrong type handling, NaN propagation, falsy confusion\n\nDESIGN:\n- concurrency: Thread safety, deadlocks, shared state mutation, atomic operation violations\n- intent-violation: Code contradicts comments, misleading names, unexpected side effects`;\n\n// ─────────────────────────────────────────────────────────────\n// Severity Definitions\n// ─────────────────────────────────────────────────────────────\n\nexport const SEVERITY_DEFINITIONS_PROMPT = `SEVERITY DEFINITIONS:\n- critical: Security breach allowing unauthorized access, data exfiltration, RCE. Production crash affecting ALL users. Data corruption/loss.\n- high: Bugs that WILL cause incorrect behavior for MANY users under normal usage. Partial data corruption. Security issues with limited scope.\n- medium: Bugs that COULD cause issues under specific conditions. Edge cases. Non-critical security hardening.\n- low: Minor issues. Defensive improvements. Code that works but is fragile.`;\n\n// ─────────────────────────────────────────────────────────────\n// Project Types\n// ─────────────────────────────────────────────────────────────\n\nexport const PROJECT_TYPES_PROMPT = `PROJECT TYPE OPTIONS (pick the best fit):\n- api: REST/GraphQL backend service\n- web-app: Frontend web application (React, Vue, Angular, etc.)\n- fullstack: Combined frontend + backend in one repo\n- cli: Command-line tool\n- library: Reusable package/module for other projects\n- monorepo: Multi-package repository\n- mobile: Mobile application (React Native, Flutter, etc.)\n- desktop: Desktop application (Electron, Tauri, etc.)\n- other: Doesn't fit above categories`;\n\n// ─────────────────────────────────────────────────────────────\n// Feature Priority Rules\n// ─────────────────────────────────────────────────────────────\n\nexport const FEATURE_PRIORITY_PROMPT = `FEATURE PRIORITY RULES:\n- critical: Authentication, payments, checkout, admin access, data encryption, secrets management\n- high: User data handling, API endpoints, database operations, file uploads, external integrations\n- medium: UI components, formatting, logging, caching, search, notifications\n- low: Dev tooling, documentation generation, tests, examples, analytics`;\n\n// ─────────────────────────────────────────────────────────────\n// Output Format Constants\n// ─────────────────────────────────────────────────────────────\n\nexport const JSON_OUTPUT_INSTRUCTION = `CRITICAL OUTPUT RULE: All output MUST be valid JSON wrapped in <json></json> tags. No explanations, no markdown, no prose outside the tags.`;\n\nexport const TYPESCRIPT_WARNING = `CRITICAL: DO NOT trust TypeScript type annotations. Types exist only at compile-time. A variable typed as 'string' can be null/undefined at runtime. Always verify actual runtime guards.`;\n\n// ─────────────────────────────────────────────────────────────\n// Chain-of-Thought Analysis Methodology\n// ─────────────────────────────────────────────────────────────\n\nexport const CHAIN_OF_THOUGHT_METHODOLOGY = `CHAIN-OF-THOUGHT ANALYSIS METHODOLOGY:\n\nFor EACH function/method you analyze, follow these steps IN ORDER:\n\n**STEP 1: UNDERSTAND**\n- What does this function do? (1 sentence summary)\n- What are the inputs? (parameters, external data, config, environment)\n- What are the outputs? (return value, side effects, mutations)\n\n**STEP 2: TRACE INPUTS**\nFor each input:\n- Where does it come from? (user input, database, API, config, hardcoded)\n- Is it validated/sanitized before use? WHERE is this validation?\n- What assumptions does the code make about this input?\n\n**STEP 3: ANALYZE OPERATIONS**\nFor each operation on the input:\n- What happens if the input is NULL or UNDEFINED?\n- What happens if the input is an EMPTY STRING or EMPTY ARRAY?\n- What happens if the input is MALFORMED (wrong type, invalid format)?\n- What happens if the input is MALICIOUS (SQL injection, path traversal)?\n- What happens if the operation FAILS (throws, returns error)?\n\n**STEP 4: CHECK ERROR PATHS**\n- Are all error cases handled?\n- Do error handlers clean up resources?\n- Can errors leak sensitive information?\n- Are errors logged with appropriate detail?\n\n**STEP 5: VERIFY CLAIMS**\nBefore reporting a bug, VERIFY:\n- Is there a guard/check I missed upstream?\n- Does the framework/library handle this case?\n- Is this intentional behavior (check comments, docs)?\n- Can I construct a concrete scenario that triggers this bug?\n\n**STEP 6: CONSTRUCT PROOF**\nFor each bug you report:\n- Show the exact data flow from input to failure\n- Provide a concrete example input that triggers the bug\n- Explain why existing guards don't prevent it\n- Provide the exact code fix`;\n\n// ─────────────────────────────────────────────────────────────\n// Category-Specific Analysis Instructions\n// ─────────────────────────────────────────────────────────────\n\nexport const CATEGORY_SPECIFIC_INSTRUCTIONS: Record<string, string> = {\n 'injection': `INJECTION ANALYSIS FOCUS:\n\nTrace ALL user inputs through the code:\n1. HTTP request: req.body, req.query, req.params, req.headers\n2. Form data, file uploads, cookies\n3. URL parameters, hash fragments\n4. WebSocket messages, GraphQL variables\n\nFor EACH user input, check if it reaches:\n- SQL queries (concatenation or interpolation = bug)\n- Shell commands (exec, spawn, system = bug)\n- File system paths (readFile, writeFile with user path = bug)\n- HTML rendering (innerHTML, dangerouslySetInnerHTML = bug)\n- eval() or Function() constructor = bug\n- Regular expressions (ReDoS potential)\n\nPROOF REQUIRED: Show the exact line where user input enters, and the exact line where it's used unsafely.`,\n\n 'null-reference': `NULL REFERENCE ANALYSIS FOCUS:\n\nFor EACH variable access (obj.prop, arr[i]), verify:\n1. Can the object be null/undefined at this point?\n2. Can the property be missing?\n3. Can the array be empty?\n\nCheck these sources of null:\n- Database queries: findOne, findById return null when not found\n- API responses: external data can have missing fields\n- Optional parameters: function called without all args\n- Async operations: resolved value could be null\n- Array operations: find(), [0] on empty array\n- Map/Object access: map.get(), obj[key] for missing keys\n\nPROOF REQUIRED: Show the exact function that can return null, and the exact line where it's dereferenced without check.`,\n\n 'resource-leak': `RESOURCE LEAK ANALYSIS FOCUS:\n\nTrack ALL resources that need cleanup:\n1. setInterval/setTimeout - need clearInterval/clearTimeout\n2. addEventListener - need removeEventListener\n3. File handles - need close()\n4. Database connections - need release/close\n5. Streams - need destroy/end\n6. Subscriptions - need unsubscribe\n\nFor EACH resource allocation:\n- Is there a corresponding cleanup?\n- Is cleanup called in ALL code paths (including errors)?\n- Is cleanup in finally block or equivalent?\n- For React: is cleanup in useEffect return?\n- For classes: is cleanup in destructor/dispose?\n\nPROOF REQUIRED: Show where resource is created, and show the error path where cleanup is skipped.`,\n\n 'async-issue': `ASYNC/CONCURRENCY ANALYSIS FOCUS:\n\nCheck ALL async operations:\n1. Every async function call should have await (or intentional fire-and-forget with comment)\n2. Every Promise should have .catch() or be in try/catch\n3. Promise.all errors should be handled\n\nCheck for race conditions:\n1. Shared state modified by concurrent operations\n2. Check-then-act patterns without atomicity\n3. Multiple awaits with interleaved state changes\n\nCheck for deadlocks:\n1. Circular await dependencies\n2. Locks acquired in different orders\n\nPROOF REQUIRED: Show the async call without await, or show two concurrent paths that can corrupt shared state.`,\n\n 'auth-bypass': `AUTHENTICATION/AUTHORIZATION ANALYSIS FOCUS:\n\nFor EACH route/endpoint:\n1. Is authentication required? Is middleware applied?\n2. Is authorization checked? (user can only access their own data)\n3. Are there any early returns that bypass auth?\n\nCheck for:\n- Routes missing auth middleware\n- Auth check that catches errors and continues\n- IDOR: user ID from request used without ownership check\n- Role checks that can be bypassed\n- JWT/session validation that accepts expired tokens\n- Password comparison using timing-unsafe methods\n\nPROOF REQUIRED: Show the route definition missing auth, or the auth check that can be bypassed.`,\n\n 'data-validation': `DATA VALIDATION ANALYSIS FOCUS:\n\nFor EACH external input (API request, file, env var):\n1. Is there schema validation (Zod, Joi, etc.)?\n2. Are individual fields validated for type and format?\n3. Are numbers checked for NaN, Infinity, negative?\n4. Are strings checked for length, format, encoding?\n5. Are arrays checked for length limits?\n\nCheck for:\n- JSON.parse without try/catch\n- parseInt/parseFloat without NaN check\n- Array access without length check\n- Regex without timeout (ReDoS)\n- Date parsing without validation\n\nPROOF REQUIRED: Show the input field and the operation that assumes valid data.`,\n\n 'logic-error': `LOGIC ERROR ANALYSIS FOCUS:\n\nCheck ALL conditionals:\n1. Are operators correct? (= vs ==, & vs &&, | vs ||)\n2. Are comparisons correct? (< vs <=, > vs >=)\n3. Is the logic inverted? (if(!valid) vs if(valid))\n4. Are all cases covered? (else clause, default in switch)\n\nCheck ALL loops:\n1. Off-by-one errors (< vs <=, i vs i-1)\n2. Infinite loop conditions\n3. Break/continue in wrong place\n4. Loop variable modified inside loop\n\nCheck ALL math:\n1. Division by zero possibility\n2. Integer overflow\n3. Floating point precision issues\n4. Order of operations\n\nPROOF REQUIRED: Show the exact wrong operator or condition and what the correct one should be.`,\n\n 'secrets-exposure': `SECRETS EXPOSURE ANALYSIS FOCUS:\n\nSearch for hardcoded secrets:\n1. API keys, tokens (sk-, pk-, api_, secret_, token_)\n2. Passwords, credentials (password, passwd, pwd, secret)\n3. Private keys, certificates\n4. Database connection strings with credentials\n\nCheck for secrets in logs:\n1. console.log/error with request/response objects\n2. Error messages that include credentials\n3. Debug mode exposing sensitive data\n\nCheck for secrets in responses:\n1. User objects returned with password hash\n2. Config endpoints exposing secrets\n3. Error responses with stack traces\n\nPROOF REQUIRED: Show the exact line with the hardcoded secret or log statement.`,\n\n 'boundary-error': `BOUNDARY ERROR ANALYSIS FOCUS:\n\nCheck ALL array/string operations:\n1. Index access: is index always in bounds?\n2. Slice/substring: are start/end valid?\n3. Loop bounds: off-by-one errors?\n\nCheck ALL numeric operations:\n1. Can denominator be zero?\n2. Can result overflow?\n3. Are negative numbers handled?\n\nCheck size limits:\n1. File uploads without size limit\n2. Arrays that can grow unbounded\n3. Strings without length validation\n4. Recursion without depth limit\n\nPROOF REQUIRED: Show the operation and an input that causes out-of-bounds access or overflow.`,\n\n 'type-coercion': `TYPE COERCION ANALYSIS FOCUS:\n\nCheck for JavaScript type coercion bugs:\n1. == instead of === (0 == false, \"\" == false, null == undefined)\n2. if (value) when 0 or \"\" are valid values\n3. + with mixed types (string concatenation vs addition)\n4. Array methods on non-arrays\n\nCheck for TypeScript false confidence:\n1. as assertions that could be wrong at runtime\n2. any type hiding actual types\n3. Type guards that don't actually narrow\n\nCheck JSON operations:\n1. JSON.parse result used without type check\n2. API responses assumed to match TypeScript types\n\nPROOF REQUIRED: Show the exact coercion and what unexpected value triggers wrong behavior.`,\n\n 'concurrency': `CONCURRENCY ANALYSIS FOCUS:\n\nCheck shared state access:\n1. Global variables modified by multiple requests\n2. Class instance state modified concurrently\n3. Database records updated without transactions\n\nCheck for atomicity issues:\n1. Read-modify-write without locking\n2. Check-then-act patterns (if exists, then update)\n3. Counter increments without atomic operations\n\nCheck for deadlocks:\n1. Multiple locks acquired in different orders\n2. Nested transactions\n3. Circular dependencies in async operations\n\nPROOF REQUIRED: Show two concurrent operations that can corrupt shared state.`,\n\n 'intent-violation': `INTENT VIOLATION ANALYSIS FOCUS:\n\nCheck for code that contradicts its documentation:\n1. Function does opposite of what name suggests\n2. Comment describes different behavior than code\n3. Return type doesn't match actual returns\n\nCheck for misleading patterns:\n1. Validation function that doesn't validate\n2. Error handler that ignores errors\n3. Security check that always passes\n4. Cleanup function that doesn't clean up\n\nPROOF REQUIRED: Show the documentation/name and the contradicting implementation.`,\n};\n\n/**\n * Get category-specific instructions for focused analysis\n */\nexport function getCategoryInstructions(category: string): string {\n return CATEGORY_SPECIFIC_INSTRUCTIONS[category] || '';\n}\n","/**\n * Understanding Prompt - Codebase analysis for init\n *\n * Input: Codebase (agent reads files via tools)\n * Output: Single JSON with project understanding\n * Speed: Fast (reads 3-5 files max)\n */\n\nimport {\n JSON_OUTPUT_INSTRUCTION,\n PROJECT_TYPES_PROMPT,\n FEATURE_PRIORITY_PROMPT,\n} from './constants.js';\n\nexport interface UnderstandingContext {\n existingDocsSummary?: string;\n}\n\nexport function buildUnderstandingPrompt(ctx: UnderstandingContext): string {\n const docsSection = ctx.existingDocsSummary\n ? `\\nEXISTING DOCUMENTATION (use this as starting point):\\n${ctx.existingDocsSummary}\\n`\n : '';\n\n return `You are whiterose. Quickly understand this codebase structure.\n\n${JSON_OUTPUT_INSTRUCTION}\n${docsSection}\nEXPLORATION STRATEGY (be fast, read only key files):\n1. Read package.json / go.mod / Cargo.toml / pyproject.toml to identify project type\n2. Read the main entry point (index.ts, main.go, app.py, etc.)\n3. Skim 2-3 core files to understand architecture patterns\n4. DO NOT over-explore - focus on structure, not implementation details\n\n${PROJECT_TYPES_PROMPT}\n\nFRAMEWORK DETECTION:\nLook for: next.js, express, fastify, nest.js, react, vue, angular, svelte, django, flask, fastapi, gin, echo, spring, rails, laravel, etc.\nIf none detected, use \"none\"\n\n${FEATURE_PRIORITY_PROMPT}\n\nOUTPUT FORMAT - Wrap your response in <json></json> tags:\n\n<json>\n{\n \"summary\": {\n \"type\": \"api\",\n \"framework\": \"express\",\n \"language\": \"typescript\",\n \"description\": \"REST API for e-commerce platform with user authentication, product catalog, and order management\"\n },\n \"features\": [\n {\n \"name\": \"User Authentication\",\n \"description\": \"JWT-based auth with login, register, password reset, and session management\",\n \"priority\": \"critical\",\n \"relatedFiles\": [\"src/auth/login.ts\", \"src/auth/jwt.ts\", \"src/middleware/auth.ts\"]\n },\n {\n \"name\": \"Order Processing\",\n \"description\": \"Create, update, track, and fulfill customer orders with payment integration\",\n \"priority\": \"high\",\n \"relatedFiles\": [\"src/orders/create.ts\", \"src/orders/status.ts\", \"src/payments/stripe.ts\"]\n }\n ],\n \"entryPoints\": [\n { \"file\": \"src/index.ts\", \"type\": \"main\" },\n { \"file\": \"src/routes/api.ts\", \"type\": \"routes\" }\n ],\n \"structure\": {\n \"srcDir\": \"src\",\n \"hasTests\": true,\n \"hasTypes\": true,\n \"packageManager\": \"npm\"\n },\n \"contracts\": []\n}\n</json>\n\nREQUIREMENTS:\n- Output MUST be valid JSON wrapped in <json></json> tags\n- type MUST be one of: api, web-app, fullstack, cli, library, monorepo, mobile, desktop, other\n- priority MUST be one of: critical, high, medium, low\n- Be FAST - read 3-5 files maximum\n- Focus on WHAT the project does, not HOW it implements it\n- List ALL features you can identify with their priority\n\nNow quickly understand this codebase and output the JSON.`;\n}\n","/**\n * Multi-Pass Scanner - 10x Bug Hunter\n *\n * Why this is better than a single prompt:\n * - A human does 1 pass, this does 10\n * - Each pass is laser-focused on ONE category\n * - No bug category gets overlooked\n * - Adversarial validation kills false positives\n * - Same thoroughness at file 57 as file 1\n *\n * The passes:\n * 1. Injection - SQL, command, path, XSS, SSRF\n * 2. Auth/Authz - Authentication/authorization bypasses\n * 3. Null Safety - Null/undefined dereference\n * 4. Type Safety - as any, !, unsafe casts\n * 5. Resource Leaks - Files, connections, timers\n * 6. Async Issues - Missing await, race conditions\n * 7. Data Validation - Input sanitization, schema\n * 8. Secrets Exposure - Hardcoded creds, Math.random()\n * 9. Logic Errors - Wrong operators, conditions, regex\n * 10. Cross-File - Data flow across module boundaries\n */\n\nimport { Bug, BugCategory } from '../types.js';\n\nexport interface PassConfig {\n name: string;\n category: BugCategory;\n description: string;\n searchPatterns: string[];\n grepPatterns: string[];\n methodology: string;\n falsePositiveHints: string[];\n}\n\nexport interface PassResult {\n pass: string;\n category: BugCategory;\n duration: number;\n bugs: Bug[];\n filesScanned: number;\n}\n\nexport interface MultiPassResult {\n passes: PassResult[];\n totalDuration: number;\n rawBugs: Bug[];\n validatedBugs: Bug[];\n duplicatesRemoved: number;\n falsePositivesRejected: number;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Pass Definitions - Each pass is a laser-focused bug hunter\n// ─────────────────────────────────────────────────────────────\n\nexport const SCAN_PASSES: PassConfig[] = [\n {\n name: 'injection',\n category: 'injection',\n description: 'SQL injection, command injection, path traversal, XSS, SSRF',\n searchPatterns: [\n 'SQL queries with string concatenation or template literals',\n 'exec(), spawn(), execSync() with user input',\n 'path.join(), readFile(), writeFile() with user input',\n 'innerHTML, dangerouslySetInnerHTML, document.write()',\n 'fetch(), axios(), request() with user-controlled URLs',\n ],\n grepPatterns: [\n 'exec\\\\s*\\\\(',\n 'spawn\\\\s*\\\\(',\n 'execSync\\\\s*\\\\(',\n 'eval\\\\s*\\\\(',\n 'Function\\\\s*\\\\(',\n 'innerHTML\\\\s*=',\n 'dangerouslySetInnerHTML',\n 'document\\\\.write',\n 'SELECT.*FROM.*WHERE.*\\\\+',\n 'SELECT.*FROM.*\\\\$\\\\{',\n ],\n methodology: `1. Search for injection sinks (exec, spawn, SQL queries, innerHTML)\n2. For each sink, trace back to find data sources\n3. Check if user input reaches the sink without sanitization\n4. Verify no guards/validation in the path\n5. Construct triggering input\n6. Write exact fix`,\n falsePositiveHints: [\n 'Parameterized queries are safe',\n 'Static strings passed to exec are safe',\n 'Input validated with allowlist before use is safe',\n 'React/Vue templates auto-escape (unless dangerouslySetInnerHTML)',\n ],\n },\n {\n name: 'auth-bypass',\n category: 'auth-bypass',\n description: 'Missing authentication, authorization bypass, privilege escalation',\n searchPatterns: [\n 'API routes without auth middleware',\n 'Authorization checks that can be skipped',\n 'Admin endpoints accessible without role check',\n 'IDOR: accessing resources by ID without ownership check',\n 'JWT verification that catches errors and continues',\n ],\n grepPatterns: [\n 'router\\\\.(get|post|put|delete|patch)\\\\s*\\\\(',\n 'app\\\\.(get|post|put|delete|patch)\\\\s*\\\\(',\n '\\\\.findById\\\\s*\\\\(',\n '\\\\.findOne\\\\s*\\\\(',\n 'req\\\\.user',\n 'req\\\\.session',\n 'isAdmin|isAuthenticated|requireAuth',\n 'role.*===|===.*role',\n ],\n methodology: `1. Find all API endpoints and route handlers\n2. Check each endpoint for auth middleware\n3. For protected resources, verify ownership checks\n4. Look for early returns that skip auth on error\n5. Test if admin-only actions are protected\n6. Write exact fix with proper middleware`,\n falsePositiveHints: [\n 'Public endpoints dont need auth (health, docs, etc)',\n 'Middleware applied at router level protects all routes',\n 'GraphQL resolvers may have field-level auth',\n ],\n },\n {\n name: 'null-safety',\n category: 'null-reference',\n description: 'Null/undefined dereference, missing optional chaining',\n searchPatterns: [\n 'Property access on potentially null/undefined values',\n 'Array methods on optional arrays without null check',\n 'Object.keys/values on potentially undefined objects',\n 'Chained property access without optional chaining',\n 'Async functions returning null but caller expects object',\n ],\n grepPatterns: [\n '\\\\.map\\\\s*\\\\(',\n '\\\\.filter\\\\s*\\\\(',\n '\\\\.reduce\\\\s*\\\\(',\n '\\\\.forEach\\\\s*\\\\(',\n 'Object\\\\.keys\\\\s*\\\\(',\n 'Object\\\\.values\\\\s*\\\\(',\n 'Object\\\\.entries\\\\s*\\\\(',\n '\\\\[0\\\\]\\\\.',\n '\\\\.length',\n ],\n methodology: `1. Search for array methods (.map, .filter, .reduce)\n2. Trace back to see if the array could be undefined\n3. Check for missing optional chaining (?.)\n4. Look for [0] access without checking array length\n5. Find Object.keys/values on potentially null objects\n6. Write fix with proper null checks`,\n falsePositiveHints: [\n 'TypeScript strict mode catches many of these',\n 'If variable is guaranteed by control flow, its safe',\n 'Default parameters and destructuring defaults help',\n ],\n },\n {\n name: 'type-safety',\n category: 'type-coercion',\n description: 'Unsafe type assertions, as any, non-null assertions, JSON.parse without validation',\n searchPatterns: [\n '`as any` bypassing type safety',\n 'Non-null assertion (!) without actual null check',\n '`as unknown as T` double assertion',\n 'JSON.parse() without try/catch or schema validation',\n 'Type assertion after JSON.parse: JSON.parse(x) as MyType',\n ],\n grepPatterns: [\n 'as\\\\s+any',\n 'as\\\\s+unknown\\\\s+as',\n '!\\\\s*[;,)]',\n '!\\\\.',\n 'JSON\\\\.parse\\\\s*\\\\(',\n ],\n methodology: `1. Search for \"as any\" patterns\n2. Find JSON.parse calls without try/catch\n3. Look for non-null assertions (!) without preceding checks\n4. Check if parsed JSON is validated before use\n5. Find double assertions (as unknown as T)\n6. Write fix with proper validation/type guards`,\n falsePositiveHints: [\n 'as any in test files is often acceptable',\n '! after definite assignment in same scope is safe',\n 'Zod/Joi validation after JSON.parse is safe',\n ],\n },\n {\n name: 'resource-leaks',\n category: 'resource-leak',\n description: 'Unclosed file handles, DB connections, timers, event listeners',\n searchPatterns: [\n 'setInterval without clearInterval',\n 'setTimeout stored but never cleared',\n 'Database connections not closed on error',\n 'File handles opened but not closed in finally/catch',\n 'Event listeners added but never removed',\n ],\n grepPatterns: [\n 'setInterval\\\\s*\\\\(',\n 'setTimeout\\\\s*\\\\(',\n 'addEventListener\\\\s*\\\\(',\n '\\\\.on\\\\s*\\\\(',\n 'createConnection\\\\s*\\\\(',\n 'fs\\\\.open',\n 'new.*Stream\\\\s*\\\\(',\n ],\n methodology: `1. Find setInterval calls, check for corresponding clearInterval\n2. Look for event listeners, check if removed on cleanup\n3. Find DB connection opens, verify close in error paths\n4. Check file operations have proper finally/catch cleanup\n5. Look for growing caches/maps without eviction\n6. Write fix with proper cleanup code`,\n falsePositiveHints: [\n 'Global singletons may intentionally keep connections open',\n 'React useEffect cleanup handles listener removal',\n 'Connection pools manage their own lifecycle',\n ],\n },\n {\n name: 'async-issues',\n category: 'async-issue',\n description: 'Missing await, race conditions, unhandled promises',\n searchPatterns: [\n 'async function called without await',\n 'Promise.all without error handling',\n '.then() without .catch()',\n 'Shared state modified in parallel operations',\n 'TOCTOU: check then use without atomicity',\n ],\n grepPatterns: [\n 'async\\\\s+function',\n 'async\\\\s*\\\\(',\n 'await\\\\s+',\n '\\\\.then\\\\s*\\\\(',\n 'Promise\\\\.all\\\\s*\\\\(',\n 'Promise\\\\.race\\\\s*\\\\(',\n ],\n methodology: `1. Find async function calls, verify they are awaited\n2. Look for .then() chains without .catch()\n3. Check Promise.all for error handling\n4. Find shared state mutations in async contexts\n5. Look for check-then-use patterns without transactions\n6. Write fix with proper await/error handling`,\n falsePositiveHints: [\n 'Fire-and-forget async calls may be intentional',\n 'Top-level .catch() at entry point is sufficient',\n 'Promise.allSettled handles its own errors',\n ],\n },\n {\n name: 'data-validation',\n category: 'data-validation',\n description: 'Missing input validation, schema validation, sanitization',\n searchPatterns: [\n 'req.body used directly without validation',\n 'parseInt/parseFloat without NaN check',\n 'Array index from user input without bounds check',\n 'Missing schema validation (Zod, Joi, etc)',\n 'Validation that accepts if ANY condition passes',\n ],\n grepPatterns: [\n 'req\\\\.body',\n 'req\\\\.query',\n 'req\\\\.params',\n 'parseInt\\\\s*\\\\(',\n 'parseFloat\\\\s*\\\\(',\n 'Number\\\\s*\\\\(',\n '\\\\.safeParse\\\\s*\\\\(',\n '\\\\.validate\\\\s*\\\\(',\n ],\n methodology: `1. Find all user input entry points (req.body, req.query, etc)\n2. Trace each input to see if its validated\n3. Check parseInt/parseFloat results for NaN\n4. Look for array indexing with user-controlled values\n5. Verify schema validation exists and is correct\n6. Write fix with proper validation`,\n falsePositiveHints: [\n 'Framework middleware may validate automatically',\n 'GraphQL type system provides some validation',\n 'ORMs may validate at the schema level',\n ],\n },\n {\n name: 'secrets-exposure',\n category: 'secrets-exposure',\n description: 'Hardcoded credentials, Math.random() for security, leaked tokens',\n searchPatterns: [\n 'Hardcoded passwords, API keys, or tokens',\n 'Math.random() used for IDs, tokens, or keys',\n 'Date.now() as sole source of uniqueness',\n 'Credentials in logs or error messages',\n 'Secrets in URL query parameters',\n ],\n grepPatterns: [\n 'password\\\\s*=\\\\s*[\"\\']',\n 'apiKey\\\\s*=\\\\s*[\"\\']',\n 'api_key\\\\s*=\\\\s*[\"\\']',\n 'secret\\\\s*=\\\\s*[\"\\']',\n 'token\\\\s*=\\\\s*[\"\\']',\n 'Math\\\\.random\\\\s*\\\\(',\n 'Date\\\\.now\\\\s*\\\\(',\n 'console\\\\.log.*password',\n 'console\\\\.log.*token',\n ],\n methodology: `1. Search for hardcoded credential patterns\n2. Find Math.random() calls, check if used for security\n3. Look for Date.now() as unique ID source\n4. Check logs for sensitive data exposure\n5. Find secrets in URL parameters or error messages\n6. Write fix using env vars or crypto.randomUUID()`,\n falsePositiveHints: [\n 'Test files may have fake credentials',\n '.env.example files are documentation',\n 'Math.random() for non-security uses is fine',\n ],\n },\n {\n name: 'logic-errors',\n category: 'logic-error',\n description: 'Wrong operators, incorrect conditions, regex issues, off-by-one',\n searchPatterns: [\n 'Assignment instead of comparison: if (x = 5)',\n 'Bitwise vs logical operators: & vs &&',\n 'Regex matching without anchors: /pattern/ vs /^pattern$/',\n 'Greedy matching that captures too much: .* vs .*?',\n 'Off-by-one in loops or array access',\n ],\n grepPatterns: [\n 'if\\\\s*\\\\([^=!<>]*=[^=]',\n '\\\\s&\\\\s[^&]',\n '\\\\s\\\\|\\\\s[^|]',\n '\\\\.match\\\\s*\\\\(',\n '\\\\.test\\\\s*\\\\(',\n '\\\\.replace\\\\s*\\\\(',\n 'for\\\\s*\\\\(.*<.*\\\\.length',\n 'while\\\\s*\\\\(',\n ],\n methodology: `1. Search for regex patterns, check for proper anchoring\n2. Find comparisons, look for = instead of ===\n3. Check bitwise operators that should be logical\n4. Look for loop bounds that could be off-by-one\n5. Find string operations that could exceed bounds\n6. Write fix with correct operators/bounds`,\n falsePositiveHints: [\n 'Some bitwise operations are intentional',\n 'Unanchored regex may be intentional for substring match',\n 'Assignment in condition is sometimes intentional (with extra parens)',\n ],\n },\n {\n name: 'cross-file-flow',\n category: 'intent-violation',\n description: 'Data flow across module boundaries, API contract violations',\n searchPatterns: [\n 'Function returns type A but callers expect type B',\n 'Error thrown but not caught by callers',\n 'Null returned but callers dont check',\n 'Side effects not documented or expected',\n 'Module exports not matching imports',\n ],\n grepPatterns: [\n 'export\\\\s+(function|const|class|interface)',\n 'import\\\\s+\\\\{',\n 'throw\\\\s+new',\n 'return\\\\s+null',\n 'return\\\\s+undefined',\n ],\n methodology: `1. Find exported functions and their signatures\n2. Trace callers to verify they handle all return types\n3. Check if thrown errors are caught by callers\n4. Look for null returns that callers dont handle\n5. Verify interface contracts match implementations\n6. Write fix to align contracts and usage`,\n falsePositiveHints: [\n 'TypeScript enforces many interface contracts',\n 'Central error handlers may catch everything',\n 'Some null returns are intentional API design',\n ],\n },\n];\n\n/**\n * Get pass configuration by name\n */\nexport function getPassConfig(name: string): PassConfig | undefined {\n return SCAN_PASSES.find(p => p.name === name);\n}\n\n/**\n * Get passes for a specific category\n */\nexport function getPassesForCategory(category: BugCategory): PassConfig[] {\n return SCAN_PASSES.filter(p => p.category === category);\n}\n\n/**\n * Calculate hash for deduplication\n */\nexport function calculateBugHash(bug: Bug): string {\n // Bugs are duplicates if same file, line range, and category\n const key = `${bug.file}:${bug.line}:${bug.endLine || bug.line}:${bug.category}`;\n return key;\n}\n\n/**\n * Deduplicate bugs from multiple passes\n * Keeps the bug with highest confidence when duplicates exist\n */\nexport function deduplicateBugs(bugs: Bug[]): { unique: Bug[]; duplicatesRemoved: number } {\n const seen = new Map<string, Bug>();\n\n for (const bug of bugs) {\n const hash = calculateBugHash(bug);\n const existing = seen.get(hash);\n\n if (!existing) {\n seen.set(hash, bug);\n } else {\n // Keep the one with higher confidence\n const confidenceOrder = { high: 3, medium: 2, low: 1 };\n if (confidenceOrder[bug.confidence.overall] > confidenceOrder[existing.confidence.overall]) {\n seen.set(hash, bug);\n }\n }\n }\n\n return {\n unique: Array.from(seen.values()),\n duplicatesRemoved: bugs.length - seen.size,\n };\n}\n\n/**\n * Check if two bugs are semantically similar (for near-duplicate detection)\n */\nexport function areSimilarBugs(a: Bug, b: Bug): boolean {\n // Same file and overlapping line range\n if (a.file !== b.file) return false;\n\n const aStart = a.line;\n const aEnd = a.endLine || a.line;\n const bStart = b.line;\n const bEnd = b.endLine || b.line;\n\n // Check for overlap\n const overlap = !(aEnd < bStart || bEnd < aStart);\n if (!overlap) return false;\n\n // Same or related category\n const relatedCategories: Record<string, string[]> = {\n 'injection': ['injection', 'data-validation'],\n 'null-reference': ['null-reference', 'type-coercion'],\n 'type-coercion': ['type-coercion', 'null-reference', 'logic-error'],\n 'logic-error': ['logic-error', 'type-coercion', 'boundary-error'],\n };\n\n const related = relatedCategories[a.category] || [a.category];\n return related.includes(b.category);\n}\n\n/**\n * Merge similar bugs (near-duplicates from different passes)\n */\nexport function mergeSimilarBugs(bugs: Bug[]): Bug[] {\n const merged: Bug[] = [];\n const used = new Set<number>();\n\n for (let i = 0; i < bugs.length; i++) {\n if (used.has(i)) continue;\n\n let best = bugs[i];\n\n for (let j = i + 1; j < bugs.length; j++) {\n if (used.has(j)) continue;\n\n if (areSimilarBugs(best, bugs[j])) {\n used.add(j);\n // Keep the one with higher confidence and more evidence\n const jBetter =\n bugs[j].confidence.overall === 'high' && best.confidence.overall !== 'high' ||\n bugs[j].evidence.length > best.evidence.length;\n\n if (jBetter) {\n // Merge evidence from both\n bugs[j].evidence = [...new Set([...bugs[j].evidence, ...best.evidence])];\n best = bugs[j];\n } else {\n // Add evidence from the other bug\n best.evidence = [...new Set([...best.evidence, ...bugs[j].evidence])];\n }\n }\n }\n\n merged.push(best);\n }\n\n return merged;\n}\n","/**\n * Flow Analyzer - Integration & E2E Bug Hunting\n *\n * This is what makes whiterose 10x better than pattern matching.\n *\n * Unit analysis asks: \"Is there a bug in this function?\"\n * Flow analysis asks: \"Can an attacker actually exploit this?\"\n *\n * Three levels of analysis:\n * 1. DATA FLOW - Trace user input from entry to sink\n * 2. CONTROL FLOW - Trace auth/validation through the call chain\n * 3. ATTACK CHAINS - Find combinations that create real exploits\n */\n\n\n// ─────────────────────────────────────────────────────────────\n// Flow Analysis Pass Definitions\n// ─────────────────────────────────────────────────────────────\n\nexport interface FlowPassConfig {\n name: string;\n level: 'integration' | 'e2e';\n description: string;\n entryPointPatterns: string[];\n traceInstructions: string;\n whatToFind: string[];\n exampleVulnerability: string;\n}\n\nexport const FLOW_PASSES: FlowPassConfig[] = [\n // ───────────────────────────────────────────────────────────\n // INTEGRATION PASSES - Trace across components\n // ───────────────────────────────────────────────────────────\n {\n name: 'auth-flow-trace',\n level: 'integration',\n description: 'Trace authentication from middleware to every protected route',\n entryPointPatterns: [\n 'auth middleware files',\n 'JWT verification functions',\n 'session validation',\n 'route definitions with auth requirements',\n ],\n traceInstructions: `1. Find all auth middleware (isAuthenticated, requireAuth, verifyToken, etc.)\n2. Map which routes use this middleware\n3. For EACH route that should be protected:\n - Verify the middleware is actually applied\n - Check the middleware can't be bypassed (early returns, error handling)\n - Verify the middleware result is actually used (not just called)\n4. Find routes that SHOULD be protected but AREN'T\n5. Find routes where auth check happens but result is ignored`,\n whatToFind: [\n 'Routes missing auth middleware that access user data',\n 'Auth middleware that catches errors and continues',\n 'Auth check result not used (called but ignored)',\n 'Auth bypass via parameter pollution or type confusion',\n 'Different auth levels not enforced (user vs admin)',\n ],\n exampleVulnerability: `// Auth middleware exists but not applied to sensitive route\nrouter.get('/users', authMiddleware, listUsers); // Protected\nrouter.delete('/users/:id', deleteUser); // UNPROTECTED - missing authMiddleware!\n\n// Or: Auth check that fails open\nasync function authMiddleware(req, res, next) {\n try {\n req.user = verifyToken(req.headers.auth);\n } catch (e) {\n // BUG: Continues even on auth failure!\n }\n next();\n}`,\n },\n {\n name: 'data-flow-trace',\n level: 'integration',\n description: 'Trace user input from HTTP entry to dangerous sinks',\n entryPointPatterns: [\n 'req.body, req.query, req.params',\n 'request.json(), request.form()',\n 'event.body (Lambda)',\n 'ctx.request.body (Koa)',\n ],\n traceInstructions: `1. Find all HTTP entry points (routes, handlers, controllers)\n2. Identify where user input enters (req.body, req.query, etc.)\n3. TRACE each input through the code:\n - Follow variable assignments\n - Follow function calls (input passed as argument)\n - Follow returns (input returned and used by caller)\n - Follow object properties (input stored in object, object passed around)\n4. Track what transformations happen (validation? sanitization? encoding?)\n5. Find where the input reaches a SINK:\n - Database queries (SQL, NoSQL)\n - Command execution (exec, spawn)\n - File operations (readFile, writeFile)\n - HTML rendering (innerHTML, template)\n - URL construction (fetch, redirect)\n6. Verify transformations between entry and sink actually prevent exploitation`,\n whatToFind: [\n 'Input reaches SQL query without parameterization',\n 'Input reaches exec/spawn without sanitization',\n 'Input reaches file path without path traversal check',\n 'Input reaches HTML without encoding',\n 'Input validated at controller but re-fetched raw at service layer',\n 'Validation exists but can be bypassed via type coercion',\n ],\n exampleVulnerability: `// Controller validates, but service re-reads raw input\n// CONTROLLER\nasync function updateUser(req, res) {\n const { name } = validateInput(req.body); // Validated!\n await userService.update(req.params.id, req.body); // BUG: Passes raw req.body!\n}\n\n// SERVICE\nasync function update(id, data) {\n await db.query(\\`UPDATE users SET name = '\\${data.name}' WHERE id = \\${id}\\`);\n // data.name is RAW - validation was bypassed!\n}`,\n },\n {\n name: 'validation-boundary-trace',\n level: 'integration',\n description: 'Trace validation across layer boundaries',\n entryPointPatterns: [\n 'Zod/Joi/Yup schema definitions',\n 'validate() function calls',\n 'Type assertions after parse',\n 'Controller input handling',\n ],\n traceInstructions: `1. Find all validation points (Zod schemas, Joi, manual validation)\n2. For each validation:\n - What does it validate? (type, format, range, etc.)\n - Where is it applied? (controller, service, repository)\n3. Trace data AFTER validation:\n - Is the validated data used, or is raw data re-read?\n - Can downstream code receive unvalidated data via another path?\n - Are there type assertions that assume validation happened?\n4. Find GAPS:\n - Data enters via path A (validated) and path B (not validated)\n - Validation at edge, but internal services trust any input\n - Partial validation (checks type but not format/range)`,\n whatToFind: [\n 'Raw data used after validation point (validation bypassed)',\n 'Internal APIs callable without going through validated entry point',\n 'Type assertion assumes validation that may not have happened',\n 'Validation schema is incomplete (missing fields attackers can inject)',\n 'Validation at HTTP layer but WebSocket bypasses it',\n ],\n exampleVulnerability: `// Validation exists but internal API bypasses it\n// PUBLIC API - Validated\napp.post('/api/users', validateBody(userSchema), createUser);\n\n// INTERNAL API - No validation!\napp.post('/internal/users', createUser); // Same handler, no validation\n\n// Or: GraphQL resolver bypasses REST validation\n// REST is validated, but GraphQL calls same service without validation`,\n },\n {\n name: 'error-propagation-trace',\n level: 'integration',\n description: 'Trace how errors bubble up and where they leak or fail open',\n entryPointPatterns: [\n 'try/catch blocks',\n 'Promise .catch() handlers',\n 'Error middleware',\n 'Global error handlers',\n ],\n traceInstructions: `1. Find all error handling points (try/catch, .catch, error middleware)\n2. For each error handler:\n - What errors does it catch?\n - What does it do? (log, return, rethrow, ignore)\n - Does it expose sensitive info? (stack traces, SQL errors, internal paths)\n3. Trace error propagation:\n - If function A throws, does caller B handle it?\n - If B doesn't handle, does it propagate to user?\n4. Find DANGEROUS patterns:\n - catch {} (empty catch - swallows error, continues)\n - catch { log(error) } (logs but continues as if success)\n - catch { return null } (fails silent, caller doesn't know)\n - Error message includes internal details`,\n whatToFind: [\n 'Empty catch blocks that swallow errors',\n 'Auth errors caught and converted to success',\n 'Database errors exposed to user (leaks schema info)',\n 'Stack traces returned in production',\n 'Error handling differs between environments (dev vs prod)',\n ],\n exampleVulnerability: `// Auth check fails open on error\nasync function requireAdmin(req, res, next) {\n try {\n const user = await getUser(req.userId);\n if (user.role !== 'admin') return res.status(403).send('Forbidden');\n } catch (error) {\n console.error(error);\n // BUG: No return! Falls through to next() on error\n }\n next();\n}\n\n// Or: Error leaks internal info\ncatch (error) {\n res.status(500).json({\n error: error.message, // \"ECONNREFUSED 10.0.0.5:5432\" - leaks internal IP!\n stack: error.stack // Full stack trace with file paths\n });\n}`,\n },\n {\n name: 'trust-boundary-trace',\n level: 'integration',\n description: 'Find where trusted and untrusted data cross boundaries',\n entryPointPatterns: [\n 'External API calls (fetch, axios)',\n 'Database reads (might contain user-injected data)',\n 'File reads (config, uploads)',\n 'Message queues (events from other services)',\n ],\n traceInstructions: `1. Map TRUST BOUNDARIES:\n - User input (always untrusted)\n - Database data (may contain user-injected content)\n - External API responses (untrusted)\n - Config files (trusted if not user-editable)\n - Environment variables (trusted)\n2. Find where untrusted data BECOMES trusted:\n - Database read assumed to be safe (but contains user content)\n - External API response used without validation\n - Uploaded file content used directly\n3. Find IMPLICIT TRUST:\n - \"This came from our database so it's safe\" (wrong!)\n - \"This is from our other microservice so it's trusted\" (wrong!)\n - \"The user is authenticated so their input is safe\" (wrong!)`,\n whatToFind: [\n 'Database content used in SQL query (stored XSS becomes SQLi)',\n 'External API response used in template (SSRF + XSS chain)',\n 'Uploaded file content executed or included',\n 'Inter-service communication without validation',\n 'User-controlled config file paths',\n ],\n exampleVulnerability: `// Data from database treated as trusted\nasync function renderProfile(userId) {\n const user = await db.users.findById(userId);\n // user.bio was set by the user - contains untrusted content!\n return \\`<div>\\${user.bio}</div>\\`; // STORED XSS - bio contains <script>\n}\n\n// Or: External API response trusted\nconst data = await fetch('https://partner-api.com/data').then(r => r.json());\nawait db.query(\\`INSERT INTO cache VALUES ('\\${data.value}')\\`); // SQLi via partner API!`,\n },\n\n // ───────────────────────────────────────────────────────────\n // E2E PASSES - Full attack scenarios\n // ───────────────────────────────────────────────────────────\n {\n name: 'attack-chain-analysis',\n level: 'e2e',\n description: 'Find combinations of issues that create exploitable attack chains',\n entryPointPatterns: [\n 'All previously found vulnerabilities',\n 'Low-severity issues that combine into high-severity',\n 'Information disclosure + action endpoints',\n ],\n traceInstructions: `1. Review all findings (including low-severity)\n2. Look for CHAINS:\n - Info disclosure → targeted attack (leak user IDs → IDOR)\n - XSS → session theft → account takeover\n - SSRF → internal service access → data exfiltration\n - SQLi read → credential theft → privilege escalation\n - Open redirect → OAuth token theft → account takeover\n3. For each potential chain:\n - Can step 1 realistically be achieved?\n - Does step 1 output enable step 2?\n - What's the final impact?\n4. Look for AMPLIFICATION:\n - One SQLi → dump all credentials → compromise all accounts\n - One admin takeover → backdoor all users`,\n whatToFind: [\n 'XSS + sensitive action without CSRF protection',\n 'IDOR + bulk enumeration = dump all user data',\n 'Error message leaks + targeted SQLi',\n 'Open redirect + OAuth flow = token theft',\n 'SSRF + cloud metadata = credential theft',\n 'Low-priv user + missing authz = admin actions',\n ],\n exampleVulnerability: `// CHAIN: Reflected XSS → Admin Account Takeover\n\n// Step 1: Reflected XSS in search (low severity alone)\napp.get('/search', (req, res) => {\n res.send(\\`Results for: \\${req.query.q}\\`); // XSS\n});\n\n// Step 2: Admin action without CSRF protection\napp.post('/admin/make-admin', requireAdmin, (req, res) => {\n await makeUserAdmin(req.body.userId); // No CSRF token!\n});\n\n// ATTACK: Send admin link with XSS payload that:\n// 1. Executes in admin's browser\n// 2. Calls /admin/make-admin with attacker's userId\n// 3. Attacker is now admin\n\n// Individual bugs are medium, chain is CRITICAL`,\n },\n {\n name: 'privilege-escalation-trace',\n level: 'e2e',\n description: 'Trace paths from low-privilege user to high-privilege actions',\n entryPointPatterns: [\n 'Role definitions (user, admin, superadmin)',\n 'Permission checks',\n 'Admin-only endpoints',\n 'User data access patterns',\n ],\n traceInstructions: `1. Map the PERMISSION MODEL:\n - What roles exist? (user, admin, etc.)\n - What can each role do?\n - How are roles assigned/checked?\n2. For EACH admin/elevated action:\n - What checks prevent normal users?\n - Can checks be bypassed? (parameter tampering, type confusion)\n - Is role checked at every layer or just the edge?\n3. Find ESCALATION PATHS:\n - User can modify their own role field\n - Admin check uses user-controlled data\n - Internal API doesn't re-check permissions\n - Race condition in permission update`,\n whatToFind: [\n 'Role field modifiable via mass assignment',\n 'Admin check compares string (user can inject \"admin\")',\n 'Permission cached and not re-validated',\n 'GraphQL allows querying role mutation directly',\n 'Different endpoints with different permission checks for same action',\n ],\n exampleVulnerability: `// Mass assignment allows role modification\napp.put('/users/:id', async (req, res) => {\n const user = await User.findById(req.params.id);\n Object.assign(user, req.body); // BUG: Assigns ALL fields including role!\n await user.save();\n});\n\n// Attacker sends: PUT /users/123 { \"role\": \"admin\" }\n\n// Or: Permission check uses string comparison\nif (user.role == 'admin') { ... } // BUG: '0' == 0, type coercion issues\n\n// Or: Different layers, different checks\n// REST: requireAdmin middleware\n// GraphQL: No permission check on same resolver`,\n },\n {\n name: 'session-lifecycle-trace',\n level: 'e2e',\n description: 'Trace complete session lifecycle for security gaps',\n entryPointPatterns: [\n 'Login/authentication endpoints',\n 'Token/session generation',\n 'Token validation functions',\n 'Logout/session termination',\n ],\n traceInstructions: `1. TRACE LOGIN FLOW:\n - How are credentials verified?\n - How is session/token generated?\n - Is token random enough? (not Math.random!)\n - What's stored in token? (user ID, role, etc.)\n2. TRACE VALIDATION FLOW:\n - How is token validated on each request?\n - Is signature verified?\n - Is expiration checked?\n - Can token be forged?\n3. TRACE LOGOUT FLOW:\n - Is token actually invalidated?\n - Server-side session destroyed?\n - Can old token still be used?\n4. Find GAPS:\n - Token never expires\n - Logout doesn't invalidate token (JWT with no blacklist)\n - Token can be generated without proper auth\n - Token content can be modified (weak signature)`,\n whatToFind: [\n 'JWT with none algorithm accepted',\n 'Session token generated with Math.random()',\n 'Token not invalidated on logout (replay attacks)',\n 'Token expiration not checked on validation',\n 'Refresh token rotation not implemented',\n 'Session fixation (token not regenerated on login)',\n ],\n exampleVulnerability: `// Token generated with weak randomness\nfunction generateToken() {\n return Math.random().toString(36).slice(2); // PREDICTABLE!\n}\n\n// JWT 'none' algorithm accepted\nconst decoded = jwt.verify(token, secret, { algorithms: ['HS256', 'none'] });\n\n// Logout doesn't invalidate token\napp.post('/logout', (req, res) => {\n res.clearCookie('token'); // Client-side only!\n // BUG: Token still valid! Attacker with token can still use it\n});\n\n// Token never expires\nconst token = jwt.sign({ userId }, secret); // No expiresIn!`,\n },\n {\n name: 'user-journey-simulation',\n level: 'e2e',\n description: 'Simulate complete user journeys and find security gaps',\n entryPointPatterns: [\n 'Signup/registration flow',\n 'Login flow',\n 'Password reset flow',\n 'Critical actions (payment, delete, transfer)',\n ],\n traceInstructions: `1. MAP CRITICAL JOURNEYS:\n - Signup → email verify → login → use app\n - Forgot password → reset link → new password\n - Browse → add to cart → checkout → payment\n - Settings → delete account → confirm\n2. For EACH journey, check at EVERY step:\n - Can step be skipped?\n - Can step be replayed?\n - Can step be done out of order?\n - Is state properly tracked?\n3. Find GAPS:\n - Email verification can be skipped\n - Password reset token doesn't expire\n - Payment completes before verification\n - Delete confirmation can be bypassed`,\n whatToFind: [\n 'Email verification skippable (access features without verifying)',\n 'Password reset token reusable (use same link multiple times)',\n 'Checkout flow can skip payment verification',\n 'State machine allows illegal transitions',\n 'CSRF on critical actions (delete, transfer)',\n 'Rate limiting missing on sensitive operations',\n ],\n exampleVulnerability: `// Email verification bypassable\napp.post('/signup', async (req, res) => {\n const user = await User.create({ ...req.body, verified: false });\n sendVerificationEmail(user);\n res.json({ token: generateToken(user) }); // BUG: Token given before verification!\n});\n\n// User can access protected features without verifying email\n\n// Or: Password reset token never expires\napp.post('/forgot-password', async (req, res) => {\n const token = generateToken();\n await saveResetToken(req.body.email, token); // No expiration!\n // Token valid forever - old emails can be used to reset\n});\n\n// Or: Payment can be skipped\napp.post('/complete-order', async (req, res) => {\n const order = await Order.findById(req.body.orderId);\n order.status = 'completed'; // BUG: No check if payment succeeded!\n await order.save();\n});`,\n },\n {\n name: 'api-contract-verification',\n level: 'e2e',\n description: 'Verify API actually enforces what types/docs promise',\n entryPointPatterns: [\n 'OpenAPI/Swagger definitions',\n 'TypeScript API types',\n 'GraphQL schema',\n 'API documentation',\n ],\n traceInstructions: `1. Find API CONTRACT (OpenAPI, types, docs):\n - What fields are required?\n - What are the valid values/ranges?\n - What authentication is required?\n2. Compare CONTRACT vs IMPLEMENTATION:\n - Does code validate all required fields?\n - Does code enforce value ranges?\n - Does code check auth as documented?\n3. Find MISMATCHES:\n - Docs say \"required\" but code has default\n - Type says \"number\" but code accepts string\n - Docs say \"admin only\" but no middleware\n4. These mismatches are BUGS:\n - Security controls documented but not implemented\n - Validation promised but not enforced`,\n whatToFind: [\n 'OpenAPI says required but code has fallback',\n 'Type says admin-only but no role check',\n 'Schema says max 100 but code allows more',\n 'Docs say authenticated but route is public',\n 'GraphQL schema allows query that should be forbidden',\n ],\n exampleVulnerability: `// OpenAPI says adminOnly: true\n// paths:\n// /admin/users:\n// get:\n// security:\n// - adminAuth: []\n\n// But implementation has no check!\napp.get('/admin/users', async (req, res) => { // No auth middleware!\n const users = await User.find();\n res.json(users);\n});\n\n// Or: TypeScript type vs runtime\ninterface CreateUserInput {\n name: string;\n email: string;\n role?: 'user'; // Only 'user' allowed\n}\n\n// But implementation:\nconst user = await User.create(req.body); // No validation! role:'admin' accepted`,\n },\n];\n\n/**\n * Get flow passes by level\n */\nexport function getFlowPassesByLevel(level: 'integration' | 'e2e'): FlowPassConfig[] {\n return FLOW_PASSES.filter(p => p.level === level);\n}\n\n/**\n * Get all flow pass names in recommended order\n */\nexport function getFlowPassOrder(): string[] {\n // Integration first (builds understanding), then E2E (uses that understanding)\n return [\n // Integration passes\n 'auth-flow-trace',\n 'data-flow-trace',\n 'validation-boundary-trace',\n 'error-propagation-trace',\n 'trust-boundary-trace',\n // E2E passes\n 'attack-chain-analysis',\n 'privilege-escalation-trace',\n 'session-lifecycle-trace',\n 'user-journey-simulation',\n 'api-contract-verification',\n ];\n}\n\n/**\n * Get flow pass config by name\n */\nexport function getFlowPassConfig(name: string): FlowPassConfig | undefined {\n return FLOW_PASSES.find(p => p.name === name);\n}\n","export function generateBugId(index: number): string {\n return `WR-${String(index + 1).padStart(3, '0')}`;\n}\n\nexport function parseBugId(id: string): number | null {\n const match = id.match(/^WR-(\\d+)$/);\n if (!match) return null;\n return parseInt(match[1], 10) - 1;\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + '...';\n}\n\nexport function pluralize(count: number, singular: string, plural?: string): string {\n return count === 1 ? singular : plural || `${singular}s`;\n}\n","/**\n * Core Scanner - LSP-Compliant Architecture\n *\n * Scanning logic lives HERE, not in providers.\n * Providers are just \"dumb prompt executors\".\n *\n * This ensures all providers get the same 19-pass scanning,\n * batching, deduplication, and merging logic.\n */\n\nimport { Bug, CodebaseUnderstanding, WhiteroseConfig, BugCategory, BugSeverity, ConfidenceLevel, CodePathStep, FeatureIntent, BehavioralContract } from '../types.js';\nimport { getFullAnalysisPipeline } from '../providers/prompts/flow-analysis-prompts.js';\nimport { buildPassPrompt } from '../providers/prompts/multipass-prompts.js';\nimport { buildFlowAnalysisPrompt } from '../providers/prompts/flow-analysis-prompts.js';\nimport { buildUnderstandingPrompt } from '../providers/prompts/understanding.js';\nimport { getPassConfig } from './multipass-scanner.js';\nimport { getFlowPassConfig } from './flow-analyzer.js';\nimport { generateBugId } from './utils.js';\n\n// ─────────────────────────────────────────────────────────────\n// Simple Provider Interface (LSP-compliant)\n// ─────────────────────────────────────────────────────────────\n\nexport interface PromptOptions {\n cwd: string;\n timeout?: number;\n}\n\nexport interface PromptResult {\n output: string;\n error?: string;\n}\n\n/**\n * Minimal interface that ALL providers must implement.\n * No scanning logic - just execute prompts and return results.\n */\nexport interface PromptExecutor {\n name: string;\n isAvailable(): Promise<boolean>;\n runPrompt(prompt: string, options: PromptOptions): Promise<PromptResult>;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Scanner Configuration\n// ─────────────────────────────────────────────────────────────\n\nexport interface ScannerConfig {\n batchSize: number;\n batchDelayMs: number;\n passTimeoutMs: number;\n}\n\nexport const DEFAULT_SCANNER_CONFIG: ScannerConfig = {\n batchSize: 5,\n batchDelayMs: 2000,\n passTimeoutMs: 300000, // 5 minutes per pass\n};\n\nexport interface StaticFinding {\n tool: string;\n file: string;\n line: number;\n message: string;\n severity: string;\n}\n\nexport interface ScanContext {\n files: string[];\n understanding: CodebaseUnderstanding;\n staticResults: StaticFinding[];\n config?: WhiteroseConfig;\n}\n\nexport interface ScanProgress {\n onPhaseStart?: (phase: string, passCount: number) => void;\n onPassStart?: (passName: string) => void;\n onPassComplete?: (passName: string, bugCount: number) => void;\n onPassError?: (passName: string, error: string) => void;\n onBugFound?: (bug: Bug) => void;\n onProgress?: (message: string) => void;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Core Scanner\n// ─────────────────────────────────────────────────────────────\n\nexport class CoreScanner {\n private executor: PromptExecutor;\n private config: ScannerConfig;\n private progress: ScanProgress;\n private passErrors: Array<{ passName: string; error: string }> = [];\n\n constructor(\n executor: PromptExecutor,\n config: Partial<ScannerConfig> = {},\n progress: ScanProgress = {}\n ) {\n this.executor = executor;\n this.config = { ...DEFAULT_SCANNER_CONFIG, ...config };\n this.progress = progress;\n }\n\n /**\n * Get errors that occurred during the last scan.\n * Returns an array of pass names and their error messages.\n */\n getPassErrors(): Array<{ passName: string; error: string }> {\n return this.passErrors;\n }\n\n /**\n * Check if any passes failed during the last scan.\n */\n hasPassErrors(): boolean {\n return this.passErrors.length > 0;\n }\n\n /**\n * Run a thorough 19-pass scan with findings flowing through pipeline:\n *\n * Static Analysis → Unit Passes → Integration Passes → E2E Passes\n * ↓ ↓ ↓\n * unitFindings → integrationFindings → e2eFindings\n * └──────────────┴─────────────────┘\n * ↓\n * Combined + Deduped\n */\n async scan(context: ScanContext): Promise<Bug[]> {\n const cwd = process.cwd();\n const startTime = Date.now();\n\n // Reset pass errors for this scan\n this.passErrors = [];\n\n // Get all passes from the pipeline\n const pipeline = getFullAnalysisPipeline();\n const unitPasses = pipeline[0].passes;\n const integrationPasses = pipeline[1].passes;\n const e2ePasses = pipeline[2].passes;\n const totalPasses = unitPasses.length + integrationPasses.length + e2ePasses.length;\n\n this.report(`\\n════ CORE SCANNER (PIPELINE MODE) ════`);\n this.report(` Provider: ${this.executor.name}`);\n this.report(` Passes: ${totalPasses} (${unitPasses.length} unit → ${integrationPasses.length} integration → ${e2ePasses.length} E2E)`);\n this.report(` Findings flow: Unit → Integration → E2E`);\n\n let globalBugIndex = 0;\n\n // ═══════════════════════════════════════════════════════════\n // PHASE 1: Unit Passes (pattern matching, single-file bugs)\n // Input: staticResults only\n // ═══════════════════════════════════════════════════════════\n this.report(`\\n════ PHASE 1: UNIT ANALYSIS ════`);\n this.report(` Looking for: injection, null refs, auth bypass, etc.`);\n\n const unitJobs = this.buildUnitPassJobs(context, unitPasses);\n const unitFindings = await this.runPassBatch(unitJobs, cwd, context.files, globalBugIndex);\n globalBugIndex += unitFindings.length;\n\n this.report(` Phase 1 complete: ${unitFindings.length} findings`);\n\n // ═══════════════════════════════════════════════════════════\n // PHASE 2: Integration Passes (cross-file data flow)\n // Input: staticResults + unitFindings\n // ═══════════════════════════════════════════════════════════\n this.report(`\\n════ PHASE 2: INTEGRATION ANALYSIS ════`);\n this.report(` Building on ${unitFindings.length} unit findings`);\n this.report(` Looking for: auth flows, data flows, trust boundaries`);\n\n const integrationJobs = this.buildIntegrationPassJobs(context, integrationPasses, unitFindings);\n const integrationFindings = await this.runPassBatch(integrationJobs, cwd, context.files, globalBugIndex);\n globalBugIndex += integrationFindings.length;\n\n this.report(` Phase 2 complete: ${integrationFindings.length} findings`);\n\n // ═══════════════════════════════════════════════════════════\n // PHASE 3: E2E Passes (attack chains, full scenarios)\n // Input: staticResults + unitFindings + integrationFindings\n // ═══════════════════════════════════════════════════════════\n this.report(`\\n════ PHASE 3: E2E ANALYSIS ════`);\n this.report(` Building on ${unitFindings.length} unit + ${integrationFindings.length} integration findings`);\n this.report(` Looking for: attack chains, privilege escalation, session bugs`);\n\n const allPreviousFindings = [...unitFindings, ...integrationFindings];\n const e2eJobs = this.buildE2EPassJobs(context, e2ePasses, allPreviousFindings);\n const e2eFindings = await this.runPassBatch(e2eJobs, cwd, context.files, globalBugIndex);\n\n this.report(` Phase 3 complete: ${e2eFindings.length} findings`);\n\n // ═══════════════════════════════════════════════════════════\n // POST-PROCESSING: Combine and deduplicate\n // ═══════════════════════════════════════════════════════════\n this.report(`\\n════ POST-PROCESSING ════`);\n\n const allBugs = [...unitFindings, ...integrationFindings, ...e2eFindings];\n this.report(` Total raw findings: ${allBugs.length}`);\n\n const { unique: dedupedBugs, duplicatesRemoved } = this.deduplicateBugs(allBugs);\n this.report(` Removed ${duplicatesRemoved} duplicates`);\n\n const mergedBugs = this.mergeSimilarBugs(dedupedBugs);\n const similarMerged = dedupedBugs.length - mergedBugs.length;\n if (similarMerged > 0) {\n this.report(` Merged ${similarMerged} similar findings`);\n }\n\n // Summary\n const duration = Date.now() - startTime;\n const minutes = Math.floor(duration / 60000);\n const seconds = Math.round((duration % 60000) / 1000);\n\n this.report(`\\n════ SCAN COMPLETE ════`);\n this.report(` Duration: ${minutes}m ${seconds}s`);\n this.report(` Unit: ${unitFindings.length} → Integration: ${integrationFindings.length} → E2E: ${e2eFindings.length}`);\n this.report(` Final bugs: ${mergedBugs.length}`);\n\n return mergedBugs;\n }\n\n /**\n * Run a batch of passes in parallel (within a phase)\n */\n private async runPassBatch(\n passes: Array<{ name: string; prompt: string }>,\n cwd: string,\n files: string[],\n startIndex: number\n ): Promise<Bug[]> {\n const allBugs: Bug[] = [];\n let bugIndex = startIndex;\n\n for (let i = 0; i < passes.length; i += this.config.batchSize) {\n const batch = passes.slice(i, i + this.config.batchSize);\n const batchNum = Math.floor(i / this.config.batchSize) + 1;\n const totalBatches = Math.ceil(passes.length / this.config.batchSize);\n\n this.report(`\\n [Batch ${batchNum}/${totalBatches}] ${batch.map(p => p.name).join(', ')}`);\n\n const batchPromises = batch.map(async (pass) => {\n this.progress.onPassStart?.(pass.name);\n\n try {\n const result = await this.executor.runPrompt(pass.prompt, {\n cwd,\n timeout: this.config.passTimeoutMs,\n });\n\n const bugs = this.parseResponse(result.output, files, bugIndex, pass.name);\n bugIndex += bugs.length;\n\n this.progress.onPassComplete?.(pass.name, bugs.length);\n this.report(` ✓ ${pass.name}: ${bugs.length} bugs`);\n\n return bugs;\n } catch (error: any) {\n const errorMsg = error.message || String(error);\n this.progress.onPassError?.(pass.name, errorMsg);\n this.report(` ✗ ${pass.name}: ${errorMsg}`);\n // Track the error so callers can detect failed passes\n this.passErrors.push({ passName: pass.name, error: errorMsg });\n return [];\n }\n });\n\n const batchResults = await Promise.allSettled(batchPromises);\n\n for (const result of batchResults) {\n if (result.status === 'fulfilled') {\n allBugs.push(...result.value);\n }\n }\n\n // Delay between batches (except last)\n if (i + this.config.batchSize < passes.length) {\n await this.delay(this.config.batchDelayMs);\n }\n }\n\n return allBugs;\n }\n\n /**\n * Run a quick single-pass scan\n */\n async quickScan(context: ScanContext): Promise<Bug[]> {\n const cwd = process.cwd();\n\n // Reset pass errors for this scan\n this.passErrors = [];\n\n this.report(`\\n════ QUICK SCAN ════`);\n this.report(` Provider: ${this.executor.name}`);\n\n const prompt = this.buildQuickScanPrompt(context);\n\n try {\n const result = await this.executor.runPrompt(prompt, {\n cwd,\n timeout: this.config.passTimeoutMs,\n });\n\n const bugs = this.parseResponse(result.output, context.files, 0, 'quick-scan');\n this.report(` Found ${bugs.length} bugs`);\n\n return bugs;\n } catch (error: any) {\n const errorMsg = error.message || String(error);\n this.report(` Error: ${errorMsg}`);\n // Track the error so callers can detect failed passes\n this.passErrors.push({ passName: 'quick-scan', error: errorMsg });\n return [];\n }\n }\n\n /**\n * Generate codebase understanding (for init/refresh commands)\n * Uses the LLM to analyze project structure and extract features\n */\n async generateUnderstanding(files: string[], existingDocsSummary?: string): Promise<CodebaseUnderstanding> {\n const cwd = process.cwd();\n\n this.report(`\\n════ GENERATING UNDERSTANDING ════`);\n this.report(` Provider: ${this.executor.name}`);\n this.report(` Files: ${files.length}`);\n\n const prompt = buildUnderstandingPrompt({ existingDocsSummary });\n\n try {\n const result = await this.executor.runPrompt(prompt, {\n cwd,\n timeout: this.config.passTimeoutMs * 2, // Allow more time for understanding\n });\n\n const understanding = this.parseUnderstandingResponse(result.output, files);\n this.report(` Understanding complete`);\n\n return understanding;\n } catch (error: any) {\n this.report(` Error: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Parse understanding response from LLM\n */\n private parseUnderstandingResponse(output: string, files: string[]): CodebaseUnderstanding {\n // Try to extract JSON from <json></json> tags\n const jsonMatch = output.match(/<json>([\\s\\S]*?)<\\/json>/);\n let parsed: any;\n\n if (jsonMatch) {\n try {\n parsed = JSON.parse(jsonMatch[1]);\n } catch {\n // Try markdown code block\n const codeBlockMatch = output.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (codeBlockMatch) {\n parsed = JSON.parse(codeBlockMatch[1]);\n }\n }\n } else {\n // Try to find a valid JSON object by testing each closing brace position\n // The greedy regex would fail if there are trailing braces in explanatory text\n const firstBrace = output.indexOf('{');\n if (firstBrace !== -1) {\n // Find all closing brace positions and try each one (from earliest to latest)\n const substring = output.slice(firstBrace);\n let depth = 0;\n let inString = false;\n let escape = false;\n\n for (let i = 0; i < substring.length; i++) {\n const char = substring[i];\n\n if (escape) {\n escape = false;\n continue;\n }\n\n if (char === '\\\\' && inString) {\n escape = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) continue;\n\n if (char === '{') {\n depth++;\n } else if (char === '}') {\n depth--;\n if (depth === 0) {\n // Found a balanced JSON object, try to parse it\n const candidate = substring.slice(0, i + 1);\n try {\n parsed = JSON.parse(candidate);\n break; // Success, stop looking\n } catch {\n // Not valid JSON, keep looking for a larger balanced object\n depth = 1; // Reset to continue looking\n }\n }\n }\n }\n }\n }\n\n // Build understanding with defaults\n const now = new Date().toISOString();\n\n // Count lines (rough estimate from file count)\n const estimatedLines = files.length * 150;\n\n // Parse features\n const features: FeatureIntent[] = (parsed?.features || []).map((f: any) => ({\n name: String(f.name || 'Unknown'),\n description: String(f.description || ''),\n priority: this.parseFeaturePriority(f.priority),\n constraints: Array.isArray(f.constraints) ? f.constraints.map(String) : [],\n relatedFiles: Array.isArray(f.relatedFiles) ? f.relatedFiles.map(String) : [],\n }));\n\n // Parse contracts\n const contracts: BehavioralContract[] = (parsed?.contracts || []).map((c: any) => ({\n function: String(c.function || ''),\n file: String(c.file || ''),\n inputs: Array.isArray(c.inputs) ? c.inputs : [],\n outputs: c.outputs || { type: 'unknown' },\n invariants: Array.isArray(c.invariants) ? c.invariants.map(String) : [],\n sideEffects: Array.isArray(c.sideEffects) ? c.sideEffects.map(String) : [],\n throws: Array.isArray(c.throws) ? c.throws.map(String) : undefined,\n }));\n\n return {\n version: '1',\n generatedAt: now,\n summary: {\n framework: parsed?.summary?.framework || undefined,\n language: parsed?.summary?.language || 'typescript',\n type: parsed?.summary?.type || 'unknown',\n description: parsed?.summary?.description || 'Project analyzed by whiterose',\n },\n features,\n contracts,\n dependencies: parsed?.dependencies || {},\n structure: {\n totalFiles: files.length,\n totalLines: parsed?.structure?.totalLines || estimatedLines,\n packages: parsed?.structure?.packages,\n },\n };\n }\n\n private parseFeaturePriority(value: any): 'critical' | 'high' | 'medium' | 'low' | 'ignore' {\n const v = String(value).toLowerCase();\n if (v === 'critical') return 'critical';\n if (v === 'high') return 'high';\n if (v === 'medium') return 'medium';\n if (v === 'ignore') return 'ignore';\n return 'low';\n }\n\n // ─────────────────────────────────────────────────────────────\n // Pass Building (with dependency injection)\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Build unit pass jobs - these only see static analysis results\n */\n private buildUnitPassJobs(\n context: ScanContext,\n unitPasses: string[]\n ): Array<{ name: string; prompt: string }> {\n const jobs: Array<{ name: string; prompt: string }> = [];\n const { understanding, staticResults } = context;\n\n for (const passName of unitPasses) {\n const passConfig = getPassConfig(passName);\n if (!passConfig) continue;\n\n jobs.push({\n name: passName,\n prompt: buildPassPrompt({\n pass: passConfig,\n projectType: understanding.summary.type,\n framework: understanding.summary.framework || '',\n language: understanding.summary.language,\n totalFiles: understanding.structure.totalFiles,\n staticFindings: staticResults,\n }),\n });\n }\n\n return jobs;\n }\n\n /**\n * Build integration pass jobs - these see static + unit findings\n */\n private buildIntegrationPassJobs(\n context: ScanContext,\n integrationPasses: string[],\n unitFindings: Bug[]\n ): Array<{ name: string; prompt: string }> {\n const jobs: Array<{ name: string; prompt: string }> = [];\n const { understanding, staticResults } = context;\n\n // Convert unit findings to the format expected by prompts\n const previousFindings = unitFindings.map(f => ({\n title: f.title,\n file: f.file,\n line: f.line,\n category: f.category,\n severity: f.severity,\n }));\n\n for (const passName of integrationPasses) {\n const flowConfig = getFlowPassConfig(passName);\n if (!flowConfig) continue;\n\n jobs.push({\n name: passName,\n prompt: buildFlowAnalysisPrompt({\n pass: flowConfig,\n projectType: understanding.summary.type,\n framework: understanding.summary.framework || '',\n language: understanding.summary.language,\n totalFiles: understanding.structure.totalFiles,\n staticFindings: staticResults,\n previousFindings, // ← Unit findings passed to integration\n }),\n });\n }\n\n return jobs;\n }\n\n /**\n * Build E2E pass jobs - these see static + unit + integration findings\n */\n private buildE2EPassJobs(\n context: ScanContext,\n e2ePasses: string[],\n allPreviousFindings: Bug[]\n ): Array<{ name: string; prompt: string }> {\n const jobs: Array<{ name: string; prompt: string }> = [];\n const { understanding, staticResults } = context;\n\n // Convert findings to the format expected by prompts\n const previousFindings = allPreviousFindings.map(f => ({\n title: f.title,\n file: f.file,\n line: f.line,\n category: f.category,\n severity: f.severity,\n }));\n\n for (const passName of e2ePasses) {\n const flowConfig = getFlowPassConfig(passName);\n if (!flowConfig) continue;\n\n jobs.push({\n name: passName,\n prompt: buildFlowAnalysisPrompt({\n pass: flowConfig,\n projectType: understanding.summary.type,\n framework: understanding.summary.framework || '',\n language: understanding.summary.language,\n totalFiles: understanding.structure.totalFiles,\n staticFindings: staticResults,\n previousFindings, // ← All previous findings passed to E2E\n }),\n });\n }\n\n return jobs;\n }\n\n private buildQuickScanPrompt(context: ScanContext): string {\n const { understanding, staticResults, files } = context;\n\n const staticSignals = staticResults.length > 0\n ? `\\nStatic analysis signals:\\n${staticResults.slice(0, 30).map(r => `- ${r.file}:${r.line}: ${r.message}`).join('\\n')}`\n : '';\n\n // Include list of files to scan (limit to 50 to keep prompt manageable)\n const fileList = files.slice(0, 50).map(f => `- ${f}`).join('\\n');\n const moreFiles = files.length > 50 ? `\\n... and ${files.length - 50} more files` : '';\n\n return `You are a security auditor. Analyze this ${understanding.summary.type} codebase for bugs and code smells.\n\nProject: ${understanding.summary.description || 'Unknown'}\nFramework: ${understanding.summary.framework || 'None'}\nLanguage: ${understanding.summary.language}\n\n## FILES TO ANALYZE\nRead and analyze these files for security issues:\n${fileList}${moreFiles}\n${staticSignals}\n\n## INSTRUCTIONS\n1. Read each file listed above\n2. Look for security issues, bugs, and code smells\n3. Report ALL suspicious patterns - false positives will be filtered later\n4. Use kind=\"smell\" for risky patterns, kind=\"bug\" for confirmed issues\n\n## CATEGORIES TO CHECK\n- Injection (SQL, command, XSS) - unsanitized user input\n- Auth bypass - missing auth checks, IDOR\n- Null/undefined dereference - accessing properties on potentially null values\n- Logic errors - wrong conditions, off-by-one, inverted checks\n- Async/race conditions - unhandled promises, race conditions\n- Resource leaks - unclosed handles, missing cleanup\n- Data validation - missing input validation, type coercion issues\n- Secrets exposure - hardcoded keys, leaked credentials\n- Error handling - swallowed errors, missing try/catch\n\n## OUTPUT FORMAT\nOutput a JSON array (one object per issue found):\n[{\"file\": \"path\", \"line\": 42, \"title\": \"Issue title\", \"description\": \"Details\", \"kind\": \"bug|smell\", \"severity\": \"critical|high|medium|low\", \"category\": \"logic-error\", \"evidence\": [\"evidence\"]}]\n\nIf no issues found after reading all files, return: []`;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Response Parsing\n // ─────────────────────────────────────────────────────────────\n\n private parseResponse(output: string, files: string[], startIndex: number, passName: string): Bug[] {\n const bugs: Bug[] = [];\n\n // Method 1: Find all JSON blocks in <json></json> tags\n const jsonMatches = output.matchAll(/<json>([\\s\\S]*?)<\\/json>/g);\n\n for (const match of jsonMatches) {\n try {\n const parsed = JSON.parse(match[1]);\n\n if (parsed.type === 'bug' && parsed.data) {\n const bug = this.parseBugData(parsed.data, startIndex + bugs.length, files, passName);\n if (bug) {\n bugs.push(bug);\n this.progress.onBugFound?.(bug);\n }\n }\n } catch {\n // Continue on parse error\n }\n }\n\n // Method 2: Find JSON in markdown code blocks (```json ... ```)\n if (bugs.length === 0) {\n const codeBlockMatches = output.matchAll(/```(?:json)?\\s*([\\s\\S]*?)```/g);\n for (const match of codeBlockMatches) {\n try {\n const parsed = JSON.parse(match[1].trim());\n // Handle both single object and array\n const items = Array.isArray(parsed) ? parsed : [parsed];\n for (const item of items) {\n const bug = this.parseBugData(item, startIndex + bugs.length, files, passName);\n if (bug) {\n bugs.push(bug);\n this.progress.onBugFound?.(bug);\n }\n }\n } catch {\n // Continue on parse error\n }\n }\n }\n\n // Method 3: Try parsing as a plain JSON array (fallback)\n if (bugs.length === 0) {\n const arrayMatch = output.match(/\\[[\\s\\S]*\\]/);\n if (arrayMatch) {\n try {\n const parsed = JSON.parse(arrayMatch[0]);\n if (Array.isArray(parsed)) {\n for (const item of parsed) {\n const bug = this.parseBugData(item, startIndex + bugs.length, files, passName);\n if (bug) {\n bugs.push(bug);\n this.progress.onBugFound?.(bug);\n }\n }\n }\n } catch {\n // Continue\n }\n }\n }\n\n // Method 4: Find individual JSON objects (not in code blocks)\n if (bugs.length === 0) {\n const objectMatches = output.matchAll(/\\{[^{}]*\"file\"[^{}]*\"line\"[^{}]*\\}/g);\n for (const match of objectMatches) {\n try {\n const parsed = JSON.parse(match[0]);\n const bug = this.parseBugData(parsed, startIndex + bugs.length, files, passName);\n if (bug) {\n bugs.push(bug);\n this.progress.onBugFound?.(bug);\n }\n } catch {\n // Continue\n }\n }\n }\n\n return bugs;\n }\n\n private parseBugData(data: any, index: number, files: string[], passName: string): Bug | null {\n if (!data.file || !data.line || !data.title) {\n return null;\n }\n\n // Resolve file path\n let filePath = data.file;\n if (!filePath.startsWith('/')) {\n const match = files.find(f => f.endsWith(filePath) || f.includes(filePath));\n if (match) filePath = match;\n }\n\n // Parse code path\n const codePath: CodePathStep[] = (data.codePath || data.dataFlow || []).map(\n (step: any, idx: number) => ({\n step: step.step || idx + 1,\n file: step.file || filePath,\n line: step.line || data.line,\n code: step.code || '',\n explanation: step.explanation || '',\n })\n );\n\n return {\n id: generateBugId(index),\n title: String(data.title).slice(0, 150),\n description: String(data.description || ''),\n file: filePath,\n line: Number(data.line) || 0,\n endLine: data.endLine ? Number(data.endLine) : undefined,\n kind: data.kind || 'bug',\n severity: this.parseSeverity(data.severity),\n category: this.parseCategory(data.category),\n confidence: {\n overall: this.parseConfidence(data.confidence),\n codePathValidity: 0.8,\n reachability: 0.8,\n intentViolation: false,\n staticToolSignal: false,\n adversarialSurvived: false,\n },\n codePath,\n evidence: Array.isArray(data.evidence) ? data.evidence.map(String) : [],\n suggestedFix: data.suggestedFix ? String(data.suggestedFix) : undefined,\n createdAt: new Date().toISOString(),\n status: 'open',\n passName,\n };\n }\n\n // ─────────────────────────────────────────────────────────────\n // Deduplication\n // ─────────────────────────────────────────────────────────────\n\n private deduplicateBugs(bugs: Bug[]): { unique: Bug[]; duplicatesRemoved: number } {\n const seen = new Map<string, Bug>();\n\n for (const bug of bugs) {\n const key = `${bug.file}:${bug.line}:${bug.category}`;\n const existing = seen.get(key);\n\n if (!existing) {\n seen.set(key, bug);\n } else {\n // Keep higher confidence, merge evidence\n const existingConf = this.confidenceToNum(existing.confidence.overall);\n const newConf = this.confidenceToNum(bug.confidence.overall);\n\n if (newConf > existingConf) {\n bug.evidence = [...new Set([...bug.evidence, ...existing.evidence])];\n seen.set(key, bug);\n } else {\n existing.evidence = [...new Set([...existing.evidence, ...bug.evidence])];\n }\n }\n }\n\n return {\n unique: Array.from(seen.values()),\n duplicatesRemoved: bugs.length - seen.size,\n };\n }\n\n private mergeSimilarBugs(bugs: Bug[]): Bug[] {\n // Group by file and nearby lines (within 5 lines)\n const groups = new Map<string, Bug[]>();\n\n for (const bug of bugs) {\n const fileKey = bug.file;\n if (!groups.has(fileKey)) {\n groups.set(fileKey, []);\n }\n groups.get(fileKey)!.push(bug);\n }\n\n const result: Bug[] = [];\n\n for (const fileBugs of groups.values()) {\n // Sort by line\n fileBugs.sort((a, b) => a.line - b.line);\n\n let i = 0;\n while (i < fileBugs.length) {\n const current = fileBugs[i];\n const merged: Bug[] = [current];\n\n // Look for bugs within 5 lines with same category\n let j = i + 1;\n while (j < fileBugs.length) {\n const next = fileBugs[j];\n if (next.line - current.line <= 5 && next.category === current.category) {\n merged.push(next);\n j++;\n } else {\n break;\n }\n }\n\n if (merged.length === 1) {\n result.push(current);\n } else {\n // Merge into one bug\n const highestSeverity = merged.reduce((max, b) =>\n this.severityToNum(b.severity) > this.severityToNum(max.severity) ? b : max\n );\n\n highestSeverity.evidence = [...new Set(merged.flatMap(b => b.evidence))];\n highestSeverity.description = merged.map(b => b.description).join('\\n\\n');\n result.push(highestSeverity);\n }\n\n i = j;\n }\n }\n\n return result;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Helpers\n // ─────────────────────────────────────────────────────────────\n\n private report(message: string): void {\n this.progress.onProgress?.(message);\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n private parseSeverity(value: any): BugSeverity {\n const v = String(value).toLowerCase();\n if (v === 'critical') return 'critical';\n if (v === 'high') return 'high';\n if (v === 'medium') return 'medium';\n return 'low';\n }\n\n private parseCategory(value: any): BugCategory {\n const v = String(value).toLowerCase().replace(/[^a-z-]/g, '');\n const valid: BugCategory[] = [\n 'injection', 'auth-bypass', 'secrets-exposure', 'null-reference',\n 'boundary-error', 'resource-leak', 'async-issue', 'logic-error',\n 'data-validation', 'type-coercion', 'concurrency', 'intent-violation',\n ];\n return valid.includes(v as BugCategory) ? (v as BugCategory) : 'logic-error';\n }\n\n private parseConfidence(value: any): ConfidenceLevel {\n if (typeof value === 'object' && value?.overall) {\n value = value.overall;\n }\n const v = String(value).toLowerCase();\n if (v === 'high') return 'high';\n if (v === 'low') return 'low';\n return 'medium';\n }\n\n private confidenceToNum(c: ConfidenceLevel): number {\n return c === 'high' ? 3 : c === 'medium' ? 2 : 1;\n }\n\n private severityToNum(s: BugSeverity): number {\n return s === 'critical' ? 4 : s === 'high' ? 3 : s === 'medium' ? 2 : 1;\n }\n}\n","import fg from 'fast-glob';\nimport { createHash } from 'crypto';\nimport { readFileSync, existsSync, writeFileSync } from 'fs';\nimport { join, relative } from 'path';\nimport { WhiteroseConfig, FileHash, CacheState } from '../../types.js';\nimport { getDependentFiles as getDepGraphDependents } from '../dependencies.js';\n\nconst DEFAULT_INCLUDE = ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'];\nconst DEFAULT_EXCLUDE = [\n 'node_modules/**',\n 'dist/**',\n 'build/**',\n '.next/**',\n 'coverage/**',\n '**/*.test.*',\n '**/*.spec.*',\n '**/*.d.ts',\n '.whiterose/**',\n];\n\nexport async function scanCodebase(cwd: string, config?: WhiteroseConfig): Promise<string[]> {\n const include = config?.include || DEFAULT_INCLUDE;\n const exclude = config?.exclude || DEFAULT_EXCLUDE;\n\n const files = await fg(include, {\n cwd,\n ignore: exclude,\n absolute: true,\n onlyFiles: true,\n });\n\n return files.sort();\n}\n\nexport function hashFile(filePath: string): string {\n // Read as buffer to correctly hash any file type (including binary)\n const content = readFileSync(filePath);\n return createHash('md5').update(content).digest('hex');\n}\n\nexport async function getChangedFiles(\n cwd: string,\n config: WhiteroseConfig,\n options?: { writeCache?: boolean }\n): Promise<{ files: string[]; hashes: FileHash[]; state: CacheState }> {\n const cachePath = join(cwd, '.whiterose', 'cache', 'file-hashes.json');\n\n // Get current files\n const currentFiles = await scanCodebase(cwd, config);\n\n // Load cached hashes\n let cachedState: CacheState = {\n version: '1',\n fileHashes: [],\n };\n\n if (existsSync(cachePath)) {\n try {\n const parsed = JSON.parse(readFileSync(cachePath, 'utf-8'));\n // Validate fileHashes exists and is an array\n if (Array.isArray(parsed.fileHashes)) {\n cachedState = parsed;\n }\n } catch {\n // Corrupted cache, use default empty state\n }\n }\n\n const cachedHashes = new Map(cachedState.fileHashes.map((h) => [h.path, h.hash]));\n\n // Find changed files\n const changedFiles: string[] = [];\n const newHashes: FileHash[] = [];\n\n for (const file of currentFiles) {\n const relativePath = relative(cwd, file);\n const currentHash = hashFile(file);\n\n newHashes.push({\n path: relativePath,\n hash: currentHash,\n lastModified: new Date().toISOString(),\n });\n\n const cachedHash = cachedHashes.get(relativePath);\n if (!cachedHash || cachedHash !== currentHash) {\n changedFiles.push(file);\n }\n }\n\n // Prepare updated cache state (write only if requested)\n const newState: CacheState = {\n version: '1',\n lastIncrementalScan: new Date().toISOString(),\n lastFullScan: cachedState.lastFullScan,\n fileHashes: newHashes,\n };\n\n if (options?.writeCache !== false) {\n writeFileSync(cachePath, JSON.stringify(newState, null, 2), 'utf-8');\n }\n\n return { files: changedFiles, hashes: newHashes, state: newState };\n}\n\nexport function saveFileHashes(cwd: string, state: CacheState): void {\n const cachePath = join(cwd, '.whiterose', 'cache', 'file-hashes.json');\n writeFileSync(cachePath, JSON.stringify(state, null, 2), 'utf-8');\n}\n\nexport async function getDependentFiles(\n changedFiles: string[],\n cwd: string,\n allFiles?: string[]\n): Promise<string[]> {\n // Use the dependency graph to find all files that depend on changed files\n return getDepGraphDependents(changedFiles, cwd, allFiles);\n}\n","import { CodebaseUnderstanding, BehavioralContract, FeatureIntent } from '../../types.js';\n\nexport function generateIntentDocument(understanding: CodebaseUnderstanding): string {\n const lines: string[] = [];\n\n // Header\n lines.push(`# App Intent: ${understanding.summary.type}`);\n lines.push('');\n lines.push(`> Generated by whiterose on ${new Date().toISOString()}`);\n lines.push('> Edit the sections above the line. Contracts below are auto-generated.');\n lines.push('');\n\n // Overview\n lines.push('## Overview');\n lines.push('');\n lines.push(understanding.summary.description);\n lines.push('');\n lines.push(`- **Framework:** ${understanding.summary.framework || 'None detected'}`);\n lines.push(`- **Language:** ${understanding.summary.language}`);\n lines.push(`- **Files:** ${understanding.structure.totalFiles}`);\n if (understanding.structure.packages?.length) {\n lines.push(`- **Packages:** ${understanding.structure.packages.join(', ')}`);\n }\n lines.push('');\n\n // Critical Features\n if (understanding.features.length > 0) {\n lines.push('## Critical Features');\n lines.push('');\n\n const criticalFeatures = understanding.features.filter((f) => f.priority === 'critical');\n const highFeatures = understanding.features.filter((f) => f.priority === 'high');\n const otherFeatures = understanding.features.filter(\n (f) => f.priority !== 'critical' && f.priority !== 'high'\n );\n\n for (const feature of criticalFeatures) {\n lines.push(formatFeature(feature, 'CRITICAL'));\n }\n\n if (highFeatures.length > 0) {\n lines.push('## High Priority Features');\n lines.push('');\n for (const feature of highFeatures) {\n lines.push(formatFeature(feature, 'HIGH'));\n }\n }\n\n if (otherFeatures.length > 0) {\n lines.push('## Other Features');\n lines.push('');\n for (const feature of otherFeatures) {\n lines.push(formatFeature(feature));\n }\n }\n }\n\n // Known Constraints (editable section)\n lines.push('## Known Constraints');\n lines.push('');\n lines.push('<!-- Add any known constraints or business rules here -->');\n lines.push('');\n lines.push('- (Add your constraints here)');\n lines.push('');\n\n // Areas of Concern (editable section)\n lines.push('## Areas of Concern');\n lines.push('');\n lines.push('<!-- Add files or areas that need extra scrutiny -->');\n lines.push('');\n lines.push('- (Add files that have had bugs before)');\n lines.push('');\n\n // Divider\n lines.push('---');\n lines.push('');\n lines.push('<!-- ⚠️ DO NOT EDIT BELOW THIS LINE - Auto-generated contracts -->');\n lines.push('');\n\n // Behavioral Contracts\n if (understanding.contracts.length > 0) {\n lines.push('## Behavioral Contracts');\n lines.push('');\n\n for (const contract of understanding.contracts) {\n lines.push(formatContract(contract));\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction formatFeature(feature: FeatureIntent, badge?: string): string {\n const lines: string[] = [];\n\n const badgeStr = badge ? ` [${badge}]` : '';\n lines.push(`### ${feature.name}${badgeStr}`);\n lines.push('');\n lines.push(feature.description);\n lines.push('');\n\n if (feature.constraints.length > 0) {\n lines.push('**Constraints:**');\n for (const constraint of feature.constraints) {\n lines.push(`- ${constraint}`);\n }\n lines.push('');\n }\n\n if (feature.relatedFiles.length > 0) {\n lines.push(`**Files:** \\`${feature.relatedFiles.join('`, `')}\\``);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction formatContract(contract: BehavioralContract): string {\n const lines: string[] = [];\n\n lines.push(`### \\`${contract.file}:${contract.function}()\\``);\n lines.push('');\n\n // Inputs\n if (contract.inputs.length > 0) {\n lines.push('**Inputs:**');\n for (const input of contract.inputs) {\n const constraints = input.constraints ? ` (${input.constraints})` : '';\n lines.push(`- \\`${input.name}\\`: ${input.type}${constraints}`);\n }\n lines.push('');\n }\n\n // Outputs\n lines.push('**Returns:** `' + contract.outputs.type + '`');\n if (contract.outputs.constraints) {\n lines.push(` - ${contract.outputs.constraints}`);\n }\n lines.push('');\n\n // Invariants\n if (contract.invariants.length > 0) {\n lines.push('**Invariants:**');\n for (const invariant of contract.invariants) {\n lines.push(`- ${invariant}`);\n }\n lines.push('');\n }\n\n // Side Effects\n if (contract.sideEffects.length > 0) {\n lines.push('**Side Effects:**');\n for (const effect of contract.sideEffects) {\n lines.push(`- ${effect}`);\n }\n lines.push('');\n }\n\n // Throws\n if (contract.throws && contract.throws.length > 0) {\n lines.push('**Throws:**');\n for (const t of contract.throws) {\n lines.push(`- ${t}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\ninterface ParsedIntent {\n knownConstraints: string[];\n areasOfConcern: string[];\n customFeatures: FeatureIntent[];\n overrides: {\n description?: string;\n framework?: string;\n };\n}\n\nexport function parseIntentDocument(content: string): ParsedIntent {\n const result: ParsedIntent = {\n knownConstraints: [],\n areasOfConcern: [],\n customFeatures: [],\n overrides: {},\n };\n\n // Split into sections\n const sections = splitIntoSections(content);\n\n // Parse Known Constraints section\n const constraintsSection = sections.find((s) => s.title.includes('Known Constraints'));\n if (constraintsSection) {\n result.knownConstraints = parseListItems(constraintsSection.content);\n }\n\n // Parse Areas of Concern section\n const concernsSection = sections.find((s) => s.title.includes('Areas of Concern'));\n if (concernsSection) {\n result.areasOfConcern = parseListItems(concernsSection.content);\n }\n\n // Parse Overview for overrides\n const overviewSection = sections.find((s) => s.title.includes('Overview'));\n if (overviewSection) {\n // Check for framework override\n const frameworkMatch = overviewSection.content.match(/\\*\\*Framework:\\*\\*\\s*(.+)/);\n if (frameworkMatch && !frameworkMatch[1].includes('None detected')) {\n result.overrides.framework = frameworkMatch[1].trim();\n }\n\n // Get first paragraph as description override\n const paragraphs = overviewSection.content.split(/\\n\\n+/);\n const firstParagraph = paragraphs[0]?.trim();\n if (firstParagraph && !firstParagraph.startsWith('-') && !firstParagraph.startsWith('*')) {\n result.overrides.description = firstParagraph;\n }\n }\n\n // Parse custom features (those added by user above the divider)\n const editableSections = content.split(/---+/)[0] || '';\n const featureSections = editableSections.match(/###\\s+([^\\n]+)\\n([\\s\\S]*?)(?=###|##|$)/g);\n\n if (featureSections) {\n for (const section of featureSections) {\n const feature = parseFeatureSection(section);\n if (feature && isUserAddedFeature(feature)) {\n result.customFeatures.push(feature);\n }\n }\n }\n\n return result;\n}\n\ninterface Section {\n title: string;\n content: string;\n}\n\nfunction splitIntoSections(content: string): Section[] {\n const sections: Section[] = [];\n const sectionRegex = /^##\\s+([^\\n]+)\\n([\\s\\S]*?)(?=^##\\s|$)/gm;\n\n let match;\n while ((match = sectionRegex.exec(content)) !== null) {\n sections.push({\n title: match[1].trim(),\n content: match[2].trim(),\n });\n }\n\n return sections;\n}\n\nfunction parseListItems(content: string): string[] {\n const items: string[] = [];\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const match = line.match(/^[-*]\\s+(.+)/);\n if (match) {\n const item = match[1].trim();\n // Skip placeholder items\n if (!item.includes('Add your') && !item.includes('Add files') && item !== '') {\n items.push(item);\n }\n }\n }\n\n return items;\n}\n\nfunction parseFeatureSection(section: string): FeatureIntent | null {\n const titleMatch = section.match(/###\\s+([^[\\n]+)(?:\\s*\\[([^\\]]+)\\])?/);\n if (!titleMatch) return null;\n\n const name = titleMatch[1].trim();\n const badge = titleMatch[2]?.trim().toLowerCase();\n\n // Get priority from badge\n let priority: 'critical' | 'high' | 'medium' | 'low' = 'medium';\n if (badge === 'critical') priority = 'critical';\n else if (badge === 'high') priority = 'high';\n else if (badge === 'low') priority = 'low';\n\n // Get description (first paragraph after title)\n const contentAfterTitle = section.replace(/###\\s+[^\\n]+\\n/, '').trim();\n const paragraphs = contentAfterTitle.split(/\\n\\n+/);\n const description = paragraphs[0]?.trim() || '';\n\n // Get constraints\n const constraints: string[] = [];\n const constraintsMatch = section.match(/\\*\\*Constraints:\\*\\*\\n((?:[-*]\\s+[^\\n]+\\n?)+)/);\n if (constraintsMatch) {\n const constraintLines = constraintsMatch[1].split('\\n');\n for (const line of constraintLines) {\n const match = line.match(/^[-*]\\s+(.+)/);\n if (match) {\n constraints.push(match[1].trim());\n }\n }\n }\n\n // Get related files\n const relatedFiles: string[] = [];\n const filesMatch = section.match(/\\*\\*Files:\\*\\*\\s*`([^`]+)`/);\n if (filesMatch) {\n const files = filesMatch[1].split(/`,\\s*`/);\n relatedFiles.push(...files.map((f) => f.replace(/`/g, '').trim()));\n }\n\n return {\n name,\n description,\n priority,\n constraints,\n relatedFiles,\n };\n}\n\nfunction isUserAddedFeature(feature: FeatureIntent): boolean {\n // Check if this looks like a user-added feature\n // User-added features typically have more specific constraints or descriptions\n return (\n feature.constraints.length > 0 ||\n feature.description.length > 50 ||\n feature.relatedFiles.length > 0\n );\n}\n\n/**\n * Merge parsed intent with existing understanding\n */\nexport function mergeIntentWithUnderstanding(\n understanding: CodebaseUnderstanding,\n parsedIntent: ParsedIntent\n): CodebaseUnderstanding {\n const merged = { ...understanding };\n\n // Apply overrides\n if (parsedIntent.overrides.description) {\n merged.summary = {\n ...merged.summary,\n description: parsedIntent.overrides.description,\n };\n }\n\n if (parsedIntent.overrides.framework) {\n merged.summary = {\n ...merged.summary,\n framework: parsedIntent.overrides.framework,\n };\n }\n\n // Add custom features\n if (parsedIntent.customFeatures.length > 0) {\n merged.features = [\n ...parsedIntent.customFeatures,\n ...merged.features.filter(\n (f) => !parsedIntent.customFeatures.some((cf) => cf.name === f.name)\n ),\n ];\n }\n\n // Add known constraints as invariants to relevant contracts\n if (parsedIntent.knownConstraints.length > 0) {\n // Add as global constraints (could be used for validation)\n (merged as any).globalConstraints = parsedIntent.knownConstraints;\n }\n\n // Store areas of concern for priority scanning\n if (parsedIntent.areasOfConcern.length > 0) {\n (merged as any).areasOfConcern = parsedIntent.areasOfConcern;\n }\n\n return merged;\n}\n","/**\n * Documentation Parser - Layer 0\n *\n * Reads existing documentation from the codebase and extracts\n * relevant information for understanding intent.\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join, basename } from 'path';\nimport fg from 'fast-glob';\n\nexport interface ExistingDocs {\n readme: string | null;\n contributing: string | null;\n apiDocs: string[];\n changelog: string | null;\n packageJson: Record<string, unknown> | null;\n tsconfig: Record<string, unknown> | null;\n envExample: string | null;\n otherDocs: Array<{ name: string; content: string }>;\n}\n\nexport interface ExtractedIntent {\n projectName: string;\n description: string;\n features: string[];\n techStack: string[];\n conventions: string[];\n apiEndpoints: string[];\n envVariables: string[];\n scripts: Record<string, string>;\n}\n\n/**\n * Read all existing documentation from a codebase\n */\nexport async function readExistingDocs(cwd: string): Promise<ExistingDocs> {\n const docs: ExistingDocs = {\n readme: null,\n contributing: null,\n apiDocs: [],\n changelog: null,\n packageJson: null,\n tsconfig: null,\n envExample: null,\n otherDocs: [],\n };\n\n // Read README\n for (const name of ['README.md', 'readme.md', 'README', 'Readme.md']) {\n const path = join(cwd, name);\n if (existsSync(path)) {\n docs.readme = readFileSync(path, 'utf-8');\n break;\n }\n }\n\n // Read CONTRIBUTING\n for (const name of ['CONTRIBUTING.md', 'contributing.md', 'CONTRIBUTING']) {\n const path = join(cwd, name);\n if (existsSync(path)) {\n docs.contributing = readFileSync(path, 'utf-8');\n break;\n }\n }\n\n // Read CHANGELOG\n for (const name of ['CHANGELOG.md', 'changelog.md', 'CHANGELOG', 'HISTORY.md']) {\n const path = join(cwd, name);\n if (existsSync(path)) {\n docs.changelog = readFileSync(path, 'utf-8');\n break;\n }\n }\n\n // Read package.json\n const packageJsonPath = join(cwd, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n docs.packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n } catch {\n // Ignore parse errors\n }\n }\n\n // Read tsconfig.json\n const tsconfigPath = join(cwd, 'tsconfig.json');\n if (existsSync(tsconfigPath)) {\n try {\n docs.tsconfig = JSON.parse(readFileSync(tsconfigPath, 'utf-8'));\n } catch {\n // Ignore parse errors\n }\n }\n\n // Read .env.example\n for (const name of ['.env.example', '.env.sample', '.env.template']) {\n const path = join(cwd, name);\n if (existsSync(path)) {\n docs.envExample = readFileSync(path, 'utf-8');\n break;\n }\n }\n\n // Find and read API docs\n const apiDocPaths = await fg(['docs/**/*.md', 'documentation/**/*.md', 'api/**/*.md'], {\n cwd,\n absolute: true,\n ignore: ['**/node_modules/**'],\n });\n\n for (const path of apiDocPaths.slice(0, 10)) {\n try {\n docs.apiDocs.push(readFileSync(path, 'utf-8'));\n } catch {\n // Skip unreadable files\n }\n }\n\n // Find other markdown docs\n const otherDocPaths = await fg(['*.md', 'docs/*.md'], {\n cwd,\n absolute: true,\n ignore: ['**/node_modules/**', 'README.md', 'CONTRIBUTING.md', 'CHANGELOG.md'],\n });\n\n for (const path of otherDocPaths.slice(0, 5)) {\n try {\n docs.otherDocs.push({\n name: basename(path),\n content: readFileSync(path, 'utf-8'),\n });\n } catch {\n // Skip unreadable files\n }\n }\n\n return docs;\n}\n\n/**\n * Extract structured intent from existing documentation\n */\nexport function extractIntentFromDocs(docs: ExistingDocs): ExtractedIntent {\n const intent: ExtractedIntent = {\n projectName: '',\n description: '',\n features: [],\n techStack: [],\n conventions: [],\n apiEndpoints: [],\n envVariables: [],\n scripts: {},\n };\n\n // Extract from package.json\n if (docs.packageJson) {\n intent.projectName = (docs.packageJson as any).name || '';\n intent.description = (docs.packageJson as any).description || '';\n intent.scripts = (docs.packageJson as any).scripts || {};\n\n // Extract tech stack from dependencies\n const deps = {\n ...(docs.packageJson as any).dependencies,\n ...(docs.packageJson as any).devDependencies,\n };\n\n if (deps) {\n if (deps['next']) intent.techStack.push('Next.js');\n if (deps['react']) intent.techStack.push('React');\n if (deps['vue']) intent.techStack.push('Vue');\n if (deps['express']) intent.techStack.push('Express');\n if (deps['fastify']) intent.techStack.push('Fastify');\n if (deps['typescript']) intent.techStack.push('TypeScript');\n if (deps['prisma']) intent.techStack.push('Prisma');\n if (deps['mongoose']) intent.techStack.push('MongoDB/Mongoose');\n if (deps['pg'] || deps['postgres']) intent.techStack.push('PostgreSQL');\n if (deps['redis']) intent.techStack.push('Redis');\n if (deps['stripe']) intent.techStack.push('Stripe');\n if (deps['@auth/core'] || deps['next-auth']) intent.techStack.push('Auth.js');\n }\n }\n\n // Extract features from README\n if (docs.readme) {\n // Look for features section\n const featuresMatch = docs.readme.match(/##\\s*Features?\\s*\\n([\\s\\S]*?)(?=\\n##|\\n---|$)/i);\n if (featuresMatch) {\n const featureLines = featuresMatch[1].split('\\n')\n .filter(line => line.trim().startsWith('-') || line.trim().startsWith('*'))\n .map(line => line.replace(/^[-*]\\s*/, '').trim())\n .filter(line => line.length > 0);\n intent.features.push(...featureLines.slice(0, 20));\n }\n }\n\n // Extract env variables\n if (docs.envExample) {\n const envLines = docs.envExample.split('\\n')\n .filter(line => line.includes('=') && !line.startsWith('#'))\n .map(line => line.split('=')[0].trim())\n .filter(line => line.length > 0);\n intent.envVariables.push(...envLines);\n }\n\n // Extract API endpoints from docs\n for (const apiDoc of docs.apiDocs) {\n const endpointMatches = apiDoc.matchAll(/`(GET|POST|PUT|DELETE|PATCH)\\s+([^`]+)`/g);\n for (const match of endpointMatches) {\n intent.apiEndpoints.push(`${match[1]} ${match[2]}`);\n }\n }\n\n // Extract conventions from CONTRIBUTING\n if (docs.contributing) {\n const conventionLines = docs.contributing.split('\\n')\n .filter(line => line.trim().startsWith('-') || line.trim().startsWith('*'))\n .map(line => line.replace(/^[-*]\\s*/, '').trim())\n .filter(line => line.length > 10 && line.length < 200)\n .slice(0, 10);\n intent.conventions.push(...conventionLines);\n }\n\n return intent;\n}\n\n/**\n * Build a documentation summary for the AI prompt\n */\nexport function buildDocsSummary(docs: ExistingDocs, extracted: ExtractedIntent): string {\n const parts: string[] = [];\n\n parts.push(`# Existing Documentation Summary\\n`);\n\n if (extracted.projectName) {\n parts.push(`## Project: ${extracted.projectName}`);\n if (extracted.description) {\n parts.push(`\\n${extracted.description}\\n`);\n }\n }\n\n if (extracted.techStack.length > 0) {\n parts.push(`\\n## Tech Stack`);\n parts.push(extracted.techStack.map(t => `- ${t}`).join('\\n'));\n }\n\n if (extracted.features.length > 0) {\n parts.push(`\\n## Features (from README)`);\n parts.push(extracted.features.map(f => `- ${f}`).join('\\n'));\n }\n\n if (extracted.apiEndpoints.length > 0) {\n parts.push(`\\n## API Endpoints`);\n parts.push(extracted.apiEndpoints.slice(0, 20).map(e => `- ${e}`).join('\\n'));\n }\n\n if (extracted.envVariables.length > 0) {\n parts.push(`\\n## Environment Variables`);\n parts.push(extracted.envVariables.map(v => `- ${v}`).join('\\n'));\n }\n\n if (extracted.conventions.length > 0) {\n parts.push(`\\n## Conventions (from CONTRIBUTING)`);\n parts.push(extracted.conventions.map(c => `- ${c}`).join('\\n'));\n }\n\n if (Object.keys(extracted.scripts).length > 0) {\n parts.push(`\\n## NPM Scripts`);\n for (const [name, cmd] of Object.entries(extracted.scripts).slice(0, 10)) {\n parts.push(`- \\`npm run ${name}\\`: ${cmd}`);\n }\n }\n\n // Include README excerpt if available\n if (docs.readme && docs.readme.length > 0) {\n const excerpt = docs.readme.slice(0, 2000);\n parts.push(`\\n## README Excerpt\\n\\`\\`\\`\\n${excerpt}\\n\\`\\`\\``);\n }\n\n return parts.join('\\n');\n}\n","import * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, mkdirSync, writeFileSync, rmSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { WhiteroseConfig, ProviderType, CodebaseUnderstanding } from '../../types.js';\nimport { detectProvider, getProviderCommand } from '../../providers/detect.js';\nimport { getExecutor } from '../../providers/executors/index.js';\nimport { CoreScanner } from '../../core/scanner.js';\nimport { execa } from 'execa';\nimport { scanCodebase } from '../../core/scanner/index.js';\nimport { generateIntentDocument } from '../../core/contracts/intent.js';\nimport { readExistingDocs, extractIntentFromDocs, buildDocsSummary } from '../../core/docs.js';\nimport YAML from 'yaml';\n\ninterface InitOptions {\n provider: string;\n skipQuestions?: boolean;\n force: boolean;\n ci?: boolean; // CI mode: non-interactive, use defaults\n unsafe?: boolean; // Deprecated: read-only operations always auto-approve\n skipProviderDetection?: boolean; // Skip provider detection when already verified (e.g., from wizard)\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n\n // Check if already initialized\n if (existsSync(whiterosePath) && !options.force) {\n p.log.error('whiterose is already initialized in this directory.');\n p.log.info('Use --force to reinitialize, or run \"whiterose refresh\" to update understanding.');\n process.exit(1);\n }\n\n p.intro(chalk.red('whiterose') + chalk.dim(' - initialization'));\n\n // ─────────────────────────────────────────────────────────────\n // Phase 1: Detect available providers (skip if already verified)\n // ─────────────────────────────────────────────────────────────\n let selectedProvider: ProviderType;\n\n if (options.skipProviderDetection && options.provider) {\n // Provider already verified by wizard - use directly\n selectedProvider = options.provider as ProviderType;\n } else {\n const providerSpinner = p.spinner();\n providerSpinner.start('Detecting available LLM providers...');\n\n const availableProviders = await detectProvider();\n\n if (availableProviders.length === 0) {\n providerSpinner.stop('No LLM providers detected');\n p.log.error('whiterose requires an LLM provider to function.');\n p.log.info('Supported providers: claude-code, aider, codex, opencode');\n p.log.info('Install one and ensure it\\'s configured, then run init again.');\n process.exit(1);\n }\n\n providerSpinner.stop(`Detected providers: ${availableProviders.join(', ')}`);\n\n // Check if provider was passed and is available\n const passedProvider = options.provider as ProviderType;\n const isPassedProviderAvailable = availableProviders.includes(passedProvider);\n\n if (isPassedProviderAvailable) {\n // Use the passed provider without asking\n selectedProvider = passedProvider;\n p.log.info(`Using ${selectedProvider} as your LLM provider.`);\n } else if (options.skipQuestions) {\n // Only auto-select in skip mode\n selectedProvider = availableProviders[0] as ProviderType;\n p.log.info(`Using ${selectedProvider} as your LLM provider.`);\n } else {\n const providerChoice = await p.select({\n message: 'Which LLM provider should whiterose use?',\n options: availableProviders.map((prov) => ({\n value: prov,\n label: prov,\n hint: prov === 'claude-code' ? 'recommended' : undefined,\n })),\n });\n\n if (p.isCancel(providerChoice)) {\n p.cancel('Initialization cancelled.');\n process.exit(0);\n }\n\n selectedProvider = providerChoice as ProviderType;\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Phase 1.5: Verify provider CLI actually works (fail fast)\n // ─────────────────────────────────────────────────────────────\n const verifySpinner = p.spinner();\n verifySpinner.start('Verifying provider CLI works...');\n\n try {\n const command = getProviderCommand(selectedProvider);\n await execa(command, ['--version'], { timeout: 10000 });\n verifySpinner.stop(`Using ${selectedProvider} at: ${command}`);\n } catch (error: any) {\n verifySpinner.stop('Provider CLI verification failed');\n const installHint = selectedProvider === 'claude-code'\n ? 'npm install -g @anthropic-ai/claude-code'\n : `Install ${selectedProvider} and ensure it's in your PATH`;\n p.log.error(`Cannot run ${selectedProvider} CLI. ${installHint}`);\n p.log.info(`Resolved path: ${getProviderCommand(selectedProvider)}`);\n if (error.message) {\n p.log.info(`Error: ${error.message}`);\n }\n process.exit(1);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Phase 2: Full codebase scan\n // ─────────────────────────────────────────────────────────────\n const scanSpinner = p.spinner();\n scanSpinner.start('Scanning codebase...');\n\n let codebaseFiles: string[];\n try {\n codebaseFiles = await scanCodebase(cwd);\n scanSpinner.stop(`Found ${codebaseFiles.length} source files`);\n } catch (error) {\n scanSpinner.stop('Failed to scan codebase');\n p.log.error(String(error));\n process.exit(1);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Phase 2.5: Read existing documentation (Layer 0)\n // ─────────────────────────────────────────────────────────────\n const docsSpinner = p.spinner();\n docsSpinner.start('Reading existing documentation...');\n\n let docsSummary: string | undefined;\n try {\n const existingDocs = await readExistingDocs(cwd);\n const extractedIntent = extractIntentFromDocs(existingDocs);\n docsSummary = buildDocsSummary(existingDocs, extractedIntent);\n\n const docsFound = [];\n if (existingDocs.readme) docsFound.push('README');\n if (existingDocs.contributing) docsFound.push('CONTRIBUTING');\n if (existingDocs.packageJson) docsFound.push('package.json');\n if (existingDocs.envExample) docsFound.push('.env.example');\n if (existingDocs.apiDocs.length > 0) docsFound.push(`${existingDocs.apiDocs.length} API docs`);\n\n if (docsFound.length > 0) {\n docsSpinner.stop(`Found existing docs: ${docsFound.join(', ')}`);\n } else {\n docsSpinner.stop('No existing documentation found (will generate from code)');\n docsSummary = undefined;\n }\n } catch (error) {\n docsSpinner.stop('Could not read existing docs (continuing without)');\n docsSummary = undefined;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Phase 3: Generate understanding via LLM (merge with existing docs)\n // ─────────────────────────────────────────────────────────────\n const understandingSpinner = p.spinner();\n const startTime = Date.now();\n\n understandingSpinner.start('Starting codebase analysis...');\n\n let understanding: CodebaseUnderstanding;\n try {\n const executor = getExecutor(selectedProvider);\n const scanner = new CoreScanner(executor, {}, {\n onProgress: (message: string) => {\n if (message.trim()) {\n understandingSpinner.message(message);\n }\n },\n });\n\n // Pass existing docs summary to merge with AI exploration\n understanding = await scanner.generateUnderstanding(codebaseFiles, docsSummary);\n\n const totalTime = Math.floor((Date.now() - startTime) / 1000);\n understandingSpinner.stop(`Analysis complete (${totalTime}s)`);\n } catch (error) {\n understandingSpinner.stop('Analysis failed');\n p.log.error(String(error));\n process.exit(1);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Phase 4: Show summary and confirm understanding\n // ─────────────────────────────────────────────────────────────\n const skipInteractive = options.skipQuestions || options.ci;\n if (!skipInteractive) {\n p.log.message(chalk.bold('\\nHere\\'s what I understand about your codebase:\\n'));\n p.log.message(` ${chalk.cyan('Type:')} ${understanding.summary.type}`);\n p.log.message(` ${chalk.cyan('Framework:')} ${understanding.summary.framework || 'None detected'}`);\n p.log.message(` ${chalk.cyan('Language:')} ${understanding.summary.language}`);\n p.log.message(` ${chalk.cyan('Files:')} ${understanding.structure.totalFiles}`);\n p.log.message(` ${chalk.cyan('Lines:')} ${understanding.structure.totalLines.toLocaleString()}`);\n p.log.message(`\\n ${chalk.dim(understanding.summary.description)}\\n`);\n\n if (understanding.features.length > 0) {\n p.log.message(chalk.bold('Detected features:'));\n for (const feature of understanding.features.slice(0, 5)) {\n p.log.message(` ${chalk.yellow('●')} ${feature.name} - ${chalk.dim(feature.description)}`);\n }\n if (understanding.features.length > 5) {\n p.log.message(` ${chalk.dim(`...and ${understanding.features.length - 5} more`)}`);\n }\n console.log();\n }\n\n const isAccurate = await p.confirm({\n message: 'Is this understanding accurate?',\n initialValue: true,\n });\n\n if (p.isCancel(isAccurate)) {\n p.cancel('Initialization cancelled.');\n process.exit(0);\n }\n\n if (!isAccurate) {\n p.log.info('You can edit .whiterose/intent.md after initialization to correct the understanding.');\n }\n\n // Priorities are now auto-determined by the LLM based on detected features\n // Auth, payments, checkout = critical. User data = high. UI = medium. etc.\n const priorities: Record<string, 'critical' | 'high' | 'medium' | 'low' | 'ignore'> = {};\n for (const feature of understanding.features) {\n for (const file of feature.relatedFiles) {\n priorities[file] = feature.priority;\n }\n }\n (understanding as any)._userPriorities = priorities;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Phase 6: Create .whiterose directory and files\n // ─────────────────────────────────────────────────────────────\n const writeSpinner = p.spinner();\n writeSpinner.start('Creating configuration...');\n\n // Track whether .whiterose existed before (for rollback decisions)\n const whiteroseExistedBefore = existsSync(whiterosePath);\n // Save original .gitignore content for rollback\n const gitignorePath = join(cwd, '.gitignore');\n const originalGitignore = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf-8') : null;\n\n try {\n // Create directory structure\n mkdirSync(join(whiterosePath, 'cache'), { recursive: true });\n mkdirSync(join(whiterosePath, 'reports'), { recursive: true });\n\n // Generate config\n const config: WhiteroseConfig = {\n version: '1',\n provider: selectedProvider,\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: ['node_modules', 'dist', 'build', '.next', 'coverage', '**/*.test.*', '**/*.spec.*'],\n priorities: (understanding as any)._userPriorities || {},\n categories: [\n 'injection', 'auth-bypass', 'secrets-exposure',\n 'null-reference', 'boundary-error', 'resource-leak', 'async-issue',\n 'logic-error', 'data-validation', 'type-coercion',\n 'concurrency', 'intent-violation',\n ],\n minConfidence: 'low',\n staticAnalysis: {\n typescript: true,\n eslint: true,\n },\n output: {\n sarif: true,\n markdown: true,\n sarifPath: '.whiterose/reports',\n markdownPath: 'BUGS.md',\n },\n };\n\n // Prepare all file contents before writing (fail fast on generation errors)\n const intentDoc = generateIntentDocument(understanding);\n const configContent = YAML.stringify(config);\n const understandingContent = JSON.stringify(understanding, null, 2);\n const hashesContent = JSON.stringify({ version: '1', fileHashes: [], lastFullScan: null }, null, 2);\n\n // Write all files atomically (all-or-nothing approach)\n writeFileSync(join(whiterosePath, 'config.yml'), configContent, 'utf-8');\n writeFileSync(join(whiterosePath, 'cache', 'understanding.json'), understandingContent, 'utf-8');\n writeFileSync(join(whiterosePath, 'intent.md'), intentDoc, 'utf-8');\n writeFileSync(join(whiterosePath, 'cache', 'file-hashes.json'), hashesContent, 'utf-8');\n\n // Add to .gitignore if it exists and doesn't already have the entry\n if (originalGitignore !== null && !originalGitignore.includes('.whiterose/cache')) {\n writeFileSync(gitignorePath, originalGitignore + '\\n# whiterose cache\\n.whiterose/cache/\\n', 'utf-8');\n }\n\n writeSpinner.stop('Configuration created');\n } catch (error) {\n writeSpinner.stop('Failed to create configuration');\n\n // Rollback: clean up .whiterose if we created it\n if (!whiteroseExistedBefore && existsSync(whiterosePath)) {\n try {\n rmSync(whiterosePath, { recursive: true, force: true });\n p.log.info('Rolled back: removed .whiterose directory');\n } catch {\n // Ignore rollback errors\n }\n }\n\n // Rollback: restore original .gitignore if we modified it\n if (originalGitignore !== null && existsSync(gitignorePath)) {\n try {\n const currentGitignore = readFileSync(gitignorePath, 'utf-8');\n if (currentGitignore !== originalGitignore) {\n writeFileSync(gitignorePath, originalGitignore, 'utf-8');\n p.log.info('Rolled back: restored .gitignore');\n }\n } catch {\n // Ignore rollback errors\n }\n }\n\n p.log.error(String(error));\n process.exit(1);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Done\n // ─────────────────────────────────────────────────────────────\n p.outro(chalk.green('whiterose initialized successfully!'));\n\n console.log();\n console.log(chalk.dim(' Next steps:'));\n console.log(chalk.dim(' 1. Review .whiterose/intent.md and edit if needed'));\n console.log(chalk.dim(' 2. Run ') + chalk.cyan('whiterose scan') + chalk.dim(' to find bugs'));\n console.log(chalk.dim(' 3. Run ') + chalk.cyan('whiterose fix') + chalk.dim(' to fix them interactively'));\n console.log();\n}\n","import { z } from 'zod';\n\n// ─────────────────────────────────────────────────────────────\n// Bug & Finding Types\n// ─────────────────────────────────────────────────────────────\n\nexport const BugSeverity = z.enum(['critical', 'high', 'medium', 'low']);\nexport type BugSeverity = z.infer<typeof BugSeverity>;\n\nexport const FindingKind = z.enum(['bug', 'smell']);\nexport type FindingKind = z.infer<typeof FindingKind>;\n\n// 12 categories grouped into 4 families:\n// SECURITY: injection, auth-bypass, secrets-exposure\n// RELIABILITY: null-reference, boundary-error, resource-leak, async-issue\n// CORRECTNESS: logic-error, data-validation, type-coercion\n// DESIGN: concurrency, intent-violation\nexport const BugCategory = z.enum([\n // Security (external threats)\n 'injection', // SQL injection, XSS, command injection, path traversal\n 'auth-bypass', // Authentication/authorization flaws, privilege escalation\n 'secrets-exposure', // Hardcoded credentials, leaked tokens, exposed API keys\n // Reliability (runtime failures)\n 'null-reference', // Null/undefined dereference, optional chaining needed\n 'boundary-error', // Off-by-one, array bounds, integer overflow, loop issues\n 'resource-leak', // Unclosed connections, file handles, memory leaks, timers\n 'async-issue', // Missing await, unhandled promises, race conditions\n // Correctness (wrong behavior)\n 'logic-error', // Wrong operators, incorrect conditions, bad math, wrong comparisons\n 'data-validation', // Missing input validation, format checking, sanitization\n 'type-coercion', // Implicit coercion bugs, wrong type handling, NaN propagation\n // Design (intent violations)\n 'concurrency', // Thread safety, deadlocks, shared state mutation\n 'intent-violation', // Code does opposite of what comments/names suggest\n]);\nexport type BugCategory = z.infer<typeof BugCategory>;\n\nexport const ConfidenceLevel = z.enum(['high', 'medium', 'low']);\nexport type ConfidenceLevel = z.infer<typeof ConfidenceLevel>;\n\nexport const ConfidenceScore = z.object({\n overall: ConfidenceLevel,\n codePathValidity: z.number().min(0).max(1),\n reachability: z.number().min(0).max(1),\n intentViolation: z.boolean(),\n staticToolSignal: z.boolean(),\n adversarialSurvived: z.boolean(),\n});\nexport type ConfidenceScore = z.infer<typeof ConfidenceScore>;\n\nexport const CodePathStep = z.object({\n step: z.number(),\n file: z.string(),\n line: z.number(),\n code: z.string(),\n explanation: z.string(),\n});\nexport type CodePathStep = z.infer<typeof CodePathStep>;\n\nexport const BugStatus = z.enum(['open', 'fixed', 'false-positive', 'wont-fix']);\nexport type BugStatus = z.infer<typeof BugStatus>;\n\nexport const Bug = z.object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n file: z.string(),\n line: z.number(),\n endLine: z.number().optional(),\n kind: FindingKind.default('bug'),\n severity: BugSeverity,\n category: BugCategory,\n confidence: ConfidenceScore,\n codePath: z.array(CodePathStep),\n evidence: z.array(z.string()),\n suggestedFix: z.string().optional(),\n relatedContract: z.string().optional(),\n staticAnalysisSignals: z.array(z.string()).optional(),\n createdAt: z.string().datetime(),\n // Fix tracking\n status: BugStatus.default('open'),\n fixedAt: z.string().datetime().optional(),\n fixCommit: z.string().optional(),\n // Scanner metadata\n passName: z.string().optional(), // Which pass found this bug\n});\nexport type Bug = z.infer<typeof Bug>;\n\n// ─────────────────────────────────────────────────────────────\n// Config Types\n// ─────────────────────────────────────────────────────────────\n\nexport const ProviderType = z.enum([\n 'claude-code',\n 'aider',\n 'codex',\n 'opencode',\n 'ollama',\n 'gemini',\n]);\nexport type ProviderType = z.infer<typeof ProviderType>;\n\nexport const PriorityLevel = z.enum(['critical', 'high', 'medium', 'low', 'ignore']);\nexport type PriorityLevel = z.infer<typeof PriorityLevel>;\n\nexport const PackageConfig = z.object({\n path: z.string(),\n priority: PriorityLevel,\n include: z.array(z.string()).optional(),\n exclude: z.array(z.string()).optional(),\n});\nexport type PackageConfig = z.infer<typeof PackageConfig>;\n\nexport const MonorepoConfig = z.object({\n detection: z.enum(['auto', 'explicit']),\n packages: z.array(PackageConfig).optional(),\n crossPackageAnalysis: z.boolean().default(true),\n});\nexport type MonorepoConfig = z.infer<typeof MonorepoConfig>;\n\nexport const WhiteroseConfig = z.object({\n version: z.string().default('1'),\n provider: ProviderType.default('claude-code'),\n providerFallback: z.array(ProviderType).optional(),\n\n // Scan settings\n include: z.array(z.string()).default(['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx']),\n exclude: z.array(z.string()).default(['node_modules', 'dist', 'build', '.next', 'coverage']),\n\n // Priority areas\n priorities: z\n .record(z.string(), PriorityLevel)\n .default({}),\n\n // Bug categories to scan for (all 12 categories by default)\n categories: z.array(BugCategory).default([\n // Security\n 'injection',\n 'auth-bypass',\n 'secrets-exposure',\n // Reliability\n 'null-reference',\n 'boundary-error',\n 'resource-leak',\n 'async-issue',\n // Correctness\n 'logic-error',\n 'data-validation',\n 'type-coercion',\n // Design\n 'concurrency',\n 'intent-violation',\n ]),\n\n // Confidence threshold for reporting\n minConfidence: ConfidenceLevel.default('low'),\n\n // Monorepo settings\n monorepo: MonorepoConfig.optional(),\n\n // Static analysis integration\n staticAnalysis: z.object({\n typescript: z.boolean().default(true),\n eslint: z.boolean().default(true),\n }).default({}),\n\n // Output settings\n output: z.object({\n sarif: z.boolean().default(true),\n markdown: z.boolean().default(true),\n sarifPath: z.string().default('.whiterose/reports'),\n markdownPath: z.string().default('BUGS.md'),\n }).default({}),\n});\nexport type WhiteroseConfig = z.infer<typeof WhiteroseConfig>;\n\n// ─────────────────────────────────────────────────────────────\n// Intent & Contract Types\n// ─────────────────────────────────────────────────────────────\n\nexport const BehavioralContract = z.object({\n function: z.string(),\n file: z.string(),\n inputs: z.array(\n z.object({\n name: z.string(),\n type: z.string(),\n constraints: z.string().optional(),\n })\n ),\n outputs: z.object({\n type: z.string(),\n constraints: z.string().optional(),\n }),\n invariants: z.array(z.string()),\n sideEffects: z.array(z.string()),\n throws: z.array(z.string()).optional(),\n});\nexport type BehavioralContract = z.infer<typeof BehavioralContract>;\n\nexport const FeatureIntent = z.object({\n name: z.string(),\n description: z.string(),\n priority: PriorityLevel,\n constraints: z.array(z.string()),\n relatedFiles: z.array(z.string()),\n});\nexport type FeatureIntent = z.infer<typeof FeatureIntent>;\n\nexport const CodebaseUnderstanding = z.object({\n version: z.string(),\n generatedAt: z.string().datetime(),\n summary: z.object({\n framework: z.string().optional(),\n language: z.string(),\n type: z.string(), // e-commerce, saas, api, etc.\n description: z.string(),\n }),\n features: z.array(FeatureIntent),\n contracts: z.array(BehavioralContract),\n dependencies: z.record(z.string(), z.string()),\n structure: z.object({\n totalFiles: z.number(),\n totalLines: z.number(),\n packages: z.array(z.string()).optional(),\n }),\n});\nexport type CodebaseUnderstanding = z.infer<typeof CodebaseUnderstanding>;\n\n// ─────────────────────────────────────────────────────────────\n// Cache Types\n// ─────────────────────────────────────────────────────────────\n\nexport const FileHash = z.object({\n path: z.string(),\n hash: z.string(),\n lastModified: z.string().datetime(),\n});\nexport type FileHash = z.infer<typeof FileHash>;\n\nexport const CacheState = z.object({\n version: z.string(),\n lastFullScan: z.string().datetime().optional(),\n lastIncrementalScan: z.string().datetime().optional(),\n fileHashes: z.array(FileHash),\n});\nexport type CacheState = z.infer<typeof CacheState>;\n\n// ─────────────────────────────────────────────────────────────\n// Provider Types\n// ─────────────────────────────────────────────────────────────\n\n// NOTE: AnalysisContext removed - use ScanContext from CoreScanner instead\n\nexport interface StaticAnalysisResult {\n tool: 'typescript' | 'eslint';\n file: string;\n line: number;\n message: string;\n severity: 'error' | 'warning' | 'info';\n code?: string;\n}\n\n// NOTE: LLMProvider interface removed - use PromptExecutor + CoreScanner instead\n// See src/core/scanner.ts for the new LSP-compliant architecture\n\nexport interface AdversarialResult {\n survived: boolean;\n counterArguments: string[];\n adjustedConfidence?: ConfidenceScore;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Scan Result Types\n// ─────────────────────────────────────────────────────────────\n\nexport const SeverityBreakdown = z.object({\n critical: z.number(),\n high: z.number(),\n medium: z.number(),\n low: z.number(),\n total: z.number(),\n});\nexport type SeverityBreakdown = z.infer<typeof SeverityBreakdown>;\n\nexport const ScanSummary = z.object({\n bugs: SeverityBreakdown,\n smells: SeverityBreakdown,\n total: z.number(),\n});\nexport type ScanSummary = z.infer<typeof ScanSummary>;\n\nexport const ScanMeta = z.object({\n repoName: z.string(),\n provider: z.string(),\n duration: z.number(), // ms\n filesScanned: z.number(),\n linesOfCode: z.number(),\n});\nexport type ScanMeta = z.infer<typeof ScanMeta>;\n\nexport const ScanResult = z.object({\n id: z.string(),\n timestamp: z.string().datetime(),\n scanType: z.enum(['full', 'incremental']),\n filesScanned: z.number(),\n filesChanged: z.number().optional(),\n duration: z.number(), // ms\n linesOfCode: z.number().optional(),\n bugs: z.array(Bug),\n summary: ScanSummary,\n meta: ScanMeta.optional(),\n});\nexport type ScanResult = z.infer<typeof ScanResult>;\n","import { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport YAML from 'yaml';\nimport { WhiteroseConfig, CodebaseUnderstanding as CodebaseUnderstandingSchema } from '../types.js';\nimport type { CodebaseUnderstanding } from '../types.js';\n\nexport async function loadConfig(cwd: string): Promise<WhiteroseConfig> {\n const configPath = join(cwd, '.whiterose', 'config.yml');\n\n if (!existsSync(configPath)) {\n throw new Error('Config file not found. Run \"whiterose init\" first.');\n }\n\n const content = readFileSync(configPath, 'utf-8');\n const parsed = YAML.parse(content);\n\n // Apply defaults\n return WhiteroseConfig.parse(parsed);\n}\n\nexport async function loadUnderstanding(cwd: string): Promise<CodebaseUnderstanding | null> {\n const understandingPath = join(cwd, '.whiterose', 'cache', 'understanding.json');\n\n if (!existsSync(understandingPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(understandingPath, 'utf-8');\n const parsed = JSON.parse(content);\n const result = CodebaseUnderstandingSchema.safeParse(parsed);\n if (!result.success) {\n console.error('Warning: Invalid understanding.json, regenerate with \"whiterose refresh\"');\n return null;\n }\n return result.data;\n } catch {\n return null;\n }\n}\n\nexport async function saveConfig(cwd: string, config: WhiteroseConfig): Promise<void> {\n const { writeFileSync } = await import('fs');\n const configPath = join(cwd, '.whiterose', 'config.yml');\n writeFileSync(configPath, YAML.stringify(config), 'utf-8');\n}\n","import { execa } from 'execa';\nimport { existsSync } from 'fs';\nimport { join, resolve, isAbsolute } from 'path';\nimport { WhiteroseConfig, StaticAnalysisResult } from '../types.js';\n\nexport async function runStaticAnalysis(\n cwd: string,\n files: string[],\n config?: WhiteroseConfig\n): Promise<StaticAnalysisResult[]> {\n const results: StaticAnalysisResult[] = [];\n\n // Default to running both if config is not provided\n const shouldRunTypescript = config?.staticAnalysis?.typescript ?? true;\n const shouldRunEslint = config?.staticAnalysis?.eslint ?? true;\n\n // Run TypeScript compiler\n if (shouldRunTypescript) {\n const tscResults = await runTypeScript(cwd);\n results.push(...tscResults);\n }\n\n // Run ESLint\n if (shouldRunEslint) {\n const eslintResults = await runEslint(cwd, files);\n results.push(...eslintResults);\n }\n\n return results;\n}\n\nasync function runTypeScript(cwd: string): Promise<StaticAnalysisResult[]> {\n const results: StaticAnalysisResult[] = [];\n\n // Check if tsconfig exists\n const tsconfigPath = join(cwd, 'tsconfig.json');\n if (!existsSync(tsconfigPath)) {\n return results;\n }\n\n try {\n // Run tsc --noEmit and capture diagnostics\n await execa('npx', ['tsc', '--noEmit', '--pretty', 'false'], {\n cwd,\n timeout: 60000,\n });\n } catch (error: any) {\n // Parse TypeScript errors from stdout\n const output = [error.stdout, error.stderr].filter(Boolean).join('\\n');\n const lines = output.split('\\n');\n\n for (const line of lines) {\n // Format: path/to/file.ts(line,col): error TS1234: message\n const match = line.match(/^(.+)\\((\\d+),(\\d+)\\):\\s+(error|warning)\\s+TS(\\d+):\\s+(.+)$/);\n if (match) {\n const filePath = normalizeFilePath(match[1], cwd);\n results.push({\n tool: 'typescript',\n file: filePath,\n line: parseInt(match[2], 10),\n message: match[6],\n severity: match[4] === 'error' ? 'error' : 'warning',\n code: `TS${match[5]}`,\n });\n }\n }\n }\n\n return results;\n}\n\nasync function runEslint(cwd: string, files: string[]): Promise<StaticAnalysisResult[]> {\n const results: StaticAnalysisResult[] = [];\n\n // Check if eslint config exists\n const hasEslint =\n existsSync(join(cwd, '.eslintrc')) ||\n existsSync(join(cwd, '.eslintrc.js')) ||\n existsSync(join(cwd, '.eslintrc.json')) ||\n existsSync(join(cwd, '.eslintrc.yml')) ||\n existsSync(join(cwd, 'eslint.config.js')) ||\n existsSync(join(cwd, 'eslint.config.mjs'));\n\n if (!hasEslint) {\n return results;\n }\n\n if (files.length === 0) {\n return results;\n }\n\n try {\n const batchSize = 50;\n for (let i = 0; i < files.length; i += batchSize) {\n const batch = files.slice(i, i + batchSize);\n // Run eslint with JSON output\n const { stdout } = await execa(\n 'npx',\n ['eslint', '--format', 'json', '--no-error-on-unmatched-pattern', ...batch],\n {\n cwd,\n timeout: 60000,\n reject: false,\n }\n );\n\n // ESLint may output warnings before JSON - try to extract JSON array\n let eslintResults: any[] = [];\n try {\n // First try direct parse\n eslintResults = JSON.parse(stdout || '[]');\n } catch {\n // Try to find JSON array in output (skip any prefix warnings)\n const jsonMatch = (stdout || '').match(/\\[\\s*\\{[\\s\\S]*\\}\\s*\\]|\\[\\s*\\]/);\n if (jsonMatch) {\n try {\n eslintResults = JSON.parse(jsonMatch[0]);\n } catch {\n // Give up on this batch - continue with the next\n continue;\n }\n }\n }\n\n for (const fileResult of eslintResults) {\n const filePath = normalizeFilePath(fileResult.filePath, cwd);\n for (const message of fileResult.messages || []) {\n results.push({\n tool: 'eslint',\n file: filePath,\n line: message.line || 0,\n message: message.message,\n severity: message.severity === 2 ? 'error' : 'warning',\n code: message.ruleId,\n });\n }\n }\n }\n } catch {\n // ESLint execution failed, skip\n }\n\n return results;\n}\n\nfunction normalizeFilePath(filePath: string, cwd: string): string {\n if (!filePath) return filePath;\n return isAbsolute(filePath) ? filePath : resolve(cwd, filePath);\n}\n","import { ScanResult, Bug } from '../types.js';\n\ninterface SarifResult {\n $schema: string;\n version: string;\n runs: SarifRun[];\n}\n\ninterface SarifRun {\n tool: {\n driver: {\n name: string;\n version: string;\n informationUri: string;\n rules: SarifRule[];\n };\n };\n results: SarifResultItem[];\n}\n\ninterface SarifRule {\n id: string;\n name: string;\n shortDescription: { text: string };\n fullDescription: { text: string };\n defaultConfiguration: { level: string };\n properties: { category: string; kind?: string };\n}\n\ninterface SarifResultItem {\n ruleId: string;\n level: string;\n message: { text: string; markdown?: string };\n locations: SarifLocation[];\n codeFlows?: SarifCodeFlow[];\n properties?: Record<string, any>;\n}\n\ninterface SarifLocation {\n physicalLocation: {\n artifactLocation: { uri: string };\n region: { startLine: number; endLine?: number };\n };\n}\n\ninterface SarifCodeFlow {\n threadFlows: {\n locations: {\n location: SarifLocation;\n message?: { text: string };\n }[];\n }[];\n}\n\nexport function outputSarif(result: ScanResult): SarifResult {\n const rules: SarifRule[] = [];\n const results: SarifResultItem[] = [];\n\n // Build unique rules from bugs\n const seenRules = new Set<string>();\n\n for (const bug of result.bugs) {\n // Create rule if not seen\n if (!seenRules.has(bug.category)) {\n seenRules.add(bug.category);\n rules.push({\n id: bug.category,\n name: formatRuleName(bug.category),\n shortDescription: { text: getCategoryDescription(bug.category) },\n fullDescription: { text: getCategoryDescription(bug.category) },\n defaultConfiguration: { level: 'warning' },\n properties: { category: bug.category, kind: bug.kind },\n });\n }\n\n // Create result\n results.push(bugToSarifResult(bug));\n }\n\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: 'whiterose',\n version: '0.1.0',\n informationUri: 'https://github.com/shakecodeslikecray/whiterose',\n rules,\n },\n },\n results,\n },\n ],\n };\n}\n\nfunction bugToSarifResult(bug: Bug): SarifResultItem {\n const result: SarifResultItem = {\n ruleId: bug.id,\n level: severityToLevel(bug),\n message: {\n text: `${bug.kind === 'smell' ? '[SMELL] ' : ''}${bug.title}`,\n markdown: `**${bug.title}**\\n\\n${bug.description}\\n\\n**Kind:** ${bug.kind}\\n\\n**Evidence:**\\n${bug.evidence.map((e) => `- ${e}`).join('\\n')}`,\n },\n locations: [\n {\n physicalLocation: {\n artifactLocation: { uri: bug.file },\n region: { startLine: bug.line, endLine: bug.endLine },\n },\n },\n ],\n properties: {\n category: bug.category,\n kind: bug.kind,\n confidence: bug.confidence.overall,\n codePathValidity: bug.confidence.codePathValidity,\n reachability: bug.confidence.reachability,\n intentViolation: bug.confidence.intentViolation,\n staticToolSignal: bug.confidence.staticToolSignal,\n adversarialSurvived: bug.confidence.adversarialSurvived,\n evidence: bug.evidence,\n suggestedFix: bug.suggestedFix,\n },\n };\n\n // Add code flow if available\n if (bug.codePath.length > 0) {\n result.codeFlows = [\n {\n threadFlows: [\n {\n locations: bug.codePath.map((step) => ({\n location: {\n physicalLocation: {\n artifactLocation: { uri: step.file },\n region: { startLine: step.line },\n },\n },\n message: { text: step.explanation },\n })),\n },\n ],\n },\n ];\n }\n\n return result;\n}\n\nfunction severityToLevel(bug: Bug): string {\n if (bug.kind === 'smell') return 'note';\n switch (bug.severity) {\n case 'critical':\n return 'error';\n case 'high':\n return 'error';\n case 'medium':\n return 'warning';\n case 'low':\n return 'note';\n default:\n return 'warning';\n }\n}\n\nfunction formatRuleName(category: string): string {\n return category\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\nfunction getCategoryDescription(category: string): string {\n const descriptions: Record<string, string> = {\n // Security\n 'injection': 'Injection vulnerabilities including SQL, command, and code injection',\n 'auth-bypass': 'Authentication and authorization bypass vulnerabilities',\n 'secrets-exposure': 'Exposure of secrets, credentials, or sensitive data',\n // Reliability\n 'null-reference': 'Potential null or undefined reference issues',\n 'boundary-error': 'Boundary errors including off-by-one and array index issues',\n 'resource-leak': 'Resource leaks such as unclosed handles or connections',\n 'async-issue': 'Async/concurrency issues like race conditions and missing awaits',\n // Correctness\n 'logic-error': 'Logic errors such as wrong operators or incorrect conditions',\n 'data-validation': 'Missing or improper input validation',\n 'type-coercion': 'Type coercion bugs that may cause unexpected behavior',\n // Design\n 'concurrency': 'Thread safety and deadlock issues',\n 'intent-violation': 'Violations of documented behavioral contracts or business rules',\n };\n\n return descriptions[category] || 'Unknown bug category';\n}\n","import { ScanResult, Bug, BugSeverity } from '../types.js';\n\nexport function outputMarkdown(result: ScanResult): string {\n const lines: string[] = [];\n const verifiedBugs = result.bugs.filter((b) => b.kind === 'bug');\n const smells = result.bugs.filter((b) => b.kind === 'smell');\n\n // Header\n lines.push('# Bug Report');\n lines.push('');\n lines.push(`> Generated by [whiterose](https://github.com/shakecodeslikecray/whiterose) on ${new Date().toISOString()}`);\n lines.push('');\n\n // Summary\n lines.push('## Summary');\n lines.push('');\n lines.push(`| | Bugs | Smells |`);\n lines.push(`|----------|-------|-------|`);\n lines.push(`| Critical | ${result.summary.bugs.critical} | ${result.summary.smells.critical} |`);\n lines.push(`| High | ${result.summary.bugs.high} | ${result.summary.smells.high} |`);\n lines.push(`| Medium | ${result.summary.bugs.medium} | ${result.summary.smells.medium} |`);\n lines.push(`| Low | ${result.summary.bugs.low} | ${result.summary.smells.low} |`);\n lines.push(`| **Total** | **${result.summary.bugs.total}** | **${result.summary.smells.total}** |`);\n lines.push('');\n lines.push(`**Total Findings:** ${result.summary.total}`);\n lines.push('');\n\n // Scan info\n lines.push(`- **Scan Type:** ${result.scanType}`);\n lines.push(`- **Files Scanned:** ${result.filesScanned}`);\n if (result.filesChanged !== undefined) {\n lines.push(`- **Files Changed:** ${result.filesChanged}`);\n }\n lines.push('');\n\n if (verifiedBugs.length === 0 && smells.length === 0) {\n lines.push('No findings found.');\n return lines.join('\\n');\n }\n\n if (verifiedBugs.length === 0 && smells.length > 0) {\n lines.push('No verified bugs found. Smells are listed below.');\n lines.push('');\n }\n\n // Group by severity\n const bySeverity: Record<BugSeverity, Bug[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n\n for (const bug of verifiedBugs) {\n bySeverity[bug.severity].push(bug);\n }\n\n if (verifiedBugs.length > 0) {\n lines.push('## Verified Bugs');\n lines.push('');\n emitBySeverity(lines, bySeverity);\n }\n\n if (smells.length > 0) {\n const smellsBySeverity: Record<BugSeverity, Bug[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n\n for (const smell of smells) {\n smellsBySeverity[smell.severity].push(smell);\n }\n\n lines.push('## Smells');\n lines.push('');\n emitBySeverity(lines, smellsBySeverity);\n }\n\n return lines.join('\\n');\n}\n\nfunction emitBySeverity(lines: string[], bySeverity: Record<BugSeverity, Bug[]>): void {\n if (bySeverity.critical.length > 0) {\n lines.push('### Critical');\n lines.push('');\n for (const bug of bySeverity.critical) {\n lines.push(formatBug(bug));\n }\n }\n\n if (bySeverity.high.length > 0) {\n lines.push('### High');\n lines.push('');\n for (const bug of bySeverity.high) {\n lines.push(formatBug(bug));\n }\n }\n\n if (bySeverity.medium.length > 0) {\n lines.push('### Medium');\n lines.push('');\n for (const bug of bySeverity.medium) {\n lines.push(formatBug(bug));\n }\n }\n\n if (bySeverity.low.length > 0) {\n lines.push('### Low');\n lines.push('');\n for (const bug of bySeverity.low) {\n lines.push(formatBug(bug));\n }\n }\n}\n\nfunction formatBug(bug: Bug): string {\n const lines: string[] = [];\n\n // Title with ID and confidence\n const confidenceBadge = getConfidenceBadge(bug.confidence.overall);\n const kindBadge = bug.kind === 'smell' ? '`[SMELL]`' : '`[BUG]`';\n lines.push(`### ${bug.id}: ${bug.title} ${kindBadge} ${confidenceBadge}`);\n lines.push('');\n\n // Location\n lines.push(`**Location:** \\`${bug.file}:${bug.line}\\``);\n lines.push(`**Category:** ${formatCategory(bug.category)}`);\n lines.push('');\n\n // Description\n lines.push(bug.description);\n lines.push('');\n\n // Code path\n if (bug.codePath.length > 0) {\n lines.push('<details>');\n lines.push('<summary>Code Path</summary>');\n lines.push('');\n for (const step of bug.codePath) {\n lines.push(`${step.step}. \\`${step.file}:${step.line}\\``);\n lines.push(` \\`\\`\\`${getLanguage(step.file)}`);\n lines.push(` ${step.code}`);\n lines.push(' ```');\n lines.push(` ${step.explanation}`);\n lines.push('');\n }\n lines.push('</details>');\n lines.push('');\n }\n\n // Evidence\n if (bug.evidence.length > 0) {\n lines.push('**Evidence:**');\n for (const e of bug.evidence) {\n lines.push(`- ${e}`);\n }\n lines.push('');\n }\n\n // Suggested fix\n if (bug.suggestedFix) {\n lines.push('**Suggested Fix:**');\n lines.push('```');\n lines.push(bug.suggestedFix);\n lines.push('```');\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction getConfidenceBadge(confidence: string): string {\n switch (confidence) {\n case 'high':\n return '`[HIGH CONFIDENCE]`';\n case 'medium':\n return '`[MEDIUM CONFIDENCE]`';\n case 'low':\n return '`[LOW CONFIDENCE]`';\n default:\n return '';\n }\n}\n\nfunction formatCategory(category: string): string {\n return category\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\nfunction getLanguage(file: string): string {\n if (file.endsWith('.ts') || file.endsWith('.tsx')) return 'typescript';\n if (file.endsWith('.js') || file.endsWith('.jsx')) return 'javascript';\n if (file.endsWith('.py')) return 'python';\n if (file.endsWith('.go')) return 'go';\n return '';\n}\n","/**\n * Human-Readable Bug Report Formatter\n *\n * Transforms technical bug reports into tester-friendly format:\n * - Title = What goes wrong (outcome, not implementation)\n * - What happens = Plain English consequence\n * - How to trigger = Steps a tester would take\n * - Impact = Why should I care\n * - Technical details = Hidden, for developers\n */\n\nimport { Bug, ScanResult, BugCategory, BugSeverity } from '../types.js';\n\nexport interface HumanReadableBug {\n id: string;\n humanTitle: string;\n whatHappens: string;\n howToTrigger: string[];\n impact: string;\n severity: BugSeverity;\n category: BugCategory;\n technicalDetails: {\n title: string;\n file: string;\n line: number;\n endLine?: number;\n description: string;\n evidence: string[];\n suggestedFix?: string;\n codePath: Array<{ step: number; file: string; line: number; explanation: string }>;\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Category-specific templates for human-readable descriptions\n// ─────────────────────────────────────────────────────────────\n\nconst CATEGORY_TEMPLATES: Record<BugCategory, {\n humanTitleTemplate: (title: string) => string;\n whatHappensTemplate: (desc: string) => string;\n impactTemplate: (severity: BugSeverity) => string;\n triggerHints: string[];\n}> = {\n 'injection': {\n humanTitleTemplate: (t) => t.includes('SQL') ? 'Database can be manipulated by attackers' :\n t.includes('command') ? 'System commands can be hijacked' :\n t.includes('path') ? 'Attackers can access unauthorized files' :\n t.includes('XSS') ? 'Malicious scripts can run in user browsers' :\n 'User input can be used to attack the system',\n whatHappensTemplate: (d) => `An attacker can inject malicious data that the system executes as code or commands. ${d.split('.')[0]}.`,\n impactTemplate: (s) => s === 'critical' ? 'Complete system compromise, data breach, or unauthorized access is possible.' :\n s === 'high' ? 'Sensitive data exposure or unauthorized actions are possible.' :\n 'Limited data exposure or restricted unauthorized actions.',\n triggerHints: ['Enter special characters in input fields', 'Include quotes or semicolons in form data', 'Try URL parameters with encoded characters'],\n },\n 'auth-bypass': {\n humanTitleTemplate: () => 'Users can access features they shouldnt have permission for',\n whatHappensTemplate: (d) => `Some users can bypass authentication or authorization checks to access restricted features. ${d.split('.')[0]}.`,\n impactTemplate: (s) => s === 'critical' ? 'Any user can gain admin access or access all user data.' :\n s === 'high' ? 'Users can access other users data or restricted features.' :\n 'Minor privilege escalation in non-critical features.',\n triggerHints: ['Try accessing admin pages while logged out', 'Access resources using another users ID', 'Remove auth cookies and retry requests'],\n },\n 'secrets-exposure': {\n humanTitleTemplate: (t) => t.includes('random') ? 'Predictable IDs or tokens can be guessed' :\n t.includes('hardcoded') ? 'Passwords or API keys are visible in the code' :\n 'Sensitive information may be exposed',\n whatHappensTemplate: (d) => `Sensitive information like passwords, API keys, or tokens could be exposed to attackers. ${d.split('.')[0]}.`,\n impactTemplate: (s) => s === 'critical' ? 'Attackers can gain full access to external services or admin accounts.' :\n s === 'high' ? 'Attackers can guess tokens or access partial system credentials.' :\n 'Information useful for further attacks may be exposed.',\n triggerHints: ['Check browser console for exposed data', 'Look at network requests for sensitive info', 'Review error messages for credential leaks'],\n },\n 'null-reference': {\n humanTitleTemplate: () => 'The page or feature can crash unexpectedly',\n whatHappensTemplate: (d) => `The application may crash or show an error when encountering unexpected empty data. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Users experience crashes, error pages, or incomplete data when this happens.',\n triggerHints: ['Leave optional fields empty', 'Delete data that other features depend on', 'Access items that have been removed'],\n },\n 'boundary-error': {\n humanTitleTemplate: () => 'Data can be corrupted or lost at edge cases',\n whatHappensTemplate: (d) => `The system doesnt handle boundary conditions correctly, which can cause data issues. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Data may be truncated, lost, or display incorrectly at the limits.',\n triggerHints: ['Enter very long text in input fields', 'Try negative numbers or zero', 'Create empty lists then access items'],\n },\n 'resource-leak': {\n humanTitleTemplate: () => 'System performance degrades over time',\n whatHappensTemplate: (d) => `System resources are not properly released, causing gradual performance degradation. ${d.split('.')[0]}.`,\n impactTemplate: () => 'The system becomes slower over time, may crash, or stop responding after extended use.',\n triggerHints: ['Use the feature repeatedly many times', 'Leave the page open for extended periods', 'Navigate away and back multiple times'],\n },\n 'async-issue': {\n humanTitleTemplate: () => 'Operations can happen out of order causing data issues',\n whatHappensTemplate: (d) => `Concurrent operations may interfere with each other, causing race conditions or data corruption. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Data may be saved incorrectly or operations may fail silently when used rapidly.',\n triggerHints: ['Click buttons rapidly multiple times', 'Submit forms twice quickly', 'Open the same feature in multiple tabs'],\n },\n 'logic-error': {\n humanTitleTemplate: (t) => t.includes('operator') ? 'Calculations or comparisons give wrong results' :\n t.includes('regex') ? 'Search or validation accepts invalid data' :\n 'The feature doesnt work as expected',\n whatHappensTemplate: (d) => `The code logic produces incorrect results in certain situations. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Features may produce wrong results, accept invalid data, or skip important checks.',\n triggerHints: ['Enter edge case values (0, negative, very large)', 'Test with special characters', 'Try inputs that almost match expected format'],\n },\n 'data-validation': {\n humanTitleTemplate: () => 'Invalid data can be submitted and saved',\n whatHappensTemplate: (d) => `User input is not properly validated, allowing bad data into the system. ${d.split('.')[0]}.`,\n impactTemplate: (s) => s === 'critical' || s === 'high' ? 'Invalid data can cause system errors or security issues.' :\n 'Data quality issues and inconsistent behavior.',\n triggerHints: ['Enter wrong format data (letters in number fields)', 'Submit empty required fields', 'Exceed maximum lengths'],\n },\n 'type-coercion': {\n humanTitleTemplate: () => 'Data types can get mixed up causing errors',\n whatHappensTemplate: (d) => `The system doesnt properly check data types, leading to unexpected behavior. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Features may crash or produce incorrect results with certain inputs.',\n triggerHints: ['Enter text where numbers are expected', 'Submit data from API tools with wrong types', 'Modify hidden form fields'],\n },\n 'concurrency': {\n humanTitleTemplate: () => 'Multiple users can cause data conflicts',\n whatHappensTemplate: (d) => `When multiple users work on the same data simultaneously, conflicts can occur. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Data can be lost or corrupted when multiple users edit the same item.',\n triggerHints: ['Edit the same item in two browser tabs', 'Have two users modify the same record', 'Submit changes rapidly'],\n },\n 'intent-violation': {\n humanTitleTemplate: () => 'The feature doesnt do what its supposed to',\n whatHappensTemplate: (d) => `The actual behavior differs from what the code comments or names suggest it should do. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Features may work differently than documented or expected.',\n triggerHints: ['Compare actual behavior to documentation', 'Test edge cases not covered in docs', 'Check if error handling matches expectations'],\n },\n};\n\n/**\n * Transform a technical bug into a human-readable format\n */\nexport function toHumanReadable(bug: Bug): HumanReadableBug {\n const template = CATEGORY_TEMPLATES[bug.category];\n\n // Generate human-friendly title\n const humanTitle = template.humanTitleTemplate(bug.title);\n\n // Generate what happens description\n const whatHappens = template.whatHappensTemplate(bug.description);\n\n // Generate impact statement\n const impact = template.impactTemplate(bug.severity);\n\n // Generate trigger steps based on category hints + bug specifics\n const howToTrigger = generateTriggerSteps(bug, template.triggerHints);\n\n return {\n id: bug.id,\n humanTitle,\n whatHappens,\n howToTrigger,\n impact,\n severity: bug.severity,\n category: bug.category,\n technicalDetails: {\n title: bug.title,\n file: bug.file,\n line: bug.line,\n endLine: bug.endLine,\n description: bug.description,\n evidence: bug.evidence,\n suggestedFix: bug.suggestedFix,\n codePath: bug.codePath.map(s => ({\n step: s.step,\n file: s.file,\n line: s.line,\n explanation: s.explanation,\n })),\n },\n };\n}\n\n/**\n * Generate specific trigger steps from bug details\n */\nfunction generateTriggerSteps(bug: Bug, categoryHints: string[]): string[] {\n const steps: string[] = [];\n\n // Try to extract trigger info from bug details\n const bugData = bug as any;\n if (bugData.triggerInput) {\n steps.push(`Use this input: ${bugData.triggerInput}`);\n }\n\n // Add file-based hint\n const fileName = bug.file.split('/').pop() || bug.file;\n if (fileName.includes('api') || fileName.includes('route') || fileName.includes('controller')) {\n steps.push(`Access the API endpoint related to ${fileName}`);\n } else if (fileName.includes('component') || fileName.includes('page')) {\n steps.push(`Navigate to the page containing this feature`);\n }\n\n // Add category-specific hints\n steps.push(...categoryHints.slice(0, 2));\n\n // If we have code path, extract trigger hints\n if (bug.codePath.length > 0) {\n const entry = bug.codePath[0];\n if (entry.explanation.toLowerCase().includes('user input') ||\n entry.explanation.toLowerCase().includes('enters')) {\n steps.unshift(`Start by providing input at: ${entry.file.split('/').pop()}:${entry.line}`);\n }\n }\n\n return steps.slice(0, 4); // Max 4 steps\n}\n\n/**\n * Format human-readable bug as markdown\n */\nexport function formatHumanReadableMarkdown(bug: HumanReadableBug): string {\n const severityIcon = {\n critical: '🔴',\n high: '🟠',\n medium: '🟡',\n low: '⚪',\n }[bug.severity];\n\n return `### ${severityIcon} ${bug.humanTitle}\n\n**What happens:** ${bug.whatHappens}\n\n**How to trigger:**\n${bug.howToTrigger.map((s, i) => `${i + 1}. ${s}`).join('\\n')}\n\n**Impact:** ${bug.impact}\n\n<details>\n<summary>Technical Details</summary>\n\n- **ID:** ${bug.id}\n- **File:** \\`${bug.technicalDetails.file}:${bug.technicalDetails.line}\\`\n- **Category:** ${bug.category}\n- **Technical Title:** ${bug.technicalDetails.title}\n\n${bug.technicalDetails.description}\n\n${bug.technicalDetails.evidence.length > 0 ? `**Evidence:**\\n${bug.technicalDetails.evidence.map(e => `- ${e}`).join('\\n')}` : ''}\n\n${bug.technicalDetails.suggestedFix ? `**Suggested Fix:**\\n\\`\\`\\`\\n${bug.technicalDetails.suggestedFix}\\n\\`\\`\\`` : ''}\n\n${bug.technicalDetails.codePath.length > 0 ? `**Code Path:**\\n${bug.technicalDetails.codePath.map(s => `${s.step}. \\`${s.file.split('/').pop()}:${s.line}\\` - ${s.explanation}`).join('\\n')}` : ''}\n\n</details>\n\n---\n`;\n}\n\n/**\n * Generate a complete human-readable report\n */\nexport function outputHumanReadableMarkdown(result: ScanResult): string {\n const humanBugs = result.bugs\n .filter(b => b.kind === 'bug')\n .map(toHumanReadable);\n\n const sections: string[] = [];\n\n // Header\n sections.push(`# Bug Report\n\n> Human-readable summary generated by whiterose on ${new Date(result.timestamp).toLocaleDateString()}\n> **${result.summary.bugs.total} bugs found** in ${result.filesScanned} files\n\n---\n\n## Summary\n\n| Severity | Bugs | Smells |\n|----------|------|--------|\n| Critical | ${result.summary.bugs.critical} | ${result.summary.smells.critical} |\n| High | ${result.summary.bugs.high} | ${result.summary.smells.high} |\n| Medium | ${result.summary.bugs.medium} | ${result.summary.smells.medium} |\n| Low | ${result.summary.bugs.low} | ${result.summary.smells.low} |\n| **Total** | **${result.summary.bugs.total}** | **${result.summary.smells.total}** |\n\n---\n`);\n\n // Group by severity\n const bySeverity = {\n critical: humanBugs.filter(b => b.severity === 'critical'),\n high: humanBugs.filter(b => b.severity === 'high'),\n medium: humanBugs.filter(b => b.severity === 'medium'),\n low: humanBugs.filter(b => b.severity === 'low'),\n };\n\n if (bySeverity.critical.length > 0) {\n sections.push(`## 🔴 Critical Issues\\n\\nThese must be fixed immediately.\\n\\n${bySeverity.critical.map(formatHumanReadableMarkdown).join('\\n')}`);\n }\n\n if (bySeverity.high.length > 0) {\n sections.push(`## 🟠 High Priority Issues\\n\\nThese should be fixed soon.\\n\\n${bySeverity.high.map(formatHumanReadableMarkdown).join('\\n')}`);\n }\n\n if (bySeverity.medium.length > 0) {\n sections.push(`## 🟡 Medium Priority Issues\\n\\nFix when convenient.\\n\\n${bySeverity.medium.map(formatHumanReadableMarkdown).join('\\n')}`);\n }\n\n if (bySeverity.low.length > 0) {\n sections.push(`## ⚪ Low Priority Issues\\n\\nMinor improvements.\\n\\n${bySeverity.low.map(formatHumanReadableMarkdown).join('\\n')}`);\n }\n\n // Footer\n sections.push(`---\n\n*Generated by [whiterose](https://github.com/whiterose) - 10x Bug Hunter*\n`);\n\n return sections.join('\\n\\n');\n}\n","/**\n * Bug Merger - Union bugs across multiple scans\n *\n * Ensures deterministic bug accumulation by merging new bugs\n * with existing bugs using fingerprint-based deduplication.\n *\n * Fingerprint: file + function name + category\n * This survives minor line number shifts and code reformatting.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, dirname, relative } from 'path';\nimport { Bug } from '../types.js';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\ninterface BugFingerprint {\n file: string; // Relative file path\n functionName: string; // Extracted from title or code path\n category: string; // Bug category\n kind: string; // Bug vs smell\n lineRange: string; // Approximate line range (rounded to 10s)\n}\n\ninterface MergeResult {\n bugs: Bug[];\n stats: {\n total: number;\n newBugs: number;\n existingBugs: number;\n duplicatesSkipped: number;\n };\n}\n\ninterface StoredBugList {\n version: string;\n lastUpdated: string;\n bugs: Bug[];\n fingerprints: Record<string, string>; // fingerprint hash -> bug id\n}\n\n// ─────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────\n\nconst STORAGE_VERSION = '1';\nconst BUGS_FILENAME = 'accumulated-bugs.json';\n\n// ─────────────────────────────────────────────────────────────\n// Fingerprinting\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Extract function name from bug data\n * Tries: title, code path, or falls back to line-based identifier\n */\nfunction extractFunctionName(bug: Bug): string {\n // Try to extract from title (e.g., \"Null dereference in getUserById\")\n const titleMatch = bug.title.match(/\\bin\\s+(\\w+)/i);\n if (titleMatch) {\n return titleMatch[1];\n }\n\n // Try to extract from code path\n if (bug.codePath && bug.codePath.length > 0) {\n // Look for function calls or definitions in code\n for (const step of bug.codePath) {\n const funcMatch = step.code?.match(/(?:function|async function|const|let|var)\\s+(\\w+)|(\\w+)\\s*\\(/);\n if (funcMatch) {\n return funcMatch[1] || funcMatch[2];\n }\n }\n }\n\n // Fall back to \"unknown\" + line range\n return `unknown_L${Math.floor(bug.line / 10) * 10}`;\n}\n\n/**\n * Create a fingerprint for a bug\n */\nfunction createFingerprint(bug: Bug, cwd: string): BugFingerprint {\n // Normalize file path to relative\n const relativeFile = bug.file.startsWith('/')\n ? relative(cwd, bug.file)\n : bug.file;\n\n return {\n file: relativeFile,\n functionName: extractFunctionName(bug),\n category: bug.category,\n kind: bug.kind || 'bug',\n lineRange: `${Math.floor(bug.line / 10) * 10}-${Math.floor((bug.endLine || bug.line) / 10) * 10 + 10}`,\n };\n}\n\n/**\n * Hash a fingerprint to a string key\n */\nfunction hashFingerprint(fp: BugFingerprint): string {\n return `${fp.file}::${fp.functionName}::${fp.category}::${fp.kind}::${fp.lineRange}`;\n}\n\n/**\n * Create a looser fingerprint for fuzzy matching\n * (ignores line range for catching bugs that moved slightly)\n */\nfunction hashFingerprintLoose(fp: BugFingerprint): string {\n return `${fp.file}::${fp.functionName}::${fp.category}::${fp.kind}`;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Storage\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Get the path to the accumulated bugs file\n */\nfunction getBugsPath(cwd: string): string {\n return join(cwd, '.whiterose', BUGS_FILENAME);\n}\n\n/**\n * Load existing accumulated bugs\n */\nexport function loadAccumulatedBugs(cwd: string): StoredBugList {\n const bugsPath = getBugsPath(cwd);\n\n if (!existsSync(bugsPath)) {\n return {\n version: STORAGE_VERSION,\n lastUpdated: new Date().toISOString(),\n bugs: [],\n fingerprints: {},\n };\n }\n\n try {\n const content = readFileSync(bugsPath, 'utf-8');\n const stored = JSON.parse(content) as StoredBugList;\n\n // Version check\n if (stored.version !== STORAGE_VERSION) {\n console.warn('Bug list version mismatch, starting fresh');\n return {\n version: STORAGE_VERSION,\n lastUpdated: new Date().toISOString(),\n bugs: [],\n fingerprints: {},\n };\n }\n\n // Normalize missing fields for backward compatibility\n if (!Array.isArray(stored.bugs)) {\n stored.bugs = [];\n }\n if (!stored.fingerprints || typeof stored.fingerprints !== 'object') {\n stored.fingerprints = {};\n }\n stored.bugs = stored.bugs.map((b) => ({ ...b, kind: b.kind || 'bug' }));\n return stored;\n } catch (error) {\n // File exists but is corrupted - create backup and warn user\n const backupPath = `${bugsPath}.corrupted.${Date.now()}`;\n try {\n const corruptedContent = readFileSync(bugsPath, 'utf-8');\n writeFileSync(backupPath, corruptedContent);\n console.warn(`Warning: ${BUGS_FILENAME} is corrupted and could not be parsed.`);\n console.warn(`Corrupted file backed up to: ${backupPath}`);\n console.warn('Bug history has been reset. Previous bugs will appear as new.');\n } catch {\n // Backup failed, still warn about corruption\n console.warn(`Warning: ${BUGS_FILENAME} is corrupted and could not be parsed.`);\n console.warn('Bug history has been reset. Previous bugs will appear as new.');\n }\n return {\n version: STORAGE_VERSION,\n lastUpdated: new Date().toISOString(),\n bugs: [],\n fingerprints: {},\n };\n }\n}\n\n/**\n * Save accumulated bugs\n */\nexport function saveAccumulatedBugs(cwd: string, stored: StoredBugList): void {\n const bugsPath = getBugsPath(cwd);\n const bugsDir = dirname(bugsPath);\n\n // Ensure directory exists\n if (!existsSync(bugsDir)) {\n mkdirSync(bugsDir, { recursive: true });\n }\n\n stored.lastUpdated = new Date().toISOString();\n writeFileSync(bugsPath, JSON.stringify(stored, null, 2));\n}\n\n// ─────────────────────────────────────────────────────────────\n// Merging\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Merge new bugs with existing accumulated bugs\n * Returns the merged list and stats about what was added\n */\nexport function mergeBugs(\n newBugs: Bug[],\n cwd: string\n): MergeResult {\n const stored = loadAccumulatedBugs(cwd);\n const existingFingerprints = new Set(Object.keys(stored.fingerprints));\n const existingLooseFingerprints = new Map<string, string>(); // loose hash -> bug id\n\n // Build loose fingerprint map for existing bugs\n for (const bug of stored.bugs) {\n const fp = createFingerprint(bug, cwd);\n existingLooseFingerprints.set(hashFingerprintLoose(fp), bug.id);\n }\n\n let duplicatesSkipped = 0;\n const bugsToAdd: Bug[] = [];\n\n for (const bug of newBugs) {\n bug.kind = bug.kind || 'bug';\n const fp = createFingerprint(bug, cwd);\n const strictHash = hashFingerprint(fp);\n const looseHash = hashFingerprintLoose(fp);\n\n // Check strict match first\n if (existingFingerprints.has(strictHash)) {\n duplicatesSkipped++;\n continue;\n }\n\n // Check loose match (same file + function + category, different line range)\n if (existingLooseFingerprints.has(looseHash)) {\n // Update the existing bug's line numbers if the new one is more recent\n const existingBugId = existingLooseFingerprints.get(looseHash)!;\n const existingBugIndex = stored.bugs.findIndex(b => b.id === existingBugId);\n if (existingBugIndex !== -1) {\n // Update line numbers to latest\n stored.bugs[existingBugIndex].line = bug.line;\n stored.bugs[existingBugIndex].endLine = bug.endLine;\n // Update suggested fix if new one is better\n if (bug.suggestedFix && (!stored.bugs[existingBugIndex].suggestedFix || bug.suggestedFix.length > stored.bugs[existingBugIndex].suggestedFix!.length)) {\n stored.bugs[existingBugIndex].suggestedFix = bug.suggestedFix;\n }\n }\n duplicatesSkipped++;\n continue;\n }\n\n // New bug - add it\n bugsToAdd.push(bug);\n stored.fingerprints[strictHash] = bug.id;\n existingFingerprints.add(strictHash);\n existingLooseFingerprints.set(looseHash, bug.id);\n }\n\n // Add new bugs to stored list with unique IDs\n // Find the highest existing ID number\n let maxIdNum = 0;\n for (const bug of stored.bugs) {\n const match = bug.id.match(/WR-(\\d+)/);\n if (match) {\n maxIdNum = Math.max(maxIdNum, parseInt(match[1], 10));\n }\n }\n\n // Assign new unique IDs to bugs being added\n for (const bug of bugsToAdd) {\n maxIdNum++;\n const oldId = bug.id;\n bug.id = `WR-${String(maxIdNum).padStart(3, '0')}`;\n // Update fingerprint mapping with new ID\n for (const [hash, id] of Object.entries(stored.fingerprints)) {\n if (id === oldId) {\n stored.fingerprints[hash] = bug.id;\n }\n }\n stored.bugs.push(bug);\n }\n\n // Save updated list\n saveAccumulatedBugs(cwd, stored);\n\n return {\n bugs: stored.bugs,\n stats: {\n total: stored.bugs.length,\n newBugs: bugsToAdd.length,\n existingBugs: stored.bugs.length - bugsToAdd.length,\n duplicatesSkipped,\n },\n };\n}\n\n/**\n * Get only the new bugs from a merge (for reporting to user)\n */\nexport function getNewBugsOnly(\n newBugs: Bug[],\n cwd: string\n): Bug[] {\n const stored = loadAccumulatedBugs(cwd);\n const existingLooseFingerprints = new Set<string>();\n\n // Build loose fingerprint set for existing bugs\n for (const bug of stored.bugs) {\n const fp = createFingerprint(bug, cwd);\n existingLooseFingerprints.add(hashFingerprintLoose(fp));\n }\n\n // Filter to only new bugs\n return newBugs.filter(bug => {\n const fp = createFingerprint(bug, cwd);\n return !existingLooseFingerprints.has(hashFingerprintLoose(fp));\n });\n}\n\n/**\n * Clear all accumulated bugs (start fresh)\n */\nexport function clearAccumulatedBugs(cwd: string): void {\n const bugsPath = getBugsPath(cwd);\n if (existsSync(bugsPath)) {\n const fresh: StoredBugList = {\n version: STORAGE_VERSION,\n lastUpdated: new Date().toISOString(),\n bugs: [],\n fingerprints: {},\n };\n writeFileSync(bugsPath, JSON.stringify(fresh, null, 2));\n }\n}\n\n/**\n * Remove a specific bug from accumulated list (after it's been fixed)\n */\nexport function removeBugFromAccumulated(cwd: string, bugId: string): boolean {\n const stored = loadAccumulatedBugs(cwd);\n const bugIndex = stored.bugs.findIndex(b => b.id === bugId);\n\n if (bugIndex === -1) {\n return false;\n }\n\n const bug = stored.bugs[bugIndex];\n const fp = createFingerprint(bug, cwd);\n const strictHash = hashFingerprint(fp);\n\n // Remove from bugs array\n stored.bugs.splice(bugIndex, 1);\n\n // Remove from fingerprints\n delete stored.fingerprints[strictHash];\n\n // Save\n saveAccumulatedBugs(cwd, stored);\n return true;\n}\n\n/**\n * Get accumulated bugs stats\n */\nexport function getAccumulatedBugsStats(cwd: string): {\n total: number;\n byCategory: Record<string, number>;\n bySeverity: Record<string, number>;\n lastUpdated: string;\n} {\n const stored = loadAccumulatedBugs(cwd);\n\n const byCategory: Record<string, number> = {};\n const bySeverity: Record<string, number> = {};\n\n for (const bug of stored.bugs) {\n byCategory[bug.category] = (byCategory[bug.category] || 0) + 1;\n bySeverity[bug.severity] = (bySeverity[bug.severity] || 0) + 1;\n }\n\n return {\n total: stored.bugs.length,\n byCategory,\n bySeverity,\n lastUpdated: stored.lastUpdated,\n };\n}\n","/**\n * Cross-File Analyzer\n *\n * Detects bugs that span multiple files/commands:\n * - Incomplete features (scan writes to A,B,C but clear only clears A)\n * - State mismatches (command X expects state that command Y doesn't set)\n * - Orphaned operations (writes without corresponding cleanup)\n *\n * This catches bugs that single-file analysis misses.\n */\n\nimport { readFileSync } from 'fs';\nimport { relative, basename } from 'path';\nimport fg from 'fast-glob';\nimport { Bug } from '../types.js';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\ninterface FileEffect {\n file: string; // Source file\n type: 'read' | 'write' | 'delete';\n target: string; // What it reads/writes (file path pattern or description)\n line: number;\n code: string;\n functionName?: string;\n}\n\ninterface CommandInfo {\n name: string; // Command name (e.g., 'scan', 'clear', 'fix')\n file: string; // Source file\n reads: FileEffect[]; // What state/files it reads\n writes: FileEffect[]; // What state/files it writes\n deletes: FileEffect[]; // What state/files it deletes\n}\n\ninterface CrossFileBug {\n type: 'incomplete-feature' | 'state-mismatch' | 'orphaned-write' | 'missing-cleanup';\n title: string;\n description: string;\n involvedFiles: string[];\n evidence: string[];\n severity: 'high' | 'medium' | 'low';\n}\n\n// ─────────────────────────────────────────────────────────────\n// Effect Extraction\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Extract file effects (reads/writes/deletes) from source code\n */\nfunction extractFileEffects(filePath: string, content: string): FileEffect[] {\n const effects: FileEffect[] = [];\n const lines = content.split('\\n');\n\n // Patterns that indicate file operations\n const patterns = [\n // Write patterns\n { regex: /writeFileSync\\s*\\(\\s*([^,]+)/, type: 'write' as const },\n { regex: /writeFile\\s*\\(\\s*([^,]+)/, type: 'write' as const },\n { regex: /fs\\.writeFileSync\\s*\\(\\s*([^,]+)/, type: 'write' as const },\n { regex: /fs\\.writeFile\\s*\\(\\s*([^,]+)/, type: 'write' as const },\n { regex: /\\.write\\s*\\(\\s*([^,]+)/, type: 'write' as const },\n { regex: /saveCache\\s*\\(/, type: 'write' as const },\n { regex: /saveBugStatus\\s*\\(/, type: 'write' as const },\n { regex: /saveAccumulatedBugs\\s*\\(/, type: 'write' as const },\n\n // Read patterns\n { regex: /readFileSync\\s*\\(\\s*([^,]+)/, type: 'read' as const },\n { regex: /readFile\\s*\\(\\s*([^,]+)/, type: 'read' as const },\n { regex: /fs\\.readFileSync\\s*\\(\\s*([^,]+)/, type: 'read' as const },\n { regex: /loadCache\\s*\\(/, type: 'read' as const },\n { regex: /loadBugStatus\\s*\\(/, type: 'read' as const },\n { regex: /loadAccumulatedBugs\\s*\\(/, type: 'read' as const },\n { regex: /loadBugsFromSarif\\s*\\(/, type: 'read' as const },\n\n // Delete patterns\n { regex: /rmSync\\s*\\(\\s*([^,]+)/, type: 'delete' as const },\n { regex: /unlinkSync\\s*\\(\\s*([^,]+)/, type: 'delete' as const },\n { regex: /rm\\s*\\(\\s*([^,]+)/, type: 'delete' as const },\n { regex: /clearAccumulatedBugs\\s*\\(/, type: 'delete' as const },\n { regex: /clearCache\\s*\\(/, type: 'delete' as const },\n { regex: /removeBugFromAccumulated\\s*\\(/, type: 'delete' as const },\n ];\n\n // Track current function for context\n let currentFunction = '';\n const functionRegex = /(?:async\\s+)?(?:function\\s+(\\w+)|(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?(?:\\([^)]*\\)|[^=])\\s*=>|(\\w+)\\s*\\([^)]*\\)\\s*(?::\\s*[^{]+)?\\s*\\{)/;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNum = i + 1;\n\n // Skip commented lines\n const trimmed = line.trim();\n if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*')) {\n continue;\n }\n\n // Track function context\n const funcMatch = line.match(functionRegex);\n if (funcMatch) {\n currentFunction = funcMatch[1] || funcMatch[2] || funcMatch[3] || '';\n }\n\n // Check for file operations\n for (const pattern of patterns) {\n const match = line.match(pattern.regex);\n if (match) {\n // Try to extract the target path/description\n let target = match[1] || 'unknown';\n\n // Clean up the target - extract meaningful parts\n target = target.trim().replace(/['\"`,]/g, '');\n\n // Look for path patterns in the line\n const pathPatterns = [\n /accumulated-bugs\\.json/,\n /bug-status\\.json/,\n /analysis-cache\\.json/,\n /file-hashes\\.json/,\n /\\.sarif/,\n /\\.whiterose/,\n /whiterose-output/,\n /reports/,\n /cache/,\n ];\n\n for (const pp of pathPatterns) {\n if (line.match(pp)) {\n target = line.match(pp)?.[0] || target;\n break;\n }\n }\n\n effects.push({\n file: filePath,\n type: pattern.type,\n target,\n line: lineNum,\n code: line.trim(),\n functionName: currentFunction,\n });\n }\n }\n }\n\n return effects;\n}\n\n/**\n * Identify CLI commands from the codebase\n */\nasync function findCommands(cwd: string): Promise<CommandInfo[]> {\n const commands: CommandInfo[] = [];\n\n // Find command files\n const commandFiles = await fg(['**/cli/commands/*.ts', '**/commands/*.ts'], {\n cwd,\n ignore: ['node_modules/**', 'dist/**'],\n absolute: true,\n });\n\n for (const file of commandFiles) {\n const content = readFileSync(file, 'utf-8');\n const effects = extractFileEffects(file, content);\n\n // Extract command name from filename or export\n const name = basename(file, '.ts');\n\n commands.push({\n name,\n file,\n reads: effects.filter(e => e.type === 'read'),\n writes: effects.filter(e => e.type === 'write'),\n deletes: effects.filter(e => e.type === 'delete'),\n });\n }\n\n return commands;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Cross-File Bug Detection\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Find incomplete features where writes don't have corresponding cleanup\n */\nfunction findIncompleteFeatures(commands: CommandInfo[]): CrossFileBug[] {\n const bugs: CrossFileBug[] = [];\n\n // Find \"clear\" or \"reset\" commands\n const clearCommands = commands.filter(c =>\n c.name.includes('clear') || c.name.includes('reset') || c.name.includes('clean')\n );\n\n // Find \"write\" commands (scan, init, etc.)\n const writeCommands = commands.filter(c => c.writes.length > 0);\n\n // For each clear command, check if it clears everything that write commands create\n for (const clearCmd of clearCommands) {\n const clearedTargets = new Set([\n ...clearCmd.deletes.map(d => normalizeTarget(d.target)),\n ]);\n\n for (const writeCmd of writeCommands) {\n if (writeCmd.name === clearCmd.name) continue; // Skip self\n\n for (const write of writeCmd.writes) {\n const normalizedTarget = normalizeTarget(write.target);\n\n // Check if this write target is cleared\n const isCleared = [...clearedTargets].some(cleared =>\n targetsMatch(cleared, normalizedTarget)\n );\n\n if (!isCleared && isSignificantTarget(normalizedTarget)) {\n bugs.push({\n type: 'incomplete-feature',\n title: `${clearCmd.name} doesn't clear ${normalizedTarget} written by ${writeCmd.name}`,\n description: `The '${clearCmd.name}' command deletes some state but not '${normalizedTarget}' which is written by '${writeCmd.name}'. This can cause stale data to persist after clearing.`,\n involvedFiles: [clearCmd.file, writeCmd.file],\n evidence: [\n `${writeCmd.name} writes to ${normalizedTarget} at ${relative(process.cwd(), writeCmd.file)}:${write.line}`,\n `${clearCmd.name} doesn't delete ${normalizedTarget}`,\n `Code: ${write.code}`,\n ],\n severity: 'high',\n });\n }\n }\n }\n }\n\n return bugs;\n}\n\n/**\n * Find state mismatches where a command reads state that might not exist\n */\nfunction findStateMismatches(commands: CommandInfo[]): CrossFileBug[] {\n const bugs: CrossFileBug[] = [];\n\n // Build a map of what creates each piece of state\n const stateCreators = new Map<string, CommandInfo[]>();\n\n for (const cmd of commands) {\n for (const write of cmd.writes) {\n const target = normalizeTarget(write.target);\n if (!stateCreators.has(target)) {\n stateCreators.set(target, []);\n }\n stateCreators.get(target)!.push(cmd);\n }\n }\n\n // Check if commands read state that might not be created\n for (const cmd of commands) {\n for (const read of cmd.reads) {\n const target = normalizeTarget(read.target);\n const creators = stateCreators.get(target) || [];\n\n // If nothing creates this state, it's a potential issue\n // (unless it's optional state with fallback)\n if (creators.length === 0 && isSignificantTarget(target) && !hasFallback(read.code)) {\n bugs.push({\n type: 'state-mismatch',\n title: `${cmd.name} reads ${target} but nothing creates it`,\n description: `The '${cmd.name}' command reads '${target}' but no other command appears to create this state. This could cause errors if the state doesn't exist.`,\n involvedFiles: [cmd.file],\n evidence: [\n `${cmd.name} reads ${target} at ${relative(process.cwd(), cmd.file)}:${read.line}`,\n `No command found that creates ${target}`,\n `Code: ${read.code}`,\n ],\n severity: 'medium',\n });\n }\n }\n }\n\n return bugs;\n}\n\n/**\n * Find fallback chains - where command A falls back to B if C is empty\n * This can cause bugs like: clear C, but A still shows data from B\n */\nfunction findFallbackChainBugs(commands: CommandInfo[]): CrossFileBug[] {\n const bugs: CrossFileBug[] = [];\n\n // Look for commands that read multiple sources (fallback pattern)\n for (const cmd of commands) {\n const readTargets = cmd.reads.map(r => normalizeTarget(r.target));\n const uniqueTargets = [...new Set(readTargets)];\n\n if (uniqueTargets.length > 1) {\n // This command has multiple read sources - potential fallback\n // Check if clear commands clear ALL of them\n\n const clearCommands = commands.filter(c =>\n c.name.includes('clear') || c.name.includes('reset')\n );\n\n for (const clearCmd of clearCommands) {\n const clearedTargets = clearCmd.deletes.map(d => normalizeTarget(d.target));\n\n const unclearedTargets = uniqueTargets.filter(target =>\n !clearedTargets.some(cleared => targetsMatch(cleared, target)) &&\n isSignificantTarget(target)\n );\n\n if (unclearedTargets.length > 0 && clearedTargets.length > 0) {\n // Clear clears some but not all read sources\n bugs.push({\n type: 'incomplete-feature',\n title: `${cmd.name} has fallback sources not cleared by ${clearCmd.name}`,\n description: `The '${cmd.name}' command reads from multiple sources (${uniqueTargets.join(', ')}), but '${clearCmd.name}' only clears some of them. After clearing, '${cmd.name}' may still show data from fallback sources: ${unclearedTargets.join(', ')}.`,\n involvedFiles: [cmd.file, clearCmd.file],\n evidence: [\n `${cmd.name} reads from: ${uniqueTargets.join(', ')}`,\n `${clearCmd.name} clears: ${clearedTargets.join(', ')}`,\n `Not cleared: ${unclearedTargets.join(', ')}`,\n ],\n severity: 'high',\n });\n }\n }\n }\n }\n\n return bugs;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction normalizeTarget(target: string): string {\n // Normalize path targets for comparison\n return target\n .replace(/['\"]/g, '')\n .replace(/\\$\\{[^}]+\\}/g, '*') // Replace template vars with wildcard\n .replace(/\\+/g, '')\n .trim()\n .toLowerCase();\n}\n\nfunction targetsMatch(a: string, b: string): boolean {\n // Check if two targets refer to the same thing\n if (a === b) return true;\n if (a.includes(b) || b.includes(a)) return true;\n\n // Check for common patterns\n const patterns = [\n ['accumulated-bugs', 'accumulated'],\n ['sarif', 'reports'],\n ['bug-status', 'status'],\n ['analysis-cache', 'cache'],\n ];\n\n for (const [p1, p2] of patterns) {\n if ((a.includes(p1) && b.includes(p2)) || (a.includes(p2) && b.includes(p1))) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isSignificantTarget(target: string): boolean {\n // Filter out generic/uninteresting targets (variable names, params)\n const dominated = ['unknown', 'path', 'file', 'dir', 'content', 'filepath', 'safepath'];\n if (dominated.some(d => target === d)) return false;\n\n // Filter out external files (not created by our commands)\n const external = ['gitignore', 'package.json', 'tsconfig', 'node_modules'];\n if (external.some(e => target.includes(e))) return false;\n\n // Filter out user-provided paths (options.*, args, etc.)\n if (target.includes('options.') || target.includes('args')) return false;\n\n // Filter out config files that shouldn't be cleared (they're core config, not bug data)\n const coreConfig = ['config.yml', 'intent.md', 'understanding.yml', 'whiterosepath'];\n if (coreConfig.some(c => target.includes(c))) return false;\n\n // Filter out variable names that refer to output dir contents (these ARE cleared)\n // Note: sarifpath is NOT excluded because fix reads from reports/*.sarif which is different\n const outputVars = ['mdpath', 'jsonpath'];\n if (outputVars.some(v => target === v)) return false;\n\n // Filter out hash files (created by scanner internals, not commands)\n if (target.includes('hashes')) return false;\n\n // Only interested in bug-data state that should be cleared together\n const bugDataState = [\n 'accumulated-bugs', 'bug-status', 'analysis-cache',\n 'sarif', 'reports', 'whiterose-output',\n ];\n return bugDataState.some(i => target.includes(i));\n}\n\nfunction hasFallback(code: string): boolean {\n // Check if the code has a fallback (try/catch, || default, etc.)\n return code.includes('catch') || code.includes('||') || code.includes('??');\n}\n\n// ─────────────────────────────────────────────────────────────\n// Main Analysis\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Run cross-file analysis and return bugs\n */\nexport async function analyzeCrossFile(cwd: string): Promise<Bug[]> {\n const commands = await findCommands(cwd);\n\n if (commands.length === 0) {\n return [];\n }\n\n const crossFileBugs: CrossFileBug[] = [\n ...findIncompleteFeatures(commands),\n ...findStateMismatches(commands),\n ...findFallbackChainBugs(commands),\n ];\n\n // Convert to Bug format\n return crossFileBugs.map((cfb, index) => ({\n id: `CROSS-${String(index + 1).padStart(3, '0')}`,\n title: cfb.title,\n description: cfb.description,\n file: cfb.involvedFiles[0],\n line: 1,\n kind: 'bug',\n severity: cfb.severity as Bug['severity'],\n category: 'logic-error' as Bug['category'],\n confidence: {\n overall: 'high' as const,\n codePathValidity: 0.9,\n reachability: 0.9,\n intentViolation: true,\n staticToolSignal: false,\n adversarialSurvived: false,\n },\n codePath: cfb.involvedFiles.map((f, i) => ({\n step: i + 1,\n file: f,\n line: 1,\n code: '',\n explanation: i === 0 ? 'Primary file' : 'Related file',\n })),\n evidence: cfb.evidence,\n createdAt: new Date().toISOString(),\n status: 'open' as const,\n }));\n}\n\n/**\n * Get summary of command effects for debugging\n */\nexport async function getCommandEffectsSummary(cwd: string): Promise<string> {\n const commands = await findCommands(cwd);\n\n const lines: string[] = ['# Command Effects Summary\\n'];\n\n for (const cmd of commands) {\n lines.push(`## ${cmd.name}`);\n lines.push(`File: ${relative(cwd, cmd.file)}\\n`);\n\n if (cmd.reads.length > 0) {\n lines.push('**Reads:**');\n for (const r of cmd.reads) {\n lines.push(`- ${r.target} (line ${r.line})`);\n }\n lines.push('');\n }\n\n if (cmd.writes.length > 0) {\n lines.push('**Writes:**');\n for (const w of cmd.writes) {\n lines.push(`- ${w.target} (line ${w.line})`);\n }\n lines.push('');\n }\n\n if (cmd.deletes.length > 0) {\n lines.push('**Deletes:**');\n for (const d of cmd.deletes) {\n lines.push(`- ${d.target} (line ${d.line})`);\n }\n lines.push('');\n }\n\n lines.push('---\\n');\n }\n\n return lines.join('\\n');\n}\n","/**\n * Contract Analyzer\n *\n * Detects bugs related to:\n * - Missing error recovery (write without rollback on failure)\n * - Missing validation (parse without verify)\n * - Missing post-conditions (fix without verify it works)\n * - Transaction atomicity violations (multi-step operations that can fail partially)\n *\n * This extends the cross-file analyzer to catch behavioral bugs.\n */\n\nimport { readFileSync } from 'fs';\nimport { relative } from 'path';\nimport fg from 'fast-glob';\nimport { Bug } from '../types.js';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\ninterface ContractViolation {\n type:\n | 'missing-rollback'\n | 'missing-verification'\n | 'weak-validation'\n | 'partial-failure'\n | 'unhandled-error';\n title: string;\n description: string;\n file: string;\n line: number;\n evidence: string[];\n severity: 'high' | 'medium' | 'low';\n}\n\ninterface CodeBlock {\n file: string;\n functionName: string;\n startLine: number;\n endLine: number;\n content: string;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Pattern Detection\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Detect write operations without corresponding rollback in catch blocks\n */\nfunction detectMissingRollback(block: CodeBlock): ContractViolation[] {\n const violations: ContractViolation[] = [];\n const lines = block.content.split('\\n');\n\n // Find writeFileSync calls\n const writeOps: { line: number; target: string }[] = [];\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/writeFileSync\\s*\\(\\s*([^,]+)/);\n if (match) {\n writeOps.push({ line: block.startLine + i, target: match[1].trim() });\n }\n }\n\n if (writeOps.length === 0) return violations;\n\n // Check if there's error handling with rollback\n const hasRollbackPattern =\n block.content.includes('catch') &&\n (block.content.includes('restore') ||\n block.content.includes('rollback') ||\n block.content.includes('writeFileSync') && block.content.includes('originalContent'));\n\n // Check if there are operations after write that can fail\n for (const writeOp of writeOps) {\n const afterWrite = lines.slice(writeOp.line - block.startLine + 1).join('\\n');\n\n // Operations that can fail after write\n const canFailAfter =\n afterWrite.includes('await ') ||\n afterWrite.includes('execa') ||\n afterWrite.includes('commitFix') ||\n afterWrite.includes('throw');\n\n if (canFailAfter && !hasRollbackPattern) {\n violations.push({\n type: 'missing-rollback',\n title: `No rollback if operation fails after writing to ${writeOp.target}`,\n description: `File is written at line ${writeOp.line}, but subsequent operations can fail without restoring the original content. If those operations fail, the file is left in a partially modified state.`,\n file: block.file,\n line: writeOp.line,\n evidence: [\n `Write operation: writeFileSync(${writeOp.target}, ...)`,\n 'Operations after write can fail (async calls, commits, etc.)',\n 'No rollback/restore pattern detected in catch block',\n ],\n severity: 'high',\n });\n }\n }\n\n return violations;\n}\n\n/**\n * Detect operations that should verify their result but don't\n */\nfunction detectMissingVerification(block: CodeBlock): ContractViolation[] {\n const violations: ContractViolation[] = [];\n const lines = block.content.split('\\n');\n\n // Pattern: write a \"fix\" without verifying it works\n const hasFixWrite =\n block.content.includes('fixedContent') ||\n (block.content.includes('fix') && block.content.includes('writeFileSync'));\n\n const hasVerification =\n block.content.includes('compile') ||\n block.content.includes('typecheck') ||\n block.content.includes('verify') ||\n block.content.includes('tsc ') ||\n block.content.includes('eslint');\n\n // Check for functions that apply fixes\n const isFixFunction =\n block.functionName.toLowerCase().includes('fix') ||\n block.functionName.toLowerCase().includes('apply');\n\n if (hasFixWrite && !hasVerification && isFixFunction) {\n // Find the write line\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].includes('writeFileSync')) {\n violations.push({\n type: 'missing-verification',\n title: `Fix written without verification in ${block.functionName}`,\n description: `The function writes a \"fix\" to a file but doesn't verify that the fix actually works (e.g., code still compiles, passes tests, or bug is actually fixed).`,\n file: block.file,\n line: block.startLine + i,\n evidence: [\n `Function: ${block.functionName}`,\n 'Writes content to file',\n 'No compilation/validation check after write',\n 'Applied fix may introduce new errors',\n ],\n severity: 'high',\n });\n break;\n }\n }\n }\n\n return violations;\n}\n\n/**\n * Detect weak validation patterns\n */\nfunction detectWeakValidation(block: CodeBlock): ContractViolation[] {\n const violations: ContractViolation[] = [];\n const lines = block.content.split('\\n');\n const reportedLines = new Set<number>(); // One violation per line max\n\n // Check if this is in a parse/validate function\n if (\n !block.functionName.toLowerCase().includes('parse') &&\n !block.functionName.toLowerCase().includes('validate') &&\n !block.functionName.toLowerCase().includes('extract')\n ) {\n return violations;\n }\n\n // Pattern: Parsing something and accepting it with minimal checks\n for (let i = 0; i < lines.length; i++) {\n if (reportedLines.has(i)) continue;\n\n const line = lines[i];\n\n // Check for weak validation patterns\n const weakPatterns = [\n { regex: /matchCount\\s*>=?\\s*\\d/, issue: 'Accepts content if only a few lines match' },\n { regex: /\\.length\\s*>\\s*\\w+\\.length\\s*\\*\\s*0\\.\\d/, issue: 'Accepts content based only on length ratio' },\n ];\n\n const issues: string[] = [];\n for (const pattern of weakPatterns) {\n if (line.match(pattern.regex)) {\n issues.push(pattern.issue);\n }\n }\n\n if (issues.length > 0) {\n reportedLines.add(i);\n violations.push({\n type: 'weak-validation',\n title: `Weak validation in ${block.functionName}`,\n description: `The validation logic may accept invalid input: ${issues.join('; ')}. This could allow malformed or incorrect data to pass through.`,\n file: block.file,\n line: block.startLine + i,\n evidence: [\n `Function: ${block.functionName}`,\n `Pattern: ${line.trim()}`,\n `Issues: ${issues.join(', ')}`,\n ],\n severity: 'medium',\n });\n }\n }\n\n return violations;\n}\n\n/**\n * Detect loops that break on error without reporting skipped items\n */\nfunction detectPartialFailure(block: CodeBlock): ContractViolation[] {\n const violations: ContractViolation[] = [];\n const lines = block.content.split('\\n');\n\n // Pattern: for loop with break on error\n let inForLoop = false;\n let forLoopStart = 0;\n let forLoopItem = '';\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Detect for loop start\n const forMatch = line.match(/for\\s*\\(\\s*(?:const|let|var)\\s+(\\w+)\\s+of/);\n if (forMatch) {\n inForLoop = true;\n forLoopStart = i;\n forLoopItem = forMatch[1];\n }\n\n // Check for break pattern inside loop\n if (inForLoop && line.includes('break')) {\n // Check if it's breaking on failure without reporting\n const hasFailureCheck =\n lines.slice(Math.max(0, i - 3), i + 1).join('\\n').includes('!result.success') ||\n lines.slice(Math.max(0, i - 3), i + 1).join('\\n').includes('error') ||\n lines.slice(Math.max(0, i - 3), i + 1).join('\\n').includes('failed');\n\n const hasSkippedReport =\n block.content.includes('skipped') ||\n block.content.includes('remaining') ||\n block.content.includes('not attempted');\n\n if (hasFailureCheck && !hasSkippedReport) {\n violations.push({\n type: 'partial-failure',\n title: `Loop breaks on error without reporting skipped items in ${block.functionName}`,\n description: `The loop iterates over \"${forLoopItem}\" but breaks on first failure without indicating which items were not processed. Users won't know what was skipped.`,\n file: block.file,\n line: block.startLine + i,\n evidence: [\n `Function: ${block.functionName}`,\n `Loop variable: ${forLoopItem}`,\n 'Breaks on failure condition',\n 'No reporting of skipped/remaining items',\n ],\n severity: 'medium',\n });\n }\n }\n\n // Detect loop end (simple heuristic)\n if (inForLoop && line.trim() === '}' && i > forLoopStart + 2) {\n inForLoop = false;\n }\n }\n\n return violations;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Code Block Extraction\n// ─────────────────────────────────────────────────────────────\n\nfunction extractFunctions(filePath: string, content: string): CodeBlock[] {\n const blocks: CodeBlock[] = [];\n const lines = content.split('\\n');\n\n // Simple function detection (async function, function, arrow function)\n const funcRegex =\n /(?:export\\s+)?(?:async\\s+)?function\\s+(\\w+)|(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?\\([^)]*\\)\\s*(?::\\s*[^=]+)?\\s*=>/;\n\n let currentFunc: { name: string; start: number; braceCount: number } | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Skip commented lines\n const trimmed = line.trim();\n if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*')) {\n continue;\n }\n\n // Check for function start\n if (!currentFunc) {\n const match = line.match(funcRegex);\n if (match) {\n const funcName = match[1] || match[2];\n currentFunc = { name: funcName, start: i, braceCount: 0 };\n }\n }\n\n // Track braces to find function end\n if (currentFunc) {\n currentFunc.braceCount += (line.match(/{/g) || []).length;\n currentFunc.braceCount -= (line.match(/}/g) || []).length;\n\n if (currentFunc.braceCount <= 0 && i > currentFunc.start) {\n blocks.push({\n file: filePath,\n functionName: currentFunc.name,\n startLine: currentFunc.start + 1,\n endLine: i + 1,\n content: lines.slice(currentFunc.start, i + 1).join('\\n'),\n });\n currentFunc = null;\n }\n }\n }\n\n return blocks;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Main Analysis\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Run contract analysis and return bugs\n */\nexport async function analyzeContracts(cwd: string): Promise<Bug[]> {\n const violations: ContractViolation[] = [];\n\n // Find source files\n const sourceFiles = await fg(['**/*.ts', '**/*.tsx'], {\n cwd,\n ignore: ['node_modules/**', 'dist/**', '**/*.test.ts', '**/*.spec.ts'],\n absolute: true,\n });\n\n for (const file of sourceFiles) {\n const content = readFileSync(file, 'utf-8');\n const blocks = extractFunctions(file, content);\n\n for (const block of blocks) {\n violations.push(\n ...detectMissingRollback(block),\n ...detectMissingVerification(block),\n ...detectWeakValidation(block),\n ...detectPartialFailure(block)\n );\n }\n }\n\n // Convert to Bug format\n return violations.map((v, index) => ({\n id: `CONTRACT-${String(index + 1).padStart(3, '0')}`,\n title: v.title,\n description: v.description,\n file: relative(cwd, v.file),\n line: v.line,\n kind: 'bug',\n severity: v.severity as Bug['severity'],\n category: 'logic-error' as Bug['category'],\n confidence: {\n overall: 'medium' as const,\n codePathValidity: 0.8,\n reachability: 0.8,\n intentViolation: true,\n staticToolSignal: false,\n adversarialSurvived: false,\n },\n codePath: [\n {\n step: 1,\n file: relative(cwd, v.file),\n line: v.line,\n code: '',\n explanation: v.type,\n },\n ],\n evidence: v.evidence,\n createdAt: new Date().toISOString(),\n status: 'open' as const,\n }));\n}\n\n/**\n * Get summary of contract violations for debugging\n */\nexport async function getContractSummary(cwd: string): Promise<string> {\n const bugs = await analyzeContracts(cwd);\n\n const lines: string[] = ['# Contract Analysis Summary\\n'];\n lines.push(`Total violations: ${bugs.length}\\n`);\n\n const byType = new Map<string, Bug[]>();\n for (const bug of bugs) {\n const type = bug.codePath[0]?.explanation || 'unknown';\n if (!byType.has(type)) byType.set(type, []);\n byType.get(type)!.push(bug);\n }\n\n for (const [type, typeBugs] of byType) {\n lines.push(`## ${type} (${typeBugs.length})`);\n for (const bug of typeBugs) {\n lines.push(`- ${bug.file}:${bug.line} - ${bug.title}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import { existsSync, readFileSync } from 'fs';\nimport { join, resolve, isAbsolute, relative } from 'path';\nimport { Bug, CodebaseUnderstanding, FindingKind } from '../types.js';\nimport { parseIntentDocument } from './contracts/intent.js';\n\ninterface IntentContext {\n constraints: string[];\n contracts: CodebaseUnderstanding['contracts'];\n}\n\nexport function loadIntentContext(cwd: string, understanding: CodebaseUnderstanding): IntentContext {\n const intentPath = join(cwd, '.whiterose', 'intent.md');\n let constraints: string[] = [];\n\n if (existsSync(intentPath)) {\n try {\n const content = readFileSync(intentPath, 'utf-8');\n const parsed = parseIntentDocument(content);\n const featureConstraints = parsed.customFeatures.flatMap((f) => f.constraints || []);\n constraints = [...parsed.knownConstraints, ...featureConstraints];\n } catch {\n // Ignore intent parsing errors\n }\n }\n\n // Add constraints from understanding features if present\n if (understanding.features?.length) {\n for (const feature of understanding.features) {\n if (feature.constraints?.length) {\n constraints.push(...feature.constraints);\n }\n }\n }\n\n return {\n constraints,\n contracts: understanding.contracts || [],\n };\n}\n\nexport function classifyFindings(\n bugs: Bug[],\n cwd: string,\n understanding: CodebaseUnderstanding\n): Bug[] {\n const intent = loadIntentContext(cwd, understanding);\n\n return bugs.map((bug) => {\n const relatedContract = findRelatedContract(bug, cwd, intent.contracts);\n const constraintMatch = matchesConstraint(bug, intent.constraints);\n\n if (relatedContract && !bug.relatedContract) {\n bug.relatedContract = relatedContract;\n }\n\n const hasConcreteEvidence = hasEvidenceOfFailure(bug);\n const strongConfidence =\n bug.confidence.overall === 'high' &&\n bug.confidence.reachability >= 0.7 &&\n bug.confidence.codePathValidity >= 0.7;\n\n let verified = strongConfidence || (hasConcreteEvidence && bug.confidence.reachability >= 0.5);\n\n const isIntentClaim =\n bug.category === 'intent-violation' || bug.confidence.intentViolation === true;\n\n if (isIntentClaim) {\n verified = verified && (Boolean(relatedContract) || constraintMatch);\n }\n\n if ((bug.severity === 'critical' || bug.severity === 'high') && !hasConcreteEvidence) {\n verified = false;\n }\n\n bug.kind = (verified ? 'bug' : 'smell') as FindingKind;\n\n return bug;\n });\n}\n\nexport function analyzeIntentContracts(\n cwd: string,\n understanding: CodebaseUnderstanding\n): Bug[] {\n const bugs: Bug[] = [];\n\n for (const contract of understanding.contracts || []) {\n const absoluteFile = normalizeFilePath(contract.file, cwd);\n if (!existsSync(absoluteFile)) {\n bugs.push(makeIntentBug(cwd, contract, 'Contract file missing'));\n continue;\n }\n\n const content = readFileSync(absoluteFile, 'utf-8');\n if (!functionExists(content, contract.function)) {\n bugs.push(makeIntentBug(cwd, contract, `Contract function not found: ${contract.function}`));\n }\n }\n\n return bugs;\n}\n\nfunction normalizeFilePath(filePath: string, cwd: string): string {\n if (!filePath) return filePath;\n return isAbsolute(filePath) ? filePath : resolve(cwd, filePath);\n}\n\nfunction findRelatedContract(\n bug: Bug,\n cwd: string,\n contracts: CodebaseUnderstanding['contracts']\n): string | undefined {\n const bugFile = normalizeFilePath(bug.file, cwd);\n const title = bug.title.toLowerCase();\n\n for (const contract of contracts) {\n const contractFile = normalizeFilePath(contract.file, cwd);\n if (!bugFile.endsWith(contractFile) && bugFile !== contractFile) continue;\n\n const fn = contract.function.toLowerCase();\n const inTitle = title.includes(fn);\n const inPath = bug.codePath.some((s) => (s.file || '').toLowerCase().includes(fn));\n\n if (inTitle || inPath) {\n return `${contract.file}:${contract.function}()`;\n }\n }\n\n return undefined;\n}\n\nfunction matchesConstraint(bug: Bug, constraints: string[]): boolean {\n if (constraints.length === 0) return false;\n\n const text = [\n bug.title,\n bug.description,\n ...(bug.evidence || []),\n ]\n .join(' ')\n .toLowerCase();\n\n for (const constraint of constraints) {\n const normalized = constraint.toLowerCase();\n if (!normalized) continue;\n if (text.includes(normalized)) return true;\n\n const keywords = normalized\n .split(/\\W+/)\n .filter((w) => w.length >= 4);\n if (keywords.some((k) => text.includes(k))) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction hasEvidenceOfFailure(bug: Bug): boolean {\n if (bug.codePath && bug.codePath.length > 0) return true;\n\n const text = [\n bug.title,\n bug.description,\n ...(bug.evidence || []),\n ]\n .join(' ')\n .toLowerCase();\n\n return /repro|reproduce|fail|fails|failing|throws|throw|crash|exception|incorrect|broken|violate/.test(text);\n}\n\nfunction functionExists(content: string, functionName: string): boolean {\n if (!functionName) return false;\n const escaped = functionName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const patterns = [\n new RegExp(`\\\\bfunction\\\\s+${escaped}\\\\b`),\n new RegExp(`\\\\bconst\\\\s+${escaped}\\\\s*=\\\\s*`),\n new RegExp(`\\\\blet\\\\s+${escaped}\\\\s*=\\\\s*`),\n new RegExp(`\\\\b${escaped}\\\\s*\\\\(`),\n ];\n return patterns.some((p) => p.test(content));\n}\n\nfunction makeIntentBug(\n cwd: string,\n contract: CodebaseUnderstanding['contracts'][number],\n reason: string\n): Bug {\n return {\n id: `INTENT-${Math.random().toString(36).slice(2, 8)}`,\n title: `Intent contract mismatch: ${contract.function}`,\n description: reason,\n file: relative(cwd, normalizeFilePath(contract.file, cwd)),\n line: 1,\n severity: 'high',\n category: 'intent-violation',\n kind: 'bug',\n confidence: {\n overall: 'high',\n codePathValidity: 0.8,\n reachability: 0.8,\n intentViolation: true,\n staticToolSignal: false,\n adversarialSurvived: false,\n },\n codePath: [],\n evidence: [reason],\n relatedContract: `${contract.file}:${contract.function}()`,\n createdAt: new Date().toISOString(),\n status: 'open',\n };\n}\n","/**\n * Progress bar and duration formatting utilities for CLI output\n */\n\n/**\n * Format milliseconds into human-readable duration\n * Examples: \"45s\", \"2m 30s\", \"1h 15m\"\n */\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n if (hours > 0) {\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n if (mins > 0) {\n return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n return `${secs}s`;\n}\n\n/**\n * Render an ASCII progress bar\n * @param progress - Value between 0 and 1\n * @param width - Total width of the bar (excluding brackets)\n */\nexport function renderProgressBar(progress: number, width: number = 10): string {\n const clamped = Math.max(0, Math.min(1, progress));\n const filled = Math.round(clamped * width);\n const empty = width - filled;\n return '[' + '\\u2588'.repeat(filled) + '\\u2591'.repeat(empty) + ']';\n}\n\n/**\n * Phase tracking for multi-phase scans\n */\nexport interface PhaseProgress {\n name: string;\n current: number;\n total: number;\n}\n\n/**\n * Render phase progress line\n * Example: \"Phase 1: Unit Analysis [████████░░] 80% (6/6 passes)\"\n */\nexport function renderPhaseProgress(phase: PhaseProgress, index: number, padName: number = 20): string {\n const progress = phase.total > 0 ? phase.current / phase.total : 0;\n const percent = Math.round(progress * 100);\n const bar = renderProgressBar(progress);\n const paddedName = phase.name.padEnd(padName);\n return `Phase ${index + 1}: ${paddedName} ${bar} ${String(percent).padStart(3)}% (${phase.current}/${phase.total} passes)`;\n}\n\n/**\n * Count lines of code in file contents\n */\nexport function countLinesOfCode(contents: string[]): number {\n return contents.reduce((total, content) => {\n // Count non-empty, non-comment lines\n const lines = content.split('\\n').filter(line => {\n const trimmed = line.trim();\n return trimmed.length > 0 &&\n !trimmed.startsWith('//') &&\n !trimmed.startsWith('/*') &&\n !trimmed.startsWith('*');\n });\n return total + lines.length;\n }, 0);\n}\n","/**\n * ASCII card renderer for scan results\n * Creates a screenshot-friendly summary card\n */\n\nimport chalk from 'chalk';\nimport { formatDuration } from './progress.js';\n\nexport interface SeverityBreakdown {\n critical: number;\n high: number;\n medium: number;\n low: number;\n total: number;\n}\n\nexport interface ScanMeta {\n repoName: string;\n provider: string;\n duration: number; // ms\n filesScanned: number;\n linesOfCode: number;\n}\n\nexport interface CardData {\n meta: ScanMeta;\n bugs: SeverityBreakdown;\n smells: SeverityBreakdown;\n reportPath: string;\n}\n\nconst BOX = {\n topLeft: '\\u250c',\n topRight: '\\u2510',\n bottomLeft: '\\u2514',\n bottomRight: '\\u2518',\n horizontal: '\\u2500',\n vertical: '\\u2502',\n teeRight: '\\u251c',\n teeLeft: '\\u2524',\n};\n\nfunction line(char: string, width: number): string {\n return char.repeat(width);\n}\n\nfunction padRight(str: string, width: number): string {\n // Strip ANSI codes for length calculation\n const stripped = str.replace(/\\u001b\\[\\d+(;\\d+)*m/g, '');\n const padding = Math.max(0, width - stripped.length);\n return str + ' '.repeat(padding);\n}\n\nfunction row(content: string, width: number): string {\n return BOX.vertical + ' ' + padRight(content, width - 4) + ' ' + BOX.vertical;\n}\n\nfunction divider(width: number): string {\n return BOX.teeRight + line(BOX.horizontal, width) + BOX.teeLeft;\n}\n\nfunction topBorder(width: number): string {\n return BOX.topLeft + line(BOX.horizontal, width) + BOX.topRight;\n}\n\nfunction bottomBorder(width: number): string {\n return BOX.bottomLeft + line(BOX.horizontal, width) + BOX.bottomRight;\n}\n\nfunction severityDot(severity: 'critical' | 'high' | 'medium' | 'low'): string {\n const colors: Record<string, (s: string) => string> = {\n critical: chalk.red,\n high: chalk.yellow,\n medium: chalk.blue,\n low: chalk.dim,\n };\n return colors[severity]('\\u25cf');\n}\n\nfunction formatNumber(n: number): string {\n return String(n).padStart(3);\n}\n\n/**\n * Render a scan result card\n *\n * ┌─────────────────────────────────────────────────────────────┐\n * │ WHITEROSE SCAN COMPLETE │\n * ├─────────────────────────────────────────────────────────────┤\n * │ Repository my-project │\n * │ Provider claude-code │\n * │ Duration 17m 11s │\n * │ Files 116 files | 24,892 LoC │\n * ├─────────────────────────────────────────────────────────────┤\n * │ BUGS SMELLS │\n * │ ● Critical 3 ● Critical 0 │\n * │ ● High 12 ● High 5 │\n * │ ● Medium 30 ● Medium 20 │\n * │ ● Low 17 ● Low 12 │\n * │ ───────────── ───────────── │\n * │ Total 62 Total 37 │\n * ├─────────────────────────────────────────────────────────────┤\n * │ Reports: ./whiterose-output/bugs.md │\n * │ Run: whiterose fix │\n * └─────────────────────────────────────────────────────────────┘\n */\nexport function renderScanCard(data: CardData): string {\n const width = 61; // Inner width (excluding border chars)\n const lines: string[] = [];\n\n // Title\n lines.push(topBorder(width));\n lines.push(row(chalk.bold.red('WHITEROSE SCAN COMPLETE'), width));\n lines.push(divider(width));\n\n // Meta section\n const locFormatted = data.meta.linesOfCode.toLocaleString();\n lines.push(row(`${chalk.dim('Repository')} ${data.meta.repoName}`, width));\n lines.push(row(`${chalk.dim('Provider')} ${data.meta.provider}`, width));\n lines.push(row(`${chalk.dim('Duration')} ${formatDuration(data.meta.duration)}`, width));\n lines.push(row(`${chalk.dim('Files')} ${data.meta.filesScanned} files | ${locFormatted} LoC`, width));\n lines.push(divider(width));\n\n // Bug/Smell breakdown header\n lines.push(row(`${chalk.bold('BUGS')} ${chalk.bold('SMELLS')}`, width));\n\n // Severity rows (side by side)\n const severities: Array<'critical' | 'high' | 'medium' | 'low'> = ['critical', 'high', 'medium', 'low'];\n for (const sev of severities) {\n const bugLine = `${severityDot(sev)} ${sev.charAt(0).toUpperCase() + sev.slice(1).padEnd(8)} ${formatNumber(data.bugs[sev])}`;\n const smellLine = `${severityDot(sev)} ${sev.charAt(0).toUpperCase() + sev.slice(1).padEnd(8)} ${formatNumber(data.smells[sev])}`;\n lines.push(row(`${bugLine} ${smellLine}`, width));\n }\n\n // Totals divider\n lines.push(row(`${chalk.dim('\\u2500'.repeat(13))} ${chalk.dim('\\u2500'.repeat(13))}`, width));\n\n // Totals\n const bugTotal = `Total ${formatNumber(data.bugs.total)}`;\n const smellTotal = `Total ${formatNumber(data.smells.total)}`;\n lines.push(row(`${chalk.bold(bugTotal)} ${chalk.bold(smellTotal)}`, width));\n lines.push(divider(width));\n\n // Footer\n lines.push(row(`${chalk.dim('Reports:')} ${chalk.cyan(data.reportPath)}`, width));\n if (data.bugs.total > 0 || data.smells.total > 0) {\n lines.push(row(`${chalk.dim('Run:')} ${chalk.cyan('whiterose fix')}`, width));\n }\n lines.push(bottomBorder(width));\n\n return lines.join('\\n');\n}\n\n/**\n * Render a minimal status card (for status command when no recent scan)\n */\nexport function renderStatusCard(\n repoName: string,\n provider: string,\n totalBugs: number,\n totalSmells: number,\n lastScanDate?: string\n): string {\n const width = 45;\n const lines: string[] = [];\n\n lines.push(topBorder(width));\n lines.push(row(chalk.bold.red('WHITEROSE STATUS'), width));\n lines.push(divider(width));\n lines.push(row(`${chalk.dim('Repository')} ${repoName}`, width));\n lines.push(row(`${chalk.dim('Provider')} ${provider}`, width));\n if (lastScanDate) {\n lines.push(row(`${chalk.dim('Last scan')} ${lastScanDate}`, width));\n }\n lines.push(divider(width));\n lines.push(row(`${chalk.bold('Open bugs:')} ${totalBugs}`, width));\n lines.push(row(`${chalk.bold('Open smells:')} ${totalSmells}`, width));\n lines.push(bottomBorder(width));\n\n return lines.join('\\n');\n}\n","import * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, writeFileSync, readFileSync } from 'fs';\nimport { join, relative, basename } from 'path';\nimport fg from 'fast-glob';\nimport { WhiteroseConfig, ScanResult, Bug, ConfidenceLevel, ProviderType, ScanMeta, ScanSummary } from '../../types.js';\nimport { loadConfig, loadUnderstanding } from '../../core/config.js';\nimport { CoreScanner } from '../../core/scanner.js';\nimport { getExecutor } from '../../providers/executors/index.js';\nimport { scanCodebase, getChangedFiles, saveFileHashes } from '../../core/scanner/index.js';\nimport { runStaticAnalysis } from '../../analysis/static.js';\nimport { generateBugId } from '../../core/utils.js';\nimport { outputSarif } from '../../output/sarif.js';\nimport { outputMarkdown } from '../../output/markdown.js';\nimport { outputHumanReadableMarkdown } from '../../output/human-readable.js';\nimport { mergeBugs } from '../../core/bug-merger.js';\nimport { analyzeCrossFile } from '../../core/cross-file-analyzer.js';\nimport { analyzeContracts } from '../../core/contract-analyzer.js';\nimport { analyzeIntentContracts, classifyFindings } from '../../core/findings.js';\nimport { formatDuration } from '../components/progress.js';\nimport { renderScanCard, CardData } from '../components/card.js';\n\ninterface ScanOptions {\n full: boolean;\n json: boolean;\n sarif: boolean;\n provider?: string;\n category?: string[];\n minConfidence: string;\n ci?: boolean; // CI mode: non-interactive, exit 1 if bugs found\n quick?: boolean; // Quick scan: parallel single-file analysis, works without init\n unsafe?: boolean; // Deprecated: read-only operations always auto-approve\n phase?: 'unit' | 'integration' | 'e2e' | 'all'; // Which analysis phase to run\n}\n\n/**\n * Get repository name from git or directory name\n */\nfunction getRepoName(cwd: string): string {\n try {\n const gitConfigPath = join(cwd, '.git', 'config');\n if (existsSync(gitConfigPath)) {\n const config = readFileSync(gitConfigPath, 'utf-8');\n const match = config.match(/url\\s*=\\s*.*[/:]([^/]+?)(?:\\.git)?$/m);\n if (match) return match[1];\n }\n } catch {\n // Fall through to basename\n }\n return basename(cwd);\n}\n\n/**\n * Count lines of code in files\n */\nasync function countLinesOfCode(cwd: string, files: string[]): Promise<number> {\n let total = 0;\n for (const file of files.slice(0, 500)) { // Limit to first 500 for performance\n try {\n const content = readFileSync(join(cwd, file), 'utf-8');\n const lines = content.split('\\n').filter(line => {\n const trimmed = line.trim();\n return trimmed.length > 0 &&\n !trimmed.startsWith('//') &&\n !trimmed.startsWith('/*') &&\n !trimmed.startsWith('*');\n });\n total += lines.length;\n } catch {\n // Skip unreadable files\n }\n }\n return total;\n}\n\nexport async function scanCommand(paths: string[], options: ScanOptions): Promise<void> {\n const scanStartTime = Date.now();\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n const repoName = getRepoName(cwd);\n\n // Quick scan mode: works without init, uses changed files only\n const isQuickScan = options.quick || options.ci;\n const isQuiet = options.json || options.sarif || options.ci;\n\n // For thorough scan, require init\n if (!isQuickScan && !existsSync(whiterosePath)) {\n if (!isQuiet) {\n p.log.error('whiterose is not initialized in this directory.');\n p.log.info('Run \"whiterose init\" first, or use --quick for fast pre-commit scanning.');\n } else {\n console.error(JSON.stringify({ error: 'Not initialized. Run whiterose init first.' }));\n }\n process.exit(1);\n }\n\n if (!isQuiet) {\n const scanMode = isQuickScan ? 'quick' : 'full';\n console.log();\n console.log(chalk.red.bold('whiterose') + chalk.dim(` v1.0.9 | ${scanMode} scan`));\n console.log();\n }\n\n // ─────────────────────────────────────────────────────────────\n // Load config and understanding (optional for quick scan)\n // ─────────────────────────────────────────────────────────────\n let config: WhiteroseConfig | undefined;\n let understanding: any;\n\n if (existsSync(whiterosePath)) {\n try {\n config = await loadConfig(cwd);\n understanding = await loadUnderstanding(cwd);\n } catch (err) {\n // Config load failed - warn user that defaults will be used\n const errorMessage = err instanceof Error ? err.message : String(err);\n if (!isQuiet) {\n p.log.warn(`Failed to load config: ${errorMessage}`);\n p.log.info('Continuing with default settings. Run \"whiterose init\" to fix.');\n } else if (options.ci) {\n // In CI mode, config parse errors should fail the build\n console.error(JSON.stringify({\n error: 'Config parse error',\n message: errorMessage,\n hint: 'Fix config.yml or run \"whiterose init\" to regenerate'\n }));\n process.exit(1);\n }\n }\n }\n\n // Create minimal understanding for quick scan if none exists\n if (!understanding) {\n understanding = {\n version: '1',\n generatedAt: new Date().toISOString(),\n summary: {\n type: 'unknown',\n framework: 'unknown',\n language: 'typescript', // Assume TS for now\n description: 'Quick scan mode - no understanding available',\n },\n features: [],\n contracts: [],\n dependencies: {},\n structure: { totalFiles: 0, totalLines: 0 },\n };\n }\n\n // ─────────────────────────────────────────────────────────────\n // Determine files to scan\n // ─────────────────────────────────────────────────────────────\n let filesToScan: string[];\n let scanType: 'full' | 'incremental';\n let pendingHashState: any = null;\n\n if (options.full || paths.length > 0) {\n scanType = 'full';\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ' Discovering files...');\n }\n if (paths.length > 0) {\n // Expand glob patterns in provided paths\n filesToScan = await fg(paths, {\n cwd,\n ignore: ['node_modules/**', 'dist/**', 'build/**', '.next/**'],\n absolute: false,\n });\n } else {\n filesToScan = await scanCodebase(cwd, config);\n }\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ` Found ${chalk.cyan(filesToScan.length)} files`);\n }\n } else {\n // Incremental scan requires config\n if (!config) {\n // Fall back to full scan if no config\n scanType = 'full';\n filesToScan = await scanCodebase(cwd);\n } else {\n scanType = 'incremental';\n const changed = await getChangedFiles(cwd, config, { writeCache: false });\n filesToScan = changed.files;\n pendingHashState = changed.state;\n }\n\n if (filesToScan.length === 0) {\n if (!isQuiet) {\n p.log.info('No files changed since last scan. Use --full for a complete scan.');\n } else {\n console.log(JSON.stringify({ bugs: [], message: 'No changes detected' }));\n }\n process.exit(0);\n }\n\n if (!isQuiet) {\n p.log.info(`Incremental scan: ${filesToScan.length} changed files`);\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Run static analysis\n // ─────────────────────────────────────────────────────────────\n let staticResults;\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ' Running static analysis (tsc, eslint)...');\n }\n staticResults = await runStaticAnalysis(cwd, filesToScan, config);\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ` Static analysis: ${chalk.cyan(staticResults.length)} signals`);\n }\n\n // ─────────────────────────────────────────────────────────────\n // LLM Analysis (using CoreScanner - LSP-compliant architecture)\n // ─────────────────────────────────────────────────────────────\n const providerName = (options.provider || config?.provider || 'claude-code') as ProviderType;\n\n // Get the executor (simple prompt runner) for the selected provider\n const executor = getExecutor(providerName);\n\n // Check if provider is available\n if (!await executor.isAvailable()) {\n if (!isQuiet) {\n p.log.error(`Provider ${providerName} is not available. Is it installed?`);\n }\n process.exit(1);\n }\n\n let bugs: Bug[];\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502'));\n console.log(chalk.cyan('\\u2550\\u2550\\u2550 Analyzing with ' + providerName + ' \\u2550\\u2550\\u2550'));\n console.log();\n\n // Create scanner with progress callback (additive output, no clearing)\n const scanner = new CoreScanner(executor, {}, {\n onProgress: (message: string) => {\n if (message.trim()) {\n // Color code based on content\n if (message.includes('\\u2550\\u2550\\u2550\\u2550')) {\n console.log(chalk.cyan(message));\n } else if (message.includes('\\u2713')) {\n console.log(chalk.green(message));\n } else if (message.includes('\\u2717')) {\n console.log(chalk.red(message));\n } else if (message.includes('[Batch')) {\n console.log(chalk.yellow(message));\n } else {\n console.log(chalk.dim(message));\n }\n }\n },\n onBugFound: (bug: Bug) => {\n const severityColor = bug.severity === 'critical' ? chalk.red :\n bug.severity === 'high' ? chalk.yellow :\n bug.severity === 'medium' ? chalk.blue : chalk.dim;\n console.log(chalk.magenta('\\u2605') + ` ${severityColor('[' + bug.severity + ']')} ${bug.title}`);\n },\n });\n\n try {\n // Use quickScan for --quick/--ci, full scan otherwise\n if (isQuickScan) {\n bugs = await scanner.quickScan({\n files: filesToScan,\n understanding,\n staticResults: staticResults || [],\n config,\n });\n } else {\n bugs = await scanner.scan({\n files: filesToScan,\n understanding,\n staticResults: staticResults || [],\n config,\n });\n }\n\n console.log();\n console.log(chalk.dim('\\u2502') + ` Found ${chalk.cyan(bugs.length)} potential bugs`);\n\n // Check for pass errors - warn user if some passes failed\n if (scanner.hasPassErrors()) {\n const errors = scanner.getPassErrors();\n console.log(chalk.yellow('\\u26a0') + ` ${errors.length} analysis pass(es) failed:`);\n for (const err of errors.slice(0, 5)) {\n console.log(chalk.yellow(` - ${err.passName}: ${err.error}`));\n }\n if (errors.length > 5) {\n console.log(chalk.yellow(` ... and ${errors.length - 5} more`));\n }\n }\n } catch (error) {\n console.log(chalk.red('\\u2717') + ' Analysis failed');\n console.error(String(error));\n process.exit(1);\n }\n } else {\n const scanner = new CoreScanner(executor);\n\n if (isQuickScan) {\n bugs = await scanner.quickScan({\n files: filesToScan,\n understanding,\n staticResults: staticResults || [],\n config,\n });\n } else {\n bugs = await scanner.scan({\n files: filesToScan,\n understanding,\n staticResults: staticResults || [],\n config,\n });\n }\n\n // In CI mode, if ALL passes failed and we have no bugs, exit with error\n // This prevents silent failures from being reported as successful scans\n if (options.ci && scanner.hasPassErrors()) {\n const errors = scanner.getPassErrors();\n // If we have some bugs despite errors, continue (partial success)\n // But if we have 0 bugs and errors occurred, that's a scan failure\n if (bugs.length === 0) {\n console.error(JSON.stringify({\n error: 'Analysis failed',\n passErrors: errors,\n }));\n process.exit(1);\n }\n }\n }\n\n // Note: Adversarial validation is now inline during analysis\n // Claude validates each bug before reporting it\n\n // ─────────────────────────────────────────────────────────────\n // Cross-file analysis (finds bugs spanning multiple files)\n // ─────────────────────────────────────────────────────────────\n if (!isQuickScan) {\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ' Running cross-file analysis...');\n }\n try {\n const crossFileBugs = await analyzeCrossFile(cwd);\n if (crossFileBugs.length > 0) {\n bugs.push(...crossFileBugs);\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ` Cross-file: ${chalk.cyan(crossFileBugs.length)} issues`);\n }\n } else if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ' Cross-file: no issues');\n }\n } catch (err) {\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + chalk.dim(' Cross-file: skipped'));\n } else if (options.ci) {\n // In CI mode, surface analysis failures so they don't go unnoticed\n console.error(JSON.stringify({\n error: 'Cross-file analysis failed',\n message: err instanceof Error ? err.message : String(err),\n }));\n process.exit(1);\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Contract analysis (finds missing rollback, verification, etc.)\n // ─────────────────────────────────────────────────────────────\n if (!isQuickScan) {\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ' Running contract analysis...');\n }\n try {\n const contractBugs = await analyzeContracts(cwd);\n if (contractBugs.length > 0) {\n bugs.push(...contractBugs);\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ` Contract: ${chalk.cyan(contractBugs.length)} issues`);\n }\n } else if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ' Contract: no issues');\n }\n } catch (err) {\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + chalk.dim(' Contract: skipped'));\n } else if (options.ci) {\n // In CI mode, surface analysis failures so they don't go unnoticed\n console.error(JSON.stringify({\n error: 'Contract analysis failed',\n message: err instanceof Error ? err.message : String(err),\n }));\n process.exit(1);\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Intent validation (contract existence + intent alignment)\n // ─────────────────────────────────────────────────────────────\n if (!isQuickScan) {\n try {\n const intentBugs = analyzeIntentContracts(cwd, understanding);\n if (intentBugs.length > 0) {\n bugs.push(...intentBugs);\n }\n } catch (err) {\n // In CI mode, surface analysis failures so they don't go unnoticed\n if (options.ci) {\n console.error(JSON.stringify({\n error: 'Intent validation failed',\n message: err instanceof Error ? err.message : String(err),\n }));\n process.exit(1);\n }\n // For non-CI quiet modes (--json, --sarif) or interactive, skip silently\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Filter by confidence\n // ─────────────────────────────────────────────────────────────\n const confidenceOrder: Record<ConfidenceLevel, number> = { high: 3, medium: 2, low: 1 };\n const validConfidenceLevels: ConfidenceLevel[] = ['high', 'medium', 'low'];\n const minConfidence: ConfidenceLevel = validConfidenceLevels.includes(options.minConfidence as ConfidenceLevel)\n ? (options.minConfidence as ConfidenceLevel)\n : 'low';\n bugs = bugs.filter((bug) => confidenceOrder[bug.confidence.overall] >= confidenceOrder[minConfidence]);\n\n // ─────────────────────────────────────────────────────────────\n // Filter by category\n // ─────────────────────────────────────────────────────────────\n if (options.category && options.category.length > 0) {\n bugs = bugs.filter((bug) => options.category!.includes(bug.category));\n }\n\n // ─────────────────────────────────────────────────────────────\n // Classify findings (bug vs smell) using intent + evidence\n // ─────────────────────────────────────────────────────────────\n bugs = classifyFindings(bugs, cwd, understanding);\n\n // ─────────────────────────────────────────────────────────────\n // Assign IDs\n // ─────────────────────────────────────────────────────────────\n bugs = bugs.map((bug, index) => ({\n ...bug,\n id: bug.id || generateBugId(index),\n }));\n\n // ─────────────────────────────────────────────────────────────\n // Merge with accumulated bugs (union across scans)\n // ─────────────────────────────────────────────────────────────\n const mergeResult = mergeBugs(bugs, cwd);\n const newBugsThisScan = mergeResult.stats.newBugs;\n\n if (!isQuiet && mergeResult.stats.existingBugs > 0) {\n p.log.info(\n `Merged: ${newBugsThisScan} new bugs + ${mergeResult.stats.existingBugs} existing = ${mergeResult.stats.total} total` +\n (mergeResult.stats.duplicatesSkipped > 0 ? ` (${mergeResult.stats.duplicatesSkipped} duplicates skipped)` : '')\n );\n }\n\n // Use the full accumulated bug list for output\n const allBugs = mergeResult.bugs;\n\n // ─────────────────────────────────────────────────────────────\n // Calculate LoC and create scan result\n // ─────────────────────────────────────────────────────────────\n const linesOfCode = await countLinesOfCode(cwd, filesToScan);\n const scanDuration = Date.now() - scanStartTime;\n\n // Separate bugs and smells with severity breakdown\n const bugItems = allBugs.filter((b) => b.kind === 'bug');\n const smellItems = allBugs.filter((b) => b.kind === 'smell');\n\n const summary: ScanSummary = {\n bugs: {\n critical: bugItems.filter((b) => b.severity === 'critical').length,\n high: bugItems.filter((b) => b.severity === 'high').length,\n medium: bugItems.filter((b) => b.severity === 'medium').length,\n low: bugItems.filter((b) => b.severity === 'low').length,\n total: bugItems.length,\n },\n smells: {\n critical: smellItems.filter((b) => b.severity === 'critical').length,\n high: smellItems.filter((b) => b.severity === 'high').length,\n medium: smellItems.filter((b) => b.severity === 'medium').length,\n low: smellItems.filter((b) => b.severity === 'low').length,\n total: smellItems.length,\n },\n total: allBugs.length,\n };\n\n const meta: ScanMeta = {\n repoName,\n provider: providerName,\n duration: scanDuration,\n filesScanned: filesToScan.length,\n linesOfCode,\n };\n\n const result: ScanResult = {\n id: `scan-${Date.now()}`,\n timestamp: new Date().toISOString(),\n scanType,\n filesScanned: filesToScan.length,\n filesChanged: scanType === 'incremental' ? filesToScan.length : undefined,\n duration: scanDuration,\n linesOfCode,\n bugs: allBugs,\n summary,\n meta,\n };\n\n // ─────────────────────────────────────────────────────────────\n // Output\n // ─────────────────────────────────────────────────────────────\n // Persist hash cache only after a successful analysis run\n if (pendingHashState) {\n try {\n saveFileHashes(cwd, pendingHashState);\n } catch {\n // Non-fatal: cache persistence failure should not break scan output\n }\n }\n\n if (options.json || (options.ci && !options.sarif)) {\n // JSON output (default for CI mode)\n console.log(JSON.stringify(result, null, 2));\n // CI mode: exit with code 1 if bugs found\n if (options.ci && result.summary.bugs.total > 0) {\n process.exit(1);\n }\n } else if (options.sarif) {\n console.log(JSON.stringify(outputSarif(result), null, 2));\n // CI mode: exit with code 1 if bugs found\n if (options.ci && result.summary.bugs.total > 0) {\n process.exit(1);\n }\n } else {\n // Create output directory\n const outputDir = join(cwd, 'whiterose-output');\n const reportsDir = join(whiterosePath, 'reports');\n const { mkdirSync } = await import('fs');\n\n try {\n mkdirSync(outputDir, { recursive: true });\n mkdirSync(reportsDir, { recursive: true });\n } catch {\n // Directory already exists\n }\n\n const timestamp = new Date().toISOString().split('T')[0];\n\n // Always save all formats\n // 1. Technical Markdown\n const markdown = outputMarkdown(result);\n const mdPath = join(outputDir, 'bugs.md');\n writeFileSync(mdPath, markdown);\n\n // 2. Human-Readable Markdown (tester-friendly)\n const humanReadable = outputHumanReadableMarkdown(result);\n const humanPath = join(outputDir, 'bugs-human.md');\n writeFileSync(humanPath, humanReadable);\n\n // 3. SARIF\n const sarifPath = join(outputDir, 'bugs.sarif');\n writeFileSync(sarifPath, JSON.stringify(outputSarif(result), null, 2));\n\n // 4. JSON\n const jsonPath = join(outputDir, 'bugs.json');\n writeFileSync(jsonPath, JSON.stringify(result, null, 2));\n\n // 5. Save last scan for status command\n const lastScanPath = join(whiterosePath, 'last-scan.json');\n writeFileSync(lastScanPath, JSON.stringify(result, null, 2));\n\n // Also save to reports directory with timestamp for history\n writeFileSync(join(reportsDir, `${timestamp}.sarif`), JSON.stringify(outputSarif(result), null, 2));\n\n // Show the card\n console.log();\n const cardData: CardData = {\n meta,\n bugs: summary.bugs,\n smells: summary.smells,\n reportPath: './' + relative(cwd, humanPath),\n };\n console.log(renderScanCard(cardData));\n console.log();\n\n // Show relative paths for reports\n console.log(chalk.dim('Reports:'));\n console.log(` ${chalk.dim('\\u251c')} ${chalk.cyan('./' + relative(cwd, humanPath))} ${chalk.dim('(tester-friendly)')}`);\n console.log(` ${chalk.dim('\\u251c')} ${chalk.cyan('./' + relative(cwd, mdPath))} ${chalk.dim('(technical)')}`);\n console.log(` ${chalk.dim('\\u251c')} ${chalk.cyan('./' + relative(cwd, sarifPath))}`);\n console.log(` ${chalk.dim('\\u2514')} ${chalk.cyan('./' + relative(cwd, jsonPath))}`);\n console.log();\n }\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { Bug } from '../../types.js';\n\ninterface DashboardProps {\n bugs: Bug[];\n onSelectCategory: (category: string | null) => void;\n}\n\ninterface MenuItem {\n key: string;\n label: string;\n count: number;\n color: string;\n}\n\nexport const Dashboard: React.FC<DashboardProps> = ({ bugs, onSelectCategory }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const verifiedBugs = bugs.filter((b) => b.kind === 'bug');\n const smells = bugs.filter((b) => b.kind === 'smell');\n\n // Calculate summary\n const summary = {\n critical: verifiedBugs.filter((b) => b.severity === 'critical').length,\n high: verifiedBugs.filter((b) => b.severity === 'high').length,\n medium: verifiedBugs.filter((b) => b.severity === 'medium').length,\n low: verifiedBugs.filter((b) => b.severity === 'low').length,\n };\n\n // Calculate by category\n const byCategory: Record<string, number> = {};\n for (const bug of verifiedBugs) {\n byCategory[bug.category] = (byCategory[bug.category] || 0) + 1;\n }\n\n // Build menu items\n const menuItems: MenuItem[] = [\n { key: 'all', label: 'All Findings', count: bugs.length, color: 'white' },\n { key: 'kind:bug', label: 'Verified Bugs', count: verifiedBugs.length, color: 'white' },\n { key: 'kind:smell', label: 'Smells', count: smells.length, color: 'gray' },\n { key: 'critical', label: 'Critical', count: summary.critical, color: 'red' },\n { key: 'high', label: 'High', count: summary.high, color: 'yellow' },\n { key: 'medium', label: 'Medium', count: summary.medium, color: 'blue' },\n { key: 'low', label: 'Low', count: summary.low, color: 'gray' },\n ];\n\n // Add category items\n const categoryColors: Record<string, string> = {\n 'logic-error': 'magenta',\n security: 'red',\n 'async-race-condition': 'cyan',\n 'edge-case': 'yellow',\n 'null-reference': 'blue',\n 'type-coercion': 'green',\n 'resource-leak': 'yellow',\n 'intent-violation': 'magenta',\n };\n\n for (const [category, count] of Object.entries(byCategory)) {\n menuItems.push({\n key: category,\n label: formatCategory(category),\n count,\n color: categoryColors[category] || 'white',\n });\n }\n\n useInput((_input, key) => {\n if (key.upArrow) {\n setSelectedIndex((i) => Math.max(0, i - 1));\n } else if (key.downArrow) {\n setSelectedIndex((i) => Math.min(menuItems.length - 1, i + 1));\n } else if (key.return) {\n const item = menuItems[selectedIndex];\n if (item.key === 'all') {\n onSelectCategory(null);\n } else {\n onSelectCategory(item.key);\n }\n }\n });\n\n if (bugs.length === 0) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"green\" bold>\n ✓ No findings found!\n </Text>\n <Text color=\"gray\">Your codebase looks clean.</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {/* Summary */}\n <Box marginBottom={1} flexDirection=\"column\">\n <Text bold underline>\n Summary\n </Text>\n <Box marginTop={1}>\n <Box marginRight={3}>\n <Text color=\"red\">● Critical: {summary.critical}</Text>\n </Box>\n <Box marginRight={3}>\n <Text color=\"yellow\">● High: {summary.high}</Text>\n </Box>\n <Box marginRight={3}>\n <Text color=\"blue\">● Medium: {summary.medium}</Text>\n </Box>\n <Box>\n <Text color=\"gray\">● Low: {summary.low}</Text>\n </Box>\n </Box>\n </Box>\n\n {/* Menu */}\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold underline>\n Filter by\n </Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {menuItems.map((item, index) => (\n <Box key={item.key}>\n <Text color={index === selectedIndex ? 'cyan' : 'white'}>\n {index === selectedIndex ? '▶ ' : ' '}\n </Text>\n <Text color={item.color}>\n {item.label}\n </Text>\n <Text color=\"gray\"> ({item.count})</Text>\n </Box>\n ))}\n </Box>\n </Box>\n\n {/* Instructions */}\n <Box marginTop={2}>\n <Text color=\"gray\">[↑↓] Navigate [Enter] Select [q] Quit</Text>\n </Box>\n </Box>\n );\n};\n\nfunction formatCategory(category: string): string {\n return category\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { Bug } from '../../types.js';\n\ninterface BugListProps {\n bugs: Bug[];\n selectedIndex: number;\n onSelect: (index: number) => void;\n onBack: () => void;\n}\n\nconst VISIBLE_ITEMS = 10;\n\nexport const BugList: React.FC<BugListProps> = ({ bugs, selectedIndex, onSelect, onBack }) => {\n const [localIndex, setLocalIndex] = useState(selectedIndex);\n const [scrollOffset, setScrollOffset] = useState(0);\n\n useEffect(() => {\n setLocalIndex(selectedIndex);\n }, [selectedIndex]);\n\n // Ensure selected item is visible\n useEffect(() => {\n if (localIndex < scrollOffset) {\n setScrollOffset(localIndex);\n } else if (localIndex >= scrollOffset + VISIBLE_ITEMS) {\n setScrollOffset(localIndex - VISIBLE_ITEMS + 1);\n }\n }, [localIndex, scrollOffset]);\n\n useInput((input, key) => {\n if (key.upArrow || input === 'k') {\n setLocalIndex((i) => Math.max(0, i - 1));\n } else if (key.downArrow || input === 'j') {\n setLocalIndex((i) => Math.min(bugs.length - 1, i + 1));\n } else if (key.return) {\n onSelect(localIndex);\n } else if (input === 'b' || key.escape) {\n onBack();\n } else if (input === 'u' || input === '[') {\n // Page up\n setLocalIndex((i) => Math.max(0, i - VISIBLE_ITEMS));\n } else if (input === 'd' || input === ']') {\n // Page down\n setLocalIndex((i) => Math.min(bugs.length - 1, i + VISIBLE_ITEMS));\n }\n });\n\n if (bugs.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"gray\">No bugs in this category.</Text>\n <Text color=\"gray\">[b] Back to dashboard</Text>\n </Box>\n );\n }\n\n const visibleBugs = bugs.slice(scrollOffset, scrollOffset + VISIBLE_ITEMS);\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box marginBottom={1}>\n <Box width={10}>\n <Text bold color=\"gray\">ID</Text>\n </Box>\n <Box width={7}>\n <Text bold color=\"gray\">Kind</Text>\n </Box>\n <Box width={10}>\n <Text bold color=\"gray\">Severity</Text>\n </Box>\n <Box width={10}>\n <Text bold color=\"gray\">Conf</Text>\n </Box>\n <Box flexGrow={1}>\n <Text bold color=\"gray\">Title</Text>\n </Box>\n </Box>\n\n {/* Bug list */}\n {visibleBugs.map((bug, index) => {\n const actualIndex = scrollOffset + index;\n const isSelected = actualIndex === localIndex;\n const kindLabel = bug.kind === 'smell' ? 'SMELL' : 'BUG';\n const kindColor = bug.kind === 'smell' ? 'yellow' : 'red';\n\n return (\n <Box key={`${bug.id}-${actualIndex}`} flexDirection=\"column\">\n <Box>\n <Text color={isSelected ? 'cyan' : 'white'}>\n {isSelected ? '▶ ' : ' '}\n </Text>\n <Box width={8}>\n <Text color=\"gray\">{bug.id}</Text>\n </Box>\n <Box width={7}>\n <Text color={kindColor}>{kindLabel.padEnd(5)}</Text>\n </Box>\n <Box width={10}>\n <Text color={getSeverityColor(bug.severity)}>\n {bug.severity.toUpperCase().padEnd(8)}\n </Text>\n </Box>\n <Box width={10}>\n <Text color={getConfidenceColor(bug.confidence.overall)}>\n {bug.confidence.overall.toUpperCase().padEnd(6)}\n </Text>\n </Box>\n <Box flexGrow={1} flexShrink={1}>\n <Text color={isSelected ? 'white' : 'gray'} wrap=\"truncate-end\">\n {bug.title}\n </Text>\n </Box>\n </Box>\n {/* Show file on second line for selected item */}\n {isSelected && (\n <Box marginLeft={2}>\n <Text color=\"cyan\" dimColor>\n └─ {bug.file}:{bug.line}\n </Text>\n </Box>\n )}\n </Box>\n );\n })}\n\n {/* Scroll indicator */}\n {bugs.length > VISIBLE_ITEMS && (\n <Box marginTop={1}>\n <Text color=\"gray\">\n Showing {scrollOffset + 1}-{Math.min(scrollOffset + VISIBLE_ITEMS, bugs.length)} of {bugs.length}\n {scrollOffset > 0 && ' [↑ more above]'}\n {scrollOffset + VISIBLE_ITEMS < bugs.length && ' [↓ more below]'}\n </Text>\n </Box>\n )}\n\n {/* Instructions */}\n <Box marginTop={1}>\n <Text color=\"gray\">\n [↑↓/jk] Navigate [Enter] View [u/d] Page up/down [b] Back\n </Text>\n </Box>\n </Box>\n );\n};\n\nfunction getSeverityColor(severity: string): string {\n switch (severity) {\n case 'critical':\n return 'red';\n case 'high':\n return 'yellow';\n case 'medium':\n return 'blue';\n case 'low':\n return 'gray';\n default:\n return 'white';\n }\n}\n\nfunction getConfidenceColor(confidence: string): string {\n switch (confidence) {\n case 'high':\n return 'green';\n case 'medium':\n return 'yellow';\n case 'low':\n return 'red';\n default:\n return 'white';\n }\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { Bug } from '../../types.js';\n\ninterface BugDetailProps {\n bug: Bug;\n index: number;\n total: number;\n onFix: () => void;\n onNext: () => void;\n onPrev: () => void;\n onBack: () => void;\n}\n\ntype Tab = 'overview' | 'codepath' | 'evidence' | 'fix';\n\nexport const BugDetail: React.FC<BugDetailProps> = ({\n bug,\n index,\n total,\n onFix,\n onNext,\n onPrev,\n onBack,\n}) => {\n const [activeTab, setActiveTab] = useState<Tab>('overview');\n\n useInput((input, key) => {\n if (input === 'f') {\n onFix();\n } else if (input === 'n' || key.rightArrow) {\n onNext();\n } else if (input === 'p' || key.leftArrow) {\n onPrev();\n } else if (input === 'b' || key.escape) {\n onBack();\n } else if (input === '1') {\n setActiveTab('overview');\n } else if (input === '2') {\n setActiveTab('codepath');\n } else if (input === '3') {\n setActiveTab('evidence');\n } else if (input === '4') {\n setActiveTab('fix');\n } else if (key.tab) {\n const tabs: Tab[] = ['overview', 'codepath', 'evidence', 'fix'];\n const currentIndex = tabs.indexOf(activeTab);\n setActiveTab(tabs[(currentIndex + 1) % tabs.length]);\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n {/* Bug header */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color=\"gray\">{bug.id} </Text>\n <Text color={getSeverityColor(bug.severity)} bold>\n [{bug.severity.toUpperCase()}]\n </Text>\n <Text> </Text>\n <Text bold>{bug.title}</Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">File: </Text>\n <Text color=\"cyan\">{bug.file}</Text>\n <Text color=\"gray\">:</Text>\n <Text color=\"yellow\">{bug.line}</Text>\n {bug.endLine && (\n <>\n <Text color=\"gray\">-</Text>\n <Text color=\"yellow\">{bug.endLine}</Text>\n </>\n )}\n </Box>\n <Box>\n <Text color=\"gray\">Category: </Text>\n <Text>{formatCategory(bug.category)}</Text>\n <Text color=\"gray\"> | Confidence: </Text>\n <Text color={getConfidenceColor(bug.confidence.overall)}>\n {bug.confidence.overall.toUpperCase()}\n </Text>\n {bug.confidence.adversarialSurvived && (\n <Text color=\"green\"> ✓ Validated</Text>\n )}\n </Box>\n </Box>\n\n {/* Tabs */}\n <Box marginBottom={1}>\n <TabButton label=\"1:Overview\" active={activeTab === 'overview'} />\n <TabButton label=\"2:Code Path\" active={activeTab === 'codepath'} />\n <TabButton label=\"3:Evidence\" active={activeTab === 'evidence'} />\n <TabButton label=\"4:Action\" active={activeTab === 'fix'} />\n </Box>\n\n {/* Tab content */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n padding={1}\n minHeight={10}\n >\n {activeTab === 'overview' && (\n <Box flexDirection=\"column\">\n <Text bold>Description</Text>\n <Text wrap=\"wrap\">{bug.description}</Text>\n </Box>\n )}\n\n {activeTab === 'codepath' && (\n <Box flexDirection=\"column\">\n <Text bold>Code Path ({bug.codePath.length} steps)</Text>\n {bug.codePath.length === 0 ? (\n <Text color=\"gray\">No code path available</Text>\n ) : (\n bug.codePath.map((step, i) => (\n <Box key={i} flexDirection=\"column\" marginTop={i > 0 ? 1 : 0}>\n <Box>\n <Text color=\"cyan\">{step.step}. </Text>\n <Text color=\"yellow\">{step.file}:{step.line}</Text>\n </Box>\n {step.code && (\n <Box marginLeft={3}>\n <Text color=\"gray\">{step.code}</Text>\n </Box>\n )}\n <Box marginLeft={3}>\n <Text>{step.explanation}</Text>\n </Box>\n </Box>\n ))\n )}\n </Box>\n )}\n\n {activeTab === 'evidence' && (\n <Box flexDirection=\"column\">\n <Text bold>Evidence ({bug.evidence.length} items)</Text>\n {bug.evidence.length === 0 ? (\n <Text color=\"gray\">No evidence provided</Text>\n ) : (\n bug.evidence.map((e, i) => (\n <Box key={i}>\n <Text color=\"gray\">• </Text>\n <Text>{e}</Text>\n </Box>\n ))\n )}\n\n {/* Confidence breakdown */}\n <Box flexDirection=\"column\" marginTop={2}>\n <Text bold>Confidence Breakdown</Text>\n <Box>\n <Text color=\"gray\">Code Path Validity: </Text>\n <Text>{(bug.confidence.codePathValidity * 100).toFixed(0)}%</Text>\n </Box>\n <Box>\n <Text color=\"gray\">Reachability: </Text>\n <Text>{(bug.confidence.reachability * 100).toFixed(0)}%</Text>\n </Box>\n <Box>\n <Text color=\"gray\">Intent Violation: </Text>\n <Text>{bug.confidence.intentViolation ? 'Yes' : 'No'}</Text>\n </Box>\n <Box>\n <Text color=\"gray\">Static Tool Signal: </Text>\n <Text>{bug.confidence.staticToolSignal ? 'Yes' : 'No'}</Text>\n </Box>\n <Box>\n <Text color=\"gray\">Adversarial Validated: </Text>\n <Text color={bug.confidence.adversarialSurvived ? 'green' : 'gray'}>\n {bug.confidence.adversarialSurvived ? 'Yes ✓' : 'No'}\n </Text>\n </Box>\n </Box>\n </Box>\n )}\n\n {activeTab === 'fix' && (\n <Box flexDirection=\"column\">\n <Text bold>Agentic Fix</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"cyan\">Press [f] to start an AI-powered fix.</Text>\n <Box marginTop={1}>\n <Text color=\"gray\">The AI will:</Text>\n </Box>\n <Text color=\"gray\"> 1. Read the file and understand the context</Text>\n <Text color=\"gray\"> 2. Explore related files if needed</Text>\n <Text color=\"gray\"> 3. Apply a fix directly to the code</Text>\n <Text color=\"gray\"> 4. Show you the diff for review</Text>\n </Box>\n </Box>\n )}\n </Box>\n\n {/* Navigation */}\n <Box marginTop={1} justifyContent=\"space-between\">\n <Text color=\"gray\">\n Bug {index + 1} of {total}\n </Text>\n <Text color=\"gray\">\n [←/p] Prev [→/n] Next [f] Fix [Tab] Switch tab [b] Back\n </Text>\n </Box>\n </Box>\n );\n};\n\nconst TabButton: React.FC<{ label: string; active: boolean }> = ({ label, active }) => (\n <Box marginRight={2}>\n <Text color={active ? 'cyan' : 'gray'} bold={active} underline={active}>\n {label}\n </Text>\n </Box>\n);\n\nfunction getSeverityColor(severity: string): string {\n switch (severity) {\n case 'critical':\n return 'red';\n case 'high':\n return 'yellow';\n case 'medium':\n return 'blue';\n case 'low':\n return 'gray';\n default:\n return 'white';\n }\n}\n\nfunction getConfidenceColor(confidence: string): string {\n switch (confidence) {\n case 'high':\n return 'green';\n case 'medium':\n return 'yellow';\n case 'low':\n return 'red';\n default:\n return 'white';\n }\n}\n\nfunction formatCategory(category: string): string {\n return category\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { Bug } from '../../types.js';\nimport { FixResultInfo } from '../types.js';\n\ninterface FixConfirmProps {\n bug: Bug;\n dryRun: boolean;\n onConfirm: (onProgress: (message: string) => void) => Promise<FixResultInfo>;\n onCancel: () => void;\n onFixComplete: () => void; // Called after user acknowledges success (or false positive)\n}\n\nexport const FixConfirm: React.FC<FixConfirmProps> = ({ bug, dryRun, onConfirm, onCancel, onFixComplete }) => {\n const [status, setStatus] = useState<'confirm' | 'fixing' | 'done' | 'error' | 'false-positive'>('confirm');\n const [error, setError] = useState<string | null>(null);\n const [falsePositiveReason, setFalsePositiveReason] = useState<string | null>(null);\n const [progressMessage, setProgressMessage] = useState<string>('');\n\n useInput(async (input, key) => {\n // Handle success acknowledgment - user presses any key to continue\n if (status === 'done') {\n onFixComplete();\n return;\n }\n\n // Handle false positive acknowledgment - user presses any key to continue\n if (status === 'false-positive') {\n onFixComplete();\n return;\n }\n\n // Handle error acknowledgment\n if (status === 'error') {\n onCancel();\n return;\n }\n\n if (status !== 'confirm') return;\n\n if (input === 'y' || key.return) {\n setStatus('fixing');\n setProgressMessage('Starting agentic fix...');\n try {\n const result = await onConfirm((message) => {\n // Update progress message with streaming output from the LLM\n setProgressMessage(message);\n });\n if (result.falsePositive) {\n setFalsePositiveReason(result.falsePositiveReason || 'The AI determined this bug is not real after analyzing the code.');\n setStatus('false-positive');\n } else {\n setStatus('done');\n }\n } catch (e: any) {\n setError(e.message || 'Unknown error');\n setStatus('error');\n }\n } else if (input === 'n' || key.escape) {\n onCancel();\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n {/* Bug summary */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text bold>Fix: </Text>\n <Text>{bug.title}</Text>\n </Box>\n <Box>\n <Text color=\"gray\">File: </Text>\n <Text color=\"cyan\">{bug.file}:{bug.line}</Text>\n </Box>\n </Box>\n\n {/* Bug details */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n padding={1}\n marginBottom={1}\n >\n <Text bold>Bug Details:</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">{bug.description}</Text>\n {bug.evidence && bug.evidence.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>Evidence:</Text>\n {bug.evidence.slice(0, 3).map((e, i) => (\n <Text key={i} color=\"gray\"> • {e}</Text>\n ))}\n </Box>\n )}\n </Box>\n </Box>\n\n {/* Agentic fix explanation */}\n <Box marginBottom={1}>\n <Text color=\"cyan\">\n ◆ The AI will explore the code, understand context, and apply a fix automatically.\n </Text>\n </Box>\n\n {/* Status */}\n {status === 'confirm' && (\n <Box flexDirection=\"column\">\n {dryRun && (\n <Box marginBottom={1}>\n <Text color=\"yellow\">DRY RUN MODE - Changes will NOT be applied</Text>\n </Box>\n )}\n <Box>\n <Text>Start agentic fix? </Text>\n <Text color=\"green\">[y]es</Text>\n <Text> / </Text>\n <Text color=\"red\">[n]o</Text>\n </Box>\n </Box>\n )}\n\n {status === 'fixing' && (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text> AI is analyzing and fixing the bug...</Text>\n </Box>\n {progressMessage && (\n <Box marginTop={1}>\n <Text color=\"gray\">{progressMessage}</Text>\n </Box>\n )}\n </Box>\n )}\n\n {status === 'done' && (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"green\" bold>✓ Bug fixed successfully!</Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">Press any key to continue to next bug...</Text>\n </Box>\n </Box>\n )}\n\n {status === 'false-positive' && (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"yellow\" bold>⚠ False Positive Detected</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">The AI analyzed the code and determined this is NOT a real bug:</Text>\n {falsePositiveReason && (\n <Box marginTop={1} paddingLeft={2}>\n <Text color=\"cyan\">{falsePositiveReason}</Text>\n </Box>\n )}\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">This bug has been removed from the list.</Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">Press any key to continue...</Text>\n </Box>\n </Box>\n )}\n\n {status === 'error' && (\n <Box flexDirection=\"column\">\n <Text color=\"red\" bold>✗ Failed to fix bug</Text>\n {error && (\n <Box marginTop={1}>\n <Text color=\"gray\">{error}</Text>\n </Box>\n )}\n <Box marginTop={1}>\n <Text color=\"gray\">Press any key to go back</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport { Bug, WhiteroseConfig } from '../types.js';\nimport { Dashboard } from './screens/Dashboard.js';\nimport { BugList } from './screens/BugList.js';\nimport { BugDetail } from './screens/BugDetail.js';\nimport { FixConfirm } from './screens/FixConfirm.js';\nimport { FixResultInfo, Screen } from './types.js';\n\n// Re-export for backwards compatibility\nexport type { FixResultInfo, Screen } from './types.js';\n\nexport interface AppState {\n screen: Screen;\n bugs: Bug[];\n selectedCategory: string | null;\n selectedBugIndex: number;\n config: WhiteroseConfig;\n fixOptions: {\n dryRun: boolean;\n branch?: string;\n };\n}\n\ninterface AppProps {\n bugs: Bug[];\n config: WhiteroseConfig;\n fixOptions: {\n dryRun: boolean;\n branch?: string;\n };\n onFix: (bug: Bug, onProgress?: (message: string) => void) => Promise<FixResultInfo>;\n onExit: () => void;\n}\n\nexport const App: React.FC<AppProps> = ({ bugs, config, fixOptions, onFix, onExit }) => {\n const { exit } = useApp();\n const [state, setState] = useState<AppState>({\n screen: 'dashboard',\n bugs,\n selectedCategory: null,\n selectedBugIndex: 0,\n config,\n fixOptions,\n });\n\n // Filter bugs based on selected category\n const filteredBugs = state.selectedCategory\n ? state.bugs.filter((b) => {\n if (state.selectedCategory?.startsWith('kind:')) {\n const kind = state.selectedCategory.split(':')[1];\n return b.kind === kind;\n }\n return b.category === state.selectedCategory || b.severity === state.selectedCategory;\n })\n : state.bugs;\n\n const selectedBug = filteredBugs[state.selectedBugIndex];\n\n // Handle global keys\n useInput((input, key) => {\n if (input === 'q' || (key.ctrl && input === 'c')) {\n onExit();\n exit();\n return;\n }\n\n if (key.escape) {\n // Go back\n if (state.screen === 'fix') {\n setState((s) => ({ ...s, screen: 'detail' }));\n } else if (state.screen === 'detail') {\n setState((s) => ({ ...s, screen: 'list' }));\n } else if (state.screen === 'list') {\n setState((s) => ({ ...s, screen: 'dashboard', selectedCategory: null }));\n }\n }\n });\n\n const handleSelectCategory = (category: string | null) => {\n setState((s) => ({\n ...s,\n screen: 'list',\n selectedCategory: category,\n selectedBugIndex: 0,\n }));\n };\n\n const handleSelectBug = (index: number) => {\n setState((s) => ({\n ...s,\n screen: 'detail',\n selectedBugIndex: index,\n }));\n };\n\n const handleStartFix = () => {\n setState((s) => ({ ...s, screen: 'fix' }));\n };\n\n const [fixError, setFixError] = useState<string | null>(null);\n const [lastFixedBugId, setLastFixedBugId] = useState<string | null>(null);\n\n // Called when user confirms fix - does the fix and returns result info\n const handleConfirmFix = async (onProgress: (message: string) => void): Promise<FixResultInfo> => {\n if (selectedBug) {\n setFixError(null);\n setLastFixedBugId(selectedBug.id);\n const result = await onFix(selectedBug, onProgress);\n // Don't change state here - let FixConfirm show success/false-positive first\n return result;\n }\n return { falsePositive: false };\n };\n\n // Called after user acknowledges fix success - updates state and moves to next bug\n const handleFixComplete = () => {\n if (!lastFixedBugId) return;\n\n setState((s) => {\n const newBugs = s.bugs.filter((b) => b.id !== lastFixedBugId);\n\n // Recalculate filtered bugs with new state\n const newFiltered = s.selectedCategory\n ? newBugs.filter((b) => {\n if (s.selectedCategory?.startsWith('kind:')) {\n const kind = s.selectedCategory.split(':')[1];\n return b.kind === kind;\n }\n return b.category === s.selectedCategory || b.severity === s.selectedCategory;\n })\n : newBugs;\n\n // Go back to list if no more bugs in current filter\n if (newFiltered.length === 0) {\n return {\n ...s,\n bugs: newBugs,\n screen: 'list' as Screen,\n selectedBugIndex: 0,\n };\n }\n\n // Stay at same index (now showing next bug) or adjust if at end\n const newIndex = Math.min(s.selectedBugIndex, newFiltered.length - 1);\n\n return {\n ...s,\n bugs: newBugs,\n screen: 'detail' as Screen,\n selectedBugIndex: newIndex,\n };\n });\n\n setLastFixedBugId(null);\n };\n\n const handleCancelFix = () => {\n setState((s) => ({ ...s, screen: 'detail' }));\n };\n\n const handleBack = () => {\n if (state.screen === 'fix') {\n setState((s) => ({ ...s, screen: 'detail' }));\n } else if (state.screen === 'detail') {\n setState((s) => ({ ...s, screen: 'list' }));\n } else if (state.screen === 'list') {\n setState((s) => ({ ...s, screen: 'dashboard', selectedCategory: null }));\n }\n };\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text color=\"red\" bold>\n whiterose\n </Text>\n <Text color=\"gray\"> - fix mode</Text>\n <Text color=\"gray\"> | </Text>\n <Text color=\"gray\">\n {state.screen === 'dashboard' && 'Dashboard'}\n {state.screen === 'list' && `Bugs${state.selectedCategory ? ` (${state.selectedCategory})` : ''}`}\n {state.screen === 'detail' && `Bug ${state.selectedBugIndex + 1}/${filteredBugs.length}`}\n {state.screen === 'fix' && 'Confirm Fix'}\n </Text>\n </Box>\n\n {/* Main content */}\n {state.screen === 'dashboard' && (\n <Dashboard bugs={state.bugs} onSelectCategory={handleSelectCategory} />\n )}\n\n {state.screen === 'list' && (\n <BugList\n bugs={filteredBugs}\n selectedIndex={state.selectedBugIndex}\n onSelect={handleSelectBug}\n onBack={handleBack}\n />\n )}\n\n {state.screen === 'detail' && selectedBug && (\n <>\n {fixError && (\n <Box marginBottom={1}>\n <Text color=\"red\">Fix error: {fixError}</Text>\n </Box>\n )}\n <BugDetail\n bug={selectedBug}\n index={state.selectedBugIndex}\n total={filteredBugs.length}\n onFix={handleStartFix}\n onNext={() =>\n setState((s) => ({\n ...s,\n selectedBugIndex: Math.min(s.selectedBugIndex + 1, filteredBugs.length - 1),\n }))\n }\n onPrev={() =>\n setState((s) => ({\n ...s,\n selectedBugIndex: Math.max(s.selectedBugIndex - 1, 0),\n }))\n }\n onBack={handleBack}\n />\n </>\n )}\n\n {state.screen === 'fix' && selectedBug && (\n <FixConfirm\n bug={selectedBug}\n dryRun={fixOptions.dryRun}\n onConfirm={handleConfirmFix}\n onCancel={handleCancelFix}\n onFixComplete={handleFixComplete}\n />\n )}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text color=\"gray\">\n [q] Quit [esc] Back [↑↓] Navigate [enter] Select [f] Fix\n </Text>\n </Box>\n </Box>\n );\n};\n","import { execa } from 'execa';\nimport { Bug } from '../types.js';\n\nconst GIT_TIMEOUT = 30000; // 30 seconds\n\nexport async function isGitRepo(cwd: string = process.cwd()): Promise<boolean> {\n try {\n await execa('git', ['rev-parse', '--git-dir'], { cwd, timeout: GIT_TIMEOUT });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function getCurrentBranch(cwd: string = process.cwd()): Promise<string> {\n try {\n const { stdout } = await execa('git', ['branch', '--show-current'], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n return stdout.trim();\n } catch {\n return 'main';\n }\n}\n\nexport async function hasUncommittedChanges(cwd: string = process.cwd()): Promise<boolean> {\n try {\n const { stdout } = await execa('git', ['status', '--porcelain'], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n return stdout.trim().length > 0;\n } catch {\n return false;\n }\n}\n\nexport async function createFixBranch(\n branchName: string,\n bug: Bug,\n cwd: string = process.cwd()\n): Promise<string> {\n // Generate branch name from bug info if not provided\n const safeBugId = bug.id.toLowerCase().replace(/[^a-z0-9]/g, '-');\n const safeTitle = bug.title\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .replace(/\\s+/g, '-')\n .slice(0, 30);\n\n const fullBranchName = branchName || `whiterose/fix-${safeBugId}-${safeTitle}`;\n\n try {\n // Check if branch already exists\n try {\n await execa('git', ['rev-parse', '--verify', fullBranchName], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n // Branch exists, check it out\n await execa('git', ['checkout', fullBranchName], { cwd, timeout: GIT_TIMEOUT });\n } catch {\n // Branch doesn't exist, create it\n await execa('git', ['checkout', '-b', fullBranchName], { cwd, timeout: GIT_TIMEOUT });\n }\n\n return fullBranchName;\n } catch (error: any) {\n throw new Error(`Failed to create branch: ${error.message}`);\n }\n}\n\nexport async function commitFix(bug: Bug, cwd: string = process.cwd()): Promise<string> {\n try {\n // Stage the changed file (use -- to prevent option injection from malicious file paths)\n await execa('git', ['add', '--', bug.file], { cwd, timeout: GIT_TIMEOUT });\n\n // Check if there are staged changes\n const { stdout: diff } = await execa('git', ['diff', '--cached', '--name-only'], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n\n if (!diff.trim()) {\n return ''; // No changes to commit\n }\n\n // Create commit message\n const commitMessage = `fix(${bug.category}): ${bug.title}\n\nBug ID: ${bug.id}\nFile: ${bug.file}:${bug.line}\nSeverity: ${bug.severity}\n\n${bug.description}\n\nFixed by whiterose`;\n\n // Commit\n await execa('git', ['commit', '-m', commitMessage], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n\n // Get the commit hash\n const { stdout: hash } = await execa('git', ['rev-parse', 'HEAD'], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n\n return hash.trim();\n } catch (error: any) {\n throw new Error(`Failed to commit fix: ${error.message}`);\n }\n}\n\nexport async function stashChanges(cwd: string = process.cwd()): Promise<boolean> {\n try {\n const hasChanges = await hasUncommittedChanges(cwd);\n if (!hasChanges) {\n return false;\n }\n\n await execa('git', ['stash', 'push', '-m', 'whiterose: stash before fix'], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n\n return true;\n } catch (error: any) {\n throw new Error(`Failed to stash changes: ${error.message}`);\n }\n}\n\nexport async function popStash(cwd: string = process.cwd()): Promise<void> {\n try {\n await execa('git', ['stash', 'pop'], { cwd, timeout: GIT_TIMEOUT });\n } catch (error: any) {\n throw new Error(`Failed to pop stash: ${error.message}`);\n }\n}\n\nexport async function getDiff(file: string, cwd: string = process.cwd()): Promise<string> {\n try {\n const { stdout } = await execa('git', ['diff', file], { cwd, timeout: GIT_TIMEOUT });\n return stdout;\n } catch {\n return '';\n }\n}\n\nexport async function getStagedDiff(cwd: string = process.cwd()): Promise<string> {\n try {\n const { stdout } = await execa('git', ['diff', '--cached'], { cwd, timeout: GIT_TIMEOUT });\n return stdout;\n } catch {\n return '';\n }\n}\n\nexport async function resetFile(file: string, cwd: string = process.cwd()): Promise<void> {\n try {\n await execa('git', ['checkout', '--', file], { cwd, timeout: GIT_TIMEOUT });\n } catch (error: any) {\n throw new Error(`Failed to reset file: ${error.message}`);\n }\n}\n\nexport async function getFileAtHead(file: string, cwd: string = process.cwd()): Promise<string> {\n try {\n const { stdout } = await execa('git', ['show', `HEAD:${file}`], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n return stdout;\n } catch {\n return '';\n }\n}\n\nexport interface GitStatus {\n isRepo: boolean;\n branch: string;\n hasChanges: boolean;\n staged: string[];\n modified: string[];\n untracked: string[];\n}\n\nexport async function getGitStatus(cwd: string = process.cwd()): Promise<GitStatus> {\n const isRepo = await isGitRepo(cwd);\n if (!isRepo) {\n return {\n isRepo: false,\n branch: '',\n hasChanges: false,\n staged: [],\n modified: [],\n untracked: [],\n };\n }\n\n const branch = await getCurrentBranch(cwd);\n\n try {\n const { stdout } = await execa('git', ['status', '--porcelain'], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n\n const staged: string[] = [];\n const modified: string[] = [];\n const untracked: string[] = [];\n\n for (const line of stdout.split('\\n')) {\n if (!line.trim()) continue;\n\n const status = line.slice(0, 2);\n const file = line.slice(3);\n\n if (status[0] !== ' ' && status[0] !== '?') {\n staged.push(file);\n }\n if (status[1] === 'M') {\n modified.push(file);\n }\n if (status === '??') {\n untracked.push(file);\n }\n }\n\n return {\n isRepo: true,\n branch,\n hasChanges: staged.length > 0 || modified.length > 0,\n staged,\n modified,\n untracked,\n };\n } catch {\n return {\n isRepo: true,\n branch,\n hasChanges: false,\n staged: [],\n modified: [],\n untracked: [],\n };\n }\n}\n","/**\n * Bug Status Manager - Tracks fix status for bugs across scans\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { Bug, BugStatus } from '../types.js';\n\nconst STATUS_FILE = '.whiterose/bug-status.json';\n\ninterface BugStatusEntry {\n bugId: string;\n file: string;\n line: number;\n title: string;\n status: BugStatus;\n fixedAt?: string;\n fixCommit?: string;\n notes?: string;\n}\n\ninterface StatusFile {\n version: string;\n bugs: BugStatusEntry[];\n}\n\n/**\n * Load bug status from disk\n */\nexport function loadBugStatus(cwd: string = process.cwd()): StatusFile {\n const statusPath = join(cwd, STATUS_FILE);\n\n if (!existsSync(statusPath)) {\n return { version: '1', bugs: [] };\n }\n\n try {\n const content = readFileSync(statusPath, 'utf-8');\n const parsed = JSON.parse(content);\n\n // Validate structure to prevent crashes from corrupted files\n if (!parsed || typeof parsed !== 'object' || !Array.isArray(parsed.bugs)) {\n return { version: '1', bugs: [] };\n }\n\n return parsed as StatusFile;\n } catch {\n return { version: '1', bugs: [] };\n }\n}\n\n/**\n * Save bug status to disk\n */\nexport function saveBugStatus(status: StatusFile, cwd: string = process.cwd()): void {\n const statusPath = join(cwd, STATUS_FILE);\n const dir = dirname(statusPath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(statusPath, JSON.stringify(status, null, 2), 'utf-8');\n}\n\n/**\n * Mark a bug as fixed\n */\nexport function markBugAsFixed(\n bug: Bug,\n commitHash?: string,\n cwd: string = process.cwd()\n): void {\n const status = loadBugStatus(cwd);\n\n // Find existing entry or create new one\n const existingIndex = status.bugs.findIndex(\n (b) => b.bugId === bug.id || (b.file === bug.file && b.line === bug.line && b.title === bug.title)\n );\n\n const entry: BugStatusEntry = {\n bugId: bug.id,\n file: bug.file,\n line: bug.line,\n title: bug.title,\n status: 'fixed',\n fixedAt: new Date().toISOString(),\n fixCommit: commitHash,\n };\n\n if (existingIndex >= 0) {\n status.bugs[existingIndex] = entry;\n } else {\n status.bugs.push(entry);\n }\n\n saveBugStatus(status, cwd);\n}\n\n/**\n * Mark a bug with a specific status\n */\nexport function updateBugStatus(\n bug: Bug,\n newStatus: BugStatus,\n notes?: string,\n cwd: string = process.cwd()\n): void {\n const status = loadBugStatus(cwd);\n\n const existingIndex = status.bugs.findIndex(\n (b) => b.bugId === bug.id || (b.file === bug.file && b.line === bug.line && b.title === bug.title)\n );\n\n const entry: BugStatusEntry = {\n bugId: bug.id,\n file: bug.file,\n line: bug.line,\n title: bug.title,\n status: newStatus,\n notes,\n ...(newStatus === 'fixed' ? { fixedAt: new Date().toISOString() } : {}),\n };\n\n if (existingIndex >= 0) {\n status.bugs[existingIndex] = entry;\n } else {\n status.bugs.push(entry);\n }\n\n saveBugStatus(status, cwd);\n}\n\n/**\n * Get status for a specific bug\n */\nexport function getBugStatus(bug: Bug, cwd: string = process.cwd()): BugStatusEntry | null {\n const status = loadBugStatus(cwd);\n\n return status.bugs.find(\n (b) => b.bugId === bug.id || (b.file === bug.file && b.line === bug.line && b.title === bug.title)\n ) || null;\n}\n\n/**\n * Apply persisted status to a list of bugs from a scan\n */\nexport function applyPersistedStatus(bugs: Bug[], cwd: string = process.cwd()): Bug[] {\n const status = loadBugStatus(cwd);\n\n return bugs.map((bug) => {\n const entry = status.bugs.find(\n (b) => b.bugId === bug.id || (b.file === bug.file && b.line === bug.line && b.title === bug.title)\n );\n\n if (entry) {\n return {\n ...bug,\n status: entry.status,\n fixedAt: entry.fixedAt,\n fixCommit: entry.fixCommit,\n };\n }\n\n return bug;\n });\n}\n\n/**\n * Get summary of bug statuses\n */\nexport function getStatusSummary(cwd: string = process.cwd()): Record<BugStatus, number> {\n const status = loadBugStatus(cwd);\n\n const summary: Record<BugStatus, number> = {\n 'open': 0,\n 'fixed': 0,\n 'false-positive': 0,\n 'wont-fix': 0,\n };\n\n for (const bug of status.bugs) {\n summary[bug.status]++;\n }\n\n return summary;\n}\n","import { execa } from 'execa';\nimport { readFileSync, existsSync, realpathSync, statSync, mkdtempSync, rmSync } from 'fs';\nimport { resolve, relative, isAbsolute, join } from 'path';\nimport { tmpdir } from 'os';\nimport { Bug, WhiteroseConfig } from '../types.js';\nimport { createFixBranch, commitFix } from './git.js';\nimport { getProviderCommand } from '../providers/detect.js';\nimport { markBugAsFixed } from './bug-status.js';\n\n/**\n * Maximum length for untrusted SARIF text fields to prevent prompt bloat attacks.\n */\nconst MAX_SARIF_TEXT_LENGTH = 2000;\n\n/**\n * Patterns that indicate prompt injection attempts in SARIF content.\n * These patterns try to break out of the bug context and inject new instructions.\n */\nconst PROMPT_INJECTION_PATTERNS = [\n // Attempts to override or ignore instructions\n /ignore\\s+(previous|all|above)\\s+instructions?/i,\n /disregard\\s+(previous|all|above)\\s+instructions?/i,\n /forget\\s+(previous|all|above)\\s+instructions?/i,\n // Attempts to define new roles or personas\n /you\\s+are\\s+(now|actually)\\s+/i,\n /act\\s+as\\s+(a|an)\\s+/i,\n /pretend\\s+(you|to\\s+be)\\s+/i,\n // Attempts to inject system-level commands\n /\\[SYSTEM\\]/i,\n /\\[INST\\]/i,\n /<\\|system\\|>/i,\n /<\\|assistant\\|>/i,\n /<\\|user\\|>/i,\n // Attempts to break out with special markers\n /###\\s*(INSTRUCTION|SYSTEM|END|NEW)/i,\n /```\\s*(system|instruction)/i,\n // Direct file operation injections\n /delete\\s+(all|the)\\s+files?/i,\n /rm\\s+-rf\\s+/i,\n /remove\\s+(all|every)\\s+file/i,\n // Exfiltration attempts\n /send\\s+(this|the|all)\\s+(data|content|file)/i,\n /upload\\s+(to|this)/i,\n /curl\\s+.*\\s+-d/i,\n /fetch\\s*\\(\\s*['\"][^'\"]*['\"]\\s*,\\s*\\{[^}]*method\\s*:\\s*['\"]POST['\"]/i,\n];\n\n/**\n * Sanitizes untrusted text from SARIF files to prevent prompt injection.\n *\n * This function:\n * 1. Truncates overly long text to prevent prompt bloat\n * 2. Detects and neutralizes prompt injection patterns\n * 3. Escapes special characters that could break prompt structure\n *\n * @param text - Untrusted text from SARIF file\n * @param fieldName - Name of the field for error reporting\n * @returns Sanitized text safe for prompt embedding\n */\nexport function sanitizeSarifText(text: string, fieldName: string = 'field'): string {\n if (!text || typeof text !== 'string') {\n return '';\n }\n\n // Truncate overly long text\n let sanitized = text.length > MAX_SARIF_TEXT_LENGTH\n ? text.substring(0, MAX_SARIF_TEXT_LENGTH) + `... [truncated ${fieldName}]`\n : text;\n\n // Check for prompt injection patterns\n for (const pattern of PROMPT_INJECTION_PATTERNS) {\n if (pattern.test(sanitized)) {\n // Replace the suspicious content with a safe placeholder\n sanitized = sanitized.replace(pattern, '[REDACTED: potential injection]');\n }\n }\n\n // Escape characters that could break prompt structure\n // Replace markdown-style code blocks that might confuse the LLM\n sanitized = sanitized.replace(/```+/g, '`\\u200B`\\u200B`'); // Insert zero-width spaces\n\n // Escape sequences that look like special markers\n sanitized = sanitized.replace(/###/g, '#\\u200B#\\u200B#');\n\n return sanitized;\n}\n\n/**\n * Sanitizes an array of evidence strings from SARIF.\n */\nexport function sanitizeSarifEvidence(evidence: unknown): string[] {\n if (!Array.isArray(evidence)) {\n return [];\n }\n\n return evidence\n .filter((e): e is string => typeof e === 'string')\n .slice(0, 10) // Limit number of evidence items\n .map((e) => sanitizeSarifText(e, 'evidence'));\n}\n\n/**\n * Sanitizes code path entries from SARIF.\n */\nexport function sanitizeSarifCodePath(codePath: unknown): Array<{\n step: number;\n file: string;\n line: number;\n code: string;\n explanation: string;\n}> {\n if (!Array.isArray(codePath)) {\n return [];\n }\n\n return codePath\n .slice(0, 20) // Limit number of code path entries\n .map((entry, idx) => ({\n step: typeof entry?.step === 'number' ? entry.step : idx + 1,\n file: sanitizeSarifText(String(entry?.file || ''), 'codePath.file').substring(0, 500),\n line: typeof entry?.line === 'number' ? entry.line : 0,\n code: sanitizeSarifText(String(entry?.code || ''), 'codePath.code'),\n explanation: sanitizeSarifText(String(entry?.explanation || ''), 'codePath.explanation'),\n }));\n}\n\n/**\n * Validates that a file path is within the project directory.\n * Prevents path traversal attacks from malicious bug.file values.\n */\nfunction isPathWithinProject(filePath: string, projectDir: string): boolean {\n const resolvedPath = resolve(projectDir, filePath);\n const relativePath = relative(projectDir, resolvedPath);\n\n // Path is outside if it starts with '..' or is an absolute path\n return !relativePath.startsWith('..') && !isAbsolute(relativePath);\n}\n\n/**\n * Sanitizes and validates a file path for safe operations.\n * Returns the resolved absolute path if valid, throws if invalid.\n */\nfunction validateFilePath(filePath: string, projectDir: string): string {\n // Check for null bytes first (can bypass other checks)\n if (filePath.includes('\\0')) {\n throw new Error(`Security: Invalid file path contains null byte: ${filePath}`);\n }\n\n // Resolve to absolute path\n const resolvedPath = isAbsolute(filePath) ? filePath : resolve(projectDir, filePath);\n\n // Resolve symlinks to get real path (prevents symlink bypass attacks)\n let realPath: string;\n let realProjectDir: string;\n try {\n realPath = existsSync(resolvedPath) ? realpathSync(resolvedPath) : resolvedPath;\n realProjectDir = realpathSync(projectDir);\n } catch {\n // If realpath fails, use resolved paths\n realPath = resolvedPath;\n realProjectDir = projectDir;\n }\n\n // Check real path is within project (after symlink resolution)\n if (!isPathWithinProject(realPath, realProjectDir)) {\n throw new Error(`Security: Refusing to access file outside project directory: ${filePath}`);\n }\n\n return realPath;\n}\n\ninterface FixOptions {\n dryRun: boolean;\n branch?: string;\n onProgress?: (message: string) => void;\n}\n\ninterface FixResult {\n success: boolean;\n diff?: string;\n error?: string;\n branchName?: string;\n commitHash?: string;\n falsePositive?: boolean;\n falsePositiveReason?: string;\n}\n\n/**\n * Apply a fix to a bug using an agentic approach.\n *\n * Instead of generating a fix and applying it ourselves, we give the bug\n * details to the LLM provider and let it explore the code and fix it directly.\n * This produces much better fixes because the LLM can:\n * - Read related files for context\n * - Understand the codebase architecture\n * - Make multi-file changes if needed\n * - Verify the fix makes sense\n */\nexport async function applyFix(\n bug: Bug,\n config: WhiteroseConfig,\n options: FixOptions\n): Promise<FixResult> {\n const { dryRun, branch } = options;\n const projectDir = process.cwd();\n\n // SECURITY: Validate file path to prevent path traversal\n let safePath: string;\n try {\n safePath = validateFilePath(bug.file, projectDir);\n } catch (error: any) {\n return {\n success: false,\n error: error.message,\n };\n }\n\n // Verify file exists\n if (!existsSync(safePath)) {\n return {\n success: false,\n error: `File not found: ${bug.file}`,\n };\n }\n\n // Get file state before fix (for diff)\n const originalContent = readFileSync(safePath, 'utf-8');\n const originalMtime = statSync(safePath).mtime.getTime();\n\n // Dry run - just show what would be done\n if (dryRun) {\n console.log('\\n--- Dry Run: Would run agentic fix ---');\n console.log(`Bug: ${bug.title}`);\n console.log(`File: ${bug.file}:${bug.line}`);\n console.log(`Provider: ${config.provider}`);\n console.log('--- End of dry run ---\\n');\n return {\n success: true,\n diff: `[Dry run - no changes made]\\nWould fix: ${bug.title}\\nIn: ${bug.file}:${bug.line}`,\n };\n }\n\n // Create branch if needed\n let branchName: string | undefined;\n if (branch) {\n branchName = await createFixBranch(branch, bug);\n }\n\n // Run the agentic fix\n let agenticResult: AgenticResult;\n try {\n agenticResult = await runAgenticFix(bug, config, projectDir, options.onProgress);\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Agentic fix failed',\n };\n }\n\n // Check if the LLM determined this is a false positive\n if (agenticResult.falsePositive) {\n return {\n success: true, // Operation succeeded, just no fix needed\n falsePositive: true,\n falsePositiveReason: agenticResult.falsePositiveReason,\n };\n }\n\n // Verify the file was modified\n const newMtime = statSync(safePath).mtime.getTime();\n if (newMtime === originalMtime) {\n // File wasn't modified - check if content changed anyway\n const newContent = readFileSync(safePath, 'utf-8');\n if (newContent === originalContent) {\n return {\n success: false,\n error: 'AI did not modify the file. The fix may require manual intervention.',\n };\n }\n }\n\n // Generate diff\n const newContent = readFileSync(safePath, 'utf-8');\n const diff = generateSimpleDiff(originalContent, newContent, bug.file);\n\n // Commit the change\n let commitHash: string | undefined;\n try {\n commitHash = await commitFix(bug);\n } catch {\n // Commit failed but fix was applied\n }\n\n // Track fix in bug status\n markBugAsFixed(bug, commitHash, projectDir);\n\n return {\n success: true,\n diff,\n branchName,\n commitHash,\n };\n}\n\ninterface AgenticResult {\n falsePositive: boolean;\n falsePositiveReason?: string;\n}\n\n/**\n * Run the LLM provider in agentic mode to fix the bug.\n * The provider will explore the codebase and fix the bug directly.\n * If it determines the bug is a false positive, it will report that instead.\n */\nasync function runAgenticFix(\n bug: Bug,\n config: WhiteroseConfig,\n projectDir: string,\n onProgress?: (message: string) => void\n): Promise<AgenticResult> {\n const providerCommand = getProviderCommand(config.provider);\n const prompt = buildAgenticFixPrompt(bug);\n\n // Create an AbortController for reliable timeout handling\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 300000); // 5 minute timeout\n\n // Run the provider\n let stdout = '';\n let stderr = '';\n\n try {\n if (config.provider === 'codex') {\n // Codex requires special handling: exec subcommand with stdin and temp file output\n const tempDir = mkdtempSync(join(tmpdir(), 'whiterose-fix-'));\n const outputFile = join(tempDir, 'output.txt');\n\n try {\n const result = await execa(\n providerCommand,\n [\n 'exec',\n '--full-auto', // Allow workspace writes without approval prompts\n '--skip-git-repo-check',\n '-C', projectDir, // Set working directory for codex\n '-o', outputFile,\n '-', // Read prompt from stdin\n ],\n {\n cwd: projectDir,\n input: prompt, // Pass prompt via stdin\n timeout: 300000,\n env: { ...process.env, NO_COLOR: '1' },\n reject: false,\n cancelSignal: controller.signal,\n }\n );\n\n stderr = result.stderr || '';\n\n // Read output from file if it exists, otherwise use stdout\n if (existsSync(outputFile)) {\n try {\n stdout = readFileSync(outputFile, 'utf-8');\n } catch {\n stdout = result.stdout || '';\n }\n } else {\n stdout = result.stdout || '';\n }\n } finally {\n // Cleanup temp dir\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n } else if (config.provider === 'claude-code') {\n // Claude Code: pass prompt via stdin for reliability (avoids shell escaping and arg length issues)\n // The --dangerously-skip-permissions flag allows edits without prompts\n // Use --output-format stream-json for real-time progress streaming (requires --verbose)\n const args = ['--dangerously-skip-permissions', '-p'];\n if (onProgress) {\n args.push('--verbose', '--output-format', 'stream-json');\n }\n\n const subprocess = execa(\n providerCommand,\n args,\n {\n cwd: projectDir,\n input: prompt, // Pass prompt via stdin (Claude reads from stdin when no prompt arg provided)\n timeout: 300000,\n env: { ...process.env, NO_COLOR: '1' },\n reject: false,\n cancelSignal: controller.signal,\n }\n );\n\n // Stream stdout in real-time if progress callback is provided\n // Only show tool usage events to avoid verbose output\n if (onProgress && subprocess.stdout) {\n let lineBuffer = '';\n subprocess.stdout.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n lineBuffer += text;\n // Process complete lines (stream-json outputs one JSON object per line)\n const lines = lineBuffer.split('\\n');\n lineBuffer = lines.pop() || ''; // Keep incomplete line in buffer\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) {\n try {\n const event = JSON.parse(trimmed);\n // Only show tool_use events - skip all text content to avoid verbose output\n if (event.type === 'assistant' && event.message?.content) {\n for (const block of event.message.content) {\n if (block.type === 'tool_use') {\n // Show tool usage with friendly names\n const toolName = block.name || 'tool';\n const friendlyNames: Record<string, string> = {\n 'Read': 'Reading file',\n 'Edit': 'Editing file',\n 'Write': 'Writing file',\n 'Bash': 'Running command',\n 'Glob': 'Searching files',\n 'Grep': 'Searching content',\n 'Task': 'Running task',\n };\n const displayName = friendlyNames[toolName] || `Using ${toolName}`;\n onProgress(`${displayName}...`);\n }\n }\n }\n } catch {\n // Silently ignore non-JSON lines - don't show raw output\n }\n }\n }\n });\n }\n\n const result = await subprocess;\n stdout = result.stdout || '';\n stderr = result.stderr || '';\n } else if (config.provider === 'gemini') {\n // Gemini CLI: run in prompt mode, it will use tools automatically\n // Pass prompt as positional argument (Gemini may not support stdin)\n const result = await execa(providerCommand, ['-p', prompt], {\n cwd: projectDir,\n timeout: 300000,\n env: { ...process.env, NO_COLOR: '1' },\n reject: false,\n stdin: 'ignore', // Prevent stdin hangs\n cancelSignal: controller.signal,\n });\n stdout = result.stdout || '';\n stderr = result.stderr || '';\n } else if (config.provider === 'aider') {\n // Aider: pass the message and file\n // Aider doesn't support stdin for prompt, use --message flag\n const result = await execa(providerCommand, ['--message', prompt, bug.file], {\n cwd: projectDir,\n timeout: 300000,\n env: { ...process.env, NO_COLOR: '1' },\n reject: false,\n stdin: 'ignore', // Prevent stdin hangs\n cancelSignal: controller.signal,\n });\n stdout = result.stdout || '';\n stderr = result.stderr || '';\n } else {\n // Default: pass prompt as argument with -p flag, ignore stdin to prevent hangs\n const result = await execa(providerCommand, ['-p', prompt], {\n cwd: projectDir,\n timeout: 300000,\n env: { ...process.env, NO_COLOR: '1' },\n reject: false,\n stdin: 'ignore', // Prevent stdin hangs\n cancelSignal: controller.signal,\n });\n stdout = result.stdout || '';\n stderr = result.stderr || '';\n }\n } finally {\n clearTimeout(timeoutId);\n }\n\n // Check for known error patterns (only for actual ENOENT errors, not content)\n if (stderr) {\n const lowerStderr = stderr.toLowerCase();\n // Only throw if it's actually an ENOENT error from execa, not from LLM output\n if (lowerStderr.includes('enoent') && lowerStderr.includes('spawn')) {\n throw new Error(`Provider ${config.provider} not found. Is it installed?`);\n }\n if (lowerStderr.includes('permission denied') && lowerStderr.includes('spawn')) {\n throw new Error('Permission denied. Check provider configuration.');\n }\n }\n\n // Check if LLM reported this as a false positive\n const output = stdout;\n const falsePositiveMatch = output.match(/FALSE_POSITIVE:\\s*(.+?)(?:\\n|$)/i);\n if (falsePositiveMatch) {\n return {\n falsePositive: true,\n falsePositiveReason: falsePositiveMatch[1].trim(),\n };\n }\n\n // Also check for the structured marker\n if (output.includes('###FALSE_POSITIVE###')) {\n const reasonMatch = output.match(/###FALSE_POSITIVE###\\s*(.+?)(?:###|$)/s);\n return {\n falsePositive: true,\n falsePositiveReason: reasonMatch ? reasonMatch[1].trim() : 'Bug was determined to be a false positive after code analysis.',\n };\n }\n\n return { falsePositive: false };\n}\n\n/**\n * Build a prompt for agentic bug fixing.\n * This prompt instructs the AI to explore and fix, not just return code.\n * It also instructs the AI to report if the bug is a false positive.\n */\nfunction buildAgenticFixPrompt(bug: Bug): string {\n const evidenceSection = bug.evidence.length > 0\n ? `\\nEVIDENCE:\\n${bug.evidence.map((e) => `- ${e}`).join('\\n')}`\n : '';\n\n const codePathSection = bug.codePath.length > 0\n ? `\\nCODE PATH:\\n${bug.codePath.map((s) => `${s.step}. ${s.file}:${s.line} - ${s.explanation}`).join('\\n')}`\n : '';\n\n return `Analyze and fix this reported bug.\n\nBUG DETAILS:\n- ID: ${bug.id}\n- Title: ${bug.title}\n- File: ${bug.file}\n- Line: ${bug.line}${bug.endLine ? `-${bug.endLine}` : ''}\n- Category: ${bug.category}\n- Severity: ${bug.severity}\n\nDESCRIPTION:\n${bug.description}\n${evidenceSection}\n${codePathSection}\n\nINSTRUCTIONS:\n1. Read the file ${bug.file} to understand the context\n2. Read any related files if needed to understand the full picture\n3. CRITICALLY VERIFY the bug is real:\n - Check for early returns or guard clauses that make the buggy line unreachable\n - Check for validation/sanitization upstream that prevents the issue\n - Check if framework protections make this safe\n - If the bug is NOT real, report it as a false positive (see below)\n4. If the bug IS real, fix it by editing the file directly\n5. Make minimal changes - only fix the identified bug\n6. Do not refactor or improve other code\n7. Preserve existing code style and formatting\n\nFALSE POSITIVE DETECTION:\nIf after analysis you determine this is NOT a real bug, output this marker instead of fixing:\n###FALSE_POSITIVE###\nReason: [Brief explanation of why this is a false positive]\n###\n\nCommon false positive patterns:\n- Early return: \\`if (arr.length === 0) return;\\` makes later \\`arr[0]\\` SAFE\n- Guard clause: \\`if (!user) throw Error();\\` makes later \\`user.name\\` SAFE\n- Upstream validation that the scanner missed\n- Framework auto-sanitization (ORM, templating engine, etc.)\n\nIf it's a real bug, fix it. If it's a false positive, report it with the marker above.`;\n}\n\n/**\n * Generate a simple unified diff between two strings.\n */\nfunction generateSimpleDiff(original: string, modified: string, filename: string): string {\n const origLines = original.split('\\n');\n const modLines = modified.split('\\n');\n\n const diff: string[] = [\n `--- a/${filename}`,\n `+++ b/${filename}`,\n ];\n\n let inHunk = false;\n let hunkStart = -1;\n let hunkLines: string[] = [];\n\n const flushHunk = () => {\n if (hunkLines.length > 0) {\n diff.push(`@@ -${hunkStart + 1} @@`);\n diff.push(...hunkLines);\n hunkLines = [];\n }\n inHunk = false;\n };\n\n const maxLen = Math.max(origLines.length, modLines.length);\n\n for (let i = 0; i < maxLen; i++) {\n const origLine = origLines[i];\n const modLine = modLines[i];\n\n if (origLine === modLine) {\n if (inHunk) {\n // Add context line\n hunkLines.push(` ${origLine || ''}`);\n // End hunk after 3 context lines\n if (hunkLines.filter(l => l.startsWith(' ')).length >= 3) {\n flushHunk();\n }\n }\n } else {\n if (!inHunk) {\n inHunk = true;\n hunkStart = i;\n // Add leading context\n for (let j = Math.max(0, i - 3); j < i; j++) {\n hunkLines.push(` ${origLines[j] || ''}`);\n }\n }\n\n if (origLine !== undefined && modLine === undefined) {\n hunkLines.push(`-${origLine}`);\n } else if (origLine === undefined && modLine !== undefined) {\n hunkLines.push(`+${modLine}`);\n } else if (origLine !== modLine) {\n hunkLines.push(`-${origLine}`);\n hunkLines.push(`+${modLine}`);\n }\n }\n }\n\n flushHunk();\n\n return diff.length > 2 ? diff.join('\\n') : 'No changes detected';\n}\n\nexport async function batchFix(\n bugs: Bug[],\n config: WhiteroseConfig,\n options: FixOptions\n): Promise<Map<string, FixResult>> {\n const results = new Map<string, FixResult>();\n\n for (const bug of bugs) {\n const result = await applyFix(bug, config, options);\n results.set(bug.id, result);\n\n // If any fix fails in non-dry-run mode, stop\n if (!result.success && !options.dryRun) {\n break;\n }\n }\n\n return results;\n}\n","/* @jsxImportSource react */\nimport { render } from 'ink';\nimport { Bug, WhiteroseConfig } from '../types.js';\nimport { App, FixResultInfo } from './App.js';\nimport { applyFix } from '../core/fixer.js';\nimport { removeBugFromAccumulated } from '../core/bug-merger.js';\n\ninterface FixOptions {\n dryRun: boolean;\n branch?: string;\n}\n\nexport async function startFixTUI(\n bugs: Bug[],\n config: WhiteroseConfig,\n options: FixOptions,\n cwd?: string\n): Promise<void> {\n return new Promise((resolve) => {\n const handleFix = async (bug: Bug, onProgress?: (message: string) => void): Promise<FixResultInfo> => {\n const result = await applyFix(bug, config, { ...options, onProgress });\n\n // Handle false positive - return info so UI can show it\n if (result.falsePositive) {\n // Remove from accumulated list since it's not a real bug\n if (cwd) {\n removeBugFromAccumulated(cwd, bug.id);\n }\n return {\n falsePositive: true,\n falsePositiveReason: result.falsePositiveReason,\n };\n }\n\n // Throw on failure so TUI shows error correctly\n if (!result.success) {\n throw new Error(result.error || 'Fix failed');\n }\n\n // Remove bug from accumulated list after successful fix (not dry-run)\n if (!options.dryRun && cwd) {\n removeBugFromAccumulated(cwd, bug.id);\n }\n\n return { falsePositive: false };\n };\n\n const handleExit = () => {\n resolve();\n };\n\n const { waitUntilExit } = render(\n <App\n bugs={bugs}\n config={config}\n fixOptions={options}\n onFix={handleFix}\n onExit={handleExit}\n />\n );\n\n waitUntilExit().then(resolve).catch(() => resolve());\n });\n}\n\n// Also export a simpler non-interactive mode for CI/scripts\nexport { App } from './App.js';\nexport { Dashboard } from './screens/Dashboard.js';\nexport { BugList } from './screens/BugList.js';\nexport { BugDetail } from './screens/BugDetail.js';\nexport { FixConfirm } from './screens/FixConfirm.js';\n","import * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, readdirSync } from 'fs';\nimport { join, resolve, isAbsolute } from 'path';\nimport { execa } from 'execa';\nimport { Bug, ProviderType, BugCategory, ConfidenceLevel, FindingKind } from '../../types.js';\nimport { loadConfig } from '../../core/config.js';\nimport { startFixTUI } from '../../tui/index.js';\nimport { applyFix, sanitizeSarifText, sanitizeSarifEvidence, sanitizeSarifCodePath } from '../../core/fixer.js';\nimport { loadAccumulatedBugs, removeBugFromAccumulated } from '../../core/bug-merger.js';\nimport { detectProvider } from '../../providers/detect.js';\n\ninterface FixOptions {\n dryRun: boolean;\n branch?: string;\n sarif?: string;\n github?: string;\n describe?: boolean;\n provider?: string;\n}\n\nexport async function fixCommand(bugId: string | undefined, options: FixOptions): Promise<void> {\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n\n // ─────────────────────────────────────────────────────────────\n // Provider Selection (first thing!)\n // ─────────────────────────────────────────────────────────────\n let selectedProvider: ProviderType;\n\n if (options.provider) {\n // Use CLI-specified provider\n selectedProvider = options.provider as ProviderType;\n p.log.info(`Using provider: ${chalk.cyan(selectedProvider)}`);\n } else {\n // Detect and prompt for provider\n const detectSpinner = p.spinner();\n detectSpinner.start('Detecting LLM providers...');\n\n const availableProviders = await detectProvider();\n\n if (availableProviders.length === 0) {\n detectSpinner.stop('No providers found');\n p.log.error('No LLM providers detected on your system.');\n console.log();\n console.log(chalk.dim(' Install one of:'));\n console.log(chalk.dim(' - claude-code: ') + chalk.cyan('npm install -g @anthropic-ai/claude-code'));\n console.log(chalk.dim(' - gemini: ') + chalk.cyan('npm install -g @google/gemini-cli'));\n console.log(chalk.dim(' - aider: ') + chalk.cyan('pip install aider-chat'));\n console.log();\n process.exit(1);\n }\n\n detectSpinner.stop(`Found ${availableProviders.length} provider(s)`);\n\n if (availableProviders.length === 1) {\n selectedProvider = availableProviders[0];\n p.log.info(`Using ${chalk.cyan(selectedProvider)}`);\n } else {\n const providerChoice = await p.select({\n message: 'Select LLM provider for fixing bugs',\n options: availableProviders.map((provider) => ({\n value: provider,\n label: provider,\n hint: provider === 'claude-code' ? 'recommended' : undefined,\n })),\n });\n\n if (p.isCancel(providerChoice)) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n\n selectedProvider = providerChoice as ProviderType;\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Source 1: External SARIF file\n // ─────────────────────────────────────────────────────────────\n if (options.sarif) {\n const sarifPath = isAbsolute(options.sarif) ? options.sarif : resolve(cwd, options.sarif);\n\n if (!existsSync(sarifPath)) {\n p.log.error(`SARIF file not found: ${sarifPath}`);\n process.exit(1);\n }\n\n p.intro(chalk.red('whiterose') + chalk.dim(' - fixing bugs from external SARIF'));\n\n const bugs = loadBugsFromSarif(sarifPath);\n if (bugs.length === 0) {\n p.log.success('No bugs found in SARIF file!');\n process.exit(0);\n }\n\n p.log.info(`Loaded ${bugs.length} bugs from ${options.sarif}`);\n\n // Load config if available (for fix options), or use defaults\n const baseConfig = existsSync(whiterosePath)\n ? await loadConfig(cwd)\n : getDefaultConfig();\n const config = { ...baseConfig, provider: selectedProvider };\n\n return await processBugList(bugs, config, options, bugId);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Source 2: GitHub issue\n // ─────────────────────────────────────────────────────────────\n if (options.github) {\n p.intro(chalk.red('whiterose') + chalk.dim(' - fixing bug from GitHub issue'));\n\n const bug = await loadBugFromGitHub(options.github, cwd);\n if (!bug) {\n p.log.error('Failed to parse GitHub issue as a bug');\n process.exit(1);\n }\n\n p.log.info(`Loaded bug from GitHub: ${bug.title}`);\n\n const baseConfig = existsSync(whiterosePath)\n ? await loadConfig(cwd)\n : getDefaultConfig();\n const config = { ...baseConfig, provider: selectedProvider };\n\n return await fixSingleBug(bug, config, options);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Source 3: Manual description (interactive)\n // ─────────────────────────────────────────────────────────────\n if (options.describe) {\n p.intro(chalk.red('whiterose') + chalk.dim(' - fixing manually described bug'));\n\n const bug = await collectManualBugDescription(cwd);\n if (!bug) {\n p.cancel('Bug description cancelled.');\n process.exit(0);\n }\n\n const baseConfig = existsSync(whiterosePath)\n ? await loadConfig(cwd)\n : getDefaultConfig();\n const config = { ...baseConfig, provider: selectedProvider };\n\n return await fixSingleBug(bug, config, options);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Source 4: Default - accumulated whiterose scan results\n // ─────────────────────────────────────────────────────────────\n\n // Check if initialized\n if (!existsSync(whiterosePath)) {\n p.log.error('whiterose is not initialized in this directory.');\n p.log.info('Run \"whiterose init\" first, or use:');\n p.log.info(' --sarif <path> Fix bugs from an external SARIF file');\n p.log.info(' --github <url> Fix bug from a GitHub issue');\n p.log.info(' --describe Manually describe a bug to fix');\n process.exit(1);\n }\n\n // Load config and override provider with selected one\n const baseConfig = await loadConfig(cwd);\n const config = { ...baseConfig, provider: selectedProvider };\n\n // Load accumulated bugs (union of all scans)\n const accumulatedBugs = loadAccumulatedBugs(cwd);\n\n if (accumulatedBugs.bugs.length > 0) {\n p.intro(chalk.red('whiterose') + chalk.dim(' - fixing accumulated bugs'));\n p.log.info(`Found ${accumulatedBugs.bugs.length} accumulated bugs from all scans`);\n return await processBugList(accumulatedBugs.bugs, config, options, bugId, cwd);\n }\n\n // Fallback to SARIF if no accumulated bugs (legacy support)\n const reportsDir = join(whiterosePath, 'reports');\n if (!existsSync(reportsDir)) {\n p.log.error('No scan results found. Run \"whiterose scan\" first.');\n p.log.info('Or use --sarif, --github, or --describe for external bugs.');\n process.exit(1);\n }\n\n // Get latest SARIF file\n const reports = readdirSync(reportsDir)\n .filter((f) => f.endsWith('.sarif'))\n .sort()\n .reverse();\n\n if (reports.length === 0) {\n p.log.error('No scan results found. Run \"whiterose scan\" first.');\n p.log.info('Or use --sarif, --github, or --describe for external bugs.');\n process.exit(1);\n }\n\n const latestReport = join(reportsDir, reports[0]);\n const bugs = loadBugsFromSarif(latestReport);\n\n return await processBugList(bugs, config, options, bugId);\n}\n\n// ─────────────────────────────────────────────────────────────\n// Bug Loading Functions\n// ─────────────────────────────────────────────────────────────\n\nfunction loadBugsFromSarif(sarifPath: string): Bug[] {\n let sarif: any;\n try {\n sarif = JSON.parse(readFileSync(sarifPath, 'utf-8'));\n } catch (error) {\n throw new Error(`Failed to parse SARIF file: ${sarifPath}. File may be corrupted or malformed.`);\n }\n\n // Validate basic SARIF structure\n if (!sarif || typeof sarif !== 'object') {\n throw new Error(`Invalid SARIF file: ${sarifPath}. Expected a JSON object.`);\n }\n\n const runs = sarif.runs;\n if (!Array.isArray(runs) || runs.length === 0) {\n return []; // Valid SARIF with no runs = no bugs\n }\n\n const results = runs[0]?.results;\n if (!Array.isArray(results)) {\n return []; // Valid SARIF with no results = no bugs\n }\n\n return results.map((r: any, i: number) => {\n // Validate r is an object\n if (!r || typeof r !== 'object') {\n throw new Error(`Invalid SARIF result at index ${i}: expected an object.`);\n }\n\n // Try to extract full bug info from SARIF properties if available\n const props = r.properties || {};\n\n // SECURITY: Sanitize untrusted SARIF fields to prevent prompt injection\n // These fields are embedded into LLM prompts and could contain malicious instructions\n const rawTitle = r.message?.text || 'Unknown bug';\n const rawDescription = r.message?.markdown || r.message?.text || '';\n\n // Build raw code path for sanitization\n const rawCodePath = r.codeFlows?.[0]?.threadFlows?.[0]?.locations?.map((loc: any, idx: number) => ({\n step: idx + 1,\n file: loc.location?.physicalLocation?.artifactLocation?.uri || '',\n line: loc.location?.physicalLocation?.region?.startLine || 0,\n code: '',\n explanation: loc.message?.text || '',\n })) || [];\n\n // Extract and validate file path - must be a string\n const rawFile = r.locations?.[0]?.physicalLocation?.artifactLocation?.uri;\n const file = typeof rawFile === 'string' ? rawFile : 'unknown';\n\n // Extract and validate line number - must be a number\n const rawLine = r.locations?.[0]?.physicalLocation?.region?.startLine;\n const line = typeof rawLine === 'number' && Number.isFinite(rawLine) ? Math.floor(rawLine) : 0;\n\n // Extract and validate endLine - must be a number if present\n const rawEndLine = r.locations?.[0]?.physicalLocation?.region?.endLine;\n const endLine = typeof rawEndLine === 'number' && Number.isFinite(rawEndLine) ? Math.floor(rawEndLine) : undefined;\n\n // Validate ruleId is a string if present\n const rawId = r.ruleId;\n const id = typeof rawId === 'string' ? rawId : `WR-${String(i + 1).padStart(3, '0')}`;\n\n // SECURITY: Validate enum fields against allowed values to prevent injection via props\n // These fields are embedded into the agentic prompt and must be validated\n const validatedKind = FindingKind.safeParse(props.kind);\n const validatedCategory = BugCategory.safeParse(props.category);\n const validatedConfidence = ConfidenceLevel.safeParse(props.confidence);\n\n return {\n id,\n title: sanitizeSarifText(String(rawTitle), 'title'),\n description: sanitizeSarifText(String(rawDescription), 'description'),\n file,\n line,\n endLine,\n kind: validatedKind.success ? validatedKind.data : 'bug',\n severity: mapSarifLevel(r.level),\n category: validatedCategory.success ? validatedCategory.data : 'logic-error',\n confidence: {\n overall: validatedConfidence.success ? validatedConfidence.data : 'medium',\n codePathValidity: typeof props.codePathValidity === 'number' ? props.codePathValidity : 0.8,\n reachability: typeof props.reachability === 'number' ? props.reachability : 0.8,\n intentViolation: typeof props.intentViolation === 'boolean' ? props.intentViolation : false,\n staticToolSignal: typeof props.staticToolSignal === 'boolean' ? props.staticToolSignal : false,\n adversarialSurvived: typeof props.adversarialSurvived === 'boolean' ? props.adversarialSurvived : false,\n },\n codePath: sanitizeSarifCodePath(rawCodePath),\n evidence: sanitizeSarifEvidence(props.evidence),\n suggestedFix: props.suggestedFix ? sanitizeSarifText(String(props.suggestedFix), 'suggestedFix') : undefined,\n createdAt: new Date().toISOString(),\n status: 'open',\n };\n });\n}\n\nasync function loadBugFromGitHub(issueUrl: string, cwd: string): Promise<Bug | null> {\n try {\n // Parse the issue URL: https://github.com/owner/repo/issues/123\n const match = issueUrl.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/issues\\/(\\d+)/);\n if (!match) {\n p.log.error('Invalid GitHub issue URL format. Expected: https://github.com/owner/repo/issues/123');\n return null;\n }\n\n const [, owner, repo, issueNumber] = match;\n\n // Use gh CLI to fetch issue details\n const { stdout } = await execa('gh', [\n 'issue', 'view', issueNumber,\n '--repo', `${owner}/${repo}`,\n '--json', 'title,body,labels'\n ], { cwd });\n\n const issue = JSON.parse(stdout);\n\n // Parse file and line from issue body (common patterns)\n const fileMatch = issue.body?.match(/(?:file|path|location):\\s*[`\"]?([^\\s`\"]+)[`\"]?/i) ||\n issue.body?.match(/```[\\w]*\\n(?:\\/\\/|#)\\s*([^\\s:]+):(\\d+)/);\n const lineMatch = issue.body?.match(/(?:line|L|:)(\\d+)/);\n\n // Determine severity from labels\n let severity: 'critical' | 'high' | 'medium' | 'low' = 'medium';\n const labels = issue.labels?.map((l: any) => l.name.toLowerCase()) || [];\n if (labels.some((l: string) => l.includes('critical') || l.includes('security'))) {\n severity = 'critical';\n } else if (labels.some((l: string) => l.includes('bug') || l.includes('high'))) {\n severity = 'high';\n } else if (labels.some((l: string) => l.includes('low') || l.includes('minor'))) {\n severity = 'low';\n }\n\n // Determine category from labels (using valid BugCategory values)\n let category: Bug['category'] = 'logic-error';\n if (labels.some((l: string) => l.includes('security') || l.includes('injection') || l.includes('xss') || l.includes('sql'))) {\n category = 'injection';\n } else if (labels.some((l: string) => l.includes('auth') || l.includes('permission'))) {\n category = 'auth-bypass';\n } else if (labels.some((l: string) => l.includes('null') || l.includes('undefined'))) {\n category = 'null-reference';\n } else if (labels.some((l: string) => l.includes('async') || l.includes('race') || l.includes('promise'))) {\n category = 'async-issue';\n } else if (labels.some((l: string) => l.includes('leak') || l.includes('memory'))) {\n category = 'resource-leak';\n }\n\n // SECURITY: Sanitize untrusted GitHub issue content to prevent prompt injection\n // Issue title and body are external, low-privilege input that gets embedded\n // in the agentic fix prompt, which runs with elevated write permissions\n const sanitizedTitle = sanitizeSarifText(String(issue.title || ''), 'github.title');\n const sanitizedBody = sanitizeSarifText(String(issue.body || ''), 'github.body');\n\n return {\n id: `GH-${issueNumber}`,\n title: sanitizedTitle,\n description: sanitizedBody || sanitizedTitle,\n file: fileMatch?.[1] || '',\n line: parseInt(lineMatch?.[1] || '1', 10),\n kind: 'bug',\n severity,\n category,\n confidence: {\n overall: 'medium',\n codePathValidity: 0.5,\n reachability: 0.5,\n intentViolation: false,\n staticToolSignal: false,\n adversarialSurvived: false,\n },\n codePath: [],\n evidence: [`GitHub issue: ${issueUrl}`],\n createdAt: new Date().toISOString(),\n status: 'open',\n };\n } catch (error: any) {\n if (error.message?.includes('gh')) {\n p.log.error('GitHub CLI (gh) is required for --github option.');\n p.log.info('Install it: https://cli.github.com/');\n } else {\n p.log.error(`Failed to fetch GitHub issue: ${error.message}`);\n }\n return null;\n }\n}\n\nasync function collectManualBugDescription(cwd: string): Promise<Bug | null> {\n // Get file path\n const file = await p.text({\n message: 'File path containing the bug:',\n placeholder: 'src/components/Button.tsx',\n validate: (value) => {\n if (!value) return 'File path is required';\n const fullPath = isAbsolute(value) ? value : resolve(cwd, value);\n if (!existsSync(fullPath)) return `File not found: ${value}`;\n return undefined;\n },\n });\n\n if (p.isCancel(file)) return null;\n\n // Get line number\n const lineStr = await p.text({\n message: 'Line number (approximate is fine):',\n placeholder: '42',\n validate: (value) => {\n if (!value) return 'Line number is required';\n if (isNaN(parseInt(value, 10))) return 'Must be a number';\n return undefined;\n },\n });\n\n if (p.isCancel(lineStr)) return null;\n\n // Get bug title\n const title = await p.text({\n message: 'Bug title (brief description):',\n placeholder: 'Null reference when user is not logged in',\n });\n\n if (p.isCancel(title)) return null;\n\n // Get detailed description\n const description = await p.text({\n message: 'Detailed description (what happens, how to trigger):',\n placeholder: 'When user.profile is accessed before login check, TypeError is thrown',\n });\n\n if (p.isCancel(description)) return null;\n\n // Get severity\n const severity = await p.select({\n message: 'Bug severity:',\n options: [\n { value: 'critical', label: 'Critical', hint: 'security issue, data loss' },\n { value: 'high', label: 'High', hint: 'crash, incorrect behavior' },\n { value: 'medium', label: 'Medium', hint: 'bug with workaround' },\n { value: 'low', label: 'Low', hint: 'minor issue' },\n ],\n initialValue: 'medium',\n });\n\n if (p.isCancel(severity)) return null;\n\n // Get category (using valid BugCategory enum values)\n const category = await p.select({\n message: 'Bug category:',\n options: [\n { value: 'logic-error', label: 'Logic Error' },\n { value: 'null-reference', label: 'Null Reference' },\n { value: 'injection', label: 'Injection (SQL, XSS, etc.)' },\n { value: 'auth-bypass', label: 'Auth Bypass' },\n { value: 'async-issue', label: 'Async/Race Condition' },\n { value: 'boundary-error', label: 'Boundary/Edge Case' },\n { value: 'type-coercion', label: 'Type Coercion' },\n { value: 'data-validation', label: 'Data Validation' },\n { value: 'resource-leak', label: 'Resource Leak' },\n { value: 'concurrency', label: 'Concurrency' },\n { value: 'intent-violation', label: 'Intent Violation' },\n { value: 'secrets-exposure', label: 'Secrets Exposure' },\n ],\n initialValue: 'logic-error',\n });\n\n if (p.isCancel(category)) return null;\n\n const filePath = isAbsolute(file) ? file : resolve(cwd, file);\n const relativePath = filePath.startsWith(cwd) ? filePath.slice(cwd.length + 1) : filePath;\n\n return {\n id: `MANUAL-${Date.now()}`,\n title: title || 'Manual bug',\n description: description || title || 'Manual bug',\n file: relativePath,\n line: parseInt(lineStr || '1', 10),\n kind: 'bug',\n severity: severity as Bug['severity'],\n category: category as Bug['category'],\n confidence: {\n overall: 'high', // User-reported bugs are high confidence\n codePathValidity: 1,\n reachability: 1,\n intentViolation: true,\n staticToolSignal: false,\n adversarialSurvived: false,\n },\n codePath: [],\n evidence: ['Manually reported by user'],\n createdAt: new Date().toISOString(),\n status: 'open',\n };\n}\n\nfunction getDefaultConfig() {\n // Return minimal config for external bug sources when whiterose isn't initialized\n return {\n version: '1',\n provider: 'claude-code' as const,\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: ['node_modules', 'dist', 'build'],\n priorities: {},\n categories: ['injection', 'auth-bypass', 'secrets-exposure', 'null-reference', 'boundary-error', 'resource-leak', 'async-issue', 'logic-error', 'data-validation', 'type-coercion', 'concurrency', 'intent-violation'],\n minConfidence: 'low' as const,\n staticAnalysis: { typescript: true, eslint: true },\n output: { sarif: true, markdown: true, sarifPath: '.whiterose/reports', markdownPath: 'BUGS.md' },\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Bug Processing Functions\n// ─────────────────────────────────────────────────────────────\n\nasync function processBugList(\n bugs: Bug[],\n config: any,\n options: FixOptions,\n bugId: string | undefined,\n cwd?: string\n): Promise<void> {\n if (bugs.length === 0) {\n p.log.success('No bugs to fix!');\n process.exit(0);\n }\n\n // If specific bug ID provided, fix just that bug\n if (bugId) {\n const bug = bugs.find((b) => b.id === bugId || b.id.toLowerCase() === bugId.toLowerCase());\n if (!bug) {\n p.log.error(`Bug ${bugId} not found.`);\n p.log.info('Available bugs: ' + bugs.map((b) => b.id).join(', '));\n process.exit(1);\n }\n\n return await fixSingleBug(bug, config, options, cwd);\n }\n\n // Launch interactive TUI (pass cwd for bug removal after fix)\n try {\n await startFixTUI(bugs, config, options, cwd);\n } catch (error: any) {\n // If Ink fails (e.g., not a TTY), fall back to simple mode\n if (error.message?.includes('stdin') || error.message?.includes('TTY')) {\n p.log.warn('Interactive mode not available. Use \"whiterose fix <bug-id>\" to fix specific bugs.');\n p.log.info('Available bugs:');\n for (const bug of bugs) {\n const severityColor = bug.severity === 'critical' ? 'red' : bug.severity === 'high' ? 'yellow' : 'blue';\n console.log(` ${chalk[severityColor]('●')} ${bug.id}: ${bug.title}`);\n }\n } else {\n throw error;\n }\n }\n}\n\nasync function fixSingleBug(bug: Bug, config: any, options: FixOptions, cwd?: string): Promise<void> {\n p.intro(chalk.red('whiterose') + chalk.dim(' - fixing bug'));\n\n // Check if file is specified (needed for fixing)\n if (!bug.file) {\n const file = await p.text({\n message: 'File path containing the bug (required for fix):',\n placeholder: 'src/components/Button.tsx',\n });\n\n if (p.isCancel(file) || !file) {\n p.cancel('Fix cancelled - file path required.');\n process.exit(0);\n }\n\n bug.file = file;\n }\n\n // Show bug details\n console.log();\n console.log(chalk.bold(` ${bug.id}: ${bug.title}`));\n console.log(` ${chalk.dim('File:')} ${bug.file}:${bug.line}`);\n console.log(` ${chalk.dim('Severity:')} ${bug.severity}`);\n console.log();\n console.log(` ${bug.description}`);\n console.log();\n\n if (bug.suggestedFix) {\n console.log(chalk.dim(' Suggested fix:'));\n console.log(` ${chalk.green(bug.suggestedFix)}`);\n console.log();\n }\n\n // Confirm fix\n if (!options.dryRun) {\n const confirm = await p.confirm({\n message: 'Apply this fix?',\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.cancel('Fix cancelled.');\n process.exit(0);\n }\n }\n\n // Apply fix\n console.log();\n console.log(chalk.cyan(' ◆ Starting agentic fix...'));\n console.log();\n\n try {\n // Track last message to avoid duplicates\n let lastMessage = '';\n\n // Pass onProgress callback to show streaming updates from the LLM\n const result = await applyFix(bug, config, {\n ...options,\n onProgress: (message) => {\n // Only show if message is different from last (avoid spam)\n if (message !== lastMessage) {\n lastMessage = message;\n // Clear line and show new message (truncate to terminal width)\n const truncated = message.length > 72 ? message.substring(0, 72) + '...' : message;\n process.stdout.write(`\\r\\x1b[K ${chalk.dim('›')} ${chalk.gray(truncated)}`);\n }\n },\n });\n\n // Clear the progress line and show success\n process.stdout.write('\\r\\x1b[K');\n\n if (result.success) {\n console.log(chalk.green(' ✓ Fix applied successfully'));\n\n if (result.diff) {\n console.log();\n console.log(chalk.dim(' Changes:'));\n for (const line of result.diff.split('\\n')) {\n if (line.startsWith('+')) {\n console.log(chalk.green(` ${line}`));\n } else if (line.startsWith('-')) {\n console.log(chalk.red(` ${line}`));\n } else {\n console.log(chalk.dim(` ${line}`));\n }\n }\n console.log();\n }\n\n if (result.branchName) {\n p.log.info(`Changes committed to branch: ${result.branchName}`);\n }\n\n // Remove bug from accumulated list after successful fix (not dry-run)\n if (!options.dryRun && cwd) {\n const removed = removeBugFromAccumulated(cwd, bug.id);\n if (removed) {\n p.log.info(`Bug ${bug.id} removed from accumulated bug list`);\n }\n }\n\n p.outro(chalk.green('Fix complete!'));\n } else {\n console.log(chalk.red(' ✗ Fix failed'));\n p.log.error(result.error || 'Unknown error');\n process.exit(1);\n }\n } catch (error: any) {\n console.log(chalk.red(' ✗ Fix failed'));\n p.log.error(error.message);\n process.exit(1);\n }\n}\n\nfunction mapSarifLevel(level: string): 'critical' | 'high' | 'medium' | 'low' {\n switch (level) {\n case 'error':\n return 'high';\n case 'warning':\n return 'medium';\n case 'note':\n return 'low';\n default:\n return 'medium';\n }\n}\n","import * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { loadConfig } from '../../core/config.js';\nimport { getExecutor } from '../../providers/executors/index.js';\nimport { CoreScanner } from '../../core/scanner.js';\nimport { scanCodebase } from '../../core/scanner/index.js';\nimport { generateIntentDocument } from '../../core/contracts/intent.js';\n\ninterface RefreshOptions {\n keepConfig: boolean;\n}\n\nexport async function refreshCommand(_options: RefreshOptions): Promise<void> {\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n\n // Check if initialized\n if (!existsSync(whiterosePath)) {\n p.log.error('whiterose is not initialized in this directory.');\n p.log.info('Run \"whiterose init\" first.');\n process.exit(1);\n }\n\n p.intro(chalk.red('whiterose') + chalk.dim(' - refreshing understanding'));\n\n // Load config\n const config = await loadConfig(cwd);\n\n // Scan codebase\n const scanSpinner = p.spinner();\n scanSpinner.start('Scanning codebase...');\n const files = await scanCodebase(cwd, config);\n scanSpinner.stop(`Found ${files.length} source files`);\n\n // Generate new understanding\n const understandingSpinner = p.spinner();\n understandingSpinner.start('Regenerating understanding with AI...');\n\n try {\n const executor = getExecutor(config.provider);\n const scanner = new CoreScanner(executor, {}, {\n onProgress: (message: string) => {\n if (message.trim()) {\n understandingSpinner.message(message);\n }\n },\n });\n const understanding = await scanner.generateUnderstanding(files);\n\n // Write new understanding\n writeFileSync(\n join(whiterosePath, 'cache', 'understanding.json'),\n JSON.stringify(understanding, null, 2),\n 'utf-8'\n );\n\n // Regenerate intent.md\n const intentDoc = generateIntentDocument(understanding);\n writeFileSync(join(whiterosePath, 'intent.md'), intentDoc, 'utf-8');\n\n // Reset file hashes\n writeFileSync(\n join(whiterosePath, 'cache', 'file-hashes.json'),\n JSON.stringify({ version: '1', fileHashes: [], lastFullScan: new Date().toISOString() }, null, 2),\n 'utf-8'\n );\n\n understandingSpinner.stop('Understanding regenerated');\n } catch (error) {\n understandingSpinner.stop('Failed to regenerate understanding');\n p.log.error(String(error));\n process.exit(1);\n }\n\n p.outro(chalk.green('Refresh complete!'));\n}\n","import * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, readdirSync, statSync } from 'fs';\nimport { join, basename } from 'path';\nimport { loadConfig, loadUnderstanding } from '../../core/config.js';\nimport { detectProvider } from '../../providers/detect.js';\nimport { getAccumulatedBugsStats } from '../../core/bug-merger.js';\nimport { ScanResult } from '../../types.js';\nimport { renderScanCard, renderStatusCard, CardData } from '../components/card.js';\nimport { formatDuration } from '../components/progress.js';\n\n/**\n * Get repository name from git or directory name\n */\nfunction getRepoName(cwd: string): string {\n try {\n const gitConfigPath = join(cwd, '.git', 'config');\n if (existsSync(gitConfigPath)) {\n const config = readFileSync(gitConfigPath, 'utf-8');\n const match = config.match(/url\\s*=\\s*.*[/:]([^/]+?)(?:\\.git)?$/m);\n if (match) return match[1];\n }\n } catch {\n // Fall through to basename\n }\n return basename(cwd);\n}\n\nexport async function statusCommand(): Promise<void> {\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n\n // Check if initialized\n if (!existsSync(whiterosePath)) {\n p.log.error('whiterose is not initialized in this directory.');\n p.log.info('Run \"whiterose init\" first.');\n process.exit(1);\n }\n\n console.log();\n console.log(chalk.red.bold('whiterose') + chalk.dim(' status'));\n console.log();\n\n // Load config\n const config = await loadConfig(cwd);\n const repoName = getRepoName(cwd);\n\n // Try to load last scan result for the card\n const lastScanPath = join(whiterosePath, 'last-scan.json');\n let lastScan: ScanResult | null = null;\n\n if (existsSync(lastScanPath)) {\n try {\n lastScan = JSON.parse(readFileSync(lastScanPath, 'utf-8')) as ScanResult;\n } catch {\n // Corrupted file, ignore\n }\n }\n\n // Show the card if we have a recent scan\n if (lastScan && lastScan.meta) {\n const cardData: CardData = {\n meta: lastScan.meta,\n bugs: lastScan.summary.bugs,\n smells: lastScan.summary.smells,\n reportPath: './whiterose-output/bugs-human.md',\n };\n console.log(renderScanCard(cardData));\n console.log();\n console.log(chalk.dim(`Last scan: ${new Date(lastScan.timestamp).toLocaleString()}`));\n } else {\n // Show minimal status card\n const bugStats = getAccumulatedBugsStats(cwd);\n const totalBugs = bugStats.bySeverity ? Object.values(bugStats.bySeverity).reduce((a, b) => a + b, 0) : 0;\n\n console.log(renderStatusCard(\n repoName,\n config.provider,\n totalBugs,\n 0, // No smell tracking in accumulated bugs\n bugStats.lastUpdated ? new Date(bugStats.lastUpdated).toLocaleDateString() : undefined\n ));\n }\n\n console.log();\n\n // Detect available providers\n const availableProviders = await detectProvider();\n\n console.log(chalk.dim('Configuration'));\n console.log(` Provider: ${config.provider}`);\n console.log(` Available: ${availableProviders.join(', ') || 'none'}`);\n console.log();\n\n // Load understanding if available\n const understanding = await loadUnderstanding(cwd);\n if (understanding) {\n console.log(chalk.dim('Codebase'));\n console.log(` Type: ${understanding.summary.type}`);\n console.log(` Framework: ${understanding.summary.framework || 'none'}`);\n console.log(` Files: ${understanding.structure.totalFiles}`);\n console.log(` Features: ${understanding.features.length}`);\n console.log(` Contracts: ${understanding.contracts.length}`);\n console.log();\n }\n\n // Check cache status\n const hashesPath = join(whiterosePath, 'cache', 'file-hashes.json');\n if (existsSync(hashesPath)) {\n try {\n const hashes = JSON.parse(readFileSync(hashesPath, 'utf-8'));\n console.log(chalk.dim('Cache'));\n console.log(` Files tracked: ${hashes.fileHashes?.length || 0}`);\n console.log(` Last full: ${hashes.lastFullScan ? new Date(hashes.lastFullScan).toLocaleDateString() : 'never'}`);\n console.log();\n } catch {\n // Corrupted cache file, skip\n }\n }\n\n // Footer\n const bugStats = getAccumulatedBugsStats(cwd);\n if (bugStats.total > 0) {\n console.log(chalk.dim('Run \"whiterose fix\" to fix bugs, or \"whiterose clear\" to reset'));\n } else {\n console.log(chalk.dim('Run \"whiterose scan\" to scan for bugs'));\n }\n console.log();\n}\n","import * as p from '@clack/prompts';\nimport { existsSync, readFileSync, writeFileSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { outputMarkdown } from '../../output/markdown.js';\nimport { ScanResult, Bug } from '../../types.js';\n\ninterface ReportOptions {\n output: string;\n format: 'markdown' | 'sarif' | 'json';\n}\n\nexport async function reportCommand(options: ReportOptions): Promise<void> {\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n\n // Check if initialized\n if (!existsSync(whiterosePath)) {\n p.log.error('whiterose is not initialized in this directory.');\n p.log.info('Run \"whiterose init\" first.');\n process.exit(1);\n }\n\n // Find latest scan result\n const reportsDir = join(whiterosePath, 'reports');\n if (!existsSync(reportsDir)) {\n p.log.error('No scan results found. Run \"whiterose scan\" first.');\n process.exit(1);\n }\n\n const reports = readdirSync(reportsDir)\n .filter((f) => f.endsWith('.sarif'))\n .sort()\n .reverse();\n\n if (reports.length === 0) {\n p.log.error('No scan results found. Run \"whiterose scan\" first.');\n process.exit(1);\n }\n\n const latestReport = join(reportsDir, reports[0]);\n let sarif: any;\n try {\n sarif = JSON.parse(readFileSync(latestReport, 'utf-8'));\n } catch (error) {\n p.log.error(`Failed to parse SARIF report: ${latestReport}`);\n process.exit(1);\n }\n\n // Convert SARIF to ScanResult\n const bugs: Bug[] = sarif.runs?.[0]?.results?.map((r: any, i: number) => ({\n id: r.ruleId || `WR-${String(i + 1).padStart(3, '0')}`,\n title: r.message?.text || 'Unknown bug',\n description: r.message?.markdown || r.message?.text || '',\n file: r.locations?.[0]?.physicalLocation?.artifactLocation?.uri || 'unknown',\n line: r.locations?.[0]?.physicalLocation?.region?.startLine || 0,\n kind: 'bug',\n severity: r.level === 'error' ? 'high' : r.level === 'warning' ? 'medium' : 'low',\n category: 'logic-error',\n confidence: { overall: 'high', codePathValidity: 0.9, reachability: 0.9, intentViolation: false, staticToolSignal: false, adversarialSurvived: true },\n codePath: [],\n evidence: [],\n createdAt: new Date().toISOString(),\n status: 'open',\n })) || [];\n\n const bugItems = bugs.filter((b) => b.kind === 'bug');\n const smellItems = bugs.filter((b) => b.kind === 'smell');\n\n const result: ScanResult = {\n id: 'report',\n timestamp: new Date().toISOString(),\n scanType: 'full',\n filesScanned: 0,\n duration: 0,\n bugs,\n summary: {\n bugs: {\n critical: bugItems.filter((b) => b.severity === 'critical').length,\n high: bugItems.filter((b) => b.severity === 'high').length,\n medium: bugItems.filter((b) => b.severity === 'medium').length,\n low: bugItems.filter((b) => b.severity === 'low').length,\n total: bugItems.length,\n },\n smells: {\n critical: smellItems.filter((b) => b.severity === 'critical').length,\n high: smellItems.filter((b) => b.severity === 'high').length,\n medium: smellItems.filter((b) => b.severity === 'medium').length,\n low: smellItems.filter((b) => b.severity === 'low').length,\n total: smellItems.length,\n },\n total: bugs.length,\n },\n };\n\n // Generate output\n let output: string;\n switch (options.format) {\n case 'markdown':\n output = outputMarkdown(result);\n break;\n case 'sarif':\n output = readFileSync(latestReport, 'utf-8');\n break;\n case 'json':\n output = JSON.stringify(result, null, 2);\n break;\n default:\n output = outputMarkdown(result);\n }\n\n // Write or print\n if (options.output === '-') {\n console.log(output);\n } else {\n writeFileSync(options.output, output);\n p.log.success(`Report written to ${options.output}`);\n }\n}\n","import * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, rmSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { clearAccumulatedBugs, getAccumulatedBugsStats } from '../../core/bug-merger.js';\n\ninterface ClearOptions {\n force: boolean;\n}\n\nexport async function clearCommand(options: ClearOptions): Promise<void> {\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n\n // Check if initialized\n if (!existsSync(whiterosePath)) {\n p.log.error('whiterose is not initialized in this directory.');\n p.log.info('Run \"whiterose init\" first.');\n process.exit(1);\n }\n\n // Get current stats\n const stats = getAccumulatedBugsStats(cwd);\n\n if (stats.total === 0) {\n p.log.info('No accumulated bugs to clear.');\n process.exit(0);\n }\n\n p.intro(chalk.red('whiterose') + chalk.dim(' - clear accumulated bugs'));\n\n // Show current state\n console.log();\n console.log(chalk.bold(' Current accumulated bugs:'));\n console.log(` Total: ${stats.total}`);\n if (Object.keys(stats.bySeverity).length > 0) {\n console.log(' By severity:');\n for (const [severity, count] of Object.entries(stats.bySeverity)) {\n const color = severity === 'critical' ? 'red' : severity === 'high' ? 'yellow' : 'blue';\n console.log(` ${chalk[color]('●')} ${severity}: ${count}`);\n }\n }\n console.log(` Last updated: ${new Date(stats.lastUpdated).toLocaleString()}`);\n console.log();\n\n // Confirm unless --force\n if (!options.force) {\n const confirm = await p.confirm({\n message: `Clear all ${stats.total} accumulated bugs?`,\n initialValue: false,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.cancel('Clear cancelled.');\n process.exit(0);\n }\n }\n\n // Clear the bugs\n clearAccumulatedBugs(cwd);\n\n // Also clear SARIF reports (fallback source for fix command)\n const reportsDir = join(whiterosePath, 'reports');\n if (existsSync(reportsDir)) {\n const sarifFiles = readdirSync(reportsDir).filter(f => f.endsWith('.sarif'));\n for (const file of sarifFiles) {\n rmSync(join(reportsDir, file));\n }\n if (sarifFiles.length > 0) {\n p.log.info(`Cleared ${sarifFiles.length} SARIF report(s).`);\n }\n }\n\n // Clear output directory\n const outputDir = join(cwd, 'whiterose-output');\n if (existsSync(outputDir)) {\n rmSync(outputDir, { recursive: true });\n p.log.info('Cleared whiterose-output directory.');\n }\n\n p.log.success(`Cleared ${stats.total} accumulated bugs.`);\n p.log.info('Run \"whiterose scan\" to start fresh.');\n\n p.outro(chalk.green('Done'));\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as p from '@clack/prompts';\nimport { existsSync, readFileSync } from 'fs';\nimport { join, basename, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { initCommand } from './commands/init.js';\nimport { scanCommand } from './commands/scan.js';\nimport { fixCommand } from './commands/fix.js';\nimport { refreshCommand } from './commands/refresh.js';\nimport { statusCommand } from './commands/status.js';\nimport { reportCommand } from './commands/report.js';\nimport { clearCommand } from './commands/clear.js';\nimport { detectProvider } from '../providers/detect.js';\nimport { ProviderType } from '../types.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst pkg = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));\n\n// Increase max listeners to avoid warning when spawning multiple child processes\nprocess.setMaxListeners(50);\n\nconst BANNER = `\n${chalk.red('██╗ ██╗██╗ ██╗██╗████████╗███████╗██████╗ ██████╗ ███████╗███████╗')}\n${chalk.red('██║ ██║██║ ██║██║╚══██╔══╝██╔════╝██╔══██╗██╔═══██╗██╔════╝██╔════╝')}\n${chalk.red('██║ █╗ ██║███████║██║ ██║ █████╗ ██████╔╝██║ ██║███████╗█████╗ ')}\n${chalk.red('██║███╗██║██╔══██║██║ ██║ ██╔══╝ ██╔══██╗██║ ██║╚════██║██╔══╝ ')}\n${chalk.red('╚███╔███╔╝██║ ██║██║ ██║ ███████╗██║ ██║╚██████╔╝███████║███████╗')}\n${chalk.red(' ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚══════╝')}\n\n${chalk.dim(' \"I\\'ve been staring at your code for a long time.\"')}\n`;\n\nconst program = new Command();\n\nprogram\n .name('whiterose')\n .description('AI-powered bug hunter that uses your existing LLM subscription')\n .version(pkg.version)\n .hook('preAction', () => {\n // Show banner only for main commands, not help\n const args = process.argv.slice(2);\n if (!args.includes('--help') && !args.includes('-h') && args.length > 0) {\n console.log(BANNER);\n }\n });\n\n// ─────────────────────────────────────────────────────────────\n// init - First-time setup with intelligent onboarding\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('init')\n .description('Initialize whiterose for this project (scans codebase, generates config)')\n .option('-p, --provider <provider>', 'LLM provider to use', 'claude-code')\n .option('--force', 'Overwrite existing .whiterose directory')\n .option('--ci', 'CI mode: non-interactive, use defaults (same as --skip-questions)')\n .option('--skip-questions', 'Skip interactive questions, use defaults')\n .action(initCommand);\n\n// ─────────────────────────────────────────────────────────────\n// scan - Find bugs\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('scan [paths...]')\n .description('Scan for bugs in the codebase (includes inline validation)')\n .option('-f, --full', 'Force full scan (ignore cache)')\n .option('--json', 'Output as JSON only')\n .option('--sarif', 'Output as SARIF only')\n .option('-p, --provider <provider>', 'Override LLM provider')\n .option('-c, --category <categories...>', 'Filter by bug categories')\n .option('--min-confidence <level>', 'Minimum confidence level to report', 'low')\n .option('--ci', 'CI mode: non-interactive, exit code 1 if bugs found (for CI/CD and git hooks)')\n .option('--quick', 'Quick scan: fast parallel analysis without init (for pre-commit hooks)')\n .option('--phase <phase>', 'Run specific phase only: unit, integration, e2e, or all (default: all)')\n .action(scanCommand);\n\n// ─────────────────────────────────────────────────────────────\n// fix - Interactive bug fixing TUI\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('fix [bugId]')\n .description('Fix bugs interactively or by ID')\n .option('-p, --provider <provider>', 'LLM provider to use for fixing')\n .option('--dry-run', 'Show proposed fixes without applying')\n .option('--branch <name>', 'Create fixes in a new branch')\n .option('--sarif <path>', 'Load bugs from an external SARIF file')\n .option('--github <url>', 'Load bug from a GitHub issue URL')\n .option('--describe', 'Manually describe a bug to fix')\n .option('--unsafe', 'Skip all permission prompts (full trust mode)')\n .action(fixCommand);\n\n// ─────────────────────────────────────────────────────────────\n// refresh - Rebuild understanding from scratch\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('refresh')\n .description('Rebuild codebase understanding from scratch')\n .option('--keep-config', 'Keep existing config, only regenerate understanding')\n .action(refreshCommand);\n\n// ─────────────────────────────────────────────────────────────\n// status - Show cache and scan status\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('status')\n .description('Show whiterose status (cache, last scan, provider)')\n .action(statusCommand);\n\n// ─────────────────────────────────────────────────────────────\n// report - Generate bug report\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('report')\n .description('Generate BUGS.md from last scan')\n .option('-o, --output <path>', 'Output path', 'BUGS.md')\n .option('--format <format>', 'Output format (markdown, sarif, json)', 'markdown')\n .action(reportCommand);\n\n// ─────────────────────────────────────────────────────────────\n// clear - Clear accumulated bugs\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('clear')\n .description('Clear accumulated bug list (start fresh)')\n .option('--force', 'Skip confirmation prompt')\n .action(clearCommand);\n\n// ─────────────────────────────────────────────────────────────\n// Auto-run: Minimal questions, maximum action\n// ─────────────────────────────────────────────────────────────\nasync function autoRun(): Promise<void> {\n console.log(BANNER);\n\n p.intro(chalk.red('whiterose') + chalk.dim(' - AI Bug Hunter'));\n\n // Check if current directory looks like a project\n const cwd = process.cwd();\n const looksLikeProject = existsSync(join(cwd, 'package.json')) ||\n existsSync(join(cwd, 'go.mod')) ||\n existsSync(join(cwd, 'Cargo.toml')) ||\n existsSync(join(cwd, 'requirements.txt')) ||\n existsSync(join(cwd, 'pyproject.toml')) ||\n existsSync(join(cwd, '.git')) ||\n existsSync(join(cwd, 'src'));\n\n let targetPath = cwd;\n\n // If current dir doesn't look like a project, ask for path\n if (!looksLikeProject) {\n const { pathInput } = await import('./utils/path-input.js');\n const inputPath = await pathInput({\n message: 'Enter project path',\n defaultValue: cwd,\n validate: (value) => {\n const path = value || cwd;\n if (!existsSync(path)) {\n return 'Directory does not exist';\n }\n return undefined;\n },\n });\n\n if (inputPath === null) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n\n targetPath = inputPath || cwd;\n process.chdir(targetPath);\n }\n\n const projectName = basename(targetPath);\n const whiterosePath = join(targetPath, '.whiterose');\n const isInitialized = existsSync(whiterosePath);\n\n // ─────────────────────────────────────────────────────────────\n // Detect and select provider\n // ─────────────────────────────────────────────────────────────\n const detectSpinner = p.spinner();\n detectSpinner.start('Detecting LLM providers...');\n\n const availableProviders = await detectProvider();\n\n if (availableProviders.length === 0) {\n detectSpinner.stop('No providers found');\n p.log.error('No LLM providers detected on your system.');\n console.log();\n console.log(chalk.dim(' Install one of:'));\n console.log(chalk.dim(' - claude-code: ') + chalk.cyan('npm install -g @anthropic-ai/claude-code'));\n console.log(chalk.dim(' - aider: ') + chalk.cyan('pip install aider-chat'));\n console.log();\n process.exit(1);\n }\n\n detectSpinner.stop(`Found ${availableProviders.length} provider(s)`);\n\n let selectedProvider: ProviderType;\n\n if (availableProviders.length === 1) {\n selectedProvider = availableProviders[0];\n p.log.info(`Using ${chalk.cyan(selectedProvider)}`);\n } else {\n const providerChoice = await p.select({\n message: 'Select LLM provider',\n options: availableProviders.map((provider) => ({\n value: provider,\n label: provider,\n hint: provider === 'claude-code' ? 'recommended' : undefined,\n })),\n });\n\n if (p.isCancel(providerChoice)) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n\n selectedProvider = providerChoice as ProviderType;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Auto-initialize if needed\n // ─────────────────────────────────────────────────────────────\n if (!isInitialized) {\n p.log.step(`Initializing whiterose for \"${projectName}\"...`);\n console.log();\n\n await initCommand({\n provider: selectedProvider,\n skipQuestions: true, // No questions, use defaults\n force: false,\n unsafe: false,\n skipProviderDetection: true,\n });\n\n console.log();\n }\n\n // ─────────────────────────────────────────────────────────────\n // Start bug hunting\n // ─────────────────────────────────────────────────────────────\n p.log.step('Starting bug hunt...');\n console.log();\n\n await scanCommand([], {\n full: true,\n json: false,\n sarif: false,\n provider: selectedProvider,\n category: undefined,\n minConfidence: 'low',\n });\n}\n\n// Auto-run when no command provided\nif (process.argv.length === 2) {\n autoRun().catch((error) => {\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n });\n} else {\n program.parse();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/utils/path-input.ts","../../src/providers/detect.ts","../../src/providers/executors/claude-code.ts","../../src/providers/executors/codex.ts","../../src/providers/executors/gemini.ts","../../src/providers/executors/aider.ts","../../src/providers/executors/ollama.ts","../../src/providers/executors/opencode.ts","../../src/providers/executors/index.ts","../../src/providers/prompts/flow-analysis-prompts.ts","../../src/providers/prompts/cwe-patterns.ts","../../src/providers/prompts/multipass-prompts.ts","../../src/providers/prompts/constants.ts","../../src/providers/prompts/understanding.ts","../../src/core/multipass-scanner.ts","../../src/core/flow-analyzer.ts","../../src/core/utils.ts","../../src/core/scanner.ts","../../src/core/scanner/index.ts","../../src/core/contracts/intent.ts","../../src/core/docs.ts","../../src/cli/commands/init.ts","../../src/types.ts","../../src/core/config.ts","../../src/analysis/static.ts","../../src/output/sarif.ts","../../src/output/markdown.ts","../../src/output/human-readable.ts","../../src/core/bug-merger.ts","../../src/core/cross-file-analyzer.ts","../../src/core/contract-analyzer.ts","../../src/core/findings.ts","../../src/cli/components/progress.ts","../../src/cli/components/card.ts","../../src/cli/commands/scan.ts","../../src/tui/screens/Dashboard.tsx","../../src/tui/screens/BugList.tsx","../../src/tui/screens/BugDetail.tsx","../../src/tui/screens/FixConfirm.tsx","../../src/tui/App.tsx","../../src/core/git.ts","../../src/core/bug-status.ts","../../src/core/fixer.ts","../../src/tui/index.tsx","../../src/cli/commands/fix.ts","../../src/cli/commands/refresh.ts","../../src/cli/commands/status.ts","../../src/cli/commands/report.ts","../../src/cli/commands/clear.ts","../../src/cli/index.ts"],"names":["resolve","existsSync","statSync","dirname","basename","readdirSync","chalk","execa","join","p","fg","readFileSync","line","writeFileSync","rmSync","YAML","relative","mkdirSync","p2","normalizeFilePath","isAbsolute","text","formatCategory","useState","useInput","jsxs","Box","jsx","Text","getSeverityColor","getConfidenceColor","Fragment","newContent","mkdtempSync","tmpdir","bugs","baseConfig","config","confirm","p4","getRepoName","p5","bugStats","p6","p7","__filename","__dirname","p8","pathInput"],"mappings":"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","file":"index.js","sourcesContent":["import { readdirSync, statSync, existsSync } from 'fs';\nimport { dirname, basename, resolve } from 'path';\nimport chalk from 'chalk';\nimport * as readline from 'readline';\n\n/**\n * Get directory completions for a partial path\n */\nfunction getPathCompletions(partial: string): string[] {\n try {\n if (!partial) partial = '.';\n\n const resolved = resolve(partial);\n let dir: string;\n let prefix: string;\n\n // Check if partial is a directory (ends with / or is a directory)\n if (partial.endsWith('/') || (existsSync(resolved) && statSync(resolved).isDirectory())) {\n dir = resolved;\n prefix = '';\n } else {\n dir = dirname(resolved);\n prefix = basename(partial);\n }\n\n if (!existsSync(dir)) {\n return [];\n }\n\n const entries = readdirSync(dir, { withFileTypes: true });\n const matches = entries\n .filter((entry) => entry.isDirectory())\n .filter((entry) => entry.name.toLowerCase().startsWith(prefix.toLowerCase()))\n .filter((entry) => !entry.name.startsWith('.') || prefix.startsWith('.'))\n .map((entry) => {\n if (partial.endsWith('/') || prefix === '') {\n return partial + entry.name + '/';\n }\n const base = partial.slice(0, partial.length - prefix.length);\n return base + entry.name + '/';\n })\n .sort();\n\n return matches;\n } catch {\n return [];\n }\n}\n\n/**\n * Find longest common prefix among strings\n */\nfunction longestCommonPrefix(strings: string[]): string {\n if (strings.length === 0) return '';\n if (strings.length === 1) return strings[0];\n\n let prefix = strings[0];\n for (let i = 1; i < strings.length; i++) {\n while (!strings[i].startsWith(prefix)) {\n prefix = prefix.slice(0, -1);\n if (prefix === '') return '';\n }\n }\n return prefix;\n}\n\nexport interface PathInputOptions {\n message: string;\n defaultValue?: string;\n validate?: (path: string) => string | undefined;\n}\n\n/**\n * Prompt for a path with Tab completion (bash-style)\n */\nexport function pathInput(options: PathInputOptions): Promise<string | null> {\n return new Promise((resolvePromise) => {\n const { message, defaultValue = '', validate } = options;\n\n // Display prompt\n const promptText = chalk.cyan('◆') + ' ' + chalk.bold(message);\n const hint = defaultValue ? chalk.dim(` (default: ${defaultValue})`) : '';\n const tabHint = chalk.dim(' [Tab to autocomplete]');\n\n process.stdout.write(promptText + hint + tabHint + '\\n');\n process.stdout.write(chalk.cyan('│') + ' ');\n\n let input = '';\n let cursorPos = 0;\n\n // Enable raw mode for key-by-key input\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n process.stdin.setEncoding('utf8');\n\n const redrawLine = () => {\n // Clear current line and redraw\n readline.clearLine(process.stdout, 0);\n readline.cursorTo(process.stdout, 0);\n process.stdout.write(chalk.cyan('│') + ' ' + input);\n // Position cursor\n readline.cursorTo(process.stdout, 2 + cursorPos);\n };\n\n const cleanup = () => {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n process.stdin.pause();\n process.stdin.removeAllListeners('data');\n };\n\n const finish = (result: string | null) => {\n cleanup();\n console.log(); // New line after input\n resolvePromise(result);\n };\n\n process.stdin.on('data', (key: string) => {\n const code = key.charCodeAt(0);\n\n // Ctrl+C - cancel\n if (code === 3) {\n console.log();\n finish(null);\n return;\n }\n\n // Enter - submit\n if (code === 13) {\n const finalPath = input.trim() || defaultValue;\n\n if (validate) {\n const error = validate(finalPath);\n if (error) {\n console.log();\n process.stdout.write(chalk.red('│') + ' ' + chalk.red(error) + '\\n');\n process.stdout.write(chalk.cyan('│') + ' ' + input);\n return;\n }\n }\n\n finish(finalPath);\n return;\n }\n\n // Tab - autocomplete\n if (code === 9) {\n const completions = getPathCompletions(input || '.');\n\n if (completions.length === 1) {\n // Single match - complete it\n input = completions[0];\n cursorPos = input.length;\n redrawLine();\n } else if (completions.length > 1) {\n // Multiple matches - complete common prefix and show options\n const common = longestCommonPrefix(completions);\n if (common.length > input.length) {\n input = common;\n cursorPos = input.length;\n redrawLine();\n } else {\n // Show available completions\n console.log();\n const maxShow = 10;\n const shown = completions.slice(0, maxShow);\n process.stdout.write(chalk.dim('│ ') + shown.map(c => chalk.cyan(basename(c.slice(0, -1)))).join(' '));\n if (completions.length > maxShow) {\n process.stdout.write(chalk.dim(` ... +${completions.length - maxShow} more`));\n }\n console.log();\n process.stdout.write(chalk.cyan('│') + ' ' + input);\n }\n }\n return;\n }\n\n // Backspace\n if (code === 127 || code === 8) {\n if (cursorPos > 0) {\n input = input.slice(0, cursorPos - 1) + input.slice(cursorPos);\n cursorPos--;\n redrawLine();\n }\n return;\n }\n\n // Arrow keys (escape sequences)\n if (key === '\\u001b[D') {\n // Left arrow\n if (cursorPos > 0) {\n cursorPos--;\n redrawLine();\n }\n return;\n }\n if (key === '\\u001b[C') {\n // Right arrow\n if (cursorPos < input.length) {\n cursorPos++;\n redrawLine();\n }\n return;\n }\n\n // Ignore other escape sequences\n if (key.startsWith('\\u001b')) {\n return;\n }\n\n // Regular character - insert at cursor position\n if (code >= 32 && code < 127) {\n input = input.slice(0, cursorPos) + key + input.slice(cursorPos);\n cursorPos++;\n redrawLine();\n }\n });\n });\n}\n","import { execa } from 'execa';\nimport { existsSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { ProviderType } from '../types.js';\n\ninterface ProviderCheck {\n name: ProviderType;\n command: string;\n args: string[];\n // Common installation paths to check\n paths?: string[];\n}\n\nconst providerChecks: ProviderCheck[] = [\n {\n name: 'claude-code',\n command: 'claude',\n args: ['--version'],\n paths: [\n join(homedir(), '.local', 'bin', 'claude'),\n '/usr/local/bin/claude',\n '/opt/homebrew/bin/claude',\n ],\n },\n {\n name: 'aider',\n command: 'aider',\n args: ['--version'],\n paths: [\n join(homedir(), '.local', 'bin', 'aider'),\n '/usr/local/bin/aider',\n '/opt/homebrew/bin/aider',\n ],\n },\n {\n name: 'codex',\n command: 'codex',\n args: ['--version'],\n paths: [\n join(homedir(), '.local', 'bin', 'codex'),\n '/usr/local/bin/codex',\n '/opt/homebrew/bin/codex',\n ],\n },\n {\n name: 'opencode',\n command: 'opencode',\n args: ['--version'],\n paths: [\n join(homedir(), '.local', 'bin', 'opencode'),\n '/usr/local/bin/opencode',\n '/opt/homebrew/bin/opencode',\n ],\n },\n {\n name: 'gemini',\n command: 'gemini',\n args: ['--version'],\n paths: [\n join(homedir(), '.local', 'bin', 'gemini'),\n '/usr/local/bin/gemini',\n '/opt/homebrew/bin/gemini',\n ],\n },\n {\n name: 'ollama',\n command: 'ollama',\n args: ['--version'],\n paths: [\n join(homedir(), '.local', 'bin', 'ollama'),\n '/usr/local/bin/ollama',\n '/opt/homebrew/bin/ollama',\n ],\n },\n];\n\n// Cache resolved command paths\nconst resolvedPaths: Map<ProviderType, string> = new Map();\n\n/**\n * Find the actual command path, checking common installation locations\n */\nasync function findCommand(check: ProviderCheck): Promise<string | null> {\n // First try the command directly (in case it's in PATH)\n try {\n await execa(check.command, check.args, { timeout: 5000 });\n return check.command;\n } catch {\n // Not in PATH, check common paths\n }\n\n // Check common installation paths\n if (check.paths) {\n for (const path of check.paths) {\n if (existsSync(path)) {\n try {\n await execa(path, check.args, { timeout: 5000 });\n return path;\n } catch {\n // Path exists but command failed, continue\n }\n }\n }\n }\n\n return null;\n}\n\nexport async function detectProvider(): Promise<ProviderType[]> {\n const available: ProviderType[] = [];\n\n for (const check of providerChecks) {\n const commandPath = await findCommand(check);\n if (commandPath) {\n resolvedPaths.set(check.name, commandPath);\n available.push(check.name);\n }\n }\n\n return available;\n}\n\nexport async function isProviderAvailable(name: ProviderType): Promise<boolean> {\n const check = providerChecks.find((c) => c.name === name);\n if (!check) return false;\n\n const commandPath = await findCommand(check);\n if (commandPath) {\n resolvedPaths.set(name, commandPath);\n return true;\n }\n return false;\n}\n\n/**\n * Get the resolved command path for a provider.\n * Returns the cached path if available, otherwise uses the default command name.\n */\nexport function getProviderCommand(name: ProviderType): string {\n // Check if we have a cached resolved path\n const cached = resolvedPaths.get(name);\n if (cached) return cached;\n\n // Fallback to the provider's expected command name\n const check = providerChecks.find((c) => c.name === name);\n return check?.command || name;\n}\n","/**\n * Claude Code Executor - Simple prompt execution\n *\n * This is a \"dumb\" executor that just runs prompts via Claude CLI.\n * All scanning logic lives in CoreScanner.\n */\n\nimport { execa } from 'execa';\nimport { PromptExecutor, PromptOptions, PromptResult } from '../../core/scanner.js';\nimport { isProviderAvailable, getProviderCommand } from '../detect.js';\n\nconst CLAUDE_TIMEOUT = 300000; // 5 minutes\n\nexport class ClaudeCodeExecutor implements PromptExecutor {\n name = 'claude-code';\n\n async isAvailable(): Promise<boolean> {\n return isProviderAvailable('claude-code');\n }\n\n async runPrompt(prompt: string, options: PromptOptions): Promise<PromptResult> {\n const claudeCommand = getProviderCommand('claude-code');\n\n if (process.env.WHITEROSE_DEBUG) {\n console.log('\\n[DEBUG] Running Claude Code command:', claudeCommand);\n console.log('[DEBUG] Prompt length:', prompt.length);\n console.log('[DEBUG] CWD:', options.cwd);\n console.log('[DEBUG] First 500 chars of prompt:');\n console.log(prompt.substring(0, 500));\n }\n\n try {\n const { stdout, stderr } = await execa(\n claudeCommand,\n [\n '-p', prompt,\n '--dangerously-skip-permissions', // Allow file reads without prompts\n '--output-format', 'text', // Ensure non-interactive output\n ],\n {\n cwd: options.cwd,\n timeout: options.timeout || CLAUDE_TIMEOUT,\n env: {\n ...process.env,\n NO_COLOR: '1',\n },\n reject: false,\n stdin: 'ignore', // Prevent waiting for stdin\n }\n );\n\n // Check for API errors in stderr before returning\n if (stderr) {\n // Rate limit errors\n if (stderr.includes('429') || stderr.includes('rate limit') || stderr.includes('too many requests')) {\n throw new Error('Claude API rate limit reached. Try again later.');\n }\n // Authentication errors\n if (stderr.includes('401') || stderr.includes('unauthorized') || stderr.includes('invalid api key')) {\n throw new Error('Claude API authentication failed. Check your API key.');\n }\n // Credit/billing errors\n if (stderr.includes('402') || stderr.includes('insufficient') || stderr.includes('billing')) {\n throw new Error('Claude API billing error. Check your account credits.');\n }\n // Generic errors that indicate complete failure\n if (stderr.includes('Error:') && !stdout) {\n throw new Error(`Claude Code error: ${stderr.substring(0, 200)}`);\n }\n }\n\n // Debug: log output and errors\n if (process.env.WHITEROSE_DEBUG) {\n console.log('\\n[DEBUG] Claude Code stdout length:', stdout?.length || 0);\n console.log('[DEBUG] Claude Code stderr:', stderr?.substring(0, 300) || '(none)');\n console.log('[DEBUG] First 1000 chars of stdout:');\n console.log(stdout?.substring(0, 1000) || '(empty)');\n console.log('[DEBUG] End response\\n');\n }\n\n return {\n output: stdout || '',\n error: stderr || undefined,\n };\n } catch (error: any) {\n if (error.message?.includes('ENOENT')) {\n throw new Error('Claude Code not found. Install: npm install -g @anthropic-ai/claude-code');\n }\n throw error;\n }\n }\n}\n","/**\n * Codex Executor - Simple prompt execution\n *\n * This is a \"dumb\" executor that just runs prompts via Codex CLI.\n * All scanning logic lives in CoreScanner.\n */\n\nimport { execa } from 'execa';\nimport { mkdtempSync, rmSync, existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { tmpdir } from 'os';\nimport { PromptExecutor, PromptOptions, PromptResult } from '../../core/scanner.js';\nimport { isProviderAvailable, getProviderCommand } from '../detect.js';\n\nconst CODEX_TIMEOUT = 300000; // 5 minutes\n\nexport class CodexExecutor implements PromptExecutor {\n name = 'codex';\n\n async isAvailable(): Promise<boolean> {\n return isProviderAvailable('codex');\n }\n\n async runPrompt(prompt: string, options: PromptOptions): Promise<PromptResult> {\n const codexCommand = getProviderCommand('codex');\n const tempDir = mkdtempSync(join(tmpdir(), 'whiterose-codex-'));\n const outputFile = join(tempDir, 'output.txt');\n\n try {\n const { stdout, stderr } = await execa(\n codexCommand,\n [\n 'exec',\n '--skip-git-repo-check',\n '-o', outputFile,\n '-', // Read from stdin\n ],\n {\n cwd: options.cwd,\n input: prompt,\n timeout: options.timeout || CODEX_TIMEOUT,\n env: {\n ...process.env,\n NO_COLOR: '1',\n },\n reject: false,\n }\n );\n\n // Check for API errors in stderr before processing output\n if (stderr) {\n // Rate limit / usage limit errors\n if (stderr.includes('429') || stderr.includes('usage_limit') || stderr.includes('rate limit')) {\n throw new Error('Codex API rate limit reached. Try again later or upgrade your plan.');\n }\n // Authentication errors\n if (stderr.includes('401') || stderr.includes('unauthorized') || stderr.includes('authentication')) {\n throw new Error('Codex API authentication failed. Check your API key.');\n }\n // Generic API errors\n if (stderr.includes('ERROR:') || stderr.includes('error=http')) {\n // Extract the error message\n const errorMatch = stderr.match(/ERROR:\\s*(.+?)(?:\\n|$)/i) || stderr.match(/error=(.+?)(?:\\n|$)/);\n const errorMsg = errorMatch ? errorMatch[1].trim() : stderr.substring(0, 200);\n throw new Error(`Codex API error: ${errorMsg}`);\n }\n }\n\n // Try to read from output file first\n let output = stdout || '';\n if (existsSync(outputFile)) {\n try {\n output = readFileSync(outputFile, 'utf-8');\n } catch {\n // Fall back to stdout\n }\n }\n\n return {\n output,\n error: stderr || undefined,\n };\n } catch (error: any) {\n if (error.message?.includes('ENOENT')) {\n throw new Error('Codex not found. Install: npm install -g @openai/codex');\n }\n throw error;\n } finally {\n // Cleanup\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n}\n","/**\n * Gemini Executor - Simple prompt execution\n *\n * This is a \"dumb\" executor that just runs prompts via Gemini CLI.\n * All scanning logic lives in CoreScanner.\n */\n\nimport { execa } from 'execa';\nimport { PromptExecutor, PromptOptions, PromptResult } from '../../core/scanner.js';\nimport { isProviderAvailable, getProviderCommand } from '../detect.js';\n\nconst GEMINI_TIMEOUT = 300000; // 5 minutes\n\nexport class GeminiExecutor implements PromptExecutor {\n name = 'gemini';\n\n async isAvailable(): Promise<boolean> {\n return isProviderAvailable('gemini');\n }\n\n async runPrompt(prompt: string, options: PromptOptions): Promise<PromptResult> {\n const geminiCommand = getProviderCommand('gemini');\n\n try {\n const { stdout, stderr } = await execa(\n geminiCommand,\n ['-p', prompt],\n {\n cwd: options.cwd,\n timeout: options.timeout || GEMINI_TIMEOUT,\n env: {\n ...process.env,\n NO_COLOR: '1',\n },\n reject: false,\n }\n );\n\n // Check for API errors in stderr before returning\n if (stderr) {\n // Rate limit errors\n if (stderr.includes('429') || stderr.includes('rate limit') || stderr.includes('quota exceeded')) {\n throw new Error('Gemini API rate limit reached. Try again later.');\n }\n // Authentication errors\n if (stderr.includes('401') || stderr.includes('403') || stderr.includes('unauthorized') || stderr.includes('invalid api key')) {\n throw new Error('Gemini API authentication failed. Check your API key.');\n }\n // Generic errors that indicate complete failure\n if ((stderr.includes('Error') || stderr.includes('error')) && !stdout) {\n throw new Error(`Gemini error: ${stderr.substring(0, 200)}`);\n }\n }\n\n return {\n output: stdout || '',\n error: stderr || undefined,\n };\n } catch (error: any) {\n if (error.message?.includes('ENOENT')) {\n throw new Error('Gemini CLI not found. Install: npm install -g @google/gemini-cli');\n }\n throw error;\n }\n }\n}\n","/**\n * Aider Executor - Simple prompt execution\n *\n * This is a \"dumb\" executor that just runs prompts via Aider CLI.\n * All scanning logic lives in CoreScanner.\n *\n * Note: Aider is primarily designed for editing files, but we use\n * its --message mode for analysis prompts.\n */\n\nimport { execa } from 'execa';\nimport { PromptExecutor, PromptOptions, PromptResult } from '../../core/scanner.js';\nimport { isProviderAvailable, getProviderCommand } from '../detect.js';\n\nconst AIDER_TIMEOUT = 300000; // 5 minutes\n\nexport class AiderExecutor implements PromptExecutor {\n name = 'aider';\n\n async isAvailable(): Promise<boolean> {\n return isProviderAvailable('aider');\n }\n\n async runPrompt(prompt: string, options: PromptOptions): Promise<PromptResult> {\n const aiderCommand = getProviderCommand('aider');\n\n try {\n const { stdout, stderr } = await execa(\n aiderCommand,\n [\n '--message', prompt,\n '--no-auto-commits',\n '--yes', // Auto-confirm\n ],\n {\n cwd: options.cwd,\n timeout: options.timeout || AIDER_TIMEOUT,\n env: {\n ...process.env,\n NO_COLOR: '1',\n },\n reject: false,\n }\n );\n\n // Check for API errors in stderr before returning\n if (stderr) {\n // Rate limit errors (aider uses OpenAI/Anthropic/etc APIs)\n if (stderr.includes('429') || stderr.includes('rate limit') || stderr.includes('RateLimitError')) {\n throw new Error('Aider API rate limit reached. Try again later.');\n }\n // Authentication errors\n if (stderr.includes('401') || stderr.includes('AuthenticationError') || stderr.includes('invalid api key')) {\n throw new Error('Aider API authentication failed. Check your API key.');\n }\n // Credit/billing errors\n if (stderr.includes('402') || stderr.includes('insufficient') || stderr.includes('billing')) {\n throw new Error('Aider API billing error. Check your account credits.');\n }\n // Generic errors that indicate complete failure\n if ((stderr.includes('Error') || stderr.includes('error')) && !stdout) {\n throw new Error(`Aider error: ${stderr.substring(0, 200)}`);\n }\n }\n\n return {\n output: stdout || '',\n error: stderr || undefined,\n };\n } catch (error: any) {\n if (error.message?.includes('ENOENT')) {\n throw new Error('Aider not found. Install: pip install aider-chat');\n }\n throw error;\n }\n }\n}\n","/**\n * Ollama Executor - Local LLM support\n *\n * Runs prompts via local Ollama server.\n * Requires: ollama installed and a model pulled (e.g., ollama pull codellama)\n */\n\nimport { execa } from 'execa';\nimport { PromptExecutor, PromptOptions, PromptResult } from '../../core/scanner.js';\nimport { isProviderAvailable, getProviderCommand } from '../detect.js';\n\nconst OLLAMA_TIMEOUT = 600000; // 10 minutes (local models can be slow)\nconst DEFAULT_MODEL = 'codellama'; // Good for code analysis\n\nexport class OllamaExecutor implements PromptExecutor {\n name = 'ollama';\n private model: string;\n\n constructor(model: string = DEFAULT_MODEL) {\n this.model = model;\n }\n\n async isAvailable(): Promise<boolean> {\n return isProviderAvailable('ollama');\n }\n\n async runPrompt(prompt: string, options: PromptOptions): Promise<PromptResult> {\n const ollamaCommand = getProviderCommand('ollama');\n\n try {\n const { stdout, stderr } = await execa(\n ollamaCommand,\n ['run', this.model, prompt],\n {\n cwd: options.cwd,\n timeout: options.timeout || OLLAMA_TIMEOUT,\n env: {\n ...process.env,\n NO_COLOR: '1',\n },\n reject: false,\n }\n );\n\n // Check for errors in stderr before returning\n if (stderr) {\n // Connection errors (ollama server not running)\n if (stderr.includes('connection refused') || stderr.includes('ECONNREFUSED')) {\n throw new Error('Ollama server not running. Start it with: ollama serve');\n }\n // Model not found\n if (stderr.includes('model') && (stderr.includes('not found') || stderr.includes('does not exist'))) {\n throw new Error(`Ollama model '${this.model}' not found. Run: ollama pull ${this.model}`);\n }\n // Out of memory\n if (stderr.includes('out of memory') || stderr.includes('OOM')) {\n throw new Error('Ollama out of memory. Try a smaller model or increase system memory.');\n }\n // Generic errors that indicate complete failure\n if ((stderr.includes('Error') || stderr.includes('error')) && !stdout) {\n throw new Error(`Ollama error: ${stderr.substring(0, 200)}`);\n }\n }\n\n return {\n output: stdout || '',\n error: stderr || undefined,\n };\n } catch (error: any) {\n if (error.message?.includes('ENOENT')) {\n throw new Error('Ollama not found. Install from: https://ollama.ai');\n }\n if (error.message?.includes('model') && error.message?.includes('not found')) {\n throw new Error(`Ollama model '${this.model}' not found. Run: ollama pull ${this.model}`);\n }\n throw error;\n }\n }\n}\n","/**\n * OpenCode Executor - Simple prompt execution\n *\n * This is a \"dumb\" executor that just runs prompts via OpenCode CLI.\n * All scanning logic lives in CoreScanner.\n */\n\nimport { execa } from 'execa';\nimport { PromptExecutor, PromptOptions, PromptResult } from '../../core/scanner.js';\nimport { isProviderAvailable, getProviderCommand } from '../detect.js';\n\nconst OPENCODE_TIMEOUT = 300000; // 5 minutes\n\nexport class OpenCodeExecutor implements PromptExecutor {\n name = 'opencode';\n\n async isAvailable(): Promise<boolean> {\n return isProviderAvailable('opencode');\n }\n\n async runPrompt(prompt: string, options: PromptOptions): Promise<PromptResult> {\n const command = getProviderCommand('opencode');\n\n try {\n const { stdout, stderr } = await execa(\n command,\n ['run', prompt],\n {\n cwd: options.cwd,\n timeout: options.timeout || OPENCODE_TIMEOUT,\n env: {\n ...process.env,\n NO_COLOR: '1',\n },\n reject: false,\n stdin: 'ignore',\n }\n );\n\n // Check for API errors in stderr before returning\n if (stderr) {\n // Rate limit errors\n if (stderr.includes('429') || stderr.includes('rate limit') || stderr.includes('quota exceeded')) {\n throw new Error('OpenCode API rate limit reached. Try again later.');\n }\n // Authentication errors\n if (stderr.includes('401') || stderr.includes('403') || stderr.includes('unauthorized') || stderr.includes('invalid api key')) {\n throw new Error('OpenCode API authentication failed. Check your API key.');\n }\n // Generic errors that indicate complete failure\n if ((stderr.includes('Error') || stderr.includes('error')) && !stdout) {\n throw new Error(`OpenCode error: ${stderr.substring(0, 200)}`);\n }\n }\n\n return {\n output: stdout || '',\n error: stderr || undefined,\n };\n } catch (error: any) {\n if (error.message?.includes('ENOENT')) {\n throw new Error('OpenCode CLI not found. Install: curl -fsSL https://opencode.ai/install | bash');\n }\n throw error;\n }\n }\n}\n","/**\n * Provider Executors - Simple prompt execution implementations\n *\n * All executors implement the PromptExecutor interface.\n * No scanning logic - just run prompts and return results.\n */\n\nimport { PromptExecutor } from '../../core/scanner.js';\nimport { ClaudeCodeExecutor } from './claude-code.js';\nimport { CodexExecutor } from './codex.js';\nimport { GeminiExecutor } from './gemini.js';\nimport { AiderExecutor } from './aider.js';\nimport { OllamaExecutor } from './ollama.js';\nimport { OpenCodeExecutor } from './opencode.js';\nimport { ProviderType } from '../../types.js';\n\nconst executors: Record<string, () => PromptExecutor> = {\n 'claude-code': () => new ClaudeCodeExecutor(),\n 'codex': () => new CodexExecutor(),\n 'gemini': () => new GeminiExecutor(),\n 'aider': () => new AiderExecutor(),\n 'ollama': () => new OllamaExecutor(),\n 'opencode': () => new OpenCodeExecutor(),\n};\n\n/**\n * Get a prompt executor by provider name\n */\nexport function getExecutor(name: ProviderType): PromptExecutor {\n const factory = executors[name];\n if (!factory) {\n throw new Error(`Unknown provider: ${name}. Available: ${Object.keys(executors).join(', ')}`);\n }\n return factory();\n}\n\n/**\n * Get all available executors\n */\nexport async function getAvailableExecutors(): Promise<PromptExecutor[]> {\n const available: PromptExecutor[] = [];\n\n for (const factory of Object.values(executors)) {\n const executor = factory();\n if (await executor.isAvailable()) {\n available.push(executor);\n }\n }\n\n return available;\n}\n\nexport { ClaudeCodeExecutor } from './claude-code.js';\nexport { CodexExecutor } from './codex.js';\nexport { GeminiExecutor } from './gemini.js';\nexport { AiderExecutor } from './aider.js';\nexport { OllamaExecutor } from './ollama.js';\nexport { OpenCodeExecutor } from './opencode.js';\n","/**\n * Flow Analysis Prompts - Integration & E2E Bug Hunting\n *\n * These prompts tell Claude to TRACE actual code flows, not just pattern match.\n * This is the difference between finding \"there's a SQL query here\" and\n * finding \"user input from /api/users reaches this SQL query without validation\".\n */\n\nimport { FlowPassConfig } from '../../core/flow-analyzer.js';\n\nexport interface StaticFinding {\n tool: string;\n file: string;\n line: number;\n message: string;\n severity: string;\n}\n\nexport interface FlowPromptContext {\n pass: FlowPassConfig;\n projectType: string;\n framework: string;\n language: string;\n totalFiles: number;\n entryPoints?: string[];\n previousFindings?: Array<{\n title: string;\n file: string;\n line: number;\n category: string;\n severity: string;\n }>;\n staticFindings?: StaticFinding[];\n}\n\n/**\n * Build a flow analysis prompt that actually traces code paths\n */\nexport function buildFlowAnalysisPrompt(ctx: FlowPromptContext): string {\n const { pass, projectType, framework, language, totalFiles, entryPoints, previousFindings, staticFindings } = ctx;\n\n const entryPointsSection = entryPoints?.length\n ? `\n## SUGGESTED STARTING POINTS\n${entryPoints.map(e => `- ${e}`).join('\\n')}\n`\n : '';\n\n const previousFindingsSection = previousFindings?.length\n ? `\n## PREVIOUS FINDINGS TO BUILD ON\nThese issues were found in earlier passes. Use them to find chains and deeper issues:\n${previousFindings.map(f => `- [${f.severity}] ${f.title} at ${f.file}:${f.line} (${f.category})`).join('\\n')}\n`\n : '';\n\n const staticSection = staticFindings?.length\n ? `\n## STATIC ANALYSIS SIGNALS (from tsc/eslint - run BEFORE you)\n${staticFindings.slice(0, 15).map(f => `- ${f.tool}: ${f.file}:${f.line} - ${f.message}`).join('\\n')}\n${staticFindings.length > 15 ? `... and ${staticFindings.length - 15} more` : ''}\n\nNOTE: Static tools already verified control flow. Don't report issues they would have caught.\n`\n : '';\n\n const levelDescription = pass.level === 'integration'\n ? 'how components interact across the codebase'\n : 'complete attack scenarios from start to exploitation';\n\n return `You are a security auditor doing ${pass.level.toUpperCase()}-LEVEL analysis.\n\n## YOUR MISSION: ${pass.name.toUpperCase()}\n${pass.description}\n\nYou are looking at ${levelDescription}. This is NOT pattern matching - you must TRACE actual code paths.\n\n## PROJECT CONTEXT\n- Type: ${projectType}\n- Framework: ${framework || 'Unknown'}\n- Language: ${language}\n- Size: ${totalFiles} files\n${entryPointsSection}\n${previousFindingsSection}\n${staticSection}\n## WHAT YOU'RE LOOKING FOR\n${pass.whatToFind.map(w => `- ${w}`).join('\\n')}\n\n## HOW TO DO THIS ANALYSIS\n\n${pass.traceInstructions}\n\n## ENTRY POINTS TO START FROM\n${pass.entryPointPatterns.map(p => `- ${p}`).join('\\n')}\n\n## EXAMPLE VULNERABILITY\nThis is what a real finding looks like for this pass:\n\n\\`\\`\\`\n${pass.exampleVulnerability}\n\\`\\`\\`\n\n## CRITICAL: TRACE, DON'T PATTERN MATCH\n\n❌ WRONG: \"I found exec() in this file, might be command injection\"\n✅ RIGHT: \"User input from req.query.cmd at routes/admin.ts:15 flows through\n buildCommand() at utils/cmd.ts:42 and reaches exec() at utils/cmd.ts:58\n without any sanitization. The full path is:\n 1. routes/admin.ts:15 - cmd = req.query.cmd (user input)\n 2. routes/admin.ts:18 - adminService.runCommand(cmd)\n 3. services/admin.ts:23 - buildCommand(cmd)\n 4. utils/cmd.ts:42 - return 'ls ' + directory (concatenation!)\n 5. utils/cmd.ts:58 - exec(command) (SINK)\n Trigger: GET /admin/run?cmd=; rm -rf /\"\n\n## REPORTING FORMAT\n\nWhen you find a CONFIRMED flow vulnerability:\n\n<json>\n{\n \"type\": \"bug\",\n \"data\": {\n \"file\": \"src/routes/admin.ts\",\n \"line\": 15,\n \"endLine\": 18,\n \"title\": \"Command injection via admin endpoint\",\n \"description\": \"User input from req.query.cmd reaches exec() without sanitization through a 5-step call chain.\",\n \"category\": \"injection\",\n \"severity\": \"critical\",\n \"confidence\": \"high\",\n \"flowType\": \"${pass.level}\",\n \"passName\": \"${pass.name}\",\n \"dataFlow\": [\n {\"step\": 1, \"file\": \"src/routes/admin.ts\", \"line\": 15, \"code\": \"const cmd = req.query.cmd\", \"type\": \"source\", \"explanation\": \"User input enters the system\"},\n {\"step\": 2, \"file\": \"src/routes/admin.ts\", \"line\": 18, \"code\": \"adminService.runCommand(cmd)\", \"type\": \"propagation\", \"explanation\": \"Passed to service layer\"},\n {\"step\": 3, \"file\": \"src/services/admin.ts\", \"line\": 23, \"code\": \"buildCommand(cmd)\", \"type\": \"propagation\", \"explanation\": \"Passed to utility function\"},\n {\"step\": 4, \"file\": \"src/utils/cmd.ts\", \"line\": 42, \"code\": \"return 'ls ' + directory\", \"type\": \"transformation\", \"explanation\": \"Concatenated into command string - NO SANITIZATION\"},\n {\"step\": 5, \"file\": \"src/utils/cmd.ts\", \"line\": 58, \"code\": \"exec(command)\", \"type\": \"sink\", \"explanation\": \"Executed as shell command\"}\n ],\n \"triggerScenario\": \"1. Attacker sends GET /admin/run?cmd=; rm -rf /\\\\n2. Input flows through buildCommand()\\\\n3. exec() runs: ls ; rm -rf /\\\\n4. Server filesystem deleted\",\n \"evidence\": [\n \"No input validation at entry point\",\n \"No sanitization in buildCommand()\",\n \"Direct string concatenation\",\n \"exec() called with user-tainted data\"\n ],\n \"securityControls\": {\n \"present\": [\"Admin route requires auth\"],\n \"missing\": [\"Input sanitization\", \"Command allowlist\", \"Shell escaping\"],\n \"bypassable\": []\n },\n \"suggestedFix\": \"const allowedCommands = ['ls', 'pwd', 'whoami'];\\\\nif (!allowedCommands.includes(cmd)) throw new Error('Invalid command');\\\\nexecFile(cmd, [], callback); // Use execFile with no shell\"\n }\n}\n</json>\n\nFor ${pass.level === 'e2e' ? 'attack chains' : 'integration issues'}, include the FULL flow across all files involved.\n\nProgress updates:\n###SCANNING:path/to/file.ts\n\nWhen done:\n###COMPLETE\n\n## BEGIN\n\nStart by finding ${pass.entryPointPatterns[0]}. Then TRACE the flow through the codebase. Report only CONFIRMED vulnerabilities where you've traced the complete path.\n\nRemember: You're not looking for \"might be vulnerable\" - you're looking for \"I traced the input from A to B to C and it's definitely exploitable because...\"`;\n}\n\n/**\n * Build a prompt for attack chain analysis (uses previous findings)\n */\nexport function buildAttackChainPrompt(\n _ctx: FlowPromptContext,\n allFindings: Array<{\n id: string;\n title: string;\n file: string;\n line: number;\n category: string;\n severity: string;\n description: string;\n }>\n): string {\n const findingsList = allFindings.map(f =>\n `- [${f.id}] ${f.title} (${f.category}, ${f.severity})\n File: ${f.file}:${f.line}\n ${f.description.slice(0, 200)}${f.description.length > 200 ? '...' : ''}`\n ).join('\\n');\n\n return `You are a security auditor looking for ATTACK CHAINS.\n\n## YOUR MISSION\nFind combinations of vulnerabilities that create more severe exploits.\n\nIndividual bugs may be low/medium severity. Combined, they become critical.\n\n## ALL FINDINGS FROM PREVIOUS PASSES\n${findingsList}\n\n## COMMON CHAINS TO LOOK FOR\n\n1. **XSS + Missing CSRF** → Full Account Takeover\n - XSS lets attacker run JS in victim's browser\n - Missing CSRF lets that JS perform actions as victim\n - Combined: Attacker sends XSS link, steals account\n\n2. **Information Disclosure + IDOR** → Mass Data Breach\n - Info disclosure reveals user IDs/patterns\n - IDOR allows accessing any user by ID\n - Combined: Enumerate and dump all user data\n\n3. **SSRF + Cloud Metadata** → Credential Theft\n - SSRF allows internal requests\n - Cloud metadata (169.254.169.254) has credentials\n - Combined: Steal AWS/GCP keys, pivot to infrastructure\n\n4. **Open Redirect + OAuth** → Token Theft\n - Open redirect can redirect anywhere\n - OAuth redirects token to redirect_uri\n - Combined: Redirect OAuth flow to attacker's server\n\n5. **Low-Priv SQLi + Credential Storage** → Full Compromise\n - SQLi with read access only\n - Password hashes in database\n - Combined: Dump hashes, crack passwords, escalate\n\n6. **Race Condition + Financial** → Money Theft\n - Race condition in balance check\n - Financial transaction endpoint\n - Combined: Overdraw account, double-spend\n\n## ANALYSIS INSTRUCTIONS\n\n1. For each finding, ask: \"What else could an attacker do with this?\"\n2. Look for findings that ENABLE each other\n3. Look for findings in the same USER FLOW\n4. Consider: If attacker has A, how does that help exploit B?\n\n## REPORTING FORMAT\n\nWhen you find a chain:\n\n<json>\n{\n \"type\": \"bug\",\n \"data\": {\n \"title\": \"Attack Chain: XSS + Missing CSRF = Account Takeover\",\n \"description\": \"Combining reflected XSS (WR-003) with missing CSRF on profile update (WR-007) allows complete account takeover.\",\n \"category\": \"auth-bypass\",\n \"severity\": \"critical\",\n \"confidence\": \"high\",\n \"flowType\": \"e2e\",\n \"passName\": \"attack-chain-analysis\",\n \"chain\": {\n \"components\": [\"WR-003\", \"WR-007\"],\n \"steps\": [\n \"1. Attacker crafts URL with XSS payload targeting /search endpoint\",\n \"2. Victim (admin) clicks link, XSS executes in their browser\",\n \"3. XSS payload calls /api/profile/update with attacker's email\",\n \"4. No CSRF token required - request succeeds\",\n \"5. Password reset sent to attacker's email\",\n \"6. Attacker now controls admin account\"\n ],\n \"individualSeverities\": [\"medium\", \"medium\"],\n \"combinedSeverity\": \"critical\",\n \"amplification\": \"Medium + Medium = Critical account takeover\"\n },\n \"evidence\": [\n \"XSS confirmed exploitable at /search\",\n \"Profile update has no CSRF protection\",\n \"Both endpoints accessible in same origin\"\n ],\n \"suggestedFix\": \"1. Fix XSS: Encode output in search results\\\\n2. Add CSRF tokens to all state-changing requests\\\\n3. Require password for email changes\"\n }\n}\n</json>\n\n## BEGIN\n\nReview all findings. Find chains. Report only CONFIRMED chains where you've verified both components work together.`;\n}\n\n/**\n * Build prompt for validating a specific flow finding\n */\nexport function buildFlowValidationPrompt(finding: {\n title: string;\n file: string;\n line: number;\n description: string;\n dataFlow: Array<{ step: number; file: string; line: number; explanation: string }>;\n}): string {\n const flowSteps = finding.dataFlow.map(s =>\n `${s.step}. ${s.file}:${s.line} - ${s.explanation}`\n ).join('\\n');\n\n return `You are validating a flow-based vulnerability finding. Your job is to CHALLENGE it.\n\n## FINDING TO VALIDATE\n- Title: ${finding.title}\n- Location: ${finding.file}:${finding.line}\n- Description: ${finding.description}\n\n## CLAIMED DATA FLOW\n${flowSteps}\n\n## YOUR TASK\n\n1. Read EACH file in the flow\n2. Verify the data actually flows as claimed\n3. Look for GUARDS that might prevent exploitation:\n - Validation between steps\n - Type checking\n - Sanitization\n - Error handling that stops the flow\n\n## QUESTIONS TO ANSWER\n\n1. Does the input actually reach step 1 as claimed?\n2. At each step, is data passed WITHOUT transformation?\n3. Are there guards between any steps?\n4. Does the final sink actually execute with tainted data?\n5. Is this flow actually reachable in production?\n\n## REPORT FORMAT\n\n<json>\n{\n \"verdict\": \"confirmed|rejected|needs-review\",\n \"confidence\": \"high|medium|low\",\n \"flowVerified\": true|false,\n \"guardsFound\": [\n {\"location\": \"file:line\", \"type\": \"validation|sanitization|error-handling\", \"description\": \"What it does\"}\n ],\n \"reasoning\": \"Detailed explanation of your verdict\",\n \"adjustedSeverity\": \"critical|high|medium|low|null\"\n}\n</json>\n\nIf you find guards, explain whether they actually prevent exploitation or can be bypassed.`;\n}\n\n/**\n * Get the full analysis pipeline order\n * Unit passes → Integration passes → E2E passes\n */\nexport function getFullAnalysisPipeline(): { phase: string; passes: string[] }[] {\n return [\n {\n phase: 'Unit Analysis',\n passes: [\n 'injection',\n 'auth-bypass',\n 'null-safety',\n 'type-safety',\n 'resource-leaks',\n 'async-issues',\n 'data-validation',\n 'secrets-exposure',\n 'logic-errors',\n ],\n },\n {\n phase: 'Integration Analysis',\n passes: [\n 'auth-flow-trace',\n 'data-flow-trace',\n 'validation-boundary-trace',\n 'error-propagation-trace',\n 'trust-boundary-trace',\n ],\n },\n {\n phase: 'E2E Analysis',\n passes: [\n 'attack-chain-analysis',\n 'privilege-escalation-trace',\n 'session-lifecycle-trace',\n 'user-journey-simulation',\n 'api-contract-verification',\n ],\n },\n ];\n}\n","/**\n * CWE (Common Weakness Enumeration) Patterns Database\n *\n * RAG-style retrieval of known vulnerability patterns based on project type.\n * These patterns are injected into prompts to guide the LLM on what to look for.\n */\n\nexport interface CWEPattern {\n id: string;\n name: string;\n description: string;\n category: string;\n codePatterns: string[];\n languages: string[];\n projectTypes: string[];\n}\n\n// Top 25 CWE patterns most relevant for modern web/API development\nexport const CWE_PATTERNS: CWEPattern[] = [\n // INJECTION VULNERABILITIES\n {\n id: 'CWE-89',\n name: 'SQL Injection',\n description: 'User input concatenated into SQL queries without parameterization',\n category: 'injection',\n codePatterns: [\n 'String concatenation in SQL: query = \"SELECT * FROM users WHERE id = \" + userId',\n 'Template literals in SQL: `SELECT * FROM ${table} WHERE ${column} = ${value}`',\n 'Missing parameterized queries when using raw SQL',\n ],\n languages: ['javascript', 'typescript', 'python', 'java', 'go'],\n projectTypes: ['api', 'fullstack', 'web-app'],\n },\n {\n id: 'CWE-79',\n name: 'Cross-Site Scripting (XSS)',\n description: 'User input rendered in HTML without proper escaping',\n category: 'injection',\n codePatterns: [\n 'innerHTML = userInput',\n 'dangerouslySetInnerHTML={{ __html: userContent }}',\n 'document.write(userInput)',\n 'eval(userInput)',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['web-app', 'fullstack'],\n },\n {\n id: 'CWE-78',\n name: 'OS Command Injection',\n description: 'User input passed to shell commands without sanitization',\n category: 'injection',\n codePatterns: [\n 'exec(userInput)',\n 'spawn(command + userInput)',\n 'child_process with unsanitized input',\n 'shell: true with user-controlled arguments',\n ],\n languages: ['javascript', 'typescript', 'python'],\n projectTypes: ['api', 'cli', 'fullstack'],\n },\n {\n id: 'CWE-22',\n name: 'Path Traversal',\n description: 'User input used in file paths without validation, allowing ../../../ attacks',\n category: 'injection',\n codePatterns: [\n 'readFile(basePath + userInput)',\n 'join(uploadDir, filename) without basename extraction',\n 'Missing path.resolve and startsWith check',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'cli', 'fullstack'],\n },\n\n // AUTHENTICATION/AUTHORIZATION\n {\n id: 'CWE-287',\n name: 'Improper Authentication',\n description: 'Missing or bypassable authentication checks',\n category: 'auth-bypass',\n codePatterns: [\n 'API routes without auth middleware',\n 'Authentication check returns early but continues execution',\n 'Token verification that catches exceptions and continues',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'web-app'],\n },\n {\n id: 'CWE-862',\n name: 'Missing Authorization',\n description: 'Actions performed without checking user permissions',\n category: 'auth-bypass',\n codePatterns: [\n 'Delete/update operations without ownership check',\n 'Admin endpoints accessible to regular users',\n 'Missing role-based access control',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack'],\n },\n {\n id: 'CWE-306',\n name: 'Missing Authentication for Critical Function',\n description: 'Sensitive operations without requiring authentication',\n category: 'auth-bypass',\n codePatterns: [\n 'Password reset without token verification',\n 'Account deletion without re-authentication',\n 'Payment processing without session validation',\n ],\n languages: ['javascript', 'typescript', 'python'],\n projectTypes: ['api', 'fullstack', 'web-app'],\n },\n\n // SENSITIVE DATA EXPOSURE\n {\n id: 'CWE-798',\n name: 'Hardcoded Credentials',\n description: 'Passwords, API keys, or secrets hardcoded in source code',\n category: 'secrets-exposure',\n codePatterns: [\n 'const API_KEY = \"sk-...\"',\n 'password = \"admin123\"',\n 'Credentials in config files committed to repo',\n ],\n languages: ['javascript', 'typescript', 'python', 'go', 'java'],\n projectTypes: ['api', 'fullstack', 'cli', 'library'],\n },\n {\n id: 'CWE-532',\n name: 'Sensitive Info in Logs',\n description: 'Passwords, tokens, or PII written to log files',\n category: 'secrets-exposure',\n codePatterns: [\n 'console.log(user) where user contains password',\n 'logger.info(request.body) with sensitive fields',\n 'Error messages exposing database credentials',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'cli'],\n },\n\n // NULL REFERENCE / UNDEFINED\n {\n id: 'CWE-476',\n name: 'NULL Pointer Dereference',\n description: 'Accessing properties of null/undefined without checking',\n category: 'null-reference',\n codePatterns: [\n 'user.profile.name without null check on user or profile',\n 'array[0].property when array might be empty',\n 'Optional chaining missing: obj.prop instead of obj?.prop',\n 'Async function returns null but caller assumes object',\n ],\n languages: ['javascript', 'typescript', 'go', 'java'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // RESOURCE MANAGEMENT\n {\n id: 'CWE-772',\n name: 'Missing Release of Resource',\n description: 'File handles, connections, or timers not properly closed/cleared',\n category: 'resource-leak',\n codePatterns: [\n 'setInterval without corresponding clearInterval',\n 'Database connection opened but not closed in error path',\n 'File opened with fs.open but not closed on exception',\n 'Event listeners added but never removed',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'cli', 'library'],\n },\n {\n id: 'CWE-401',\n name: 'Memory Leak',\n description: 'Memory allocated but never freed, growing unboundedly',\n category: 'resource-leak',\n codePatterns: [\n 'Global arrays/maps that grow without bounds',\n 'Closures holding references preventing garbage collection',\n 'Cache without eviction policy',\n ],\n languages: ['javascript', 'typescript', 'go'],\n projectTypes: ['api', 'fullstack', 'cli'],\n },\n\n // ASYNC ISSUES\n {\n id: 'CWE-367',\n name: 'Time-of-Check Time-of-Use (TOCTOU)',\n description: 'Race condition between checking a condition and using the result',\n category: 'async-issue',\n codePatterns: [\n 'if (exists(file)) { read(file) } - file could be deleted between check and read',\n 'Check balance then deduct - concurrent requests could overdraw',\n 'Verify permission then perform action without transaction',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack'],\n },\n {\n id: 'CWE-662',\n name: 'Improper Synchronization',\n description: 'Missing await, unhandled promises, or race conditions',\n category: 'async-issue',\n codePatterns: [\n 'async function called without await',\n 'Promise.all with no error handling',\n '.then() without .catch()',\n 'Shared state modified in parallel without locking',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli'],\n },\n\n // INPUT VALIDATION\n {\n id: 'CWE-20',\n name: 'Improper Input Validation',\n description: 'User input not validated before processing',\n category: 'data-validation',\n codePatterns: [\n 'req.body used directly without schema validation',\n 'parseInt(userInput) without checking for NaN',\n 'Array index from user input without bounds check',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'web-app'],\n },\n {\n id: 'CWE-1284',\n name: 'Improper Validation of Array Index',\n description: 'Array accessed with user-controlled index without bounds checking',\n category: 'boundary-error',\n codePatterns: [\n 'items[userIndex] without checking userIndex < items.length',\n 'Negative index not checked: items[id] where id could be -1',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'library'],\n },\n\n // TYPE COERCION\n {\n id: 'CWE-843',\n name: 'Type Confusion',\n description: 'Incorrect type assumptions leading to unexpected behavior',\n category: 'type-coercion',\n codePatterns: [\n 'if (value) when value could be 0 or empty string (both falsy but valid)',\n '== instead of === causing type coercion',\n 'JSON.parse result used without type checking',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'library'],\n },\n\n // LOGIC ERRORS\n {\n id: 'CWE-670',\n name: 'Always-Incorrect Control Flow',\n description: 'Logic that always takes wrong branch or never executes',\n category: 'logic-error',\n codePatterns: [\n 'if (x = 5) instead of if (x === 5) - assignment instead of comparison',\n 'if (a && a) - duplicate condition',\n 'Loop that never executes or never terminates',\n 'Return statement before important code',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n {\n id: 'CWE-480',\n name: 'Use of Incorrect Operator',\n description: 'Wrong operator used (& vs &&, | vs ||, etc.)',\n category: 'logic-error',\n codePatterns: [\n '& instead of && (bitwise vs logical)',\n '| instead of || (bitwise vs logical)',\n '+ with strings causing concatenation instead of addition',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'library'],\n },\n\n // INSECURE RANDOMNESS\n {\n id: 'CWE-330',\n name: 'Insufficient Randomness',\n description: 'Using weak random number generators for security-sensitive operations',\n category: 'secrets-exposure',\n codePatterns: [\n 'Math.random() used for IDs, tokens, or keys',\n 'Math.random().toString(36) for unique identifiers',\n 'Date.now() as sole source of uniqueness',\n 'Sequential IDs that can be guessed',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // UNSAFE TYPE ASSERTIONS\n {\n id: 'CWE-704',\n name: 'Incorrect Type Conversion',\n description: 'Unsafe type assertions that bypass type checking',\n category: 'type-coercion',\n codePatterns: [\n 'as any - bypasses all type checking',\n 'as unknown as T - double assertion to force types',\n '! (non-null assertion) - assumes value is not null without checking',\n 'Type assertion on API response without validation',\n ],\n languages: ['typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // UNSAFE JSON PARSING\n {\n id: 'CWE-502',\n name: 'Unsafe Deserialization',\n description: 'JSON.parse or similar without validation or error handling',\n category: 'data-validation',\n codePatterns: [\n 'JSON.parse(input) without try/catch',\n 'JSON.parse result used directly without schema validation',\n 'Zod/Joi schema exists but not used for parsing',\n 'Type assertion after JSON.parse: JSON.parse(x) as MyType',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // REGEX ISSUES\n {\n id: 'CWE-185',\n name: 'Incorrect Regular Expression',\n description: 'Regex that matches unintended content or misses edge cases',\n category: 'logic-error',\n codePatterns: [\n 'Regex matching braces/brackets without skipping strings: line.match(/{/g)',\n 'Unanchored regex that matches substrings: /pattern/ instead of /^pattern$/',\n 'Regex without escaping special chars in user input',\n 'Greedy matching that captures too much: .* instead of .*?',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // STRING MANIPULATION ERRORS\n {\n id: 'CWE-131',\n name: 'Incorrect Buffer Size',\n description: 'String slice/substring with incorrect bounds',\n category: 'boundary-error',\n codePatterns: [\n 'str.slice(0, str.length - x) where x could exceed length',\n 'str.substring(start, end) without validating start < end',\n 'Array index from string length calculation without bounds check',\n 'Negative index to slice without checking string length',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // MISSING NULL CHECKS BEFORE METHOD CALLS\n {\n id: 'CWE-252',\n name: 'Unchecked Return Value',\n description: 'Calling methods on values that could be null/undefined',\n category: 'null-reference',\n codePatterns: [\n '.map() on potentially undefined array: items.map() without items &&',\n '.filter()/.reduce() on optional property without null check',\n 'Object.keys(obj) where obj could be undefined',\n 'Chained method calls without optional chaining: a.b.c.map()',\n ],\n languages: ['javascript', 'typescript'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n\n // WEAK VALIDATION\n {\n id: 'CWE-183',\n name: 'Permissive Whitelist',\n description: 'Validation logic that accepts invalid input',\n category: 'data-validation',\n codePatterns: [\n 'Validation that accepts if ANY condition passes instead of ALL',\n 'Length-based validation as only check for correctness',\n 'Regex that allows injection via alternation: (valid|.+)',\n 'Fallback to default on validation failure instead of rejecting',\n ],\n languages: ['javascript', 'typescript', 'python', 'go'],\n projectTypes: ['api', 'fullstack', 'web-app', 'cli', 'library'],\n },\n];\n\n/**\n * Get relevant CWE patterns for a specific project type and language\n */\nexport function getRelevantPatterns(\n projectType: string,\n language: string\n): CWEPattern[] {\n return CWE_PATTERNS.filter(pattern =>\n pattern.projectTypes.includes(projectType) &&\n pattern.languages.includes(language.toLowerCase())\n );\n}\n\n/**\n * Get patterns for a specific bug category\n */\nexport function getPatternsForCategory(category: string): CWEPattern[] {\n return CWE_PATTERNS.filter(pattern => pattern.category === category);\n}\n\n/**\n * Format patterns for injection into prompt (RAG-style)\n */\nexport function formatPatternsForPrompt(patterns: CWEPattern[]): string {\n if (patterns.length === 0) return '';\n\n const sections: string[] = [];\n\n // Group by category\n const byCategory = new Map<string, CWEPattern[]>();\n for (const pattern of patterns) {\n const existing = byCategory.get(pattern.category) || [];\n existing.push(pattern);\n byCategory.set(pattern.category, existing);\n }\n\n for (const [category, categoryPatterns] of byCategory) {\n const categoryLines = [`## ${category.toUpperCase()} Vulnerabilities to Check:`];\n\n for (const pattern of categoryPatterns) {\n categoryLines.push(`\\n### ${pattern.id}: ${pattern.name}`);\n categoryLines.push(`${pattern.description}`);\n categoryLines.push(`Look for patterns like:`);\n for (const code of pattern.codePatterns) {\n categoryLines.push(` - ${code}`);\n }\n }\n\n sections.push(categoryLines.join('\\n'));\n }\n\n return sections.join('\\n\\n');\n}\n\n/**\n * Get a focused set of patterns for category-specific analysis\n */\nexport function getCategoryFocusedPatterns(category: string): string {\n const patterns = getPatternsForCategory(category);\n if (patterns.length === 0) return '';\n\n const lines = [`KNOWN ${category.toUpperCase()} PATTERNS TO DETECT:\\n`];\n\n for (const pattern of patterns) {\n lines.push(`${pattern.id} - ${pattern.name}:`);\n lines.push(` ${pattern.description}`);\n lines.push(` Common code patterns:`);\n for (const code of pattern.codePatterns) {\n lines.push(` * ${code}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","/**\n * Multi-Pass Prompts - Laser-focused prompts for each bug category\n *\n * Each prompt is designed to:\n * 1. Focus on ONE category only - no distractions\n * 2. Provide specific search patterns and grep queries\n * 3. Give clear methodology for finding bugs\n * 4. Include false positive hints to reduce noise\n * 5. Require exact fix code for confirmation\n */\n\nimport { PassConfig } from '../../core/multipass-scanner.js';\nimport { getCategoryFocusedPatterns } from './cwe-patterns.js';\n\nexport interface StaticFinding {\n tool: string;\n file: string;\n line: number;\n message: string;\n severity: string;\n}\n\nexport interface PassPromptContext {\n pass: PassConfig;\n projectType: string;\n framework: string;\n language: string;\n totalFiles: number;\n entryPoints?: string[];\n staticFindings?: StaticFinding[];\n}\n\n/**\n * Build a laser-focused prompt for a single pass\n */\nexport function buildPassPrompt(ctx: PassPromptContext): string {\n const { pass, projectType, framework, language, totalFiles, entryPoints } = ctx;\n\n // Get CWE patterns for this category\n const cwePatterns = getCategoryFocusedPatterns(pass.category);\n\n const entryPointsSection = entryPoints?.length\n ? `\n## STARTING POINTS\nThese files are likely entry points - good places to start tracing data flow:\n${entryPoints.map(e => `- ${e}`).join('\\n')}\n`\n : '';\n\n // Include static analysis findings if available\n const staticSection = ctx.staticFindings?.length\n ? `\n## STATIC ANALYSIS SIGNALS (from tsc/eslint - run BEFORE you)\nThese issues were found by static analysis tools. Use them as starting points:\n${ctx.staticFindings.slice(0, 20).map(f => `- ${f.tool}: ${f.file}:${f.line} - ${f.message}`).join('\\n')}\n${ctx.staticFindings.length > 20 ? `\\n... and ${ctx.staticFindings.length - 20} more` : ''}\n\nIMPORTANT: Static tools already checked control flow, types, and reachability.\nIf they didn't flag something, it's likely NOT a bug (early returns, guards, etc. are handled).\nFocus on SEMANTIC issues static tools can't catch (logic errors, business logic, auth bypass).\n`\n : '';\n\n return `You are a security specialist. Your ONLY job is to find ${pass.name.toUpperCase()} bugs.\n\n## YOUR SINGLE MISSION\nFind ${pass.description} vulnerabilities in this codebase. IGNORE everything else.\n\n## PROJECT CONTEXT\n- Type: ${projectType}\n- Framework: ${framework || 'Unknown'}\n- Language: ${language}\n- Size: ${totalFiles} files\n${entryPointsSection}\n${staticSection}\n## WHAT TO LOOK FOR\n\n${pass.searchPatterns.map(p => `- ${p}`).join('\\n')}\n\n## SEARCH STRATEGY\n\nUse these grep patterns to find potential issues:\n${pass.grepPatterns.map(p => `\\`${p}\\``).join('\\n')}\n\n## METHODOLOGY\n\n${pass.methodology}\n\n## FALSE POSITIVE HINTS\n\nThese are often NOT bugs - verify before reporting:\n${pass.falsePositiveHints.map(h => `- ${h}`).join('\\n')}\n\n${cwePatterns ? `## KNOWN VULNERABILITY PATTERNS\\n${cwePatterns}` : ''}\n\n## REPORTING GUIDELINES\n\n1. **ONLY ${pass.name.toUpperCase()} ISSUES** - Focus on this category\n2. **REPORT POTENTIAL ISSUES** - If something looks suspicious, report it. Better to flag potential issues than miss real bugs.\n3. **INCLUDE CODE SMELLS** - Report risky patterns even if not immediately exploitable (set kind: \"smell\")\n4. **TRACE THE DATA** - Follow user input to potentially vulnerable sinks\n5. **BE SPECIFIC** - Include exact file, line number, and what makes it suspicious\n6. **SUGGESTED FIX IS OPTIONAL** - Nice to have but not required. Report the issue even without a fix.\n\n## REPORTING FORMAT\n\nWhen you find a ${pass.name} issue (bug or code smell):\n\n<json>\n{\n \"type\": \"bug\",\n \"data\": {\n \"file\": \"src/api/users.ts\",\n \"line\": 42,\n \"endLine\": 45,\n \"title\": \"Short description of the issue\",\n \"description\": \"Explanation of why this is problematic and potential impact.\",\n \"kind\": \"bug|smell\",\n \"category\": \"${pass.category}\",\n \"severity\": \"critical|high|medium|low\",\n \"confidence\": \"high|medium|low\",\n \"evidence\": [\n \"Evidence point 1\",\n \"Evidence point 2\"\n ],\n \"suggestedFix\": \"Optional: how to fix it\"\n }\n}\n</json>\n\nUse kind=\"bug\" for confirmed vulnerabilities, kind=\"smell\" for risky patterns that need review.\n\nProgress updates:\n###SCANNING:path/to/file.ts\n\nWhen done:\n###COMPLETE\n\n## BEGIN\n\nStart by searching for ${pass.name} patterns using grep. Read at least 10-15 files that match the patterns. Report issues as you find them.\n\nIMPORTANT:\n- Report ANYTHING suspicious - we'll filter false positives later\n- Include code smells and risky patterns, not just confirmed exploits\n- If unsure, report it with confidence=\"low\"\n- Aim for thoroughness - finding 10 potential issues is better than finding 0 confirmed bugs`;\n}\n\n/**\n * Build prompt for the final adversarial validation pass\n */\nexport function buildAdversarialPassPrompt(bugs: Array<{\n id: string;\n title: string;\n file: string;\n line: number;\n description: string;\n category: string;\n severity: string;\n}>): string {\n const bugList = bugs.map((b, i) => `\n### Bug ${i + 1}: ${b.title}\n- File: ${b.file}:${b.line}\n- Category: ${b.category}\n- Severity: ${b.severity}\n- Description: ${b.description}\n`).join('\\n');\n\n return `You are a senior engineer reviewing bug reports. Your job is to CHALLENGE each finding.\n\n## YOUR MISSION\nFor each bug, try to prove it's a FALSE POSITIVE. Look for:\n- Guards or validation that were missed\n- Framework protections that make it safe\n- Context that makes the scenario unrealistic\n- Misunderstanding of the code's purpose\n\n## BUGS TO REVIEW\n${bugList}\n\n## METHODOLOGY\n\nFor each bug:\n1. Read the code at the reported location\n2. Look UPSTREAM for validation/guards\n3. Check framework documentation for built-in protections\n4. Consider if the attack scenario is realistic\n5. Try to construct a counter-argument\n\n## REPORTING FORMAT\n\nFor each bug, report your findings:\n\n<json>\n{\n \"bugId\": \"WR-001\",\n \"verdict\": \"confirmed|rejected|needs-review\",\n \"confidence\": \"high|medium|low\",\n \"counterArguments\": [\n \"Counter argument 1\",\n \"Counter argument 2\"\n ],\n \"additionalEvidence\": [\n \"Evidence supporting rejection\"\n ],\n \"reasoning\": \"Explanation of your verdict\"\n}\n</json>\n\nWhen done with all bugs:\n###COMPLETE\n\n## BEGIN\n\nReview each bug. Be skeptical. Reject anything that isn't clearly exploitable.`;\n}\n\n/**\n * Build a quick summary prompt to describe findings in human terms\n */\nexport function buildHumanReadableSummaryPrompt(bug: {\n title: string;\n file: string;\n line: number;\n description: string;\n category: string;\n severity: string;\n evidence: string[];\n suggestedFix?: string;\n}): string {\n return `Convert this technical bug report into a tester-friendly format.\n\n## ORIGINAL BUG\n- Title: ${bug.title}\n- File: ${bug.file}:${bug.line}\n- Category: ${bug.category}\n- Severity: ${bug.severity}\n- Description: ${bug.description}\n- Evidence: ${bug.evidence.join(', ')}\n${bug.suggestedFix ? `- Fix: ${bug.suggestedFix}` : ''}\n\n## CONVERT TO TESTER FORMAT\n\nCreate a report with:\n1. **Title** = What goes wrong (outcome, not implementation)\n2. **What happens** = Plain English consequence (no code terms)\n3. **How to trigger** = Steps a QA tester would take\n4. **Impact** = Why the business/user should care\n5. **Technical details** = Original technical info (for devs)\n\nRespond with JSON:\n<json>\n{\n \"humanTitle\": \"User-friendly title describing the problem\",\n \"whatHappens\": \"Plain English explanation of the bug's effect\",\n \"howToTrigger\": [\"Step 1\", \"Step 2\", \"Step 3\"],\n \"impact\": \"Business impact statement\",\n \"technicalTitle\": \"${bug.title}\",\n \"technicalDetails\": \"Original technical description\"\n}\n</json>`;\n}\n\n/**\n * Severity-specific guidance for prompts\n */\nexport const SEVERITY_THRESHOLDS = {\n critical: {\n description: 'Immediate exploitation possible, data breach or RCE',\n examples: [\n 'SQL injection in login endpoint',\n 'Command injection with user input',\n 'Hardcoded admin credentials',\n 'Auth bypass in payment flow',\n ],\n },\n high: {\n description: 'Significant risk with some exploitation barriers',\n examples: [\n 'XSS requiring social engineering',\n 'IDOR accessing other users data',\n 'Path traversal with limited scope',\n 'Weak crypto in sensitive operations',\n ],\n },\n medium: {\n description: 'Moderate risk, requires specific conditions',\n examples: [\n 'Information disclosure in errors',\n 'Missing rate limiting on auth',\n 'Unsafe deserialization of trusted input',\n 'Type confusion in edge cases',\n ],\n },\n low: {\n description: 'Minor issues, defense in depth concerns',\n examples: [\n 'Verbose error messages',\n 'Missing security headers',\n 'Deprecated crypto (but not broken)',\n 'Code quality issues with security implications',\n ],\n },\n};\n\n/**\n * Category-specific pass order (can be customized based on project type)\n */\nexport function getPassOrderForProject(projectType: string): string[] {\n const baseOrder = [\n 'injection',\n 'auth-bypass',\n 'secrets-exposure',\n 'null-safety',\n 'type-safety',\n 'async-issues',\n 'data-validation',\n 'resource-leaks',\n 'logic-errors',\n 'cross-file-flow',\n ];\n\n // Prioritize passes based on project type\n switch (projectType.toLowerCase()) {\n case 'api':\n case 'backend':\n // APIs: focus on injection and auth first\n return ['injection', 'auth-bypass', 'data-validation', 'secrets-exposure', ...baseOrder.filter(p => !['injection', 'auth-bypass', 'data-validation', 'secrets-exposure'].includes(p))];\n\n case 'web-app':\n case 'frontend':\n // Frontend: XSS and client-side issues\n return ['injection', 'secrets-exposure', 'type-safety', 'null-safety', ...baseOrder.filter(p => !['injection', 'secrets-exposure', 'type-safety', 'null-safety'].includes(p))];\n\n case 'cli':\n // CLI: command injection and path traversal\n return ['injection', 'data-validation', 'null-safety', 'async-issues', ...baseOrder.filter(p => !['injection', 'data-validation', 'null-safety', 'async-issues'].includes(p))];\n\n case 'library':\n // Libraries: type safety and API contracts\n return ['type-safety', 'null-safety', 'cross-file-flow', 'logic-errors', ...baseOrder.filter(p => !['type-safety', 'null-safety', 'cross-file-flow', 'logic-errors'].includes(p))];\n\n default:\n return baseOrder;\n }\n}\n","/**\n * Shared constants for whiterose prompts\n */\n\n// ─────────────────────────────────────────────────────────────\n// LOC Slabs for tiered scanning\n// ─────────────────────────────────────────────────────────────\n\nexport type Slab = 'XS' | 'S' | 'M' | 'L' | 'XL';\n\nexport const SLAB_THRESHOLDS = {\n XS: 5000, // < 5K LOC\n S: 20000, // 5K - 20K LOC\n M: 100000, // 20K - 100K LOC\n L: 500000, // 100K - 500K LOC\n // XL: > 500K LOC\n} as const;\n\nexport function detectSlab(totalLOC: number): Slab {\n if (totalLOC < SLAB_THRESHOLDS.XS) return 'XS';\n if (totalLOC < SLAB_THRESHOLDS.S) return 'S';\n if (totalLOC < SLAB_THRESHOLDS.M) return 'M';\n if (totalLOC < SLAB_THRESHOLDS.L) return 'L';\n return 'XL';\n}\n\nexport function getScopeInstructions(slab: Slab): string {\n switch (slab) {\n case 'XS':\n case 'S':\n return 'SCOPE: Analyze ALL files in the codebase. This is a small project - be thorough.';\n case 'M':\n return 'SCOPE: Focus on entry points, API routes, and data processing. You may read other files for context but prioritize critical paths (auth, payments, user data).';\n case 'L':\n return 'SCOPE: Focus on security boundaries and critical data flows. Trace user input through processing to output. Prioritize: authentication, authorization, database operations, file handling.';\n case 'XL':\n return 'SCOPE: STRICT - Focus only on changed files and their immediate dependencies. Do not explore the entire codebase. Analyze security implications of changes.';\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Bug Categories\n// ─────────────────────────────────────────────────────────────\n\nexport const BUG_CATEGORIES_PROMPT = `BUG CATEGORIES (use EXACTLY these strings):\nSECURITY:\n- injection: SQL injection, XSS, command injection, path traversal, SSRF\n- auth-bypass: Authentication/authorization flaws, privilege escalation, session issues\n- secrets-exposure: Hardcoded credentials, leaked tokens, exposed API keys, sensitive data in logs\n\nRELIABILITY:\n- null-reference: Null/undefined dereference, missing optional chaining, unchecked return values\n- boundary-error: Off-by-one, array out of bounds, integer overflow/underflow, loop boundary issues\n- resource-leak: Unclosed connections, file handles, memory leaks, uncleared timers/intervals\n- async-issue: Missing await, unhandled promise rejections, race conditions, callback errors\n\nCORRECTNESS:\n- logic-error: Wrong operators, incorrect conditions, bad math, wrong comparisons, inverted logic\n- data-validation: Missing input validation, format checking, sanitization, constraint violations\n- type-coercion: Implicit coercion bugs, wrong type handling, NaN propagation, falsy confusion\n\nDESIGN:\n- concurrency: Thread safety, deadlocks, shared state mutation, atomic operation violations\n- intent-violation: Code contradicts comments, misleading names, unexpected side effects`;\n\n// ─────────────────────────────────────────────────────────────\n// Severity Definitions\n// ─────────────────────────────────────────────────────────────\n\nexport const SEVERITY_DEFINITIONS_PROMPT = `SEVERITY DEFINITIONS:\n- critical: Security breach allowing unauthorized access, data exfiltration, RCE. Production crash affecting ALL users. Data corruption/loss.\n- high: Bugs that WILL cause incorrect behavior for MANY users under normal usage. Partial data corruption. Security issues with limited scope.\n- medium: Bugs that COULD cause issues under specific conditions. Edge cases. Non-critical security hardening.\n- low: Minor issues. Defensive improvements. Code that works but is fragile.`;\n\n// ─────────────────────────────────────────────────────────────\n// Project Types\n// ─────────────────────────────────────────────────────────────\n\nexport const PROJECT_TYPES_PROMPT = `PROJECT TYPE OPTIONS (pick the best fit):\n- api: REST/GraphQL backend service\n- web-app: Frontend web application (React, Vue, Angular, etc.)\n- fullstack: Combined frontend + backend in one repo\n- cli: Command-line tool\n- library: Reusable package/module for other projects\n- monorepo: Multi-package repository\n- mobile: Mobile application (React Native, Flutter, etc.)\n- desktop: Desktop application (Electron, Tauri, etc.)\n- other: Doesn't fit above categories`;\n\n// ─────────────────────────────────────────────────────────────\n// Feature Priority Rules\n// ─────────────────────────────────────────────────────────────\n\nexport const FEATURE_PRIORITY_PROMPT = `FEATURE PRIORITY RULES:\n- critical: Authentication, payments, checkout, admin access, data encryption, secrets management\n- high: User data handling, API endpoints, database operations, file uploads, external integrations\n- medium: UI components, formatting, logging, caching, search, notifications\n- low: Dev tooling, documentation generation, tests, examples, analytics`;\n\n// ─────────────────────────────────────────────────────────────\n// Output Format Constants\n// ─────────────────────────────────────────────────────────────\n\nexport const JSON_OUTPUT_INSTRUCTION = `CRITICAL OUTPUT RULE: All output MUST be valid JSON wrapped in <json></json> tags. No explanations, no markdown, no prose outside the tags.`;\n\nexport const TYPESCRIPT_WARNING = `CRITICAL: DO NOT trust TypeScript type annotations. Types exist only at compile-time. A variable typed as 'string' can be null/undefined at runtime. Always verify actual runtime guards.`;\n\n// ─────────────────────────────────────────────────────────────\n// Chain-of-Thought Analysis Methodology\n// ─────────────────────────────────────────────────────────────\n\nexport const CHAIN_OF_THOUGHT_METHODOLOGY = `CHAIN-OF-THOUGHT ANALYSIS METHODOLOGY:\n\nFor EACH function/method you analyze, follow these steps IN ORDER:\n\n**STEP 1: UNDERSTAND**\n- What does this function do? (1 sentence summary)\n- What are the inputs? (parameters, external data, config, environment)\n- What are the outputs? (return value, side effects, mutations)\n\n**STEP 2: TRACE INPUTS**\nFor each input:\n- Where does it come from? (user input, database, API, config, hardcoded)\n- Is it validated/sanitized before use? WHERE is this validation?\n- What assumptions does the code make about this input?\n\n**STEP 3: ANALYZE OPERATIONS**\nFor each operation on the input:\n- What happens if the input is NULL or UNDEFINED?\n- What happens if the input is an EMPTY STRING or EMPTY ARRAY?\n- What happens if the input is MALFORMED (wrong type, invalid format)?\n- What happens if the input is MALICIOUS (SQL injection, path traversal)?\n- What happens if the operation FAILS (throws, returns error)?\n\n**STEP 4: CHECK ERROR PATHS**\n- Are all error cases handled?\n- Do error handlers clean up resources?\n- Can errors leak sensitive information?\n- Are errors logged with appropriate detail?\n\n**STEP 5: VERIFY CLAIMS**\nBefore reporting a bug, VERIFY:\n- Is there a guard/check I missed upstream?\n- Does the framework/library handle this case?\n- Is this intentional behavior (check comments, docs)?\n- Can I construct a concrete scenario that triggers this bug?\n\n**STEP 6: CONSTRUCT PROOF**\nFor each bug you report:\n- Show the exact data flow from input to failure\n- Provide a concrete example input that triggers the bug\n- Explain why existing guards don't prevent it\n- Provide the exact code fix`;\n\n// ─────────────────────────────────────────────────────────────\n// Category-Specific Analysis Instructions\n// ─────────────────────────────────────────────────────────────\n\nexport const CATEGORY_SPECIFIC_INSTRUCTIONS: Record<string, string> = {\n 'injection': `INJECTION ANALYSIS FOCUS:\n\nTrace ALL user inputs through the code:\n1. HTTP request: req.body, req.query, req.params, req.headers\n2. Form data, file uploads, cookies\n3. URL parameters, hash fragments\n4. WebSocket messages, GraphQL variables\n\nFor EACH user input, check if it reaches:\n- SQL queries (concatenation or interpolation = bug)\n- Shell commands (exec, spawn, system = bug)\n- File system paths (readFile, writeFile with user path = bug)\n- HTML rendering (innerHTML, dangerouslySetInnerHTML = bug)\n- eval() or Function() constructor = bug\n- Regular expressions (ReDoS potential)\n\nPROOF REQUIRED: Show the exact line where user input enters, and the exact line where it's used unsafely.`,\n\n 'null-reference': `NULL REFERENCE ANALYSIS FOCUS:\n\nFor EACH variable access (obj.prop, arr[i]), verify:\n1. Can the object be null/undefined at this point?\n2. Can the property be missing?\n3. Can the array be empty?\n\nCheck these sources of null:\n- Database queries: findOne, findById return null when not found\n- API responses: external data can have missing fields\n- Optional parameters: function called without all args\n- Async operations: resolved value could be null\n- Array operations: find(), [0] on empty array\n- Map/Object access: map.get(), obj[key] for missing keys\n\nPROOF REQUIRED: Show the exact function that can return null, and the exact line where it's dereferenced without check.`,\n\n 'resource-leak': `RESOURCE LEAK ANALYSIS FOCUS:\n\nTrack ALL resources that need cleanup:\n1. setInterval/setTimeout - need clearInterval/clearTimeout\n2. addEventListener - need removeEventListener\n3. File handles - need close()\n4. Database connections - need release/close\n5. Streams - need destroy/end\n6. Subscriptions - need unsubscribe\n\nFor EACH resource allocation:\n- Is there a corresponding cleanup?\n- Is cleanup called in ALL code paths (including errors)?\n- Is cleanup in finally block or equivalent?\n- For React: is cleanup in useEffect return?\n- For classes: is cleanup in destructor/dispose?\n\nPROOF REQUIRED: Show where resource is created, and show the error path where cleanup is skipped.`,\n\n 'async-issue': `ASYNC/CONCURRENCY ANALYSIS FOCUS:\n\nCheck ALL async operations:\n1. Every async function call should have await (or intentional fire-and-forget with comment)\n2. Every Promise should have .catch() or be in try/catch\n3. Promise.all errors should be handled\n\nCheck for race conditions:\n1. Shared state modified by concurrent operations\n2. Check-then-act patterns without atomicity\n3. Multiple awaits with interleaved state changes\n\nCheck for deadlocks:\n1. Circular await dependencies\n2. Locks acquired in different orders\n\nPROOF REQUIRED: Show the async call without await, or show two concurrent paths that can corrupt shared state.`,\n\n 'auth-bypass': `AUTHENTICATION/AUTHORIZATION ANALYSIS FOCUS:\n\nFor EACH route/endpoint:\n1. Is authentication required? Is middleware applied?\n2. Is authorization checked? (user can only access their own data)\n3. Are there any early returns that bypass auth?\n\nCheck for:\n- Routes missing auth middleware\n- Auth check that catches errors and continues\n- IDOR: user ID from request used without ownership check\n- Role checks that can be bypassed\n- JWT/session validation that accepts expired tokens\n- Password comparison using timing-unsafe methods\n\nPROOF REQUIRED: Show the route definition missing auth, or the auth check that can be bypassed.`,\n\n 'data-validation': `DATA VALIDATION ANALYSIS FOCUS:\n\nFor EACH external input (API request, file, env var):\n1. Is there schema validation (Zod, Joi, etc.)?\n2. Are individual fields validated for type and format?\n3. Are numbers checked for NaN, Infinity, negative?\n4. Are strings checked for length, format, encoding?\n5. Are arrays checked for length limits?\n\nCheck for:\n- JSON.parse without try/catch\n- parseInt/parseFloat without NaN check\n- Array access without length check\n- Regex without timeout (ReDoS)\n- Date parsing without validation\n\nPROOF REQUIRED: Show the input field and the operation that assumes valid data.`,\n\n 'logic-error': `LOGIC ERROR ANALYSIS FOCUS:\n\nCheck ALL conditionals:\n1. Are operators correct? (= vs ==, & vs &&, | vs ||)\n2. Are comparisons correct? (< vs <=, > vs >=)\n3. Is the logic inverted? (if(!valid) vs if(valid))\n4. Are all cases covered? (else clause, default in switch)\n\nCheck ALL loops:\n1. Off-by-one errors (< vs <=, i vs i-1)\n2. Infinite loop conditions\n3. Break/continue in wrong place\n4. Loop variable modified inside loop\n\nCheck ALL math:\n1. Division by zero possibility\n2. Integer overflow\n3. Floating point precision issues\n4. Order of operations\n\nPROOF REQUIRED: Show the exact wrong operator or condition and what the correct one should be.`,\n\n 'secrets-exposure': `SECRETS EXPOSURE ANALYSIS FOCUS:\n\nSearch for hardcoded secrets:\n1. API keys, tokens (sk-, pk-, api_, secret_, token_)\n2. Passwords, credentials (password, passwd, pwd, secret)\n3. Private keys, certificates\n4. Database connection strings with credentials\n\nCheck for secrets in logs:\n1. console.log/error with request/response objects\n2. Error messages that include credentials\n3. Debug mode exposing sensitive data\n\nCheck for secrets in responses:\n1. User objects returned with password hash\n2. Config endpoints exposing secrets\n3. Error responses with stack traces\n\nPROOF REQUIRED: Show the exact line with the hardcoded secret or log statement.`,\n\n 'boundary-error': `BOUNDARY ERROR ANALYSIS FOCUS:\n\nCheck ALL array/string operations:\n1. Index access: is index always in bounds?\n2. Slice/substring: are start/end valid?\n3. Loop bounds: off-by-one errors?\n\nCheck ALL numeric operations:\n1. Can denominator be zero?\n2. Can result overflow?\n3. Are negative numbers handled?\n\nCheck size limits:\n1. File uploads without size limit\n2. Arrays that can grow unbounded\n3. Strings without length validation\n4. Recursion without depth limit\n\nPROOF REQUIRED: Show the operation and an input that causes out-of-bounds access or overflow.`,\n\n 'type-coercion': `TYPE COERCION ANALYSIS FOCUS:\n\nCheck for JavaScript type coercion bugs:\n1. == instead of === (0 == false, \"\" == false, null == undefined)\n2. if (value) when 0 or \"\" are valid values\n3. + with mixed types (string concatenation vs addition)\n4. Array methods on non-arrays\n\nCheck for TypeScript false confidence:\n1. as assertions that could be wrong at runtime\n2. any type hiding actual types\n3. Type guards that don't actually narrow\n\nCheck JSON operations:\n1. JSON.parse result used without type check\n2. API responses assumed to match TypeScript types\n\nPROOF REQUIRED: Show the exact coercion and what unexpected value triggers wrong behavior.`,\n\n 'concurrency': `CONCURRENCY ANALYSIS FOCUS:\n\nCheck shared state access:\n1. Global variables modified by multiple requests\n2. Class instance state modified concurrently\n3. Database records updated without transactions\n\nCheck for atomicity issues:\n1. Read-modify-write without locking\n2. Check-then-act patterns (if exists, then update)\n3. Counter increments without atomic operations\n\nCheck for deadlocks:\n1. Multiple locks acquired in different orders\n2. Nested transactions\n3. Circular dependencies in async operations\n\nPROOF REQUIRED: Show two concurrent operations that can corrupt shared state.`,\n\n 'intent-violation': `INTENT VIOLATION ANALYSIS FOCUS:\n\nCheck for code that contradicts its documentation:\n1. Function does opposite of what name suggests\n2. Comment describes different behavior than code\n3. Return type doesn't match actual returns\n\nCheck for misleading patterns:\n1. Validation function that doesn't validate\n2. Error handler that ignores errors\n3. Security check that always passes\n4. Cleanup function that doesn't clean up\n\nPROOF REQUIRED: Show the documentation/name and the contradicting implementation.`,\n};\n\n/**\n * Get category-specific instructions for focused analysis\n */\nexport function getCategoryInstructions(category: string): string {\n return CATEGORY_SPECIFIC_INSTRUCTIONS[category] || '';\n}\n","/**\n * Understanding Prompt - Codebase analysis for init\n *\n * Input: Codebase (agent reads files via tools)\n * Output: Single JSON with project understanding\n * Speed: Fast (reads 3-5 files max)\n */\n\nimport {\n JSON_OUTPUT_INSTRUCTION,\n PROJECT_TYPES_PROMPT,\n FEATURE_PRIORITY_PROMPT,\n} from './constants.js';\n\nexport interface UnderstandingContext {\n existingDocsSummary?: string;\n}\n\nexport function buildUnderstandingPrompt(ctx: UnderstandingContext): string {\n const docsSection = ctx.existingDocsSummary\n ? `\\nEXISTING DOCUMENTATION (use this as starting point):\\n${ctx.existingDocsSummary}\\n`\n : '';\n\n return `You are whiterose. Quickly understand this codebase structure.\n\n${JSON_OUTPUT_INSTRUCTION}\n${docsSection}\nEXPLORATION STRATEGY (be fast, read only key files):\n1. Read package.json / go.mod / Cargo.toml / pyproject.toml to identify project type\n2. Read the main entry point (index.ts, main.go, app.py, etc.)\n3. Skim 2-3 core files to understand architecture patterns\n4. DO NOT over-explore - focus on structure, not implementation details\n\n${PROJECT_TYPES_PROMPT}\n\nFRAMEWORK DETECTION:\nLook for: next.js, express, fastify, nest.js, react, vue, angular, svelte, django, flask, fastapi, gin, echo, spring, rails, laravel, etc.\nIf none detected, use \"none\"\n\n${FEATURE_PRIORITY_PROMPT}\n\nOUTPUT FORMAT - Wrap your response in <json></json> tags:\n\n<json>\n{\n \"summary\": {\n \"type\": \"api\",\n \"framework\": \"express\",\n \"language\": \"typescript\",\n \"description\": \"REST API for e-commerce platform with user authentication, product catalog, and order management\"\n },\n \"features\": [\n {\n \"name\": \"User Authentication\",\n \"description\": \"JWT-based auth with login, register, password reset, and session management\",\n \"priority\": \"critical\",\n \"relatedFiles\": [\"src/auth/login.ts\", \"src/auth/jwt.ts\", \"src/middleware/auth.ts\"]\n },\n {\n \"name\": \"Order Processing\",\n \"description\": \"Create, update, track, and fulfill customer orders with payment integration\",\n \"priority\": \"high\",\n \"relatedFiles\": [\"src/orders/create.ts\", \"src/orders/status.ts\", \"src/payments/stripe.ts\"]\n }\n ],\n \"entryPoints\": [\n { \"file\": \"src/index.ts\", \"type\": \"main\" },\n { \"file\": \"src/routes/api.ts\", \"type\": \"routes\" }\n ],\n \"structure\": {\n \"srcDir\": \"src\",\n \"hasTests\": true,\n \"hasTypes\": true,\n \"packageManager\": \"npm\"\n },\n \"contracts\": []\n}\n</json>\n\nREQUIREMENTS:\n- Output MUST be valid JSON wrapped in <json></json> tags\n- type MUST be one of: api, web-app, fullstack, cli, library, monorepo, mobile, desktop, other\n- priority MUST be one of: critical, high, medium, low\n- Be FAST - read 3-5 files maximum\n- Focus on WHAT the project does, not HOW it implements it\n- List ALL features you can identify with their priority\n\nNow quickly understand this codebase and output the JSON.`;\n}\n","/**\n * Multi-Pass Scanner - 10x Bug Hunter\n *\n * Why this is better than a single prompt:\n * - A human does 1 pass, this does 10\n * - Each pass is laser-focused on ONE category\n * - No bug category gets overlooked\n * - Adversarial validation kills false positives\n * - Same thoroughness at file 57 as file 1\n *\n * The passes:\n * 1. Injection - SQL, command, path, XSS, SSRF\n * 2. Auth/Authz - Authentication/authorization bypasses\n * 3. Null Safety - Null/undefined dereference\n * 4. Type Safety - as any, !, unsafe casts\n * 5. Resource Leaks - Files, connections, timers\n * 6. Async Issues - Missing await, race conditions\n * 7. Data Validation - Input sanitization, schema\n * 8. Secrets Exposure - Hardcoded creds, Math.random()\n * 9. Logic Errors - Wrong operators, conditions, regex\n * 10. Cross-File - Data flow across module boundaries\n */\n\nimport { Bug, BugCategory } from '../types.js';\n\nexport interface PassConfig {\n name: string;\n category: BugCategory;\n description: string;\n searchPatterns: string[];\n grepPatterns: string[];\n methodology: string;\n falsePositiveHints: string[];\n}\n\nexport interface PassResult {\n pass: string;\n category: BugCategory;\n duration: number;\n bugs: Bug[];\n filesScanned: number;\n}\n\nexport interface MultiPassResult {\n passes: PassResult[];\n totalDuration: number;\n rawBugs: Bug[];\n validatedBugs: Bug[];\n duplicatesRemoved: number;\n falsePositivesRejected: number;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Pass Definitions - Each pass is a laser-focused bug hunter\n// ─────────────────────────────────────────────────────────────\n\nexport const SCAN_PASSES: PassConfig[] = [\n {\n name: 'injection',\n category: 'injection',\n description: 'SQL injection, command injection, path traversal, XSS, SSRF',\n searchPatterns: [\n 'SQL queries with string concatenation or template literals',\n 'exec(), spawn(), execSync() with user input',\n 'path.join(), readFile(), writeFile() with user input',\n 'innerHTML, dangerouslySetInnerHTML, document.write()',\n 'fetch(), axios(), request() with user-controlled URLs',\n ],\n grepPatterns: [\n 'exec\\\\s*\\\\(',\n 'spawn\\\\s*\\\\(',\n 'execSync\\\\s*\\\\(',\n 'eval\\\\s*\\\\(',\n 'Function\\\\s*\\\\(',\n 'innerHTML\\\\s*=',\n 'dangerouslySetInnerHTML',\n 'document\\\\.write',\n 'SELECT.*FROM.*WHERE.*\\\\+',\n 'SELECT.*FROM.*\\\\$\\\\{',\n ],\n methodology: `1. Search for injection sinks (exec, spawn, SQL queries, innerHTML)\n2. For each sink, trace back to find data sources\n3. Check if user input reaches the sink without sanitization\n4. Verify no guards/validation in the path\n5. Construct triggering input\n6. Write exact fix`,\n falsePositiveHints: [\n 'Parameterized queries are safe',\n 'Static strings passed to exec are safe',\n 'Input validated with allowlist before use is safe',\n 'React/Vue templates auto-escape (unless dangerouslySetInnerHTML)',\n ],\n },\n {\n name: 'auth-bypass',\n category: 'auth-bypass',\n description: 'Missing authentication, authorization bypass, privilege escalation',\n searchPatterns: [\n 'API routes without auth middleware',\n 'Authorization checks that can be skipped',\n 'Admin endpoints accessible without role check',\n 'IDOR: accessing resources by ID without ownership check',\n 'JWT verification that catches errors and continues',\n ],\n grepPatterns: [\n 'router\\\\.(get|post|put|delete|patch)\\\\s*\\\\(',\n 'app\\\\.(get|post|put|delete|patch)\\\\s*\\\\(',\n '\\\\.findById\\\\s*\\\\(',\n '\\\\.findOne\\\\s*\\\\(',\n 'req\\\\.user',\n 'req\\\\.session',\n 'isAdmin|isAuthenticated|requireAuth',\n 'role.*===|===.*role',\n ],\n methodology: `1. Find all API endpoints and route handlers\n2. Check each endpoint for auth middleware\n3. For protected resources, verify ownership checks\n4. Look for early returns that skip auth on error\n5. Test if admin-only actions are protected\n6. Write exact fix with proper middleware`,\n falsePositiveHints: [\n 'Public endpoints dont need auth (health, docs, etc)',\n 'Middleware applied at router level protects all routes',\n 'GraphQL resolvers may have field-level auth',\n ],\n },\n {\n name: 'null-safety',\n category: 'null-reference',\n description: 'Null/undefined dereference, missing optional chaining',\n searchPatterns: [\n 'Property access on potentially null/undefined values',\n 'Array methods on optional arrays without null check',\n 'Object.keys/values on potentially undefined objects',\n 'Chained property access without optional chaining',\n 'Async functions returning null but caller expects object',\n ],\n grepPatterns: [\n '\\\\.map\\\\s*\\\\(',\n '\\\\.filter\\\\s*\\\\(',\n '\\\\.reduce\\\\s*\\\\(',\n '\\\\.forEach\\\\s*\\\\(',\n 'Object\\\\.keys\\\\s*\\\\(',\n 'Object\\\\.values\\\\s*\\\\(',\n 'Object\\\\.entries\\\\s*\\\\(',\n '\\\\[0\\\\]\\\\.',\n '\\\\.length',\n ],\n methodology: `1. Search for array methods (.map, .filter, .reduce)\n2. Trace back to see if the array could be undefined\n3. Check for missing optional chaining (?.)\n4. Look for [0] access without checking array length\n5. Find Object.keys/values on potentially null objects\n6. Write fix with proper null checks`,\n falsePositiveHints: [\n 'TypeScript strict mode catches many of these',\n 'If variable is guaranteed by control flow, its safe',\n 'Default parameters and destructuring defaults help',\n ],\n },\n {\n name: 'type-safety',\n category: 'type-coercion',\n description: 'Unsafe type assertions, as any, non-null assertions, JSON.parse without validation',\n searchPatterns: [\n '`as any` bypassing type safety',\n 'Non-null assertion (!) without actual null check',\n '`as unknown as T` double assertion',\n 'JSON.parse() without try/catch or schema validation',\n 'Type assertion after JSON.parse: JSON.parse(x) as MyType',\n ],\n grepPatterns: [\n 'as\\\\s+any',\n 'as\\\\s+unknown\\\\s+as',\n '!\\\\s*[;,)]',\n '!\\\\.',\n 'JSON\\\\.parse\\\\s*\\\\(',\n ],\n methodology: `1. Search for \"as any\" patterns\n2. Find JSON.parse calls without try/catch\n3. Look for non-null assertions (!) without preceding checks\n4. Check if parsed JSON is validated before use\n5. Find double assertions (as unknown as T)\n6. Write fix with proper validation/type guards`,\n falsePositiveHints: [\n 'as any in test files is often acceptable',\n '! after definite assignment in same scope is safe',\n 'Zod/Joi validation after JSON.parse is safe',\n ],\n },\n {\n name: 'resource-leaks',\n category: 'resource-leak',\n description: 'Unclosed file handles, DB connections, timers, event listeners',\n searchPatterns: [\n 'setInterval without clearInterval',\n 'setTimeout stored but never cleared',\n 'Database connections not closed on error',\n 'File handles opened but not closed in finally/catch',\n 'Event listeners added but never removed',\n ],\n grepPatterns: [\n 'setInterval\\\\s*\\\\(',\n 'setTimeout\\\\s*\\\\(',\n 'addEventListener\\\\s*\\\\(',\n '\\\\.on\\\\s*\\\\(',\n 'createConnection\\\\s*\\\\(',\n 'fs\\\\.open',\n 'new.*Stream\\\\s*\\\\(',\n ],\n methodology: `1. Find setInterval calls, check for corresponding clearInterval\n2. Look for event listeners, check if removed on cleanup\n3. Find DB connection opens, verify close in error paths\n4. Check file operations have proper finally/catch cleanup\n5. Look for growing caches/maps without eviction\n6. Write fix with proper cleanup code`,\n falsePositiveHints: [\n 'Global singletons may intentionally keep connections open',\n 'React useEffect cleanup handles listener removal',\n 'Connection pools manage their own lifecycle',\n ],\n },\n {\n name: 'async-issues',\n category: 'async-issue',\n description: 'Missing await, race conditions, unhandled promises',\n searchPatterns: [\n 'async function called without await',\n 'Promise.all without error handling',\n '.then() without .catch()',\n 'Shared state modified in parallel operations',\n 'TOCTOU: check then use without atomicity',\n ],\n grepPatterns: [\n 'async\\\\s+function',\n 'async\\\\s*\\\\(',\n 'await\\\\s+',\n '\\\\.then\\\\s*\\\\(',\n 'Promise\\\\.all\\\\s*\\\\(',\n 'Promise\\\\.race\\\\s*\\\\(',\n ],\n methodology: `1. Find async function calls, verify they are awaited\n2. Look for .then() chains without .catch()\n3. Check Promise.all for error handling\n4. Find shared state mutations in async contexts\n5. Look for check-then-use patterns without transactions\n6. Write fix with proper await/error handling`,\n falsePositiveHints: [\n 'Fire-and-forget async calls may be intentional',\n 'Top-level .catch() at entry point is sufficient',\n 'Promise.allSettled handles its own errors',\n ],\n },\n {\n name: 'data-validation',\n category: 'data-validation',\n description: 'Missing input validation, schema validation, sanitization',\n searchPatterns: [\n 'req.body used directly without validation',\n 'parseInt/parseFloat without NaN check',\n 'Array index from user input without bounds check',\n 'Missing schema validation (Zod, Joi, etc)',\n 'Validation that accepts if ANY condition passes',\n ],\n grepPatterns: [\n 'req\\\\.body',\n 'req\\\\.query',\n 'req\\\\.params',\n 'parseInt\\\\s*\\\\(',\n 'parseFloat\\\\s*\\\\(',\n 'Number\\\\s*\\\\(',\n '\\\\.safeParse\\\\s*\\\\(',\n '\\\\.validate\\\\s*\\\\(',\n ],\n methodology: `1. Find all user input entry points (req.body, req.query, etc)\n2. Trace each input to see if its validated\n3. Check parseInt/parseFloat results for NaN\n4. Look for array indexing with user-controlled values\n5. Verify schema validation exists and is correct\n6. Write fix with proper validation`,\n falsePositiveHints: [\n 'Framework middleware may validate automatically',\n 'GraphQL type system provides some validation',\n 'ORMs may validate at the schema level',\n ],\n },\n {\n name: 'secrets-exposure',\n category: 'secrets-exposure',\n description: 'Hardcoded credentials, Math.random() for security, leaked tokens',\n searchPatterns: [\n 'Hardcoded passwords, API keys, or tokens',\n 'Math.random() used for IDs, tokens, or keys',\n 'Date.now() as sole source of uniqueness',\n 'Credentials in logs or error messages',\n 'Secrets in URL query parameters',\n ],\n grepPatterns: [\n 'password\\\\s*=\\\\s*[\"\\']',\n 'apiKey\\\\s*=\\\\s*[\"\\']',\n 'api_key\\\\s*=\\\\s*[\"\\']',\n 'secret\\\\s*=\\\\s*[\"\\']',\n 'token\\\\s*=\\\\s*[\"\\']',\n 'Math\\\\.random\\\\s*\\\\(',\n 'Date\\\\.now\\\\s*\\\\(',\n 'console\\\\.log.*password',\n 'console\\\\.log.*token',\n ],\n methodology: `1. Search for hardcoded credential patterns\n2. Find Math.random() calls, check if used for security\n3. Look for Date.now() as unique ID source\n4. Check logs for sensitive data exposure\n5. Find secrets in URL parameters or error messages\n6. Write fix using env vars or crypto.randomUUID()`,\n falsePositiveHints: [\n 'Test files may have fake credentials',\n '.env.example files are documentation',\n 'Math.random() for non-security uses is fine',\n ],\n },\n {\n name: 'logic-errors',\n category: 'logic-error',\n description: 'Wrong operators, incorrect conditions, regex issues, off-by-one',\n searchPatterns: [\n 'Assignment instead of comparison: if (x = 5)',\n 'Bitwise vs logical operators: & vs &&',\n 'Regex matching without anchors: /pattern/ vs /^pattern$/',\n 'Greedy matching that captures too much: .* vs .*?',\n 'Off-by-one in loops or array access',\n ],\n grepPatterns: [\n 'if\\\\s*\\\\([^=!<>]*=[^=]',\n '\\\\s&\\\\s[^&]',\n '\\\\s\\\\|\\\\s[^|]',\n '\\\\.match\\\\s*\\\\(',\n '\\\\.test\\\\s*\\\\(',\n '\\\\.replace\\\\s*\\\\(',\n 'for\\\\s*\\\\(.*<.*\\\\.length',\n 'while\\\\s*\\\\(',\n ],\n methodology: `1. Search for regex patterns, check for proper anchoring\n2. Find comparisons, look for = instead of ===\n3. Check bitwise operators that should be logical\n4. Look for loop bounds that could be off-by-one\n5. Find string operations that could exceed bounds\n6. Write fix with correct operators/bounds`,\n falsePositiveHints: [\n 'Some bitwise operations are intentional',\n 'Unanchored regex may be intentional for substring match',\n 'Assignment in condition is sometimes intentional (with extra parens)',\n ],\n },\n {\n name: 'cross-file-flow',\n category: 'intent-violation',\n description: 'Data flow across module boundaries, API contract violations',\n searchPatterns: [\n 'Function returns type A but callers expect type B',\n 'Error thrown but not caught by callers',\n 'Null returned but callers dont check',\n 'Side effects not documented or expected',\n 'Module exports not matching imports',\n ],\n grepPatterns: [\n 'export\\\\s+(function|const|class|interface)',\n 'import\\\\s+\\\\{',\n 'throw\\\\s+new',\n 'return\\\\s+null',\n 'return\\\\s+undefined',\n ],\n methodology: `1. Find exported functions and their signatures\n2. Trace callers to verify they handle all return types\n3. Check if thrown errors are caught by callers\n4. Look for null returns that callers dont handle\n5. Verify interface contracts match implementations\n6. Write fix to align contracts and usage`,\n falsePositiveHints: [\n 'TypeScript enforces many interface contracts',\n 'Central error handlers may catch everything',\n 'Some null returns are intentional API design',\n ],\n },\n];\n\n/**\n * Get pass configuration by name\n */\nexport function getPassConfig(name: string): PassConfig | undefined {\n return SCAN_PASSES.find(p => p.name === name);\n}\n\n/**\n * Get passes for a specific category\n */\nexport function getPassesForCategory(category: BugCategory): PassConfig[] {\n return SCAN_PASSES.filter(p => p.category === category);\n}\n\n/**\n * Calculate hash for deduplication\n */\nexport function calculateBugHash(bug: Bug): string {\n // Bugs are duplicates if same file, line range, and category\n const key = `${bug.file}:${bug.line}:${bug.endLine || bug.line}:${bug.category}`;\n return key;\n}\n\n/**\n * Deduplicate bugs from multiple passes\n * Keeps the bug with highest confidence when duplicates exist\n */\nexport function deduplicateBugs(bugs: Bug[]): { unique: Bug[]; duplicatesRemoved: number } {\n const seen = new Map<string, Bug>();\n\n for (const bug of bugs) {\n const hash = calculateBugHash(bug);\n const existing = seen.get(hash);\n\n if (!existing) {\n seen.set(hash, bug);\n } else {\n // Keep the one with higher confidence\n const confidenceOrder = { high: 3, medium: 2, low: 1 };\n if (confidenceOrder[bug.confidence.overall] > confidenceOrder[existing.confidence.overall]) {\n seen.set(hash, bug);\n }\n }\n }\n\n return {\n unique: Array.from(seen.values()),\n duplicatesRemoved: bugs.length - seen.size,\n };\n}\n\n/**\n * Check if two bugs are semantically similar (for near-duplicate detection)\n */\nexport function areSimilarBugs(a: Bug, b: Bug): boolean {\n // Same file and overlapping line range\n if (a.file !== b.file) return false;\n\n const aStart = a.line;\n const aEnd = a.endLine || a.line;\n const bStart = b.line;\n const bEnd = b.endLine || b.line;\n\n // Check for overlap\n const overlap = !(aEnd < bStart || bEnd < aStart);\n if (!overlap) return false;\n\n // Same or related category\n const relatedCategories: Record<string, string[]> = {\n 'injection': ['injection', 'data-validation'],\n 'null-reference': ['null-reference', 'type-coercion'],\n 'type-coercion': ['type-coercion', 'null-reference', 'logic-error'],\n 'logic-error': ['logic-error', 'type-coercion', 'boundary-error'],\n };\n\n const related = relatedCategories[a.category] || [a.category];\n return related.includes(b.category);\n}\n\n/**\n * Merge similar bugs (near-duplicates from different passes)\n */\nexport function mergeSimilarBugs(bugs: Bug[]): Bug[] {\n const merged: Bug[] = [];\n const used = new Set<number>();\n\n for (let i = 0; i < bugs.length; i++) {\n if (used.has(i)) continue;\n\n let best = bugs[i];\n\n for (let j = i + 1; j < bugs.length; j++) {\n if (used.has(j)) continue;\n\n if (areSimilarBugs(best, bugs[j])) {\n used.add(j);\n // Keep the one with higher confidence and more evidence\n const jBetter =\n bugs[j].confidence.overall === 'high' && best.confidence.overall !== 'high' ||\n bugs[j].evidence.length > best.evidence.length;\n\n if (jBetter) {\n // Merge evidence from both\n bugs[j].evidence = [...new Set([...bugs[j].evidence, ...best.evidence])];\n best = bugs[j];\n } else {\n // Add evidence from the other bug\n best.evidence = [...new Set([...best.evidence, ...bugs[j].evidence])];\n }\n }\n }\n\n merged.push(best);\n }\n\n return merged;\n}\n","/**\n * Flow Analyzer - Integration & E2E Bug Hunting\n *\n * This is what makes whiterose 10x better than pattern matching.\n *\n * Unit analysis asks: \"Is there a bug in this function?\"\n * Flow analysis asks: \"Can an attacker actually exploit this?\"\n *\n * Three levels of analysis:\n * 1. DATA FLOW - Trace user input from entry to sink\n * 2. CONTROL FLOW - Trace auth/validation through the call chain\n * 3. ATTACK CHAINS - Find combinations that create real exploits\n */\n\n\n// ─────────────────────────────────────────────────────────────\n// Flow Analysis Pass Definitions\n// ─────────────────────────────────────────────────────────────\n\nexport interface FlowPassConfig {\n name: string;\n level: 'integration' | 'e2e';\n description: string;\n entryPointPatterns: string[];\n traceInstructions: string;\n whatToFind: string[];\n exampleVulnerability: string;\n}\n\nexport const FLOW_PASSES: FlowPassConfig[] = [\n // ───────────────────────────────────────────────────────────\n // INTEGRATION PASSES - Trace across components\n // ───────────────────────────────────────────────────────────\n {\n name: 'auth-flow-trace',\n level: 'integration',\n description: 'Trace authentication from middleware to every protected route',\n entryPointPatterns: [\n 'auth middleware files',\n 'JWT verification functions',\n 'session validation',\n 'route definitions with auth requirements',\n ],\n traceInstructions: `1. Find all auth middleware (isAuthenticated, requireAuth, verifyToken, etc.)\n2. Map which routes use this middleware\n3. For EACH route that should be protected:\n - Verify the middleware is actually applied\n - Check the middleware can't be bypassed (early returns, error handling)\n - Verify the middleware result is actually used (not just called)\n4. Find routes that SHOULD be protected but AREN'T\n5. Find routes where auth check happens but result is ignored`,\n whatToFind: [\n 'Routes missing auth middleware that access user data',\n 'Auth middleware that catches errors and continues',\n 'Auth check result not used (called but ignored)',\n 'Auth bypass via parameter pollution or type confusion',\n 'Different auth levels not enforced (user vs admin)',\n ],\n exampleVulnerability: `// Auth middleware exists but not applied to sensitive route\nrouter.get('/users', authMiddleware, listUsers); // Protected\nrouter.delete('/users/:id', deleteUser); // UNPROTECTED - missing authMiddleware!\n\n// Or: Auth check that fails open\nasync function authMiddleware(req, res, next) {\n try {\n req.user = verifyToken(req.headers.auth);\n } catch (e) {\n // BUG: Continues even on auth failure!\n }\n next();\n}`,\n },\n {\n name: 'data-flow-trace',\n level: 'integration',\n description: 'Trace user input from HTTP entry to dangerous sinks',\n entryPointPatterns: [\n 'req.body, req.query, req.params',\n 'request.json(), request.form()',\n 'event.body (Lambda)',\n 'ctx.request.body (Koa)',\n ],\n traceInstructions: `1. Find all HTTP entry points (routes, handlers, controllers)\n2. Identify where user input enters (req.body, req.query, etc.)\n3. TRACE each input through the code:\n - Follow variable assignments\n - Follow function calls (input passed as argument)\n - Follow returns (input returned and used by caller)\n - Follow object properties (input stored in object, object passed around)\n4. Track what transformations happen (validation? sanitization? encoding?)\n5. Find where the input reaches a SINK:\n - Database queries (SQL, NoSQL)\n - Command execution (exec, spawn)\n - File operations (readFile, writeFile)\n - HTML rendering (innerHTML, template)\n - URL construction (fetch, redirect)\n6. Verify transformations between entry and sink actually prevent exploitation`,\n whatToFind: [\n 'Input reaches SQL query without parameterization',\n 'Input reaches exec/spawn without sanitization',\n 'Input reaches file path without path traversal check',\n 'Input reaches HTML without encoding',\n 'Input validated at controller but re-fetched raw at service layer',\n 'Validation exists but can be bypassed via type coercion',\n ],\n exampleVulnerability: `// Controller validates, but service re-reads raw input\n// CONTROLLER\nasync function updateUser(req, res) {\n const { name } = validateInput(req.body); // Validated!\n await userService.update(req.params.id, req.body); // BUG: Passes raw req.body!\n}\n\n// SERVICE\nasync function update(id, data) {\n await db.query(\\`UPDATE users SET name = '\\${data.name}' WHERE id = \\${id}\\`);\n // data.name is RAW - validation was bypassed!\n}`,\n },\n {\n name: 'validation-boundary-trace',\n level: 'integration',\n description: 'Trace validation across layer boundaries',\n entryPointPatterns: [\n 'Zod/Joi/Yup schema definitions',\n 'validate() function calls',\n 'Type assertions after parse',\n 'Controller input handling',\n ],\n traceInstructions: `1. Find all validation points (Zod schemas, Joi, manual validation)\n2. For each validation:\n - What does it validate? (type, format, range, etc.)\n - Where is it applied? (controller, service, repository)\n3. Trace data AFTER validation:\n - Is the validated data used, or is raw data re-read?\n - Can downstream code receive unvalidated data via another path?\n - Are there type assertions that assume validation happened?\n4. Find GAPS:\n - Data enters via path A (validated) and path B (not validated)\n - Validation at edge, but internal services trust any input\n - Partial validation (checks type but not format/range)`,\n whatToFind: [\n 'Raw data used after validation point (validation bypassed)',\n 'Internal APIs callable without going through validated entry point',\n 'Type assertion assumes validation that may not have happened',\n 'Validation schema is incomplete (missing fields attackers can inject)',\n 'Validation at HTTP layer but WebSocket bypasses it',\n ],\n exampleVulnerability: `// Validation exists but internal API bypasses it\n// PUBLIC API - Validated\napp.post('/api/users', validateBody(userSchema), createUser);\n\n// INTERNAL API - No validation!\napp.post('/internal/users', createUser); // Same handler, no validation\n\n// Or: GraphQL resolver bypasses REST validation\n// REST is validated, but GraphQL calls same service without validation`,\n },\n {\n name: 'error-propagation-trace',\n level: 'integration',\n description: 'Trace how errors bubble up and where they leak or fail open',\n entryPointPatterns: [\n 'try/catch blocks',\n 'Promise .catch() handlers',\n 'Error middleware',\n 'Global error handlers',\n ],\n traceInstructions: `1. Find all error handling points (try/catch, .catch, error middleware)\n2. For each error handler:\n - What errors does it catch?\n - What does it do? (log, return, rethrow, ignore)\n - Does it expose sensitive info? (stack traces, SQL errors, internal paths)\n3. Trace error propagation:\n - If function A throws, does caller B handle it?\n - If B doesn't handle, does it propagate to user?\n4. Find DANGEROUS patterns:\n - catch {} (empty catch - swallows error, continues)\n - catch { log(error) } (logs but continues as if success)\n - catch { return null } (fails silent, caller doesn't know)\n - Error message includes internal details`,\n whatToFind: [\n 'Empty catch blocks that swallow errors',\n 'Auth errors caught and converted to success',\n 'Database errors exposed to user (leaks schema info)',\n 'Stack traces returned in production',\n 'Error handling differs between environments (dev vs prod)',\n ],\n exampleVulnerability: `// Auth check fails open on error\nasync function requireAdmin(req, res, next) {\n try {\n const user = await getUser(req.userId);\n if (user.role !== 'admin') return res.status(403).send('Forbidden');\n } catch (error) {\n console.error(error);\n // BUG: No return! Falls through to next() on error\n }\n next();\n}\n\n// Or: Error leaks internal info\ncatch (error) {\n res.status(500).json({\n error: error.message, // \"ECONNREFUSED 10.0.0.5:5432\" - leaks internal IP!\n stack: error.stack // Full stack trace with file paths\n });\n}`,\n },\n {\n name: 'trust-boundary-trace',\n level: 'integration',\n description: 'Find where trusted and untrusted data cross boundaries',\n entryPointPatterns: [\n 'External API calls (fetch, axios)',\n 'Database reads (might contain user-injected data)',\n 'File reads (config, uploads)',\n 'Message queues (events from other services)',\n ],\n traceInstructions: `1. Map TRUST BOUNDARIES:\n - User input (always untrusted)\n - Database data (may contain user-injected content)\n - External API responses (untrusted)\n - Config files (trusted if not user-editable)\n - Environment variables (trusted)\n2. Find where untrusted data BECOMES trusted:\n - Database read assumed to be safe (but contains user content)\n - External API response used without validation\n - Uploaded file content used directly\n3. Find IMPLICIT TRUST:\n - \"This came from our database so it's safe\" (wrong!)\n - \"This is from our other microservice so it's trusted\" (wrong!)\n - \"The user is authenticated so their input is safe\" (wrong!)`,\n whatToFind: [\n 'Database content used in SQL query (stored XSS becomes SQLi)',\n 'External API response used in template (SSRF + XSS chain)',\n 'Uploaded file content executed or included',\n 'Inter-service communication without validation',\n 'User-controlled config file paths',\n ],\n exampleVulnerability: `// Data from database treated as trusted\nasync function renderProfile(userId) {\n const user = await db.users.findById(userId);\n // user.bio was set by the user - contains untrusted content!\n return \\`<div>\\${user.bio}</div>\\`; // STORED XSS - bio contains <script>\n}\n\n// Or: External API response trusted\nconst data = await fetch('https://partner-api.com/data').then(r => r.json());\nawait db.query(\\`INSERT INTO cache VALUES ('\\${data.value}')\\`); // SQLi via partner API!`,\n },\n\n // ───────────────────────────────────────────────────────────\n // E2E PASSES - Full attack scenarios\n // ───────────────────────────────────────────────────────────\n {\n name: 'attack-chain-analysis',\n level: 'e2e',\n description: 'Find combinations of issues that create exploitable attack chains',\n entryPointPatterns: [\n 'All previously found vulnerabilities',\n 'Low-severity issues that combine into high-severity',\n 'Information disclosure + action endpoints',\n ],\n traceInstructions: `1. Review all findings (including low-severity)\n2. Look for CHAINS:\n - Info disclosure → targeted attack (leak user IDs → IDOR)\n - XSS → session theft → account takeover\n - SSRF → internal service access → data exfiltration\n - SQLi read → credential theft → privilege escalation\n - Open redirect → OAuth token theft → account takeover\n3. For each potential chain:\n - Can step 1 realistically be achieved?\n - Does step 1 output enable step 2?\n - What's the final impact?\n4. Look for AMPLIFICATION:\n - One SQLi → dump all credentials → compromise all accounts\n - One admin takeover → backdoor all users`,\n whatToFind: [\n 'XSS + sensitive action without CSRF protection',\n 'IDOR + bulk enumeration = dump all user data',\n 'Error message leaks + targeted SQLi',\n 'Open redirect + OAuth flow = token theft',\n 'SSRF + cloud metadata = credential theft',\n 'Low-priv user + missing authz = admin actions',\n ],\n exampleVulnerability: `// CHAIN: Reflected XSS → Admin Account Takeover\n\n// Step 1: Reflected XSS in search (low severity alone)\napp.get('/search', (req, res) => {\n res.send(\\`Results for: \\${req.query.q}\\`); // XSS\n});\n\n// Step 2: Admin action without CSRF protection\napp.post('/admin/make-admin', requireAdmin, (req, res) => {\n await makeUserAdmin(req.body.userId); // No CSRF token!\n});\n\n// ATTACK: Send admin link with XSS payload that:\n// 1. Executes in admin's browser\n// 2. Calls /admin/make-admin with attacker's userId\n// 3. Attacker is now admin\n\n// Individual bugs are medium, chain is CRITICAL`,\n },\n {\n name: 'privilege-escalation-trace',\n level: 'e2e',\n description: 'Trace paths from low-privilege user to high-privilege actions',\n entryPointPatterns: [\n 'Role definitions (user, admin, superadmin)',\n 'Permission checks',\n 'Admin-only endpoints',\n 'User data access patterns',\n ],\n traceInstructions: `1. Map the PERMISSION MODEL:\n - What roles exist? (user, admin, etc.)\n - What can each role do?\n - How are roles assigned/checked?\n2. For EACH admin/elevated action:\n - What checks prevent normal users?\n - Can checks be bypassed? (parameter tampering, type confusion)\n - Is role checked at every layer or just the edge?\n3. Find ESCALATION PATHS:\n - User can modify their own role field\n - Admin check uses user-controlled data\n - Internal API doesn't re-check permissions\n - Race condition in permission update`,\n whatToFind: [\n 'Role field modifiable via mass assignment',\n 'Admin check compares string (user can inject \"admin\")',\n 'Permission cached and not re-validated',\n 'GraphQL allows querying role mutation directly',\n 'Different endpoints with different permission checks for same action',\n ],\n exampleVulnerability: `// Mass assignment allows role modification\napp.put('/users/:id', async (req, res) => {\n const user = await User.findById(req.params.id);\n Object.assign(user, req.body); // BUG: Assigns ALL fields including role!\n await user.save();\n});\n\n// Attacker sends: PUT /users/123 { \"role\": \"admin\" }\n\n// Or: Permission check uses string comparison\nif (user.role == 'admin') { ... } // BUG: '0' == 0, type coercion issues\n\n// Or: Different layers, different checks\n// REST: requireAdmin middleware\n// GraphQL: No permission check on same resolver`,\n },\n {\n name: 'session-lifecycle-trace',\n level: 'e2e',\n description: 'Trace complete session lifecycle for security gaps',\n entryPointPatterns: [\n 'Login/authentication endpoints',\n 'Token/session generation',\n 'Token validation functions',\n 'Logout/session termination',\n ],\n traceInstructions: `1. TRACE LOGIN FLOW:\n - How are credentials verified?\n - How is session/token generated?\n - Is token random enough? (not Math.random!)\n - What's stored in token? (user ID, role, etc.)\n2. TRACE VALIDATION FLOW:\n - How is token validated on each request?\n - Is signature verified?\n - Is expiration checked?\n - Can token be forged?\n3. TRACE LOGOUT FLOW:\n - Is token actually invalidated?\n - Server-side session destroyed?\n - Can old token still be used?\n4. Find GAPS:\n - Token never expires\n - Logout doesn't invalidate token (JWT with no blacklist)\n - Token can be generated without proper auth\n - Token content can be modified (weak signature)`,\n whatToFind: [\n 'JWT with none algorithm accepted',\n 'Session token generated with Math.random()',\n 'Token not invalidated on logout (replay attacks)',\n 'Token expiration not checked on validation',\n 'Refresh token rotation not implemented',\n 'Session fixation (token not regenerated on login)',\n ],\n exampleVulnerability: `// Token generated with weak randomness\nfunction generateToken() {\n return Math.random().toString(36).slice(2); // PREDICTABLE!\n}\n\n// JWT 'none' algorithm accepted\nconst decoded = jwt.verify(token, secret, { algorithms: ['HS256', 'none'] });\n\n// Logout doesn't invalidate token\napp.post('/logout', (req, res) => {\n res.clearCookie('token'); // Client-side only!\n // BUG: Token still valid! Attacker with token can still use it\n});\n\n// Token never expires\nconst token = jwt.sign({ userId }, secret); // No expiresIn!`,\n },\n {\n name: 'user-journey-simulation',\n level: 'e2e',\n description: 'Simulate complete user journeys and find security gaps',\n entryPointPatterns: [\n 'Signup/registration flow',\n 'Login flow',\n 'Password reset flow',\n 'Critical actions (payment, delete, transfer)',\n ],\n traceInstructions: `1. MAP CRITICAL JOURNEYS:\n - Signup → email verify → login → use app\n - Forgot password → reset link → new password\n - Browse → add to cart → checkout → payment\n - Settings → delete account → confirm\n2. For EACH journey, check at EVERY step:\n - Can step be skipped?\n - Can step be replayed?\n - Can step be done out of order?\n - Is state properly tracked?\n3. Find GAPS:\n - Email verification can be skipped\n - Password reset token doesn't expire\n - Payment completes before verification\n - Delete confirmation can be bypassed`,\n whatToFind: [\n 'Email verification skippable (access features without verifying)',\n 'Password reset token reusable (use same link multiple times)',\n 'Checkout flow can skip payment verification',\n 'State machine allows illegal transitions',\n 'CSRF on critical actions (delete, transfer)',\n 'Rate limiting missing on sensitive operations',\n ],\n exampleVulnerability: `// Email verification bypassable\napp.post('/signup', async (req, res) => {\n const user = await User.create({ ...req.body, verified: false });\n sendVerificationEmail(user);\n res.json({ token: generateToken(user) }); // BUG: Token given before verification!\n});\n\n// User can access protected features without verifying email\n\n// Or: Password reset token never expires\napp.post('/forgot-password', async (req, res) => {\n const token = generateToken();\n await saveResetToken(req.body.email, token); // No expiration!\n // Token valid forever - old emails can be used to reset\n});\n\n// Or: Payment can be skipped\napp.post('/complete-order', async (req, res) => {\n const order = await Order.findById(req.body.orderId);\n order.status = 'completed'; // BUG: No check if payment succeeded!\n await order.save();\n});`,\n },\n {\n name: 'api-contract-verification',\n level: 'e2e',\n description: 'Verify API actually enforces what types/docs promise',\n entryPointPatterns: [\n 'OpenAPI/Swagger definitions',\n 'TypeScript API types',\n 'GraphQL schema',\n 'API documentation',\n ],\n traceInstructions: `1. Find API CONTRACT (OpenAPI, types, docs):\n - What fields are required?\n - What are the valid values/ranges?\n - What authentication is required?\n2. Compare CONTRACT vs IMPLEMENTATION:\n - Does code validate all required fields?\n - Does code enforce value ranges?\n - Does code check auth as documented?\n3. Find MISMATCHES:\n - Docs say \"required\" but code has default\n - Type says \"number\" but code accepts string\n - Docs say \"admin only\" but no middleware\n4. These mismatches are BUGS:\n - Security controls documented but not implemented\n - Validation promised but not enforced`,\n whatToFind: [\n 'OpenAPI says required but code has fallback',\n 'Type says admin-only but no role check',\n 'Schema says max 100 but code allows more',\n 'Docs say authenticated but route is public',\n 'GraphQL schema allows query that should be forbidden',\n ],\n exampleVulnerability: `// OpenAPI says adminOnly: true\n// paths:\n// /admin/users:\n// get:\n// security:\n// - adminAuth: []\n\n// But implementation has no check!\napp.get('/admin/users', async (req, res) => { // No auth middleware!\n const users = await User.find();\n res.json(users);\n});\n\n// Or: TypeScript type vs runtime\ninterface CreateUserInput {\n name: string;\n email: string;\n role?: 'user'; // Only 'user' allowed\n}\n\n// But implementation:\nconst user = await User.create(req.body); // No validation! role:'admin' accepted`,\n },\n];\n\n/**\n * Get flow passes by level\n */\nexport function getFlowPassesByLevel(level: 'integration' | 'e2e'): FlowPassConfig[] {\n return FLOW_PASSES.filter(p => p.level === level);\n}\n\n/**\n * Get all flow pass names in recommended order\n */\nexport function getFlowPassOrder(): string[] {\n // Integration first (builds understanding), then E2E (uses that understanding)\n return [\n // Integration passes\n 'auth-flow-trace',\n 'data-flow-trace',\n 'validation-boundary-trace',\n 'error-propagation-trace',\n 'trust-boundary-trace',\n // E2E passes\n 'attack-chain-analysis',\n 'privilege-escalation-trace',\n 'session-lifecycle-trace',\n 'user-journey-simulation',\n 'api-contract-verification',\n ];\n}\n\n/**\n * Get flow pass config by name\n */\nexport function getFlowPassConfig(name: string): FlowPassConfig | undefined {\n return FLOW_PASSES.find(p => p.name === name);\n}\n","export function generateBugId(index: number): string {\n return `WR-${String(index + 1).padStart(3, '0')}`;\n}\n\nexport function parseBugId(id: string): number | null {\n const match = id.match(/^WR-(\\d+)$/);\n if (!match) return null;\n return parseInt(match[1], 10) - 1;\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + '...';\n}\n\nexport function pluralize(count: number, singular: string, plural?: string): string {\n return count === 1 ? singular : plural || `${singular}s`;\n}\n","/**\n * Core Scanner - LSP-Compliant Architecture\n *\n * Scanning logic lives HERE, not in providers.\n * Providers are just \"dumb prompt executors\".\n *\n * This ensures all providers get the same 19-pass scanning,\n * batching, deduplication, and merging logic.\n */\n\nimport { Bug, CodebaseUnderstanding, WhiteroseConfig, BugCategory, BugSeverity, ConfidenceLevel, CodePathStep, FeatureIntent, BehavioralContract } from '../types.js';\nimport { getFullAnalysisPipeline } from '../providers/prompts/flow-analysis-prompts.js';\nimport { buildPassPrompt } from '../providers/prompts/multipass-prompts.js';\nimport { buildFlowAnalysisPrompt } from '../providers/prompts/flow-analysis-prompts.js';\nimport { buildUnderstandingPrompt } from '../providers/prompts/understanding.js';\nimport { getPassConfig } from './multipass-scanner.js';\nimport { getFlowPassConfig } from './flow-analyzer.js';\nimport { generateBugId } from './utils.js';\n\n// ─────────────────────────────────────────────────────────────\n// Simple Provider Interface (LSP-compliant)\n// ─────────────────────────────────────────────────────────────\n\nexport interface PromptOptions {\n cwd: string;\n timeout?: number;\n}\n\nexport interface PromptResult {\n output: string;\n error?: string;\n}\n\n/**\n * Minimal interface that ALL providers must implement.\n * No scanning logic - just execute prompts and return results.\n */\nexport interface PromptExecutor {\n name: string;\n isAvailable(): Promise<boolean>;\n runPrompt(prompt: string, options: PromptOptions): Promise<PromptResult>;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Scanner Configuration\n// ─────────────────────────────────────────────────────────────\n\nexport interface ScannerConfig {\n batchSize: number;\n batchDelayMs: number;\n passTimeoutMs: number;\n}\n\nexport const DEFAULT_SCANNER_CONFIG: ScannerConfig = {\n batchSize: 5,\n batchDelayMs: 2000,\n passTimeoutMs: 300000, // 5 minutes per pass\n};\n\nexport interface StaticFinding {\n tool: string;\n file: string;\n line: number;\n message: string;\n severity: string;\n}\n\nexport interface ScanContext {\n files: string[];\n understanding: CodebaseUnderstanding;\n staticResults: StaticFinding[];\n config?: WhiteroseConfig;\n}\n\nexport interface ScanProgress {\n onPhaseStart?: (phase: string, passCount: number) => void;\n onPassStart?: (passName: string) => void;\n onPassComplete?: (passName: string, bugCount: number) => void;\n onPassError?: (passName: string, error: string) => void;\n onBugFound?: (bug: Bug) => void;\n onProgress?: (message: string) => void;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Core Scanner\n// ─────────────────────────────────────────────────────────────\n\nexport class CoreScanner {\n private executor: PromptExecutor;\n private config: ScannerConfig;\n private progress: ScanProgress;\n private passErrors: Array<{ passName: string; error: string }> = [];\n\n constructor(\n executor: PromptExecutor,\n config: Partial<ScannerConfig> = {},\n progress: ScanProgress = {}\n ) {\n this.executor = executor;\n this.config = { ...DEFAULT_SCANNER_CONFIG, ...config };\n this.progress = progress;\n }\n\n /**\n * Get errors that occurred during the last scan.\n * Returns an array of pass names and their error messages.\n */\n getPassErrors(): Array<{ passName: string; error: string }> {\n return this.passErrors;\n }\n\n /**\n * Check if any passes failed during the last scan.\n */\n hasPassErrors(): boolean {\n return this.passErrors.length > 0;\n }\n\n /**\n * Run a thorough 19-pass scan with findings flowing through pipeline:\n *\n * Static Analysis → Unit Passes → Integration Passes → E2E Passes\n * ↓ ↓ ↓\n * unitFindings → integrationFindings → e2eFindings\n * └──────────────┴─────────────────┘\n * ↓\n * Combined + Deduped\n */\n async scan(context: ScanContext): Promise<Bug[]> {\n const cwd = process.cwd();\n const startTime = Date.now();\n\n // Reset pass errors for this scan\n this.passErrors = [];\n\n // Get all passes from the pipeline\n const pipeline = getFullAnalysisPipeline();\n const unitPasses = pipeline[0].passes;\n const integrationPasses = pipeline[1].passes;\n const e2ePasses = pipeline[2].passes;\n const totalPasses = unitPasses.length + integrationPasses.length + e2ePasses.length;\n\n this.report(`\\n════ CORE SCANNER (PIPELINE MODE) ════`);\n this.report(` Provider: ${this.executor.name}`);\n this.report(` Passes: ${totalPasses} (${unitPasses.length} unit → ${integrationPasses.length} integration → ${e2ePasses.length} E2E)`);\n this.report(` Findings flow: Unit → Integration → E2E`);\n\n let globalBugIndex = 0;\n\n // ═══════════════════════════════════════════════════════════\n // PHASE 1: Unit Passes (pattern matching, single-file bugs)\n // Input: staticResults only\n // ═══════════════════════════════════════════════════════════\n this.report(`\\n════ PHASE 1: UNIT ANALYSIS ════`);\n this.report(` Looking for: injection, null refs, auth bypass, etc.`);\n\n const unitJobs = this.buildUnitPassJobs(context, unitPasses);\n const unitFindings = await this.runPassBatch(unitJobs, cwd, context.files, globalBugIndex);\n globalBugIndex += unitFindings.length;\n\n this.report(` Phase 1 complete: ${unitFindings.length} findings`);\n\n // ═══════════════════════════════════════════════════════════\n // PHASE 2: Integration Passes (cross-file data flow)\n // Input: staticResults + unitFindings\n // ═══════════════════════════════════════════════════════════\n this.report(`\\n════ PHASE 2: INTEGRATION ANALYSIS ════`);\n this.report(` Building on ${unitFindings.length} unit findings`);\n this.report(` Looking for: auth flows, data flows, trust boundaries`);\n\n const integrationJobs = this.buildIntegrationPassJobs(context, integrationPasses, unitFindings);\n const integrationFindings = await this.runPassBatch(integrationJobs, cwd, context.files, globalBugIndex);\n globalBugIndex += integrationFindings.length;\n\n this.report(` Phase 2 complete: ${integrationFindings.length} findings`);\n\n // ═══════════════════════════════════════════════════════════\n // PHASE 3: E2E Passes (attack chains, full scenarios)\n // Input: staticResults + unitFindings + integrationFindings\n // ═══════════════════════════════════════════════════════════\n this.report(`\\n════ PHASE 3: E2E ANALYSIS ════`);\n this.report(` Building on ${unitFindings.length} unit + ${integrationFindings.length} integration findings`);\n this.report(` Looking for: attack chains, privilege escalation, session bugs`);\n\n const allPreviousFindings = [...unitFindings, ...integrationFindings];\n const e2eJobs = this.buildE2EPassJobs(context, e2ePasses, allPreviousFindings);\n const e2eFindings = await this.runPassBatch(e2eJobs, cwd, context.files, globalBugIndex);\n\n this.report(` Phase 3 complete: ${e2eFindings.length} findings`);\n\n // ═══════════════════════════════════════════════════════════\n // POST-PROCESSING: Combine and deduplicate\n // ═══════════════════════════════════════════════════════════\n this.report(`\\n════ POST-PROCESSING ════`);\n\n const allBugs = [...unitFindings, ...integrationFindings, ...e2eFindings];\n this.report(` Total raw findings: ${allBugs.length}`);\n\n const { unique: dedupedBugs, duplicatesRemoved } = this.deduplicateBugs(allBugs);\n this.report(` Removed ${duplicatesRemoved} duplicates`);\n\n const mergedBugs = this.mergeSimilarBugs(dedupedBugs);\n const similarMerged = dedupedBugs.length - mergedBugs.length;\n if (similarMerged > 0) {\n this.report(` Merged ${similarMerged} similar findings`);\n }\n\n // Summary\n const duration = Date.now() - startTime;\n const minutes = Math.floor(duration / 60000);\n const seconds = Math.round((duration % 60000) / 1000);\n\n this.report(`\\n════ SCAN COMPLETE ════`);\n this.report(` Duration: ${minutes}m ${seconds}s`);\n this.report(` Unit: ${unitFindings.length} → Integration: ${integrationFindings.length} → E2E: ${e2eFindings.length}`);\n this.report(` Final bugs: ${mergedBugs.length}`);\n\n return mergedBugs;\n }\n\n /**\n * Run a batch of passes in parallel (within a phase)\n */\n private async runPassBatch(\n passes: Array<{ name: string; prompt: string }>,\n cwd: string,\n files: string[],\n startIndex: number\n ): Promise<Bug[]> {\n const allBugs: Bug[] = [];\n let bugIndex = startIndex;\n\n for (let i = 0; i < passes.length; i += this.config.batchSize) {\n const batch = passes.slice(i, i + this.config.batchSize);\n const batchNum = Math.floor(i / this.config.batchSize) + 1;\n const totalBatches = Math.ceil(passes.length / this.config.batchSize);\n\n this.report(`\\n [Batch ${batchNum}/${totalBatches}] ${batch.map(p => p.name).join(', ')}`);\n\n const batchPromises = batch.map(async (pass) => {\n this.progress.onPassStart?.(pass.name);\n\n try {\n const result = await this.executor.runPrompt(pass.prompt, {\n cwd,\n timeout: this.config.passTimeoutMs,\n });\n\n const bugs = this.parseResponse(result.output, files, bugIndex, pass.name);\n bugIndex += bugs.length;\n\n this.progress.onPassComplete?.(pass.name, bugs.length);\n this.report(` ✓ ${pass.name}: ${bugs.length} bugs`);\n\n return bugs;\n } catch (error: any) {\n const errorMsg = error.message || String(error);\n this.progress.onPassError?.(pass.name, errorMsg);\n this.report(` ✗ ${pass.name}: ${errorMsg}`);\n // Track the error so callers can detect failed passes\n this.passErrors.push({ passName: pass.name, error: errorMsg });\n return [];\n }\n });\n\n const batchResults = await Promise.allSettled(batchPromises);\n\n for (const result of batchResults) {\n if (result.status === 'fulfilled') {\n allBugs.push(...result.value);\n }\n }\n\n // Delay between batches (except last)\n if (i + this.config.batchSize < passes.length) {\n await this.delay(this.config.batchDelayMs);\n }\n }\n\n return allBugs;\n }\n\n /**\n * Run a quick single-pass scan\n */\n async quickScan(context: ScanContext): Promise<Bug[]> {\n const cwd = process.cwd();\n\n // Reset pass errors for this scan\n this.passErrors = [];\n\n this.report(`\\n════ QUICK SCAN ════`);\n this.report(` Provider: ${this.executor.name}`);\n\n const prompt = this.buildQuickScanPrompt(context);\n\n try {\n const result = await this.executor.runPrompt(prompt, {\n cwd,\n timeout: this.config.passTimeoutMs,\n });\n\n const bugs = this.parseResponse(result.output, context.files, 0, 'quick-scan');\n this.report(` Found ${bugs.length} bugs`);\n\n return bugs;\n } catch (error: any) {\n const errorMsg = error.message || String(error);\n this.report(` Error: ${errorMsg}`);\n // Track the error so callers can detect failed passes\n this.passErrors.push({ passName: 'quick-scan', error: errorMsg });\n return [];\n }\n }\n\n /**\n * Generate codebase understanding (for init/refresh commands)\n * Uses the LLM to analyze project structure and extract features\n */\n async generateUnderstanding(files: string[], existingDocsSummary?: string): Promise<CodebaseUnderstanding> {\n const cwd = process.cwd();\n\n this.report(`\\n════ GENERATING UNDERSTANDING ════`);\n this.report(` Provider: ${this.executor.name}`);\n this.report(` Files: ${files.length}`);\n\n const prompt = buildUnderstandingPrompt({ existingDocsSummary });\n\n try {\n const result = await this.executor.runPrompt(prompt, {\n cwd,\n timeout: this.config.passTimeoutMs * 2, // Allow more time for understanding\n });\n\n const understanding = this.parseUnderstandingResponse(result.output, files);\n this.report(` Understanding complete`);\n\n return understanding;\n } catch (error: any) {\n this.report(` Error: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Parse understanding response from LLM\n */\n private parseUnderstandingResponse(output: string, files: string[]): CodebaseUnderstanding {\n // Try to extract JSON from <json></json> tags\n const jsonMatch = output.match(/<json>([\\s\\S]*?)<\\/json>/);\n let parsed: any;\n\n if (jsonMatch) {\n try {\n parsed = JSON.parse(jsonMatch[1]);\n } catch {\n // Try markdown code block\n const codeBlockMatch = output.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (codeBlockMatch) {\n parsed = JSON.parse(codeBlockMatch[1]);\n }\n }\n } else {\n // Try to find a valid JSON object by testing each closing brace position\n // The greedy regex would fail if there are trailing braces in explanatory text\n const firstBrace = output.indexOf('{');\n if (firstBrace !== -1) {\n // Find all closing brace positions and try each one (from earliest to latest)\n const substring = output.slice(firstBrace);\n let depth = 0;\n let inString = false;\n let escape = false;\n\n for (let i = 0; i < substring.length; i++) {\n const char = substring[i];\n\n if (escape) {\n escape = false;\n continue;\n }\n\n if (char === '\\\\' && inString) {\n escape = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) continue;\n\n if (char === '{') {\n depth++;\n } else if (char === '}') {\n depth--;\n if (depth === 0) {\n // Found a balanced JSON object, try to parse it\n const candidate = substring.slice(0, i + 1);\n try {\n parsed = JSON.parse(candidate);\n break; // Success, stop looking\n } catch {\n // Not valid JSON, keep looking for a larger balanced object\n depth = 1; // Reset to continue looking\n }\n }\n }\n }\n }\n }\n\n // Build understanding with defaults\n const now = new Date().toISOString();\n\n // Count lines (rough estimate from file count)\n const estimatedLines = files.length * 150;\n\n // Parse features\n const features: FeatureIntent[] = (parsed?.features || []).map((f: any) => ({\n name: String(f.name || 'Unknown'),\n description: String(f.description || ''),\n priority: this.parseFeaturePriority(f.priority),\n constraints: Array.isArray(f.constraints) ? f.constraints.map(String) : [],\n relatedFiles: Array.isArray(f.relatedFiles) ? f.relatedFiles.map(String) : [],\n }));\n\n // Parse contracts\n const contracts: BehavioralContract[] = (parsed?.contracts || []).map((c: any) => ({\n function: String(c.function || ''),\n file: String(c.file || ''),\n inputs: Array.isArray(c.inputs) ? c.inputs : [],\n outputs: c.outputs || { type: 'unknown' },\n invariants: Array.isArray(c.invariants) ? c.invariants.map(String) : [],\n sideEffects: Array.isArray(c.sideEffects) ? c.sideEffects.map(String) : [],\n throws: Array.isArray(c.throws) ? c.throws.map(String) : undefined,\n }));\n\n return {\n version: '1',\n generatedAt: now,\n summary: {\n framework: parsed?.summary?.framework || undefined,\n language: parsed?.summary?.language || 'typescript',\n type: parsed?.summary?.type || 'unknown',\n description: parsed?.summary?.description || 'Project analyzed by whiterose',\n },\n features,\n contracts,\n dependencies: parsed?.dependencies || {},\n structure: {\n totalFiles: files.length,\n totalLines: parsed?.structure?.totalLines || estimatedLines,\n packages: parsed?.structure?.packages,\n },\n };\n }\n\n private parseFeaturePriority(value: any): 'critical' | 'high' | 'medium' | 'low' | 'ignore' {\n const v = String(value).toLowerCase();\n if (v === 'critical') return 'critical';\n if (v === 'high') return 'high';\n if (v === 'medium') return 'medium';\n if (v === 'ignore') return 'ignore';\n return 'low';\n }\n\n // ─────────────────────────────────────────────────────────────\n // Pass Building (with dependency injection)\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Build unit pass jobs - these only see static analysis results\n */\n private buildUnitPassJobs(\n context: ScanContext,\n unitPasses: string[]\n ): Array<{ name: string; prompt: string }> {\n const jobs: Array<{ name: string; prompt: string }> = [];\n const { understanding, staticResults } = context;\n\n for (const passName of unitPasses) {\n const passConfig = getPassConfig(passName);\n if (!passConfig) continue;\n\n jobs.push({\n name: passName,\n prompt: buildPassPrompt({\n pass: passConfig,\n projectType: understanding.summary.type,\n framework: understanding.summary.framework || '',\n language: understanding.summary.language,\n totalFiles: understanding.structure.totalFiles,\n staticFindings: staticResults,\n }),\n });\n }\n\n return jobs;\n }\n\n /**\n * Build integration pass jobs - these see static + unit findings\n */\n private buildIntegrationPassJobs(\n context: ScanContext,\n integrationPasses: string[],\n unitFindings: Bug[]\n ): Array<{ name: string; prompt: string }> {\n const jobs: Array<{ name: string; prompt: string }> = [];\n const { understanding, staticResults } = context;\n\n // Convert unit findings to the format expected by prompts\n const previousFindings = unitFindings.map(f => ({\n title: f.title,\n file: f.file,\n line: f.line,\n category: f.category,\n severity: f.severity,\n }));\n\n for (const passName of integrationPasses) {\n const flowConfig = getFlowPassConfig(passName);\n if (!flowConfig) continue;\n\n jobs.push({\n name: passName,\n prompt: buildFlowAnalysisPrompt({\n pass: flowConfig,\n projectType: understanding.summary.type,\n framework: understanding.summary.framework || '',\n language: understanding.summary.language,\n totalFiles: understanding.structure.totalFiles,\n staticFindings: staticResults,\n previousFindings, // ← Unit findings passed to integration\n }),\n });\n }\n\n return jobs;\n }\n\n /**\n * Build E2E pass jobs - these see static + unit + integration findings\n */\n private buildE2EPassJobs(\n context: ScanContext,\n e2ePasses: string[],\n allPreviousFindings: Bug[]\n ): Array<{ name: string; prompt: string }> {\n const jobs: Array<{ name: string; prompt: string }> = [];\n const { understanding, staticResults } = context;\n\n // Convert findings to the format expected by prompts\n const previousFindings = allPreviousFindings.map(f => ({\n title: f.title,\n file: f.file,\n line: f.line,\n category: f.category,\n severity: f.severity,\n }));\n\n for (const passName of e2ePasses) {\n const flowConfig = getFlowPassConfig(passName);\n if (!flowConfig) continue;\n\n jobs.push({\n name: passName,\n prompt: buildFlowAnalysisPrompt({\n pass: flowConfig,\n projectType: understanding.summary.type,\n framework: understanding.summary.framework || '',\n language: understanding.summary.language,\n totalFiles: understanding.structure.totalFiles,\n staticFindings: staticResults,\n previousFindings, // ← All previous findings passed to E2E\n }),\n });\n }\n\n return jobs;\n }\n\n private buildQuickScanPrompt(context: ScanContext): string {\n const { understanding, staticResults, files } = context;\n\n const staticSignals = staticResults.length > 0\n ? `\\nStatic analysis signals:\\n${staticResults.slice(0, 30).map(r => `- ${r.file}:${r.line}: ${r.message}`).join('\\n')}`\n : '';\n\n // Include list of files to scan (limit to 50 to keep prompt manageable)\n const fileList = files.slice(0, 50).map(f => `- ${f}`).join('\\n');\n const moreFiles = files.length > 50 ? `\\n... and ${files.length - 50} more files` : '';\n\n return `You are a security auditor. Analyze this ${understanding.summary.type} codebase for bugs and code smells.\n\nProject: ${understanding.summary.description || 'Unknown'}\nFramework: ${understanding.summary.framework || 'None'}\nLanguage: ${understanding.summary.language}\n\n## FILES TO ANALYZE\nRead and analyze these files for security issues:\n${fileList}${moreFiles}\n${staticSignals}\n\n## INSTRUCTIONS\n1. Read each file listed above\n2. Look for security issues, bugs, and code smells\n3. Report ALL suspicious patterns - false positives will be filtered later\n4. Use kind=\"smell\" for risky patterns, kind=\"bug\" for confirmed issues\n\n## CATEGORIES TO CHECK\n- Injection (SQL, command, XSS) - unsanitized user input\n- Auth bypass - missing auth checks, IDOR\n- Null/undefined dereference - accessing properties on potentially null values\n- Logic errors - wrong conditions, off-by-one, inverted checks\n- Async/race conditions - unhandled promises, race conditions\n- Resource leaks - unclosed handles, missing cleanup\n- Data validation - missing input validation, type coercion issues\n- Secrets exposure - hardcoded keys, leaked credentials\n- Error handling - swallowed errors, missing try/catch\n\n## OUTPUT FORMAT\nOutput a JSON array (one object per issue found):\n[{\"file\": \"path\", \"line\": 42, \"title\": \"Issue title\", \"description\": \"Details\", \"kind\": \"bug|smell\", \"severity\": \"critical|high|medium|low\", \"category\": \"logic-error\", \"evidence\": [\"evidence\"]}]\n\nIf no issues found after reading all files, return: []`;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Response Parsing\n // ─────────────────────────────────────────────────────────────\n\n private parseResponse(output: string, files: string[], startIndex: number, passName: string): Bug[] {\n const bugs: Bug[] = [];\n\n // Method 1: Find all JSON blocks in <json></json> tags\n const jsonMatches = output.matchAll(/<json>([\\s\\S]*?)<\\/json>/g);\n\n for (const match of jsonMatches) {\n try {\n const parsed = JSON.parse(match[1]);\n\n if (parsed.type === 'bug' && parsed.data) {\n const bug = this.parseBugData(parsed.data, startIndex + bugs.length, files, passName);\n if (bug) {\n bugs.push(bug);\n this.progress.onBugFound?.(bug);\n }\n }\n } catch {\n // Continue on parse error\n }\n }\n\n // Method 2: Find JSON in markdown code blocks (```json ... ```)\n if (bugs.length === 0) {\n const codeBlockMatches = output.matchAll(/```(?:json)?\\s*([\\s\\S]*?)```/g);\n for (const match of codeBlockMatches) {\n try {\n const parsed = JSON.parse(match[1].trim());\n // Handle both single object and array\n const items = Array.isArray(parsed) ? parsed : [parsed];\n for (const item of items) {\n const bug = this.parseBugData(item, startIndex + bugs.length, files, passName);\n if (bug) {\n bugs.push(bug);\n this.progress.onBugFound?.(bug);\n }\n }\n } catch {\n // Continue on parse error\n }\n }\n }\n\n // Method 3: Try parsing as a plain JSON array (fallback)\n if (bugs.length === 0) {\n const arrayMatch = output.match(/\\[[\\s\\S]*\\]/);\n if (arrayMatch) {\n try {\n const parsed = JSON.parse(arrayMatch[0]);\n if (Array.isArray(parsed)) {\n for (const item of parsed) {\n const bug = this.parseBugData(item, startIndex + bugs.length, files, passName);\n if (bug) {\n bugs.push(bug);\n this.progress.onBugFound?.(bug);\n }\n }\n }\n } catch {\n // Continue\n }\n }\n }\n\n // Method 4: Find individual JSON objects (not in code blocks)\n if (bugs.length === 0) {\n const objectMatches = output.matchAll(/\\{[^{}]*\"file\"[^{}]*\"line\"[^{}]*\\}/g);\n for (const match of objectMatches) {\n try {\n const parsed = JSON.parse(match[0]);\n const bug = this.parseBugData(parsed, startIndex + bugs.length, files, passName);\n if (bug) {\n bugs.push(bug);\n this.progress.onBugFound?.(bug);\n }\n } catch {\n // Continue\n }\n }\n }\n\n return bugs;\n }\n\n private parseBugData(data: any, index: number, files: string[], passName: string): Bug | null {\n if (!data.file || !data.line || !data.title) {\n return null;\n }\n\n // Resolve file path\n let filePath = data.file;\n if (!filePath.startsWith('/')) {\n const match = files.find(f => f.endsWith(filePath) || f.includes(filePath));\n if (match) filePath = match;\n }\n\n // Parse code path\n const codePath: CodePathStep[] = (data.codePath || data.dataFlow || []).map(\n (step: any, idx: number) => ({\n step: step.step || idx + 1,\n file: step.file || filePath,\n line: step.line || data.line,\n code: step.code || '',\n explanation: step.explanation || '',\n })\n );\n\n return {\n id: generateBugId(index),\n title: String(data.title).slice(0, 150),\n description: String(data.description || ''),\n file: filePath,\n line: Number(data.line) || 0,\n endLine: data.endLine ? Number(data.endLine) : undefined,\n kind: data.kind || 'bug',\n severity: this.parseSeverity(data.severity),\n category: this.parseCategory(data.category),\n confidence: {\n overall: this.parseConfidence(data.confidence),\n codePathValidity: 0.8,\n reachability: 0.8,\n intentViolation: false,\n staticToolSignal: false,\n adversarialSurvived: false,\n },\n codePath,\n evidence: Array.isArray(data.evidence) ? data.evidence.map(String) : [],\n suggestedFix: data.suggestedFix ? String(data.suggestedFix) : undefined,\n createdAt: new Date().toISOString(),\n status: 'open',\n passName,\n };\n }\n\n // ─────────────────────────────────────────────────────────────\n // Deduplication\n // ─────────────────────────────────────────────────────────────\n\n private deduplicateBugs(bugs: Bug[]): { unique: Bug[]; duplicatesRemoved: number } {\n const seen = new Map<string, Bug>();\n\n for (const bug of bugs) {\n const key = `${bug.file}:${bug.line}:${bug.category}`;\n const existing = seen.get(key);\n\n if (!existing) {\n seen.set(key, bug);\n } else {\n // Keep higher confidence, merge evidence\n const existingConf = this.confidenceToNum(existing.confidence.overall);\n const newConf = this.confidenceToNum(bug.confidence.overall);\n\n if (newConf > existingConf) {\n bug.evidence = [...new Set([...bug.evidence, ...existing.evidence])];\n seen.set(key, bug);\n } else {\n existing.evidence = [...new Set([...existing.evidence, ...bug.evidence])];\n }\n }\n }\n\n return {\n unique: Array.from(seen.values()),\n duplicatesRemoved: bugs.length - seen.size,\n };\n }\n\n private mergeSimilarBugs(bugs: Bug[]): Bug[] {\n // Group by file and nearby lines (within 5 lines)\n const groups = new Map<string, Bug[]>();\n\n for (const bug of bugs) {\n const fileKey = bug.file;\n if (!groups.has(fileKey)) {\n groups.set(fileKey, []);\n }\n groups.get(fileKey)!.push(bug);\n }\n\n const result: Bug[] = [];\n\n for (const fileBugs of groups.values()) {\n // Sort by line\n fileBugs.sort((a, b) => a.line - b.line);\n\n let i = 0;\n while (i < fileBugs.length) {\n const current = fileBugs[i];\n const merged: Bug[] = [current];\n\n // Look for bugs within 5 lines with same category\n let j = i + 1;\n while (j < fileBugs.length) {\n const next = fileBugs[j];\n if (next.line - current.line <= 5 && next.category === current.category) {\n merged.push(next);\n j++;\n } else {\n break;\n }\n }\n\n if (merged.length === 1) {\n result.push(current);\n } else {\n // Merge into one bug\n const highestSeverity = merged.reduce((max, b) =>\n this.severityToNum(b.severity) > this.severityToNum(max.severity) ? b : max\n );\n\n highestSeverity.evidence = [...new Set(merged.flatMap(b => b.evidence))];\n highestSeverity.description = merged.map(b => b.description).join('\\n\\n');\n result.push(highestSeverity);\n }\n\n i = j;\n }\n }\n\n return result;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Helpers\n // ─────────────────────────────────────────────────────────────\n\n private report(message: string): void {\n this.progress.onProgress?.(message);\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n private parseSeverity(value: any): BugSeverity {\n const v = String(value).toLowerCase();\n if (v === 'critical') return 'critical';\n if (v === 'high') return 'high';\n if (v === 'medium') return 'medium';\n return 'low';\n }\n\n private parseCategory(value: any): BugCategory {\n const v = String(value).toLowerCase().replace(/[^a-z-]/g, '');\n const valid: BugCategory[] = [\n 'injection', 'auth-bypass', 'secrets-exposure', 'null-reference',\n 'boundary-error', 'resource-leak', 'async-issue', 'logic-error',\n 'data-validation', 'type-coercion', 'concurrency', 'intent-violation',\n ];\n return valid.includes(v as BugCategory) ? (v as BugCategory) : 'logic-error';\n }\n\n private parseConfidence(value: any): ConfidenceLevel {\n if (typeof value === 'object' && value?.overall) {\n value = value.overall;\n }\n const v = String(value).toLowerCase();\n if (v === 'high') return 'high';\n if (v === 'low') return 'low';\n return 'medium';\n }\n\n private confidenceToNum(c: ConfidenceLevel): number {\n return c === 'high' ? 3 : c === 'medium' ? 2 : 1;\n }\n\n private severityToNum(s: BugSeverity): number {\n return s === 'critical' ? 4 : s === 'high' ? 3 : s === 'medium' ? 2 : 1;\n }\n}\n","import fg from 'fast-glob';\nimport { createHash } from 'crypto';\nimport { readFileSync, existsSync, writeFileSync } from 'fs';\nimport { join, relative } from 'path';\nimport { WhiteroseConfig, FileHash, CacheState } from '../../types.js';\nimport { getDependentFiles as getDepGraphDependents } from '../dependencies.js';\n\nconst DEFAULT_INCLUDE = ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'];\nconst DEFAULT_EXCLUDE = [\n 'node_modules/**',\n 'dist/**',\n 'build/**',\n '.next/**',\n 'coverage/**',\n '**/*.test.*',\n '**/*.spec.*',\n '**/*.d.ts',\n '.whiterose/**',\n];\n\nexport async function scanCodebase(cwd: string, config?: WhiteroseConfig): Promise<string[]> {\n const include = config?.include || DEFAULT_INCLUDE;\n const exclude = config?.exclude || DEFAULT_EXCLUDE;\n\n const files = await fg(include, {\n cwd,\n ignore: exclude,\n absolute: true,\n onlyFiles: true,\n });\n\n return files.sort();\n}\n\nexport function hashFile(filePath: string): string {\n // Read as buffer to correctly hash any file type (including binary)\n const content = readFileSync(filePath);\n return createHash('md5').update(content).digest('hex');\n}\n\nexport async function getChangedFiles(\n cwd: string,\n config: WhiteroseConfig,\n options?: { writeCache?: boolean }\n): Promise<{ files: string[]; hashes: FileHash[]; state: CacheState }> {\n const cachePath = join(cwd, '.whiterose', 'cache', 'file-hashes.json');\n\n // Get current files\n const currentFiles = await scanCodebase(cwd, config);\n\n // Load cached hashes\n let cachedState: CacheState = {\n version: '1',\n fileHashes: [],\n };\n\n if (existsSync(cachePath)) {\n try {\n const parsed = JSON.parse(readFileSync(cachePath, 'utf-8'));\n // Validate fileHashes exists and is an array\n if (Array.isArray(parsed.fileHashes)) {\n cachedState = parsed;\n }\n } catch {\n // Corrupted cache, use default empty state\n }\n }\n\n const cachedHashes = new Map(cachedState.fileHashes.map((h) => [h.path, h.hash]));\n\n // Find changed files\n const changedFiles: string[] = [];\n const newHashes: FileHash[] = [];\n\n for (const file of currentFiles) {\n const relativePath = relative(cwd, file);\n const currentHash = hashFile(file);\n\n newHashes.push({\n path: relativePath,\n hash: currentHash,\n lastModified: new Date().toISOString(),\n });\n\n const cachedHash = cachedHashes.get(relativePath);\n if (!cachedHash || cachedHash !== currentHash) {\n changedFiles.push(file);\n }\n }\n\n // Prepare updated cache state (write only if requested)\n const newState: CacheState = {\n version: '1',\n lastIncrementalScan: new Date().toISOString(),\n lastFullScan: cachedState.lastFullScan,\n fileHashes: newHashes,\n };\n\n if (options?.writeCache !== false) {\n writeFileSync(cachePath, JSON.stringify(newState, null, 2), 'utf-8');\n }\n\n return { files: changedFiles, hashes: newHashes, state: newState };\n}\n\nexport function saveFileHashes(cwd: string, state: CacheState): void {\n const cachePath = join(cwd, '.whiterose', 'cache', 'file-hashes.json');\n writeFileSync(cachePath, JSON.stringify(state, null, 2), 'utf-8');\n}\n\nexport async function getDependentFiles(\n changedFiles: string[],\n cwd: string,\n allFiles?: string[]\n): Promise<string[]> {\n // Use the dependency graph to find all files that depend on changed files\n return getDepGraphDependents(changedFiles, cwd, allFiles);\n}\n","import { CodebaseUnderstanding, BehavioralContract, FeatureIntent } from '../../types.js';\n\nexport function generateIntentDocument(understanding: CodebaseUnderstanding): string {\n const lines: string[] = [];\n\n // Header\n lines.push(`# App Intent: ${understanding.summary.type}`);\n lines.push('');\n lines.push(`> Generated by whiterose on ${new Date().toISOString()}`);\n lines.push('> Edit the sections above the line. Contracts below are auto-generated.');\n lines.push('');\n\n // Overview\n lines.push('## Overview');\n lines.push('');\n lines.push(understanding.summary.description);\n lines.push('');\n lines.push(`- **Framework:** ${understanding.summary.framework || 'None detected'}`);\n lines.push(`- **Language:** ${understanding.summary.language}`);\n lines.push(`- **Files:** ${understanding.structure.totalFiles}`);\n if (understanding.structure.packages?.length) {\n lines.push(`- **Packages:** ${understanding.structure.packages.join(', ')}`);\n }\n lines.push('');\n\n // Critical Features\n if (understanding.features.length > 0) {\n lines.push('## Critical Features');\n lines.push('');\n\n const criticalFeatures = understanding.features.filter((f) => f.priority === 'critical');\n const highFeatures = understanding.features.filter((f) => f.priority === 'high');\n const otherFeatures = understanding.features.filter(\n (f) => f.priority !== 'critical' && f.priority !== 'high'\n );\n\n for (const feature of criticalFeatures) {\n lines.push(formatFeature(feature, 'CRITICAL'));\n }\n\n if (highFeatures.length > 0) {\n lines.push('## High Priority Features');\n lines.push('');\n for (const feature of highFeatures) {\n lines.push(formatFeature(feature, 'HIGH'));\n }\n }\n\n if (otherFeatures.length > 0) {\n lines.push('## Other Features');\n lines.push('');\n for (const feature of otherFeatures) {\n lines.push(formatFeature(feature));\n }\n }\n }\n\n // Known Constraints (editable section)\n lines.push('## Known Constraints');\n lines.push('');\n lines.push('<!-- Add any known constraints or business rules here -->');\n lines.push('');\n lines.push('- (Add your constraints here)');\n lines.push('');\n\n // Areas of Concern (editable section)\n lines.push('## Areas of Concern');\n lines.push('');\n lines.push('<!-- Add files or areas that need extra scrutiny -->');\n lines.push('');\n lines.push('- (Add files that have had bugs before)');\n lines.push('');\n\n // Divider\n lines.push('---');\n lines.push('');\n lines.push('<!-- ⚠️ DO NOT EDIT BELOW THIS LINE - Auto-generated contracts -->');\n lines.push('');\n\n // Behavioral Contracts\n if (understanding.contracts.length > 0) {\n lines.push('## Behavioral Contracts');\n lines.push('');\n\n for (const contract of understanding.contracts) {\n lines.push(formatContract(contract));\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction formatFeature(feature: FeatureIntent, badge?: string): string {\n const lines: string[] = [];\n\n const badgeStr = badge ? ` [${badge}]` : '';\n lines.push(`### ${feature.name}${badgeStr}`);\n lines.push('');\n lines.push(feature.description);\n lines.push('');\n\n if (feature.constraints.length > 0) {\n lines.push('**Constraints:**');\n for (const constraint of feature.constraints) {\n lines.push(`- ${constraint}`);\n }\n lines.push('');\n }\n\n if (feature.relatedFiles.length > 0) {\n lines.push(`**Files:** \\`${feature.relatedFiles.join('`, `')}\\``);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction formatContract(contract: BehavioralContract): string {\n const lines: string[] = [];\n\n lines.push(`### \\`${contract.file}:${contract.function}()\\``);\n lines.push('');\n\n // Inputs\n if (contract.inputs.length > 0) {\n lines.push('**Inputs:**');\n for (const input of contract.inputs) {\n const constraints = input.constraints ? ` (${input.constraints})` : '';\n lines.push(`- \\`${input.name}\\`: ${input.type}${constraints}`);\n }\n lines.push('');\n }\n\n // Outputs\n lines.push('**Returns:** `' + contract.outputs.type + '`');\n if (contract.outputs.constraints) {\n lines.push(` - ${contract.outputs.constraints}`);\n }\n lines.push('');\n\n // Invariants\n if (contract.invariants.length > 0) {\n lines.push('**Invariants:**');\n for (const invariant of contract.invariants) {\n lines.push(`- ${invariant}`);\n }\n lines.push('');\n }\n\n // Side Effects\n if (contract.sideEffects.length > 0) {\n lines.push('**Side Effects:**');\n for (const effect of contract.sideEffects) {\n lines.push(`- ${effect}`);\n }\n lines.push('');\n }\n\n // Throws\n if (contract.throws && contract.throws.length > 0) {\n lines.push('**Throws:**');\n for (const t of contract.throws) {\n lines.push(`- ${t}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\ninterface ParsedIntent {\n knownConstraints: string[];\n areasOfConcern: string[];\n customFeatures: FeatureIntent[];\n overrides: {\n description?: string;\n framework?: string;\n };\n}\n\nexport function parseIntentDocument(content: string): ParsedIntent {\n const result: ParsedIntent = {\n knownConstraints: [],\n areasOfConcern: [],\n customFeatures: [],\n overrides: {},\n };\n\n // Split into sections\n const sections = splitIntoSections(content);\n\n // Parse Known Constraints section\n const constraintsSection = sections.find((s) => s.title.includes('Known Constraints'));\n if (constraintsSection) {\n result.knownConstraints = parseListItems(constraintsSection.content);\n }\n\n // Parse Areas of Concern section\n const concernsSection = sections.find((s) => s.title.includes('Areas of Concern'));\n if (concernsSection) {\n result.areasOfConcern = parseListItems(concernsSection.content);\n }\n\n // Parse Overview for overrides\n const overviewSection = sections.find((s) => s.title.includes('Overview'));\n if (overviewSection) {\n // Check for framework override\n const frameworkMatch = overviewSection.content.match(/\\*\\*Framework:\\*\\*\\s*(.+)/);\n if (frameworkMatch && !frameworkMatch[1].includes('None detected')) {\n result.overrides.framework = frameworkMatch[1].trim();\n }\n\n // Get first paragraph as description override\n const paragraphs = overviewSection.content.split(/\\n\\n+/);\n const firstParagraph = paragraphs[0]?.trim();\n if (firstParagraph && !firstParagraph.startsWith('-') && !firstParagraph.startsWith('*')) {\n result.overrides.description = firstParagraph;\n }\n }\n\n // Parse custom features (those added by user above the divider)\n const editableSections = content.split(/---+/)[0] || '';\n const featureSections = editableSections.match(/###\\s+([^\\n]+)\\n([\\s\\S]*?)(?=###|##|$)/g);\n\n if (featureSections) {\n for (const section of featureSections) {\n const feature = parseFeatureSection(section);\n if (feature && isUserAddedFeature(feature)) {\n result.customFeatures.push(feature);\n }\n }\n }\n\n return result;\n}\n\ninterface Section {\n title: string;\n content: string;\n}\n\nfunction splitIntoSections(content: string): Section[] {\n const sections: Section[] = [];\n const sectionRegex = /^##\\s+([^\\n]+)\\n([\\s\\S]*?)(?=^##\\s|$)/gm;\n\n let match;\n while ((match = sectionRegex.exec(content)) !== null) {\n sections.push({\n title: match[1].trim(),\n content: match[2].trim(),\n });\n }\n\n return sections;\n}\n\nfunction parseListItems(content: string): string[] {\n const items: string[] = [];\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const match = line.match(/^[-*]\\s+(.+)/);\n if (match) {\n const item = match[1].trim();\n // Skip placeholder items\n if (!item.includes('Add your') && !item.includes('Add files') && item !== '') {\n items.push(item);\n }\n }\n }\n\n return items;\n}\n\nfunction parseFeatureSection(section: string): FeatureIntent | null {\n const titleMatch = section.match(/###\\s+([^[\\n]+)(?:\\s*\\[([^\\]]+)\\])?/);\n if (!titleMatch) return null;\n\n const name = titleMatch[1].trim();\n const badge = titleMatch[2]?.trim().toLowerCase();\n\n // Get priority from badge\n let priority: 'critical' | 'high' | 'medium' | 'low' = 'medium';\n if (badge === 'critical') priority = 'critical';\n else if (badge === 'high') priority = 'high';\n else if (badge === 'low') priority = 'low';\n\n // Get description (first paragraph after title)\n const contentAfterTitle = section.replace(/###\\s+[^\\n]+\\n/, '').trim();\n const paragraphs = contentAfterTitle.split(/\\n\\n+/);\n const description = paragraphs[0]?.trim() || '';\n\n // Get constraints\n const constraints: string[] = [];\n const constraintsMatch = section.match(/\\*\\*Constraints:\\*\\*\\n((?:[-*]\\s+[^\\n]+\\n?)+)/);\n if (constraintsMatch) {\n const constraintLines = constraintsMatch[1].split('\\n');\n for (const line of constraintLines) {\n const match = line.match(/^[-*]\\s+(.+)/);\n if (match) {\n constraints.push(match[1].trim());\n }\n }\n }\n\n // Get related files\n const relatedFiles: string[] = [];\n const filesMatch = section.match(/\\*\\*Files:\\*\\*\\s*`([^`]+)`/);\n if (filesMatch) {\n const files = filesMatch[1].split(/`,\\s*`/);\n relatedFiles.push(...files.map((f) => f.replace(/`/g, '').trim()));\n }\n\n return {\n name,\n description,\n priority,\n constraints,\n relatedFiles,\n };\n}\n\nfunction isUserAddedFeature(feature: FeatureIntent): boolean {\n // Check if this looks like a user-added feature\n // User-added features typically have more specific constraints or descriptions\n return (\n feature.constraints.length > 0 ||\n feature.description.length > 50 ||\n feature.relatedFiles.length > 0\n );\n}\n\n/**\n * Merge parsed intent with existing understanding\n */\nexport function mergeIntentWithUnderstanding(\n understanding: CodebaseUnderstanding,\n parsedIntent: ParsedIntent\n): CodebaseUnderstanding {\n const merged = { ...understanding };\n\n // Apply overrides\n if (parsedIntent.overrides.description) {\n merged.summary = {\n ...merged.summary,\n description: parsedIntent.overrides.description,\n };\n }\n\n if (parsedIntent.overrides.framework) {\n merged.summary = {\n ...merged.summary,\n framework: parsedIntent.overrides.framework,\n };\n }\n\n // Add custom features\n if (parsedIntent.customFeatures.length > 0) {\n merged.features = [\n ...parsedIntent.customFeatures,\n ...merged.features.filter(\n (f) => !parsedIntent.customFeatures.some((cf) => cf.name === f.name)\n ),\n ];\n }\n\n // Add known constraints as invariants to relevant contracts\n if (parsedIntent.knownConstraints.length > 0) {\n // Add as global constraints (could be used for validation)\n (merged as any).globalConstraints = parsedIntent.knownConstraints;\n }\n\n // Store areas of concern for priority scanning\n if (parsedIntent.areasOfConcern.length > 0) {\n (merged as any).areasOfConcern = parsedIntent.areasOfConcern;\n }\n\n return merged;\n}\n","/**\n * Documentation Parser - Layer 0\n *\n * Reads existing documentation from the codebase and extracts\n * relevant information for understanding intent.\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join, basename } from 'path';\nimport fg from 'fast-glob';\n\nexport interface ExistingDocs {\n readme: string | null;\n contributing: string | null;\n apiDocs: string[];\n changelog: string | null;\n packageJson: Record<string, unknown> | null;\n tsconfig: Record<string, unknown> | null;\n envExample: string | null;\n otherDocs: Array<{ name: string; content: string }>;\n}\n\nexport interface ExtractedIntent {\n projectName: string;\n description: string;\n features: string[];\n techStack: string[];\n conventions: string[];\n apiEndpoints: string[];\n envVariables: string[];\n scripts: Record<string, string>;\n}\n\n/**\n * Read all existing documentation from a codebase\n */\nexport async function readExistingDocs(cwd: string): Promise<ExistingDocs> {\n const docs: ExistingDocs = {\n readme: null,\n contributing: null,\n apiDocs: [],\n changelog: null,\n packageJson: null,\n tsconfig: null,\n envExample: null,\n otherDocs: [],\n };\n\n // Read README\n for (const name of ['README.md', 'readme.md', 'README', 'Readme.md']) {\n const path = join(cwd, name);\n if (existsSync(path)) {\n docs.readme = readFileSync(path, 'utf-8');\n break;\n }\n }\n\n // Read CONTRIBUTING\n for (const name of ['CONTRIBUTING.md', 'contributing.md', 'CONTRIBUTING']) {\n const path = join(cwd, name);\n if (existsSync(path)) {\n docs.contributing = readFileSync(path, 'utf-8');\n break;\n }\n }\n\n // Read CHANGELOG\n for (const name of ['CHANGELOG.md', 'changelog.md', 'CHANGELOG', 'HISTORY.md']) {\n const path = join(cwd, name);\n if (existsSync(path)) {\n docs.changelog = readFileSync(path, 'utf-8');\n break;\n }\n }\n\n // Read package.json\n const packageJsonPath = join(cwd, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n docs.packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n } catch {\n // Ignore parse errors\n }\n }\n\n // Read tsconfig.json\n const tsconfigPath = join(cwd, 'tsconfig.json');\n if (existsSync(tsconfigPath)) {\n try {\n docs.tsconfig = JSON.parse(readFileSync(tsconfigPath, 'utf-8'));\n } catch {\n // Ignore parse errors\n }\n }\n\n // Read .env.example\n for (const name of ['.env.example', '.env.sample', '.env.template']) {\n const path = join(cwd, name);\n if (existsSync(path)) {\n docs.envExample = readFileSync(path, 'utf-8');\n break;\n }\n }\n\n // Find and read API docs\n const apiDocPaths = await fg(['docs/**/*.md', 'documentation/**/*.md', 'api/**/*.md'], {\n cwd,\n absolute: true,\n ignore: ['**/node_modules/**'],\n });\n\n for (const path of apiDocPaths.slice(0, 10)) {\n try {\n docs.apiDocs.push(readFileSync(path, 'utf-8'));\n } catch {\n // Skip unreadable files\n }\n }\n\n // Find other markdown docs\n const otherDocPaths = await fg(['*.md', 'docs/*.md'], {\n cwd,\n absolute: true,\n ignore: ['**/node_modules/**', 'README.md', 'CONTRIBUTING.md', 'CHANGELOG.md'],\n });\n\n for (const path of otherDocPaths.slice(0, 5)) {\n try {\n docs.otherDocs.push({\n name: basename(path),\n content: readFileSync(path, 'utf-8'),\n });\n } catch {\n // Skip unreadable files\n }\n }\n\n return docs;\n}\n\n/**\n * Extract structured intent from existing documentation\n */\nexport function extractIntentFromDocs(docs: ExistingDocs): ExtractedIntent {\n const intent: ExtractedIntent = {\n projectName: '',\n description: '',\n features: [],\n techStack: [],\n conventions: [],\n apiEndpoints: [],\n envVariables: [],\n scripts: {},\n };\n\n // Extract from package.json\n if (docs.packageJson) {\n intent.projectName = (docs.packageJson as any).name || '';\n intent.description = (docs.packageJson as any).description || '';\n intent.scripts = (docs.packageJson as any).scripts || {};\n\n // Extract tech stack from dependencies\n const deps = {\n ...(docs.packageJson as any).dependencies,\n ...(docs.packageJson as any).devDependencies,\n };\n\n if (deps) {\n if (deps['next']) intent.techStack.push('Next.js');\n if (deps['react']) intent.techStack.push('React');\n if (deps['vue']) intent.techStack.push('Vue');\n if (deps['express']) intent.techStack.push('Express');\n if (deps['fastify']) intent.techStack.push('Fastify');\n if (deps['typescript']) intent.techStack.push('TypeScript');\n if (deps['prisma']) intent.techStack.push('Prisma');\n if (deps['mongoose']) intent.techStack.push('MongoDB/Mongoose');\n if (deps['pg'] || deps['postgres']) intent.techStack.push('PostgreSQL');\n if (deps['redis']) intent.techStack.push('Redis');\n if (deps['stripe']) intent.techStack.push('Stripe');\n if (deps['@auth/core'] || deps['next-auth']) intent.techStack.push('Auth.js');\n }\n }\n\n // Extract features from README\n if (docs.readme) {\n // Look for features section\n const featuresMatch = docs.readme.match(/##\\s*Features?\\s*\\n([\\s\\S]*?)(?=\\n##|\\n---|$)/i);\n if (featuresMatch) {\n const featureLines = featuresMatch[1].split('\\n')\n .filter(line => line.trim().startsWith('-') || line.trim().startsWith('*'))\n .map(line => line.replace(/^[-*]\\s*/, '').trim())\n .filter(line => line.length > 0);\n intent.features.push(...featureLines.slice(0, 20));\n }\n }\n\n // Extract env variables\n if (docs.envExample) {\n const envLines = docs.envExample.split('\\n')\n .filter(line => line.includes('=') && !line.startsWith('#'))\n .map(line => line.split('=')[0].trim())\n .filter(line => line.length > 0);\n intent.envVariables.push(...envLines);\n }\n\n // Extract API endpoints from docs\n for (const apiDoc of docs.apiDocs) {\n const endpointMatches = apiDoc.matchAll(/`(GET|POST|PUT|DELETE|PATCH)\\s+([^`]+)`/g);\n for (const match of endpointMatches) {\n intent.apiEndpoints.push(`${match[1]} ${match[2]}`);\n }\n }\n\n // Extract conventions from CONTRIBUTING\n if (docs.contributing) {\n const conventionLines = docs.contributing.split('\\n')\n .filter(line => line.trim().startsWith('-') || line.trim().startsWith('*'))\n .map(line => line.replace(/^[-*]\\s*/, '').trim())\n .filter(line => line.length > 10 && line.length < 200)\n .slice(0, 10);\n intent.conventions.push(...conventionLines);\n }\n\n return intent;\n}\n\n/**\n * Build a documentation summary for the AI prompt\n */\nexport function buildDocsSummary(docs: ExistingDocs, extracted: ExtractedIntent): string {\n const parts: string[] = [];\n\n parts.push(`# Existing Documentation Summary\\n`);\n\n if (extracted.projectName) {\n parts.push(`## Project: ${extracted.projectName}`);\n if (extracted.description) {\n parts.push(`\\n${extracted.description}\\n`);\n }\n }\n\n if (extracted.techStack.length > 0) {\n parts.push(`\\n## Tech Stack`);\n parts.push(extracted.techStack.map(t => `- ${t}`).join('\\n'));\n }\n\n if (extracted.features.length > 0) {\n parts.push(`\\n## Features (from README)`);\n parts.push(extracted.features.map(f => `- ${f}`).join('\\n'));\n }\n\n if (extracted.apiEndpoints.length > 0) {\n parts.push(`\\n## API Endpoints`);\n parts.push(extracted.apiEndpoints.slice(0, 20).map(e => `- ${e}`).join('\\n'));\n }\n\n if (extracted.envVariables.length > 0) {\n parts.push(`\\n## Environment Variables`);\n parts.push(extracted.envVariables.map(v => `- ${v}`).join('\\n'));\n }\n\n if (extracted.conventions.length > 0) {\n parts.push(`\\n## Conventions (from CONTRIBUTING)`);\n parts.push(extracted.conventions.map(c => `- ${c}`).join('\\n'));\n }\n\n if (Object.keys(extracted.scripts).length > 0) {\n parts.push(`\\n## NPM Scripts`);\n for (const [name, cmd] of Object.entries(extracted.scripts).slice(0, 10)) {\n parts.push(`- \\`npm run ${name}\\`: ${cmd}`);\n }\n }\n\n // Include README excerpt if available\n if (docs.readme && docs.readme.length > 0) {\n const excerpt = docs.readme.slice(0, 2000);\n parts.push(`\\n## README Excerpt\\n\\`\\`\\`\\n${excerpt}\\n\\`\\`\\``);\n }\n\n return parts.join('\\n');\n}\n","import * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, mkdirSync, writeFileSync, rmSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { WhiteroseConfig, ProviderType, CodebaseUnderstanding } from '../../types.js';\nimport { detectProvider, getProviderCommand } from '../../providers/detect.js';\nimport { getExecutor } from '../../providers/executors/index.js';\nimport { CoreScanner } from '../../core/scanner.js';\nimport { execa } from 'execa';\nimport { scanCodebase } from '../../core/scanner/index.js';\nimport { generateIntentDocument } from '../../core/contracts/intent.js';\nimport { readExistingDocs, extractIntentFromDocs, buildDocsSummary } from '../../core/docs.js';\nimport YAML from 'yaml';\n\ninterface InitOptions {\n provider: string;\n skipQuestions?: boolean;\n force: boolean;\n ci?: boolean; // CI mode: non-interactive, use defaults\n unsafe?: boolean; // Deprecated: read-only operations always auto-approve\n skipProviderDetection?: boolean; // Skip provider detection when already verified (e.g., from wizard)\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n\n // Check if already initialized\n if (existsSync(whiterosePath) && !options.force) {\n p.log.error('whiterose is already initialized in this directory.');\n p.log.info('Use --force to reinitialize, or run \"whiterose refresh\" to update understanding.');\n process.exit(1);\n }\n\n p.intro(chalk.red('whiterose') + chalk.dim(' - initialization'));\n\n // ─────────────────────────────────────────────────────────────\n // Phase 1: Detect available providers (skip if already verified)\n // ─────────────────────────────────────────────────────────────\n let selectedProvider: ProviderType;\n\n if (options.skipProviderDetection && options.provider) {\n // Provider already verified by wizard - use directly\n selectedProvider = options.provider as ProviderType;\n } else {\n const providerSpinner = p.spinner();\n providerSpinner.start('Detecting available LLM providers...');\n\n const availableProviders = await detectProvider();\n\n if (availableProviders.length === 0) {\n providerSpinner.stop('No LLM providers detected');\n p.log.error('whiterose requires an LLM provider to function.');\n p.log.info('Supported providers: claude-code, aider, codex, opencode');\n p.log.info('Install one and ensure it\\'s configured, then run init again.');\n process.exit(1);\n }\n\n providerSpinner.stop(`Detected providers: ${availableProviders.join(', ')}`);\n\n // Check if provider was passed and is available\n const passedProvider = options.provider as ProviderType;\n const isPassedProviderAvailable = availableProviders.includes(passedProvider);\n\n if (isPassedProviderAvailable) {\n // Use the passed provider without asking\n selectedProvider = passedProvider;\n p.log.info(`Using ${selectedProvider} as your LLM provider.`);\n } else if (options.skipQuestions) {\n // Only auto-select in skip mode\n selectedProvider = availableProviders[0] as ProviderType;\n p.log.info(`Using ${selectedProvider} as your LLM provider.`);\n } else {\n const providerChoice = await p.select({\n message: 'Which LLM provider should whiterose use?',\n options: availableProviders.map((prov) => ({\n value: prov,\n label: prov,\n hint: prov === 'claude-code' ? 'recommended' : undefined,\n })),\n });\n\n if (p.isCancel(providerChoice)) {\n p.cancel('Initialization cancelled.');\n process.exit(0);\n }\n\n selectedProvider = providerChoice as ProviderType;\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Phase 1.5: Verify provider CLI actually works (fail fast)\n // ─────────────────────────────────────────────────────────────\n const verifySpinner = p.spinner();\n verifySpinner.start('Verifying provider CLI works...');\n\n try {\n const command = getProviderCommand(selectedProvider);\n await execa(command, ['--version'], { timeout: 10000 });\n verifySpinner.stop(`Using ${selectedProvider} at: ${command}`);\n } catch (error: any) {\n verifySpinner.stop('Provider CLI verification failed');\n const installHint = selectedProvider === 'claude-code'\n ? 'npm install -g @anthropic-ai/claude-code'\n : `Install ${selectedProvider} and ensure it's in your PATH`;\n p.log.error(`Cannot run ${selectedProvider} CLI. ${installHint}`);\n p.log.info(`Resolved path: ${getProviderCommand(selectedProvider)}`);\n if (error.message) {\n p.log.info(`Error: ${error.message}`);\n }\n process.exit(1);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Phase 2: Full codebase scan\n // ─────────────────────────────────────────────────────────────\n const scanSpinner = p.spinner();\n scanSpinner.start('Scanning codebase...');\n\n let codebaseFiles: string[];\n try {\n codebaseFiles = await scanCodebase(cwd);\n scanSpinner.stop(`Found ${codebaseFiles.length} source files`);\n } catch (error) {\n scanSpinner.stop('Failed to scan codebase');\n p.log.error(String(error));\n process.exit(1);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Phase 2.5: Read existing documentation (Layer 0)\n // ─────────────────────────────────────────────────────────────\n const docsSpinner = p.spinner();\n docsSpinner.start('Reading existing documentation...');\n\n let docsSummary: string | undefined;\n try {\n const existingDocs = await readExistingDocs(cwd);\n const extractedIntent = extractIntentFromDocs(existingDocs);\n docsSummary = buildDocsSummary(existingDocs, extractedIntent);\n\n const docsFound = [];\n if (existingDocs.readme) docsFound.push('README');\n if (existingDocs.contributing) docsFound.push('CONTRIBUTING');\n if (existingDocs.packageJson) docsFound.push('package.json');\n if (existingDocs.envExample) docsFound.push('.env.example');\n if (existingDocs.apiDocs.length > 0) docsFound.push(`${existingDocs.apiDocs.length} API docs`);\n\n if (docsFound.length > 0) {\n docsSpinner.stop(`Found existing docs: ${docsFound.join(', ')}`);\n } else {\n docsSpinner.stop('No existing documentation found (will generate from code)');\n docsSummary = undefined;\n }\n } catch (error) {\n docsSpinner.stop('Could not read existing docs (continuing without)');\n docsSummary = undefined;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Phase 3: Generate understanding via LLM (merge with existing docs)\n // ─────────────────────────────────────────────────────────────\n const understandingSpinner = p.spinner();\n const startTime = Date.now();\n\n understandingSpinner.start('Starting codebase analysis...');\n\n let understanding: CodebaseUnderstanding;\n try {\n const executor = getExecutor(selectedProvider);\n const scanner = new CoreScanner(executor, {}, {\n onProgress: (message: string) => {\n if (message.trim()) {\n understandingSpinner.message(message);\n }\n },\n });\n\n // Pass existing docs summary to merge with AI exploration\n understanding = await scanner.generateUnderstanding(codebaseFiles, docsSummary);\n\n const totalTime = Math.floor((Date.now() - startTime) / 1000);\n understandingSpinner.stop(`Analysis complete (${totalTime}s)`);\n } catch (error) {\n understandingSpinner.stop('Analysis failed');\n p.log.error(String(error));\n process.exit(1);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Phase 4: Show summary and confirm understanding\n // ─────────────────────────────────────────────────────────────\n const skipInteractive = options.skipQuestions || options.ci;\n if (!skipInteractive) {\n p.log.message(chalk.bold('\\nHere\\'s what I understand about your codebase:\\n'));\n p.log.message(` ${chalk.cyan('Type:')} ${understanding.summary.type}`);\n p.log.message(` ${chalk.cyan('Framework:')} ${understanding.summary.framework || 'None detected'}`);\n p.log.message(` ${chalk.cyan('Language:')} ${understanding.summary.language}`);\n p.log.message(` ${chalk.cyan('Files:')} ${understanding.structure.totalFiles}`);\n p.log.message(` ${chalk.cyan('Lines:')} ${understanding.structure.totalLines.toLocaleString()}`);\n p.log.message(`\\n ${chalk.dim(understanding.summary.description)}\\n`);\n\n if (understanding.features.length > 0) {\n p.log.message(chalk.bold('Detected features:'));\n for (const feature of understanding.features.slice(0, 5)) {\n p.log.message(` ${chalk.yellow('●')} ${feature.name} - ${chalk.dim(feature.description)}`);\n }\n if (understanding.features.length > 5) {\n p.log.message(` ${chalk.dim(`...and ${understanding.features.length - 5} more`)}`);\n }\n console.log();\n }\n\n const isAccurate = await p.confirm({\n message: 'Is this understanding accurate?',\n initialValue: true,\n });\n\n if (p.isCancel(isAccurate)) {\n p.cancel('Initialization cancelled.');\n process.exit(0);\n }\n\n if (!isAccurate) {\n p.log.info('You can edit .whiterose/intent.md after initialization to correct the understanding.');\n }\n\n // Priorities are now auto-determined by the LLM based on detected features\n // Auth, payments, checkout = critical. User data = high. UI = medium. etc.\n const priorities: Record<string, 'critical' | 'high' | 'medium' | 'low' | 'ignore'> = {};\n for (const feature of understanding.features) {\n for (const file of feature.relatedFiles) {\n priorities[file] = feature.priority;\n }\n }\n (understanding as any)._userPriorities = priorities;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Phase 6: Create .whiterose directory and files\n // ─────────────────────────────────────────────────────────────\n const writeSpinner = p.spinner();\n writeSpinner.start('Creating configuration...');\n\n // Track whether .whiterose existed before (for rollback decisions)\n const whiteroseExistedBefore = existsSync(whiterosePath);\n // Save original .gitignore content for rollback\n const gitignorePath = join(cwd, '.gitignore');\n const originalGitignore = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf-8') : null;\n\n try {\n // Create directory structure\n mkdirSync(join(whiterosePath, 'cache'), { recursive: true });\n mkdirSync(join(whiterosePath, 'reports'), { recursive: true });\n\n // Generate config\n const config: WhiteroseConfig = {\n version: '1',\n provider: selectedProvider,\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: ['node_modules', 'dist', 'build', '.next', 'coverage', '**/*.test.*', '**/*.spec.*'],\n priorities: (understanding as any)._userPriorities || {},\n categories: [\n 'injection', 'auth-bypass', 'secrets-exposure',\n 'null-reference', 'boundary-error', 'resource-leak', 'async-issue',\n 'logic-error', 'data-validation', 'type-coercion',\n 'concurrency', 'intent-violation',\n ],\n minConfidence: 'low',\n staticAnalysis: {\n typescript: true,\n eslint: true,\n },\n output: {\n sarif: true,\n markdown: true,\n sarifPath: '.whiterose/reports',\n markdownPath: 'BUGS.md',\n },\n };\n\n // Prepare all file contents before writing (fail fast on generation errors)\n const intentDoc = generateIntentDocument(understanding);\n const configContent = YAML.stringify(config);\n const understandingContent = JSON.stringify(understanding, null, 2);\n const hashesContent = JSON.stringify({ version: '1', fileHashes: [], lastFullScan: null }, null, 2);\n\n // Write all files atomically (all-or-nothing approach)\n writeFileSync(join(whiterosePath, 'config.yml'), configContent, 'utf-8');\n writeFileSync(join(whiterosePath, 'cache', 'understanding.json'), understandingContent, 'utf-8');\n writeFileSync(join(whiterosePath, 'intent.md'), intentDoc, 'utf-8');\n writeFileSync(join(whiterosePath, 'cache', 'file-hashes.json'), hashesContent, 'utf-8');\n\n // Add to .gitignore if it exists and doesn't already have the entry\n if (originalGitignore !== null && !originalGitignore.includes('.whiterose/cache')) {\n writeFileSync(gitignorePath, originalGitignore + '\\n# whiterose cache\\n.whiterose/cache/\\n', 'utf-8');\n }\n\n writeSpinner.stop('Configuration created');\n } catch (error) {\n writeSpinner.stop('Failed to create configuration');\n\n // Rollback: clean up .whiterose if we created it\n if (!whiteroseExistedBefore && existsSync(whiterosePath)) {\n try {\n rmSync(whiterosePath, { recursive: true, force: true });\n p.log.info('Rolled back: removed .whiterose directory');\n } catch {\n // Ignore rollback errors\n }\n }\n\n // Rollback: restore original .gitignore if we modified it\n if (originalGitignore !== null && existsSync(gitignorePath)) {\n try {\n const currentGitignore = readFileSync(gitignorePath, 'utf-8');\n if (currentGitignore !== originalGitignore) {\n writeFileSync(gitignorePath, originalGitignore, 'utf-8');\n p.log.info('Rolled back: restored .gitignore');\n }\n } catch {\n // Ignore rollback errors\n }\n }\n\n p.log.error(String(error));\n process.exit(1);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Done\n // ─────────────────────────────────────────────────────────────\n p.outro(chalk.green('whiterose initialized successfully!'));\n\n console.log();\n console.log(chalk.dim(' Next steps:'));\n console.log(chalk.dim(' 1. Review .whiterose/intent.md and edit if needed'));\n console.log(chalk.dim(' 2. Run ') + chalk.cyan('whiterose scan') + chalk.dim(' to find bugs'));\n console.log(chalk.dim(' 3. Run ') + chalk.cyan('whiterose fix') + chalk.dim(' to fix them interactively'));\n console.log();\n}\n","import { z } from 'zod';\n\n// ─────────────────────────────────────────────────────────────\n// Bug & Finding Types\n// ─────────────────────────────────────────────────────────────\n\nexport const BugSeverity = z.enum(['critical', 'high', 'medium', 'low']);\nexport type BugSeverity = z.infer<typeof BugSeverity>;\n\nexport const FindingKind = z.enum(['bug', 'smell']);\nexport type FindingKind = z.infer<typeof FindingKind>;\n\n// 12 categories grouped into 4 families:\n// SECURITY: injection, auth-bypass, secrets-exposure\n// RELIABILITY: null-reference, boundary-error, resource-leak, async-issue\n// CORRECTNESS: logic-error, data-validation, type-coercion\n// DESIGN: concurrency, intent-violation\nexport const BugCategory = z.enum([\n // Security (external threats)\n 'injection', // SQL injection, XSS, command injection, path traversal\n 'auth-bypass', // Authentication/authorization flaws, privilege escalation\n 'secrets-exposure', // Hardcoded credentials, leaked tokens, exposed API keys\n // Reliability (runtime failures)\n 'null-reference', // Null/undefined dereference, optional chaining needed\n 'boundary-error', // Off-by-one, array bounds, integer overflow, loop issues\n 'resource-leak', // Unclosed connections, file handles, memory leaks, timers\n 'async-issue', // Missing await, unhandled promises, race conditions\n // Correctness (wrong behavior)\n 'logic-error', // Wrong operators, incorrect conditions, bad math, wrong comparisons\n 'data-validation', // Missing input validation, format checking, sanitization\n 'type-coercion', // Implicit coercion bugs, wrong type handling, NaN propagation\n // Design (intent violations)\n 'concurrency', // Thread safety, deadlocks, shared state mutation\n 'intent-violation', // Code does opposite of what comments/names suggest\n]);\nexport type BugCategory = z.infer<typeof BugCategory>;\n\nexport const ConfidenceLevel = z.enum(['high', 'medium', 'low']);\nexport type ConfidenceLevel = z.infer<typeof ConfidenceLevel>;\n\nexport const ConfidenceScore = z.object({\n overall: ConfidenceLevel,\n codePathValidity: z.number().min(0).max(1),\n reachability: z.number().min(0).max(1),\n intentViolation: z.boolean(),\n staticToolSignal: z.boolean(),\n adversarialSurvived: z.boolean(),\n});\nexport type ConfidenceScore = z.infer<typeof ConfidenceScore>;\n\nexport const CodePathStep = z.object({\n step: z.number(),\n file: z.string(),\n line: z.number(),\n code: z.string(),\n explanation: z.string(),\n});\nexport type CodePathStep = z.infer<typeof CodePathStep>;\n\nexport const BugStatus = z.enum(['open', 'fixed', 'false-positive', 'wont-fix']);\nexport type BugStatus = z.infer<typeof BugStatus>;\n\nexport const Bug = z.object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n file: z.string(),\n line: z.number(),\n endLine: z.number().optional(),\n kind: FindingKind.default('bug'),\n severity: BugSeverity,\n category: BugCategory,\n confidence: ConfidenceScore,\n codePath: z.array(CodePathStep),\n evidence: z.array(z.string()),\n suggestedFix: z.string().optional(),\n relatedContract: z.string().optional(),\n staticAnalysisSignals: z.array(z.string()).optional(),\n createdAt: z.string().datetime(),\n // Fix tracking\n status: BugStatus.default('open'),\n fixedAt: z.string().datetime().optional(),\n fixCommit: z.string().optional(),\n // Scanner metadata\n passName: z.string().optional(), // Which pass found this bug\n});\nexport type Bug = z.infer<typeof Bug>;\n\n// ─────────────────────────────────────────────────────────────\n// Config Types\n// ─────────────────────────────────────────────────────────────\n\nexport const ProviderType = z.enum([\n 'claude-code',\n 'aider',\n 'codex',\n 'opencode',\n 'ollama',\n 'gemini',\n]);\nexport type ProviderType = z.infer<typeof ProviderType>;\n\nexport const PriorityLevel = z.enum(['critical', 'high', 'medium', 'low', 'ignore']);\nexport type PriorityLevel = z.infer<typeof PriorityLevel>;\n\nexport const PackageConfig = z.object({\n path: z.string(),\n priority: PriorityLevel,\n include: z.array(z.string()).optional(),\n exclude: z.array(z.string()).optional(),\n});\nexport type PackageConfig = z.infer<typeof PackageConfig>;\n\nexport const MonorepoConfig = z.object({\n detection: z.enum(['auto', 'explicit']),\n packages: z.array(PackageConfig).optional(),\n crossPackageAnalysis: z.boolean().default(true),\n});\nexport type MonorepoConfig = z.infer<typeof MonorepoConfig>;\n\nexport const WhiteroseConfig = z.object({\n version: z.string().default('1'),\n provider: ProviderType.default('claude-code'),\n providerFallback: z.array(ProviderType).optional(),\n\n // Scan settings\n include: z.array(z.string()).default(['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx']),\n exclude: z.array(z.string()).default(['node_modules', 'dist', 'build', '.next', 'coverage']),\n\n // Priority areas\n priorities: z\n .record(z.string(), PriorityLevel)\n .default({}),\n\n // Bug categories to scan for (all 12 categories by default)\n categories: z.array(BugCategory).default([\n // Security\n 'injection',\n 'auth-bypass',\n 'secrets-exposure',\n // Reliability\n 'null-reference',\n 'boundary-error',\n 'resource-leak',\n 'async-issue',\n // Correctness\n 'logic-error',\n 'data-validation',\n 'type-coercion',\n // Design\n 'concurrency',\n 'intent-violation',\n ]),\n\n // Confidence threshold for reporting\n minConfidence: ConfidenceLevel.default('low'),\n\n // Monorepo settings\n monorepo: MonorepoConfig.optional(),\n\n // Static analysis integration\n staticAnalysis: z.object({\n typescript: z.boolean().default(true),\n eslint: z.boolean().default(true),\n }).default({}),\n\n // Output settings\n output: z.object({\n sarif: z.boolean().default(true),\n markdown: z.boolean().default(true),\n sarifPath: z.string().default('.whiterose/reports'),\n markdownPath: z.string().default('BUGS.md'),\n }).default({}),\n});\nexport type WhiteroseConfig = z.infer<typeof WhiteroseConfig>;\n\n// ─────────────────────────────────────────────────────────────\n// Intent & Contract Types\n// ─────────────────────────────────────────────────────────────\n\nexport const BehavioralContract = z.object({\n function: z.string(),\n file: z.string(),\n inputs: z.array(\n z.object({\n name: z.string(),\n type: z.string(),\n constraints: z.string().optional(),\n })\n ),\n outputs: z.object({\n type: z.string(),\n constraints: z.string().optional(),\n }),\n invariants: z.array(z.string()),\n sideEffects: z.array(z.string()),\n throws: z.array(z.string()).optional(),\n});\nexport type BehavioralContract = z.infer<typeof BehavioralContract>;\n\nexport const FeatureIntent = z.object({\n name: z.string(),\n description: z.string(),\n priority: PriorityLevel,\n constraints: z.array(z.string()),\n relatedFiles: z.array(z.string()),\n});\nexport type FeatureIntent = z.infer<typeof FeatureIntent>;\n\nexport const CodebaseUnderstanding = z.object({\n version: z.string(),\n generatedAt: z.string().datetime(),\n summary: z.object({\n framework: z.string().optional(),\n language: z.string(),\n type: z.string(), // e-commerce, saas, api, etc.\n description: z.string(),\n }),\n features: z.array(FeatureIntent),\n contracts: z.array(BehavioralContract),\n dependencies: z.record(z.string(), z.string()),\n structure: z.object({\n totalFiles: z.number(),\n totalLines: z.number(),\n packages: z.array(z.string()).optional(),\n }),\n});\nexport type CodebaseUnderstanding = z.infer<typeof CodebaseUnderstanding>;\n\n// ─────────────────────────────────────────────────────────────\n// Cache Types\n// ─────────────────────────────────────────────────────────────\n\nexport const FileHash = z.object({\n path: z.string(),\n hash: z.string(),\n lastModified: z.string().datetime(),\n});\nexport type FileHash = z.infer<typeof FileHash>;\n\nexport const CacheState = z.object({\n version: z.string(),\n lastFullScan: z.string().datetime().optional(),\n lastIncrementalScan: z.string().datetime().optional(),\n fileHashes: z.array(FileHash),\n});\nexport type CacheState = z.infer<typeof CacheState>;\n\n// ─────────────────────────────────────────────────────────────\n// Provider Types\n// ─────────────────────────────────────────────────────────────\n\n// NOTE: AnalysisContext removed - use ScanContext from CoreScanner instead\n\nexport interface StaticAnalysisResult {\n tool: 'typescript' | 'eslint';\n file: string;\n line: number;\n message: string;\n severity: 'error' | 'warning' | 'info';\n code?: string;\n}\n\n// NOTE: LLMProvider interface removed - use PromptExecutor + CoreScanner instead\n// See src/core/scanner.ts for the new LSP-compliant architecture\n\nexport interface AdversarialResult {\n survived: boolean;\n counterArguments: string[];\n adjustedConfidence?: ConfidenceScore;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Scan Result Types\n// ─────────────────────────────────────────────────────────────\n\nexport const SeverityBreakdown = z.object({\n critical: z.number(),\n high: z.number(),\n medium: z.number(),\n low: z.number(),\n total: z.number(),\n});\nexport type SeverityBreakdown = z.infer<typeof SeverityBreakdown>;\n\nexport const ScanSummary = z.object({\n bugs: SeverityBreakdown,\n smells: SeverityBreakdown,\n total: z.number(),\n});\nexport type ScanSummary = z.infer<typeof ScanSummary>;\n\nexport const ScanMeta = z.object({\n repoName: z.string(),\n provider: z.string(),\n duration: z.number(), // ms\n filesScanned: z.number(),\n linesOfCode: z.number(),\n});\nexport type ScanMeta = z.infer<typeof ScanMeta>;\n\nexport const ScanResult = z.object({\n id: z.string(),\n timestamp: z.string().datetime(),\n scanType: z.enum(['full', 'incremental']),\n filesScanned: z.number(),\n filesChanged: z.number().optional(),\n duration: z.number(), // ms\n linesOfCode: z.number().optional(),\n bugs: z.array(Bug),\n summary: ScanSummary,\n meta: ScanMeta.optional(),\n});\nexport type ScanResult = z.infer<typeof ScanResult>;\n","import { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport YAML from 'yaml';\nimport { WhiteroseConfig, CodebaseUnderstanding as CodebaseUnderstandingSchema } from '../types.js';\nimport type { CodebaseUnderstanding } from '../types.js';\n\nexport async function loadConfig(cwd: string): Promise<WhiteroseConfig> {\n const configPath = join(cwd, '.whiterose', 'config.yml');\n\n if (!existsSync(configPath)) {\n throw new Error('Config file not found. Run \"whiterose init\" first.');\n }\n\n const content = readFileSync(configPath, 'utf-8');\n const parsed = YAML.parse(content);\n\n // Apply defaults\n return WhiteroseConfig.parse(parsed);\n}\n\nexport async function loadUnderstanding(cwd: string): Promise<CodebaseUnderstanding | null> {\n const understandingPath = join(cwd, '.whiterose', 'cache', 'understanding.json');\n\n if (!existsSync(understandingPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(understandingPath, 'utf-8');\n const parsed = JSON.parse(content);\n const result = CodebaseUnderstandingSchema.safeParse(parsed);\n if (!result.success) {\n console.error('Warning: Invalid understanding.json, regenerate with \"whiterose refresh\"');\n return null;\n }\n return result.data;\n } catch {\n return null;\n }\n}\n\nexport async function saveConfig(cwd: string, config: WhiteroseConfig): Promise<void> {\n const { writeFileSync } = await import('fs');\n const configPath = join(cwd, '.whiterose', 'config.yml');\n writeFileSync(configPath, YAML.stringify(config), 'utf-8');\n}\n","import { execa } from 'execa';\nimport { existsSync } from 'fs';\nimport { join, resolve, isAbsolute } from 'path';\nimport { WhiteroseConfig, StaticAnalysisResult } from '../types.js';\n\nexport async function runStaticAnalysis(\n cwd: string,\n files: string[],\n config?: WhiteroseConfig\n): Promise<StaticAnalysisResult[]> {\n const results: StaticAnalysisResult[] = [];\n\n // Default to running both if config is not provided\n const shouldRunTypescript = config?.staticAnalysis?.typescript ?? true;\n const shouldRunEslint = config?.staticAnalysis?.eslint ?? true;\n\n // Run TypeScript compiler\n if (shouldRunTypescript) {\n const tscResults = await runTypeScript(cwd);\n results.push(...tscResults);\n }\n\n // Run ESLint\n if (shouldRunEslint) {\n const eslintResults = await runEslint(cwd, files);\n results.push(...eslintResults);\n }\n\n return results;\n}\n\nasync function runTypeScript(cwd: string): Promise<StaticAnalysisResult[]> {\n const results: StaticAnalysisResult[] = [];\n\n // Check if tsconfig exists\n const tsconfigPath = join(cwd, 'tsconfig.json');\n if (!existsSync(tsconfigPath)) {\n return results;\n }\n\n try {\n // Run tsc --noEmit and capture diagnostics\n await execa('npx', ['tsc', '--noEmit', '--pretty', 'false'], {\n cwd,\n timeout: 60000,\n });\n } catch (error: any) {\n // Parse TypeScript errors from stdout\n const output = [error.stdout, error.stderr].filter(Boolean).join('\\n');\n const lines = output.split('\\n');\n\n for (const line of lines) {\n // Format: path/to/file.ts(line,col): error TS1234: message\n const match = line.match(/^(.+)\\((\\d+),(\\d+)\\):\\s+(error|warning)\\s+TS(\\d+):\\s+(.+)$/);\n if (match) {\n const filePath = normalizeFilePath(match[1], cwd);\n results.push({\n tool: 'typescript',\n file: filePath,\n line: parseInt(match[2], 10),\n message: match[6],\n severity: match[4] === 'error' ? 'error' : 'warning',\n code: `TS${match[5]}`,\n });\n }\n }\n }\n\n return results;\n}\n\nasync function runEslint(cwd: string, files: string[]): Promise<StaticAnalysisResult[]> {\n const results: StaticAnalysisResult[] = [];\n\n // Check if eslint config exists\n const hasEslint =\n existsSync(join(cwd, '.eslintrc')) ||\n existsSync(join(cwd, '.eslintrc.js')) ||\n existsSync(join(cwd, '.eslintrc.json')) ||\n existsSync(join(cwd, '.eslintrc.yml')) ||\n existsSync(join(cwd, 'eslint.config.js')) ||\n existsSync(join(cwd, 'eslint.config.mjs'));\n\n if (!hasEslint) {\n return results;\n }\n\n if (files.length === 0) {\n return results;\n }\n\n try {\n const batchSize = 50;\n for (let i = 0; i < files.length; i += batchSize) {\n const batch = files.slice(i, i + batchSize);\n // Run eslint with JSON output\n const { stdout } = await execa(\n 'npx',\n ['eslint', '--format', 'json', '--no-error-on-unmatched-pattern', ...batch],\n {\n cwd,\n timeout: 60000,\n reject: false,\n }\n );\n\n // ESLint may output warnings before JSON - try to extract JSON array\n let eslintResults: any[] = [];\n try {\n // First try direct parse\n eslintResults = JSON.parse(stdout || '[]');\n } catch {\n // Try to find JSON array in output (skip any prefix warnings)\n const jsonMatch = (stdout || '').match(/\\[\\s*\\{[\\s\\S]*\\}\\s*\\]|\\[\\s*\\]/);\n if (jsonMatch) {\n try {\n eslintResults = JSON.parse(jsonMatch[0]);\n } catch {\n // Give up on this batch - continue with the next\n continue;\n }\n }\n }\n\n for (const fileResult of eslintResults) {\n const filePath = normalizeFilePath(fileResult.filePath, cwd);\n for (const message of fileResult.messages || []) {\n results.push({\n tool: 'eslint',\n file: filePath,\n line: message.line || 0,\n message: message.message,\n severity: message.severity === 2 ? 'error' : 'warning',\n code: message.ruleId,\n });\n }\n }\n }\n } catch {\n // ESLint execution failed, skip\n }\n\n return results;\n}\n\nfunction normalizeFilePath(filePath: string, cwd: string): string {\n if (!filePath) return filePath;\n return isAbsolute(filePath) ? filePath : resolve(cwd, filePath);\n}\n","import { ScanResult, Bug } from '../types.js';\n\ninterface SarifResult {\n $schema: string;\n version: string;\n runs: SarifRun[];\n}\n\ninterface SarifRun {\n tool: {\n driver: {\n name: string;\n version: string;\n informationUri: string;\n rules: SarifRule[];\n };\n };\n results: SarifResultItem[];\n}\n\ninterface SarifRule {\n id: string;\n name: string;\n shortDescription: { text: string };\n fullDescription: { text: string };\n defaultConfiguration: { level: string };\n properties: { category: string; kind?: string };\n}\n\ninterface SarifResultItem {\n ruleId: string;\n level: string;\n message: { text: string; markdown?: string };\n locations: SarifLocation[];\n codeFlows?: SarifCodeFlow[];\n properties?: Record<string, any>;\n}\n\ninterface SarifLocation {\n physicalLocation: {\n artifactLocation: { uri: string };\n region: { startLine: number; endLine?: number };\n };\n}\n\ninterface SarifCodeFlow {\n threadFlows: {\n locations: {\n location: SarifLocation;\n message?: { text: string };\n }[];\n }[];\n}\n\nexport function outputSarif(result: ScanResult): SarifResult {\n const rules: SarifRule[] = [];\n const results: SarifResultItem[] = [];\n\n // Build unique rules from bugs\n const seenRules = new Set<string>();\n\n for (const bug of result.bugs) {\n // Create rule if not seen\n if (!seenRules.has(bug.category)) {\n seenRules.add(bug.category);\n rules.push({\n id: bug.category,\n name: formatRuleName(bug.category),\n shortDescription: { text: getCategoryDescription(bug.category) },\n fullDescription: { text: getCategoryDescription(bug.category) },\n defaultConfiguration: { level: 'warning' },\n properties: { category: bug.category, kind: bug.kind },\n });\n }\n\n // Create result\n results.push(bugToSarifResult(bug));\n }\n\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: 'whiterose',\n version: '0.1.0',\n informationUri: 'https://github.com/shakecodeslikecray/whiterose',\n rules,\n },\n },\n results,\n },\n ],\n };\n}\n\nfunction bugToSarifResult(bug: Bug): SarifResultItem {\n const result: SarifResultItem = {\n ruleId: bug.id,\n level: severityToLevel(bug),\n message: {\n text: `${bug.kind === 'smell' ? '[SMELL] ' : ''}${bug.title}`,\n markdown: `**${bug.title}**\\n\\n${bug.description}\\n\\n**Kind:** ${bug.kind}\\n\\n**Evidence:**\\n${bug.evidence.map((e) => `- ${e}`).join('\\n')}`,\n },\n locations: [\n {\n physicalLocation: {\n artifactLocation: { uri: bug.file },\n region: { startLine: bug.line, endLine: bug.endLine },\n },\n },\n ],\n properties: {\n category: bug.category,\n kind: bug.kind,\n confidence: bug.confidence.overall,\n codePathValidity: bug.confidence.codePathValidity,\n reachability: bug.confidence.reachability,\n intentViolation: bug.confidence.intentViolation,\n staticToolSignal: bug.confidence.staticToolSignal,\n adversarialSurvived: bug.confidence.adversarialSurvived,\n evidence: bug.evidence,\n suggestedFix: bug.suggestedFix,\n },\n };\n\n // Add code flow if available\n if (bug.codePath.length > 0) {\n result.codeFlows = [\n {\n threadFlows: [\n {\n locations: bug.codePath.map((step) => ({\n location: {\n physicalLocation: {\n artifactLocation: { uri: step.file },\n region: { startLine: step.line },\n },\n },\n message: { text: step.explanation },\n })),\n },\n ],\n },\n ];\n }\n\n return result;\n}\n\nfunction severityToLevel(bug: Bug): string {\n if (bug.kind === 'smell') return 'note';\n switch (bug.severity) {\n case 'critical':\n return 'error';\n case 'high':\n return 'error';\n case 'medium':\n return 'warning';\n case 'low':\n return 'note';\n default:\n return 'warning';\n }\n}\n\nfunction formatRuleName(category: string): string {\n return category\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\nfunction getCategoryDescription(category: string): string {\n const descriptions: Record<string, string> = {\n // Security\n 'injection': 'Injection vulnerabilities including SQL, command, and code injection',\n 'auth-bypass': 'Authentication and authorization bypass vulnerabilities',\n 'secrets-exposure': 'Exposure of secrets, credentials, or sensitive data',\n // Reliability\n 'null-reference': 'Potential null or undefined reference issues',\n 'boundary-error': 'Boundary errors including off-by-one and array index issues',\n 'resource-leak': 'Resource leaks such as unclosed handles or connections',\n 'async-issue': 'Async/concurrency issues like race conditions and missing awaits',\n // Correctness\n 'logic-error': 'Logic errors such as wrong operators or incorrect conditions',\n 'data-validation': 'Missing or improper input validation',\n 'type-coercion': 'Type coercion bugs that may cause unexpected behavior',\n // Design\n 'concurrency': 'Thread safety and deadlock issues',\n 'intent-violation': 'Violations of documented behavioral contracts or business rules',\n };\n\n return descriptions[category] || 'Unknown bug category';\n}\n","import { ScanResult, Bug, BugSeverity } from '../types.js';\n\nexport function outputMarkdown(result: ScanResult): string {\n const lines: string[] = [];\n const verifiedBugs = result.bugs.filter((b) => b.kind === 'bug');\n const smells = result.bugs.filter((b) => b.kind === 'smell');\n\n // Header\n lines.push('# Bug Report');\n lines.push('');\n lines.push(`> Generated by [whiterose](https://github.com/shakecodeslikecray/whiterose) on ${new Date().toISOString()}`);\n lines.push('');\n\n // Summary\n lines.push('## Summary');\n lines.push('');\n lines.push(`| | Bugs | Smells |`);\n lines.push(`|----------|-------|-------|`);\n lines.push(`| Critical | ${result.summary.bugs.critical} | ${result.summary.smells.critical} |`);\n lines.push(`| High | ${result.summary.bugs.high} | ${result.summary.smells.high} |`);\n lines.push(`| Medium | ${result.summary.bugs.medium} | ${result.summary.smells.medium} |`);\n lines.push(`| Low | ${result.summary.bugs.low} | ${result.summary.smells.low} |`);\n lines.push(`| **Total** | **${result.summary.bugs.total}** | **${result.summary.smells.total}** |`);\n lines.push('');\n lines.push(`**Total Findings:** ${result.summary.total}`);\n lines.push('');\n\n // Scan info\n lines.push(`- **Scan Type:** ${result.scanType}`);\n lines.push(`- **Files Scanned:** ${result.filesScanned}`);\n if (result.filesChanged !== undefined) {\n lines.push(`- **Files Changed:** ${result.filesChanged}`);\n }\n lines.push('');\n\n if (verifiedBugs.length === 0 && smells.length === 0) {\n lines.push('No findings found.');\n return lines.join('\\n');\n }\n\n if (verifiedBugs.length === 0 && smells.length > 0) {\n lines.push('No verified bugs found. Smells are listed below.');\n lines.push('');\n }\n\n // Group by severity\n const bySeverity: Record<BugSeverity, Bug[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n\n for (const bug of verifiedBugs) {\n bySeverity[bug.severity].push(bug);\n }\n\n if (verifiedBugs.length > 0) {\n lines.push('## Verified Bugs');\n lines.push('');\n emitBySeverity(lines, bySeverity);\n }\n\n if (smells.length > 0) {\n const smellsBySeverity: Record<BugSeverity, Bug[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n\n for (const smell of smells) {\n smellsBySeverity[smell.severity].push(smell);\n }\n\n lines.push('## Smells');\n lines.push('');\n emitBySeverity(lines, smellsBySeverity);\n }\n\n return lines.join('\\n');\n}\n\nfunction emitBySeverity(lines: string[], bySeverity: Record<BugSeverity, Bug[]>): void {\n if (bySeverity.critical.length > 0) {\n lines.push('### Critical');\n lines.push('');\n for (const bug of bySeverity.critical) {\n lines.push(formatBug(bug));\n }\n }\n\n if (bySeverity.high.length > 0) {\n lines.push('### High');\n lines.push('');\n for (const bug of bySeverity.high) {\n lines.push(formatBug(bug));\n }\n }\n\n if (bySeverity.medium.length > 0) {\n lines.push('### Medium');\n lines.push('');\n for (const bug of bySeverity.medium) {\n lines.push(formatBug(bug));\n }\n }\n\n if (bySeverity.low.length > 0) {\n lines.push('### Low');\n lines.push('');\n for (const bug of bySeverity.low) {\n lines.push(formatBug(bug));\n }\n }\n}\n\nfunction formatBug(bug: Bug): string {\n const lines: string[] = [];\n\n // Title with ID and confidence\n const confidenceBadge = getConfidenceBadge(bug.confidence.overall);\n const kindBadge = bug.kind === 'smell' ? '`[SMELL]`' : '`[BUG]`';\n lines.push(`### ${bug.id}: ${bug.title} ${kindBadge} ${confidenceBadge}`);\n lines.push('');\n\n // Location\n lines.push(`**Location:** \\`${bug.file}:${bug.line}\\``);\n lines.push(`**Category:** ${formatCategory(bug.category)}`);\n lines.push('');\n\n // Description\n lines.push(bug.description);\n lines.push('');\n\n // Code path\n if (bug.codePath.length > 0) {\n lines.push('<details>');\n lines.push('<summary>Code Path</summary>');\n lines.push('');\n for (const step of bug.codePath) {\n lines.push(`${step.step}. \\`${step.file}:${step.line}\\``);\n lines.push(` \\`\\`\\`${getLanguage(step.file)}`);\n lines.push(` ${step.code}`);\n lines.push(' ```');\n lines.push(` ${step.explanation}`);\n lines.push('');\n }\n lines.push('</details>');\n lines.push('');\n }\n\n // Evidence\n if (bug.evidence.length > 0) {\n lines.push('**Evidence:**');\n for (const e of bug.evidence) {\n lines.push(`- ${e}`);\n }\n lines.push('');\n }\n\n // Suggested fix\n if (bug.suggestedFix) {\n lines.push('**Suggested Fix:**');\n lines.push('```');\n lines.push(bug.suggestedFix);\n lines.push('```');\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction getConfidenceBadge(confidence: string): string {\n switch (confidence) {\n case 'high':\n return '`[HIGH CONFIDENCE]`';\n case 'medium':\n return '`[MEDIUM CONFIDENCE]`';\n case 'low':\n return '`[LOW CONFIDENCE]`';\n default:\n return '';\n }\n}\n\nfunction formatCategory(category: string): string {\n return category\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\nfunction getLanguage(file: string): string {\n if (file.endsWith('.ts') || file.endsWith('.tsx')) return 'typescript';\n if (file.endsWith('.js') || file.endsWith('.jsx')) return 'javascript';\n if (file.endsWith('.py')) return 'python';\n if (file.endsWith('.go')) return 'go';\n return '';\n}\n","/**\n * Human-Readable Bug Report Formatter\n *\n * Transforms technical bug reports into tester-friendly format:\n * - Title = What goes wrong (outcome, not implementation)\n * - What happens = Plain English consequence\n * - How to trigger = Steps a tester would take\n * - Impact = Why should I care\n * - Technical details = Hidden, for developers\n */\n\nimport { Bug, ScanResult, BugCategory, BugSeverity } from '../types.js';\n\nexport interface HumanReadableBug {\n id: string;\n humanTitle: string;\n whatHappens: string;\n howToTrigger: string[];\n impact: string;\n severity: BugSeverity;\n category: BugCategory;\n technicalDetails: {\n title: string;\n file: string;\n line: number;\n endLine?: number;\n description: string;\n evidence: string[];\n suggestedFix?: string;\n codePath: Array<{ step: number; file: string; line: number; explanation: string }>;\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Category-specific templates for human-readable descriptions\n// ─────────────────────────────────────────────────────────────\n\nconst CATEGORY_TEMPLATES: Record<BugCategory, {\n humanTitleTemplate: (title: string) => string;\n whatHappensTemplate: (desc: string) => string;\n impactTemplate: (severity: BugSeverity) => string;\n triggerHints: string[];\n}> = {\n 'injection': {\n humanTitleTemplate: (t) => t.includes('SQL') ? 'Database can be manipulated by attackers' :\n t.includes('command') ? 'System commands can be hijacked' :\n t.includes('path') ? 'Attackers can access unauthorized files' :\n t.includes('XSS') ? 'Malicious scripts can run in user browsers' :\n 'User input can be used to attack the system',\n whatHappensTemplate: (d) => `An attacker can inject malicious data that the system executes as code or commands. ${d.split('.')[0]}.`,\n impactTemplate: (s) => s === 'critical' ? 'Complete system compromise, data breach, or unauthorized access is possible.' :\n s === 'high' ? 'Sensitive data exposure or unauthorized actions are possible.' :\n 'Limited data exposure or restricted unauthorized actions.',\n triggerHints: ['Enter special characters in input fields', 'Include quotes or semicolons in form data', 'Try URL parameters with encoded characters'],\n },\n 'auth-bypass': {\n humanTitleTemplate: () => 'Users can access features they shouldnt have permission for',\n whatHappensTemplate: (d) => `Some users can bypass authentication or authorization checks to access restricted features. ${d.split('.')[0]}.`,\n impactTemplate: (s) => s === 'critical' ? 'Any user can gain admin access or access all user data.' :\n s === 'high' ? 'Users can access other users data or restricted features.' :\n 'Minor privilege escalation in non-critical features.',\n triggerHints: ['Try accessing admin pages while logged out', 'Access resources using another users ID', 'Remove auth cookies and retry requests'],\n },\n 'secrets-exposure': {\n humanTitleTemplate: (t) => t.includes('random') ? 'Predictable IDs or tokens can be guessed' :\n t.includes('hardcoded') ? 'Passwords or API keys are visible in the code' :\n 'Sensitive information may be exposed',\n whatHappensTemplate: (d) => `Sensitive information like passwords, API keys, or tokens could be exposed to attackers. ${d.split('.')[0]}.`,\n impactTemplate: (s) => s === 'critical' ? 'Attackers can gain full access to external services or admin accounts.' :\n s === 'high' ? 'Attackers can guess tokens or access partial system credentials.' :\n 'Information useful for further attacks may be exposed.',\n triggerHints: ['Check browser console for exposed data', 'Look at network requests for sensitive info', 'Review error messages for credential leaks'],\n },\n 'null-reference': {\n humanTitleTemplate: () => 'The page or feature can crash unexpectedly',\n whatHappensTemplate: (d) => `The application may crash or show an error when encountering unexpected empty data. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Users experience crashes, error pages, or incomplete data when this happens.',\n triggerHints: ['Leave optional fields empty', 'Delete data that other features depend on', 'Access items that have been removed'],\n },\n 'boundary-error': {\n humanTitleTemplate: () => 'Data can be corrupted or lost at edge cases',\n whatHappensTemplate: (d) => `The system doesnt handle boundary conditions correctly, which can cause data issues. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Data may be truncated, lost, or display incorrectly at the limits.',\n triggerHints: ['Enter very long text in input fields', 'Try negative numbers or zero', 'Create empty lists then access items'],\n },\n 'resource-leak': {\n humanTitleTemplate: () => 'System performance degrades over time',\n whatHappensTemplate: (d) => `System resources are not properly released, causing gradual performance degradation. ${d.split('.')[0]}.`,\n impactTemplate: () => 'The system becomes slower over time, may crash, or stop responding after extended use.',\n triggerHints: ['Use the feature repeatedly many times', 'Leave the page open for extended periods', 'Navigate away and back multiple times'],\n },\n 'async-issue': {\n humanTitleTemplate: () => 'Operations can happen out of order causing data issues',\n whatHappensTemplate: (d) => `Concurrent operations may interfere with each other, causing race conditions or data corruption. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Data may be saved incorrectly or operations may fail silently when used rapidly.',\n triggerHints: ['Click buttons rapidly multiple times', 'Submit forms twice quickly', 'Open the same feature in multiple tabs'],\n },\n 'logic-error': {\n humanTitleTemplate: (t) => t.includes('operator') ? 'Calculations or comparisons give wrong results' :\n t.includes('regex') ? 'Search or validation accepts invalid data' :\n 'The feature doesnt work as expected',\n whatHappensTemplate: (d) => `The code logic produces incorrect results in certain situations. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Features may produce wrong results, accept invalid data, or skip important checks.',\n triggerHints: ['Enter edge case values (0, negative, very large)', 'Test with special characters', 'Try inputs that almost match expected format'],\n },\n 'data-validation': {\n humanTitleTemplate: () => 'Invalid data can be submitted and saved',\n whatHappensTemplate: (d) => `User input is not properly validated, allowing bad data into the system. ${d.split('.')[0]}.`,\n impactTemplate: (s) => s === 'critical' || s === 'high' ? 'Invalid data can cause system errors or security issues.' :\n 'Data quality issues and inconsistent behavior.',\n triggerHints: ['Enter wrong format data (letters in number fields)', 'Submit empty required fields', 'Exceed maximum lengths'],\n },\n 'type-coercion': {\n humanTitleTemplate: () => 'Data types can get mixed up causing errors',\n whatHappensTemplate: (d) => `The system doesnt properly check data types, leading to unexpected behavior. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Features may crash or produce incorrect results with certain inputs.',\n triggerHints: ['Enter text where numbers are expected', 'Submit data from API tools with wrong types', 'Modify hidden form fields'],\n },\n 'concurrency': {\n humanTitleTemplate: () => 'Multiple users can cause data conflicts',\n whatHappensTemplate: (d) => `When multiple users work on the same data simultaneously, conflicts can occur. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Data can be lost or corrupted when multiple users edit the same item.',\n triggerHints: ['Edit the same item in two browser tabs', 'Have two users modify the same record', 'Submit changes rapidly'],\n },\n 'intent-violation': {\n humanTitleTemplate: () => 'The feature doesnt do what its supposed to',\n whatHappensTemplate: (d) => `The actual behavior differs from what the code comments or names suggest it should do. ${d.split('.')[0]}.`,\n impactTemplate: () => 'Features may work differently than documented or expected.',\n triggerHints: ['Compare actual behavior to documentation', 'Test edge cases not covered in docs', 'Check if error handling matches expectations'],\n },\n};\n\n/**\n * Transform a technical bug into a human-readable format\n */\nexport function toHumanReadable(bug: Bug): HumanReadableBug {\n const template = CATEGORY_TEMPLATES[bug.category];\n\n // Generate human-friendly title\n const humanTitle = template.humanTitleTemplate(bug.title);\n\n // Generate what happens description\n const whatHappens = template.whatHappensTemplate(bug.description);\n\n // Generate impact statement\n const impact = template.impactTemplate(bug.severity);\n\n // Generate trigger steps based on category hints + bug specifics\n const howToTrigger = generateTriggerSteps(bug, template.triggerHints);\n\n return {\n id: bug.id,\n humanTitle,\n whatHappens,\n howToTrigger,\n impact,\n severity: bug.severity,\n category: bug.category,\n technicalDetails: {\n title: bug.title,\n file: bug.file,\n line: bug.line,\n endLine: bug.endLine,\n description: bug.description,\n evidence: bug.evidence,\n suggestedFix: bug.suggestedFix,\n codePath: bug.codePath.map(s => ({\n step: s.step,\n file: s.file,\n line: s.line,\n explanation: s.explanation,\n })),\n },\n };\n}\n\n/**\n * Generate specific trigger steps from bug details\n */\nfunction generateTriggerSteps(bug: Bug, categoryHints: string[]): string[] {\n const steps: string[] = [];\n\n // Try to extract trigger info from bug details\n const bugData = bug as any;\n if (bugData.triggerInput) {\n steps.push(`Use this input: ${bugData.triggerInput}`);\n }\n\n // Add file-based hint\n const fileName = bug.file.split('/').pop() || bug.file;\n if (fileName.includes('api') || fileName.includes('route') || fileName.includes('controller')) {\n steps.push(`Access the API endpoint related to ${fileName}`);\n } else if (fileName.includes('component') || fileName.includes('page')) {\n steps.push(`Navigate to the page containing this feature`);\n }\n\n // Add category-specific hints\n steps.push(...categoryHints.slice(0, 2));\n\n // If we have code path, extract trigger hints\n if (bug.codePath.length > 0) {\n const entry = bug.codePath[0];\n if (entry.explanation.toLowerCase().includes('user input') ||\n entry.explanation.toLowerCase().includes('enters')) {\n steps.unshift(`Start by providing input at: ${entry.file.split('/').pop()}:${entry.line}`);\n }\n }\n\n return steps.slice(0, 4); // Max 4 steps\n}\n\n/**\n * Format human-readable bug as markdown\n */\nexport function formatHumanReadableMarkdown(bug: HumanReadableBug): string {\n const severityIcon = {\n critical: '🔴',\n high: '🟠',\n medium: '🟡',\n low: '⚪',\n }[bug.severity];\n\n return `### ${severityIcon} ${bug.humanTitle}\n\n**What happens:** ${bug.whatHappens}\n\n**How to trigger:**\n${bug.howToTrigger.map((s, i) => `${i + 1}. ${s}`).join('\\n')}\n\n**Impact:** ${bug.impact}\n\n<details>\n<summary>Technical Details</summary>\n\n- **ID:** ${bug.id}\n- **File:** \\`${bug.technicalDetails.file}:${bug.technicalDetails.line}\\`\n- **Category:** ${bug.category}\n- **Technical Title:** ${bug.technicalDetails.title}\n\n${bug.technicalDetails.description}\n\n${bug.technicalDetails.evidence.length > 0 ? `**Evidence:**\\n${bug.technicalDetails.evidence.map(e => `- ${e}`).join('\\n')}` : ''}\n\n${bug.technicalDetails.suggestedFix ? `**Suggested Fix:**\\n\\`\\`\\`\\n${bug.technicalDetails.suggestedFix}\\n\\`\\`\\`` : ''}\n\n${bug.technicalDetails.codePath.length > 0 ? `**Code Path:**\\n${bug.technicalDetails.codePath.map(s => `${s.step}. \\`${s.file.split('/').pop()}:${s.line}\\` - ${s.explanation}`).join('\\n')}` : ''}\n\n</details>\n\n---\n`;\n}\n\n/**\n * Generate a complete human-readable report\n */\nexport function outputHumanReadableMarkdown(result: ScanResult): string {\n const humanBugs = result.bugs\n .filter(b => b.kind === 'bug')\n .map(toHumanReadable);\n\n const sections: string[] = [];\n\n // Header\n sections.push(`# Bug Report\n\n> Human-readable summary generated by whiterose on ${new Date(result.timestamp).toLocaleDateString()}\n> **${result.summary.bugs.total} bugs found** in ${result.filesScanned} files\n\n---\n\n## Summary\n\n| Severity | Bugs | Smells |\n|----------|------|--------|\n| Critical | ${result.summary.bugs.critical} | ${result.summary.smells.critical} |\n| High | ${result.summary.bugs.high} | ${result.summary.smells.high} |\n| Medium | ${result.summary.bugs.medium} | ${result.summary.smells.medium} |\n| Low | ${result.summary.bugs.low} | ${result.summary.smells.low} |\n| **Total** | **${result.summary.bugs.total}** | **${result.summary.smells.total}** |\n\n---\n`);\n\n // Group by severity\n const bySeverity = {\n critical: humanBugs.filter(b => b.severity === 'critical'),\n high: humanBugs.filter(b => b.severity === 'high'),\n medium: humanBugs.filter(b => b.severity === 'medium'),\n low: humanBugs.filter(b => b.severity === 'low'),\n };\n\n if (bySeverity.critical.length > 0) {\n sections.push(`## 🔴 Critical Issues\\n\\nThese must be fixed immediately.\\n\\n${bySeverity.critical.map(formatHumanReadableMarkdown).join('\\n')}`);\n }\n\n if (bySeverity.high.length > 0) {\n sections.push(`## 🟠 High Priority Issues\\n\\nThese should be fixed soon.\\n\\n${bySeverity.high.map(formatHumanReadableMarkdown).join('\\n')}`);\n }\n\n if (bySeverity.medium.length > 0) {\n sections.push(`## 🟡 Medium Priority Issues\\n\\nFix when convenient.\\n\\n${bySeverity.medium.map(formatHumanReadableMarkdown).join('\\n')}`);\n }\n\n if (bySeverity.low.length > 0) {\n sections.push(`## ⚪ Low Priority Issues\\n\\nMinor improvements.\\n\\n${bySeverity.low.map(formatHumanReadableMarkdown).join('\\n')}`);\n }\n\n // Footer\n sections.push(`---\n\n*Generated by [whiterose](https://github.com/whiterose) - 10x Bug Hunter*\n`);\n\n return sections.join('\\n\\n');\n}\n","/**\n * Bug Merger - Union bugs across multiple scans\n *\n * Ensures deterministic bug accumulation by merging new bugs\n * with existing bugs using fingerprint-based deduplication.\n *\n * Fingerprint: file + function name + category\n * This survives minor line number shifts and code reformatting.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, dirname, relative } from 'path';\nimport { Bug } from '../types.js';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\ninterface BugFingerprint {\n file: string; // Relative file path\n functionName: string; // Extracted from title or code path\n category: string; // Bug category\n kind: string; // Bug vs smell\n lineRange: string; // Approximate line range (rounded to 10s)\n}\n\ninterface MergeResult {\n bugs: Bug[];\n stats: {\n total: number;\n newBugs: number;\n existingBugs: number;\n duplicatesSkipped: number;\n };\n}\n\ninterface StoredBugList {\n version: string;\n lastUpdated: string;\n bugs: Bug[];\n fingerprints: Record<string, string>; // fingerprint hash -> bug id\n}\n\n// ─────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────\n\nconst STORAGE_VERSION = '1';\nconst BUGS_FILENAME = 'accumulated-bugs.json';\n\n// ─────────────────────────────────────────────────────────────\n// Fingerprinting\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Extract function name from bug data\n * Tries: title, code path, or falls back to line-based identifier\n */\nfunction extractFunctionName(bug: Bug): string {\n // Try to extract from title (e.g., \"Null dereference in getUserById\")\n const titleMatch = bug.title.match(/\\bin\\s+(\\w+)/i);\n if (titleMatch) {\n return titleMatch[1];\n }\n\n // Try to extract from code path\n if (bug.codePath && bug.codePath.length > 0) {\n // Look for function calls or definitions in code\n for (const step of bug.codePath) {\n const funcMatch = step.code?.match(/(?:function|async function|const|let|var)\\s+(\\w+)|(\\w+)\\s*\\(/);\n if (funcMatch) {\n return funcMatch[1] || funcMatch[2];\n }\n }\n }\n\n // Fall back to \"unknown\" + line range\n return `unknown_L${Math.floor(bug.line / 10) * 10}`;\n}\n\n/**\n * Create a fingerprint for a bug\n */\nfunction createFingerprint(bug: Bug, cwd: string): BugFingerprint {\n // Normalize file path to relative\n const relativeFile = bug.file.startsWith('/')\n ? relative(cwd, bug.file)\n : bug.file;\n\n return {\n file: relativeFile,\n functionName: extractFunctionName(bug),\n category: bug.category,\n kind: bug.kind || 'bug',\n lineRange: `${Math.floor(bug.line / 10) * 10}-${Math.floor((bug.endLine || bug.line) / 10) * 10 + 10}`,\n };\n}\n\n/**\n * Hash a fingerprint to a string key\n */\nfunction hashFingerprint(fp: BugFingerprint): string {\n return `${fp.file}::${fp.functionName}::${fp.category}::${fp.kind}::${fp.lineRange}`;\n}\n\n/**\n * Create a looser fingerprint for fuzzy matching\n * (ignores line range for catching bugs that moved slightly)\n */\nfunction hashFingerprintLoose(fp: BugFingerprint): string {\n return `${fp.file}::${fp.functionName}::${fp.category}::${fp.kind}`;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Storage\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Get the path to the accumulated bugs file\n */\nfunction getBugsPath(cwd: string): string {\n return join(cwd, '.whiterose', BUGS_FILENAME);\n}\n\n/**\n * Load existing accumulated bugs\n */\nexport function loadAccumulatedBugs(cwd: string): StoredBugList {\n const bugsPath = getBugsPath(cwd);\n\n if (!existsSync(bugsPath)) {\n return {\n version: STORAGE_VERSION,\n lastUpdated: new Date().toISOString(),\n bugs: [],\n fingerprints: {},\n };\n }\n\n try {\n const content = readFileSync(bugsPath, 'utf-8');\n const stored = JSON.parse(content) as StoredBugList;\n\n // Version check\n if (stored.version !== STORAGE_VERSION) {\n console.warn('Bug list version mismatch, starting fresh');\n return {\n version: STORAGE_VERSION,\n lastUpdated: new Date().toISOString(),\n bugs: [],\n fingerprints: {},\n };\n }\n\n // Normalize missing fields for backward compatibility\n if (!Array.isArray(stored.bugs)) {\n stored.bugs = [];\n }\n if (!stored.fingerprints || typeof stored.fingerprints !== 'object') {\n stored.fingerprints = {};\n }\n stored.bugs = stored.bugs.map((b) => ({ ...b, kind: b.kind || 'bug' }));\n return stored;\n } catch (error) {\n // File exists but is corrupted - create backup and warn user\n const backupPath = `${bugsPath}.corrupted.${Date.now()}`;\n try {\n const corruptedContent = readFileSync(bugsPath, 'utf-8');\n writeFileSync(backupPath, corruptedContent);\n console.warn(`Warning: ${BUGS_FILENAME} is corrupted and could not be parsed.`);\n console.warn(`Corrupted file backed up to: ${backupPath}`);\n console.warn('Bug history has been reset. Previous bugs will appear as new.');\n } catch {\n // Backup failed, still warn about corruption\n console.warn(`Warning: ${BUGS_FILENAME} is corrupted and could not be parsed.`);\n console.warn('Bug history has been reset. Previous bugs will appear as new.');\n }\n return {\n version: STORAGE_VERSION,\n lastUpdated: new Date().toISOString(),\n bugs: [],\n fingerprints: {},\n };\n }\n}\n\n/**\n * Save accumulated bugs\n */\nexport function saveAccumulatedBugs(cwd: string, stored: StoredBugList): void {\n const bugsPath = getBugsPath(cwd);\n const bugsDir = dirname(bugsPath);\n\n // Ensure directory exists\n if (!existsSync(bugsDir)) {\n mkdirSync(bugsDir, { recursive: true });\n }\n\n stored.lastUpdated = new Date().toISOString();\n writeFileSync(bugsPath, JSON.stringify(stored, null, 2));\n}\n\n// ─────────────────────────────────────────────────────────────\n// Merging\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Merge new bugs with existing accumulated bugs\n * Returns the merged list and stats about what was added\n */\nexport function mergeBugs(\n newBugs: Bug[],\n cwd: string\n): MergeResult {\n const stored = loadAccumulatedBugs(cwd);\n const existingFingerprints = new Set(Object.keys(stored.fingerprints));\n const existingLooseFingerprints = new Map<string, string>(); // loose hash -> bug id\n\n // Build loose fingerprint map for existing bugs\n for (const bug of stored.bugs) {\n const fp = createFingerprint(bug, cwd);\n existingLooseFingerprints.set(hashFingerprintLoose(fp), bug.id);\n }\n\n let duplicatesSkipped = 0;\n const bugsToAdd: Bug[] = [];\n\n for (const bug of newBugs) {\n bug.kind = bug.kind || 'bug';\n const fp = createFingerprint(bug, cwd);\n const strictHash = hashFingerprint(fp);\n const looseHash = hashFingerprintLoose(fp);\n\n // Check strict match first\n if (existingFingerprints.has(strictHash)) {\n duplicatesSkipped++;\n continue;\n }\n\n // Check loose match (same file + function + category, different line range)\n if (existingLooseFingerprints.has(looseHash)) {\n // Update the existing bug's line numbers if the new one is more recent\n const existingBugId = existingLooseFingerprints.get(looseHash)!;\n const existingBugIndex = stored.bugs.findIndex(b => b.id === existingBugId);\n if (existingBugIndex !== -1) {\n // Update line numbers to latest\n stored.bugs[existingBugIndex].line = bug.line;\n stored.bugs[existingBugIndex].endLine = bug.endLine;\n // Update suggested fix if new one is better\n if (bug.suggestedFix && (!stored.bugs[existingBugIndex].suggestedFix || bug.suggestedFix.length > stored.bugs[existingBugIndex].suggestedFix!.length)) {\n stored.bugs[existingBugIndex].suggestedFix = bug.suggestedFix;\n }\n }\n duplicatesSkipped++;\n continue;\n }\n\n // New bug - add it\n bugsToAdd.push(bug);\n stored.fingerprints[strictHash] = bug.id;\n existingFingerprints.add(strictHash);\n existingLooseFingerprints.set(looseHash, bug.id);\n }\n\n // Add new bugs to stored list with unique IDs\n // Find the highest existing ID number\n let maxIdNum = 0;\n for (const bug of stored.bugs) {\n const match = bug.id.match(/WR-(\\d+)/);\n if (match) {\n maxIdNum = Math.max(maxIdNum, parseInt(match[1], 10));\n }\n }\n\n // Assign new unique IDs to bugs being added\n for (const bug of bugsToAdd) {\n maxIdNum++;\n const oldId = bug.id;\n bug.id = `WR-${String(maxIdNum).padStart(3, '0')}`;\n // Update fingerprint mapping with new ID\n for (const [hash, id] of Object.entries(stored.fingerprints)) {\n if (id === oldId) {\n stored.fingerprints[hash] = bug.id;\n }\n }\n stored.bugs.push(bug);\n }\n\n // Save updated list\n saveAccumulatedBugs(cwd, stored);\n\n return {\n bugs: stored.bugs,\n stats: {\n total: stored.bugs.length,\n newBugs: bugsToAdd.length,\n existingBugs: stored.bugs.length - bugsToAdd.length,\n duplicatesSkipped,\n },\n };\n}\n\n/**\n * Get only the new bugs from a merge (for reporting to user)\n */\nexport function getNewBugsOnly(\n newBugs: Bug[],\n cwd: string\n): Bug[] {\n const stored = loadAccumulatedBugs(cwd);\n const existingLooseFingerprints = new Set<string>();\n\n // Build loose fingerprint set for existing bugs\n for (const bug of stored.bugs) {\n const fp = createFingerprint(bug, cwd);\n existingLooseFingerprints.add(hashFingerprintLoose(fp));\n }\n\n // Filter to only new bugs\n return newBugs.filter(bug => {\n const fp = createFingerprint(bug, cwd);\n return !existingLooseFingerprints.has(hashFingerprintLoose(fp));\n });\n}\n\n/**\n * Clear all accumulated bugs (start fresh)\n */\nexport function clearAccumulatedBugs(cwd: string): void {\n const bugsPath = getBugsPath(cwd);\n if (existsSync(bugsPath)) {\n const fresh: StoredBugList = {\n version: STORAGE_VERSION,\n lastUpdated: new Date().toISOString(),\n bugs: [],\n fingerprints: {},\n };\n writeFileSync(bugsPath, JSON.stringify(fresh, null, 2));\n }\n}\n\n/**\n * Remove a specific bug from accumulated list (after it's been fixed)\n */\nexport function removeBugFromAccumulated(cwd: string, bugId: string): boolean {\n const stored = loadAccumulatedBugs(cwd);\n const bugIndex = stored.bugs.findIndex(b => b.id === bugId);\n\n if (bugIndex === -1) {\n return false;\n }\n\n const bug = stored.bugs[bugIndex];\n const fp = createFingerprint(bug, cwd);\n const strictHash = hashFingerprint(fp);\n\n // Remove from bugs array\n stored.bugs.splice(bugIndex, 1);\n\n // Remove from fingerprints\n delete stored.fingerprints[strictHash];\n\n // Save\n saveAccumulatedBugs(cwd, stored);\n return true;\n}\n\n/**\n * Get accumulated bugs stats\n */\nexport function getAccumulatedBugsStats(cwd: string): {\n total: number;\n byCategory: Record<string, number>;\n bySeverity: Record<string, number>;\n lastUpdated: string;\n} {\n const stored = loadAccumulatedBugs(cwd);\n\n const byCategory: Record<string, number> = {};\n const bySeverity: Record<string, number> = {};\n\n for (const bug of stored.bugs) {\n byCategory[bug.category] = (byCategory[bug.category] || 0) + 1;\n bySeverity[bug.severity] = (bySeverity[bug.severity] || 0) + 1;\n }\n\n return {\n total: stored.bugs.length,\n byCategory,\n bySeverity,\n lastUpdated: stored.lastUpdated,\n };\n}\n","/**\n * Cross-File Analyzer\n *\n * Detects bugs that span multiple files/commands:\n * - Incomplete features (scan writes to A,B,C but clear only clears A)\n * - State mismatches (command X expects state that command Y doesn't set)\n * - Orphaned operations (writes without corresponding cleanup)\n *\n * This catches bugs that single-file analysis misses.\n */\n\nimport { readFileSync } from 'fs';\nimport { relative, basename } from 'path';\nimport fg from 'fast-glob';\nimport { Bug } from '../types.js';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\ninterface FileEffect {\n file: string; // Source file\n type: 'read' | 'write' | 'delete';\n target: string; // What it reads/writes (file path pattern or description)\n line: number;\n code: string;\n functionName?: string;\n}\n\ninterface CommandInfo {\n name: string; // Command name (e.g., 'scan', 'clear', 'fix')\n file: string; // Source file\n reads: FileEffect[]; // What state/files it reads\n writes: FileEffect[]; // What state/files it writes\n deletes: FileEffect[]; // What state/files it deletes\n}\n\ninterface CrossFileBug {\n type: 'incomplete-feature' | 'state-mismatch' | 'orphaned-write' | 'missing-cleanup';\n title: string;\n description: string;\n involvedFiles: string[];\n evidence: string[];\n severity: 'high' | 'medium' | 'low';\n}\n\n// ─────────────────────────────────────────────────────────────\n// Effect Extraction\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Extract file effects (reads/writes/deletes) from source code\n */\nfunction extractFileEffects(filePath: string, content: string): FileEffect[] {\n const effects: FileEffect[] = [];\n const lines = content.split('\\n');\n\n // Patterns that indicate file operations\n const patterns = [\n // Write patterns\n { regex: /writeFileSync\\s*\\(\\s*([^,]+)/, type: 'write' as const },\n { regex: /writeFile\\s*\\(\\s*([^,]+)/, type: 'write' as const },\n { regex: /fs\\.writeFileSync\\s*\\(\\s*([^,]+)/, type: 'write' as const },\n { regex: /fs\\.writeFile\\s*\\(\\s*([^,]+)/, type: 'write' as const },\n { regex: /\\.write\\s*\\(\\s*([^,]+)/, type: 'write' as const },\n { regex: /saveCache\\s*\\(/, type: 'write' as const },\n { regex: /saveBugStatus\\s*\\(/, type: 'write' as const },\n { regex: /saveAccumulatedBugs\\s*\\(/, type: 'write' as const },\n\n // Read patterns\n { regex: /readFileSync\\s*\\(\\s*([^,]+)/, type: 'read' as const },\n { regex: /readFile\\s*\\(\\s*([^,]+)/, type: 'read' as const },\n { regex: /fs\\.readFileSync\\s*\\(\\s*([^,]+)/, type: 'read' as const },\n { regex: /loadCache\\s*\\(/, type: 'read' as const },\n { regex: /loadBugStatus\\s*\\(/, type: 'read' as const },\n { regex: /loadAccumulatedBugs\\s*\\(/, type: 'read' as const },\n { regex: /loadBugsFromSarif\\s*\\(/, type: 'read' as const },\n\n // Delete patterns\n { regex: /rmSync\\s*\\(\\s*([^,]+)/, type: 'delete' as const },\n { regex: /unlinkSync\\s*\\(\\s*([^,]+)/, type: 'delete' as const },\n { regex: /rm\\s*\\(\\s*([^,]+)/, type: 'delete' as const },\n { regex: /clearAccumulatedBugs\\s*\\(/, type: 'delete' as const },\n { regex: /clearCache\\s*\\(/, type: 'delete' as const },\n { regex: /removeBugFromAccumulated\\s*\\(/, type: 'delete' as const },\n ];\n\n // Track current function for context\n let currentFunction = '';\n const functionRegex = /(?:async\\s+)?(?:function\\s+(\\w+)|(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?(?:\\([^)]*\\)|[^=])\\s*=>|(\\w+)\\s*\\([^)]*\\)\\s*(?::\\s*[^{]+)?\\s*\\{)/;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNum = i + 1;\n\n // Skip commented lines\n const trimmed = line.trim();\n if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*')) {\n continue;\n }\n\n // Track function context\n const funcMatch = line.match(functionRegex);\n if (funcMatch) {\n currentFunction = funcMatch[1] || funcMatch[2] || funcMatch[3] || '';\n }\n\n // Check for file operations\n for (const pattern of patterns) {\n const match = line.match(pattern.regex);\n if (match) {\n // Try to extract the target path/description\n let target = match[1] || 'unknown';\n\n // Clean up the target - extract meaningful parts\n target = target.trim().replace(/['\"`,]/g, '');\n\n // Look for path patterns in the line\n const pathPatterns = [\n /accumulated-bugs\\.json/,\n /bug-status\\.json/,\n /analysis-cache\\.json/,\n /file-hashes\\.json/,\n /\\.sarif/,\n /\\.whiterose/,\n /whiterose-output/,\n /reports/,\n /cache/,\n ];\n\n for (const pp of pathPatterns) {\n if (line.match(pp)) {\n target = line.match(pp)?.[0] || target;\n break;\n }\n }\n\n effects.push({\n file: filePath,\n type: pattern.type,\n target,\n line: lineNum,\n code: line.trim(),\n functionName: currentFunction,\n });\n }\n }\n }\n\n return effects;\n}\n\n/**\n * Identify CLI commands from the codebase\n */\nasync function findCommands(cwd: string): Promise<CommandInfo[]> {\n const commands: CommandInfo[] = [];\n\n // Find command files\n const commandFiles = await fg(['**/cli/commands/*.ts', '**/commands/*.ts'], {\n cwd,\n ignore: ['node_modules/**', 'dist/**'],\n absolute: true,\n });\n\n for (const file of commandFiles) {\n const content = readFileSync(file, 'utf-8');\n const effects = extractFileEffects(file, content);\n\n // Extract command name from filename or export\n const name = basename(file, '.ts');\n\n commands.push({\n name,\n file,\n reads: effects.filter(e => e.type === 'read'),\n writes: effects.filter(e => e.type === 'write'),\n deletes: effects.filter(e => e.type === 'delete'),\n });\n }\n\n return commands;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Cross-File Bug Detection\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Find incomplete features where writes don't have corresponding cleanup\n */\nfunction findIncompleteFeatures(commands: CommandInfo[]): CrossFileBug[] {\n const bugs: CrossFileBug[] = [];\n\n // Find \"clear\" or \"reset\" commands\n const clearCommands = commands.filter(c =>\n c.name.includes('clear') || c.name.includes('reset') || c.name.includes('clean')\n );\n\n // Find \"write\" commands (scan, init, etc.)\n const writeCommands = commands.filter(c => c.writes.length > 0);\n\n // For each clear command, check if it clears everything that write commands create\n for (const clearCmd of clearCommands) {\n const clearedTargets = new Set([\n ...clearCmd.deletes.map(d => normalizeTarget(d.target)),\n ]);\n\n for (const writeCmd of writeCommands) {\n if (writeCmd.name === clearCmd.name) continue; // Skip self\n\n for (const write of writeCmd.writes) {\n const normalizedTarget = normalizeTarget(write.target);\n\n // Check if this write target is cleared\n const isCleared = [...clearedTargets].some(cleared =>\n targetsMatch(cleared, normalizedTarget)\n );\n\n if (!isCleared && isSignificantTarget(normalizedTarget)) {\n bugs.push({\n type: 'incomplete-feature',\n title: `${clearCmd.name} doesn't clear ${normalizedTarget} written by ${writeCmd.name}`,\n description: `The '${clearCmd.name}' command deletes some state but not '${normalizedTarget}' which is written by '${writeCmd.name}'. This can cause stale data to persist after clearing.`,\n involvedFiles: [clearCmd.file, writeCmd.file],\n evidence: [\n `${writeCmd.name} writes to ${normalizedTarget} at ${relative(process.cwd(), writeCmd.file)}:${write.line}`,\n `${clearCmd.name} doesn't delete ${normalizedTarget}`,\n `Code: ${write.code}`,\n ],\n severity: 'high',\n });\n }\n }\n }\n }\n\n return bugs;\n}\n\n/**\n * Find state mismatches where a command reads state that might not exist\n */\nfunction findStateMismatches(commands: CommandInfo[]): CrossFileBug[] {\n const bugs: CrossFileBug[] = [];\n\n // Build a map of what creates each piece of state\n const stateCreators = new Map<string, CommandInfo[]>();\n\n for (const cmd of commands) {\n for (const write of cmd.writes) {\n const target = normalizeTarget(write.target);\n if (!stateCreators.has(target)) {\n stateCreators.set(target, []);\n }\n stateCreators.get(target)!.push(cmd);\n }\n }\n\n // Check if commands read state that might not be created\n for (const cmd of commands) {\n for (const read of cmd.reads) {\n const target = normalizeTarget(read.target);\n const creators = stateCreators.get(target) || [];\n\n // If nothing creates this state, it's a potential issue\n // (unless it's optional state with fallback)\n if (creators.length === 0 && isSignificantTarget(target) && !hasFallback(read.code)) {\n bugs.push({\n type: 'state-mismatch',\n title: `${cmd.name} reads ${target} but nothing creates it`,\n description: `The '${cmd.name}' command reads '${target}' but no other command appears to create this state. This could cause errors if the state doesn't exist.`,\n involvedFiles: [cmd.file],\n evidence: [\n `${cmd.name} reads ${target} at ${relative(process.cwd(), cmd.file)}:${read.line}`,\n `No command found that creates ${target}`,\n `Code: ${read.code}`,\n ],\n severity: 'medium',\n });\n }\n }\n }\n\n return bugs;\n}\n\n/**\n * Find fallback chains - where command A falls back to B if C is empty\n * This can cause bugs like: clear C, but A still shows data from B\n */\nfunction findFallbackChainBugs(commands: CommandInfo[]): CrossFileBug[] {\n const bugs: CrossFileBug[] = [];\n\n // Look for commands that read multiple sources (fallback pattern)\n for (const cmd of commands) {\n const readTargets = cmd.reads.map(r => normalizeTarget(r.target));\n const uniqueTargets = [...new Set(readTargets)];\n\n if (uniqueTargets.length > 1) {\n // This command has multiple read sources - potential fallback\n // Check if clear commands clear ALL of them\n\n const clearCommands = commands.filter(c =>\n c.name.includes('clear') || c.name.includes('reset')\n );\n\n for (const clearCmd of clearCommands) {\n const clearedTargets = clearCmd.deletes.map(d => normalizeTarget(d.target));\n\n const unclearedTargets = uniqueTargets.filter(target =>\n !clearedTargets.some(cleared => targetsMatch(cleared, target)) &&\n isSignificantTarget(target)\n );\n\n if (unclearedTargets.length > 0 && clearedTargets.length > 0) {\n // Clear clears some but not all read sources\n bugs.push({\n type: 'incomplete-feature',\n title: `${cmd.name} has fallback sources not cleared by ${clearCmd.name}`,\n description: `The '${cmd.name}' command reads from multiple sources (${uniqueTargets.join(', ')}), but '${clearCmd.name}' only clears some of them. After clearing, '${cmd.name}' may still show data from fallback sources: ${unclearedTargets.join(', ')}.`,\n involvedFiles: [cmd.file, clearCmd.file],\n evidence: [\n `${cmd.name} reads from: ${uniqueTargets.join(', ')}`,\n `${clearCmd.name} clears: ${clearedTargets.join(', ')}`,\n `Not cleared: ${unclearedTargets.join(', ')}`,\n ],\n severity: 'high',\n });\n }\n }\n }\n }\n\n return bugs;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction normalizeTarget(target: string): string {\n // Normalize path targets for comparison\n return target\n .replace(/['\"]/g, '')\n .replace(/\\$\\{[^}]+\\}/g, '*') // Replace template vars with wildcard\n .replace(/\\+/g, '')\n .trim()\n .toLowerCase();\n}\n\nfunction targetsMatch(a: string, b: string): boolean {\n // Check if two targets refer to the same thing\n if (a === b) return true;\n if (a.includes(b) || b.includes(a)) return true;\n\n // Check for common patterns\n const patterns = [\n ['accumulated-bugs', 'accumulated'],\n ['sarif', 'reports'],\n ['bug-status', 'status'],\n ['analysis-cache', 'cache'],\n ];\n\n for (const [p1, p2] of patterns) {\n if ((a.includes(p1) && b.includes(p2)) || (a.includes(p2) && b.includes(p1))) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isSignificantTarget(target: string): boolean {\n // Filter out generic/uninteresting targets (variable names, params)\n const dominated = ['unknown', 'path', 'file', 'dir', 'content', 'filepath', 'safepath'];\n if (dominated.some(d => target === d)) return false;\n\n // Filter out external files (not created by our commands)\n const external = ['gitignore', 'package.json', 'tsconfig', 'node_modules'];\n if (external.some(e => target.includes(e))) return false;\n\n // Filter out user-provided paths (options.*, args, etc.)\n if (target.includes('options.') || target.includes('args')) return false;\n\n // Filter out config files that shouldn't be cleared (they're core config, not bug data)\n const coreConfig = ['config.yml', 'intent.md', 'understanding.yml', 'whiterosepath'];\n if (coreConfig.some(c => target.includes(c))) return false;\n\n // Filter out variable names that refer to output dir contents (these ARE cleared)\n // Note: sarifpath is NOT excluded because fix reads from reports/*.sarif which is different\n const outputVars = ['mdpath', 'jsonpath'];\n if (outputVars.some(v => target === v)) return false;\n\n // Filter out hash files (created by scanner internals, not commands)\n if (target.includes('hashes')) return false;\n\n // Only interested in bug-data state that should be cleared together\n const bugDataState = [\n 'accumulated-bugs', 'bug-status', 'analysis-cache',\n 'sarif', 'reports', 'whiterose-output',\n ];\n return bugDataState.some(i => target.includes(i));\n}\n\nfunction hasFallback(code: string): boolean {\n // Check if the code has a fallback (try/catch, || default, etc.)\n return code.includes('catch') || code.includes('||') || code.includes('??');\n}\n\n// ─────────────────────────────────────────────────────────────\n// Main Analysis\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Run cross-file analysis and return bugs\n */\nexport async function analyzeCrossFile(cwd: string): Promise<Bug[]> {\n const commands = await findCommands(cwd);\n\n if (commands.length === 0) {\n return [];\n }\n\n const crossFileBugs: CrossFileBug[] = [\n ...findIncompleteFeatures(commands),\n ...findStateMismatches(commands),\n ...findFallbackChainBugs(commands),\n ];\n\n // Convert to Bug format\n return crossFileBugs.map((cfb, index) => ({\n id: `CROSS-${String(index + 1).padStart(3, '0')}`,\n title: cfb.title,\n description: cfb.description,\n file: cfb.involvedFiles[0],\n line: 1,\n kind: 'bug',\n severity: cfb.severity as Bug['severity'],\n category: 'logic-error' as Bug['category'],\n confidence: {\n overall: 'high' as const,\n codePathValidity: 0.9,\n reachability: 0.9,\n intentViolation: true,\n staticToolSignal: false,\n adversarialSurvived: false,\n },\n codePath: cfb.involvedFiles.map((f, i) => ({\n step: i + 1,\n file: f,\n line: 1,\n code: '',\n explanation: i === 0 ? 'Primary file' : 'Related file',\n })),\n evidence: cfb.evidence,\n createdAt: new Date().toISOString(),\n status: 'open' as const,\n }));\n}\n\n/**\n * Get summary of command effects for debugging\n */\nexport async function getCommandEffectsSummary(cwd: string): Promise<string> {\n const commands = await findCommands(cwd);\n\n const lines: string[] = ['# Command Effects Summary\\n'];\n\n for (const cmd of commands) {\n lines.push(`## ${cmd.name}`);\n lines.push(`File: ${relative(cwd, cmd.file)}\\n`);\n\n if (cmd.reads.length > 0) {\n lines.push('**Reads:**');\n for (const r of cmd.reads) {\n lines.push(`- ${r.target} (line ${r.line})`);\n }\n lines.push('');\n }\n\n if (cmd.writes.length > 0) {\n lines.push('**Writes:**');\n for (const w of cmd.writes) {\n lines.push(`- ${w.target} (line ${w.line})`);\n }\n lines.push('');\n }\n\n if (cmd.deletes.length > 0) {\n lines.push('**Deletes:**');\n for (const d of cmd.deletes) {\n lines.push(`- ${d.target} (line ${d.line})`);\n }\n lines.push('');\n }\n\n lines.push('---\\n');\n }\n\n return lines.join('\\n');\n}\n","/**\n * Contract Analyzer\n *\n * Detects bugs related to:\n * - Missing error recovery (write without rollback on failure)\n * - Missing validation (parse without verify)\n * - Missing post-conditions (fix without verify it works)\n * - Transaction atomicity violations (multi-step operations that can fail partially)\n *\n * This extends the cross-file analyzer to catch behavioral bugs.\n */\n\nimport { readFileSync } from 'fs';\nimport { relative } from 'path';\nimport fg from 'fast-glob';\nimport { Bug } from '../types.js';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\ninterface ContractViolation {\n type:\n | 'missing-rollback'\n | 'missing-verification'\n | 'weak-validation'\n | 'partial-failure'\n | 'unhandled-error';\n title: string;\n description: string;\n file: string;\n line: number;\n evidence: string[];\n severity: 'high' | 'medium' | 'low';\n}\n\ninterface CodeBlock {\n file: string;\n functionName: string;\n startLine: number;\n endLine: number;\n content: string;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Pattern Detection\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Detect write operations without corresponding rollback in catch blocks\n */\nfunction detectMissingRollback(block: CodeBlock): ContractViolation[] {\n const violations: ContractViolation[] = [];\n const lines = block.content.split('\\n');\n\n // Find writeFileSync calls\n const writeOps: { line: number; target: string }[] = [];\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/writeFileSync\\s*\\(\\s*([^,]+)/);\n if (match) {\n writeOps.push({ line: block.startLine + i, target: match[1].trim() });\n }\n }\n\n if (writeOps.length === 0) return violations;\n\n // Check if there's error handling with rollback\n const hasRollbackPattern =\n block.content.includes('catch') &&\n (block.content.includes('restore') ||\n block.content.includes('rollback') ||\n block.content.includes('writeFileSync') && block.content.includes('originalContent'));\n\n // Check if there are operations after write that can fail\n for (const writeOp of writeOps) {\n const afterWrite = lines.slice(writeOp.line - block.startLine + 1).join('\\n');\n\n // Operations that can fail after write\n const canFailAfter =\n afterWrite.includes('await ') ||\n afterWrite.includes('execa') ||\n afterWrite.includes('commitFix') ||\n afterWrite.includes('throw');\n\n if (canFailAfter && !hasRollbackPattern) {\n violations.push({\n type: 'missing-rollback',\n title: `No rollback if operation fails after writing to ${writeOp.target}`,\n description: `File is written at line ${writeOp.line}, but subsequent operations can fail without restoring the original content. If those operations fail, the file is left in a partially modified state.`,\n file: block.file,\n line: writeOp.line,\n evidence: [\n `Write operation: writeFileSync(${writeOp.target}, ...)`,\n 'Operations after write can fail (async calls, commits, etc.)',\n 'No rollback/restore pattern detected in catch block',\n ],\n severity: 'high',\n });\n }\n }\n\n return violations;\n}\n\n/**\n * Detect operations that should verify their result but don't\n */\nfunction detectMissingVerification(block: CodeBlock): ContractViolation[] {\n const violations: ContractViolation[] = [];\n const lines = block.content.split('\\n');\n\n // Pattern: write a \"fix\" without verifying it works\n const hasFixWrite =\n block.content.includes('fixedContent') ||\n (block.content.includes('fix') && block.content.includes('writeFileSync'));\n\n const hasVerification =\n block.content.includes('compile') ||\n block.content.includes('typecheck') ||\n block.content.includes('verify') ||\n block.content.includes('tsc ') ||\n block.content.includes('eslint');\n\n // Check for functions that apply fixes\n const isFixFunction =\n block.functionName.toLowerCase().includes('fix') ||\n block.functionName.toLowerCase().includes('apply');\n\n if (hasFixWrite && !hasVerification && isFixFunction) {\n // Find the write line\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].includes('writeFileSync')) {\n violations.push({\n type: 'missing-verification',\n title: `Fix written without verification in ${block.functionName}`,\n description: `The function writes a \"fix\" to a file but doesn't verify that the fix actually works (e.g., code still compiles, passes tests, or bug is actually fixed).`,\n file: block.file,\n line: block.startLine + i,\n evidence: [\n `Function: ${block.functionName}`,\n 'Writes content to file',\n 'No compilation/validation check after write',\n 'Applied fix may introduce new errors',\n ],\n severity: 'high',\n });\n break;\n }\n }\n }\n\n return violations;\n}\n\n/**\n * Detect weak validation patterns\n */\nfunction detectWeakValidation(block: CodeBlock): ContractViolation[] {\n const violations: ContractViolation[] = [];\n const lines = block.content.split('\\n');\n const reportedLines = new Set<number>(); // One violation per line max\n\n // Check if this is in a parse/validate function\n if (\n !block.functionName.toLowerCase().includes('parse') &&\n !block.functionName.toLowerCase().includes('validate') &&\n !block.functionName.toLowerCase().includes('extract')\n ) {\n return violations;\n }\n\n // Pattern: Parsing something and accepting it with minimal checks\n for (let i = 0; i < lines.length; i++) {\n if (reportedLines.has(i)) continue;\n\n const line = lines[i];\n\n // Check for weak validation patterns\n const weakPatterns = [\n { regex: /matchCount\\s*>=?\\s*\\d/, issue: 'Accepts content if only a few lines match' },\n { regex: /\\.length\\s*>\\s*\\w+\\.length\\s*\\*\\s*0\\.\\d/, issue: 'Accepts content based only on length ratio' },\n ];\n\n const issues: string[] = [];\n for (const pattern of weakPatterns) {\n if (line.match(pattern.regex)) {\n issues.push(pattern.issue);\n }\n }\n\n if (issues.length > 0) {\n reportedLines.add(i);\n violations.push({\n type: 'weak-validation',\n title: `Weak validation in ${block.functionName}`,\n description: `The validation logic may accept invalid input: ${issues.join('; ')}. This could allow malformed or incorrect data to pass through.`,\n file: block.file,\n line: block.startLine + i,\n evidence: [\n `Function: ${block.functionName}`,\n `Pattern: ${line.trim()}`,\n `Issues: ${issues.join(', ')}`,\n ],\n severity: 'medium',\n });\n }\n }\n\n return violations;\n}\n\n/**\n * Detect loops that break on error without reporting skipped items\n */\nfunction detectPartialFailure(block: CodeBlock): ContractViolation[] {\n const violations: ContractViolation[] = [];\n const lines = block.content.split('\\n');\n\n // Pattern: for loop with break on error\n let inForLoop = false;\n let forLoopStart = 0;\n let forLoopItem = '';\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Detect for loop start\n const forMatch = line.match(/for\\s*\\(\\s*(?:const|let|var)\\s+(\\w+)\\s+of/);\n if (forMatch) {\n inForLoop = true;\n forLoopStart = i;\n forLoopItem = forMatch[1];\n }\n\n // Check for break pattern inside loop\n if (inForLoop && line.includes('break')) {\n // Check if it's breaking on failure without reporting\n const hasFailureCheck =\n lines.slice(Math.max(0, i - 3), i + 1).join('\\n').includes('!result.success') ||\n lines.slice(Math.max(0, i - 3), i + 1).join('\\n').includes('error') ||\n lines.slice(Math.max(0, i - 3), i + 1).join('\\n').includes('failed');\n\n const hasSkippedReport =\n block.content.includes('skipped') ||\n block.content.includes('remaining') ||\n block.content.includes('not attempted');\n\n if (hasFailureCheck && !hasSkippedReport) {\n violations.push({\n type: 'partial-failure',\n title: `Loop breaks on error without reporting skipped items in ${block.functionName}`,\n description: `The loop iterates over \"${forLoopItem}\" but breaks on first failure without indicating which items were not processed. Users won't know what was skipped.`,\n file: block.file,\n line: block.startLine + i,\n evidence: [\n `Function: ${block.functionName}`,\n `Loop variable: ${forLoopItem}`,\n 'Breaks on failure condition',\n 'No reporting of skipped/remaining items',\n ],\n severity: 'medium',\n });\n }\n }\n\n // Detect loop end (simple heuristic)\n if (inForLoop && line.trim() === '}' && i > forLoopStart + 2) {\n inForLoop = false;\n }\n }\n\n return violations;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Code Block Extraction\n// ─────────────────────────────────────────────────────────────\n\nfunction extractFunctions(filePath: string, content: string): CodeBlock[] {\n const blocks: CodeBlock[] = [];\n const lines = content.split('\\n');\n\n // Simple function detection (async function, function, arrow function)\n const funcRegex =\n /(?:export\\s+)?(?:async\\s+)?function\\s+(\\w+)|(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?\\([^)]*\\)\\s*(?::\\s*[^=]+)?\\s*=>/;\n\n let currentFunc: { name: string; start: number; braceCount: number } | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Skip commented lines\n const trimmed = line.trim();\n if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*')) {\n continue;\n }\n\n // Check for function start\n if (!currentFunc) {\n const match = line.match(funcRegex);\n if (match) {\n const funcName = match[1] || match[2];\n currentFunc = { name: funcName, start: i, braceCount: 0 };\n }\n }\n\n // Track braces to find function end\n if (currentFunc) {\n currentFunc.braceCount += (line.match(/{/g) || []).length;\n currentFunc.braceCount -= (line.match(/}/g) || []).length;\n\n if (currentFunc.braceCount <= 0 && i > currentFunc.start) {\n blocks.push({\n file: filePath,\n functionName: currentFunc.name,\n startLine: currentFunc.start + 1,\n endLine: i + 1,\n content: lines.slice(currentFunc.start, i + 1).join('\\n'),\n });\n currentFunc = null;\n }\n }\n }\n\n return blocks;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Main Analysis\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Run contract analysis and return bugs\n */\nexport async function analyzeContracts(cwd: string): Promise<Bug[]> {\n const violations: ContractViolation[] = [];\n\n // Find source files\n const sourceFiles = await fg(['**/*.ts', '**/*.tsx'], {\n cwd,\n ignore: ['node_modules/**', 'dist/**', '**/*.test.ts', '**/*.spec.ts'],\n absolute: true,\n });\n\n for (const file of sourceFiles) {\n const content = readFileSync(file, 'utf-8');\n const blocks = extractFunctions(file, content);\n\n for (const block of blocks) {\n violations.push(\n ...detectMissingRollback(block),\n ...detectMissingVerification(block),\n ...detectWeakValidation(block),\n ...detectPartialFailure(block)\n );\n }\n }\n\n // Convert to Bug format\n return violations.map((v, index) => ({\n id: `CONTRACT-${String(index + 1).padStart(3, '0')}`,\n title: v.title,\n description: v.description,\n file: relative(cwd, v.file),\n line: v.line,\n kind: 'bug',\n severity: v.severity as Bug['severity'],\n category: 'logic-error' as Bug['category'],\n confidence: {\n overall: 'medium' as const,\n codePathValidity: 0.8,\n reachability: 0.8,\n intentViolation: true,\n staticToolSignal: false,\n adversarialSurvived: false,\n },\n codePath: [\n {\n step: 1,\n file: relative(cwd, v.file),\n line: v.line,\n code: '',\n explanation: v.type,\n },\n ],\n evidence: v.evidence,\n createdAt: new Date().toISOString(),\n status: 'open' as const,\n }));\n}\n\n/**\n * Get summary of contract violations for debugging\n */\nexport async function getContractSummary(cwd: string): Promise<string> {\n const bugs = await analyzeContracts(cwd);\n\n const lines: string[] = ['# Contract Analysis Summary\\n'];\n lines.push(`Total violations: ${bugs.length}\\n`);\n\n const byType = new Map<string, Bug[]>();\n for (const bug of bugs) {\n const type = bug.codePath[0]?.explanation || 'unknown';\n if (!byType.has(type)) byType.set(type, []);\n byType.get(type)!.push(bug);\n }\n\n for (const [type, typeBugs] of byType) {\n lines.push(`## ${type} (${typeBugs.length})`);\n for (const bug of typeBugs) {\n lines.push(`- ${bug.file}:${bug.line} - ${bug.title}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import { existsSync, readFileSync } from 'fs';\nimport { join, resolve, isAbsolute, relative } from 'path';\nimport { Bug, CodebaseUnderstanding, FindingKind } from '../types.js';\nimport { parseIntentDocument } from './contracts/intent.js';\n\ninterface IntentContext {\n constraints: string[];\n contracts: CodebaseUnderstanding['contracts'];\n}\n\nexport function loadIntentContext(cwd: string, understanding: CodebaseUnderstanding): IntentContext {\n const intentPath = join(cwd, '.whiterose', 'intent.md');\n let constraints: string[] = [];\n\n if (existsSync(intentPath)) {\n try {\n const content = readFileSync(intentPath, 'utf-8');\n const parsed = parseIntentDocument(content);\n const featureConstraints = parsed.customFeatures.flatMap((f) => f.constraints || []);\n constraints = [...parsed.knownConstraints, ...featureConstraints];\n } catch {\n // Ignore intent parsing errors\n }\n }\n\n // Add constraints from understanding features if present\n if (understanding.features?.length) {\n for (const feature of understanding.features) {\n if (feature.constraints?.length) {\n constraints.push(...feature.constraints);\n }\n }\n }\n\n return {\n constraints,\n contracts: understanding.contracts || [],\n };\n}\n\nexport function classifyFindings(\n bugs: Bug[],\n cwd: string,\n understanding: CodebaseUnderstanding\n): Bug[] {\n const intent = loadIntentContext(cwd, understanding);\n\n return bugs.map((bug) => {\n const relatedContract = findRelatedContract(bug, cwd, intent.contracts);\n const constraintMatch = matchesConstraint(bug, intent.constraints);\n\n if (relatedContract && !bug.relatedContract) {\n bug.relatedContract = relatedContract;\n }\n\n const hasConcreteEvidence = hasEvidenceOfFailure(bug);\n const strongConfidence =\n bug.confidence.overall === 'high' &&\n bug.confidence.reachability >= 0.7 &&\n bug.confidence.codePathValidity >= 0.7;\n\n let verified = strongConfidence || (hasConcreteEvidence && bug.confidence.reachability >= 0.5);\n\n const isIntentClaim =\n bug.category === 'intent-violation' || bug.confidence.intentViolation === true;\n\n if (isIntentClaim) {\n verified = verified && (Boolean(relatedContract) || constraintMatch);\n }\n\n if ((bug.severity === 'critical' || bug.severity === 'high') && !hasConcreteEvidence) {\n verified = false;\n }\n\n bug.kind = (verified ? 'bug' : 'smell') as FindingKind;\n\n return bug;\n });\n}\n\nexport function analyzeIntentContracts(\n cwd: string,\n understanding: CodebaseUnderstanding\n): Bug[] {\n const bugs: Bug[] = [];\n\n for (const contract of understanding.contracts || []) {\n const absoluteFile = normalizeFilePath(contract.file, cwd);\n if (!existsSync(absoluteFile)) {\n bugs.push(makeIntentBug(cwd, contract, 'Contract file missing'));\n continue;\n }\n\n const content = readFileSync(absoluteFile, 'utf-8');\n if (!functionExists(content, contract.function)) {\n bugs.push(makeIntentBug(cwd, contract, `Contract function not found: ${contract.function}`));\n }\n }\n\n return bugs;\n}\n\nfunction normalizeFilePath(filePath: string, cwd: string): string {\n if (!filePath) return filePath;\n return isAbsolute(filePath) ? filePath : resolve(cwd, filePath);\n}\n\nfunction findRelatedContract(\n bug: Bug,\n cwd: string,\n contracts: CodebaseUnderstanding['contracts']\n): string | undefined {\n const bugFile = normalizeFilePath(bug.file, cwd);\n const title = bug.title.toLowerCase();\n\n for (const contract of contracts) {\n const contractFile = normalizeFilePath(contract.file, cwd);\n if (!bugFile.endsWith(contractFile) && bugFile !== contractFile) continue;\n\n const fn = contract.function.toLowerCase();\n const inTitle = title.includes(fn);\n const inPath = bug.codePath.some((s) => (s.file || '').toLowerCase().includes(fn));\n\n if (inTitle || inPath) {\n return `${contract.file}:${contract.function}()`;\n }\n }\n\n return undefined;\n}\n\nfunction matchesConstraint(bug: Bug, constraints: string[]): boolean {\n if (constraints.length === 0) return false;\n\n const text = [\n bug.title,\n bug.description,\n ...(bug.evidence || []),\n ]\n .join(' ')\n .toLowerCase();\n\n for (const constraint of constraints) {\n const normalized = constraint.toLowerCase();\n if (!normalized) continue;\n if (text.includes(normalized)) return true;\n\n const keywords = normalized\n .split(/\\W+/)\n .filter((w) => w.length >= 4);\n if (keywords.some((k) => text.includes(k))) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction hasEvidenceOfFailure(bug: Bug): boolean {\n if (bug.codePath && bug.codePath.length > 0) return true;\n\n const text = [\n bug.title,\n bug.description,\n ...(bug.evidence || []),\n ]\n .join(' ')\n .toLowerCase();\n\n return /repro|reproduce|fail|fails|failing|throws|throw|crash|exception|incorrect|broken|violate/.test(text);\n}\n\nfunction functionExists(content: string, functionName: string): boolean {\n if (!functionName) return false;\n const escaped = functionName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const patterns = [\n new RegExp(`\\\\bfunction\\\\s+${escaped}\\\\b`),\n new RegExp(`\\\\bconst\\\\s+${escaped}\\\\s*=\\\\s*`),\n new RegExp(`\\\\blet\\\\s+${escaped}\\\\s*=\\\\s*`),\n new RegExp(`\\\\b${escaped}\\\\s*\\\\(`),\n ];\n return patterns.some((p) => p.test(content));\n}\n\nfunction makeIntentBug(\n cwd: string,\n contract: CodebaseUnderstanding['contracts'][number],\n reason: string\n): Bug {\n return {\n id: `INTENT-${Math.random().toString(36).slice(2, 8)}`,\n title: `Intent contract mismatch: ${contract.function}`,\n description: reason,\n file: relative(cwd, normalizeFilePath(contract.file, cwd)),\n line: 1,\n severity: 'high',\n category: 'intent-violation',\n kind: 'bug',\n confidence: {\n overall: 'high',\n codePathValidity: 0.8,\n reachability: 0.8,\n intentViolation: true,\n staticToolSignal: false,\n adversarialSurvived: false,\n },\n codePath: [],\n evidence: [reason],\n relatedContract: `${contract.file}:${contract.function}()`,\n createdAt: new Date().toISOString(),\n status: 'open',\n };\n}\n","/**\n * Progress bar and duration formatting utilities for CLI output\n */\n\n/**\n * Format milliseconds into human-readable duration\n * Examples: \"45s\", \"2m 30s\", \"1h 15m\"\n */\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n if (hours > 0) {\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n if (mins > 0) {\n return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n return `${secs}s`;\n}\n\n/**\n * Render an ASCII progress bar\n * @param progress - Value between 0 and 1\n * @param width - Total width of the bar (excluding brackets)\n */\nexport function renderProgressBar(progress: number, width: number = 10): string {\n const clamped = Math.max(0, Math.min(1, progress));\n const filled = Math.round(clamped * width);\n const empty = width - filled;\n return '[' + '\\u2588'.repeat(filled) + '\\u2591'.repeat(empty) + ']';\n}\n\n/**\n * Phase tracking for multi-phase scans\n */\nexport interface PhaseProgress {\n name: string;\n current: number;\n total: number;\n}\n\n/**\n * Render phase progress line\n * Example: \"Phase 1: Unit Analysis [████████░░] 80% (6/6 passes)\"\n */\nexport function renderPhaseProgress(phase: PhaseProgress, index: number, padName: number = 20): string {\n const progress = phase.total > 0 ? phase.current / phase.total : 0;\n const percent = Math.round(progress * 100);\n const bar = renderProgressBar(progress);\n const paddedName = phase.name.padEnd(padName);\n return `Phase ${index + 1}: ${paddedName} ${bar} ${String(percent).padStart(3)}% (${phase.current}/${phase.total} passes)`;\n}\n\n/**\n * Count lines of code in file contents\n */\nexport function countLinesOfCode(contents: string[]): number {\n return contents.reduce((total, content) => {\n // Count non-empty, non-comment lines\n const lines = content.split('\\n').filter(line => {\n const trimmed = line.trim();\n return trimmed.length > 0 &&\n !trimmed.startsWith('//') &&\n !trimmed.startsWith('/*') &&\n !trimmed.startsWith('*');\n });\n return total + lines.length;\n }, 0);\n}\n","/**\n * ASCII card renderer for scan results\n * Creates a screenshot-friendly summary card\n */\n\nimport chalk from 'chalk';\nimport { formatDuration } from './progress.js';\n\nexport interface SeverityBreakdown {\n critical: number;\n high: number;\n medium: number;\n low: number;\n total: number;\n}\n\nexport interface ScanMeta {\n repoName: string;\n provider: string;\n duration: number; // ms\n filesScanned: number;\n linesOfCode: number;\n}\n\nexport interface CardData {\n meta: ScanMeta;\n bugs: SeverityBreakdown;\n smells: SeverityBreakdown;\n reportPath: string;\n}\n\nconst BOX = {\n topLeft: '\\u250c',\n topRight: '\\u2510',\n bottomLeft: '\\u2514',\n bottomRight: '\\u2518',\n horizontal: '\\u2500',\n vertical: '\\u2502',\n teeRight: '\\u251c',\n teeLeft: '\\u2524',\n};\n\nfunction line(char: string, width: number): string {\n return char.repeat(width);\n}\n\nfunction padRight(str: string, width: number): string {\n // Strip ANSI codes for length calculation\n const stripped = str.replace(/\\u001b\\[\\d+(;\\d+)*m/g, '');\n const padding = Math.max(0, width - stripped.length);\n return str + ' '.repeat(padding);\n}\n\nfunction row(content: string, width: number): string {\n return BOX.vertical + ' ' + padRight(content, width - 4) + ' ' + BOX.vertical;\n}\n\nfunction divider(width: number): string {\n return BOX.teeRight + line(BOX.horizontal, width) + BOX.teeLeft;\n}\n\nfunction topBorder(width: number): string {\n return BOX.topLeft + line(BOX.horizontal, width) + BOX.topRight;\n}\n\nfunction bottomBorder(width: number): string {\n return BOX.bottomLeft + line(BOX.horizontal, width) + BOX.bottomRight;\n}\n\nfunction severityDot(severity: 'critical' | 'high' | 'medium' | 'low'): string {\n const colors: Record<string, (s: string) => string> = {\n critical: chalk.red,\n high: chalk.yellow,\n medium: chalk.blue,\n low: chalk.dim,\n };\n return colors[severity]('\\u25cf');\n}\n\nfunction formatNumber(n: number): string {\n return String(n).padStart(3);\n}\n\n/**\n * Render a scan result card\n *\n * ┌─────────────────────────────────────────────────────────────┐\n * │ WHITEROSE SCAN COMPLETE │\n * ├─────────────────────────────────────────────────────────────┤\n * │ Repository my-project │\n * │ Provider claude-code │\n * │ Duration 17m 11s │\n * │ Files 116 files | 24,892 LoC │\n * ├─────────────────────────────────────────────────────────────┤\n * │ BUGS SMELLS │\n * │ ● Critical 3 ● Critical 0 │\n * │ ● High 12 ● High 5 │\n * │ ● Medium 30 ● Medium 20 │\n * │ ● Low 17 ● Low 12 │\n * │ ───────────── ───────────── │\n * │ Total 62 Total 37 │\n * ├─────────────────────────────────────────────────────────────┤\n * │ Reports: ./whiterose-output/bugs.md │\n * │ Run: whiterose fix │\n * └─────────────────────────────────────────────────────────────┘\n */\nexport function renderScanCard(data: CardData): string {\n const width = 61; // Inner width (excluding border chars)\n const lines: string[] = [];\n\n // Title\n lines.push(topBorder(width));\n lines.push(row(chalk.bold.red('WHITEROSE SCAN COMPLETE'), width));\n lines.push(divider(width));\n\n // Meta section\n const locFormatted = data.meta.linesOfCode.toLocaleString();\n lines.push(row(`${chalk.dim('Repository')} ${data.meta.repoName}`, width));\n lines.push(row(`${chalk.dim('Provider')} ${data.meta.provider}`, width));\n lines.push(row(`${chalk.dim('Duration')} ${formatDuration(data.meta.duration)}`, width));\n lines.push(row(`${chalk.dim('Files')} ${data.meta.filesScanned} files | ${locFormatted} LoC`, width));\n lines.push(divider(width));\n\n // Bug/Smell breakdown header\n lines.push(row(`${chalk.bold('BUGS')} ${chalk.bold('SMELLS')}`, width));\n\n // Severity rows (side by side)\n const severities: Array<'critical' | 'high' | 'medium' | 'low'> = ['critical', 'high', 'medium', 'low'];\n for (const sev of severities) {\n const bugLine = `${severityDot(sev)} ${sev.charAt(0).toUpperCase() + sev.slice(1).padEnd(8)} ${formatNumber(data.bugs[sev])}`;\n const smellLine = `${severityDot(sev)} ${sev.charAt(0).toUpperCase() + sev.slice(1).padEnd(8)} ${formatNumber(data.smells[sev])}`;\n lines.push(row(`${bugLine} ${smellLine}`, width));\n }\n\n // Totals divider\n lines.push(row(`${chalk.dim('\\u2500'.repeat(13))} ${chalk.dim('\\u2500'.repeat(13))}`, width));\n\n // Totals\n const bugTotal = `Total ${formatNumber(data.bugs.total)}`;\n const smellTotal = `Total ${formatNumber(data.smells.total)}`;\n lines.push(row(`${chalk.bold(bugTotal)} ${chalk.bold(smellTotal)}`, width));\n lines.push(divider(width));\n\n // Footer\n lines.push(row(`${chalk.dim('Reports:')} ${chalk.cyan(data.reportPath)}`, width));\n if (data.bugs.total > 0 || data.smells.total > 0) {\n lines.push(row(`${chalk.dim('Run:')} ${chalk.cyan('whiterose fix')}`, width));\n }\n lines.push(bottomBorder(width));\n\n return lines.join('\\n');\n}\n\n/**\n * Render a minimal status card (for status command when no recent scan)\n */\nexport function renderStatusCard(\n repoName: string,\n provider: string,\n totalBugs: number,\n totalSmells: number,\n lastScanDate?: string\n): string {\n const width = 45;\n const lines: string[] = [];\n\n lines.push(topBorder(width));\n lines.push(row(chalk.bold.red('WHITEROSE STATUS'), width));\n lines.push(divider(width));\n lines.push(row(`${chalk.dim('Repository')} ${repoName}`, width));\n lines.push(row(`${chalk.dim('Provider')} ${provider}`, width));\n if (lastScanDate) {\n lines.push(row(`${chalk.dim('Last scan')} ${lastScanDate}`, width));\n }\n lines.push(divider(width));\n lines.push(row(`${chalk.bold('Open bugs:')} ${totalBugs}`, width));\n lines.push(row(`${chalk.bold('Open smells:')} ${totalSmells}`, width));\n lines.push(bottomBorder(width));\n\n return lines.join('\\n');\n}\n","import * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, writeFileSync, readFileSync } from 'fs';\nimport { join, relative, basename, isAbsolute } from 'path';\nimport fg from 'fast-glob';\nimport { WhiteroseConfig, ScanResult, Bug, ConfidenceLevel, ProviderType, ScanMeta, ScanSummary } from '../../types.js';\nimport { loadConfig, loadUnderstanding } from '../../core/config.js';\nimport { CoreScanner } from '../../core/scanner.js';\nimport { getExecutor } from '../../providers/executors/index.js';\nimport { scanCodebase, getChangedFiles, saveFileHashes } from '../../core/scanner/index.js';\nimport { runStaticAnalysis } from '../../analysis/static.js';\nimport { generateBugId } from '../../core/utils.js';\nimport { outputSarif } from '../../output/sarif.js';\nimport { outputMarkdown } from '../../output/markdown.js';\nimport { outputHumanReadableMarkdown } from '../../output/human-readable.js';\nimport { mergeBugs } from '../../core/bug-merger.js';\nimport { analyzeCrossFile } from '../../core/cross-file-analyzer.js';\nimport { analyzeContracts } from '../../core/contract-analyzer.js';\nimport { analyzeIntentContracts, classifyFindings } from '../../core/findings.js';\nimport { formatDuration } from '../components/progress.js';\nimport { renderScanCard, CardData } from '../components/card.js';\n\ninterface ScanOptions {\n full: boolean;\n json: boolean;\n sarif: boolean;\n provider?: string;\n category?: string[];\n minConfidence: string;\n ci?: boolean; // CI mode: non-interactive, exit 1 if bugs found\n quick?: boolean; // Quick scan: parallel single-file analysis, works without init\n unsafe?: boolean; // Deprecated: read-only operations always auto-approve\n phase?: 'unit' | 'integration' | 'e2e' | 'all'; // Which analysis phase to run\n}\n\n/**\n * Get repository name from git or directory name\n */\nfunction getRepoName(cwd: string): string {\n try {\n const gitConfigPath = join(cwd, '.git', 'config');\n if (existsSync(gitConfigPath)) {\n const config = readFileSync(gitConfigPath, 'utf-8');\n const match = config.match(/url\\s*=\\s*.*[/:]([^/]+?)(?:\\.git)?$/m);\n if (match) return match[1];\n }\n } catch {\n // Fall through to basename\n }\n return basename(cwd);\n}\n\n/**\n * Count lines of code in files\n */\nfunction countLinesOfCode(cwd: string, files: string[]): number {\n let total = 0;\n for (const file of files.slice(0, 500)) { // Limit to first 500 for performance\n try {\n // Handle both absolute and relative paths\n const filePath = isAbsolute(file) ? file : join(cwd, file);\n if (!existsSync(filePath)) continue;\n\n const content = readFileSync(filePath, 'utf-8');\n // Count non-empty, non-comment lines\n const lines = content.split('\\n').filter(line => {\n const trimmed = line.trim();\n return trimmed.length > 0 &&\n !trimmed.startsWith('//') &&\n !trimmed.startsWith('/*') &&\n !trimmed.startsWith('*') &&\n !trimmed.startsWith('#'); // Also skip shell/python comments\n });\n total += lines.length;\n } catch {\n // Skip unreadable files (binary, permissions, etc.)\n }\n }\n return total;\n}\n\nexport async function scanCommand(paths: string[], options: ScanOptions): Promise<void> {\n const scanStartTime = Date.now();\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n const repoName = getRepoName(cwd);\n\n // Quick scan mode: works without init, uses changed files only\n const isQuickScan = options.quick || options.ci;\n const isQuiet = options.json || options.sarif || options.ci;\n\n // For thorough scan, require init\n if (!isQuickScan && !existsSync(whiterosePath)) {\n if (!isQuiet) {\n p.log.error('whiterose is not initialized in this directory.');\n p.log.info('Run \"whiterose init\" first, or use --quick for fast pre-commit scanning.');\n } else {\n console.error(JSON.stringify({ error: 'Not initialized. Run whiterose init first.' }));\n }\n process.exit(1);\n }\n\n if (!isQuiet) {\n const scanMode = isQuickScan ? 'quick' : 'full';\n console.log();\n console.log(chalk.red.bold('whiterose') + chalk.dim(` v1.0.9 | ${scanMode} scan`));\n console.log();\n }\n\n // ─────────────────────────────────────────────────────────────\n // Load config and understanding (optional for quick scan)\n // ─────────────────────────────────────────────────────────────\n let config: WhiteroseConfig | undefined;\n let understanding: any;\n\n if (existsSync(whiterosePath)) {\n try {\n config = await loadConfig(cwd);\n understanding = await loadUnderstanding(cwd);\n } catch (err) {\n // Config load failed - warn user that defaults will be used\n const errorMessage = err instanceof Error ? err.message : String(err);\n if (!isQuiet) {\n p.log.warn(`Failed to load config: ${errorMessage}`);\n p.log.info('Continuing with default settings. Run \"whiterose init\" to fix.');\n } else if (options.ci) {\n // In CI mode, config parse errors should fail the build\n console.error(JSON.stringify({\n error: 'Config parse error',\n message: errorMessage,\n hint: 'Fix config.yml or run \"whiterose init\" to regenerate'\n }));\n process.exit(1);\n }\n }\n }\n\n // Create minimal understanding for quick scan if none exists\n if (!understanding) {\n understanding = {\n version: '1',\n generatedAt: new Date().toISOString(),\n summary: {\n type: 'unknown',\n framework: 'unknown',\n language: 'typescript', // Assume TS for now\n description: 'Quick scan mode - no understanding available',\n },\n features: [],\n contracts: [],\n dependencies: {},\n structure: { totalFiles: 0, totalLines: 0 },\n };\n }\n\n // ─────────────────────────────────────────────────────────────\n // Determine files to scan\n // ─────────────────────────────────────────────────────────────\n let filesToScan: string[];\n let scanType: 'full' | 'incremental';\n let pendingHashState: any = null;\n\n if (options.full || paths.length > 0) {\n scanType = 'full';\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ' Discovering files...');\n }\n if (paths.length > 0) {\n // Expand glob patterns in provided paths\n filesToScan = await fg(paths, {\n cwd,\n ignore: ['node_modules/**', 'dist/**', 'build/**', '.next/**'],\n absolute: false,\n });\n } else {\n filesToScan = await scanCodebase(cwd, config);\n }\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ` Found ${chalk.cyan(filesToScan.length)} files`);\n }\n } else {\n // Incremental scan requires config\n if (!config) {\n // Fall back to full scan if no config\n scanType = 'full';\n filesToScan = await scanCodebase(cwd);\n } else {\n scanType = 'incremental';\n const changed = await getChangedFiles(cwd, config, { writeCache: false });\n filesToScan = changed.files;\n pendingHashState = changed.state;\n }\n\n if (filesToScan.length === 0) {\n if (!isQuiet) {\n p.log.info('No files changed since last scan. Use --full for a complete scan.');\n } else {\n console.log(JSON.stringify({ bugs: [], message: 'No changes detected' }));\n }\n process.exit(0);\n }\n\n if (!isQuiet) {\n p.log.info(`Incremental scan: ${filesToScan.length} changed files`);\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Run static analysis\n // ─────────────────────────────────────────────────────────────\n let staticResults;\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ' Running static analysis (tsc, eslint)...');\n }\n staticResults = await runStaticAnalysis(cwd, filesToScan, config);\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ` Static analysis: ${chalk.cyan(staticResults.length)} signals`);\n }\n\n // ─────────────────────────────────────────────────────────────\n // LLM Analysis (using CoreScanner - LSP-compliant architecture)\n // ─────────────────────────────────────────────────────────────\n const providerName = (options.provider || config?.provider || 'claude-code') as ProviderType;\n\n // Get the executor (simple prompt runner) for the selected provider\n const executor = getExecutor(providerName);\n\n // Check if provider is available\n if (!await executor.isAvailable()) {\n if (!isQuiet) {\n p.log.error(`Provider ${providerName} is not available. Is it installed?`);\n }\n process.exit(1);\n }\n\n let bugs: Bug[];\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502'));\n console.log(chalk.cyan('\\u2550\\u2550\\u2550 Analyzing with ' + providerName + ' \\u2550\\u2550\\u2550'));\n console.log();\n\n // Create scanner with progress callback (additive output, no clearing)\n const scanner = new CoreScanner(executor, {}, {\n onProgress: (message: string) => {\n if (message.trim()) {\n // Color code based on content\n if (message.includes('\\u2550\\u2550\\u2550\\u2550')) {\n console.log(chalk.cyan(message));\n } else if (message.includes('\\u2713')) {\n console.log(chalk.green(message));\n } else if (message.includes('\\u2717')) {\n console.log(chalk.red(message));\n } else if (message.includes('[Batch')) {\n console.log(chalk.yellow(message));\n } else {\n console.log(chalk.dim(message));\n }\n }\n },\n onBugFound: (bug: Bug) => {\n const severityColor = bug.severity === 'critical' ? chalk.red :\n bug.severity === 'high' ? chalk.yellow :\n bug.severity === 'medium' ? chalk.blue : chalk.dim;\n console.log(chalk.magenta('\\u2605') + ` ${severityColor('[' + bug.severity + ']')} ${bug.title}`);\n },\n });\n\n try {\n // Use quickScan for --quick/--ci, full scan otherwise\n if (isQuickScan) {\n bugs = await scanner.quickScan({\n files: filesToScan,\n understanding,\n staticResults: staticResults || [],\n config,\n });\n } else {\n bugs = await scanner.scan({\n files: filesToScan,\n understanding,\n staticResults: staticResults || [],\n config,\n });\n }\n\n console.log();\n console.log(chalk.dim('\\u2502') + ` Found ${chalk.cyan(bugs.length)} potential bugs`);\n\n // Check for pass errors - warn user if some passes failed\n if (scanner.hasPassErrors()) {\n const errors = scanner.getPassErrors();\n console.log(chalk.yellow('\\u26a0') + ` ${errors.length} analysis pass(es) failed:`);\n for (const err of errors.slice(0, 5)) {\n console.log(chalk.yellow(` - ${err.passName}: ${err.error}`));\n }\n if (errors.length > 5) {\n console.log(chalk.yellow(` ... and ${errors.length - 5} more`));\n }\n }\n } catch (error) {\n console.log(chalk.red('\\u2717') + ' Analysis failed');\n console.error(String(error));\n process.exit(1);\n }\n } else {\n const scanner = new CoreScanner(executor);\n\n if (isQuickScan) {\n bugs = await scanner.quickScan({\n files: filesToScan,\n understanding,\n staticResults: staticResults || [],\n config,\n });\n } else {\n bugs = await scanner.scan({\n files: filesToScan,\n understanding,\n staticResults: staticResults || [],\n config,\n });\n }\n\n // In CI mode, if ALL passes failed and we have no bugs, exit with error\n // This prevents silent failures from being reported as successful scans\n if (options.ci && scanner.hasPassErrors()) {\n const errors = scanner.getPassErrors();\n // If we have some bugs despite errors, continue (partial success)\n // But if we have 0 bugs and errors occurred, that's a scan failure\n if (bugs.length === 0) {\n console.error(JSON.stringify({\n error: 'Analysis failed',\n passErrors: errors,\n }));\n process.exit(1);\n }\n }\n }\n\n // Note: Adversarial validation is now inline during analysis\n // Claude validates each bug before reporting it\n\n // ─────────────────────────────────────────────────────────────\n // Cross-file analysis (finds bugs spanning multiple files)\n // ─────────────────────────────────────────────────────────────\n if (!isQuickScan) {\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ' Running cross-file analysis...');\n }\n try {\n const crossFileBugs = await analyzeCrossFile(cwd);\n if (crossFileBugs.length > 0) {\n bugs.push(...crossFileBugs);\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ` Cross-file: ${chalk.cyan(crossFileBugs.length)} issues`);\n }\n } else if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ' Cross-file: no issues');\n }\n } catch (err) {\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + chalk.dim(' Cross-file: skipped'));\n } else if (options.ci) {\n // In CI mode, surface analysis failures so they don't go unnoticed\n console.error(JSON.stringify({\n error: 'Cross-file analysis failed',\n message: err instanceof Error ? err.message : String(err),\n }));\n process.exit(1);\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Contract analysis (finds missing rollback, verification, etc.)\n // ─────────────────────────────────────────────────────────────\n if (!isQuickScan) {\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ' Running contract analysis...');\n }\n try {\n const contractBugs = await analyzeContracts(cwd);\n if (contractBugs.length > 0) {\n bugs.push(...contractBugs);\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ` Contract: ${chalk.cyan(contractBugs.length)} issues`);\n }\n } else if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + ' Contract: no issues');\n }\n } catch (err) {\n if (!isQuiet) {\n console.log(chalk.dim('\\u2502') + chalk.dim(' Contract: skipped'));\n } else if (options.ci) {\n // In CI mode, surface analysis failures so they don't go unnoticed\n console.error(JSON.stringify({\n error: 'Contract analysis failed',\n message: err instanceof Error ? err.message : String(err),\n }));\n process.exit(1);\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Intent validation (contract existence + intent alignment)\n // ─────────────────────────────────────────────────────────────\n if (!isQuickScan) {\n try {\n const intentBugs = analyzeIntentContracts(cwd, understanding);\n if (intentBugs.length > 0) {\n bugs.push(...intentBugs);\n }\n } catch (err) {\n // In CI mode, surface analysis failures so they don't go unnoticed\n if (options.ci) {\n console.error(JSON.stringify({\n error: 'Intent validation failed',\n message: err instanceof Error ? err.message : String(err),\n }));\n process.exit(1);\n }\n // For non-CI quiet modes (--json, --sarif) or interactive, skip silently\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Filter by confidence\n // ─────────────────────────────────────────────────────────────\n const confidenceOrder: Record<ConfidenceLevel, number> = { high: 3, medium: 2, low: 1 };\n const validConfidenceLevels: ConfidenceLevel[] = ['high', 'medium', 'low'];\n const minConfidence: ConfidenceLevel = validConfidenceLevels.includes(options.minConfidence as ConfidenceLevel)\n ? (options.minConfidence as ConfidenceLevel)\n : 'low';\n bugs = bugs.filter((bug) => confidenceOrder[bug.confidence.overall] >= confidenceOrder[minConfidence]);\n\n // ─────────────────────────────────────────────────────────────\n // Filter by category\n // ─────────────────────────────────────────────────────────────\n if (options.category && options.category.length > 0) {\n bugs = bugs.filter((bug) => options.category!.includes(bug.category));\n }\n\n // ─────────────────────────────────────────────────────────────\n // Classify findings (bug vs smell) using intent + evidence\n // ─────────────────────────────────────────────────────────────\n bugs = classifyFindings(bugs, cwd, understanding);\n\n // ─────────────────────────────────────────────────────────────\n // Assign IDs\n // ─────────────────────────────────────────────────────────────\n bugs = bugs.map((bug, index) => ({\n ...bug,\n id: bug.id || generateBugId(index),\n }));\n\n // ─────────────────────────────────────────────────────────────\n // Merge with accumulated bugs (union across scans)\n // ─────────────────────────────────────────────────────────────\n const mergeResult = mergeBugs(bugs, cwd);\n const newBugsThisScan = mergeResult.stats.newBugs;\n\n if (!isQuiet && mergeResult.stats.existingBugs > 0) {\n p.log.info(\n `Merged: ${newBugsThisScan} new bugs + ${mergeResult.stats.existingBugs} existing = ${mergeResult.stats.total} total` +\n (mergeResult.stats.duplicatesSkipped > 0 ? ` (${mergeResult.stats.duplicatesSkipped} duplicates skipped)` : '')\n );\n }\n\n // Use the full accumulated bug list for output\n const allBugs = mergeResult.bugs;\n\n // ─────────────────────────────────────────────────────────────\n // Calculate LoC and create scan result\n // ─────────────────────────────────────────────────────────────\n const linesOfCode = countLinesOfCode(cwd, filesToScan);\n const scanDuration = Date.now() - scanStartTime;\n\n // Separate bugs and smells with severity breakdown\n const bugItems = allBugs.filter((b) => b.kind === 'bug');\n const smellItems = allBugs.filter((b) => b.kind === 'smell');\n\n const summary: ScanSummary = {\n bugs: {\n critical: bugItems.filter((b) => b.severity === 'critical').length,\n high: bugItems.filter((b) => b.severity === 'high').length,\n medium: bugItems.filter((b) => b.severity === 'medium').length,\n low: bugItems.filter((b) => b.severity === 'low').length,\n total: bugItems.length,\n },\n smells: {\n critical: smellItems.filter((b) => b.severity === 'critical').length,\n high: smellItems.filter((b) => b.severity === 'high').length,\n medium: smellItems.filter((b) => b.severity === 'medium').length,\n low: smellItems.filter((b) => b.severity === 'low').length,\n total: smellItems.length,\n },\n total: allBugs.length,\n };\n\n const meta: ScanMeta = {\n repoName,\n provider: providerName,\n duration: scanDuration,\n filesScanned: filesToScan.length,\n linesOfCode,\n };\n\n const result: ScanResult = {\n id: `scan-${Date.now()}`,\n timestamp: new Date().toISOString(),\n scanType,\n filesScanned: filesToScan.length,\n filesChanged: scanType === 'incremental' ? filesToScan.length : undefined,\n duration: scanDuration,\n linesOfCode,\n bugs: allBugs,\n summary,\n meta,\n };\n\n // ─────────────────────────────────────────────────────────────\n // Output\n // ─────────────────────────────────────────────────────────────\n // Persist hash cache only after a successful analysis run\n if (pendingHashState) {\n try {\n saveFileHashes(cwd, pendingHashState);\n } catch {\n // Non-fatal: cache persistence failure should not break scan output\n }\n }\n\n if (options.json || (options.ci && !options.sarif)) {\n // JSON output (default for CI mode)\n console.log(JSON.stringify(result, null, 2));\n // CI mode: exit with code 1 if bugs found\n if (options.ci && result.summary.bugs.total > 0) {\n process.exit(1);\n }\n } else if (options.sarif) {\n console.log(JSON.stringify(outputSarif(result), null, 2));\n // CI mode: exit with code 1 if bugs found\n if (options.ci && result.summary.bugs.total > 0) {\n process.exit(1);\n }\n } else {\n // Create output directory\n const outputDir = join(cwd, 'whiterose-output');\n const reportsDir = join(whiterosePath, 'reports');\n const { mkdirSync } = await import('fs');\n\n try {\n mkdirSync(outputDir, { recursive: true });\n mkdirSync(reportsDir, { recursive: true });\n } catch {\n // Directory already exists\n }\n\n const timestamp = new Date().toISOString().split('T')[0];\n\n // Always save all formats\n // 1. Technical Markdown\n const markdown = outputMarkdown(result);\n const mdPath = join(outputDir, 'bugs.md');\n writeFileSync(mdPath, markdown);\n\n // 2. Human-Readable Markdown (tester-friendly)\n const humanReadable = outputHumanReadableMarkdown(result);\n const humanPath = join(outputDir, 'bugs-human.md');\n writeFileSync(humanPath, humanReadable);\n\n // 3. SARIF\n const sarifPath = join(outputDir, 'bugs.sarif');\n writeFileSync(sarifPath, JSON.stringify(outputSarif(result), null, 2));\n\n // 4. JSON\n const jsonPath = join(outputDir, 'bugs.json');\n writeFileSync(jsonPath, JSON.stringify(result, null, 2));\n\n // 5. Save last scan for status command\n const lastScanPath = join(whiterosePath, 'last-scan.json');\n writeFileSync(lastScanPath, JSON.stringify(result, null, 2));\n\n // Also save to reports directory with timestamp for history\n writeFileSync(join(reportsDir, `${timestamp}.sarif`), JSON.stringify(outputSarif(result), null, 2));\n\n // Show the card\n console.log();\n const cardData: CardData = {\n meta,\n bugs: summary.bugs,\n smells: summary.smells,\n reportPath: './' + relative(cwd, humanPath),\n };\n console.log(renderScanCard(cardData));\n console.log();\n\n // Show relative paths for reports\n console.log(chalk.dim('Reports:'));\n console.log(` ${chalk.dim('\\u251c')} ${chalk.cyan('./' + relative(cwd, humanPath))} ${chalk.dim('(tester-friendly)')}`);\n console.log(` ${chalk.dim('\\u251c')} ${chalk.cyan('./' + relative(cwd, mdPath))} ${chalk.dim('(technical)')}`);\n console.log(` ${chalk.dim('\\u251c')} ${chalk.cyan('./' + relative(cwd, sarifPath))}`);\n console.log(` ${chalk.dim('\\u2514')} ${chalk.cyan('./' + relative(cwd, jsonPath))}`);\n console.log();\n }\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { Bug } from '../../types.js';\n\ninterface DashboardProps {\n bugs: Bug[];\n onSelectCategory: (category: string | null) => void;\n}\n\ninterface MenuItem {\n key: string;\n label: string;\n count: number;\n color: string;\n}\n\nexport const Dashboard: React.FC<DashboardProps> = ({ bugs, onSelectCategory }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const verifiedBugs = bugs.filter((b) => b.kind === 'bug');\n const smells = bugs.filter((b) => b.kind === 'smell');\n\n // Calculate summary\n const summary = {\n critical: verifiedBugs.filter((b) => b.severity === 'critical').length,\n high: verifiedBugs.filter((b) => b.severity === 'high').length,\n medium: verifiedBugs.filter((b) => b.severity === 'medium').length,\n low: verifiedBugs.filter((b) => b.severity === 'low').length,\n };\n\n // Calculate by category\n const byCategory: Record<string, number> = {};\n for (const bug of verifiedBugs) {\n byCategory[bug.category] = (byCategory[bug.category] || 0) + 1;\n }\n\n // Build menu items\n const menuItems: MenuItem[] = [\n { key: 'all', label: 'All Findings', count: bugs.length, color: 'white' },\n { key: 'kind:bug', label: 'Verified Bugs', count: verifiedBugs.length, color: 'white' },\n { key: 'kind:smell', label: 'Smells', count: smells.length, color: 'gray' },\n { key: 'critical', label: 'Critical', count: summary.critical, color: 'red' },\n { key: 'high', label: 'High', count: summary.high, color: 'yellow' },\n { key: 'medium', label: 'Medium', count: summary.medium, color: 'blue' },\n { key: 'low', label: 'Low', count: summary.low, color: 'gray' },\n ];\n\n // Add category items\n const categoryColors: Record<string, string> = {\n 'logic-error': 'magenta',\n security: 'red',\n 'async-race-condition': 'cyan',\n 'edge-case': 'yellow',\n 'null-reference': 'blue',\n 'type-coercion': 'green',\n 'resource-leak': 'yellow',\n 'intent-violation': 'magenta',\n };\n\n for (const [category, count] of Object.entries(byCategory)) {\n menuItems.push({\n key: category,\n label: formatCategory(category),\n count,\n color: categoryColors[category] || 'white',\n });\n }\n\n useInput((_input, key) => {\n if (key.upArrow) {\n setSelectedIndex((i) => Math.max(0, i - 1));\n } else if (key.downArrow) {\n setSelectedIndex((i) => Math.min(menuItems.length - 1, i + 1));\n } else if (key.return) {\n const item = menuItems[selectedIndex];\n if (item.key === 'all') {\n onSelectCategory(null);\n } else {\n onSelectCategory(item.key);\n }\n }\n });\n\n if (bugs.length === 0) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"green\" bold>\n ✓ No findings found!\n </Text>\n <Text color=\"gray\">Your codebase looks clean.</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {/* Summary */}\n <Box marginBottom={1} flexDirection=\"column\">\n <Text bold underline>\n Summary\n </Text>\n <Box marginTop={1}>\n <Box marginRight={3}>\n <Text color=\"red\">● Critical: {summary.critical}</Text>\n </Box>\n <Box marginRight={3}>\n <Text color=\"yellow\">● High: {summary.high}</Text>\n </Box>\n <Box marginRight={3}>\n <Text color=\"blue\">● Medium: {summary.medium}</Text>\n </Box>\n <Box>\n <Text color=\"gray\">● Low: {summary.low}</Text>\n </Box>\n </Box>\n </Box>\n\n {/* Menu */}\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold underline>\n Filter by\n </Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {menuItems.map((item, index) => (\n <Box key={item.key}>\n <Text color={index === selectedIndex ? 'cyan' : 'white'}>\n {index === selectedIndex ? '▶ ' : ' '}\n </Text>\n <Text color={item.color}>\n {item.label}\n </Text>\n <Text color=\"gray\"> ({item.count})</Text>\n </Box>\n ))}\n </Box>\n </Box>\n\n {/* Instructions */}\n <Box marginTop={2}>\n <Text color=\"gray\">[↑↓] Navigate [Enter] Select [q] Quit</Text>\n </Box>\n </Box>\n );\n};\n\nfunction formatCategory(category: string): string {\n return category\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { Bug } from '../../types.js';\n\ninterface BugListProps {\n bugs: Bug[];\n selectedIndex: number;\n onSelect: (index: number) => void;\n onBack: () => void;\n}\n\nconst VISIBLE_ITEMS = 10;\n\nexport const BugList: React.FC<BugListProps> = ({ bugs, selectedIndex, onSelect, onBack }) => {\n const [localIndex, setLocalIndex] = useState(selectedIndex);\n const [scrollOffset, setScrollOffset] = useState(0);\n\n useEffect(() => {\n setLocalIndex(selectedIndex);\n }, [selectedIndex]);\n\n // Ensure selected item is visible\n useEffect(() => {\n if (localIndex < scrollOffset) {\n setScrollOffset(localIndex);\n } else if (localIndex >= scrollOffset + VISIBLE_ITEMS) {\n setScrollOffset(localIndex - VISIBLE_ITEMS + 1);\n }\n }, [localIndex, scrollOffset]);\n\n useInput((input, key) => {\n if (key.upArrow || input === 'k') {\n setLocalIndex((i) => Math.max(0, i - 1));\n } else if (key.downArrow || input === 'j') {\n setLocalIndex((i) => Math.min(bugs.length - 1, i + 1));\n } else if (key.return) {\n onSelect(localIndex);\n } else if (input === 'b' || key.escape) {\n onBack();\n } else if (input === 'u' || input === '[') {\n // Page up\n setLocalIndex((i) => Math.max(0, i - VISIBLE_ITEMS));\n } else if (input === 'd' || input === ']') {\n // Page down\n setLocalIndex((i) => Math.min(bugs.length - 1, i + VISIBLE_ITEMS));\n }\n });\n\n if (bugs.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"gray\">No bugs in this category.</Text>\n <Text color=\"gray\">[b] Back to dashboard</Text>\n </Box>\n );\n }\n\n const visibleBugs = bugs.slice(scrollOffset, scrollOffset + VISIBLE_ITEMS);\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box marginBottom={1}>\n <Box width={10}>\n <Text bold color=\"gray\">ID</Text>\n </Box>\n <Box width={7}>\n <Text bold color=\"gray\">Kind</Text>\n </Box>\n <Box width={10}>\n <Text bold color=\"gray\">Severity</Text>\n </Box>\n <Box width={10}>\n <Text bold color=\"gray\">Conf</Text>\n </Box>\n <Box flexGrow={1}>\n <Text bold color=\"gray\">Title</Text>\n </Box>\n </Box>\n\n {/* Bug list */}\n {visibleBugs.map((bug, index) => {\n const actualIndex = scrollOffset + index;\n const isSelected = actualIndex === localIndex;\n const kindLabel = bug.kind === 'smell' ? 'SMELL' : 'BUG';\n const kindColor = bug.kind === 'smell' ? 'yellow' : 'red';\n\n return (\n <Box key={`${bug.id}-${actualIndex}`} flexDirection=\"column\">\n <Box>\n <Text color={isSelected ? 'cyan' : 'white'}>\n {isSelected ? '▶ ' : ' '}\n </Text>\n <Box width={8}>\n <Text color=\"gray\">{bug.id}</Text>\n </Box>\n <Box width={7}>\n <Text color={kindColor}>{kindLabel.padEnd(5)}</Text>\n </Box>\n <Box width={10}>\n <Text color={getSeverityColor(bug.severity)}>\n {bug.severity.toUpperCase().padEnd(8)}\n </Text>\n </Box>\n <Box width={10}>\n <Text color={getConfidenceColor(bug.confidence.overall)}>\n {bug.confidence.overall.toUpperCase().padEnd(6)}\n </Text>\n </Box>\n <Box flexGrow={1} flexShrink={1}>\n <Text color={isSelected ? 'white' : 'gray'} wrap=\"truncate-end\">\n {bug.title}\n </Text>\n </Box>\n </Box>\n {/* Show file on second line for selected item */}\n {isSelected && (\n <Box marginLeft={2}>\n <Text color=\"cyan\" dimColor>\n └─ {bug.file}:{bug.line}\n </Text>\n </Box>\n )}\n </Box>\n );\n })}\n\n {/* Scroll indicator */}\n {bugs.length > VISIBLE_ITEMS && (\n <Box marginTop={1}>\n <Text color=\"gray\">\n Showing {scrollOffset + 1}-{Math.min(scrollOffset + VISIBLE_ITEMS, bugs.length)} of {bugs.length}\n {scrollOffset > 0 && ' [↑ more above]'}\n {scrollOffset + VISIBLE_ITEMS < bugs.length && ' [↓ more below]'}\n </Text>\n </Box>\n )}\n\n {/* Instructions */}\n <Box marginTop={1}>\n <Text color=\"gray\">\n [↑↓/jk] Navigate [Enter] View [u/d] Page up/down [b] Back\n </Text>\n </Box>\n </Box>\n );\n};\n\nfunction getSeverityColor(severity: string): string {\n switch (severity) {\n case 'critical':\n return 'red';\n case 'high':\n return 'yellow';\n case 'medium':\n return 'blue';\n case 'low':\n return 'gray';\n default:\n return 'white';\n }\n}\n\nfunction getConfidenceColor(confidence: string): string {\n switch (confidence) {\n case 'high':\n return 'green';\n case 'medium':\n return 'yellow';\n case 'low':\n return 'red';\n default:\n return 'white';\n }\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { Bug } from '../../types.js';\n\ninterface BugDetailProps {\n bug: Bug;\n index: number;\n total: number;\n onFix: () => void;\n onNext: () => void;\n onPrev: () => void;\n onBack: () => void;\n}\n\ntype Tab = 'overview' | 'codepath' | 'evidence' | 'fix';\n\nexport const BugDetail: React.FC<BugDetailProps> = ({\n bug,\n index,\n total,\n onFix,\n onNext,\n onPrev,\n onBack,\n}) => {\n const [activeTab, setActiveTab] = useState<Tab>('overview');\n\n useInput((input, key) => {\n if (input === 'f') {\n onFix();\n } else if (input === 'n' || key.rightArrow) {\n onNext();\n } else if (input === 'p' || key.leftArrow) {\n onPrev();\n } else if (input === 'b' || key.escape) {\n onBack();\n } else if (input === '1') {\n setActiveTab('overview');\n } else if (input === '2') {\n setActiveTab('codepath');\n } else if (input === '3') {\n setActiveTab('evidence');\n } else if (input === '4') {\n setActiveTab('fix');\n } else if (key.tab) {\n const tabs: Tab[] = ['overview', 'codepath', 'evidence', 'fix'];\n const currentIndex = tabs.indexOf(activeTab);\n setActiveTab(tabs[(currentIndex + 1) % tabs.length]);\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n {/* Bug header */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color=\"gray\">{bug.id} </Text>\n <Text color={getSeverityColor(bug.severity)} bold>\n [{bug.severity.toUpperCase()}]\n </Text>\n <Text> </Text>\n <Text bold>{bug.title}</Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">File: </Text>\n <Text color=\"cyan\">{bug.file}</Text>\n <Text color=\"gray\">:</Text>\n <Text color=\"yellow\">{bug.line}</Text>\n {bug.endLine && (\n <>\n <Text color=\"gray\">-</Text>\n <Text color=\"yellow\">{bug.endLine}</Text>\n </>\n )}\n </Box>\n <Box>\n <Text color=\"gray\">Category: </Text>\n <Text>{formatCategory(bug.category)}</Text>\n <Text color=\"gray\"> | Confidence: </Text>\n <Text color={getConfidenceColor(bug.confidence.overall)}>\n {bug.confidence.overall.toUpperCase()}\n </Text>\n {bug.confidence.adversarialSurvived && (\n <Text color=\"green\"> ✓ Validated</Text>\n )}\n </Box>\n </Box>\n\n {/* Tabs */}\n <Box marginBottom={1}>\n <TabButton label=\"1:Overview\" active={activeTab === 'overview'} />\n <TabButton label=\"2:Code Path\" active={activeTab === 'codepath'} />\n <TabButton label=\"3:Evidence\" active={activeTab === 'evidence'} />\n <TabButton label=\"4:Action\" active={activeTab === 'fix'} />\n </Box>\n\n {/* Tab content */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n padding={1}\n minHeight={10}\n >\n {activeTab === 'overview' && (\n <Box flexDirection=\"column\">\n <Text bold>Description</Text>\n <Text wrap=\"wrap\">{bug.description}</Text>\n </Box>\n )}\n\n {activeTab === 'codepath' && (\n <Box flexDirection=\"column\">\n <Text bold>Code Path ({bug.codePath.length} steps)</Text>\n {bug.codePath.length === 0 ? (\n <Text color=\"gray\">No code path available</Text>\n ) : (\n bug.codePath.map((step, i) => (\n <Box key={i} flexDirection=\"column\" marginTop={i > 0 ? 1 : 0}>\n <Box>\n <Text color=\"cyan\">{step.step}. </Text>\n <Text color=\"yellow\">{step.file}:{step.line}</Text>\n </Box>\n {step.code && (\n <Box marginLeft={3}>\n <Text color=\"gray\">{step.code}</Text>\n </Box>\n )}\n <Box marginLeft={3}>\n <Text>{step.explanation}</Text>\n </Box>\n </Box>\n ))\n )}\n </Box>\n )}\n\n {activeTab === 'evidence' && (\n <Box flexDirection=\"column\">\n <Text bold>Evidence ({bug.evidence.length} items)</Text>\n {bug.evidence.length === 0 ? (\n <Text color=\"gray\">No evidence provided</Text>\n ) : (\n bug.evidence.map((e, i) => (\n <Box key={i}>\n <Text color=\"gray\">• </Text>\n <Text>{e}</Text>\n </Box>\n ))\n )}\n\n {/* Confidence breakdown */}\n <Box flexDirection=\"column\" marginTop={2}>\n <Text bold>Confidence Breakdown</Text>\n <Box>\n <Text color=\"gray\">Code Path Validity: </Text>\n <Text>{(bug.confidence.codePathValidity * 100).toFixed(0)}%</Text>\n </Box>\n <Box>\n <Text color=\"gray\">Reachability: </Text>\n <Text>{(bug.confidence.reachability * 100).toFixed(0)}%</Text>\n </Box>\n <Box>\n <Text color=\"gray\">Intent Violation: </Text>\n <Text>{bug.confidence.intentViolation ? 'Yes' : 'No'}</Text>\n </Box>\n <Box>\n <Text color=\"gray\">Static Tool Signal: </Text>\n <Text>{bug.confidence.staticToolSignal ? 'Yes' : 'No'}</Text>\n </Box>\n <Box>\n <Text color=\"gray\">Adversarial Validated: </Text>\n <Text color={bug.confidence.adversarialSurvived ? 'green' : 'gray'}>\n {bug.confidence.adversarialSurvived ? 'Yes ✓' : 'No'}\n </Text>\n </Box>\n </Box>\n </Box>\n )}\n\n {activeTab === 'fix' && (\n <Box flexDirection=\"column\">\n <Text bold>Agentic Fix</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"cyan\">Press [f] to start an AI-powered fix.</Text>\n <Box marginTop={1}>\n <Text color=\"gray\">The AI will:</Text>\n </Box>\n <Text color=\"gray\"> 1. Read the file and understand the context</Text>\n <Text color=\"gray\"> 2. Explore related files if needed</Text>\n <Text color=\"gray\"> 3. Apply a fix directly to the code</Text>\n <Text color=\"gray\"> 4. Show you the diff for review</Text>\n </Box>\n </Box>\n )}\n </Box>\n\n {/* Navigation */}\n <Box marginTop={1} justifyContent=\"space-between\">\n <Text color=\"gray\">\n Bug {index + 1} of {total}\n </Text>\n <Text color=\"gray\">\n [←/p] Prev [→/n] Next [f] Fix [Tab] Switch tab [b] Back\n </Text>\n </Box>\n </Box>\n );\n};\n\nconst TabButton: React.FC<{ label: string; active: boolean }> = ({ label, active }) => (\n <Box marginRight={2}>\n <Text color={active ? 'cyan' : 'gray'} bold={active} underline={active}>\n {label}\n </Text>\n </Box>\n);\n\nfunction getSeverityColor(severity: string): string {\n switch (severity) {\n case 'critical':\n return 'red';\n case 'high':\n return 'yellow';\n case 'medium':\n return 'blue';\n case 'low':\n return 'gray';\n default:\n return 'white';\n }\n}\n\nfunction getConfidenceColor(confidence: string): string {\n switch (confidence) {\n case 'high':\n return 'green';\n case 'medium':\n return 'yellow';\n case 'low':\n return 'red';\n default:\n return 'white';\n }\n}\n\nfunction formatCategory(category: string): string {\n return category\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { Bug } from '../../types.js';\nimport { FixResultInfo } from '../types.js';\n\ninterface FixConfirmProps {\n bug: Bug;\n dryRun: boolean;\n onConfirm: (onProgress: (message: string) => void) => Promise<FixResultInfo>;\n onCancel: () => void;\n onFixComplete: () => void; // Called after user acknowledges success (or false positive)\n}\n\nexport const FixConfirm: React.FC<FixConfirmProps> = ({ bug, dryRun, onConfirm, onCancel, onFixComplete }) => {\n const [status, setStatus] = useState<'confirm' | 'fixing' | 'done' | 'error' | 'false-positive'>('confirm');\n const [error, setError] = useState<string | null>(null);\n const [falsePositiveReason, setFalsePositiveReason] = useState<string | null>(null);\n const [progressMessage, setProgressMessage] = useState<string>('');\n\n useInput(async (input, key) => {\n // Handle success acknowledgment - user presses any key to continue\n if (status === 'done') {\n onFixComplete();\n return;\n }\n\n // Handle false positive acknowledgment - user presses any key to continue\n if (status === 'false-positive') {\n onFixComplete();\n return;\n }\n\n // Handle error acknowledgment\n if (status === 'error') {\n onCancel();\n return;\n }\n\n if (status !== 'confirm') return;\n\n if (input === 'y' || key.return) {\n setStatus('fixing');\n setProgressMessage('Starting agentic fix...');\n try {\n const result = await onConfirm((message) => {\n // Update progress message with streaming output from the LLM\n setProgressMessage(message);\n });\n if (result.falsePositive) {\n setFalsePositiveReason(result.falsePositiveReason || 'The AI determined this bug is not real after analyzing the code.');\n setStatus('false-positive');\n } else {\n setStatus('done');\n }\n } catch (e: any) {\n setError(e.message || 'Unknown error');\n setStatus('error');\n }\n } else if (input === 'n' || key.escape) {\n onCancel();\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n {/* Bug summary */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text bold>Fix: </Text>\n <Text>{bug.title}</Text>\n </Box>\n <Box>\n <Text color=\"gray\">File: </Text>\n <Text color=\"cyan\">{bug.file}:{bug.line}</Text>\n </Box>\n </Box>\n\n {/* Bug details */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n padding={1}\n marginBottom={1}\n >\n <Text bold>Bug Details:</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">{bug.description}</Text>\n {bug.evidence && bug.evidence.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>Evidence:</Text>\n {bug.evidence.slice(0, 3).map((e, i) => (\n <Text key={i} color=\"gray\"> • {e}</Text>\n ))}\n </Box>\n )}\n </Box>\n </Box>\n\n {/* Agentic fix explanation */}\n <Box marginBottom={1}>\n <Text color=\"cyan\">\n ◆ The AI will explore the code, understand context, and apply a fix automatically.\n </Text>\n </Box>\n\n {/* Status */}\n {status === 'confirm' && (\n <Box flexDirection=\"column\">\n {dryRun && (\n <Box marginBottom={1}>\n <Text color=\"yellow\">DRY RUN MODE - Changes will NOT be applied</Text>\n </Box>\n )}\n <Box>\n <Text>Start agentic fix? </Text>\n <Text color=\"green\">[y]es</Text>\n <Text> / </Text>\n <Text color=\"red\">[n]o</Text>\n </Box>\n </Box>\n )}\n\n {status === 'fixing' && (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text> AI is analyzing and fixing the bug...</Text>\n </Box>\n {progressMessage && (\n <Box marginTop={1}>\n <Text color=\"gray\">{progressMessage}</Text>\n </Box>\n )}\n </Box>\n )}\n\n {status === 'done' && (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"green\" bold>✓ Bug fixed successfully!</Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">Press any key to continue to next bug...</Text>\n </Box>\n </Box>\n )}\n\n {status === 'false-positive' && (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"yellow\" bold>⚠ False Positive Detected</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">The AI analyzed the code and determined this is NOT a real bug:</Text>\n {falsePositiveReason && (\n <Box marginTop={1} paddingLeft={2}>\n <Text color=\"cyan\">{falsePositiveReason}</Text>\n </Box>\n )}\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">This bug has been removed from the list.</Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">Press any key to continue...</Text>\n </Box>\n </Box>\n )}\n\n {status === 'error' && (\n <Box flexDirection=\"column\">\n <Text color=\"red\" bold>✗ Failed to fix bug</Text>\n {error && (\n <Box marginTop={1}>\n <Text color=\"gray\">{error}</Text>\n </Box>\n )}\n <Box marginTop={1}>\n <Text color=\"gray\">Press any key to go back</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport { Bug, WhiteroseConfig } from '../types.js';\nimport { Dashboard } from './screens/Dashboard.js';\nimport { BugList } from './screens/BugList.js';\nimport { BugDetail } from './screens/BugDetail.js';\nimport { FixConfirm } from './screens/FixConfirm.js';\nimport { FixResultInfo, Screen } from './types.js';\n\n// Re-export for backwards compatibility\nexport type { FixResultInfo, Screen } from './types.js';\n\nexport interface AppState {\n screen: Screen;\n bugs: Bug[];\n selectedCategory: string | null;\n selectedBugIndex: number;\n config: WhiteroseConfig;\n fixOptions: {\n dryRun: boolean;\n branch?: string;\n };\n}\n\ninterface AppProps {\n bugs: Bug[];\n config: WhiteroseConfig;\n fixOptions: {\n dryRun: boolean;\n branch?: string;\n };\n onFix: (bug: Bug, onProgress?: (message: string) => void) => Promise<FixResultInfo>;\n onExit: () => void;\n}\n\nexport const App: React.FC<AppProps> = ({ bugs, config, fixOptions, onFix, onExit }) => {\n const { exit } = useApp();\n const [state, setState] = useState<AppState>({\n screen: 'dashboard',\n bugs,\n selectedCategory: null,\n selectedBugIndex: 0,\n config,\n fixOptions,\n });\n\n // Filter bugs based on selected category\n const filteredBugs = state.selectedCategory\n ? state.bugs.filter((b) => {\n if (state.selectedCategory?.startsWith('kind:')) {\n const kind = state.selectedCategory.split(':')[1];\n return b.kind === kind;\n }\n return b.category === state.selectedCategory || b.severity === state.selectedCategory;\n })\n : state.bugs;\n\n const selectedBug = filteredBugs[state.selectedBugIndex];\n\n // Handle global keys\n useInput((input, key) => {\n if (input === 'q' || (key.ctrl && input === 'c')) {\n onExit();\n exit();\n return;\n }\n\n if (key.escape) {\n // Go back\n if (state.screen === 'fix') {\n setState((s) => ({ ...s, screen: 'detail' }));\n } else if (state.screen === 'detail') {\n setState((s) => ({ ...s, screen: 'list' }));\n } else if (state.screen === 'list') {\n setState((s) => ({ ...s, screen: 'dashboard', selectedCategory: null }));\n }\n }\n });\n\n const handleSelectCategory = (category: string | null) => {\n setState((s) => ({\n ...s,\n screen: 'list',\n selectedCategory: category,\n selectedBugIndex: 0,\n }));\n };\n\n const handleSelectBug = (index: number) => {\n setState((s) => ({\n ...s,\n screen: 'detail',\n selectedBugIndex: index,\n }));\n };\n\n const handleStartFix = () => {\n setState((s) => ({ ...s, screen: 'fix' }));\n };\n\n const [fixError, setFixError] = useState<string | null>(null);\n const [lastFixedBugId, setLastFixedBugId] = useState<string | null>(null);\n\n // Called when user confirms fix - does the fix and returns result info\n const handleConfirmFix = async (onProgress: (message: string) => void): Promise<FixResultInfo> => {\n if (selectedBug) {\n setFixError(null);\n setLastFixedBugId(selectedBug.id);\n const result = await onFix(selectedBug, onProgress);\n // Don't change state here - let FixConfirm show success/false-positive first\n return result;\n }\n return { falsePositive: false };\n };\n\n // Called after user acknowledges fix success - updates state and moves to next bug\n const handleFixComplete = () => {\n if (!lastFixedBugId) return;\n\n setState((s) => {\n const newBugs = s.bugs.filter((b) => b.id !== lastFixedBugId);\n\n // Recalculate filtered bugs with new state\n const newFiltered = s.selectedCategory\n ? newBugs.filter((b) => {\n if (s.selectedCategory?.startsWith('kind:')) {\n const kind = s.selectedCategory.split(':')[1];\n return b.kind === kind;\n }\n return b.category === s.selectedCategory || b.severity === s.selectedCategory;\n })\n : newBugs;\n\n // Go back to list if no more bugs in current filter\n if (newFiltered.length === 0) {\n return {\n ...s,\n bugs: newBugs,\n screen: 'list' as Screen,\n selectedBugIndex: 0,\n };\n }\n\n // Stay at same index (now showing next bug) or adjust if at end\n const newIndex = Math.min(s.selectedBugIndex, newFiltered.length - 1);\n\n return {\n ...s,\n bugs: newBugs,\n screen: 'detail' as Screen,\n selectedBugIndex: newIndex,\n };\n });\n\n setLastFixedBugId(null);\n };\n\n const handleCancelFix = () => {\n setState((s) => ({ ...s, screen: 'detail' }));\n };\n\n const handleBack = () => {\n if (state.screen === 'fix') {\n setState((s) => ({ ...s, screen: 'detail' }));\n } else if (state.screen === 'detail') {\n setState((s) => ({ ...s, screen: 'list' }));\n } else if (state.screen === 'list') {\n setState((s) => ({ ...s, screen: 'dashboard', selectedCategory: null }));\n }\n };\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text color=\"red\" bold>\n whiterose\n </Text>\n <Text color=\"gray\"> - fix mode</Text>\n <Text color=\"gray\"> | </Text>\n <Text color=\"gray\">\n {state.screen === 'dashboard' && 'Dashboard'}\n {state.screen === 'list' && `Bugs${state.selectedCategory ? ` (${state.selectedCategory})` : ''}`}\n {state.screen === 'detail' && `Bug ${state.selectedBugIndex + 1}/${filteredBugs.length}`}\n {state.screen === 'fix' && 'Confirm Fix'}\n </Text>\n </Box>\n\n {/* Main content */}\n {state.screen === 'dashboard' && (\n <Dashboard bugs={state.bugs} onSelectCategory={handleSelectCategory} />\n )}\n\n {state.screen === 'list' && (\n <BugList\n bugs={filteredBugs}\n selectedIndex={state.selectedBugIndex}\n onSelect={handleSelectBug}\n onBack={handleBack}\n />\n )}\n\n {state.screen === 'detail' && selectedBug && (\n <>\n {fixError && (\n <Box marginBottom={1}>\n <Text color=\"red\">Fix error: {fixError}</Text>\n </Box>\n )}\n <BugDetail\n bug={selectedBug}\n index={state.selectedBugIndex}\n total={filteredBugs.length}\n onFix={handleStartFix}\n onNext={() =>\n setState((s) => ({\n ...s,\n selectedBugIndex: Math.min(s.selectedBugIndex + 1, filteredBugs.length - 1),\n }))\n }\n onPrev={() =>\n setState((s) => ({\n ...s,\n selectedBugIndex: Math.max(s.selectedBugIndex - 1, 0),\n }))\n }\n onBack={handleBack}\n />\n </>\n )}\n\n {state.screen === 'fix' && selectedBug && (\n <FixConfirm\n bug={selectedBug}\n dryRun={fixOptions.dryRun}\n onConfirm={handleConfirmFix}\n onCancel={handleCancelFix}\n onFixComplete={handleFixComplete}\n />\n )}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text color=\"gray\">\n [q] Quit [esc] Back [↑↓] Navigate [enter] Select [f] Fix\n </Text>\n </Box>\n </Box>\n );\n};\n","import { execa } from 'execa';\nimport { Bug } from '../types.js';\n\nconst GIT_TIMEOUT = 30000; // 30 seconds\n\nexport async function isGitRepo(cwd: string = process.cwd()): Promise<boolean> {\n try {\n await execa('git', ['rev-parse', '--git-dir'], { cwd, timeout: GIT_TIMEOUT });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function getCurrentBranch(cwd: string = process.cwd()): Promise<string> {\n try {\n const { stdout } = await execa('git', ['branch', '--show-current'], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n return stdout.trim();\n } catch {\n return 'main';\n }\n}\n\nexport async function hasUncommittedChanges(cwd: string = process.cwd()): Promise<boolean> {\n try {\n const { stdout } = await execa('git', ['status', '--porcelain'], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n return stdout.trim().length > 0;\n } catch {\n return false;\n }\n}\n\nexport async function createFixBranch(\n branchName: string,\n bug: Bug,\n cwd: string = process.cwd()\n): Promise<string> {\n // Generate branch name from bug info if not provided\n const safeBugId = bug.id.toLowerCase().replace(/[^a-z0-9]/g, '-');\n const safeTitle = bug.title\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .replace(/\\s+/g, '-')\n .slice(0, 30);\n\n const fullBranchName = branchName || `whiterose/fix-${safeBugId}-${safeTitle}`;\n\n try {\n // Check if branch already exists\n try {\n await execa('git', ['rev-parse', '--verify', fullBranchName], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n // Branch exists, check it out\n await execa('git', ['checkout', fullBranchName], { cwd, timeout: GIT_TIMEOUT });\n } catch {\n // Branch doesn't exist, create it\n await execa('git', ['checkout', '-b', fullBranchName], { cwd, timeout: GIT_TIMEOUT });\n }\n\n return fullBranchName;\n } catch (error: any) {\n throw new Error(`Failed to create branch: ${error.message}`);\n }\n}\n\nexport async function commitFix(bug: Bug, cwd: string = process.cwd()): Promise<string> {\n try {\n // Stage the changed file (use -- to prevent option injection from malicious file paths)\n await execa('git', ['add', '--', bug.file], { cwd, timeout: GIT_TIMEOUT });\n\n // Check if there are staged changes\n const { stdout: diff } = await execa('git', ['diff', '--cached', '--name-only'], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n\n if (!diff.trim()) {\n return ''; // No changes to commit\n }\n\n // Create commit message\n const commitMessage = `fix(${bug.category}): ${bug.title}\n\nBug ID: ${bug.id}\nFile: ${bug.file}:${bug.line}\nSeverity: ${bug.severity}\n\n${bug.description}\n\nFixed by whiterose`;\n\n // Commit\n await execa('git', ['commit', '-m', commitMessage], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n\n // Get the commit hash\n const { stdout: hash } = await execa('git', ['rev-parse', 'HEAD'], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n\n return hash.trim();\n } catch (error: any) {\n throw new Error(`Failed to commit fix: ${error.message}`);\n }\n}\n\nexport async function stashChanges(cwd: string = process.cwd()): Promise<boolean> {\n try {\n const hasChanges = await hasUncommittedChanges(cwd);\n if (!hasChanges) {\n return false;\n }\n\n await execa('git', ['stash', 'push', '-m', 'whiterose: stash before fix'], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n\n return true;\n } catch (error: any) {\n throw new Error(`Failed to stash changes: ${error.message}`);\n }\n}\n\nexport async function popStash(cwd: string = process.cwd()): Promise<void> {\n try {\n await execa('git', ['stash', 'pop'], { cwd, timeout: GIT_TIMEOUT });\n } catch (error: any) {\n throw new Error(`Failed to pop stash: ${error.message}`);\n }\n}\n\nexport async function getDiff(file: string, cwd: string = process.cwd()): Promise<string> {\n try {\n const { stdout } = await execa('git', ['diff', file], { cwd, timeout: GIT_TIMEOUT });\n return stdout;\n } catch {\n return '';\n }\n}\n\nexport async function getStagedDiff(cwd: string = process.cwd()): Promise<string> {\n try {\n const { stdout } = await execa('git', ['diff', '--cached'], { cwd, timeout: GIT_TIMEOUT });\n return stdout;\n } catch {\n return '';\n }\n}\n\nexport async function resetFile(file: string, cwd: string = process.cwd()): Promise<void> {\n try {\n await execa('git', ['checkout', '--', file], { cwd, timeout: GIT_TIMEOUT });\n } catch (error: any) {\n throw new Error(`Failed to reset file: ${error.message}`);\n }\n}\n\nexport async function getFileAtHead(file: string, cwd: string = process.cwd()): Promise<string> {\n try {\n const { stdout } = await execa('git', ['show', `HEAD:${file}`], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n return stdout;\n } catch {\n return '';\n }\n}\n\nexport interface GitStatus {\n isRepo: boolean;\n branch: string;\n hasChanges: boolean;\n staged: string[];\n modified: string[];\n untracked: string[];\n}\n\nexport async function getGitStatus(cwd: string = process.cwd()): Promise<GitStatus> {\n const isRepo = await isGitRepo(cwd);\n if (!isRepo) {\n return {\n isRepo: false,\n branch: '',\n hasChanges: false,\n staged: [],\n modified: [],\n untracked: [],\n };\n }\n\n const branch = await getCurrentBranch(cwd);\n\n try {\n const { stdout } = await execa('git', ['status', '--porcelain'], {\n cwd,\n timeout: GIT_TIMEOUT,\n });\n\n const staged: string[] = [];\n const modified: string[] = [];\n const untracked: string[] = [];\n\n for (const line of stdout.split('\\n')) {\n if (!line.trim()) continue;\n\n const status = line.slice(0, 2);\n const file = line.slice(3);\n\n if (status[0] !== ' ' && status[0] !== '?') {\n staged.push(file);\n }\n if (status[1] === 'M') {\n modified.push(file);\n }\n if (status === '??') {\n untracked.push(file);\n }\n }\n\n return {\n isRepo: true,\n branch,\n hasChanges: staged.length > 0 || modified.length > 0,\n staged,\n modified,\n untracked,\n };\n } catch {\n return {\n isRepo: true,\n branch,\n hasChanges: false,\n staged: [],\n modified: [],\n untracked: [],\n };\n }\n}\n","/**\n * Bug Status Manager - Tracks fix status for bugs across scans\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { Bug, BugStatus } from '../types.js';\n\nconst STATUS_FILE = '.whiterose/bug-status.json';\n\ninterface BugStatusEntry {\n bugId: string;\n file: string;\n line: number;\n title: string;\n status: BugStatus;\n fixedAt?: string;\n fixCommit?: string;\n notes?: string;\n}\n\ninterface StatusFile {\n version: string;\n bugs: BugStatusEntry[];\n}\n\n/**\n * Load bug status from disk\n */\nexport function loadBugStatus(cwd: string = process.cwd()): StatusFile {\n const statusPath = join(cwd, STATUS_FILE);\n\n if (!existsSync(statusPath)) {\n return { version: '1', bugs: [] };\n }\n\n try {\n const content = readFileSync(statusPath, 'utf-8');\n const parsed = JSON.parse(content);\n\n // Validate structure to prevent crashes from corrupted files\n if (!parsed || typeof parsed !== 'object' || !Array.isArray(parsed.bugs)) {\n return { version: '1', bugs: [] };\n }\n\n return parsed as StatusFile;\n } catch {\n return { version: '1', bugs: [] };\n }\n}\n\n/**\n * Save bug status to disk\n */\nexport function saveBugStatus(status: StatusFile, cwd: string = process.cwd()): void {\n const statusPath = join(cwd, STATUS_FILE);\n const dir = dirname(statusPath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(statusPath, JSON.stringify(status, null, 2), 'utf-8');\n}\n\n/**\n * Mark a bug as fixed\n */\nexport function markBugAsFixed(\n bug: Bug,\n commitHash?: string,\n cwd: string = process.cwd()\n): void {\n const status = loadBugStatus(cwd);\n\n // Find existing entry or create new one\n const existingIndex = status.bugs.findIndex(\n (b) => b.bugId === bug.id || (b.file === bug.file && b.line === bug.line && b.title === bug.title)\n );\n\n const entry: BugStatusEntry = {\n bugId: bug.id,\n file: bug.file,\n line: bug.line,\n title: bug.title,\n status: 'fixed',\n fixedAt: new Date().toISOString(),\n fixCommit: commitHash,\n };\n\n if (existingIndex >= 0) {\n status.bugs[existingIndex] = entry;\n } else {\n status.bugs.push(entry);\n }\n\n saveBugStatus(status, cwd);\n}\n\n/**\n * Mark a bug with a specific status\n */\nexport function updateBugStatus(\n bug: Bug,\n newStatus: BugStatus,\n notes?: string,\n cwd: string = process.cwd()\n): void {\n const status = loadBugStatus(cwd);\n\n const existingIndex = status.bugs.findIndex(\n (b) => b.bugId === bug.id || (b.file === bug.file && b.line === bug.line && b.title === bug.title)\n );\n\n const entry: BugStatusEntry = {\n bugId: bug.id,\n file: bug.file,\n line: bug.line,\n title: bug.title,\n status: newStatus,\n notes,\n ...(newStatus === 'fixed' ? { fixedAt: new Date().toISOString() } : {}),\n };\n\n if (existingIndex >= 0) {\n status.bugs[existingIndex] = entry;\n } else {\n status.bugs.push(entry);\n }\n\n saveBugStatus(status, cwd);\n}\n\n/**\n * Get status for a specific bug\n */\nexport function getBugStatus(bug: Bug, cwd: string = process.cwd()): BugStatusEntry | null {\n const status = loadBugStatus(cwd);\n\n return status.bugs.find(\n (b) => b.bugId === bug.id || (b.file === bug.file && b.line === bug.line && b.title === bug.title)\n ) || null;\n}\n\n/**\n * Apply persisted status to a list of bugs from a scan\n */\nexport function applyPersistedStatus(bugs: Bug[], cwd: string = process.cwd()): Bug[] {\n const status = loadBugStatus(cwd);\n\n return bugs.map((bug) => {\n const entry = status.bugs.find(\n (b) => b.bugId === bug.id || (b.file === bug.file && b.line === bug.line && b.title === bug.title)\n );\n\n if (entry) {\n return {\n ...bug,\n status: entry.status,\n fixedAt: entry.fixedAt,\n fixCommit: entry.fixCommit,\n };\n }\n\n return bug;\n });\n}\n\n/**\n * Get summary of bug statuses\n */\nexport function getStatusSummary(cwd: string = process.cwd()): Record<BugStatus, number> {\n const status = loadBugStatus(cwd);\n\n const summary: Record<BugStatus, number> = {\n 'open': 0,\n 'fixed': 0,\n 'false-positive': 0,\n 'wont-fix': 0,\n };\n\n for (const bug of status.bugs) {\n summary[bug.status]++;\n }\n\n return summary;\n}\n","import { execa } from 'execa';\nimport { readFileSync, existsSync, realpathSync, statSync, mkdtempSync, rmSync } from 'fs';\nimport { resolve, relative, isAbsolute, join } from 'path';\nimport { tmpdir } from 'os';\nimport { Bug, WhiteroseConfig } from '../types.js';\nimport { createFixBranch, commitFix } from './git.js';\nimport { getProviderCommand } from '../providers/detect.js';\nimport { markBugAsFixed } from './bug-status.js';\n\n/**\n * Maximum length for untrusted SARIF text fields to prevent prompt bloat attacks.\n */\nconst MAX_SARIF_TEXT_LENGTH = 2000;\n\n/**\n * Patterns that indicate prompt injection attempts in SARIF content.\n * These patterns try to break out of the bug context and inject new instructions.\n */\nconst PROMPT_INJECTION_PATTERNS = [\n // Attempts to override or ignore instructions\n /ignore\\s+(previous|all|above)\\s+instructions?/i,\n /disregard\\s+(previous|all|above)\\s+instructions?/i,\n /forget\\s+(previous|all|above)\\s+instructions?/i,\n // Attempts to define new roles or personas\n /you\\s+are\\s+(now|actually)\\s+/i,\n /act\\s+as\\s+(a|an)\\s+/i,\n /pretend\\s+(you|to\\s+be)\\s+/i,\n // Attempts to inject system-level commands\n /\\[SYSTEM\\]/i,\n /\\[INST\\]/i,\n /<\\|system\\|>/i,\n /<\\|assistant\\|>/i,\n /<\\|user\\|>/i,\n // Attempts to break out with special markers\n /###\\s*(INSTRUCTION|SYSTEM|END|NEW)/i,\n /```\\s*(system|instruction)/i,\n // Direct file operation injections\n /delete\\s+(all|the)\\s+files?/i,\n /rm\\s+-rf\\s+/i,\n /remove\\s+(all|every)\\s+file/i,\n // Exfiltration attempts\n /send\\s+(this|the|all)\\s+(data|content|file)/i,\n /upload\\s+(to|this)/i,\n /curl\\s+.*\\s+-d/i,\n /fetch\\s*\\(\\s*['\"][^'\"]*['\"]\\s*,\\s*\\{[^}]*method\\s*:\\s*['\"]POST['\"]/i,\n];\n\n/**\n * Sanitizes untrusted text from SARIF files to prevent prompt injection.\n *\n * This function:\n * 1. Truncates overly long text to prevent prompt bloat\n * 2. Detects and neutralizes prompt injection patterns\n * 3. Escapes special characters that could break prompt structure\n *\n * @param text - Untrusted text from SARIF file\n * @param fieldName - Name of the field for error reporting\n * @returns Sanitized text safe for prompt embedding\n */\nexport function sanitizeSarifText(text: string, fieldName: string = 'field'): string {\n if (!text || typeof text !== 'string') {\n return '';\n }\n\n // Truncate overly long text\n let sanitized = text.length > MAX_SARIF_TEXT_LENGTH\n ? text.substring(0, MAX_SARIF_TEXT_LENGTH) + `... [truncated ${fieldName}]`\n : text;\n\n // Check for prompt injection patterns\n for (const pattern of PROMPT_INJECTION_PATTERNS) {\n if (pattern.test(sanitized)) {\n // Replace the suspicious content with a safe placeholder\n sanitized = sanitized.replace(pattern, '[REDACTED: potential injection]');\n }\n }\n\n // Escape characters that could break prompt structure\n // Replace markdown-style code blocks that might confuse the LLM\n sanitized = sanitized.replace(/```+/g, '`\\u200B`\\u200B`'); // Insert zero-width spaces\n\n // Escape sequences that look like special markers\n sanitized = sanitized.replace(/###/g, '#\\u200B#\\u200B#');\n\n return sanitized;\n}\n\n/**\n * Sanitizes an array of evidence strings from SARIF.\n */\nexport function sanitizeSarifEvidence(evidence: unknown): string[] {\n if (!Array.isArray(evidence)) {\n return [];\n }\n\n return evidence\n .filter((e): e is string => typeof e === 'string')\n .slice(0, 10) // Limit number of evidence items\n .map((e) => sanitizeSarifText(e, 'evidence'));\n}\n\n/**\n * Sanitizes code path entries from SARIF.\n */\nexport function sanitizeSarifCodePath(codePath: unknown): Array<{\n step: number;\n file: string;\n line: number;\n code: string;\n explanation: string;\n}> {\n if (!Array.isArray(codePath)) {\n return [];\n }\n\n return codePath\n .slice(0, 20) // Limit number of code path entries\n .map((entry, idx) => ({\n step: typeof entry?.step === 'number' ? entry.step : idx + 1,\n file: sanitizeSarifText(String(entry?.file || ''), 'codePath.file').substring(0, 500),\n line: typeof entry?.line === 'number' ? entry.line : 0,\n code: sanitizeSarifText(String(entry?.code || ''), 'codePath.code'),\n explanation: sanitizeSarifText(String(entry?.explanation || ''), 'codePath.explanation'),\n }));\n}\n\n/**\n * Validates that a file path is within the project directory.\n * Prevents path traversal attacks from malicious bug.file values.\n */\nfunction isPathWithinProject(filePath: string, projectDir: string): boolean {\n const resolvedPath = resolve(projectDir, filePath);\n const relativePath = relative(projectDir, resolvedPath);\n\n // Path is outside if it starts with '..' or is an absolute path\n return !relativePath.startsWith('..') && !isAbsolute(relativePath);\n}\n\n/**\n * Sanitizes and validates a file path for safe operations.\n * Returns the resolved absolute path if valid, throws if invalid.\n */\nfunction validateFilePath(filePath: string, projectDir: string): string {\n // Check for null bytes first (can bypass other checks)\n if (filePath.includes('\\0')) {\n throw new Error(`Security: Invalid file path contains null byte: ${filePath}`);\n }\n\n // Resolve to absolute path\n const resolvedPath = isAbsolute(filePath) ? filePath : resolve(projectDir, filePath);\n\n // Resolve symlinks to get real path (prevents symlink bypass attacks)\n let realPath: string;\n let realProjectDir: string;\n try {\n realPath = existsSync(resolvedPath) ? realpathSync(resolvedPath) : resolvedPath;\n realProjectDir = realpathSync(projectDir);\n } catch {\n // If realpath fails, use resolved paths\n realPath = resolvedPath;\n realProjectDir = projectDir;\n }\n\n // Check real path is within project (after symlink resolution)\n if (!isPathWithinProject(realPath, realProjectDir)) {\n throw new Error(`Security: Refusing to access file outside project directory: ${filePath}`);\n }\n\n return realPath;\n}\n\ninterface FixOptions {\n dryRun: boolean;\n branch?: string;\n onProgress?: (message: string) => void;\n}\n\ninterface FixResult {\n success: boolean;\n diff?: string;\n error?: string;\n branchName?: string;\n commitHash?: string;\n falsePositive?: boolean;\n falsePositiveReason?: string;\n}\n\n/**\n * Apply a fix to a bug using an agentic approach.\n *\n * Instead of generating a fix and applying it ourselves, we give the bug\n * details to the LLM provider and let it explore the code and fix it directly.\n * This produces much better fixes because the LLM can:\n * - Read related files for context\n * - Understand the codebase architecture\n * - Make multi-file changes if needed\n * - Verify the fix makes sense\n */\nexport async function applyFix(\n bug: Bug,\n config: WhiteroseConfig,\n options: FixOptions\n): Promise<FixResult> {\n const { dryRun, branch } = options;\n const projectDir = process.cwd();\n\n // SECURITY: Validate file path to prevent path traversal\n let safePath: string;\n try {\n safePath = validateFilePath(bug.file, projectDir);\n } catch (error: any) {\n return {\n success: false,\n error: error.message,\n };\n }\n\n // Verify file exists\n if (!existsSync(safePath)) {\n return {\n success: false,\n error: `File not found: ${bug.file}`,\n };\n }\n\n // Get file state before fix (for diff)\n const originalContent = readFileSync(safePath, 'utf-8');\n const originalMtime = statSync(safePath).mtime.getTime();\n\n // Dry run - just show what would be done\n if (dryRun) {\n console.log('\\n--- Dry Run: Would run agentic fix ---');\n console.log(`Bug: ${bug.title}`);\n console.log(`File: ${bug.file}:${bug.line}`);\n console.log(`Provider: ${config.provider}`);\n console.log('--- End of dry run ---\\n');\n return {\n success: true,\n diff: `[Dry run - no changes made]\\nWould fix: ${bug.title}\\nIn: ${bug.file}:${bug.line}`,\n };\n }\n\n // Create branch if needed\n let branchName: string | undefined;\n if (branch) {\n branchName = await createFixBranch(branch, bug);\n }\n\n // Run the agentic fix\n let agenticResult: AgenticResult;\n try {\n agenticResult = await runAgenticFix(bug, config, projectDir, options.onProgress);\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Agentic fix failed',\n };\n }\n\n // Check if the LLM determined this is a false positive\n if (agenticResult.falsePositive) {\n return {\n success: true, // Operation succeeded, just no fix needed\n falsePositive: true,\n falsePositiveReason: agenticResult.falsePositiveReason,\n };\n }\n\n // Verify the file was modified\n const newMtime = statSync(safePath).mtime.getTime();\n if (newMtime === originalMtime) {\n // File wasn't modified - check if content changed anyway\n const newContent = readFileSync(safePath, 'utf-8');\n if (newContent === originalContent) {\n return {\n success: false,\n error: 'AI did not modify the file. The fix may require manual intervention.',\n };\n }\n }\n\n // Generate diff\n const newContent = readFileSync(safePath, 'utf-8');\n const diff = generateSimpleDiff(originalContent, newContent, bug.file);\n\n // Commit the change\n let commitHash: string | undefined;\n try {\n commitHash = await commitFix(bug);\n } catch {\n // Commit failed but fix was applied\n }\n\n // Track fix in bug status\n markBugAsFixed(bug, commitHash, projectDir);\n\n return {\n success: true,\n diff,\n branchName,\n commitHash,\n };\n}\n\ninterface AgenticResult {\n falsePositive: boolean;\n falsePositiveReason?: string;\n}\n\n/**\n * Run the LLM provider in agentic mode to fix the bug.\n * The provider will explore the codebase and fix the bug directly.\n * If it determines the bug is a false positive, it will report that instead.\n */\nasync function runAgenticFix(\n bug: Bug,\n config: WhiteroseConfig,\n projectDir: string,\n onProgress?: (message: string) => void\n): Promise<AgenticResult> {\n const providerCommand = getProviderCommand(config.provider);\n const prompt = buildAgenticFixPrompt(bug);\n\n // Create an AbortController for reliable timeout handling\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 300000); // 5 minute timeout\n\n // Run the provider\n let stdout = '';\n let stderr = '';\n\n try {\n if (config.provider === 'codex') {\n // Codex requires special handling: exec subcommand with stdin and temp file output\n const tempDir = mkdtempSync(join(tmpdir(), 'whiterose-fix-'));\n const outputFile = join(tempDir, 'output.txt');\n\n try {\n const result = await execa(\n providerCommand,\n [\n 'exec',\n '--full-auto', // Allow workspace writes without approval prompts\n '--skip-git-repo-check',\n '-C', projectDir, // Set working directory for codex\n '-o', outputFile,\n '-', // Read prompt from stdin\n ],\n {\n cwd: projectDir,\n input: prompt, // Pass prompt via stdin\n timeout: 300000,\n env: { ...process.env, NO_COLOR: '1' },\n reject: false,\n cancelSignal: controller.signal,\n }\n );\n\n stderr = result.stderr || '';\n\n // Read output from file if it exists, otherwise use stdout\n if (existsSync(outputFile)) {\n try {\n stdout = readFileSync(outputFile, 'utf-8');\n } catch {\n stdout = result.stdout || '';\n }\n } else {\n stdout = result.stdout || '';\n }\n } finally {\n // Cleanup temp dir\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n } else if (config.provider === 'claude-code') {\n // Claude Code: pass prompt via stdin for reliability (avoids shell escaping and arg length issues)\n // The --dangerously-skip-permissions flag allows edits without prompts\n // Use --output-format stream-json for real-time progress streaming (requires --verbose)\n const args = ['--dangerously-skip-permissions', '-p'];\n if (onProgress) {\n args.push('--verbose', '--output-format', 'stream-json');\n }\n\n const subprocess = execa(\n providerCommand,\n args,\n {\n cwd: projectDir,\n input: prompt, // Pass prompt via stdin (Claude reads from stdin when no prompt arg provided)\n timeout: 300000,\n env: { ...process.env, NO_COLOR: '1' },\n reject: false,\n cancelSignal: controller.signal,\n }\n );\n\n // Stream stdout in real-time if progress callback is provided\n // Only show tool usage events to avoid verbose output\n if (onProgress && subprocess.stdout) {\n let lineBuffer = '';\n subprocess.stdout.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n lineBuffer += text;\n // Process complete lines (stream-json outputs one JSON object per line)\n const lines = lineBuffer.split('\\n');\n lineBuffer = lines.pop() || ''; // Keep incomplete line in buffer\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) {\n try {\n const event = JSON.parse(trimmed);\n // Only show tool_use events - skip all text content to avoid verbose output\n if (event.type === 'assistant' && event.message?.content) {\n for (const block of event.message.content) {\n if (block.type === 'tool_use') {\n // Show tool usage with friendly names\n const toolName = block.name || 'tool';\n const friendlyNames: Record<string, string> = {\n 'Read': 'Reading file',\n 'Edit': 'Editing file',\n 'Write': 'Writing file',\n 'Bash': 'Running command',\n 'Glob': 'Searching files',\n 'Grep': 'Searching content',\n 'Task': 'Running task',\n };\n const displayName = friendlyNames[toolName] || `Using ${toolName}`;\n onProgress(`${displayName}...`);\n }\n }\n }\n } catch {\n // Silently ignore non-JSON lines - don't show raw output\n }\n }\n }\n });\n }\n\n const result = await subprocess;\n stdout = result.stdout || '';\n stderr = result.stderr || '';\n } else if (config.provider === 'gemini') {\n // Gemini CLI: run in prompt mode, it will use tools automatically\n // Pass prompt as positional argument (Gemini may not support stdin)\n const result = await execa(providerCommand, ['-p', prompt], {\n cwd: projectDir,\n timeout: 300000,\n env: { ...process.env, NO_COLOR: '1' },\n reject: false,\n stdin: 'ignore', // Prevent stdin hangs\n cancelSignal: controller.signal,\n });\n stdout = result.stdout || '';\n stderr = result.stderr || '';\n } else if (config.provider === 'aider') {\n // Aider: pass the message and file\n // Aider doesn't support stdin for prompt, use --message flag\n const result = await execa(providerCommand, ['--message', prompt, bug.file], {\n cwd: projectDir,\n timeout: 300000,\n env: { ...process.env, NO_COLOR: '1' },\n reject: false,\n stdin: 'ignore', // Prevent stdin hangs\n cancelSignal: controller.signal,\n });\n stdout = result.stdout || '';\n stderr = result.stderr || '';\n } else {\n // Default: pass prompt as argument with -p flag, ignore stdin to prevent hangs\n const result = await execa(providerCommand, ['-p', prompt], {\n cwd: projectDir,\n timeout: 300000,\n env: { ...process.env, NO_COLOR: '1' },\n reject: false,\n stdin: 'ignore', // Prevent stdin hangs\n cancelSignal: controller.signal,\n });\n stdout = result.stdout || '';\n stderr = result.stderr || '';\n }\n } finally {\n clearTimeout(timeoutId);\n }\n\n // Check for known error patterns (only for actual ENOENT errors, not content)\n if (stderr) {\n const lowerStderr = stderr.toLowerCase();\n // Only throw if it's actually an ENOENT error from execa, not from LLM output\n if (lowerStderr.includes('enoent') && lowerStderr.includes('spawn')) {\n throw new Error(`Provider ${config.provider} not found. Is it installed?`);\n }\n if (lowerStderr.includes('permission denied') && lowerStderr.includes('spawn')) {\n throw new Error('Permission denied. Check provider configuration.');\n }\n }\n\n // Check if LLM reported this as a false positive\n const output = stdout;\n const falsePositiveMatch = output.match(/FALSE_POSITIVE:\\s*(.+?)(?:\\n|$)/i);\n if (falsePositiveMatch) {\n return {\n falsePositive: true,\n falsePositiveReason: falsePositiveMatch[1].trim(),\n };\n }\n\n // Also check for the structured marker\n if (output.includes('###FALSE_POSITIVE###')) {\n const reasonMatch = output.match(/###FALSE_POSITIVE###\\s*(.+?)(?:###|$)/s);\n return {\n falsePositive: true,\n falsePositiveReason: reasonMatch ? reasonMatch[1].trim() : 'Bug was determined to be a false positive after code analysis.',\n };\n }\n\n return { falsePositive: false };\n}\n\n/**\n * Build a prompt for agentic bug fixing.\n * This prompt instructs the AI to explore and fix, not just return code.\n * It also instructs the AI to report if the bug is a false positive.\n */\nfunction buildAgenticFixPrompt(bug: Bug): string {\n const evidenceSection = bug.evidence.length > 0\n ? `\\nEVIDENCE:\\n${bug.evidence.map((e) => `- ${e}`).join('\\n')}`\n : '';\n\n const codePathSection = bug.codePath.length > 0\n ? `\\nCODE PATH:\\n${bug.codePath.map((s) => `${s.step}. ${s.file}:${s.line} - ${s.explanation}`).join('\\n')}`\n : '';\n\n return `Analyze and fix this reported bug.\n\nBUG DETAILS:\n- ID: ${bug.id}\n- Title: ${bug.title}\n- File: ${bug.file}\n- Line: ${bug.line}${bug.endLine ? `-${bug.endLine}` : ''}\n- Category: ${bug.category}\n- Severity: ${bug.severity}\n\nDESCRIPTION:\n${bug.description}\n${evidenceSection}\n${codePathSection}\n\nINSTRUCTIONS:\n1. Read the file ${bug.file} to understand the context\n2. Read any related files if needed to understand the full picture\n3. CRITICALLY VERIFY the bug is real:\n - Check for early returns or guard clauses that make the buggy line unreachable\n - Check for validation/sanitization upstream that prevents the issue\n - Check if framework protections make this safe\n - If the bug is NOT real, report it as a false positive (see below)\n4. If the bug IS real, fix it by editing the file directly\n5. Make minimal changes - only fix the identified bug\n6. Do not refactor or improve other code\n7. Preserve existing code style and formatting\n\nFALSE POSITIVE DETECTION:\nIf after analysis you determine this is NOT a real bug, output this marker instead of fixing:\n###FALSE_POSITIVE###\nReason: [Brief explanation of why this is a false positive]\n###\n\nCommon false positive patterns:\n- Early return: \\`if (arr.length === 0) return;\\` makes later \\`arr[0]\\` SAFE\n- Guard clause: \\`if (!user) throw Error();\\` makes later \\`user.name\\` SAFE\n- Upstream validation that the scanner missed\n- Framework auto-sanitization (ORM, templating engine, etc.)\n\nIf it's a real bug, fix it. If it's a false positive, report it with the marker above.`;\n}\n\n/**\n * Generate a simple unified diff between two strings.\n */\nfunction generateSimpleDiff(original: string, modified: string, filename: string): string {\n const origLines = original.split('\\n');\n const modLines = modified.split('\\n');\n\n const diff: string[] = [\n `--- a/${filename}`,\n `+++ b/${filename}`,\n ];\n\n let inHunk = false;\n let hunkStart = -1;\n let hunkLines: string[] = [];\n\n const flushHunk = () => {\n if (hunkLines.length > 0) {\n diff.push(`@@ -${hunkStart + 1} @@`);\n diff.push(...hunkLines);\n hunkLines = [];\n }\n inHunk = false;\n };\n\n const maxLen = Math.max(origLines.length, modLines.length);\n\n for (let i = 0; i < maxLen; i++) {\n const origLine = origLines[i];\n const modLine = modLines[i];\n\n if (origLine === modLine) {\n if (inHunk) {\n // Add context line\n hunkLines.push(` ${origLine || ''}`);\n // End hunk after 3 context lines\n if (hunkLines.filter(l => l.startsWith(' ')).length >= 3) {\n flushHunk();\n }\n }\n } else {\n if (!inHunk) {\n inHunk = true;\n hunkStart = i;\n // Add leading context\n for (let j = Math.max(0, i - 3); j < i; j++) {\n hunkLines.push(` ${origLines[j] || ''}`);\n }\n }\n\n if (origLine !== undefined && modLine === undefined) {\n hunkLines.push(`-${origLine}`);\n } else if (origLine === undefined && modLine !== undefined) {\n hunkLines.push(`+${modLine}`);\n } else if (origLine !== modLine) {\n hunkLines.push(`-${origLine}`);\n hunkLines.push(`+${modLine}`);\n }\n }\n }\n\n flushHunk();\n\n return diff.length > 2 ? diff.join('\\n') : 'No changes detected';\n}\n\nexport async function batchFix(\n bugs: Bug[],\n config: WhiteroseConfig,\n options: FixOptions\n): Promise<Map<string, FixResult>> {\n const results = new Map<string, FixResult>();\n\n for (const bug of bugs) {\n const result = await applyFix(bug, config, options);\n results.set(bug.id, result);\n\n // If any fix fails in non-dry-run mode, stop\n if (!result.success && !options.dryRun) {\n break;\n }\n }\n\n return results;\n}\n","/* @jsxImportSource react */\nimport { render } from 'ink';\nimport { Bug, WhiteroseConfig } from '../types.js';\nimport { App, FixResultInfo } from './App.js';\nimport { applyFix } from '../core/fixer.js';\nimport { removeBugFromAccumulated } from '../core/bug-merger.js';\n\ninterface FixOptions {\n dryRun: boolean;\n branch?: string;\n}\n\nexport async function startFixTUI(\n bugs: Bug[],\n config: WhiteroseConfig,\n options: FixOptions,\n cwd?: string\n): Promise<void> {\n return new Promise((resolve) => {\n const handleFix = async (bug: Bug, onProgress?: (message: string) => void): Promise<FixResultInfo> => {\n const result = await applyFix(bug, config, { ...options, onProgress });\n\n // Handle false positive - return info so UI can show it\n if (result.falsePositive) {\n // Remove from accumulated list since it's not a real bug\n if (cwd) {\n removeBugFromAccumulated(cwd, bug.id);\n }\n return {\n falsePositive: true,\n falsePositiveReason: result.falsePositiveReason,\n };\n }\n\n // Throw on failure so TUI shows error correctly\n if (!result.success) {\n throw new Error(result.error || 'Fix failed');\n }\n\n // Remove bug from accumulated list after successful fix (not dry-run)\n if (!options.dryRun && cwd) {\n removeBugFromAccumulated(cwd, bug.id);\n }\n\n return { falsePositive: false };\n };\n\n const handleExit = () => {\n resolve();\n };\n\n const { waitUntilExit } = render(\n <App\n bugs={bugs}\n config={config}\n fixOptions={options}\n onFix={handleFix}\n onExit={handleExit}\n />\n );\n\n waitUntilExit().then(resolve).catch(() => resolve());\n });\n}\n\n// Also export a simpler non-interactive mode for CI/scripts\nexport { App } from './App.js';\nexport { Dashboard } from './screens/Dashboard.js';\nexport { BugList } from './screens/BugList.js';\nexport { BugDetail } from './screens/BugDetail.js';\nexport { FixConfirm } from './screens/FixConfirm.js';\n","import * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, readdirSync } from 'fs';\nimport { join, resolve, isAbsolute } from 'path';\nimport { execa } from 'execa';\nimport { Bug, ProviderType, BugCategory, ConfidenceLevel, FindingKind } from '../../types.js';\nimport { loadConfig } from '../../core/config.js';\nimport { startFixTUI } from '../../tui/index.js';\nimport { applyFix, sanitizeSarifText, sanitizeSarifEvidence, sanitizeSarifCodePath } from '../../core/fixer.js';\nimport { loadAccumulatedBugs, removeBugFromAccumulated } from '../../core/bug-merger.js';\nimport { detectProvider } from '../../providers/detect.js';\n\ninterface FixOptions {\n dryRun: boolean;\n branch?: string;\n sarif?: string;\n github?: string;\n describe?: boolean;\n provider?: string;\n}\n\nexport async function fixCommand(bugId: string | undefined, options: FixOptions): Promise<void> {\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n\n // ─────────────────────────────────────────────────────────────\n // Provider Selection (first thing!)\n // ─────────────────────────────────────────────────────────────\n let selectedProvider: ProviderType;\n\n if (options.provider) {\n // Use CLI-specified provider\n selectedProvider = options.provider as ProviderType;\n p.log.info(`Using provider: ${chalk.cyan(selectedProvider)}`);\n } else {\n // Detect and prompt for provider\n const detectSpinner = p.spinner();\n detectSpinner.start('Detecting LLM providers...');\n\n const availableProviders = await detectProvider();\n\n if (availableProviders.length === 0) {\n detectSpinner.stop('No providers found');\n p.log.error('No LLM providers detected on your system.');\n console.log();\n console.log(chalk.dim(' Install one of:'));\n console.log(chalk.dim(' - claude-code: ') + chalk.cyan('npm install -g @anthropic-ai/claude-code'));\n console.log(chalk.dim(' - gemini: ') + chalk.cyan('npm install -g @google/gemini-cli'));\n console.log(chalk.dim(' - aider: ') + chalk.cyan('pip install aider-chat'));\n console.log();\n process.exit(1);\n }\n\n detectSpinner.stop(`Found ${availableProviders.length} provider(s)`);\n\n if (availableProviders.length === 1) {\n selectedProvider = availableProviders[0];\n p.log.info(`Using ${chalk.cyan(selectedProvider)}`);\n } else {\n const providerChoice = await p.select({\n message: 'Select LLM provider for fixing bugs',\n options: availableProviders.map((provider) => ({\n value: provider,\n label: provider,\n hint: provider === 'claude-code' ? 'recommended' : undefined,\n })),\n });\n\n if (p.isCancel(providerChoice)) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n\n selectedProvider = providerChoice as ProviderType;\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Source 1: External SARIF file\n // ─────────────────────────────────────────────────────────────\n if (options.sarif) {\n const sarifPath = isAbsolute(options.sarif) ? options.sarif : resolve(cwd, options.sarif);\n\n if (!existsSync(sarifPath)) {\n p.log.error(`SARIF file not found: ${sarifPath}`);\n process.exit(1);\n }\n\n p.intro(chalk.red('whiterose') + chalk.dim(' - fixing bugs from external SARIF'));\n\n const bugs = loadBugsFromSarif(sarifPath);\n if (bugs.length === 0) {\n p.log.success('No bugs found in SARIF file!');\n process.exit(0);\n }\n\n p.log.info(`Loaded ${bugs.length} bugs from ${options.sarif}`);\n\n // Load config if available (for fix options), or use defaults\n const baseConfig = existsSync(whiterosePath)\n ? await loadConfig(cwd)\n : getDefaultConfig();\n const config = { ...baseConfig, provider: selectedProvider };\n\n return await processBugList(bugs, config, options, bugId);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Source 2: GitHub issue\n // ─────────────────────────────────────────────────────────────\n if (options.github) {\n p.intro(chalk.red('whiterose') + chalk.dim(' - fixing bug from GitHub issue'));\n\n const bug = await loadBugFromGitHub(options.github, cwd);\n if (!bug) {\n p.log.error('Failed to parse GitHub issue as a bug');\n process.exit(1);\n }\n\n p.log.info(`Loaded bug from GitHub: ${bug.title}`);\n\n const baseConfig = existsSync(whiterosePath)\n ? await loadConfig(cwd)\n : getDefaultConfig();\n const config = { ...baseConfig, provider: selectedProvider };\n\n return await fixSingleBug(bug, config, options);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Source 3: Manual description (interactive)\n // ─────────────────────────────────────────────────────────────\n if (options.describe) {\n p.intro(chalk.red('whiterose') + chalk.dim(' - fixing manually described bug'));\n\n const bug = await collectManualBugDescription(cwd);\n if (!bug) {\n p.cancel('Bug description cancelled.');\n process.exit(0);\n }\n\n const baseConfig = existsSync(whiterosePath)\n ? await loadConfig(cwd)\n : getDefaultConfig();\n const config = { ...baseConfig, provider: selectedProvider };\n\n return await fixSingleBug(bug, config, options);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Source 4: Default - accumulated whiterose scan results\n // ─────────────────────────────────────────────────────────────\n\n // Check if initialized\n if (!existsSync(whiterosePath)) {\n p.log.error('whiterose is not initialized in this directory.');\n p.log.info('Run \"whiterose init\" first, or use:');\n p.log.info(' --sarif <path> Fix bugs from an external SARIF file');\n p.log.info(' --github <url> Fix bug from a GitHub issue');\n p.log.info(' --describe Manually describe a bug to fix');\n process.exit(1);\n }\n\n // Load config and override provider with selected one\n const baseConfig = await loadConfig(cwd);\n const config = { ...baseConfig, provider: selectedProvider };\n\n // Load accumulated bugs (union of all scans)\n const accumulatedBugs = loadAccumulatedBugs(cwd);\n\n if (accumulatedBugs.bugs.length > 0) {\n p.intro(chalk.red('whiterose') + chalk.dim(' - fixing accumulated bugs'));\n p.log.info(`Found ${accumulatedBugs.bugs.length} accumulated bugs from all scans`);\n return await processBugList(accumulatedBugs.bugs, config, options, bugId, cwd);\n }\n\n // Fallback to SARIF if no accumulated bugs (legacy support)\n const reportsDir = join(whiterosePath, 'reports');\n if (!existsSync(reportsDir)) {\n p.log.error('No scan results found. Run \"whiterose scan\" first.');\n p.log.info('Or use --sarif, --github, or --describe for external bugs.');\n process.exit(1);\n }\n\n // Get latest SARIF file\n const reports = readdirSync(reportsDir)\n .filter((f) => f.endsWith('.sarif'))\n .sort()\n .reverse();\n\n if (reports.length === 0) {\n p.log.error('No scan results found. Run \"whiterose scan\" first.');\n p.log.info('Or use --sarif, --github, or --describe for external bugs.');\n process.exit(1);\n }\n\n const latestReport = join(reportsDir, reports[0]);\n const bugs = loadBugsFromSarif(latestReport);\n\n return await processBugList(bugs, config, options, bugId);\n}\n\n// ─────────────────────────────────────────────────────────────\n// Bug Loading Functions\n// ─────────────────────────────────────────────────────────────\n\nfunction loadBugsFromSarif(sarifPath: string): Bug[] {\n let sarif: any;\n try {\n sarif = JSON.parse(readFileSync(sarifPath, 'utf-8'));\n } catch (error) {\n throw new Error(`Failed to parse SARIF file: ${sarifPath}. File may be corrupted or malformed.`);\n }\n\n // Validate basic SARIF structure\n if (!sarif || typeof sarif !== 'object') {\n throw new Error(`Invalid SARIF file: ${sarifPath}. Expected a JSON object.`);\n }\n\n const runs = sarif.runs;\n if (!Array.isArray(runs) || runs.length === 0) {\n return []; // Valid SARIF with no runs = no bugs\n }\n\n const results = runs[0]?.results;\n if (!Array.isArray(results)) {\n return []; // Valid SARIF with no results = no bugs\n }\n\n return results.map((r: any, i: number) => {\n // Validate r is an object\n if (!r || typeof r !== 'object') {\n throw new Error(`Invalid SARIF result at index ${i}: expected an object.`);\n }\n\n // Try to extract full bug info from SARIF properties if available\n const props = r.properties || {};\n\n // SECURITY: Sanitize untrusted SARIF fields to prevent prompt injection\n // These fields are embedded into LLM prompts and could contain malicious instructions\n const rawTitle = r.message?.text || 'Unknown bug';\n const rawDescription = r.message?.markdown || r.message?.text || '';\n\n // Build raw code path for sanitization\n const rawCodePath = r.codeFlows?.[0]?.threadFlows?.[0]?.locations?.map((loc: any, idx: number) => ({\n step: idx + 1,\n file: loc.location?.physicalLocation?.artifactLocation?.uri || '',\n line: loc.location?.physicalLocation?.region?.startLine || 0,\n code: '',\n explanation: loc.message?.text || '',\n })) || [];\n\n // Extract and validate file path - must be a string\n const rawFile = r.locations?.[0]?.physicalLocation?.artifactLocation?.uri;\n const file = typeof rawFile === 'string' ? rawFile : 'unknown';\n\n // Extract and validate line number - must be a number\n const rawLine = r.locations?.[0]?.physicalLocation?.region?.startLine;\n const line = typeof rawLine === 'number' && Number.isFinite(rawLine) ? Math.floor(rawLine) : 0;\n\n // Extract and validate endLine - must be a number if present\n const rawEndLine = r.locations?.[0]?.physicalLocation?.region?.endLine;\n const endLine = typeof rawEndLine === 'number' && Number.isFinite(rawEndLine) ? Math.floor(rawEndLine) : undefined;\n\n // Validate ruleId is a string if present\n const rawId = r.ruleId;\n const id = typeof rawId === 'string' ? rawId : `WR-${String(i + 1).padStart(3, '0')}`;\n\n // SECURITY: Validate enum fields against allowed values to prevent injection via props\n // These fields are embedded into the agentic prompt and must be validated\n const validatedKind = FindingKind.safeParse(props.kind);\n const validatedCategory = BugCategory.safeParse(props.category);\n const validatedConfidence = ConfidenceLevel.safeParse(props.confidence);\n\n return {\n id,\n title: sanitizeSarifText(String(rawTitle), 'title'),\n description: sanitizeSarifText(String(rawDescription), 'description'),\n file,\n line,\n endLine,\n kind: validatedKind.success ? validatedKind.data : 'bug',\n severity: mapSarifLevel(r.level),\n category: validatedCategory.success ? validatedCategory.data : 'logic-error',\n confidence: {\n overall: validatedConfidence.success ? validatedConfidence.data : 'medium',\n codePathValidity: typeof props.codePathValidity === 'number' ? props.codePathValidity : 0.8,\n reachability: typeof props.reachability === 'number' ? props.reachability : 0.8,\n intentViolation: typeof props.intentViolation === 'boolean' ? props.intentViolation : false,\n staticToolSignal: typeof props.staticToolSignal === 'boolean' ? props.staticToolSignal : false,\n adversarialSurvived: typeof props.adversarialSurvived === 'boolean' ? props.adversarialSurvived : false,\n },\n codePath: sanitizeSarifCodePath(rawCodePath),\n evidence: sanitizeSarifEvidence(props.evidence),\n suggestedFix: props.suggestedFix ? sanitizeSarifText(String(props.suggestedFix), 'suggestedFix') : undefined,\n createdAt: new Date().toISOString(),\n status: 'open',\n };\n });\n}\n\nasync function loadBugFromGitHub(issueUrl: string, cwd: string): Promise<Bug | null> {\n try {\n // Parse the issue URL: https://github.com/owner/repo/issues/123\n const match = issueUrl.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/issues\\/(\\d+)/);\n if (!match) {\n p.log.error('Invalid GitHub issue URL format. Expected: https://github.com/owner/repo/issues/123');\n return null;\n }\n\n const [, owner, repo, issueNumber] = match;\n\n // Use gh CLI to fetch issue details\n const { stdout } = await execa('gh', [\n 'issue', 'view', issueNumber,\n '--repo', `${owner}/${repo}`,\n '--json', 'title,body,labels'\n ], { cwd });\n\n const issue = JSON.parse(stdout);\n\n // Parse file and line from issue body (common patterns)\n const fileMatch = issue.body?.match(/(?:file|path|location):\\s*[`\"]?([^\\s`\"]+)[`\"]?/i) ||\n issue.body?.match(/```[\\w]*\\n(?:\\/\\/|#)\\s*([^\\s:]+):(\\d+)/);\n const lineMatch = issue.body?.match(/(?:line|L|:)(\\d+)/);\n\n // Determine severity from labels\n let severity: 'critical' | 'high' | 'medium' | 'low' = 'medium';\n const labels = issue.labels?.map((l: any) => l.name.toLowerCase()) || [];\n if (labels.some((l: string) => l.includes('critical') || l.includes('security'))) {\n severity = 'critical';\n } else if (labels.some((l: string) => l.includes('bug') || l.includes('high'))) {\n severity = 'high';\n } else if (labels.some((l: string) => l.includes('low') || l.includes('minor'))) {\n severity = 'low';\n }\n\n // Determine category from labels (using valid BugCategory values)\n let category: Bug['category'] = 'logic-error';\n if (labels.some((l: string) => l.includes('security') || l.includes('injection') || l.includes('xss') || l.includes('sql'))) {\n category = 'injection';\n } else if (labels.some((l: string) => l.includes('auth') || l.includes('permission'))) {\n category = 'auth-bypass';\n } else if (labels.some((l: string) => l.includes('null') || l.includes('undefined'))) {\n category = 'null-reference';\n } else if (labels.some((l: string) => l.includes('async') || l.includes('race') || l.includes('promise'))) {\n category = 'async-issue';\n } else if (labels.some((l: string) => l.includes('leak') || l.includes('memory'))) {\n category = 'resource-leak';\n }\n\n // SECURITY: Sanitize untrusted GitHub issue content to prevent prompt injection\n // Issue title and body are external, low-privilege input that gets embedded\n // in the agentic fix prompt, which runs with elevated write permissions\n const sanitizedTitle = sanitizeSarifText(String(issue.title || ''), 'github.title');\n const sanitizedBody = sanitizeSarifText(String(issue.body || ''), 'github.body');\n\n return {\n id: `GH-${issueNumber}`,\n title: sanitizedTitle,\n description: sanitizedBody || sanitizedTitle,\n file: fileMatch?.[1] || '',\n line: parseInt(lineMatch?.[1] || '1', 10),\n kind: 'bug',\n severity,\n category,\n confidence: {\n overall: 'medium',\n codePathValidity: 0.5,\n reachability: 0.5,\n intentViolation: false,\n staticToolSignal: false,\n adversarialSurvived: false,\n },\n codePath: [],\n evidence: [`GitHub issue: ${issueUrl}`],\n createdAt: new Date().toISOString(),\n status: 'open',\n };\n } catch (error: any) {\n if (error.message?.includes('gh')) {\n p.log.error('GitHub CLI (gh) is required for --github option.');\n p.log.info('Install it: https://cli.github.com/');\n } else {\n p.log.error(`Failed to fetch GitHub issue: ${error.message}`);\n }\n return null;\n }\n}\n\nasync function collectManualBugDescription(cwd: string): Promise<Bug | null> {\n // Get file path\n const file = await p.text({\n message: 'File path containing the bug:',\n placeholder: 'src/components/Button.tsx',\n validate: (value) => {\n if (!value) return 'File path is required';\n const fullPath = isAbsolute(value) ? value : resolve(cwd, value);\n if (!existsSync(fullPath)) return `File not found: ${value}`;\n return undefined;\n },\n });\n\n if (p.isCancel(file)) return null;\n\n // Get line number\n const lineStr = await p.text({\n message: 'Line number (approximate is fine):',\n placeholder: '42',\n validate: (value) => {\n if (!value) return 'Line number is required';\n if (isNaN(parseInt(value, 10))) return 'Must be a number';\n return undefined;\n },\n });\n\n if (p.isCancel(lineStr)) return null;\n\n // Get bug title\n const title = await p.text({\n message: 'Bug title (brief description):',\n placeholder: 'Null reference when user is not logged in',\n });\n\n if (p.isCancel(title)) return null;\n\n // Get detailed description\n const description = await p.text({\n message: 'Detailed description (what happens, how to trigger):',\n placeholder: 'When user.profile is accessed before login check, TypeError is thrown',\n });\n\n if (p.isCancel(description)) return null;\n\n // Get severity\n const severity = await p.select({\n message: 'Bug severity:',\n options: [\n { value: 'critical', label: 'Critical', hint: 'security issue, data loss' },\n { value: 'high', label: 'High', hint: 'crash, incorrect behavior' },\n { value: 'medium', label: 'Medium', hint: 'bug with workaround' },\n { value: 'low', label: 'Low', hint: 'minor issue' },\n ],\n initialValue: 'medium',\n });\n\n if (p.isCancel(severity)) return null;\n\n // Get category (using valid BugCategory enum values)\n const category = await p.select({\n message: 'Bug category:',\n options: [\n { value: 'logic-error', label: 'Logic Error' },\n { value: 'null-reference', label: 'Null Reference' },\n { value: 'injection', label: 'Injection (SQL, XSS, etc.)' },\n { value: 'auth-bypass', label: 'Auth Bypass' },\n { value: 'async-issue', label: 'Async/Race Condition' },\n { value: 'boundary-error', label: 'Boundary/Edge Case' },\n { value: 'type-coercion', label: 'Type Coercion' },\n { value: 'data-validation', label: 'Data Validation' },\n { value: 'resource-leak', label: 'Resource Leak' },\n { value: 'concurrency', label: 'Concurrency' },\n { value: 'intent-violation', label: 'Intent Violation' },\n { value: 'secrets-exposure', label: 'Secrets Exposure' },\n ],\n initialValue: 'logic-error',\n });\n\n if (p.isCancel(category)) return null;\n\n const filePath = isAbsolute(file) ? file : resolve(cwd, file);\n const relativePath = filePath.startsWith(cwd) ? filePath.slice(cwd.length + 1) : filePath;\n\n return {\n id: `MANUAL-${Date.now()}`,\n title: title || 'Manual bug',\n description: description || title || 'Manual bug',\n file: relativePath,\n line: parseInt(lineStr || '1', 10),\n kind: 'bug',\n severity: severity as Bug['severity'],\n category: category as Bug['category'],\n confidence: {\n overall: 'high', // User-reported bugs are high confidence\n codePathValidity: 1,\n reachability: 1,\n intentViolation: true,\n staticToolSignal: false,\n adversarialSurvived: false,\n },\n codePath: [],\n evidence: ['Manually reported by user'],\n createdAt: new Date().toISOString(),\n status: 'open',\n };\n}\n\nfunction getDefaultConfig() {\n // Return minimal config for external bug sources when whiterose isn't initialized\n return {\n version: '1',\n provider: 'claude-code' as const,\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: ['node_modules', 'dist', 'build'],\n priorities: {},\n categories: ['injection', 'auth-bypass', 'secrets-exposure', 'null-reference', 'boundary-error', 'resource-leak', 'async-issue', 'logic-error', 'data-validation', 'type-coercion', 'concurrency', 'intent-violation'],\n minConfidence: 'low' as const,\n staticAnalysis: { typescript: true, eslint: true },\n output: { sarif: true, markdown: true, sarifPath: '.whiterose/reports', markdownPath: 'BUGS.md' },\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Bug Processing Functions\n// ─────────────────────────────────────────────────────────────\n\nasync function processBugList(\n bugs: Bug[],\n config: any,\n options: FixOptions,\n bugId: string | undefined,\n cwd?: string\n): Promise<void> {\n if (bugs.length === 0) {\n p.log.success('No bugs to fix!');\n process.exit(0);\n }\n\n // If specific bug ID provided, fix just that bug\n if (bugId) {\n const bug = bugs.find((b) => b.id === bugId || b.id.toLowerCase() === bugId.toLowerCase());\n if (!bug) {\n p.log.error(`Bug ${bugId} not found.`);\n p.log.info('Available bugs: ' + bugs.map((b) => b.id).join(', '));\n process.exit(1);\n }\n\n return await fixSingleBug(bug, config, options, cwd);\n }\n\n // Launch interactive TUI (pass cwd for bug removal after fix)\n try {\n await startFixTUI(bugs, config, options, cwd);\n } catch (error: any) {\n // If Ink fails (e.g., not a TTY), fall back to simple mode\n if (error.message?.includes('stdin') || error.message?.includes('TTY')) {\n p.log.warn('Interactive mode not available. Use \"whiterose fix <bug-id>\" to fix specific bugs.');\n p.log.info('Available bugs:');\n for (const bug of bugs) {\n const severityColor = bug.severity === 'critical' ? 'red' : bug.severity === 'high' ? 'yellow' : 'blue';\n console.log(` ${chalk[severityColor]('●')} ${bug.id}: ${bug.title}`);\n }\n } else {\n throw error;\n }\n }\n}\n\nasync function fixSingleBug(bug: Bug, config: any, options: FixOptions, cwd?: string): Promise<void> {\n p.intro(chalk.red('whiterose') + chalk.dim(' - fixing bug'));\n\n // Check if file is specified (needed for fixing)\n if (!bug.file) {\n const file = await p.text({\n message: 'File path containing the bug (required for fix):',\n placeholder: 'src/components/Button.tsx',\n });\n\n if (p.isCancel(file) || !file) {\n p.cancel('Fix cancelled - file path required.');\n process.exit(0);\n }\n\n bug.file = file;\n }\n\n // Show bug details\n console.log();\n console.log(chalk.bold(` ${bug.id}: ${bug.title}`));\n console.log(` ${chalk.dim('File:')} ${bug.file}:${bug.line}`);\n console.log(` ${chalk.dim('Severity:')} ${bug.severity}`);\n console.log();\n console.log(` ${bug.description}`);\n console.log();\n\n if (bug.suggestedFix) {\n console.log(chalk.dim(' Suggested fix:'));\n console.log(` ${chalk.green(bug.suggestedFix)}`);\n console.log();\n }\n\n // Confirm fix\n if (!options.dryRun) {\n const confirm = await p.confirm({\n message: 'Apply this fix?',\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.cancel('Fix cancelled.');\n process.exit(0);\n }\n }\n\n // Apply fix\n console.log();\n console.log(chalk.cyan(' ◆ Starting agentic fix...'));\n console.log();\n\n try {\n // Track last message to avoid duplicates\n let lastMessage = '';\n\n // Pass onProgress callback to show streaming updates from the LLM\n const result = await applyFix(bug, config, {\n ...options,\n onProgress: (message) => {\n // Only show if message is different from last (avoid spam)\n if (message !== lastMessage) {\n lastMessage = message;\n // Clear line and show new message (truncate to terminal width)\n const truncated = message.length > 72 ? message.substring(0, 72) + '...' : message;\n process.stdout.write(`\\r\\x1b[K ${chalk.dim('›')} ${chalk.gray(truncated)}`);\n }\n },\n });\n\n // Clear the progress line and show success\n process.stdout.write('\\r\\x1b[K');\n\n if (result.success) {\n console.log(chalk.green(' ✓ Fix applied successfully'));\n\n if (result.diff) {\n console.log();\n console.log(chalk.dim(' Changes:'));\n for (const line of result.diff.split('\\n')) {\n if (line.startsWith('+')) {\n console.log(chalk.green(` ${line}`));\n } else if (line.startsWith('-')) {\n console.log(chalk.red(` ${line}`));\n } else {\n console.log(chalk.dim(` ${line}`));\n }\n }\n console.log();\n }\n\n if (result.branchName) {\n p.log.info(`Changes committed to branch: ${result.branchName}`);\n }\n\n // Remove bug from accumulated list after successful fix (not dry-run)\n if (!options.dryRun && cwd) {\n const removed = removeBugFromAccumulated(cwd, bug.id);\n if (removed) {\n p.log.info(`Bug ${bug.id} removed from accumulated bug list`);\n }\n }\n\n p.outro(chalk.green('Fix complete!'));\n } else {\n console.log(chalk.red(' ✗ Fix failed'));\n p.log.error(result.error || 'Unknown error');\n process.exit(1);\n }\n } catch (error: any) {\n console.log(chalk.red(' ✗ Fix failed'));\n p.log.error(error.message);\n process.exit(1);\n }\n}\n\nfunction mapSarifLevel(level: string): 'critical' | 'high' | 'medium' | 'low' {\n switch (level) {\n case 'error':\n return 'high';\n case 'warning':\n return 'medium';\n case 'note':\n return 'low';\n default:\n return 'medium';\n }\n}\n","import * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { loadConfig } from '../../core/config.js';\nimport { getExecutor } from '../../providers/executors/index.js';\nimport { CoreScanner } from '../../core/scanner.js';\nimport { scanCodebase } from '../../core/scanner/index.js';\nimport { generateIntentDocument } from '../../core/contracts/intent.js';\n\ninterface RefreshOptions {\n keepConfig: boolean;\n}\n\nexport async function refreshCommand(_options: RefreshOptions): Promise<void> {\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n\n // Check if initialized\n if (!existsSync(whiterosePath)) {\n p.log.error('whiterose is not initialized in this directory.');\n p.log.info('Run \"whiterose init\" first.');\n process.exit(1);\n }\n\n p.intro(chalk.red('whiterose') + chalk.dim(' - refreshing understanding'));\n\n // Load config\n const config = await loadConfig(cwd);\n\n // Scan codebase\n const scanSpinner = p.spinner();\n scanSpinner.start('Scanning codebase...');\n const files = await scanCodebase(cwd, config);\n scanSpinner.stop(`Found ${files.length} source files`);\n\n // Generate new understanding\n const understandingSpinner = p.spinner();\n understandingSpinner.start('Regenerating understanding with AI...');\n\n try {\n const executor = getExecutor(config.provider);\n const scanner = new CoreScanner(executor, {}, {\n onProgress: (message: string) => {\n if (message.trim()) {\n understandingSpinner.message(message);\n }\n },\n });\n const understanding = await scanner.generateUnderstanding(files);\n\n // Write new understanding\n writeFileSync(\n join(whiterosePath, 'cache', 'understanding.json'),\n JSON.stringify(understanding, null, 2),\n 'utf-8'\n );\n\n // Regenerate intent.md\n const intentDoc = generateIntentDocument(understanding);\n writeFileSync(join(whiterosePath, 'intent.md'), intentDoc, 'utf-8');\n\n // Reset file hashes\n writeFileSync(\n join(whiterosePath, 'cache', 'file-hashes.json'),\n JSON.stringify({ version: '1', fileHashes: [], lastFullScan: new Date().toISOString() }, null, 2),\n 'utf-8'\n );\n\n understandingSpinner.stop('Understanding regenerated');\n } catch (error) {\n understandingSpinner.stop('Failed to regenerate understanding');\n p.log.error(String(error));\n process.exit(1);\n }\n\n p.outro(chalk.green('Refresh complete!'));\n}\n","import * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, readdirSync, statSync } from 'fs';\nimport { join, basename } from 'path';\nimport { loadConfig, loadUnderstanding } from '../../core/config.js';\nimport { detectProvider } from '../../providers/detect.js';\nimport { getAccumulatedBugsStats } from '../../core/bug-merger.js';\nimport { ScanResult } from '../../types.js';\nimport { renderScanCard, renderStatusCard, CardData } from '../components/card.js';\nimport { formatDuration } from '../components/progress.js';\n\n/**\n * Get repository name from git or directory name\n */\nfunction getRepoName(cwd: string): string {\n try {\n const gitConfigPath = join(cwd, '.git', 'config');\n if (existsSync(gitConfigPath)) {\n const config = readFileSync(gitConfigPath, 'utf-8');\n const match = config.match(/url\\s*=\\s*.*[/:]([^/]+?)(?:\\.git)?$/m);\n if (match) return match[1];\n }\n } catch {\n // Fall through to basename\n }\n return basename(cwd);\n}\n\nexport async function statusCommand(): Promise<void> {\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n\n // Check if initialized\n if (!existsSync(whiterosePath)) {\n p.log.error('whiterose is not initialized in this directory.');\n p.log.info('Run \"whiterose init\" first.');\n process.exit(1);\n }\n\n console.log();\n console.log(chalk.red.bold('whiterose') + chalk.dim(' status'));\n console.log();\n\n // Load config\n const config = await loadConfig(cwd);\n const repoName = getRepoName(cwd);\n\n // Try to load last scan result for the card\n const lastScanPath = join(whiterosePath, 'last-scan.json');\n let lastScan: ScanResult | null = null;\n\n if (existsSync(lastScanPath)) {\n try {\n lastScan = JSON.parse(readFileSync(lastScanPath, 'utf-8')) as ScanResult;\n } catch {\n // Corrupted file, ignore\n }\n }\n\n // Show the card if we have a recent scan\n if (lastScan && lastScan.meta) {\n const cardData: CardData = {\n meta: lastScan.meta,\n bugs: lastScan.summary.bugs,\n smells: lastScan.summary.smells,\n reportPath: './whiterose-output/bugs-human.md',\n };\n console.log(renderScanCard(cardData));\n console.log();\n console.log(chalk.dim(`Last scan: ${new Date(lastScan.timestamp).toLocaleString()}`));\n } else {\n // Show minimal status card\n const bugStats = getAccumulatedBugsStats(cwd);\n const totalBugs = bugStats.bySeverity ? Object.values(bugStats.bySeverity).reduce((a, b) => a + b, 0) : 0;\n\n console.log(renderStatusCard(\n repoName,\n config.provider,\n totalBugs,\n 0, // No smell tracking in accumulated bugs\n bugStats.lastUpdated ? new Date(bugStats.lastUpdated).toLocaleDateString() : undefined\n ));\n }\n\n console.log();\n\n // Detect available providers\n const availableProviders = await detectProvider();\n\n console.log(chalk.dim('Configuration'));\n console.log(` Provider: ${config.provider}`);\n console.log(` Available: ${availableProviders.join(', ') || 'none'}`);\n console.log();\n\n // Load understanding if available\n const understanding = await loadUnderstanding(cwd);\n if (understanding) {\n console.log(chalk.dim('Codebase'));\n console.log(` Type: ${understanding.summary.type}`);\n console.log(` Framework: ${understanding.summary.framework || 'none'}`);\n console.log(` Files: ${understanding.structure.totalFiles}`);\n console.log(` Features: ${understanding.features.length}`);\n console.log(` Contracts: ${understanding.contracts.length}`);\n console.log();\n }\n\n // Check cache status\n const hashesPath = join(whiterosePath, 'cache', 'file-hashes.json');\n if (existsSync(hashesPath)) {\n try {\n const hashes = JSON.parse(readFileSync(hashesPath, 'utf-8'));\n console.log(chalk.dim('Cache'));\n console.log(` Files tracked: ${hashes.fileHashes?.length || 0}`);\n console.log(` Last full: ${hashes.lastFullScan ? new Date(hashes.lastFullScan).toLocaleDateString() : 'never'}`);\n console.log();\n } catch {\n // Corrupted cache file, skip\n }\n }\n\n // Footer\n const bugStats = getAccumulatedBugsStats(cwd);\n if (bugStats.total > 0) {\n console.log(chalk.dim('Run \"whiterose fix\" to fix bugs, or \"whiterose clear\" to reset'));\n } else {\n console.log(chalk.dim('Run \"whiterose scan\" to scan for bugs'));\n }\n console.log();\n}\n","import * as p from '@clack/prompts';\nimport { existsSync, readFileSync, writeFileSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { outputMarkdown } from '../../output/markdown.js';\nimport { ScanResult, Bug } from '../../types.js';\n\ninterface ReportOptions {\n output: string;\n format: 'markdown' | 'sarif' | 'json';\n}\n\nexport async function reportCommand(options: ReportOptions): Promise<void> {\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n\n // Check if initialized\n if (!existsSync(whiterosePath)) {\n p.log.error('whiterose is not initialized in this directory.');\n p.log.info('Run \"whiterose init\" first.');\n process.exit(1);\n }\n\n // Find latest scan result\n const reportsDir = join(whiterosePath, 'reports');\n if (!existsSync(reportsDir)) {\n p.log.error('No scan results found. Run \"whiterose scan\" first.');\n process.exit(1);\n }\n\n const reports = readdirSync(reportsDir)\n .filter((f) => f.endsWith('.sarif'))\n .sort()\n .reverse();\n\n if (reports.length === 0) {\n p.log.error('No scan results found. Run \"whiterose scan\" first.');\n process.exit(1);\n }\n\n const latestReport = join(reportsDir, reports[0]);\n let sarif: any;\n try {\n sarif = JSON.parse(readFileSync(latestReport, 'utf-8'));\n } catch (error) {\n p.log.error(`Failed to parse SARIF report: ${latestReport}`);\n process.exit(1);\n }\n\n // Convert SARIF to ScanResult\n const bugs: Bug[] = sarif.runs?.[0]?.results?.map((r: any, i: number) => ({\n id: r.ruleId || `WR-${String(i + 1).padStart(3, '0')}`,\n title: r.message?.text || 'Unknown bug',\n description: r.message?.markdown || r.message?.text || '',\n file: r.locations?.[0]?.physicalLocation?.artifactLocation?.uri || 'unknown',\n line: r.locations?.[0]?.physicalLocation?.region?.startLine || 0,\n kind: 'bug',\n severity: r.level === 'error' ? 'high' : r.level === 'warning' ? 'medium' : 'low',\n category: 'logic-error',\n confidence: { overall: 'high', codePathValidity: 0.9, reachability: 0.9, intentViolation: false, staticToolSignal: false, adversarialSurvived: true },\n codePath: [],\n evidence: [],\n createdAt: new Date().toISOString(),\n status: 'open',\n })) || [];\n\n const bugItems = bugs.filter((b) => b.kind === 'bug');\n const smellItems = bugs.filter((b) => b.kind === 'smell');\n\n const result: ScanResult = {\n id: 'report',\n timestamp: new Date().toISOString(),\n scanType: 'full',\n filesScanned: 0,\n duration: 0,\n bugs,\n summary: {\n bugs: {\n critical: bugItems.filter((b) => b.severity === 'critical').length,\n high: bugItems.filter((b) => b.severity === 'high').length,\n medium: bugItems.filter((b) => b.severity === 'medium').length,\n low: bugItems.filter((b) => b.severity === 'low').length,\n total: bugItems.length,\n },\n smells: {\n critical: smellItems.filter((b) => b.severity === 'critical').length,\n high: smellItems.filter((b) => b.severity === 'high').length,\n medium: smellItems.filter((b) => b.severity === 'medium').length,\n low: smellItems.filter((b) => b.severity === 'low').length,\n total: smellItems.length,\n },\n total: bugs.length,\n },\n };\n\n // Generate output\n let output: string;\n switch (options.format) {\n case 'markdown':\n output = outputMarkdown(result);\n break;\n case 'sarif':\n output = readFileSync(latestReport, 'utf-8');\n break;\n case 'json':\n output = JSON.stringify(result, null, 2);\n break;\n default:\n output = outputMarkdown(result);\n }\n\n // Write or print\n if (options.output === '-') {\n console.log(output);\n } else {\n writeFileSync(options.output, output);\n p.log.success(`Report written to ${options.output}`);\n }\n}\n","import * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport { existsSync, rmSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { clearAccumulatedBugs, getAccumulatedBugsStats } from '../../core/bug-merger.js';\n\ninterface ClearOptions {\n force: boolean;\n}\n\nexport async function clearCommand(options: ClearOptions): Promise<void> {\n const cwd = process.cwd();\n const whiterosePath = join(cwd, '.whiterose');\n\n // Check if initialized\n if (!existsSync(whiterosePath)) {\n p.log.error('whiterose is not initialized in this directory.');\n p.log.info('Run \"whiterose init\" first.');\n process.exit(1);\n }\n\n // Get current stats\n const stats = getAccumulatedBugsStats(cwd);\n\n if (stats.total === 0) {\n p.log.info('No accumulated bugs to clear.');\n process.exit(0);\n }\n\n p.intro(chalk.red('whiterose') + chalk.dim(' - clear accumulated bugs'));\n\n // Show current state\n console.log();\n console.log(chalk.bold(' Current accumulated bugs:'));\n console.log(` Total: ${stats.total}`);\n if (Object.keys(stats.bySeverity).length > 0) {\n console.log(' By severity:');\n for (const [severity, count] of Object.entries(stats.bySeverity)) {\n const color = severity === 'critical' ? 'red' : severity === 'high' ? 'yellow' : 'blue';\n console.log(` ${chalk[color]('●')} ${severity}: ${count}`);\n }\n }\n console.log(` Last updated: ${new Date(stats.lastUpdated).toLocaleString()}`);\n console.log();\n\n // Confirm unless --force\n if (!options.force) {\n const confirm = await p.confirm({\n message: `Clear all ${stats.total} accumulated bugs?`,\n initialValue: false,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.cancel('Clear cancelled.');\n process.exit(0);\n }\n }\n\n // Clear the bugs\n clearAccumulatedBugs(cwd);\n\n // Also clear SARIF reports (fallback source for fix command)\n const reportsDir = join(whiterosePath, 'reports');\n if (existsSync(reportsDir)) {\n const sarifFiles = readdirSync(reportsDir).filter(f => f.endsWith('.sarif'));\n for (const file of sarifFiles) {\n rmSync(join(reportsDir, file));\n }\n if (sarifFiles.length > 0) {\n p.log.info(`Cleared ${sarifFiles.length} SARIF report(s).`);\n }\n }\n\n // Clear output directory\n const outputDir = join(cwd, 'whiterose-output');\n if (existsSync(outputDir)) {\n rmSync(outputDir, { recursive: true });\n p.log.info('Cleared whiterose-output directory.');\n }\n\n p.log.success(`Cleared ${stats.total} accumulated bugs.`);\n p.log.info('Run \"whiterose scan\" to start fresh.');\n\n p.outro(chalk.green('Done'));\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as p from '@clack/prompts';\nimport { existsSync, readFileSync } from 'fs';\nimport { join, basename, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { initCommand } from './commands/init.js';\nimport { scanCommand } from './commands/scan.js';\nimport { fixCommand } from './commands/fix.js';\nimport { refreshCommand } from './commands/refresh.js';\nimport { statusCommand } from './commands/status.js';\nimport { reportCommand } from './commands/report.js';\nimport { clearCommand } from './commands/clear.js';\nimport { detectProvider } from '../providers/detect.js';\nimport { ProviderType } from '../types.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst pkg = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));\n\n// Increase max listeners to avoid warning when spawning multiple child processes\nprocess.setMaxListeners(50);\n\nconst BANNER = `\n${chalk.red('██╗ ██╗██╗ ██╗██╗████████╗███████╗██████╗ ██████╗ ███████╗███████╗')}\n${chalk.red('██║ ██║██║ ██║██║╚══██╔══╝██╔════╝██╔══██╗██╔═══██╗██╔════╝██╔════╝')}\n${chalk.red('██║ █╗ ██║███████║██║ ██║ █████╗ ██████╔╝██║ ██║███████╗█████╗ ')}\n${chalk.red('██║███╗██║██╔══██║██║ ██║ ██╔══╝ ██╔══██╗██║ ██║╚════██║██╔══╝ ')}\n${chalk.red('╚███╔███╔╝██║ ██║██║ ██║ ███████╗██║ ██║╚██████╔╝███████║███████╗')}\n${chalk.red(' ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚══════╝')}\n\n${chalk.dim(' \"I\\'ve been staring at your code for a long time.\"')}\n`;\n\nconst program = new Command();\n\nprogram\n .name('whiterose')\n .description('AI-powered bug hunter that uses your existing LLM subscription')\n .version(pkg.version)\n .hook('preAction', () => {\n // Show banner only for main commands, not help\n const args = process.argv.slice(2);\n if (!args.includes('--help') && !args.includes('-h') && args.length > 0) {\n console.log(BANNER);\n }\n });\n\n// ─────────────────────────────────────────────────────────────\n// init - First-time setup with intelligent onboarding\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('init')\n .description('Initialize whiterose for this project (scans codebase, generates config)')\n .option('-p, --provider <provider>', 'LLM provider to use', 'claude-code')\n .option('--force', 'Overwrite existing .whiterose directory')\n .option('--ci', 'CI mode: non-interactive, use defaults (same as --skip-questions)')\n .option('--skip-questions', 'Skip interactive questions, use defaults')\n .action(initCommand);\n\n// ─────────────────────────────────────────────────────────────\n// scan - Find bugs\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('scan [paths...]')\n .description('Scan for bugs in the codebase (includes inline validation)')\n .option('-f, --full', 'Force full scan (ignore cache)')\n .option('--json', 'Output as JSON only')\n .option('--sarif', 'Output as SARIF only')\n .option('-p, --provider <provider>', 'Override LLM provider')\n .option('-c, --category <categories...>', 'Filter by bug categories')\n .option('--min-confidence <level>', 'Minimum confidence level to report', 'low')\n .option('--ci', 'CI mode: non-interactive, exit code 1 if bugs found (for CI/CD and git hooks)')\n .option('--quick', 'Quick scan: fast parallel analysis without init (for pre-commit hooks)')\n .option('--phase <phase>', 'Run specific phase only: unit, integration, e2e, or all (default: all)')\n .action(scanCommand);\n\n// ─────────────────────────────────────────────────────────────\n// fix - Interactive bug fixing TUI\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('fix [bugId]')\n .description('Fix bugs interactively or by ID')\n .option('-p, --provider <provider>', 'LLM provider to use for fixing')\n .option('--dry-run', 'Show proposed fixes without applying')\n .option('--branch <name>', 'Create fixes in a new branch')\n .option('--sarif <path>', 'Load bugs from an external SARIF file')\n .option('--github <url>', 'Load bug from a GitHub issue URL')\n .option('--describe', 'Manually describe a bug to fix')\n .option('--unsafe', 'Skip all permission prompts (full trust mode)')\n .action(fixCommand);\n\n// ─────────────────────────────────────────────────────────────\n// refresh - Rebuild understanding from scratch\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('refresh')\n .description('Rebuild codebase understanding from scratch')\n .option('--keep-config', 'Keep existing config, only regenerate understanding')\n .action(refreshCommand);\n\n// ─────────────────────────────────────────────────────────────\n// status - Show cache and scan status\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('status')\n .description('Show whiterose status (cache, last scan, provider)')\n .action(statusCommand);\n\n// ─────────────────────────────────────────────────────────────\n// report - Generate bug report\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('report')\n .description('Generate BUGS.md from last scan')\n .option('-o, --output <path>', 'Output path', 'BUGS.md')\n .option('--format <format>', 'Output format (markdown, sarif, json)', 'markdown')\n .action(reportCommand);\n\n// ─────────────────────────────────────────────────────────────\n// clear - Clear accumulated bugs\n// ─────────────────────────────────────────────────────────────\nprogram\n .command('clear')\n .description('Clear accumulated bug list (start fresh)')\n .option('--force', 'Skip confirmation prompt')\n .action(clearCommand);\n\n// ─────────────────────────────────────────────────────────────\n// Auto-run: Minimal questions, maximum action\n// ─────────────────────────────────────────────────────────────\nasync function autoRun(): Promise<void> {\n console.log(BANNER);\n\n p.intro(chalk.red('whiterose') + chalk.dim(' - AI Bug Hunter'));\n\n // Check if current directory looks like a project\n const cwd = process.cwd();\n const looksLikeProject = existsSync(join(cwd, 'package.json')) ||\n existsSync(join(cwd, 'go.mod')) ||\n existsSync(join(cwd, 'Cargo.toml')) ||\n existsSync(join(cwd, 'requirements.txt')) ||\n existsSync(join(cwd, 'pyproject.toml')) ||\n existsSync(join(cwd, '.git')) ||\n existsSync(join(cwd, 'src'));\n\n let targetPath = cwd;\n\n // If current dir doesn't look like a project, ask for path\n if (!looksLikeProject) {\n const { pathInput } = await import('./utils/path-input.js');\n const inputPath = await pathInput({\n message: 'Enter project path',\n defaultValue: cwd,\n validate: (value) => {\n const path = value || cwd;\n if (!existsSync(path)) {\n return 'Directory does not exist';\n }\n return undefined;\n },\n });\n\n if (inputPath === null) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n\n targetPath = inputPath || cwd;\n process.chdir(targetPath);\n }\n\n const projectName = basename(targetPath);\n const whiterosePath = join(targetPath, '.whiterose');\n const isInitialized = existsSync(whiterosePath);\n\n // ─────────────────────────────────────────────────────────────\n // Detect and select provider\n // ─────────────────────────────────────────────────────────────\n const detectSpinner = p.spinner();\n detectSpinner.start('Detecting LLM providers...');\n\n const availableProviders = await detectProvider();\n\n if (availableProviders.length === 0) {\n detectSpinner.stop('No providers found');\n p.log.error('No LLM providers detected on your system.');\n console.log();\n console.log(chalk.dim(' Install one of:'));\n console.log(chalk.dim(' - claude-code: ') + chalk.cyan('npm install -g @anthropic-ai/claude-code'));\n console.log(chalk.dim(' - aider: ') + chalk.cyan('pip install aider-chat'));\n console.log();\n process.exit(1);\n }\n\n detectSpinner.stop(`Found ${availableProviders.length} provider(s)`);\n\n let selectedProvider: ProviderType;\n\n if (availableProviders.length === 1) {\n selectedProvider = availableProviders[0];\n p.log.info(`Using ${chalk.cyan(selectedProvider)}`);\n } else {\n const providerChoice = await p.select({\n message: 'Select LLM provider',\n options: availableProviders.map((provider) => ({\n value: provider,\n label: provider,\n hint: provider === 'claude-code' ? 'recommended' : undefined,\n })),\n });\n\n if (p.isCancel(providerChoice)) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n\n selectedProvider = providerChoice as ProviderType;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Auto-initialize if needed\n // ─────────────────────────────────────────────────────────────\n if (!isInitialized) {\n p.log.step(`Initializing whiterose for \"${projectName}\"...`);\n console.log();\n\n await initCommand({\n provider: selectedProvider,\n skipQuestions: true, // No questions, use defaults\n force: false,\n unsafe: false,\n skipProviderDetection: true,\n });\n\n console.log();\n }\n\n // ─────────────────────────────────────────────────────────────\n // Start bug hunting\n // ─────────────────────────────────────────────────────────────\n p.log.step('Starting bug hunt...');\n console.log();\n\n await scanCommand([], {\n full: true,\n json: false,\n sarif: false,\n provider: selectedProvider,\n category: undefined,\n minConfidence: 'low',\n });\n}\n\n// Auto-run when no command provided\nif (process.argv.length === 2) {\n autoRun().catch((error) => {\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n });\n} else {\n program.parse();\n}\n"]}
|