pinata-security-cli 0.2.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -5
- package/dist/cli/index.js +1395 -197
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/categories/definitions/security/dependency-risks.yml +70 -0
- package/src/categories/definitions/security/hardcoded-secrets.yml +43 -0
- package/src/categories/definitions/security/prompt-injection.yml +384 -0
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/errors.ts","../../src/lib/result.ts","../../src/core/scanner/types.ts","../../src/cli/results-cache.ts","../../src/cli/html-formatter.ts","../../src/cli/junit-formatter.ts","../../src/core/verifier/ai-verifier.ts","../../src/core/verifier/index.ts","../../src/cli/tui/App.tsx","../../src/cli/tui/index.tsx","../../src/cli/config.ts","../../src/categories/schema/category.schema.ts","../../src/categories/schema/example.schema.ts","../../src/categories/schema/pattern.schema.ts","../../src/categories/schema/template.schema.ts","../../src/categories/schema/index.ts","../../src/categories/store/category-store.ts","../../src/core/detection/pattern-matcher.ts","../../src/lib/logger.ts","../../src/core/detection/ast-parser.ts","../../src/core/scanner/scanner.ts","../../src/core/scanner/index.ts","../../src/core/index.ts","../../src/lib/index.ts","../../src/templates/renderer.ts","../../src/cli/formatters.ts","../../src/cli/generate-formatters.ts","../../src/ai/service.ts","../../src/ai/template-filler.ts","../../src/ai/explainer.ts","../../src/ai/pattern-suggester.ts","../../src/cli/index.ts","../../src/cli/scan-formatters.ts"],"names":["resolve","mkdir","writeFile","readFile","config","path","SEVERITY_COLORS","jsx","join","z","ID_PATTERN","chalk","__filename","__dirname","existsSync","TreeSitterParser","TreeSitterLanguage","TreeSitterQuery","stat","readFileSync","readdir","extname","homedir","relative","dirname","basename","SYSTEM_PROMPT","DOMAIN_COLORS","formatHtml","formatJunit","fileURLToPath","AIVerifier","runDashboard","setConfigValue","validateApiKey","maskApiKey","getConfigPath","loadConfig","hasApiKey","deleteConfigValue"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base error class for all Pinata errors\n */\nexport class PinataError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly context?: Record<string, unknown>\n ) {\n super(message);\n this.name = \"PinataError\";\n // Maintains proper stack trace for where error was thrown (V8 only)\n Error.captureStackTrace?.(this, this.constructor);\n }\n\n /**\n * Serialize error for logging or API responses\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n context: this.context,\n };\n }\n}\n\n/**\n * Error for schema validation failures\n */\nexport class ValidationError extends PinataError {\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, \"VALIDATION_ERROR\", context);\n this.name = \"ValidationError\";\n }\n}\n\n/**\n * Error for file/code parsing failures\n */\nexport class ParseError extends PinataError {\n constructor(\n message: string,\n public readonly filePath: string,\n public readonly line?: number,\n context?: Record<string, unknown>\n ) {\n super(message, \"PARSE_ERROR\", { ...context, filePath, line });\n this.name = \"ParseError\";\n }\n}\n\n/**\n * Error for configuration issues\n */\nexport class ConfigError extends PinataError {\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, \"CONFIG_ERROR\", context);\n this.name = \"ConfigError\";\n }\n}\n\n/**\n * Error during codebase analysis\n */\nexport class AnalysisError extends PinataError {\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, \"ANALYSIS_ERROR\", context);\n this.name = \"AnalysisError\";\n }\n}\n\n/**\n * Error during test generation\n */\nexport class GenerationError extends PinataError {\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, \"GENERATION_ERROR\", context);\n this.name = \"GenerationError\";\n }\n}\n\n/**\n * Error for category not found\n */\nexport class CategoryNotFoundError extends PinataError {\n constructor(categoryId: string) {\n super(`Category not found: ${categoryId}`, \"CATEGORY_NOT_FOUND\", { categoryId });\n this.name = \"CategoryNotFoundError\";\n }\n}\n\n/**\n * Error for pattern not found\n */\nexport class PatternNotFoundError extends PinataError {\n constructor(patternId: string) {\n super(`Pattern not found: ${patternId}`, \"PATTERN_NOT_FOUND\", { patternId });\n this.name = \"PatternNotFoundError\";\n }\n}\n","/**\n * Result type for operations that can fail\n * Prefer this over throwing exceptions for expected failures\n */\nexport type Result<T, E = Error> =\n | { success: true; data: T }\n | { success: false; error: E };\n\n/**\n * Create a successful result\n */\nexport function ok<T>(data: T): Result<T, never> {\n return { success: true, data };\n}\n\n/**\n * Create a failed result\n */\nexport function err<E>(error: E): Result<never, E> {\n return { success: false, error };\n}\n\n/**\n * Unwrap a result, throwing if it's an error\n * Use sparingly - prefer pattern matching with if/else\n */\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.success) {\n return result.data;\n }\n throw result.error;\n}\n\n/**\n * Unwrap a result with a default value for errors\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n if (result.success) {\n return result.data;\n }\n return defaultValue;\n}\n\n/**\n * Map over a successful result\n */\nexport function map<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => U\n): Result<U, E> {\n if (result.success) {\n return ok(fn(result.data));\n }\n return result;\n}\n\n/**\n * Map over a failed result\n */\nexport function mapErr<T, E, F>(\n result: Result<T, E>,\n fn: (error: E) => F\n): Result<T, F> {\n if (!result.success) {\n return err(fn(result.error));\n }\n return result;\n}\n\n/**\n * Chain results together (flatMap)\n */\nexport function andThen<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => Result<U, E>\n): Result<U, E> {\n if (result.success) {\n return fn(result.data);\n }\n return result;\n}\n\n/**\n * Combine multiple results into one\n * Returns first error if any fail, otherwise returns array of all values\n */\nexport function all<T, E>(results: Result<T, E>[]): Result<T[], E> {\n const values: T[] = [];\n for (const result of results) {\n if (!result.success) {\n return result;\n }\n values.push(result.data);\n }\n return ok(values);\n}\n\n/**\n * Try to execute a function, returning a Result\n */\nexport function tryCatch<T>(fn: () => T): Result<T, Error> {\n try {\n return ok(fn());\n } catch (e) {\n return err(e instanceof Error ? e : new Error(String(e)));\n }\n}\n\n/**\n * Try to execute an async function, returning a Result\n */\nexport async function tryCatchAsync<T>(\n fn: () => Promise<T>\n): Promise<Result<T, Error>> {\n try {\n return ok(await fn());\n } catch (e) {\n return err(e instanceof Error ? e : new Error(String(e)));\n }\n}\n","/**\n * Scanner types and schemas\n *\n * Defines the data structures for codebase scanning results,\n * gap detection, coverage metrics, and Pinata Score calculation.\n */\n\nimport { z } from \"zod\";\n\nimport type {\n RiskDomain,\n TestLevel,\n Language,\n Priority,\n Severity,\n Confidence,\n DetectionResult,\n} from \"../../categories/schema/index.js\";\n\n/**\n * Options for scanning a codebase\n */\nexport interface ScannerOptions {\n /** Base directory to scan */\n targetDirectory: string;\n /** Directories to exclude from scanning */\n excludeDirs?: string[];\n /** File extensions to include */\n includeExtensions?: string[];\n /** Maximum file size to scan in bytes */\n maxFileSize?: number;\n /** Maximum depth for directory traversal (-1 for unlimited) */\n maxDepth?: number;\n /** Category IDs to scan for (empty = all) */\n categoryIds?: string[];\n /** Risk domains to scan for (empty = all) */\n domains?: RiskDomain[];\n /** Minimum severity to report */\n minSeverity?: Severity;\n /** Minimum confidence to report */\n minConfidence?: Confidence;\n /** Whether to detect existing test files */\n detectTestFiles?: boolean;\n /** Custom test file patterns (e.g., ['*.test.ts', 'test_*.py']) */\n testFilePatterns?: string[];\n}\n\n/**\n * A detected gap (missing test coverage)\n */\nexport interface Gap {\n /** Category ID this gap relates to */\n categoryId: string;\n /** Category name for display */\n categoryName: string;\n /** Risk domain */\n domain: RiskDomain;\n /** Test level */\n level: TestLevel;\n /** Priority of addressing this gap */\n priority: Priority;\n /** Severity if exploited */\n severity: Severity;\n /** Detection confidence */\n confidence: Confidence;\n /** File where the gap was detected */\n filePath: string;\n /** Line number in file */\n lineStart: number;\n /** End line number */\n lineEnd: number;\n /** Column start */\n columnStart: number;\n /** Column end */\n columnEnd: number;\n /** Code snippet showing the gap */\n codeSnippet: string;\n /** Pattern ID that detected this */\n patternId: string;\n /** Detection type used */\n patternType: \"regex\" | \"ast\" | \"semantic\";\n /** Weighted score for prioritization (severity × confidence) */\n priorityScore: number;\n}\n\n/**\n * Coverage metrics for a single risk domain\n */\nexport interface DomainCoverage {\n /** Risk domain */\n domain: RiskDomain;\n /** Number of categories scanned */\n categoriesScanned: number;\n /** Number of categories with gaps */\n categoriesWithGaps: number;\n /** Number of categories fully covered */\n categoriesCovered: number;\n /** Coverage percentage (0-100) */\n coveragePercent: number;\n /** Total gaps in this domain */\n totalGaps: number;\n /** Critical gaps in this domain */\n criticalGaps: number;\n}\n\n/**\n * Coverage metrics across all domains\n */\nexport interface CoverageMetrics {\n /** Per-domain coverage */\n byDomain: Map<RiskDomain, DomainCoverage>;\n /** Per-level coverage */\n byLevel: Map<TestLevel, { scanned: number; withGaps: number; covered: number }>;\n /** Overall coverage percentage */\n overallCoverage: number;\n /** Total categories scanned */\n totalCategories: number;\n /** Categories with detected gaps */\n categoriesWithGaps: number;\n /** Categories with no gaps detected */\n categoriesCovered: number;\n}\n\n/**\n * File statistics from the scan\n */\nexport interface FileStats {\n /** Total files scanned */\n totalFiles: number;\n /** Files with detected gaps */\n filesWithGaps: number;\n /** Files by language */\n byLanguage: Map<Language, number>;\n /** Test files detected */\n testFiles: number;\n /** Source files (non-test) */\n sourceFiles: number;\n /** Files skipped (too large, binary, etc.) */\n skippedFiles: number;\n /** Total lines of code scanned */\n totalLinesOfCode: number;\n}\n\n/**\n * Pinata Score breakdown\n */\nexport interface PinataScore {\n /** Overall score (0-100) */\n overall: number;\n /** Letter grade (A-F) */\n grade: \"A\" | \"B\" | \"C\" | \"D\" | \"F\";\n /** Score breakdown by domain */\n byDomain: Map<RiskDomain, number>;\n /** Score breakdown by severity */\n bySeverity: {\n critical: number;\n high: number;\n medium: number;\n low: number;\n };\n /** Factors that decreased the score */\n penalties: Array<{\n reason: string;\n points: number;\n categoryId?: string;\n }>;\n /** Factors that increased the score */\n bonuses: Array<{\n reason: string;\n points: number;\n }>;\n}\n\n/**\n * Complete scan result\n */\nexport interface ScanResult {\n /** Target directory that was scanned */\n targetDirectory: string;\n /** When the scan started */\n startedAt: Date;\n /** When the scan completed */\n completedAt: Date;\n /** Duration in milliseconds */\n durationMs: number;\n /** All detected gaps, sorted by priority */\n gaps: Gap[];\n /** Gaps grouped by category */\n gapsByCategory: Map<string, Gap[]>;\n /** Gaps grouped by file */\n gapsByFile: Map<string, Gap[]>;\n /** Coverage metrics */\n coverage: CoverageMetrics;\n /** File statistics */\n fileStats: FileStats;\n /** Pinata Score */\n score: PinataScore;\n /** Warnings encountered during scan */\n warnings: string[];\n /** Categories that were scanned */\n categoriesScanned: string[];\n /** Summary for quick display */\n summary: ScanSummary;\n}\n\n/**\n * Quick summary of scan results\n */\nexport interface ScanSummary {\n /** Total gaps found */\n totalGaps: number;\n /** Critical gaps */\n criticalGaps: number;\n /** High severity gaps */\n highGaps: number;\n /** Medium severity gaps */\n mediumGaps: number;\n /** Low severity gaps */\n lowGaps: number;\n /** Pinata Score */\n score: number;\n /** Grade */\n grade: string;\n /** Coverage percentage */\n coverage: number;\n /** Files scanned */\n filesScanned: number;\n /** Categories checked */\n categoriesChecked: number;\n /** Top 3 priority gaps */\n topGaps: Gap[];\n}\n\n/**\n * Weight multipliers for severity levels\n */\nexport const SEVERITY_WEIGHTS: Record<Severity, number> = {\n critical: 4.0,\n high: 3.0,\n medium: 2.0,\n low: 1.0,\n};\n\n/**\n * Weight multipliers for confidence levels\n */\nexport const CONFIDENCE_WEIGHTS: Record<Confidence, number> = {\n high: 1.0,\n medium: 0.7,\n low: 0.4,\n};\n\n/**\n * Weight multipliers for priority levels\n */\nexport const PRIORITY_WEIGHTS: Record<Priority, number> = {\n P0: 3.0,\n P1: 2.0,\n P2: 1.0,\n};\n\n/**\n * Default test file patterns for different languages\n */\nexport const DEFAULT_TEST_PATTERNS: Record<Language, string[]> = {\n python: [\"test_*.py\", \"*_test.py\", \"tests/**/*.py\", \"test/**/*.py\"],\n typescript: [\"*.test.ts\", \"*.spec.ts\", \"__tests__/**/*.ts\", \"tests/**/*.ts\"],\n javascript: [\"*.test.js\", \"*.spec.js\", \"__tests__/**/*.js\", \"tests/**/*.js\"],\n go: [\"*_test.go\"],\n java: [\"*Test.java\", \"*Tests.java\", \"src/test/**/*.java\"],\n rust: [\"tests/**/*.rs\"],\n};\n","/**\n * Results cache for storing scan results between analyze and generate commands\n *\n * Stores scan results in .pinata/cache.json for use by the generate command.\n */\n\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { resolve, dirname } from \"path\";\n\nimport { PinataError } from \"../lib/errors.js\";\nimport { ok, err } from \"../lib/result.js\";\n\nimport type { ScanResult, Gap } from \"../core/scanner/types.js\";\nimport type { Result } from \"../lib/result.js\";\n\n/**\n * Cache file location relative to project root\n */\nconst CACHE_DIR = \".pinata\";\nconst CACHE_FILE = \"cache.json\";\n\n/**\n * Cached scan result structure (serializable)\n */\nexport interface CachedScanResult {\n /** When the scan was performed */\n timestamp: string;\n /** Target directory that was scanned */\n targetDirectory: string;\n /** Pinata Score */\n score: number;\n /** Grade */\n grade: string;\n /** Total gaps found */\n totalGaps: number;\n /** The gaps themselves */\n gaps: Gap[];\n /** Categories that were scanned */\n categoriesScanned: string[];\n /** Cache version for compatibility */\n version: number;\n}\n\n/**\n * Current cache version - increment when format changes\n */\nconst CACHE_VERSION = 1;\n\n/**\n * Maximum cache age in milliseconds (1 hour)\n */\nconst MAX_CACHE_AGE_MS = 60 * 60 * 1000;\n\n/**\n * Get the cache file path for a project\n */\nexport function getCachePath(projectRoot: string): string {\n return resolve(projectRoot, CACHE_DIR, CACHE_FILE);\n}\n\n/**\n * Save scan results to cache\n */\nexport async function saveScanResults(\n projectRoot: string,\n result: ScanResult\n): Promise<Result<void, PinataError>> {\n try {\n const cacheDir = resolve(projectRoot, CACHE_DIR);\n const cachePath = getCachePath(projectRoot);\n\n // Ensure cache directory exists (idempotent, no race condition)\n await mkdir(cacheDir, { recursive: true });\n\n // Create serializable cache object\n const cached: CachedScanResult = {\n timestamp: result.completedAt.toISOString(),\n targetDirectory: result.targetDirectory,\n score: result.score.overall,\n grade: result.score.grade,\n totalGaps: result.gaps.length,\n gaps: result.gaps,\n categoriesScanned: result.categoriesScanned,\n version: CACHE_VERSION,\n };\n\n await writeFile(cachePath, JSON.stringify(cached, null, 2));\n\n return ok(undefined);\n } catch (error) {\n return err(\n new PinataError(\n `Failed to save cache: ${error instanceof Error ? error.message : String(error)}`,\n \"CACHE_ERROR\"\n )\n );\n }\n}\n\n/**\n * Load scan results from cache\n */\nexport async function loadScanResults(\n projectRoot: string\n): Promise<Result<CachedScanResult, PinataError>> {\n try {\n const cachePath = getCachePath(projectRoot);\n\n // Try to read directly instead of checking existence (avoids TOCTOU)\n let content: string;\n try {\n content = await readFile(cachePath, \"utf-8\");\n } catch {\n return err(\n new PinataError(\n \"No cached scan results found. Run `pinata analyze` first.\",\n \"CACHE_NOT_FOUND\"\n )\n );\n }\n const cached = JSON.parse(content) as CachedScanResult;\n\n // Check version compatibility\n if (cached.version !== CACHE_VERSION) {\n return err(\n new PinataError(\n \"Cache version mismatch. Run `pinata analyze` again.\",\n \"CACHE_VERSION_MISMATCH\"\n )\n );\n }\n\n // Check cache age\n const cacheAge = Date.now() - new Date(cached.timestamp).getTime();\n if (cacheAge > MAX_CACHE_AGE_MS) {\n return err(\n new PinataError(\n `Cache is stale (${Math.round(cacheAge / 60000)} minutes old). Run \\`pinata analyze\\` again.`,\n \"CACHE_STALE\"\n )\n );\n }\n\n return ok(cached);\n } catch (error) {\n return err(\n new PinataError(\n `Failed to load cache: ${error instanceof Error ? error.message : String(error)}`,\n \"CACHE_ERROR\"\n )\n );\n }\n}\n\n/**\n * Check if cache exists and is valid\n */\nexport async function isCacheValid(projectRoot: string): Promise<boolean> {\n const result = await loadScanResults(projectRoot);\n return result.success;\n}\n\n/**\n * Clear the scan results cache\n */\nexport async function clearCache(projectRoot: string): Promise<Result<void, PinataError>> {\n try {\n const cachePath = getCachePath(projectRoot);\n\n if (existsSync(cachePath)) {\n const { unlink } = await import(\"fs/promises\");\n await unlink(cachePath);\n }\n\n return ok(undefined);\n } catch (error) {\n return err(\n new PinataError(\n `Failed to clear cache: ${error instanceof Error ? error.message : String(error)}`,\n \"CACHE_ERROR\"\n )\n );\n }\n}\n","/**\n * HTML output formatter for standalone reports.\n *\n * Generates a self-contained HTML file with embedded CSS/JS\n * that can be viewed in any browser.\n */\n\nimport type { ScanResult, Gap } from \"../core/scanner/types.js\";\n\n/**\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Get severity badge class\n */\nfunction getSeverityClass(severity: string): string {\n switch (severity) {\n case \"critical\":\n return \"severity-critical\";\n case \"high\":\n return \"severity-high\";\n case \"medium\":\n return \"severity-medium\";\n case \"low\":\n return \"severity-low\";\n default:\n return \"severity-low\";\n }\n}\n\n/**\n * Get domain badge class\n */\nfunction getDomainClass(domain: string): string {\n switch (domain) {\n case \"security\":\n return \"domain-security\";\n case \"data\":\n return \"domain-data\";\n case \"concurrency\":\n return \"domain-concurrency\";\n case \"input\":\n return \"domain-input\";\n default:\n return \"domain-other\";\n }\n}\n\n/**\n * Generate gaps table rows\n */\nfunction generateGapsTable(gaps: Gap[]): string {\n if (gaps.length === 0) {\n return '<tr><td colspan=\"6\" class=\"no-results\">No gaps detected</td></tr>';\n }\n\n return gaps\n .map(\n (gap) => `\n <tr class=\"gap-row\" data-severity=\"${gap.severity}\" data-domain=\"${gap.domain}\">\n <td>\n <span class=\"badge ${getSeverityClass(gap.severity)}\">${gap.severity}</span>\n </td>\n <td>\n <span class=\"badge ${getDomainClass(gap.domain)}\">${gap.domain}</span>\n </td>\n <td>\n <strong>${escapeHtml(gap.categoryName)}</strong>\n <br>\n <small class=\"category-id\">${gap.categoryId}</small>\n </td>\n <td>\n <code class=\"file-path\">${escapeHtml(gap.filePath)}</code>\n <br>\n <small>Line ${gap.lineStart}${gap.lineEnd && gap.lineEnd !== gap.lineStart ? `-${gap.lineEnd}` : \"\"}</small>\n </td>\n <td>\n <span class=\"confidence confidence-${gap.confidence}\">${gap.confidence}</span>\n </td>\n <td>\n ${gap.codeSnippet ? `<pre class=\"code-snippet\"><code>${escapeHtml(gap.codeSnippet)}</code></pre>` : \"-\"}\n </td>\n </tr>\n `\n )\n .join(\"\");\n}\n\n/**\n * Generate summary statistics\n */\nfunction generateSummary(result: ScanResult): string {\n // Build severity counts from summary or gaps\n const bySeverity = {\n critical: (result.summary as { criticalGaps?: number }).criticalGaps ?? 0,\n high: (result.summary as { highGaps?: number }).highGaps ?? 0,\n medium: (result.summary as { mediumGaps?: number }).mediumGaps ?? 0,\n low: (result.summary as { lowGaps?: number }).lowGaps ?? 0,\n };\n\n // Build domain counts from gaps\n const byDomain: Record<string, number> = {};\n for (const gap of result.gaps) {\n byDomain[gap.domain] = (byDomain[gap.domain] ?? 0) + 1;\n }\n\n return `\n <div class=\"summary-grid\">\n <div class=\"summary-card\">\n <h3>Total Gaps</h3>\n <div class=\"stat-value\">${result.summary.totalGaps}</div>\n </div>\n <div class=\"summary-card\">\n <h3>Pinata Score</h3>\n <div class=\"stat-value score-${result.score.overall >= 80 ? \"good\" : result.score.overall >= 60 ? \"moderate\" : \"poor\"}\">${result.score.overall}</div>\n <small>out of 100</small>\n </div>\n <div class=\"summary-card\">\n <h3>Files Scanned</h3>\n <div class=\"stat-value\">${result.fileStats.totalFiles}</div>\n <small>${result.fileStats.filesWithGaps} with gaps</small>\n </div>\n <div class=\"summary-card\">\n <h3>Duration</h3>\n <div class=\"stat-value\">${(result.durationMs / 1000).toFixed(2)}s</div>\n </div>\n </div>\n \n <div class=\"charts-row\">\n <div class=\"chart-card\">\n <h3>By Severity</h3>\n <div class=\"bar-chart\">\n ${bySeverity.critical > 0 ? `<div class=\"bar critical\" style=\"width: ${Math.min(100, (bySeverity.critical / result.summary.totalGaps) * 100)}%\"><span>Critical: ${bySeverity.critical}</span></div>` : \"\"}\n ${bySeverity.high > 0 ? `<div class=\"bar high\" style=\"width: ${Math.min(100, (bySeverity.high / result.summary.totalGaps) * 100)}%\"><span>High: ${bySeverity.high}</span></div>` : \"\"}\n ${bySeverity.medium > 0 ? `<div class=\"bar medium\" style=\"width: ${Math.min(100, (bySeverity.medium / result.summary.totalGaps) * 100)}%\"><span>Medium: ${bySeverity.medium}</span></div>` : \"\"}\n ${bySeverity.low > 0 ? `<div class=\"bar low\" style=\"width: ${Math.min(100, (bySeverity.low / result.summary.totalGaps) * 100)}%\"><span>Low: ${bySeverity.low}</span></div>` : \"\"}\n </div>\n </div>\n <div class=\"chart-card\">\n <h3>By Domain</h3>\n <div class=\"domain-list\">\n ${Object.entries(byDomain)\n .sort((a, b) => (b[1] as number) - (a[1] as number))\n .map(([domain, count]) => `<div class=\"domain-item\"><span class=\"badge ${getDomainClass(domain)}\">${domain}</span>: ${count}</div>`)\n .join(\"\")}\n </div>\n </div>\n </div>\n `;\n}\n\n/**\n * Format scan results as standalone HTML\n */\nexport function formatHtml(result: ScanResult): string {\n const generatedAt = new Date().toISOString();\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Pinata Scan Report</title>\n <style>\n :root {\n --color-bg: #0d1117;\n --color-surface: #161b22;\n --color-border: #30363d;\n --color-text: #c9d1d9;\n --color-text-muted: #8b949e;\n --color-critical: #f85149;\n --color-high: #db6d28;\n --color-medium: #d29922;\n --color-low: #3fb950;\n --color-security: #f85149;\n --color-data: #58a6ff;\n --color-concurrency: #bc8cff;\n --color-input: #d29922;\n --color-other: #8b949e;\n }\n \n * { box-sizing: border-box; margin: 0; padding: 0; }\n \n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n background: var(--color-bg);\n color: var(--color-text);\n line-height: 1.6;\n padding: 2rem;\n }\n \n .container { max-width: 1400px; margin: 0 auto; }\n \n header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 2rem;\n padding-bottom: 1rem;\n border-bottom: 1px solid var(--color-border);\n }\n \n h1 { font-size: 1.5rem; }\n h2 { font-size: 1.25rem; margin-bottom: 1rem; color: var(--color-text); }\n h3 { font-size: 1rem; color: var(--color-text-muted); margin-bottom: 0.5rem; }\n \n .meta { color: var(--color-text-muted); font-size: 0.875rem; }\n \n .summary-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 1rem;\n margin-bottom: 2rem;\n }\n \n .summary-card {\n background: var(--color-surface);\n border: 1px solid var(--color-border);\n border-radius: 6px;\n padding: 1rem;\n text-align: center;\n }\n \n .stat-value {\n font-size: 2rem;\n font-weight: bold;\n color: var(--color-text);\n }\n \n .stat-value.score-good { color: var(--color-low); }\n .stat-value.score-moderate { color: var(--color-medium); }\n .stat-value.score-poor { color: var(--color-critical); }\n \n .charts-row {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 1rem;\n margin-bottom: 2rem;\n }\n \n .chart-card {\n background: var(--color-surface);\n border: 1px solid var(--color-border);\n border-radius: 6px;\n padding: 1rem;\n }\n \n .bar-chart { display: flex; flex-direction: column; gap: 0.5rem; }\n .bar {\n padding: 0.5rem 1rem;\n border-radius: 4px;\n font-size: 0.875rem;\n min-width: 100px;\n }\n .bar.critical { background: var(--color-critical); }\n .bar.high { background: var(--color-high); }\n .bar.medium { background: var(--color-medium); }\n .bar.low { background: var(--color-low); }\n \n .domain-list { display: flex; flex-direction: column; gap: 0.5rem; }\n .domain-item { display: flex; align-items: center; gap: 0.5rem; }\n \n .filters {\n display: flex;\n gap: 1rem;\n margin-bottom: 1rem;\n flex-wrap: wrap;\n }\n \n .filter-group { display: flex; align-items: center; gap: 0.5rem; }\n .filter-group label { color: var(--color-text-muted); font-size: 0.875rem; }\n .filter-group select {\n background: var(--color-surface);\n border: 1px solid var(--color-border);\n color: var(--color-text);\n padding: 0.5rem;\n border-radius: 4px;\n }\n \n table {\n width: 100%;\n border-collapse: collapse;\n background: var(--color-surface);\n border-radius: 6px;\n overflow: hidden;\n }\n \n th, td {\n padding: 0.75rem 1rem;\n text-align: left;\n border-bottom: 1px solid var(--color-border);\n }\n \n th {\n background: var(--color-bg);\n font-weight: 600;\n color: var(--color-text-muted);\n font-size: 0.75rem;\n text-transform: uppercase;\n }\n \n .badge {\n display: inline-block;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n }\n \n .severity-critical { background: var(--color-critical); color: white; }\n .severity-high { background: var(--color-high); color: white; }\n .severity-medium { background: var(--color-medium); color: black; }\n .severity-low { background: var(--color-low); color: black; }\n \n .domain-security { background: rgba(248, 81, 73, 0.2); color: var(--color-security); }\n .domain-data { background: rgba(88, 166, 255, 0.2); color: var(--color-data); }\n .domain-concurrency { background: rgba(188, 140, 255, 0.2); color: var(--color-concurrency); }\n .domain-input { background: rgba(210, 153, 34, 0.2); color: var(--color-input); }\n .domain-other { background: rgba(139, 148, 158, 0.2); color: var(--color-other); }\n \n .confidence { font-size: 0.75rem; }\n .confidence-high { color: var(--color-low); }\n .confidence-medium { color: var(--color-medium); }\n .confidence-low { color: var(--color-text-muted); }\n \n .file-path { font-size: 0.875rem; }\n .category-id { color: var(--color-text-muted); }\n \n .code-snippet {\n background: var(--color-bg);\n padding: 0.5rem;\n border-radius: 4px;\n overflow-x: auto;\n font-size: 0.75rem;\n max-width: 300px;\n }\n \n .code-snippet code {\n white-space: pre-wrap;\n word-break: break-all;\n }\n \n .no-results {\n text-align: center;\n color: var(--color-text-muted);\n padding: 2rem;\n }\n \n footer {\n margin-top: 2rem;\n padding-top: 1rem;\n border-top: 1px solid var(--color-border);\n text-align: center;\n color: var(--color-text-muted);\n font-size: 0.875rem;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <header>\n <h1>Pinata Scan Report</h1>\n <div class=\"meta\">Generated: ${generatedAt}</div>\n </header>\n \n <section id=\"summary\">\n <h2>Summary</h2>\n ${generateSummary(result)}\n </section>\n \n <section id=\"gaps\">\n <h2>Detected Gaps</h2>\n \n <div class=\"filters\">\n <div class=\"filter-group\">\n <label for=\"severity-filter\">Severity:</label>\n <select id=\"severity-filter\" onchange=\"filterTable()\">\n <option value=\"\">All</option>\n <option value=\"critical\">Critical</option>\n <option value=\"high\">High</option>\n <option value=\"medium\">Medium</option>\n <option value=\"low\">Low</option>\n </select>\n </div>\n <div class=\"filter-group\">\n <label for=\"domain-filter\">Domain:</label>\n <select id=\"domain-filter\" onchange=\"filterTable()\">\n <option value=\"\">All</option>\n <option value=\"security\">Security</option>\n <option value=\"data\">Data</option>\n <option value=\"concurrency\">Concurrency</option>\n <option value=\"input\">Input</option>\n </select>\n </div>\n </div>\n \n <table>\n <thead>\n <tr>\n <th>Severity</th>\n <th>Domain</th>\n <th>Category</th>\n <th>Location</th>\n <th>Confidence</th>\n <th>Code</th>\n </tr>\n </thead>\n <tbody id=\"gaps-table\">\n ${generateGapsTable(result.gaps)}\n </tbody>\n </table>\n </section>\n \n <footer>\n Generated by Pinata v0.1.0\n </footer>\n </div>\n \n <script>\n function filterTable() {\n const severityFilter = document.getElementById('severity-filter').value;\n const domainFilter = document.getElementById('domain-filter').value;\n const rows = document.querySelectorAll('.gap-row');\n \n rows.forEach(row => {\n const severity = row.dataset.severity;\n const domain = row.dataset.domain;\n \n const matchesSeverity = !severityFilter || severity === severityFilter;\n const matchesDomain = !domainFilter || domain === domainFilter;\n \n row.style.display = matchesSeverity && matchesDomain ? '' : 'none';\n });\n }\n </script>\n</body>\n</html>`;\n}\n","/**\n * JUnit XML output formatter.\n *\n * Generates JUnit-compatible XML for CI/CD integration.\n * Each gap is represented as a test failure.\n */\n\nimport type { ScanResult, Gap } from \"../core/scanner/types.js\";\n\n/**\n * Escape XML special characters\n */\nfunction escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Generate a test case for a gap\n */\nfunction generateTestCase(gap: Gap): string {\n const className = `pinata.${gap.domain}.${gap.categoryId}`;\n const name = `${gap.filePath}:${gap.lineStart}`;\n const time = \"0.001\"; // Nominal time\n\n const failureMessage = `${gap.categoryName}: ${gap.confidence} confidence ${gap.severity} issue`;\n const failureDetails = [\n `Category: ${gap.categoryName} (${gap.categoryId})`,\n `Domain: ${gap.domain}`,\n `Severity: ${gap.severity}`,\n `Priority: ${gap.priority}`,\n `Confidence: ${gap.confidence}`,\n `File: ${gap.filePath}`,\n `Line: ${gap.lineStart}${gap.lineEnd && gap.lineEnd !== gap.lineStart ? `-${gap.lineEnd}` : \"\"}`,\n gap.codeSnippet ? `\\nCode:\\n${gap.codeSnippet}` : \"\",\n ].join(\"\\n\");\n\n return ` <testcase classname=\"${escapeXml(className)}\" name=\"${escapeXml(name)}\" time=\"${time}\">\n <failure message=\"${escapeXml(failureMessage)}\" type=\"${escapeXml(gap.severity)}\">\n${escapeXml(failureDetails)}\n </failure>\n </testcase>`;\n}\n\n/**\n * Generate test suite for a domain\n */\nfunction generateTestSuite(\n domain: string,\n gaps: Gap[],\n totalTime: number\n): string {\n const tests = gaps.length;\n const failures = gaps.length;\n const errors = 0;\n const skipped = 0;\n const time = (totalTime / 1000).toFixed(3);\n\n const testCases = gaps.map(generateTestCase).join(\"\\n\");\n\n return ` <testsuite name=\"pinata.${escapeXml(domain)}\" tests=\"${tests}\" failures=\"${failures}\" errors=\"${errors}\" skipped=\"${skipped}\" time=\"${time}\">\n${testCases}\n </testsuite>`;\n}\n\n/**\n * Format scan results as JUnit XML\n */\nexport function formatJunit(result: ScanResult): string {\n const timestamp = new Date().toISOString();\n\n // Group gaps by domain\n const gapsByDomain = new Map<string, Gap[]>();\n for (const gap of result.gaps) {\n const existing = gapsByDomain.get(gap.domain) ?? [];\n existing.push(gap);\n gapsByDomain.set(gap.domain, existing);\n }\n\n // Calculate totals\n const totalTests = result.gaps.length || 1; // At least 1 for schema validity\n const totalFailures = result.gaps.length;\n const totalErrors = 0;\n const totalTime = (result.durationMs / 1000).toFixed(3);\n\n // Generate test suites\n const testSuites = Array.from(gapsByDomain.entries())\n .map(([domain, gaps]) => generateTestSuite(domain, gaps, result.durationMs / gapsByDomain.size))\n .join(\"\\n\");\n\n // If no gaps, add a passing test suite\n const content = result.gaps.length === 0\n ? ` <testsuite name=\"pinata.all\" tests=\"1\" failures=\"0\" errors=\"0\" skipped=\"0\" time=\"${totalTime}\">\n <testcase classname=\"pinata.scan\" name=\"no-gaps-detected\" time=\"${totalTime}\">\n </testcase>\n </testsuite>`\n : testSuites;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites name=\"Pinata Scan Results\" tests=\"${totalTests}\" failures=\"${totalFailures}\" errors=\"${totalErrors}\" time=\"${totalTime}\" timestamp=\"${timestamp}\">\n${content}\n</testsuites>`;\n}\n\n/**\n * Validate JUnit XML output (basic validation)\n */\nexport function validateJunit(xml: string): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // Basic XML structure validation\n if (!xml.startsWith('<?xml version=\"1.0\"')) {\n errors.push(\"Missing or invalid XML declaration\");\n }\n\n if (!xml.includes(\"<testsuites\")) {\n errors.push(\"Missing testsuites element\");\n }\n\n if (!xml.includes(\"<testsuite\")) {\n errors.push(\"Missing testsuite element\");\n }\n\n // Check for balanced tags\n const openSuites = (xml.match(/<testsuite[\\s>]/g) || []).length;\n const closeSuites = (xml.match(/<\\/testsuite>/g) || []).length;\n if (openSuites !== closeSuites) {\n errors.push(`Unbalanced testsuite tags: ${openSuites} open, ${closeSuites} close`);\n }\n\n const openCases = (xml.match(/<testcase[\\s>]/g) || []).length;\n const closeCases = (xml.match(/<\\/testcase>|\\/>/g) || []).length - openSuites; // Subtract self-closing\n // This is a rough check; proper XML validation would use a parser\n\n // Check required attributes\n if (!xml.includes('name=\"')) {\n errors.push(\"Missing name attribute\");\n }\n\n if (!xml.includes('tests=\"')) {\n errors.push(\"Missing tests attribute\");\n }\n\n return { valid: errors.length === 0, errors };\n}\n","/**\n * AI-powered verification of pattern matches.\n *\n * Optimized for efficiency:\n * 1. Smart pre-filtering to skip obvious false positives\n * 2. Batch prompts (10 gaps per API call)\n * 3. Parallel execution (3 concurrent batches)\n *\n * 352 gaps → ~50 after filtering → 5 batches × 3 parallel = ~20 seconds\n */\n\nimport { Gap } from \"../scanner/types.js\";\n\nexport interface VerificationResult {\n isVulnerable: boolean;\n confidence: \"high\" | \"medium\" | \"low\";\n reasoning: string;\n mitigatingFactors: string[];\n exploitScenario: string | null;\n recommendation: string;\n}\n\nexport interface BatchVerificationResult {\n id: string;\n isVulnerable: boolean;\n confidence: \"high\" | \"medium\" | \"low\";\n reasoning: string;\n}\n\nexport interface AIVerifierConfig {\n provider: \"anthropic\" | \"openai\";\n model?: string;\n apiKey?: string;\n batchSize?: number; // Gaps per API call (default: 10)\n concurrency?: number; // Parallel batches (default: 3)\n}\n\n// Patterns that indicate safe/test code - skip AI verification\nconst SKIP_PATTERNS = {\n paths: [\n /\\.test\\.(ts|js|tsx|jsx)$/,\n /\\.spec\\.(ts|js|tsx|jsx)$/,\n /tests?\\//i,\n /fixtures?\\//i,\n /mocks?\\//i,\n /__tests__\\//,\n /node_modules\\//,\n /dist\\//,\n /\\.d\\.ts$/,\n /examples?\\//i,\n ],\n // Content patterns that indicate false positive\n content: [\n /\\/\\/ SAFE:/i, // Explicit safe marker\n /\\/\\/ nosec/i, // Security ignore\n /eslint-disable/i,\n /sanitized?|escaped?|validated?/i, // Near sanitization\n ],\n};\n\n// Batch verification prompt - handles multiple gaps at once\nconst BATCH_PROMPT = `You are a security code reviewer. Analyze these potential vulnerabilities and determine which are real issues vs false positives.\n\nFor each item, consider:\n- Is user input actually reaching this code?\n- Is there sanitization, validation, or encoding nearby?\n- Is this test code, example code, or production code?\n- Is there context that makes this safe?\n\nBe rigorous. Most pattern matches are false positives.\n\nITEMS TO ANALYZE:\n{{items}}\n\nRespond with a JSON array. Each object MUST have these exact fields:\n[\n {\n \"id\": \"1\",\n \"isVulnerable\": true/false,\n \"confidence\": \"high\"/\"medium\"/\"low\",\n \"reasoning\": \"brief explanation\"\n },\n ...\n]\n\nOnly return the JSON array, no other text.`;\n\nconst SINGLE_ITEM_TEMPLATE = `\n---\nID: {{id}}\nCATEGORY: {{category}}\nFILE: {{filePath}}:{{lineNumber}}\nCODE:\n\\`\\`\\`{{language}}\n{{codeContext}}\n\\`\\`\\`\nFLAGGED LINE: {{flaggedLine}}\n---`;\n\nexport class AIVerifier {\n private config: AIVerifierConfig;\n private readonly batchSize: number;\n private readonly concurrency: number;\n\n constructor(config: AIVerifierConfig) {\n this.config = config;\n this.batchSize = config.batchSize ?? 10;\n this.concurrency = config.concurrency ?? 3;\n }\n\n /**\n * Verify multiple gaps efficiently using filtering, batching, and parallelism.\n *\n * Flow:\n * 1. Pre-filter obvious false positives (test files, etc.)\n * 2. Group remaining gaps into batches of 10\n * 3. Process 3 batches in parallel\n * 4. Return verified gaps and dismissed with reasons\n */\n async verifyAll(\n gaps: Gap[],\n getFileContent: (path: string) => Promise<string>\n ): Promise<{\n verified: Gap[];\n dismissed: Array<{ gap: Gap; reason: string }>;\n stats: { total: number; preFiltered: number; aiDismissed: number; aiVerified: number };\n }> {\n const verified: Gap[] = [];\n const dismissed: Array<{ gap: Gap; reason: string }> = [];\n\n // Step 1: Pre-filter obvious false positives\n const { toVerify, preFiltered } = this.preFilter(gaps);\n dismissed.push(...preFiltered);\n\n if (toVerify.length === 0) {\n return {\n verified: [],\n dismissed,\n stats: {\n total: gaps.length,\n preFiltered: preFiltered.length,\n aiDismissed: 0,\n aiVerified: 0,\n },\n };\n }\n\n console.log(`Pre-filtered ${preFiltered.length} gaps. Verifying ${toVerify.length} with AI...`);\n\n // Step 2: Load file contents (deduplicated)\n const fileContents = new Map<string, string>();\n const uniquePaths = [...new Set(toVerify.map((g) => g.filePath))];\n await Promise.all(\n uniquePaths.map(async (path) => {\n try {\n fileContents.set(path, await getFileContent(path));\n } catch {\n fileContents.set(path, \"\");\n }\n })\n );\n\n // Step 3: Create batches\n const batches = this.createBatches(toVerify, fileContents);\n console.log(`Created ${batches.length} batches of ~${this.batchSize} gaps each`);\n\n // Step 4: Process batches in parallel (limited concurrency)\n const results = await this.processParallel(batches, toVerify);\n\n // Step 5: Separate verified from dismissed\n let aiVerified = 0;\n let aiDismissed = 0;\n\n for (const gap of toVerify) {\n const gapId = `${gap.filePath}:${gap.lineStart}`;\n const result = results.get(gapId);\n\n if (!result || result.isVulnerable) {\n // No result (AI failure) or confirmed vulnerable\n verified.push(gap);\n aiVerified++;\n } else {\n // AI dismissed as false positive\n dismissed.push({\n gap,\n reason: result.reasoning,\n });\n aiDismissed++;\n }\n }\n\n return {\n verified,\n dismissed,\n stats: {\n total: gaps.length,\n preFiltered: preFiltered.length,\n aiDismissed,\n aiVerified,\n },\n };\n }\n\n /**\n * Pre-filter gaps that are obviously false positives without needing AI.\n */\n private preFilter(\n gaps: Gap[]\n ): { toVerify: Gap[]; preFiltered: Array<{ gap: Gap; reason: string }> } {\n const toVerify: Gap[] = [];\n const preFiltered: Array<{ gap: Gap; reason: string }> = [];\n\n for (const gap of gaps) {\n // Check path patterns\n const pathMatch = SKIP_PATTERNS.paths.find((p) => p.test(gap.filePath));\n if (pathMatch) {\n preFiltered.push({\n gap,\n reason: `Skipped: test/example file (${pathMatch.source})`,\n });\n continue;\n }\n\n // Check if it's a type definition or interface\n if (gap.categoryId === \"precision-loss\" && gap.filePath.endsWith(\".ts\")) {\n // TypeScript type annotations are not runtime vulnerabilities\n preFiltered.push({\n gap,\n reason: \"TypeScript type annotation, not runtime code\",\n });\n continue;\n }\n\n toVerify.push(gap);\n }\n\n return { toVerify, preFiltered };\n }\n\n /**\n * Create batches of gaps for batch API calls.\n */\n private createBatches(\n gaps: Gap[],\n fileContents: Map<string, string>\n ): Array<{ prompt: string; gapIds: string[] }> {\n const batches: Array<{ prompt: string; gapIds: string[] }> = [];\n\n for (let i = 0; i < gaps.length; i += this.batchSize) {\n const batchGaps = gaps.slice(i, i + this.batchSize);\n const items: string[] = [];\n const gapIds: string[] = [];\n\n for (let j = 0; j < batchGaps.length; j++) {\n const gap = batchGaps[j]!;\n const content = fileContents.get(gap.filePath) ?? \"\";\n const gapId = `${gap.filePath}:${gap.lineStart}`;\n gapIds.push(gapId);\n\n const codeContext = this.extractContext(content, gap.lineStart, 10);\n const flaggedLine = this.extractLine(content, gap.lineStart);\n\n items.push(\n SINGLE_ITEM_TEMPLATE\n .replace(\"{{id}}\", String(j + 1))\n .replace(\"{{category}}\", gap.categoryName)\n .replace(\"{{filePath}}\", gap.filePath)\n .replace(\"{{lineNumber}}\", String(gap.lineStart))\n .replace(\"{{language}}\", this.getLanguage(gap.filePath))\n .replace(\"{{codeContext}}\", codeContext)\n .replace(\"{{flaggedLine}}\", flaggedLine)\n );\n }\n\n const prompt = BATCH_PROMPT.replace(\"{{items}}\", items.join(\"\\n\"));\n batches.push({ prompt, gapIds });\n }\n\n return batches;\n }\n\n /**\n * Process batches in parallel with limited concurrency.\n */\n private async processParallel(\n batches: Array<{ prompt: string; gapIds: string[] }>,\n gaps: Gap[]\n ): Promise<Map<string, BatchVerificationResult>> {\n const results = new Map<string, BatchVerificationResult>();\n let completed = 0;\n\n // Process in waves of `concurrency` batches\n for (let i = 0; i < batches.length; i += this.concurrency) {\n const wave = batches.slice(i, i + this.concurrency);\n\n const waveResults = await Promise.all(\n wave.map(async (batch) => {\n try {\n const response = await this.callAI(batch.prompt);\n return { gapIds: batch.gapIds, response };\n } catch (error) {\n console.error(`Batch failed: ${error instanceof Error ? error.message : String(error)}`);\n return { gapIds: batch.gapIds, response: null };\n }\n })\n );\n\n // Parse results\n for (const { gapIds, response } of waveResults) {\n if (response) {\n const parsed = this.parseBatchResponse(response);\n for (let j = 0; j < gapIds.length && j < parsed.length; j++) {\n const gapId = gapIds[j]!;\n const result = parsed[j];\n if (result) {\n results.set(gapId, result);\n }\n }\n }\n }\n\n completed += wave.length;\n console.log(`Processed ${completed}/${batches.length} batches...`);\n }\n\n return results;\n }\n\n private extractContext(content: string, lineNumber: number, radius: number): string {\n const lines = content.split(\"\\n\");\n const start = Math.max(0, lineNumber - radius - 1);\n const end = Math.min(lines.length, lineNumber + radius);\n\n return lines\n .slice(start, end)\n .map((line, i) => {\n const num = start + i + 1;\n const marker = num === lineNumber ? \">\" : \" \";\n return `${marker}${num.toString().padStart(4)}| ${line}`;\n })\n .join(\"\\n\");\n }\n\n private extractLine(content: string, lineNumber: number): string {\n const lines = content.split(\"\\n\");\n return lines[lineNumber - 1] ?? \"\";\n }\n\n private getLanguage(filePath: string): string {\n if (filePath.endsWith(\".ts\") || filePath.endsWith(\".tsx\")) return \"typescript\";\n if (filePath.endsWith(\".js\") || filePath.endsWith(\".jsx\")) return \"javascript\";\n if (filePath.endsWith(\".py\")) return \"python\";\n if (filePath.endsWith(\".go\")) return \"go\";\n return \"text\";\n }\n\n private async callAI(prompt: string): Promise<string> {\n const apiKey = this.config.apiKey ?? this.getApiKeyFromEnv();\n\n if (!apiKey) {\n throw new Error(`No API key configured for ${this.config.provider}`);\n }\n\n if (this.config.provider === \"anthropic\") {\n return this.callAnthropic(prompt, apiKey);\n } else {\n return this.callOpenAI(prompt, apiKey);\n }\n }\n\n private async callAnthropic(prompt: string, apiKey: string): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 60000); // 60s for batches\n\n try {\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: this.config.model ?? \"claude-sonnet-4-20250514\",\n max_tokens: 4096, // Larger for batch responses\n messages: [{ role: \"user\", content: prompt }],\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Anthropic API error: ${response.status} - ${body}`);\n }\n\n const data = (await response.json()) as {\n content: Array<{ type: string; text: string }>;\n };\n return data.content[0]?.text ?? \"\";\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private async callOpenAI(prompt: string, apiKey: string): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 60000); // 60s for batches\n\n try {\n const response = await fetch(\"https://api.openai.com/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model ?? \"gpt-4o\",\n messages: [{ role: \"user\", content: prompt }],\n max_tokens: 4096,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${body}`);\n }\n\n const data = (await response.json()) as {\n choices: Array<{ message: { content: string } }>;\n };\n return data.choices[0]?.message?.content ?? \"\";\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private getApiKeyFromEnv(): string {\n if (this.config.provider === \"anthropic\") {\n return process.env[\"ANTHROPIC_API_KEY\"] ?? \"\";\n }\n return process.env[\"OPENAI_API_KEY\"] ?? \"\";\n }\n\n private parseBatchResponse(response: string): BatchVerificationResult[] {\n try {\n // Extract JSON array from response\n const jsonMatch = response.match(/\\[[\\s\\S]*\\]/);\n if (!jsonMatch) {\n console.error(\"No JSON array found in batch response\");\n return [];\n }\n\n const parsed = JSON.parse(jsonMatch[0]) as BatchVerificationResult[];\n\n return parsed.map((item) => ({\n id: String(item.id),\n isVulnerable: Boolean(item.isVulnerable),\n confidence: item.confidence ?? \"medium\",\n reasoning: item.reasoning ?? \"No reasoning provided\",\n }));\n } catch (error) {\n console.error(`Failed to parse batch response: ${error instanceof Error ? error.message : String(error)}`);\n return [];\n }\n }\n\n /**\n * Legacy single-gap verification (kept for backwards compatibility).\n */\n async verify(gap: Gap, fileContent: string): Promise<VerificationResult> {\n const result = await this.verifyAll([gap], async () => fileContent);\n if (result.verified.length > 0) {\n return {\n isVulnerable: true,\n confidence: \"high\",\n reasoning: \"AI confirmed vulnerability\",\n mitigatingFactors: [],\n exploitScenario: null,\n recommendation: \"Fix this issue\",\n };\n }\n const dismissal = result.dismissed[0];\n return {\n isVulnerable: false,\n confidence: \"high\",\n reasoning: dismissal?.reason ?? \"AI dismissed as false positive\",\n mitigatingFactors: [],\n exploitScenario: null,\n recommendation: \"No action needed\",\n };\n }\n}\n","export { AIVerifier, type VerificationResult, type AIVerifierConfig } from \"./ai-verifier.js\";\n","/**\n * Pinata TUI Dashboard\n *\n * Interactive terminal interface for viewing scan results.\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport { Box, Text, useInput, useApp } from \"ink\";\nimport Spinner from \"ink-spinner\";\n\nimport type { Gap } from \"../../core/scanner/types.js\";\n\ninterface CachedResults {\n gaps: Gap[];\n targetDirectory: string;\n summary: {\n totalGaps: number;\n criticalGaps: number;\n highGaps: number;\n mediumGaps: number;\n lowGaps: number;\n score: number;\n grade: string;\n };\n}\n\ninterface AppProps {\n results: CachedResults | null;\n loading: boolean;\n error: string | null;\n}\n\ntype ViewMode = \"list\" | \"detail\";\n\nconst SEVERITY_COLORS: Record<string, string> = {\n critical: \"red\",\n high: \"yellow\",\n medium: \"blue\",\n low: \"gray\",\n};\n\nexport function App({ results, loading, error }: AppProps): React.ReactElement {\n const { exit } = useApp();\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [viewMode, setViewMode] = useState<ViewMode>(\"list\");\n const [scrollOffset, setScrollOffset] = useState(0);\n\n const gaps = results?.gaps ?? [];\n const maxVisible = 15;\n\n useInput((input, key) => {\n if (input === \"q\") {\n exit();\n return;\n }\n\n if (viewMode === \"list\") {\n if (key.downArrow || input === \"j\") {\n setSelectedIndex((prev) => {\n const next = Math.min(prev + 1, gaps.length - 1);\n if (next >= scrollOffset + maxVisible) {\n setScrollOffset(next - maxVisible + 1);\n }\n return next;\n });\n } else if (key.upArrow || input === \"k\") {\n setSelectedIndex((prev) => {\n const next = Math.max(prev - 1, 0);\n if (next < scrollOffset) {\n setScrollOffset(next);\n }\n return next;\n });\n } else if (key.return || input === \"l\") {\n setViewMode(\"detail\");\n }\n } else if (viewMode === \"detail\") {\n if (key.escape || input === \"h\" || input === \"q\") {\n setViewMode(\"list\");\n } else if (key.downArrow || input === \"j\") {\n setSelectedIndex((prev) => Math.min(prev + 1, gaps.length - 1));\n } else if (key.upArrow || input === \"k\") {\n setSelectedIndex((prev) => Math.max(prev - 1, 0));\n }\n }\n });\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n {\" \"}Loading scan results...\n </Text>\n </Box>\n );\n }\n\n if (error !== null) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\">Error: {error}</Text>\n <Text color=\"gray\">Run `pinata analyze` first to scan for gaps.</Text>\n <Text color=\"gray\" dimColor>Press q to exit</Text>\n </Box>\n );\n }\n\n if (results === null || gaps.length === 0) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"green\">No gaps found!</Text>\n <Text color=\"gray\">Your codebase looks clean.</Text>\n <Text color=\"gray\" dimColor>Press q to exit</Text>\n </Box>\n );\n }\n\n const selectedGap = gaps[selectedIndex];\n\n if (viewMode === \"detail\" && selectedGap !== undefined) {\n return <DetailView gap={selectedGap} index={selectedIndex} total={gaps.length} />;\n }\n\n return (\n <ListView\n results={results}\n gaps={gaps}\n selectedIndex={selectedIndex}\n scrollOffset={scrollOffset}\n maxVisible={maxVisible}\n />\n );\n}\n\ninterface ListViewProps {\n results: CachedResults;\n gaps: Gap[];\n selectedIndex: number;\n scrollOffset: number;\n maxVisible: number;\n}\n\nfunction ListView({\n results,\n gaps,\n selectedIndex,\n scrollOffset,\n maxVisible,\n}: ListViewProps): React.ReactElement {\n const visibleGaps = gaps.slice(scrollOffset, scrollOffset + maxVisible);\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">Pinata Dashboard</Text>\n <Text color=\"gray\"> - {results.targetDirectory}</Text>\n </Box>\n\n {/* Summary */}\n <Box marginBottom={1} flexDirection=\"row\" gap={2}>\n <Text>\n Score: <Text color={getGradeColor(results.summary.grade)} bold>{results.summary.grade}</Text>\n {\" \"}({results.summary.score})\n </Text>\n <Text color=\"gray\">|</Text>\n <Text>\n <Text color=\"red\">{results.summary.criticalGaps} critical</Text>\n {\" \"}\n <Text color=\"yellow\">{results.summary.highGaps} high</Text>\n {\" \"}\n <Text color=\"blue\">{results.summary.mediumGaps} medium</Text>\n {\" \"}\n <Text color=\"gray\">{results.summary.lowGaps} low</Text>\n </Text>\n </Box>\n\n {/* Gap list */}\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\">\n <Box paddingX={1} borderBottom borderColor=\"gray\">\n <Box width={4}><Text color=\"gray\">#</Text></Box>\n <Box width={12}><Text color=\"gray\">Severity</Text></Box>\n <Box width={24}><Text color=\"gray\">Category</Text></Box>\n <Box><Text color=\"gray\">Location</Text></Box>\n </Box>\n\n {visibleGaps.map((gap, i) => {\n const actualIndex = scrollOffset + i;\n const isSelected = actualIndex === selectedIndex;\n const color = SEVERITY_COLORS[gap.severity] ?? \"white\";\n\n return (\n <Box\n key={`${gap.filePath}:${gap.lineStart}:${gap.categoryId}`}\n paddingX={1}\n backgroundColor={isSelected ? \"blue\" : undefined}\n >\n <Box width={4}>\n <Text color={isSelected ? \"white\" : \"gray\"}>{actualIndex + 1}</Text>\n </Box>\n <Box width={12}>\n <Text color={isSelected ? \"white\" : color}>{gap.severity}</Text>\n </Box>\n <Box width={24}>\n <Text color={isSelected ? \"white\" : \"cyan\"}>\n {gap.categoryId.slice(0, 22)}\n </Text>\n </Box>\n <Box>\n <Text color={isSelected ? \"white\" : \"gray\"}>\n {formatPath(gap.filePath)}:{gap.lineStart}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n\n {/* Scroll indicator */}\n {gaps.length > maxVisible && (\n <Box marginTop={1}>\n <Text color=\"gray\">\n Showing {scrollOffset + 1}-{Math.min(scrollOffset + maxVisible, gaps.length)} of {gaps.length}\n </Text>\n </Box>\n )}\n\n {/* Help */}\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n j/k: navigate | Enter/l: details | q: quit\n </Text>\n </Box>\n </Box>\n );\n}\n\ninterface DetailViewProps {\n gap: Gap;\n index: number;\n total: number;\n}\n\nfunction DetailView({ gap, index, total }: DetailViewProps): React.ReactElement {\n const color = SEVERITY_COLORS[gap.severity] ?? \"white\";\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1} flexDirection=\"row\" justifyContent=\"space-between\">\n <Text bold color=\"cyan\">{gap.categoryName}</Text>\n <Text color=\"gray\">{index + 1}/{total}</Text>\n </Box>\n\n {/* Metadata */}\n <Box marginBottom={1} flexDirection=\"column\">\n <Text>\n <Text color=\"gray\">Severity: </Text>\n <Text color={color} bold>{gap.severity}</Text>\n <Text color=\"gray\"> | Confidence: </Text>\n <Text>{gap.confidence}</Text>\n <Text color=\"gray\"> | Priority: </Text>\n <Text>{gap.priority}</Text>\n </Text>\n <Text>\n <Text color=\"gray\">File: </Text>\n <Text color=\"cyan\">{gap.filePath}</Text>\n </Text>\n <Text>\n <Text color=\"gray\">Line: </Text>\n <Text>{gap.lineStart}</Text>\n {gap.lineEnd !== gap.lineStart && (\n <Text>-{gap.lineEnd}</Text>\n )}\n </Text>\n <Text>\n <Text color=\"gray\">Pattern: </Text>\n <Text>{gap.patternId}</Text>\n <Text color=\"gray\"> ({gap.patternType})</Text>\n </Text>\n </Box>\n\n {/* Code snippet */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n marginBottom={1}\n >\n <Text color=\"gray\" dimColor>Code:</Text>\n <Text>{gap.codeSnippet}</Text>\n </Box>\n\n {/* Explanation placeholder */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"gray\" dimColor>Explanation:</Text>\n <Text>\n This pattern detects potential {gap.categoryName.toLowerCase()} vulnerabilities.\n Review the code to ensure proper input validation and sanitization.\n </Text>\n </Box>\n\n {/* Help */}\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n j/k: prev/next | h/Esc: back to list | q: quit\n </Text>\n </Box>\n </Box>\n );\n}\n\nfunction formatPath(path: string): string {\n const parts = path.split(\"/\");\n if (parts.length <= 3) return path;\n return `.../${parts.slice(-2).join(\"/\")}`;\n}\n\nfunction getGradeColor(grade: string): string {\n switch (grade) {\n case \"A\": return \"green\";\n case \"B\": return \"cyan\";\n case \"C\": return \"yellow\";\n case \"D\": return \"red\";\n case \"F\": return \"red\";\n default: return \"white\";\n }\n}\n\nexport default App;\n","/**\n * TUI Dashboard Entry Point\n */\n\nimport React from \"react\";\nimport { render } from \"ink\";\n\nimport { App } from \"./App.js\";\nimport { loadScanResults } from \"../results-cache.js\";\n\nexport async function runDashboard(): Promise<void> {\n const projectRoot = process.cwd();\n\n // Start with loading state\n const { rerender, unmount, waitUntilExit } = render(\n <App results={null} loading={true} error={null} />\n );\n\n try {\n // Load cached results\n const result = await loadScanResults(projectRoot);\n\n if (!result.success) {\n rerender(<App results={null} loading={false} error={result.error.message} />);\n } else {\n const cached = result.data;\n rerender(\n <App\n results={{\n gaps: cached.gaps,\n targetDirectory: cached.targetDirectory,\n summary: {\n totalGaps: cached.gaps.length,\n criticalGaps: cached.gaps.filter((g) => g.severity === \"critical\").length,\n highGaps: cached.gaps.filter((g) => g.severity === \"high\").length,\n mediumGaps: cached.gaps.filter((g) => g.severity === \"medium\").length,\n lowGaps: cached.gaps.filter((g) => g.severity === \"low\").length,\n score: cached.score ?? 0,\n grade: cached.grade ?? \"?\",\n },\n }}\n loading={false}\n error={null}\n />\n );\n }\n\n await waitUntilExit();\n } catch (error) {\n rerender(\n <App\n results={null}\n loading={false}\n error={error instanceof Error ? error.message : \"Unknown error\"}\n />\n );\n await waitUntilExit();\n }\n}\n\nexport { App } from \"./App.js\";\n","/**\n * Configuration Management\n *\n * Handles persistent storage of user configuration like API keys.\n * Uses OS-appropriate config directory with secure file permissions.\n */\n\nimport { mkdirSync, readFileSync, writeFileSync, chmodSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { z } from \"zod\";\n\nconst CONFIG_DIR = join(homedir(), \".pinata\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\n/**\n * Configuration schema\n */\nconst ConfigSchema = z.object({\n anthropicApiKey: z.string().optional(),\n openaiApiKey: z.string().optional(),\n defaultProvider: z.enum([\"anthropic\", \"openai\"]).optional(),\n telemetry: z.boolean().optional(),\n});\n\ntype Config = z.infer<typeof ConfigSchema>;\n\n/**\n * Ensure config directory exists with secure permissions.\n * Uses mkdir with recursive:true which is idempotent (no race condition).\n */\nfunction ensureConfigDir(): void {\n // mkdir with recursive:true is idempotent - safe to call even if exists\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n}\n\n/**\n * Load configuration from disk.\n * Uses try-catch instead of existsSync to avoid TOCTOU race condition.\n */\nexport function loadConfig(): Config {\n try {\n // Just try to read - catches ENOENT if file doesn't exist\n const content = readFileSync(CONFIG_FILE, \"utf-8\");\n const parsed = JSON.parse(content) as unknown;\n const result = ConfigSchema.safeParse(parsed);\n return result.success ? result.data : {};\n } catch {\n // File doesn't exist or is unreadable - return empty config\n return {};\n }\n}\n\n/**\n * Save configuration to disk with secure permissions\n */\nexport function saveConfig(config: Config): void {\n ensureConfigDir();\n const content = JSON.stringify(config, null, 2);\n writeFileSync(CONFIG_FILE, content, { mode: 0o600 });\n // Ensure file permissions are restricted\n chmodSync(CONFIG_FILE, 0o600);\n}\n\n/**\n * Set a single configuration value\n */\nexport function setConfigValue<K extends keyof Config>(key: K, value: Config[K]): void {\n const config = loadConfig();\n config[key] = value;\n saveConfig(config);\n}\n\n/**\n * Get a single configuration value\n */\nexport function getConfigValue<K extends keyof Config>(key: K): Config[K] {\n const config = loadConfig();\n return config[key];\n}\n\n/**\n * Delete a configuration value\n */\nexport function deleteConfigValue(key: keyof Config): void {\n const config = loadConfig();\n delete config[key];\n saveConfig(config);\n}\n\n/**\n * Get API key (from config file or environment)\n * Environment variables take precedence\n */\nexport function getApiKey(provider: \"anthropic\" | \"openai\"): string | undefined {\n const envVar = provider === \"anthropic\" ? \"ANTHROPIC_API_KEY\" : \"OPENAI_API_KEY\";\n const envValue = process.env[envVar];\n if (envValue !== undefined && envValue.length > 0) {\n return envValue;\n }\n\n const config = loadConfig();\n return provider === \"anthropic\" ? config.anthropicApiKey : config.openaiApiKey;\n}\n\n/**\n * Check if API key is configured for a provider\n */\nexport function hasApiKey(provider: \"anthropic\" | \"openai\"): boolean {\n const key = getApiKey(provider);\n return key !== undefined && key.length > 0;\n}\n\n/**\n * Get configured provider (or default)\n */\nexport function getDefaultProvider(): \"anthropic\" | \"openai\" {\n const config = loadConfig();\n return config.defaultProvider ?? \"anthropic\";\n}\n\n/**\n * Mask API key for display (show first/last 4 chars)\n */\nexport function maskApiKey(key: string): string {\n if (key.length <= 12) {\n return \"****\";\n }\n return `${key.slice(0, 4)}...${key.slice(-4)}`;\n}\n\n/**\n * Validate API key format\n */\nexport function validateApiKey(provider: \"anthropic\" | \"openai\", key: string): { valid: boolean; error?: string } {\n if (key.length === 0) {\n return { valid: false, error: \"API key cannot be empty\" };\n }\n\n if (provider === \"anthropic\") {\n if (!key.startsWith(\"sk-ant-\")) {\n return { valid: false, error: \"Anthropic API keys should start with 'sk-ant-'\" };\n }\n } else if (provider === \"openai\") {\n if (!key.startsWith(\"sk-\")) {\n return { valid: false, error: \"OpenAI API keys should start with 'sk-'\" };\n }\n }\n\n return { valid: true };\n}\n\n/**\n * Get config file path (for display purposes)\n */\nexport function getConfigPath(): string {\n return CONFIG_FILE;\n}\n","import { z } from \"zod\";\n\n/**\n * Risk domains representing different areas of test coverage\n */\nexport const RiskDomainSchema = z.enum([\n \"security\",\n \"data\",\n \"concurrency\",\n \"input\",\n \"resource\",\n \"reliability\",\n \"performance\",\n \"platform\",\n \"business\",\n \"compliance\",\n]);\n\n/**\n * Test levels from unit to chaos engineering\n */\nexport const TestLevelSchema = z.enum([\n \"unit\",\n \"integration\",\n \"system\",\n \"chaos\",\n]);\n\n/**\n * Priority levels for categorizing importance\n */\nexport const PrioritySchema = z.enum([\"P0\", \"P1\", \"P2\"]);\n\n/**\n * Severity levels for gap findings\n */\nexport const SeveritySchema = z.enum([\"critical\", \"high\", \"medium\", \"low\"]);\n\n/**\n * Confidence levels for pattern detection\n */\nexport const ConfidenceSchema = z.enum([\"high\", \"medium\", \"low\"]);\n\n/**\n * Supported programming languages\n */\nexport const LanguageSchema = z.enum([\n \"python\",\n \"typescript\",\n \"javascript\",\n \"go\",\n \"java\",\n \"rust\",\n]);\n\n/**\n * Regex pattern for valid IDs (lowercase, alphanumeric with hyphens)\n */\nconst ID_PATTERN = /^[a-z][a-z0-9-]*$/;\n\n/**\n * Base category schema without nested types\n * Full CategorySchema is defined in index.ts to avoid circular imports\n */\nexport const CategoryBaseSchema = z.object({\n id: z\n .string()\n .regex(ID_PATTERN, \"ID must start with lowercase letter and contain only lowercase letters, numbers, and hyphens\"),\n version: z.number().int().positive(),\n name: z.string().min(1, \"Name is required\").max(100, \"Name too long\"),\n description: z\n .string()\n .min(10, \"Description must be at least 10 characters\")\n .max(2000, \"Description too long\"),\n domain: RiskDomainSchema,\n level: TestLevelSchema,\n priority: PrioritySchema,\n severity: SeveritySchema,\n applicableLanguages: z.array(LanguageSchema).min(1, \"At least one language required\"),\n cves: z.array(z.string()).optional(),\n references: z.array(z.string().url(\"Invalid URL\")).optional(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\n\n// Inferred types\nexport type RiskDomain = z.infer<typeof RiskDomainSchema>;\nexport type TestLevel = z.infer<typeof TestLevelSchema>;\nexport type Priority = z.infer<typeof PrioritySchema>;\nexport type Severity = z.infer<typeof SeveritySchema>;\nexport type Confidence = z.infer<typeof ConfidenceSchema>;\nexport type Language = z.infer<typeof LanguageSchema>;\nexport type CategoryBase = z.infer<typeof CategoryBaseSchema>;\n\n/**\n * All available risk domains\n */\nexport const RISK_DOMAINS = RiskDomainSchema.options;\n\n/**\n * All available test levels\n */\nexport const TEST_LEVELS = TestLevelSchema.options;\n\n/**\n * All available languages\n */\nexport const LANGUAGES = LanguageSchema.options;\n","import { z } from \"zod\";\n\nimport { LanguageSchema, SeveritySchema } from \"./category.schema.js\";\n\n/**\n * Regex pattern for valid IDs (lowercase, alphanumeric with hyphens)\n */\nconst ID_PATTERN = /^[a-z][a-z0-9-]*$/;\n\n/**\n * Schema for example vulnerable code and corresponding tests\n */\nexport const ExampleSchema = z.object({\n /** Unique identifier for this example */\n name: z\n .string()\n .regex(ID_PATTERN, \"Name must start with lowercase letter and contain only lowercase letters, numbers, and hyphens\"),\n\n /** Explanation of the vulnerability/edge case concept */\n concept: z.string().min(20, \"Concept must be at least 20 characters\"),\n\n /** Example of vulnerable or problematic code */\n vulnerableCode: z.string().min(10, \"Vulnerable code must be at least 10 characters\"),\n\n /** Example test code that catches this vulnerability */\n testCode: z.string().min(50, \"Test code must be at least 50 characters\"),\n\n /** Programming language of the example */\n language: LanguageSchema,\n\n /** Severity if this vulnerability is exploited */\n severity: SeveritySchema,\n\n /** Optional related CVE identifier */\n cve: z.string().optional(),\n\n /** Optional link to more information */\n reference: z.string().url().optional(),\n});\n\n// Inferred types\nexport type Example = z.infer<typeof ExampleSchema>;\n","import { z } from \"zod\";\n\nimport { ConfidenceSchema, LanguageSchema } from \"./category.schema.js\";\n\n/**\n * Types of detection patterns\n * - ast: Tree-sitter AST queries\n * - regex: Regular expression patterns\n * - semantic: LLM-assisted semantic analysis\n */\nexport const PatternTypeSchema = z.enum([\"ast\", \"regex\", \"semantic\"]);\n\n/**\n * Regex pattern for valid IDs (lowercase, alphanumeric with hyphens)\n */\nconst ID_PATTERN = /^[a-z][a-z0-9-]*$/;\n\n/**\n * Schema for detection patterns that identify code susceptible to a category\n */\nexport const DetectionPatternSchema = z.object({\n /** Unique identifier for this pattern */\n id: z\n .string()\n .regex(ID_PATTERN, \"ID must start with lowercase letter and contain only lowercase letters, numbers, and hyphens\"),\n\n /** Type of pattern matching to use */\n type: PatternTypeSchema,\n\n /** Target programming language */\n language: LanguageSchema,\n\n /** The pattern string (AST query, regex, or semantic description) */\n pattern: z.string().min(1, \"Pattern is required\"),\n\n /** How confident we are when this pattern matches */\n confidence: ConfidenceSchema,\n\n /** Human-readable description of what this pattern detects */\n description: z.string().min(10, \"Description must be at least 10 characters\"),\n\n /** Optional pattern that indicates code is NOT vulnerable (false positive filter) */\n negativePattern: z.string().optional(),\n\n /** Optional list of framework contexts where this pattern applies */\n frameworks: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for a detection result (pattern match in code)\n */\nexport const DetectionResultSchema = z.object({\n /** ID of the pattern that matched */\n patternId: z.string(),\n\n /** Category this detection belongs to */\n categoryId: z.string(),\n\n /** File path where detection occurred */\n filePath: z.string(),\n\n /** Starting line number (1-indexed) */\n lineStart: z.number().int().positive(),\n\n /** Ending line number (1-indexed) */\n lineEnd: z.number().int().positive(),\n\n /** Code snippet that matched */\n codeSnippet: z.string(),\n\n /** Confidence of this specific match */\n confidence: ConfidenceSchema,\n\n /** Optional additional context */\n context: z.record(z.unknown()).optional(),\n});\n\n// Inferred types\nexport type PatternType = z.infer<typeof PatternTypeSchema>;\nexport type DetectionPattern = z.infer<typeof DetectionPatternSchema>;\nexport type DetectionResult = z.infer<typeof DetectionResultSchema>;\n\n/**\n * All available pattern types\n */\nexport const PATTERN_TYPES = PatternTypeSchema.options;\n","import { z } from \"zod\";\n\nimport { LanguageSchema } from \"./category.schema.js\";\n\n/**\n * Supported test frameworks\n */\nexport const TestFrameworkSchema = z.enum([\n \"pytest\",\n \"unittest\",\n \"jest\",\n \"vitest\",\n \"mocha\",\n \"go-test\",\n \"junit\",\n]);\n\n/**\n * Types for template variables\n */\nexport const VariableTypeSchema = z.enum([\n \"string\",\n \"number\",\n \"boolean\",\n \"array\",\n \"object\",\n]);\n\n/**\n * Regex pattern for valid variable names (camelCase)\n */\nconst VARIABLE_NAME_PATTERN = /^[a-z][a-zA-Z0-9_]*$/;\n\n/**\n * Schema for template variables that get substituted during generation\n */\nexport const TemplateVariableSchema = z.object({\n /** Variable name (used in template as {{name}}) */\n name: z\n .string()\n .regex(VARIABLE_NAME_PATTERN, \"Variable name must be camelCase\"),\n\n /** Type of the variable value */\n type: VariableTypeSchema,\n\n /** Human-readable description */\n description: z.string().min(1, \"Description is required\"),\n\n /** Whether this variable must be provided */\n required: z.boolean().default(true),\n\n /** Default value if not provided */\n defaultValue: z.unknown().optional(),\n});\n\n/**\n * Regex pattern for valid IDs (lowercase, alphanumeric with hyphens)\n */\nconst ID_PATTERN = /^[a-z][a-z0-9-]*$/;\n\n/**\n * Schema for test templates that generate runnable tests\n */\nexport const TestTemplateSchema = z.object({\n /** Unique identifier for this template */\n id: z\n .string()\n .regex(ID_PATTERN, \"ID must start with lowercase letter and contain only lowercase letters, numbers, and hyphens\"),\n\n /** Target programming language */\n language: LanguageSchema,\n\n /** Target test framework */\n framework: TestFrameworkSchema,\n\n /** Template content with {{variable}} placeholders */\n template: z.string().min(50, \"Template must be at least 50 characters\"),\n\n /** Variables that can be substituted in the template */\n variables: z.array(TemplateVariableSchema),\n\n /** Required imports for the generated test */\n imports: z.array(z.string()).optional(),\n\n /** Required fixtures or setup code */\n fixtures: z.array(z.string()).optional(),\n\n /** Description of what this template tests */\n description: z.string().optional(),\n});\n\n// Inferred types\nexport type TestFramework = z.infer<typeof TestFrameworkSchema>;\nexport type VariableType = z.infer<typeof VariableTypeSchema>;\nexport type TemplateVariable = z.infer<typeof TemplateVariableSchema>;\nexport type TestTemplate = z.infer<typeof TestTemplateSchema>;\n\n/**\n * All available test frameworks\n */\nexport const TEST_FRAMEWORKS = TestFrameworkSchema.options;\n","import { z } from \"zod\";\n\nimport {\n CategoryBaseSchema,\n RiskDomainSchema,\n TestLevelSchema,\n PrioritySchema,\n SeveritySchema,\n ConfidenceSchema,\n LanguageSchema,\n RISK_DOMAINS,\n TEST_LEVELS,\n LANGUAGES,\n} from \"./category.schema.js\";\nimport { ExampleSchema } from \"./example.schema.js\";\nimport { DetectionPatternSchema, DetectionResultSchema, PatternTypeSchema, PATTERN_TYPES } from \"./pattern.schema.js\";\nimport { TestTemplateSchema, TemplateVariableSchema, TestFrameworkSchema, VariableTypeSchema, TEST_FRAMEWORKS } from \"./template.schema.js\";\n\n// Re-export all schemas\nexport {\n // Category schemas\n RiskDomainSchema,\n TestLevelSchema,\n PrioritySchema,\n SeveritySchema,\n ConfidenceSchema,\n LanguageSchema,\n CategoryBaseSchema,\n // Pattern schemas\n PatternTypeSchema,\n DetectionPatternSchema,\n DetectionResultSchema,\n // Template schemas\n TestFrameworkSchema,\n TemplateVariableSchema,\n VariableTypeSchema,\n TestTemplateSchema,\n // Example schema\n ExampleSchema,\n // Constants\n RISK_DOMAINS,\n TEST_LEVELS,\n LANGUAGES,\n PATTERN_TYPES,\n TEST_FRAMEWORKS,\n};\n\n// Re-export all types\nexport type {\n RiskDomain,\n TestLevel,\n Priority,\n Severity,\n Confidence,\n Language,\n CategoryBase,\n} from \"./category.schema.js\";\n\nexport type {\n PatternType,\n DetectionPattern,\n DetectionResult,\n} from \"./pattern.schema.js\";\n\nexport type {\n TestFramework,\n VariableType,\n TemplateVariable,\n TestTemplate,\n} from \"./template.schema.js\";\n\nexport type { Example } from \"./example.schema.js\";\n\n/**\n * Complete Category schema with all nested types\n */\nexport const CategorySchema = CategoryBaseSchema.extend({\n detectionPatterns: z.array(DetectionPatternSchema).min(1, \"At least one detection pattern required\"),\n testTemplates: z.array(TestTemplateSchema).min(1, \"At least one test template required\"),\n examples: z.array(ExampleSchema).min(1, \"At least one example required\"),\n});\n\n/**\n * Complete Category type\n */\nexport type Category = z.infer<typeof CategorySchema>;\n\n/**\n * Category without nested arrays (for partial loading)\n */\nexport const CategorySummarySchema = CategoryBaseSchema.pick({\n id: true,\n name: true,\n domain: true,\n level: true,\n priority: true,\n severity: true,\n description: true,\n});\n\nexport type CategorySummary = z.infer<typeof CategorySummarySchema>;\n","import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport YAML from \"yaml\";\n\nimport { ValidationError, CategoryNotFoundError } from \"../../lib/errors.js\";\nimport { ok, err, all, tryCatchAsync } from \"../../lib/result.js\";\nimport { CategorySchema, CategorySummarySchema } from \"../schema/index.js\";\n\nimport type { Result } from \"../../lib/result.js\";\nimport type {\n Category,\n CategorySummary,\n RiskDomain,\n TestLevel,\n Language,\n Priority,\n Severity,\n} from \"../schema/index.js\";\n\n/**\n * Options for filtering categories\n */\nexport interface CategoryFilter {\n domain?: RiskDomain;\n level?: TestLevel;\n language?: Language;\n priority?: Priority;\n severity?: Severity;\n}\n\n/**\n * Options for searching categories\n */\nexport interface SearchOptions {\n query: string;\n filter?: CategoryFilter;\n limit?: number;\n}\n\n/**\n * Search result with relevance score\n */\nexport interface SearchResult {\n category: CategorySummary;\n score: number;\n matches: string[];\n}\n\n/**\n * Store for managing test categories\n *\n * Provides:\n * - CRUD operations for categories\n * - Indexing by domain, level, language\n * - Full-text search\n * - Validation on load\n */\nexport class CategoryStore {\n /** All loaded categories by ID */\n private categories: Map<string, Category> = new Map();\n\n /** Index by domain */\n private domainIndex: Map<RiskDomain, Set<string>> = new Map();\n\n /** Index by level */\n private levelIndex: Map<TestLevel, Set<string>> = new Map();\n\n /** Index by language */\n private languageIndex: Map<Language, Set<string>> = new Map();\n\n /** Index by priority */\n private priorityIndex: Map<Priority, Set<string>> = new Map();\n\n /** Search index: word -> category IDs */\n private searchIndex: Map<string, Set<string>> = new Map();\n\n /** Version tracking for loaded categories */\n private versions: Map<string, number> = new Map();\n\n /**\n * Get total number of loaded categories\n */\n get size(): number {\n return this.categories.size;\n }\n\n /**\n * Load a single category into the store\n */\n add(category: Category): Result<Category, ValidationError> {\n // Validate the category\n const validation = CategorySchema.safeParse(category);\n if (!validation.success) {\n return err(\n new ValidationError(\"Invalid category\", {\n categoryId: category.id,\n issues: validation.error.issues,\n })\n );\n }\n\n const validated = validation.data;\n\n // Check for duplicate ID\n const existing = this.categories.get(validated.id);\n if (existing !== undefined) {\n // Allow update if version is higher\n const existingVersion = this.versions.get(validated.id) ?? 0;\n if (validated.version <= existingVersion) {\n return err(\n new ValidationError(`Category ${validated.id} already exists with same or higher version`, {\n categoryId: validated.id,\n existingVersion,\n newVersion: validated.version,\n })\n );\n }\n // Remove old indexes before updating\n this.removeFromIndexes(existing);\n }\n\n // Store category\n this.categories.set(validated.id, validated);\n this.versions.set(validated.id, validated.version);\n\n // Update indexes\n this.addToIndexes(validated);\n\n return ok(validated);\n }\n\n /**\n * Get a category by ID\n */\n get(id: string): Result<Category, CategoryNotFoundError> {\n const category = this.categories.get(id);\n if (category === undefined) {\n return err(new CategoryNotFoundError(id));\n }\n return ok(category);\n }\n\n /**\n * Check if a category exists\n */\n has(id: string): boolean {\n return this.categories.has(id);\n }\n\n /**\n * Remove a category by ID\n */\n remove(id: string): Result<Category, CategoryNotFoundError> {\n const category = this.categories.get(id);\n if (category === undefined) {\n return err(new CategoryNotFoundError(id));\n }\n\n this.removeFromIndexes(category);\n this.categories.delete(id);\n this.versions.delete(id);\n\n return ok(category);\n }\n\n /**\n * List all categories, optionally filtered\n */\n list(filter?: CategoryFilter): CategorySummary[] {\n let ids: Set<string> | undefined;\n\n // Apply filters by intersecting index sets\n if (filter?.domain !== undefined) {\n const domainIds = this.domainIndex.get(filter.domain);\n if (domainIds === undefined) return []; // No categories in this domain\n ids = this.intersect(ids, domainIds);\n }\n if (filter?.level !== undefined) {\n const levelIds = this.levelIndex.get(filter.level);\n if (levelIds === undefined) return []; // No categories at this level\n ids = this.intersect(ids, levelIds);\n }\n if (filter?.language !== undefined) {\n const langIds = this.languageIndex.get(filter.language);\n if (langIds === undefined) return []; // No categories for this language\n ids = this.intersect(ids, langIds);\n }\n if (filter?.priority !== undefined) {\n const priorityIds = this.priorityIndex.get(filter.priority);\n if (priorityIds === undefined) return []; // No categories at this priority\n ids = this.intersect(ids, priorityIds);\n }\n\n // Get categories for matching IDs\n const categories: CategorySummary[] = [];\n const targetIds = ids ?? this.categories.keys();\n\n for (const id of targetIds) {\n const category = this.categories.get(id);\n if (category !== undefined) {\n // Apply severity filter if specified\n if (filter?.severity !== undefined && category.severity !== filter.severity) {\n continue;\n }\n categories.push(this.toSummary(category));\n }\n }\n\n // Sort by priority, then severity, then name\n return categories.sort((a, b) => {\n const priorityOrder = { P0: 0, P1: 1, P2: 2 };\n const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n\n const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];\n if (priorityDiff !== 0) return priorityDiff;\n\n const severityDiff = severityOrder[a.severity] - severityOrder[b.severity];\n if (severityDiff !== 0) return severityDiff;\n\n return a.name.localeCompare(b.name);\n });\n }\n\n /**\n * Get all categories in a specific domain\n */\n byDomain(domain: RiskDomain): CategorySummary[] {\n return this.list({ domain });\n }\n\n /**\n * Get all categories at a specific test level\n */\n byLevel(level: TestLevel): CategorySummary[] {\n return this.list({ level });\n }\n\n /**\n * Get all categories applicable to a language\n */\n byLanguage(language: Language): CategorySummary[] {\n return this.list({ language });\n }\n\n /**\n * Full-text search across categories\n */\n search(options: SearchOptions): SearchResult[] {\n const { query, filter, limit = 20 } = options;\n\n // Tokenize query\n const queryTokens = this.tokenize(query.toLowerCase());\n if (queryTokens.length === 0) {\n return [];\n }\n\n // Find matching category IDs\n const scores: Map<string, { score: number; matches: string[] }> = new Map();\n\n for (const token of queryTokens) {\n // Exact match\n const exactMatches = this.searchIndex.get(token);\n if (exactMatches !== undefined) {\n for (const id of exactMatches) {\n const current = scores.get(id) ?? { score: 0, matches: [] };\n current.score += 10; // Exact match weight\n current.matches.push(token);\n scores.set(id, current);\n }\n }\n\n // Prefix match\n for (const [indexToken, ids] of this.searchIndex) {\n if (indexToken.startsWith(token) && indexToken !== token) {\n for (const id of ids) {\n const current = scores.get(id) ?? { score: 0, matches: [] };\n current.score += 5; // Prefix match weight\n if (!current.matches.includes(token)) {\n current.matches.push(token);\n }\n scores.set(id, current);\n }\n }\n }\n }\n\n // Build results with category data\n const results: SearchResult[] = [];\n\n for (const [id, { score, matches }] of scores) {\n const category = this.categories.get(id);\n if (category === undefined) continue;\n\n // Apply filters\n if (filter !== undefined) {\n if (filter.domain !== undefined && category.domain !== filter.domain) continue;\n if (filter.level !== undefined && category.level !== filter.level) continue;\n if (filter.priority !== undefined && category.priority !== filter.priority) continue;\n if (filter.severity !== undefined && category.severity !== filter.severity) continue;\n if (\n filter.language !== undefined &&\n !category.applicableLanguages.includes(filter.language)\n ) {\n continue;\n }\n }\n\n results.push({\n category: this.toSummary(category),\n score,\n matches: [...new Set(matches)],\n });\n }\n\n // Sort by score descending, then by priority\n results.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n const priorityOrder = { P0: 0, P1: 1, P2: 2 };\n return priorityOrder[a.category.priority] - priorityOrder[b.category.priority];\n });\n\n return results.slice(0, limit);\n }\n\n /**\n * Load categories from a directory of YAML files\n */\n async loadFromDirectory(dirPath: string): Promise<Result<number, ValidationError>> {\n const results = await this.loadYamlFilesRecursive(dirPath);\n const combined = all(results);\n\n if (!combined.success) {\n return combined;\n }\n\n return ok(combined.data.length);\n }\n\n /**\n * Load a single category from a YAML file\n */\n async loadFromFile(filePath: string): Promise<Result<Category, ValidationError>> {\n const result = await tryCatchAsync(async () => {\n const content = await fs.readFile(filePath, \"utf-8\");\n return YAML.parse(content) as unknown;\n });\n\n if (!result.success) {\n return err(\n new ValidationError(`Failed to read category file: ${filePath}`, {\n filePath,\n cause: result.error.message,\n })\n );\n }\n\n const validation = CategorySchema.safeParse(result.data);\n if (!validation.success) {\n return err(\n new ValidationError(`Invalid category in ${filePath}`, {\n filePath,\n issues: validation.error.issues,\n })\n );\n }\n\n return this.add(validation.data);\n }\n\n /**\n * Export all categories as an array\n */\n toArray(): Category[] {\n return Array.from(this.categories.values());\n }\n\n /**\n * Clear all categories and indexes\n */\n clear(): void {\n this.categories.clear();\n this.domainIndex.clear();\n this.levelIndex.clear();\n this.languageIndex.clear();\n this.priorityIndex.clear();\n this.searchIndex.clear();\n this.versions.clear();\n }\n\n /**\n * Get statistics about loaded categories\n */\n stats(): {\n total: number;\n byDomain: Record<string, number>;\n byLevel: Record<string, number>;\n byPriority: Record<string, number>;\n } {\n const byDomain: Record<string, number> = {};\n const byLevel: Record<string, number> = {};\n const byPriority: Record<string, number> = {};\n\n for (const [domain, ids] of this.domainIndex) {\n byDomain[domain] = ids.size;\n }\n for (const [level, ids] of this.levelIndex) {\n byLevel[level] = ids.size;\n }\n for (const [priority, ids] of this.priorityIndex) {\n byPriority[priority] = ids.size;\n }\n\n return {\n total: this.categories.size,\n byDomain,\n byLevel,\n byPriority,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Private methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Add category to all indexes\n */\n private addToIndexes(category: Category): void {\n const id = category.id;\n\n // Domain index\n this.addToIndex(this.domainIndex, category.domain, id);\n\n // Level index\n this.addToIndex(this.levelIndex, category.level, id);\n\n // Language index (multiple)\n for (const lang of category.applicableLanguages) {\n this.addToIndex(this.languageIndex, lang, id);\n }\n\n // Priority index\n this.addToIndex(this.priorityIndex, category.priority, id);\n\n // Search index\n this.indexForSearch(category);\n }\n\n /**\n * Remove category from all indexes\n */\n private removeFromIndexes(category: Category): void {\n const id = category.id;\n\n this.removeFromIndex(this.domainIndex, category.domain, id);\n this.removeFromIndex(this.levelIndex, category.level, id);\n for (const lang of category.applicableLanguages) {\n this.removeFromIndex(this.languageIndex, lang, id);\n }\n this.removeFromIndex(this.priorityIndex, category.priority, id);\n this.removeFromSearchIndex(id);\n }\n\n /**\n * Add ID to an index map\n */\n private addToIndex<K>(index: Map<K, Set<string>>, key: K, id: string): void {\n let set = index.get(key);\n if (set === undefined) {\n set = new Set();\n index.set(key, set);\n }\n set.add(id);\n }\n\n /**\n * Remove ID from an index map\n */\n private removeFromIndex<K>(index: Map<K, Set<string>>, key: K, id: string): void {\n const set = index.get(key);\n if (set !== undefined) {\n set.delete(id);\n if (set.size === 0) {\n index.delete(key);\n }\n }\n }\n\n /**\n * Index category text for search\n */\n private indexForSearch(category: Category): void {\n const id = category.id;\n const textToIndex = [\n category.id,\n category.name,\n category.description,\n category.domain,\n category.level,\n ...category.applicableLanguages,\n ...(category.cves ?? []),\n ].join(\" \");\n\n const tokens = this.tokenize(textToIndex.toLowerCase());\n for (const token of tokens) {\n this.addToIndex(this.searchIndex, token, id);\n }\n }\n\n /**\n * Remove category from search index\n */\n private removeFromSearchIndex(id: string): void {\n for (const [token, ids] of this.searchIndex) {\n ids.delete(id);\n if (ids.size === 0) {\n this.searchIndex.delete(token);\n }\n }\n }\n\n /**\n * Tokenize text for search indexing\n */\n private tokenize(text: string): string[] {\n return text\n .split(/[\\s\\-_.,;:!?'\"()\\[\\]{}]+/)\n .filter((token) => token.length >= 2)\n .map((token) => token.toLowerCase());\n }\n\n /**\n * Intersect two sets, handling undefined\n * Returns empty set if either input is empty set (filter found no matches)\n */\n private intersect(a: Set<string> | undefined, b: Set<string> | undefined): Set<string> | undefined {\n if (a === undefined) return b;\n if (b === undefined) return a;\n // If b is empty (filter matched nothing), return empty set\n if (b.size === 0) return new Set();\n return new Set([...a].filter((x) => b.has(x)));\n }\n\n /**\n * Convert full category to summary\n */\n private toSummary(category: Category): CategorySummary {\n return CategorySummarySchema.parse({\n id: category.id,\n name: category.name,\n domain: category.domain,\n level: category.level,\n priority: category.priority,\n severity: category.severity,\n description: category.description,\n });\n }\n\n /**\n * Recursively load YAML files from directory\n */\n private async loadYamlFilesRecursive(dirPath: string): Promise<Result<Category, ValidationError>[]> {\n const results: Result<Category, ValidationError>[] = [];\n\n const loadResult = await tryCatchAsync(async () => {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n return entries;\n });\n\n if (!loadResult.success) {\n return [\n err(\n new ValidationError(`Failed to read directory: ${dirPath}`, {\n dirPath,\n cause: loadResult.error.message,\n })\n ),\n ];\n }\n\n for (const entry of loadResult.data) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n const subResults = await this.loadYamlFilesRecursive(fullPath);\n results.push(...subResults);\n } else if (entry.isFile() && (entry.name.endsWith(\".yml\") || entry.name.endsWith(\".yaml\"))) {\n const result = await this.loadFromFile(fullPath);\n results.push(result);\n }\n }\n\n return results;\n }\n}\n\n/**\n * Create a new CategoryStore instance\n */\nexport function createCategoryStore(): CategoryStore {\n return new CategoryStore();\n}\n","import { readFile, readdir, stat } from \"fs/promises\";\nimport { resolve, extname } from \"path\";\n\nimport { DetectionResultSchema } from \"../../categories/schema/index.js\";\nimport { PinataError, AnalysisError, ParseError } from \"../../lib/errors.js\";\nimport { logger } from \"../../lib/logger.js\";\nimport { ok, err, tryCatchAsync } from \"../../lib/result.js\";\n\nimport {\n AstPatternMatcher,\n createAstMatcher,\n type AstMatch,\n} from \"./ast-parser.js\";\n\nimport type {\n DetectionPattern,\n DetectionResult,\n Language,\n Confidence,\n} from \"../../categories/schema/index.js\";\nimport type { Result } from \"../../lib/result.js\";\n\n\n\n/**\n * File extension to language mapping\n */\nconst EXTENSION_TO_LANGUAGE: Record<string, Language> = {\n \".py\": \"python\",\n \".ts\": \"typescript\",\n \".tsx\": \"typescript\",\n \".js\": \"javascript\",\n \".jsx\": \"javascript\",\n \".go\": \"go\",\n \".java\": \"java\",\n \".rs\": \"rust\",\n};\n\n/**\n * Maximum file size to scan (10MB)\n */\nconst MAX_FILE_SIZE = 10 * 1024 * 1024;\n\n/**\n * Maximum lines to include in snippet\n */\nconst MAX_SNIPPET_LINES = 5;\n\n/**\n * Options for pattern matching\n */\nexport interface PatternMatcherOptions {\n /** Base directory for relative paths */\n basePath?: string;\n /** Maximum file size to scan in bytes */\n maxFileSize?: number;\n /** File extensions to include (e.g., ['.ts', '.py']) */\n includeExtensions?: string[];\n /** Directories to exclude (e.g., ['node_modules', '.git']) */\n excludeDirs?: string[];\n /** Whether to include hidden files */\n includeHidden?: boolean;\n /** Maximum depth for directory traversal (-1 for unlimited) */\n maxDepth?: number;\n}\n\n/**\n * Options for file scanning\n */\nexport interface ScanOptions extends PatternMatcherOptions {\n /** Category ID to associate with results */\n categoryId: string;\n}\n\n/**\n * Single match within a file\n */\nexport interface PatternMatch {\n /** The pattern that matched */\n pattern: DetectionPattern;\n /** Starting line number (1-indexed) */\n lineStart: number;\n /** Ending line number (1-indexed) */\n lineEnd: number;\n /** Column where match starts (0-indexed) */\n columnStart: number;\n /** Column where match ends (0-indexed) */\n columnEnd: number;\n /** The matched text */\n matchText: string;\n /** Code snippet with context */\n codeSnippet: string;\n}\n\n/**\n * Result of scanning a single file\n */\nexport interface FileScanResult {\n /** Path to the file */\n filePath: string;\n /** Detected language */\n language: Language | null;\n /** Pattern matches found */\n matches: PatternMatch[];\n /** Time taken to scan in milliseconds */\n scanTimeMs: number;\n /** Any warnings (e.g., file too large) */\n warnings: string[];\n}\n\n/**\n * Aggregated results across multiple files\n */\nexport interface AggregatedResults {\n /** Total files scanned */\n totalFiles: number;\n /** Files with at least one match */\n filesWithMatches: number;\n /** Total matches found */\n totalMatches: number;\n /** Results grouped by category ID */\n byCategory: Map<string, DetectionResult[]>;\n /** Results grouped by pattern ID */\n byPattern: Map<string, DetectionResult[]>;\n /** Results grouped by file path */\n byFile: Map<string, DetectionResult[]>;\n /** Results grouped by confidence level */\n byConfidence: Map<Confidence, DetectionResult[]>;\n /** Total scan time in milliseconds */\n totalScanTimeMs: number;\n /** Warnings encountered */\n warnings: string[];\n}\n\n/**\n * PatternMatcher - Core pattern detection engine\n *\n * Scans source files for patterns defined in categories and returns\n * structured detection results with file paths, line numbers, and\n * matched pattern details.\n *\n * Supports multiple pattern types:\n * - **regex**: Regular expression patterns (fast, broad matching)\n * - **ast**: Tree-sitter AST queries (precise, structural matching)\n * - **semantic**: LLM-assisted semantic analysis (future)\n *\n * @example\n * ```typescript\n * const matcher = new PatternMatcher();\n *\n * // Scan a single file\n * const patterns = category.detectionPatterns;\n * const result = await matcher.scanFile(filePath, patterns, {\n * categoryId: category.id,\n * });\n *\n * // Scan a directory\n * const results = await matcher.scanDirectory(dirPath, patterns, {\n * categoryId: category.id,\n * excludeDirs: ['node_modules', '.git'],\n * });\n *\n * // Aggregate results\n * const aggregated = matcher.aggregateResults(results);\n * ```\n */\nexport class PatternMatcher {\n private readonly defaultOptions: Required<PatternMatcherOptions>;\n private readonly log = logger.child(\"PatternMatcher\");\n private readonly astMatcher: AstPatternMatcher;\n private astAvailable: boolean | null = null;\n\n constructor(options: PatternMatcherOptions = {}) {\n this.defaultOptions = {\n basePath: process.cwd(),\n maxFileSize: options.maxFileSize ?? MAX_FILE_SIZE,\n includeExtensions: options.includeExtensions ?? Object.keys(EXTENSION_TO_LANGUAGE),\n excludeDirs: options.excludeDirs ?? [\"node_modules\", \".git\", \"dist\", \"build\", \"__pycache__\", \".venv\", \"venv\"],\n includeHidden: options.includeHidden ?? false,\n maxDepth: options.maxDepth ?? -1,\n };\n this.astMatcher = createAstMatcher();\n }\n\n /**\n * Check if AST pattern matching is available\n */\n isAstAvailable(): boolean {\n return this.astMatcher.getSupportedLanguages().length > 0;\n }\n\n /**\n * Get the AST matcher instance for direct access\n */\n getAstMatcher(): AstPatternMatcher {\n return this.astMatcher;\n }\n\n /**\n * Scan a single file for pattern matches\n *\n * @param filePath - Path to the file to scan\n * @param patterns - Detection patterns to match against\n * @param options - Scan options including categoryId\n * @returns Result containing FileScanResult or an error\n */\n async scanFile(\n filePath: string,\n patterns: DetectionPattern[],\n options: ScanOptions\n ): Promise<Result<FileScanResult, PinataError>> {\n const startTime = performance.now();\n const absolutePath = resolve(options.basePath ?? this.defaultOptions.basePath, filePath);\n const warnings: string[] = [];\n\n // Check file exists and get stats\n const statsResult = await tryCatchAsync(() => stat(absolutePath));\n if (!statsResult.success) {\n return err(new ParseError(`File not found: ${filePath}`, absolutePath));\n }\n\n const fileStats = statsResult.data;\n if (!fileStats.isFile()) {\n return err(new ParseError(`Not a file: ${filePath}`, absolutePath));\n }\n\n // Check file size\n const maxSize = options.maxFileSize ?? this.defaultOptions.maxFileSize;\n if (fileStats.size > maxSize) {\n warnings.push(`File exceeds maximum size (${fileStats.size} > ${maxSize})`);\n return ok({\n filePath: absolutePath,\n language: null,\n matches: [],\n scanTimeMs: performance.now() - startTime,\n warnings,\n });\n }\n\n // Determine language from extension\n const ext = extname(absolutePath).toLowerCase();\n const language = EXTENSION_TO_LANGUAGE[ext] ?? null;\n\n // Read file content\n const contentResult = await tryCatchAsync(() => readFile(absolutePath, \"utf-8\"));\n if (!contentResult.success) {\n return err(new ParseError(`Failed to read file: ${contentResult.error.message}`, absolutePath));\n }\n\n const content = contentResult.data;\n const lines = content.split(\"\\n\");\n\n // Filter patterns for this language\n const applicablePatterns = patterns.filter((p) => {\n if (language === null) return false;\n // TypeScript patterns also apply to JavaScript files\n if (p.language === \"typescript\" && language === \"javascript\") return true;\n if (p.language === \"javascript\" && language === \"typescript\") return true;\n return p.language === language;\n });\n\n // Match patterns\n const matches: PatternMatch[] = [];\n\n for (const pattern of applicablePatterns) {\n if (pattern.type === \"regex\") {\n const patternMatches = this.matchRegexPattern(pattern, content, lines);\n matches.push(...patternMatches);\n } else if (pattern.type === \"ast\") {\n // AST pattern matching using tree-sitter\n const astMatches = await this.matchAstPattern(pattern, content, lines, language!);\n matches.push(...astMatches);\n }\n // Semantic patterns to be implemented later (LLM-assisted)\n }\n\n // Apply negative patterns to filter false positives\n const filteredMatches = this.applyNegativePatterns(matches, content, patterns);\n\n return ok({\n filePath: absolutePath,\n language,\n matches: filteredMatches,\n scanTimeMs: performance.now() - startTime,\n warnings,\n });\n }\n\n /**\n * Scan a directory recursively for pattern matches\n *\n * @param dirPath - Path to the directory to scan\n * @param patterns - Detection patterns to match against\n * @param options - Scan options including categoryId\n * @returns Result containing array of DetectionResults or an error\n */\n async scanDirectory(\n dirPath: string,\n patterns: DetectionPattern[],\n options: ScanOptions\n ): Promise<Result<DetectionResult[], PinataError>> {\n const absolutePath = resolve(options.basePath ?? this.defaultOptions.basePath, dirPath);\n const results: DetectionResult[] = [];\n const warnings: string[] = [];\n\n // Get all files recursively\n const filesResult = await this.getFilesRecursive(absolutePath, 0, options);\n if (!filesResult.success) {\n return err(filesResult.error);\n }\n\n const files = filesResult.data;\n this.log.debug(`Scanning ${files.length} files in ${dirPath}`);\n\n // Scan each file\n for (const file of files) {\n const scanResult = await this.scanFile(file, patterns, {\n ...options,\n basePath: \"\", // Files are already absolute paths\n });\n\n if (scanResult.success) {\n warnings.push(...scanResult.data.warnings);\n\n // Convert matches to DetectionResults\n for (const match of scanResult.data.matches) {\n const detectionResult = this.matchToDetectionResult(\n match,\n file,\n options.categoryId\n );\n results.push(detectionResult);\n }\n } else {\n warnings.push(`Error scanning ${file}: ${scanResult.error.message}`);\n }\n }\n\n if (warnings.length > 0) {\n this.log.warn(`Scan completed with ${warnings.length} warnings`);\n }\n\n return ok(results);\n }\n\n /**\n * Aggregate detection results for analysis\n *\n * @param results - Array of detection results to aggregate\n * @param scanTimeMs - Total scan time in milliseconds\n * @returns Aggregated results with various groupings\n */\n aggregateResults(results: DetectionResult[], scanTimeMs: number = 0): AggregatedResults {\n const byCategory = new Map<string, DetectionResult[]>();\n const byPattern = new Map<string, DetectionResult[]>();\n const byFile = new Map<string, DetectionResult[]>();\n const byConfidence = new Map<Confidence, DetectionResult[]>();\n const filesWithMatches = new Set<string>();\n\n for (const result of results) {\n filesWithMatches.add(result.filePath);\n\n // Group by category\n if (!byCategory.has(result.categoryId)) {\n byCategory.set(result.categoryId, []);\n }\n byCategory.get(result.categoryId)!.push(result);\n\n // Group by pattern\n if (!byPattern.has(result.patternId)) {\n byPattern.set(result.patternId, []);\n }\n byPattern.get(result.patternId)!.push(result);\n\n // Group by file\n if (!byFile.has(result.filePath)) {\n byFile.set(result.filePath, []);\n }\n byFile.get(result.filePath)!.push(result);\n\n // Group by confidence\n if (!byConfidence.has(result.confidence)) {\n byConfidence.set(result.confidence, []);\n }\n byConfidence.get(result.confidence)!.push(result);\n }\n\n return {\n totalFiles: byFile.size,\n filesWithMatches: filesWithMatches.size,\n totalMatches: results.length,\n byCategory,\n byPattern,\n byFile,\n byConfidence,\n totalScanTimeMs: scanTimeMs,\n warnings: [],\n };\n }\n\n /**\n * Match a regex pattern against file content\n */\n private matchRegexPattern(\n pattern: DetectionPattern,\n content: string,\n lines: string[]\n ): PatternMatch[] {\n const matches: PatternMatch[] = [];\n\n try {\n // Create regex with global and multiline flags\n const regex = new RegExp(pattern.pattern, \"gm\");\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(content)) !== null) {\n // Calculate line number from offset\n const lineStart = this.getLineNumber(content, match.index);\n const lineEnd = this.getLineNumber(content, match.index + match[0].length);\n\n // Get column positions\n const lineStartOffset = this.getLineStartOffset(content, match.index);\n const columnStart = match.index - lineStartOffset;\n const columnEnd = columnStart + match[0].length;\n\n // Build code snippet with context\n const codeSnippet = this.buildCodeSnippet(lines, lineStart, lineEnd);\n\n matches.push({\n pattern,\n lineStart,\n lineEnd,\n columnStart,\n columnEnd,\n matchText: match[0],\n codeSnippet,\n });\n\n // Prevent infinite loops on zero-width matches\n if (match[0].length === 0) {\n regex.lastIndex++;\n }\n }\n } catch (e) {\n this.log.warn(`Invalid regex pattern '${pattern.id}': ${e}`);\n }\n\n return matches;\n }\n\n /**\n * Match an AST pattern against file content using tree-sitter\n *\n * AST patterns use tree-sitter query syntax for precise structural matching.\n * This is more accurate than regex for detecting code patterns that depend\n * on syntax structure (e.g., function calls, string interpolation).\n *\n * @param pattern Detection pattern with type === \"ast\"\n * @param content File content\n * @param lines File content split into lines\n * @param language Programming language\n * @returns Array of pattern matches\n */\n private async matchAstPattern(\n pattern: DetectionPattern,\n content: string,\n lines: string[],\n language: Language\n ): Promise<PatternMatch[]> {\n const matches: PatternMatch[] = [];\n\n // Check if AST parsing is available for this language\n if (!this.astMatcher.isLanguageSupported(language)) {\n this.log.debug(`AST parsing not available for ${language}, skipping pattern ${pattern.id}`);\n return matches;\n }\n\n try {\n const astResult = await this.astMatcher.query(content, pattern.pattern, language);\n\n if (!astResult.success) {\n this.log.warn(`AST query failed for pattern '${pattern.id}': ${astResult.error.message}`);\n return matches;\n }\n\n // Convert AST matches to PatternMatch format\n // Filter to only include matches with the main capture (typically @call or similar)\n const seenLocations = new Set<string>();\n\n for (const astMatch of astResult.data) {\n // Skip duplicate locations (same match can have multiple captures)\n const locationKey = `${astMatch.startLine}:${astMatch.startColumn}:${astMatch.endLine}:${astMatch.endColumn}`;\n if (seenLocations.has(locationKey)) {\n continue;\n }\n\n // Only include primary captures (skip helper captures like @method, @concat)\n // Primary captures are typically named @call, @match, @target, or similar\n const primaryCaptures = [\"call\", \"match\", \"target\", \"vulnerable\", \"detection\", \"assertion\"];\n const isPrimary = primaryCaptures.some((name) => astMatch.captureName.includes(name));\n\n if (!isPrimary && astMatch.captureName.startsWith(\"@\") === false) {\n // This is a helper capture, skip it\n continue;\n }\n\n seenLocations.add(locationKey);\n\n // Convert from 0-indexed to 1-indexed line numbers\n const lineStart = astMatch.startLine + 1;\n const lineEnd = astMatch.endLine + 1;\n\n // Build code snippet\n const codeSnippet = this.buildCodeSnippet(lines, lineStart, lineEnd);\n\n matches.push({\n pattern,\n lineStart,\n lineEnd,\n columnStart: astMatch.startColumn,\n columnEnd: astMatch.endColumn,\n matchText: astMatch.text,\n codeSnippet,\n });\n }\n } catch (e) {\n this.log.warn(`AST pattern error '${pattern.id}': ${e instanceof Error ? e.message : String(e)}`);\n }\n\n return matches;\n }\n\n /**\n * Detect AST patterns in source code\n *\n * Convenience method for direct AST pattern detection without going through\n * the full scanFile flow. Useful for testing and one-off queries.\n *\n * @param source Source code content\n * @param query Tree-sitter query string\n * @param language Programming language\n * @returns AST matches or error\n */\n async detectAstPattern(\n source: string,\n query: string,\n language: Language\n ): Promise<Result<AstMatch[], PinataError>> {\n if (!this.astMatcher.isLanguageSupported(language)) {\n return err(new AnalysisError(`AST parsing not supported for ${language}`));\n }\n\n return this.astMatcher.query(source, query, language);\n }\n\n /**\n * Apply negative patterns to filter out false positives\n */\n private applyNegativePatterns(\n matches: PatternMatch[],\n content: string,\n patterns: DetectionPattern[]\n ): PatternMatch[] {\n return matches.filter((match) => {\n const negativePattern = match.pattern.negativePattern;\n if (!negativePattern) return true;\n\n try {\n const negativeRegex = new RegExp(negativePattern);\n // Check if the matched code or surrounding context matches the negative pattern\n const surroundingCode = this.getSurroundingCode(content, match);\n return !negativeRegex.test(surroundingCode);\n } catch {\n return true; // Invalid negative pattern, keep the match\n }\n });\n }\n\n /**\n * Get code surrounding a match for negative pattern checking\n */\n private getSurroundingCode(content: string, match: PatternMatch): string {\n const lines = content.split(\"\\n\");\n const startLine = Math.max(0, match.lineStart - 3);\n const endLine = Math.min(lines.length, match.lineEnd + 2);\n return lines.slice(startLine, endLine).join(\"\\n\");\n }\n\n /**\n * Get line number from character offset\n */\n private getLineNumber(content: string, offset: number): number {\n let line = 1;\n for (let i = 0; i < offset && i < content.length; i++) {\n if (content[i] === \"\\n\") {\n line++;\n }\n }\n return line;\n }\n\n /**\n * Get the character offset of the start of the line containing the given offset\n */\n private getLineStartOffset(content: string, offset: number): number {\n let lineStart = offset;\n while (lineStart > 0 && content[lineStart - 1] !== \"\\n\") {\n lineStart--;\n }\n return lineStart;\n }\n\n /**\n * Build a code snippet with context around the match\n */\n private buildCodeSnippet(lines: string[], lineStart: number, lineEnd: number): string {\n const startLine = Math.max(0, lineStart - 2); // 1 line before\n const endLine = Math.min(lines.length, lineEnd + 1); // 1 line after\n\n // Limit snippet size\n const snippetLines = lines.slice(startLine, Math.min(endLine, startLine + MAX_SNIPPET_LINES));\n\n return snippetLines\n .map((line, i) => {\n const lineNum = startLine + i + 1;\n const marker = lineNum >= lineStart && lineNum <= lineEnd ? \">\" : \" \";\n return `${marker} ${lineNum.toString().padStart(4)}| ${line}`;\n })\n .join(\"\\n\");\n }\n\n /**\n * Convert a PatternMatch to a DetectionResult\n */\n private matchToDetectionResult(\n match: PatternMatch,\n filePath: string,\n categoryId: string\n ): DetectionResult {\n return DetectionResultSchema.parse({\n patternId: match.pattern.id,\n categoryId,\n filePath,\n lineStart: match.lineStart,\n lineEnd: match.lineEnd,\n codeSnippet: match.codeSnippet,\n confidence: match.pattern.confidence,\n context: {\n matchText: match.matchText,\n columnStart: match.columnStart,\n columnEnd: match.columnEnd,\n patternDescription: match.pattern.description,\n },\n });\n }\n\n /**\n * Recursively get all files in a directory\n */\n private async getFilesRecursive(\n dirPath: string,\n currentDepth: number,\n options: PatternMatcherOptions\n ): Promise<Result<string[], PinataError>> {\n const maxDepth = options.maxDepth ?? this.defaultOptions.maxDepth;\n if (maxDepth !== -1 && currentDepth > maxDepth) {\n return ok([]);\n }\n\n const entriesResult = await tryCatchAsync(() => readdir(dirPath, { withFileTypes: true }));\n if (!entriesResult.success) {\n return err(new AnalysisError(`Failed to read directory: ${dirPath}`, {\n cause: entriesResult.error.message,\n }));\n }\n\n const files: string[] = [];\n const excludeDirs = options.excludeDirs ?? this.defaultOptions.excludeDirs;\n const includeExtensions = options.includeExtensions ?? this.defaultOptions.includeExtensions;\n const includeHidden = options.includeHidden ?? this.defaultOptions.includeHidden;\n\n for (const entry of entriesResult.data) {\n // Skip hidden files/directories unless explicitly included\n if (!includeHidden && entry.name.startsWith(\".\")) {\n continue;\n }\n\n const fullPath = resolve(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip excluded directories\n if (excludeDirs.includes(entry.name)) {\n continue;\n }\n\n // Recurse into subdirectory\n const subFilesResult = await this.getFilesRecursive(fullPath, currentDepth + 1, options);\n if (subFilesResult.success) {\n files.push(...subFilesResult.data);\n }\n } else if (entry.isFile()) {\n // Check file extension\n const ext = extname(entry.name).toLowerCase();\n if (includeExtensions.includes(ext)) {\n files.push(fullPath);\n }\n }\n }\n\n return ok(files);\n }\n}\n\n/**\n * Create a PatternMatcher instance\n */\nexport function createPatternMatcher(options?: PatternMatcherOptions): PatternMatcher {\n return new PatternMatcher(options);\n}\n\n/**\n * Detect language from file extension\n */\nexport function detectLanguage(filePath: string): Language | null {\n const ext = extname(filePath).toLowerCase();\n return EXTENSION_TO_LANGUAGE[ext] ?? null;\n}\n\n/**\n * Get supported file extensions\n */\nexport function getSupportedExtensions(): string[] {\n return Object.keys(EXTENSION_TO_LANGUAGE);\n}\n\n/**\n * Check if a file extension is supported\n */\nexport function isExtensionSupported(ext: string): boolean {\n return ext.toLowerCase() in EXTENSION_TO_LANGUAGE;\n}\n","import chalk from \"chalk\";\n\n/**\n * Log levels from most to least verbose\n */\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\n/**\n * Logger configuration\n */\ninterface LoggerConfig {\n level: LogLevel;\n prefix?: string;\n}\n\n/**\n * Simple logger with colored output\n */\nclass Logger {\n private level: LogLevel = \"info\";\n private prefix: string = \"\";\n\n /**\n * Configure the logger\n */\n configure(config: Partial<LoggerConfig>): void {\n if (config.level !== undefined) {\n this.level = config.level;\n }\n if (config.prefix !== undefined) {\n this.prefix = config.prefix;\n }\n }\n\n /**\n * Check if a log level should be output\n */\n private shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\n }\n\n /**\n * Format a message with optional prefix\n */\n private format(message: string): string {\n return this.prefix ? `${this.prefix} ${message}` : message;\n }\n\n /**\n * Debug level logging (gray)\n */\n debug(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"debug\")) {\n console.debug(chalk.gray(this.format(message)), ...args);\n }\n }\n\n /**\n * Info level logging (default color)\n */\n info(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"info\")) {\n console.info(this.format(message), ...args);\n }\n }\n\n /**\n * Warning level logging (yellow)\n */\n warn(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"warn\")) {\n console.warn(chalk.yellow(this.format(message)), ...args);\n }\n }\n\n /**\n * Error level logging (red)\n */\n error(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"error\")) {\n console.error(chalk.red(this.format(message)), ...args);\n }\n }\n\n /**\n * Success message (green)\n */\n success(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"info\")) {\n console.info(chalk.green(this.format(message)), ...args);\n }\n }\n\n /**\n * Create a child logger with a prefix\n */\n child(prefix: string): Logger {\n const child = new Logger();\n child.level = this.level;\n child.prefix = this.prefix ? `${this.prefix} ${prefix}` : prefix;\n return child;\n }\n}\n\n/**\n * Global logger instance\n */\nexport const logger = new Logger();\n","/**\n * Tree-sitter AST Parser\n *\n * Provides AST parsing and querying capabilities using web-tree-sitter.\n * Supports Python, TypeScript, and JavaScript.\n */\n\nimport { existsSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nimport {\n Parser as TreeSitterParser,\n Language as TreeSitterLanguage,\n Tree as TreeSitterTree,\n Node as TreeSitterNode,\n Query as TreeSitterQuery,\n} from \"web-tree-sitter\";\n\nimport { PinataError, ParseError } from \"../../lib/errors.js\";\nimport { logger } from \"../../lib/logger.js\";\nimport { ok, err } from \"../../lib/result.js\";\n\nimport type { Language } from \"../../categories/schema/index.js\";\nimport type { Result } from \"../../lib/result.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Map of language to tree-sitter grammar name\n */\nconst LANGUAGE_GRAMMAR_MAP: Record<Language, string | null> = {\n python: \"tree-sitter-python\",\n typescript: \"tree-sitter-typescript\",\n javascript: \"tree-sitter-javascript\",\n go: null, // Not yet supported\n java: null, // Not yet supported\n rust: null, // Not yet supported\n};\n\n/**\n * AST match result\n */\nexport interface AstMatch {\n /** Matched node text */\n text: string;\n /** Node type (e.g., \"call_expression\") */\n nodeType: string;\n /** Starting line (0-indexed) */\n startLine: number;\n /** Ending line (0-indexed) */\n endLine: number;\n /** Starting column (0-indexed) */\n startColumn: number;\n /** Ending column (0-indexed) */\n endColumn: number;\n /** Capture name from the query (e.g., \"@call\") */\n captureName: string;\n /** Child captures from the same match group */\n captures: Map<string, string>;\n}\n\n/**\n * Query match with all captures\n */\ninterface QueryMatch {\n pattern: number;\n captures: Array<{\n name: string;\n node: TreeSitterNode;\n }>;\n}\n\n/**\n * Cached parser instances per language\n */\nconst parserCache = new Map<string, TreeSitterParser>();\n\n/**\n * Cached language instances\n */\nconst languageCache = new Map<string, TreeSitterLanguage>();\n\n/**\n * Whether Parser has been initialized\n */\nlet parserInitialized = false;\n\n/**\n * WASM file locations - tries multiple paths\n * web-tree-sitter uses web-tree-sitter.wasm as the main parser WASM file\n */\nfunction getWasmPaths(): string[] {\n return [\n // Development: relative to project root\n join(process.cwd(), \"node_modules/web-tree-sitter/web-tree-sitter.wasm\"),\n // Built: relative to dist\n join(__dirname, \"../../../node_modules/web-tree-sitter/web-tree-sitter.wasm\"),\n // Alternative locations\n join(__dirname, \"../../wasm/web-tree-sitter.wasm\"),\n join(process.cwd(), \"wasm/web-tree-sitter.wasm\"),\n ];\n}\n\n/**\n * Language WASM file locations\n */\nfunction getLanguageWasmPaths(language: string): string[] {\n const grammarName = `tree-sitter-${language}`;\n const wasmName = `${grammarName}.wasm`;\n\n return [\n // Project wasm directory (recommended)\n join(process.cwd(), \"wasm\", wasmName),\n // src directory\n join(process.cwd(), \"src/core/detection/wasm\", wasmName),\n // Fallback locations\n join(__dirname, \"wasm\", wasmName),\n join(__dirname, \"../../../wasm\", wasmName),\n ];\n}\n\n/**\n * Initialize the tree-sitter Parser\n */\nasync function initializeParser(): Promise<Result<void, PinataError>> {\n if (parserInitialized) {\n return ok(undefined);\n }\n\n const wasmPaths = getWasmPaths();\n let wasmPath: string | null = null;\n\n for (const path of wasmPaths) {\n if (existsSync(path)) {\n wasmPath = path;\n break;\n }\n }\n\n if (!wasmPath) {\n return err(\n new ParseError(\n \"tree-sitter.wasm not found. Run: npm run setup:wasm\",\n \"tree-sitter.wasm\"\n )\n );\n }\n\n try {\n await TreeSitterParser.init({\n locateFile: () => wasmPath,\n });\n parserInitialized = true;\n logger.debug(\"Tree-sitter initialized\");\n return ok(undefined);\n } catch (error) {\n return err(\n new ParseError(\n `Failed to initialize tree-sitter: ${error instanceof Error ? error.message : String(error)}`,\n wasmPath\n )\n );\n }\n}\n\n/**\n * Load a language grammar\n */\nasync function loadLanguage(language: Language): Promise<Result<TreeSitterLanguage, PinataError>> {\n const grammarName = LANGUAGE_GRAMMAR_MAP[language];\n\n if (grammarName === null) {\n return err(\n new ParseError(`Language not supported for AST parsing: ${language}`, language)\n );\n }\n\n // Check cache\n const cached = languageCache.get(language);\n if (cached) {\n return ok(cached);\n }\n\n // Handle TypeScript special case (uses typescript grammar from tree-sitter-typescript)\n const langKey = language === \"typescript\" ? \"typescript\" : language;\n const wasmPaths = getLanguageWasmPaths(langKey);\n\n let wasmPath: string | null = null;\n for (const path of wasmPaths) {\n if (existsSync(path)) {\n wasmPath = path;\n break;\n }\n }\n\n if (!wasmPath) {\n return err(\n new ParseError(\n `Language WASM not found for ${language}. Run: npm run setup:wasm`,\n language\n )\n );\n }\n\n try {\n const lang = await TreeSitterLanguage.load(wasmPath);\n languageCache.set(language, lang);\n logger.debug(`Loaded language: ${language}`);\n return ok(lang);\n } catch (error) {\n return err(\n new ParseError(\n `Failed to load language ${language}: ${error instanceof Error ? error.message : String(error)}`,\n wasmPath\n )\n );\n }\n}\n\n/**\n * Get or create a parser for a specific language\n */\nasync function getParser(language: Language): Promise<Result<TreeSitterParser, PinataError>> {\n // Initialize if needed\n const initResult = await initializeParser();\n if (!initResult.success) {\n return initResult;\n }\n\n // Check cache\n const cached = parserCache.get(language);\n if (cached) {\n return ok(cached);\n }\n\n // Load language\n const langResult = await loadLanguage(language);\n if (!langResult.success) {\n return langResult;\n }\n\n // Create parser\n const parser = new TreeSitterParser();\n parser.setLanguage(langResult.data);\n parserCache.set(language, parser);\n\n return ok(parser);\n}\n\n/**\n * Parse source code into an AST\n */\nexport async function parseSource(\n source: string,\n language: Language\n): Promise<Result<TreeSitterTree, PinataError>> {\n const parserResult = await getParser(language);\n if (!parserResult.success) {\n return parserResult;\n }\n\n try {\n const tree = parserResult.data.parse(source);\n if (!tree) {\n return err(\n new ParseError(\"Failed to parse source: parser returned null\", \"source\")\n );\n }\n return ok(tree);\n } catch (error) {\n return err(\n new ParseError(\n `Failed to parse source: ${error instanceof Error ? error.message : String(error)}`,\n \"source\"\n )\n );\n }\n}\n\n/**\n * Execute a tree-sitter query against an AST\n *\n * Query syntax follows tree-sitter query format:\n * https://tree-sitter.github.io/tree-sitter/using-parsers#pattern-matching-with-queries\n *\n * @example\n * ```typescript\n * // Find all function calls\n * const query = \"(call_expression) @call\";\n *\n * // Find SQL execute with string concatenation\n * const query = `\n * (call_expression\n * function: (attribute\n * attribute: (identifier) @method)\n * arguments: (argument_list\n * (binary_operator) @concat))\n * (#match? @method \"execute|executemany\")\n * @call\n * `;\n * ```\n */\nexport async function executeQuery(\n tree: TreeSitterTree,\n queryString: string,\n language: Language\n): Promise<Result<AstMatch[], PinataError>> {\n const langResult = await loadLanguage(language);\n if (!langResult.success) {\n return langResult;\n }\n\n try {\n // Create query from language\n const query = new TreeSitterQuery(langResult.data, queryString);\n const matches = query.matches(tree.rootNode);\n\n const results: AstMatch[] = [];\n\n for (const match of matches) {\n // Get all captures for this match\n const captureMap = new Map<string, string>();\n for (const capture of match.captures) {\n captureMap.set(capture.name, capture.node.text);\n }\n\n // Create a result for each capture\n for (const capture of match.captures) {\n const node = capture.node;\n results.push({\n text: node.text,\n nodeType: node.type,\n startLine: node.startPosition.row,\n endLine: node.endPosition.row,\n startColumn: node.startPosition.column,\n endColumn: node.endPosition.column,\n captureName: capture.name,\n captures: captureMap,\n });\n }\n }\n\n return ok(results);\n } catch (error) {\n return err(\n new ParseError(\n `Failed to execute query: ${error instanceof Error ? error.message : String(error)}`,\n \"query\"\n )\n );\n }\n}\n\n/**\n * AstPatternMatcher - Executes AST queries against source code\n *\n * Provides a higher-level interface for pattern detection using tree-sitter.\n */\nexport class AstPatternMatcher {\n private readonly sourceCache = new Map<string, TreeSitterTree>();\n private readonly log = logger.child(\"AstPatternMatcher\");\n\n /**\n * Check if AST parsing is available for a language\n */\n isLanguageSupported(language: Language): boolean {\n return LANGUAGE_GRAMMAR_MAP[language] !== null;\n }\n\n /**\n * Get list of supported languages\n */\n getSupportedLanguages(): Language[] {\n return Object.entries(LANGUAGE_GRAMMAR_MAP)\n .filter(([_, grammar]) => grammar !== null)\n .map(([lang]) => lang as Language);\n }\n\n /**\n * Parse source code and cache the AST\n */\n async parse(\n source: string,\n language: Language,\n cacheKey?: string\n ): Promise<Result<TreeSitterTree, PinataError>> {\n // Check cache\n if (cacheKey) {\n const cached = this.sourceCache.get(cacheKey);\n if (cached) {\n return ok(cached);\n }\n }\n\n const result = await parseSource(source, language);\n if (result.success && cacheKey) {\n this.sourceCache.set(cacheKey, result.data);\n }\n\n return result;\n }\n\n /**\n * Execute a query against source code\n *\n * @param source Source code to analyze\n * @param query Tree-sitter query string\n * @param language Programming language\n * @param cacheKey Optional cache key for the parsed AST\n */\n async query(\n source: string,\n query: string,\n language: Language,\n cacheKey?: string\n ): Promise<Result<AstMatch[], PinataError>> {\n const treeResult = await this.parse(source, language, cacheKey);\n if (!treeResult.success) {\n return treeResult;\n }\n\n return executeQuery(treeResult.data, query, language);\n }\n\n /**\n * Execute multiple queries against the same source\n */\n async queryMultiple(\n source: string,\n queries: string[],\n language: Language,\n cacheKey?: string\n ): Promise<Result<AstMatch[][], PinataError>> {\n const treeResult = await this.parse(source, language, cacheKey);\n if (!treeResult.success) {\n return treeResult;\n }\n\n const results: AstMatch[][] = [];\n for (const query of queries) {\n const queryResult = await executeQuery(treeResult.data, query, language);\n if (!queryResult.success) {\n return queryResult;\n }\n results.push(queryResult.data);\n }\n\n return ok(results);\n }\n\n /**\n * Clear the AST cache\n */\n clearCache(): void {\n this.sourceCache.clear();\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): { entries: number; languages: Set<string> } {\n return {\n entries: this.sourceCache.size,\n languages: new Set(parserCache.keys()),\n };\n }\n}\n\n/**\n * Create a new AstPatternMatcher instance\n */\nexport function createAstMatcher(): AstPatternMatcher {\n return new AstPatternMatcher();\n}\n\n/**\n * Predefined AST queries for common vulnerability patterns\n */\nexport const COMMON_AST_PATTERNS = {\n // Python: SQL injection via string formatting\n pythonSqlStringFormat: `\n (call\n function: (attribute\n attribute: (identifier) @method)\n arguments: (argument_list\n (binary_operator\n operator: \"%\") @concat))\n (#match? @method \"^execute$|^executemany$\")\n @call\n `,\n\n // Python: SQL injection via f-string\n pythonSqlFString: `\n (call\n function: (attribute\n attribute: (identifier) @method)\n arguments: (argument_list\n (string\n (interpolation)) @fstring))\n (#match? @method \"^execute$|^executemany$\")\n @call\n `,\n\n // Python: SQL injection via concatenation\n pythonSqlConcat: `\n (call\n function: (attribute\n attribute: (identifier) @method)\n arguments: (argument_list\n (binary_operator\n operator: \"+\") @concat))\n (#match? @method \"^execute$|^executemany$\")\n @call\n `,\n\n // Python: SQL injection via .format()\n pythonSqlFormat: `\n (call\n function: (attribute\n attribute: (identifier) @method)\n arguments: (argument_list\n (call\n function: (attribute\n attribute: (identifier) @format_method))))\n (#match? @method \"^execute$|^executemany$\")\n (#match? @format_method \"^format$\")\n @call\n `,\n\n // JavaScript/TypeScript: SQL injection via template literal\n jsSqlTemplateLiteral: `\n (call_expression\n function: (member_expression\n property: (property_identifier) @method)\n arguments: (arguments\n (template_string\n (template_substitution)) @template))\n (#match? @method \"^query$|^execute$|^run$\")\n @call\n `,\n\n // JavaScript/TypeScript: SQL injection via concatenation\n jsSqlConcat: `\n (call_expression\n function: (member_expression\n property: (property_identifier) @method)\n arguments: (arguments\n (binary_expression\n operator: \"+\") @concat))\n (#match? @method \"^query$|^execute$|^run$\")\n @call\n `,\n\n // Python: Command injection via subprocess\n pythonCommandInjection: `\n (call\n function: (attribute\n object: (identifier) @module\n attribute: (identifier) @method)\n arguments: (argument_list\n (binary_operator) @concat))\n (#match? @module \"^subprocess$|^os$\")\n (#match? @method \"^call$|^run$|^Popen$|^system$\")\n @call\n `,\n\n // Python: Path traversal via open\n pythonPathTraversal: `\n (call\n function: (identifier) @func\n arguments: (argument_list\n (binary_operator\n operator: \"+\") @concat))\n (#match? @func \"^open$\")\n @call\n `,\n\n // JavaScript: eval usage\n jsEval: `\n (call_expression\n function: (identifier) @func)\n (#match? @func \"^eval$\")\n @call\n `,\n\n // TypeScript: Any type assertion\n tsAnyAssertion: `\n (as_expression\n type: (type_identifier) @type)\n (#match? @type \"^any$\")\n @assertion\n `,\n} as const;\n\n/**\n * Check if tree-sitter is properly initialized\n */\nexport async function checkTreeSitterSetup(): Promise<Result<{ ready: boolean; languages: Language[] }, PinataError>> {\n const initResult = await initializeParser();\n if (!initResult.success) {\n logger.debug(`Tree-sitter init failed: ${initResult.error.message}`);\n return ok({ ready: false, languages: [] });\n }\n\n const supportedLanguages: Language[] = [];\n for (const lang of [\"python\", \"typescript\", \"javascript\"] as Language[]) {\n const langResult = await loadLanguage(lang);\n if (langResult.success) {\n supportedLanguages.push(lang);\n } else {\n logger.debug(`Failed to load language ${lang}: ${langResult.error.message}`);\n }\n }\n\n return ok({\n ready: supportedLanguages.length > 0,\n languages: supportedLanguages,\n });\n}\n","/**\n * Scanner - Codebase analysis orchestrator\n *\n * Coordinates pattern matching, gap detection, coverage calculation,\n * and Pinata Score computation for a target codebase.\n *\n * @example\n * ```typescript\n * const scanner = new Scanner(categoryStore);\n *\n * const result = await scanner.scanDirectory('/path/to/project', {\n * excludeDirs: ['node_modules', 'dist'],\n * minSeverity: 'medium',\n * });\n *\n * console.log(`Pinata Score: ${result.score.overall}/100`);\n * console.log(`Gaps found: ${result.gaps.length}`);\n * ```\n */\n\nimport { readdir, stat, readFile } from \"fs/promises\";\nimport { resolve, relative, extname, basename } from \"path\";\n\nimport { minimatch } from \"minimatch\";\n\nimport {\n RISK_DOMAINS,\n TEST_LEVELS,\n} from \"../../categories/schema/index.js\";\nimport { PinataError, AnalysisError } from \"../../lib/errors.js\";\nimport { logger } from \"../../lib/logger.js\";\nimport { ok, err, tryCatchAsync } from \"../../lib/result.js\";\nimport { PatternMatcher, detectLanguage } from \"../detection/index.js\";\n\nimport {\n SEVERITY_WEIGHTS,\n CONFIDENCE_WEIGHTS,\n PRIORITY_WEIGHTS,\n DEFAULT_TEST_PATTERNS,\n} from \"./types.js\";\n\nimport type {\n ScannerOptions,\n ScanResult,\n Gap,\n DomainCoverage,\n CoverageMetrics,\n FileStats,\n PinataScore,\n ScanSummary,\n} from \"./types.js\";\nimport type {\n Category,\n RiskDomain,\n TestLevel,\n Language,\n Priority,\n Severity,\n Confidence,\n DetectionResult,\n PatternType,\n} from \"../../categories/schema/index.js\";\nimport type { CategoryStore } from \"../../categories/store/category-store.js\";\nimport type { Result } from \"../../lib/result.js\";\n\n/**\n * Default scanner options\n */\nconst DEFAULT_OPTIONS: Required<Omit<ScannerOptions, \"targetDirectory\">> = {\n excludeDirs: [\n // Package managers\n \"node_modules\", \".pnpm\", \"vendor\",\n // Build outputs\n \"dist\", \"build\", \"out\", \".next\", \".nuxt\", \".output\",\n // Version control\n \".git\", \".svn\", \".hg\",\n // Python\n \"__pycache__\", \".venv\", \"venv\", \".tox\", \".mypy_cache\", \".pytest_cache\",\n // Test/coverage\n \"coverage\", \".nyc_output\",\n // IDE/Editor\n \".idea\", \".vscode\",\n // Scripts (typically not production)\n \"scripts\",\n ],\n includeExtensions: [\".py\", \".ts\", \".tsx\", \".js\", \".jsx\", \".go\", \".java\", \".rs\"],\n maxFileSize: 10 * 1024 * 1024, // 10MB\n maxDepth: -1,\n categoryIds: [],\n domains: [],\n minSeverity: \"low\",\n minConfidence: \"low\",\n detectTestFiles: true,\n testFilePatterns: [],\n};\n\n/**\n * Severity order for filtering\n */\nconst SEVERITY_ORDER: Record<Severity, number> = {\n critical: 4,\n high: 3,\n medium: 2,\n low: 1,\n};\n\n/**\n * Confidence order for filtering\n */\nconst CONFIDENCE_ORDER: Record<Confidence, number> = {\n high: 3,\n medium: 2,\n low: 1,\n};\n\n/**\n * Scanner class - orchestrates codebase analysis\n */\nexport class Scanner {\n private readonly categoryStore: CategoryStore;\n private readonly patternMatcher: PatternMatcher;\n private readonly log = logger.child(\"Scanner\");\n\n constructor(categoryStore: CategoryStore) {\n this.categoryStore = categoryStore;\n this.patternMatcher = new PatternMatcher();\n }\n\n /**\n * Scan a directory for test coverage gaps\n *\n * @param targetDirectory Directory to scan\n * @param options Scan options\n * @returns Scan result with gaps, coverage, and score\n */\n async scanDirectory(\n targetDirectory: string,\n options: Partial<ScannerOptions> = {}\n ): Promise<Result<ScanResult, PinataError>> {\n const startedAt = new Date();\n const opts = this.mergeOptions(targetDirectory, options);\n\n this.log.info(`Starting scan of ${targetDirectory}`);\n\n // Validate target directory exists (use stat to avoid TOCTOU race condition)\n try {\n const dirStat = await stat(targetDirectory);\n if (!dirStat.isDirectory()) {\n return err(new AnalysisError(`Not a directory: ${targetDirectory}`));\n }\n } catch {\n return err(new AnalysisError(`Directory not found: ${targetDirectory}`));\n }\n\n // Get categories to scan\n const categoriesResult = this.getCategoriesToScan(opts);\n if (!categoriesResult.success) {\n return categoriesResult;\n }\n const categories = categoriesResult.data;\n\n if (categories.length === 0) {\n return err(new AnalysisError(\"No categories to scan. Load categories first.\"));\n }\n\n this.log.info(`Scanning with ${categories.length} categories`);\n\n // Collect all detection results\n const allDetections: DetectionResult[] = [];\n const warnings: string[] = [];\n const fileStats = this.initFileStats();\n const testFiles = new Set<string>();\n const sourceFiles = new Set<string>();\n\n // Scan for each category\n for (const category of categories) {\n const scanResult = await this.patternMatcher.scanDirectory(\n targetDirectory,\n category.detectionPatterns,\n {\n categoryId: category.id,\n basePath: targetDirectory,\n excludeDirs: opts.excludeDirs,\n includeExtensions: opts.includeExtensions,\n maxFileSize: opts.maxFileSize,\n maxDepth: opts.maxDepth,\n }\n );\n\n if (!scanResult.success) {\n warnings.push(`Failed to scan for category ${category.id}: ${scanResult.error.message}`);\n continue;\n }\n\n // Filter by severity and confidence\n const filtered = scanResult.data.filter((d) => {\n const severityOk = SEVERITY_ORDER[category.severity] >= SEVERITY_ORDER[opts.minSeverity];\n const confidenceOk = CONFIDENCE_ORDER[d.confidence] >= CONFIDENCE_ORDER[opts.minConfidence];\n return severityOk && confidenceOk;\n });\n\n allDetections.push(...filtered);\n }\n\n // Detect test files if enabled\n if (opts.detectTestFiles) {\n const testFilesResult = await this.detectTestFiles(targetDirectory, opts);\n if (testFilesResult.success) {\n for (const file of testFilesResult.data) {\n testFiles.add(file);\n }\n }\n }\n\n // Count files by language\n const filesResult = await this.countFiles(targetDirectory, opts);\n if (filesResult.success) {\n fileStats.totalFiles = filesResult.data.total;\n fileStats.skippedFiles = filesResult.data.skipped;\n for (const [lang, count] of filesResult.data.byLanguage) {\n fileStats.byLanguage.set(lang, count);\n }\n }\n\n fileStats.testFiles = testFiles.size;\n fileStats.sourceFiles = fileStats.totalFiles - testFiles.size;\n\n // Convert detections to gaps\n const gaps = this.detectionsToGaps(allDetections, categories, testFiles, opts);\n\n // Update file stats\n const filesWithGaps = new Set(gaps.map((g) => g.filePath));\n fileStats.filesWithGaps = filesWithGaps.size;\n\n // Group gaps\n const gapsByCategory = this.groupGapsByCategory(gaps);\n const gapsByFile = this.groupGapsByFile(gaps);\n\n // Calculate coverage metrics\n const coverage = this.calculateCoverage(categories, gapsByCategory);\n\n // Calculate Pinata Score\n const score = this.calculateScore(gaps, coverage, categories);\n\n // Build summary\n const summary = this.buildSummary(gaps, score, coverage, fileStats, categories);\n\n const completedAt = new Date();\n const durationMs = completedAt.getTime() - startedAt.getTime();\n\n this.log.info(`Scan complete: ${gaps.length} gaps found in ${durationMs}ms`);\n\n return ok({\n targetDirectory,\n startedAt,\n completedAt,\n durationMs,\n gaps,\n gapsByCategory,\n gapsByFile,\n coverage,\n fileStats,\n score,\n warnings,\n categoriesScanned: categories.map((c) => c.id),\n summary,\n });\n }\n\n /**\n * Aggregate raw detection results into gaps with priority scoring\n */\n aggregateResults(\n detections: DetectionResult[],\n categories: Category[]\n ): Gap[] {\n return this.detectionsToGaps(detections, categories, new Set(), {\n ...DEFAULT_OPTIONS,\n targetDirectory: \"\",\n });\n }\n\n /**\n * Calculate Pinata Score from gaps and coverage\n */\n calculateScore(\n gaps: Gap[],\n coverage: CoverageMetrics,\n categories: Category[]\n ): PinataScore {\n // Base score starts at 100\n let baseScore = 100;\n const penalties: PinataScore[\"penalties\"] = [];\n const bonuses: PinataScore[\"bonuses\"] = [];\n const domainScores = new Map<RiskDomain, number>();\n\n // Initialize domain scores at 100\n for (const domain of RISK_DOMAINS) {\n domainScores.set(domain, 100);\n }\n\n // Apply penalties for gaps\n for (const gap of gaps) {\n const severityWeight = SEVERITY_WEIGHTS[gap.severity];\n const confidenceWeight = CONFIDENCE_WEIGHTS[gap.confidence];\n const priorityWeight = PRIORITY_WEIGHTS[gap.priority];\n\n // Calculate penalty: base × severity × confidence × priority factor\n const basePenalty = 2; // Base penalty per gap\n const penalty = basePenalty * severityWeight * confidenceWeight * Math.sqrt(priorityWeight);\n\n baseScore -= penalty;\n\n // Apply to domain score\n const currentDomainScore = domainScores.get(gap.domain) ?? 100;\n domainScores.set(gap.domain, Math.max(0, currentDomainScore - penalty * 2));\n\n // Track significant penalties\n if (penalty >= 5) {\n penalties.push({\n reason: `${gap.severity} ${gap.domain} gap: ${gap.categoryName}`,\n points: Math.round(penalty),\n categoryId: gap.categoryId,\n });\n }\n }\n\n // Apply bonuses for good coverage\n if (coverage.overallCoverage >= 90) {\n const bonus = 5;\n baseScore += bonus;\n bonuses.push({ reason: \"Excellent coverage (90%+)\", points: bonus });\n } else if (coverage.overallCoverage >= 75) {\n const bonus = 3;\n baseScore += bonus;\n bonuses.push({ reason: \"Good coverage (75%+)\", points: bonus });\n }\n\n // Bonus for no critical gaps\n const criticalGaps = gaps.filter((g) => g.severity === \"critical\");\n if (criticalGaps.length === 0 && categories.length > 0) {\n const bonus = 5;\n baseScore += bonus;\n bonuses.push({ reason: \"No critical gaps\", points: bonus });\n }\n\n // Bonus for no high gaps\n const highGaps = gaps.filter((g) => g.severity === \"high\");\n if (highGaps.length === 0 && categories.length > 0) {\n const bonus = 3;\n baseScore += bonus;\n bonuses.push({ reason: \"No high severity gaps\", points: bonus });\n }\n\n // Clamp score to 0-100\n const overall = Math.max(0, Math.min(100, Math.round(baseScore)));\n\n // Calculate grade\n const grade = this.scoreToGrade(overall);\n\n // Calculate severity breakdown scores\n const bySeverity = {\n critical: this.calculateSeverityScore(gaps, \"critical\"),\n high: this.calculateSeverityScore(gaps, \"high\"),\n medium: this.calculateSeverityScore(gaps, \"medium\"),\n low: this.calculateSeverityScore(gaps, \"low\"),\n };\n\n return {\n overall,\n grade,\n byDomain: domainScores,\n bySeverity,\n penalties: penalties.slice(0, 10), // Top 10 penalties\n bonuses,\n };\n }\n\n /**\n * Get the pattern matcher instance\n */\n getPatternMatcher(): PatternMatcher {\n return this.patternMatcher;\n }\n\n // ============================================================\n // Private methods\n // ============================================================\n\n /**\n * Merge user options with defaults\n */\n private mergeOptions(\n targetDirectory: string,\n options: Partial<ScannerOptions>\n ): Required<ScannerOptions> {\n // Read .pinataignore if it exists\n const pinataIgnore = this.readPinataIgnore(targetDirectory);\n const baseExcludes = options.excludeDirs ?? DEFAULT_OPTIONS.excludeDirs;\n const mergedExcludes = [...new Set([...baseExcludes, ...pinataIgnore])];\n\n return {\n targetDirectory,\n excludeDirs: mergedExcludes,\n includeExtensions: options.includeExtensions ?? DEFAULT_OPTIONS.includeExtensions,\n maxFileSize: options.maxFileSize ?? DEFAULT_OPTIONS.maxFileSize,\n maxDepth: options.maxDepth ?? DEFAULT_OPTIONS.maxDepth,\n categoryIds: options.categoryIds ?? DEFAULT_OPTIONS.categoryIds,\n domains: options.domains ?? DEFAULT_OPTIONS.domains,\n minSeverity: options.minSeverity ?? DEFAULT_OPTIONS.minSeverity,\n minConfidence: options.minConfidence ?? DEFAULT_OPTIONS.minConfidence,\n detectTestFiles: options.detectTestFiles ?? DEFAULT_OPTIONS.detectTestFiles,\n testFilePatterns: options.testFilePatterns ?? DEFAULT_OPTIONS.testFilePatterns,\n };\n }\n\n /**\n * Read .pinataignore file and return directory patterns\n */\n private readPinataIgnore(targetDirectory: string): string[] {\n const ignorePath = resolve(targetDirectory, \".pinataignore\");\n\n // Try to read directly instead of checking existence (avoids TOCTOU)\n try {\n const { readFileSync } = require(\"node:fs\") as typeof import(\"fs\");\n const content = readFileSync(ignorePath, \"utf-8\");\n return content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !line.startsWith(\"#\"))\n .map((line) => line.replace(/\\/$/, \"\")); // Remove trailing slashes\n } catch {\n return [];\n }\n }\n\n /**\n * Get categories to scan based on options\n */\n private getCategoriesToScan(\n options: Required<ScannerOptions>\n ): Result<Category[], PinataError> {\n const allCategories = this.categoryStore.list();\n let filtered = allCategories;\n\n // Filter by category IDs\n if (options.categoryIds.length > 0) {\n filtered = filtered.filter((c) => options.categoryIds.includes(c.id));\n }\n\n // Filter by domains\n if (options.domains.length > 0) {\n filtered = filtered.filter((c) => options.domains.includes(c.domain));\n }\n\n // Get full category objects\n const categories: Category[] = [];\n for (const summary of filtered) {\n const result = this.categoryStore.get(summary.id);\n if (result.success) {\n categories.push(result.data);\n }\n }\n\n return ok(categories);\n }\n\n /**\n * Initialize empty file stats\n */\n private initFileStats(): FileStats {\n return {\n totalFiles: 0,\n filesWithGaps: 0,\n byLanguage: new Map(),\n testFiles: 0,\n sourceFiles: 0,\n skippedFiles: 0,\n totalLinesOfCode: 0,\n };\n }\n\n /**\n * Detect test files in the target directory\n */\n private async detectTestFiles(\n targetDirectory: string,\n options: Required<ScannerOptions>\n ): Promise<Result<string[], PinataError>> {\n const testFiles: string[] = [];\n\n // Build test patterns\n const patterns: string[] = [...options.testFilePatterns];\n for (const ext of options.includeExtensions) {\n const lang = detectLanguage(`file${ext}`);\n if (lang) {\n const langPatterns = DEFAULT_TEST_PATTERNS[lang];\n if (langPatterns) {\n patterns.push(...langPatterns);\n }\n }\n }\n\n // Walk directory and match patterns\n const walkResult = await this.walkDirectory(targetDirectory, options, (filePath) => {\n const fileName = basename(filePath);\n const relativePath = relative(targetDirectory, filePath);\n\n for (const pattern of patterns) {\n if (minimatch(fileName, pattern) || minimatch(relativePath, pattern)) {\n testFiles.push(filePath);\n return true;\n }\n }\n\n // Common test directory names\n if (relativePath.includes(\"/test/\") || relativePath.includes(\"/tests/\") ||\n relativePath.includes(\"/__tests__/\") || relativePath.startsWith(\"test/\") ||\n relativePath.startsWith(\"tests/\")) {\n testFiles.push(filePath);\n return true;\n }\n\n return false;\n });\n\n if (!walkResult.success) {\n return walkResult;\n }\n\n return ok(testFiles);\n }\n\n /**\n * Count files by language\n */\n private async countFiles(\n targetDirectory: string,\n options: Required<ScannerOptions>\n ): Promise<Result<{ total: number; skipped: number; byLanguage: Map<Language, number> }, PinataError>> {\n let total = 0;\n let skipped = 0;\n const byLanguage = new Map<Language, number>();\n\n const walkResult = await this.walkDirectory(targetDirectory, options, (filePath) => {\n const lang = detectLanguage(filePath);\n if (lang) {\n total++;\n byLanguage.set(lang, (byLanguage.get(lang) ?? 0) + 1);\n } else {\n skipped++;\n }\n return true;\n });\n\n if (!walkResult.success) {\n return walkResult;\n }\n\n return ok({ total, skipped, byLanguage });\n }\n\n /**\n * Walk directory and apply callback to each file\n */\n private async walkDirectory(\n dirPath: string,\n options: Required<ScannerOptions>,\n callback: (filePath: string) => boolean,\n depth = 0\n ): Promise<Result<void, PinataError>> {\n if (options.maxDepth >= 0 && depth > options.maxDepth) {\n return ok(undefined);\n }\n\n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = resolve(dirPath, entry.name);\n\n // Skip excluded directories\n if (entry.isDirectory()) {\n if (options.excludeDirs.includes(entry.name)) {\n continue;\n }\n if (entry.name.startsWith(\".\") && entry.name !== \".\") {\n continue;\n }\n\n const walkResult = await this.walkDirectory(fullPath, options, callback, depth + 1);\n if (!walkResult.success) {\n return walkResult;\n }\n } else if (entry.isFile()) {\n const ext = extname(entry.name).toLowerCase();\n if (options.includeExtensions.includes(ext)) {\n callback(fullPath);\n }\n }\n }\n\n return ok(undefined);\n } catch (error) {\n return err(new AnalysisError(\n `Failed to read directory ${dirPath}: ${error instanceof Error ? error.message : String(error)}`\n ));\n }\n }\n\n /**\n * Convert detection results to gaps\n */\n private detectionsToGaps(\n detections: DetectionResult[],\n categories: Category[],\n testFiles: Set<string>,\n options: Required<ScannerOptions>\n ): Gap[] {\n const categoryMap = new Map<string, Category>();\n for (const cat of categories) {\n categoryMap.set(cat.id, cat);\n }\n\n // Build pattern type lookup from categories\n const patternTypeMap = new Map<string, PatternType>();\n for (const cat of categories) {\n for (const pattern of cat.detectionPatterns) {\n patternTypeMap.set(pattern.id, pattern.type);\n }\n }\n\n const gaps: Gap[] = [];\n\n for (const detection of detections) {\n // Skip detections in test files\n if (testFiles.has(detection.filePath)) {\n continue;\n }\n\n const category = categoryMap.get(detection.categoryId);\n if (!category) {\n continue;\n }\n\n // Calculate priority score\n const priorityScore = this.calculatePriorityScore(\n category.severity,\n detection.confidence,\n category.priority\n );\n\n // Get pattern type from lookup (fallback to regex)\n const patternType = patternTypeMap.get(detection.patternId) ?? \"regex\";\n\n // Extract column info from context if available\n const context = detection.context;\n const columnStart = typeof context?.[\"columnStart\"] === \"number\" ? context[\"columnStart\"] : 0;\n const columnEnd = typeof context?.[\"columnEnd\"] === \"number\" ? context[\"columnEnd\"] : 0;\n\n gaps.push({\n categoryId: category.id,\n categoryName: category.name,\n domain: category.domain,\n level: category.level,\n priority: category.priority,\n severity: category.severity,\n confidence: detection.confidence,\n filePath: detection.filePath,\n lineStart: detection.lineStart,\n lineEnd: detection.lineEnd,\n columnStart,\n columnEnd,\n codeSnippet: detection.codeSnippet,\n patternId: detection.patternId,\n patternType,\n priorityScore,\n });\n }\n\n // Sort by priority score (highest first)\n gaps.sort((a, b) => b.priorityScore - a.priorityScore);\n\n return gaps;\n }\n\n /**\n * Calculate priority score for a gap\n */\n private calculatePriorityScore(\n severity: Severity,\n confidence: Confidence,\n priority: Priority\n ): number {\n const severityWeight = SEVERITY_WEIGHTS[severity];\n const confidenceWeight = CONFIDENCE_WEIGHTS[confidence];\n const priorityWeight = PRIORITY_WEIGHTS[priority];\n\n return severityWeight * confidenceWeight * priorityWeight;\n }\n\n /**\n * Group gaps by category ID\n */\n private groupGapsByCategory(gaps: Gap[]): Map<string, Gap[]> {\n const grouped = new Map<string, Gap[]>();\n\n for (const gap of gaps) {\n const existing = grouped.get(gap.categoryId) ?? [];\n existing.push(gap);\n grouped.set(gap.categoryId, existing);\n }\n\n return grouped;\n }\n\n /**\n * Group gaps by file path\n */\n private groupGapsByFile(gaps: Gap[]): Map<string, Gap[]> {\n const grouped = new Map<string, Gap[]>();\n\n for (const gap of gaps) {\n const existing = grouped.get(gap.filePath) ?? [];\n existing.push(gap);\n grouped.set(gap.filePath, existing);\n }\n\n return grouped;\n }\n\n /**\n * Calculate coverage metrics\n */\n private calculateCoverage(\n categories: Category[],\n gapsByCategory: Map<string, Gap[]>\n ): CoverageMetrics {\n const byDomain = new Map<RiskDomain, DomainCoverage>();\n const byLevel = new Map<TestLevel, { scanned: number; withGaps: number; covered: number }>();\n\n // Initialize domain coverage\n for (const domain of RISK_DOMAINS) {\n byDomain.set(domain, {\n domain,\n categoriesScanned: 0,\n categoriesWithGaps: 0,\n categoriesCovered: 0,\n coveragePercent: 100,\n totalGaps: 0,\n criticalGaps: 0,\n });\n }\n\n // Initialize level coverage\n for (const level of TEST_LEVELS) {\n byLevel.set(level, { scanned: 0, withGaps: 0, covered: 0 });\n }\n\n // Calculate per-category coverage\n let categoriesWithGaps = 0;\n let categoriesCovered = 0;\n\n for (const category of categories) {\n const gaps = gapsByCategory.get(category.id) ?? [];\n const hasGaps = gaps.length > 0;\n\n // Update domain coverage\n const domainCoverage = byDomain.get(category.domain);\n if (domainCoverage) {\n domainCoverage.categoriesScanned++;\n if (hasGaps) {\n domainCoverage.categoriesWithGaps++;\n domainCoverage.totalGaps += gaps.length;\n domainCoverage.criticalGaps += gaps.filter((g) => g.severity === \"critical\").length;\n } else {\n domainCoverage.categoriesCovered++;\n }\n }\n\n // Update level coverage\n const levelCoverage = byLevel.get(category.level);\n if (levelCoverage) {\n levelCoverage.scanned++;\n if (hasGaps) {\n levelCoverage.withGaps++;\n } else {\n levelCoverage.covered++;\n }\n }\n\n if (hasGaps) {\n categoriesWithGaps++;\n } else {\n categoriesCovered++;\n }\n }\n\n // Calculate percentages\n for (const coverage of byDomain.values()) {\n if (coverage.categoriesScanned > 0) {\n coverage.coveragePercent = Math.round(\n (coverage.categoriesCovered / coverage.categoriesScanned) * 100\n );\n }\n }\n\n const totalCategories = categories.length;\n const overallCoverage = totalCategories > 0\n ? Math.round((categoriesCovered / totalCategories) * 100)\n : 100;\n\n return {\n byDomain,\n byLevel,\n overallCoverage,\n totalCategories,\n categoriesWithGaps,\n categoriesCovered,\n };\n }\n\n /**\n * Convert score to letter grade\n */\n private scoreToGrade(score: number): PinataScore[\"grade\"] {\n if (score >= 90) return \"A\";\n if (score >= 80) return \"B\";\n if (score >= 70) return \"C\";\n if (score >= 60) return \"D\";\n return \"F\";\n }\n\n /**\n * Calculate score contribution from a severity level\n */\n private calculateSeverityScore(gaps: Gap[], severity: Severity): number {\n const severityGaps = gaps.filter((g) => g.severity === severity);\n if (severityGaps.length === 0) return 100;\n\n // More gaps = lower score\n const penalty = severityGaps.length * SEVERITY_WEIGHTS[severity] * 5;\n return Math.max(0, Math.round(100 - penalty));\n }\n\n /**\n * Build scan summary\n */\n private buildSummary(\n gaps: Gap[],\n score: PinataScore,\n coverage: CoverageMetrics,\n fileStats: FileStats,\n categories: Category[]\n ): ScanSummary {\n return {\n totalGaps: gaps.length,\n criticalGaps: gaps.filter((g) => g.severity === \"critical\").length,\n highGaps: gaps.filter((g) => g.severity === \"high\").length,\n mediumGaps: gaps.filter((g) => g.severity === \"medium\").length,\n lowGaps: gaps.filter((g) => g.severity === \"low\").length,\n score: score.overall,\n grade: score.grade,\n coverage: coverage.overallCoverage,\n filesScanned: fileStats.totalFiles,\n categoriesChecked: categories.length,\n topGaps: gaps.slice(0, 3),\n };\n }\n}\n\n/**\n * Create a new Scanner instance\n */\nexport function createScanner(categoryStore: CategoryStore): Scanner {\n return new Scanner(categoryStore);\n}\n","/**\n * Scanner module - Codebase analysis orchestration\n *\n * This module provides:\n * - Scanner: Main class for coordinating gap detection\n * - Gap detection and prioritization\n * - Coverage metrics calculation\n * - Pinata Score computation\n */\n\nexport { Scanner, createScanner } from \"./scanner.js\";\n\nexport type {\n ScannerOptions,\n ScanResult,\n Gap,\n DomainCoverage,\n CoverageMetrics,\n FileStats,\n PinataScore,\n ScanSummary,\n} from \"./types.js\";\n\nexport {\n SEVERITY_WEIGHTS,\n CONFIDENCE_WEIGHTS,\n PRIORITY_WEIGHTS,\n DEFAULT_TEST_PATTERNS,\n} from \"./types.js\";\n","/**\n * Core analysis engine\n *\n * This module contains:\n * - detection/ - Pattern matching against categories\n * - scanner/ - Codebase analysis orchestration\n * - ingestion/ - Code parsing and AST extraction (coming soon)\n * - generation/ - Test code generation (coming soon)\n */\n\nexport const VERSION = \"0.2.2\";\n\n// Detection module\nexport {\n PatternMatcher,\n createPatternMatcher,\n detectLanguage,\n getSupportedExtensions,\n isExtensionSupported,\n type PatternMatcherOptions,\n type ScanOptions,\n type PatternMatch,\n type FileScanResult,\n type AggregatedResults,\n} from \"./detection/index.js\";\n\n// Scanner module\nexport {\n Scanner,\n createScanner,\n SEVERITY_WEIGHTS,\n CONFIDENCE_WEIGHTS,\n PRIORITY_WEIGHTS,\n DEFAULT_TEST_PATTERNS,\n type ScannerOptions,\n type ScanResult,\n type Gap,\n type DomainCoverage,\n type CoverageMetrics,\n type FileStats,\n type PinataScore,\n type ScanSummary,\n} from \"./scanner/index.js\";\n","// Error classes\nexport {\n PinataError,\n ValidationError,\n ParseError,\n ConfigError,\n AnalysisError,\n GenerationError,\n CategoryNotFoundError,\n PatternNotFoundError,\n} from \"./errors.js\";\n\n// Result type and utilities\nexport {\n ok,\n err,\n unwrap,\n unwrapOr,\n map,\n mapErr,\n andThen,\n all,\n tryCatch,\n tryCatchAsync,\n} from \"./result.js\";\nexport type { Result } from \"./result.js\";\n\n// Logger\nexport { logger } from \"./logger.js\";\nexport type { LogLevel } from \"./logger.js\";\n","import { z } from \"zod\";\n\nimport { VariableTypeSchema } from \"../categories/schema/index.js\";\nimport { PinataError, ValidationError } from \"../lib/errors.js\";\nimport { ok, err } from \"../lib/result.js\";\n\nimport type {\n TestTemplate,\n TemplateVariable,\n VariableType,\n} from \"../categories/schema/index.js\";\nimport type { Result } from \"../lib/result.js\";\n\n\n/**\n * Error for template rendering failures\n */\nexport class TemplateRenderError extends PinataError {\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, \"TEMPLATE_RENDER_ERROR\", context);\n this.name = \"TemplateRenderError\";\n }\n}\n\n/**\n * Error for malformed template syntax\n */\nexport class TemplateSyntaxError extends PinataError {\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, \"TEMPLATE_SYNTAX_ERROR\", context);\n this.name = \"TemplateSyntaxError\";\n }\n}\n\n/**\n * Regex for matching {{variable}} placeholders\n * Matches: {{variableName}}, {{variable_name}}, {{user.name}}\n */\nconst PLACEHOLDER_REGEX = /\\{\\{([a-zA-Z][a-zA-Z0-9_.]*)\\}\\}/g;\n\n/**\n * Regex for matching {{#if variable}}...{{/if}} conditionals\n */\nconst CONDITIONAL_REGEX = /\\{\\{#if\\s+([a-zA-Z][a-zA-Z0-9_.]*)\\s*\\}\\}([\\s\\S]*?)(?:\\{\\{#else\\}\\}([\\s\\S]*?))?\\{\\{\\/if\\}\\}/g;\n\n/**\n * Regex for matching {{#unless variable}}...{{/unless}} (inverse conditionals)\n */\nconst UNLESS_REGEX = /\\{\\{#unless\\s+([a-zA-Z][a-zA-Z0-9_.]*)\\s*\\}\\}([\\s\\S]*?)\\{\\{\\/unless\\}\\}/g;\n\n/**\n * Regex for matching {{#each items}}...{{/each}} loops\n */\nconst EACH_REGEX = /\\{\\{#each\\s+([a-zA-Z][a-zA-Z0-9_.]*)\\s*\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g;\n\n/**\n * Regex for detecting unclosed blocks\n */\nconst UNCLOSED_IF_REGEX = /\\{\\{#if\\s+[^}]+\\}\\}(?![\\s\\S]*\\{\\{\\/if\\}\\})/;\nconst UNCLOSED_EACH_REGEX = /\\{\\{#each\\s+[^}]+\\}\\}(?![\\s\\S]*\\{\\{\\/each\\}\\})/;\nconst UNCLOSED_UNLESS_REGEX = /\\{\\{#unless\\s+[^}]+\\}\\}(?![\\s\\S]*\\{\\{\\/unless\\}\\})/;\n\n/**\n * Regex for detecting orphaned closing tags\n */\nconst ORPHAN_ENDIF_REGEX = /\\{\\{\\/if\\}\\}(?![\\s\\S]*\\{\\{#if)/;\nconst ORPHAN_ENDEACH_REGEX = /\\{\\{\\/each\\}\\}(?![\\s\\S]*\\{\\{#each)/;\nconst ORPHAN_ENDUNLESS_REGEX = /\\{\\{\\/unless\\}\\}(?![\\s\\S]*\\{\\{#unless)/;\n\n/**\n * Result of parsing template placeholders\n */\nexport interface ParsedPlaceholder {\n /** Full match including braces: {{variableName}} */\n match: string;\n /** Variable name without braces: variableName or user.name */\n name: string;\n /** Start index in template */\n startIndex: number;\n /** End index in template */\n endIndex: number;\n /** Whether this is a nested path (e.g., user.name) */\n isNestedPath: boolean;\n /** Path segments for nested access */\n pathSegments: string[];\n}\n\n/**\n * Parsed conditional block\n */\nexport interface ParsedConditional {\n /** Full match */\n match: string;\n /** Variable name being tested */\n variable: string;\n /** Content if condition is true */\n trueBranch: string;\n /** Content if condition is false (optional) */\n falseBranch?: string;\n /** Start index */\n startIndex: number;\n /** End index */\n endIndex: number;\n}\n\n/**\n * Parsed loop block\n */\nexport interface ParsedLoop {\n /** Full match */\n match: string;\n /** Variable name of the array */\n variable: string;\n /** Loop body content */\n body: string;\n /** Start index */\n startIndex: number;\n /** End index */\n endIndex: number;\n}\n\n/**\n * Template syntax validation result\n */\nexport interface SyntaxValidationResult {\n valid: boolean;\n errors: TemplateSyntaxError[];\n}\n\n/**\n * Validation result for a single variable\n */\nexport interface VariableValidationResult {\n name: string;\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Complete validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n results: VariableValidationResult[];\n missingRequired: string[];\n unknownVariables: string[];\n typeErrors: string[];\n}\n\n/**\n * Options for rendering a template\n */\nexport interface RenderOptions {\n /** Strict mode - fail on any validation error */\n strict?: boolean;\n /** Leave unresolved placeholders as-is */\n allowUnresolved?: boolean;\n /** Custom placeholder format (default: {{name}}) */\n placeholderFormat?: \"mustache\" | \"dollar\" | \"percent\";\n}\n\n/**\n * Result of rendering a template\n */\nexport interface RenderResult {\n /** Rendered template content */\n content: string;\n /** Variables that were substituted */\n substituted: string[];\n /** Variables that were left unresolved */\n unresolved: string[];\n /** Imports required for the template */\n imports: string[];\n /** Fixtures required for the template */\n fixtures: string[];\n}\n\n/**\n * Renders test templates by substituting variable placeholders\n *\n * Supports:\n * - Simple variables: {{variableName}}\n * - Nested access: {{user.name}}\n * - Conditionals: {{#if variable}}...{{#else}}...{{/if}}\n * - Inverse conditionals: {{#unless variable}}...{{/unless}}\n * - Loops: {{#each items}}{{this}}{{/each}}\n *\n * @example\n * ```typescript\n * const renderer = new TemplateRenderer();\n *\n * const result = renderer.renderTemplate(template, {\n * user: { name: \"John\", admin: true },\n * items: [\"a\", \"b\", \"c\"],\n * });\n * ```\n */\nexport class TemplateRenderer {\n private readonly options: Required<RenderOptions>;\n\n constructor(options: RenderOptions = {}) {\n this.options = {\n strict: options.strict ?? true,\n allowUnresolved: options.allowUnresolved ?? false,\n placeholderFormat: options.placeholderFormat ?? \"mustache\",\n };\n }\n\n /**\n * Validate template syntax for common errors\n *\n * @param template Template string to validate\n * @returns Syntax validation result\n */\n validateSyntax(template: string): SyntaxValidationResult {\n const errors: TemplateSyntaxError[] = [];\n\n // Check for unclosed blocks\n if (this.hasUnclosedBlock(template, \"if\")) {\n errors.push(\n new TemplateSyntaxError(\"Unclosed {{#if}} block\", {\n hint: \"Every {{#if variable}} must have a matching {{/if}}\",\n })\n );\n }\n\n if (this.hasUnclosedBlock(template, \"each\")) {\n errors.push(\n new TemplateSyntaxError(\"Unclosed {{#each}} block\", {\n hint: \"Every {{#each variable}} must have a matching {{/each}}\",\n })\n );\n }\n\n if (this.hasUnclosedBlock(template, \"unless\")) {\n errors.push(\n new TemplateSyntaxError(\"Unclosed {{#unless}} block\", {\n hint: \"Every {{#unless variable}} must have a matching {{/unless}}\",\n })\n );\n }\n\n // Check for orphaned closing tags\n if (this.hasOrphanedClosingTag(template, \"if\")) {\n errors.push(\n new TemplateSyntaxError(\"Orphaned {{/if}} without matching {{#if}}\", {\n hint: \"Remove the extra {{/if}} or add the opening {{#if variable}}\",\n })\n );\n }\n\n if (this.hasOrphanedClosingTag(template, \"each\")) {\n errors.push(\n new TemplateSyntaxError(\"Orphaned {{/each}} without matching {{#each}}\", {\n hint: \"Remove the extra {{/each}} or add the opening {{#each variable}}\",\n })\n );\n }\n\n if (this.hasOrphanedClosingTag(template, \"unless\")) {\n errors.push(\n new TemplateSyntaxError(\"Orphaned {{/unless}} without matching {{#unless}}\", {\n hint: \"Remove the extra {{/unless}} or add the opening {{#unless variable}}\",\n })\n );\n }\n\n // Check for mismatched blocks\n const mismatchErrors = this.checkBlockNesting(template);\n errors.push(...mismatchErrors);\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Check if template has an unclosed block of specified type\n */\n private hasUnclosedBlock(template: string, blockType: string): boolean {\n const openRegex = new RegExp(`\\\\{\\\\{#${blockType}\\\\s+[^}]+\\\\}\\\\}`, \"g\");\n const closeRegex = new RegExp(`\\\\{\\\\{/${blockType}\\\\}\\\\}`, \"g\");\n\n const opens = (template.match(openRegex) || []).length;\n const closes = (template.match(closeRegex) || []).length;\n\n return opens > closes;\n }\n\n /**\n * Check if template has orphaned closing tags\n */\n private hasOrphanedClosingTag(template: string, blockType: string): boolean {\n const openRegex = new RegExp(`\\\\{\\\\{#${blockType}\\\\s+[^}]+\\\\}\\\\}`, \"g\");\n const closeRegex = new RegExp(`\\\\{\\\\{/${blockType}\\\\}\\\\}`, \"g\");\n\n const opens = (template.match(openRegex) || []).length;\n const closes = (template.match(closeRegex) || []).length;\n\n return closes > opens;\n }\n\n /**\n * Check for improperly nested blocks\n */\n private checkBlockNesting(template: string): TemplateSyntaxError[] {\n const errors: TemplateSyntaxError[] = [];\n const stack: { type: string; index: number }[] = [];\n\n // Match all block opens and closes\n const blockPattern = /\\{\\{(#(?:if|each|unless)|\\/(?:if|each|unless))\\s*[^}]*\\}\\}/g;\n let match: RegExpExecArray | null;\n\n while ((match = blockPattern.exec(template)) !== null) {\n const tag = match[1] ?? \"\";\n\n if (tag.startsWith(\"#\")) {\n // Opening tag\n const type = tag.slice(1).split(/\\s/)[0] ?? \"\";\n stack.push({ type, index: match.index });\n } else if (tag.startsWith(\"/\")) {\n // Closing tag\n const type = tag.slice(1);\n const last = stack.pop();\n\n if (!last) {\n // Orphaned closing tag (already handled)\n continue;\n }\n\n if (last.type !== type) {\n errors.push(\n new TemplateSyntaxError(`Mismatched block: opened {{#${last.type}}} but closed with {{/${type}}}`, {\n openedAt: last.index,\n closedAt: match.index,\n })\n );\n }\n }\n }\n\n return errors;\n }\n\n /**\n * Parse all placeholders from a template string\n *\n * @param template Template string to parse\n * @returns Array of parsed placeholders\n */\n parsePlaceholders(template: string): ParsedPlaceholder[] {\n const placeholders: ParsedPlaceholder[] = [];\n const regex = this.getPlaceholderRegex();\n let match: RegExpExecArray | null;\n\n // Reset regex state\n regex.lastIndex = 0;\n\n while ((match = regex.exec(template)) !== null) {\n const name = match[1] ?? \"\";\n const pathSegments = name.split(\".\");\n placeholders.push({\n match: match[0],\n name,\n startIndex: match.index,\n endIndex: match.index + match[0].length,\n isNestedPath: pathSegments.length > 1,\n pathSegments,\n });\n }\n\n return placeholders;\n }\n\n /**\n * Parse conditional blocks from template\n *\n * @param template Template string to parse\n * @returns Array of parsed conditionals\n */\n parseConditionals(template: string): ParsedConditional[] {\n const conditionals: ParsedConditional[] = [];\n const regex = new RegExp(CONDITIONAL_REGEX.source, \"g\");\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(template)) !== null) {\n const falseBranch = match[3];\n conditionals.push({\n match: match[0],\n variable: match[1] ?? \"\",\n trueBranch: match[2] ?? \"\",\n ...(falseBranch !== undefined && { falseBranch }),\n startIndex: match.index,\n endIndex: match.index + match[0].length,\n });\n }\n\n return conditionals;\n }\n\n /**\n * Parse loop blocks from template\n *\n * @param template Template string to parse\n * @returns Array of parsed loops\n */\n parseLoops(template: string): ParsedLoop[] {\n const loops: ParsedLoop[] = [];\n const regex = new RegExp(EACH_REGEX.source, \"g\");\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(template)) !== null) {\n loops.push({\n match: match[0],\n variable: match[1] ?? \"\",\n body: match[2] ?? \"\",\n startIndex: match.index,\n endIndex: match.index + match[0].length,\n });\n }\n\n return loops;\n }\n\n /**\n * Get unique variable names from template (including nested paths)\n * Excludes loop-internal variables like {{this}}, {{@index}}, and item properties\n *\n * @param template Template string to analyze\n * @param excludeLoopInternal Whether to exclude variables inside loop blocks\n * @returns Unique variable names found in template\n */\n getVariableNames(template: string, excludeLoopInternal = true): string[] {\n let processedTemplate = template;\n\n // If excluding loop internals, remove loop body content first\n if (excludeLoopInternal) {\n processedTemplate = processedTemplate.replace(EACH_REGEX, (match, variable: string) => {\n // Keep only the loop variable reference\n return `{{${variable}}}`;\n });\n }\n\n const placeholders = this.parsePlaceholders(processedTemplate);\n const names = new Set<string>();\n\n // Special loop variables to always exclude\n const loopSpecialVars = new Set([\"this\", \"@index\", \"@first\", \"@last\"]);\n\n for (const p of placeholders) {\n // Skip special loop variables\n if (loopSpecialVars.has(p.name)) {\n continue;\n }\n\n // Add the full path\n names.add(p.name);\n // Also add the root variable for nested paths\n if (p.isNestedPath && p.pathSegments[0]) {\n names.add(p.pathSegments[0]);\n }\n }\n\n // Also extract variables from conditionals (but not inside loops if excluding)\n const conditionals = this.parseConditionals(processedTemplate);\n for (const c of conditionals) {\n names.add(c.variable);\n const root = c.variable.split(\".\")[0];\n if (root && root !== c.variable) {\n names.add(root);\n }\n }\n\n // Extract loop array variables\n const loops = this.parseLoops(template); // Use original template for loop detection\n for (const l of loops) {\n names.add(l.variable);\n const root = l.variable.split(\".\")[0];\n if (root && root !== l.variable) {\n names.add(root);\n }\n }\n\n return [...names];\n }\n\n /**\n * Get value from object using dot notation path\n *\n * @param obj Object to traverse\n * @param path Dot-separated path (e.g., \"user.address.city\")\n * @returns Value at path or undefined\n */\n getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const segments = path.split(\".\");\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (current === null || current === undefined) {\n return undefined;\n }\n if (typeof current !== \"object\") {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n }\n\n /**\n * Evaluate if a value is truthy for conditional blocks\n *\n * @param value Value to evaluate\n * @returns True if value is truthy\n */\n isTruthy(value: unknown): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value !== 0;\n }\n if (typeof value === \"string\") {\n return value.length > 0;\n }\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n if (typeof value === \"object\") {\n return Object.keys(value).length > 0;\n }\n return Boolean(value);\n }\n\n /**\n * Process conditional blocks in template\n *\n * @param template Template string\n * @param values Variable values\n * @returns Processed template with conditionals resolved\n */\n processConditionals(template: string, values: Record<string, unknown>): string {\n let result = template;\n\n // Process {{#if}} blocks\n result = result.replace(CONDITIONAL_REGEX, (match, variable: string, trueBranch: string, falseBranch?: string) => {\n const value = this.getNestedValue(values, variable);\n const condition = this.isTruthy(value);\n return condition ? trueBranch : (falseBranch ?? \"\");\n });\n\n // Process {{#unless}} blocks (inverse conditionals)\n result = result.replace(UNLESS_REGEX, (match, variable: string, content: string) => {\n const value = this.getNestedValue(values, variable);\n const condition = this.isTruthy(value);\n return condition ? \"\" : content;\n });\n\n return result;\n }\n\n /**\n * Process loop blocks in template\n *\n * @param template Template string\n * @param values Variable values\n * @returns Processed template with loops expanded\n */\n processLoops(template: string, values: Record<string, unknown>): string {\n let result = template;\n\n result = result.replace(EACH_REGEX, (match, variable: string, body: string) => {\n const arrayValue = this.getNestedValue(values, variable);\n\n if (!Array.isArray(arrayValue)) {\n // If not an array, return empty string\n return \"\";\n }\n\n // Expand the loop\n const expanded: string[] = [];\n for (let i = 0; i < arrayValue.length; i++) {\n const item = arrayValue[i];\n let iterationBody = body;\n\n // Replace special loop variables\n // {{this}} - current item (for primitives)\n // {{@index}} - current index\n // {{@first}} - true if first item\n // {{@last}} - true if last item\n iterationBody = iterationBody.replace(/\\{\\{this\\}\\}/g, this.stringify(item));\n iterationBody = iterationBody.replace(/\\{\\{@index\\}\\}/g, String(i));\n iterationBody = iterationBody.replace(/\\{\\{@first\\}\\}/g, String(i === 0));\n iterationBody = iterationBody.replace(/\\{\\{@last\\}\\}/g, String(i === arrayValue.length - 1));\n\n // If item is an object, process conditionals with item context first\n if (item !== null && typeof item === \"object\" && !Array.isArray(item)) {\n const itemObj = item as Record<string, unknown>;\n\n // Process conditionals within this iteration using item's properties\n iterationBody = this.processConditionals(iterationBody, itemObj);\n\n // Then replace any remaining simple property placeholders\n for (const [key, value] of Object.entries(itemObj)) {\n const propRegex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\");\n iterationBody = iterationBody.replace(propRegex, this.stringify(value));\n }\n }\n\n expanded.push(iterationBody);\n }\n\n return expanded.join(\"\");\n });\n\n return result;\n }\n\n /**\n * Validate provided variables against template requirements\n *\n * @param template Test template with variable definitions\n * @param values Provided variable values\n * @returns Validation result\n */\n validateVariables(\n template: TestTemplate,\n values: Record<string, unknown>\n ): ValidationResult {\n const results: VariableValidationResult[] = [];\n const missingRequired: string[] = [];\n const unknownVariables: string[] = [];\n const typeErrors: string[] = [];\n\n // Get variables used in template content\n const usedInTemplate = new Set(this.getVariableNames(template.template));\n\n // Create a map of defined variables for quick lookup\n const definedVariables = new Map<string, TemplateVariable>();\n for (const v of template.variables) {\n definedVariables.set(v.name, v);\n }\n\n // Check each defined variable\n for (const variable of template.variables) {\n const result: VariableValidationResult = {\n name: variable.name,\n valid: true,\n errors: [],\n };\n\n const value = values[variable.name];\n const hasValue = variable.name in values;\n\n // Check if required variable is missing\n if (variable.required && !hasValue && variable.defaultValue === undefined) {\n result.valid = false;\n result.errors.push(`Required variable '${variable.name}' is missing`);\n missingRequired.push(variable.name);\n }\n\n // Type check if value is provided\n if (hasValue && value !== undefined && value !== null) {\n const typeError = this.checkType(variable.name, value, variable.type);\n if (typeError) {\n result.valid = false;\n result.errors.push(typeError);\n typeErrors.push(typeError);\n }\n }\n\n results.push(result);\n }\n\n // Check for unknown variables in provided values\n const providedNames = Object.keys(values);\n for (const name of providedNames) {\n if (!definedVariables.has(name)) {\n // Check if it's used in template but not defined (include nested paths)\n const isUsed = [...usedInTemplate].some((used) => used === name || used.startsWith(name + \".\"));\n\n if (isUsed) {\n // It's used but not formally defined - allow it but warn\n results.push({\n name,\n valid: true,\n errors: [`Variable '${name}' is used in template but not formally defined`],\n });\n } else {\n unknownVariables.push(name);\n }\n }\n }\n\n // Check for placeholders in template that have no value\n for (const placeholder of usedInTemplate) {\n const defined = definedVariables.get(placeholder);\n // For nested paths, check if root variable is provided\n const rootVar = placeholder.split(\".\")[0] ?? placeholder;\n const hasValue = placeholder in values || rootVar in values;\n\n if (!hasValue && !defined?.defaultValue) {\n // Check if this is a required defined variable (already handled above)\n // or an undefined placeholder\n if (!defined) {\n // Only add root variables to missing (nested paths are covered by root)\n if (!placeholder.includes(\".\")) {\n missingRequired.push(placeholder);\n } else if (!(rootVar in values)) {\n missingRequired.push(rootVar);\n }\n }\n }\n }\n\n const valid =\n missingRequired.length === 0 &&\n typeErrors.length === 0 &&\n (unknownVariables.length === 0 || !this.options.strict);\n\n return {\n valid,\n results,\n missingRequired: [...new Set(missingRequired)],\n unknownVariables,\n typeErrors,\n };\n }\n\n /**\n * Check if a value matches the expected type\n */\n private checkType(name: string, value: unknown, expectedType: VariableType): string | null {\n const actualType = this.getValueType(value);\n\n if (actualType !== expectedType) {\n return `Variable '${name}' expected type '${expectedType}' but got '${actualType}'`;\n }\n\n return null;\n }\n\n /**\n * Determine the VariableType of a value\n */\n private getValueType(value: unknown): VariableType {\n if (value === null || value === undefined) {\n return \"string\"; // Treat null/undefined as string for placeholder purposes\n }\n\n if (Array.isArray(value)) {\n return \"array\";\n }\n\n if (typeof value === \"object\") {\n return \"object\";\n }\n\n if (typeof value === \"boolean\") {\n return \"boolean\";\n }\n\n if (typeof value === \"number\") {\n return \"number\";\n }\n\n return \"string\";\n }\n\n /**\n * Substitute variables in a template string\n *\n * @param template Template string with placeholders\n * @param values Variable values to substitute\n * @param variableDefs Optional variable definitions for defaults\n * @returns Substitution result\n */\n substituteVariables(\n template: string,\n values: Record<string, unknown>,\n variableDefs?: TemplateVariable[]\n ): { content: string; substituted: string[]; unresolved: string[] } {\n const substituted: string[] = [];\n const unresolved: string[] = [];\n\n // Build a values map including defaults\n const resolvedValues = new Map<string, unknown>();\n\n // Apply defaults first\n if (variableDefs) {\n for (const def of variableDefs) {\n if (def.defaultValue !== undefined) {\n resolvedValues.set(def.name, def.defaultValue);\n }\n }\n }\n\n // Apply provided values (override defaults)\n // Note: explicitly set undefined/null values to empty string\n for (const [key, value] of Object.entries(values)) {\n if (value === undefined || value === null) {\n resolvedValues.set(key, null); // Mark as explicitly set but empty\n } else {\n resolvedValues.set(key, value);\n }\n }\n\n // Build combined values object for nested access\n const combinedValues: Record<string, unknown> = {};\n for (const [key, value] of resolvedValues) {\n combinedValues[key] = value;\n }\n\n // Perform substitution\n const regex = this.getPlaceholderRegex();\n const content = template.replace(regex, (match, name: string) => {\n // Check for nested path\n let value: unknown;\n let hasValue = false;\n\n if (name.includes(\".\")) {\n value = this.getNestedValue(combinedValues, name);\n hasValue = value !== undefined;\n } else {\n hasValue = resolvedValues.has(name);\n value = resolvedValues.get(name);\n }\n\n if (hasValue) {\n substituted.push(name);\n return this.stringify(value);\n }\n\n if (this.options.allowUnresolved) {\n unresolved.push(name);\n return match;\n }\n\n unresolved.push(name);\n return match;\n });\n\n return {\n content,\n substituted: [...new Set(substituted)],\n unresolved: [...new Set(unresolved)],\n };\n }\n\n /**\n * Convert a value to string for template substitution\n */\n private stringify(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n // Format arrays appropriately for code context\n return JSON.stringify(value);\n }\n\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n\n return String(value);\n }\n\n /**\n * Process all template features: conditionals, loops, then variable substitution\n *\n * @param template Template string\n * @param values Variable values\n * @param variableDefs Optional variable definitions\n * @returns Processed content with all features applied\n */\n processTemplate(\n template: string,\n values: Record<string, unknown>,\n variableDefs?: TemplateVariable[]\n ): Result<{ content: string; substituted: string[]; unresolved: string[] }, PinataError> {\n // First, validate syntax\n const syntaxResult = this.validateSyntax(template);\n if (!syntaxResult.valid && this.options.strict) {\n return err(syntaxResult.errors[0] ?? new TemplateSyntaxError(\"Unknown syntax error\"));\n }\n\n // Build combined values with defaults\n const combinedValues: Record<string, unknown> = {};\n if (variableDefs) {\n for (const def of variableDefs) {\n if (def.defaultValue !== undefined) {\n combinedValues[def.name] = def.defaultValue;\n }\n }\n }\n for (const [key, value] of Object.entries(values)) {\n combinedValues[key] = value;\n }\n\n // Process in order: loops first, then conditionals, then simple substitution\n let processed = template;\n\n // Process loops (may create new content with placeholders)\n processed = this.processLoops(processed, combinedValues);\n\n // Process conditionals\n processed = this.processConditionals(processed, combinedValues);\n\n // Finally, substitute remaining variables\n const result = this.substituteVariables(processed, combinedValues, variableDefs);\n\n return ok(result);\n }\n\n /**\n * Render a complete test template with variable substitution\n *\n * @param template Test template to render\n * @param values Variable values to substitute\n * @param options Optional render options\n * @returns Render result or error\n */\n renderTemplate(\n template: TestTemplate,\n values: Record<string, unknown>,\n options?: RenderOptions\n ): Result<RenderResult, PinataError> {\n const mergedOptions = { ...this.options, ...options };\n\n // First validate syntax\n const syntaxResult = this.validateSyntax(template.template);\n if (!syntaxResult.valid && mergedOptions.strict) {\n return err(syntaxResult.errors[0] ?? new TemplateSyntaxError(\"Unknown syntax error\"));\n }\n\n // Validate variables\n const validation = this.validateVariables(template, values);\n\n if (!validation.valid && mergedOptions.strict) {\n const errors: string[] = [];\n\n if (validation.missingRequired.length > 0) {\n errors.push(`Missing required variables: ${validation.missingRequired.join(\", \")}`);\n }\n\n if (validation.typeErrors.length > 0) {\n errors.push(...validation.typeErrors);\n }\n\n if (validation.unknownVariables.length > 0) {\n errors.push(`Unknown variables: ${validation.unknownVariables.join(\", \")}`);\n }\n\n return err(\n new TemplateRenderError(\"Template validation failed\", {\n errors,\n validation,\n })\n );\n }\n\n // Process the template with all features\n const processResult = this.processTemplate(template.template, values, template.variables);\n if (!processResult.success) {\n return processResult;\n }\n\n const { content, substituted, unresolved } = processResult.data;\n\n // Check for unresolved if not allowed\n if (unresolved.length > 0 && !mergedOptions.allowUnresolved && mergedOptions.strict) {\n return err(\n new TemplateRenderError(\"Unresolved template variables\", {\n unresolved,\n })\n );\n }\n\n return ok({\n content,\n substituted,\n unresolved,\n imports: template.imports ?? [],\n fixtures: template.fixtures ?? [],\n });\n }\n\n /**\n * Render multiple templates at once\n *\n * @param templates Array of templates to render\n * @param values Variable values (applied to all templates)\n * @returns Array of render results\n */\n renderTemplates(\n templates: TestTemplate[],\n values: Record<string, unknown>\n ): Result<RenderResult[], PinataError> {\n const results: RenderResult[] = [];\n\n for (const template of templates) {\n const result = this.renderTemplate(template, values);\n if (!result.success) {\n return err(\n new TemplateRenderError(`Failed to render template '${template.id}'`, {\n templateId: template.id,\n originalError: result.error.message,\n })\n );\n }\n results.push(result.data);\n }\n\n return ok(results);\n }\n\n /**\n * Check if a template string contains nested placeholders\n * (e.g., {{outer{{inner}}}})\n *\n * @param template Template string to check\n * @returns True if nested placeholders detected\n */\n hasNestedPlaceholders(template: string): boolean {\n // Look for patterns like {{...{{...}}...}}\n const nestedPattern = /\\{\\{[^{}]*\\{\\{/;\n return nestedPattern.test(template);\n }\n\n /**\n * Extract all imports from rendered templates\n *\n * @param results Array of render results\n * @returns Deduplicated array of imports\n */\n collectImports(results: RenderResult[]): string[] {\n const imports = new Set<string>();\n for (const result of results) {\n for (const imp of result.imports) {\n imports.add(imp);\n }\n }\n return [...imports];\n }\n\n /**\n * Extract all fixtures from rendered templates\n *\n * @param results Array of render results\n * @returns Deduplicated array of fixtures\n */\n collectFixtures(results: RenderResult[]): string[] {\n const fixtures = new Set<string>();\n for (const result of results) {\n for (const fix of result.fixtures) {\n fixtures.add(fix);\n }\n }\n return [...fixtures];\n }\n\n /**\n * Get the appropriate regex for the configured placeholder format\n */\n private getPlaceholderRegex(): RegExp {\n switch (this.options.placeholderFormat) {\n case \"dollar\":\n // ${variableName} or ${user.name}\n return /\\$\\{([a-zA-Z][a-zA-Z0-9_.]*)\\}/g;\n case \"percent\":\n // %(variableName)s\n return /%\\(([a-zA-Z][a-zA-Z0-9_.]*)\\)s/g;\n case \"mustache\":\n default:\n // {{variableName}} or {{user.name}}\n return /\\{\\{([a-zA-Z][a-zA-Z0-9_.]*)\\}\\}/g;\n }\n }\n\n /**\n * Create a template from a string with variable definitions\n *\n * @param templateString Template content\n * @param variables Variable definitions\n * @param metadata Additional template metadata\n * @returns TestTemplate object\n */\n static createTemplate(\n templateString: string,\n variables: TemplateVariable[],\n metadata: Partial<Omit<TestTemplate, \"template\" | \"variables\">> = {}\n ): TestTemplate {\n return {\n id: metadata.id ?? \"custom-template\",\n language: metadata.language ?? \"typescript\",\n framework: metadata.framework ?? \"jest\",\n template: templateString,\n variables,\n imports: metadata.imports,\n fixtures: metadata.fixtures,\n description: metadata.description,\n };\n }\n}\n\n/**\n * Factory function to create a TemplateRenderer with default options\n */\nexport function createRenderer(options?: RenderOptions): TemplateRenderer {\n return new TemplateRenderer(options);\n}\n","import chalk from \"chalk\";\n\nimport type { CategorySummary } from \"../categories/schema/index.js\";\n\n/**\n * Output format types\n */\nexport type OutputFormat = \"terminal\" | \"json\" | \"markdown\";\n\n/**\n * Severity colors for terminal output\n */\nconst SEVERITY_COLORS = {\n critical: chalk.red.bold,\n high: chalk.red,\n medium: chalk.yellow,\n low: chalk.gray,\n};\n\n/**\n * Priority colors for terminal output\n */\nconst PRIORITY_COLORS = {\n P0: chalk.red.bold,\n P1: chalk.yellow,\n P2: chalk.gray,\n};\n\n/**\n * Domain colors for terminal output\n */\nconst DOMAIN_COLORS: Record<string, typeof chalk> = {\n security: chalk.red,\n data: chalk.blue,\n concurrency: chalk.magenta,\n input: chalk.cyan,\n resource: chalk.yellow,\n reliability: chalk.green,\n performance: chalk.yellowBright,\n platform: chalk.gray,\n business: chalk.white,\n compliance: chalk.blueBright,\n};\n\n/**\n * Format category list for terminal output with colors\n */\nexport function formatTerminal(categories: CategorySummary[]): string {\n if (categories.length === 0) {\n return chalk.yellow(\"No categories found matching the filters.\");\n }\n\n const lines: string[] = [];\n\n // Header\n lines.push(chalk.bold.underline(`Found ${categories.length} categories:\\n`));\n\n // Group by domain for better organization\n const byDomain = new Map<string, CategorySummary[]>();\n for (const cat of categories) {\n const domain = cat.domain;\n if (!byDomain.has(domain)) {\n byDomain.set(domain, []);\n }\n byDomain.get(domain)!.push(cat);\n }\n\n // Output each domain group\n for (const [domain, domainCategories] of byDomain) {\n const domainColor = DOMAIN_COLORS[domain] ?? chalk.white;\n lines.push(domainColor.bold(`\\n${domain.toUpperCase()} (${domainCategories.length})`));\n lines.push(chalk.gray(\"─\".repeat(40)));\n\n for (const cat of domainCategories) {\n const priorityColor = PRIORITY_COLORS[cat.priority];\n const severityColor = SEVERITY_COLORS[cat.severity];\n\n const priority = priorityColor(`[${cat.priority}]`);\n const severity = severityColor(`${cat.severity}`);\n const level = chalk.cyan(`${cat.level}`);\n const name = chalk.white.bold(cat.name);\n const id = chalk.gray(`(${cat.id})`);\n\n lines.push(` ${priority} ${name} ${id}`);\n lines.push(` ${severity} | ${level}`);\n\n // Truncate description\n const desc = cat.description.length > 80\n ? cat.description.slice(0, 77) + \"...\"\n : cat.description;\n lines.push(chalk.gray(` ${desc}`));\n lines.push(\"\");\n }\n }\n\n // Summary footer\n lines.push(chalk.gray(\"─\".repeat(40)));\n lines.push(formatStats(categories));\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format statistics summary\n */\nfunction formatStats(categories: CategorySummary[]): string {\n const stats = {\n P0: 0,\n P1: 0,\n P2: 0,\n critical: 0,\n high: 0,\n medium: 0,\n low: 0,\n };\n\n for (const cat of categories) {\n stats[cat.priority]++;\n stats[cat.severity]++;\n }\n\n const parts: string[] = [];\n\n if (stats.P0 > 0) parts.push(PRIORITY_COLORS.P0(`${stats.P0} P0`));\n if (stats.P1 > 0) parts.push(PRIORITY_COLORS.P1(`${stats.P1} P1`));\n if (stats.P2 > 0) parts.push(PRIORITY_COLORS.P2(`${stats.P2} P2`));\n\n parts.push(chalk.gray(\"|\"));\n\n if (stats.critical > 0) parts.push(SEVERITY_COLORS.critical(`${stats.critical} critical`));\n if (stats.high > 0) parts.push(SEVERITY_COLORS.high(`${stats.high} high`));\n if (stats.medium > 0) parts.push(SEVERITY_COLORS.medium(`${stats.medium} medium`));\n if (stats.low > 0) parts.push(SEVERITY_COLORS.low(`${stats.low} low`));\n\n return parts.join(\" \");\n}\n\n/**\n * Format category list as JSON\n */\nexport function formatJson(categories: CategorySummary[]): string {\n return JSON.stringify(categories, null, 2);\n}\n\n/**\n * Format category list as Markdown\n */\nexport function formatMarkdown(categories: CategorySummary[]): string {\n if (categories.length === 0) {\n return \"_No categories found matching the filters._\";\n }\n\n const lines: string[] = [];\n\n lines.push(`# Categories (${categories.length})\\n`);\n\n // Group by domain\n const byDomain = new Map<string, CategorySummary[]>();\n for (const cat of categories) {\n const domain = cat.domain;\n if (!byDomain.has(domain)) {\n byDomain.set(domain, []);\n }\n byDomain.get(domain)!.push(cat);\n }\n\n // Output each domain group\n for (const [domain, domainCategories] of byDomain) {\n lines.push(`\\n## ${domain.charAt(0).toUpperCase() + domain.slice(1)} (${domainCategories.length})\\n`);\n\n for (const cat of domainCategories) {\n lines.push(`### ${cat.name}`);\n lines.push(`- **ID**: \\`${cat.id}\\``);\n lines.push(`- **Priority**: ${cat.priority}`);\n lines.push(`- **Severity**: ${cat.severity}`);\n lines.push(`- **Level**: ${cat.level}`);\n lines.push(`\\n${cat.description}\\n`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format categories in the specified output format\n */\nexport function formatCategories(categories: CategorySummary[], format: OutputFormat): string {\n switch (format) {\n case \"json\":\n return formatJson(categories);\n case \"markdown\":\n return formatMarkdown(categories);\n case \"terminal\":\n default:\n return formatTerminal(categories);\n }\n}\n\n/**\n * Validate output format string\n */\nexport function isValidOutputFormat(format: string): format is OutputFormat {\n return [\"terminal\", \"json\", \"markdown\"].includes(format);\n}\n\n/**\n * Format an error for terminal output\n */\nexport function formatError(error: Error): string {\n return chalk.red(`Error: ${error.message}`);\n}\n\n/**\n * Format a warning for terminal output\n */\nexport function formatWarning(message: string): string {\n return chalk.yellow(`Warning: ${message}`);\n}\n\n/**\n * Format a success message for terminal output\n */\nexport function formatSuccess(message: string): string {\n return chalk.green(`✓ ${message}`);\n}\n","/**\n * Formatters for generate command output\n */\n\nimport { mkdir, writeFile, readFile } from \"fs/promises\";\nimport { basename, dirname, relative, resolve } from \"path\";\n\nimport chalk from \"chalk\";\n\nimport { PinataError } from \"../lib/errors.js\";\nimport { ok, err } from \"../lib/result.js\";\nimport { suggestVariables } from \"../ai/template-filler.js\";\n\nimport type { TestTemplate, Category, TemplateVariable } from \"../categories/schema/index.js\";\nimport type { Gap } from \"../core/scanner/types.js\";\nimport type { Result } from \"../lib/result.js\";\nimport type { RenderResult } from \"../templates/index.js\";\nimport type { AIConfig } from \"../ai/types.js\";\n\n\n\n/**\n * Generated test with metadata\n */\nexport interface GeneratedTest {\n /** Gap that this test addresses */\n gap: Gap;\n /** Category the gap belongs to */\n category: Category;\n /** Template used for generation */\n template: TestTemplate;\n /** Rendered test content */\n result: RenderResult;\n /** Suggested file path for the test */\n suggestedPath: string;\n}\n\n/**\n * Format generated tests for terminal output (dry run preview)\n */\nexport function formatGeneratedTerminal(tests: GeneratedTest[], basePath: string): string {\n const lines: string[] = [];\n\n if (tests.length === 0) {\n lines.push(chalk.yellow(\"No tests generated.\"));\n return lines.join(\"\\n\");\n }\n\n lines.push(chalk.bold.cyan(`\\nGenerated ${tests.length} test(s):\\n`));\n lines.push(chalk.gray(\"─\".repeat(60)));\n\n for (const test of tests) {\n const relGapPath = relative(basePath, test.gap.filePath);\n\n // Header\n lines.push(\"\");\n lines.push(chalk.bold.white(`Test for: ${test.gap.categoryName}`));\n lines.push(chalk.gray(` Gap location: ${relGapPath}:${test.gap.lineStart}`));\n lines.push(chalk.gray(` Template: ${test.template.id}`));\n lines.push(chalk.gray(` Output: ${test.suggestedPath}`));\n lines.push(\"\");\n\n // Code block with syntax highlighting hint\n lines.push(chalk.cyan(`// --- ${test.suggestedPath} ---`));\n lines.push(\"\");\n\n // Add imports if any\n if (test.result.imports.length > 0) {\n for (const imp of test.result.imports) {\n lines.push(chalk.gray(imp));\n }\n lines.push(\"\");\n }\n\n // Add the test content\n lines.push(test.result.content);\n lines.push(\"\");\n lines.push(chalk.gray(\"─\".repeat(60)));\n }\n\n // Summary\n lines.push(\"\");\n lines.push(chalk.bold(\"Summary:\"));\n lines.push(` Tests generated: ${chalk.green(tests.length.toString())}`);\n\n const categories = new Set(tests.map((t) => t.category.id));\n lines.push(` Categories covered: ${chalk.cyan(categories.size.toString())}`);\n\n if (tests.some((t) => t.result.unresolved.length > 0)) {\n const unresolvedCount = tests.reduce((acc, t) => acc + t.result.unresolved.length, 0);\n lines.push(chalk.yellow(` Unresolved placeholders: ${unresolvedCount}`));\n lines.push(chalk.gray(\" (Some placeholders need manual completion)\"));\n }\n\n lines.push(\"\");\n lines.push(chalk.gray(\"This is a dry run. Use --write to save files.\"));\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format generated tests as JSON\n */\nexport function formatGeneratedJson(tests: GeneratedTest[]): string {\n const output = tests.map((test) => ({\n gap: {\n categoryId: test.gap.categoryId,\n categoryName: test.gap.categoryName,\n filePath: test.gap.filePath,\n lineStart: test.gap.lineStart,\n severity: test.gap.severity,\n confidence: test.gap.confidence,\n },\n template: {\n id: test.template.id,\n framework: test.template.framework,\n language: test.template.language,\n },\n suggestedPath: test.suggestedPath,\n content: test.result.content,\n imports: test.result.imports,\n fixtures: test.result.fixtures,\n substituted: test.result.substituted,\n unresolved: test.result.unresolved,\n }));\n\n return JSON.stringify(output, null, 2);\n}\n\n/**\n * Generate suggested test file path based on source file and template\n */\nexport function suggestTestPath(\n sourceFile: string,\n template: TestTemplate,\n basePath: string\n): string {\n const dir = dirname(sourceFile);\n const name = basename(sourceFile);\n\n // Remove extension\n const nameWithoutExt = name.replace(/\\.[^.]+$/, \"\");\n\n // Determine test extension based on template language\n const extMap: Record<string, string> = {\n python: \".py\",\n typescript: \".ts\",\n javascript: \".js\",\n go: \"_test.go\",\n java: \"Test.java\",\n rust: \".rs\",\n };\n const ext = extMap[template.language] ?? \".test.ts\";\n\n // Determine test naming convention based on language\n let testFileName: string;\n switch (template.language) {\n case \"python\":\n testFileName = `test_${nameWithoutExt}${ext}`;\n break;\n case \"go\":\n testFileName = `${nameWithoutExt}${ext}`;\n break;\n case \"java\":\n testFileName = `${nameWithoutExt}${ext}`;\n break;\n default:\n testFileName = `${nameWithoutExt}.test${ext}`;\n }\n\n // For now, suggest putting tests next to source files\n // A more sophisticated approach would use project conventions\n const relativeSrc = relative(basePath, dir);\n const testDir = relativeSrc.replace(/^src/, \"tests\");\n\n return `${testDir}/${testFileName}`;\n}\n\n/**\n * Extract template variables from a gap\n */\nexport function extractVariablesFromGap(gap: Gap): Record<string, unknown> {\n // Extract useful info from the gap for template substitution\n const fileName = basename(gap.filePath);\n const fileNameWithoutExt = fileName.replace(/\\.[^.]+$/, \"\");\n\n // Try to extract function/class name from code snippet\n const funcMatch = gap.codeSnippet.match(/(?:def|function|async function|const|let|var)\\s+(\\w+)/);\n const classMatch = gap.codeSnippet.match(/(?:class)\\s+(\\w+)/);\n\n return {\n // File info\n filePath: gap.filePath,\n fileName,\n fileNameWithoutExt,\n lineNumber: gap.lineStart,\n\n // Category info\n categoryId: gap.categoryId,\n categoryName: gap.categoryName,\n domain: gap.domain,\n level: gap.level,\n severity: gap.severity,\n confidence: gap.confidence,\n\n // Code context\n codeSnippet: gap.codeSnippet,\n functionName: funcMatch?.[1] ?? \"targetFunction\",\n className: classMatch?.[1] ?? \"TargetClass\",\n\n // Common template variables\n testName: `test_${gap.categoryId.replace(/-/g, \"_\")}`,\n testDescription: `Test for ${gap.categoryName} in ${fileName}:${gap.lineStart}`,\n\n // Pattern info\n patternId: gap.patternId,\n patternType: gap.patternType,\n };\n}\n\n/**\n * Extract template variables using AI for smarter filling\n *\n * Falls back to rule-based extraction if AI is not available\n */\nexport async function extractVariablesWithAI(\n gap: Gap,\n templateVariables: TemplateVariable[],\n aiConfig?: Partial<AIConfig>\n): Promise<Record<string, unknown>> {\n // Start with basic extraction\n const baseVars = extractVariablesFromGap(gap);\n\n // Use AI to fill remaining template variables\n const result = await suggestVariables(\n {\n codeSnippet: gap.codeSnippet,\n filePath: gap.filePath,\n variables: templateVariables,\n gap,\n existingValues: baseVars,\n },\n aiConfig\n );\n\n if (result.success && result.data) {\n return result.data.values;\n }\n\n // Fallback to base variables\n return baseVars;\n}\n\n/**\n * Result of writing a test file\n */\nexport interface WriteResult {\n /** Path where file was written */\n path: string;\n /** Whether the file was created (vs updated) */\n created: boolean;\n /** Whether content was appended to existing file */\n appended: boolean;\n /** Category ID this test is for */\n categoryId: string;\n /** Gap location */\n gapLocation: string;\n}\n\n/**\n * Summary of all written files\n */\nexport interface WriteSummary {\n /** Files that were created */\n created: WriteResult[];\n /** Files that were updated (appended) */\n updated: WriteResult[];\n /** Files that failed to write */\n failed: Array<{ path: string; error: string }>;\n /** Total tests written */\n totalTests: number;\n}\n\n/**\n * Write generated tests to disk\n *\n * @param tests Generated tests to write\n * @param basePath Base path for resolving output paths\n * @param outputDir Optional override for output directory\n * @returns Write summary\n */\nexport async function writeGeneratedTests(\n tests: GeneratedTest[],\n basePath: string,\n outputDir?: string\n): Promise<Result<WriteSummary, PinataError>> {\n const summary: WriteSummary = {\n created: [],\n updated: [],\n failed: [],\n totalTests: 0,\n };\n\n // Group tests by output file to combine tests for same file\n const testsByFile = new Map<string, GeneratedTest[]>();\n for (const test of tests) {\n // Resolve the actual output path\n let outputPath: string;\n if (outputDir) {\n // Use custom output directory\n outputPath = resolve(basePath, outputDir, test.suggestedPath);\n } else {\n // Use suggested path relative to base\n outputPath = resolve(basePath, test.suggestedPath);\n }\n\n const existing = testsByFile.get(outputPath) ?? [];\n existing.push(test);\n testsByFile.set(outputPath, existing);\n }\n\n // Write each file\n for (const [outputPath, fileTests] of testsByFile) {\n try {\n // Ensure directory exists (idempotent, no race condition)\n const dir = dirname(outputPath);\n await mkdir(dir, { recursive: true });\n\n // Try to read existing file content (avoids TOCTOU race condition)\n let existingContent = \"\";\n let fileExists = false;\n try {\n existingContent = await readFile(outputPath, \"utf-8\");\n fileExists = true;\n } catch {\n // File doesn't exist - that's fine\n }\n\n // Build content for this file\n const contentParts: string[] = [];\n\n // Collect all imports from all tests\n const allImports = new Set<string>();\n for (const test of fileTests) {\n for (const imp of test.result.imports) {\n allImports.add(imp);\n }\n }\n\n // Add imports header if any and file is new\n if (!fileExists && allImports.size > 0) {\n contentParts.push(Array.from(allImports).join(\"\\n\"));\n contentParts.push(\"\");\n }\n\n // Add each test's content\n for (const test of fileTests) {\n // Add a comment header for each test\n contentParts.push(`// Test for ${test.gap.categoryName}`);\n contentParts.push(`// Gap: ${relative(basePath, test.gap.filePath)}:${test.gap.lineStart}`);\n contentParts.push(`// Generated by Pinata`);\n contentParts.push(\"\");\n contentParts.push(test.result.content);\n contentParts.push(\"\");\n }\n\n const newContent = contentParts.join(\"\\n\");\n\n // Determine how to write\n let finalContent: string;\n let appended = false;\n\n if (fileExists) {\n // Append to existing file\n finalContent = existingContent.trimEnd() + \"\\n\\n\" + newContent;\n appended = true;\n } else {\n // Create new file\n finalContent = newContent;\n }\n\n // Write the file\n await writeFile(outputPath, finalContent, \"utf-8\");\n\n // Record results\n for (const test of fileTests) {\n const result: WriteResult = {\n path: outputPath,\n created: !fileExists,\n appended,\n categoryId: test.gap.categoryId,\n gapLocation: `${relative(basePath, test.gap.filePath)}:${test.gap.lineStart}`,\n };\n\n if (fileExists) {\n summary.updated.push(result);\n } else {\n summary.created.push(result);\n }\n summary.totalTests++;\n }\n } catch (error) {\n summary.failed.push({\n path: outputPath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return ok(summary);\n}\n\n/**\n * Format write summary for terminal output\n */\nexport function formatWriteSummary(summary: WriteSummary, basePath: string): string {\n const lines: string[] = [];\n\n lines.push(\"\");\n lines.push(chalk.bold.cyan(\"Write Summary:\"));\n lines.push(chalk.gray(\"─\".repeat(60)));\n\n // Created files\n if (summary.created.length > 0) {\n const uniquePaths = new Set(summary.created.map((r) => r.path));\n lines.push(\"\");\n lines.push(chalk.green.bold(`Created ${uniquePaths.size} file(s):`));\n for (const path of uniquePaths) {\n const relPath = relative(basePath, path);\n const testsInFile = summary.created.filter((r) => r.path === path).length;\n lines.push(chalk.green(` + ${relPath} (${testsInFile} test(s))`));\n }\n }\n\n // Updated files\n if (summary.updated.length > 0) {\n const uniquePaths = new Set(summary.updated.map((r) => r.path));\n lines.push(\"\");\n lines.push(chalk.yellow.bold(`Updated ${uniquePaths.size} file(s):`));\n for (const path of uniquePaths) {\n const relPath = relative(basePath, path);\n const testsInFile = summary.updated.filter((r) => r.path === path).length;\n lines.push(chalk.yellow(` ~ ${relPath} (${testsInFile} test(s) appended)`));\n }\n }\n\n // Failed files\n if (summary.failed.length > 0) {\n lines.push(\"\");\n lines.push(chalk.red.bold(`Failed to write ${summary.failed.length} file(s):`));\n for (const fail of summary.failed) {\n const relPath = relative(basePath, fail.path);\n lines.push(chalk.red(` ✗ ${relPath}: ${fail.error}`));\n }\n }\n\n // Summary\n lines.push(\"\");\n lines.push(chalk.gray(\"─\".repeat(60)));\n lines.push(chalk.bold(`Total: ${summary.totalTests} test(s) written to ${new Set([...summary.created.map((r) => r.path), ...summary.updated.map((r) => r.path)]).size} file(s)`));\n\n if (summary.failed.length > 0) {\n lines.push(chalk.red(`Failures: ${summary.failed.length}`));\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * AI Service Implementation\n *\n * Provides a unified interface for AI completions across providers.\n * Supports Anthropic Claude and OpenAI GPT models.\n */\n\nimport type {\n AIConfig,\n AIProvider,\n AIResponse,\n CompletionRequest,\n} from \"./types.js\";\n\nconst DEFAULT_CONFIG: Required<AIConfig> = {\n provider: \"anthropic\",\n apiKey: \"\",\n model: \"claude-sonnet-4-20250514\",\n maxTokens: 1024,\n temperature: 0.3,\n timeoutMs: 30000,\n};\n\nconst PROVIDER_MODELS: Record<AIProvider, string> = {\n anthropic: \"claude-sonnet-4-20250514\",\n openai: \"gpt-4o\",\n mock: \"mock-model\",\n};\n\nconst PROVIDER_ENDPOINTS: Record<AIProvider, string> = {\n anthropic: \"https://api.anthropic.com/v1/messages\",\n openai: \"https://api.openai.com/v1/chat/completions\",\n mock: \"\",\n};\n\n/**\n * AI Service for generating completions\n */\nexport class AIService {\n private readonly config: Required<AIConfig>;\n\n constructor(config: Partial<AIConfig> = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n apiKey: config.apiKey ?? this.getApiKeyFromEnv(config.provider ?? \"anthropic\"),\n model: config.model ?? PROVIDER_MODELS[config.provider ?? \"anthropic\"],\n };\n }\n\n /**\n * Get API key from environment variable\n * For config file support, use the sync version below\n */\n private getApiKeyFromEnv(provider: AIProvider): string {\n if (provider === \"mock\") return \"mock-key\";\n\n const envVar = provider === \"anthropic\" ? \"ANTHROPIC_API_KEY\" : \"OPENAI_API_KEY\";\n const envValue = process.env[envVar];\n if (envValue !== undefined && envValue.length > 0) {\n return envValue;\n }\n\n // Try sync config file read (works in Node.js)\n return this.getApiKeyFromConfig(provider);\n }\n\n /**\n * Read API key from config file synchronously\n * Uses require() for sync file access in constructor context\n */\n private getApiKeyFromConfig(provider: AIProvider): string {\n try {\n /* eslint-disable @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */\n const { existsSync, readFileSync } = require(\"node:fs\") as typeof import(\"fs\");\n const { homedir } = require(\"node:os\") as typeof import(\"os\");\n const { join } = require(\"node:path\") as typeof import(\"path\");\n /* eslint-enable @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */\n\n const configPath = join(homedir(), \".pinata\", \"config.json\");\n if (!existsSync(configPath)) {\n return \"\";\n }\n\n const content = readFileSync(configPath, \"utf-8\");\n const config = JSON.parse(content) as {\n anthropicApiKey?: string;\n openaiApiKey?: string;\n };\n\n return (provider === \"anthropic\" ? config.anthropicApiKey : config.openaiApiKey) ?? \"\";\n } catch {\n return \"\";\n }\n }\n\n /**\n * Check if the service is configured with an API key\n */\n isConfigured(): boolean {\n return this.config.provider === \"mock\" || this.config.apiKey.length > 0;\n }\n\n /**\n * Get the current provider\n */\n getProvider(): AIProvider {\n return this.config.provider;\n }\n\n /**\n * Generate a completion\n */\n async complete(request: CompletionRequest): Promise<AIResponse<string>> {\n const startTime = Date.now();\n\n if (!this.isConfigured()) {\n return {\n success: false,\n error: `API key not configured for ${this.config.provider}. Set ${this.config.provider === \"anthropic\" ? \"ANTHROPIC_API_KEY\" : \"OPENAI_API_KEY\"} environment variable.`,\n durationMs: Date.now() - startTime,\n };\n }\n\n if (this.config.provider === \"mock\") {\n return this.mockComplete(request, startTime);\n }\n\n try {\n const response = await this.callProvider(request);\n return {\n success: true,\n data: response.content,\n usage: response.usage,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n durationMs: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Generate a JSON completion (parses response as JSON)\n */\n async completeJSON<T>(request: CompletionRequest): Promise<AIResponse<T>> {\n const response = await this.complete({\n ...request,\n messages: [\n ...request.messages,\n {\n role: \"user\",\n content: \"\\n\\nRespond with valid JSON only. No markdown, no explanation.\",\n },\n ],\n });\n\n if (!response.success || response.data === undefined) {\n return {\n success: false,\n error: response.error ?? \"No response data\",\n durationMs: response.durationMs,\n };\n }\n\n try {\n // Extract JSON from response (handle markdown code blocks)\n let jsonStr = response.data;\n const jsonMatch = jsonStr.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (jsonMatch) {\n jsonStr = jsonMatch[1] ?? jsonStr;\n }\n\n // Try to find JSON object or array\n const objectMatch = jsonStr.match(/\\{[\\s\\S]*\\}/);\n const arrayMatch = jsonStr.match(/\\[[\\s\\S]*\\]/);\n jsonStr = objectMatch?.[0] ?? arrayMatch?.[0] ?? jsonStr;\n\n const parsed = JSON.parse(jsonStr.trim()) as T;\n const result: AIResponse<T> = {\n success: true,\n data: parsed,\n durationMs: response.durationMs,\n };\n if (response.usage) {\n result.usage = response.usage;\n }\n return result;\n } catch (error) {\n return {\n success: false,\n error: `Failed to parse JSON response: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n durationMs: response.durationMs,\n };\n }\n }\n\n /**\n * Call the AI provider API\n */\n private async callProvider(request: CompletionRequest): Promise<{\n content: string;\n usage: { inputTokens: number; outputTokens: number };\n }> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs);\n\n try {\n if (this.config.provider === \"anthropic\") {\n return await this.callAnthropic(request, controller.signal);\n } else {\n return await this.callOpenAI(request, controller.signal);\n }\n } finally {\n clearTimeout(timeout);\n }\n }\n\n /**\n * Call Anthropic API\n */\n private async callAnthropic(\n request: CompletionRequest,\n signal: AbortSignal\n ): Promise<{ content: string; usage: { inputTokens: number; outputTokens: number } }> {\n const messages = request.messages.filter((m) => m.role !== \"system\");\n\n const response = await fetch(PROVIDER_ENDPOINTS.anthropic, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: request.maxTokens ?? this.config.maxTokens,\n temperature: request.temperature ?? this.config.temperature,\n system: request.systemPrompt,\n messages: messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as {\n content: Array<{ text: string }>;\n usage: { input_tokens: number; output_tokens: number };\n };\n\n return {\n content: data.content[0]?.text ?? \"\",\n usage: {\n inputTokens: data.usage.input_tokens,\n outputTokens: data.usage.output_tokens,\n },\n };\n }\n\n /**\n * Call OpenAI API\n */\n private async callOpenAI(\n request: CompletionRequest,\n signal: AbortSignal\n ): Promise<{ content: string; usage: { inputTokens: number; outputTokens: number } }> {\n const messages: Array<{ role: string; content: string }> = [];\n\n if (request.systemPrompt !== undefined && request.systemPrompt.length > 0) {\n messages.push({ role: \"system\", content: request.systemPrompt });\n }\n\n for (const m of request.messages) {\n messages.push({ role: m.role, content: m.content });\n }\n\n const response = await fetch(PROVIDER_ENDPOINTS.openai, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: request.maxTokens ?? this.config.maxTokens,\n temperature: request.temperature ?? this.config.temperature,\n messages,\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as {\n choices: Array<{ message: { content: string } }>;\n usage: { prompt_tokens: number; completion_tokens: number };\n };\n\n return {\n content: data.choices[0]?.message.content ?? \"\",\n usage: {\n inputTokens: data.usage.prompt_tokens,\n outputTokens: data.usage.completion_tokens,\n },\n };\n }\n\n /**\n * Mock completion for testing\n */\n private mockComplete(request: CompletionRequest, startTime: number): AIResponse<string> {\n const lastMessage = request.messages[request.messages.length - 1];\n const content = lastMessage?.content ?? \"\";\n\n // Generate mock responses based on content\n let response = \"Mock AI response\";\n\n if (content.includes(\"explain\") || content.includes(\"explanation\")) {\n response = JSON.stringify({\n summary: \"This code pattern may introduce a security vulnerability.\",\n explanation: \"The detected pattern suggests potential security risk.\",\n risk: \"An attacker could exploit this vulnerability to compromise the system.\",\n remediation: \"Use parameterized queries or proper input validation.\",\n safeExample: \"cursor.execute('SELECT * FROM users WHERE id = ?', (user_id,))\",\n });\n } else if (content.includes(\"variable\") || content.includes(\"template\")) {\n response = JSON.stringify({\n suggestions: [\n {\n name: \"className\",\n value: \"UserService\",\n reasoning: \"Based on the file name and context\",\n confidence: 0.8,\n },\n {\n name: \"functionName\",\n value: \"get_user\",\n reasoning: \"Extracted from the code snippet\",\n confidence: 0.9,\n },\n ],\n });\n } else if (content.includes(\"pattern\") || content.includes(\"regex\")) {\n response = JSON.stringify({\n suggestions: [\n {\n id: \"custom-sql-pattern\",\n pattern: \"execute\\\\s*\\\\(.*\\\\+\",\n description: \"Detects SQL execution with string concatenation\",\n confidence: \"medium\",\n matchExample: \"cursor.execute(query + user_input)\",\n safeExample: \"cursor.execute(query, (user_input,))\",\n reasoning: \"String concatenation in SQL queries is a common injection vector\",\n },\n ],\n });\n }\n\n return {\n success: true,\n data: response,\n usage: { inputTokens: 100, outputTokens: 50 },\n durationMs: Date.now() - startTime,\n };\n }\n}\n\n/**\n * Create an AI service instance\n */\nexport function createAIService(config?: Partial<AIConfig>): AIService {\n return new AIService(config);\n}\n","/**\n * AI Template Variable Filler\n *\n * Uses AI to intelligently fill template variables based on context.\n */\n\nimport { createAIService } from \"./service.js\";\n\nimport type { AIConfig, AIResponse, VariableSuggestion } from \"./types.js\";\nimport type { TemplateVariable } from \"../categories/schema/index.js\";\nimport type { Gap } from \"../core/scanner/types.js\";\n\nconst SYSTEM_PROMPT = `You are an expert at analyzing code and extracting meaningful variable values for test generation.\nGiven a code snippet and a list of template variables, suggest appropriate values for each variable.\n\nFor each variable, analyze:\n1. The code snippet to extract relevant information (class names, function names, etc.)\n2. The variable description to understand what's needed\n3. The variable type to ensure correct formatting\n\nAlways respond with valid JSON matching this structure:\n{\n \"suggestions\": [\n {\n \"name\": \"variableName\",\n \"value\": \"suggested value\",\n \"reasoning\": \"why this value was chosen\",\n \"confidence\": 0.0-1.0\n }\n ]\n}\n\nFor arrays, use: \"value\": [\"item1\", \"item2\"]\nFor booleans, use: \"value\": true or \"value\": false\nFor numbers, use: \"value\": 42`;\n\nexport interface VariableFillRequest {\n /** Code snippet for context */\n codeSnippet: string;\n /** File path for additional context */\n filePath: string;\n /** Template variables to fill */\n variables: TemplateVariable[];\n /** Optional gap information */\n gap?: Gap;\n /** Any pre-filled values to exclude */\n existingValues?: Record<string, unknown>;\n}\n\nexport interface VariableFillResult {\n /** Suggested values for each variable */\n suggestions: Map<string, VariableSuggestion>;\n /** Variables that couldn't be filled */\n unfilled: string[];\n /** Merged values (suggestions + existing) */\n values: Record<string, unknown>;\n}\n\n/**\n * Suggest variable values for a template\n */\nexport async function suggestVariables(\n request: VariableFillRequest,\n config?: Partial<AIConfig>\n): Promise<AIResponse<VariableFillResult>> {\n const ai = createAIService(config);\n\n if (!ai.isConfigured()) {\n // Fall back to rule-based extraction\n return {\n success: true,\n data: extractVariablesFromCode(request),\n durationMs: 0,\n };\n }\n\n const prompt = buildVariablePrompt(request);\n const startTime = Date.now();\n\n const response = await ai.completeJSON<{ suggestions: VariableSuggestion[] }>({\n systemPrompt: SYSTEM_PROMPT,\n messages: [{ role: \"user\", content: prompt }],\n maxTokens: 1024,\n temperature: 0.2,\n });\n\n if (!response.success || !response.data) {\n // Fall back to rule-based extraction\n return {\n success: true,\n data: extractVariablesFromCode(request),\n durationMs: Date.now() - startTime,\n };\n }\n\n // Process AI suggestions\n const suggestions = new Map<string, VariableSuggestion>();\n const unfilled: string[] = [];\n const values: Record<string, unknown> = { ...request.existingValues };\n\n const suggestionsList = response.data.suggestions ?? [];\n for (const suggestion of suggestionsList) {\n suggestions.set(suggestion.name, suggestion);\n if (!(suggestion.name in values)) {\n values[suggestion.name] = suggestion.value;\n }\n }\n\n // Check for unfilled variables\n for (const variable of request.variables) {\n if (!suggestions.has(variable.name) && !(variable.name in values)) {\n if (variable.defaultValue !== undefined) {\n values[variable.name] = variable.defaultValue;\n } else {\n unfilled.push(variable.name);\n }\n }\n }\n\n const result: AIResponse<VariableFillResult> = {\n success: true,\n data: { suggestions, unfilled, values },\n durationMs: response.durationMs,\n };\n\n if (response.usage) {\n result.usage = response.usage;\n }\n\n return result;\n}\n\n/**\n * Build the prompt for variable suggestion\n */\nfunction buildVariablePrompt(request: VariableFillRequest): string {\n const parts: string[] = [];\n\n parts.push(\"Analyze this code and suggest values for the template variables:\\n\");\n\n parts.push(\"**Code:**\");\n parts.push(\"```\");\n parts.push(request.codeSnippet);\n parts.push(\"```\\n\");\n\n parts.push(`**File:** ${request.filePath}\\n`);\n\n if (request.gap) {\n parts.push(`**Category:** ${request.gap.categoryName}`);\n parts.push(`**Line:** ${request.gap.lineStart}\\n`);\n }\n\n parts.push(\"**Variables to fill:**\");\n for (const variable of request.variables) {\n const required = variable.required ? \" (required)\" : \" (optional)\";\n const defaultVal = variable.defaultValue !== undefined\n ? ` [default: ${JSON.stringify(variable.defaultValue)}]`\n : \"\";\n parts.push(`- ${variable.name} (${variable.type})${required}${defaultVal}: ${variable.description}`);\n }\n\n if (request.existingValues && Object.keys(request.existingValues).length > 0) {\n parts.push(\"\\n**Already provided:**\");\n for (const [name, value] of Object.entries(request.existingValues)) {\n parts.push(`- ${name}: ${JSON.stringify(value)}`);\n }\n }\n\n parts.push(\"\\nExtract appropriate values from the code context.\");\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Rule-based variable extraction (fallback when AI is not available)\n */\nfunction extractVariablesFromCode(request: VariableFillRequest): VariableFillResult {\n const suggestions = new Map<string, VariableSuggestion>();\n const unfilled: string[] = [];\n const values: Record<string, unknown> = { ...request.existingValues };\n\n const code = request.codeSnippet;\n const filePath = request.filePath;\n\n for (const variable of request.variables) {\n if (variable.name in values) continue;\n\n let value: unknown = undefined;\n let reasoning = \"\";\n let confidence = 0;\n\n switch (variable.name.toLowerCase()) {\n case \"classname\":\n case \"class_name\": {\n // Extract class name from code or file\n const classMatch = code.match(/class\\s+(\\w+)/);\n if (classMatch) {\n value = classMatch[1];\n reasoning = \"Extracted from class definition in code\";\n confidence = 0.9;\n } else {\n // Try to infer from file name\n const fileName = filePath.split(\"/\").pop()?.replace(/\\.\\w+$/, \"\") ?? \"\";\n value = toPascalCase(fileName);\n reasoning = \"Inferred from file name\";\n confidence = 0.6;\n }\n break;\n }\n\n case \"functionname\":\n case \"function_name\":\n case \"methodname\": {\n // Extract function name from code\n const funcMatch = code.match(/(?:def|function|async function)\\s+(\\w+)/);\n if (funcMatch) {\n value = funcMatch[1];\n reasoning = \"Extracted from function definition\";\n confidence = 0.9;\n }\n break;\n }\n\n case \"modulepath\":\n case \"module_path\": {\n // Convert file path to module path\n value = filePath\n .replace(/\\.[jt]sx?$/, \"\")\n .replace(/\\.py$/, \"\")\n .replace(/\\//g, \".\")\n .replace(/^\\.+/, \"\");\n reasoning = \"Derived from file path\";\n confidence = 0.7;\n break;\n }\n\n case \"tablename\":\n case \"table_name\": {\n // Look for table name in SQL\n const tableMatch = code.match(/(?:FROM|INTO|UPDATE)\\s+(\\w+)/i);\n if (tableMatch) {\n value = tableMatch[1];\n reasoning = \"Extracted from SQL statement\";\n confidence = 0.8;\n } else {\n value = \"users\";\n reasoning = \"Default table name\";\n confidence = 0.3;\n }\n break;\n }\n\n case \"exceptionclass\":\n case \"exception_class\": {\n value = \"ValueError\";\n reasoning = \"Common exception for input validation\";\n confidence = 0.5;\n break;\n }\n\n case \"dbclient\":\n case \"db_client\": {\n // Look for database client variable\n const clientMatch = code.match(/(db|conn|connection|client|cursor)\\s*[=.]/i);\n if (clientMatch) {\n value = clientMatch[1];\n reasoning = \"Extracted from code\";\n confidence = 0.7;\n } else {\n value = \"db\";\n reasoning = \"Default database client name\";\n confidence = 0.4;\n }\n break;\n }\n\n case \"functioncall\":\n case \"function_call\": {\n const funcName = values[\"functionName\"] ?? values[\"function_name\"];\n if (typeof funcName === \"string\" && funcName.length > 0) {\n value = `${funcName}(user_input)`;\n reasoning = \"Constructed from function name\";\n confidence = 0.6;\n }\n break;\n }\n\n case \"fixtures\": {\n value = \"db_session\";\n reasoning = \"Common pytest fixture\";\n confidence = 0.5;\n break;\n }\n\n default:\n // Use default value if available\n if (variable.defaultValue !== undefined) {\n value = variable.defaultValue;\n reasoning = \"Using default value\";\n confidence = 1.0;\n }\n }\n\n if (value !== undefined) {\n suggestions.set(variable.name, {\n name: variable.name,\n value: value as string | number | boolean | string[],\n reasoning,\n confidence,\n });\n values[variable.name] = value;\n } else if (variable.required) {\n unfilled.push(variable.name);\n }\n }\n\n return { suggestions, unfilled, values };\n}\n\n/**\n * Convert string to PascalCase\n */\nfunction toPascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\"\");\n}\n","/**\n * Gap Explainer\n *\n * Uses AI to generate natural language explanations of detected gaps.\n */\n\nimport { createAIService } from \"./service.js\";\n\nimport type { AIConfig, AIResponse, GapExplanation } from \"./types.js\";\nimport type { Category } from \"../categories/schema/index.js\";\nimport type { Gap } from \"../core/scanner/types.js\";\n\nconst SYSTEM_PROMPT = `You are a security expert explaining code vulnerabilities to developers.\nYour explanations should be:\n- Clear and actionable\n- Focused on the specific code pattern\n- Include concrete remediation steps\n- Reference relevant security standards (OWASP, CWE) when applicable\n\nAlways respond with valid JSON matching this structure:\n{\n \"summary\": \"1-2 sentence summary\",\n \"explanation\": \"Detailed explanation of the vulnerability\",\n \"risk\": \"What an attacker could do if this is exploited\",\n \"remediation\": \"Step-by-step instructions to fix\",\n \"safeExample\": \"Code example showing the safe pattern\",\n \"references\": [\"optional array of CVE/CWE/OWASP references\"]\n}`;\n\n/**\n * Explain a single gap\n */\nexport async function explainGap(\n gap: Gap,\n category?: Category,\n config?: Partial<AIConfig>\n): Promise<AIResponse<GapExplanation>> {\n const ai = createAIService(config);\n\n if (!ai.isConfigured()) {\n return {\n success: false,\n error: \"AI service not configured\",\n durationMs: 0,\n };\n }\n\n const prompt = buildExplainPrompt(gap, category);\n\n const response = await ai.completeJSON<GapExplanation>({\n systemPrompt: SYSTEM_PROMPT,\n messages: [{ role: \"user\", content: prompt }],\n maxTokens: 1024,\n temperature: 0.3,\n });\n\n return response;\n}\n\n/**\n * Explain multiple gaps in batch\n */\nexport async function explainGaps(\n gaps: Gap[],\n categories?: Map<string, Category>,\n config?: Partial<AIConfig>\n): Promise<Map<string, AIResponse<GapExplanation>>> {\n const results = new Map<string, AIResponse<GapExplanation>>();\n\n // Process in parallel with concurrency limit\n const BATCH_SIZE = 5;\n\n for (let i = 0; i < gaps.length; i += BATCH_SIZE) {\n const batch = gaps.slice(i, i + BATCH_SIZE);\n const promises = batch.map(async (gap) => {\n const category = categories?.get(gap.categoryId);\n const result = await explainGap(gap, category, config);\n return { key: `${gap.filePath}:${gap.lineStart}:${gap.categoryId}`, result };\n });\n\n const batchResults = await Promise.all(promises);\n for (const { key, result } of batchResults) {\n results.set(key, result);\n }\n }\n\n return results;\n}\n\n/**\n * Build the explanation prompt for a gap\n */\nfunction buildExplainPrompt(gap: Gap, category?: Category): string {\n const parts: string[] = [];\n\n parts.push(`Explain this security finding:\\n`);\n\n parts.push(`**Category:** ${gap.categoryName} (${gap.categoryId})`);\n parts.push(`**Severity:** ${gap.severity}`);\n parts.push(`**Confidence:** ${gap.confidence}`);\n parts.push(`**File:** ${gap.filePath}`);\n parts.push(`**Line:** ${gap.lineStart}`);\n\n if (gap.codeSnippet) {\n parts.push(`\\n**Code:**\\n\\`\\`\\`\\n${gap.codeSnippet}\\n\\`\\`\\``);\n }\n\n parts.push(`\\n**Pattern:** ${gap.patternId}`);\n parts.push(`**Detection Type:** ${gap.patternType}`);\n\n if (category) {\n parts.push(`\\n**Category Description:** ${category.description}`);\n\n if (category.cves && category.cves.length > 0) {\n parts.push(`**Related CVEs:** ${category.cves.join(\", \")}`);\n }\n\n if (category.references && category.references.length > 0) {\n parts.push(`**References:** ${category.references.slice(0, 3).join(\", \")}`);\n }\n }\n\n parts.push(`\\nProvide a clear, actionable explanation for a developer.`);\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Generate a quick summary without AI (fallback)\n */\nexport function generateFallbackExplanation(gap: Gap): GapExplanation {\n const summaries: Record<string, string> = {\n \"sql-injection\": \"SQL query constructed with user input may allow injection attacks.\",\n \"xss\": \"User input rendered without escaping may allow script injection.\",\n \"command-injection\": \"Shell command constructed with user input may allow command execution.\",\n \"path-traversal\": \"File path constructed with user input may allow directory traversal.\",\n \"hardcoded-secrets\": \"Sensitive credentials found in source code.\",\n \"deserialization\": \"Untrusted data deserialization may allow code execution.\",\n \"ssrf\": \"Server-side request with user-controlled URL may allow internal access.\",\n \"xxe\": \"XML parser may be vulnerable to external entity injection.\",\n \"csrf\": \"State-changing request lacks CSRF protection.\",\n \"ldap-injection\": \"LDAP query constructed with user input may allow injection.\",\n };\n\n const remediations: Record<string, string> = {\n \"sql-injection\": \"Use parameterized queries or prepared statements. Never concatenate user input into SQL strings.\",\n \"xss\": \"Escape all user input before rendering in HTML. Use framework auto-escaping features.\",\n \"command-injection\": \"Avoid shell execution with user input. Use allowlists and subprocess arrays instead of shell strings.\",\n \"path-traversal\": \"Validate and sanitize file paths. Use path.resolve() and verify the result is within allowed directories.\",\n \"hardcoded-secrets\": \"Move secrets to environment variables or a secrets manager. Never commit credentials to source control.\",\n \"deserialization\": \"Avoid deserializing untrusted data. If necessary, use safe formats like JSON instead of pickle/yaml.\",\n \"ssrf\": \"Validate and allowlist URLs. Block private IP ranges and localhost.\",\n \"xxe\": \"Disable external entity processing in XML parser configuration.\",\n \"csrf\": \"Implement CSRF tokens for all state-changing requests.\",\n \"ldap-injection\": \"Escape special LDAP characters in user input. Use parameterized LDAP queries.\",\n };\n\n const summary = summaries[gap.categoryId] ?? `Potential ${gap.categoryName} vulnerability detected.`;\n const remediation = remediations[gap.categoryId] ?? `Review the code for security issues and apply appropriate fixes.`;\n\n return {\n summary,\n explanation: `The pattern \"${gap.patternId}\" detected a potential ${gap.categoryName} vulnerability at line ${gap.lineStart}. This type of issue has ${gap.severity} severity and was detected with ${gap.confidence} confidence.`,\n risk: `If exploited, this vulnerability could compromise the security of the application. Severity: ${gap.severity}.`,\n remediation,\n references: [],\n };\n}\n","/**\n * AI Pattern Suggester\n *\n * Uses AI to suggest new detection patterns based on code samples.\n */\n\nimport { createAIService } from \"./service.js\";\n\nimport type { AIConfig, AIResponse, PatternSuggestion } from \"./types.js\";\n\nconst SYSTEM_PROMPT = `You are an expert at creating regex patterns for detecting security vulnerabilities in code.\nGiven vulnerable code samples, generate regex patterns that will detect similar vulnerabilities.\n\nYour patterns should:\n1. Be specific enough to avoid false positives\n2. Be general enough to catch variations\n3. Use standard regex syntax (no lookbehind for compatibility)\n4. Include examples of what matches and what doesn't\n\nAlways respond with valid JSON matching this structure:\n{\n \"suggestions\": [\n {\n \"id\": \"pattern-id-kebab-case\",\n \"pattern\": \"regex pattern here\",\n \"description\": \"What this pattern detects\",\n \"confidence\": \"high|medium|low\",\n \"matchExample\": \"code that should match\",\n \"safeExample\": \"similar code that should NOT match\",\n \"reasoning\": \"Why this pattern works\"\n }\n ]\n}\n\nImportant:\n- Escape backslashes properly for JSON (use \\\\\\\\s not \\\\s)\n- Test your patterns mentally against the examples\n- Prefer simpler patterns that are less likely to cause ReDoS`;\n\nexport interface PatternSuggestionRequest {\n /** Category to suggest patterns for */\n category: string;\n /** Vulnerable code samples */\n vulnerableCode: string[];\n /** Safe code samples (to avoid matching) */\n safeCode?: string[];\n /** Language of the code */\n language: string;\n /** Existing patterns to avoid duplicating */\n existingPatterns?: string[];\n /** Maximum number of suggestions */\n maxSuggestions?: number;\n}\n\nexport interface PatternSuggestionResult {\n /** Suggested patterns */\n suggestions: PatternSuggestion[];\n /** Patterns that were tested but had issues */\n rejected: Array<{\n pattern: string;\n reason: string;\n }>;\n}\n\n/**\n * Suggest patterns based on code samples\n */\nexport async function suggestPatterns(\n request: PatternSuggestionRequest,\n config?: Partial<AIConfig>\n): Promise<AIResponse<PatternSuggestionResult>> {\n const ai = createAIService(config);\n\n if (!ai.isConfigured()) {\n return {\n success: false,\n error: \"AI service not configured. Set ANTHROPIC_API_KEY or OPENAI_API_KEY.\",\n durationMs: 0,\n };\n }\n\n const prompt = buildPatternPrompt(request);\n\n const response = await ai.completeJSON<{ suggestions: PatternSuggestion[] }>({\n systemPrompt: SYSTEM_PROMPT,\n messages: [{ role: \"user\", content: prompt }],\n maxTokens: 2048,\n temperature: 0.3,\n });\n\n if (!response.success || !response.data) {\n return {\n success: false,\n error: response.error ?? \"Failed to generate patterns\",\n durationMs: response.durationMs,\n };\n }\n\n // Validate and test each pattern\n const validated = validatePatterns(\n response.data.suggestions ?? [],\n request.vulnerableCode,\n request.safeCode ?? []\n );\n\n const result: AIResponse<PatternSuggestionResult> = {\n success: true,\n data: validated,\n durationMs: response.durationMs,\n };\n\n if (response.usage) {\n result.usage = response.usage;\n }\n\n return result;\n}\n\n/**\n * Build the prompt for pattern suggestion\n */\nfunction buildPatternPrompt(request: PatternSuggestionRequest): string {\n const parts: string[] = [];\n\n parts.push(`Generate regex patterns to detect ${request.category} vulnerabilities in ${request.language} code.\\n`);\n\n parts.push(\"**Vulnerable code samples (patterns SHOULD match these):**\");\n for (let i = 0; i < request.vulnerableCode.length; i++) {\n parts.push(`\\nExample ${i + 1}:`);\n parts.push(\"```\");\n parts.push(request.vulnerableCode[i] ?? \"\");\n parts.push(\"```\");\n }\n\n if (request.safeCode && request.safeCode.length > 0) {\n parts.push(\"\\n**Safe code samples (patterns should NOT match these):**\");\n for (let i = 0; i < request.safeCode.length; i++) {\n parts.push(`\\nSafe ${i + 1}:`);\n parts.push(\"```\");\n parts.push(request.safeCode[i] ?? \"\");\n parts.push(\"```\");\n }\n }\n\n if (request.existingPatterns && request.existingPatterns.length > 0) {\n parts.push(\"\\n**Existing patterns (avoid duplicating):**\");\n for (const pattern of request.existingPatterns) {\n parts.push(`- ${pattern}`);\n }\n }\n\n parts.push(`\\nGenerate up to ${request.maxSuggestions ?? 3} distinct patterns.`);\n parts.push(\"Focus on patterns that will have high precision (low false positives).\");\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Validate patterns against test samples\n */\nfunction validatePatterns(\n suggestions: PatternSuggestion[],\n vulnerableCode: string[],\n safeCode: string[]\n): PatternSuggestionResult {\n const validated: PatternSuggestion[] = [];\n const rejected: Array<{ pattern: string; reason: string }> = [];\n\n for (const suggestion of suggestions) {\n try {\n // Test if pattern compiles\n const regex = new RegExp(suggestion.pattern, \"gm\");\n\n // Test against vulnerable samples\n let matchCount = 0;\n for (const code of vulnerableCode) {\n regex.lastIndex = 0;\n if (regex.test(code)) {\n matchCount++;\n }\n }\n\n // Test against safe samples\n let falsePositives = 0;\n for (const code of safeCode) {\n regex.lastIndex = 0;\n if (regex.test(code)) {\n falsePositives++;\n }\n }\n\n // Check for ReDoS potential (simple heuristic)\n if (hasRedosPotential(suggestion.pattern)) {\n rejected.push({\n pattern: suggestion.pattern,\n reason: \"Pattern may be vulnerable to ReDoS\",\n });\n continue;\n }\n\n // Accept if it matches at least some vulnerable code\n if (matchCount > 0) {\n // Adjust confidence based on actual results\n if (falsePositives > 0 && suggestion.confidence === \"high\") {\n suggestion.confidence = \"medium\";\n }\n if (matchCount < vulnerableCode.length / 2 && suggestion.confidence === \"high\") {\n suggestion.confidence = \"medium\";\n }\n validated.push(suggestion);\n } else {\n rejected.push({\n pattern: suggestion.pattern,\n reason: `Pattern did not match any vulnerable samples (0/${vulnerableCode.length})`,\n });\n }\n } catch (error) {\n rejected.push({\n pattern: suggestion.pattern,\n reason: `Invalid regex: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n });\n }\n }\n\n return { suggestions: validated, rejected };\n}\n\n/**\n * Check for potential ReDoS patterns (simple heuristic)\n */\nfunction hasRedosPotential(pattern: string): boolean {\n // Check for nested quantifiers like (a+)+ or (a*)*\n if (/\\([^)]*[+*][^)]*\\)[+*]/.test(pattern)) {\n return true;\n }\n\n // Check for overlapping alternations with quantifiers\n if (/\\([^)]*\\|[^)]*\\)[+*]/.test(pattern)) {\n // More specific check for dangerous patterns\n const alternationMatch = pattern.match(/\\(([^)]+)\\)/g);\n if (alternationMatch) {\n for (const alt of alternationMatch) {\n // Check if alternation branches can match same input\n if (/\\w+\\|\\w*\\w/.test(alt) && /[+*]/.test(alt)) {\n return true;\n }\n }\n }\n }\n\n return false;\n}\n\n/**\n * Format a pattern suggestion as YAML for adding to category definitions\n */\nexport function formatPatternAsYaml(suggestion: PatternSuggestion, language: string): string {\n // Escape the pattern for YAML\n const escapedPattern = suggestion.pattern\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"');\n\n return ` - id: ${suggestion.id}\n type: regex\n language: ${language}\n pattern: \"${escapedPattern}\"\n confidence: ${suggestion.confidence}\n description: ${suggestion.description}`;\n}\n\n/**\n * Suggest patterns from missed vulnerabilities (for improving detection)\n */\nexport async function suggestPatternsFromMissed(\n category: string,\n missedCode: string[],\n detectedCode: string[],\n language: string,\n config?: Partial<AIConfig>\n): Promise<AIResponse<PatternSuggestionResult>> {\n // The missed code is what we WANT to detect\n // The detected code can help understand what patterns we already catch\n return suggestPatterns(\n {\n category,\n vulnerableCode: missedCode,\n safeCode: [], // We don't have safe code in this context\n language,\n maxSuggestions: 5,\n },\n config\n );\n}\n","#!/usr/bin/env node\n/**\n * Pinata CLI entry point\n *\n * Commands:\n * - analyze - Scan codebase for test coverage gaps\n * - generate - Generate tests for identified gaps\n * - search - Search category taxonomy\n * - list - List all categories with filters\n * - init - Initialize Pinata config in project\n * - auth - Manage API key authentication\n */\n\nimport { existsSync } from \"fs\";\nimport { dirname, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\n\nimport {\n RISK_DOMAINS,\n TEST_LEVELS,\n type RiskDomain,\n type TestLevel,\n type Priority,\n type Severity,\n} from \"../categories/schema/index.js\";\nimport { createCategoryStore } from \"../categories/store/index.js\";\nimport { VERSION, createScanner } from \"../core/index.js\";\nimport { logger } from \"../lib/index.js\";\nimport { createRenderer } from \"../templates/index.js\";\n\nimport {\n formatCategories,\n formatError,\n isValidOutputFormat,\n type OutputFormat,\n} from \"./formatters.js\";\nimport {\n formatGeneratedTerminal,\n formatGeneratedJson,\n formatWriteSummary,\n suggestTestPath,\n extractVariablesFromGap,\n extractVariablesWithAI,\n writeGeneratedTests,\n type GeneratedTest,\n} from \"./generate-formatters.js\";\nimport {\n explainGap,\n explainGaps,\n generateFallbackExplanation,\n suggestPatterns,\n createAIService,\n} from \"../ai/index.js\";\nimport type { AIConfig, GapExplanation } from \"../ai/types.js\";\nimport {\n saveScanResults,\n loadScanResults,\n} from \"./results-cache.js\";\nimport {\n formatScanResult,\n isValidScanOutputFormat,\n type ScanOutputFormat,\n} from \"./scan-formatters.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get the path to built-in category definitions\n * Tries multiple locations to support both development and production\n */\nfunction getDefinitionsPath(): string {\n // Try multiple possible locations\n const candidates = [\n // When running from dist/cli/index.js\n resolve(__dirname, \"../../src/categories/definitions\"),\n // When running from project root via npx/npm\n resolve(process.cwd(), \"src/categories/definitions\"),\n // When bundled in dist (future)\n resolve(__dirname, \"../categories/definitions\"),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n // Fallback to first candidate (will error with helpful message)\n return candidates[0]!;\n}\n\nconst program = new Command();\n\nprogram\n .name(\"pinata\")\n .description(\"AI-powered test coverage analysis and generation\")\n .version(VERSION);\n\nprogram\n .command(\"analyze [path]\")\n .description(\"Analyze codebase for test coverage gaps\")\n .option(\"-o, --output <format>\", \"Output format: terminal, json, markdown, sarif, html, junit-xml\", \"terminal\")\n .option(\"-d, --domains <domains>\", \"Filter to specific domains (comma-separated)\")\n .option(\"-s, --severity <level>\", \"Minimum severity: critical, high, medium, low\", \"low\")\n .option(\"-c, --confidence <level>\", \"Minimum confidence: high, medium, low\", \"high\")\n .option(\"--fail-on <level>\", \"Exit non-zero if gaps at level: critical, high, medium\")\n .option(\"--exclude <dirs>\", \"Directories to exclude (comma-separated)\")\n .option(\"--verify\", \"Use AI to verify each match (reduces false positives)\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"-q, --quiet\", \"Quiet mode (errors only)\")\n .action(async (targetPath: string | undefined, options: Record<string, unknown>) => {\n const isQuiet = Boolean(options[\"quiet\"]);\n const isVerbose = Boolean(options[\"verbose\"]);\n\n if (isQuiet) {\n logger.configure({ level: \"error\" });\n } else if (isVerbose) {\n logger.configure({ level: \"debug\" });\n }\n\n // Resolve target path\n const targetDirectory = resolve(targetPath ?? process.cwd());\n\n // Validate target exists\n if (!existsSync(targetDirectory)) {\n console.error(formatError(new Error(`Directory not found: ${targetDirectory}`)));\n process.exit(1);\n }\n\n // Validate output format\n const outputFormat = String(options[\"output\"] ?? \"terminal\");\n if (!isValidScanOutputFormat(outputFormat)) {\n console.error(formatError(new Error(`Invalid output format: ${outputFormat}. Use: terminal, json, markdown, sarif`)));\n process.exit(1);\n }\n\n // Validate severity\n const validSeverities = [\"critical\", \"high\", \"medium\", \"low\"];\n const minSeverity = String(options[\"severity\"] ?? \"low\") as Severity;\n if (!validSeverities.includes(minSeverity)) {\n console.error(formatError(new Error(`Invalid severity: ${minSeverity}. Use: critical, high, medium, low`)));\n process.exit(1);\n }\n\n // Validate confidence\n const validConfidences = [\"high\", \"medium\", \"low\"];\n const minConfidence = String(options[\"confidence\"] ?? \"high\");\n if (!validConfidences.includes(minConfidence)) {\n console.error(formatError(new Error(`Invalid confidence: ${minConfidence}. Use: high, medium, low`)));\n process.exit(1);\n }\n\n // Parse domains filter\n const domainsStr = options[\"domains\"] as string | undefined;\n let domains: RiskDomain[] = [];\n if (domainsStr) {\n const domainList = domainsStr.split(\",\").map((d) => d.trim());\n for (const domain of domainList) {\n if (!RISK_DOMAINS.includes(domain as RiskDomain)) {\n console.error(formatError(new Error(`Invalid domain: ${domain}. Valid domains: ${RISK_DOMAINS.join(\", \")}`)));\n process.exit(1);\n }\n }\n domains = domainList as RiskDomain[];\n }\n\n // Parse exclude directories\n const excludeStr = options[\"exclude\"] as string | undefined;\n const excludeDirs = excludeStr\n ? excludeStr.split(\",\").map((d) => d.trim())\n : undefined;\n\n // Parse fail-on level (Commander converts --fail-on to failOn)\n const failOn = options[\"failOn\"] as string | undefined;\n if (failOn && ![\"critical\", \"high\", \"medium\"].includes(failOn)) {\n console.error(formatError(new Error(`Invalid fail-on level: ${failOn}. Use: critical, high, medium`)));\n process.exit(1);\n }\n\n // Start spinner (only for terminal output and non-quiet mode)\n const showSpinner = outputFormat === \"terminal\" && !isQuiet;\n const spinner = showSpinner ? ora(\"Loading categories...\").start() : null;\n\n try {\n // Load categories\n const store = createCategoryStore();\n const definitionsPath = getDefinitionsPath();\n\n logger.debug(`Loading categories from: ${definitionsPath}`);\n const loadResult = await store.loadFromDirectory(definitionsPath);\n\n if (!loadResult.success) {\n spinner?.fail(\"Failed to load categories\");\n console.error(formatError(loadResult.error));\n process.exit(1);\n }\n\n if (spinner) {\n spinner.text = `Loaded ${loadResult.data} categories. Scanning...`;\n }\n logger.debug(`Loaded ${loadResult.data} categories`);\n\n // Create scanner and run analysis\n const scanner = createScanner(store);\n\n // Build scan options\n const scanOptions: Parameters<typeof scanner.scanDirectory>[1] = {\n minSeverity,\n minConfidence: minConfidence as \"high\" | \"medium\" | \"low\",\n detectTestFiles: true,\n };\n if (domains.length > 0) {\n scanOptions.domains = domains;\n }\n if (excludeDirs) {\n scanOptions.excludeDirs = excludeDirs;\n }\n\n const scanResult = await scanner.scanDirectory(targetDirectory, scanOptions);\n\n if (!scanResult.success) {\n spinner?.fail(\"Scan failed\");\n console.error(formatError(scanResult.error));\n process.exit(1);\n }\n\n spinner?.stop();\n\n // AI verification if requested\n const shouldVerify = Boolean(options[\"verify\"]);\n if (shouldVerify && scanResult.data.gaps.length > 0) {\n const verifySpinner = showSpinner ? ora(\"Verifying gaps with AI...\").start() : null;\n \n try {\n const { AIVerifier } = await import(\"../core/verifier/index.js\");\n const { readFile } = await import(\"fs/promises\");\n \n const verifier = new AIVerifier({ provider: \"anthropic\" });\n \n const { verified, dismissed, stats } = await verifier.verifyAll(\n scanResult.data.gaps,\n async (path) => readFile(path, \"utf-8\")\n );\n \n // Update scan result with verified gaps\n scanResult.data.gaps = verified;\n \n // Recalculate score based on verified gaps\n const severityWeights: Record<string, number> = { critical: 10, high: 5, medium: 2, low: 1 };\n let deduction = 0;\n for (const gap of verified) {\n deduction += severityWeights[gap.severity] ?? 1;\n }\n const newOverall = Math.max(0, 100 - deduction);\n const newGrade: \"A\" | \"B\" | \"C\" | \"D\" | \"F\" = \n newOverall >= 90 ? \"A\" :\n newOverall >= 80 ? \"B\" :\n newOverall >= 70 ? \"C\" :\n newOverall >= 60 ? \"D\" : \"F\";\n \n scanResult.data.score.overall = newOverall;\n scanResult.data.score.grade = newGrade;\n \n verifySpinner?.succeed(\n `AI Verification: ${stats.total} total → ${stats.preFiltered} pre-filtered → ${stats.aiVerified} verified, ${stats.aiDismissed} AI-dismissed`\n );\n \n if (isVerbose && dismissed.length > 0) {\n console.log(chalk.gray(\"\\nDismissed as false positives:\"));\n for (const { gap, reason } of dismissed.slice(0, 5)) {\n console.log(chalk.gray(` - ${gap.categoryName} at ${gap.filePath}:${gap.lineStart}`));\n console.log(chalk.gray(` Reason: ${reason.slice(0, 100)}...`));\n }\n if (dismissed.length > 5) {\n console.log(chalk.gray(` ... and ${dismissed.length - 5} more`));\n }\n }\n } catch (error) {\n verifySpinner?.fail(\"AI verification failed (results unverified)\");\n if (isVerbose) {\n console.error(chalk.yellow(`Verification error: ${error instanceof Error ? error.message : String(error)}`));\n }\n }\n }\n\n // Cache results for generate command (save in current working directory)\n const cacheResult = await saveScanResults(process.cwd(), scanResult.data);\n if (!cacheResult.success) {\n logger.debug(`Failed to cache results: ${cacheResult.error.message}`);\n }\n\n // Format and output results\n const output = formatScanResult(scanResult.data, outputFormat, targetDirectory);\n console.log(output);\n\n // Handle warnings\n if (isVerbose && scanResult.data.warnings.length > 0) {\n console.error(\"\\nWarnings:\");\n for (const warning of scanResult.data.warnings) {\n console.error(` - ${warning}`);\n }\n }\n\n // Handle fail-on exit code\n if (failOn) {\n const severityOrder: Record<string, number> = {\n critical: 3,\n high: 2,\n medium: 1,\n };\n const failLevel = severityOrder[failOn] ?? 0;\n\n const hasFailingGaps = scanResult.data.gaps.some((gap) => {\n const gapLevel = severityOrder[gap.severity] ?? 0;\n return gapLevel >= failLevel;\n });\n\n if (hasFailingGaps) {\n const count = scanResult.data.gaps.filter((gap) => {\n const gapLevel = severityOrder[gap.severity] ?? 0;\n return gapLevel >= failLevel;\n }).length;\n logger.debug(`Exiting with code 1 due to ${count} gaps at ${failOn} level or above`);\n process.exit(1);\n }\n }\n\n process.exit(0);\n } catch (error) {\n spinner?.fail(\"Analysis failed\");\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"generate\")\n .description(\"Generate tests for identified gaps\")\n .option(\"--gaps\", \"Generate tests for all identified gaps\")\n .option(\"-c, --category <id>\", \"Generate tests for specific category\")\n .option(\"-d, --domain <domain>\", \"Generate tests for all categories in domain\")\n .option(\"-s, --severity <level>\", \"Minimum severity: critical, high, medium, low\", \"medium\")\n .option(\"--output-dir <dir>\", \"Directory for generated test files\")\n .option(\"--write\", \"Write files to disk (default is dry-run)\")\n .option(\"--ai\", \"Use AI for smarter template variable filling\")\n .option(\"--ai-provider <provider>\", \"AI provider: anthropic, openai\", \"anthropic\")\n .option(\"-o, --output <format>\", \"Output format: terminal, json\", \"terminal\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"-q, --quiet\", \"Quiet mode (errors only)\")\n .action(async (options: Record<string, unknown>) => {\n const isQuiet = Boolean(options[\"quiet\"]);\n const isVerbose = Boolean(options[\"verbose\"]);\n const dryRun = !options[\"write\"];\n const useAI = Boolean(options[\"ai\"]);\n const aiProvider = String(options[\"aiProvider\"] ?? \"anthropic\") as \"anthropic\" | \"openai\";\n const outputFormat = String(options[\"output\"] ?? \"terminal\");\n\n if (isQuiet) {\n logger.configure({ level: \"error\" });\n } else if (isVerbose) {\n logger.configure({ level: \"debug\" });\n }\n\n // Validate output format\n if (![\"terminal\", \"json\"].includes(outputFormat)) {\n console.error(formatError(new Error(`Invalid output format: ${outputFormat}. Use: terminal, json`)));\n process.exit(1);\n }\n\n // Validate options - at least one filter required\n const hasGaps = Boolean(options[\"gaps\"]);\n const categoryId = options[\"category\"] as string | undefined;\n const domainFilter = options[\"domain\"] as string | undefined;\n\n if (!hasGaps && !categoryId && !domainFilter) {\n console.error(formatError(new Error(\n \"Specify what to generate: --gaps (all gaps), --category <id>, or --domain <domain>\"\n )));\n process.exit(1);\n }\n\n // Validate domain if provided\n if (domainFilter && !RISK_DOMAINS.includes(domainFilter as RiskDomain)) {\n console.error(formatError(new Error(\n `Invalid domain: ${domainFilter}. Valid domains: ${RISK_DOMAINS.join(\", \")}`\n )));\n process.exit(1);\n }\n\n // Validate severity\n const validSeverities = [\"critical\", \"high\", \"medium\", \"low\"];\n const minSeverity = String(options[\"severity\"] ?? \"medium\");\n if (!validSeverities.includes(minSeverity)) {\n console.error(formatError(new Error(\n `Invalid severity: ${minSeverity}. Use: critical, high, medium, low`\n )));\n process.exit(1);\n }\n const severityOrder: Record<string, number> = {\n critical: 4,\n high: 3,\n medium: 2,\n low: 1,\n };\n\n // Start spinner\n const showSpinner = outputFormat === \"terminal\" && !isQuiet;\n const spinner = showSpinner ? ora(\"Loading cached scan results...\").start() : null;\n\n try {\n // Load cached scan results\n const projectRoot = process.cwd();\n const cacheResult = await loadScanResults(projectRoot);\n\n if (!cacheResult.success) {\n spinner?.fail(\"No cached results\");\n console.error(formatError(cacheResult.error));\n console.error(chalk.yellow(\"\\nRun `pinata analyze` first to scan for gaps.\"));\n process.exit(1);\n }\n\n const cached = cacheResult.data;\n let gaps = cached.gaps;\n\n if (spinner) {\n spinner.text = `Loaded ${gaps.length} gaps from cache. Filtering...`;\n }\n\n // Filter gaps\n if (categoryId) {\n gaps = gaps.filter((g) => g.categoryId === categoryId);\n }\n if (domainFilter) {\n gaps = gaps.filter((g) => g.domain === domainFilter);\n }\n gaps = gaps.filter((g) => {\n const gapLevel = severityOrder[g.severity] ?? 0;\n const minLevel = severityOrder[minSeverity] ?? 0;\n return gapLevel >= minLevel;\n });\n\n if (gaps.length === 0) {\n spinner?.succeed(\"No gaps match the filters\");\n console.log(chalk.yellow(\"\\nNo gaps found matching the specified filters.\"));\n process.exit(0);\n }\n\n if (spinner) {\n spinner.text = `Found ${gaps.length} gaps. Loading categories...`;\n }\n\n // Load categories for template access\n const store = createCategoryStore();\n const definitionsPath = getDefinitionsPath();\n const loadResult = await store.loadFromDirectory(definitionsPath);\n\n if (!loadResult.success) {\n spinner?.fail(\"Failed to load categories\");\n console.error(formatError(loadResult.error));\n process.exit(1);\n }\n\n if (spinner) {\n spinner.text = `Generating tests for ${gaps.length} gaps...`;\n }\n\n // Create template renderer\n const renderer = createRenderer({ strict: false, allowUnresolved: true });\n\n // Generate tests for each gap\n const generatedTests: GeneratedTest[] = [];\n const errors: string[] = [];\n\n // Group gaps by category to avoid rendering same template multiple times\n const gapsByCategory = new Map<string, typeof gaps>();\n for (const gap of gaps) {\n const existing = gapsByCategory.get(gap.categoryId) ?? [];\n existing.push(gap);\n gapsByCategory.set(gap.categoryId, existing);\n }\n\n for (const [catId, categoryGaps] of gapsByCategory) {\n const categoryResult = store.get(catId);\n if (!categoryResult.success) {\n errors.push(`Category not found: ${catId}`);\n continue;\n }\n const category = categoryResult.data;\n\n // Find best template for each gap (prefer matching language)\n for (const gap of categoryGaps) {\n // Detect gap file language\n const gapExt = gap.filePath.split(\".\").pop() ?? \"\";\n const langMap: Record<string, string> = {\n py: \"python\",\n ts: \"typescript\",\n tsx: \"typescript\",\n js: \"javascript\",\n jsx: \"javascript\",\n go: \"go\",\n java: \"java\",\n rs: \"rust\",\n };\n const gapLang = langMap[gapExt];\n\n // Find matching template (prefer same language)\n let template = category.testTemplates.find((t) => t.language === gapLang);\n if (!template) {\n template = category.testTemplates[0]; // Fallback to first template\n }\n if (!template) {\n errors.push(`No templates available for ${catId}`);\n continue;\n }\n\n // Extract variables from gap (use AI if enabled)\n let variables: Record<string, unknown>;\n if (useAI) {\n variables = await extractVariablesWithAI(gap, template.variables, {\n provider: aiProvider,\n });\n } else {\n variables = extractVariablesFromGap(gap);\n }\n\n // Render template\n const renderResult = renderer.renderTemplate(template, variables);\n if (!renderResult.success) {\n errors.push(`Failed to render ${catId}: ${renderResult.error.message}`);\n continue;\n }\n\n // Generate suggested path\n const suggestedPath = suggestTestPath(gap.filePath, template, cached.targetDirectory);\n\n generatedTests.push({\n gap,\n category,\n template,\n result: renderResult.data,\n suggestedPath,\n });\n }\n }\n\n spinner?.stop();\n\n // Format and output results\n if (outputFormat === \"json\") {\n console.log(formatGeneratedJson(generatedTests));\n } else {\n console.log(formatGeneratedTerminal(generatedTests, cached.targetDirectory));\n }\n\n // Show errors if verbose\n if (isVerbose && errors.length > 0) {\n console.error(chalk.yellow(\"\\nWarnings:\"));\n for (const error of errors) {\n console.error(chalk.gray(` - ${error}`));\n }\n }\n\n // Handle write mode\n if (!dryRun) {\n const outputDirOption = options[\"outputDir\"] as string | undefined;\n const writeResult = await writeGeneratedTests(\n generatedTests,\n cached.targetDirectory,\n outputDirOption\n );\n\n if (!writeResult.success) {\n console.error(formatError(writeResult.error));\n process.exit(1);\n }\n\n // Show write summary\n console.log(formatWriteSummary(writeResult.data, cached.targetDirectory));\n\n if (writeResult.data.failed.length > 0) {\n process.exit(1);\n }\n }\n\n process.exit(0);\n } catch (error) {\n spinner?.fail(\"Generation failed\");\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"explain\")\n .description(\"Get natural language explanations for detected gaps\")\n .option(\"-n, --top <count>\", \"Explain top N gaps by priority\", \"5\")\n .option(\"-c, --category <id>\", \"Explain gaps for specific category\")\n .option(\"-d, --domain <domain>\", \"Explain gaps for specific domain\")\n .option(\"--ai\", \"Use AI for detailed explanations (requires API key)\")\n .option(\"--ai-provider <provider>\", \"AI provider: anthropic, openai\", \"anthropic\")\n .option(\"-o, --output <format>\", \"Output format: terminal, json, markdown\", \"terminal\")\n .option(\"-v, --verbose\", \"Show more details\")\n .option(\"-q, --quiet\", \"Quiet mode (errors only)\")\n .action(async (options: Record<string, unknown>) => {\n const isQuiet = Boolean(options[\"quiet\"]);\n const isVerbose = Boolean(options[\"verbose\"]);\n const useAI = Boolean(options[\"ai\"]);\n const aiProvider = String(options[\"aiProvider\"] ?? \"anthropic\") as \"anthropic\" | \"openai\";\n const outputFormat = String(options[\"output\"] ?? \"terminal\");\n const topN = parseInt(String(options[\"top\"] ?? \"5\"), 10);\n\n if (isQuiet) {\n logger.configure({ level: \"error\" });\n } else if (isVerbose) {\n logger.configure({ level: \"debug\" });\n }\n\n // Validate output format\n if (![\"terminal\", \"json\", \"markdown\"].includes(outputFormat)) {\n console.error(formatError(new Error(`Invalid output format: ${outputFormat}. Use: terminal, json, markdown`)));\n process.exit(1);\n }\n\n const showSpinner = outputFormat === \"terminal\" && !isQuiet;\n const spinner = showSpinner ? ora(\"Loading cached scan results...\").start() : null;\n\n try {\n // Load cached scan results\n const projectRoot = process.cwd();\n const cacheResult = await loadScanResults(projectRoot);\n\n if (!cacheResult.success) {\n spinner?.fail(\"No cached results\");\n console.error(formatError(cacheResult.error));\n console.error(chalk.yellow(\"\\nRun `pinata analyze` first to scan for gaps.\"));\n process.exit(1);\n }\n\n const cached = cacheResult.data;\n let gaps = cached.gaps;\n\n // Apply filters\n const categoryFilter = options[\"category\"] as string | undefined;\n const domainFilter = options[\"domain\"] as string | undefined;\n\n if (categoryFilter) {\n gaps = gaps.filter((g) => g.categoryId === categoryFilter);\n }\n if (domainFilter) {\n if (!RISK_DOMAINS.includes(domainFilter as RiskDomain)) {\n spinner?.fail(\"Invalid domain\");\n console.error(formatError(new Error(`Invalid domain: ${domainFilter}. Valid: ${RISK_DOMAINS.join(\", \")}`)));\n process.exit(1);\n }\n gaps = gaps.filter((g) => g.domain === domainFilter);\n }\n\n if (gaps.length === 0) {\n spinner?.succeed(\"No gaps to explain\");\n console.log(chalk.yellow(\"\\nNo gaps found matching the filters.\"));\n process.exit(0);\n }\n\n // Sort by priority score and take top N\n gaps = gaps\n .sort((a, b) => b.priorityScore - a.priorityScore)\n .slice(0, topN);\n\n if (spinner) {\n spinner.text = `Explaining ${gaps.length} gap(s)...`;\n }\n\n // Generate explanations\n const explanations: Array<{ gap: typeof gaps[0]; explanation: GapExplanation }> = [];\n\n if (useAI) {\n // Check if AI is configured\n const ai = createAIService({ provider: aiProvider });\n if (!ai.isConfigured()) {\n spinner?.warn(\"AI not configured, using fallback explanations\");\n console.error(chalk.yellow(`\\nSet ${aiProvider === \"anthropic\" ? \"ANTHROPIC_API_KEY\" : \"OPENAI_API_KEY\"} for AI explanations.\\n`));\n\n // Use fallback\n for (const gap of gaps) {\n explanations.push({\n gap,\n explanation: generateFallbackExplanation(gap),\n });\n }\n } else {\n // Use AI for explanations\n for (const gap of gaps) {\n const result = await explainGap(gap, undefined, { provider: aiProvider });\n if (result.success && result.data) {\n explanations.push({ gap, explanation: result.data });\n } else {\n explanations.push({\n gap,\n explanation: generateFallbackExplanation(gap),\n });\n }\n }\n }\n } else {\n // Use fallback explanations\n for (const gap of gaps) {\n explanations.push({\n gap,\n explanation: generateFallbackExplanation(gap),\n });\n }\n }\n\n spinner?.stop();\n\n // Format and output\n if (outputFormat === \"json\") {\n console.log(JSON.stringify(explanations.map((e) => ({\n gap: {\n categoryId: e.gap.categoryId,\n categoryName: e.gap.categoryName,\n filePath: e.gap.filePath,\n lineStart: e.gap.lineStart,\n severity: e.gap.severity,\n confidence: e.gap.confidence,\n codeSnippet: e.gap.codeSnippet,\n },\n explanation: e.explanation,\n })), null, 2));\n } else if (outputFormat === \"markdown\") {\n console.log(`# Gap Explanations\\n`);\n console.log(`Generated ${explanations.length} explanation(s).\\n`);\n for (const { gap, explanation } of explanations) {\n console.log(`## ${gap.categoryName}\\n`);\n console.log(`**File:** \\`${gap.filePath}:${gap.lineStart}\\`\\n`);\n console.log(`**Severity:** ${gap.severity} | **Confidence:** ${gap.confidence}\\n`);\n console.log(`### Summary\\n${explanation.summary}\\n`);\n console.log(`### Explanation\\n${explanation.explanation}\\n`);\n console.log(`### Risk\\n${explanation.risk}\\n`);\n console.log(`### How to Fix\\n${explanation.remediation}\\n`);\n if (explanation.safeExample) {\n console.log(`### Safe Example\\n\\`\\`\\`\\n${explanation.safeExample}\\n\\`\\`\\`\\n`);\n }\n console.log(\"---\\n\");\n }\n } else {\n // Terminal format\n console.log();\n console.log(chalk.bold.cyan(\"Gap Explanations\"));\n console.log(chalk.gray(\"─\".repeat(60)));\n\n for (const { gap, explanation } of explanations) {\n console.log();\n console.log(chalk.bold.white(gap.categoryName));\n console.log(chalk.gray(` ${gap.filePath}:${gap.lineStart}`));\n\n const severityColor = gap.severity === \"critical\" ? chalk.red :\n gap.severity === \"high\" ? chalk.yellow : chalk.blue;\n console.log(` ${severityColor(gap.severity)} | ${gap.confidence} confidence`);\n\n console.log();\n console.log(chalk.cyan(\" Summary:\"));\n console.log(` ${explanation.summary}`);\n\n if (isVerbose) {\n console.log();\n console.log(chalk.cyan(\" Explanation:\"));\n for (const line of explanation.explanation.split(\"\\n\")) {\n console.log(` ${line}`);\n }\n }\n\n console.log();\n console.log(chalk.red(\" Risk:\"));\n console.log(` ${explanation.risk}`);\n\n console.log();\n console.log(chalk.green(\" How to Fix:\"));\n for (const line of explanation.remediation.split(\"\\n\")) {\n console.log(` ${line}`);\n }\n\n if (explanation.safeExample) {\n console.log();\n console.log(chalk.cyan(\" Safe Example:\"));\n console.log(chalk.gray(` ${explanation.safeExample}`));\n }\n\n console.log();\n console.log(chalk.gray(\"─\".repeat(60)));\n }\n }\n\n process.exit(0);\n } catch (error) {\n spinner?.fail(\"Explanation failed\");\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"suggest-patterns\")\n .description(\"Use AI to suggest new detection patterns based on code samples\")\n .requiredOption(\"-c, --category <id>\", \"Category to suggest patterns for\")\n .requiredOption(\"-l, --language <lang>\", \"Language of the code samples\")\n .option(\"-f, --file <path>\", \"File containing vulnerable code samples (one per line)\")\n .option(\"--code <snippet>\", \"Vulnerable code snippet (can be specified multiple times)\", (v, a: string[]) => [...a, v], [] as string[])\n .option(\"--ai-provider <provider>\", \"AI provider: anthropic, openai\", \"anthropic\")\n .option(\"-o, --output <format>\", \"Output format: terminal, yaml, json\", \"terminal\")\n .action(async (options: Record<string, unknown>) => {\n const categoryId = String(options[\"category\"]);\n const language = String(options[\"language\"]);\n const aiProvider = String(options[\"aiProvider\"] ?? \"anthropic\") as \"anthropic\" | \"openai\";\n const outputFormat = String(options[\"output\"] ?? \"terminal\");\n const codeSnippets = options[\"code\"] as string[];\n const filePath = options[\"file\"] as string | undefined;\n\n // Validate we have some code to analyze\n let vulnerableCode = [...codeSnippets];\n\n if (filePath) {\n try {\n const { readFile } = await import(\"fs/promises\");\n const content = await readFile(filePath, \"utf-8\");\n vulnerableCode = [...vulnerableCode, ...content.split(\"\\n---\\n\").filter(Boolean)];\n } catch (error) {\n console.error(formatError(new Error(`Failed to read file: ${filePath}`)));\n process.exit(1);\n }\n }\n\n if (vulnerableCode.length === 0) {\n console.error(formatError(new Error(\"Provide code samples via --code or --file\")));\n process.exit(1);\n }\n\n const spinner = ora(\"Generating pattern suggestions...\").start();\n\n try {\n const result = await suggestPatterns(\n {\n category: categoryId,\n language,\n vulnerableCode,\n maxSuggestions: 5,\n },\n { provider: aiProvider }\n );\n\n spinner.stop();\n\n if (!result.success) {\n console.error(formatError(new Error(result.error ?? \"Failed to generate patterns\")));\n process.exit(1);\n }\n\n const { suggestions, rejected } = result.data ?? { suggestions: [], rejected: [] };\n\n if (outputFormat === \"json\") {\n console.log(JSON.stringify({ suggestions, rejected }, null, 2));\n } else if (outputFormat === \"yaml\") {\n console.log(`# Suggested patterns for ${categoryId}\\n`);\n console.log(`detectionPatterns:`);\n for (const suggestion of suggestions) {\n const escapedPattern = suggestion.pattern.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n console.log(` - id: ${suggestion.id}`);\n console.log(` type: regex`);\n console.log(` language: ${language}`);\n console.log(` pattern: \"${escapedPattern}\"`);\n console.log(` confidence: ${suggestion.confidence}`);\n console.log(` description: ${suggestion.description}`);\n console.log();\n }\n } else {\n console.log();\n console.log(chalk.bold.cyan(\"Pattern Suggestions\"));\n console.log(chalk.gray(\"─\".repeat(60)));\n\n if (suggestions.length === 0) {\n console.log(chalk.yellow(\"\\nNo valid patterns could be generated.\"));\n } else {\n for (const suggestion of suggestions) {\n console.log();\n console.log(chalk.bold.white(suggestion.id));\n console.log(chalk.gray(` ${suggestion.description}`));\n console.log();\n console.log(chalk.cyan(\" Pattern:\"));\n console.log(` ${suggestion.pattern}`);\n console.log();\n console.log(chalk.cyan(\" Confidence:\") + ` ${suggestion.confidence}`);\n console.log();\n console.log(chalk.green(\" Would match:\"));\n console.log(chalk.gray(` ${suggestion.matchExample}`));\n console.log();\n console.log(chalk.red(\" Should NOT match:\"));\n console.log(chalk.gray(` ${suggestion.safeExample}`));\n console.log();\n console.log(chalk.cyan(\" Reasoning:\"));\n console.log(` ${suggestion.reasoning}`);\n console.log();\n console.log(chalk.gray(\"─\".repeat(60)));\n }\n }\n\n if (rejected.length > 0) {\n console.log();\n console.log(chalk.yellow.bold(`Rejected ${rejected.length} pattern(s):`));\n for (const r of rejected) {\n console.log(chalk.gray(` - ${r.pattern.slice(0, 40)}... : ${r.reason}`));\n }\n }\n }\n\n process.exit(0);\n } catch (error) {\n spinner.fail(\"Pattern generation failed\");\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"dashboard\")\n .description(\"Interactive TUI dashboard for viewing scan results\")\n .action(async () => {\n try {\n // Dynamic import to avoid loading ink unless needed\n const { runDashboard } = await import(\"./tui/index.js\");\n await runDashboard();\n } catch (error) {\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"search <query>\")\n .description(\"Search category taxonomy by name, description, or pattern\")\n .option(\"-d, --domain <domain>\", \"Filter by risk domain\")\n .option(\"-l, --level <level>\", \"Filter by test level\")\n .option(\"--language <lang>\", \"Filter by language\")\n .option(\"-o, --output <format>\", \"Output format: terminal, json, markdown\", \"terminal\")\n .option(\"-v, --verbose\", \"Show more details in results\")\n .action(async (query: string, options: Record<string, unknown>) => {\n try {\n const definitionsPath = getDefinitionsPath();\n const store = createCategoryStore();\n const loadResult = await store.loadFromDirectory(definitionsPath);\n\n if (!loadResult.success) {\n console.error(formatError(loadResult.error));\n process.exit(1);\n }\n\n // Validate output format\n const outputFormat = String(options[\"output\"] ?? \"terminal\");\n if (!isValidOutputFormat(outputFormat)) {\n console.error(formatError(new Error(`Invalid output format: ${outputFormat}`)));\n process.exit(1);\n }\n\n // Get all categories and filter\n const allCategories = store.toArray();\n const queryLower = query.toLowerCase();\n\n let results = allCategories.filter((cat) => {\n // Search in id, name, description\n const matchesText =\n cat.id.toLowerCase().includes(queryLower) ||\n cat.name.toLowerCase().includes(queryLower) ||\n cat.description.toLowerCase().includes(queryLower);\n\n // Search in pattern descriptions\n const matchesPattern = cat.detectionPatterns.some(\n (p) => p.description.toLowerCase().includes(queryLower) || p.pattern.includes(query)\n );\n\n return matchesText || matchesPattern;\n });\n\n // Apply domain filter\n const domainFilter = options[\"domain\"] as string | undefined;\n if (domainFilter) {\n if (!RISK_DOMAINS.includes(domainFilter as RiskDomain)) {\n console.error(formatError(new Error(`Invalid domain: ${domainFilter}`)));\n process.exit(1);\n }\n results = results.filter((cat) => cat.domain === domainFilter);\n }\n\n // Apply level filter\n const levelFilter = options[\"level\"] as string | undefined;\n if (levelFilter) {\n if (!TEST_LEVELS.includes(levelFilter as TestLevel)) {\n console.error(formatError(new Error(`Invalid level: ${levelFilter}`)));\n process.exit(1);\n }\n results = results.filter((cat) => cat.level === levelFilter);\n }\n\n // Apply language filter\n const langFilter = options[\"language\"] as string | undefined;\n if (langFilter) {\n results = results.filter((cat) =>\n cat.applicableLanguages.includes(langFilter as never)\n );\n }\n\n // Format output\n if (outputFormat === \"json\") {\n console.log(JSON.stringify(results, null, 2));\n } else if (outputFormat === \"markdown\") {\n console.log(`# Search Results for \"${query}\"\\n`);\n console.log(`Found ${results.length} matching categories.\\n`);\n for (const cat of results) {\n console.log(`## ${cat.name}\\n`);\n console.log(`- **ID**: ${cat.id}`);\n console.log(`- **Domain**: ${cat.domain}`);\n console.log(`- **Level**: ${cat.level}`);\n console.log(`- **Priority**: ${cat.priority}`);\n console.log(`\\n${cat.description}\\n`);\n }\n } else {\n // terminal format\n console.log();\n console.log(chalk.bold(`Search Results for \"${query}\"`));\n console.log(chalk.gray(`Found ${results.length} matching categories.`));\n console.log();\n\n if (results.length === 0) {\n console.log(chalk.yellow(\"No categories match your search.\"));\n console.log(chalk.gray(\"Try a different query or broaden your filters.\"));\n } else {\n for (const cat of results) {\n const domainColor = cat.domain === \"security\" ? chalk.red : chalk.blue;\n console.log(` ${chalk.cyan(cat.id)} - ${chalk.bold(cat.name)}`);\n console.log(` ${domainColor(cat.domain)} | ${cat.level} | ${cat.priority}`);\n if (options[\"verbose\"]) {\n console.log(` ${chalk.gray(cat.description.slice(0, 100))}${cat.description.length > 100 ? \"...\" : \"\"}`);\n }\n console.log();\n }\n }\n }\n } catch (error) {\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"list\")\n .description(\"List all categories\")\n .option(\"-d, --domain <domain>\", `Filter by risk domain (${RISK_DOMAINS.join(\", \")})`)\n .option(\"-l, --level <level>\", `Filter by test level (${TEST_LEVELS.join(\", \")})`)\n .option(\"-p, --priority <priority>\", \"Filter by priority: P0, P1, P2\")\n .option(\"-o, --output <format>\", \"Output format: terminal, json, markdown\", \"terminal\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"-q, --quiet\", \"Quiet mode (minimal output)\")\n .action(async (options: Record<string, unknown>) => {\n try {\n // Configure logging\n if (options[\"quiet\"]) {\n logger.configure({ level: \"error\" });\n } else if (options[\"verbose\"]) {\n logger.configure({ level: \"debug\" });\n }\n\n // Validate output format\n const outputFormat = String(options[\"output\"] ?? \"terminal\");\n if (!isValidOutputFormat(outputFormat)) {\n console.error(formatError(new Error(`Invalid output format: ${outputFormat}. Use: terminal, json, markdown`)));\n process.exit(1);\n }\n\n // Validate domain filter\n const domainFilter = options[\"domain\"] as string | undefined;\n if (domainFilter !== undefined && !RISK_DOMAINS.includes(domainFilter as RiskDomain)) {\n console.error(formatError(new Error(`Invalid domain: ${domainFilter}. Valid domains: ${RISK_DOMAINS.join(\", \")}`)));\n process.exit(1);\n }\n\n // Validate level filter\n const levelFilter = options[\"level\"] as string | undefined;\n if (levelFilter !== undefined && !TEST_LEVELS.includes(levelFilter as TestLevel)) {\n console.error(formatError(new Error(`Invalid level: ${levelFilter}. Valid levels: ${TEST_LEVELS.join(\", \")}`)));\n process.exit(1);\n }\n\n // Validate priority filter\n const priorityFilter = options[\"priority\"] as string | undefined;\n const validPriorities = [\"P0\", \"P1\", \"P2\"];\n if (priorityFilter !== undefined && !validPriorities.includes(priorityFilter)) {\n console.error(formatError(new Error(`Invalid priority: ${priorityFilter}. Use: P0, P1, P2`)));\n process.exit(1);\n }\n\n // Load categories\n logger.debug(\"Loading categories...\");\n const store = createCategoryStore();\n const definitionsPath = getDefinitionsPath();\n\n logger.debug(`Loading from: ${definitionsPath}`);\n const loadResult = await store.loadFromDirectory(definitionsPath);\n\n if (!loadResult.success) {\n console.error(formatError(loadResult.error));\n process.exit(1);\n }\n\n logger.debug(`Loaded ${loadResult.data} categories`);\n\n // Apply filters\n const filter: {\n domain?: RiskDomain;\n level?: TestLevel;\n priority?: Priority;\n } = {};\n\n if (domainFilter) {\n filter.domain = domainFilter as RiskDomain;\n }\n if (levelFilter) {\n filter.level = levelFilter as TestLevel;\n }\n if (priorityFilter) {\n filter.priority = priorityFilter as Priority;\n }\n\n // Get filtered categories\n const categories = store.list(filter);\n\n // Format and output\n const output = formatCategories(categories, outputFormat);\n console.log(output);\n\n // Exit with success\n process.exit(0);\n } catch (error) {\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"init\")\n .description(\"Initialize Pinata configuration in project\")\n .option(\"-f, --force\", \"Overwrite existing configuration\")\n .option(\"--no-interactive\", \"Skip interactive prompts\")\n .action(async (options: Record<string, unknown>) => {\n const configPath = resolve(process.cwd(), \".pinata.yml\");\n const cacheDir = resolve(process.cwd(), \".pinata\");\n\n // Check if config already exists\n if (existsSync(configPath) && !options[\"force\"]) {\n console.log(chalk.yellow(\"Configuration file already exists at .pinata.yml\"));\n console.log(chalk.gray(\"Use --force to overwrite.\"));\n process.exit(0);\n }\n\n // Generate default configuration\n const defaultConfig = `# Pinata Configuration\n# https://github.com/pinata/pinata\n\n# Paths to analyze\ninclude:\n - \"src/**/*.ts\"\n - \"src/**/*.tsx\"\n - \"src/**/*.py\"\n - \"src/**/*.js\"\n\n# Paths to exclude from analysis\nexclude:\n - \"node_modules/**\"\n - \"dist/**\"\n - \"build/**\"\n - \"**/*.test.ts\"\n - \"**/*.spec.ts\"\n - \"**/test/**\"\n - \"**/tests/**\"\n - \"**/__tests__/**\"\n\n# Risk domains to analyze\n# Options: security, data, concurrency, input, resource, reliability, performance, platform, business, compliance\ndomains:\n - security\n - data\n - concurrency\n - input\n\n# Minimum severity to report\n# Options: critical, high, medium, low\nminSeverity: medium\n\n# Output configuration\noutput:\n format: terminal # terminal, json, markdown, sarif, html\n color: true\n\n# Test generation settings\ngenerate:\n outputDir: tests/generated\n framework: auto # auto, pytest, jest, vitest, mocha\n\n# Fail CI if gaps exceed thresholds\nthresholds:\n critical: 0\n high: 5\n medium: 20\n`;\n\n const { writeFile: writeFileAsync, mkdir } = await import(\"fs/promises\");\n\n try {\n // Write config file\n await writeFileAsync(configPath, defaultConfig, \"utf8\");\n console.log(chalk.green(\"Created .pinata.yml\"));\n\n // Create cache directory\n await mkdir(cacheDir, { recursive: true });\n console.log(chalk.green(\"Created .pinata/ directory\"));\n\n // Add to gitignore if it exists\n const gitignorePath = resolve(process.cwd(), \".gitignore\");\n if (existsSync(gitignorePath)) {\n const { readFile, appendFile } = await import(\"fs/promises\");\n const gitignore = await readFile(gitignorePath, \"utf8\");\n if (!gitignore.includes(\".pinata/\")) {\n await appendFile(gitignorePath, \"\\n# Pinata cache\\n.pinata/\\n\");\n console.log(chalk.green(\"Added .pinata/ to .gitignore\"));\n }\n }\n\n console.log();\n console.log(chalk.bold(\"Pinata initialized successfully!\"));\n console.log();\n console.log(\"Next steps:\");\n console.log(chalk.gray(\" 1. Review and customize .pinata.yml\"));\n console.log(chalk.gray(\" 2. Run: pinata analyze\"));\n console.log(chalk.gray(\" 3. Generate tests: pinata generate\"));\n } catch (error) {\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\n// Auth command group\n// Config command for AI provider keys\nconst config = program.command(\"config\").description(\"Manage AI provider configuration\");\n\nconfig\n .command(\"set <key> <value>\")\n .description(\"Set a configuration value\")\n .addHelpText(\"after\", `\nAvailable keys:\n anthropic-api-key Anthropic API key for Claude models\n openai-api-key OpenAI API key for GPT models \n default-provider Default AI provider (anthropic or openai)\n\nExamples:\n pinata config set anthropic-api-key sk-ant-xxx\n pinata config set default-provider openai\n`)\n .action(async (key: string, value: string) => {\n const { setConfigValue, validateApiKey, maskApiKey, getConfigPath } = await import(\"./config.js\");\n \n switch (key) {\n case \"anthropic-api-key\": {\n const validation = validateApiKey(\"anthropic\", value);\n if (!validation.valid) {\n console.log(chalk.red(`Invalid API key: ${validation.error}`));\n process.exit(1);\n }\n setConfigValue(\"anthropicApiKey\", value);\n console.log(chalk.green(`Anthropic API key set: ${maskApiKey(value)}`));\n break;\n }\n case \"openai-api-key\": {\n const validation = validateApiKey(\"openai\", value);\n if (!validation.valid) {\n console.log(chalk.red(`Invalid API key: ${validation.error}`));\n process.exit(1);\n }\n setConfigValue(\"openaiApiKey\", value);\n console.log(chalk.green(`OpenAI API key set: ${maskApiKey(value)}`));\n break;\n }\n case \"default-provider\": {\n if (value !== \"anthropic\" && value !== \"openai\") {\n console.log(chalk.red(\"Provider must be 'anthropic' or 'openai'\"));\n process.exit(1);\n }\n setConfigValue(\"defaultProvider\", value);\n console.log(chalk.green(`Default provider set to: ${value}`));\n break;\n }\n default:\n console.log(chalk.red(`Unknown config key: ${key}`));\n console.log(chalk.gray(\"Run 'pinata config set --help' for available keys\"));\n process.exit(1);\n }\n console.log(chalk.gray(`Config stored at: ${getConfigPath()}`));\n });\n\nconfig\n .command(\"get <key>\")\n .description(\"Get a configuration value\")\n .action(async (key: string) => {\n const { loadConfig, maskApiKey } = await import(\"./config.js\");\n const cfg = loadConfig();\n \n switch (key) {\n case \"anthropic-api-key\":\n console.log(cfg.anthropicApiKey ? maskApiKey(cfg.anthropicApiKey) : chalk.gray(\"(not set)\"));\n break;\n case \"openai-api-key\":\n console.log(cfg.openaiApiKey ? maskApiKey(cfg.openaiApiKey) : chalk.gray(\"(not set)\"));\n break;\n case \"default-provider\":\n console.log(cfg.defaultProvider ?? chalk.gray(\"anthropic (default)\"));\n break;\n default:\n console.log(chalk.red(`Unknown config key: ${key}`));\n process.exit(1);\n }\n });\n\nconfig\n .command(\"list\")\n .description(\"List all configuration values\")\n .action(async () => {\n const { loadConfig, maskApiKey, getConfigPath, hasApiKey } = await import(\"./config.js\");\n const cfg = loadConfig();\n \n console.log(chalk.bold(\"Pinata Configuration\"));\n console.log(chalk.gray(`Config file: ${getConfigPath()}`));\n console.log();\n \n console.log(\"AI Providers:\");\n const anthropicStatus = hasApiKey(\"anthropic\") ? chalk.green(\"configured\") : chalk.gray(\"not set\");\n const openaiStatus = hasApiKey(\"openai\") ? chalk.green(\"configured\") : chalk.gray(\"not set\");\n console.log(` Anthropic API key: ${anthropicStatus} ${cfg.anthropicApiKey ? chalk.gray(`(${maskApiKey(cfg.anthropicApiKey)})`) : \"\"}`);\n console.log(` OpenAI API key: ${openaiStatus} ${cfg.openaiApiKey ? chalk.gray(`(${maskApiKey(cfg.openaiApiKey)})`) : \"\"}`);\n console.log(` Default provider: ${cfg.defaultProvider ?? \"anthropic\"}`);\n console.log();\n \n if (!hasApiKey(\"anthropic\") && !hasApiKey(\"openai\")) {\n console.log(chalk.yellow(\"No AI provider configured.\"));\n console.log(chalk.gray(\"To use AI features (explain, suggest-patterns, --ai flag):\"));\n console.log(chalk.gray(\" pinata config set anthropic-api-key sk-ant-xxx\"));\n console.log(chalk.gray(\" # or\"));\n console.log(chalk.gray(\" export ANTHROPIC_API_KEY=sk-ant-xxx\"));\n }\n });\n\nconfig\n .command(\"unset <key>\")\n .description(\"Remove a configuration value\")\n .action(async (key: string) => {\n const { deleteConfigValue } = await import(\"./config.js\");\n \n switch (key) {\n case \"anthropic-api-key\":\n deleteConfigValue(\"anthropicApiKey\");\n console.log(chalk.green(\"Anthropic API key removed\"));\n break;\n case \"openai-api-key\":\n deleteConfigValue(\"openaiApiKey\");\n console.log(chalk.green(\"OpenAI API key removed\"));\n break;\n case \"default-provider\":\n deleteConfigValue(\"defaultProvider\");\n console.log(chalk.green(\"Default provider reset to: anthropic\"));\n break;\n default:\n console.log(chalk.red(`Unknown config key: ${key}`));\n process.exit(1);\n }\n });\n\nconst auth = program.command(\"auth\").description(\"Manage API key authentication\");\n\nauth\n .command(\"login\")\n .description(\"Set API key for Pinata Cloud\")\n .option(\"-k, --key <key>\", \"API key (or set PINATA_API_KEY env var)\")\n .action(async (options: Record<string, unknown>) => {\n const apiKey = options[\"key\"] as string | undefined ?? process.env[\"PINATA_API_KEY\"];\n\n if (!apiKey) {\n console.log(chalk.yellow(\"No API key provided.\"));\n console.log();\n console.log(\"Provide an API key using one of:\");\n console.log(chalk.gray(\" pinata auth login --key <your-api-key>\"));\n console.log(chalk.gray(\" PINATA_API_KEY=<your-api-key> pinata auth login\"));\n console.log();\n console.log(\"Get your API key at: https://app.pinata.dev/settings/api\");\n process.exit(1);\n }\n\n // Validate key format (basic validation)\n if (apiKey.length < 20 || !apiKey.startsWith(\"pk_\")) {\n console.log(chalk.red(\"Invalid API key format.\"));\n console.log(chalk.gray(\"Keys should start with 'pk_' and be at least 20 characters.\"));\n process.exit(1);\n }\n\n // Store in local config\n const configDir = resolve(process.cwd(), \".pinata\");\n const authPath = resolve(configDir, \"auth.json\");\n\n const { mkdir, writeFile: writeFileAsync } = await import(\"fs/promises\");\n\n try {\n await mkdir(configDir, { recursive: true });\n\n // Store masked key (only store last 8 chars for identification)\n const maskedKey = `****${apiKey.slice(-8)}`;\n const authData = {\n configured: true,\n keyId: maskedKey,\n configuredAt: new Date().toISOString(),\n };\n\n await writeFileAsync(authPath, JSON.stringify(authData, null, 2), \"utf8\");\n\n // Also store full key in a more secure location (env file)\n const envPath = resolve(configDir, \".env\");\n await writeFileAsync(envPath, `PINATA_API_KEY=${apiKey}\\n`, { mode: 0o600 });\n\n console.log(chalk.green(\"API key configured successfully!\"));\n console.log(chalk.gray(`Key ID: ${maskedKey}`));\n console.log();\n console.log(chalk.yellow(\"Important: Add .pinata/.env to your .gitignore\"));\n } catch (error) {\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nauth\n .command(\"logout\")\n .description(\"Remove stored API key\")\n .action(async () => {\n const configDir = resolve(process.cwd(), \".pinata\");\n const authPath = resolve(configDir, \"auth.json\");\n const envPath = resolve(configDir, \".env\");\n\n const { rm } = await import(\"fs/promises\");\n\n try {\n let removed = false;\n\n if (existsSync(authPath)) {\n await rm(authPath);\n removed = true;\n }\n\n if (existsSync(envPath)) {\n await rm(envPath);\n removed = true;\n }\n\n if (removed) {\n console.log(chalk.green(\"API key removed successfully.\"));\n } else {\n console.log(chalk.yellow(\"No stored API key found.\"));\n }\n } catch (error) {\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nauth\n .command(\"status\")\n .description(\"Check authentication status\")\n .action(async () => {\n const authPath = resolve(process.cwd(), \".pinata\", \"auth.json\");\n\n if (!existsSync(authPath)) {\n console.log(chalk.yellow(\"Not authenticated.\"));\n console.log(chalk.gray(\"Run: pinata auth login --key <your-api-key>\"));\n process.exit(0);\n }\n\n try {\n const { readFile } = await import(\"fs/promises\");\n const authData = JSON.parse(await readFile(authPath, \"utf8\")) as {\n keyId?: string;\n configuredAt?: string;\n };\n\n console.log(chalk.green(\"Authenticated\"));\n console.log(chalk.gray(`Key ID: ${authData.keyId ?? \"unknown\"}`));\n console.log(chalk.gray(`Configured: ${authData.configuredAt ?? \"unknown\"}`));\n } catch (error) {\n console.log(chalk.yellow(\"Authentication status unknown.\"));\n console.log(chalk.gray(\"Run: pinata auth login to reconfigure.\"));\n }\n });\n\nprogram.parse();\n","/**\n * Formatters for scan results\n *\n * Handles terminal, JSON, markdown, and SARIF output formats\n * for the analyze command results.\n */\n\nimport { relative } from \"path\";\n\nimport chalk from \"chalk\";\n\nimport { RISK_DOMAINS } from \"../categories/schema/index.js\";\n\nimport type { RiskDomain } from \"../categories/schema/index.js\";\nimport type {\n ScanResult,\n Gap,\n PinataScore,\n CoverageMetrics,\n ScanSummary,\n} from \"../core/scanner/types.js\";\n\n\n/**\n * Extended output format including SARIF, HTML, and JUnit\n */\nexport type ScanOutputFormat = \"terminal\" | \"json\" | \"markdown\" | \"sarif\" | \"html\" | \"junit-xml\";\n\n/**\n * Severity colors for terminal output\n */\nconst SEVERITY_COLORS = {\n critical: chalk.red.bold,\n high: chalk.red,\n medium: chalk.yellow,\n low: chalk.gray,\n};\n\n/**\n * Domain colors for terminal output\n */\nconst DOMAIN_COLORS: Record<RiskDomain, typeof chalk.red> = {\n security: chalk.red,\n data: chalk.blue,\n concurrency: chalk.magenta,\n input: chalk.cyan,\n resource: chalk.yellow,\n reliability: chalk.green,\n performance: chalk.yellowBright,\n platform: chalk.gray,\n business: chalk.white,\n compliance: chalk.blueBright,\n};\n\n/**\n * Grade colors\n */\nconst GRADE_COLORS: Record<string, typeof chalk.red> = {\n A: chalk.green.bold,\n B: chalk.green,\n C: chalk.yellow,\n D: chalk.red,\n F: chalk.red.bold,\n};\n\n/**\n * ASCII art banner\n */\nconst BANNER = `\n${chalk.cyan(\" ____ _ _ \")}\n${chalk.cyan(\"| _ \\\\(_)_ __ __ _| |_ __ _ \")}\n${chalk.cyan(\"| |_) | | '_ \\\\ / _\\` | __/ _\\` |\")}\n${chalk.cyan(\"| __/| | | | | (_| | || (_| |\")}\n${chalk.cyan(\"|_| |_|_| |_|\\\\__,_|\\\\__\\\\__,_|\")}\n`;\n\n/**\n * Format scan results for terminal output\n */\nexport function formatScanTerminal(result: ScanResult, basePath: string): string {\n const lines: string[] = [];\n\n // Banner\n lines.push(BANNER);\n\n // Analysis target\n lines.push(chalk.gray(`Analyzing: ${result.targetDirectory}`));\n lines.push(chalk.gray(`Files: ${result.fileStats.totalFiles} | Languages: ${formatLanguages(result)}`));\n lines.push(\"\");\n\n // Pinata Score box\n lines.push(formatScoreBox(result.score));\n lines.push(\"\");\n\n // Domain coverage\n lines.push(chalk.bold(\"Domain Coverage:\"));\n lines.push(formatDomainCoverage(result.coverage));\n lines.push(\"\");\n\n // Gaps summary\n if (result.gaps.length > 0) {\n lines.push(formatGapsSummary(result.gaps, basePath));\n lines.push(\"\");\n } else {\n lines.push(chalk.green.bold(\"No gaps detected! Your codebase has good test coverage.\"));\n lines.push(\"\");\n }\n\n // Footer with suggestions\n if (result.gaps.length > 0) {\n lines.push(chalk.gray(\"Run `pinata generate --gaps` to create tests for these gaps.\"));\n }\n\n // Timing\n lines.push(chalk.gray(`\\nScan completed in ${result.durationMs}ms`));\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format the Pinata Score box\n */\nfunction formatScoreBox(score: PinataScore): string {\n const gradeColor = GRADE_COLORS[score.grade] ?? chalk.white;\n const scoreStr = `Pinata Score: ${score.overall}/100 ${gradeColor(`(${score.grade})`)}`;\n\n const boxWidth = 60;\n const padding = Math.floor((boxWidth - scoreStr.length) / 2);\n\n const top = chalk.cyan(\"╔\" + \"═\".repeat(boxWidth) + \"╗\");\n const middle = chalk.cyan(\"║\") + \" \".repeat(padding) + scoreStr + \" \".repeat(boxWidth - padding - scoreStr.length) + chalk.cyan(\"║\");\n const bottom = chalk.cyan(\"╚\" + \"═\".repeat(boxWidth) + \"╝\");\n\n return `${top}\\n${middle}\\n${bottom}`;\n}\n\n/**\n * Format domain coverage as progress bars\n */\nfunction formatDomainCoverage(coverage: CoverageMetrics): string {\n const lines: string[] = [];\n const barWidth = 16;\n\n for (const domain of RISK_DOMAINS) {\n const domainCoverage = coverage.byDomain.get(domain);\n if (!domainCoverage || domainCoverage.categoriesScanned === 0) {\n continue;\n }\n\n const percent = domainCoverage.coveragePercent;\n const filledWidth = Math.round((percent / 100) * barWidth);\n const bar = chalk.green(\"█\".repeat(filledWidth)) + chalk.gray(\"░\".repeat(barWidth - filledWidth));\n\n const domainColor = DOMAIN_COLORS[domain] ?? chalk.white;\n const domainName = domain.padEnd(15);\n const stats = `${domainCoverage.categoriesCovered}/${domainCoverage.categoriesScanned} categories`;\n\n lines.push(` ${domainColor(domainName)} ${bar} ${percent.toString().padStart(3)}% (${stats})`);\n }\n\n if (lines.length === 0) {\n lines.push(chalk.gray(\" No domain coverage data available.\"));\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format gaps summary\n */\nfunction formatGapsSummary(gaps: Gap[], basePath: string): string {\n const lines: string[] = [];\n\n // Group by severity\n const critical = gaps.filter((g) => g.severity === \"critical\");\n const high = gaps.filter((g) => g.severity === \"high\");\n const medium = gaps.filter((g) => g.severity === \"medium\");\n const low = gaps.filter((g) => g.severity === \"low\");\n\n // Critical gaps\n if (critical.length > 0) {\n lines.push(chalk.red.bold(`\\nCritical Gaps (${critical.length}):`));\n for (const gap of critical.slice(0, 5)) {\n lines.push(formatGapLine(gap, basePath, \"critical\"));\n }\n if (critical.length > 5) {\n lines.push(chalk.gray(` ... and ${critical.length - 5} more critical gaps`));\n }\n }\n\n // High gaps\n if (high.length > 0) {\n lines.push(chalk.red(`\\nHigh Severity Gaps (${high.length}):`));\n for (const gap of high.slice(0, 5)) {\n lines.push(formatGapLine(gap, basePath, \"high\"));\n }\n if (high.length > 5) {\n lines.push(chalk.gray(` ... and ${high.length - 5} more high severity gaps`));\n }\n }\n\n // Medium gaps\n if (medium.length > 0) {\n lines.push(chalk.yellow(`\\nMedium Severity Gaps (${medium.length}):`));\n for (const gap of medium.slice(0, 3)) {\n lines.push(formatGapLine(gap, basePath, \"medium\"));\n }\n if (medium.length > 3) {\n lines.push(chalk.gray(` ... and ${medium.length - 3} more medium severity gaps`));\n }\n }\n\n // Low gaps (just count)\n if (low.length > 0) {\n lines.push(chalk.gray(`\\nLow Severity: ${low.length} gaps`));\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a single gap line\n */\nfunction formatGapLine(gap: Gap, basePath: string, severity: string): string {\n const severityColor = SEVERITY_COLORS[severity as keyof typeof SEVERITY_COLORS] ?? chalk.white;\n const icon = severity === \"critical\" ? \"⛔\" : severity === \"high\" ? \"🔴\" : severity === \"medium\" ? \"🟡\" : \"⚪\";\n const relPath = relative(basePath, gap.filePath);\n const location = `${relPath}:${gap.lineStart}`;\n const confidence = gap.confidence.toUpperCase();\n\n return ` ${icon} ${severityColor(gap.categoryName.padEnd(20))} ${chalk.cyan(location.padEnd(30))} ${chalk.gray(confidence)} confidence`;\n}\n\n/**\n * Format languages detected\n */\nfunction formatLanguages(result: ScanResult): string {\n const languages: string[] = [];\n for (const [lang, count] of result.fileStats.byLanguage) {\n if (count > 0) {\n languages.push(lang.charAt(0).toUpperCase() + lang.slice(1));\n }\n }\n return languages.join(\", \") || \"None detected\";\n}\n\n/**\n * Format scan results as JSON\n */\nexport function formatScanJson(result: ScanResult): string {\n // Convert Maps to plain objects for JSON serialization\n const serializable = {\n targetDirectory: result.targetDirectory,\n startedAt: result.startedAt.toISOString(),\n completedAt: result.completedAt.toISOString(),\n durationMs: result.durationMs,\n score: {\n overall: result.score.overall,\n grade: result.score.grade,\n byDomain: Object.fromEntries(result.score.byDomain),\n bySeverity: result.score.bySeverity,\n penalties: result.score.penalties,\n bonuses: result.score.bonuses,\n },\n coverage: {\n overallCoverage: result.coverage.overallCoverage,\n totalCategories: result.coverage.totalCategories,\n categoriesWithGaps: result.coverage.categoriesWithGaps,\n categoriesCovered: result.coverage.categoriesCovered,\n byDomain: Object.fromEntries(result.coverage.byDomain),\n byLevel: Object.fromEntries(result.coverage.byLevel),\n },\n fileStats: {\n ...result.fileStats,\n byLanguage: Object.fromEntries(result.fileStats.byLanguage),\n },\n gaps: result.gaps,\n summary: result.summary,\n warnings: result.warnings,\n categoriesScanned: result.categoriesScanned,\n };\n\n return JSON.stringify(serializable, null, 2);\n}\n\n/**\n * Format scan results as Markdown\n */\nexport function formatScanMarkdown(result: ScanResult, basePath: string): string {\n const lines: string[] = [];\n\n lines.push(\"# Pinata Analysis Report\\n\");\n\n // Summary\n lines.push(`**Target**: ${result.targetDirectory}`);\n lines.push(`**Date**: ${result.completedAt.toISOString()}`);\n lines.push(`**Duration**: ${result.durationMs}ms`);\n lines.push(`**Files Scanned**: ${result.fileStats.totalFiles}`);\n lines.push(\"\");\n\n // Score\n lines.push(`## Pinata Score: ${result.score.overall}/100 (${result.score.grade})\\n`);\n\n // Coverage\n lines.push(\"## Coverage by Domain\\n\");\n for (const domain of RISK_DOMAINS) {\n const cov = result.coverage.byDomain.get(domain);\n if (cov && cov.categoriesScanned > 0) {\n const bar = \"█\".repeat(Math.round(cov.coveragePercent / 10)) + \"░\".repeat(10 - Math.round(cov.coveragePercent / 10));\n lines.push(`- **${domain}**: ${bar} ${cov.coveragePercent}% (${cov.categoriesCovered}/${cov.categoriesScanned})`);\n }\n }\n lines.push(\"\");\n\n // Gaps\n if (result.gaps.length > 0) {\n lines.push(\"## Detected Gaps\\n\");\n\n const bySeverity: Record<string, Gap[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n\n for (const gap of result.gaps) {\n bySeverity[gap.severity]?.push(gap);\n }\n\n for (const severity of [\"critical\", \"high\", \"medium\", \"low\"]) {\n const gaps = bySeverity[severity];\n if (gaps && gaps.length > 0) {\n lines.push(`### ${severity.charAt(0).toUpperCase() + severity.slice(1)} (${gaps.length})\\n`);\n\n for (const gap of gaps.slice(0, 10)) {\n const relPath = relative(basePath, gap.filePath);\n lines.push(`- **${gap.categoryName}** in \\`${relPath}:${gap.lineStart}\\``);\n lines.push(` - Confidence: ${gap.confidence}`);\n lines.push(` - Domain: ${gap.domain}`);\n }\n\n if (gaps.length > 10) {\n lines.push(`\\n_...and ${gaps.length - 10} more ${severity} gaps_\\n`);\n }\n lines.push(\"\");\n }\n }\n } else {\n lines.push(\"## No Gaps Detected\\n\");\n lines.push(\"Your codebase has good test coverage.\\n\");\n }\n\n // Summary stats\n lines.push(\"## Summary\\n\");\n lines.push(`- Total Gaps: ${result.summary.totalGaps}`);\n lines.push(`- Critical: ${result.summary.criticalGaps}`);\n lines.push(`- High: ${result.summary.highGaps}`);\n lines.push(`- Medium: ${result.summary.mediumGaps}`);\n lines.push(`- Low: ${result.summary.lowGaps}`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format scan results as SARIF (for GitHub Security integration)\n */\nexport function formatScanSarif(result: ScanResult, basePath: string): string {\n const sarif = {\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: \"pinata\",\n version: \"0.1.0\",\n informationUri: \"https://github.com/pinata/pinata\",\n rules: buildSarifRules(result),\n },\n },\n results: buildSarifResults(result, basePath),\n },\n ],\n };\n\n return JSON.stringify(sarif, null, 2);\n}\n\n/**\n * Build SARIF rules from categories\n */\nfunction buildSarifRules(result: ScanResult): object[] {\n const rulesMap = new Map<string, object>();\n\n for (const gap of result.gaps) {\n if (!rulesMap.has(gap.categoryId)) {\n rulesMap.set(gap.categoryId, {\n id: gap.categoryId,\n name: gap.categoryName,\n shortDescription: {\n text: gap.categoryName,\n },\n defaultConfiguration: {\n level: sarifLevel(gap.severity),\n },\n properties: {\n tags: [gap.domain, gap.level],\n precision: gap.confidence,\n },\n });\n }\n }\n\n return Array.from(rulesMap.values());\n}\n\n/**\n * Build SARIF results from gaps\n */\nfunction buildSarifResults(result: ScanResult, basePath: string): object[] {\n return result.gaps.map((gap) => ({\n ruleId: gap.categoryId,\n level: sarifLevel(gap.severity),\n message: {\n text: `Missing test coverage for ${gap.categoryName}`,\n },\n locations: [\n {\n physicalLocation: {\n artifactLocation: {\n uri: relative(basePath, gap.filePath),\n uriBaseId: \"%SRCROOT%\",\n },\n region: {\n startLine: gap.lineStart,\n endLine: gap.lineEnd,\n startColumn: gap.columnStart + 1,\n endColumn: gap.columnEnd + 1,\n snippet: {\n text: gap.codeSnippet,\n },\n },\n },\n },\n ],\n partialFingerprints: {\n primaryLocationLineHash: `${gap.filePath}:${gap.lineStart}:${gap.patternId}`,\n },\n }));\n}\n\n/**\n * Convert severity to SARIF level\n */\nfunction sarifLevel(severity: string): string {\n switch (severity) {\n case \"critical\":\n case \"high\":\n return \"error\";\n case \"medium\":\n return \"warning\";\n case \"low\":\n default:\n return \"note\";\n }\n}\n\n/**\n * Format scan results in the specified format\n */\nexport function formatScanResult(\n result: ScanResult,\n format: ScanOutputFormat,\n basePath: string\n): string {\n switch (format) {\n case \"json\":\n return formatScanJson(result);\n case \"markdown\":\n return formatScanMarkdown(result, basePath);\n case \"sarif\":\n return formatScanSarif(result, basePath);\n case \"html\": {\n const { formatHtml } = require(\"./html-formatter.js\") as { formatHtml: (result: ScanResult) => string };\n return formatHtml(result);\n }\n case \"junit-xml\": {\n const { formatJunit } = require(\"./junit-formatter.js\") as { formatJunit: (result: ScanResult) => string };\n return formatJunit(result);\n }\n case \"terminal\":\n default:\n return formatScanTerminal(result, basePath);\n }\n}\n\n/**\n * Validate scan output format\n */\nexport function isValidScanOutputFormat(format: string): format is ScanOutputFormat {\n return [\"terminal\", \"json\", \"markdown\", \"sarif\", \"html\", \"junit-xml\"].includes(format);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/errors.ts","../../src/lib/result.ts","../../src/core/scanner/types.ts","../../src/cli/results-cache.ts","../../src/cli/html-formatter.ts","../../src/cli/junit-formatter.ts","../../src/cli/config.ts","../../src/core/verifier/ai-verifier.ts","../../src/core/verifier/index.ts","../../src/execution/types.ts","../../src/execution/sandbox.ts","../../src/execution/results.ts","../../src/execution/generator.ts","../../src/execution/runner.ts","../../src/execution/index.ts","../../src/cli/tui/App.tsx","../../src/cli/tui/index.tsx","../../src/categories/schema/category.schema.ts","../../src/categories/schema/example.schema.ts","../../src/categories/schema/pattern.schema.ts","../../src/categories/schema/template.schema.ts","../../src/categories/schema/index.ts","../../src/categories/store/category-store.ts","../../src/core/detection/pattern-matcher.ts","../../src/lib/logger.ts","../../src/core/detection/ast-parser.ts","../../src/core/scanner/scanner.ts","../../src/core/scanner/index.ts","../../src/core/index.ts","../../src/lib/index.ts","../../src/templates/renderer.ts","../../src/cli/formatters.ts","../../src/cli/generate-formatters.ts","../../src/ai/service.ts","../../src/ai/template-filler.ts","../../src/ai/explainer.ts","../../src/ai/pattern-suggester.ts","../../src/cli/index.ts","../../src/cli/scan-formatters.ts"],"names":["resolve","mkdir","writeFile","readFile","config","join","z","path","init_types","err","SEVERITY_COLORS","jsx","ID_PATTERN","chalk","__filename","__dirname","existsSync","TreeSitterParser","TreeSitterLanguage","TreeSitterQuery","stat","readFileSync","readdir","extname","homedir","relative","dirname","basename","SYSTEM_PROMPT","DOMAIN_COLORS","formatHtml","formatJunit","fileURLToPath","hasApiKey","setConfigValue","getApiKey","AIVerifier","createRunner","isTestable","runDashboard","validateApiKey","maskApiKey","getConfigPath","loadConfig","deleteConfigValue","rm"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base error class for all Pinata errors\n */\nexport class PinataError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly context?: Record<string, unknown>\n ) {\n super(message);\n this.name = \"PinataError\";\n // Maintains proper stack trace for where error was thrown (V8 only)\n Error.captureStackTrace?.(this, this.constructor);\n }\n\n /**\n * Serialize error for logging or API responses\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n context: this.context,\n };\n }\n}\n\n/**\n * Error for schema validation failures\n */\nexport class ValidationError extends PinataError {\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, \"VALIDATION_ERROR\", context);\n this.name = \"ValidationError\";\n }\n}\n\n/**\n * Error for file/code parsing failures\n */\nexport class ParseError extends PinataError {\n constructor(\n message: string,\n public readonly filePath: string,\n public readonly line?: number,\n context?: Record<string, unknown>\n ) {\n super(message, \"PARSE_ERROR\", { ...context, filePath, line });\n this.name = \"ParseError\";\n }\n}\n\n/**\n * Error for configuration issues\n */\nexport class ConfigError extends PinataError {\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, \"CONFIG_ERROR\", context);\n this.name = \"ConfigError\";\n }\n}\n\n/**\n * Error during codebase analysis\n */\nexport class AnalysisError extends PinataError {\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, \"ANALYSIS_ERROR\", context);\n this.name = \"AnalysisError\";\n }\n}\n\n/**\n * Error during test generation\n */\nexport class GenerationError extends PinataError {\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, \"GENERATION_ERROR\", context);\n this.name = \"GenerationError\";\n }\n}\n\n/**\n * Error for category not found\n */\nexport class CategoryNotFoundError extends PinataError {\n constructor(categoryId: string) {\n super(`Category not found: ${categoryId}`, \"CATEGORY_NOT_FOUND\", { categoryId });\n this.name = \"CategoryNotFoundError\";\n }\n}\n\n/**\n * Error for pattern not found\n */\nexport class PatternNotFoundError extends PinataError {\n constructor(patternId: string) {\n super(`Pattern not found: ${patternId}`, \"PATTERN_NOT_FOUND\", { patternId });\n this.name = \"PatternNotFoundError\";\n }\n}\n","/**\n * Result type for operations that can fail\n * Prefer this over throwing exceptions for expected failures\n */\nexport type Result<T, E = Error> =\n | { success: true; data: T }\n | { success: false; error: E };\n\n/**\n * Create a successful result\n */\nexport function ok<T>(data: T): Result<T, never> {\n return { success: true, data };\n}\n\n/**\n * Create a failed result\n */\nexport function err<E>(error: E): Result<never, E> {\n return { success: false, error };\n}\n\n/**\n * Unwrap a result, throwing if it's an error\n * Use sparingly - prefer pattern matching with if/else\n */\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.success) {\n return result.data;\n }\n throw result.error;\n}\n\n/**\n * Unwrap a result with a default value for errors\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n if (result.success) {\n return result.data;\n }\n return defaultValue;\n}\n\n/**\n * Map over a successful result\n */\nexport function map<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => U\n): Result<U, E> {\n if (result.success) {\n return ok(fn(result.data));\n }\n return result;\n}\n\n/**\n * Map over a failed result\n */\nexport function mapErr<T, E, F>(\n result: Result<T, E>,\n fn: (error: E) => F\n): Result<T, F> {\n if (!result.success) {\n return err(fn(result.error));\n }\n return result;\n}\n\n/**\n * Chain results together (flatMap)\n */\nexport function andThen<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => Result<U, E>\n): Result<U, E> {\n if (result.success) {\n return fn(result.data);\n }\n return result;\n}\n\n/**\n * Combine multiple results into one\n * Returns first error if any fail, otherwise returns array of all values\n */\nexport function all<T, E>(results: Result<T, E>[]): Result<T[], E> {\n const values: T[] = [];\n for (const result of results) {\n if (!result.success) {\n return result;\n }\n values.push(result.data);\n }\n return ok(values);\n}\n\n/**\n * Try to execute a function, returning a Result\n */\nexport function tryCatch<T>(fn: () => T): Result<T, Error> {\n try {\n return ok(fn());\n } catch (e) {\n return err(e instanceof Error ? e : new Error(String(e)));\n }\n}\n\n/**\n * Try to execute an async function, returning a Result\n */\nexport async function tryCatchAsync<T>(\n fn: () => Promise<T>\n): Promise<Result<T, Error>> {\n try {\n return ok(await fn());\n } catch (e) {\n return err(e instanceof Error ? e : new Error(String(e)));\n }\n}\n","/**\n * Scanner types and schemas\n *\n * Defines the data structures for codebase scanning results,\n * gap detection, coverage metrics, and Pinata Score calculation.\n */\n\nimport { z } from \"zod\";\n\nimport type {\n RiskDomain,\n TestLevel,\n Language,\n Priority,\n Severity,\n Confidence,\n DetectionResult,\n} from \"../../categories/schema/index.js\";\n\n/**\n * Options for scanning a codebase\n */\nexport interface ScannerOptions {\n /** Base directory to scan */\n targetDirectory: string;\n /** Directories to exclude from scanning */\n excludeDirs?: string[];\n /** File extensions to include */\n includeExtensions?: string[];\n /** Maximum file size to scan in bytes */\n maxFileSize?: number;\n /** Maximum depth for directory traversal (-1 for unlimited) */\n maxDepth?: number;\n /** Category IDs to scan for (empty = all) */\n categoryIds?: string[];\n /** Risk domains to scan for (empty = all) */\n domains?: RiskDomain[];\n /** Minimum severity to report */\n minSeverity?: Severity;\n /** Minimum confidence to report */\n minConfidence?: Confidence;\n /** Whether to detect existing test files */\n detectTestFiles?: boolean;\n /** Custom test file patterns (e.g., ['*.test.ts', 'test_*.py']) */\n testFilePatterns?: string[];\n}\n\n/**\n * A detected gap (missing test coverage)\n */\nexport interface Gap {\n /** Category ID this gap relates to */\n categoryId: string;\n /** Category name for display */\n categoryName: string;\n /** Risk domain */\n domain: RiskDomain;\n /** Test level */\n level: TestLevel;\n /** Priority of addressing this gap */\n priority: Priority;\n /** Severity if exploited */\n severity: Severity;\n /** Detection confidence */\n confidence: Confidence;\n /** File where the gap was detected */\n filePath: string;\n /** Line number in file */\n lineStart: number;\n /** End line number */\n lineEnd: number;\n /** Column start */\n columnStart: number;\n /** Column end */\n columnEnd: number;\n /** Code snippet showing the gap */\n codeSnippet: string;\n /** Pattern ID that detected this */\n patternId: string;\n /** Detection type used */\n patternType: \"regex\" | \"ast\" | \"semantic\";\n /** Weighted score for prioritization (severity × confidence) */\n priorityScore: number;\n}\n\n/**\n * Coverage metrics for a single risk domain\n */\nexport interface DomainCoverage {\n /** Risk domain */\n domain: RiskDomain;\n /** Number of categories scanned */\n categoriesScanned: number;\n /** Number of categories with gaps */\n categoriesWithGaps: number;\n /** Number of categories fully covered */\n categoriesCovered: number;\n /** Coverage percentage (0-100) */\n coveragePercent: number;\n /** Total gaps in this domain */\n totalGaps: number;\n /** Critical gaps in this domain */\n criticalGaps: number;\n}\n\n/**\n * Coverage metrics across all domains\n */\nexport interface CoverageMetrics {\n /** Per-domain coverage */\n byDomain: Map<RiskDomain, DomainCoverage>;\n /** Per-level coverage */\n byLevel: Map<TestLevel, { scanned: number; withGaps: number; covered: number }>;\n /** Overall coverage percentage */\n overallCoverage: number;\n /** Total categories scanned */\n totalCategories: number;\n /** Categories with detected gaps */\n categoriesWithGaps: number;\n /** Categories with no gaps detected */\n categoriesCovered: number;\n}\n\n/**\n * File statistics from the scan\n */\nexport interface FileStats {\n /** Total files scanned */\n totalFiles: number;\n /** Files with detected gaps */\n filesWithGaps: number;\n /** Files by language */\n byLanguage: Map<Language, number>;\n /** Test files detected */\n testFiles: number;\n /** Source files (non-test) */\n sourceFiles: number;\n /** Files skipped (too large, binary, etc.) */\n skippedFiles: number;\n /** Total lines of code scanned */\n totalLinesOfCode: number;\n}\n\n/**\n * Pinata Score breakdown\n */\nexport interface PinataScore {\n /** Overall score (0-100) */\n overall: number;\n /** Letter grade (A-F) */\n grade: \"A\" | \"B\" | \"C\" | \"D\" | \"F\";\n /** Score breakdown by domain */\n byDomain: Map<RiskDomain, number>;\n /** Score breakdown by severity */\n bySeverity: {\n critical: number;\n high: number;\n medium: number;\n low: number;\n };\n /** Factors that decreased the score */\n penalties: Array<{\n reason: string;\n points: number;\n categoryId?: string;\n }>;\n /** Factors that increased the score */\n bonuses: Array<{\n reason: string;\n points: number;\n }>;\n}\n\n/**\n * Complete scan result\n */\nexport interface ScanResult {\n /** Target directory that was scanned */\n targetDirectory: string;\n /** When the scan started */\n startedAt: Date;\n /** When the scan completed */\n completedAt: Date;\n /** Duration in milliseconds */\n durationMs: number;\n /** All detected gaps, sorted by priority */\n gaps: Gap[];\n /** Gaps grouped by category */\n gapsByCategory: Map<string, Gap[]>;\n /** Gaps grouped by file */\n gapsByFile: Map<string, Gap[]>;\n /** Coverage metrics */\n coverage: CoverageMetrics;\n /** File statistics */\n fileStats: FileStats;\n /** Pinata Score */\n score: PinataScore;\n /** Warnings encountered during scan */\n warnings: string[];\n /** Categories that were scanned */\n categoriesScanned: string[];\n /** Summary for quick display */\n summary: ScanSummary;\n}\n\n/**\n * Quick summary of scan results\n */\nexport interface ScanSummary {\n /** Total gaps found */\n totalGaps: number;\n /** Critical gaps */\n criticalGaps: number;\n /** High severity gaps */\n highGaps: number;\n /** Medium severity gaps */\n mediumGaps: number;\n /** Low severity gaps */\n lowGaps: number;\n /** Pinata Score */\n score: number;\n /** Grade */\n grade: string;\n /** Coverage percentage */\n coverage: number;\n /** Files scanned */\n filesScanned: number;\n /** Categories checked */\n categoriesChecked: number;\n /** Top 3 priority gaps */\n topGaps: Gap[];\n}\n\n/**\n * Weight multipliers for severity levels\n */\nexport const SEVERITY_WEIGHTS: Record<Severity, number> = {\n critical: 4.0,\n high: 3.0,\n medium: 2.0,\n low: 1.0,\n};\n\n/**\n * Weight multipliers for confidence levels\n */\nexport const CONFIDENCE_WEIGHTS: Record<Confidence, number> = {\n high: 1.0,\n medium: 0.7,\n low: 0.4,\n};\n\n/**\n * Weight multipliers for priority levels\n */\nexport const PRIORITY_WEIGHTS: Record<Priority, number> = {\n P0: 3.0,\n P1: 2.0,\n P2: 1.0,\n};\n\n/**\n * Default test file patterns for different languages\n */\nexport const DEFAULT_TEST_PATTERNS: Record<Language, string[]> = {\n python: [\"test_*.py\", \"*_test.py\", \"tests/**/*.py\", \"test/**/*.py\"],\n typescript: [\"*.test.ts\", \"*.spec.ts\", \"__tests__/**/*.ts\", \"tests/**/*.ts\"],\n javascript: [\"*.test.js\", \"*.spec.js\", \"__tests__/**/*.js\", \"tests/**/*.js\"],\n go: [\"*_test.go\"],\n java: [\"*Test.java\", \"*Tests.java\", \"src/test/**/*.java\"],\n rust: [\"tests/**/*.rs\"],\n};\n","/**\n * Results cache for storing scan results between analyze and generate commands\n *\n * Stores scan results in .pinata/cache.json for use by the generate command.\n */\n\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { resolve, dirname } from \"path\";\n\nimport { PinataError } from \"../lib/errors.js\";\nimport { ok, err } from \"../lib/result.js\";\n\nimport type { ScanResult, Gap } from \"../core/scanner/types.js\";\nimport type { Result } from \"../lib/result.js\";\n\n/**\n * Cache file location relative to project root\n */\nconst CACHE_DIR = \".pinata\";\nconst CACHE_FILE = \"cache.json\";\n\n/**\n * Cached scan result structure (serializable)\n */\nexport interface CachedScanResult {\n /** When the scan was performed */\n timestamp: string;\n /** Target directory that was scanned */\n targetDirectory: string;\n /** Pinata Score */\n score: number;\n /** Grade */\n grade: string;\n /** Total gaps found */\n totalGaps: number;\n /** The gaps themselves */\n gaps: Gap[];\n /** Categories that were scanned */\n categoriesScanned: string[];\n /** Cache version for compatibility */\n version: number;\n}\n\n/**\n * Current cache version - increment when format changes\n */\nconst CACHE_VERSION = 1;\n\n/**\n * Maximum cache age in milliseconds (1 hour)\n */\nconst MAX_CACHE_AGE_MS = 60 * 60 * 1000;\n\n/**\n * Get the cache file path for a project\n */\nexport function getCachePath(projectRoot: string): string {\n return resolve(projectRoot, CACHE_DIR, CACHE_FILE);\n}\n\n/**\n * Save scan results to cache\n */\nexport async function saveScanResults(\n projectRoot: string,\n result: ScanResult\n): Promise<Result<void, PinataError>> {\n try {\n const cacheDir = resolve(projectRoot, CACHE_DIR);\n const cachePath = getCachePath(projectRoot);\n\n // Ensure cache directory exists (idempotent, no race condition)\n await mkdir(cacheDir, { recursive: true });\n\n // Create serializable cache object\n const cached: CachedScanResult = {\n timestamp: result.completedAt.toISOString(),\n targetDirectory: result.targetDirectory,\n score: result.score.overall,\n grade: result.score.grade,\n totalGaps: result.gaps.length,\n gaps: result.gaps,\n categoriesScanned: result.categoriesScanned,\n version: CACHE_VERSION,\n };\n\n await writeFile(cachePath, JSON.stringify(cached, null, 2));\n\n return ok(undefined);\n } catch (error) {\n return err(\n new PinataError(\n `Failed to save cache: ${error instanceof Error ? error.message : String(error)}`,\n \"CACHE_ERROR\"\n )\n );\n }\n}\n\n/**\n * Load scan results from cache\n */\nexport async function loadScanResults(\n projectRoot: string\n): Promise<Result<CachedScanResult, PinataError>> {\n try {\n const cachePath = getCachePath(projectRoot);\n\n // Try to read directly instead of checking existence (avoids TOCTOU)\n let content: string;\n try {\n content = await readFile(cachePath, \"utf-8\");\n } catch {\n return err(\n new PinataError(\n \"No cached scan results found. Run `pinata analyze` first.\",\n \"CACHE_NOT_FOUND\"\n )\n );\n }\n const cached = JSON.parse(content) as CachedScanResult;\n\n // Check version compatibility\n if (cached.version !== CACHE_VERSION) {\n return err(\n new PinataError(\n \"Cache version mismatch. Run `pinata analyze` again.\",\n \"CACHE_VERSION_MISMATCH\"\n )\n );\n }\n\n // Check cache age\n const cacheAge = Date.now() - new Date(cached.timestamp).getTime();\n if (cacheAge > MAX_CACHE_AGE_MS) {\n return err(\n new PinataError(\n `Cache is stale (${Math.round(cacheAge / 60000)} minutes old). Run \\`pinata analyze\\` again.`,\n \"CACHE_STALE\"\n )\n );\n }\n\n return ok(cached);\n } catch (error) {\n return err(\n new PinataError(\n `Failed to load cache: ${error instanceof Error ? error.message : String(error)}`,\n \"CACHE_ERROR\"\n )\n );\n }\n}\n\n/**\n * Check if cache exists and is valid\n */\nexport async function isCacheValid(projectRoot: string): Promise<boolean> {\n const result = await loadScanResults(projectRoot);\n return result.success;\n}\n\n/**\n * Clear the scan results cache\n */\nexport async function clearCache(projectRoot: string): Promise<Result<void, PinataError>> {\n try {\n const cachePath = getCachePath(projectRoot);\n\n if (existsSync(cachePath)) {\n const { unlink } = await import(\"fs/promises\");\n await unlink(cachePath);\n }\n\n return ok(undefined);\n } catch (error) {\n return err(\n new PinataError(\n `Failed to clear cache: ${error instanceof Error ? error.message : String(error)}`,\n \"CACHE_ERROR\"\n )\n );\n }\n}\n","/**\n * HTML output formatter for standalone reports.\n *\n * Generates a self-contained HTML file with embedded CSS/JS\n * that can be viewed in any browser.\n */\n\nimport type { ScanResult, Gap } from \"../core/scanner/types.js\";\n\n/**\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Get severity badge class\n */\nfunction getSeverityClass(severity: string): string {\n switch (severity) {\n case \"critical\":\n return \"severity-critical\";\n case \"high\":\n return \"severity-high\";\n case \"medium\":\n return \"severity-medium\";\n case \"low\":\n return \"severity-low\";\n default:\n return \"severity-low\";\n }\n}\n\n/**\n * Get domain badge class\n */\nfunction getDomainClass(domain: string): string {\n switch (domain) {\n case \"security\":\n return \"domain-security\";\n case \"data\":\n return \"domain-data\";\n case \"concurrency\":\n return \"domain-concurrency\";\n case \"input\":\n return \"domain-input\";\n default:\n return \"domain-other\";\n }\n}\n\n/**\n * Generate gaps table rows\n */\nfunction generateGapsTable(gaps: Gap[]): string {\n if (gaps.length === 0) {\n return '<tr><td colspan=\"6\" class=\"no-results\">No gaps detected</td></tr>';\n }\n\n return gaps\n .map(\n (gap) => `\n <tr class=\"gap-row\" data-severity=\"${gap.severity}\" data-domain=\"${gap.domain}\">\n <td>\n <span class=\"badge ${getSeverityClass(gap.severity)}\">${gap.severity}</span>\n </td>\n <td>\n <span class=\"badge ${getDomainClass(gap.domain)}\">${gap.domain}</span>\n </td>\n <td>\n <strong>${escapeHtml(gap.categoryName)}</strong>\n <br>\n <small class=\"category-id\">${gap.categoryId}</small>\n </td>\n <td>\n <code class=\"file-path\">${escapeHtml(gap.filePath)}</code>\n <br>\n <small>Line ${gap.lineStart}${gap.lineEnd && gap.lineEnd !== gap.lineStart ? `-${gap.lineEnd}` : \"\"}</small>\n </td>\n <td>\n <span class=\"confidence confidence-${gap.confidence}\">${gap.confidence}</span>\n </td>\n <td>\n ${gap.codeSnippet ? `<pre class=\"code-snippet\"><code>${escapeHtml(gap.codeSnippet)}</code></pre>` : \"-\"}\n </td>\n </tr>\n `\n )\n .join(\"\");\n}\n\n/**\n * Generate summary statistics\n */\nfunction generateSummary(result: ScanResult): string {\n // Build severity counts from summary or gaps\n const bySeverity = {\n critical: (result.summary as { criticalGaps?: number }).criticalGaps ?? 0,\n high: (result.summary as { highGaps?: number }).highGaps ?? 0,\n medium: (result.summary as { mediumGaps?: number }).mediumGaps ?? 0,\n low: (result.summary as { lowGaps?: number }).lowGaps ?? 0,\n };\n\n // Build domain counts from gaps\n const byDomain: Record<string, number> = {};\n for (const gap of result.gaps) {\n byDomain[gap.domain] = (byDomain[gap.domain] ?? 0) + 1;\n }\n\n return `\n <div class=\"summary-grid\">\n <div class=\"summary-card\">\n <h3>Total Gaps</h3>\n <div class=\"stat-value\">${result.summary.totalGaps}</div>\n </div>\n <div class=\"summary-card\">\n <h3>Pinata Score</h3>\n <div class=\"stat-value score-${result.score.overall >= 80 ? \"good\" : result.score.overall >= 60 ? \"moderate\" : \"poor\"}\">${result.score.overall}</div>\n <small>out of 100</small>\n </div>\n <div class=\"summary-card\">\n <h3>Files Scanned</h3>\n <div class=\"stat-value\">${result.fileStats.totalFiles}</div>\n <small>${result.fileStats.filesWithGaps} with gaps</small>\n </div>\n <div class=\"summary-card\">\n <h3>Duration</h3>\n <div class=\"stat-value\">${(result.durationMs / 1000).toFixed(2)}s</div>\n </div>\n </div>\n \n <div class=\"charts-row\">\n <div class=\"chart-card\">\n <h3>By Severity</h3>\n <div class=\"bar-chart\">\n ${bySeverity.critical > 0 ? `<div class=\"bar critical\" style=\"width: ${Math.min(100, (bySeverity.critical / result.summary.totalGaps) * 100)}%\"><span>Critical: ${bySeverity.critical}</span></div>` : \"\"}\n ${bySeverity.high > 0 ? `<div class=\"bar high\" style=\"width: ${Math.min(100, (bySeverity.high / result.summary.totalGaps) * 100)}%\"><span>High: ${bySeverity.high}</span></div>` : \"\"}\n ${bySeverity.medium > 0 ? `<div class=\"bar medium\" style=\"width: ${Math.min(100, (bySeverity.medium / result.summary.totalGaps) * 100)}%\"><span>Medium: ${bySeverity.medium}</span></div>` : \"\"}\n ${bySeverity.low > 0 ? `<div class=\"bar low\" style=\"width: ${Math.min(100, (bySeverity.low / result.summary.totalGaps) * 100)}%\"><span>Low: ${bySeverity.low}</span></div>` : \"\"}\n </div>\n </div>\n <div class=\"chart-card\">\n <h3>By Domain</h3>\n <div class=\"domain-list\">\n ${Object.entries(byDomain)\n .sort((a, b) => (b[1] as number) - (a[1] as number))\n .map(([domain, count]) => `<div class=\"domain-item\"><span class=\"badge ${getDomainClass(domain)}\">${domain}</span>: ${count}</div>`)\n .join(\"\")}\n </div>\n </div>\n </div>\n `;\n}\n\n/**\n * Format scan results as standalone HTML\n */\nexport function formatHtml(result: ScanResult): string {\n const generatedAt = new Date().toISOString();\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Pinata Scan Report</title>\n <style>\n :root {\n --color-bg: #0d1117;\n --color-surface: #161b22;\n --color-border: #30363d;\n --color-text: #c9d1d9;\n --color-text-muted: #8b949e;\n --color-critical: #f85149;\n --color-high: #db6d28;\n --color-medium: #d29922;\n --color-low: #3fb950;\n --color-security: #f85149;\n --color-data: #58a6ff;\n --color-concurrency: #bc8cff;\n --color-input: #d29922;\n --color-other: #8b949e;\n }\n \n * { box-sizing: border-box; margin: 0; padding: 0; }\n \n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n background: var(--color-bg);\n color: var(--color-text);\n line-height: 1.6;\n padding: 2rem;\n }\n \n .container { max-width: 1400px; margin: 0 auto; }\n \n header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 2rem;\n padding-bottom: 1rem;\n border-bottom: 1px solid var(--color-border);\n }\n \n h1 { font-size: 1.5rem; }\n h2 { font-size: 1.25rem; margin-bottom: 1rem; color: var(--color-text); }\n h3 { font-size: 1rem; color: var(--color-text-muted); margin-bottom: 0.5rem; }\n \n .meta { color: var(--color-text-muted); font-size: 0.875rem; }\n \n .summary-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 1rem;\n margin-bottom: 2rem;\n }\n \n .summary-card {\n background: var(--color-surface);\n border: 1px solid var(--color-border);\n border-radius: 6px;\n padding: 1rem;\n text-align: center;\n }\n \n .stat-value {\n font-size: 2rem;\n font-weight: bold;\n color: var(--color-text);\n }\n \n .stat-value.score-good { color: var(--color-low); }\n .stat-value.score-moderate { color: var(--color-medium); }\n .stat-value.score-poor { color: var(--color-critical); }\n \n .charts-row {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 1rem;\n margin-bottom: 2rem;\n }\n \n .chart-card {\n background: var(--color-surface);\n border: 1px solid var(--color-border);\n border-radius: 6px;\n padding: 1rem;\n }\n \n .bar-chart { display: flex; flex-direction: column; gap: 0.5rem; }\n .bar {\n padding: 0.5rem 1rem;\n border-radius: 4px;\n font-size: 0.875rem;\n min-width: 100px;\n }\n .bar.critical { background: var(--color-critical); }\n .bar.high { background: var(--color-high); }\n .bar.medium { background: var(--color-medium); }\n .bar.low { background: var(--color-low); }\n \n .domain-list { display: flex; flex-direction: column; gap: 0.5rem; }\n .domain-item { display: flex; align-items: center; gap: 0.5rem; }\n \n .filters {\n display: flex;\n gap: 1rem;\n margin-bottom: 1rem;\n flex-wrap: wrap;\n }\n \n .filter-group { display: flex; align-items: center; gap: 0.5rem; }\n .filter-group label { color: var(--color-text-muted); font-size: 0.875rem; }\n .filter-group select {\n background: var(--color-surface);\n border: 1px solid var(--color-border);\n color: var(--color-text);\n padding: 0.5rem;\n border-radius: 4px;\n }\n \n table {\n width: 100%;\n border-collapse: collapse;\n background: var(--color-surface);\n border-radius: 6px;\n overflow: hidden;\n }\n \n th, td {\n padding: 0.75rem 1rem;\n text-align: left;\n border-bottom: 1px solid var(--color-border);\n }\n \n th {\n background: var(--color-bg);\n font-weight: 600;\n color: var(--color-text-muted);\n font-size: 0.75rem;\n text-transform: uppercase;\n }\n \n .badge {\n display: inline-block;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n }\n \n .severity-critical { background: var(--color-critical); color: white; }\n .severity-high { background: var(--color-high); color: white; }\n .severity-medium { background: var(--color-medium); color: black; }\n .severity-low { background: var(--color-low); color: black; }\n \n .domain-security { background: rgba(248, 81, 73, 0.2); color: var(--color-security); }\n .domain-data { background: rgba(88, 166, 255, 0.2); color: var(--color-data); }\n .domain-concurrency { background: rgba(188, 140, 255, 0.2); color: var(--color-concurrency); }\n .domain-input { background: rgba(210, 153, 34, 0.2); color: var(--color-input); }\n .domain-other { background: rgba(139, 148, 158, 0.2); color: var(--color-other); }\n \n .confidence { font-size: 0.75rem; }\n .confidence-high { color: var(--color-low); }\n .confidence-medium { color: var(--color-medium); }\n .confidence-low { color: var(--color-text-muted); }\n \n .file-path { font-size: 0.875rem; }\n .category-id { color: var(--color-text-muted); }\n \n .code-snippet {\n background: var(--color-bg);\n padding: 0.5rem;\n border-radius: 4px;\n overflow-x: auto;\n font-size: 0.75rem;\n max-width: 300px;\n }\n \n .code-snippet code {\n white-space: pre-wrap;\n word-break: break-all;\n }\n \n .no-results {\n text-align: center;\n color: var(--color-text-muted);\n padding: 2rem;\n }\n \n footer {\n margin-top: 2rem;\n padding-top: 1rem;\n border-top: 1px solid var(--color-border);\n text-align: center;\n color: var(--color-text-muted);\n font-size: 0.875rem;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <header>\n <h1>Pinata Scan Report</h1>\n <div class=\"meta\">Generated: ${generatedAt}</div>\n </header>\n \n <section id=\"summary\">\n <h2>Summary</h2>\n ${generateSummary(result)}\n </section>\n \n <section id=\"gaps\">\n <h2>Detected Gaps</h2>\n \n <div class=\"filters\">\n <div class=\"filter-group\">\n <label for=\"severity-filter\">Severity:</label>\n <select id=\"severity-filter\" onchange=\"filterTable()\">\n <option value=\"\">All</option>\n <option value=\"critical\">Critical</option>\n <option value=\"high\">High</option>\n <option value=\"medium\">Medium</option>\n <option value=\"low\">Low</option>\n </select>\n </div>\n <div class=\"filter-group\">\n <label for=\"domain-filter\">Domain:</label>\n <select id=\"domain-filter\" onchange=\"filterTable()\">\n <option value=\"\">All</option>\n <option value=\"security\">Security</option>\n <option value=\"data\">Data</option>\n <option value=\"concurrency\">Concurrency</option>\n <option value=\"input\">Input</option>\n </select>\n </div>\n </div>\n \n <table>\n <thead>\n <tr>\n <th>Severity</th>\n <th>Domain</th>\n <th>Category</th>\n <th>Location</th>\n <th>Confidence</th>\n <th>Code</th>\n </tr>\n </thead>\n <tbody id=\"gaps-table\">\n ${generateGapsTable(result.gaps)}\n </tbody>\n </table>\n </section>\n \n <footer>\n Generated by Pinata v0.1.0\n </footer>\n </div>\n \n <script>\n function filterTable() {\n const severityFilter = document.getElementById('severity-filter').value;\n const domainFilter = document.getElementById('domain-filter').value;\n const rows = document.querySelectorAll('.gap-row');\n \n rows.forEach(row => {\n const severity = row.dataset.severity;\n const domain = row.dataset.domain;\n \n const matchesSeverity = !severityFilter || severity === severityFilter;\n const matchesDomain = !domainFilter || domain === domainFilter;\n \n row.style.display = matchesSeverity && matchesDomain ? '' : 'none';\n });\n }\n </script>\n</body>\n</html>`;\n}\n","/**\n * JUnit XML output formatter.\n *\n * Generates JUnit-compatible XML for CI/CD integration.\n * Each gap is represented as a test failure.\n */\n\nimport type { ScanResult, Gap } from \"../core/scanner/types.js\";\n\n/**\n * Escape XML special characters\n */\nfunction escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Generate a test case for a gap\n */\nfunction generateTestCase(gap: Gap): string {\n const className = `pinata.${gap.domain}.${gap.categoryId}`;\n const name = `${gap.filePath}:${gap.lineStart}`;\n const time = \"0.001\"; // Nominal time\n\n const failureMessage = `${gap.categoryName}: ${gap.confidence} confidence ${gap.severity} issue`;\n const failureDetails = [\n `Category: ${gap.categoryName} (${gap.categoryId})`,\n `Domain: ${gap.domain}`,\n `Severity: ${gap.severity}`,\n `Priority: ${gap.priority}`,\n `Confidence: ${gap.confidence}`,\n `File: ${gap.filePath}`,\n `Line: ${gap.lineStart}${gap.lineEnd && gap.lineEnd !== gap.lineStart ? `-${gap.lineEnd}` : \"\"}`,\n gap.codeSnippet ? `\\nCode:\\n${gap.codeSnippet}` : \"\",\n ].join(\"\\n\");\n\n return ` <testcase classname=\"${escapeXml(className)}\" name=\"${escapeXml(name)}\" time=\"${time}\">\n <failure message=\"${escapeXml(failureMessage)}\" type=\"${escapeXml(gap.severity)}\">\n${escapeXml(failureDetails)}\n </failure>\n </testcase>`;\n}\n\n/**\n * Generate test suite for a domain\n */\nfunction generateTestSuite(\n domain: string,\n gaps: Gap[],\n totalTime: number\n): string {\n const tests = gaps.length;\n const failures = gaps.length;\n const errors = 0;\n const skipped = 0;\n const time = (totalTime / 1000).toFixed(3);\n\n const testCases = gaps.map(generateTestCase).join(\"\\n\");\n\n return ` <testsuite name=\"pinata.${escapeXml(domain)}\" tests=\"${tests}\" failures=\"${failures}\" errors=\"${errors}\" skipped=\"${skipped}\" time=\"${time}\">\n${testCases}\n </testsuite>`;\n}\n\n/**\n * Format scan results as JUnit XML\n */\nexport function formatJunit(result: ScanResult): string {\n const timestamp = new Date().toISOString();\n\n // Group gaps by domain\n const gapsByDomain = new Map<string, Gap[]>();\n for (const gap of result.gaps) {\n const existing = gapsByDomain.get(gap.domain) ?? [];\n existing.push(gap);\n gapsByDomain.set(gap.domain, existing);\n }\n\n // Calculate totals\n const totalTests = result.gaps.length || 1; // At least 1 for schema validity\n const totalFailures = result.gaps.length;\n const totalErrors = 0;\n const totalTime = (result.durationMs / 1000).toFixed(3);\n\n // Generate test suites\n const testSuites = Array.from(gapsByDomain.entries())\n .map(([domain, gaps]) => generateTestSuite(domain, gaps, result.durationMs / gapsByDomain.size))\n .join(\"\\n\");\n\n // If no gaps, add a passing test suite\n const content = result.gaps.length === 0\n ? ` <testsuite name=\"pinata.all\" tests=\"1\" failures=\"0\" errors=\"0\" skipped=\"0\" time=\"${totalTime}\">\n <testcase classname=\"pinata.scan\" name=\"no-gaps-detected\" time=\"${totalTime}\">\n </testcase>\n </testsuite>`\n : testSuites;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites name=\"Pinata Scan Results\" tests=\"${totalTests}\" failures=\"${totalFailures}\" errors=\"${totalErrors}\" time=\"${totalTime}\" timestamp=\"${timestamp}\">\n${content}\n</testsuites>`;\n}\n\n/**\n * Validate JUnit XML output (basic validation)\n */\nexport function validateJunit(xml: string): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // Basic XML structure validation\n if (!xml.startsWith('<?xml version=\"1.0\"')) {\n errors.push(\"Missing or invalid XML declaration\");\n }\n\n if (!xml.includes(\"<testsuites\")) {\n errors.push(\"Missing testsuites element\");\n }\n\n if (!xml.includes(\"<testsuite\")) {\n errors.push(\"Missing testsuite element\");\n }\n\n // Check for balanced tags\n const openSuites = (xml.match(/<testsuite[\\s>]/g) || []).length;\n const closeSuites = (xml.match(/<\\/testsuite>/g) || []).length;\n if (openSuites !== closeSuites) {\n errors.push(`Unbalanced testsuite tags: ${openSuites} open, ${closeSuites} close`);\n }\n\n const openCases = (xml.match(/<testcase[\\s>]/g) || []).length;\n const closeCases = (xml.match(/<\\/testcase>|\\/>/g) || []).length - openSuites; // Subtract self-closing\n // This is a rough check; proper XML validation would use a parser\n\n // Check required attributes\n if (!xml.includes('name=\"')) {\n errors.push(\"Missing name attribute\");\n }\n\n if (!xml.includes('tests=\"')) {\n errors.push(\"Missing tests attribute\");\n }\n\n return { valid: errors.length === 0, errors };\n}\n","/**\n * Configuration Management\n *\n * Handles persistent storage of user configuration like API keys.\n * Uses OS-appropriate config directory with secure file permissions.\n */\n\nimport { mkdirSync, readFileSync, writeFileSync, chmodSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { z } from \"zod\";\n\nconst CONFIG_DIR = join(homedir(), \".pinata\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\n/**\n * Configuration schema\n */\nconst ConfigSchema = z.object({\n anthropicApiKey: z.string().optional(),\n openaiApiKey: z.string().optional(),\n defaultProvider: z.enum([\"anthropic\", \"openai\"]).optional(),\n telemetry: z.boolean().optional(),\n});\n\ntype Config = z.infer<typeof ConfigSchema>;\n\n/**\n * Ensure config directory exists with secure permissions.\n * Uses mkdir with recursive:true which is idempotent (no race condition).\n */\nfunction ensureConfigDir(): void {\n // mkdir with recursive:true is idempotent - safe to call even if exists\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n}\n\n/**\n * Load configuration from disk.\n * Uses try-catch instead of existsSync to avoid TOCTOU race condition.\n */\nexport function loadConfig(): Config {\n try {\n // Just try to read - catches ENOENT if file doesn't exist\n const content = readFileSync(CONFIG_FILE, \"utf-8\");\n const parsed = JSON.parse(content) as unknown;\n const result = ConfigSchema.safeParse(parsed);\n return result.success ? result.data : {};\n } catch {\n // File doesn't exist or is unreadable - return empty config\n return {};\n }\n}\n\n/**\n * Save configuration to disk with secure permissions\n */\nexport function saveConfig(config: Config): void {\n ensureConfigDir();\n const content = JSON.stringify(config, null, 2);\n writeFileSync(CONFIG_FILE, content, { mode: 0o600 });\n // Ensure file permissions are restricted\n chmodSync(CONFIG_FILE, 0o600);\n}\n\n/**\n * Set a single configuration value\n */\nexport function setConfigValue<K extends keyof Config>(key: K, value: Config[K]): void {\n const config = loadConfig();\n config[key] = value;\n saveConfig(config);\n}\n\n/**\n * Get a single configuration value\n */\nexport function getConfigValue<K extends keyof Config>(key: K): Config[K] {\n const config = loadConfig();\n return config[key];\n}\n\n/**\n * Delete a configuration value\n */\nexport function deleteConfigValue(key: keyof Config): void {\n const config = loadConfig();\n delete config[key];\n saveConfig(config);\n}\n\n/**\n * Get API key (from config file or environment)\n * Environment variables take precedence\n */\nexport function getApiKey(provider: \"anthropic\" | \"openai\"): string | undefined {\n const envVar = provider === \"anthropic\" ? \"ANTHROPIC_API_KEY\" : \"OPENAI_API_KEY\";\n const envValue = process.env[envVar];\n if (envValue !== undefined && envValue.length > 0) {\n return envValue;\n }\n\n const config = loadConfig();\n return provider === \"anthropic\" ? config.anthropicApiKey : config.openaiApiKey;\n}\n\n/**\n * Check if API key is configured for a provider\n */\nexport function hasApiKey(provider: \"anthropic\" | \"openai\"): boolean {\n const key = getApiKey(provider);\n return key !== undefined && key.length > 0;\n}\n\n/**\n * Get configured provider (or default)\n */\nexport function getDefaultProvider(): \"anthropic\" | \"openai\" {\n const config = loadConfig();\n return config.defaultProvider ?? \"anthropic\";\n}\n\n/**\n * Mask API key for display (show first/last 4 chars)\n */\nexport function maskApiKey(key: string): string {\n if (key.length <= 12) {\n return \"****\";\n }\n return `${key.slice(0, 4)}...${key.slice(-4)}`;\n}\n\n/**\n * Validate API key format\n */\nexport function validateApiKey(provider: \"anthropic\" | \"openai\", key: string): { valid: boolean; error?: string } {\n if (key.length === 0) {\n return { valid: false, error: \"API key cannot be empty\" };\n }\n\n if (provider === \"anthropic\") {\n if (!key.startsWith(\"sk-ant-\")) {\n return { valid: false, error: \"Anthropic API keys should start with 'sk-ant-'\" };\n }\n } else if (provider === \"openai\") {\n if (!key.startsWith(\"sk-\")) {\n return { valid: false, error: \"OpenAI API keys should start with 'sk-'\" };\n }\n }\n\n return { valid: true };\n}\n\n/**\n * Get config file path (for display purposes)\n */\nexport function getConfigPath(): string {\n return CONFIG_FILE;\n}\n","/**\n * AI-powered verification of pattern matches.\n *\n * Optimized for efficiency:\n * 1. Smart pre-filtering to skip obvious false positives\n * 2. Batch prompts (10 gaps per API call)\n * 3. Parallel execution (3 concurrent batches)\n *\n * 352 gaps → ~50 after filtering → 5 batches × 3 parallel = ~20 seconds\n */\n\nimport { Gap } from \"../scanner/types.js\";\n\nexport interface VerificationResult {\n isVulnerable: boolean;\n confidence: \"high\" | \"medium\" | \"low\";\n reasoning: string;\n mitigatingFactors: string[];\n exploitScenario: string | null;\n recommendation: string;\n}\n\nexport interface BatchVerificationResult {\n id: string;\n isVulnerable: boolean;\n confidence: \"high\" | \"medium\" | \"low\";\n reasoning: string;\n}\n\nexport interface AIVerifierConfig {\n provider: \"anthropic\" | \"openai\";\n model?: string;\n apiKey?: string;\n batchSize?: number; // Gaps per API call (default: 10)\n concurrency?: number; // Parallel batches (default: 3)\n}\n\n// Patterns that indicate safe/test code - skip AI verification\nconst SKIP_PATTERNS = {\n paths: [\n /\\.test\\.(ts|js|tsx|jsx)$/,\n /\\.spec\\.(ts|js|tsx|jsx)$/,\n /tests?\\//i,\n /fixtures?\\//i,\n /mocks?\\//i,\n /__tests__\\//,\n /node_modules\\//,\n /dist\\//,\n /\\.d\\.ts$/,\n /examples?\\//i,\n ],\n // Content patterns that indicate false positive\n content: [\n /\\/\\/ SAFE:/i, // Explicit safe marker\n /\\/\\/ nosec/i, // Security ignore\n /eslint-disable/i,\n /sanitized?|escaped?|validated?/i, // Near sanitization\n ],\n};\n\n// Batch verification prompt - handles multiple gaps at once\nconst BATCH_PROMPT = `You are a security code reviewer. Analyze these potential vulnerabilities and determine which are real issues vs false positives.\n\nFor each item, consider:\n- Is user input actually reaching this code?\n- Is there sanitization, validation, or encoding nearby?\n- Is this test code, example code, or production code?\n- Is there context that makes this safe?\n\nBe rigorous. Most pattern matches are false positives.\n\nITEMS TO ANALYZE:\n{{items}}\n\nRespond with a JSON array. Each object MUST have these exact fields:\n[\n {\n \"id\": \"1\",\n \"isVulnerable\": true/false,\n \"confidence\": \"high\"/\"medium\"/\"low\",\n \"reasoning\": \"brief explanation\"\n },\n ...\n]\n\nOnly return the JSON array, no other text.`;\n\nconst SINGLE_ITEM_TEMPLATE = `\n---\nID: {{id}}\nCATEGORY: {{category}}\nFILE: {{filePath}}:{{lineNumber}}\nCODE:\n\\`\\`\\`{{language}}\n{{codeContext}}\n\\`\\`\\`\nFLAGGED LINE: {{flaggedLine}}\n---`;\n\nexport class AIVerifier {\n private config: AIVerifierConfig;\n private readonly batchSize: number;\n private readonly concurrency: number;\n\n constructor(config: AIVerifierConfig) {\n this.config = config;\n this.batchSize = config.batchSize ?? 10;\n this.concurrency = config.concurrency ?? 3;\n }\n\n /**\n * Verify multiple gaps efficiently using filtering, batching, and parallelism.\n *\n * Flow:\n * 1. Pre-filter obvious false positives (test files, etc.)\n * 2. Group remaining gaps into batches of 10\n * 3. Process 3 batches in parallel\n * 4. Return verified gaps and dismissed with reasons\n */\n async verifyAll(\n gaps: Gap[],\n getFileContent: (path: string) => Promise<string>\n ): Promise<{\n verified: Gap[];\n dismissed: Array<{ gap: Gap; reason: string }>;\n stats: { total: number; preFiltered: number; aiDismissed: number; aiVerified: number };\n }> {\n const verified: Gap[] = [];\n const dismissed: Array<{ gap: Gap; reason: string }> = [];\n\n // Step 1: Pre-filter obvious false positives\n const { toVerify, preFiltered } = this.preFilter(gaps);\n dismissed.push(...preFiltered);\n\n if (toVerify.length === 0) {\n return {\n verified: [],\n dismissed,\n stats: {\n total: gaps.length,\n preFiltered: preFiltered.length,\n aiDismissed: 0,\n aiVerified: 0,\n },\n };\n }\n\n console.log(`Pre-filtered ${preFiltered.length} gaps. Verifying ${toVerify.length} with AI...`);\n\n // Step 2: Load file contents (deduplicated)\n const fileContents = new Map<string, string>();\n const uniquePaths = [...new Set(toVerify.map((g) => g.filePath))];\n await Promise.all(\n uniquePaths.map(async (path) => {\n try {\n fileContents.set(path, await getFileContent(path));\n } catch {\n fileContents.set(path, \"\");\n }\n })\n );\n\n // Step 3: Create batches\n const batches = this.createBatches(toVerify, fileContents);\n console.log(`Created ${batches.length} batches of ~${this.batchSize} gaps each`);\n\n // Step 4: Process batches in parallel (limited concurrency)\n const results = await this.processParallel(batches, toVerify);\n\n // Step 5: Separate verified from dismissed\n let aiVerified = 0;\n let aiDismissed = 0;\n\n for (const gap of toVerify) {\n const gapId = `${gap.filePath}:${gap.lineStart}`;\n const result = results.get(gapId);\n\n if (!result || result.isVulnerable) {\n // No result (AI failure) or confirmed vulnerable\n verified.push(gap);\n aiVerified++;\n } else {\n // AI dismissed as false positive\n dismissed.push({\n gap,\n reason: result.reasoning,\n });\n aiDismissed++;\n }\n }\n\n return {\n verified,\n dismissed,\n stats: {\n total: gaps.length,\n preFiltered: preFiltered.length,\n aiDismissed,\n aiVerified,\n },\n };\n }\n\n /**\n * Pre-filter gaps that are obviously false positives without needing AI.\n */\n private preFilter(\n gaps: Gap[]\n ): { toVerify: Gap[]; preFiltered: Array<{ gap: Gap; reason: string }> } {\n const toVerify: Gap[] = [];\n const preFiltered: Array<{ gap: Gap; reason: string }> = [];\n\n for (const gap of gaps) {\n // Check path patterns\n const pathMatch = SKIP_PATTERNS.paths.find((p) => p.test(gap.filePath));\n if (pathMatch) {\n preFiltered.push({\n gap,\n reason: `Skipped: test/example file (${pathMatch.source})`,\n });\n continue;\n }\n\n // Check if it's a type definition or interface\n if (gap.categoryId === \"precision-loss\" && gap.filePath.endsWith(\".ts\")) {\n // TypeScript type annotations are not runtime vulnerabilities\n preFiltered.push({\n gap,\n reason: \"TypeScript type annotation, not runtime code\",\n });\n continue;\n }\n\n toVerify.push(gap);\n }\n\n return { toVerify, preFiltered };\n }\n\n /**\n * Create batches of gaps for batch API calls.\n */\n private createBatches(\n gaps: Gap[],\n fileContents: Map<string, string>\n ): Array<{ prompt: string; gapIds: string[] }> {\n const batches: Array<{ prompt: string; gapIds: string[] }> = [];\n\n for (let i = 0; i < gaps.length; i += this.batchSize) {\n const batchGaps = gaps.slice(i, i + this.batchSize);\n const items: string[] = [];\n const gapIds: string[] = [];\n\n for (let j = 0; j < batchGaps.length; j++) {\n const gap = batchGaps[j]!;\n const content = fileContents.get(gap.filePath) ?? \"\";\n const gapId = `${gap.filePath}:${gap.lineStart}`;\n gapIds.push(gapId);\n\n const codeContext = this.extractContext(content, gap.lineStart, 10);\n const flaggedLine = this.extractLine(content, gap.lineStart);\n\n items.push(\n SINGLE_ITEM_TEMPLATE\n .replace(\"{{id}}\", String(j + 1))\n .replace(\"{{category}}\", gap.categoryName)\n .replace(\"{{filePath}}\", gap.filePath)\n .replace(\"{{lineNumber}}\", String(gap.lineStart))\n .replace(\"{{language}}\", this.getLanguage(gap.filePath))\n .replace(\"{{codeContext}}\", codeContext)\n .replace(\"{{flaggedLine}}\", flaggedLine)\n );\n }\n\n const prompt = BATCH_PROMPT.replace(\"{{items}}\", items.join(\"\\n\"));\n batches.push({ prompt, gapIds });\n }\n\n return batches;\n }\n\n /**\n * Process batches in parallel with limited concurrency.\n */\n private async processParallel(\n batches: Array<{ prompt: string; gapIds: string[] }>,\n gaps: Gap[]\n ): Promise<Map<string, BatchVerificationResult>> {\n const results = new Map<string, BatchVerificationResult>();\n let completed = 0;\n const startTime = Date.now();\n const waveTimes: number[] = [];\n\n // Process in waves of `concurrency` batches\n for (let i = 0; i < batches.length; i += this.concurrency) {\n const waveStart = Date.now();\n const wave = batches.slice(i, i + this.concurrency);\n\n const waveResults = await Promise.all(\n wave.map(async (batch) => {\n try {\n const response = await this.callAI(batch.prompt);\n return { gapIds: batch.gapIds, response };\n } catch (error) {\n console.error(`Batch failed: ${error instanceof Error ? error.message : String(error)}`);\n return { gapIds: batch.gapIds, response: null };\n }\n })\n );\n\n // Parse results\n for (const { gapIds, response } of waveResults) {\n if (response) {\n const parsed = this.parseBatchResponse(response);\n for (let j = 0; j < gapIds.length && j < parsed.length; j++) {\n const gapId = gapIds[j]!;\n const result = parsed[j];\n if (result) {\n results.set(gapId, result);\n }\n }\n }\n }\n\n completed += wave.length;\n const waveTime = Date.now() - waveStart;\n waveTimes.push(waveTime);\n\n // Calculate ETA based on rolling average of last 5 waves\n const recentWaves = waveTimes.slice(-5);\n const avgWaveTime = recentWaves.reduce((a, b) => a + b, 0) / recentWaves.length;\n const remainingWaves = Math.ceil((batches.length - completed) / this.concurrency);\n const etaMs = avgWaveTime * remainingWaves;\n const etaStr = this.formatDuration(etaMs);\n const elapsedStr = this.formatDuration(Date.now() - startTime);\n \n console.log(`Processed ${completed}/${batches.length} batches... (${elapsedStr} elapsed, ~${etaStr} remaining)`);\n }\n\n return results;\n }\n\n private extractContext(content: string, lineNumber: number, radius: number): string {\n const lines = content.split(\"\\n\");\n const start = Math.max(0, lineNumber - radius - 1);\n const end = Math.min(lines.length, lineNumber + radius);\n\n return lines\n .slice(start, end)\n .map((line, i) => {\n const num = start + i + 1;\n const marker = num === lineNumber ? \">\" : \" \";\n return `${marker}${num.toString().padStart(4)}| ${line}`;\n })\n .join(\"\\n\");\n }\n\n private extractLine(content: string, lineNumber: number): string {\n const lines = content.split(\"\\n\");\n return lines[lineNumber - 1] ?? \"\";\n }\n\n private formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n if (minutes < 60) return `${minutes}m ${remainingSeconds}s`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}m`;\n }\n\n private getLanguage(filePath: string): string {\n if (filePath.endsWith(\".ts\") || filePath.endsWith(\".tsx\")) return \"typescript\";\n if (filePath.endsWith(\".js\") || filePath.endsWith(\".jsx\")) return \"javascript\";\n if (filePath.endsWith(\".py\")) return \"python\";\n if (filePath.endsWith(\".go\")) return \"go\";\n return \"text\";\n }\n\n private async callAI(prompt: string): Promise<string> {\n const apiKey = this.config.apiKey ?? this.getApiKeyFromEnv();\n\n if (!apiKey) {\n throw new Error(`No API key configured for ${this.config.provider}`);\n }\n\n if (this.config.provider === \"anthropic\") {\n return this.callAnthropic(prompt, apiKey);\n } else {\n return this.callOpenAI(prompt, apiKey);\n }\n }\n\n private async callAnthropic(prompt: string, apiKey: string): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 60000); // 60s for batches\n\n try {\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: this.config.model ?? \"claude-sonnet-4-20250514\",\n max_tokens: 4096, // Larger for batch responses\n messages: [{ role: \"user\", content: prompt }],\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Anthropic API error: ${response.status} - ${body}`);\n }\n\n const data = (await response.json()) as {\n content: Array<{ type: string; text: string }>;\n };\n return data.content[0]?.text ?? \"\";\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private async callOpenAI(prompt: string, apiKey: string): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 60000); // 60s for batches\n\n try {\n const response = await fetch(\"https://api.openai.com/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model ?? \"gpt-4o\",\n messages: [{ role: \"user\", content: prompt }],\n max_tokens: 4096,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${body}`);\n }\n\n const data = (await response.json()) as {\n choices: Array<{ message: { content: string } }>;\n };\n return data.choices[0]?.message?.content ?? \"\";\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private getApiKeyFromEnv(): string {\n if (this.config.provider === \"anthropic\") {\n return process.env[\"ANTHROPIC_API_KEY\"] ?? \"\";\n }\n return process.env[\"OPENAI_API_KEY\"] ?? \"\";\n }\n\n private parseBatchResponse(response: string): BatchVerificationResult[] {\n try {\n // Extract JSON array from response\n const jsonMatch = response.match(/\\[[\\s\\S]*\\]/);\n if (!jsonMatch) {\n console.error(\"No JSON array found in batch response\");\n return [];\n }\n\n const parsed = JSON.parse(jsonMatch[0]) as BatchVerificationResult[];\n\n return parsed.map((item) => ({\n id: String(item.id),\n isVulnerable: Boolean(item.isVulnerable),\n confidence: item.confidence ?? \"medium\",\n reasoning: item.reasoning ?? \"No reasoning provided\",\n }));\n } catch (error) {\n console.error(`Failed to parse batch response: ${error instanceof Error ? error.message : String(error)}`);\n return [];\n }\n }\n\n /**\n * Legacy single-gap verification (kept for backwards compatibility).\n */\n async verify(gap: Gap, fileContent: string): Promise<VerificationResult> {\n const result = await this.verifyAll([gap], async () => fileContent);\n if (result.verified.length > 0) {\n return {\n isVulnerable: true,\n confidence: \"high\",\n reasoning: \"AI confirmed vulnerability\",\n mitigatingFactors: [],\n exploitScenario: null,\n recommendation: \"Fix this issue\",\n };\n }\n const dismissal = result.dismissed[0];\n return {\n isVulnerable: false,\n confidence: \"high\",\n reasoning: dismissal?.reason ?? \"AI dismissed as false positive\",\n mitigatingFactors: [],\n exploitScenario: null,\n recommendation: \"No action needed\",\n };\n }\n}\n","export { AIVerifier, type VerificationResult, type AIVerifierConfig } from \"./ai-verifier.js\";\n","/**\n * Layer 5: Dynamic Execution Types\n */\n\nimport type { Gap } from \"../core/scanner/types.js\";\n\n/** Execution environment configuration */\nexport interface SandboxConfig {\n /** Docker image to use */\n image: string;\n /** CPU limit (e.g., \"1\") */\n cpuLimit: string;\n /** Memory limit (e.g., \"512m\") */\n memoryLimit: string;\n /** Execution timeout in seconds */\n timeoutSeconds: number;\n /** Allow network access (dangerous, default false) */\n networkEnabled: boolean;\n /** Working directory inside container */\n workDir: string;\n}\n\n/** Default sandbox configuration - secure by default */\nexport const DEFAULT_SANDBOX_CONFIG: SandboxConfig = {\n image: \"pinata-sandbox:latest\",\n cpuLimit: \"1\",\n memoryLimit: \"512m\",\n timeoutSeconds: 30,\n networkEnabled: false,\n workDir: \"/sandbox\",\n};\n\n/** Test execution request */\nexport interface ExecutionRequest {\n /** Gap being tested */\n gap: Gap;\n /** Generated test code */\n testCode: string;\n /** Target file content */\n targetCode: string;\n /** Test framework to use */\n framework: TestFramework;\n /** Language runtime */\n language: ExecutionLanguage;\n /** Optional sandbox config overrides */\n sandboxConfig?: Partial<SandboxConfig>;\n}\n\n/** Supported test frameworks */\nexport type TestFramework = \"vitest\" | \"jest\" | \"pytest\" | \"go-test\";\n\n/** Supported execution languages */\nexport type ExecutionLanguage = \"typescript\" | \"javascript\" | \"python\" | \"go\";\n\n/** Execution result status */\nexport type ExecutionStatus = \n | \"confirmed\" // Vulnerability exploited successfully\n | \"unconfirmed\" // Test ran but exploit failed\n | \"error\" // Execution failed (timeout, crash, etc.)\n | \"skipped\"; // Not applicable for dynamic testing\n\n/** Single test execution result */\nexport interface ExecutionResult {\n /** Status of the execution */\n status: ExecutionStatus;\n /** Gap that was tested */\n gap: Gap;\n /** Human-readable summary */\n summary: string;\n /** Detailed evidence (stdout, payloads, etc.) */\n evidence?: ExecutionEvidence;\n /** Execution duration in milliseconds */\n durationMs: number;\n /** Error message if status is \"error\" */\n error?: string;\n}\n\n/** Evidence from successful exploitation */\nexport interface ExecutionEvidence {\n /** Payload that triggered the vulnerability */\n payload: string;\n /** Expected result (what safe code would do) */\n expected: string;\n /** Actual result (what vulnerable code did) */\n actual: string;\n /** Raw stdout from test execution */\n stdout: string;\n /** Raw stderr from test execution */\n stderr: string;\n /** Exit code */\n exitCode: number;\n}\n\n/** Batch execution summary */\nexport interface ExecutionSummary {\n /** Total gaps tested */\n total: number;\n /** Confirmed vulnerabilities */\n confirmed: number;\n /** Unconfirmed (false positives or bad tests) */\n unconfirmed: number;\n /** Errors during execution */\n errors: number;\n /** Skipped (not testable dynamically) */\n skipped: number;\n /** Individual results */\n results: ExecutionResult[];\n /** Total duration */\n durationMs: number;\n}\n\n/** Docker container state */\nexport interface ContainerState {\n /** Container ID */\n id: string;\n /** Current status */\n status: \"created\" | \"running\" | \"exited\" | \"error\";\n /** Exit code if exited */\n exitCode?: number;\n /** Start time */\n startedAt?: Date;\n /** End time */\n finishedAt?: Date;\n}\n\n/** Vulnerability types that are dynamically testable */\nexport const TESTABLE_VULNERABILITIES = [\n \"sql-injection\",\n \"xss\",\n \"command-injection\",\n \"path-traversal\",\n \"ssrf\",\n \"deserialization\",\n] as const;\n\nexport type TestableVulnerability = typeof TESTABLE_VULNERABILITIES[number];\n\n/** Check if a category is dynamically testable */\nexport function isTestable(categoryId: string): boolean {\n return TESTABLE_VULNERABILITIES.includes(categoryId as TestableVulnerability);\n}\n","/**\n * Layer 5: Docker Sandbox Management\n * \n * Creates and manages isolated Docker containers for safe test execution.\n * Security-first design: no network, limited resources, unprivileged user.\n */\n\nimport { spawn } from \"child_process\";\nimport { mkdtemp, writeFile, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { tmpdir } from \"os\";\n\nimport type { \n SandboxConfig, \n ContainerState, \n ExecutionLanguage,\n TestFramework \n} from \"./types.js\";\nimport { DEFAULT_SANDBOX_CONFIG } from \"./types.js\";\n\n/** Sandbox manager for Docker-based test execution */\nexport class Sandbox {\n private config: SandboxConfig;\n private tempDir: string | null = null;\n private containerId: string | null = null;\n\n constructor(config: Partial<SandboxConfig> = {}) {\n this.config = { ...DEFAULT_SANDBOX_CONFIG, ...config };\n }\n\n /**\n * Check if Docker is available\n */\n async isDockerAvailable(): Promise<boolean> {\n try {\n const result = await this.exec(\"docker\", [\"version\", \"--format\", \"{{.Server.Version}}\"]);\n return result.exitCode === 0;\n } catch {\n return false;\n }\n }\n\n /**\n * Check if sandbox image exists, build if not\n */\n async ensureImage(): Promise<boolean> {\n const result = await this.exec(\"docker\", [\"image\", \"inspect\", this.config.image]);\n \n if (result.exitCode !== 0) {\n console.log(`Sandbox image ${this.config.image} not found. Building...`);\n return this.buildImage();\n }\n \n return true;\n }\n\n /**\n * Build the sandbox Docker image\n */\n private async buildImage(): Promise<boolean> {\n const dockerfile = this.generateDockerfile();\n \n // Create temp directory for build context\n const buildDir = await mkdtemp(join(tmpdir(), \"pinata-sandbox-\"));\n await writeFile(join(buildDir, \"Dockerfile\"), dockerfile);\n \n try {\n const result = await this.exec(\"docker\", [\n \"build\",\n \"-t\", this.config.image,\n buildDir,\n ], { timeout: 120000 }); // 2 min build timeout\n \n return result.exitCode === 0;\n } finally {\n await rm(buildDir, { recursive: true, force: true });\n }\n }\n\n /**\n * Generate Dockerfile for sandbox\n */\n private generateDockerfile(): string {\n return `\nFROM node:20-slim\n\n# Security: run as non-root user\nRUN groupadd -r sandbox && useradd -r -g sandbox sandbox\n\n# Install test frameworks\nRUN npm install -g vitest@2 @vitest/ui typescript tsx\n\n# Create sandbox directory\nWORKDIR /sandbox\nRUN chown sandbox:sandbox /sandbox\n\n# Switch to non-root user\nUSER sandbox\n\n# Default command\nCMD [\"sh\"]\n`.trim();\n }\n\n /**\n * Prepare sandbox with test files\n */\n async prepare(\n testCode: string,\n targetCode: string,\n language: ExecutionLanguage\n ): Promise<string> {\n // Create temp directory for this execution\n this.tempDir = await mkdtemp(join(tmpdir(), \"pinata-exec-\"));\n \n // Write test and target files\n const testFile = language === \"python\" ? \"test_exploit.py\" : \"exploit.test.ts\";\n const targetFile = language === \"python\" ? \"target.py\" : \"target.ts\";\n \n await writeFile(join(this.tempDir, testFile), testCode);\n await writeFile(join(this.tempDir, targetFile), targetCode);\n \n // Write minimal package.json for Node.js\n if (language === \"typescript\" || language === \"javascript\") {\n await writeFile(join(this.tempDir, \"package.json\"), JSON.stringify({\n name: \"pinata-exploit-test\",\n type: \"module\",\n scripts: {\n test: \"vitest run --reporter=json\",\n },\n }, null, 2));\n \n // Write vitest config\n await writeFile(join(this.tempDir, \"vitest.config.ts\"), `\nimport { defineConfig } from 'vitest/config';\nexport default defineConfig({\n test: {\n globals: true,\n testTimeout: 10000,\n },\n});\n`);\n }\n \n return this.tempDir;\n }\n\n /**\n * Run test in sandbox container\n */\n async run(framework: TestFramework): Promise<{\n stdout: string;\n stderr: string;\n exitCode: number;\n timedOut: boolean;\n }> {\n if (!this.tempDir) {\n throw new Error(\"Sandbox not prepared. Call prepare() first.\");\n }\n\n const args = this.buildDockerArgs(framework);\n \n const result = await this.exec(\"docker\", args, {\n timeout: this.config.timeoutSeconds * 1000,\n });\n\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n timedOut: result.timedOut,\n };\n }\n\n /**\n * Build Docker run arguments with security constraints\n */\n private buildDockerArgs(framework: TestFramework): string[] {\n const testCommand = this.getTestCommand(framework);\n \n const args = [\n \"run\",\n \"--rm\", // Remove container after exit\n \"--cpus\", this.config.cpuLimit, // CPU limit\n \"--memory\", this.config.memoryLimit, // Memory limit\n \"--read-only\", // Read-only root filesystem\n \"--tmpfs\", \"/tmp:rw,size=64m,mode=1777\", // Writable tmp\n \"--user\", \"1000:1000\", // Non-root user\n \"--cap-drop\", \"ALL\", // Drop all capabilities\n \"--security-opt\", \"no-new-privileges\", // No privilege escalation\n \"-v\", `${this.tempDir}:${this.config.workDir}:rw`, // Mount test files\n \"-w\", this.config.workDir, // Working directory\n ];\n\n // Network isolation (default: no network)\n if (!this.config.networkEnabled) {\n args.push(\"--network\", \"none\");\n }\n\n // Add image and command\n args.push(this.config.image);\n args.push(...testCommand);\n\n return args;\n }\n\n /**\n * Get test command for framework\n */\n private getTestCommand(framework: TestFramework): string[] {\n switch (framework) {\n case \"vitest\":\n return [\"npx\", \"vitest\", \"run\", \"--reporter=json\"];\n case \"jest\":\n return [\"npx\", \"jest\", \"--json\"];\n case \"pytest\":\n return [\"python\", \"-m\", \"pytest\", \"-v\", \"--tb=short\"];\n case \"go-test\":\n return [\"go\", \"test\", \"-v\", \"-json\"];\n default:\n return [\"npx\", \"vitest\", \"run\"];\n }\n }\n\n /**\n * Cleanup sandbox resources\n */\n async cleanup(): Promise<void> {\n if (this.tempDir) {\n try {\n await rm(this.tempDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n this.tempDir = null;\n }\n\n if (this.containerId) {\n try {\n await this.exec(\"docker\", [\"rm\", \"-f\", this.containerId]);\n } catch {\n // Ignore cleanup errors\n }\n this.containerId = null;\n }\n }\n\n /**\n * Execute a command and capture output\n */\n private exec(\n command: string,\n args: string[],\n options: { timeout?: number } = {}\n ): Promise<{\n stdout: string;\n stderr: string;\n exitCode: number;\n timedOut: boolean;\n }> {\n return new Promise((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n\n const proc = spawn(command, args, {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n proc.stdout?.on(\"data\", (data) => {\n stdout += data.toString();\n });\n\n proc.stderr?.on(\"data\", (data) => {\n stderr += data.toString();\n });\n\n const timeout = options.timeout ?? 30000;\n const timer = setTimeout(() => {\n timedOut = true;\n proc.kill(\"SIGKILL\");\n }, timeout);\n\n proc.on(\"close\", (code) => {\n clearTimeout(timer);\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 1,\n timedOut,\n });\n });\n\n proc.on(\"error\", (err) => {\n clearTimeout(timer);\n resolve({\n stdout,\n stderr: stderr + \"\\n\" + err.message,\n exitCode: 1,\n timedOut: false,\n });\n });\n });\n }\n}\n\n/**\n * Create a new sandbox instance\n */\nexport function createSandbox(config?: Partial<SandboxConfig>): Sandbox {\n return new Sandbox(config);\n}\n","/**\n * Layer 5: Result Parsing\n * \n * Parses test execution output to determine if vulnerability was confirmed.\n */\n\nimport type { \n ExecutionResult, \n ExecutionStatus, \n ExecutionEvidence,\n TestFramework \n} from \"./types.js\";\nimport type { Gap } from \"../core/scanner/types.js\";\n\n/** Raw execution output */\ninterface RawOutput {\n stdout: string;\n stderr: string;\n exitCode: number;\n timedOut: boolean;\n}\n\n/**\n * Parse test execution results\n */\nexport function parseResults(\n raw: RawOutput,\n gap: Gap,\n framework: TestFramework\n): Omit<ExecutionResult, \"durationMs\"> {\n // Handle timeout\n if (raw.timedOut) {\n return {\n status: \"error\",\n gap,\n summary: \"Execution timed out\",\n error: \"Test execution exceeded time limit\",\n evidence: {\n payload: \"\",\n expected: \"\",\n actual: \"\",\n stdout: raw.stdout,\n stderr: raw.stderr,\n exitCode: raw.exitCode,\n },\n };\n }\n\n // Parse based on framework\n switch (framework) {\n case \"vitest\":\n case \"jest\":\n return parseVitestResults(raw, gap);\n case \"pytest\":\n return parsePytestResults(raw, gap);\n case \"go-test\":\n return parseGoTestResults(raw, gap);\n default:\n return parseGenericResults(raw, gap);\n }\n}\n\n/**\n * Parse Vitest/Jest JSON output\n */\nfunction parseVitestResults(\n raw: RawOutput,\n gap: Gap\n): Omit<ExecutionResult, \"durationMs\"> {\n const evidence: ExecutionEvidence = {\n payload: extractPayload(raw.stdout) ?? \"\",\n expected: \"\",\n actual: \"\",\n stdout: raw.stdout,\n stderr: raw.stderr,\n exitCode: raw.exitCode,\n };\n\n // Try to parse JSON output\n try {\n // Find JSON in output (vitest outputs JSON after some text)\n const jsonMatch = raw.stdout.match(/\\{[\\s\\S]*\"testResults\"[\\s\\S]*\\}/);\n if (jsonMatch) {\n const json = JSON.parse(jsonMatch[0]) as {\n success?: boolean;\n numPassedTests?: number;\n numFailedTests?: number;\n testResults?: Array<{\n assertionResults?: Array<{\n status: string;\n title: string;\n failureMessages?: string[];\n }>;\n }>;\n };\n\n // Check if exploit tests passed (vulnerability confirmed)\n const exploitPassed = json.testResults?.some((result) =>\n result.assertionResults?.some(\n (a) => a.status === \"passed\" && a.title.toLowerCase().includes(\"exploit\")\n )\n );\n\n if (exploitPassed) {\n return {\n status: \"confirmed\",\n gap,\n summary: \"Exploit test passed - vulnerability confirmed\",\n evidence,\n };\n }\n\n // Check for test failures (vulnerability not exploitable)\n if (json.numFailedTests && json.numFailedTests > 0) {\n const failureMsg = json.testResults\n ?.flatMap((r) => r.assertionResults ?? [])\n .find((a) => a.status === \"failed\")?.failureMessages?.[0];\n\n return {\n status: \"unconfirmed\",\n gap,\n summary: `Exploit failed: ${failureMsg ?? \"test assertions failed\"}`,\n evidence,\n };\n }\n\n // All tests passed but no explicit exploit test\n if (json.success || (json.numPassedTests ?? 0) > 0) {\n return {\n status: \"confirmed\",\n gap,\n summary: \"All tests passed - vulnerability likely confirmed\",\n evidence,\n };\n }\n }\n } catch {\n // JSON parsing failed, fall back to exit code\n }\n\n // Fall back to exit code interpretation\n // Exit 0 = tests passed = vulnerability confirmed (our tests assert exploitability)\n // Exit 1 = tests failed = vulnerability not exploitable\n if (raw.exitCode === 0) {\n return {\n status: \"confirmed\",\n gap,\n summary: \"Tests passed (exit 0) - vulnerability confirmed\",\n evidence,\n };\n }\n\n return {\n status: \"unconfirmed\",\n gap,\n summary: `Tests failed (exit ${raw.exitCode}) - could not confirm vulnerability`,\n evidence,\n };\n}\n\n/**\n * Parse pytest output\n */\nfunction parsePytestResults(\n raw: RawOutput,\n gap: Gap\n): Omit<ExecutionResult, \"durationMs\"> {\n const evidence: ExecutionEvidence = {\n payload: extractPayload(raw.stdout) ?? \"\",\n expected: \"\",\n actual: \"\",\n stdout: raw.stdout,\n stderr: raw.stderr,\n exitCode: raw.exitCode,\n };\n\n // Check for passed tests\n const passedMatch = raw.stdout.match(/(\\d+) passed/);\n const failedMatch = raw.stdout.match(/(\\d+) failed/);\n\n const passed = passedMatch ? parseInt(passedMatch[1]!, 10) : 0;\n const failed = failedMatch ? parseInt(failedMatch[1]!, 10) : 0;\n\n if (passed > 0 && failed === 0) {\n return {\n status: \"confirmed\",\n gap,\n summary: `${passed} exploit tests passed - vulnerability confirmed`,\n evidence,\n };\n }\n\n if (failed > 0) {\n // Extract failure reason\n const assertionError = raw.stdout.match(/AssertionError: (.+)/);\n return {\n status: \"unconfirmed\",\n gap,\n summary: assertionError \n ? `Exploit failed: ${assertionError[1]}`\n : `${failed} tests failed - could not confirm vulnerability`,\n evidence,\n };\n }\n\n // No clear result\n return {\n status: \"error\",\n gap,\n summary: \"Could not parse test results\",\n evidence,\n error: \"Unexpected pytest output format\",\n };\n}\n\n/**\n * Parse go test output\n */\nfunction parseGoTestResults(\n raw: RawOutput,\n gap: Gap\n): Omit<ExecutionResult, \"durationMs\"> {\n const evidence: ExecutionEvidence = {\n payload: extractPayload(raw.stdout) ?? \"\",\n expected: \"\",\n actual: \"\",\n stdout: raw.stdout,\n stderr: raw.stderr,\n exitCode: raw.exitCode,\n };\n\n // Check for PASS/FAIL in output\n if (raw.stdout.includes(\"PASS\") && !raw.stdout.includes(\"FAIL\")) {\n return {\n status: \"confirmed\",\n gap,\n summary: \"Go tests passed - vulnerability confirmed\",\n evidence,\n };\n }\n\n if (raw.stdout.includes(\"FAIL\")) {\n return {\n status: \"unconfirmed\",\n gap,\n summary: \"Go tests failed - could not confirm vulnerability\",\n evidence,\n };\n }\n\n return parseGenericResults(raw, gap);\n}\n\n/**\n * Generic result parsing based on exit code\n */\nfunction parseGenericResults(\n raw: RawOutput,\n gap: Gap\n): Omit<ExecutionResult, \"durationMs\"> {\n const evidence: ExecutionEvidence = {\n payload: extractPayload(raw.stdout) ?? \"\",\n expected: \"\",\n actual: \"\",\n stdout: raw.stdout,\n stderr: raw.stderr,\n exitCode: raw.exitCode,\n };\n\n if (raw.exitCode === 0) {\n return {\n status: \"confirmed\",\n gap,\n summary: \"Execution succeeded (exit 0) - vulnerability likely confirmed\",\n evidence,\n };\n }\n\n return {\n status: \"unconfirmed\",\n gap,\n summary: `Execution failed (exit ${raw.exitCode})`,\n evidence,\n };\n}\n\n/**\n * Extract payload from test output\n */\nfunction extractPayload(output: string): string | null {\n // Look for common payload markers in output\n const patterns = [\n /payload[:\\s]+[\"']([^\"']+)[\"']/i,\n /injecting[:\\s]+[\"']([^\"']+)[\"']/i,\n /testing[:\\s]+[\"']([^\"']+)[\"']/i,\n /UNION SELECT/i,\n /' OR '1'='1/i,\n /; DROP TABLE/i,\n /<script>/i,\n /\\$\\(.*\\)/,\n /`.*`/,\n ];\n\n for (const pattern of patterns) {\n const match = output.match(pattern);\n if (match) {\n return match[1] ?? match[0];\n }\n }\n\n return null;\n}\n","/**\n * Layer 5: Exploit Test Generator\n * \n * Generates executable exploit tests for specific vulnerability types.\n */\n\nimport type { Gap } from \"../core/scanner/types.js\";\nimport type { ExecutionLanguage } from \"./types.js\";\n\n/**\n * Generate exploit test code for a gap\n */\nexport function generateExploitTest(\n gap: Gap,\n targetCode: string,\n language: ExecutionLanguage\n): string {\n const categoryId = gap.categoryId;\n\n // Route to specific generator\n switch (categoryId) {\n case \"sql-injection\":\n return generateSqlInjectionTest(gap, targetCode, language);\n case \"xss\":\n return generateXssTest(gap, targetCode, language);\n case \"command-injection\":\n return generateCommandInjectionTest(gap, targetCode, language);\n case \"path-traversal\":\n return generatePathTraversalTest(gap, targetCode, language);\n default:\n return generateGenericTest(gap, targetCode, language);\n }\n}\n\n/**\n * Generate SQL injection exploit test\n */\nfunction generateSqlInjectionTest(\n gap: Gap,\n targetCode: string,\n language: ExecutionLanguage\n): string {\n if (language === \"python\") {\n return `\nimport pytest\nfrom target import *\n\nclass TestSqlInjectionExploit:\n \"\"\"Exploit tests for SQL injection at line ${gap.lineStart}\"\"\"\n \n PAYLOADS = [\n \"' OR '1'='1\",\n \"1; DROP TABLE users--\",\n \"1 UNION SELECT * FROM admin_users--\",\n \"1' AND '1'='1\",\n \"1' AND '1'='2\",\n ]\n \n def test_boolean_blind_injection(self):\n \"\"\"Test if boolean conditions affect query results.\"\"\"\n # True condition should return data\n result_true = execute_query(\"1' AND '1'='1\")\n # False condition should return different/no data\n result_false = execute_query(\"1' AND '1'='2\")\n \n # If injectable, results will differ\n assert result_true != result_false, \"Boolean blind injection confirmed\"\n \n def test_union_injection(self):\n \"\"\"Test if UNION attacks can extract additional data.\"\"\"\n payload = \"1 UNION SELECT username, password FROM users--\"\n result = execute_query(payload)\n \n # Should return more data than expected\n assert len(result) > 1 or 'password' in str(result).lower()\n \n def test_error_based_injection(self):\n \"\"\"Test if SQL errors are exposed.\"\"\"\n payload = \"'\" # Single quote to break syntax\n try:\n result = execute_query(payload)\n # If no error, check for error text in response\n assert 'syntax' not in str(result).lower()\n except Exception as e:\n # SQL error exposed - injection confirmed\n assert 'sql' in str(e).lower() or 'syntax' in str(e).lower()\n`.trim();\n }\n\n // TypeScript/JavaScript\n return `\nimport { describe, it, expect } from 'vitest';\n\n// Import target code\n// Note: Adjust import based on actual target structure\nconst targetCode = \\`${escapeTemplate(targetCode)}\\`;\n\ndescribe('SQL Injection Exploit - ${gap.filePath}:${gap.lineStart}', () => {\n const PAYLOADS = [\n \"' OR '1'='1\",\n \"1; DROP TABLE users--\",\n \"1 UNION SELECT * FROM admin_users--\",\n \"1' AND '1'='1\",\n \"1' AND '1'='2\",\n ];\n\n it('exploit: boolean blind injection', async () => {\n // Simulate the vulnerable code path\n const mockDb = {\n queries: [] as string[],\n query: async (sql: string) => {\n mockDb.queries.push(sql);\n // Return different results based on boolean logic in SQL\n if (sql.includes(\"'1'='1'\")) return [{ id: 1 }];\n if (sql.includes(\"'1'='2'\")) return [];\n return [{ id: 1 }];\n },\n };\n\n // Test with true condition\n const payloadTrue = \"1' AND '1'='1\";\n const queryTrue = \\`SELECT * FROM users WHERE id = '\\${payloadTrue}'\\`;\n const resultTrue = await mockDb.query(queryTrue);\n\n // Test with false condition\n const payloadFalse = \"1' AND '1'='2\";\n const queryFalse = \\`SELECT * FROM users WHERE id = '\\${payloadFalse}'\\`;\n const resultFalse = await mockDb.query(queryFalse);\n\n // Vulnerability confirmed if:\n // 1. Payload is included unescaped in query\n // 2. Results differ based on boolean logic\n expect(mockDb.queries[0]).toContain(payloadTrue);\n expect(resultTrue.length).not.toBe(resultFalse.length);\n });\n\n it('exploit: query contains unescaped input', () => {\n // Check if target code uses string concatenation/interpolation\n const vulnerablePatterns = [\n /\\\\$\\\\{.*\\\\}/, // Template literal interpolation\n /\\\\+ .*userId/, // String concatenation\n /query\\\\(.*\\\\+/, // Concatenation in query call\n /execute\\\\(.*\\\\$\\\\{/, // Template in execute\n ];\n\n const hasVulnerablePattern = vulnerablePatterns.some(p => p.test(targetCode));\n expect(hasVulnerablePattern).toBe(true);\n });\n});\n`.trim();\n}\n\n/**\n * Generate XSS exploit test\n */\nfunction generateXssTest(\n gap: Gap,\n targetCode: string,\n language: ExecutionLanguage\n): string {\n return `\nimport { describe, it, expect } from 'vitest';\n\ndescribe('XSS Exploit - ${gap.filePath}:${gap.lineStart}', () => {\n const PAYLOADS = [\n '<script>alert(\"XSS\")</script>',\n '<img src=x onerror=alert(\"XSS\")>',\n '\"><script>alert(\"XSS\")</script>',\n \"javascript:alert('XSS')\",\n '<svg onload=alert(\"XSS\")>',\n ];\n\n it('exploit: script tag injection', () => {\n const payload = '<script>alert(\"XSS\")</script>';\n const targetCode = \\`${escapeTemplate(targetCode)}\\`;\n \n // Check if target code escapes HTML\n const escapesHtml = targetCode.includes('escapeHtml') ||\n targetCode.includes('sanitize') ||\n targetCode.includes('DOMPurify') ||\n targetCode.includes('textContent');\n \n // Vulnerability confirmed if no escaping\n expect(escapesHtml).toBe(false);\n });\n\n it('exploit: innerHTML usage without sanitization', () => {\n const targetCode = \\`${escapeTemplate(targetCode)}\\`;\n \n const usesInnerHtml = targetCode.includes('innerHTML') ||\n targetCode.includes('outerHTML') ||\n targetCode.includes('dangerouslySetInnerHTML');\n \n const hasSanitization = targetCode.includes('sanitize') ||\n targetCode.includes('DOMPurify') ||\n targetCode.includes('escape');\n \n // Vulnerable: uses innerHTML without sanitization\n if (usesInnerHtml) {\n expect(hasSanitization).toBe(false);\n }\n });\n});\n`.trim();\n}\n\n/**\n * Generate command injection exploit test\n */\nfunction generateCommandInjectionTest(\n gap: Gap,\n targetCode: string,\n language: ExecutionLanguage\n): string {\n return `\nimport { describe, it, expect } from 'vitest';\n\ndescribe('Command Injection Exploit - ${gap.filePath}:${gap.lineStart}', () => {\n const PAYLOADS = [\n '; ls -la',\n '| cat /etc/passwd',\n '\\`whoami\\`',\n '$(id)',\n '&& echo PWNED',\n ];\n\n it('exploit: shell metacharacters in exec', () => {\n const targetCode = \\`${escapeTemplate(targetCode)}\\`;\n \n // Check for dangerous patterns\n const usesExec = targetCode.includes('exec(') ||\n targetCode.includes('execSync(') ||\n targetCode.includes('spawn(') ||\n targetCode.includes('child_process');\n \n const usesShell = targetCode.includes('shell: true') ||\n targetCode.includes('/bin/sh') ||\n targetCode.includes('/bin/bash');\n \n const hasInputInCommand = /exec.*\\\\$\\\\{|exec.*\\\\+.*req\\\\.|spawn.*\\\\$\\\\{/.test(targetCode);\n \n // Vulnerable: uses exec/spawn with user input\n if (usesExec && hasInputInCommand) {\n expect(usesShell || !targetCode.includes('escapeShell')).toBe(true);\n }\n });\n\n it('exploit: unescaped command arguments', () => {\n const targetCode = \\`${escapeTemplate(targetCode)}\\`;\n \n // Vulnerable patterns\n const vulnerablePatterns = [\n /exec\\\\(.*\\\\$\\\\{/,\n /execSync\\\\(.*\\\\+/,\n /spawn\\\\([^,]+,.*\\\\[.*\\\\$\\\\{/,\n ];\n \n const isVulnerable = vulnerablePatterns.some(p => p.test(targetCode));\n expect(isVulnerable).toBe(true);\n });\n});\n`.trim();\n}\n\n/**\n * Generate path traversal exploit test\n */\nfunction generatePathTraversalTest(\n gap: Gap,\n targetCode: string,\n language: ExecutionLanguage\n): string {\n return `\nimport { describe, it, expect } from 'vitest';\n\ndescribe('Path Traversal Exploit - ${gap.filePath}:${gap.lineStart}', () => {\n const PAYLOADS = [\n '../../../etc/passwd',\n '..\\\\\\\\..\\\\\\\\..\\\\\\\\windows\\\\\\\\system32\\\\\\\\config\\\\\\\\sam',\n '....//....//....//etc/passwd',\n '%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd',\n '..%252f..%252f..%252fetc/passwd',\n ];\n\n it('exploit: path contains user input without normalization', () => {\n const targetCode = \\`${escapeTemplate(targetCode)}\\`;\n \n // Check for path operations\n const usesPath = targetCode.includes('readFile') ||\n targetCode.includes('writeFile') ||\n targetCode.includes('fs.') ||\n targetCode.includes('path.join');\n \n // Check for protection\n const hasProtection = targetCode.includes('path.normalize') ||\n targetCode.includes('path.resolve') ||\n targetCode.includes('realpath') ||\n targetCode.includes('startsWith(baseDir)');\n \n // Vulnerable: file ops without path validation\n if (usesPath) {\n expect(hasProtection).toBe(false);\n }\n });\n});\n`.trim();\n}\n\n/**\n * Generate generic exploit test\n */\nfunction generateGenericTest(\n gap: Gap,\n targetCode: string,\n language: ExecutionLanguage\n): string {\n return `\nimport { describe, it, expect } from 'vitest';\n\ndescribe('Exploit Test - ${gap.categoryId} at ${gap.filePath}:${gap.lineStart}', () => {\n it('confirms vulnerability pattern exists', () => {\n const targetCode = \\`${escapeTemplate(targetCode)}\\`;\n \n // Generic check: vulnerable pattern is present\n // This test will pass if the pattern matches, confirming static detection\n expect(targetCode.length).toBeGreaterThan(0);\n });\n});\n`.trim();\n}\n\n/**\n * Escape template literal content\n */\nfunction escapeTemplate(code: string): string {\n return code\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/`/g, \"\\\\`\")\n .replace(/\\$/g, \"\\\\$\");\n}\n","/**\n * Layer 5: Test Execution Runner\n * \n * Orchestrates the execution of generated tests in sandboxed containers.\n */\n\nimport { createSandbox, Sandbox } from \"./sandbox.js\";\nimport { parseResults } from \"./results.js\";\nimport { generateExploitTest } from \"./generator.js\";\n\nimport type {\n ExecutionRequest,\n ExecutionResult,\n ExecutionSummary,\n SandboxConfig,\n ExecutionLanguage,\n TestFramework,\n} from \"./types.js\";\nimport { isTestable } from \"./types.js\";\nimport type { Gap } from \"../core/scanner/types.js\";\n\n/** Test execution runner */\nexport class ExecutionRunner {\n private sandbox: Sandbox;\n private dryRun: boolean;\n\n constructor(config?: Partial<SandboxConfig>, dryRun = false) {\n this.sandbox = createSandbox(config);\n this.dryRun = dryRun;\n }\n\n /**\n * Initialize the runner (check Docker, build image if needed)\n */\n async initialize(): Promise<{ ready: boolean; error?: string }> {\n // Check Docker availability\n const dockerAvailable = await this.sandbox.isDockerAvailable();\n if (!dockerAvailable) {\n return {\n ready: false,\n error: \"Docker not available. Install Docker to use --execute.\",\n };\n }\n\n // Ensure sandbox image exists\n const imageReady = await this.sandbox.ensureImage();\n if (!imageReady) {\n return {\n ready: false,\n error: \"Failed to build sandbox image.\",\n };\n }\n\n return { ready: true };\n }\n\n /**\n * Execute tests for a batch of gaps\n */\n async executeAll(\n gaps: Gap[],\n fileContents: Map<string, string>\n ): Promise<ExecutionSummary> {\n const startTime = Date.now();\n const results: ExecutionResult[] = [];\n\n // Filter to testable gaps only\n const testableGaps = gaps.filter((gap) => isTestable(gap.categoryId));\n const skippedCount = gaps.length - testableGaps.length;\n\n console.log(`\\nLayer 5: Dynamic Execution`);\n console.log(` ${testableGaps.length} testable gaps (${skippedCount} skipped)`);\n\n if (this.dryRun) {\n console.log(` DRY RUN: Generating tests without execution\\n`);\n }\n\n for (let i = 0; i < testableGaps.length; i++) {\n const gap = testableGaps[i]!;\n const content = fileContents.get(gap.filePath) ?? \"\";\n\n console.log(` [${i + 1}/${testableGaps.length}] ${gap.categoryId} at ${gap.filePath}:${gap.lineStart}`);\n\n const result = await this.executeOne(gap, content);\n results.push(result);\n\n // Log result\n const statusIcon = {\n confirmed: \"🔴 CONFIRMED\",\n unconfirmed: \"⚪ unconfirmed\",\n error: \"❌ error\",\n skipped: \"⏭️ skipped\",\n }[result.status];\n \n console.log(` ${statusIcon}: ${result.summary}`);\n }\n\n // Add skipped results for non-testable gaps\n for (const gap of gaps) {\n if (!isTestable(gap.categoryId)) {\n results.push({\n status: \"skipped\",\n gap,\n summary: `${gap.categoryId} not dynamically testable`,\n durationMs: 0,\n });\n }\n }\n\n const summary: ExecutionSummary = {\n total: gaps.length,\n confirmed: results.filter((r) => r.status === \"confirmed\").length,\n unconfirmed: results.filter((r) => r.status === \"unconfirmed\").length,\n errors: results.filter((r) => r.status === \"error\").length,\n skipped: results.filter((r) => r.status === \"skipped\").length,\n results,\n durationMs: Date.now() - startTime,\n };\n\n this.printSummary(summary);\n\n return summary;\n }\n\n /**\n * Execute test for a single gap\n */\n async executeOne(gap: Gap, targetCode: string): Promise<ExecutionResult> {\n const startTime = Date.now();\n\n try {\n // Generate exploit test\n const language = this.detectLanguage(gap.filePath);\n const framework = this.getFramework(language);\n const testCode = generateExploitTest(gap, targetCode, language);\n\n if (this.dryRun) {\n return {\n status: \"skipped\",\n gap,\n summary: \"Dry run - test generated but not executed\",\n durationMs: Date.now() - startTime,\n evidence: {\n payload: \"[dry run]\",\n expected: \"[dry run]\",\n actual: \"[dry run]\",\n stdout: testCode,\n stderr: \"\",\n exitCode: 0,\n },\n };\n }\n\n // Prepare sandbox\n await this.sandbox.prepare(testCode, targetCode, language);\n\n // Execute test\n const execResult = await this.sandbox.run(framework);\n\n // Parse results\n const parsed = parseResults(execResult, gap, framework);\n\n return {\n ...parsed,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n status: \"error\",\n gap,\n summary: `Execution failed: ${error instanceof Error ? error.message : String(error)}`,\n durationMs: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n };\n } finally {\n await this.sandbox.cleanup();\n }\n }\n\n /**\n * Detect language from file extension\n */\n private detectLanguage(filePath: string): ExecutionLanguage {\n if (filePath.endsWith(\".ts\") || filePath.endsWith(\".tsx\")) {\n return \"typescript\";\n }\n if (filePath.endsWith(\".js\") || filePath.endsWith(\".jsx\")) {\n return \"javascript\";\n }\n if (filePath.endsWith(\".py\")) {\n return \"python\";\n }\n if (filePath.endsWith(\".go\")) {\n return \"go\";\n }\n return \"typescript\"; // Default\n }\n\n /**\n * Get test framework for language\n */\n private getFramework(language: ExecutionLanguage): TestFramework {\n switch (language) {\n case \"typescript\":\n case \"javascript\":\n return \"vitest\";\n case \"python\":\n return \"pytest\";\n case \"go\":\n return \"go-test\";\n default:\n return \"vitest\";\n }\n }\n\n /**\n * Print execution summary\n */\n private printSummary(summary: ExecutionSummary): void {\n console.log(`\\n${\"─\".repeat(50)}`);\n console.log(`Dynamic Execution Summary`);\n console.log(`${\"─\".repeat(50)}`);\n console.log(` Total tested: ${summary.total}`);\n console.log(` 🔴 Confirmed: ${summary.confirmed}`);\n console.log(` ⚪ Unconfirmed: ${summary.unconfirmed}`);\n console.log(` ❌ Errors: ${summary.errors}`);\n console.log(` ⏭️ Skipped: ${summary.skipped}`);\n console.log(` Duration: ${(summary.durationMs / 1000).toFixed(1)}s`);\n console.log(`${\"─\".repeat(50)}\\n`);\n }\n}\n\n/**\n * Create a new execution runner\n */\nexport function createRunner(\n config?: Partial<SandboxConfig>,\n dryRun = false\n): ExecutionRunner {\n return new ExecutionRunner(config, dryRun);\n}\n","/**\n * Layer 5: Dynamic Execution\n * \n * Execute generated tests in sandboxed containers to confirm vulnerabilities.\n */\n\n// Types\nexport type {\n SandboxConfig,\n ExecutionRequest,\n ExecutionResult,\n ExecutionSummary,\n ExecutionStatus,\n ExecutionEvidence,\n ExecutionLanguage,\n TestFramework,\n ContainerState,\n TestableVulnerability,\n} from \"./types.js\";\n\nexport {\n DEFAULT_SANDBOX_CONFIG,\n TESTABLE_VULNERABILITIES,\n isTestable,\n} from \"./types.js\";\n\n// Sandbox\nexport { Sandbox, createSandbox } from \"./sandbox.js\";\n\n// Runner\nexport { ExecutionRunner, createRunner } from \"./runner.js\";\n\n// Results\nexport { parseResults } from \"./results.js\";\n\n// Generator\nexport { generateExploitTest } from \"./generator.js\";\n","/**\n * Pinata TUI Dashboard\n *\n * Interactive terminal interface for viewing scan results.\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport { Box, Text, useInput, useApp } from \"ink\";\nimport Spinner from \"ink-spinner\";\n\nimport type { Gap } from \"../../core/scanner/types.js\";\n\ninterface CachedResults {\n gaps: Gap[];\n targetDirectory: string;\n summary: {\n totalGaps: number;\n criticalGaps: number;\n highGaps: number;\n mediumGaps: number;\n lowGaps: number;\n score: number;\n grade: string;\n };\n}\n\ninterface AppProps {\n results: CachedResults | null;\n loading: boolean;\n error: string | null;\n}\n\ntype ViewMode = \"list\" | \"detail\";\n\nconst SEVERITY_COLORS: Record<string, string> = {\n critical: \"red\",\n high: \"yellow\",\n medium: \"blue\",\n low: \"gray\",\n};\n\nexport function App({ results, loading, error }: AppProps): React.ReactElement {\n const { exit } = useApp();\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [viewMode, setViewMode] = useState<ViewMode>(\"list\");\n const [scrollOffset, setScrollOffset] = useState(0);\n\n const gaps = results?.gaps ?? [];\n const maxVisible = 15;\n\n useInput((input, key) => {\n if (input === \"q\") {\n exit();\n return;\n }\n\n if (viewMode === \"list\") {\n if (key.downArrow || input === \"j\") {\n setSelectedIndex((prev) => {\n const next = Math.min(prev + 1, gaps.length - 1);\n if (next >= scrollOffset + maxVisible) {\n setScrollOffset(next - maxVisible + 1);\n }\n return next;\n });\n } else if (key.upArrow || input === \"k\") {\n setSelectedIndex((prev) => {\n const next = Math.max(prev - 1, 0);\n if (next < scrollOffset) {\n setScrollOffset(next);\n }\n return next;\n });\n } else if (key.return || input === \"l\") {\n setViewMode(\"detail\");\n }\n } else if (viewMode === \"detail\") {\n if (key.escape || input === \"h\" || input === \"q\") {\n setViewMode(\"list\");\n } else if (key.downArrow || input === \"j\") {\n setSelectedIndex((prev) => Math.min(prev + 1, gaps.length - 1));\n } else if (key.upArrow || input === \"k\") {\n setSelectedIndex((prev) => Math.max(prev - 1, 0));\n }\n }\n });\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n {\" \"}Loading scan results...\n </Text>\n </Box>\n );\n }\n\n if (error !== null) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\">Error: {error}</Text>\n <Text color=\"gray\">Run `pinata analyze` first to scan for gaps.</Text>\n <Text color=\"gray\" dimColor>Press q to exit</Text>\n </Box>\n );\n }\n\n if (results === null || gaps.length === 0) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"green\">No gaps found!</Text>\n <Text color=\"gray\">Your codebase looks clean.</Text>\n <Text color=\"gray\" dimColor>Press q to exit</Text>\n </Box>\n );\n }\n\n const selectedGap = gaps[selectedIndex];\n\n if (viewMode === \"detail\" && selectedGap !== undefined) {\n return <DetailView gap={selectedGap} index={selectedIndex} total={gaps.length} />;\n }\n\n return (\n <ListView\n results={results}\n gaps={gaps}\n selectedIndex={selectedIndex}\n scrollOffset={scrollOffset}\n maxVisible={maxVisible}\n />\n );\n}\n\ninterface ListViewProps {\n results: CachedResults;\n gaps: Gap[];\n selectedIndex: number;\n scrollOffset: number;\n maxVisible: number;\n}\n\nfunction ListView({\n results,\n gaps,\n selectedIndex,\n scrollOffset,\n maxVisible,\n}: ListViewProps): React.ReactElement {\n const visibleGaps = gaps.slice(scrollOffset, scrollOffset + maxVisible);\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">Pinata Dashboard</Text>\n <Text color=\"gray\"> - {results.targetDirectory}</Text>\n </Box>\n\n {/* Summary */}\n <Box marginBottom={1} flexDirection=\"row\" gap={2}>\n <Text>\n Score: <Text color={getGradeColor(results.summary.grade)} bold>{results.summary.grade}</Text>\n {\" \"}({results.summary.score})\n </Text>\n <Text color=\"gray\">|</Text>\n <Text>\n <Text color=\"red\">{results.summary.criticalGaps} critical</Text>\n {\" \"}\n <Text color=\"yellow\">{results.summary.highGaps} high</Text>\n {\" \"}\n <Text color=\"blue\">{results.summary.mediumGaps} medium</Text>\n {\" \"}\n <Text color=\"gray\">{results.summary.lowGaps} low</Text>\n </Text>\n </Box>\n\n {/* Gap list */}\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\">\n <Box paddingX={1} borderBottom borderColor=\"gray\">\n <Box width={4}><Text color=\"gray\">#</Text></Box>\n <Box width={12}><Text color=\"gray\">Severity</Text></Box>\n <Box width={24}><Text color=\"gray\">Category</Text></Box>\n <Box><Text color=\"gray\">Location</Text></Box>\n </Box>\n\n {visibleGaps.map((gap, i) => {\n const actualIndex = scrollOffset + i;\n const isSelected = actualIndex === selectedIndex;\n const color = SEVERITY_COLORS[gap.severity] ?? \"white\";\n\n return (\n <Box\n key={`${gap.filePath}:${gap.lineStart}:${gap.categoryId}`}\n paddingX={1}\n backgroundColor={isSelected ? \"blue\" : undefined}\n >\n <Box width={4}>\n <Text color={isSelected ? \"white\" : \"gray\"}>{actualIndex + 1}</Text>\n </Box>\n <Box width={12}>\n <Text color={isSelected ? \"white\" : color}>{gap.severity}</Text>\n </Box>\n <Box width={24}>\n <Text color={isSelected ? \"white\" : \"cyan\"}>\n {gap.categoryId.slice(0, 22)}\n </Text>\n </Box>\n <Box>\n <Text color={isSelected ? \"white\" : \"gray\"}>\n {formatPath(gap.filePath)}:{gap.lineStart}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n\n {/* Scroll indicator */}\n {gaps.length > maxVisible && (\n <Box marginTop={1}>\n <Text color=\"gray\">\n Showing {scrollOffset + 1}-{Math.min(scrollOffset + maxVisible, gaps.length)} of {gaps.length}\n </Text>\n </Box>\n )}\n\n {/* Help */}\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n j/k: navigate | Enter/l: details | q: quit\n </Text>\n </Box>\n </Box>\n );\n}\n\ninterface DetailViewProps {\n gap: Gap;\n index: number;\n total: number;\n}\n\nfunction DetailView({ gap, index, total }: DetailViewProps): React.ReactElement {\n const color = SEVERITY_COLORS[gap.severity] ?? \"white\";\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1} flexDirection=\"row\" justifyContent=\"space-between\">\n <Text bold color=\"cyan\">{gap.categoryName}</Text>\n <Text color=\"gray\">{index + 1}/{total}</Text>\n </Box>\n\n {/* Metadata */}\n <Box marginBottom={1} flexDirection=\"column\">\n <Text>\n <Text color=\"gray\">Severity: </Text>\n <Text color={color} bold>{gap.severity}</Text>\n <Text color=\"gray\"> | Confidence: </Text>\n <Text>{gap.confidence}</Text>\n <Text color=\"gray\"> | Priority: </Text>\n <Text>{gap.priority}</Text>\n </Text>\n <Text>\n <Text color=\"gray\">File: </Text>\n <Text color=\"cyan\">{gap.filePath}</Text>\n </Text>\n <Text>\n <Text color=\"gray\">Line: </Text>\n <Text>{gap.lineStart}</Text>\n {gap.lineEnd !== gap.lineStart && (\n <Text>-{gap.lineEnd}</Text>\n )}\n </Text>\n <Text>\n <Text color=\"gray\">Pattern: </Text>\n <Text>{gap.patternId}</Text>\n <Text color=\"gray\"> ({gap.patternType})</Text>\n </Text>\n </Box>\n\n {/* Code snippet */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n marginBottom={1}\n >\n <Text color=\"gray\" dimColor>Code:</Text>\n <Text>{gap.codeSnippet}</Text>\n </Box>\n\n {/* Explanation placeholder */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"gray\" dimColor>Explanation:</Text>\n <Text>\n This pattern detects potential {gap.categoryName.toLowerCase()} vulnerabilities.\n Review the code to ensure proper input validation and sanitization.\n </Text>\n </Box>\n\n {/* Help */}\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n j/k: prev/next | h/Esc: back to list | q: quit\n </Text>\n </Box>\n </Box>\n );\n}\n\nfunction formatPath(path: string): string {\n const parts = path.split(\"/\");\n if (parts.length <= 3) return path;\n return `.../${parts.slice(-2).join(\"/\")}`;\n}\n\nfunction getGradeColor(grade: string): string {\n switch (grade) {\n case \"A\": return \"green\";\n case \"B\": return \"cyan\";\n case \"C\": return \"yellow\";\n case \"D\": return \"red\";\n case \"F\": return \"red\";\n default: return \"white\";\n }\n}\n\nexport default App;\n","/**\n * TUI Dashboard Entry Point\n */\n\nimport React from \"react\";\nimport { render } from \"ink\";\n\nimport { App } from \"./App.js\";\nimport { loadScanResults } from \"../results-cache.js\";\n\nexport async function runDashboard(): Promise<void> {\n const projectRoot = process.cwd();\n\n // Start with loading state\n const { rerender, unmount, waitUntilExit } = render(\n <App results={null} loading={true} error={null} />\n );\n\n try {\n // Load cached results\n const result = await loadScanResults(projectRoot);\n\n if (!result.success) {\n rerender(<App results={null} loading={false} error={result.error.message} />);\n } else {\n const cached = result.data;\n rerender(\n <App\n results={{\n gaps: cached.gaps,\n targetDirectory: cached.targetDirectory,\n summary: {\n totalGaps: cached.gaps.length,\n criticalGaps: cached.gaps.filter((g) => g.severity === \"critical\").length,\n highGaps: cached.gaps.filter((g) => g.severity === \"high\").length,\n mediumGaps: cached.gaps.filter((g) => g.severity === \"medium\").length,\n lowGaps: cached.gaps.filter((g) => g.severity === \"low\").length,\n score: cached.score ?? 0,\n grade: cached.grade ?? \"?\",\n },\n }}\n loading={false}\n error={null}\n />\n );\n }\n\n await waitUntilExit();\n } catch (error) {\n rerender(\n <App\n results={null}\n loading={false}\n error={error instanceof Error ? error.message : \"Unknown error\"}\n />\n );\n await waitUntilExit();\n }\n}\n\nexport { App } from \"./App.js\";\n","import { z } from \"zod\";\n\n/**\n * Risk domains representing different areas of test coverage\n */\nexport const RiskDomainSchema = z.enum([\n \"security\",\n \"data\",\n \"concurrency\",\n \"input\",\n \"resource\",\n \"reliability\",\n \"performance\",\n \"platform\",\n \"business\",\n \"compliance\",\n]);\n\n/**\n * Test levels from unit to chaos engineering\n */\nexport const TestLevelSchema = z.enum([\n \"unit\",\n \"integration\",\n \"system\",\n \"chaos\",\n]);\n\n/**\n * Priority levels for categorizing importance\n */\nexport const PrioritySchema = z.enum([\"P0\", \"P1\", \"P2\"]);\n\n/**\n * Severity levels for gap findings\n */\nexport const SeveritySchema = z.enum([\"critical\", \"high\", \"medium\", \"low\"]);\n\n/**\n * Confidence levels for pattern detection\n */\nexport const ConfidenceSchema = z.enum([\"high\", \"medium\", \"low\"]);\n\n/**\n * Supported programming languages\n */\nexport const LanguageSchema = z.enum([\n \"python\",\n \"typescript\",\n \"javascript\",\n \"go\",\n \"java\",\n \"rust\",\n]);\n\n/**\n * Regex pattern for valid IDs (lowercase, alphanumeric with hyphens)\n */\nconst ID_PATTERN = /^[a-z][a-z0-9-]*$/;\n\n/**\n * Base category schema without nested types\n * Full CategorySchema is defined in index.ts to avoid circular imports\n */\nexport const CategoryBaseSchema = z.object({\n id: z\n .string()\n .regex(ID_PATTERN, \"ID must start with lowercase letter and contain only lowercase letters, numbers, and hyphens\"),\n version: z.number().int().positive(),\n name: z.string().min(1, \"Name is required\").max(100, \"Name too long\"),\n description: z\n .string()\n .min(10, \"Description must be at least 10 characters\")\n .max(2000, \"Description too long\"),\n domain: RiskDomainSchema,\n level: TestLevelSchema,\n priority: PrioritySchema,\n severity: SeveritySchema,\n applicableLanguages: z.array(LanguageSchema).min(1, \"At least one language required\"),\n cves: z.array(z.string()).optional(),\n references: z.array(z.string().url(\"Invalid URL\")).optional(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\n\n// Inferred types\nexport type RiskDomain = z.infer<typeof RiskDomainSchema>;\nexport type TestLevel = z.infer<typeof TestLevelSchema>;\nexport type Priority = z.infer<typeof PrioritySchema>;\nexport type Severity = z.infer<typeof SeveritySchema>;\nexport type Confidence = z.infer<typeof ConfidenceSchema>;\nexport type Language = z.infer<typeof LanguageSchema>;\nexport type CategoryBase = z.infer<typeof CategoryBaseSchema>;\n\n/**\n * All available risk domains\n */\nexport const RISK_DOMAINS = RiskDomainSchema.options;\n\n/**\n * All available test levels\n */\nexport const TEST_LEVELS = TestLevelSchema.options;\n\n/**\n * All available languages\n */\nexport const LANGUAGES = LanguageSchema.options;\n","import { z } from \"zod\";\n\nimport { LanguageSchema, SeveritySchema } from \"./category.schema.js\";\n\n/**\n * Regex pattern for valid IDs (lowercase, alphanumeric with hyphens)\n */\nconst ID_PATTERN = /^[a-z][a-z0-9-]*$/;\n\n/**\n * Schema for example vulnerable code and corresponding tests\n */\nexport const ExampleSchema = z.object({\n /** Unique identifier for this example */\n name: z\n .string()\n .regex(ID_PATTERN, \"Name must start with lowercase letter and contain only lowercase letters, numbers, and hyphens\"),\n\n /** Explanation of the vulnerability/edge case concept */\n concept: z.string().min(20, \"Concept must be at least 20 characters\"),\n\n /** Example of vulnerable or problematic code */\n vulnerableCode: z.string().min(10, \"Vulnerable code must be at least 10 characters\"),\n\n /** Example test code that catches this vulnerability */\n testCode: z.string().min(50, \"Test code must be at least 50 characters\"),\n\n /** Programming language of the example */\n language: LanguageSchema,\n\n /** Severity if this vulnerability is exploited */\n severity: SeveritySchema,\n\n /** Optional related CVE identifier */\n cve: z.string().optional(),\n\n /** Optional link to more information */\n reference: z.string().url().optional(),\n});\n\n// Inferred types\nexport type Example = z.infer<typeof ExampleSchema>;\n","import { z } from \"zod\";\n\nimport { ConfidenceSchema, LanguageSchema } from \"./category.schema.js\";\n\n/**\n * Types of detection patterns\n * - ast: Tree-sitter AST queries\n * - regex: Regular expression patterns\n * - semantic: LLM-assisted semantic analysis\n */\nexport const PatternTypeSchema = z.enum([\"ast\", \"regex\", \"semantic\"]);\n\n/**\n * Regex pattern for valid IDs (lowercase, alphanumeric with hyphens)\n */\nconst ID_PATTERN = /^[a-z][a-z0-9-]*$/;\n\n/**\n * Schema for detection patterns that identify code susceptible to a category\n */\nexport const DetectionPatternSchema = z.object({\n /** Unique identifier for this pattern */\n id: z\n .string()\n .regex(ID_PATTERN, \"ID must start with lowercase letter and contain only lowercase letters, numbers, and hyphens\"),\n\n /** Type of pattern matching to use */\n type: PatternTypeSchema,\n\n /** Target programming language */\n language: LanguageSchema,\n\n /** The pattern string (AST query, regex, or semantic description) */\n pattern: z.string().min(1, \"Pattern is required\"),\n\n /** How confident we are when this pattern matches */\n confidence: ConfidenceSchema,\n\n /** Human-readable description of what this pattern detects */\n description: z.string().min(10, \"Description must be at least 10 characters\"),\n\n /** Optional pattern that indicates code is NOT vulnerable (false positive filter) */\n negativePattern: z.string().optional(),\n\n /** Optional list of framework contexts where this pattern applies */\n frameworks: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for a detection result (pattern match in code)\n */\nexport const DetectionResultSchema = z.object({\n /** ID of the pattern that matched */\n patternId: z.string(),\n\n /** Category this detection belongs to */\n categoryId: z.string(),\n\n /** File path where detection occurred */\n filePath: z.string(),\n\n /** Starting line number (1-indexed) */\n lineStart: z.number().int().positive(),\n\n /** Ending line number (1-indexed) */\n lineEnd: z.number().int().positive(),\n\n /** Code snippet that matched */\n codeSnippet: z.string(),\n\n /** Confidence of this specific match */\n confidence: ConfidenceSchema,\n\n /** Optional additional context */\n context: z.record(z.unknown()).optional(),\n});\n\n// Inferred types\nexport type PatternType = z.infer<typeof PatternTypeSchema>;\nexport type DetectionPattern = z.infer<typeof DetectionPatternSchema>;\nexport type DetectionResult = z.infer<typeof DetectionResultSchema>;\n\n/**\n * All available pattern types\n */\nexport const PATTERN_TYPES = PatternTypeSchema.options;\n","import { z } from \"zod\";\n\nimport { LanguageSchema } from \"./category.schema.js\";\n\n/**\n * Supported test frameworks\n */\nexport const TestFrameworkSchema = z.enum([\n \"pytest\",\n \"unittest\",\n \"jest\",\n \"vitest\",\n \"mocha\",\n \"go-test\",\n \"junit\",\n]);\n\n/**\n * Types for template variables\n */\nexport const VariableTypeSchema = z.enum([\n \"string\",\n \"number\",\n \"boolean\",\n \"array\",\n \"object\",\n]);\n\n/**\n * Regex pattern for valid variable names (camelCase)\n */\nconst VARIABLE_NAME_PATTERN = /^[a-z][a-zA-Z0-9_]*$/;\n\n/**\n * Schema for template variables that get substituted during generation\n */\nexport const TemplateVariableSchema = z.object({\n /** Variable name (used in template as {{name}}) */\n name: z\n .string()\n .regex(VARIABLE_NAME_PATTERN, \"Variable name must be camelCase\"),\n\n /** Type of the variable value */\n type: VariableTypeSchema,\n\n /** Human-readable description */\n description: z.string().min(1, \"Description is required\"),\n\n /** Whether this variable must be provided */\n required: z.boolean().default(true),\n\n /** Default value if not provided */\n defaultValue: z.unknown().optional(),\n});\n\n/**\n * Regex pattern for valid IDs (lowercase, alphanumeric with hyphens)\n */\nconst ID_PATTERN = /^[a-z][a-z0-9-]*$/;\n\n/**\n * Schema for test templates that generate runnable tests\n */\nexport const TestTemplateSchema = z.object({\n /** Unique identifier for this template */\n id: z\n .string()\n .regex(ID_PATTERN, \"ID must start with lowercase letter and contain only lowercase letters, numbers, and hyphens\"),\n\n /** Target programming language */\n language: LanguageSchema,\n\n /** Target test framework */\n framework: TestFrameworkSchema,\n\n /** Template content with {{variable}} placeholders */\n template: z.string().min(50, \"Template must be at least 50 characters\"),\n\n /** Variables that can be substituted in the template */\n variables: z.array(TemplateVariableSchema),\n\n /** Required imports for the generated test */\n imports: z.array(z.string()).optional(),\n\n /** Required fixtures or setup code */\n fixtures: z.array(z.string()).optional(),\n\n /** Description of what this template tests */\n description: z.string().optional(),\n});\n\n// Inferred types\nexport type TestFramework = z.infer<typeof TestFrameworkSchema>;\nexport type VariableType = z.infer<typeof VariableTypeSchema>;\nexport type TemplateVariable = z.infer<typeof TemplateVariableSchema>;\nexport type TestTemplate = z.infer<typeof TestTemplateSchema>;\n\n/**\n * All available test frameworks\n */\nexport const TEST_FRAMEWORKS = TestFrameworkSchema.options;\n","import { z } from \"zod\";\n\nimport {\n CategoryBaseSchema,\n RiskDomainSchema,\n TestLevelSchema,\n PrioritySchema,\n SeveritySchema,\n ConfidenceSchema,\n LanguageSchema,\n RISK_DOMAINS,\n TEST_LEVELS,\n LANGUAGES,\n} from \"./category.schema.js\";\nimport { ExampleSchema } from \"./example.schema.js\";\nimport { DetectionPatternSchema, DetectionResultSchema, PatternTypeSchema, PATTERN_TYPES } from \"./pattern.schema.js\";\nimport { TestTemplateSchema, TemplateVariableSchema, TestFrameworkSchema, VariableTypeSchema, TEST_FRAMEWORKS } from \"./template.schema.js\";\n\n// Re-export all schemas\nexport {\n // Category schemas\n RiskDomainSchema,\n TestLevelSchema,\n PrioritySchema,\n SeveritySchema,\n ConfidenceSchema,\n LanguageSchema,\n CategoryBaseSchema,\n // Pattern schemas\n PatternTypeSchema,\n DetectionPatternSchema,\n DetectionResultSchema,\n // Template schemas\n TestFrameworkSchema,\n TemplateVariableSchema,\n VariableTypeSchema,\n TestTemplateSchema,\n // Example schema\n ExampleSchema,\n // Constants\n RISK_DOMAINS,\n TEST_LEVELS,\n LANGUAGES,\n PATTERN_TYPES,\n TEST_FRAMEWORKS,\n};\n\n// Re-export all types\nexport type {\n RiskDomain,\n TestLevel,\n Priority,\n Severity,\n Confidence,\n Language,\n CategoryBase,\n} from \"./category.schema.js\";\n\nexport type {\n PatternType,\n DetectionPattern,\n DetectionResult,\n} from \"./pattern.schema.js\";\n\nexport type {\n TestFramework,\n VariableType,\n TemplateVariable,\n TestTemplate,\n} from \"./template.schema.js\";\n\nexport type { Example } from \"./example.schema.js\";\n\n/**\n * Complete Category schema with all nested types\n */\nexport const CategorySchema = CategoryBaseSchema.extend({\n detectionPatterns: z.array(DetectionPatternSchema).min(1, \"At least one detection pattern required\"),\n testTemplates: z.array(TestTemplateSchema).min(1, \"At least one test template required\"),\n examples: z.array(ExampleSchema).min(1, \"At least one example required\"),\n});\n\n/**\n * Complete Category type\n */\nexport type Category = z.infer<typeof CategorySchema>;\n\n/**\n * Category without nested arrays (for partial loading)\n */\nexport const CategorySummarySchema = CategoryBaseSchema.pick({\n id: true,\n name: true,\n domain: true,\n level: true,\n priority: true,\n severity: true,\n description: true,\n});\n\nexport type CategorySummary = z.infer<typeof CategorySummarySchema>;\n","import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport YAML from \"yaml\";\n\nimport { ValidationError, CategoryNotFoundError } from \"../../lib/errors.js\";\nimport { ok, err, all, tryCatchAsync } from \"../../lib/result.js\";\nimport { CategorySchema, CategorySummarySchema } from \"../schema/index.js\";\n\nimport type { Result } from \"../../lib/result.js\";\nimport type {\n Category,\n CategorySummary,\n RiskDomain,\n TestLevel,\n Language,\n Priority,\n Severity,\n} from \"../schema/index.js\";\n\n/**\n * Options for filtering categories\n */\nexport interface CategoryFilter {\n domain?: RiskDomain;\n level?: TestLevel;\n language?: Language;\n priority?: Priority;\n severity?: Severity;\n}\n\n/**\n * Options for searching categories\n */\nexport interface SearchOptions {\n query: string;\n filter?: CategoryFilter;\n limit?: number;\n}\n\n/**\n * Search result with relevance score\n */\nexport interface SearchResult {\n category: CategorySummary;\n score: number;\n matches: string[];\n}\n\n/**\n * Store for managing test categories\n *\n * Provides:\n * - CRUD operations for categories\n * - Indexing by domain, level, language\n * - Full-text search\n * - Validation on load\n */\nexport class CategoryStore {\n /** All loaded categories by ID */\n private categories: Map<string, Category> = new Map();\n\n /** Index by domain */\n private domainIndex: Map<RiskDomain, Set<string>> = new Map();\n\n /** Index by level */\n private levelIndex: Map<TestLevel, Set<string>> = new Map();\n\n /** Index by language */\n private languageIndex: Map<Language, Set<string>> = new Map();\n\n /** Index by priority */\n private priorityIndex: Map<Priority, Set<string>> = new Map();\n\n /** Search index: word -> category IDs */\n private searchIndex: Map<string, Set<string>> = new Map();\n\n /** Version tracking for loaded categories */\n private versions: Map<string, number> = new Map();\n\n /**\n * Get total number of loaded categories\n */\n get size(): number {\n return this.categories.size;\n }\n\n /**\n * Load a single category into the store\n */\n add(category: Category): Result<Category, ValidationError> {\n // Validate the category\n const validation = CategorySchema.safeParse(category);\n if (!validation.success) {\n return err(\n new ValidationError(\"Invalid category\", {\n categoryId: category.id,\n issues: validation.error.issues,\n })\n );\n }\n\n const validated = validation.data;\n\n // Check for duplicate ID\n const existing = this.categories.get(validated.id);\n if (existing !== undefined) {\n // Allow update if version is higher\n const existingVersion = this.versions.get(validated.id) ?? 0;\n if (validated.version <= existingVersion) {\n return err(\n new ValidationError(`Category ${validated.id} already exists with same or higher version`, {\n categoryId: validated.id,\n existingVersion,\n newVersion: validated.version,\n })\n );\n }\n // Remove old indexes before updating\n this.removeFromIndexes(existing);\n }\n\n // Store category\n this.categories.set(validated.id, validated);\n this.versions.set(validated.id, validated.version);\n\n // Update indexes\n this.addToIndexes(validated);\n\n return ok(validated);\n }\n\n /**\n * Get a category by ID\n */\n get(id: string): Result<Category, CategoryNotFoundError> {\n const category = this.categories.get(id);\n if (category === undefined) {\n return err(new CategoryNotFoundError(id));\n }\n return ok(category);\n }\n\n /**\n * Check if a category exists\n */\n has(id: string): boolean {\n return this.categories.has(id);\n }\n\n /**\n * Remove a category by ID\n */\n remove(id: string): Result<Category, CategoryNotFoundError> {\n const category = this.categories.get(id);\n if (category === undefined) {\n return err(new CategoryNotFoundError(id));\n }\n\n this.removeFromIndexes(category);\n this.categories.delete(id);\n this.versions.delete(id);\n\n return ok(category);\n }\n\n /**\n * List all categories, optionally filtered\n */\n list(filter?: CategoryFilter): CategorySummary[] {\n let ids: Set<string> | undefined;\n\n // Apply filters by intersecting index sets\n if (filter?.domain !== undefined) {\n const domainIds = this.domainIndex.get(filter.domain);\n if (domainIds === undefined) return []; // No categories in this domain\n ids = this.intersect(ids, domainIds);\n }\n if (filter?.level !== undefined) {\n const levelIds = this.levelIndex.get(filter.level);\n if (levelIds === undefined) return []; // No categories at this level\n ids = this.intersect(ids, levelIds);\n }\n if (filter?.language !== undefined) {\n const langIds = this.languageIndex.get(filter.language);\n if (langIds === undefined) return []; // No categories for this language\n ids = this.intersect(ids, langIds);\n }\n if (filter?.priority !== undefined) {\n const priorityIds = this.priorityIndex.get(filter.priority);\n if (priorityIds === undefined) return []; // No categories at this priority\n ids = this.intersect(ids, priorityIds);\n }\n\n // Get categories for matching IDs\n const categories: CategorySummary[] = [];\n const targetIds = ids ?? this.categories.keys();\n\n for (const id of targetIds) {\n const category = this.categories.get(id);\n if (category !== undefined) {\n // Apply severity filter if specified\n if (filter?.severity !== undefined && category.severity !== filter.severity) {\n continue;\n }\n categories.push(this.toSummary(category));\n }\n }\n\n // Sort by priority, then severity, then name\n return categories.sort((a, b) => {\n const priorityOrder = { P0: 0, P1: 1, P2: 2 };\n const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n\n const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];\n if (priorityDiff !== 0) return priorityDiff;\n\n const severityDiff = severityOrder[a.severity] - severityOrder[b.severity];\n if (severityDiff !== 0) return severityDiff;\n\n return a.name.localeCompare(b.name);\n });\n }\n\n /**\n * Get all categories in a specific domain\n */\n byDomain(domain: RiskDomain): CategorySummary[] {\n return this.list({ domain });\n }\n\n /**\n * Get all categories at a specific test level\n */\n byLevel(level: TestLevel): CategorySummary[] {\n return this.list({ level });\n }\n\n /**\n * Get all categories applicable to a language\n */\n byLanguage(language: Language): CategorySummary[] {\n return this.list({ language });\n }\n\n /**\n * Full-text search across categories\n */\n search(options: SearchOptions): SearchResult[] {\n const { query, filter, limit = 20 } = options;\n\n // Tokenize query\n const queryTokens = this.tokenize(query.toLowerCase());\n if (queryTokens.length === 0) {\n return [];\n }\n\n // Find matching category IDs\n const scores: Map<string, { score: number; matches: string[] }> = new Map();\n\n for (const token of queryTokens) {\n // Exact match\n const exactMatches = this.searchIndex.get(token);\n if (exactMatches !== undefined) {\n for (const id of exactMatches) {\n const current = scores.get(id) ?? { score: 0, matches: [] };\n current.score += 10; // Exact match weight\n current.matches.push(token);\n scores.set(id, current);\n }\n }\n\n // Prefix match\n for (const [indexToken, ids] of this.searchIndex) {\n if (indexToken.startsWith(token) && indexToken !== token) {\n for (const id of ids) {\n const current = scores.get(id) ?? { score: 0, matches: [] };\n current.score += 5; // Prefix match weight\n if (!current.matches.includes(token)) {\n current.matches.push(token);\n }\n scores.set(id, current);\n }\n }\n }\n }\n\n // Build results with category data\n const results: SearchResult[] = [];\n\n for (const [id, { score, matches }] of scores) {\n const category = this.categories.get(id);\n if (category === undefined) continue;\n\n // Apply filters\n if (filter !== undefined) {\n if (filter.domain !== undefined && category.domain !== filter.domain) continue;\n if (filter.level !== undefined && category.level !== filter.level) continue;\n if (filter.priority !== undefined && category.priority !== filter.priority) continue;\n if (filter.severity !== undefined && category.severity !== filter.severity) continue;\n if (\n filter.language !== undefined &&\n !category.applicableLanguages.includes(filter.language)\n ) {\n continue;\n }\n }\n\n results.push({\n category: this.toSummary(category),\n score,\n matches: [...new Set(matches)],\n });\n }\n\n // Sort by score descending, then by priority\n results.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n const priorityOrder = { P0: 0, P1: 1, P2: 2 };\n return priorityOrder[a.category.priority] - priorityOrder[b.category.priority];\n });\n\n return results.slice(0, limit);\n }\n\n /**\n * Load categories from a directory of YAML files\n */\n async loadFromDirectory(dirPath: string): Promise<Result<number, ValidationError>> {\n const results = await this.loadYamlFilesRecursive(dirPath);\n const combined = all(results);\n\n if (!combined.success) {\n return combined;\n }\n\n return ok(combined.data.length);\n }\n\n /**\n * Load a single category from a YAML file\n */\n async loadFromFile(filePath: string): Promise<Result<Category, ValidationError>> {\n const result = await tryCatchAsync(async () => {\n const content = await fs.readFile(filePath, \"utf-8\");\n return YAML.parse(content) as unknown;\n });\n\n if (!result.success) {\n return err(\n new ValidationError(`Failed to read category file: ${filePath}`, {\n filePath,\n cause: result.error.message,\n })\n );\n }\n\n const validation = CategorySchema.safeParse(result.data);\n if (!validation.success) {\n return err(\n new ValidationError(`Invalid category in ${filePath}`, {\n filePath,\n issues: validation.error.issues,\n })\n );\n }\n\n return this.add(validation.data);\n }\n\n /**\n * Export all categories as an array\n */\n toArray(): Category[] {\n return Array.from(this.categories.values());\n }\n\n /**\n * Clear all categories and indexes\n */\n clear(): void {\n this.categories.clear();\n this.domainIndex.clear();\n this.levelIndex.clear();\n this.languageIndex.clear();\n this.priorityIndex.clear();\n this.searchIndex.clear();\n this.versions.clear();\n }\n\n /**\n * Get statistics about loaded categories\n */\n stats(): {\n total: number;\n byDomain: Record<string, number>;\n byLevel: Record<string, number>;\n byPriority: Record<string, number>;\n } {\n const byDomain: Record<string, number> = {};\n const byLevel: Record<string, number> = {};\n const byPriority: Record<string, number> = {};\n\n for (const [domain, ids] of this.domainIndex) {\n byDomain[domain] = ids.size;\n }\n for (const [level, ids] of this.levelIndex) {\n byLevel[level] = ids.size;\n }\n for (const [priority, ids] of this.priorityIndex) {\n byPriority[priority] = ids.size;\n }\n\n return {\n total: this.categories.size,\n byDomain,\n byLevel,\n byPriority,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Private methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Add category to all indexes\n */\n private addToIndexes(category: Category): void {\n const id = category.id;\n\n // Domain index\n this.addToIndex(this.domainIndex, category.domain, id);\n\n // Level index\n this.addToIndex(this.levelIndex, category.level, id);\n\n // Language index (multiple)\n for (const lang of category.applicableLanguages) {\n this.addToIndex(this.languageIndex, lang, id);\n }\n\n // Priority index\n this.addToIndex(this.priorityIndex, category.priority, id);\n\n // Search index\n this.indexForSearch(category);\n }\n\n /**\n * Remove category from all indexes\n */\n private removeFromIndexes(category: Category): void {\n const id = category.id;\n\n this.removeFromIndex(this.domainIndex, category.domain, id);\n this.removeFromIndex(this.levelIndex, category.level, id);\n for (const lang of category.applicableLanguages) {\n this.removeFromIndex(this.languageIndex, lang, id);\n }\n this.removeFromIndex(this.priorityIndex, category.priority, id);\n this.removeFromSearchIndex(id);\n }\n\n /**\n * Add ID to an index map\n */\n private addToIndex<K>(index: Map<K, Set<string>>, key: K, id: string): void {\n let set = index.get(key);\n if (set === undefined) {\n set = new Set();\n index.set(key, set);\n }\n set.add(id);\n }\n\n /**\n * Remove ID from an index map\n */\n private removeFromIndex<K>(index: Map<K, Set<string>>, key: K, id: string): void {\n const set = index.get(key);\n if (set !== undefined) {\n set.delete(id);\n if (set.size === 0) {\n index.delete(key);\n }\n }\n }\n\n /**\n * Index category text for search\n */\n private indexForSearch(category: Category): void {\n const id = category.id;\n const textToIndex = [\n category.id,\n category.name,\n category.description,\n category.domain,\n category.level,\n ...category.applicableLanguages,\n ...(category.cves ?? []),\n ].join(\" \");\n\n const tokens = this.tokenize(textToIndex.toLowerCase());\n for (const token of tokens) {\n this.addToIndex(this.searchIndex, token, id);\n }\n }\n\n /**\n * Remove category from search index\n */\n private removeFromSearchIndex(id: string): void {\n for (const [token, ids] of this.searchIndex) {\n ids.delete(id);\n if (ids.size === 0) {\n this.searchIndex.delete(token);\n }\n }\n }\n\n /**\n * Tokenize text for search indexing\n */\n private tokenize(text: string): string[] {\n return text\n .split(/[\\s\\-_.,;:!?'\"()\\[\\]{}]+/)\n .filter((token) => token.length >= 2)\n .map((token) => token.toLowerCase());\n }\n\n /**\n * Intersect two sets, handling undefined\n * Returns empty set if either input is empty set (filter found no matches)\n */\n private intersect(a: Set<string> | undefined, b: Set<string> | undefined): Set<string> | undefined {\n if (a === undefined) return b;\n if (b === undefined) return a;\n // If b is empty (filter matched nothing), return empty set\n if (b.size === 0) return new Set();\n return new Set([...a].filter((x) => b.has(x)));\n }\n\n /**\n * Convert full category to summary\n */\n private toSummary(category: Category): CategorySummary {\n return CategorySummarySchema.parse({\n id: category.id,\n name: category.name,\n domain: category.domain,\n level: category.level,\n priority: category.priority,\n severity: category.severity,\n description: category.description,\n });\n }\n\n /**\n * Recursively load YAML files from directory\n */\n private async loadYamlFilesRecursive(dirPath: string): Promise<Result<Category, ValidationError>[]> {\n const results: Result<Category, ValidationError>[] = [];\n\n const loadResult = await tryCatchAsync(async () => {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n return entries;\n });\n\n if (!loadResult.success) {\n return [\n err(\n new ValidationError(`Failed to read directory: ${dirPath}`, {\n dirPath,\n cause: loadResult.error.message,\n })\n ),\n ];\n }\n\n for (const entry of loadResult.data) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n const subResults = await this.loadYamlFilesRecursive(fullPath);\n results.push(...subResults);\n } else if (entry.isFile() && (entry.name.endsWith(\".yml\") || entry.name.endsWith(\".yaml\"))) {\n const result = await this.loadFromFile(fullPath);\n results.push(result);\n }\n }\n\n return results;\n }\n}\n\n/**\n * Create a new CategoryStore instance\n */\nexport function createCategoryStore(): CategoryStore {\n return new CategoryStore();\n}\n","import { readFile, readdir, stat } from \"fs/promises\";\nimport { resolve, extname } from \"path\";\n\nimport { DetectionResultSchema } from \"../../categories/schema/index.js\";\nimport { PinataError, AnalysisError, ParseError } from \"../../lib/errors.js\";\nimport { logger } from \"../../lib/logger.js\";\nimport { ok, err, tryCatchAsync } from \"../../lib/result.js\";\n\nimport {\n AstPatternMatcher,\n createAstMatcher,\n type AstMatch,\n} from \"./ast-parser.js\";\n\nimport type {\n DetectionPattern,\n DetectionResult,\n Language,\n Confidence,\n} from \"../../categories/schema/index.js\";\nimport type { Result } from \"../../lib/result.js\";\n\n\n\n/**\n * File extension to language mapping\n */\nconst EXTENSION_TO_LANGUAGE: Record<string, Language> = {\n \".py\": \"python\",\n \".ts\": \"typescript\",\n \".tsx\": \"typescript\",\n \".js\": \"javascript\",\n \".jsx\": \"javascript\",\n \".go\": \"go\",\n \".java\": \"java\",\n \".rs\": \"rust\",\n};\n\n/**\n * Maximum file size to scan (10MB)\n */\nconst MAX_FILE_SIZE = 10 * 1024 * 1024;\n\n/**\n * Maximum lines to include in snippet\n */\nconst MAX_SNIPPET_LINES = 5;\n\n/**\n * Options for pattern matching\n */\nexport interface PatternMatcherOptions {\n /** Base directory for relative paths */\n basePath?: string;\n /** Maximum file size to scan in bytes */\n maxFileSize?: number;\n /** File extensions to include (e.g., ['.ts', '.py']) */\n includeExtensions?: string[];\n /** Directories to exclude (e.g., ['node_modules', '.git']) */\n excludeDirs?: string[];\n /** Whether to include hidden files */\n includeHidden?: boolean;\n /** Maximum depth for directory traversal (-1 for unlimited) */\n maxDepth?: number;\n}\n\n/**\n * Options for file scanning\n */\nexport interface ScanOptions extends PatternMatcherOptions {\n /** Category ID to associate with results */\n categoryId: string;\n}\n\n/**\n * Single match within a file\n */\nexport interface PatternMatch {\n /** The pattern that matched */\n pattern: DetectionPattern;\n /** Starting line number (1-indexed) */\n lineStart: number;\n /** Ending line number (1-indexed) */\n lineEnd: number;\n /** Column where match starts (0-indexed) */\n columnStart: number;\n /** Column where match ends (0-indexed) */\n columnEnd: number;\n /** The matched text */\n matchText: string;\n /** Code snippet with context */\n codeSnippet: string;\n}\n\n/**\n * Result of scanning a single file\n */\nexport interface FileScanResult {\n /** Path to the file */\n filePath: string;\n /** Detected language */\n language: Language | null;\n /** Pattern matches found */\n matches: PatternMatch[];\n /** Time taken to scan in milliseconds */\n scanTimeMs: number;\n /** Any warnings (e.g., file too large) */\n warnings: string[];\n}\n\n/**\n * Aggregated results across multiple files\n */\nexport interface AggregatedResults {\n /** Total files scanned */\n totalFiles: number;\n /** Files with at least one match */\n filesWithMatches: number;\n /** Total matches found */\n totalMatches: number;\n /** Results grouped by category ID */\n byCategory: Map<string, DetectionResult[]>;\n /** Results grouped by pattern ID */\n byPattern: Map<string, DetectionResult[]>;\n /** Results grouped by file path */\n byFile: Map<string, DetectionResult[]>;\n /** Results grouped by confidence level */\n byConfidence: Map<Confidence, DetectionResult[]>;\n /** Total scan time in milliseconds */\n totalScanTimeMs: number;\n /** Warnings encountered */\n warnings: string[];\n}\n\n/**\n * PatternMatcher - Core pattern detection engine\n *\n * Scans source files for patterns defined in categories and returns\n * structured detection results with file paths, line numbers, and\n * matched pattern details.\n *\n * Supports multiple pattern types:\n * - **regex**: Regular expression patterns (fast, broad matching)\n * - **ast**: Tree-sitter AST queries (precise, structural matching)\n * - **semantic**: LLM-assisted semantic analysis (future)\n *\n * @example\n * ```typescript\n * const matcher = new PatternMatcher();\n *\n * // Scan a single file\n * const patterns = category.detectionPatterns;\n * const result = await matcher.scanFile(filePath, patterns, {\n * categoryId: category.id,\n * });\n *\n * // Scan a directory\n * const results = await matcher.scanDirectory(dirPath, patterns, {\n * categoryId: category.id,\n * excludeDirs: ['node_modules', '.git'],\n * });\n *\n * // Aggregate results\n * const aggregated = matcher.aggregateResults(results);\n * ```\n */\nexport class PatternMatcher {\n private readonly defaultOptions: Required<PatternMatcherOptions>;\n private readonly log = logger.child(\"PatternMatcher\");\n private readonly astMatcher: AstPatternMatcher;\n private astAvailable: boolean | null = null;\n\n constructor(options: PatternMatcherOptions = {}) {\n this.defaultOptions = {\n basePath: process.cwd(),\n maxFileSize: options.maxFileSize ?? MAX_FILE_SIZE,\n includeExtensions: options.includeExtensions ?? Object.keys(EXTENSION_TO_LANGUAGE),\n excludeDirs: options.excludeDirs ?? [\"node_modules\", \".git\", \"dist\", \"build\", \"__pycache__\", \".venv\", \"venv\"],\n includeHidden: options.includeHidden ?? false,\n maxDepth: options.maxDepth ?? -1,\n };\n this.astMatcher = createAstMatcher();\n }\n\n /**\n * Check if AST pattern matching is available\n */\n isAstAvailable(): boolean {\n return this.astMatcher.getSupportedLanguages().length > 0;\n }\n\n /**\n * Get the AST matcher instance for direct access\n */\n getAstMatcher(): AstPatternMatcher {\n return this.astMatcher;\n }\n\n /**\n * Scan a single file for pattern matches\n *\n * @param filePath - Path to the file to scan\n * @param patterns - Detection patterns to match against\n * @param options - Scan options including categoryId\n * @returns Result containing FileScanResult or an error\n */\n async scanFile(\n filePath: string,\n patterns: DetectionPattern[],\n options: ScanOptions\n ): Promise<Result<FileScanResult, PinataError>> {\n const startTime = performance.now();\n const absolutePath = resolve(options.basePath ?? this.defaultOptions.basePath, filePath);\n const warnings: string[] = [];\n\n // Check file exists and get stats\n const statsResult = await tryCatchAsync(() => stat(absolutePath));\n if (!statsResult.success) {\n return err(new ParseError(`File not found: ${filePath}`, absolutePath));\n }\n\n const fileStats = statsResult.data;\n if (!fileStats.isFile()) {\n return err(new ParseError(`Not a file: ${filePath}`, absolutePath));\n }\n\n // Check file size\n const maxSize = options.maxFileSize ?? this.defaultOptions.maxFileSize;\n if (fileStats.size > maxSize) {\n warnings.push(`File exceeds maximum size (${fileStats.size} > ${maxSize})`);\n return ok({\n filePath: absolutePath,\n language: null,\n matches: [],\n scanTimeMs: performance.now() - startTime,\n warnings,\n });\n }\n\n // Determine language from extension\n const ext = extname(absolutePath).toLowerCase();\n const language = EXTENSION_TO_LANGUAGE[ext] ?? null;\n\n // Read file content\n const contentResult = await tryCatchAsync(() => readFile(absolutePath, \"utf-8\"));\n if (!contentResult.success) {\n return err(new ParseError(`Failed to read file: ${contentResult.error.message}`, absolutePath));\n }\n\n const content = contentResult.data;\n const lines = content.split(\"\\n\");\n\n // Filter patterns for this language\n const applicablePatterns = patterns.filter((p) => {\n if (language === null) return false;\n // TypeScript patterns also apply to JavaScript files\n if (p.language === \"typescript\" && language === \"javascript\") return true;\n if (p.language === \"javascript\" && language === \"typescript\") return true;\n return p.language === language;\n });\n\n // Match patterns\n const matches: PatternMatch[] = [];\n\n for (const pattern of applicablePatterns) {\n if (pattern.type === \"regex\") {\n const patternMatches = this.matchRegexPattern(pattern, content, lines);\n matches.push(...patternMatches);\n } else if (pattern.type === \"ast\") {\n // AST pattern matching using tree-sitter\n const astMatches = await this.matchAstPattern(pattern, content, lines, language!);\n matches.push(...astMatches);\n }\n // Semantic patterns to be implemented later (LLM-assisted)\n }\n\n // Apply negative patterns to filter false positives\n const filteredMatches = this.applyNegativePatterns(matches, content, patterns);\n\n return ok({\n filePath: absolutePath,\n language,\n matches: filteredMatches,\n scanTimeMs: performance.now() - startTime,\n warnings,\n });\n }\n\n /**\n * Scan a directory recursively for pattern matches\n *\n * @param dirPath - Path to the directory to scan\n * @param patterns - Detection patterns to match against\n * @param options - Scan options including categoryId\n * @returns Result containing array of DetectionResults or an error\n */\n async scanDirectory(\n dirPath: string,\n patterns: DetectionPattern[],\n options: ScanOptions\n ): Promise<Result<DetectionResult[], PinataError>> {\n const absolutePath = resolve(options.basePath ?? this.defaultOptions.basePath, dirPath);\n const results: DetectionResult[] = [];\n const warnings: string[] = [];\n\n // Get all files recursively\n const filesResult = await this.getFilesRecursive(absolutePath, 0, options);\n if (!filesResult.success) {\n return err(filesResult.error);\n }\n\n const files = filesResult.data;\n this.log.debug(`Scanning ${files.length} files in ${dirPath}`);\n\n // Scan each file\n for (const file of files) {\n const scanResult = await this.scanFile(file, patterns, {\n ...options,\n basePath: \"\", // Files are already absolute paths\n });\n\n if (scanResult.success) {\n warnings.push(...scanResult.data.warnings);\n\n // Convert matches to DetectionResults\n for (const match of scanResult.data.matches) {\n const detectionResult = this.matchToDetectionResult(\n match,\n file,\n options.categoryId\n );\n results.push(detectionResult);\n }\n } else {\n warnings.push(`Error scanning ${file}: ${scanResult.error.message}`);\n }\n }\n\n if (warnings.length > 0) {\n this.log.warn(`Scan completed with ${warnings.length} warnings`);\n }\n\n return ok(results);\n }\n\n /**\n * Aggregate detection results for analysis\n *\n * @param results - Array of detection results to aggregate\n * @param scanTimeMs - Total scan time in milliseconds\n * @returns Aggregated results with various groupings\n */\n aggregateResults(results: DetectionResult[], scanTimeMs: number = 0): AggregatedResults {\n const byCategory = new Map<string, DetectionResult[]>();\n const byPattern = new Map<string, DetectionResult[]>();\n const byFile = new Map<string, DetectionResult[]>();\n const byConfidence = new Map<Confidence, DetectionResult[]>();\n const filesWithMatches = new Set<string>();\n\n for (const result of results) {\n filesWithMatches.add(result.filePath);\n\n // Group by category\n if (!byCategory.has(result.categoryId)) {\n byCategory.set(result.categoryId, []);\n }\n byCategory.get(result.categoryId)!.push(result);\n\n // Group by pattern\n if (!byPattern.has(result.patternId)) {\n byPattern.set(result.patternId, []);\n }\n byPattern.get(result.patternId)!.push(result);\n\n // Group by file\n if (!byFile.has(result.filePath)) {\n byFile.set(result.filePath, []);\n }\n byFile.get(result.filePath)!.push(result);\n\n // Group by confidence\n if (!byConfidence.has(result.confidence)) {\n byConfidence.set(result.confidence, []);\n }\n byConfidence.get(result.confidence)!.push(result);\n }\n\n return {\n totalFiles: byFile.size,\n filesWithMatches: filesWithMatches.size,\n totalMatches: results.length,\n byCategory,\n byPattern,\n byFile,\n byConfidence,\n totalScanTimeMs: scanTimeMs,\n warnings: [],\n };\n }\n\n /**\n * Match a regex pattern against file content\n */\n private matchRegexPattern(\n pattern: DetectionPattern,\n content: string,\n lines: string[]\n ): PatternMatch[] {\n const matches: PatternMatch[] = [];\n\n try {\n // Create regex with global and multiline flags\n const regex = new RegExp(pattern.pattern, \"gm\");\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(content)) !== null) {\n // Calculate line number from offset\n const lineStart = this.getLineNumber(content, match.index);\n const lineEnd = this.getLineNumber(content, match.index + match[0].length);\n\n // Get column positions\n const lineStartOffset = this.getLineStartOffset(content, match.index);\n const columnStart = match.index - lineStartOffset;\n const columnEnd = columnStart + match[0].length;\n\n // Build code snippet with context\n const codeSnippet = this.buildCodeSnippet(lines, lineStart, lineEnd);\n\n matches.push({\n pattern,\n lineStart,\n lineEnd,\n columnStart,\n columnEnd,\n matchText: match[0],\n codeSnippet,\n });\n\n // Prevent infinite loops on zero-width matches\n if (match[0].length === 0) {\n regex.lastIndex++;\n }\n }\n } catch (e) {\n this.log.warn(`Invalid regex pattern '${pattern.id}': ${e}`);\n }\n\n return matches;\n }\n\n /**\n * Match an AST pattern against file content using tree-sitter\n *\n * AST patterns use tree-sitter query syntax for precise structural matching.\n * This is more accurate than regex for detecting code patterns that depend\n * on syntax structure (e.g., function calls, string interpolation).\n *\n * @param pattern Detection pattern with type === \"ast\"\n * @param content File content\n * @param lines File content split into lines\n * @param language Programming language\n * @returns Array of pattern matches\n */\n private async matchAstPattern(\n pattern: DetectionPattern,\n content: string,\n lines: string[],\n language: Language\n ): Promise<PatternMatch[]> {\n const matches: PatternMatch[] = [];\n\n // Check if AST parsing is available for this language\n if (!this.astMatcher.isLanguageSupported(language)) {\n this.log.debug(`AST parsing not available for ${language}, skipping pattern ${pattern.id}`);\n return matches;\n }\n\n try {\n const astResult = await this.astMatcher.query(content, pattern.pattern, language);\n\n if (!astResult.success) {\n this.log.warn(`AST query failed for pattern '${pattern.id}': ${astResult.error.message}`);\n return matches;\n }\n\n // Convert AST matches to PatternMatch format\n // Filter to only include matches with the main capture (typically @call or similar)\n const seenLocations = new Set<string>();\n\n for (const astMatch of astResult.data) {\n // Skip duplicate locations (same match can have multiple captures)\n const locationKey = `${astMatch.startLine}:${astMatch.startColumn}:${astMatch.endLine}:${astMatch.endColumn}`;\n if (seenLocations.has(locationKey)) {\n continue;\n }\n\n // Only include primary captures (skip helper captures like @method, @concat)\n // Primary captures are typically named @call, @match, @target, or similar\n const primaryCaptures = [\"call\", \"match\", \"target\", \"vulnerable\", \"detection\", \"assertion\"];\n const isPrimary = primaryCaptures.some((name) => astMatch.captureName.includes(name));\n\n if (!isPrimary && astMatch.captureName.startsWith(\"@\") === false) {\n // This is a helper capture, skip it\n continue;\n }\n\n seenLocations.add(locationKey);\n\n // Convert from 0-indexed to 1-indexed line numbers\n const lineStart = astMatch.startLine + 1;\n const lineEnd = astMatch.endLine + 1;\n\n // Build code snippet\n const codeSnippet = this.buildCodeSnippet(lines, lineStart, lineEnd);\n\n matches.push({\n pattern,\n lineStart,\n lineEnd,\n columnStart: astMatch.startColumn,\n columnEnd: astMatch.endColumn,\n matchText: astMatch.text,\n codeSnippet,\n });\n }\n } catch (e) {\n this.log.warn(`AST pattern error '${pattern.id}': ${e instanceof Error ? e.message : String(e)}`);\n }\n\n return matches;\n }\n\n /**\n * Detect AST patterns in source code\n *\n * Convenience method for direct AST pattern detection without going through\n * the full scanFile flow. Useful for testing and one-off queries.\n *\n * @param source Source code content\n * @param query Tree-sitter query string\n * @param language Programming language\n * @returns AST matches or error\n */\n async detectAstPattern(\n source: string,\n query: string,\n language: Language\n ): Promise<Result<AstMatch[], PinataError>> {\n if (!this.astMatcher.isLanguageSupported(language)) {\n return err(new AnalysisError(`AST parsing not supported for ${language}`));\n }\n\n return this.astMatcher.query(source, query, language);\n }\n\n /**\n * Apply negative patterns to filter out false positives\n */\n private applyNegativePatterns(\n matches: PatternMatch[],\n content: string,\n patterns: DetectionPattern[]\n ): PatternMatch[] {\n return matches.filter((match) => {\n const negativePattern = match.pattern.negativePattern;\n if (!negativePattern) return true;\n\n try {\n const negativeRegex = new RegExp(negativePattern);\n // Check if the matched code or surrounding context matches the negative pattern\n const surroundingCode = this.getSurroundingCode(content, match);\n return !negativeRegex.test(surroundingCode);\n } catch {\n return true; // Invalid negative pattern, keep the match\n }\n });\n }\n\n /**\n * Get code surrounding a match for negative pattern checking\n */\n private getSurroundingCode(content: string, match: PatternMatch): string {\n const lines = content.split(\"\\n\");\n const startLine = Math.max(0, match.lineStart - 3);\n const endLine = Math.min(lines.length, match.lineEnd + 2);\n return lines.slice(startLine, endLine).join(\"\\n\");\n }\n\n /**\n * Get line number from character offset\n */\n private getLineNumber(content: string, offset: number): number {\n let line = 1;\n for (let i = 0; i < offset && i < content.length; i++) {\n if (content[i] === \"\\n\") {\n line++;\n }\n }\n return line;\n }\n\n /**\n * Get the character offset of the start of the line containing the given offset\n */\n private getLineStartOffset(content: string, offset: number): number {\n let lineStart = offset;\n while (lineStart > 0 && content[lineStart - 1] !== \"\\n\") {\n lineStart--;\n }\n return lineStart;\n }\n\n /**\n * Build a code snippet with context around the match\n */\n private buildCodeSnippet(lines: string[], lineStart: number, lineEnd: number): string {\n const startLine = Math.max(0, lineStart - 2); // 1 line before\n const endLine = Math.min(lines.length, lineEnd + 1); // 1 line after\n\n // Limit snippet size\n const snippetLines = lines.slice(startLine, Math.min(endLine, startLine + MAX_SNIPPET_LINES));\n\n return snippetLines\n .map((line, i) => {\n const lineNum = startLine + i + 1;\n const marker = lineNum >= lineStart && lineNum <= lineEnd ? \">\" : \" \";\n return `${marker} ${lineNum.toString().padStart(4)}| ${line}`;\n })\n .join(\"\\n\");\n }\n\n /**\n * Convert a PatternMatch to a DetectionResult\n */\n private matchToDetectionResult(\n match: PatternMatch,\n filePath: string,\n categoryId: string\n ): DetectionResult {\n return DetectionResultSchema.parse({\n patternId: match.pattern.id,\n categoryId,\n filePath,\n lineStart: match.lineStart,\n lineEnd: match.lineEnd,\n codeSnippet: match.codeSnippet,\n confidence: match.pattern.confidence,\n context: {\n matchText: match.matchText,\n columnStart: match.columnStart,\n columnEnd: match.columnEnd,\n patternDescription: match.pattern.description,\n },\n });\n }\n\n /**\n * Recursively get all files in a directory\n */\n private async getFilesRecursive(\n dirPath: string,\n currentDepth: number,\n options: PatternMatcherOptions\n ): Promise<Result<string[], PinataError>> {\n const maxDepth = options.maxDepth ?? this.defaultOptions.maxDepth;\n if (maxDepth !== -1 && currentDepth > maxDepth) {\n return ok([]);\n }\n\n const entriesResult = await tryCatchAsync(() => readdir(dirPath, { withFileTypes: true }));\n if (!entriesResult.success) {\n return err(new AnalysisError(`Failed to read directory: ${dirPath}`, {\n cause: entriesResult.error.message,\n }));\n }\n\n const files: string[] = [];\n const excludeDirs = options.excludeDirs ?? this.defaultOptions.excludeDirs;\n const includeExtensions = options.includeExtensions ?? this.defaultOptions.includeExtensions;\n const includeHidden = options.includeHidden ?? this.defaultOptions.includeHidden;\n\n for (const entry of entriesResult.data) {\n // Skip hidden files/directories unless explicitly included\n if (!includeHidden && entry.name.startsWith(\".\")) {\n continue;\n }\n\n const fullPath = resolve(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip excluded directories\n if (excludeDirs.includes(entry.name)) {\n continue;\n }\n\n // Recurse into subdirectory\n const subFilesResult = await this.getFilesRecursive(fullPath, currentDepth + 1, options);\n if (subFilesResult.success) {\n files.push(...subFilesResult.data);\n }\n } else if (entry.isFile()) {\n // Check file extension\n const ext = extname(entry.name).toLowerCase();\n if (includeExtensions.includes(ext)) {\n files.push(fullPath);\n }\n }\n }\n\n return ok(files);\n }\n}\n\n/**\n * Create a PatternMatcher instance\n */\nexport function createPatternMatcher(options?: PatternMatcherOptions): PatternMatcher {\n return new PatternMatcher(options);\n}\n\n/**\n * Detect language from file extension\n */\nexport function detectLanguage(filePath: string): Language | null {\n const ext = extname(filePath).toLowerCase();\n return EXTENSION_TO_LANGUAGE[ext] ?? null;\n}\n\n/**\n * Get supported file extensions\n */\nexport function getSupportedExtensions(): string[] {\n return Object.keys(EXTENSION_TO_LANGUAGE);\n}\n\n/**\n * Check if a file extension is supported\n */\nexport function isExtensionSupported(ext: string): boolean {\n return ext.toLowerCase() in EXTENSION_TO_LANGUAGE;\n}\n","import chalk from \"chalk\";\n\n/**\n * Log levels from most to least verbose\n */\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\n/**\n * Logger configuration\n */\ninterface LoggerConfig {\n level: LogLevel;\n prefix?: string;\n}\n\n/**\n * Simple logger with colored output\n */\nclass Logger {\n private level: LogLevel = \"info\";\n private prefix: string = \"\";\n\n /**\n * Configure the logger\n */\n configure(config: Partial<LoggerConfig>): void {\n if (config.level !== undefined) {\n this.level = config.level;\n }\n if (config.prefix !== undefined) {\n this.prefix = config.prefix;\n }\n }\n\n /**\n * Check if a log level should be output\n */\n private shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\n }\n\n /**\n * Format a message with optional prefix\n */\n private format(message: string): string {\n return this.prefix ? `${this.prefix} ${message}` : message;\n }\n\n /**\n * Debug level logging (gray)\n */\n debug(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"debug\")) {\n console.debug(chalk.gray(this.format(message)), ...args);\n }\n }\n\n /**\n * Info level logging (default color)\n */\n info(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"info\")) {\n console.info(this.format(message), ...args);\n }\n }\n\n /**\n * Warning level logging (yellow)\n */\n warn(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"warn\")) {\n console.warn(chalk.yellow(this.format(message)), ...args);\n }\n }\n\n /**\n * Error level logging (red)\n */\n error(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"error\")) {\n console.error(chalk.red(this.format(message)), ...args);\n }\n }\n\n /**\n * Success message (green)\n */\n success(message: string, ...args: unknown[]): void {\n if (this.shouldLog(\"info\")) {\n console.info(chalk.green(this.format(message)), ...args);\n }\n }\n\n /**\n * Create a child logger with a prefix\n */\n child(prefix: string): Logger {\n const child = new Logger();\n child.level = this.level;\n child.prefix = this.prefix ? `${this.prefix} ${prefix}` : prefix;\n return child;\n }\n}\n\n/**\n * Global logger instance\n */\nexport const logger = new Logger();\n","/**\n * Tree-sitter AST Parser\n *\n * Provides AST parsing and querying capabilities using web-tree-sitter.\n * Supports Python, TypeScript, and JavaScript.\n */\n\nimport { existsSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nimport {\n Parser as TreeSitterParser,\n Language as TreeSitterLanguage,\n Tree as TreeSitterTree,\n Node as TreeSitterNode,\n Query as TreeSitterQuery,\n} from \"web-tree-sitter\";\n\nimport { PinataError, ParseError } from \"../../lib/errors.js\";\nimport { logger } from \"../../lib/logger.js\";\nimport { ok, err } from \"../../lib/result.js\";\n\nimport type { Language } from \"../../categories/schema/index.js\";\nimport type { Result } from \"../../lib/result.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Map of language to tree-sitter grammar name\n */\nconst LANGUAGE_GRAMMAR_MAP: Record<Language, string | null> = {\n python: \"tree-sitter-python\",\n typescript: \"tree-sitter-typescript\",\n javascript: \"tree-sitter-javascript\",\n go: null, // Not yet supported\n java: null, // Not yet supported\n rust: null, // Not yet supported\n};\n\n/**\n * AST match result\n */\nexport interface AstMatch {\n /** Matched node text */\n text: string;\n /** Node type (e.g., \"call_expression\") */\n nodeType: string;\n /** Starting line (0-indexed) */\n startLine: number;\n /** Ending line (0-indexed) */\n endLine: number;\n /** Starting column (0-indexed) */\n startColumn: number;\n /** Ending column (0-indexed) */\n endColumn: number;\n /** Capture name from the query (e.g., \"@call\") */\n captureName: string;\n /** Child captures from the same match group */\n captures: Map<string, string>;\n}\n\n/**\n * Query match with all captures\n */\ninterface QueryMatch {\n pattern: number;\n captures: Array<{\n name: string;\n node: TreeSitterNode;\n }>;\n}\n\n/**\n * Cached parser instances per language\n */\nconst parserCache = new Map<string, TreeSitterParser>();\n\n/**\n * Cached language instances\n */\nconst languageCache = new Map<string, TreeSitterLanguage>();\n\n/**\n * Whether Parser has been initialized\n */\nlet parserInitialized = false;\n\n/**\n * WASM file locations - tries multiple paths\n * web-tree-sitter uses web-tree-sitter.wasm as the main parser WASM file\n */\nfunction getWasmPaths(): string[] {\n return [\n // Development: relative to project root\n join(process.cwd(), \"node_modules/web-tree-sitter/web-tree-sitter.wasm\"),\n // Built: relative to dist\n join(__dirname, \"../../../node_modules/web-tree-sitter/web-tree-sitter.wasm\"),\n // Alternative locations\n join(__dirname, \"../../wasm/web-tree-sitter.wasm\"),\n join(process.cwd(), \"wasm/web-tree-sitter.wasm\"),\n ];\n}\n\n/**\n * Language WASM file locations\n */\nfunction getLanguageWasmPaths(language: string): string[] {\n const grammarName = `tree-sitter-${language}`;\n const wasmName = `${grammarName}.wasm`;\n\n return [\n // Project wasm directory (recommended)\n join(process.cwd(), \"wasm\", wasmName),\n // src directory\n join(process.cwd(), \"src/core/detection/wasm\", wasmName),\n // Fallback locations\n join(__dirname, \"wasm\", wasmName),\n join(__dirname, \"../../../wasm\", wasmName),\n ];\n}\n\n/**\n * Initialize the tree-sitter Parser\n */\nasync function initializeParser(): Promise<Result<void, PinataError>> {\n if (parserInitialized) {\n return ok(undefined);\n }\n\n const wasmPaths = getWasmPaths();\n let wasmPath: string | null = null;\n\n for (const path of wasmPaths) {\n if (existsSync(path)) {\n wasmPath = path;\n break;\n }\n }\n\n if (!wasmPath) {\n return err(\n new ParseError(\n \"tree-sitter.wasm not found. Run: npm run setup:wasm\",\n \"tree-sitter.wasm\"\n )\n );\n }\n\n try {\n await TreeSitterParser.init({\n locateFile: () => wasmPath,\n });\n parserInitialized = true;\n logger.debug(\"Tree-sitter initialized\");\n return ok(undefined);\n } catch (error) {\n return err(\n new ParseError(\n `Failed to initialize tree-sitter: ${error instanceof Error ? error.message : String(error)}`,\n wasmPath\n )\n );\n }\n}\n\n/**\n * Load a language grammar\n */\nasync function loadLanguage(language: Language): Promise<Result<TreeSitterLanguage, PinataError>> {\n const grammarName = LANGUAGE_GRAMMAR_MAP[language];\n\n if (grammarName === null) {\n return err(\n new ParseError(`Language not supported for AST parsing: ${language}`, language)\n );\n }\n\n // Check cache\n const cached = languageCache.get(language);\n if (cached) {\n return ok(cached);\n }\n\n // Handle TypeScript special case (uses typescript grammar from tree-sitter-typescript)\n const langKey = language === \"typescript\" ? \"typescript\" : language;\n const wasmPaths = getLanguageWasmPaths(langKey);\n\n let wasmPath: string | null = null;\n for (const path of wasmPaths) {\n if (existsSync(path)) {\n wasmPath = path;\n break;\n }\n }\n\n if (!wasmPath) {\n return err(\n new ParseError(\n `Language WASM not found for ${language}. Run: npm run setup:wasm`,\n language\n )\n );\n }\n\n try {\n const lang = await TreeSitterLanguage.load(wasmPath);\n languageCache.set(language, lang);\n logger.debug(`Loaded language: ${language}`);\n return ok(lang);\n } catch (error) {\n return err(\n new ParseError(\n `Failed to load language ${language}: ${error instanceof Error ? error.message : String(error)}`,\n wasmPath\n )\n );\n }\n}\n\n/**\n * Get or create a parser for a specific language\n */\nasync function getParser(language: Language): Promise<Result<TreeSitterParser, PinataError>> {\n // Initialize if needed\n const initResult = await initializeParser();\n if (!initResult.success) {\n return initResult;\n }\n\n // Check cache\n const cached = parserCache.get(language);\n if (cached) {\n return ok(cached);\n }\n\n // Load language\n const langResult = await loadLanguage(language);\n if (!langResult.success) {\n return langResult;\n }\n\n // Create parser\n const parser = new TreeSitterParser();\n parser.setLanguage(langResult.data);\n parserCache.set(language, parser);\n\n return ok(parser);\n}\n\n/**\n * Parse source code into an AST\n */\nexport async function parseSource(\n source: string,\n language: Language\n): Promise<Result<TreeSitterTree, PinataError>> {\n const parserResult = await getParser(language);\n if (!parserResult.success) {\n return parserResult;\n }\n\n try {\n const tree = parserResult.data.parse(source);\n if (!tree) {\n return err(\n new ParseError(\"Failed to parse source: parser returned null\", \"source\")\n );\n }\n return ok(tree);\n } catch (error) {\n return err(\n new ParseError(\n `Failed to parse source: ${error instanceof Error ? error.message : String(error)}`,\n \"source\"\n )\n );\n }\n}\n\n/**\n * Execute a tree-sitter query against an AST\n *\n * Query syntax follows tree-sitter query format:\n * https://tree-sitter.github.io/tree-sitter/using-parsers#pattern-matching-with-queries\n *\n * @example\n * ```typescript\n * // Find all function calls\n * const query = \"(call_expression) @call\";\n *\n * // Find SQL execute with string concatenation\n * const query = `\n * (call_expression\n * function: (attribute\n * attribute: (identifier) @method)\n * arguments: (argument_list\n * (binary_operator) @concat))\n * (#match? @method \"execute|executemany\")\n * @call\n * `;\n * ```\n */\nexport async function executeQuery(\n tree: TreeSitterTree,\n queryString: string,\n language: Language\n): Promise<Result<AstMatch[], PinataError>> {\n const langResult = await loadLanguage(language);\n if (!langResult.success) {\n return langResult;\n }\n\n try {\n // Create query from language\n const query = new TreeSitterQuery(langResult.data, queryString);\n const matches = query.matches(tree.rootNode);\n\n const results: AstMatch[] = [];\n\n for (const match of matches) {\n // Get all captures for this match\n const captureMap = new Map<string, string>();\n for (const capture of match.captures) {\n captureMap.set(capture.name, capture.node.text);\n }\n\n // Create a result for each capture\n for (const capture of match.captures) {\n const node = capture.node;\n results.push({\n text: node.text,\n nodeType: node.type,\n startLine: node.startPosition.row,\n endLine: node.endPosition.row,\n startColumn: node.startPosition.column,\n endColumn: node.endPosition.column,\n captureName: capture.name,\n captures: captureMap,\n });\n }\n }\n\n return ok(results);\n } catch (error) {\n return err(\n new ParseError(\n `Failed to execute query: ${error instanceof Error ? error.message : String(error)}`,\n \"query\"\n )\n );\n }\n}\n\n/**\n * AstPatternMatcher - Executes AST queries against source code\n *\n * Provides a higher-level interface for pattern detection using tree-sitter.\n */\nexport class AstPatternMatcher {\n private readonly sourceCache = new Map<string, TreeSitterTree>();\n private readonly log = logger.child(\"AstPatternMatcher\");\n\n /**\n * Check if AST parsing is available for a language\n */\n isLanguageSupported(language: Language): boolean {\n return LANGUAGE_GRAMMAR_MAP[language] !== null;\n }\n\n /**\n * Get list of supported languages\n */\n getSupportedLanguages(): Language[] {\n return Object.entries(LANGUAGE_GRAMMAR_MAP)\n .filter(([_, grammar]) => grammar !== null)\n .map(([lang]) => lang as Language);\n }\n\n /**\n * Parse source code and cache the AST\n */\n async parse(\n source: string,\n language: Language,\n cacheKey?: string\n ): Promise<Result<TreeSitterTree, PinataError>> {\n // Check cache\n if (cacheKey) {\n const cached = this.sourceCache.get(cacheKey);\n if (cached) {\n return ok(cached);\n }\n }\n\n const result = await parseSource(source, language);\n if (result.success && cacheKey) {\n this.sourceCache.set(cacheKey, result.data);\n }\n\n return result;\n }\n\n /**\n * Execute a query against source code\n *\n * @param source Source code to analyze\n * @param query Tree-sitter query string\n * @param language Programming language\n * @param cacheKey Optional cache key for the parsed AST\n */\n async query(\n source: string,\n query: string,\n language: Language,\n cacheKey?: string\n ): Promise<Result<AstMatch[], PinataError>> {\n const treeResult = await this.parse(source, language, cacheKey);\n if (!treeResult.success) {\n return treeResult;\n }\n\n return executeQuery(treeResult.data, query, language);\n }\n\n /**\n * Execute multiple queries against the same source\n */\n async queryMultiple(\n source: string,\n queries: string[],\n language: Language,\n cacheKey?: string\n ): Promise<Result<AstMatch[][], PinataError>> {\n const treeResult = await this.parse(source, language, cacheKey);\n if (!treeResult.success) {\n return treeResult;\n }\n\n const results: AstMatch[][] = [];\n for (const query of queries) {\n const queryResult = await executeQuery(treeResult.data, query, language);\n if (!queryResult.success) {\n return queryResult;\n }\n results.push(queryResult.data);\n }\n\n return ok(results);\n }\n\n /**\n * Clear the AST cache\n */\n clearCache(): void {\n this.sourceCache.clear();\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): { entries: number; languages: Set<string> } {\n return {\n entries: this.sourceCache.size,\n languages: new Set(parserCache.keys()),\n };\n }\n}\n\n/**\n * Create a new AstPatternMatcher instance\n */\nexport function createAstMatcher(): AstPatternMatcher {\n return new AstPatternMatcher();\n}\n\n/**\n * Predefined AST queries for common vulnerability patterns\n */\nexport const COMMON_AST_PATTERNS = {\n // Python: SQL injection via string formatting\n pythonSqlStringFormat: `\n (call\n function: (attribute\n attribute: (identifier) @method)\n arguments: (argument_list\n (binary_operator\n operator: \"%\") @concat))\n (#match? @method \"^execute$|^executemany$\")\n @call\n `,\n\n // Python: SQL injection via f-string\n pythonSqlFString: `\n (call\n function: (attribute\n attribute: (identifier) @method)\n arguments: (argument_list\n (string\n (interpolation)) @fstring))\n (#match? @method \"^execute$|^executemany$\")\n @call\n `,\n\n // Python: SQL injection via concatenation\n pythonSqlConcat: `\n (call\n function: (attribute\n attribute: (identifier) @method)\n arguments: (argument_list\n (binary_operator\n operator: \"+\") @concat))\n (#match? @method \"^execute$|^executemany$\")\n @call\n `,\n\n // Python: SQL injection via .format()\n pythonSqlFormat: `\n (call\n function: (attribute\n attribute: (identifier) @method)\n arguments: (argument_list\n (call\n function: (attribute\n attribute: (identifier) @format_method))))\n (#match? @method \"^execute$|^executemany$\")\n (#match? @format_method \"^format$\")\n @call\n `,\n\n // JavaScript/TypeScript: SQL injection via template literal\n jsSqlTemplateLiteral: `\n (call_expression\n function: (member_expression\n property: (property_identifier) @method)\n arguments: (arguments\n (template_string\n (template_substitution)) @template))\n (#match? @method \"^query$|^execute$|^run$\")\n @call\n `,\n\n // JavaScript/TypeScript: SQL injection via concatenation\n jsSqlConcat: `\n (call_expression\n function: (member_expression\n property: (property_identifier) @method)\n arguments: (arguments\n (binary_expression\n operator: \"+\") @concat))\n (#match? @method \"^query$|^execute$|^run$\")\n @call\n `,\n\n // Python: Command injection via subprocess\n pythonCommandInjection: `\n (call\n function: (attribute\n object: (identifier) @module\n attribute: (identifier) @method)\n arguments: (argument_list\n (binary_operator) @concat))\n (#match? @module \"^subprocess$|^os$\")\n (#match? @method \"^call$|^run$|^Popen$|^system$\")\n @call\n `,\n\n // Python: Path traversal via open\n pythonPathTraversal: `\n (call\n function: (identifier) @func\n arguments: (argument_list\n (binary_operator\n operator: \"+\") @concat))\n (#match? @func \"^open$\")\n @call\n `,\n\n // JavaScript: eval usage\n jsEval: `\n (call_expression\n function: (identifier) @func)\n (#match? @func \"^eval$\")\n @call\n `,\n\n // TypeScript: Any type assertion\n tsAnyAssertion: `\n (as_expression\n type: (type_identifier) @type)\n (#match? @type \"^any$\")\n @assertion\n `,\n} as const;\n\n/**\n * Check if tree-sitter is properly initialized\n */\nexport async function checkTreeSitterSetup(): Promise<Result<{ ready: boolean; languages: Language[] }, PinataError>> {\n const initResult = await initializeParser();\n if (!initResult.success) {\n logger.debug(`Tree-sitter init failed: ${initResult.error.message}`);\n return ok({ ready: false, languages: [] });\n }\n\n const supportedLanguages: Language[] = [];\n for (const lang of [\"python\", \"typescript\", \"javascript\"] as Language[]) {\n const langResult = await loadLanguage(lang);\n if (langResult.success) {\n supportedLanguages.push(lang);\n } else {\n logger.debug(`Failed to load language ${lang}: ${langResult.error.message}`);\n }\n }\n\n return ok({\n ready: supportedLanguages.length > 0,\n languages: supportedLanguages,\n });\n}\n","/**\n * Scanner - Codebase analysis orchestrator\n *\n * Coordinates pattern matching, gap detection, coverage calculation,\n * and Pinata Score computation for a target codebase.\n *\n * @example\n * ```typescript\n * const scanner = new Scanner(categoryStore);\n *\n * const result = await scanner.scanDirectory('/path/to/project', {\n * excludeDirs: ['node_modules', 'dist'],\n * minSeverity: 'medium',\n * });\n *\n * console.log(`Pinata Score: ${result.score.overall}/100`);\n * console.log(`Gaps found: ${result.gaps.length}`);\n * ```\n */\n\nimport { readdir, stat, readFile } from \"fs/promises\";\nimport { resolve, relative, extname, basename } from \"path\";\n\nimport { minimatch } from \"minimatch\";\n\nimport {\n RISK_DOMAINS,\n TEST_LEVELS,\n} from \"../../categories/schema/index.js\";\nimport { PinataError, AnalysisError } from \"../../lib/errors.js\";\nimport { logger } from \"../../lib/logger.js\";\nimport { ok, err, tryCatchAsync } from \"../../lib/result.js\";\nimport { PatternMatcher, detectLanguage } from \"../detection/index.js\";\n\nimport {\n SEVERITY_WEIGHTS,\n CONFIDENCE_WEIGHTS,\n PRIORITY_WEIGHTS,\n DEFAULT_TEST_PATTERNS,\n} from \"./types.js\";\n\nimport type {\n ScannerOptions,\n ScanResult,\n Gap,\n DomainCoverage,\n CoverageMetrics,\n FileStats,\n PinataScore,\n ScanSummary,\n} from \"./types.js\";\nimport type {\n Category,\n RiskDomain,\n TestLevel,\n Language,\n Priority,\n Severity,\n Confidence,\n DetectionResult,\n PatternType,\n} from \"../../categories/schema/index.js\";\nimport type { CategoryStore } from \"../../categories/store/category-store.js\";\nimport type { Result } from \"../../lib/result.js\";\n\n/**\n * Default scanner options\n */\nconst DEFAULT_OPTIONS: Required<Omit<ScannerOptions, \"targetDirectory\">> = {\n excludeDirs: [\n // Package managers\n \"node_modules\", \".pnpm\", \"vendor\",\n // Build outputs\n \"dist\", \"build\", \"out\", \".next\", \".nuxt\", \".output\",\n // Version control\n \".git\", \".svn\", \".hg\",\n // Python\n \"__pycache__\", \".venv\", \"venv\", \".tox\", \".mypy_cache\", \".pytest_cache\",\n // Test/coverage\n \"coverage\", \".nyc_output\",\n // IDE/Editor\n \".idea\", \".vscode\",\n // Scripts (typically not production)\n \"scripts\",\n ],\n includeExtensions: [\".py\", \".ts\", \".tsx\", \".js\", \".jsx\", \".go\", \".java\", \".rs\"],\n maxFileSize: 10 * 1024 * 1024, // 10MB\n maxDepth: -1,\n categoryIds: [],\n domains: [],\n minSeverity: \"low\",\n minConfidence: \"low\",\n detectTestFiles: true,\n testFilePatterns: [],\n};\n\n/**\n * Severity order for filtering\n */\nconst SEVERITY_ORDER: Record<Severity, number> = {\n critical: 4,\n high: 3,\n medium: 2,\n low: 1,\n};\n\n/**\n * Confidence order for filtering\n */\nconst CONFIDENCE_ORDER: Record<Confidence, number> = {\n high: 3,\n medium: 2,\n low: 1,\n};\n\n/**\n * Scanner class - orchestrates codebase analysis\n */\nexport class Scanner {\n private readonly categoryStore: CategoryStore;\n private readonly patternMatcher: PatternMatcher;\n private readonly log = logger.child(\"Scanner\");\n\n constructor(categoryStore: CategoryStore) {\n this.categoryStore = categoryStore;\n this.patternMatcher = new PatternMatcher();\n }\n\n /**\n * Scan a directory for test coverage gaps\n *\n * @param targetDirectory Directory to scan\n * @param options Scan options\n * @returns Scan result with gaps, coverage, and score\n */\n async scanDirectory(\n targetDirectory: string,\n options: Partial<ScannerOptions> = {}\n ): Promise<Result<ScanResult, PinataError>> {\n const startedAt = new Date();\n const opts = this.mergeOptions(targetDirectory, options);\n\n this.log.info(`Starting scan of ${targetDirectory}`);\n\n // Validate target directory exists (use stat to avoid TOCTOU race condition)\n try {\n const dirStat = await stat(targetDirectory);\n if (!dirStat.isDirectory()) {\n return err(new AnalysisError(`Not a directory: ${targetDirectory}`));\n }\n } catch {\n return err(new AnalysisError(`Directory not found: ${targetDirectory}`));\n }\n\n // Get categories to scan\n const categoriesResult = this.getCategoriesToScan(opts);\n if (!categoriesResult.success) {\n return categoriesResult;\n }\n const categories = categoriesResult.data;\n\n if (categories.length === 0) {\n return err(new AnalysisError(\"No categories to scan. Load categories first.\"));\n }\n\n this.log.info(`Scanning with ${categories.length} categories`);\n\n // Collect all detection results\n const allDetections: DetectionResult[] = [];\n const warnings: string[] = [];\n const fileStats = this.initFileStats();\n const testFiles = new Set<string>();\n const sourceFiles = new Set<string>();\n\n // Scan for each category\n for (const category of categories) {\n const scanResult = await this.patternMatcher.scanDirectory(\n targetDirectory,\n category.detectionPatterns,\n {\n categoryId: category.id,\n basePath: targetDirectory,\n excludeDirs: opts.excludeDirs,\n includeExtensions: opts.includeExtensions,\n maxFileSize: opts.maxFileSize,\n maxDepth: opts.maxDepth,\n }\n );\n\n if (!scanResult.success) {\n warnings.push(`Failed to scan for category ${category.id}: ${scanResult.error.message}`);\n continue;\n }\n\n // Filter by severity and confidence\n const filtered = scanResult.data.filter((d) => {\n const severityOk = SEVERITY_ORDER[category.severity] >= SEVERITY_ORDER[opts.minSeverity];\n const confidenceOk = CONFIDENCE_ORDER[d.confidence] >= CONFIDENCE_ORDER[opts.minConfidence];\n return severityOk && confidenceOk;\n });\n\n allDetections.push(...filtered);\n }\n\n // Detect test files if enabled\n if (opts.detectTestFiles) {\n const testFilesResult = await this.detectTestFiles(targetDirectory, opts);\n if (testFilesResult.success) {\n for (const file of testFilesResult.data) {\n testFiles.add(file);\n }\n }\n }\n\n // Count files by language\n const filesResult = await this.countFiles(targetDirectory, opts);\n if (filesResult.success) {\n fileStats.totalFiles = filesResult.data.total;\n fileStats.skippedFiles = filesResult.data.skipped;\n for (const [lang, count] of filesResult.data.byLanguage) {\n fileStats.byLanguage.set(lang, count);\n }\n }\n\n fileStats.testFiles = testFiles.size;\n fileStats.sourceFiles = fileStats.totalFiles - testFiles.size;\n\n // Convert detections to gaps\n const gaps = this.detectionsToGaps(allDetections, categories, testFiles, opts);\n\n // Update file stats\n const filesWithGaps = new Set(gaps.map((g) => g.filePath));\n fileStats.filesWithGaps = filesWithGaps.size;\n\n // Group gaps\n const gapsByCategory = this.groupGapsByCategory(gaps);\n const gapsByFile = this.groupGapsByFile(gaps);\n\n // Calculate coverage metrics\n const coverage = this.calculateCoverage(categories, gapsByCategory);\n\n // Calculate Pinata Score\n const score = this.calculateScore(gaps, coverage, categories);\n\n // Build summary\n const summary = this.buildSummary(gaps, score, coverage, fileStats, categories);\n\n const completedAt = new Date();\n const durationMs = completedAt.getTime() - startedAt.getTime();\n\n this.log.info(`Scan complete: ${gaps.length} gaps found in ${durationMs}ms`);\n\n return ok({\n targetDirectory,\n startedAt,\n completedAt,\n durationMs,\n gaps,\n gapsByCategory,\n gapsByFile,\n coverage,\n fileStats,\n score,\n warnings,\n categoriesScanned: categories.map((c) => c.id),\n summary,\n });\n }\n\n /**\n * Aggregate raw detection results into gaps with priority scoring\n */\n aggregateResults(\n detections: DetectionResult[],\n categories: Category[]\n ): Gap[] {\n return this.detectionsToGaps(detections, categories, new Set(), {\n ...DEFAULT_OPTIONS,\n targetDirectory: \"\",\n });\n }\n\n /**\n * Calculate Pinata Score from gaps and coverage\n */\n calculateScore(\n gaps: Gap[],\n coverage: CoverageMetrics,\n categories: Category[]\n ): PinataScore {\n // Base score starts at 100\n let baseScore = 100;\n const penalties: PinataScore[\"penalties\"] = [];\n const bonuses: PinataScore[\"bonuses\"] = [];\n const domainScores = new Map<RiskDomain, number>();\n\n // Initialize domain scores at 100\n for (const domain of RISK_DOMAINS) {\n domainScores.set(domain, 100);\n }\n\n // Apply penalties for gaps\n for (const gap of gaps) {\n const severityWeight = SEVERITY_WEIGHTS[gap.severity];\n const confidenceWeight = CONFIDENCE_WEIGHTS[gap.confidence];\n const priorityWeight = PRIORITY_WEIGHTS[gap.priority];\n\n // Calculate penalty: base × severity × confidence × priority factor\n const basePenalty = 2; // Base penalty per gap\n const penalty = basePenalty * severityWeight * confidenceWeight * Math.sqrt(priorityWeight);\n\n baseScore -= penalty;\n\n // Apply to domain score\n const currentDomainScore = domainScores.get(gap.domain) ?? 100;\n domainScores.set(gap.domain, Math.max(0, currentDomainScore - penalty * 2));\n\n // Track significant penalties\n if (penalty >= 5) {\n penalties.push({\n reason: `${gap.severity} ${gap.domain} gap: ${gap.categoryName}`,\n points: Math.round(penalty),\n categoryId: gap.categoryId,\n });\n }\n }\n\n // Apply bonuses for good coverage\n if (coverage.overallCoverage >= 90) {\n const bonus = 5;\n baseScore += bonus;\n bonuses.push({ reason: \"Excellent coverage (90%+)\", points: bonus });\n } else if (coverage.overallCoverage >= 75) {\n const bonus = 3;\n baseScore += bonus;\n bonuses.push({ reason: \"Good coverage (75%+)\", points: bonus });\n }\n\n // Bonus for no critical gaps\n const criticalGaps = gaps.filter((g) => g.severity === \"critical\");\n if (criticalGaps.length === 0 && categories.length > 0) {\n const bonus = 5;\n baseScore += bonus;\n bonuses.push({ reason: \"No critical gaps\", points: bonus });\n }\n\n // Bonus for no high gaps\n const highGaps = gaps.filter((g) => g.severity === \"high\");\n if (highGaps.length === 0 && categories.length > 0) {\n const bonus = 3;\n baseScore += bonus;\n bonuses.push({ reason: \"No high severity gaps\", points: bonus });\n }\n\n // Clamp score to 0-100\n const overall = Math.max(0, Math.min(100, Math.round(baseScore)));\n\n // Calculate grade\n const grade = this.scoreToGrade(overall);\n\n // Calculate severity breakdown scores\n const bySeverity = {\n critical: this.calculateSeverityScore(gaps, \"critical\"),\n high: this.calculateSeverityScore(gaps, \"high\"),\n medium: this.calculateSeverityScore(gaps, \"medium\"),\n low: this.calculateSeverityScore(gaps, \"low\"),\n };\n\n return {\n overall,\n grade,\n byDomain: domainScores,\n bySeverity,\n penalties: penalties.slice(0, 10), // Top 10 penalties\n bonuses,\n };\n }\n\n /**\n * Get the pattern matcher instance\n */\n getPatternMatcher(): PatternMatcher {\n return this.patternMatcher;\n }\n\n // ============================================================\n // Private methods\n // ============================================================\n\n /**\n * Merge user options with defaults\n */\n private mergeOptions(\n targetDirectory: string,\n options: Partial<ScannerOptions>\n ): Required<ScannerOptions> {\n // Read .pinataignore if it exists\n const pinataIgnore = this.readPinataIgnore(targetDirectory);\n const baseExcludes = options.excludeDirs ?? DEFAULT_OPTIONS.excludeDirs;\n const mergedExcludes = [...new Set([...baseExcludes, ...pinataIgnore])];\n\n return {\n targetDirectory,\n excludeDirs: mergedExcludes,\n includeExtensions: options.includeExtensions ?? DEFAULT_OPTIONS.includeExtensions,\n maxFileSize: options.maxFileSize ?? DEFAULT_OPTIONS.maxFileSize,\n maxDepth: options.maxDepth ?? DEFAULT_OPTIONS.maxDepth,\n categoryIds: options.categoryIds ?? DEFAULT_OPTIONS.categoryIds,\n domains: options.domains ?? DEFAULT_OPTIONS.domains,\n minSeverity: options.minSeverity ?? DEFAULT_OPTIONS.minSeverity,\n minConfidence: options.minConfidence ?? DEFAULT_OPTIONS.minConfidence,\n detectTestFiles: options.detectTestFiles ?? DEFAULT_OPTIONS.detectTestFiles,\n testFilePatterns: options.testFilePatterns ?? DEFAULT_OPTIONS.testFilePatterns,\n };\n }\n\n /**\n * Read .pinataignore file and return directory patterns\n */\n private readPinataIgnore(targetDirectory: string): string[] {\n const ignorePath = resolve(targetDirectory, \".pinataignore\");\n\n // Try to read directly instead of checking existence (avoids TOCTOU)\n try {\n const { readFileSync } = require(\"node:fs\") as typeof import(\"fs\");\n const content = readFileSync(ignorePath, \"utf-8\");\n return content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !line.startsWith(\"#\"))\n .map((line) => line.replace(/\\/$/, \"\")); // Remove trailing slashes\n } catch {\n return [];\n }\n }\n\n /**\n * Get categories to scan based on options\n */\n private getCategoriesToScan(\n options: Required<ScannerOptions>\n ): Result<Category[], PinataError> {\n const allCategories = this.categoryStore.list();\n let filtered = allCategories;\n\n // Filter by category IDs\n if (options.categoryIds.length > 0) {\n filtered = filtered.filter((c) => options.categoryIds.includes(c.id));\n }\n\n // Filter by domains\n if (options.domains.length > 0) {\n filtered = filtered.filter((c) => options.domains.includes(c.domain));\n }\n\n // Get full category objects\n const categories: Category[] = [];\n for (const summary of filtered) {\n const result = this.categoryStore.get(summary.id);\n if (result.success) {\n categories.push(result.data);\n }\n }\n\n return ok(categories);\n }\n\n /**\n * Initialize empty file stats\n */\n private initFileStats(): FileStats {\n return {\n totalFiles: 0,\n filesWithGaps: 0,\n byLanguage: new Map(),\n testFiles: 0,\n sourceFiles: 0,\n skippedFiles: 0,\n totalLinesOfCode: 0,\n };\n }\n\n /**\n * Detect test files in the target directory\n */\n private async detectTestFiles(\n targetDirectory: string,\n options: Required<ScannerOptions>\n ): Promise<Result<string[], PinataError>> {\n const testFiles: string[] = [];\n\n // Build test patterns\n const patterns: string[] = [...options.testFilePatterns];\n for (const ext of options.includeExtensions) {\n const lang = detectLanguage(`file${ext}`);\n if (lang) {\n const langPatterns = DEFAULT_TEST_PATTERNS[lang];\n if (langPatterns) {\n patterns.push(...langPatterns);\n }\n }\n }\n\n // Walk directory and match patterns\n const walkResult = await this.walkDirectory(targetDirectory, options, (filePath) => {\n const fileName = basename(filePath);\n const relativePath = relative(targetDirectory, filePath);\n\n for (const pattern of patterns) {\n if (minimatch(fileName, pattern) || minimatch(relativePath, pattern)) {\n testFiles.push(filePath);\n return true;\n }\n }\n\n // Common test directory names\n if (relativePath.includes(\"/test/\") || relativePath.includes(\"/tests/\") ||\n relativePath.includes(\"/__tests__/\") || relativePath.startsWith(\"test/\") ||\n relativePath.startsWith(\"tests/\")) {\n testFiles.push(filePath);\n return true;\n }\n\n return false;\n });\n\n if (!walkResult.success) {\n return walkResult;\n }\n\n return ok(testFiles);\n }\n\n /**\n * Count files by language\n */\n private async countFiles(\n targetDirectory: string,\n options: Required<ScannerOptions>\n ): Promise<Result<{ total: number; skipped: number; byLanguage: Map<Language, number> }, PinataError>> {\n let total = 0;\n let skipped = 0;\n const byLanguage = new Map<Language, number>();\n\n const walkResult = await this.walkDirectory(targetDirectory, options, (filePath) => {\n const lang = detectLanguage(filePath);\n if (lang) {\n total++;\n byLanguage.set(lang, (byLanguage.get(lang) ?? 0) + 1);\n } else {\n skipped++;\n }\n return true;\n });\n\n if (!walkResult.success) {\n return walkResult;\n }\n\n return ok({ total, skipped, byLanguage });\n }\n\n /**\n * Walk directory and apply callback to each file\n */\n private async walkDirectory(\n dirPath: string,\n options: Required<ScannerOptions>,\n callback: (filePath: string) => boolean,\n depth = 0\n ): Promise<Result<void, PinataError>> {\n if (options.maxDepth >= 0 && depth > options.maxDepth) {\n return ok(undefined);\n }\n\n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = resolve(dirPath, entry.name);\n\n // Skip excluded directories\n if (entry.isDirectory()) {\n if (options.excludeDirs.includes(entry.name)) {\n continue;\n }\n if (entry.name.startsWith(\".\") && entry.name !== \".\") {\n continue;\n }\n\n const walkResult = await this.walkDirectory(fullPath, options, callback, depth + 1);\n if (!walkResult.success) {\n return walkResult;\n }\n } else if (entry.isFile()) {\n const ext = extname(entry.name).toLowerCase();\n if (options.includeExtensions.includes(ext)) {\n callback(fullPath);\n }\n }\n }\n\n return ok(undefined);\n } catch (error) {\n return err(new AnalysisError(\n `Failed to read directory ${dirPath}: ${error instanceof Error ? error.message : String(error)}`\n ));\n }\n }\n\n /**\n * Convert detection results to gaps\n */\n private detectionsToGaps(\n detections: DetectionResult[],\n categories: Category[],\n testFiles: Set<string>,\n options: Required<ScannerOptions>\n ): Gap[] {\n const categoryMap = new Map<string, Category>();\n for (const cat of categories) {\n categoryMap.set(cat.id, cat);\n }\n\n // Build pattern type lookup from categories\n const patternTypeMap = new Map<string, PatternType>();\n for (const cat of categories) {\n for (const pattern of cat.detectionPatterns) {\n patternTypeMap.set(pattern.id, pattern.type);\n }\n }\n\n const gaps: Gap[] = [];\n\n for (const detection of detections) {\n // Skip detections in test files\n if (testFiles.has(detection.filePath)) {\n continue;\n }\n\n const category = categoryMap.get(detection.categoryId);\n if (!category) {\n continue;\n }\n\n // Calculate priority score\n const priorityScore = this.calculatePriorityScore(\n category.severity,\n detection.confidence,\n category.priority\n );\n\n // Get pattern type from lookup (fallback to regex)\n const patternType = patternTypeMap.get(detection.patternId) ?? \"regex\";\n\n // Extract column info from context if available\n const context = detection.context;\n const columnStart = typeof context?.[\"columnStart\"] === \"number\" ? context[\"columnStart\"] : 0;\n const columnEnd = typeof context?.[\"columnEnd\"] === \"number\" ? context[\"columnEnd\"] : 0;\n\n gaps.push({\n categoryId: category.id,\n categoryName: category.name,\n domain: category.domain,\n level: category.level,\n priority: category.priority,\n severity: category.severity,\n confidence: detection.confidence,\n filePath: detection.filePath,\n lineStart: detection.lineStart,\n lineEnd: detection.lineEnd,\n columnStart,\n columnEnd,\n codeSnippet: detection.codeSnippet,\n patternId: detection.patternId,\n patternType,\n priorityScore,\n });\n }\n\n // Sort by priority score (highest first)\n gaps.sort((a, b) => b.priorityScore - a.priorityScore);\n\n return gaps;\n }\n\n /**\n * Calculate priority score for a gap\n */\n private calculatePriorityScore(\n severity: Severity,\n confidence: Confidence,\n priority: Priority\n ): number {\n const severityWeight = SEVERITY_WEIGHTS[severity];\n const confidenceWeight = CONFIDENCE_WEIGHTS[confidence];\n const priorityWeight = PRIORITY_WEIGHTS[priority];\n\n return severityWeight * confidenceWeight * priorityWeight;\n }\n\n /**\n * Group gaps by category ID\n */\n private groupGapsByCategory(gaps: Gap[]): Map<string, Gap[]> {\n const grouped = new Map<string, Gap[]>();\n\n for (const gap of gaps) {\n const existing = grouped.get(gap.categoryId) ?? [];\n existing.push(gap);\n grouped.set(gap.categoryId, existing);\n }\n\n return grouped;\n }\n\n /**\n * Group gaps by file path\n */\n private groupGapsByFile(gaps: Gap[]): Map<string, Gap[]> {\n const grouped = new Map<string, Gap[]>();\n\n for (const gap of gaps) {\n const existing = grouped.get(gap.filePath) ?? [];\n existing.push(gap);\n grouped.set(gap.filePath, existing);\n }\n\n return grouped;\n }\n\n /**\n * Calculate coverage metrics\n */\n private calculateCoverage(\n categories: Category[],\n gapsByCategory: Map<string, Gap[]>\n ): CoverageMetrics {\n const byDomain = new Map<RiskDomain, DomainCoverage>();\n const byLevel = new Map<TestLevel, { scanned: number; withGaps: number; covered: number }>();\n\n // Initialize domain coverage\n for (const domain of RISK_DOMAINS) {\n byDomain.set(domain, {\n domain,\n categoriesScanned: 0,\n categoriesWithGaps: 0,\n categoriesCovered: 0,\n coveragePercent: 100,\n totalGaps: 0,\n criticalGaps: 0,\n });\n }\n\n // Initialize level coverage\n for (const level of TEST_LEVELS) {\n byLevel.set(level, { scanned: 0, withGaps: 0, covered: 0 });\n }\n\n // Calculate per-category coverage\n let categoriesWithGaps = 0;\n let categoriesCovered = 0;\n\n for (const category of categories) {\n const gaps = gapsByCategory.get(category.id) ?? [];\n const hasGaps = gaps.length > 0;\n\n // Update domain coverage\n const domainCoverage = byDomain.get(category.domain);\n if (domainCoverage) {\n domainCoverage.categoriesScanned++;\n if (hasGaps) {\n domainCoverage.categoriesWithGaps++;\n domainCoverage.totalGaps += gaps.length;\n domainCoverage.criticalGaps += gaps.filter((g) => g.severity === \"critical\").length;\n } else {\n domainCoverage.categoriesCovered++;\n }\n }\n\n // Update level coverage\n const levelCoverage = byLevel.get(category.level);\n if (levelCoverage) {\n levelCoverage.scanned++;\n if (hasGaps) {\n levelCoverage.withGaps++;\n } else {\n levelCoverage.covered++;\n }\n }\n\n if (hasGaps) {\n categoriesWithGaps++;\n } else {\n categoriesCovered++;\n }\n }\n\n // Calculate percentages\n for (const coverage of byDomain.values()) {\n if (coverage.categoriesScanned > 0) {\n coverage.coveragePercent = Math.round(\n (coverage.categoriesCovered / coverage.categoriesScanned) * 100\n );\n }\n }\n\n const totalCategories = categories.length;\n const overallCoverage = totalCategories > 0\n ? Math.round((categoriesCovered / totalCategories) * 100)\n : 100;\n\n return {\n byDomain,\n byLevel,\n overallCoverage,\n totalCategories,\n categoriesWithGaps,\n categoriesCovered,\n };\n }\n\n /**\n * Convert score to letter grade\n */\n private scoreToGrade(score: number): PinataScore[\"grade\"] {\n if (score >= 90) return \"A\";\n if (score >= 80) return \"B\";\n if (score >= 70) return \"C\";\n if (score >= 60) return \"D\";\n return \"F\";\n }\n\n /**\n * Calculate score contribution from a severity level\n */\n private calculateSeverityScore(gaps: Gap[], severity: Severity): number {\n const severityGaps = gaps.filter((g) => g.severity === severity);\n if (severityGaps.length === 0) return 100;\n\n // More gaps = lower score\n const penalty = severityGaps.length * SEVERITY_WEIGHTS[severity] * 5;\n return Math.max(0, Math.round(100 - penalty));\n }\n\n /**\n * Build scan summary\n */\n private buildSummary(\n gaps: Gap[],\n score: PinataScore,\n coverage: CoverageMetrics,\n fileStats: FileStats,\n categories: Category[]\n ): ScanSummary {\n return {\n totalGaps: gaps.length,\n criticalGaps: gaps.filter((g) => g.severity === \"critical\").length,\n highGaps: gaps.filter((g) => g.severity === \"high\").length,\n mediumGaps: gaps.filter((g) => g.severity === \"medium\").length,\n lowGaps: gaps.filter((g) => g.severity === \"low\").length,\n score: score.overall,\n grade: score.grade,\n coverage: coverage.overallCoverage,\n filesScanned: fileStats.totalFiles,\n categoriesChecked: categories.length,\n topGaps: gaps.slice(0, 3),\n };\n }\n}\n\n/**\n * Create a new Scanner instance\n */\nexport function createScanner(categoryStore: CategoryStore): Scanner {\n return new Scanner(categoryStore);\n}\n","/**\n * Scanner module - Codebase analysis orchestration\n *\n * This module provides:\n * - Scanner: Main class for coordinating gap detection\n * - Gap detection and prioritization\n * - Coverage metrics calculation\n * - Pinata Score computation\n */\n\nexport { Scanner, createScanner } from \"./scanner.js\";\n\nexport type {\n ScannerOptions,\n ScanResult,\n Gap,\n DomainCoverage,\n CoverageMetrics,\n FileStats,\n PinataScore,\n ScanSummary,\n} from \"./types.js\";\n\nexport {\n SEVERITY_WEIGHTS,\n CONFIDENCE_WEIGHTS,\n PRIORITY_WEIGHTS,\n DEFAULT_TEST_PATTERNS,\n} from \"./types.js\";\n","/**\n * Core analysis engine\n *\n * This module contains:\n * - detection/ - Pattern matching against categories\n * - scanner/ - Codebase analysis orchestration\n * - ingestion/ - Code parsing and AST extraction (coming soon)\n * - generation/ - Test code generation (coming soon)\n */\n\nexport const VERSION = \"0.4.0\";\n\n// Detection module\nexport {\n PatternMatcher,\n createPatternMatcher,\n detectLanguage,\n getSupportedExtensions,\n isExtensionSupported,\n type PatternMatcherOptions,\n type ScanOptions,\n type PatternMatch,\n type FileScanResult,\n type AggregatedResults,\n} from \"./detection/index.js\";\n\n// Scanner module\nexport {\n Scanner,\n createScanner,\n SEVERITY_WEIGHTS,\n CONFIDENCE_WEIGHTS,\n PRIORITY_WEIGHTS,\n DEFAULT_TEST_PATTERNS,\n type ScannerOptions,\n type ScanResult,\n type Gap,\n type DomainCoverage,\n type CoverageMetrics,\n type FileStats,\n type PinataScore,\n type ScanSummary,\n} from \"./scanner/index.js\";\n","// Error classes\nexport {\n PinataError,\n ValidationError,\n ParseError,\n ConfigError,\n AnalysisError,\n GenerationError,\n CategoryNotFoundError,\n PatternNotFoundError,\n} from \"./errors.js\";\n\n// Result type and utilities\nexport {\n ok,\n err,\n unwrap,\n unwrapOr,\n map,\n mapErr,\n andThen,\n all,\n tryCatch,\n tryCatchAsync,\n} from \"./result.js\";\nexport type { Result } from \"./result.js\";\n\n// Logger\nexport { logger } from \"./logger.js\";\nexport type { LogLevel } from \"./logger.js\";\n","import { z } from \"zod\";\n\nimport { VariableTypeSchema } from \"../categories/schema/index.js\";\nimport { PinataError, ValidationError } from \"../lib/errors.js\";\nimport { ok, err } from \"../lib/result.js\";\n\nimport type {\n TestTemplate,\n TemplateVariable,\n VariableType,\n} from \"../categories/schema/index.js\";\nimport type { Result } from \"../lib/result.js\";\n\n\n/**\n * Error for template rendering failures\n */\nexport class TemplateRenderError extends PinataError {\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, \"TEMPLATE_RENDER_ERROR\", context);\n this.name = \"TemplateRenderError\";\n }\n}\n\n/**\n * Error for malformed template syntax\n */\nexport class TemplateSyntaxError extends PinataError {\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, \"TEMPLATE_SYNTAX_ERROR\", context);\n this.name = \"TemplateSyntaxError\";\n }\n}\n\n/**\n * Regex for matching {{variable}} placeholders\n * Matches: {{variableName}}, {{variable_name}}, {{user.name}}\n */\nconst PLACEHOLDER_REGEX = /\\{\\{([a-zA-Z][a-zA-Z0-9_.]*)\\}\\}/g;\n\n/**\n * Regex for matching {{#if variable}}...{{/if}} conditionals\n */\nconst CONDITIONAL_REGEX = /\\{\\{#if\\s+([a-zA-Z][a-zA-Z0-9_.]*)\\s*\\}\\}([\\s\\S]*?)(?:\\{\\{#else\\}\\}([\\s\\S]*?))?\\{\\{\\/if\\}\\}/g;\n\n/**\n * Regex for matching {{#unless variable}}...{{/unless}} (inverse conditionals)\n */\nconst UNLESS_REGEX = /\\{\\{#unless\\s+([a-zA-Z][a-zA-Z0-9_.]*)\\s*\\}\\}([\\s\\S]*?)\\{\\{\\/unless\\}\\}/g;\n\n/**\n * Regex for matching {{#each items}}...{{/each}} loops\n */\nconst EACH_REGEX = /\\{\\{#each\\s+([a-zA-Z][a-zA-Z0-9_.]*)\\s*\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g;\n\n/**\n * Regex for detecting unclosed blocks\n */\nconst UNCLOSED_IF_REGEX = /\\{\\{#if\\s+[^}]+\\}\\}(?![\\s\\S]*\\{\\{\\/if\\}\\})/;\nconst UNCLOSED_EACH_REGEX = /\\{\\{#each\\s+[^}]+\\}\\}(?![\\s\\S]*\\{\\{\\/each\\}\\})/;\nconst UNCLOSED_UNLESS_REGEX = /\\{\\{#unless\\s+[^}]+\\}\\}(?![\\s\\S]*\\{\\{\\/unless\\}\\})/;\n\n/**\n * Regex for detecting orphaned closing tags\n */\nconst ORPHAN_ENDIF_REGEX = /\\{\\{\\/if\\}\\}(?![\\s\\S]*\\{\\{#if)/;\nconst ORPHAN_ENDEACH_REGEX = /\\{\\{\\/each\\}\\}(?![\\s\\S]*\\{\\{#each)/;\nconst ORPHAN_ENDUNLESS_REGEX = /\\{\\{\\/unless\\}\\}(?![\\s\\S]*\\{\\{#unless)/;\n\n/**\n * Result of parsing template placeholders\n */\nexport interface ParsedPlaceholder {\n /** Full match including braces: {{variableName}} */\n match: string;\n /** Variable name without braces: variableName or user.name */\n name: string;\n /** Start index in template */\n startIndex: number;\n /** End index in template */\n endIndex: number;\n /** Whether this is a nested path (e.g., user.name) */\n isNestedPath: boolean;\n /** Path segments for nested access */\n pathSegments: string[];\n}\n\n/**\n * Parsed conditional block\n */\nexport interface ParsedConditional {\n /** Full match */\n match: string;\n /** Variable name being tested */\n variable: string;\n /** Content if condition is true */\n trueBranch: string;\n /** Content if condition is false (optional) */\n falseBranch?: string;\n /** Start index */\n startIndex: number;\n /** End index */\n endIndex: number;\n}\n\n/**\n * Parsed loop block\n */\nexport interface ParsedLoop {\n /** Full match */\n match: string;\n /** Variable name of the array */\n variable: string;\n /** Loop body content */\n body: string;\n /** Start index */\n startIndex: number;\n /** End index */\n endIndex: number;\n}\n\n/**\n * Template syntax validation result\n */\nexport interface SyntaxValidationResult {\n valid: boolean;\n errors: TemplateSyntaxError[];\n}\n\n/**\n * Validation result for a single variable\n */\nexport interface VariableValidationResult {\n name: string;\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Complete validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n results: VariableValidationResult[];\n missingRequired: string[];\n unknownVariables: string[];\n typeErrors: string[];\n}\n\n/**\n * Options for rendering a template\n */\nexport interface RenderOptions {\n /** Strict mode - fail on any validation error */\n strict?: boolean;\n /** Leave unresolved placeholders as-is */\n allowUnresolved?: boolean;\n /** Custom placeholder format (default: {{name}}) */\n placeholderFormat?: \"mustache\" | \"dollar\" | \"percent\";\n}\n\n/**\n * Result of rendering a template\n */\nexport interface RenderResult {\n /** Rendered template content */\n content: string;\n /** Variables that were substituted */\n substituted: string[];\n /** Variables that were left unresolved */\n unresolved: string[];\n /** Imports required for the template */\n imports: string[];\n /** Fixtures required for the template */\n fixtures: string[];\n}\n\n/**\n * Renders test templates by substituting variable placeholders\n *\n * Supports:\n * - Simple variables: {{variableName}}\n * - Nested access: {{user.name}}\n * - Conditionals: {{#if variable}}...{{#else}}...{{/if}}\n * - Inverse conditionals: {{#unless variable}}...{{/unless}}\n * - Loops: {{#each items}}{{this}}{{/each}}\n *\n * @example\n * ```typescript\n * const renderer = new TemplateRenderer();\n *\n * const result = renderer.renderTemplate(template, {\n * user: { name: \"John\", admin: true },\n * items: [\"a\", \"b\", \"c\"],\n * });\n * ```\n */\nexport class TemplateRenderer {\n private readonly options: Required<RenderOptions>;\n\n constructor(options: RenderOptions = {}) {\n this.options = {\n strict: options.strict ?? true,\n allowUnresolved: options.allowUnresolved ?? false,\n placeholderFormat: options.placeholderFormat ?? \"mustache\",\n };\n }\n\n /**\n * Validate template syntax for common errors\n *\n * @param template Template string to validate\n * @returns Syntax validation result\n */\n validateSyntax(template: string): SyntaxValidationResult {\n const errors: TemplateSyntaxError[] = [];\n\n // Check for unclosed blocks\n if (this.hasUnclosedBlock(template, \"if\")) {\n errors.push(\n new TemplateSyntaxError(\"Unclosed {{#if}} block\", {\n hint: \"Every {{#if variable}} must have a matching {{/if}}\",\n })\n );\n }\n\n if (this.hasUnclosedBlock(template, \"each\")) {\n errors.push(\n new TemplateSyntaxError(\"Unclosed {{#each}} block\", {\n hint: \"Every {{#each variable}} must have a matching {{/each}}\",\n })\n );\n }\n\n if (this.hasUnclosedBlock(template, \"unless\")) {\n errors.push(\n new TemplateSyntaxError(\"Unclosed {{#unless}} block\", {\n hint: \"Every {{#unless variable}} must have a matching {{/unless}}\",\n })\n );\n }\n\n // Check for orphaned closing tags\n if (this.hasOrphanedClosingTag(template, \"if\")) {\n errors.push(\n new TemplateSyntaxError(\"Orphaned {{/if}} without matching {{#if}}\", {\n hint: \"Remove the extra {{/if}} or add the opening {{#if variable}}\",\n })\n );\n }\n\n if (this.hasOrphanedClosingTag(template, \"each\")) {\n errors.push(\n new TemplateSyntaxError(\"Orphaned {{/each}} without matching {{#each}}\", {\n hint: \"Remove the extra {{/each}} or add the opening {{#each variable}}\",\n })\n );\n }\n\n if (this.hasOrphanedClosingTag(template, \"unless\")) {\n errors.push(\n new TemplateSyntaxError(\"Orphaned {{/unless}} without matching {{#unless}}\", {\n hint: \"Remove the extra {{/unless}} or add the opening {{#unless variable}}\",\n })\n );\n }\n\n // Check for mismatched blocks\n const mismatchErrors = this.checkBlockNesting(template);\n errors.push(...mismatchErrors);\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Check if template has an unclosed block of specified type\n */\n private hasUnclosedBlock(template: string, blockType: string): boolean {\n const openRegex = new RegExp(`\\\\{\\\\{#${blockType}\\\\s+[^}]+\\\\}\\\\}`, \"g\");\n const closeRegex = new RegExp(`\\\\{\\\\{/${blockType}\\\\}\\\\}`, \"g\");\n\n const opens = (template.match(openRegex) || []).length;\n const closes = (template.match(closeRegex) || []).length;\n\n return opens > closes;\n }\n\n /**\n * Check if template has orphaned closing tags\n */\n private hasOrphanedClosingTag(template: string, blockType: string): boolean {\n const openRegex = new RegExp(`\\\\{\\\\{#${blockType}\\\\s+[^}]+\\\\}\\\\}`, \"g\");\n const closeRegex = new RegExp(`\\\\{\\\\{/${blockType}\\\\}\\\\}`, \"g\");\n\n const opens = (template.match(openRegex) || []).length;\n const closes = (template.match(closeRegex) || []).length;\n\n return closes > opens;\n }\n\n /**\n * Check for improperly nested blocks\n */\n private checkBlockNesting(template: string): TemplateSyntaxError[] {\n const errors: TemplateSyntaxError[] = [];\n const stack: { type: string; index: number }[] = [];\n\n // Match all block opens and closes\n const blockPattern = /\\{\\{(#(?:if|each|unless)|\\/(?:if|each|unless))\\s*[^}]*\\}\\}/g;\n let match: RegExpExecArray | null;\n\n while ((match = blockPattern.exec(template)) !== null) {\n const tag = match[1] ?? \"\";\n\n if (tag.startsWith(\"#\")) {\n // Opening tag\n const type = tag.slice(1).split(/\\s/)[0] ?? \"\";\n stack.push({ type, index: match.index });\n } else if (tag.startsWith(\"/\")) {\n // Closing tag\n const type = tag.slice(1);\n const last = stack.pop();\n\n if (!last) {\n // Orphaned closing tag (already handled)\n continue;\n }\n\n if (last.type !== type) {\n errors.push(\n new TemplateSyntaxError(`Mismatched block: opened {{#${last.type}}} but closed with {{/${type}}}`, {\n openedAt: last.index,\n closedAt: match.index,\n })\n );\n }\n }\n }\n\n return errors;\n }\n\n /**\n * Parse all placeholders from a template string\n *\n * @param template Template string to parse\n * @returns Array of parsed placeholders\n */\n parsePlaceholders(template: string): ParsedPlaceholder[] {\n const placeholders: ParsedPlaceholder[] = [];\n const regex = this.getPlaceholderRegex();\n let match: RegExpExecArray | null;\n\n // Reset regex state\n regex.lastIndex = 0;\n\n while ((match = regex.exec(template)) !== null) {\n const name = match[1] ?? \"\";\n const pathSegments = name.split(\".\");\n placeholders.push({\n match: match[0],\n name,\n startIndex: match.index,\n endIndex: match.index + match[0].length,\n isNestedPath: pathSegments.length > 1,\n pathSegments,\n });\n }\n\n return placeholders;\n }\n\n /**\n * Parse conditional blocks from template\n *\n * @param template Template string to parse\n * @returns Array of parsed conditionals\n */\n parseConditionals(template: string): ParsedConditional[] {\n const conditionals: ParsedConditional[] = [];\n const regex = new RegExp(CONDITIONAL_REGEX.source, \"g\");\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(template)) !== null) {\n const falseBranch = match[3];\n conditionals.push({\n match: match[0],\n variable: match[1] ?? \"\",\n trueBranch: match[2] ?? \"\",\n ...(falseBranch !== undefined && { falseBranch }),\n startIndex: match.index,\n endIndex: match.index + match[0].length,\n });\n }\n\n return conditionals;\n }\n\n /**\n * Parse loop blocks from template\n *\n * @param template Template string to parse\n * @returns Array of parsed loops\n */\n parseLoops(template: string): ParsedLoop[] {\n const loops: ParsedLoop[] = [];\n const regex = new RegExp(EACH_REGEX.source, \"g\");\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(template)) !== null) {\n loops.push({\n match: match[0],\n variable: match[1] ?? \"\",\n body: match[2] ?? \"\",\n startIndex: match.index,\n endIndex: match.index + match[0].length,\n });\n }\n\n return loops;\n }\n\n /**\n * Get unique variable names from template (including nested paths)\n * Excludes loop-internal variables like {{this}}, {{@index}}, and item properties\n *\n * @param template Template string to analyze\n * @param excludeLoopInternal Whether to exclude variables inside loop blocks\n * @returns Unique variable names found in template\n */\n getVariableNames(template: string, excludeLoopInternal = true): string[] {\n let processedTemplate = template;\n\n // If excluding loop internals, remove loop body content first\n if (excludeLoopInternal) {\n processedTemplate = processedTemplate.replace(EACH_REGEX, (match, variable: string) => {\n // Keep only the loop variable reference\n return `{{${variable}}}`;\n });\n }\n\n const placeholders = this.parsePlaceholders(processedTemplate);\n const names = new Set<string>();\n\n // Special loop variables to always exclude\n const loopSpecialVars = new Set([\"this\", \"@index\", \"@first\", \"@last\"]);\n\n for (const p of placeholders) {\n // Skip special loop variables\n if (loopSpecialVars.has(p.name)) {\n continue;\n }\n\n // Add the full path\n names.add(p.name);\n // Also add the root variable for nested paths\n if (p.isNestedPath && p.pathSegments[0]) {\n names.add(p.pathSegments[0]);\n }\n }\n\n // Also extract variables from conditionals (but not inside loops if excluding)\n const conditionals = this.parseConditionals(processedTemplate);\n for (const c of conditionals) {\n names.add(c.variable);\n const root = c.variable.split(\".\")[0];\n if (root && root !== c.variable) {\n names.add(root);\n }\n }\n\n // Extract loop array variables\n const loops = this.parseLoops(template); // Use original template for loop detection\n for (const l of loops) {\n names.add(l.variable);\n const root = l.variable.split(\".\")[0];\n if (root && root !== l.variable) {\n names.add(root);\n }\n }\n\n return [...names];\n }\n\n /**\n * Get value from object using dot notation path\n *\n * @param obj Object to traverse\n * @param path Dot-separated path (e.g., \"user.address.city\")\n * @returns Value at path or undefined\n */\n getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const segments = path.split(\".\");\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (current === null || current === undefined) {\n return undefined;\n }\n if (typeof current !== \"object\") {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n }\n\n /**\n * Evaluate if a value is truthy for conditional blocks\n *\n * @param value Value to evaluate\n * @returns True if value is truthy\n */\n isTruthy(value: unknown): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value !== 0;\n }\n if (typeof value === \"string\") {\n return value.length > 0;\n }\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n if (typeof value === \"object\") {\n return Object.keys(value).length > 0;\n }\n return Boolean(value);\n }\n\n /**\n * Process conditional blocks in template\n *\n * @param template Template string\n * @param values Variable values\n * @returns Processed template with conditionals resolved\n */\n processConditionals(template: string, values: Record<string, unknown>): string {\n let result = template;\n\n // Process {{#if}} blocks\n result = result.replace(CONDITIONAL_REGEX, (match, variable: string, trueBranch: string, falseBranch?: string) => {\n const value = this.getNestedValue(values, variable);\n const condition = this.isTruthy(value);\n return condition ? trueBranch : (falseBranch ?? \"\");\n });\n\n // Process {{#unless}} blocks (inverse conditionals)\n result = result.replace(UNLESS_REGEX, (match, variable: string, content: string) => {\n const value = this.getNestedValue(values, variable);\n const condition = this.isTruthy(value);\n return condition ? \"\" : content;\n });\n\n return result;\n }\n\n /**\n * Process loop blocks in template\n *\n * @param template Template string\n * @param values Variable values\n * @returns Processed template with loops expanded\n */\n processLoops(template: string, values: Record<string, unknown>): string {\n let result = template;\n\n result = result.replace(EACH_REGEX, (match, variable: string, body: string) => {\n const arrayValue = this.getNestedValue(values, variable);\n\n if (!Array.isArray(arrayValue)) {\n // If not an array, return empty string\n return \"\";\n }\n\n // Expand the loop\n const expanded: string[] = [];\n for (let i = 0; i < arrayValue.length; i++) {\n const item = arrayValue[i];\n let iterationBody = body;\n\n // Replace special loop variables\n // {{this}} - current item (for primitives)\n // {{@index}} - current index\n // {{@first}} - true if first item\n // {{@last}} - true if last item\n iterationBody = iterationBody.replace(/\\{\\{this\\}\\}/g, this.stringify(item));\n iterationBody = iterationBody.replace(/\\{\\{@index\\}\\}/g, String(i));\n iterationBody = iterationBody.replace(/\\{\\{@first\\}\\}/g, String(i === 0));\n iterationBody = iterationBody.replace(/\\{\\{@last\\}\\}/g, String(i === arrayValue.length - 1));\n\n // If item is an object, process conditionals with item context first\n if (item !== null && typeof item === \"object\" && !Array.isArray(item)) {\n const itemObj = item as Record<string, unknown>;\n\n // Process conditionals within this iteration using item's properties\n iterationBody = this.processConditionals(iterationBody, itemObj);\n\n // Then replace any remaining simple property placeholders\n for (const [key, value] of Object.entries(itemObj)) {\n const propRegex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\");\n iterationBody = iterationBody.replace(propRegex, this.stringify(value));\n }\n }\n\n expanded.push(iterationBody);\n }\n\n return expanded.join(\"\");\n });\n\n return result;\n }\n\n /**\n * Validate provided variables against template requirements\n *\n * @param template Test template with variable definitions\n * @param values Provided variable values\n * @returns Validation result\n */\n validateVariables(\n template: TestTemplate,\n values: Record<string, unknown>\n ): ValidationResult {\n const results: VariableValidationResult[] = [];\n const missingRequired: string[] = [];\n const unknownVariables: string[] = [];\n const typeErrors: string[] = [];\n\n // Get variables used in template content\n const usedInTemplate = new Set(this.getVariableNames(template.template));\n\n // Create a map of defined variables for quick lookup\n const definedVariables = new Map<string, TemplateVariable>();\n for (const v of template.variables) {\n definedVariables.set(v.name, v);\n }\n\n // Check each defined variable\n for (const variable of template.variables) {\n const result: VariableValidationResult = {\n name: variable.name,\n valid: true,\n errors: [],\n };\n\n const value = values[variable.name];\n const hasValue = variable.name in values;\n\n // Check if required variable is missing\n if (variable.required && !hasValue && variable.defaultValue === undefined) {\n result.valid = false;\n result.errors.push(`Required variable '${variable.name}' is missing`);\n missingRequired.push(variable.name);\n }\n\n // Type check if value is provided\n if (hasValue && value !== undefined && value !== null) {\n const typeError = this.checkType(variable.name, value, variable.type);\n if (typeError) {\n result.valid = false;\n result.errors.push(typeError);\n typeErrors.push(typeError);\n }\n }\n\n results.push(result);\n }\n\n // Check for unknown variables in provided values\n const providedNames = Object.keys(values);\n for (const name of providedNames) {\n if (!definedVariables.has(name)) {\n // Check if it's used in template but not defined (include nested paths)\n const isUsed = [...usedInTemplate].some((used) => used === name || used.startsWith(name + \".\"));\n\n if (isUsed) {\n // It's used but not formally defined - allow it but warn\n results.push({\n name,\n valid: true,\n errors: [`Variable '${name}' is used in template but not formally defined`],\n });\n } else {\n unknownVariables.push(name);\n }\n }\n }\n\n // Check for placeholders in template that have no value\n for (const placeholder of usedInTemplate) {\n const defined = definedVariables.get(placeholder);\n // For nested paths, check if root variable is provided\n const rootVar = placeholder.split(\".\")[0] ?? placeholder;\n const hasValue = placeholder in values || rootVar in values;\n\n if (!hasValue && !defined?.defaultValue) {\n // Check if this is a required defined variable (already handled above)\n // or an undefined placeholder\n if (!defined) {\n // Only add root variables to missing (nested paths are covered by root)\n if (!placeholder.includes(\".\")) {\n missingRequired.push(placeholder);\n } else if (!(rootVar in values)) {\n missingRequired.push(rootVar);\n }\n }\n }\n }\n\n const valid =\n missingRequired.length === 0 &&\n typeErrors.length === 0 &&\n (unknownVariables.length === 0 || !this.options.strict);\n\n return {\n valid,\n results,\n missingRequired: [...new Set(missingRequired)],\n unknownVariables,\n typeErrors,\n };\n }\n\n /**\n * Check if a value matches the expected type\n */\n private checkType(name: string, value: unknown, expectedType: VariableType): string | null {\n const actualType = this.getValueType(value);\n\n if (actualType !== expectedType) {\n return `Variable '${name}' expected type '${expectedType}' but got '${actualType}'`;\n }\n\n return null;\n }\n\n /**\n * Determine the VariableType of a value\n */\n private getValueType(value: unknown): VariableType {\n if (value === null || value === undefined) {\n return \"string\"; // Treat null/undefined as string for placeholder purposes\n }\n\n if (Array.isArray(value)) {\n return \"array\";\n }\n\n if (typeof value === \"object\") {\n return \"object\";\n }\n\n if (typeof value === \"boolean\") {\n return \"boolean\";\n }\n\n if (typeof value === \"number\") {\n return \"number\";\n }\n\n return \"string\";\n }\n\n /**\n * Substitute variables in a template string\n *\n * @param template Template string with placeholders\n * @param values Variable values to substitute\n * @param variableDefs Optional variable definitions for defaults\n * @returns Substitution result\n */\n substituteVariables(\n template: string,\n values: Record<string, unknown>,\n variableDefs?: TemplateVariable[]\n ): { content: string; substituted: string[]; unresolved: string[] } {\n const substituted: string[] = [];\n const unresolved: string[] = [];\n\n // Build a values map including defaults\n const resolvedValues = new Map<string, unknown>();\n\n // Apply defaults first\n if (variableDefs) {\n for (const def of variableDefs) {\n if (def.defaultValue !== undefined) {\n resolvedValues.set(def.name, def.defaultValue);\n }\n }\n }\n\n // Apply provided values (override defaults)\n // Note: explicitly set undefined/null values to empty string\n for (const [key, value] of Object.entries(values)) {\n if (value === undefined || value === null) {\n resolvedValues.set(key, null); // Mark as explicitly set but empty\n } else {\n resolvedValues.set(key, value);\n }\n }\n\n // Build combined values object for nested access\n const combinedValues: Record<string, unknown> = {};\n for (const [key, value] of resolvedValues) {\n combinedValues[key] = value;\n }\n\n // Perform substitution\n const regex = this.getPlaceholderRegex();\n const content = template.replace(regex, (match, name: string) => {\n // Check for nested path\n let value: unknown;\n let hasValue = false;\n\n if (name.includes(\".\")) {\n value = this.getNestedValue(combinedValues, name);\n hasValue = value !== undefined;\n } else {\n hasValue = resolvedValues.has(name);\n value = resolvedValues.get(name);\n }\n\n if (hasValue) {\n substituted.push(name);\n return this.stringify(value);\n }\n\n if (this.options.allowUnresolved) {\n unresolved.push(name);\n return match;\n }\n\n unresolved.push(name);\n return match;\n });\n\n return {\n content,\n substituted: [...new Set(substituted)],\n unresolved: [...new Set(unresolved)],\n };\n }\n\n /**\n * Convert a value to string for template substitution\n */\n private stringify(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n // Format arrays appropriately for code context\n return JSON.stringify(value);\n }\n\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n\n return String(value);\n }\n\n /**\n * Process all template features: conditionals, loops, then variable substitution\n *\n * @param template Template string\n * @param values Variable values\n * @param variableDefs Optional variable definitions\n * @returns Processed content with all features applied\n */\n processTemplate(\n template: string,\n values: Record<string, unknown>,\n variableDefs?: TemplateVariable[]\n ): Result<{ content: string; substituted: string[]; unresolved: string[] }, PinataError> {\n // First, validate syntax\n const syntaxResult = this.validateSyntax(template);\n if (!syntaxResult.valid && this.options.strict) {\n return err(syntaxResult.errors[0] ?? new TemplateSyntaxError(\"Unknown syntax error\"));\n }\n\n // Build combined values with defaults\n const combinedValues: Record<string, unknown> = {};\n if (variableDefs) {\n for (const def of variableDefs) {\n if (def.defaultValue !== undefined) {\n combinedValues[def.name] = def.defaultValue;\n }\n }\n }\n for (const [key, value] of Object.entries(values)) {\n combinedValues[key] = value;\n }\n\n // Process in order: loops first, then conditionals, then simple substitution\n let processed = template;\n\n // Process loops (may create new content with placeholders)\n processed = this.processLoops(processed, combinedValues);\n\n // Process conditionals\n processed = this.processConditionals(processed, combinedValues);\n\n // Finally, substitute remaining variables\n const result = this.substituteVariables(processed, combinedValues, variableDefs);\n\n return ok(result);\n }\n\n /**\n * Render a complete test template with variable substitution\n *\n * @param template Test template to render\n * @param values Variable values to substitute\n * @param options Optional render options\n * @returns Render result or error\n */\n renderTemplate(\n template: TestTemplate,\n values: Record<string, unknown>,\n options?: RenderOptions\n ): Result<RenderResult, PinataError> {\n const mergedOptions = { ...this.options, ...options };\n\n // First validate syntax\n const syntaxResult = this.validateSyntax(template.template);\n if (!syntaxResult.valid && mergedOptions.strict) {\n return err(syntaxResult.errors[0] ?? new TemplateSyntaxError(\"Unknown syntax error\"));\n }\n\n // Validate variables\n const validation = this.validateVariables(template, values);\n\n if (!validation.valid && mergedOptions.strict) {\n const errors: string[] = [];\n\n if (validation.missingRequired.length > 0) {\n errors.push(`Missing required variables: ${validation.missingRequired.join(\", \")}`);\n }\n\n if (validation.typeErrors.length > 0) {\n errors.push(...validation.typeErrors);\n }\n\n if (validation.unknownVariables.length > 0) {\n errors.push(`Unknown variables: ${validation.unknownVariables.join(\", \")}`);\n }\n\n return err(\n new TemplateRenderError(\"Template validation failed\", {\n errors,\n validation,\n })\n );\n }\n\n // Process the template with all features\n const processResult = this.processTemplate(template.template, values, template.variables);\n if (!processResult.success) {\n return processResult;\n }\n\n const { content, substituted, unresolved } = processResult.data;\n\n // Check for unresolved if not allowed\n if (unresolved.length > 0 && !mergedOptions.allowUnresolved && mergedOptions.strict) {\n return err(\n new TemplateRenderError(\"Unresolved template variables\", {\n unresolved,\n })\n );\n }\n\n return ok({\n content,\n substituted,\n unresolved,\n imports: template.imports ?? [],\n fixtures: template.fixtures ?? [],\n });\n }\n\n /**\n * Render multiple templates at once\n *\n * @param templates Array of templates to render\n * @param values Variable values (applied to all templates)\n * @returns Array of render results\n */\n renderTemplates(\n templates: TestTemplate[],\n values: Record<string, unknown>\n ): Result<RenderResult[], PinataError> {\n const results: RenderResult[] = [];\n\n for (const template of templates) {\n const result = this.renderTemplate(template, values);\n if (!result.success) {\n return err(\n new TemplateRenderError(`Failed to render template '${template.id}'`, {\n templateId: template.id,\n originalError: result.error.message,\n })\n );\n }\n results.push(result.data);\n }\n\n return ok(results);\n }\n\n /**\n * Check if a template string contains nested placeholders\n * (e.g., {{outer{{inner}}}})\n *\n * @param template Template string to check\n * @returns True if nested placeholders detected\n */\n hasNestedPlaceholders(template: string): boolean {\n // Look for patterns like {{...{{...}}...}}\n const nestedPattern = /\\{\\{[^{}]*\\{\\{/;\n return nestedPattern.test(template);\n }\n\n /**\n * Extract all imports from rendered templates\n *\n * @param results Array of render results\n * @returns Deduplicated array of imports\n */\n collectImports(results: RenderResult[]): string[] {\n const imports = new Set<string>();\n for (const result of results) {\n for (const imp of result.imports) {\n imports.add(imp);\n }\n }\n return [...imports];\n }\n\n /**\n * Extract all fixtures from rendered templates\n *\n * @param results Array of render results\n * @returns Deduplicated array of fixtures\n */\n collectFixtures(results: RenderResult[]): string[] {\n const fixtures = new Set<string>();\n for (const result of results) {\n for (const fix of result.fixtures) {\n fixtures.add(fix);\n }\n }\n return [...fixtures];\n }\n\n /**\n * Get the appropriate regex for the configured placeholder format\n */\n private getPlaceholderRegex(): RegExp {\n switch (this.options.placeholderFormat) {\n case \"dollar\":\n // ${variableName} or ${user.name}\n return /\\$\\{([a-zA-Z][a-zA-Z0-9_.]*)\\}/g;\n case \"percent\":\n // %(variableName)s\n return /%\\(([a-zA-Z][a-zA-Z0-9_.]*)\\)s/g;\n case \"mustache\":\n default:\n // {{variableName}} or {{user.name}}\n return /\\{\\{([a-zA-Z][a-zA-Z0-9_.]*)\\}\\}/g;\n }\n }\n\n /**\n * Create a template from a string with variable definitions\n *\n * @param templateString Template content\n * @param variables Variable definitions\n * @param metadata Additional template metadata\n * @returns TestTemplate object\n */\n static createTemplate(\n templateString: string,\n variables: TemplateVariable[],\n metadata: Partial<Omit<TestTemplate, \"template\" | \"variables\">> = {}\n ): TestTemplate {\n return {\n id: metadata.id ?? \"custom-template\",\n language: metadata.language ?? \"typescript\",\n framework: metadata.framework ?? \"jest\",\n template: templateString,\n variables,\n imports: metadata.imports,\n fixtures: metadata.fixtures,\n description: metadata.description,\n };\n }\n}\n\n/**\n * Factory function to create a TemplateRenderer with default options\n */\nexport function createRenderer(options?: RenderOptions): TemplateRenderer {\n return new TemplateRenderer(options);\n}\n","import chalk from \"chalk\";\n\nimport type { CategorySummary } from \"../categories/schema/index.js\";\n\n/**\n * Output format types\n */\nexport type OutputFormat = \"terminal\" | \"json\" | \"markdown\";\n\n/**\n * Severity colors for terminal output\n */\nconst SEVERITY_COLORS = {\n critical: chalk.red.bold,\n high: chalk.red,\n medium: chalk.yellow,\n low: chalk.gray,\n};\n\n/**\n * Priority colors for terminal output\n */\nconst PRIORITY_COLORS = {\n P0: chalk.red.bold,\n P1: chalk.yellow,\n P2: chalk.gray,\n};\n\n/**\n * Domain colors for terminal output\n */\nconst DOMAIN_COLORS: Record<string, typeof chalk> = {\n security: chalk.red,\n data: chalk.blue,\n concurrency: chalk.magenta,\n input: chalk.cyan,\n resource: chalk.yellow,\n reliability: chalk.green,\n performance: chalk.yellowBright,\n platform: chalk.gray,\n business: chalk.white,\n compliance: chalk.blueBright,\n};\n\n/**\n * Format category list for terminal output with colors\n */\nexport function formatTerminal(categories: CategorySummary[]): string {\n if (categories.length === 0) {\n return chalk.yellow(\"No categories found matching the filters.\");\n }\n\n const lines: string[] = [];\n\n // Header\n lines.push(chalk.bold.underline(`Found ${categories.length} categories:\\n`));\n\n // Group by domain for better organization\n const byDomain = new Map<string, CategorySummary[]>();\n for (const cat of categories) {\n const domain = cat.domain;\n if (!byDomain.has(domain)) {\n byDomain.set(domain, []);\n }\n byDomain.get(domain)!.push(cat);\n }\n\n // Output each domain group\n for (const [domain, domainCategories] of byDomain) {\n const domainColor = DOMAIN_COLORS[domain] ?? chalk.white;\n lines.push(domainColor.bold(`\\n${domain.toUpperCase()} (${domainCategories.length})`));\n lines.push(chalk.gray(\"─\".repeat(40)));\n\n for (const cat of domainCategories) {\n const priorityColor = PRIORITY_COLORS[cat.priority];\n const severityColor = SEVERITY_COLORS[cat.severity];\n\n const priority = priorityColor(`[${cat.priority}]`);\n const severity = severityColor(`${cat.severity}`);\n const level = chalk.cyan(`${cat.level}`);\n const name = chalk.white.bold(cat.name);\n const id = chalk.gray(`(${cat.id})`);\n\n lines.push(` ${priority} ${name} ${id}`);\n lines.push(` ${severity} | ${level}`);\n\n // Truncate description\n const desc = cat.description.length > 80\n ? cat.description.slice(0, 77) + \"...\"\n : cat.description;\n lines.push(chalk.gray(` ${desc}`));\n lines.push(\"\");\n }\n }\n\n // Summary footer\n lines.push(chalk.gray(\"─\".repeat(40)));\n lines.push(formatStats(categories));\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format statistics summary\n */\nfunction formatStats(categories: CategorySummary[]): string {\n const stats = {\n P0: 0,\n P1: 0,\n P2: 0,\n critical: 0,\n high: 0,\n medium: 0,\n low: 0,\n };\n\n for (const cat of categories) {\n stats[cat.priority]++;\n stats[cat.severity]++;\n }\n\n const parts: string[] = [];\n\n if (stats.P0 > 0) parts.push(PRIORITY_COLORS.P0(`${stats.P0} P0`));\n if (stats.P1 > 0) parts.push(PRIORITY_COLORS.P1(`${stats.P1} P1`));\n if (stats.P2 > 0) parts.push(PRIORITY_COLORS.P2(`${stats.P2} P2`));\n\n parts.push(chalk.gray(\"|\"));\n\n if (stats.critical > 0) parts.push(SEVERITY_COLORS.critical(`${stats.critical} critical`));\n if (stats.high > 0) parts.push(SEVERITY_COLORS.high(`${stats.high} high`));\n if (stats.medium > 0) parts.push(SEVERITY_COLORS.medium(`${stats.medium} medium`));\n if (stats.low > 0) parts.push(SEVERITY_COLORS.low(`${stats.low} low`));\n\n return parts.join(\" \");\n}\n\n/**\n * Format category list as JSON\n */\nexport function formatJson(categories: CategorySummary[]): string {\n return JSON.stringify(categories, null, 2);\n}\n\n/**\n * Format category list as Markdown\n */\nexport function formatMarkdown(categories: CategorySummary[]): string {\n if (categories.length === 0) {\n return \"_No categories found matching the filters._\";\n }\n\n const lines: string[] = [];\n\n lines.push(`# Categories (${categories.length})\\n`);\n\n // Group by domain\n const byDomain = new Map<string, CategorySummary[]>();\n for (const cat of categories) {\n const domain = cat.domain;\n if (!byDomain.has(domain)) {\n byDomain.set(domain, []);\n }\n byDomain.get(domain)!.push(cat);\n }\n\n // Output each domain group\n for (const [domain, domainCategories] of byDomain) {\n lines.push(`\\n## ${domain.charAt(0).toUpperCase() + domain.slice(1)} (${domainCategories.length})\\n`);\n\n for (const cat of domainCategories) {\n lines.push(`### ${cat.name}`);\n lines.push(`- **ID**: \\`${cat.id}\\``);\n lines.push(`- **Priority**: ${cat.priority}`);\n lines.push(`- **Severity**: ${cat.severity}`);\n lines.push(`- **Level**: ${cat.level}`);\n lines.push(`\\n${cat.description}\\n`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format categories in the specified output format\n */\nexport function formatCategories(categories: CategorySummary[], format: OutputFormat): string {\n switch (format) {\n case \"json\":\n return formatJson(categories);\n case \"markdown\":\n return formatMarkdown(categories);\n case \"terminal\":\n default:\n return formatTerminal(categories);\n }\n}\n\n/**\n * Validate output format string\n */\nexport function isValidOutputFormat(format: string): format is OutputFormat {\n return [\"terminal\", \"json\", \"markdown\"].includes(format);\n}\n\n/**\n * Format an error for terminal output\n */\nexport function formatError(error: Error): string {\n return chalk.red(`Error: ${error.message}`);\n}\n\n/**\n * Format a warning for terminal output\n */\nexport function formatWarning(message: string): string {\n return chalk.yellow(`Warning: ${message}`);\n}\n\n/**\n * Format a success message for terminal output\n */\nexport function formatSuccess(message: string): string {\n return chalk.green(`✓ ${message}`);\n}\n","/**\n * Formatters for generate command output\n */\n\nimport { mkdir, writeFile, readFile } from \"fs/promises\";\nimport { basename, dirname, relative, resolve } from \"path\";\n\nimport chalk from \"chalk\";\n\nimport { PinataError } from \"../lib/errors.js\";\nimport { ok, err } from \"../lib/result.js\";\nimport { suggestVariables } from \"../ai/template-filler.js\";\n\nimport type { TestTemplate, Category, TemplateVariable } from \"../categories/schema/index.js\";\nimport type { Gap } from \"../core/scanner/types.js\";\nimport type { Result } from \"../lib/result.js\";\nimport type { RenderResult } from \"../templates/index.js\";\nimport type { AIConfig } from \"../ai/types.js\";\n\n\n\n/**\n * Generated test with metadata\n */\nexport interface GeneratedTest {\n /** Gap that this test addresses */\n gap: Gap;\n /** Category the gap belongs to */\n category: Category;\n /** Template used for generation */\n template: TestTemplate;\n /** Rendered test content */\n result: RenderResult;\n /** Suggested file path for the test */\n suggestedPath: string;\n}\n\n/**\n * Format generated tests for terminal output (dry run preview)\n */\nexport function formatGeneratedTerminal(tests: GeneratedTest[], basePath: string): string {\n const lines: string[] = [];\n\n if (tests.length === 0) {\n lines.push(chalk.yellow(\"No tests generated.\"));\n return lines.join(\"\\n\");\n }\n\n lines.push(chalk.bold.cyan(`\\nGenerated ${tests.length} test(s):\\n`));\n lines.push(chalk.gray(\"─\".repeat(60)));\n\n for (const test of tests) {\n const relGapPath = relative(basePath, test.gap.filePath);\n\n // Header\n lines.push(\"\");\n lines.push(chalk.bold.white(`Test for: ${test.gap.categoryName}`));\n lines.push(chalk.gray(` Gap location: ${relGapPath}:${test.gap.lineStart}`));\n lines.push(chalk.gray(` Template: ${test.template.id}`));\n lines.push(chalk.gray(` Output: ${test.suggestedPath}`));\n lines.push(\"\");\n\n // Code block with syntax highlighting hint\n lines.push(chalk.cyan(`// --- ${test.suggestedPath} ---`));\n lines.push(\"\");\n\n // Add imports if any\n if (test.result.imports.length > 0) {\n for (const imp of test.result.imports) {\n lines.push(chalk.gray(imp));\n }\n lines.push(\"\");\n }\n\n // Add the test content\n lines.push(test.result.content);\n lines.push(\"\");\n lines.push(chalk.gray(\"─\".repeat(60)));\n }\n\n // Summary\n lines.push(\"\");\n lines.push(chalk.bold(\"Summary:\"));\n lines.push(` Tests generated: ${chalk.green(tests.length.toString())}`);\n\n const categories = new Set(tests.map((t) => t.category.id));\n lines.push(` Categories covered: ${chalk.cyan(categories.size.toString())}`);\n\n if (tests.some((t) => t.result.unresolved.length > 0)) {\n const unresolvedCount = tests.reduce((acc, t) => acc + t.result.unresolved.length, 0);\n lines.push(chalk.yellow(` Unresolved placeholders: ${unresolvedCount}`));\n lines.push(chalk.gray(\" (Some placeholders need manual completion)\"));\n }\n\n lines.push(\"\");\n lines.push(chalk.gray(\"This is a dry run. Use --write to save files.\"));\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format generated tests as JSON\n */\nexport function formatGeneratedJson(tests: GeneratedTest[]): string {\n const output = tests.map((test) => ({\n gap: {\n categoryId: test.gap.categoryId,\n categoryName: test.gap.categoryName,\n filePath: test.gap.filePath,\n lineStart: test.gap.lineStart,\n severity: test.gap.severity,\n confidence: test.gap.confidence,\n },\n template: {\n id: test.template.id,\n framework: test.template.framework,\n language: test.template.language,\n },\n suggestedPath: test.suggestedPath,\n content: test.result.content,\n imports: test.result.imports,\n fixtures: test.result.fixtures,\n substituted: test.result.substituted,\n unresolved: test.result.unresolved,\n }));\n\n return JSON.stringify(output, null, 2);\n}\n\n/**\n * Generate suggested test file path based on source file and template\n */\nexport function suggestTestPath(\n sourceFile: string,\n template: TestTemplate,\n basePath: string\n): string {\n const dir = dirname(sourceFile);\n const name = basename(sourceFile);\n\n // Remove extension\n const nameWithoutExt = name.replace(/\\.[^.]+$/, \"\");\n\n // Determine test extension based on template language\n const extMap: Record<string, string> = {\n python: \".py\",\n typescript: \".ts\",\n javascript: \".js\",\n go: \"_test.go\",\n java: \"Test.java\",\n rust: \".rs\",\n };\n const ext = extMap[template.language] ?? \".test.ts\";\n\n // Determine test naming convention based on language\n let testFileName: string;\n switch (template.language) {\n case \"python\":\n testFileName = `test_${nameWithoutExt}${ext}`;\n break;\n case \"go\":\n testFileName = `${nameWithoutExt}${ext}`;\n break;\n case \"java\":\n testFileName = `${nameWithoutExt}${ext}`;\n break;\n default:\n testFileName = `${nameWithoutExt}.test${ext}`;\n }\n\n // For now, suggest putting tests next to source files\n // A more sophisticated approach would use project conventions\n const relativeSrc = relative(basePath, dir);\n const testDir = relativeSrc.replace(/^src/, \"tests\");\n\n return `${testDir}/${testFileName}`;\n}\n\n/**\n * Extract template variables from a gap\n */\nexport function extractVariablesFromGap(gap: Gap): Record<string, unknown> {\n // Extract useful info from the gap for template substitution\n const fileName = basename(gap.filePath);\n const fileNameWithoutExt = fileName.replace(/\\.[^.]+$/, \"\");\n\n // Try to extract function/class name from code snippet\n const funcMatch = gap.codeSnippet.match(/(?:def|function|async function|const|let|var)\\s+(\\w+)/);\n const classMatch = gap.codeSnippet.match(/(?:class)\\s+(\\w+)/);\n\n return {\n // File info\n filePath: gap.filePath,\n fileName,\n fileNameWithoutExt,\n lineNumber: gap.lineStart,\n\n // Category info\n categoryId: gap.categoryId,\n categoryName: gap.categoryName,\n domain: gap.domain,\n level: gap.level,\n severity: gap.severity,\n confidence: gap.confidence,\n\n // Code context\n codeSnippet: gap.codeSnippet,\n functionName: funcMatch?.[1] ?? \"targetFunction\",\n className: classMatch?.[1] ?? \"TargetClass\",\n\n // Common template variables\n testName: `test_${gap.categoryId.replace(/-/g, \"_\")}`,\n testDescription: `Test for ${gap.categoryName} in ${fileName}:${gap.lineStart}`,\n\n // Pattern info\n patternId: gap.patternId,\n patternType: gap.patternType,\n };\n}\n\n/**\n * Extract template variables using AI for smarter filling\n *\n * Falls back to rule-based extraction if AI is not available\n */\nexport async function extractVariablesWithAI(\n gap: Gap,\n templateVariables: TemplateVariable[],\n aiConfig?: Partial<AIConfig>\n): Promise<Record<string, unknown>> {\n // Start with basic extraction\n const baseVars = extractVariablesFromGap(gap);\n\n // Use AI to fill remaining template variables\n const result = await suggestVariables(\n {\n codeSnippet: gap.codeSnippet,\n filePath: gap.filePath,\n variables: templateVariables,\n gap,\n existingValues: baseVars,\n },\n aiConfig\n );\n\n if (result.success && result.data) {\n return result.data.values;\n }\n\n // Fallback to base variables\n return baseVars;\n}\n\n/**\n * Result of writing a test file\n */\nexport interface WriteResult {\n /** Path where file was written */\n path: string;\n /** Whether the file was created (vs updated) */\n created: boolean;\n /** Whether content was appended to existing file */\n appended: boolean;\n /** Category ID this test is for */\n categoryId: string;\n /** Gap location */\n gapLocation: string;\n}\n\n/**\n * Summary of all written files\n */\nexport interface WriteSummary {\n /** Files that were created */\n created: WriteResult[];\n /** Files that were updated (appended) */\n updated: WriteResult[];\n /** Files that failed to write */\n failed: Array<{ path: string; error: string }>;\n /** Total tests written */\n totalTests: number;\n}\n\n/**\n * Write generated tests to disk\n *\n * @param tests Generated tests to write\n * @param basePath Base path for resolving output paths\n * @param outputDir Optional override for output directory\n * @returns Write summary\n */\nexport async function writeGeneratedTests(\n tests: GeneratedTest[],\n basePath: string,\n outputDir?: string\n): Promise<Result<WriteSummary, PinataError>> {\n const summary: WriteSummary = {\n created: [],\n updated: [],\n failed: [],\n totalTests: 0,\n };\n\n // Group tests by output file to combine tests for same file\n const testsByFile = new Map<string, GeneratedTest[]>();\n for (const test of tests) {\n // Resolve the actual output path\n let outputPath: string;\n if (outputDir) {\n // Use custom output directory\n outputPath = resolve(basePath, outputDir, test.suggestedPath);\n } else {\n // Use suggested path relative to base\n outputPath = resolve(basePath, test.suggestedPath);\n }\n\n const existing = testsByFile.get(outputPath) ?? [];\n existing.push(test);\n testsByFile.set(outputPath, existing);\n }\n\n // Write each file\n for (const [outputPath, fileTests] of testsByFile) {\n try {\n // Ensure directory exists (idempotent, no race condition)\n const dir = dirname(outputPath);\n await mkdir(dir, { recursive: true });\n\n // Try to read existing file content (avoids TOCTOU race condition)\n let existingContent = \"\";\n let fileExists = false;\n try {\n existingContent = await readFile(outputPath, \"utf-8\");\n fileExists = true;\n } catch {\n // File doesn't exist - that's fine\n }\n\n // Build content for this file\n const contentParts: string[] = [];\n\n // Collect all imports from all tests\n const allImports = new Set<string>();\n for (const test of fileTests) {\n for (const imp of test.result.imports) {\n allImports.add(imp);\n }\n }\n\n // Add imports header if any and file is new\n if (!fileExists && allImports.size > 0) {\n contentParts.push(Array.from(allImports).join(\"\\n\"));\n contentParts.push(\"\");\n }\n\n // Add each test's content\n for (const test of fileTests) {\n // Add a comment header for each test\n contentParts.push(`// Test for ${test.gap.categoryName}`);\n contentParts.push(`// Gap: ${relative(basePath, test.gap.filePath)}:${test.gap.lineStart}`);\n contentParts.push(`// Generated by Pinata`);\n contentParts.push(\"\");\n contentParts.push(test.result.content);\n contentParts.push(\"\");\n }\n\n const newContent = contentParts.join(\"\\n\");\n\n // Determine how to write\n let finalContent: string;\n let appended = false;\n\n if (fileExists) {\n // Append to existing file\n finalContent = existingContent.trimEnd() + \"\\n\\n\" + newContent;\n appended = true;\n } else {\n // Create new file\n finalContent = newContent;\n }\n\n // Write the file\n await writeFile(outputPath, finalContent, \"utf-8\");\n\n // Record results\n for (const test of fileTests) {\n const result: WriteResult = {\n path: outputPath,\n created: !fileExists,\n appended,\n categoryId: test.gap.categoryId,\n gapLocation: `${relative(basePath, test.gap.filePath)}:${test.gap.lineStart}`,\n };\n\n if (fileExists) {\n summary.updated.push(result);\n } else {\n summary.created.push(result);\n }\n summary.totalTests++;\n }\n } catch (error) {\n summary.failed.push({\n path: outputPath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return ok(summary);\n}\n\n/**\n * Format write summary for terminal output\n */\nexport function formatWriteSummary(summary: WriteSummary, basePath: string): string {\n const lines: string[] = [];\n\n lines.push(\"\");\n lines.push(chalk.bold.cyan(\"Write Summary:\"));\n lines.push(chalk.gray(\"─\".repeat(60)));\n\n // Created files\n if (summary.created.length > 0) {\n const uniquePaths = new Set(summary.created.map((r) => r.path));\n lines.push(\"\");\n lines.push(chalk.green.bold(`Created ${uniquePaths.size} file(s):`));\n for (const path of uniquePaths) {\n const relPath = relative(basePath, path);\n const testsInFile = summary.created.filter((r) => r.path === path).length;\n lines.push(chalk.green(` + ${relPath} (${testsInFile} test(s))`));\n }\n }\n\n // Updated files\n if (summary.updated.length > 0) {\n const uniquePaths = new Set(summary.updated.map((r) => r.path));\n lines.push(\"\");\n lines.push(chalk.yellow.bold(`Updated ${uniquePaths.size} file(s):`));\n for (const path of uniquePaths) {\n const relPath = relative(basePath, path);\n const testsInFile = summary.updated.filter((r) => r.path === path).length;\n lines.push(chalk.yellow(` ~ ${relPath} (${testsInFile} test(s) appended)`));\n }\n }\n\n // Failed files\n if (summary.failed.length > 0) {\n lines.push(\"\");\n lines.push(chalk.red.bold(`Failed to write ${summary.failed.length} file(s):`));\n for (const fail of summary.failed) {\n const relPath = relative(basePath, fail.path);\n lines.push(chalk.red(` ✗ ${relPath}: ${fail.error}`));\n }\n }\n\n // Summary\n lines.push(\"\");\n lines.push(chalk.gray(\"─\".repeat(60)));\n lines.push(chalk.bold(`Total: ${summary.totalTests} test(s) written to ${new Set([...summary.created.map((r) => r.path), ...summary.updated.map((r) => r.path)]).size} file(s)`));\n\n if (summary.failed.length > 0) {\n lines.push(chalk.red(`Failures: ${summary.failed.length}`));\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * AI Service Implementation\n *\n * Provides a unified interface for AI completions across providers.\n * Supports Anthropic Claude and OpenAI GPT models.\n */\n\nimport type {\n AIConfig,\n AIProvider,\n AIResponse,\n CompletionRequest,\n} from \"./types.js\";\n\nconst DEFAULT_CONFIG: Required<AIConfig> = {\n provider: \"anthropic\",\n apiKey: \"\",\n model: \"claude-sonnet-4-20250514\",\n maxTokens: 1024,\n temperature: 0.3,\n timeoutMs: 30000,\n};\n\nconst PROVIDER_MODELS: Record<AIProvider, string> = {\n anthropic: \"claude-sonnet-4-20250514\",\n openai: \"gpt-4o\",\n mock: \"mock-model\",\n};\n\nconst PROVIDER_ENDPOINTS: Record<AIProvider, string> = {\n anthropic: \"https://api.anthropic.com/v1/messages\",\n openai: \"https://api.openai.com/v1/chat/completions\",\n mock: \"\",\n};\n\n/**\n * AI Service for generating completions\n */\nexport class AIService {\n private readonly config: Required<AIConfig>;\n\n constructor(config: Partial<AIConfig> = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n apiKey: config.apiKey ?? this.getApiKeyFromEnv(config.provider ?? \"anthropic\"),\n model: config.model ?? PROVIDER_MODELS[config.provider ?? \"anthropic\"],\n };\n }\n\n /**\n * Get API key from environment variable\n * For config file support, use the sync version below\n */\n private getApiKeyFromEnv(provider: AIProvider): string {\n if (provider === \"mock\") return \"mock-key\";\n\n const envVar = provider === \"anthropic\" ? \"ANTHROPIC_API_KEY\" : \"OPENAI_API_KEY\";\n const envValue = process.env[envVar];\n if (envValue !== undefined && envValue.length > 0) {\n return envValue;\n }\n\n // Try sync config file read (works in Node.js)\n return this.getApiKeyFromConfig(provider);\n }\n\n /**\n * Read API key from config file synchronously\n * Uses require() for sync file access in constructor context\n */\n private getApiKeyFromConfig(provider: AIProvider): string {\n try {\n /* eslint-disable @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */\n const { existsSync, readFileSync } = require(\"node:fs\") as typeof import(\"fs\");\n const { homedir } = require(\"node:os\") as typeof import(\"os\");\n const { join } = require(\"node:path\") as typeof import(\"path\");\n /* eslint-enable @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */\n\n const configPath = join(homedir(), \".pinata\", \"config.json\");\n if (!existsSync(configPath)) {\n return \"\";\n }\n\n const content = readFileSync(configPath, \"utf-8\");\n const config = JSON.parse(content) as {\n anthropicApiKey?: string;\n openaiApiKey?: string;\n };\n\n return (provider === \"anthropic\" ? config.anthropicApiKey : config.openaiApiKey) ?? \"\";\n } catch {\n return \"\";\n }\n }\n\n /**\n * Check if the service is configured with an API key\n */\n isConfigured(): boolean {\n return this.config.provider === \"mock\" || this.config.apiKey.length > 0;\n }\n\n /**\n * Get the current provider\n */\n getProvider(): AIProvider {\n return this.config.provider;\n }\n\n /**\n * Generate a completion\n */\n async complete(request: CompletionRequest): Promise<AIResponse<string>> {\n const startTime = Date.now();\n\n if (!this.isConfigured()) {\n return {\n success: false,\n error: `API key not configured for ${this.config.provider}. Set ${this.config.provider === \"anthropic\" ? \"ANTHROPIC_API_KEY\" : \"OPENAI_API_KEY\"} environment variable.`,\n durationMs: Date.now() - startTime,\n };\n }\n\n if (this.config.provider === \"mock\") {\n return this.mockComplete(request, startTime);\n }\n\n try {\n const response = await this.callProvider(request);\n return {\n success: true,\n data: response.content,\n usage: response.usage,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n durationMs: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Generate a JSON completion (parses response as JSON)\n */\n async completeJSON<T>(request: CompletionRequest): Promise<AIResponse<T>> {\n const response = await this.complete({\n ...request,\n messages: [\n ...request.messages,\n {\n role: \"user\",\n content: \"\\n\\nRespond with valid JSON only. No markdown, no explanation.\",\n },\n ],\n });\n\n if (!response.success || response.data === undefined) {\n return {\n success: false,\n error: response.error ?? \"No response data\",\n durationMs: response.durationMs,\n };\n }\n\n try {\n // Extract JSON from response (handle markdown code blocks)\n let jsonStr = response.data;\n const jsonMatch = jsonStr.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (jsonMatch) {\n jsonStr = jsonMatch[1] ?? jsonStr;\n }\n\n // Try to find JSON object or array\n const objectMatch = jsonStr.match(/\\{[\\s\\S]*\\}/);\n const arrayMatch = jsonStr.match(/\\[[\\s\\S]*\\]/);\n jsonStr = objectMatch?.[0] ?? arrayMatch?.[0] ?? jsonStr;\n\n const parsed = JSON.parse(jsonStr.trim()) as T;\n const result: AIResponse<T> = {\n success: true,\n data: parsed,\n durationMs: response.durationMs,\n };\n if (response.usage) {\n result.usage = response.usage;\n }\n return result;\n } catch (error) {\n return {\n success: false,\n error: `Failed to parse JSON response: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n durationMs: response.durationMs,\n };\n }\n }\n\n /**\n * Call the AI provider API\n */\n private async callProvider(request: CompletionRequest): Promise<{\n content: string;\n usage: { inputTokens: number; outputTokens: number };\n }> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs);\n\n try {\n if (this.config.provider === \"anthropic\") {\n return await this.callAnthropic(request, controller.signal);\n } else {\n return await this.callOpenAI(request, controller.signal);\n }\n } finally {\n clearTimeout(timeout);\n }\n }\n\n /**\n * Call Anthropic API\n */\n private async callAnthropic(\n request: CompletionRequest,\n signal: AbortSignal\n ): Promise<{ content: string; usage: { inputTokens: number; outputTokens: number } }> {\n const messages = request.messages.filter((m) => m.role !== \"system\");\n\n const response = await fetch(PROVIDER_ENDPOINTS.anthropic, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.config.apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: request.maxTokens ?? this.config.maxTokens,\n temperature: request.temperature ?? this.config.temperature,\n system: request.systemPrompt,\n messages: messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as {\n content: Array<{ text: string }>;\n usage: { input_tokens: number; output_tokens: number };\n };\n\n return {\n content: data.content[0]?.text ?? \"\",\n usage: {\n inputTokens: data.usage.input_tokens,\n outputTokens: data.usage.output_tokens,\n },\n };\n }\n\n /**\n * Call OpenAI API\n */\n private async callOpenAI(\n request: CompletionRequest,\n signal: AbortSignal\n ): Promise<{ content: string; usage: { inputTokens: number; outputTokens: number } }> {\n const messages: Array<{ role: string; content: string }> = [];\n\n if (request.systemPrompt !== undefined && request.systemPrompt.length > 0) {\n messages.push({ role: \"system\", content: request.systemPrompt });\n }\n\n for (const m of request.messages) {\n messages.push({ role: m.role, content: m.content });\n }\n\n const response = await fetch(PROVIDER_ENDPOINTS.openai, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: request.maxTokens ?? this.config.maxTokens,\n temperature: request.temperature ?? this.config.temperature,\n messages,\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as {\n choices: Array<{ message: { content: string } }>;\n usage: { prompt_tokens: number; completion_tokens: number };\n };\n\n return {\n content: data.choices[0]?.message.content ?? \"\",\n usage: {\n inputTokens: data.usage.prompt_tokens,\n outputTokens: data.usage.completion_tokens,\n },\n };\n }\n\n /**\n * Mock completion for testing\n */\n private mockComplete(request: CompletionRequest, startTime: number): AIResponse<string> {\n const lastMessage = request.messages[request.messages.length - 1];\n const content = lastMessage?.content ?? \"\";\n\n // Generate mock responses based on content\n let response = \"Mock AI response\";\n\n if (content.includes(\"explain\") || content.includes(\"explanation\")) {\n response = JSON.stringify({\n summary: \"This code pattern may introduce a security vulnerability.\",\n explanation: \"The detected pattern suggests potential security risk.\",\n risk: \"An attacker could exploit this vulnerability to compromise the system.\",\n remediation: \"Use parameterized queries or proper input validation.\",\n safeExample: \"cursor.execute('SELECT * FROM users WHERE id = ?', (user_id,))\",\n });\n } else if (content.includes(\"variable\") || content.includes(\"template\")) {\n response = JSON.stringify({\n suggestions: [\n {\n name: \"className\",\n value: \"UserService\",\n reasoning: \"Based on the file name and context\",\n confidence: 0.8,\n },\n {\n name: \"functionName\",\n value: \"get_user\",\n reasoning: \"Extracted from the code snippet\",\n confidence: 0.9,\n },\n ],\n });\n } else if (content.includes(\"pattern\") || content.includes(\"regex\")) {\n response = JSON.stringify({\n suggestions: [\n {\n id: \"custom-sql-pattern\",\n pattern: \"execute\\\\s*\\\\(.*\\\\+\",\n description: \"Detects SQL execution with string concatenation\",\n confidence: \"medium\",\n matchExample: \"cursor.execute(query + user_input)\",\n safeExample: \"cursor.execute(query, (user_input,))\",\n reasoning: \"String concatenation in SQL queries is a common injection vector\",\n },\n ],\n });\n }\n\n return {\n success: true,\n data: response,\n usage: { inputTokens: 100, outputTokens: 50 },\n durationMs: Date.now() - startTime,\n };\n }\n}\n\n/**\n * Create an AI service instance\n */\nexport function createAIService(config?: Partial<AIConfig>): AIService {\n return new AIService(config);\n}\n","/**\n * AI Template Variable Filler\n *\n * Uses AI to intelligently fill template variables based on context.\n */\n\nimport { createAIService } from \"./service.js\";\n\nimport type { AIConfig, AIResponse, VariableSuggestion } from \"./types.js\";\nimport type { TemplateVariable } from \"../categories/schema/index.js\";\nimport type { Gap } from \"../core/scanner/types.js\";\n\nconst SYSTEM_PROMPT = `You are an expert at analyzing code and extracting meaningful variable values for test generation.\nGiven a code snippet and a list of template variables, suggest appropriate values for each variable.\n\nFor each variable, analyze:\n1. The code snippet to extract relevant information (class names, function names, etc.)\n2. The variable description to understand what's needed\n3. The variable type to ensure correct formatting\n\nAlways respond with valid JSON matching this structure:\n{\n \"suggestions\": [\n {\n \"name\": \"variableName\",\n \"value\": \"suggested value\",\n \"reasoning\": \"why this value was chosen\",\n \"confidence\": 0.0-1.0\n }\n ]\n}\n\nFor arrays, use: \"value\": [\"item1\", \"item2\"]\nFor booleans, use: \"value\": true or \"value\": false\nFor numbers, use: \"value\": 42`;\n\nexport interface VariableFillRequest {\n /** Code snippet for context */\n codeSnippet: string;\n /** File path for additional context */\n filePath: string;\n /** Template variables to fill */\n variables: TemplateVariable[];\n /** Optional gap information */\n gap?: Gap;\n /** Any pre-filled values to exclude */\n existingValues?: Record<string, unknown>;\n}\n\nexport interface VariableFillResult {\n /** Suggested values for each variable */\n suggestions: Map<string, VariableSuggestion>;\n /** Variables that couldn't be filled */\n unfilled: string[];\n /** Merged values (suggestions + existing) */\n values: Record<string, unknown>;\n}\n\n/**\n * Suggest variable values for a template\n */\nexport async function suggestVariables(\n request: VariableFillRequest,\n config?: Partial<AIConfig>\n): Promise<AIResponse<VariableFillResult>> {\n const ai = createAIService(config);\n\n if (!ai.isConfigured()) {\n // Fall back to rule-based extraction\n return {\n success: true,\n data: extractVariablesFromCode(request),\n durationMs: 0,\n };\n }\n\n const prompt = buildVariablePrompt(request);\n const startTime = Date.now();\n\n const response = await ai.completeJSON<{ suggestions: VariableSuggestion[] }>({\n systemPrompt: SYSTEM_PROMPT,\n messages: [{ role: \"user\", content: prompt }],\n maxTokens: 1024,\n temperature: 0.2,\n });\n\n if (!response.success || !response.data) {\n // Fall back to rule-based extraction\n return {\n success: true,\n data: extractVariablesFromCode(request),\n durationMs: Date.now() - startTime,\n };\n }\n\n // Process AI suggestions\n const suggestions = new Map<string, VariableSuggestion>();\n const unfilled: string[] = [];\n const values: Record<string, unknown> = { ...request.existingValues };\n\n const suggestionsList = response.data.suggestions ?? [];\n for (const suggestion of suggestionsList) {\n suggestions.set(suggestion.name, suggestion);\n if (!(suggestion.name in values)) {\n values[suggestion.name] = suggestion.value;\n }\n }\n\n // Check for unfilled variables\n for (const variable of request.variables) {\n if (!suggestions.has(variable.name) && !(variable.name in values)) {\n if (variable.defaultValue !== undefined) {\n values[variable.name] = variable.defaultValue;\n } else {\n unfilled.push(variable.name);\n }\n }\n }\n\n const result: AIResponse<VariableFillResult> = {\n success: true,\n data: { suggestions, unfilled, values },\n durationMs: response.durationMs,\n };\n\n if (response.usage) {\n result.usage = response.usage;\n }\n\n return result;\n}\n\n/**\n * Build the prompt for variable suggestion\n */\nfunction buildVariablePrompt(request: VariableFillRequest): string {\n const parts: string[] = [];\n\n parts.push(\"Analyze this code and suggest values for the template variables:\\n\");\n\n parts.push(\"**Code:**\");\n parts.push(\"```\");\n parts.push(request.codeSnippet);\n parts.push(\"```\\n\");\n\n parts.push(`**File:** ${request.filePath}\\n`);\n\n if (request.gap) {\n parts.push(`**Category:** ${request.gap.categoryName}`);\n parts.push(`**Line:** ${request.gap.lineStart}\\n`);\n }\n\n parts.push(\"**Variables to fill:**\");\n for (const variable of request.variables) {\n const required = variable.required ? \" (required)\" : \" (optional)\";\n const defaultVal = variable.defaultValue !== undefined\n ? ` [default: ${JSON.stringify(variable.defaultValue)}]`\n : \"\";\n parts.push(`- ${variable.name} (${variable.type})${required}${defaultVal}: ${variable.description}`);\n }\n\n if (request.existingValues && Object.keys(request.existingValues).length > 0) {\n parts.push(\"\\n**Already provided:**\");\n for (const [name, value] of Object.entries(request.existingValues)) {\n parts.push(`- ${name}: ${JSON.stringify(value)}`);\n }\n }\n\n parts.push(\"\\nExtract appropriate values from the code context.\");\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Rule-based variable extraction (fallback when AI is not available)\n */\nfunction extractVariablesFromCode(request: VariableFillRequest): VariableFillResult {\n const suggestions = new Map<string, VariableSuggestion>();\n const unfilled: string[] = [];\n const values: Record<string, unknown> = { ...request.existingValues };\n\n const code = request.codeSnippet;\n const filePath = request.filePath;\n\n for (const variable of request.variables) {\n if (variable.name in values) continue;\n\n let value: unknown = undefined;\n let reasoning = \"\";\n let confidence = 0;\n\n switch (variable.name.toLowerCase()) {\n case \"classname\":\n case \"class_name\": {\n // Extract class name from code or file\n const classMatch = code.match(/class\\s+(\\w+)/);\n if (classMatch) {\n value = classMatch[1];\n reasoning = \"Extracted from class definition in code\";\n confidence = 0.9;\n } else {\n // Try to infer from file name\n const fileName = filePath.split(\"/\").pop()?.replace(/\\.\\w+$/, \"\") ?? \"\";\n value = toPascalCase(fileName);\n reasoning = \"Inferred from file name\";\n confidence = 0.6;\n }\n break;\n }\n\n case \"functionname\":\n case \"function_name\":\n case \"methodname\": {\n // Extract function name from code\n const funcMatch = code.match(/(?:def|function|async function)\\s+(\\w+)/);\n if (funcMatch) {\n value = funcMatch[1];\n reasoning = \"Extracted from function definition\";\n confidence = 0.9;\n }\n break;\n }\n\n case \"modulepath\":\n case \"module_path\": {\n // Convert file path to module path\n value = filePath\n .replace(/\\.[jt]sx?$/, \"\")\n .replace(/\\.py$/, \"\")\n .replace(/\\//g, \".\")\n .replace(/^\\.+/, \"\");\n reasoning = \"Derived from file path\";\n confidence = 0.7;\n break;\n }\n\n case \"tablename\":\n case \"table_name\": {\n // Look for table name in SQL\n const tableMatch = code.match(/(?:FROM|INTO|UPDATE)\\s+(\\w+)/i);\n if (tableMatch) {\n value = tableMatch[1];\n reasoning = \"Extracted from SQL statement\";\n confidence = 0.8;\n } else {\n value = \"users\";\n reasoning = \"Default table name\";\n confidence = 0.3;\n }\n break;\n }\n\n case \"exceptionclass\":\n case \"exception_class\": {\n value = \"ValueError\";\n reasoning = \"Common exception for input validation\";\n confidence = 0.5;\n break;\n }\n\n case \"dbclient\":\n case \"db_client\": {\n // Look for database client variable\n const clientMatch = code.match(/(db|conn|connection|client|cursor)\\s*[=.]/i);\n if (clientMatch) {\n value = clientMatch[1];\n reasoning = \"Extracted from code\";\n confidence = 0.7;\n } else {\n value = \"db\";\n reasoning = \"Default database client name\";\n confidence = 0.4;\n }\n break;\n }\n\n case \"functioncall\":\n case \"function_call\": {\n const funcName = values[\"functionName\"] ?? values[\"function_name\"];\n if (typeof funcName === \"string\" && funcName.length > 0) {\n value = `${funcName}(user_input)`;\n reasoning = \"Constructed from function name\";\n confidence = 0.6;\n }\n break;\n }\n\n case \"fixtures\": {\n value = \"db_session\";\n reasoning = \"Common pytest fixture\";\n confidence = 0.5;\n break;\n }\n\n default:\n // Use default value if available\n if (variable.defaultValue !== undefined) {\n value = variable.defaultValue;\n reasoning = \"Using default value\";\n confidence = 1.0;\n }\n }\n\n if (value !== undefined) {\n suggestions.set(variable.name, {\n name: variable.name,\n value: value as string | number | boolean | string[],\n reasoning,\n confidence,\n });\n values[variable.name] = value;\n } else if (variable.required) {\n unfilled.push(variable.name);\n }\n }\n\n return { suggestions, unfilled, values };\n}\n\n/**\n * Convert string to PascalCase\n */\nfunction toPascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\"\");\n}\n","/**\n * Gap Explainer\n *\n * Uses AI to generate natural language explanations of detected gaps.\n */\n\nimport { createAIService } from \"./service.js\";\n\nimport type { AIConfig, AIResponse, GapExplanation } from \"./types.js\";\nimport type { Category } from \"../categories/schema/index.js\";\nimport type { Gap } from \"../core/scanner/types.js\";\n\nconst SYSTEM_PROMPT = `You are a security expert explaining code vulnerabilities to developers.\nYour explanations should be:\n- Clear and actionable\n- Focused on the specific code pattern\n- Include concrete remediation steps\n- Reference relevant security standards (OWASP, CWE) when applicable\n\nAlways respond with valid JSON matching this structure:\n{\n \"summary\": \"1-2 sentence summary\",\n \"explanation\": \"Detailed explanation of the vulnerability\",\n \"risk\": \"What an attacker could do if this is exploited\",\n \"remediation\": \"Step-by-step instructions to fix\",\n \"safeExample\": \"Code example showing the safe pattern\",\n \"references\": [\"optional array of CVE/CWE/OWASP references\"]\n}`;\n\n/**\n * Explain a single gap\n */\nexport async function explainGap(\n gap: Gap,\n category?: Category,\n config?: Partial<AIConfig>\n): Promise<AIResponse<GapExplanation>> {\n const ai = createAIService(config);\n\n if (!ai.isConfigured()) {\n return {\n success: false,\n error: \"AI service not configured\",\n durationMs: 0,\n };\n }\n\n const prompt = buildExplainPrompt(gap, category);\n\n const response = await ai.completeJSON<GapExplanation>({\n systemPrompt: SYSTEM_PROMPT,\n messages: [{ role: \"user\", content: prompt }],\n maxTokens: 1024,\n temperature: 0.3,\n });\n\n return response;\n}\n\n/**\n * Explain multiple gaps in batch\n */\nexport async function explainGaps(\n gaps: Gap[],\n categories?: Map<string, Category>,\n config?: Partial<AIConfig>\n): Promise<Map<string, AIResponse<GapExplanation>>> {\n const results = new Map<string, AIResponse<GapExplanation>>();\n\n // Process in parallel with concurrency limit\n const BATCH_SIZE = 5;\n\n for (let i = 0; i < gaps.length; i += BATCH_SIZE) {\n const batch = gaps.slice(i, i + BATCH_SIZE);\n const promises = batch.map(async (gap) => {\n const category = categories?.get(gap.categoryId);\n const result = await explainGap(gap, category, config);\n return { key: `${gap.filePath}:${gap.lineStart}:${gap.categoryId}`, result };\n });\n\n const batchResults = await Promise.all(promises);\n for (const { key, result } of batchResults) {\n results.set(key, result);\n }\n }\n\n return results;\n}\n\n/**\n * Build the explanation prompt for a gap\n */\nfunction buildExplainPrompt(gap: Gap, category?: Category): string {\n const parts: string[] = [];\n\n parts.push(`Explain this security finding:\\n`);\n\n parts.push(`**Category:** ${gap.categoryName} (${gap.categoryId})`);\n parts.push(`**Severity:** ${gap.severity}`);\n parts.push(`**Confidence:** ${gap.confidence}`);\n parts.push(`**File:** ${gap.filePath}`);\n parts.push(`**Line:** ${gap.lineStart}`);\n\n if (gap.codeSnippet) {\n parts.push(`\\n**Code:**\\n\\`\\`\\`\\n${gap.codeSnippet}\\n\\`\\`\\``);\n }\n\n parts.push(`\\n**Pattern:** ${gap.patternId}`);\n parts.push(`**Detection Type:** ${gap.patternType}`);\n\n if (category) {\n parts.push(`\\n**Category Description:** ${category.description}`);\n\n if (category.cves && category.cves.length > 0) {\n parts.push(`**Related CVEs:** ${category.cves.join(\", \")}`);\n }\n\n if (category.references && category.references.length > 0) {\n parts.push(`**References:** ${category.references.slice(0, 3).join(\", \")}`);\n }\n }\n\n parts.push(`\\nProvide a clear, actionable explanation for a developer.`);\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Generate a quick summary without AI (fallback)\n */\nexport function generateFallbackExplanation(gap: Gap): GapExplanation {\n const summaries: Record<string, string> = {\n \"sql-injection\": \"SQL query constructed with user input may allow injection attacks.\",\n \"xss\": \"User input rendered without escaping may allow script injection.\",\n \"command-injection\": \"Shell command constructed with user input may allow command execution.\",\n \"path-traversal\": \"File path constructed with user input may allow directory traversal.\",\n \"hardcoded-secrets\": \"Sensitive credentials found in source code.\",\n \"deserialization\": \"Untrusted data deserialization may allow code execution.\",\n \"ssrf\": \"Server-side request with user-controlled URL may allow internal access.\",\n \"xxe\": \"XML parser may be vulnerable to external entity injection.\",\n \"csrf\": \"State-changing request lacks CSRF protection.\",\n \"ldap-injection\": \"LDAP query constructed with user input may allow injection.\",\n };\n\n const remediations: Record<string, string> = {\n \"sql-injection\": \"Use parameterized queries or prepared statements. Never concatenate user input into SQL strings.\",\n \"xss\": \"Escape all user input before rendering in HTML. Use framework auto-escaping features.\",\n \"command-injection\": \"Avoid shell execution with user input. Use allowlists and subprocess arrays instead of shell strings.\",\n \"path-traversal\": \"Validate and sanitize file paths. Use path.resolve() and verify the result is within allowed directories.\",\n \"hardcoded-secrets\": \"Move secrets to environment variables or a secrets manager. Never commit credentials to source control.\",\n \"deserialization\": \"Avoid deserializing untrusted data. If necessary, use safe formats like JSON instead of pickle/yaml.\",\n \"ssrf\": \"Validate and allowlist URLs. Block private IP ranges and localhost.\",\n \"xxe\": \"Disable external entity processing in XML parser configuration.\",\n \"csrf\": \"Implement CSRF tokens for all state-changing requests.\",\n \"ldap-injection\": \"Escape special LDAP characters in user input. Use parameterized LDAP queries.\",\n };\n\n const summary = summaries[gap.categoryId] ?? `Potential ${gap.categoryName} vulnerability detected.`;\n const remediation = remediations[gap.categoryId] ?? `Review the code for security issues and apply appropriate fixes.`;\n\n return {\n summary,\n explanation: `The pattern \"${gap.patternId}\" detected a potential ${gap.categoryName} vulnerability at line ${gap.lineStart}. This type of issue has ${gap.severity} severity and was detected with ${gap.confidence} confidence.`,\n risk: `If exploited, this vulnerability could compromise the security of the application. Severity: ${gap.severity}.`,\n remediation,\n references: [],\n };\n}\n","/**\n * AI Pattern Suggester\n *\n * Uses AI to suggest new detection patterns based on code samples.\n */\n\nimport { createAIService } from \"./service.js\";\n\nimport type { AIConfig, AIResponse, PatternSuggestion } from \"./types.js\";\n\nconst SYSTEM_PROMPT = `You are an expert at creating regex patterns for detecting security vulnerabilities in code.\nGiven vulnerable code samples, generate regex patterns that will detect similar vulnerabilities.\n\nYour patterns should:\n1. Be specific enough to avoid false positives\n2. Be general enough to catch variations\n3. Use standard regex syntax (no lookbehind for compatibility)\n4. Include examples of what matches and what doesn't\n\nAlways respond with valid JSON matching this structure:\n{\n \"suggestions\": [\n {\n \"id\": \"pattern-id-kebab-case\",\n \"pattern\": \"regex pattern here\",\n \"description\": \"What this pattern detects\",\n \"confidence\": \"high|medium|low\",\n \"matchExample\": \"code that should match\",\n \"safeExample\": \"similar code that should NOT match\",\n \"reasoning\": \"Why this pattern works\"\n }\n ]\n}\n\nImportant:\n- Escape backslashes properly for JSON (use \\\\\\\\s not \\\\s)\n- Test your patterns mentally against the examples\n- Prefer simpler patterns that are less likely to cause ReDoS`;\n\nexport interface PatternSuggestionRequest {\n /** Category to suggest patterns for */\n category: string;\n /** Vulnerable code samples */\n vulnerableCode: string[];\n /** Safe code samples (to avoid matching) */\n safeCode?: string[];\n /** Language of the code */\n language: string;\n /** Existing patterns to avoid duplicating */\n existingPatterns?: string[];\n /** Maximum number of suggestions */\n maxSuggestions?: number;\n}\n\nexport interface PatternSuggestionResult {\n /** Suggested patterns */\n suggestions: PatternSuggestion[];\n /** Patterns that were tested but had issues */\n rejected: Array<{\n pattern: string;\n reason: string;\n }>;\n}\n\n/**\n * Suggest patterns based on code samples\n */\nexport async function suggestPatterns(\n request: PatternSuggestionRequest,\n config?: Partial<AIConfig>\n): Promise<AIResponse<PatternSuggestionResult>> {\n const ai = createAIService(config);\n\n if (!ai.isConfigured()) {\n return {\n success: false,\n error: \"AI service not configured. Set ANTHROPIC_API_KEY or OPENAI_API_KEY.\",\n durationMs: 0,\n };\n }\n\n const prompt = buildPatternPrompt(request);\n\n const response = await ai.completeJSON<{ suggestions: PatternSuggestion[] }>({\n systemPrompt: SYSTEM_PROMPT,\n messages: [{ role: \"user\", content: prompt }],\n maxTokens: 2048,\n temperature: 0.3,\n });\n\n if (!response.success || !response.data) {\n return {\n success: false,\n error: response.error ?? \"Failed to generate patterns\",\n durationMs: response.durationMs,\n };\n }\n\n // Validate and test each pattern\n const validated = validatePatterns(\n response.data.suggestions ?? [],\n request.vulnerableCode,\n request.safeCode ?? []\n );\n\n const result: AIResponse<PatternSuggestionResult> = {\n success: true,\n data: validated,\n durationMs: response.durationMs,\n };\n\n if (response.usage) {\n result.usage = response.usage;\n }\n\n return result;\n}\n\n/**\n * Build the prompt for pattern suggestion\n */\nfunction buildPatternPrompt(request: PatternSuggestionRequest): string {\n const parts: string[] = [];\n\n parts.push(`Generate regex patterns to detect ${request.category} vulnerabilities in ${request.language} code.\\n`);\n\n parts.push(\"**Vulnerable code samples (patterns SHOULD match these):**\");\n for (let i = 0; i < request.vulnerableCode.length; i++) {\n parts.push(`\\nExample ${i + 1}:`);\n parts.push(\"```\");\n parts.push(request.vulnerableCode[i] ?? \"\");\n parts.push(\"```\");\n }\n\n if (request.safeCode && request.safeCode.length > 0) {\n parts.push(\"\\n**Safe code samples (patterns should NOT match these):**\");\n for (let i = 0; i < request.safeCode.length; i++) {\n parts.push(`\\nSafe ${i + 1}:`);\n parts.push(\"```\");\n parts.push(request.safeCode[i] ?? \"\");\n parts.push(\"```\");\n }\n }\n\n if (request.existingPatterns && request.existingPatterns.length > 0) {\n parts.push(\"\\n**Existing patterns (avoid duplicating):**\");\n for (const pattern of request.existingPatterns) {\n parts.push(`- ${pattern}`);\n }\n }\n\n parts.push(`\\nGenerate up to ${request.maxSuggestions ?? 3} distinct patterns.`);\n parts.push(\"Focus on patterns that will have high precision (low false positives).\");\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Validate patterns against test samples\n */\nfunction validatePatterns(\n suggestions: PatternSuggestion[],\n vulnerableCode: string[],\n safeCode: string[]\n): PatternSuggestionResult {\n const validated: PatternSuggestion[] = [];\n const rejected: Array<{ pattern: string; reason: string }> = [];\n\n for (const suggestion of suggestions) {\n try {\n // Test if pattern compiles\n const regex = new RegExp(suggestion.pattern, \"gm\");\n\n // Test against vulnerable samples\n let matchCount = 0;\n for (const code of vulnerableCode) {\n regex.lastIndex = 0;\n if (regex.test(code)) {\n matchCount++;\n }\n }\n\n // Test against safe samples\n let falsePositives = 0;\n for (const code of safeCode) {\n regex.lastIndex = 0;\n if (regex.test(code)) {\n falsePositives++;\n }\n }\n\n // Check for ReDoS potential (simple heuristic)\n if (hasRedosPotential(suggestion.pattern)) {\n rejected.push({\n pattern: suggestion.pattern,\n reason: \"Pattern may be vulnerable to ReDoS\",\n });\n continue;\n }\n\n // Accept if it matches at least some vulnerable code\n if (matchCount > 0) {\n // Adjust confidence based on actual results\n if (falsePositives > 0 && suggestion.confidence === \"high\") {\n suggestion.confidence = \"medium\";\n }\n if (matchCount < vulnerableCode.length / 2 && suggestion.confidence === \"high\") {\n suggestion.confidence = \"medium\";\n }\n validated.push(suggestion);\n } else {\n rejected.push({\n pattern: suggestion.pattern,\n reason: `Pattern did not match any vulnerable samples (0/${vulnerableCode.length})`,\n });\n }\n } catch (error) {\n rejected.push({\n pattern: suggestion.pattern,\n reason: `Invalid regex: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n });\n }\n }\n\n return { suggestions: validated, rejected };\n}\n\n/**\n * Check for potential ReDoS patterns (simple heuristic)\n */\nfunction hasRedosPotential(pattern: string): boolean {\n // Check for nested quantifiers like (a+)+ or (a*)*\n if (/\\([^)]*[+*][^)]*\\)[+*]/.test(pattern)) {\n return true;\n }\n\n // Check for overlapping alternations with quantifiers\n if (/\\([^)]*\\|[^)]*\\)[+*]/.test(pattern)) {\n // More specific check for dangerous patterns\n const alternationMatch = pattern.match(/\\(([^)]+)\\)/g);\n if (alternationMatch) {\n for (const alt of alternationMatch) {\n // Check if alternation branches can match same input\n if (/\\w+\\|\\w*\\w/.test(alt) && /[+*]/.test(alt)) {\n return true;\n }\n }\n }\n }\n\n return false;\n}\n\n/**\n * Format a pattern suggestion as YAML for adding to category definitions\n */\nexport function formatPatternAsYaml(suggestion: PatternSuggestion, language: string): string {\n // Escape the pattern for YAML\n const escapedPattern = suggestion.pattern\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"');\n\n return ` - id: ${suggestion.id}\n type: regex\n language: ${language}\n pattern: \"${escapedPattern}\"\n confidence: ${suggestion.confidence}\n description: ${suggestion.description}`;\n}\n\n/**\n * Suggest patterns from missed vulnerabilities (for improving detection)\n */\nexport async function suggestPatternsFromMissed(\n category: string,\n missedCode: string[],\n detectedCode: string[],\n language: string,\n config?: Partial<AIConfig>\n): Promise<AIResponse<PatternSuggestionResult>> {\n // The missed code is what we WANT to detect\n // The detected code can help understand what patterns we already catch\n return suggestPatterns(\n {\n category,\n vulnerableCode: missedCode,\n safeCode: [], // We don't have safe code in this context\n language,\n maxSuggestions: 5,\n },\n config\n );\n}\n","#!/usr/bin/env node\n/**\n * Pinata CLI entry point\n *\n * Commands:\n * - analyze - Scan codebase for test coverage gaps\n * - generate - Generate tests for identified gaps\n * - search - Search category taxonomy\n * - list - List all categories with filters\n * - init - Initialize Pinata config in project\n * - auth - Manage API key authentication\n */\n\nimport { existsSync, readFileSync } from \"fs\";\nimport { dirname, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport ora from \"ora\";\n\nimport {\n RISK_DOMAINS,\n TEST_LEVELS,\n type RiskDomain,\n type TestLevel,\n type Priority,\n type Severity,\n} from \"../categories/schema/index.js\";\nimport { createCategoryStore } from \"../categories/store/index.js\";\nimport { VERSION, createScanner } from \"../core/index.js\";\nimport { logger } from \"../lib/index.js\";\nimport { createRenderer } from \"../templates/index.js\";\n\nimport {\n formatCategories,\n formatError,\n isValidOutputFormat,\n type OutputFormat,\n} from \"./formatters.js\";\nimport {\n formatGeneratedTerminal,\n formatGeneratedJson,\n formatWriteSummary,\n suggestTestPath,\n extractVariablesFromGap,\n extractVariablesWithAI,\n writeGeneratedTests,\n type GeneratedTest,\n} from \"./generate-formatters.js\";\nimport {\n explainGap,\n explainGaps,\n generateFallbackExplanation,\n suggestPatterns,\n createAIService,\n} from \"../ai/index.js\";\nimport type { AIConfig, GapExplanation } from \"../ai/types.js\";\nimport {\n saveScanResults,\n loadScanResults,\n} from \"./results-cache.js\";\nimport {\n formatScanResult,\n isValidScanOutputFormat,\n type ScanOutputFormat,\n} from \"./scan-formatters.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get the path to built-in category definitions\n * Tries multiple locations to support both development and production\n */\nfunction getDefinitionsPath(): string {\n // Try multiple possible locations\n const candidates = [\n // When running from dist/cli/index.js\n resolve(__dirname, \"../../src/categories/definitions\"),\n // When running from project root via npx/npm\n resolve(process.cwd(), \"src/categories/definitions\"),\n // When bundled in dist (future)\n resolve(__dirname, \"../categories/definitions\"),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n // Fallback to first candidate (will error with helpful message)\n return candidates[0]!;\n}\n\nconst program = new Command();\n\nprogram\n .name(\"pinata\")\n .description(\"AI-powered test coverage analysis and generation\")\n .version(VERSION);\n\nprogram\n .command(\"analyze [path]\")\n .description(\"Analyze codebase for test coverage gaps\")\n .option(\"-o, --output <format>\", \"Output format: terminal, json, markdown, sarif, html, junit-xml\", \"terminal\")\n .option(\"-d, --domains <domains>\", \"Filter to specific domains (comma-separated)\")\n .option(\"-s, --severity <level>\", \"Minimum severity: critical, high, medium, low\", \"low\")\n .option(\"-c, --confidence <level>\", \"Minimum confidence: high, medium, low\", \"high\")\n .option(\"--fail-on <level>\", \"Exit non-zero if gaps at level: critical, high, medium\")\n .option(\"--exclude <dirs>\", \"Directories to exclude (comma-separated)\")\n .option(\"--verify\", \"Use AI to verify each match (reduces false positives)\")\n .option(\"--execute\", \"Run dynamic tests in Docker sandbox to confirm vulnerabilities\")\n .option(\"--dry-run\", \"Preview generated tests without executing (use with --execute)\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"-q, --quiet\", \"Quiet mode (errors only)\")\n .action(async (targetPath: string | undefined, options: Record<string, unknown>) => {\n const isQuiet = Boolean(options[\"quiet\"]);\n const isVerbose = Boolean(options[\"verbose\"]);\n\n if (isQuiet) {\n logger.configure({ level: \"error\" });\n } else if (isVerbose) {\n logger.configure({ level: \"debug\" });\n }\n\n // Resolve target path\n const targetDirectory = resolve(targetPath ?? process.cwd());\n\n // Validate target exists\n if (!existsSync(targetDirectory)) {\n console.error(formatError(new Error(`Directory not found: ${targetDirectory}`)));\n process.exit(1);\n }\n\n // Validate output format\n const outputFormat = String(options[\"output\"] ?? \"terminal\");\n if (!isValidScanOutputFormat(outputFormat)) {\n console.error(formatError(new Error(`Invalid output format: ${outputFormat}. Use: terminal, json, markdown, sarif`)));\n process.exit(1);\n }\n\n // Validate severity\n const validSeverities = [\"critical\", \"high\", \"medium\", \"low\"];\n const minSeverity = String(options[\"severity\"] ?? \"low\") as Severity;\n if (!validSeverities.includes(minSeverity)) {\n console.error(formatError(new Error(`Invalid severity: ${minSeverity}. Use: critical, high, medium, low`)));\n process.exit(1);\n }\n\n // Validate confidence\n const validConfidences = [\"high\", \"medium\", \"low\"];\n const minConfidence = String(options[\"confidence\"] ?? \"high\");\n if (!validConfidences.includes(minConfidence)) {\n console.error(formatError(new Error(`Invalid confidence: ${minConfidence}. Use: high, medium, low`)));\n process.exit(1);\n }\n\n // Parse domains filter\n const domainsStr = options[\"domains\"] as string | undefined;\n let domains: RiskDomain[] = [];\n if (domainsStr) {\n const domainList = domainsStr.split(\",\").map((d) => d.trim());\n for (const domain of domainList) {\n if (!RISK_DOMAINS.includes(domain as RiskDomain)) {\n console.error(formatError(new Error(`Invalid domain: ${domain}. Valid domains: ${RISK_DOMAINS.join(\", \")}`)));\n process.exit(1);\n }\n }\n domains = domainList as RiskDomain[];\n }\n\n // Parse exclude directories\n const excludeStr = options[\"exclude\"] as string | undefined;\n const excludeDirs = excludeStr\n ? excludeStr.split(\",\").map((d) => d.trim())\n : undefined;\n\n // Parse fail-on level (Commander converts --fail-on to failOn)\n const failOn = options[\"failOn\"] as string | undefined;\n if (failOn && ![\"critical\", \"high\", \"medium\"].includes(failOn)) {\n console.error(formatError(new Error(`Invalid fail-on level: ${failOn}. Use: critical, high, medium`)));\n process.exit(1);\n }\n\n // Start spinner (only for terminal output and non-quiet mode)\n const showSpinner = outputFormat === \"terminal\" && !isQuiet;\n const spinner = showSpinner ? ora(\"Loading categories...\").start() : null;\n\n try {\n // Load categories\n const store = createCategoryStore();\n const definitionsPath = getDefinitionsPath();\n\n logger.debug(`Loading categories from: ${definitionsPath}`);\n const loadResult = await store.loadFromDirectory(definitionsPath);\n\n if (!loadResult.success) {\n spinner?.fail(\"Failed to load categories\");\n console.error(formatError(loadResult.error));\n process.exit(1);\n }\n\n if (spinner) {\n spinner.text = `Loaded ${loadResult.data} categories. Scanning...`;\n }\n logger.debug(`Loaded ${loadResult.data} categories`);\n\n // Create scanner and run analysis\n const scanner = createScanner(store);\n\n // Build scan options\n const scanOptions: Parameters<typeof scanner.scanDirectory>[1] = {\n minSeverity,\n minConfidence: minConfidence as \"high\" | \"medium\" | \"low\",\n detectTestFiles: true,\n };\n if (domains.length > 0) {\n scanOptions.domains = domains;\n }\n if (excludeDirs) {\n scanOptions.excludeDirs = excludeDirs;\n }\n\n const scanResult = await scanner.scanDirectory(targetDirectory, scanOptions);\n\n if (!scanResult.success) {\n spinner?.fail(\"Scan failed\");\n console.error(formatError(scanResult.error));\n process.exit(1);\n }\n\n spinner?.stop();\n\n // AI verification if requested\n const shouldVerify = Boolean(options[\"verify\"]);\n if (shouldVerify && scanResult.data.gaps.length > 0) {\n // Check for API key, prompt if missing\n const { hasApiKey, setConfigValue, getApiKey } = await import(\"./config.js\");\n const { createInterface } = await import(\"readline\");\n \n let provider: \"anthropic\" | \"openai\" = \"anthropic\";\n \n if (!hasApiKey(\"anthropic\") && !hasApiKey(\"openai\")) {\n spinner?.stop();\n console.log(chalk.yellow(\"\\nAI verification requires an API key.\"));\n console.log(chalk.gray(\"Get one at: https://console.anthropic.com/settings/keys\"));\n console.log(chalk.gray(\"Or: https://platform.openai.com/api-keys\\n\"));\n \n const rl = createInterface({ input: process.stdin, output: process.stdout });\n \n const askQuestion = (question: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(question, (answer) => resolve(answer.trim()));\n });\n };\n \n const apiKey = await askQuestion(chalk.cyan(\"Enter your Anthropic or OpenAI API key: \"));\n rl.close();\n \n if (!apiKey) {\n console.log(chalk.red(\"No API key provided. Skipping AI verification.\"));\n } else {\n // Detect provider from key format\n if (apiKey.startsWith(\"sk-ant-\")) {\n setConfigValue(\"anthropicApiKey\", apiKey);\n provider = \"anthropic\";\n console.log(chalk.green(\"Anthropic API key saved to ~/.pinata/config.json\\n\"));\n } else {\n setConfigValue(\"openaiApiKey\", apiKey);\n provider = \"openai\";\n console.log(chalk.green(\"OpenAI API key saved to ~/.pinata/config.json\\n\"));\n }\n }\n } else if (hasApiKey(\"openai\") && !hasApiKey(\"anthropic\")) {\n provider = \"openai\";\n }\n \n // Proceed with verification if we have a key\n if (!hasApiKey(provider)) {\n // Skip verification - no key available\n } else {\n const verifySpinner = showSpinner ? ora(\"Verifying gaps with AI...\").start() : null;\n \n try {\n const { AIVerifier } = await import(\"../core/verifier/index.js\");\n const { readFile } = await import(\"fs/promises\");\n \n const apiKey = getApiKey(provider);\n const verifier = new AIVerifier({ provider, ...(apiKey ? { apiKey } : {}) });\n \n const { verified, dismissed, stats } = await verifier.verifyAll(\n scanResult.data.gaps,\n async (path) => readFile(path, \"utf-8\")\n );\n \n // Update scan result with verified gaps\n scanResult.data.gaps = verified;\n \n // Recalculate score based on verified gaps\n const severityWeights: Record<string, number> = { critical: 10, high: 5, medium: 2, low: 1 };\n let deduction = 0;\n for (const gap of verified) {\n deduction += severityWeights[gap.severity] ?? 1;\n }\n const newOverall = Math.max(0, 100 - deduction);\n const newGrade: \"A\" | \"B\" | \"C\" | \"D\" | \"F\" = \n newOverall >= 90 ? \"A\" :\n newOverall >= 80 ? \"B\" :\n newOverall >= 70 ? \"C\" :\n newOverall >= 60 ? \"D\" : \"F\";\n \n scanResult.data.score.overall = newOverall;\n scanResult.data.score.grade = newGrade;\n \n verifySpinner?.succeed(\n `AI Verification: ${stats.total} total → ${stats.preFiltered} pre-filtered → ${stats.aiVerified} verified, ${stats.aiDismissed} AI-dismissed`\n );\n \n if (isVerbose && dismissed.length > 0) {\n console.log(chalk.gray(\"\\nDismissed as false positives:\"));\n for (const { gap, reason } of dismissed.slice(0, 5)) {\n console.log(chalk.gray(` - ${gap.categoryName} at ${gap.filePath}:${gap.lineStart}`));\n console.log(chalk.gray(` Reason: ${reason.slice(0, 100)}...`));\n }\n if (dismissed.length > 5) {\n console.log(chalk.gray(` ... and ${dismissed.length - 5} more`));\n }\n }\n } catch (error) {\n verifySpinner?.fail(\"AI verification failed (results unverified)\");\n if (isVerbose) {\n console.error(chalk.yellow(`Verification error: ${error instanceof Error ? error.message : String(error)}`));\n }\n }\n } // end else hasApiKey\n }\n\n // Dynamic execution if requested (Layer 5)\n const shouldExecute = Boolean(options[\"execute\"]);\n const isDryRun = Boolean(options[\"dryRun\"]);\n \n if (shouldExecute && scanResult.data.gaps.length > 0) {\n const { createRunner, isTestable } = await import(\"../execution/index.js\");\n const { readFile } = await import(\"fs/promises\");\n \n const testableGaps = scanResult.data.gaps.filter((g) => isTestable(g.categoryId));\n \n if (testableGaps.length === 0) {\n console.log(chalk.yellow(\"\\nNo dynamically testable gaps found.\"));\n console.log(chalk.gray(\"Testable types: sql-injection, xss, command-injection, path-traversal\"));\n } else {\n const runner = createRunner(undefined, isDryRun);\n \n // Check Docker availability\n const initResult = await runner.initialize();\n if (!initResult.ready) {\n console.log(chalk.red(`\\nDynamic execution unavailable: ${initResult.error}`));\n } else {\n // Load file contents for testable gaps\n const fileContents = new Map<string, string>();\n for (const gap of testableGaps) {\n if (!fileContents.has(gap.filePath)) {\n try {\n fileContents.set(gap.filePath, await readFile(gap.filePath, \"utf-8\"));\n } catch {\n // Skip files that can't be read\n }\n }\n }\n \n // Execute\n const executionSummary = await runner.executeAll(testableGaps, fileContents);\n \n // Update gaps with execution status\n for (const result of executionSummary.results) {\n const gap = scanResult.data.gaps.find(\n (g) => g.filePath === result.gap.filePath && g.lineStart === result.gap.lineStart\n );\n if (gap && result.status === \"confirmed\") {\n // Mark as confirmed in the gap\n (gap as any).confirmed = true;\n (gap as any).evidence = result.evidence;\n }\n }\n \n // Update score based on confirmed count\n if (executionSummary.confirmed > 0) {\n console.log(chalk.red.bold(`\\n⚠️ ${executionSummary.confirmed} CONFIRMED vulnerabilities found!`));\n }\n }\n }\n }\n\n // Cache results for generate command (save in current working directory)\n const cacheResult = await saveScanResults(process.cwd(), scanResult.data);\n if (!cacheResult.success) {\n logger.debug(`Failed to cache results: ${cacheResult.error.message}`);\n }\n\n // Format and output results\n const output = formatScanResult(scanResult.data, outputFormat, targetDirectory);\n console.log(output);\n\n // Handle warnings\n if (isVerbose && scanResult.data.warnings.length > 0) {\n console.error(\"\\nWarnings:\");\n for (const warning of scanResult.data.warnings) {\n console.error(` - ${warning}`);\n }\n }\n\n // Handle fail-on exit code\n if (failOn) {\n const severityOrder: Record<string, number> = {\n critical: 3,\n high: 2,\n medium: 1,\n };\n const failLevel = severityOrder[failOn] ?? 0;\n\n const hasFailingGaps = scanResult.data.gaps.some((gap) => {\n const gapLevel = severityOrder[gap.severity] ?? 0;\n return gapLevel >= failLevel;\n });\n\n if (hasFailingGaps) {\n const count = scanResult.data.gaps.filter((gap) => {\n const gapLevel = severityOrder[gap.severity] ?? 0;\n return gapLevel >= failLevel;\n }).length;\n logger.debug(`Exiting with code 1 due to ${count} gaps at ${failOn} level or above`);\n process.exit(1);\n }\n }\n\n process.exit(0);\n } catch (error) {\n spinner?.fail(\"Analysis failed\");\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"generate\")\n .description(\"Generate tests for identified gaps\")\n .option(\"--gaps\", \"Generate tests for all identified gaps\")\n .option(\"-c, --category <id>\", \"Generate tests for specific category\")\n .option(\"-d, --domain <domain>\", \"Generate tests for all categories in domain\")\n .option(\"-s, --severity <level>\", \"Minimum severity: critical, high, medium, low\", \"medium\")\n .option(\"--output-dir <dir>\", \"Directory for generated test files\")\n .option(\"--write\", \"Write files to disk (default is dry-run)\")\n .option(\"--ai\", \"Use AI for smarter template variable filling\")\n .option(\"--ai-provider <provider>\", \"AI provider: anthropic, openai\", \"anthropic\")\n .option(\"-o, --output <format>\", \"Output format: terminal, json\", \"terminal\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"-q, --quiet\", \"Quiet mode (errors only)\")\n .action(async (options: Record<string, unknown>) => {\n const isQuiet = Boolean(options[\"quiet\"]);\n const isVerbose = Boolean(options[\"verbose\"]);\n const dryRun = !options[\"write\"];\n const useAI = Boolean(options[\"ai\"]);\n const aiProvider = String(options[\"aiProvider\"] ?? \"anthropic\") as \"anthropic\" | \"openai\";\n const outputFormat = String(options[\"output\"] ?? \"terminal\");\n\n if (isQuiet) {\n logger.configure({ level: \"error\" });\n } else if (isVerbose) {\n logger.configure({ level: \"debug\" });\n }\n\n // Validate output format\n if (![\"terminal\", \"json\"].includes(outputFormat)) {\n console.error(formatError(new Error(`Invalid output format: ${outputFormat}. Use: terminal, json`)));\n process.exit(1);\n }\n\n // Validate options - at least one filter required\n const hasGaps = Boolean(options[\"gaps\"]);\n const categoryId = options[\"category\"] as string | undefined;\n const domainFilter = options[\"domain\"] as string | undefined;\n\n if (!hasGaps && !categoryId && !domainFilter) {\n console.error(formatError(new Error(\n \"Specify what to generate: --gaps (all gaps), --category <id>, or --domain <domain>\"\n )));\n process.exit(1);\n }\n\n // Validate domain if provided\n if (domainFilter && !RISK_DOMAINS.includes(domainFilter as RiskDomain)) {\n console.error(formatError(new Error(\n `Invalid domain: ${domainFilter}. Valid domains: ${RISK_DOMAINS.join(\", \")}`\n )));\n process.exit(1);\n }\n\n // Validate severity\n const validSeverities = [\"critical\", \"high\", \"medium\", \"low\"];\n const minSeverity = String(options[\"severity\"] ?? \"medium\");\n if (!validSeverities.includes(minSeverity)) {\n console.error(formatError(new Error(\n `Invalid severity: ${minSeverity}. Use: critical, high, medium, low`\n )));\n process.exit(1);\n }\n const severityOrder: Record<string, number> = {\n critical: 4,\n high: 3,\n medium: 2,\n low: 1,\n };\n\n // Start spinner\n const showSpinner = outputFormat === \"terminal\" && !isQuiet;\n const spinner = showSpinner ? ora(\"Loading cached scan results...\").start() : null;\n\n try {\n // Load cached scan results\n const projectRoot = process.cwd();\n const cacheResult = await loadScanResults(projectRoot);\n\n if (!cacheResult.success) {\n spinner?.fail(\"No cached results\");\n console.error(formatError(cacheResult.error));\n console.error(chalk.yellow(\"\\nRun `pinata analyze` first to scan for gaps.\"));\n process.exit(1);\n }\n\n const cached = cacheResult.data;\n let gaps = cached.gaps;\n\n if (spinner) {\n spinner.text = `Loaded ${gaps.length} gaps from cache. Filtering...`;\n }\n\n // Filter gaps\n if (categoryId) {\n gaps = gaps.filter((g) => g.categoryId === categoryId);\n }\n if (domainFilter) {\n gaps = gaps.filter((g) => g.domain === domainFilter);\n }\n gaps = gaps.filter((g) => {\n const gapLevel = severityOrder[g.severity] ?? 0;\n const minLevel = severityOrder[minSeverity] ?? 0;\n return gapLevel >= minLevel;\n });\n\n if (gaps.length === 0) {\n spinner?.succeed(\"No gaps match the filters\");\n console.log(chalk.yellow(\"\\nNo gaps found matching the specified filters.\"));\n process.exit(0);\n }\n\n if (spinner) {\n spinner.text = `Found ${gaps.length} gaps. Loading categories...`;\n }\n\n // Load categories for template access\n const store = createCategoryStore();\n const definitionsPath = getDefinitionsPath();\n const loadResult = await store.loadFromDirectory(definitionsPath);\n\n if (!loadResult.success) {\n spinner?.fail(\"Failed to load categories\");\n console.error(formatError(loadResult.error));\n process.exit(1);\n }\n\n if (spinner) {\n spinner.text = `Generating tests for ${gaps.length} gaps...`;\n }\n\n // Create template renderer\n const renderer = createRenderer({ strict: false, allowUnresolved: true });\n\n // Generate tests for each gap\n const generatedTests: GeneratedTest[] = [];\n const errors: string[] = [];\n\n // Group gaps by category to avoid rendering same template multiple times\n const gapsByCategory = new Map<string, typeof gaps>();\n for (const gap of gaps) {\n const existing = gapsByCategory.get(gap.categoryId) ?? [];\n existing.push(gap);\n gapsByCategory.set(gap.categoryId, existing);\n }\n\n for (const [catId, categoryGaps] of gapsByCategory) {\n const categoryResult = store.get(catId);\n if (!categoryResult.success) {\n errors.push(`Category not found: ${catId}`);\n continue;\n }\n const category = categoryResult.data;\n\n // Find best template for each gap (prefer matching language)\n for (const gap of categoryGaps) {\n // Detect gap file language\n const gapExt = gap.filePath.split(\".\").pop() ?? \"\";\n const langMap: Record<string, string> = {\n py: \"python\",\n ts: \"typescript\",\n tsx: \"typescript\",\n js: \"javascript\",\n jsx: \"javascript\",\n go: \"go\",\n java: \"java\",\n rs: \"rust\",\n };\n const gapLang = langMap[gapExt];\n\n // Find matching template (prefer same language)\n let template = category.testTemplates.find((t) => t.language === gapLang);\n if (!template) {\n template = category.testTemplates[0]; // Fallback to first template\n }\n if (!template) {\n errors.push(`No templates available for ${catId}`);\n continue;\n }\n\n // Extract variables from gap (use AI if enabled)\n let variables: Record<string, unknown>;\n if (useAI) {\n variables = await extractVariablesWithAI(gap, template.variables, {\n provider: aiProvider,\n });\n } else {\n variables = extractVariablesFromGap(gap);\n }\n\n // Render template\n const renderResult = renderer.renderTemplate(template, variables);\n if (!renderResult.success) {\n errors.push(`Failed to render ${catId}: ${renderResult.error.message}`);\n continue;\n }\n\n // Generate suggested path\n const suggestedPath = suggestTestPath(gap.filePath, template, cached.targetDirectory);\n\n generatedTests.push({\n gap,\n category,\n template,\n result: renderResult.data,\n suggestedPath,\n });\n }\n }\n\n spinner?.stop();\n\n // Format and output results\n if (outputFormat === \"json\") {\n console.log(formatGeneratedJson(generatedTests));\n } else {\n console.log(formatGeneratedTerminal(generatedTests, cached.targetDirectory));\n }\n\n // Show errors if verbose\n if (isVerbose && errors.length > 0) {\n console.error(chalk.yellow(\"\\nWarnings:\"));\n for (const error of errors) {\n console.error(chalk.gray(` - ${error}`));\n }\n }\n\n // Handle write mode\n if (!dryRun) {\n const outputDirOption = options[\"outputDir\"] as string | undefined;\n const writeResult = await writeGeneratedTests(\n generatedTests,\n cached.targetDirectory,\n outputDirOption\n );\n\n if (!writeResult.success) {\n console.error(formatError(writeResult.error));\n process.exit(1);\n }\n\n // Show write summary\n console.log(formatWriteSummary(writeResult.data, cached.targetDirectory));\n\n if (writeResult.data.failed.length > 0) {\n process.exit(1);\n }\n }\n\n process.exit(0);\n } catch (error) {\n spinner?.fail(\"Generation failed\");\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"explain\")\n .description(\"Get natural language explanations for detected gaps\")\n .option(\"-n, --top <count>\", \"Explain top N gaps by priority\", \"5\")\n .option(\"-c, --category <id>\", \"Explain gaps for specific category\")\n .option(\"-d, --domain <domain>\", \"Explain gaps for specific domain\")\n .option(\"--ai\", \"Use AI for detailed explanations (requires API key)\")\n .option(\"--ai-provider <provider>\", \"AI provider: anthropic, openai\", \"anthropic\")\n .option(\"-o, --output <format>\", \"Output format: terminal, json, markdown\", \"terminal\")\n .option(\"-v, --verbose\", \"Show more details\")\n .option(\"-q, --quiet\", \"Quiet mode (errors only)\")\n .action(async (options: Record<string, unknown>) => {\n const isQuiet = Boolean(options[\"quiet\"]);\n const isVerbose = Boolean(options[\"verbose\"]);\n const useAI = Boolean(options[\"ai\"]);\n const aiProvider = String(options[\"aiProvider\"] ?? \"anthropic\") as \"anthropic\" | \"openai\";\n const outputFormat = String(options[\"output\"] ?? \"terminal\");\n const topN = parseInt(String(options[\"top\"] ?? \"5\"), 10);\n\n if (isQuiet) {\n logger.configure({ level: \"error\" });\n } else if (isVerbose) {\n logger.configure({ level: \"debug\" });\n }\n\n // Validate output format\n if (![\"terminal\", \"json\", \"markdown\"].includes(outputFormat)) {\n console.error(formatError(new Error(`Invalid output format: ${outputFormat}. Use: terminal, json, markdown`)));\n process.exit(1);\n }\n\n const showSpinner = outputFormat === \"terminal\" && !isQuiet;\n const spinner = showSpinner ? ora(\"Loading cached scan results...\").start() : null;\n\n try {\n // Load cached scan results\n const projectRoot = process.cwd();\n const cacheResult = await loadScanResults(projectRoot);\n\n if (!cacheResult.success) {\n spinner?.fail(\"No cached results\");\n console.error(formatError(cacheResult.error));\n console.error(chalk.yellow(\"\\nRun `pinata analyze` first to scan for gaps.\"));\n process.exit(1);\n }\n\n const cached = cacheResult.data;\n let gaps = cached.gaps;\n\n // Apply filters\n const categoryFilter = options[\"category\"] as string | undefined;\n const domainFilter = options[\"domain\"] as string | undefined;\n\n if (categoryFilter) {\n gaps = gaps.filter((g) => g.categoryId === categoryFilter);\n }\n if (domainFilter) {\n if (!RISK_DOMAINS.includes(domainFilter as RiskDomain)) {\n spinner?.fail(\"Invalid domain\");\n console.error(formatError(new Error(`Invalid domain: ${domainFilter}. Valid: ${RISK_DOMAINS.join(\", \")}`)));\n process.exit(1);\n }\n gaps = gaps.filter((g) => g.domain === domainFilter);\n }\n\n if (gaps.length === 0) {\n spinner?.succeed(\"No gaps to explain\");\n console.log(chalk.yellow(\"\\nNo gaps found matching the filters.\"));\n process.exit(0);\n }\n\n // Sort by priority score and take top N\n gaps = gaps\n .sort((a, b) => b.priorityScore - a.priorityScore)\n .slice(0, topN);\n\n if (spinner) {\n spinner.text = `Explaining ${gaps.length} gap(s)...`;\n }\n\n // Generate explanations\n const explanations: Array<{ gap: typeof gaps[0]; explanation: GapExplanation }> = [];\n\n if (useAI) {\n // Check if AI is configured\n const ai = createAIService({ provider: aiProvider });\n if (!ai.isConfigured()) {\n spinner?.warn(\"AI not configured, using fallback explanations\");\n console.error(chalk.yellow(`\\nSet ${aiProvider === \"anthropic\" ? \"ANTHROPIC_API_KEY\" : \"OPENAI_API_KEY\"} for AI explanations.\\n`));\n\n // Use fallback\n for (const gap of gaps) {\n explanations.push({\n gap,\n explanation: generateFallbackExplanation(gap),\n });\n }\n } else {\n // Use AI for explanations\n for (const gap of gaps) {\n const result = await explainGap(gap, undefined, { provider: aiProvider });\n if (result.success && result.data) {\n explanations.push({ gap, explanation: result.data });\n } else {\n explanations.push({\n gap,\n explanation: generateFallbackExplanation(gap),\n });\n }\n }\n }\n } else {\n // Use fallback explanations\n for (const gap of gaps) {\n explanations.push({\n gap,\n explanation: generateFallbackExplanation(gap),\n });\n }\n }\n\n spinner?.stop();\n\n // Format and output\n if (outputFormat === \"json\") {\n console.log(JSON.stringify(explanations.map((e) => ({\n gap: {\n categoryId: e.gap.categoryId,\n categoryName: e.gap.categoryName,\n filePath: e.gap.filePath,\n lineStart: e.gap.lineStart,\n severity: e.gap.severity,\n confidence: e.gap.confidence,\n codeSnippet: e.gap.codeSnippet,\n },\n explanation: e.explanation,\n })), null, 2));\n } else if (outputFormat === \"markdown\") {\n console.log(`# Gap Explanations\\n`);\n console.log(`Generated ${explanations.length} explanation(s).\\n`);\n for (const { gap, explanation } of explanations) {\n console.log(`## ${gap.categoryName}\\n`);\n console.log(`**File:** \\`${gap.filePath}:${gap.lineStart}\\`\\n`);\n console.log(`**Severity:** ${gap.severity} | **Confidence:** ${gap.confidence}\\n`);\n console.log(`### Summary\\n${explanation.summary}\\n`);\n console.log(`### Explanation\\n${explanation.explanation}\\n`);\n console.log(`### Risk\\n${explanation.risk}\\n`);\n console.log(`### How to Fix\\n${explanation.remediation}\\n`);\n if (explanation.safeExample) {\n console.log(`### Safe Example\\n\\`\\`\\`\\n${explanation.safeExample}\\n\\`\\`\\`\\n`);\n }\n console.log(\"---\\n\");\n }\n } else {\n // Terminal format\n console.log();\n console.log(chalk.bold.cyan(\"Gap Explanations\"));\n console.log(chalk.gray(\"─\".repeat(60)));\n\n for (const { gap, explanation } of explanations) {\n console.log();\n console.log(chalk.bold.white(gap.categoryName));\n console.log(chalk.gray(` ${gap.filePath}:${gap.lineStart}`));\n\n const severityColor = gap.severity === \"critical\" ? chalk.red :\n gap.severity === \"high\" ? chalk.yellow : chalk.blue;\n console.log(` ${severityColor(gap.severity)} | ${gap.confidence} confidence`);\n\n console.log();\n console.log(chalk.cyan(\" Summary:\"));\n console.log(` ${explanation.summary}`);\n\n if (isVerbose) {\n console.log();\n console.log(chalk.cyan(\" Explanation:\"));\n for (const line of explanation.explanation.split(\"\\n\")) {\n console.log(` ${line}`);\n }\n }\n\n console.log();\n console.log(chalk.red(\" Risk:\"));\n console.log(` ${explanation.risk}`);\n\n console.log();\n console.log(chalk.green(\" How to Fix:\"));\n for (const line of explanation.remediation.split(\"\\n\")) {\n console.log(` ${line}`);\n }\n\n if (explanation.safeExample) {\n console.log();\n console.log(chalk.cyan(\" Safe Example:\"));\n console.log(chalk.gray(` ${explanation.safeExample}`));\n }\n\n console.log();\n console.log(chalk.gray(\"─\".repeat(60)));\n }\n }\n\n process.exit(0);\n } catch (error) {\n spinner?.fail(\"Explanation failed\");\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"suggest-patterns\")\n .description(\"Use AI to suggest new detection patterns based on code samples\")\n .requiredOption(\"-c, --category <id>\", \"Category to suggest patterns for\")\n .requiredOption(\"-l, --language <lang>\", \"Language of the code samples\")\n .option(\"-f, --file <path>\", \"File containing vulnerable code samples (one per line)\")\n .option(\"--code <snippet>\", \"Vulnerable code snippet (can be specified multiple times)\", (v, a: string[]) => [...a, v], [] as string[])\n .option(\"--ai-provider <provider>\", \"AI provider: anthropic, openai\", \"anthropic\")\n .option(\"-o, --output <format>\", \"Output format: terminal, yaml, json\", \"terminal\")\n .action(async (options: Record<string, unknown>) => {\n const categoryId = String(options[\"category\"]);\n const language = String(options[\"language\"]);\n const aiProvider = String(options[\"aiProvider\"] ?? \"anthropic\") as \"anthropic\" | \"openai\";\n const outputFormat = String(options[\"output\"] ?? \"terminal\");\n const codeSnippets = options[\"code\"] as string[];\n const filePath = options[\"file\"] as string | undefined;\n\n // Validate we have some code to analyze\n let vulnerableCode = [...codeSnippets];\n\n if (filePath) {\n try {\n const { readFile } = await import(\"fs/promises\");\n const content = await readFile(filePath, \"utf-8\");\n vulnerableCode = [...vulnerableCode, ...content.split(\"\\n---\\n\").filter(Boolean)];\n } catch (error) {\n console.error(formatError(new Error(`Failed to read file: ${filePath}`)));\n process.exit(1);\n }\n }\n\n if (vulnerableCode.length === 0) {\n console.error(formatError(new Error(\"Provide code samples via --code or --file\")));\n process.exit(1);\n }\n\n const spinner = ora(\"Generating pattern suggestions...\").start();\n\n try {\n const result = await suggestPatterns(\n {\n category: categoryId,\n language,\n vulnerableCode,\n maxSuggestions: 5,\n },\n { provider: aiProvider }\n );\n\n spinner.stop();\n\n if (!result.success) {\n console.error(formatError(new Error(result.error ?? \"Failed to generate patterns\")));\n process.exit(1);\n }\n\n const { suggestions, rejected } = result.data ?? { suggestions: [], rejected: [] };\n\n if (outputFormat === \"json\") {\n console.log(JSON.stringify({ suggestions, rejected }, null, 2));\n } else if (outputFormat === \"yaml\") {\n console.log(`# Suggested patterns for ${categoryId}\\n`);\n console.log(`detectionPatterns:`);\n for (const suggestion of suggestions) {\n const escapedPattern = suggestion.pattern.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n console.log(` - id: ${suggestion.id}`);\n console.log(` type: regex`);\n console.log(` language: ${language}`);\n console.log(` pattern: \"${escapedPattern}\"`);\n console.log(` confidence: ${suggestion.confidence}`);\n console.log(` description: ${suggestion.description}`);\n console.log();\n }\n } else {\n console.log();\n console.log(chalk.bold.cyan(\"Pattern Suggestions\"));\n console.log(chalk.gray(\"─\".repeat(60)));\n\n if (suggestions.length === 0) {\n console.log(chalk.yellow(\"\\nNo valid patterns could be generated.\"));\n } else {\n for (const suggestion of suggestions) {\n console.log();\n console.log(chalk.bold.white(suggestion.id));\n console.log(chalk.gray(` ${suggestion.description}`));\n console.log();\n console.log(chalk.cyan(\" Pattern:\"));\n console.log(` ${suggestion.pattern}`);\n console.log();\n console.log(chalk.cyan(\" Confidence:\") + ` ${suggestion.confidence}`);\n console.log();\n console.log(chalk.green(\" Would match:\"));\n console.log(chalk.gray(` ${suggestion.matchExample}`));\n console.log();\n console.log(chalk.red(\" Should NOT match:\"));\n console.log(chalk.gray(` ${suggestion.safeExample}`));\n console.log();\n console.log(chalk.cyan(\" Reasoning:\"));\n console.log(` ${suggestion.reasoning}`);\n console.log();\n console.log(chalk.gray(\"─\".repeat(60)));\n }\n }\n\n if (rejected.length > 0) {\n console.log();\n console.log(chalk.yellow.bold(`Rejected ${rejected.length} pattern(s):`));\n for (const r of rejected) {\n console.log(chalk.gray(` - ${r.pattern.slice(0, 40)}... : ${r.reason}`));\n }\n }\n }\n\n process.exit(0);\n } catch (error) {\n spinner.fail(\"Pattern generation failed\");\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"dashboard\")\n .description(\"Interactive TUI dashboard for viewing scan results\")\n .action(async () => {\n try {\n // Dynamic import to avoid loading ink unless needed\n const { runDashboard } = await import(\"./tui/index.js\");\n await runDashboard();\n } catch (error) {\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"search <query>\")\n .description(\"Search category taxonomy by name, description, or pattern\")\n .option(\"-d, --domain <domain>\", \"Filter by risk domain\")\n .option(\"-l, --level <level>\", \"Filter by test level\")\n .option(\"--language <lang>\", \"Filter by language\")\n .option(\"-o, --output <format>\", \"Output format: terminal, json, markdown\", \"terminal\")\n .option(\"-v, --verbose\", \"Show more details in results\")\n .action(async (query: string, options: Record<string, unknown>) => {\n try {\n const definitionsPath = getDefinitionsPath();\n const store = createCategoryStore();\n const loadResult = await store.loadFromDirectory(definitionsPath);\n\n if (!loadResult.success) {\n console.error(formatError(loadResult.error));\n process.exit(1);\n }\n\n // Validate output format\n const outputFormat = String(options[\"output\"] ?? \"terminal\");\n if (!isValidOutputFormat(outputFormat)) {\n console.error(formatError(new Error(`Invalid output format: ${outputFormat}`)));\n process.exit(1);\n }\n\n // Get all categories and filter\n const allCategories = store.toArray();\n const queryLower = query.toLowerCase();\n\n let results = allCategories.filter((cat) => {\n // Search in id, name, description\n const matchesText =\n cat.id.toLowerCase().includes(queryLower) ||\n cat.name.toLowerCase().includes(queryLower) ||\n cat.description.toLowerCase().includes(queryLower);\n\n // Search in pattern descriptions\n const matchesPattern = cat.detectionPatterns.some(\n (p) => p.description.toLowerCase().includes(queryLower) || p.pattern.includes(query)\n );\n\n return matchesText || matchesPattern;\n });\n\n // Apply domain filter\n const domainFilter = options[\"domain\"] as string | undefined;\n if (domainFilter) {\n if (!RISK_DOMAINS.includes(domainFilter as RiskDomain)) {\n console.error(formatError(new Error(`Invalid domain: ${domainFilter}`)));\n process.exit(1);\n }\n results = results.filter((cat) => cat.domain === domainFilter);\n }\n\n // Apply level filter\n const levelFilter = options[\"level\"] as string | undefined;\n if (levelFilter) {\n if (!TEST_LEVELS.includes(levelFilter as TestLevel)) {\n console.error(formatError(new Error(`Invalid level: ${levelFilter}`)));\n process.exit(1);\n }\n results = results.filter((cat) => cat.level === levelFilter);\n }\n\n // Apply language filter\n const langFilter = options[\"language\"] as string | undefined;\n if (langFilter) {\n results = results.filter((cat) =>\n cat.applicableLanguages.includes(langFilter as never)\n );\n }\n\n // Format output\n if (outputFormat === \"json\") {\n console.log(JSON.stringify(results, null, 2));\n } else if (outputFormat === \"markdown\") {\n console.log(`# Search Results for \"${query}\"\\n`);\n console.log(`Found ${results.length} matching categories.\\n`);\n for (const cat of results) {\n console.log(`## ${cat.name}\\n`);\n console.log(`- **ID**: ${cat.id}`);\n console.log(`- **Domain**: ${cat.domain}`);\n console.log(`- **Level**: ${cat.level}`);\n console.log(`- **Priority**: ${cat.priority}`);\n console.log(`\\n${cat.description}\\n`);\n }\n } else {\n // terminal format\n console.log();\n console.log(chalk.bold(`Search Results for \"${query}\"`));\n console.log(chalk.gray(`Found ${results.length} matching categories.`));\n console.log();\n\n if (results.length === 0) {\n console.log(chalk.yellow(\"No categories match your search.\"));\n console.log(chalk.gray(\"Try a different query or broaden your filters.\"));\n } else {\n for (const cat of results) {\n const domainColor = cat.domain === \"security\" ? chalk.red : chalk.blue;\n console.log(` ${chalk.cyan(cat.id)} - ${chalk.bold(cat.name)}`);\n console.log(` ${domainColor(cat.domain)} | ${cat.level} | ${cat.priority}`);\n if (options[\"verbose\"]) {\n console.log(` ${chalk.gray(cat.description.slice(0, 100))}${cat.description.length > 100 ? \"...\" : \"\"}`);\n }\n console.log();\n }\n }\n }\n } catch (error) {\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"list\")\n .description(\"List all categories\")\n .option(\"-d, --domain <domain>\", `Filter by risk domain (${RISK_DOMAINS.join(\", \")})`)\n .option(\"-l, --level <level>\", `Filter by test level (${TEST_LEVELS.join(\", \")})`)\n .option(\"-p, --priority <priority>\", \"Filter by priority: P0, P1, P2\")\n .option(\"-o, --output <format>\", \"Output format: terminal, json, markdown\", \"terminal\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"-q, --quiet\", \"Quiet mode (minimal output)\")\n .action(async (options: Record<string, unknown>) => {\n try {\n // Configure logging\n if (options[\"quiet\"]) {\n logger.configure({ level: \"error\" });\n } else if (options[\"verbose\"]) {\n logger.configure({ level: \"debug\" });\n }\n\n // Validate output format\n const outputFormat = String(options[\"output\"] ?? \"terminal\");\n if (!isValidOutputFormat(outputFormat)) {\n console.error(formatError(new Error(`Invalid output format: ${outputFormat}. Use: terminal, json, markdown`)));\n process.exit(1);\n }\n\n // Validate domain filter\n const domainFilter = options[\"domain\"] as string | undefined;\n if (domainFilter !== undefined && !RISK_DOMAINS.includes(domainFilter as RiskDomain)) {\n console.error(formatError(new Error(`Invalid domain: ${domainFilter}. Valid domains: ${RISK_DOMAINS.join(\", \")}`)));\n process.exit(1);\n }\n\n // Validate level filter\n const levelFilter = options[\"level\"] as string | undefined;\n if (levelFilter !== undefined && !TEST_LEVELS.includes(levelFilter as TestLevel)) {\n console.error(formatError(new Error(`Invalid level: ${levelFilter}. Valid levels: ${TEST_LEVELS.join(\", \")}`)));\n process.exit(1);\n }\n\n // Validate priority filter\n const priorityFilter = options[\"priority\"] as string | undefined;\n const validPriorities = [\"P0\", \"P1\", \"P2\"];\n if (priorityFilter !== undefined && !validPriorities.includes(priorityFilter)) {\n console.error(formatError(new Error(`Invalid priority: ${priorityFilter}. Use: P0, P1, P2`)));\n process.exit(1);\n }\n\n // Load categories\n logger.debug(\"Loading categories...\");\n const store = createCategoryStore();\n const definitionsPath = getDefinitionsPath();\n\n logger.debug(`Loading from: ${definitionsPath}`);\n const loadResult = await store.loadFromDirectory(definitionsPath);\n\n if (!loadResult.success) {\n console.error(formatError(loadResult.error));\n process.exit(1);\n }\n\n logger.debug(`Loaded ${loadResult.data} categories`);\n\n // Apply filters\n const filter: {\n domain?: RiskDomain;\n level?: TestLevel;\n priority?: Priority;\n } = {};\n\n if (domainFilter) {\n filter.domain = domainFilter as RiskDomain;\n }\n if (levelFilter) {\n filter.level = levelFilter as TestLevel;\n }\n if (priorityFilter) {\n filter.priority = priorityFilter as Priority;\n }\n\n // Get filtered categories\n const categories = store.list(filter);\n\n // Format and output\n const output = formatCategories(categories, outputFormat);\n console.log(output);\n\n // Exit with success\n process.exit(0);\n } catch (error) {\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"init\")\n .description(\"Initialize Pinata configuration in project\")\n .option(\"-f, --force\", \"Overwrite existing configuration\")\n .option(\"--no-interactive\", \"Skip interactive prompts\")\n .action(async (options: Record<string, unknown>) => {\n const configPath = resolve(process.cwd(), \".pinata.yml\");\n const cacheDir = resolve(process.cwd(), \".pinata\");\n\n // Check if config already exists\n if (existsSync(configPath) && !options[\"force\"]) {\n console.log(chalk.yellow(\"Configuration file already exists at .pinata.yml\"));\n console.log(chalk.gray(\"Use --force to overwrite.\"));\n process.exit(0);\n }\n\n // Generate default configuration\n const defaultConfig = `# Pinata Configuration\n# https://github.com/pinata/pinata\n\n# Paths to analyze\ninclude:\n - \"src/**/*.ts\"\n - \"src/**/*.tsx\"\n - \"src/**/*.py\"\n - \"src/**/*.js\"\n\n# Paths to exclude from analysis\nexclude:\n - \"node_modules/**\"\n - \"dist/**\"\n - \"build/**\"\n - \"**/*.test.ts\"\n - \"**/*.spec.ts\"\n - \"**/test/**\"\n - \"**/tests/**\"\n - \"**/__tests__/**\"\n\n# Risk domains to analyze\n# Options: security, data, concurrency, input, resource, reliability, performance, platform, business, compliance\ndomains:\n - security\n - data\n - concurrency\n - input\n\n# Minimum severity to report\n# Options: critical, high, medium, low\nminSeverity: medium\n\n# Output configuration\noutput:\n format: terminal # terminal, json, markdown, sarif, html\n color: true\n\n# Test generation settings\ngenerate:\n outputDir: tests/generated\n framework: auto # auto, pytest, jest, vitest, mocha\n\n# Fail CI if gaps exceed thresholds\nthresholds:\n critical: 0\n high: 5\n medium: 20\n`;\n\n const { writeFile: writeFileAsync, mkdir } = await import(\"fs/promises\");\n\n try {\n // Write config file\n await writeFileAsync(configPath, defaultConfig, \"utf8\");\n console.log(chalk.green(\"Created .pinata.yml\"));\n\n // Create cache directory\n await mkdir(cacheDir, { recursive: true });\n console.log(chalk.green(\"Created .pinata/ directory\"));\n\n // Add to gitignore if it exists\n const gitignorePath = resolve(process.cwd(), \".gitignore\");\n if (existsSync(gitignorePath)) {\n const { readFile, appendFile } = await import(\"fs/promises\");\n const gitignore = await readFile(gitignorePath, \"utf8\");\n if (!gitignore.includes(\".pinata/\")) {\n await appendFile(gitignorePath, \"\\n# Pinata cache\\n.pinata/\\n\");\n console.log(chalk.green(\"Added .pinata/ to .gitignore\"));\n }\n }\n\n console.log();\n console.log(chalk.bold(\"Pinata initialized successfully!\"));\n console.log();\n console.log(\"Next steps:\");\n console.log(chalk.gray(\" 1. Review and customize .pinata.yml\"));\n console.log(chalk.gray(\" 2. Run: pinata analyze\"));\n console.log(chalk.gray(\" 3. Generate tests: pinata generate\"));\n } catch (error) {\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\n// Audit deps command - validates npm dependencies\nprogram\n .command(\"audit-deps\")\n .description(\"Audit npm dependencies for supply chain risks\")\n .option(\"-p, --path <path>\", \"Path to package.json\", \"package.json\")\n .option(\"--check-registry\", \"Verify packages exist in npm registry\")\n .option(\"--check-downloads\", \"Flag packages with low download counts\")\n .option(\"--check-age\", \"Flag packages less than 30 days old\")\n .option(\"--strict\", \"Fail on any warning (exit code 1)\")\n .action(async (options: Record<string, unknown>) => {\n const packagePath = resolve(process.cwd(), String(options[\"path\"] ?? \"package.json\"));\n const checkRegistry = Boolean(options[\"checkRegistry\"]);\n const checkDownloads = Boolean(options[\"checkDownloads\"]);\n const checkAge = Boolean(options[\"checkAge\"]);\n const strictMode = Boolean(options[\"strict\"]);\n \n // If no specific checks, do all\n const doAllChecks = !checkRegistry && !checkDownloads && !checkAge;\n \n console.log(chalk.bold(\"\\nPinata Dependency Audit\\n\"));\n \n // Read package.json\n if (!existsSync(packagePath)) {\n console.error(chalk.red(`Error: ${packagePath} not found`));\n process.exit(1);\n }\n \n const packageJson = JSON.parse(readFileSync(packagePath, \"utf-8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n \n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n \n const packages = Object.keys(allDeps);\n console.log(chalk.gray(`Found ${packages.length} dependencies\\n`));\n \n const issues: Array<{ pkg: string; severity: \"critical\" | \"warning\"; message: string }> = [];\n \n // Known malware packages (Shai-Hulud, BigSquatRat, etc.)\n const KNOWN_MALWARE = new Set([\n \"ngx-bootstrap\", \"ng2-file-upload\", \"@ctrl/tinycolor\",\n \"@acitons/artifact\", \"huggingface-cli\", \"react-dom-utils-helper\",\n \"l0dash\", \"lodahs\", \"1odash\", \"lodassh\",\n \"expres\", \"expresss\", \"3xpress\",\n \"reqeusts\", \"requets\", \"requ3sts\",\n ]);\n \n // Check for known malware\n for (const pkg of packages) {\n if (KNOWN_MALWARE.has(pkg)) {\n issues.push({\n pkg,\n severity: \"critical\",\n message: \"Known malicious/compromised package (Shai-Hulud/typosquat)\",\n });\n }\n }\n \n // Check for unpinned versions\n for (const [pkg, version] of Object.entries(allDeps)) {\n if (version?.startsWith(\"^\")) {\n issues.push({\n pkg,\n severity: \"warning\",\n message: `Unpinned version (${version}) - allows minor updates`,\n });\n } else if (version?.startsWith(\"~\")) {\n issues.push({\n pkg,\n severity: \"warning\",\n message: `Unpinned version (${version}) - allows patch updates`,\n });\n } else if (version === \"*\" || version === \"latest\") {\n issues.push({\n pkg,\n severity: \"critical\",\n message: `Extremely dangerous version (${version}) - allows any version`,\n });\n }\n }\n \n // Check npm registry (optional, makes network requests)\n if (checkRegistry || doAllChecks) {\n const spinner = ora(\"Checking npm registry...\").start();\n \n for (const pkg of packages.slice(0, 50)) { // Limit to 50 to avoid rate limiting\n try {\n const response = await fetch(`https://registry.npmjs.org/${encodeURIComponent(pkg)}`);\n \n if (response.status === 404) {\n issues.push({\n pkg,\n severity: \"critical\",\n message: \"Package NOT FOUND in npm registry (slopsquatting risk)\",\n });\n } else if (response.ok) {\n const data = await response.json() as {\n time?: { created?: string };\n \"dist-tags\"?: { latest?: string };\n };\n \n // Check age\n if ((checkAge || doAllChecks) && data.time?.created) {\n const created = new Date(data.time.created);\n const ageInDays = (Date.now() - created.getTime()) / (1000 * 60 * 60 * 24);\n \n if (ageInDays < 30) {\n issues.push({\n pkg,\n severity: \"warning\",\n message: `Very new package (${Math.floor(ageInDays)} days old)`,\n });\n }\n }\n }\n } catch {\n // Network error, skip\n }\n }\n \n spinner.succeed(\"Registry check complete\");\n }\n \n // Print results\n const criticals = issues.filter(i => i.severity === \"critical\");\n const warnings = issues.filter(i => i.severity === \"warning\");\n \n if (criticals.length > 0) {\n console.log(chalk.red.bold(`\\nCritical Issues (${criticals.length}):`));\n for (const issue of criticals) {\n console.log(chalk.red(` ✗ ${issue.pkg}: ${issue.message}`));\n }\n }\n \n if (warnings.length > 0) {\n console.log(chalk.yellow.bold(`\\nWarnings (${warnings.length}):`));\n for (const issue of warnings.slice(0, 20)) {\n console.log(chalk.yellow(` ⚠ ${issue.pkg}: ${issue.message}`));\n }\n if (warnings.length > 20) {\n console.log(chalk.gray(` ... and ${warnings.length - 20} more`));\n }\n }\n \n if (issues.length === 0) {\n console.log(chalk.green(\"✓ No dependency issues found\"));\n }\n \n console.log();\n \n // Exit code\n if (criticals.length > 0 || (strictMode && warnings.length > 0)) {\n process.exit(1);\n }\n });\n\n// Auth command group\n// Config command for AI provider keys\nconst config = program.command(\"config\").description(\"Manage AI provider configuration\");\n\nconfig\n .command(\"set <key> <value>\")\n .description(\"Set a configuration value\")\n .addHelpText(\"after\", `\nAvailable keys:\n anthropic-api-key Anthropic API key for Claude models\n openai-api-key OpenAI API key for GPT models \n default-provider Default AI provider (anthropic or openai)\n\nExamples:\n pinata config set anthropic-api-key sk-ant-xxx\n pinata config set default-provider openai\n`)\n .action(async (key: string, value: string) => {\n const { setConfigValue, validateApiKey, maskApiKey, getConfigPath } = await import(\"./config.js\");\n \n switch (key) {\n case \"anthropic-api-key\": {\n const validation = validateApiKey(\"anthropic\", value);\n if (!validation.valid) {\n console.log(chalk.red(`Invalid API key: ${validation.error}`));\n process.exit(1);\n }\n setConfigValue(\"anthropicApiKey\", value);\n console.log(chalk.green(`Anthropic API key set: ${maskApiKey(value)}`));\n break;\n }\n case \"openai-api-key\": {\n const validation = validateApiKey(\"openai\", value);\n if (!validation.valid) {\n console.log(chalk.red(`Invalid API key: ${validation.error}`));\n process.exit(1);\n }\n setConfigValue(\"openaiApiKey\", value);\n console.log(chalk.green(`OpenAI API key set: ${maskApiKey(value)}`));\n break;\n }\n case \"default-provider\": {\n if (value !== \"anthropic\" && value !== \"openai\") {\n console.log(chalk.red(\"Provider must be 'anthropic' or 'openai'\"));\n process.exit(1);\n }\n setConfigValue(\"defaultProvider\", value);\n console.log(chalk.green(`Default provider set to: ${value}`));\n break;\n }\n default:\n console.log(chalk.red(`Unknown config key: ${key}`));\n console.log(chalk.gray(\"Run 'pinata config set --help' for available keys\"));\n process.exit(1);\n }\n console.log(chalk.gray(`Config stored at: ${getConfigPath()}`));\n });\n\nconfig\n .command(\"get <key>\")\n .description(\"Get a configuration value\")\n .action(async (key: string) => {\n const { loadConfig, maskApiKey } = await import(\"./config.js\");\n const cfg = loadConfig();\n \n switch (key) {\n case \"anthropic-api-key\":\n console.log(cfg.anthropicApiKey ? maskApiKey(cfg.anthropicApiKey) : chalk.gray(\"(not set)\"));\n break;\n case \"openai-api-key\":\n console.log(cfg.openaiApiKey ? maskApiKey(cfg.openaiApiKey) : chalk.gray(\"(not set)\"));\n break;\n case \"default-provider\":\n console.log(cfg.defaultProvider ?? chalk.gray(\"anthropic (default)\"));\n break;\n default:\n console.log(chalk.red(`Unknown config key: ${key}`));\n process.exit(1);\n }\n });\n\nconfig\n .command(\"list\")\n .description(\"List all configuration values\")\n .action(async () => {\n const { loadConfig, maskApiKey, getConfigPath, hasApiKey } = await import(\"./config.js\");\n const cfg = loadConfig();\n \n console.log(chalk.bold(\"Pinata Configuration\"));\n console.log(chalk.gray(`Config file: ${getConfigPath()}`));\n console.log();\n \n console.log(\"AI Providers:\");\n const anthropicStatus = hasApiKey(\"anthropic\") ? chalk.green(\"configured\") : chalk.gray(\"not set\");\n const openaiStatus = hasApiKey(\"openai\") ? chalk.green(\"configured\") : chalk.gray(\"not set\");\n console.log(` Anthropic API key: ${anthropicStatus} ${cfg.anthropicApiKey ? chalk.gray(`(${maskApiKey(cfg.anthropicApiKey)})`) : \"\"}`);\n console.log(` OpenAI API key: ${openaiStatus} ${cfg.openaiApiKey ? chalk.gray(`(${maskApiKey(cfg.openaiApiKey)})`) : \"\"}`);\n console.log(` Default provider: ${cfg.defaultProvider ?? \"anthropic\"}`);\n console.log();\n \n if (!hasApiKey(\"anthropic\") && !hasApiKey(\"openai\")) {\n console.log(chalk.yellow(\"No AI provider configured.\"));\n console.log(chalk.gray(\"To use AI features (explain, suggest-patterns, --ai flag):\"));\n console.log(chalk.gray(\" pinata config set anthropic-api-key sk-ant-xxx\"));\n console.log(chalk.gray(\" # or\"));\n console.log(chalk.gray(\" export ANTHROPIC_API_KEY=sk-ant-xxx\"));\n }\n });\n\nconfig\n .command(\"unset <key>\")\n .description(\"Remove a configuration value\")\n .action(async (key: string) => {\n const { deleteConfigValue } = await import(\"./config.js\");\n \n switch (key) {\n case \"anthropic-api-key\":\n deleteConfigValue(\"anthropicApiKey\");\n console.log(chalk.green(\"Anthropic API key removed\"));\n break;\n case \"openai-api-key\":\n deleteConfigValue(\"openaiApiKey\");\n console.log(chalk.green(\"OpenAI API key removed\"));\n break;\n case \"default-provider\":\n deleteConfigValue(\"defaultProvider\");\n console.log(chalk.green(\"Default provider reset to: anthropic\"));\n break;\n default:\n console.log(chalk.red(`Unknown config key: ${key}`));\n process.exit(1);\n }\n });\n\nconst auth = program.command(\"auth\").description(\"Manage API key authentication\");\n\nauth\n .command(\"login\")\n .description(\"Set API key for Pinata Cloud\")\n .option(\"-k, --key <key>\", \"API key (or set PINATA_API_KEY env var)\")\n .action(async (options: Record<string, unknown>) => {\n const apiKey = options[\"key\"] as string | undefined ?? process.env[\"PINATA_API_KEY\"];\n\n if (!apiKey) {\n console.log(chalk.yellow(\"No API key provided.\"));\n console.log();\n console.log(\"Provide an API key using one of:\");\n console.log(chalk.gray(\" pinata auth login --key <your-api-key>\"));\n console.log(chalk.gray(\" PINATA_API_KEY=<your-api-key> pinata auth login\"));\n console.log();\n console.log(\"Get your API key at: https://app.pinata.dev/settings/api\");\n process.exit(1);\n }\n\n // Validate key format (basic validation)\n if (apiKey.length < 20 || !apiKey.startsWith(\"pk_\")) {\n console.log(chalk.red(\"Invalid API key format.\"));\n console.log(chalk.gray(\"Keys should start with 'pk_' and be at least 20 characters.\"));\n process.exit(1);\n }\n\n // Store in local config\n const configDir = resolve(process.cwd(), \".pinata\");\n const authPath = resolve(configDir, \"auth.json\");\n\n const { mkdir, writeFile: writeFileAsync } = await import(\"fs/promises\");\n\n try {\n await mkdir(configDir, { recursive: true });\n\n // Store masked key (only store last 8 chars for identification)\n const maskedKey = `****${apiKey.slice(-8)}`;\n const authData = {\n configured: true,\n keyId: maskedKey,\n configuredAt: new Date().toISOString(),\n };\n\n await writeFileAsync(authPath, JSON.stringify(authData, null, 2), \"utf8\");\n\n // Also store full key in a more secure location (env file)\n const envPath = resolve(configDir, \".env\");\n await writeFileAsync(envPath, `PINATA_API_KEY=${apiKey}\\n`, { mode: 0o600 });\n\n console.log(chalk.green(\"API key configured successfully!\"));\n console.log(chalk.gray(`Key ID: ${maskedKey}`));\n console.log();\n console.log(chalk.yellow(\"Important: Add .pinata/.env to your .gitignore\"));\n } catch (error) {\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nauth\n .command(\"logout\")\n .description(\"Remove stored API key\")\n .action(async () => {\n const configDir = resolve(process.cwd(), \".pinata\");\n const authPath = resolve(configDir, \"auth.json\");\n const envPath = resolve(configDir, \".env\");\n\n const { rm } = await import(\"fs/promises\");\n\n try {\n let removed = false;\n\n if (existsSync(authPath)) {\n await rm(authPath);\n removed = true;\n }\n\n if (existsSync(envPath)) {\n await rm(envPath);\n removed = true;\n }\n\n if (removed) {\n console.log(chalk.green(\"API key removed successfully.\"));\n } else {\n console.log(chalk.yellow(\"No stored API key found.\"));\n }\n } catch (error) {\n console.error(formatError(error instanceof Error ? error : new Error(String(error))));\n process.exit(1);\n }\n });\n\nauth\n .command(\"status\")\n .description(\"Check authentication status\")\n .action(async () => {\n const authPath = resolve(process.cwd(), \".pinata\", \"auth.json\");\n\n if (!existsSync(authPath)) {\n console.log(chalk.yellow(\"Not authenticated.\"));\n console.log(chalk.gray(\"Run: pinata auth login --key <your-api-key>\"));\n process.exit(0);\n }\n\n try {\n const { readFile } = await import(\"fs/promises\");\n const authData = JSON.parse(await readFile(authPath, \"utf8\")) as {\n keyId?: string;\n configuredAt?: string;\n };\n\n console.log(chalk.green(\"Authenticated\"));\n console.log(chalk.gray(`Key ID: ${authData.keyId ?? \"unknown\"}`));\n console.log(chalk.gray(`Configured: ${authData.configuredAt ?? \"unknown\"}`));\n } catch (error) {\n console.log(chalk.yellow(\"Authentication status unknown.\"));\n console.log(chalk.gray(\"Run: pinata auth login to reconfigure.\"));\n }\n });\n\nprogram.parse();\n","/**\n * Formatters for scan results\n *\n * Handles terminal, JSON, markdown, and SARIF output formats\n * for the analyze command results.\n */\n\nimport { relative } from \"path\";\n\nimport chalk from \"chalk\";\n\nimport { RISK_DOMAINS } from \"../categories/schema/index.js\";\n\nimport type { RiskDomain } from \"../categories/schema/index.js\";\nimport type {\n ScanResult,\n Gap,\n PinataScore,\n CoverageMetrics,\n ScanSummary,\n} from \"../core/scanner/types.js\";\n\n\n/**\n * Extended output format including SARIF, HTML, and JUnit\n */\nexport type ScanOutputFormat = \"terminal\" | \"json\" | \"markdown\" | \"sarif\" | \"html\" | \"junit-xml\";\n\n/**\n * Severity colors for terminal output\n */\nconst SEVERITY_COLORS = {\n critical: chalk.red.bold,\n high: chalk.red,\n medium: chalk.yellow,\n low: chalk.gray,\n};\n\n/**\n * Domain colors for terminal output\n */\nconst DOMAIN_COLORS: Record<RiskDomain, typeof chalk.red> = {\n security: chalk.red,\n data: chalk.blue,\n concurrency: chalk.magenta,\n input: chalk.cyan,\n resource: chalk.yellow,\n reliability: chalk.green,\n performance: chalk.yellowBright,\n platform: chalk.gray,\n business: chalk.white,\n compliance: chalk.blueBright,\n};\n\n/**\n * Grade colors\n */\nconst GRADE_COLORS: Record<string, typeof chalk.red> = {\n A: chalk.green.bold,\n B: chalk.green,\n C: chalk.yellow,\n D: chalk.red,\n F: chalk.red.bold,\n};\n\n/**\n * ASCII art banner\n */\nconst BANNER = `\n${chalk.cyan(\" ____ _ _ \")}\n${chalk.cyan(\"| _ \\\\(_)_ __ __ _| |_ __ _ \")}\n${chalk.cyan(\"| |_) | | '_ \\\\ / _\\` | __/ _\\` |\")}\n${chalk.cyan(\"| __/| | | | | (_| | || (_| |\")}\n${chalk.cyan(\"|_| |_|_| |_|\\\\__,_|\\\\__\\\\__,_|\")}\n`;\n\n/**\n * Format scan results for terminal output\n */\nexport function formatScanTerminal(result: ScanResult, basePath: string): string {\n const lines: string[] = [];\n\n // Banner\n lines.push(BANNER);\n\n // Analysis target\n lines.push(chalk.gray(`Analyzing: ${result.targetDirectory}`));\n lines.push(chalk.gray(`Files: ${result.fileStats.totalFiles} | Languages: ${formatLanguages(result)}`));\n lines.push(\"\");\n\n // Pinata Score box\n lines.push(formatScoreBox(result.score));\n lines.push(\"\");\n\n // Domain coverage\n lines.push(chalk.bold(\"Domain Coverage:\"));\n lines.push(formatDomainCoverage(result.coverage));\n lines.push(\"\");\n\n // Gaps summary\n if (result.gaps.length > 0) {\n lines.push(formatGapsSummary(result.gaps, basePath));\n lines.push(\"\");\n } else {\n lines.push(chalk.green.bold(\"No gaps detected! Your codebase has good test coverage.\"));\n lines.push(\"\");\n }\n\n // Footer with suggestions\n if (result.gaps.length > 0) {\n lines.push(chalk.gray(\"Run `pinata generate --gaps` to create tests for these gaps.\"));\n }\n\n // Timing\n lines.push(chalk.gray(`\\nScan completed in ${result.durationMs}ms`));\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format the Pinata Score box\n */\nfunction formatScoreBox(score: PinataScore): string {\n const gradeColor = GRADE_COLORS[score.grade] ?? chalk.white;\n const scoreStr = `Pinata Score: ${score.overall}/100 ${gradeColor(`(${score.grade})`)}`;\n\n const boxWidth = 60;\n const padding = Math.floor((boxWidth - scoreStr.length) / 2);\n\n const top = chalk.cyan(\"╔\" + \"═\".repeat(boxWidth) + \"╗\");\n const middle = chalk.cyan(\"║\") + \" \".repeat(padding) + scoreStr + \" \".repeat(boxWidth - padding - scoreStr.length) + chalk.cyan(\"║\");\n const bottom = chalk.cyan(\"╚\" + \"═\".repeat(boxWidth) + \"╝\");\n\n return `${top}\\n${middle}\\n${bottom}`;\n}\n\n/**\n * Format domain coverage as progress bars\n */\nfunction formatDomainCoverage(coverage: CoverageMetrics): string {\n const lines: string[] = [];\n const barWidth = 16;\n\n for (const domain of RISK_DOMAINS) {\n const domainCoverage = coverage.byDomain.get(domain);\n if (!domainCoverage || domainCoverage.categoriesScanned === 0) {\n continue;\n }\n\n const percent = domainCoverage.coveragePercent;\n const filledWidth = Math.round((percent / 100) * barWidth);\n const bar = chalk.green(\"█\".repeat(filledWidth)) + chalk.gray(\"░\".repeat(barWidth - filledWidth));\n\n const domainColor = DOMAIN_COLORS[domain] ?? chalk.white;\n const domainName = domain.padEnd(15);\n const stats = `${domainCoverage.categoriesCovered}/${domainCoverage.categoriesScanned} categories`;\n\n lines.push(` ${domainColor(domainName)} ${bar} ${percent.toString().padStart(3)}% (${stats})`);\n }\n\n if (lines.length === 0) {\n lines.push(chalk.gray(\" No domain coverage data available.\"));\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format gaps summary\n */\nfunction formatGapsSummary(gaps: Gap[], basePath: string): string {\n const lines: string[] = [];\n\n // Group by severity\n const critical = gaps.filter((g) => g.severity === \"critical\");\n const high = gaps.filter((g) => g.severity === \"high\");\n const medium = gaps.filter((g) => g.severity === \"medium\");\n const low = gaps.filter((g) => g.severity === \"low\");\n\n // Critical gaps\n if (critical.length > 0) {\n lines.push(chalk.red.bold(`\\nCritical Gaps (${critical.length}):`));\n for (const gap of critical.slice(0, 5)) {\n lines.push(formatGapLine(gap, basePath, \"critical\"));\n }\n if (critical.length > 5) {\n lines.push(chalk.gray(` ... and ${critical.length - 5} more critical gaps`));\n }\n }\n\n // High gaps\n if (high.length > 0) {\n lines.push(chalk.red(`\\nHigh Severity Gaps (${high.length}):`));\n for (const gap of high.slice(0, 5)) {\n lines.push(formatGapLine(gap, basePath, \"high\"));\n }\n if (high.length > 5) {\n lines.push(chalk.gray(` ... and ${high.length - 5} more high severity gaps`));\n }\n }\n\n // Medium gaps\n if (medium.length > 0) {\n lines.push(chalk.yellow(`\\nMedium Severity Gaps (${medium.length}):`));\n for (const gap of medium.slice(0, 3)) {\n lines.push(formatGapLine(gap, basePath, \"medium\"));\n }\n if (medium.length > 3) {\n lines.push(chalk.gray(` ... and ${medium.length - 3} more medium severity gaps`));\n }\n }\n\n // Low gaps (just count)\n if (low.length > 0) {\n lines.push(chalk.gray(`\\nLow Severity: ${low.length} gaps`));\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a single gap line\n */\nfunction formatGapLine(gap: Gap, basePath: string, severity: string): string {\n const severityColor = SEVERITY_COLORS[severity as keyof typeof SEVERITY_COLORS] ?? chalk.white;\n const icon = severity === \"critical\" ? \"⛔\" : severity === \"high\" ? \"🔴\" : severity === \"medium\" ? \"🟡\" : \"⚪\";\n const relPath = relative(basePath, gap.filePath);\n const location = `${relPath}:${gap.lineStart}`;\n const confidence = gap.confidence.toUpperCase();\n\n return ` ${icon} ${severityColor(gap.categoryName.padEnd(20))} ${chalk.cyan(location.padEnd(30))} ${chalk.gray(confidence)} confidence`;\n}\n\n/**\n * Format languages detected\n */\nfunction formatLanguages(result: ScanResult): string {\n const languages: string[] = [];\n for (const [lang, count] of result.fileStats.byLanguage) {\n if (count > 0) {\n languages.push(lang.charAt(0).toUpperCase() + lang.slice(1));\n }\n }\n return languages.join(\", \") || \"None detected\";\n}\n\n/**\n * Format scan results as JSON\n */\nexport function formatScanJson(result: ScanResult): string {\n // Convert Maps to plain objects for JSON serialization\n const serializable = {\n targetDirectory: result.targetDirectory,\n startedAt: result.startedAt.toISOString(),\n completedAt: result.completedAt.toISOString(),\n durationMs: result.durationMs,\n score: {\n overall: result.score.overall,\n grade: result.score.grade,\n byDomain: Object.fromEntries(result.score.byDomain),\n bySeverity: result.score.bySeverity,\n penalties: result.score.penalties,\n bonuses: result.score.bonuses,\n },\n coverage: {\n overallCoverage: result.coverage.overallCoverage,\n totalCategories: result.coverage.totalCategories,\n categoriesWithGaps: result.coverage.categoriesWithGaps,\n categoriesCovered: result.coverage.categoriesCovered,\n byDomain: Object.fromEntries(result.coverage.byDomain),\n byLevel: Object.fromEntries(result.coverage.byLevel),\n },\n fileStats: {\n ...result.fileStats,\n byLanguage: Object.fromEntries(result.fileStats.byLanguage),\n },\n gaps: result.gaps,\n summary: result.summary,\n warnings: result.warnings,\n categoriesScanned: result.categoriesScanned,\n };\n\n return JSON.stringify(serializable, null, 2);\n}\n\n/**\n * Format scan results as Markdown\n */\nexport function formatScanMarkdown(result: ScanResult, basePath: string): string {\n const lines: string[] = [];\n\n lines.push(\"# Pinata Analysis Report\\n\");\n\n // Summary\n lines.push(`**Target**: ${result.targetDirectory}`);\n lines.push(`**Date**: ${result.completedAt.toISOString()}`);\n lines.push(`**Duration**: ${result.durationMs}ms`);\n lines.push(`**Files Scanned**: ${result.fileStats.totalFiles}`);\n lines.push(\"\");\n\n // Score\n lines.push(`## Pinata Score: ${result.score.overall}/100 (${result.score.grade})\\n`);\n\n // Coverage\n lines.push(\"## Coverage by Domain\\n\");\n for (const domain of RISK_DOMAINS) {\n const cov = result.coverage.byDomain.get(domain);\n if (cov && cov.categoriesScanned > 0) {\n const bar = \"█\".repeat(Math.round(cov.coveragePercent / 10)) + \"░\".repeat(10 - Math.round(cov.coveragePercent / 10));\n lines.push(`- **${domain}**: ${bar} ${cov.coveragePercent}% (${cov.categoriesCovered}/${cov.categoriesScanned})`);\n }\n }\n lines.push(\"\");\n\n // Gaps\n if (result.gaps.length > 0) {\n lines.push(\"## Detected Gaps\\n\");\n\n const bySeverity: Record<string, Gap[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n\n for (const gap of result.gaps) {\n bySeverity[gap.severity]?.push(gap);\n }\n\n for (const severity of [\"critical\", \"high\", \"medium\", \"low\"]) {\n const gaps = bySeverity[severity];\n if (gaps && gaps.length > 0) {\n lines.push(`### ${severity.charAt(0).toUpperCase() + severity.slice(1)} (${gaps.length})\\n`);\n\n for (const gap of gaps.slice(0, 10)) {\n const relPath = relative(basePath, gap.filePath);\n lines.push(`- **${gap.categoryName}** in \\`${relPath}:${gap.lineStart}\\``);\n lines.push(` - Confidence: ${gap.confidence}`);\n lines.push(` - Domain: ${gap.domain}`);\n }\n\n if (gaps.length > 10) {\n lines.push(`\\n_...and ${gaps.length - 10} more ${severity} gaps_\\n`);\n }\n lines.push(\"\");\n }\n }\n } else {\n lines.push(\"## No Gaps Detected\\n\");\n lines.push(\"Your codebase has good test coverage.\\n\");\n }\n\n // Summary stats\n lines.push(\"## Summary\\n\");\n lines.push(`- Total Gaps: ${result.summary.totalGaps}`);\n lines.push(`- Critical: ${result.summary.criticalGaps}`);\n lines.push(`- High: ${result.summary.highGaps}`);\n lines.push(`- Medium: ${result.summary.mediumGaps}`);\n lines.push(`- Low: ${result.summary.lowGaps}`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format scan results as SARIF (for GitHub Security integration)\n */\nexport function formatScanSarif(result: ScanResult, basePath: string): string {\n const sarif = {\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: \"pinata\",\n version: \"0.1.0\",\n informationUri: \"https://github.com/pinata/pinata\",\n rules: buildSarifRules(result),\n },\n },\n results: buildSarifResults(result, basePath),\n },\n ],\n };\n\n return JSON.stringify(sarif, null, 2);\n}\n\n/**\n * Build SARIF rules from categories\n */\nfunction buildSarifRules(result: ScanResult): object[] {\n const rulesMap = new Map<string, object>();\n\n for (const gap of result.gaps) {\n if (!rulesMap.has(gap.categoryId)) {\n rulesMap.set(gap.categoryId, {\n id: gap.categoryId,\n name: gap.categoryName,\n shortDescription: {\n text: gap.categoryName,\n },\n defaultConfiguration: {\n level: sarifLevel(gap.severity),\n },\n properties: {\n tags: [gap.domain, gap.level],\n precision: gap.confidence,\n },\n });\n }\n }\n\n return Array.from(rulesMap.values());\n}\n\n/**\n * Build SARIF results from gaps\n */\nfunction buildSarifResults(result: ScanResult, basePath: string): object[] {\n return result.gaps.map((gap) => ({\n ruleId: gap.categoryId,\n level: sarifLevel(gap.severity),\n message: {\n text: `Missing test coverage for ${gap.categoryName}`,\n },\n locations: [\n {\n physicalLocation: {\n artifactLocation: {\n uri: relative(basePath, gap.filePath),\n uriBaseId: \"%SRCROOT%\",\n },\n region: {\n startLine: gap.lineStart,\n endLine: gap.lineEnd,\n startColumn: gap.columnStart + 1,\n endColumn: gap.columnEnd + 1,\n snippet: {\n text: gap.codeSnippet,\n },\n },\n },\n },\n ],\n partialFingerprints: {\n primaryLocationLineHash: `${gap.filePath}:${gap.lineStart}:${gap.patternId}`,\n },\n }));\n}\n\n/**\n * Convert severity to SARIF level\n */\nfunction sarifLevel(severity: string): string {\n switch (severity) {\n case \"critical\":\n case \"high\":\n return \"error\";\n case \"medium\":\n return \"warning\";\n case \"low\":\n default:\n return \"note\";\n }\n}\n\n/**\n * Format scan results in the specified format\n */\nexport function formatScanResult(\n result: ScanResult,\n format: ScanOutputFormat,\n basePath: string\n): string {\n switch (format) {\n case \"json\":\n return formatScanJson(result);\n case \"markdown\":\n return formatScanMarkdown(result, basePath);\n case \"sarif\":\n return formatScanSarif(result, basePath);\n case \"html\": {\n const { formatHtml } = require(\"./html-formatter.js\") as { formatHtml: (result: ScanResult) => string };\n return formatHtml(result);\n }\n case \"junit-xml\": {\n const { formatJunit } = require(\"./junit-formatter.js\") as { formatJunit: (result: ScanResult) => string };\n return formatJunit(result);\n }\n case \"terminal\":\n default:\n return formatScanTerminal(result, basePath);\n }\n}\n\n/**\n * Validate scan output format\n */\nexport function isValidScanOutputFormat(format: string): format is ScanOutputFormat {\n return [\"terminal\", \"json\", \"markdown\", \"sarif\", \"html\", \"junit-xml\"].includes(format);\n}\n"]}
|